using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using MMDAL.DTO.InventoryReports; using MMDAL.Query.InventoryReports; namespace MMDAL.CustomCode.InventoryReports; public class InventoryReportsDAL : IInventoryReportsDAL { private readonly IQueryExecutor _qe; public InventoryReportsDAL(IQueryExecutor queryExecutor) => _qe = queryExecutor; public async Task> GetReorderBreachReport( int ouId, int? storeId, int? itemCategoryId, int supplyBizTransactionClassId, LoginDTO loginDTO, CancellationToken ct = default) { var param = new { OuId = ouId, StoreId = storeId, ItemCategoryId = itemCategoryId, SupplyBizTransactionClassId = supplyBizTransactionClassId }; var rows = await _qe.QueryAsync( loginDTO, InventoryReportsQB.GET_REORDER_BREACH_REPORT, param, cancellationToken: ct) .ConfigureAwait(false); return rows.ToList(); } public async Task> GetStockAgeingReport( int ouId, int? itemCategoryId, DateTime asOnDate, LoginDTO loginDTO, CancellationToken ct = default) { var param = new { OuId = ouId, ItemCategoryId = itemCategoryId, AsOnDate = asOnDate.Date }; var rows = await _qe.QueryAsync( loginDTO, InventoryReportsQB.GET_STOCK_AGEING_REPORT, param, cancellationToken: ct) .ConfigureAwait(false); return rows.ToList(); } public async Task> GetNonMovingReport( int ouId, int? itemCategoryId, int ageDays, DateTime asOnDate, LoginDTO loginDTO, CancellationToken ct = default) { var param = new { OuId = ouId, ItemCategoryId = itemCategoryId, AgeDays = ageDays, AsOnDate = asOnDate.Date }; var rows = await _qe.QueryAsync( loginDTO, InventoryReportsQB.GET_NON_MOVING_REPORT, param, cancellationToken: ct) .ConfigureAwait(false); return rows.ToList(); } public async Task GetStockMovementDashboard( int ouId, DateTime periodFromDate, DateTime periodToDate, int topN, LoginDTO loginDTO, CancellationToken ct = default) { var param = new { OuId = ouId, PeriodFromDate = periodFromDate.Date, PeriodToDate = periodToDate.Date }; var topMoversParam = new { OuId = ouId, PeriodFromDate = periodFromDate.Date, PeriodToDate = periodToDate.Date, TopN = topN }; var dailyTrendTask = _qe.QueryAsync( loginDTO, InventoryReportsQB.GET_STOCK_MOVEMENT_DAILY_TREND, param, cancellationToken: ct); var bySourceTask = _qe.QueryAsync( loginDTO, InventoryReportsQB.GET_STOCK_MOVEMENT_BY_SOURCE, param, cancellationToken: ct); var topMoversTask = _qe.QueryAsync( loginDTO, InventoryReportsQB.GET_STOCK_MOVEMENT_TOP_MOVERS, topMoversParam, cancellationToken: ct); await Task.WhenAll(dailyTrendTask, bySourceTask, topMoversTask).ConfigureAwait(false); return new StockMovementDashboardDTO { DailyTrend = dailyTrendTask.Result.ToList(), BySource = bySourceTask.Result.ToList(), TopMovers = topMoversTask.Result.ToList() }; } public async Task GetStockOverviewDashboard( int ouId, LoginDTO loginDTO, CancellationToken ct = default) { var param = new { OuId = ouId }; var byCategoryTask = _qe.QueryAsync( loginDTO, InventoryReportsQB.GET_STOCK_BY_CATEGORY, param, cancellationToken: ct); var byWarehouseTask = _qe.QueryAsync( loginDTO, InventoryReportsQB.GET_STOCK_BY_WAREHOUSE, param, cancellationToken: ct); var wipByStageTask = _qe.QueryAsync( loginDTO, InventoryReportsQB.GET_WIP_BY_STAGE, param, cancellationToken: ct); var alertsTask = _qe.QuerySingleAsync( loginDTO, InventoryReportsQB.GET_STOCK_ALERTS, param, cancellationToken: ct); await Task.WhenAll(byCategoryTask, byWarehouseTask, wipByStageTask, alertsTask).ConfigureAwait(false); return new StockOverviewDashboardDTO { ByCategory = byCategoryTask.Result.ToList(), ByWarehouse = byWarehouseTask.Result.ToList(), WipByStage = wipByStageTask.Result.ToList(), Alerts = alertsTask.Result }; } public async Task> GetStockHoldingTrend( int ouId, int? itemId, DateTime periodFromDate, DateTime periodToDate, LoginDTO loginDTO, CancellationToken ct = default) { var param = new { OuId = ouId, ItemId = itemId, PeriodFromDate = periodFromDate.Date, PeriodToDate = periodToDate.Date }; var rows = await _qe.QueryAsync( loginDTO, InventoryReportsQB.GET_STOCK_HOLDING_TREND, param, cancellationToken: ct) .ConfigureAwait(false); return rows.ToList(); } public async Task> GetSubcontractorMaterialTracker( int ouId, LoginDTO loginDTO, CancellationToken ct = default) { var param = new { OuId = ouId }; var rows = await _qe.QueryAsync( loginDTO, InventoryReportsQB.GET_SUBCONTRACTOR_MATERIAL_TRACKER, param, cancellationToken: ct) .ConfigureAwait(false); return rows.ToList(); } public async Task GetTotalStockValue(int ouId, LoginDTO loginDTO, CancellationToken ct = default) { return await _qe.ExecuteScalarAsync( loginDTO, InventoryReportsQB.GET_TOTAL_STOCK_VALUE, new { OuId = ouId }, cancellationToken: ct) .ConfigureAwait(false); } public async Task GetMovementValueFromFact( int ouId, int tenantId, int fromDateId, int toDateId, LoginDTO loginDTO, CancellationToken ct = default) { var param = new { OuId = ouId, TenantId = tenantId, FromDateId = fromDateId, ToDateId = toDateId }; return await _qe.QuerySingleAsync( loginDTO, InventoryReportsQB.GET_MOVEMENT_VALUE_FROM_FACT, param, cancellationToken: ct) .ConfigureAwait(false); } }