From 39020f6dfbc7b901976515efb661dbc8bf070ea2 Mon Sep 17 00:00:00 2001 From: Mauro Ghiani Date: Fri, 24 Jan 2025 11:20:14 +0000 Subject: [PATCH] feat: 547 Gestione Filtri. Related work items: #547 --- .../Builder/RelTestataSQLBuilder.cs | 29 ++++- .../RelAnniQueryByIdEntePersistence.cs | 24 +++++ .../Persistence/RelAnniQueryPersistence.cs | 18 ++++ .../RelMesiByIdEnteQueryPersistence.cs | 24 +++++ .../Persistence/RelMesiQueryPersistence.cs | 26 +++++ .../DatiRel/Queries/RelAnniByIdEnteQuery.cs | 9 ++ .../SEND/DatiRel/Queries/RelAnniQuery.cs | 8 ++ .../DatiRel/Queries/RelMesiByIdEnteQuery.cs | 13 +++ .../SEND/DatiRel/Queries/RelMesiQuery.cs | 11 ++ .../QueryHandlers/RelAnniByIdEnteHandler.cs | 24 +++++ .../DatiRel/QueryHandlers/RelAnniHandler.cs | 24 +++++ .../QueryHandlers/RelMesiByIdEnteHandler.cs | 24 +++++ .../DatiRel/QueryHandlers/RelMesiHandler.cs | 24 +++++ .../SEND/Fatture/Queries/FattureAnniQuery.cs | 10 ++ .../SEND/Fatture/Queries/FattureMesiQuery.cs | 11 ++ .../Queries/FattureTipologiaAnniMeseQuery.cs | 12 +++ .../Builder/FattureQueryRicercaBuilder.cs | 52 ++++++++- .../FattureAnniQueryPersistence.cs | 18 ++++ .../FattureMesiQueryPersistence.cs | 26 +++++ .../FattureQueryRicercaPersistence.cs | 10 +- ...attureTipologiaAnniMeseQueryPersistence.cs | 21 ++++ .../QueryHandlers/FattureAnniHandler.cs | 24 +++++ .../QueryHandlers/FattureMesiHandler.cs | 24 +++++ .../FattureTipologiaAnniMeseQueryHandler.cs | 24 +++++ .../Report/Queries/AccertamentiAnniQuery.cs | 9 ++ .../Report/Queries/AccertamentiMesiQuery.cs | 11 ++ .../AccertamentiAnniQueryPersistence.cs | 16 +++ .../AccertamentiMesiQueryPersistence.cs | 26 +++++ .../Persistence/Builder/ReportSQLBuilder.cs | 24 +++++ .../QueryHandlers/AccertamentiAnniHandler.cs | 24 +++++ .../QueryHandlers/AccertamentiMesiHandler.cs | 24 +++++ .../Accertamenti/AccertamentiEndpoints.cs | 12 +++ .../SEND/Accertamenti/AccertamentiModule.cs | 49 +++++++++ .../Request/AccertamentiMesiRequest.cs | 6 ++ .../Response/AccertamentiMeseResponse.cs | 12 +++ .../DatiRel/Payload/Request/RelMesiRequest.cs | 6 ++ .../Payload/Response/RelMeseResponse.cs | 12 +++ .../Modules/SEND/DatiRel/RelEndpoints.cs | 23 ++++ .../Modules/SEND/DatiRel/RelModule.cs | 102 +++++++++++++++++- .../Fatture/Extensions/FattureExtensions.cs | 9 ++ .../Modules/SEND/Fatture/FattureEndpoints.cs | 12 +++ .../Modules/SEND/Fatture/FattureModule.cs | 57 ++++++++-- .../Payload/Request/FattureMesiRequest.cs | 6 ++ .../Payload/Response/FattureMeseResponse.cs | 12 +++ .../PortaleFatture.BE.Api.csproj | 11 -- 45 files changed, 929 insertions(+), 24 deletions(-) create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/RelAnniQueryByIdEntePersistence.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/RelAnniQueryPersistence.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/RelMesiByIdEnteQueryPersistence.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/RelMesiQueryPersistence.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/RelAnniByIdEnteQuery.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/RelAnniQuery.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/RelMesiByIdEnteQuery.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/RelMesiQuery.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/QueryHandlers/RelAnniByIdEnteHandler.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/QueryHandlers/RelAnniHandler.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/QueryHandlers/RelMesiByIdEnteHandler.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/QueryHandlers/RelMesiHandler.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/FattureAnniQuery.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/FattureMesiQuery.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/FattureTipologiaAnniMeseQuery.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/FattureAnniQueryPersistence.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/FattureMesiQueryPersistence.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/FattureTipologiaAnniMeseQueryPersistence.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/QueryHandlers/FattureAnniHandler.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/QueryHandlers/FattureMesiHandler.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/QueryHandlers/FattureTipologiaAnniMeseQueryHandler.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/AccertamentiAnniQuery.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/AccertamentiMesiQuery.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/Persistence/AccertamentiAnniQueryPersistence.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/Persistence/AccertamentiMesiQueryPersistence.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/QueryHandlers/AccertamentiAnniHandler.cs create mode 100644 src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/QueryHandlers/AccertamentiMesiHandler.cs create mode 100644 src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Accertamenti/Payload/Request/AccertamentiMesiRequest.cs create mode 100644 src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Accertamenti/Payload/Response/AccertamentiMeseResponse.cs create mode 100644 src/Presentation/PortaleFatture.BE.Api/Modules/SEND/DatiRel/Payload/Request/RelMesiRequest.cs create mode 100644 src/Presentation/PortaleFatture.BE.Api/Modules/SEND/DatiRel/Payload/Response/RelMeseResponse.cs create mode 100644 src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/Payload/Request/FattureMesiRequest.cs create mode 100644 src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/Payload/Response/FattureMeseResponse.cs diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/Builder/RelTestataSQLBuilder.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/Builder/RelTestataSQLBuilder.cs index f53e019..1c725d9 100644 --- a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/Builder/RelTestataSQLBuilder.cs +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/Builder/RelTestataSQLBuilder.cs @@ -1,7 +1,16 @@ namespace PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries.Persistence.Builder; internal static class RelTestataSQLBuilder -{ +{ + private static string _sqlAnni = @" +SELECT distinct(year) + FROM [pfd].[RelTestata] +"; + + private static string _sqlMesi = @" +SELECT distinct(month) + FROM [pfd].[RelTestata] +"; private static string _sqlDistinctTipologiaFatturaPagoPA = @" SELECT TipologiaFattura @@ -149,4 +158,22 @@ public static string OrderByDistinctTipologiaFattura() { return " ORDER BY ordine "; } + + public static string SelectAnni() + { + return _sqlAnni; + } + + public static string SelectMesi() + { + return _sqlMesi; + } + + public static string OrderByMonth = " order by month desc"; + + public static string OrderByYear= " order by year desc"; + + public static string GroupByOrderByYear = " group by year, internal_organization_id, contract_id order by year desc"; + + public static string GroupByMonthByYear = " group by year, month, internal_organization_id, contract_id order by month desc"; } \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/RelAnniQueryByIdEntePersistence.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/RelAnniQueryByIdEntePersistence.cs new file mode 100644 index 0000000..4e37331 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/RelAnniQueryByIdEntePersistence.cs @@ -0,0 +1,24 @@ +using System.Data; +using System.Dynamic; +using PortaleFatture.BE.Infrastructure.Common.Persistence; +using PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries.Persistence.Builder; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries.Persistence; + +public class RelAnniQueryByIdEntePersistence(RelAnniByIdEnteQuery command) : DapperBase, IQuery?> +{ + private readonly RelAnniByIdEnteQuery _command = command; + private static readonly string _sql = RelTestataSQLBuilder.SelectAnni(); + private static readonly string _orderBy = RelTestataSQLBuilder.GroupByOrderByYear; + public async Task?> Execute(IDbConnection? connection, string schema, IDbTransaction? transaction, CancellationToken cancellationToken = default) + { + var authInfo = _command.AuthenticationInfo; + dynamic parameters = new ExpandoObject(); + + var where = " WHERE internal_organization_id=@IdEnte "; + parameters.IdEnte = authInfo.IdEnte; + + return await ((IDatabase)this).SelectAsync( + connection!, _sql + where + _orderBy, parameters, transaction); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/RelAnniQueryPersistence.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/RelAnniQueryPersistence.cs new file mode 100644 index 0000000..fce8fe2 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/RelAnniQueryPersistence.cs @@ -0,0 +1,18 @@ +using System.Data; +using PortaleFatture.BE.Infrastructure.Common.Persistence; +using PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries.Persistence.Builder; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries.Persistence; + +public class RelAnniQueryPersistence(RelAnniQuery command) : DapperBase, IQuery?> +{ + private readonly RelAnniQuery _command = command; + private static readonly string _sql = RelTestataSQLBuilder.SelectAnni(); + private static readonly string _orderBy = RelTestataSQLBuilder.OrderByYear; + public async Task?> Execute(IDbConnection? connection, string schema, IDbTransaction? transaction, CancellationToken cancellationToken = default) + { + + return await ((IDatabase)this).SelectAsync( + connection!, _sql + _orderBy, _command, transaction); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/RelMesiByIdEnteQueryPersistence.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/RelMesiByIdEnteQueryPersistence.cs new file mode 100644 index 0000000..f16716b --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/RelMesiByIdEnteQueryPersistence.cs @@ -0,0 +1,24 @@ +using System.Data; +using System.Dynamic; +using PortaleFatture.BE.Infrastructure.Common.Persistence; +using PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries.Persistence.Builder; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries.Persistence; + +public class RelMesiByIdEnteQueryPersistence(RelMesiByIdEnteQuery command) : DapperBase, IQuery?> +{ + private readonly RelMesiByIdEnteQuery _command = command; + private static readonly string _sql = RelTestataSQLBuilder.SelectMesi(); + private static readonly string _orderBy = RelTestataSQLBuilder.GroupByMonthByYear; + public async Task?> Execute(IDbConnection? connection, string schema, IDbTransaction? transaction, CancellationToken cancellationToken = default) + { + var authInfo = _command.AuthenticationInfo; + dynamic parameters = new ExpandoObject(); + var where = " WHERE year=@anno "; + parameters.Anno = _command.Anno; + where += " AND internal_organization_id=@IdEnte "; + parameters.IdEnte = authInfo.IdEnte; + return await ((IDatabase)this).SelectAsync( + connection!, _sql + where + _orderBy, parameters, transaction); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/RelMesiQueryPersistence.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/RelMesiQueryPersistence.cs new file mode 100644 index 0000000..f342f04 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/Persistence/RelMesiQueryPersistence.cs @@ -0,0 +1,26 @@ +using System.Data; +using System.Dynamic; +using PortaleFatture.BE.Infrastructure.Common.Persistence; +using PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries.Persistence.Builder; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries.Persistence; + +public class RelMesiQueryPersistence(RelMesiQuery command) : DapperBase, IQuery?> +{ + private readonly RelMesiQuery _command = command; + private static readonly string _sql = RelTestataSQLBuilder.SelectMesi(); + private static readonly string _orderBy = RelTestataSQLBuilder.OrderByMonth; + public async Task?> Execute(IDbConnection? connection, string schema, IDbTransaction? transaction, CancellationToken cancellationToken = default) + { + dynamic parameters = new ExpandoObject(); + var where = string.Empty; + if (!string.IsNullOrEmpty(_command.Anno)) + { + where += " WHERE year=@anno "; + parameters.Anno = _command.Anno; + } + + return await ((IDatabase)this).SelectAsync( + connection!, _sql + where + _orderBy, parameters, transaction); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/RelAnniByIdEnteQuery.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/RelAnniByIdEnteQuery.cs new file mode 100644 index 0000000..7fef975 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/RelAnniByIdEnteQuery.cs @@ -0,0 +1,9 @@ +using MediatR; +using PortaleFatture.BE.Core.Auth; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries; +public class RelAnniByIdEnteQuery(IAuthenticationInfo authenticationInfo) : IRequest?> +{ + public IAuthenticationInfo AuthenticationInfo { get; internal set; } = authenticationInfo; + public string? IdContratto { get; set; } +} diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/RelAnniQuery.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/RelAnniQuery.cs new file mode 100644 index 0000000..1ef740a --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/RelAnniQuery.cs @@ -0,0 +1,8 @@ +using MediatR; +using PortaleFatture.BE.Core.Auth; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries; +public class RelAnniQuery(IAuthenticationInfo authenticationInfo) : IRequest?> +{ + public IAuthenticationInfo AuthenticationInfo { get; internal set; } = authenticationInfo; +} diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/RelMesiByIdEnteQuery.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/RelMesiByIdEnteQuery.cs new file mode 100644 index 0000000..223fe4b --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/RelMesiByIdEnteQuery.cs @@ -0,0 +1,13 @@ +using MediatR; +using PortaleFatture.BE.Core.Auth; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries; + +public class RelMesiByIdEnteQuery(IAuthenticationInfo authenticationInfo) : IRequest?> +{ + public IAuthenticationInfo AuthenticationInfo { get; internal set; } = authenticationInfo; + + public string? Anno { get; set; } + + public string? IdContratto { get; set; } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/RelMesiQuery.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/RelMesiQuery.cs new file mode 100644 index 0000000..dc18e0b --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/Queries/RelMesiQuery.cs @@ -0,0 +1,11 @@ +using MediatR; +using PortaleFatture.BE.Core.Auth; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries; + +public class RelMesiQuery(IAuthenticationInfo authenticationInfo) : IRequest?> +{ + public IAuthenticationInfo AuthenticationInfo { get; internal set; } = authenticationInfo; + + public string? Anno { get; set; } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/QueryHandlers/RelAnniByIdEnteHandler.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/QueryHandlers/RelAnniByIdEnteHandler.cs new file mode 100644 index 0000000..3449e5e --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/QueryHandlers/RelAnniByIdEnteHandler.cs @@ -0,0 +1,24 @@ +using MediatR; +using Microsoft.Extensions.Localization; +using Microsoft.Extensions.Logging; +using PortaleFatture.BE.Core.Resources; +using PortaleFatture.BE.Infrastructure.Common.Persistence.Schemas; +using PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries; +using PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries.Persistence; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.QueryHandlers; + +public class RelAnniByIdEnteHandler( + IFattureDbContextFactory factory, + IStringLocalizer localizer, + ILogger logger) : IRequestHandler?> +{ + private readonly IFattureDbContextFactory _factory = factory; + private readonly ILogger _logger = logger; + private readonly IStringLocalizer _localizer = localizer; + public async Task?> Handle(RelAnniByIdEnteQuery request, CancellationToken ct) + { + using var rs = await _factory.Create(cancellationToken: ct); + return await rs.Query(new RelAnniQueryByIdEntePersistence(request), ct); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/QueryHandlers/RelAnniHandler.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/QueryHandlers/RelAnniHandler.cs new file mode 100644 index 0000000..f2146b8 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/QueryHandlers/RelAnniHandler.cs @@ -0,0 +1,24 @@ +using MediatR; +using Microsoft.Extensions.Localization; +using Microsoft.Extensions.Logging; +using PortaleFatture.BE.Core.Resources; +using PortaleFatture.BE.Infrastructure.Common.Persistence.Schemas; +using PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries; +using PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries.Persistence; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.QueryHandlers; + +public class RelAnniHandler( + IFattureDbContextFactory factory, + IStringLocalizer localizer, + ILogger logger) : IRequestHandler?> +{ + private readonly IFattureDbContextFactory _factory = factory; + private readonly ILogger _logger = logger; + private readonly IStringLocalizer _localizer = localizer; + public async Task?> Handle(RelAnniQuery request, CancellationToken ct) + { + using var rs = await _factory.Create(cancellationToken: ct); + return await rs.Query(new RelAnniQueryPersistence(request), ct); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/QueryHandlers/RelMesiByIdEnteHandler.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/QueryHandlers/RelMesiByIdEnteHandler.cs new file mode 100644 index 0000000..c91d3d9 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/QueryHandlers/RelMesiByIdEnteHandler.cs @@ -0,0 +1,24 @@ +using MediatR; +using Microsoft.Extensions.Localization; +using Microsoft.Extensions.Logging; +using PortaleFatture.BE.Core.Resources; +using PortaleFatture.BE.Infrastructure.Common.Persistence.Schemas; +using PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries; +using PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries.Persistence; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.QueryHandlers; + +public class RelMesiByIdEnteHandler( + IFattureDbContextFactory factory, + IStringLocalizer localizer, + ILogger logger) : IRequestHandler?> +{ + private readonly IFattureDbContextFactory _factory = factory; + private readonly ILogger _logger = logger; + private readonly IStringLocalizer _localizer = localizer; + public async Task?> Handle(RelMesiByIdEnteQuery request, CancellationToken ct) + { + using var rs = await _factory.Create(cancellationToken: ct); + return await rs.Query(new RelMesiByIdEnteQueryPersistence(request), ct); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/QueryHandlers/RelMesiHandler.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/QueryHandlers/RelMesiHandler.cs new file mode 100644 index 0000000..2c2e0c0 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/DatiRel/QueryHandlers/RelMesiHandler.cs @@ -0,0 +1,24 @@ +using MediatR; +using Microsoft.Extensions.Localization; +using Microsoft.Extensions.Logging; +using PortaleFatture.BE.Core.Resources; +using PortaleFatture.BE.Infrastructure.Common.Persistence.Schemas; +using PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries; +using PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries.Persistence; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.QueryHandlers; + +public class RelMesiHandler( + IFattureDbContextFactory factory, + IStringLocalizer localizer, + ILogger logger) : IRequestHandler?> +{ + private readonly IFattureDbContextFactory _factory = factory; + private readonly ILogger _logger = logger; + private readonly IStringLocalizer _localizer = localizer; + public async Task?> Handle(RelMesiQuery request, CancellationToken ct) + { + using var rs = await _factory.Create(cancellationToken: ct); + return await rs.Query(new RelMesiQueryPersistence(request), ct); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/FattureAnniQuery.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/FattureAnniQuery.cs new file mode 100644 index 0000000..05f3910 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/FattureAnniQuery.cs @@ -0,0 +1,10 @@ +using MediatR; +using PortaleFatture.BE.Core.Auth; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries; + + +public class FattureAnniQuery(IAuthenticationInfo authenticationInfo) : IRequest?> +{ + public IAuthenticationInfo AuthenticationInfo { get; internal set; } = authenticationInfo; +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/FattureMesiQuery.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/FattureMesiQuery.cs new file mode 100644 index 0000000..ecd9623 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/FattureMesiQuery.cs @@ -0,0 +1,11 @@ +using MediatR; +using PortaleFatture.BE.Core.Auth; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries; + +public class FattureMesiQuery(IAuthenticationInfo authenticationInfo) : IRequest?> +{ + public IAuthenticationInfo AuthenticationInfo { get; internal set; } = authenticationInfo; + + public string? Anno { get; set; } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/FattureTipologiaAnniMeseQuery.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/FattureTipologiaAnniMeseQuery.cs new file mode 100644 index 0000000..2020157 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/FattureTipologiaAnniMeseQuery.cs @@ -0,0 +1,12 @@ +using MediatR; +using PortaleFatture.BE.Core.Auth; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries; + +public class FattureTipologiaAnniMeseQuery(IAuthenticationInfo authenticationInfo) : IRequest?> +{ + public IAuthenticationInfo AuthenticationInfo { get; internal set; } = authenticationInfo; + + public int? Anno { get; set; } + public int? Mese { get; set; } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/Builder/FattureQueryRicercaBuilder.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/Builder/FattureQueryRicercaBuilder.cs index 16104ec..5719606 100644 --- a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/Builder/FattureQueryRicercaBuilder.cs +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/Builder/FattureQueryRicercaBuilder.cs @@ -316,10 +316,47 @@ [pfd].[FattureTestata] FT INNER JOIN pfw.FatturaTestataConfig ftc ON ftc.FkTipologiaFattura = FT.FkTipologiaFattura AND ftc.FKIdTipoContratto = c.FkIdTipoContratto where FT.AnnoRiferimento = @AnnoRiferimento and FT.MeseRiferimento = @MeseRiferimento - and FT.FkTipologiaFattura IN @TipologiaFattura + [condition_tipologiafattura] and FT.FkIdEnte <> '4a4149af-172e-4950-9cc8-63ccc9a6d865' --esclusione pagopa ORDER BY FT.FkTipologiaFattura, FT.Progressivo FOR JSON PATH, INCLUDE_NULL_VALUES )"; + + private static string _sqlAnni = @" +SELECT + distinct AnnoRiferimento + FROM [pfd].[FattureTestata] +"; + + private static string _sqlMesi = @" +SELECT + distinct MeseRiferimento + FROM [pfd].[FattureTestata] +"; + + private static string _sqlSelectTipologiaFatturaAnnoMese = @" +SELECT + distinct FkTipologiaFattura, + CASE + WHEN [FkTipologiaFattura] = 'ANTICIPO' THEN 1 + WHEN [FkTipologiaFattura] = 'ACCONTO' THEN 2 + WHEN [FkTipologiaFattura] = 'PRIMO SALDO' THEN 3 + WHEN [FkTipologiaFattura] = 'SECONDO SALDO' THEN 4 + WHEN [FkTipologiaFattura] = 'VAR. SEMESTRALE' THEN 5 + ELSE 6 + END AS ordine + FROM [pfd].[FattureTestata] + where AnnoRiferimento=@anno and MeseRiferimento=@mese +"; + + public static string OrderByYear() + { + return " ORDER BY AnnoRiferimento desc"; + } + public static string OrderByMonth() + { + return " ORDER BY MeseRiferimento desc"; + } + public static string SelectStored() { return _sqlStored; @@ -362,5 +399,18 @@ public static string SelectViewByIdEnte() { return _sqlViewByIdEnte; } + public static string SelectAnni() + { + return _sqlAnni; + } + public static string SelectMesi() + { + return _sqlMesi; + } + + public static string SelectTipologiaFatturaAnnoMese() + { + return _sqlSelectTipologiaFatturaAnnoMese; + } } diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/FattureAnniQueryPersistence.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/FattureAnniQueryPersistence.cs new file mode 100644 index 0000000..05b036c --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/FattureAnniQueryPersistence.cs @@ -0,0 +1,18 @@ +using System.Data; +using PortaleFatture.BE.Infrastructure.Common.Persistence; +using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries.Persistence.Builder; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries.Persistence; + +public class FattureAnniQueryPersistence(FattureAnniQuery command) : DapperBase, IQuery?> +{ + private readonly FattureAnniQuery _command = command; + private static readonly string _sql = FattureQueryRicercaBuilder.SelectAnni(); + private static readonly string _orderBy = FattureQueryRicercaBuilder.OrderByYear(); + public async Task?> Execute(IDbConnection? connection, string schema, IDbTransaction? transaction, CancellationToken cancellationToken = default) + { + + return await ((IDatabase)this).SelectAsync( + connection!, _sql + _orderBy, _command, transaction); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/FattureMesiQueryPersistence.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/FattureMesiQueryPersistence.cs new file mode 100644 index 0000000..7f3b3c0 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/FattureMesiQueryPersistence.cs @@ -0,0 +1,26 @@ +using System.Data; +using System.Dynamic; +using PortaleFatture.BE.Infrastructure.Common.Persistence; +using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries.Persistence.Builder; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries.Persistence; + +public class FattureMesiQueryPersistence(FattureMesiQuery command) : DapperBase, IQuery?> +{ + private readonly FattureMesiQuery _command = command; + private static readonly string _sql = FattureQueryRicercaBuilder.SelectMesi(); + private static readonly string _orderBy = FattureQueryRicercaBuilder.OrderByMonth(); + public async Task?> Execute(IDbConnection? connection, string schema, IDbTransaction? transaction, CancellationToken cancellationToken = default) + { + dynamic parameters = new ExpandoObject(); + var where = string.Empty; + if (!string.IsNullOrEmpty(_command.Anno)) + { + where += " WHERE annoriferimento=@anno "; + parameters.Anno = _command.Anno; + } + + return await ((IDatabase)this).SelectAsync( + connection!, _sql + where + _orderBy, parameters, transaction); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/FattureQueryRicercaPersistence.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/FattureQueryRicercaPersistence.cs index 20784e9..8242933 100644 --- a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/FattureQueryRicercaPersistence.cs +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/FattureQueryRicercaPersistence.cs @@ -24,9 +24,15 @@ public class FattureQueryRicercaPersistence(FattureQueryRicerca command) : Dappe var tipoFattura = _command.TipologiaFattura; var sqlFatture = _command.Cancellata ? _sqlSelectAllCancellate : _sqlSelectAll; - var sqlEnti = _sqlSelectEnti.Add(schema); - var sql = string.Join(";", sqlEnti, sqlFatture); + var sqlEnti = _sqlSelectEnti.Add(schema); + if (!tipoFattura.IsNullNotAny()) + sqlFatture = sqlFatture.Replace("[condition_tipologiafattura]", "and FT.FkTipologiaFattura IN @TipologiaFattura"); + else + sqlFatture = sqlFatture.Replace("[condition_tipologiafattura]", string.Empty); + + var sql = string.Join(";", sqlEnti, sqlFatture); + var query = new { AnnoRiferimento = anno, diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/FattureTipologiaAnniMeseQueryPersistence.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/FattureTipologiaAnniMeseQueryPersistence.cs new file mode 100644 index 0000000..fe00d99 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/Queries/Persistence/FattureTipologiaAnniMeseQueryPersistence.cs @@ -0,0 +1,21 @@ +using System.Data; +using System.Dynamic; +using PortaleFatture.BE.Infrastructure.Common.Persistence; +using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries.Persistence.Builder; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries.Persistence; + +public class FattureTipologiaAnniMeseQueryPersistence(FattureTipologiaAnniMeseQuery command) : DapperBase, IQuery?> +{ + private readonly FattureTipologiaAnniMeseQuery _command = command; + private static readonly string _sql = FattureQueryRicercaBuilder.SelectTipologiaFatturaAnnoMese(); + public async Task?> Execute(IDbConnection? connection, string schema, IDbTransaction? transaction, CancellationToken cancellationToken = default) + { + dynamic parameters = new ExpandoObject(); + parameters.Anno = _command.Anno; + parameters.mese = _command.Mese; + + return await ((IDatabase)this).SelectAsync( + connection!, _sql, parameters, transaction); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/QueryHandlers/FattureAnniHandler.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/QueryHandlers/FattureAnniHandler.cs new file mode 100644 index 0000000..6aabddb --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/QueryHandlers/FattureAnniHandler.cs @@ -0,0 +1,24 @@ +using MediatR; +using Microsoft.Extensions.Localization; +using Microsoft.Extensions.Logging; +using PortaleFatture.BE.Core.Resources; +using PortaleFatture.BE.Infrastructure.Common.Persistence.Schemas; +using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries; +using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries.Persistence; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.QueryHandlers; + +public class FattureAnniHandler( + IFattureDbContextFactory factory, + IStringLocalizer localizer, + ILogger logger) : IRequestHandler?> +{ + private readonly IFattureDbContextFactory _factory = factory; + private readonly ILogger _logger = logger; + private readonly IStringLocalizer _localizer = localizer; + public async Task?> Handle(FattureAnniQuery request, CancellationToken ct) + { + using var rs = await _factory.Create(cancellationToken: ct); + return await rs.Query(new FattureAnniQueryPersistence(request), ct); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/QueryHandlers/FattureMesiHandler.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/QueryHandlers/FattureMesiHandler.cs new file mode 100644 index 0000000..2472af3 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/QueryHandlers/FattureMesiHandler.cs @@ -0,0 +1,24 @@ +using MediatR; +using Microsoft.Extensions.Localization; +using Microsoft.Extensions.Logging; +using PortaleFatture.BE.Core.Resources; +using PortaleFatture.BE.Infrastructure.Common.Persistence.Schemas; +using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries; +using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries.Persistence; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.QueryHandlers; + +public class FattureMesiHandler( + IFattureDbContextFactory factory, + IStringLocalizer localizer, + ILogger logger) : IRequestHandler?> +{ + private readonly IFattureDbContextFactory _factory = factory; + private readonly ILogger _logger = logger; + private readonly IStringLocalizer _localizer = localizer; + public async Task?> Handle(FattureMesiQuery request, CancellationToken ct) + { + using var rs = await _factory.Create(cancellationToken: ct); + return await rs.Query(new FattureMesiQueryPersistence(request), ct); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/QueryHandlers/FattureTipologiaAnniMeseQueryHandler.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/QueryHandlers/FattureTipologiaAnniMeseQueryHandler.cs new file mode 100644 index 0000000..62b945a --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Fatture/QueryHandlers/FattureTipologiaAnniMeseQueryHandler.cs @@ -0,0 +1,24 @@ +using MediatR; +using Microsoft.Extensions.Localization; +using Microsoft.Extensions.Logging; +using PortaleFatture.BE.Core.Resources; +using PortaleFatture.BE.Infrastructure.Common.Persistence.Schemas; +using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries.Persistence; +using PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.Queries; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.Fatture.QueryHandlers; + +public class FattureTipologiaAnniMeseQueryHandler( + IFattureDbContextFactory factory, + IStringLocalizer localizer, + ILogger logger) : IRequestHandler?> +{ + private readonly IFattureDbContextFactory _factory = factory; + private readonly ILogger _logger = logger; + private readonly IStringLocalizer _localizer = localizer; + public async Task?> Handle(FattureTipologiaAnniMeseQuery request, CancellationToken ct) + { + using var rs = await _factory.Create(cancellationToken: ct); + return await rs.Query(new FattureTipologiaAnniMeseQueryPersistence(request), ct); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/AccertamentiAnniQuery.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/AccertamentiAnniQuery.cs new file mode 100644 index 0000000..b831e75 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/AccertamentiAnniQuery.cs @@ -0,0 +1,9 @@ +using MediatR; +using PortaleFatture.BE.Core.Auth; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.Report.Queries; + +public class AccertamentiAnniQuery(IAuthenticationInfo authenticationInfo) : IRequest?> +{ + public IAuthenticationInfo AuthenticationInfo { get; internal set; } = authenticationInfo; +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/AccertamentiMesiQuery.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/AccertamentiMesiQuery.cs new file mode 100644 index 0000000..e9133c0 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/AccertamentiMesiQuery.cs @@ -0,0 +1,11 @@ +using MediatR; +using PortaleFatture.BE.Core.Auth; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.Report.Queries; + +public class AccertamentiMesiQuery(IAuthenticationInfo authenticationInfo) : IRequest?> +{ + public IAuthenticationInfo AuthenticationInfo { get; internal set; } = authenticationInfo; + + public string? Anno { get; set; } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/Persistence/AccertamentiAnniQueryPersistence.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/Persistence/AccertamentiAnniQueryPersistence.cs new file mode 100644 index 0000000..f0770b6 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/Persistence/AccertamentiAnniQueryPersistence.cs @@ -0,0 +1,16 @@ +using System.Data; +using PortaleFatture.BE.Infrastructure.Common.Persistence; +using PortaleFatture.BE.Infrastructure.Common.SEND.Report.Queries.Persistence.Builder; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.Report.Queries.Persistence; + +public class AccertamentiAnniQueryPersistence(AccertamentiAnniQuery command) : DapperBase, IQuery?> +{ + private readonly AccertamentiAnniQuery _command = command; + private static readonly string _sql = ReportSQLBuilder.SelectAnni(); + public async Task?> Execute(IDbConnection? connection, string schema, IDbTransaction? transaction, CancellationToken cancellationToken = default) + { + return await ((IDatabase)this).SelectAsync( + connection!, _sql, _command, transaction); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/Persistence/AccertamentiMesiQueryPersistence.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/Persistence/AccertamentiMesiQueryPersistence.cs new file mode 100644 index 0000000..abb9668 --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/Persistence/AccertamentiMesiQueryPersistence.cs @@ -0,0 +1,26 @@ +using System.Data; +using System.Dynamic; +using PortaleFatture.BE.Infrastructure.Common.Persistence; +using PortaleFatture.BE.Infrastructure.Common.SEND.Report.Queries.Persistence.Builder; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.Report.Queries.Persistence; + +public class AccertamentiMesiQueryPersistence(AccertamentiMesiQuery command) : DapperBase, IQuery?> +{ + private readonly AccertamentiMesiQuery _command = command; + private static readonly string _sql = ReportSQLBuilder.SelectMesi(); + private static readonly string _orderBy = ReportSQLBuilder.OrderByMonth; + public async Task?> Execute(IDbConnection? connection, string schema, IDbTransaction? transaction, CancellationToken cancellationToken = default) + { + dynamic parameters = new ExpandoObject(); + var where = string.Empty; + if (!string.IsNullOrEmpty(_command.Anno)) + { + where += " WHERE anno=@anno "; + parameters.Anno = _command.Anno; + } + + return await ((IDatabase)this).SelectAsync( + connection!, _sql + where + _orderBy, parameters, transaction); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/Persistence/Builder/ReportSQLBuilder.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/Persistence/Builder/ReportSQLBuilder.cs index 708d33d..d13a932 100644 --- a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/Persistence/Builder/ReportSQLBuilder.cs +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/Queries/Persistence/Builder/ReportSQLBuilder.cs @@ -1,6 +1,19 @@ namespace PortaleFatture.BE.Infrastructure.Common.SEND.Report.Queries.Persistence.Builder; internal static class ReportSQLBuilder { + private static string _sqlAnni = @" +SELECT + distinct Anno + FROM [pfd].[Report] + order by anno desc +"; + + private static string _sqlMesi = @" +SELECT + distinct mese + FROM [pfd].[Report] +"; + private static string _sqlMatriceCostiRecapitisti = @" SELECT [geokey] AS GeoKey, @@ -73,5 +86,16 @@ public static string SelectMatriceCostoRecapitistiData() public static string SelectMatriceCostiRecapitisti() { return _sqlMatriceCostiRecapitisti; + } + public static string SelectAnni() + { + return _sqlAnni; } + + public static string SelectMesi() + { + return _sqlMesi; + } + + public static string OrderByMonth = " order by mese desc"; } \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/QueryHandlers/AccertamentiAnniHandler.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/QueryHandlers/AccertamentiAnniHandler.cs new file mode 100644 index 0000000..d916c1c --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/QueryHandlers/AccertamentiAnniHandler.cs @@ -0,0 +1,24 @@ +using MediatR; +using Microsoft.Extensions.Localization; +using Microsoft.Extensions.Logging; +using PortaleFatture.BE.Core.Resources; +using PortaleFatture.BE.Infrastructure.Common.Persistence.Schemas; +using PortaleFatture.BE.Infrastructure.Common.SEND.Report.Queries; +using PortaleFatture.BE.Infrastructure.Common.SEND.Report.Queries.Persistence; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.Report.QueryHandlers; + +public class AccertamentiAnniHandler( + IFattureDbContextFactory factory, + IStringLocalizer localizer, + ILogger logger) : IRequestHandler?> +{ + private readonly IFattureDbContextFactory _factory = factory; + private readonly ILogger _logger = logger; + private readonly IStringLocalizer _localizer = localizer; + public async Task?> Handle(AccertamentiAnniQuery request, CancellationToken ct) + { + using var rs = await _factory.Create(cancellationToken: ct); + return await rs.Query(new AccertamentiAnniQueryPersistence(request), ct); + } +} \ No newline at end of file diff --git a/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/QueryHandlers/AccertamentiMesiHandler.cs b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/QueryHandlers/AccertamentiMesiHandler.cs new file mode 100644 index 0000000..247b8ef --- /dev/null +++ b/src/Infrastructure/PortaleFatture.BE.Infrastructure/Common/SEND/Report/QueryHandlers/AccertamentiMesiHandler.cs @@ -0,0 +1,24 @@ +using MediatR; +using Microsoft.Extensions.Localization; +using Microsoft.Extensions.Logging; +using PortaleFatture.BE.Core.Resources; +using PortaleFatture.BE.Infrastructure.Common.Persistence.Schemas; +using PortaleFatture.BE.Infrastructure.Common.SEND.Report.Queries; +using PortaleFatture.BE.Infrastructure.Common.SEND.Report.Queries.Persistence; + +namespace PortaleFatture.BE.Infrastructure.Common.SEND.Report.QueryHandlers; + +public class AccertamentiMesiHandler( + IFattureDbContextFactory factory, + IStringLocalizer localizer, + ILogger logger) : IRequestHandler?> +{ + private readonly IFattureDbContextFactory _factory = factory; + private readonly ILogger _logger = logger; + private readonly IStringLocalizer _localizer = localizer; + public async Task?> Handle(AccertamentiMesiQuery request, CancellationToken ct) + { + using var rs = await _factory.Create(cancellationToken: ct); + return await rs.Query(new AccertamentiMesiQueryPersistence(request), ct); + } +} \ No newline at end of file diff --git a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Accertamenti/AccertamentiEndpoints.cs b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Accertamenti/AccertamentiEndpoints.cs index 5602466..15cfc41 100644 --- a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Accertamenti/AccertamentiEndpoints.cs +++ b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Accertamenti/AccertamentiEndpoints.cs @@ -36,5 +36,17 @@ public void RegisterEndpoints(IEndpointRouteBuilder endpointRouteBuilder) .WithName("Permette di ottenere il report excel della matrice costi recapitisti") .SetOpenApi(Module.DatiAccertamentiPagoPA) .WithMetadata(new EnableCorsAttribute(policyName: Module.CORSLabel)); + + endpointRouteBuilder + .MapGet("api/accertamenti/anni", GetAnniAccertamentiAsync) + .WithName("Permette visualizzare anni accertamenti - pagoPA") + .SetOpenApi(Module.DatiFattureLabel) + .WithMetadata(new EnableCorsAttribute(policyName: Module.CORSLabel)); + + endpointRouteBuilder + .MapPost("api/accertamenti/mesi", PostMesiAccertamentiAsync) + .WithName("Permette visualizzare mesi accertamenti per anno - pagoPA") + .SetOpenApi(Module.DatiFattureLabel) + .WithMetadata(new EnableCorsAttribute(policyName: Module.CORSLabel)); } } \ No newline at end of file diff --git a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Accertamenti/AccertamentiModule.cs b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Accertamenti/AccertamentiModule.cs index 1c746f9..b545a1b 100644 --- a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Accertamenti/AccertamentiModule.cs +++ b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Accertamenti/AccertamentiModule.cs @@ -8,6 +8,7 @@ using PortaleFatture.BE.Api.Infrastructure.Documenti; using PortaleFatture.BE.Api.Modules.SEND.Accertamenti.Extensions; using PortaleFatture.BE.Api.Modules.SEND.Accertamenti.Payload.Request; +using PortaleFatture.BE.Api.Modules.SEND.Accertamenti.Payload.Response; using PortaleFatture.BE.Core.Auth; using PortaleFatture.BE.Core.Extensions; using PortaleFatture.BE.Core.Resources; @@ -25,6 +26,54 @@ public partial class AccertamentiModule #region pagoPA + [Authorize(Roles = $"{Ruolo.OPERATOR}, {Ruolo.ADMIN}", Policy = Module.PagoPAPolicy)] + [EnableCors(CORSLabel)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + private async Task>, NotFound>> GetAnniAccertamentiAsync( + HttpContext context, + [FromServices] IStringLocalizer localizer, + [FromServices] IMediator handler) + { + var authInfo = context.GetAuthInfo(); + + var anni = await handler.Send(new AccertamentiAnniQuery(authInfo)); + if (anni.IsNullNotAny()) + return NotFound(); + return Ok(anni); + } + + [Authorize(Roles = $"{Ruolo.OPERATOR}, {Ruolo.ADMIN}", Policy = Module.PagoPAPolicy)] + [EnableCors(CORSLabel)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + private async Task>, NotFound>> PostMesiAccertamentiAsync( + HttpContext context, + [FromBody] AccertamentiMesiRequest request, + [FromServices] IStringLocalizer localizer, + [FromServices] IMediator handler) + { + var authInfo = context.GetAuthInfo(); + + var mesi = await handler.Send(new AccertamentiMesiQuery(authInfo) + { + Anno = request.Anno + }); + + if (mesi.IsNullNotAny()) + return NotFound(); + + return Ok(mesi!.Select(x => new AccertamentiMeseResponse() + { + Mese = x, + Descrizione = Convert.ToInt32(x).GetMonth() + })); + } + [Authorize(Roles = $"{Ruolo.OPERATOR}, {Ruolo.ADMIN}", Policy = Module.PagoPAPolicy)] [EnableCors(CORSLabel)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] diff --git a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Accertamenti/Payload/Request/AccertamentiMesiRequest.cs b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Accertamenti/Payload/Request/AccertamentiMesiRequest.cs new file mode 100644 index 0000000..0f2f5b0 --- /dev/null +++ b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Accertamenti/Payload/Request/AccertamentiMesiRequest.cs @@ -0,0 +1,6 @@ +namespace PortaleFatture.BE.Api.Modules.SEND.Accertamenti.Payload.Request; + +public sealed class AccertamentiMesiRequest +{ + public string? Anno { get; set; } +} \ No newline at end of file diff --git a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Accertamenti/Payload/Response/AccertamentiMeseResponse.cs b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Accertamenti/Payload/Response/AccertamentiMeseResponse.cs new file mode 100644 index 0000000..485d1aa --- /dev/null +++ b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Accertamenti/Payload/Response/AccertamentiMeseResponse.cs @@ -0,0 +1,12 @@ +using System.Text.Json.Serialization; + +namespace PortaleFatture.BE.Api.Modules.SEND.Accertamenti.Payload.Response; + +public sealed class AccertamentiMeseResponse +{ + [JsonPropertyOrder(-1)] + public string? Mese { get; set; } + + [JsonPropertyOrder(-2)] + public string? Descrizione { get; set; } +} \ No newline at end of file diff --git a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/DatiRel/Payload/Request/RelMesiRequest.cs b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/DatiRel/Payload/Request/RelMesiRequest.cs new file mode 100644 index 0000000..3223ced --- /dev/null +++ b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/DatiRel/Payload/Request/RelMesiRequest.cs @@ -0,0 +1,6 @@ +namespace PortaleFatture.BE.Api.Modules.SEND.DatiRel.Payload.Request; + +public sealed class RelMesiRequest +{ + public string? Anno { get; set; } +} \ No newline at end of file diff --git a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/DatiRel/Payload/Response/RelMeseResponse.cs b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/DatiRel/Payload/Response/RelMeseResponse.cs new file mode 100644 index 0000000..027bd16 --- /dev/null +++ b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/DatiRel/Payload/Response/RelMeseResponse.cs @@ -0,0 +1,12 @@ +using System.Text.Json.Serialization; + +namespace PortaleFatture.BE.Api.Modules.SEND.DatiRel.Payload.Response; + +public class RelMeseResponse +{ + [JsonPropertyOrder(-1)] + public string? Mese { get; set; } + + [JsonPropertyOrder(-2)] + public string? Descrizione { get; set; } +} \ No newline at end of file diff --git a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/DatiRel/RelEndpoints.cs b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/DatiRel/RelEndpoints.cs index 7dc558e..02c9978 100644 --- a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/DatiRel/RelEndpoints.cs +++ b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/DatiRel/RelEndpoints.cs @@ -8,6 +8,17 @@ public partial class RelModule : Module, IRegistrableModule public void RegisterEndpoints(IEndpointRouteBuilder endpointRouteBuilder) { #region selfcare + endpointRouteBuilder + .MapGet("api/rel/anni", GetAnniEnteRelAsync) + .WithName("Permette visualizzare anni REL - Ente") + .SetOpenApi(Module.DatiRelLabel) + .WithMetadata(new EnableCorsAttribute(policyName: Module.CORSLabel)); + + endpointRouteBuilder + .MapPost("api/rel/mesi", PostMesiEnteRelAsync) + .WithName("Permette visualizzare mesi REL per anno - Ente") + .SetOpenApi(Module.DatiRelLabel) + .WithMetadata(new EnableCorsAttribute(policyName: Module.CORSLabel)); endpointRouteBuilder .MapPost("api/rel/tipologiafattura", PostTipologiaFatturaAsync) @@ -137,6 +148,18 @@ public void RegisterEndpoints(IEndpointRouteBuilder endpointRouteBuilder) .WithName("Permette di ottenere il documento quadratura Rels dell'ente per ricerca pagoPA") .SetOpenApi(Module.DatiRelLabelPagoPA) .WithMetadata(new EnableCorsAttribute(policyName: Module.CORSLabel)); + + endpointRouteBuilder + .MapGet("api/rel/pagopa/anni", GetAnniRelAsync) + .WithName("Permette visualizzare anni REL - pagoPA") + .SetOpenApi(Module.DatiRelLabelPagoPA) + .WithMetadata(new EnableCorsAttribute(policyName: Module.CORSLabel)); + + endpointRouteBuilder + .MapPost("api/rel/pagopa/mesi", PostMesiRelAsync) + .WithName("Permette visualizzare mesi REL per anno - pagoPA") + .SetOpenApi(Module.DatiRelLabelPagoPA) + .WithMetadata(new EnableCorsAttribute(policyName: Module.CORSLabel)); #endregion } } \ No newline at end of file diff --git a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/DatiRel/RelModule.cs b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/DatiRel/RelModule.cs index 12c54b1..017cd25 100644 --- a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/DatiRel/RelModule.cs +++ b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/DatiRel/RelModule.cs @@ -1,5 +1,4 @@ -using System.IO; -using MediatR; +using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Http.HttpResults; @@ -10,7 +9,7 @@ using PortaleFatture.BE.Api.Modules.SEND.DatiFatturazioni.Payload.Request; using PortaleFatture.BE.Api.Modules.SEND.DatiRel.Extensions; using PortaleFatture.BE.Api.Modules.SEND.DatiRel.Payload.Request; -using PortaleFatture.BE.Api.Modules.SEND.Fatture.Payload.Request; +using PortaleFatture.BE.Api.Modules.SEND.DatiRel.Payload.Response; using PortaleFatture.BE.Api.Modules.SEND.Notifiche.Extensions; using PortaleFatture.BE.Core.Auth; using PortaleFatture.BE.Core.Entities.SEND.DatiRel; @@ -26,6 +25,7 @@ using PortaleFatture.BE.Infrastructure.Common.SEND.DatiRel.Queries; using PortaleFatture.BE.Infrastructure.Common.SEND.Documenti; using PortaleFatture.BE.Infrastructure.Common.SEND.Documenti.Common; +using PortaleFatture.BE.Infrastructure.Common.SEND.SelfCare.Queries; using PortaleFatture.BE.Infrastructure.Gateway.Storage; using static Microsoft.AspNetCore.Http.TypedResults; @@ -35,6 +35,55 @@ public partial class RelModule { #region pagoPA + [Authorize(Roles = $"{Ruolo.OPERATOR}, {Ruolo.ADMIN}", Policy = Module.PagoPAPolicy)] + [EnableCors(CORSLabel)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + private async Task>, NotFound>> GetAnniRelAsync( + HttpContext context, + [FromServices] IStringLocalizer localizer, + [FromServices] IMediator handler) + { + var authInfo = context.GetAuthInfo(); + + var anni = await handler.Send(new RelAnniQuery(authInfo)); + if (anni.IsNullNotAny()) + return NotFound(); + return Ok(anni); + } + + [Authorize(Roles = $"{Ruolo.OPERATOR}, {Ruolo.ADMIN}", Policy = Module.PagoPAPolicy)] + [EnableCors(CORSLabel)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + private async Task>, NotFound>> PostMesiRelAsync( + HttpContext context, + [FromBody] RelMesiRequest request, + [FromServices] IStringLocalizer localizer, + [FromServices] IMediator handler) + { + var authInfo = context.GetAuthInfo(); + + var mesi = await handler.Send(new RelMesiQuery(authInfo) + { + Anno = request.Anno + }); + + if (mesi.IsNullNotAny()) + return NotFound(); + + return Ok(mesi!.Select(x => new RelMeseResponse() + { + Mese = x, + Descrizione = Convert.ToInt32(x).GetMonth() + })); + } + + [Authorize(Roles = $"{Ruolo.OPERATOR}, {Ruolo.ADMIN}", Policy = Module.PagoPAPolicy)] [EnableCors(CORSLabel)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] @@ -387,6 +436,53 @@ private async Task, NotFound>> GetPagoPARelTe #region selfcare + [Authorize(Roles = $"{Ruolo.OPERATOR}, {Ruolo.ADMIN}", Policy = Module.SelfCarePolicy)] + [EnableCors(CORSLabel)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + private async Task>, NotFound>> GetAnniEnteRelAsync( + HttpContext context, + [FromServices] IStringLocalizer localizer, + [FromServices] IMediator handler) + { + var authInfo = context.GetAuthInfo(); + var anni = await handler.Send(new RelAnniByIdEnteQuery(authInfo)); + if (anni.IsNullNotAny()) + return NotFound(); + return Ok(anni); + } + + [Authorize(Roles = $"{Ruolo.OPERATOR}, {Ruolo.ADMIN}", Policy = Module.SelfCarePolicy)] + [EnableCors(CORSLabel)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + private async Task>, NotFound>> PostMesiEnteRelAsync( + HttpContext context, + [FromBody] RelMesiRequest request, + [FromServices] IStringLocalizer localizer, + [FromServices] IMediator handler) + { + var authInfo = context.GetAuthInfo(); + + var mesi = await handler.Send(new RelMesiByIdEnteQuery(authInfo) + { + Anno = request.Anno + }); + + if (mesi.IsNullNotAny()) + return NotFound(); + + return Ok(mesi!.Select(x => new RelMeseResponse() + { + Mese = x, + Descrizione = Convert.ToInt32(x).GetMonth() + })); + } + [Authorize(Roles = $"{Ruolo.OPERATOR}, {Ruolo.ADMIN}", Policy = Module.SelfCarePolicy)] [EnableCors(CORSLabel)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] diff --git a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/Extensions/FattureExtensions.cs b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/Extensions/FattureExtensions.cs index dc29eb1..d6f3f20 100644 --- a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/Extensions/FattureExtensions.cs +++ b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/Extensions/FattureExtensions.cs @@ -68,6 +68,15 @@ public static async Task> ReportFatture(this FatturaR { Dictionary reports = []; + if(request.TipologiaFattura!.IsNullNotAny()) + { + request.TipologiaFattura = (await handler.Send(new FattureTipologiaAnniMeseQuery(authInfo) + { + Anno = request.Anno!, + Mese = request.Mese! + }))!.ToArray(); + } + foreach (var tipologia in request.TipologiaFattura!) { var month = request.Mese.GetMonth(); diff --git a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/FattureEndpoints.cs b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/FattureEndpoints.cs index 05e1e65..4662378 100644 --- a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/FattureEndpoints.cs +++ b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/FattureEndpoints.cs @@ -64,6 +64,18 @@ public void RegisterEndpoints(IEndpointRouteBuilder endpointRouteBuilder) .WithName("Permette di cancellare o ripristinare le fatture non inviate") .SetOpenApi(Module.DatiFattureLabel) .WithMetadata(new EnableCorsAttribute(policyName: Module.CORSLabel)); + + endpointRouteBuilder + .MapGet("api/fatture/anni", GetAnniFattureAsync) + .WithName("Permette visualizzare anni fatture conta - pagoPA") + .SetOpenApi(Module.DatiFattureLabel) + .WithMetadata(new EnableCorsAttribute(policyName: Module.CORSLabel)); + + endpointRouteBuilder + .MapPost("api/fatture/mesi", PostMesiFattureAsync) + .WithName("Permette visualizzare mesi fatture conta per anno - pagoPA") + .SetOpenApi(Module.DatiFattureLabel) + .WithMetadata(new EnableCorsAttribute(policyName: Module.CORSLabel)); #endregion #region ente diff --git a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/FattureModule.cs b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/FattureModule.cs index 2066817..da3bb5d 100644 --- a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/FattureModule.cs +++ b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/FattureModule.cs @@ -8,6 +8,7 @@ using PortaleFatture.BE.Api.Infrastructure.Documenti; using PortaleFatture.BE.Api.Modules.SEND.Fatture.Extensions; using PortaleFatture.BE.Api.Modules.SEND.Fatture.Payload.Request; +using PortaleFatture.BE.Api.Modules.SEND.Fatture.Payload.Response; using PortaleFatture.BE.Core.Auth; using PortaleFatture.BE.Core.Common; using PortaleFatture.BE.Core.Exceptions; @@ -31,6 +32,54 @@ public partial class FattureModule #region pagoPA + [Authorize(Roles = $"{Ruolo.OPERATOR}, {Ruolo.ADMIN}", Policy = Module.PagoPAPolicy)] + [EnableCors(CORSLabel)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + private async Task>, NotFound>> GetAnniFattureAsync( + HttpContext context, + [FromServices] IStringLocalizer localizer, + [FromServices] IMediator handler) + { + var authInfo = context.GetAuthInfo(); + + var anni = await handler.Send(new FattureAnniQuery(authInfo)); + if (anni.IsNullNotAny()) + return NotFound(); + return Ok(anni); + } + + [Authorize(Roles = $"{Ruolo.OPERATOR}, {Ruolo.ADMIN}", Policy = Module.PagoPAPolicy)] + [EnableCors(CORSLabel)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + private async Task>, NotFound>> PostMesiFattureAsync( + HttpContext context, + [FromBody] FattureMesiRequest request, + [FromServices] IStringLocalizer localizer, + [FromServices] IMediator handler) + { + var authInfo = context.GetAuthInfo(); + + var mesi = await handler.Send(new FattureMesiQuery(authInfo) + { + Anno = request.Anno + }); + + if (mesi.IsNullNotAny()) + return NotFound(); + + return Ok(mesi!.Select(x => new FattureMeseResponse() + { + Mese = x, + Descrizione = Convert.ToInt32(x).GetMonth() + })); + } + [Authorize(Roles = $"{Ruolo.OPERATOR}, {Ruolo.ADMIN}", Policy = Module.PagoPAPolicy)] [EnableCors(CORSLabel)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] @@ -214,9 +263,7 @@ private async Task PostFattureReportByRicercaAsync( [FromServices] ILogger logger, [FromServices] IMediator handler) { - var authInfo = context.GetAuthInfo(); - if (request.TipologiaFattura!.IsNullNotAny()) - return NotFound(); + var authInfo = context.GetAuthInfo(); var reports = await request.ReportFatture(handler, authInfo); @@ -245,9 +292,7 @@ private async Task PostFatturePrenotazioneReportByRicercaAsync( [FromServices] IDocumentStorageService storageService) { var authInfo = context.GetAuthInfo(); - if (request.TipologiaFattura!.IsNullNotAny()) - return NotFound(); - + var contentType = MimeMapping.ZIP; var contentLanguage = LanguageMapping.IT; diff --git a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/Payload/Request/FattureMesiRequest.cs b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/Payload/Request/FattureMesiRequest.cs new file mode 100644 index 0000000..d750fb9 --- /dev/null +++ b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/Payload/Request/FattureMesiRequest.cs @@ -0,0 +1,6 @@ +namespace PortaleFatture.BE.Api.Modules.SEND.Fatture.Payload.Request; + +public sealed class FattureMesiRequest +{ + public string? Anno { get; set; } +} \ No newline at end of file diff --git a/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/Payload/Response/FattureMeseResponse.cs b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/Payload/Response/FattureMeseResponse.cs new file mode 100644 index 0000000..ba9b4ea --- /dev/null +++ b/src/Presentation/PortaleFatture.BE.Api/Modules/SEND/Fatture/Payload/Response/FattureMeseResponse.cs @@ -0,0 +1,12 @@ +using System.Text.Json.Serialization; + +namespace PortaleFatture.BE.Api.Modules.SEND.Fatture.Payload.Response; + +public class FattureMeseResponse +{ + [JsonPropertyOrder(-1)] + public string? Mese { get; set; } + + [JsonPropertyOrder(-2)] + public string? Descrizione { get; set; } +} \ No newline at end of file diff --git a/src/Presentation/PortaleFatture.BE.Api/PortaleFatture.BE.Api.csproj b/src/Presentation/PortaleFatture.BE.Api/PortaleFatture.BE.Api.csproj index b919466..380b85e 100644 --- a/src/Presentation/PortaleFatture.BE.Api/PortaleFatture.BE.Api.csproj +++ b/src/Presentation/PortaleFatture.BE.Api/PortaleFatture.BE.Api.csproj @@ -9,13 +9,6 @@ ..\..\.. - - - - - - - @@ -46,8 +39,4 @@ - - - -