using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using MMDAL.DTO.SalesDB; using MMDAL.Query.SalesDB; namespace MMDAL.CustomCode.SalesDB { public class SalesDBDAL : ISalesDBDAL { private readonly IQueryExecutor _QueryExecutor; public SalesDBDAL(IQueryExecutor queryExecutor) { _QueryExecutor = queryExecutor; } public async Task GetSalesSummaryDashboard(CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct = default) { var (ouId, fromDate, toDate, numberConversion) = ParseCriteria(criteriaDTO); var param = new { OuId = ouId, PeriodFromDate = fromDate, PeriodToDate = toDate, NumberConversion = numberConversion }; var detailTask = _QueryExecutor.QueryAsync( loginDTO, SalesDBQB.GET_SALES_DETAIL, param, cancellationToken: ct); var ouLevelTask = _QueryExecutor.QueryAsync( loginDTO, SalesDBQB.GET_OU_LEVEL, param, cancellationToken: ct); await Task.WhenAll(detailTask, ouLevelTask).ConfigureAwait(false); return new SalesSummaryDTO { SalesDetailDTOs = (await detailTask).ToList(), OULevelDTOs = (await ouLevelTask).ToList() }; } private static (int? OuId, DateTime FromDate, DateTime ToDate, int NumberConversion) ParseCriteria(CriteriaDTO? criteriaDTO) { int? ouId = null; DateTime fromDate = DateTime.Today.AddMonths(-1); DateTime toDate = DateTime.Today; int numberConversion = 0; if (criteriaDTO?.SectionCriteriaList == null) return (ouId, fromDate, toDate, numberConversion); 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; else if (string.Equals(attr.FieldName, "NumberConversion", StringComparison.OrdinalIgnoreCase) && int.TryParse(value, out var parsedNumberConversion)) numberConversion = parsedNumberConversion; } } return (ouId, fromDate, toDate, numberConversion); } } }