protected virtual void CalculateDeadStockValues(LumDeadStockEnqResult result, INSiteStatus siteStatus, INItemSiteHistDay currentRow, decimal deadStockQty) { decimal deadStockQtyCounter = deadStockQty; result.InDeadStockDays = 0m; result.TotalDeadStockCost = 0m; IEnumerable <INItemSiteHistDay> lastRows = GetLastRows(siteStatus, deadStockQty, currentRow); foreach (INItemSiteHistDay lastRow in lastRows) { if ((lastRow.QtyDebit ?? 0m) == 0m) { continue; } if (CalculateDeadStockValues(ref deadStockQtyCounter, result, lastRow)) { return; } } OnNotEnoughINItemSiteHistDRecords(siteStatus, currentRow, deadStockQty, deadStockQtyCounter); }
protected virtual DateTime?GetLastSaleDate(INSiteStatus siteStatus) { INItemSiteHistDay lastSaleRow = SelectFrom <INItemSiteHistDay> .Where <INItemSiteHistDay.siteID.IsEqual <INSiteStatus.siteID.FromCurrent> .And <INItemSiteHistDay.inventoryID.IsEqual <INSiteStatus.inventoryID.FromCurrent> > .And <INItemSiteHistDay.subItemID.IsEqual <INSiteStatus.subItemID.FromCurrent> > .And <INItemSiteHistDay.qtySales.IsGreater <decimal0> > > .AggregateTo <Max <INItemSiteHistDay.sDate> > .View.ReadOnly.SelectSingleBound(this, new object[] { siteStatus }); return(lastSaleRow?.SDate); }
protected virtual decimal?GetNegativeQty(INSiteStatus siteStatus, DateTime?inStockSince, DateTime?noSalesSince) { var siteStatusCache = Caches[typeof(INSiteStatus)]; decimal negativeQty = GetNegativePlanFields() .Sum(field => (decimal?)siteStatusCache.GetValue(siteStatus, field.Name)) ?? 0m; INItemSiteHistDay aggregatedLastRows = SelectFrom <INItemSiteHistDay> .Where <INItemSiteHistDay.siteID.IsEqual <INSiteStatus.siteID.FromCurrent> .And <INItemSiteHistDay.inventoryID.IsEqual <INSiteStatus.inventoryID.FromCurrent> > .And <INItemSiteHistDay.subItemID.IsEqual <INSiteStatus.subItemID.FromCurrent> > .And <INItemSiteHistDay.sDate.IsGreater <@P.AsDateTime> > > .AggregateTo <Sum <INItemSiteHistDay.qtyCredit> > .View.ReadOnly.SelectSingleBound(this, new object[] { siteStatus }, inStockSince ?? noSalesSince); negativeQty += aggregatedLastRows?.QtyCredit ?? 0m; return(negativeQty); }
protected virtual IEnumerable <INItemSiteHistDay> GetLastRows(INSiteStatus siteStatus, decimal deadStockQty, INItemSiteHistDay currentRow) { const int MaxRows = 1000; var getRows = new SelectFrom <INItemSiteHistDay> .Where <INItemSiteHistDay.siteID.IsEqual <@P.AsInt> .And <INItemSiteHistDay.inventoryID.IsEqual <@P.AsInt> > .And <INItemSiteHistDay.subItemID.IsEqual <@P.AsInt> > .And <INItemSiteHistDay.sDate.IsLess <@P.AsDateTime> > .And <INItemSiteHistDay.qtyDebit.IsGreater <decimal0> > > .OrderBy <INItemSiteHistDay.sDate.Desc> .View.ReadOnly(this); DateTime?lastDate = currentRow.SDate; decimal deadStockQtyCounter = deadStockQty; yield return(currentRow); while (lastDate != null && deadStockQtyCounter > 0m) { // Acuminator disable once PX1015 IncorrectNumberOfSelectParameters It's acuminator issue: see jira ATR-600 PXResultset <INItemSiteHistDay> rows = getRows.SelectWindowed(0, MaxRows, siteStatus.SiteID, siteStatus.InventoryID, siteStatus.SubItemID, lastDate); lastDate = null; foreach (var row in rows) { INItemSiteHistDay newRow = row; yield return(newRow); lastDate = newRow.SDate; deadStockQtyCounter -= newRow.QtyDebit ?? 0m; if (deadStockQtyCounter <= 0m) { break; } } } }
protected virtual LumDeadStockEnqResult MakeResult(PXResult <INSiteStatus> selectResult, DateTime?inStockSince, DateTime?noSalesSince) { INSiteStatus siteStatus = selectResult; INItemSiteHistDay currentRow = GetCurrentINItemSiteHistD(siteStatus, inStockSince, noSalesSince); decimal deadStockQty = currentRow?.EndQty ?? 0m; if (deadStockQty <= 0m) { return(null); } decimal?negativeQty = GetNegativeQty(siteStatus, inStockSince, noSalesSince); deadStockQty -= negativeQty ?? 0m; if (deadStockQty <= 0m) { return(null); } var result = new LumDeadStockEnqResult() { BaseCuryID = Company.Current.BaseCuryID, DeadStockQty = deadStockQty, InStockQty = siteStatus.QtyOnHand, SiteID = siteStatus.SiteID, LastCost = GetLastCost(siteStatus), LastSaleDate = GetLastSaleDate(siteStatus), InventoryID = siteStatus.InventoryID, SubItemID = siteStatus.SubItemID }; CalculateDeadStockValues(result, siteStatus, currentRow, deadStockQty); return(result); }
protected virtual void OnNotEnoughINItemSiteHistDRecords(INSiteStatus siteStatus, INItemSiteHistDay currentRow, decimal deadStockQty, decimal deadStockQtyCounter) { //PXTrace.WriteError( // new Common.Exceptions.RowNotFoundException(Caches[typeof(INItemSiteHist)], // siteStatus.SiteID, // siteStatus.InventoryID, // siteStatus.SubItemID, // currentRow.SDate, // deadStockQty, // deadStockQtyCounter)); }
protected virtual bool CalculateDeadStockValues(ref decimal deadStockQtyCounter, LumDeadStockEnqResult result, INItemSiteHistDay lastRow) { decimal qtyDebit = (decimal)lastRow.QtyDebit; decimal mult = (deadStockQtyCounter >= qtyDebit) ? 1m : (deadStockQtyCounter / qtyDebit); //result.TotalDeadStockCost += (lastRow.CostDebit ?? 0m) * mult; result.TotalDeadStockCost += result.DeadStockQty * result.LastCost; decimal days = (decimal)GetCurrentDate().Subtract(lastRow.SDate.Value.Date).TotalDays; result.InDeadStockDays += days * qtyDebit * mult; deadStockQtyCounter -= qtyDebit; if (deadStockQtyCounter <= 0m) { result.AverageItemCost = result.TotalDeadStockCost / result.DeadStockQty; result.InDeadStockDays /= result.DeadStockQty; return(true); } return(false); }