using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using Microsoft.Extensions.Logging; using MMDAL.CustomCode.MMReports; using MMDAL.DTO.MMHead; using MMDAL.DTO.MMReports; using System.Runtime.CompilerServices; namespace MMBLL.MMReports { public class MMReportsBLL : IMMReportsBLL { private readonly IMMReportsDAL _MMReportsDAL; private readonly ILogger _Logger; public MMReportsBLL(IMMReportsDAL mmReportsDAL, ILogger logger) { _MMReportsDAL = mmReportsDAL; _Logger = logger; } public async IAsyncEnumerable MMHeadRegister( int OrderbyType, int FirstNumber, int MaxResult, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO, [EnumeratorCancellation] CancellationToken CancellationToken = default) { await foreach (var ReturnReport in _MMReportsDAL.MMHeadRegister( OrderbyType, FirstNumber, MaxResult, CriteriaDTO, LoginDTO, false, false, CancellationToken).WithCancellation(CancellationToken)) { yield return ReturnReport; } } // BizTransactionClassId/Type are direct query params on these 4 endpoints (matching the legacy // URITEMPLATE shape), OuId/PeriodFromDate/PeriodToDate come via the generic CriteriaDTO attribute bag. private static (int? OuId, DateTime PeriodFromDate, DateTime PeriodToDate) ParseCriteria(CriteriaDTO? criteriaDTO) { int? ouId = null; DateTime periodFromDate = DateTime.Today.AddMonths(-1); DateTime periodToDate = DateTime.Today; if (criteriaDTO?.SectionCriteriaList == null) return (ouId, periodFromDate, periodToDate); foreach (var sec in criteriaDTO.SectionCriteriaList) { foreach (var attr in sec.AttributesCriteriaList) { if (attr.FieldValue is null) continue; switch (attr.FieldName?.ToLowerInvariant()) { case "ouid": if (int.TryParse(attr.FieldValue.ToString(), out var ou) && ou > 0) ouId = ou; break; case "periodfromdate": if (DateTime.TryParse(attr.FieldValue.ToString(), out var pf)) periodFromDate = pf; break; case "periodtodate": if (DateTime.TryParse(attr.FieldValue.ToString(), out var pt)) periodToDate = pt; break; } } } return (ouId, periodFromDate, periodToDate); } public async Task<(List Items, int Total)> GetMMPendingStatusReport( int firstNumber, int maxResult, string bizTransactionClassIds, CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct = default) { var (ouId, periodFromDate, periodToDate) = ParseCriteria(criteriaDTO); return await _MMReportsDAL.GetMMPendingStatusReport(firstNumber, maxResult, bizTransactionClassIds, ouId, periodFromDate, periodToDate, loginDTO, ct).ConfigureAwait(false); } public async Task> GetPendingCountsByTransactionType( IEnumerable bizTransactionTypeIds, LoginDTO loginDTO, CancellationToken ct = default) => await _MMReportsDAL.GetPendingCountsByTransactionType(bizTransactionTypeIds, loginDTO, ct).ConfigureAwait(false); public async Task<(List Items, int Total)> GetMMRegisterPartyWiseSummaryReport( int firstNumber, int maxResult, string bizTransactionClassIds, int type, CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct = default) { var (ouId, _, _) = ParseCriteria(criteriaDTO); return await _MMReportsDAL.GetMMRegisterPartyWiseSummaryReport(firstNumber, maxResult, bizTransactionClassIds, type, ouId, loginDTO, ct).ConfigureAwait(false); } public async Task<(List Items, int Total)> GetMMRegisterItemWiseReport( int firstNumber, int maxResult, string bizTransactionClassIds, CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct = default) { var (ouId, _, _) = ParseCriteria(criteriaDTO); return await _MMReportsDAL.GetMMRegisterItemWiseReport(firstNumber, maxResult, bizTransactionClassIds, ouId, loginDTO, ct).ConfigureAwait(false); } public async Task<(List Items, int Total)> GetMMPendingRegisterListReport( int firstNumber, int maxResult, string bizTransactionClassIds, CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct = default) { var (ouId, _, _) = ParseCriteria(criteriaDTO); return await _MMReportsDAL.GetMMPendingRegisterListReport(firstNumber, maxResult, bizTransactionClassIds, ouId, loginDTO, ct).ConfigureAwait(false); } // Procurement Overview Dashboard (Phase 1) --------------------------------------------------- private static List ParseIntCsv(string? csv) { if (string.IsNullOrWhiteSpace(csv)) return new List(); return csv.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) .Select(s => int.TryParse(s, out var v) ? v : (int?)null) .Where(v => v.HasValue) .Select(v => v!.Value) .ToList(); } public async Task GetProcurementSpendOverview( string bizTransactionClassIds, CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct = default) { var (ouId, periodFromDate, periodToDate) = ParseCriteria(criteriaDTO); return await _MMReportsDAL.GetProcurementSpendOverview( bizTransactionClassIds, ParseIntCsv(bizTransactionClassIds), ouId, periodFromDate, periodToDate, loginDTO, ct).ConfigureAwait(false); } public async Task GetPRToPOTrackerDashboard( int firstNumber, int maxResult, int prBizTransactionClassId, int inquiryBizTransactionClassId, int quotationBizTransactionClassId, int poBizTransactionClassId, CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct = default) { var (ouId, periodFromDate, periodToDate) = ParseCriteria(criteriaDTO); return await _MMReportsDAL.GetPRToPOTrackerDashboard( firstNumber, maxResult, prBizTransactionClassId, inquiryBizTransactionClassId, quotationBizTransactionClassId, poBizTransactionClassId, ouId, periodFromDate, periodToDate, loginDTO, ct).ConfigureAwait(false); } public async Task GetPOMonitoringDashboard( string poBizTransactionClassIds, int poBizTransactionClassId, int grnBizTransactionClassId, CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct = default) { var (ouId, periodFromDate, periodToDate) = ParseCriteria(criteriaDTO); return await _MMReportsDAL.GetPOMonitoringDashboard( poBizTransactionClassIds, poBizTransactionClassId, grnBizTransactionClassId, ouId, periodFromDate, periodToDate, loginDTO, ct).ConfigureAwait(false); } public async Task GetSpendAnalysisDashboard( string bizTransactionClassIds, CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct = default) { var (ouId, periodFromDate, periodToDate) = ParseCriteria(criteriaDTO); return await _MMReportsDAL.GetSpendAnalysisDashboard( bizTransactionClassIds, ParseIntCsv(bizTransactionClassIds), ouId, periodFromDate, periodToDate, loginDTO, ct).ConfigureAwait(false); } // Sales Overview Dashboard (Phase 1) ----------------------------------------------------- public async Task GetSalesFunnelDashboard( int firstNumber, int maxResult, int enquiryBizTransactionClassId, int quotationBizTransactionClassId, int orderBizTransactionClassId, CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct = default) { var (ouId, _, _) = ParseCriteria(criteriaDTO); return await _MMReportsDAL.GetSalesFunnelDashboard( firstNumber, maxResult, enquiryBizTransactionClassId, quotationBizTransactionClassId, orderBizTransactionClassId, ouId, loginDTO, ct).ConfigureAwait(false); } } }