예제 #1
0
        public static decimal GetQtyReqWOScrap(AMProdMatl prodMatl, decimal?qtyToProd)
        {
            if (prodMatl == null)
            {
                throw new ArgumentNullException(nameof(prodMatl));
            }

            if (qtyToProd.GetValueOrDefault() == 0 ||
                prodMatl.IsFixedMaterial.GetValueOrDefault() && prodMatl.QtyActual.GetValueOrDefault() != 0)
            {
                return(0m);
            }

            var multiplier = prodMatl.IsByproduct.GetValueOrDefault() ? -1 : 1;

            // Since Acumatica considers rounding up logic on each line of AMProdMatl, customization will skip this logic.
            var totalQtyReq      = AMProdMatl.GetTotalRequiredQty(prodMatl, qtyToProd.GetValueOrDefault(), false); //prodMatl.GetTotalReqQty(qtyToProd.GetValueOrDefault());
            var remainingMatlQty = prodMatl.QtyRemaining.GetValueOrDefault() * multiplier;
            var actualQty        = prodMatl.QtyActual.GetValueOrDefault();
            var qtyReqWOScrap    = (totalQtyReq / (1 + prodMatl.ScrapFactor)).Value;
            // Same as QtyRemaining PXFormula
            var calcRemainingQty = (prodMatl.IsByproduct.GetValueOrDefault() ? Math.Min(totalQtyReq - actualQty, 0) : totalQtyReq - actualQty) * multiplier;

            totalQtyReq *= multiplier;
            var remainingQty     = Math.Max(remainingMatlQty, calcRemainingQty.NotLessZero());
            var materialTotalQty = remainingQty < totalQtyReq ? remainingQty : totalQtyReq;
            // Because the customization has been deducted for scrap, the minimum value is selected.
            var resultQty = Math.Min(qtyReqWOScrap - actualQty, materialTotalQty);

            return(resultQty);
        }
예제 #2
0
        public void ProcessMatlWrk(AMProdItem amproditem, AMProdMatl amprodmatl, InventoryItem inventoryItem, ProcessMatlWrkDelegate baseMethod)
        {
            baseMethod(amproditem, amprodmatl, inventoryItem);

            var wrkMatl = Base.MatlXref.Current;

            if (wrkMatl != null)
            {
                var qtyReqWOScrap = GetQtyReqWOScrap(amprodmatl, amproditem.BaseQtytoProd);

                // Avoid the system from performing several processing for different product material inventory and update the wrong material inventory quantity request.
                if (wrkMatl.InventoryID == amprodmatl.InventoryID)
                {
                    Base.MatlXref.Current.QtyReq  = amprodmatl.QtyRoundUp == false ? qtyReqWOScrap : Math.Ceiling(qtyReqWOScrap);
                    Base.MatlXref.Current.MatlQty = wrkMatl.QtyAvail > wrkMatl.QtyReq ? wrkMatl.QtyReq : wrkMatl.QtyAvail;
                }
            }
        }