using ComplianceBLL.ComplianceAnalytics; using FastEndpoints; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.DTO.Framework.ResponseStandard; using GB5Shared.DTO.Report; using GB5Shared.FastEndPoint; using static GB5Shared.GB5Constant.Constant; namespace ComplianceSL.Endpoints.ComplianceAnalytics; // POST wrapper over GetFilingStatusSummary (Compliance & Audit Dashboard, Finance Analytics // Dashboards Phase 3) -- the BI Catalog ApiService bridge (ExcelExport.ReportURICalling) always // POSTs a ReportCallingDTO{CriteriaDTO} body, unconditionally, regardless of MWEBSERVICE.METHODTYPE. // The existing GetFilingStatusSummary is a plain GET with query params, so it can't be bridged // as-is -- this wrapper accepts the bridge's POST/CriteriaDTO contract and calls the same BLL // method underneath. PeriodYear/GSTIN are parsed from CriteriaDTO the same way BRSDashboard parses // BankAccountIds -- this is dashboard-bridge-specific criteria, not shared across the report family. public class PostFilingStatusSummaryForDashboard : BaseEndpoint> { private readonly IComplianceAnalyticsBLL _bll; public PostFilingStatusSummaryForDashboard(IComplianceAnalyticsBLL bll) => _bll = bll; public override void Configure() { Post("/ComplianceAnalytics/GetFilingStatusSummaryForDashboard"); AllowAnonymous(); } public record Params( [property: FromHeader] string Login, [property: FromBody] ReportCallingDTO ReportCallingDTO ); protected override string? GetCacheKey(Params req, LoginDTO login) => null; private static (int PeriodYear, string GSTIN) ParseCriteria(CriteriaDTO? criteriaDTO) { int periodYear = DateTime.UtcNow.Year; string gstin = ""; if (criteriaDTO?.SectionCriteriaList == null) return (periodYear, gstin); foreach (var section in criteriaDTO.SectionCriteriaList) { if (section.AttributesCriteriaList == null) continue; foreach (var attr in section.AttributesCriteriaList) { if (attr.FieldValue == null) continue; var field = attr.FieldName?.ToLowerInvariant(); if (field == "periodyear" && int.TryParse(attr.FieldValue.ToString(), out var y)) periodYear = y; else if (field == "gstin") gstin = attr.FieldValue.ToString() ?? ""; } } return (periodYear, gstin); } protected override async Task> ExecuteAsync( Params req, LoginDTO login, CancellationToken ct) { try { var (periodYear, gstin) = ParseCriteria(req.ReportCallingDTO.CriteriaDTO); var result = await _bll.GetFilingStatusSummaryAsync(periodYear, gstin, login, ct).ConfigureAwait(false); return await GB5Shared.ResponseStandard.Response.CreateSuccessResponse(result, CacheKeyLevel.CLIENT_LEVEL, login); } catch (Exception ex) { return await GB5Shared.ResponseStandard.Response.CreateExceptionError(ex, CacheKeyLevel.CLIENT_LEVEL, login, ex.Message, 500); } } }