Skip to content

Commit af5a5fc

Browse files
committed
feat: 580
Merged PR 176: Lista Tipologia Contratto Enti Related work items: #580
1 parent f51ae74 commit af5a5fc

File tree

15 files changed

+490
-16
lines changed

15 files changed

+490
-16
lines changed

src/Core/PortaleFatture.BE.Core/Entities/SEND/SelfCare/Dto/EnteContrattoDto.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,6 @@ public class EnteContrattoDto
1919
public string? CodiceSDI { get; set; }
2020

2121
public string? InstitutionType { get; set; }
22+
23+
public int IdTipoContratto { get; set; }
2224
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using MediatR;
2+
using Microsoft.Extensions.Localization;
3+
using Microsoft.Extensions.Logging;
4+
using PortaleFatture.BE.Core.Exceptions;
5+
using PortaleFatture.BE.Core.Resources;
6+
using PortaleFatture.BE.Infrastructure.Common.Persistence.Schemas;
7+
using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Commands;
8+
using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Commands.Persistence;
9+
using PortaleFatture.BE.Infrastructure.Common.SEND.SelfCare.Queries.Persistence;
10+
11+
namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.CommandHandlers;
12+
13+
public class FatturaModificaTipoContrattoCommandHandler(
14+
IFattureDbContextFactory factory,
15+
IMediator handler,
16+
IStringLocalizer<Localization> localizer,
17+
ILogger<FatturaModificaTipoContrattoCommandHandler> logger) : IRequestHandler<FatturaModificaTipoContrattoCommand, bool?>
18+
{
19+
private readonly IFattureDbContextFactory _factory = factory;
20+
private readonly IMediator _handler = handler;
21+
private readonly ILogger<FatturaModificaTipoContrattoCommandHandler> _logger = logger;
22+
private readonly IStringLocalizer<Localization> _localizer = localizer;
23+
24+
public async Task<bool?> Handle(FatturaModificaTipoContrattoCommand command, CancellationToken ct)
25+
{
26+
27+
using var uow = await _factory.Create(true, cancellationToken: ct);
28+
{
29+
var contratto = await uow.Query(new EnteCodiceSDIQueryGetByIdPersistence(command.IdEnte), ct) ?? throw new DomainException($"Non ho trovato l'ente specificato {command.IdEnte!}");
30+
try
31+
{
32+
command.IdContratto = contratto.IdContratto;
33+
command.TipoContrattoPrecedente = contratto.IdTipoContratto;
34+
await uow.Execute(new FatturaTipoContrattoUpdatePersistence(command, _localizer), ct);
35+
var rowAffected = await uow.Execute(new FatturaTipoContrattoInsertPersistence(command, _localizer), ct);
36+
if (rowAffected == 2)
37+
{
38+
uow.Commit();
39+
return true;
40+
}
41+
else
42+
{
43+
uow.Rollback();
44+
return false;
45+
}
46+
}
47+
catch (Exception ex)
48+
{
49+
_logger.LogError(ex, "Errore nel salvare la tipologia contratto.");
50+
uow.Rollback();
51+
return false;
52+
}
53+
}
54+
}
55+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using MediatR;
2+
using PortaleFatture.BE.Core.Auth;
3+
using PortaleFatture.BE.Core.Extensions;
4+
5+
namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Commands;
6+
7+
public class FatturaModificaTipoContrattoCommand(IAuthenticationInfo? authenticationInfo) : IRequest<bool?>
8+
{
9+
public IAuthenticationInfo? AuthenticationInfo { get; internal set; } = authenticationInfo;
10+
public string? IdEnte { get; set; }
11+
public int TipoContratto { get; set; }
12+
public string? IdContratto { get; set; }
13+
public int TipoContrattoPrecedente { get; set; }
14+
public DateTime DataInserimento { get; set; } = DateTime.UtcNow.ItalianTime();
15+
public DateTime DataCancellazione => DataInserimento;
16+
public string? IdUtente { get; set; } = authenticationInfo!.Id;
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using Microsoft.Extensions.Localization;
2+
using PortaleFatture.BE.Core.Resources;
3+
using PortaleFatture.BE.Infrastructure.Common.Persistence;
4+
using System.Data;
5+
6+
namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Commands.Persistence;
7+
8+
public class FatturaTipoContrattoInsertPersistence(FatturaModificaTipoContrattoCommand command, IStringLocalizer<Localization> localizer) : DapperBase, ICommand<int>
9+
{
10+
11+
private readonly FatturaModificaTipoContrattoCommand _command = command;
12+
IStringLocalizer<Localization> _localizer = localizer;
13+
14+
private static readonly string _sqlInsert = @"
15+
DECLARE @RowsAffected INT;
16+
INSERT INTO [pfd].[ContrattiTipologia]
17+
([FkIdEnte]
18+
,[FkIdTipoContratto]
19+
,[FkIdContratto]
20+
,[DataInserimento]
21+
,[IdUtente]
22+
,[FkIdTipoContrattoPrecedente])
23+
VALUES
24+
(@IdEnte
25+
,@TipoContratto
26+
,@IdContratto
27+
,@DataInserimento
28+
,@IdUtente
29+
,@TipoContrattoPrecedente);
30+
31+
SET @RowsAffected = @@ROWCOUNT;
32+
33+
IF @RowsAffected = 1
34+
BEGIN
35+
UPDATE [pfd].[Contratti]
36+
SET
37+
[FkIdTipoContratto] = @TipoContratto
38+
39+
WHERE internalistitutionid=@IdEnte AND onboardingtokenid=@IdContratto
40+
41+
SET @RowsAffected = @RowsAffected + @@ROWCOUNT;
42+
END
43+
44+
SELECT @RowsAffected AS FinalRowCount;
45+
";
46+
47+
public bool RequiresTransaction => true;
48+
public async Task<int> Execute(IDbConnection? connection, string schema, IDbTransaction? transaction, CancellationToken cancellationToken = default)
49+
{
50+
return await ((IDatabase)this).ExecuteAsync<int>(connection!, _sqlInsert, _command, transaction);
51+
}
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Microsoft.Extensions.Localization;
2+
using PortaleFatture.BE.Core.Resources;
3+
using PortaleFatture.BE.Infrastructure.Common.Persistence;
4+
using System.Data;
5+
6+
namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Commands.Persistence;
7+
8+
public class FatturaTipoContrattoUpdatePersistence(FatturaModificaTipoContrattoCommand command, IStringLocalizer<Localization> localizer) : DapperBase, ICommand<int>
9+
{
10+
11+
private readonly FatturaModificaTipoContrattoCommand _command = command;
12+
IStringLocalizer<Localization> _localizer = localizer;
13+
14+
private static readonly string _sqlUpdate = @"
15+
UPDATE [pfd].[ContrattiTipologia]
16+
SET [DataCancellazione] = @DataCancellazione
17+
WHERE FkIdEnte=@IdEnte and FkIdContratto=@IdContratto AND DataCancellazione is null";
18+
19+
public bool RequiresTransaction => true;
20+
21+
public async Task<int> Execute(IDbConnection? connection, string schema, IDbTransaction? transaction, CancellationToken cancellationToken = default)
22+
{
23+
return await ((IDatabase)this).ExecuteAsync(connection!, _sqlUpdate, _command, transaction);
24+
}
25+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System.Text.Json.Serialization;
2+
using PortaleFatture.BE.Infrastructure.Common.SEND.Documenti.Common;
3+
4+
namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Dto;
5+
6+
public sealed class SingleContrattiTipologiaDto
7+
{
8+
[HeaderAttributev2(caption: "IdEnte", Order = 2)]
9+
public string? IdEnte { get; set; }
10+
11+
[HeaderAttributev2(caption: "Ragione Sociale", Order = 1)]
12+
public string? RagioneSociale { get; set; }
13+
14+
public DateTime UltimaModificaContratto { get; set; }
15+
16+
public int TipoContratto { get; set; }
17+
18+
[HeaderAttributev2(caption: "Tipo Contratto", Order = 4)]
19+
public string? DescrizioneTipoContratto { get; set; }
20+
21+
22+
[HeaderAttributev2(caption: "IdContratto", Order = 3)]
23+
public string? IdContratto { get; set; }
24+
25+
[HeaderAttributev2(caption: "Data Aggiornamento", Order = 5)]
26+
public DateTime? DataInserimento { get; set; }
27+
}
28+
29+
public sealed class ContrattiTipologiaDto
30+
{
31+
[JsonPropertyOrder(-1)]
32+
public IEnumerable<SingleContrattiTipologiaDto>? Contratti { get; set; }
33+
[JsonPropertyOrder(-2)]
34+
public int Count { get; set; }
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries.Persistence.Builder;
2+
3+
internal static class ContrattiTipologiaSQLBuilder
4+
{
5+
private static string _sqlCount = @"
6+
SELECT Count(*)
7+
FROM [pfd].[contrattitipologia] ct
8+
RIGHT JOIN pfd.enti e
9+
ON ct.fkidente = e.internalistitutionid
10+
LEFT OUTER JOIN pfd.contratti c
11+
ON e.internalistitutionid = c.internalistitutionid
12+
";
13+
14+
15+
private static string _sql = @"
16+
SELECT e.internalistitutionid AS IdEnte,
17+
description AS RagioneSociale,
18+
e.lastmodified AS UltimaModificaContratto,
19+
c.fkidtipocontratto AS TipoContratto,
20+
c.onboardingtokenid AS IdContratto,
21+
ct.datainserimento,
22+
tp.Descrizione AS DescrizioneTipoContratto
23+
FROM [pfd].[contrattitipologia] ct
24+
RIGHT JOIN pfd.enti e
25+
ON ct.fkidente = e.internalistitutionid
26+
LEFT OUTER JOIN pfd.contratti c
27+
ON e.internalistitutionid = c.internalistitutionid
28+
LEFT OUTER JOIN pfw.TipoContratto tp
29+
ON tp.IdTipoContratto = c.FkIdTipoContratto
30+
";
31+
32+
33+
private static string _offSet = " OFFSET (@page-1)*@size ROWS FETCH NEXT @size ROWS ONLY";
34+
public static string OffSet()
35+
{
36+
return _offSet;
37+
}
38+
39+
public static string OrderBy()
40+
{
41+
return " ORDER BY RagioneSociale ";
42+
}
43+
44+
public static string SelectAll()
45+
{
46+
return _sql;
47+
}
48+
49+
public static string SelectAllCount()
50+
{
51+
return _sqlCount;
52+
}
53+
54+
}
55+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using System.Data;
2+
using Dapper;
3+
using PortaleFatture.BE.Core.Entities.SEND.Tipologie;
4+
using PortaleFatture.BE.Core.Extensions;
5+
using PortaleFatture.BE.Infrastructure.Common.Persistence;
6+
using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Dto;
7+
using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries.Persistence.Builder;
8+
using PortaleFatture.BE.Infrastructure.Common.SEND.Notifiche.Dto;
9+
using PortaleFatture.BE.Infrastructure.Common.SEND.Notifiche.Queries.Persistence.Builder;
10+
11+
namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries.Persistence;
12+
13+
public class RicercaContrattiTipologiaPersistence(RicercaContrattiTipologiaQuery command) : DapperBase, IQuery<ContrattiTipologiaDto?>
14+
{
15+
private readonly RicercaContrattiTipologiaQuery _command = command;
16+
private static readonly string _sqlSelectAll = ContrattiTipologiaSQLBuilder.SelectAll();
17+
private static readonly string _sqlSelectAllCount = ContrattiTipologiaSQLBuilder.SelectAllCount();
18+
private static readonly string _offSet = ContrattiTipologiaSQLBuilder.OffSet();
19+
private static readonly string _orderBy = ContrattiTipologiaSQLBuilder.OrderBy();
20+
21+
public async Task<ContrattiTipologiaDto?> Execute(IDbConnection? connection, string schema, IDbTransaction? transaction, CancellationToken cancellationToken = default)
22+
{
23+
var listaContratti = new ContrattiTipologiaDto();
24+
var where = string.Empty;
25+
26+
var page = _command.Page;
27+
var size = _command.Size;
28+
where += " WHERE DataCancellazione is null";
29+
30+
if (!_command.IdEnti!.IsNullNotAny())
31+
where += $" AND e.InternalIstitutionId IN @identi";
32+
33+
if (_command.TipologiaContratto.HasValue)
34+
where += $" AND c.FkIdTipoContratto = @tipocontratto";
35+
36+
var orderBy = _orderBy;
37+
38+
var sqlEnte = _sqlSelectAll;
39+
var sqlCount = _sqlSelectAllCount;
40+
if (page == null && size == null)
41+
sqlEnte += where + orderBy;
42+
else
43+
sqlEnte += where + orderBy + _offSet;
44+
45+
sqlCount += where;
46+
var sql = string.Join(";", sqlEnte, sqlCount);
47+
48+
var query = new
49+
{
50+
Size = size,
51+
Page = page,
52+
IdEnti = _command.IdEnti,
53+
Tipocontratto = _command.TipologiaContratto
54+
};
55+
56+
57+
using (var values = await ((IDatabase)this).QueryMultipleAsync<SingleContrattiTipologiaDto>(
58+
connection!,
59+
sql,
60+
query,
61+
transaction,
62+
CommandType.Text,
63+
null,
64+
CommandFlags.NoCache))
65+
{
66+
listaContratti.Contratti = await values.ReadAsync<SingleContrattiTipologiaDto>();
67+
listaContratti.Count = await values.ReadFirstAsync<int>();
68+
}
69+
70+
return listaContratti;
71+
}
72+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using MediatR;
2+
using PortaleFatture.BE.Core.Auth;
3+
using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Dto;
4+
5+
namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries;
6+
7+
public class RicercaContrattiTipologiaQuery(IAuthenticationInfo authenticationInfo) : IRequest<ContrattiTipologiaDto?>
8+
{
9+
public IAuthenticationInfo AuthenticationInfo { get; internal set; } = authenticationInfo;
10+
public string[]? IdEnti { get; set; }
11+
public int? TipologiaContratto { get; set; }
12+
public int? Page { get; set; }
13+
public int? Size { get; set; }
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using MediatR;
2+
using Microsoft.Extensions.Localization;
3+
using Microsoft.Extensions.Logging;
4+
using PortaleFatture.BE.Core.Resources;
5+
using PortaleFatture.BE.Infrastructure.Common.Persistence.Schemas;
6+
using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Dto;
7+
using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries;
8+
using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries.Persistence;
9+
using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Service;
10+
11+
namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.QueryHandlers;
12+
13+
public class RicercaContrattiTipologiaQueryHandler(
14+
IMediator handler,
15+
ISelfCareDbContextFactory factory,
16+
IStringLocalizer<Localization> localizer,
17+
ILogger<RicercaContrattiTipologiaQueryHandler> logger) : IRequestHandler<RicercaContrattiTipologiaQuery, ContrattiTipologiaDto?>
18+
{
19+
private readonly IMediator _handler = handler;
20+
private readonly ISelfCareDbContextFactory _factory = factory;
21+
private readonly ILogger<RicercaContrattiTipologiaQueryHandler> _logger = logger;
22+
private readonly IStringLocalizer<Localization> _localizer = localizer;
23+
public async Task<ContrattiTipologiaDto?> Handle(RicercaContrattiTipologiaQuery request, CancellationToken ct)
24+
{
25+
using var rs = await _factory.Create(cancellationToken: ct);
26+
return await rs.Query(new RicercaContrattiTipologiaPersistence(request), ct);
27+
}
28+
}

0 commit comments

Comments
 (0)