using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using MMDAL.DTO.MMReports; using MMDAL.Query.Register; using Newtonsoft.Json; namespace MMDAL.CustomCode.Register { public class RegisterDAL : IRegisterDAL { private readonly IQueryExecutor _QueryExecutor; public RegisterDAL(IQueryExecutor queryExecutor) { _QueryExecutor = queryExecutor; } public async Task> GetDocumentTraceability(int pivotAllocationId, LoginDTO loginDTO, CancellationToken ct = default) { var param = new { PivotAllocationId = pivotAllocationId, TenantId = loginDTO.ClientId, MaxRecursion = 100 }; var result = await _QueryExecutor.QueryAsync( loginDTO, RegisterQB.GET_DOCUMENT_TRACEABILITY, param, cancellationToken: ct).ConfigureAwait(false); return result.ToList(); } public async Task GetOUWiseMonthlyGSTDashboard(CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct = default) { var (ouId, fromDate, toDate) = ParseCriteria(criteriaDTO); var param = new { OuId = ouId, PeriodFromDate = fromDate, PeriodToDate = toDate }; var detailTask = _QueryExecutor.QueryAsync( loginDTO, OUWiseGSTQB.GET_OUWISE_GST_DETAIL, param, cancellationToken: ct); var summaryTask = _QueryExecutor.QueryAsync( loginDTO, OUWiseGSTQB.GET_OUWISE_GST_SUMMARY, param, cancellationToken: ct); var onlineSalesTask = _QueryExecutor.QueryAsync( loginDTO, OUWiseGSTQB.GET_OUWISE_GST_ONLINE_SALES, param, cancellationToken: ct); await Task.WhenAll(detailTask, summaryTask, onlineSalesTask).ConfigureAwait(false); return new OUWiseGSTReportDTO { OUWiseGSTDetailDTOs = (await detailTask).ToList(), OUWiseGSTSummaryDTOs = (await summaryTask).ToList(), OUWiseGSTOnlineSalesDTOs = (await onlineSalesTask).ToList() }; } public async Task GetPrescriptionLocationPicklist(CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct = default) { string? location = ParseLocationCriteria(criteriaDTO); var param = new { location = string.IsNullOrWhiteSpace(location) ? null : location }; var result = await _QueryExecutor.QueryAsync( loginDTO, RegisterQB.GET_PRESCRIPTION_LOCATION_PICKLIST, param, cancellationToken: ct).ConfigureAwait(false); return JsonConvert.SerializeObject(result); } private static string? ParseLocationCriteria(CriteriaDTO? criteriaDTO) { if (criteriaDTO?.SectionCriteriaList == null) return null; foreach (var sec in criteriaDTO.SectionCriteriaList) { foreach (var attr in sec.AttributesCriteriaList) { if (string.Equals(attr.FieldName, "Location", StringComparison.OrdinalIgnoreCase) && attr.FieldValue is not null) return attr.FieldValue.ToString(); } } return null; } private static (int? OuId, DateTime FromDate, DateTime ToDate) ParseCriteria(CriteriaDTO? criteriaDTO) { int? ouId = null; DateTime fromDate = DateTime.Today.AddMonths(-1); DateTime toDate = DateTime.Today; if (criteriaDTO?.SectionCriteriaList == null) return (ouId, fromDate, toDate); foreach (var sec in criteriaDTO.SectionCriteriaList) { foreach (var attr in sec.AttributesCriteriaList) { if (attr.FieldValue is null) continue; var value = attr.FieldValue.ToString(); if (string.Equals(attr.FieldName, "OuId", StringComparison.OrdinalIgnoreCase) && int.TryParse(value, out var parsedOuId)) ouId = parsedOuId; else if (string.Equals(attr.FieldName, "PeriodFromDate", StringComparison.OrdinalIgnoreCase) && DateTime.TryParse(value, out var parsedFromDate)) fromDate = parsedFromDate; else if (string.Equals(attr.FieldName, "PeriodToDate", StringComparison.OrdinalIgnoreCase) && DateTime.TryParse(value, out var parsedToDate)) toDate = parsedToDate; } } return (ouId, fromDate, toDate); } } }