using System.Text.Json; using ComplianceDAL.CustomCode.ComplianceAnalytics; using ComplianceDAL.DTO.Analytics; using GB5Shared.DTO.Framework.Login; using GB5Shared.Resource.Response; using Microsoft.Extensions.Logging; namespace ComplianceBLL.ComplianceAnalytics; public class ComplianceAnalyticsBLL( IComplianceAnalyticsDAL dal, ILogger logger) : IComplianceAnalyticsBLL { public async Task GetGSTSummaryAsync( string gstin, string returnPeriod, LoginDTO login, CancellationToken ct) { try { var summary = await dal.GetGSTSummaryAsync(gstin, returnPeriod, login, ct); return JsonSerializer.Serialize(summary); } catch (Exception ex) { logger.LogError(ex, "GetGSTSummary failed for GSTIN {GSTIN} period {Period}", gstin, returnPeriod); throw; } } public async Task GetOUWiseGSTSummaryAsync( string returnPeriod, string gstin, LoginDTO login, CancellationToken ct) { try { var rows = await dal.GetOUWiseSummaryAsync(returnPeriod, gstin, login, ct); return JsonSerializer.Serialize(rows); } catch (Exception ex) { logger.LogError(ex, "GetOUWiseGSTSummary failed for period {Period}", returnPeriod); throw; } } public async Task GetHSNSummaryAsync( string returnPeriod, string gstin, LoginDTO login, CancellationToken ct) { try { var rows = await dal.GetHSNSummaryAsync(returnPeriod, gstin, login, ct); return JsonSerializer.Serialize(rows); } catch (Exception ex) { logger.LogError(ex, "GetHSNSummary failed for period {Period}", returnPeriod); throw; } } public async Task GetFilingStatusSummaryAsync( int periodYear, string gstin, LoginDTO login, CancellationToken ct) { try { var rows = await dal.GetFilingStatusSummaryAsync(periodYear, gstin, login, ct); return JsonSerializer.Serialize(rows); } catch (Exception ex) { logger.LogError(ex, "GetFilingStatusSummary failed for year {Year}", periodYear); throw; } } public async Task GetExceptionReportAsync( string returnPeriod, int page, int pageSize, LoginDTO login, CancellationToken ct) { try { var (items, total) = await dal.GetExceptionReportAsync(returnPeriod, page, pageSize, login, ct); return JsonSerializer.Serialize(new { Items = items, Total = total, Page = page, PageSize = pageSize }); } catch (Exception ex) { logger.LogError(ex, "GetExceptionReport failed for period {Period}", returnPeriod); throw; } } public async Task RecomputePeriodSummaryAsync( RecomputeSummaryRequestDTO request, LoginDTO login, CancellationToken ct) { try { var returnPeriod = $"{request.PeriodMonth:D2}{request.PeriodYear}"; var (taxable, igst, cgst, sgst, cess, docs) = await dal.GetOutwardAggregateAsync(request.GSTIN, returnPeriod, login, ct); var (itcIgst, itcCgst, itcSgst) = await dal.GetInwardITCAggregateAsync(request.GSTIN, returnPeriod, login, ct); var dto = new PeriodSummaryDTO { GSTIN = request.GSTIN, PeriodYear = request.PeriodYear, PeriodMonth = request.PeriodMonth, SummaryType = request.SummaryType, TotalTaxableValue= taxable, TotalIGST = igst, TotalCGST = cgst, TotalSGST = sgst, TotalCess = cess, TotalITCIGST = itcIgst, TotalITCCGST = itcCgst, TotalITCSGST = itcSgst, TotalDocuments = docs, InvalidDocuments = 0 }; var summaryId = await dal.UpsertPeriodSummaryAsync(dto, login, ct); logger.LogInformation("Period summary {SummaryId} recomputed for GSTIN {GSTIN} {Month}/{Year}", summaryId, request.GSTIN, request.PeriodMonth, request.PeriodYear); return JsonSerializer.Serialize(new { SummaryId = summaryId, Message = SuccessResponse.UpdateSuccess }); } catch (Exception ex) { logger.LogError(ex, "RecomputePeriodSummary failed for GSTIN {GSTIN}", request.GSTIN); throw; } } }