Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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;
                    }
                }
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
 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));
 }
Пример #7
0
        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);
        }