示例#1
0
 public virtual LUMStdBomCost CreateOperationRow(AMBomOper amBomOper, AMBomItem parentBomItem, int lineID, int?level, decimal totalQtyReq)
 {
     return(new LUMStdBomCost
     {
         BOMID = parentBomItem.BOMID,
         RevisionID = parentBomItem.RevisionID,
         LineBOMID = amBomOper.BOMID,
         LineRevisionID = amBomOper.RevisionID,
         LineID = lineID,
         Level = level.GetValueOrDefault(),
         InventoryID = parentBomItem.InventoryID,
         SubItemID = parentBomItem.SubItemID,
         //ParentDescr = parentBomItem.Descr,
         EffStartDate = parentBomItem.EffStartDate,
         EffEndDate = parentBomItem.EffEndDate,
         SiteID = parentBomItem.SiteID,
         //Status = parentBomItem.Status,
         ManufBOMID = parentBomItem.BOMID,
         ManufRevisionID = parentBomItem.RevisionID,
         TotalQtyReq = totalQtyReq,
         IsHeaderRecord = false,
         OperationID = amBomOper.OperationID,
         OperationCD = amBomOper.OperationCD,
         //OperationDescription = amBomOper.Descr,
         WcID = amBomOper.WcID
     });
 }
示例#2
0
        public Object DoingCostRoll(AMBomItem _bom)
        {
            Settings.Current.BOMID      = _bom.BOMID;      //Documents.Current.BOMID;
            Settings.Current.RevisionID = _bom.RevisionID; // Documents.Current.RevisionID;
            if (Settings.Current != null)
            {
                Settings.Current.EffectiveDate =
                    _bom.EffEndDate != null?Settings.Current.EffectiveDate.LesserDateTime(_bom.EffEndDate)
                        : Settings.Current.EffectiveDate;

                base.RollCosts();
            }
            return(BomCostRecs.Cache.Current);
        }
示例#3
0
 public virtual LUMStdBomCost CreateHeaderRow(AMBomItem parentBomItem, int lineID, int level, decimal?totalQtyReq)
 {
     return(new LUMStdBomCost
     {
         BOMID = parentBomItem.BOMID,
         RevisionID = parentBomItem.RevisionID,
         LineID = lineID,
         Level = level,
         InventoryID = parentBomItem.InventoryID,
         SubItemID = parentBomItem.SubItemID,
         //ParentDescr = parentBomItem.Descr,
         EffStartDate = parentBomItem.EffStartDate,
         EffEndDate = parentBomItem.EffEndDate,
         SiteID = parentBomItem.SiteID,
         ManufBOMID = parentBomItem.BOMID,
         ManufRevisionID = parentBomItem.RevisionID,
         TotalQtyReq = totalQtyReq,
         IsHeaderRecord = true
     });
 }
示例#4
0
        /// <summary>
        /// Override the parent method to add additional conditions to control the quantity round-up logic.
        /// </summary>
        protected override AMMultiLevelBomData CreateDetailRow(AMBomMatl amBomMatl, AMBomOper amBomOper, AMBomItem amBomItem, InventoryItem inventoryItem, AMBomItem parentBomItem,
                                                               int lineID, int level, decimal totalQtyReq, AMMultiLevelBomFilter filter, string levelBomid, string levelRevisionID)
        {
            var itemExt = inventoryItem.GetExtension <JAMS.AEF.InventoryItemAMExtension>();

            var qtyRequired = amBomMatl.QtyReq.GetValueOrDefault() * (1 + amBomMatl.ScrapFactor.GetValueOrDefault()) *
                              (amBomMatl.BatchSize.GetValueOrDefault() == 0m ? 1m : 1 / amBomMatl.BatchSize.GetValueOrDefault());

            var totalQtyRequired = amBomMatl.QtyReq.GetValueOrDefault() * (1 + amBomMatl.ScrapFactor.GetValueOrDefault()) *
                                   (amBomMatl.BatchSize.GetValueOrDefault() == 0m ? 1m : totalQtyReq / amBomMatl.BatchSize.GetValueOrDefault());

            var baseTotalQtyRequired = amBomMatl.BaseQty.GetValueOrDefault() * (1 + amBomMatl.ScrapFactor.GetValueOrDefault()) *
                                       (amBomMatl.BatchSize.GetValueOrDefault() == 0m ? 1m : totalQtyReq / amBomMatl.BatchSize.GetValueOrDefault());

            // Add one custom field to determine the round-up logic.
            AMMultiLevelBomFilterExt filterExt = filter.GetExtension <AMMultiLevelBomFilterExt>();

            if (filterExt.UsrEnblItemRoundUp == true)
            {
                qtyRequired          = itemExt.AMQtyRoundUp == false ? qtyRequired : Math.Ceiling(qtyRequired);
                totalQtyRequired     = itemExt.AMQtyRoundUp == false ? totalQtyRequired : Math.Ceiling(totalQtyRequired);
                baseTotalQtyRequired = itemExt.AMQtyRoundUp == false ? baseTotalQtyRequired : Math.Ceiling(baseTotalQtyRequired);
            }

            var row = new AMMultiLevelBomData
            {
                ParentBOMID       = parentBomItem.BOMID,
                RevisionID        = parentBomItem.RevisionID,
                LineID            = lineID,
                Level             = level,
                InventoryID       = amBomMatl.InventoryID,
                Descr             = amBomMatl.Descr,
                ParentInventoryID = parentBomItem.InventoryID,
                ParentSubItemID   = parentBomItem.SubItemID,
                ParentDescr       = parentBomItem.Descr,
                SubItemID         = amBomMatl.SubItemID,
                UOM                  = amBomMatl.UOM,
                ScrapFactor          = amBomMatl.ScrapFactor.GetValueOrDefault(),
                BatchSize            = amBomMatl.BatchSize.GetValueOrDefault(),
                BOMQtyReq            = amBomMatl.QtyReq.GetValueOrDefault(),
                BaseQtyReq           = amBomMatl.BaseQty.GetValueOrDefault(),
                QtyReq               = qtyRequired,
                TotalQtyReq          = totalQtyRequired,
                BaseTotalQtyReq      = baseTotalQtyRequired,
                UnitCost             = amBomMatl.UnitCost.GetValueOrDefault(),
                ExtCost              = qtyRequired * amBomMatl.UnitCost.GetValueOrDefault(),
                TotalExtCost         = totalQtyRequired * amBomMatl.UnitCost.GetValueOrDefault(),
                LineBOMID            = amBomMatl.BOMID,
                LineRevisionID       = amBomMatl.RevisionID,
                OperationID          = amBomOper.OperationID,
                OperationCD          = amBomOper.OperationCD,
                EffStartDate         = parentBomItem.EffStartDate,
                EffEndDate           = parentBomItem.EffEndDate,
                SiteID               = parentBomItem.SiteID,
                Status               = parentBomItem.Status,
                LineStatus           = amBomItem.Status,
                MaterialStatus       = amBomItem.Status,
                OperationDescription = amBomOper.Descr,
                WcID                 = amBomOper.WcID,
                IsHeaderRecord       = false,
                SortOrder            = amBomMatl.SortOrder
            };

            var materialSiteID = amBomMatl.SiteID ?? amBomItem.SiteID;

            if (filter.IgnoreReplenishmentSettings.GetValueOrDefault() ||
                JAMS.AM.InventoryHelper.GetReplenishmentSource(this, row.InventoryID, materialSiteID) == INReplenishmentSource.Manufactured)
            {
                levelBomid      = amBomMatl.CompBOMID;
                levelRevisionID = amBomMatl.CompBOMRevisionID;

                if (!string.IsNullOrWhiteSpace(levelBomid) && !string.IsNullOrWhiteSpace(levelRevisionID))
                {
                    AMBomItem bomItem = null;

                    if (Filter.Current.IncludeBomsOnHold.GetValueOrDefault())
                    {
                        bomItem = PXSelect <AMBomItem, Where <AMBomItem.bOMID, Equal <Required <AMBomItem.bOMID> >,
                                                              And <AMBomItem.revisionID, Equal <Required <AMBomItem.revisionID> >,
                                                                   And2 <Where <AMBomItem.status, Equal <AMBomStatus.hold>,
                                                                                Or <AMBomItem.status, Equal <AMBomStatus.active> > >,
                                                                         And <Where <Required <AMBomItem.effStartDate>, Between <AMBomItem.effStartDate, AMBomItem.effEndDate>,
                                                                                     Or <Where <AMBomItem.effStartDate, LessEqual <Required <AMBomItem.effStartDate> >,
                                                                                                And <AMBomItem.effEndDate, IsNull> > > > > > > > >
                                  .Select(this, levelBomid, levelRevisionID, Filter.Current.BOMDate.GetValueOrDefault(), Filter.Current.BOMDate.GetValueOrDefault());
                    }
                    else
                    {
                        bomItem = PXSelect <AMBomItem, Where <AMBomItem.bOMID, Equal <Required <AMBomItem.bOMID> >,
                                                              And <AMBomItem.revisionID, Equal <Required <AMBomItem.revisionID> >,
                                                                   And <AMBomItem.status, Equal <AMBomStatus.active>,
                                                                        And <Where <Required <AMBomItem.effStartDate>, Between <AMBomItem.effStartDate, AMBomItem.effEndDate>,
                                                                                    Or <Where <AMBomItem.effStartDate, LessEqual <Required <AMBomItem.effStartDate> >,
                                                                                               And <AMBomItem.effEndDate, IsNull> > > > > > > > >
                                  .Select(this, levelBomid, levelRevisionID, Filter.Current.BOMDate.GetValueOrDefault(), Filter.Current.BOMDate.GetValueOrDefault());
                    }

                    if (bomItem == null)
                    {
                        PXTrace.WriteWarning(JAMS.AM.Messages.GetLocal(JAMS.AM.Messages.ComponentBOMRevisionNotActive, levelBomid, levelRevisionID, inventoryItem.InventoryCD));
                        return(row);
                    }
                }

                if (!string.IsNullOrWhiteSpace(levelBomid) && string.IsNullOrWhiteSpace(levelRevisionID))
                {
                    var compBomItem = filter.IncludeBomsOnHold == false
                                      ? PrimaryBomIDManager.GetActiveRevisionBomItemByDate(this, levelBomid, filter.BOMDate.GetValueOrDefault())
                                      : PrimaryBomIDManager.GetNotArchivedRevisionBomItemByDate(this, levelBomid, filter.BOMDate.GetValueOrDefault());

                    if (compBomItem == null)
                    {
                        PXTrace.WriteWarning(JAMS.AM.Messages.GetLocal(JAMS.AM.Messages.NoActiveRevisionForBom, parentBomItem.BOMID));
                        return(row);
                    }

                    levelRevisionID = compBomItem.RevisionID;
                }

                if (string.IsNullOrWhiteSpace(levelBomid))
                {
                    var bomItem = filter.IncludeBomsOnHold == false
                                  ? PrimaryBomIDManager.GetActiveRevisionBomItemByDate(this, new PrimaryBomIDManager(this).GetPrimaryAllLevels(row.InventoryID,
                                                                                                                                               materialSiteID, row.SubItemID), filter.BOMDate.GetValueOrDefault())
                                  : PrimaryBomIDManager.GetNotArchivedRevisionBomItemByDate(this, new PrimaryBomIDManager(this).GetPrimaryAllLevels(row.InventoryID,
                                                                                                                                                    materialSiteID, row.SubItemID), filter.BOMDate.GetValueOrDefault());

                    if (bomItem == null)
                    {
                        PXTrace.WriteWarning(JAMS.AM.Messages.GetLocal(JAMS.AM.Messages.NoActiveRevisionForBom, parentBomItem.BOMID));
                        return(row);
                    }

                    levelBomid      = bomItem.BOMID;
                    levelRevisionID = bomItem.RevisionID;
                }

                row.ManufacturingBOMID      = levelBomid;
                row.ManufacturingRevisionID = levelRevisionID;
            }

            return(row);
        }
示例#5
0
        /// <summary>
        /// Override the parent method to add additional conditions to control the cost round-up logic.
        /// </summary>
        public override List <AMMultiLevelBomData> RollCostUpdate(List <AMMultiLevelBomData> multiLevelBomRecs)
        {
            List <AMMultiLevelBomData> list = new List <AMMultiLevelBomData>();
            RollBomList      rollBomList    = new RollBomList();
            HashSet <string> hashSet        = new HashSet <string>();

            using (List <AMMultiLevelBomData> .Enumerator enumerator = multiLevelBomRecs.GetEnumerator())
            {
                for (; ;)
                {
                    AMMultiLevelBomData ammultiLevelBomData;
                    if (4 != 0)
                    {
                        if (!enumerator.MoveNext())
                        {
                            break;
                        }
                        ammultiLevelBomData = enumerator.Current;
                        string item = string.Join(":", new string[]
                        {
                            ammultiLevelBomData.LineBOMID,
                            ammultiLevelBomData.LineRevisionID
                        });
                        if (!hashSet.Add(item))
                        {
                            continue;
                        }
                    }
                    bool?isHeaderRecord = ammultiLevelBomData.IsHeaderRecord;
                    bool flag           = true;
                    bool flag2          = isHeaderRecord.GetValueOrDefault() == flag & isHeaderRecord != null;
                    while (!flag2 && ammultiLevelBomData.InventoryID != null)
                    {
                        AMBomItem ambomItem = (AMBomItem)this.Caches <AMBomItem>().Locate(new AMBomItem
                        {
                            BOMID      = ammultiLevelBomData.LineBOMID,
                            RevisionID = ammultiLevelBomData.LineRevisionID
                        });
                        if (ambomItem == null)
                        {
                            if (false)
                            {
                                goto IL_136;
                            }
                            ambomItem = PXSelect <AMBomItem, Where <AMBomItem.bOMID, Equal <Required <AMBomItem.bOMID> >,
                                                                    And <AMBomItem.revisionID, Equal <Required <AMBomItem.revisionID> > > > > .Select(this, new object[] {
                                ammultiLevelBomData.LineBOMID,
                                ammultiLevelBomData.LineRevisionID
                            });
                        }
                        flag2 = rollBomList.Add(ambomItem, ammultiLevelBomData.Level.GetValueOrDefault(), false);
                        if (!false)
                        {
                            break;
                        }
                    }
                }
                IL_136 :;
            }
            LumCostRoll bomcostRoll = PXGraph.CreateInstance <LumCostRoll>();

            RollupSettings value = new RollupSettings
            {
                SnglMlti                  = "M",
                SiteID                    = null,
                InventoryID               = this.Filter.Current.InventoryID,
                SubItemID                 = null,
                BOMID                     = this.Filter.Current.BOMID,
                RevisionID                = this.Filter.Current.RevisionID,
                EffectiveDate             = this.Filter.Current.BOMDate,
                IncMatScrp                = new bool?(true),
                IncFixed                  = new bool?(true),
                UpdateMaterial            = new bool?(false),
                UsePending                = new bool?(false),
                IgnoreMinMaxLotSizeValues = this.Filter.Current.IgnoreMinMaxLotSizeValues
            };

            bomcostRoll.Settings.Current = value;
            bomcostRoll.RollCosts(rollBomList, Filter.Current.GetExtension <AMMultiLevelBomFilterExt>().UsrEnblItemRoundUp.GetValueOrDefault());

            foreach (AMMultiLevelBomData ammultiLevelBomData2 in multiLevelBomRecs)
            {
                AMBomCost bomCostRec = null;
                if (!string.IsNullOrWhiteSpace(ammultiLevelBomData2.ManufacturingBOMID) && (6 == 0 || !string.IsNullOrWhiteSpace(ammultiLevelBomData2.ManufacturingRevisionID)))
                {
                    bomCostRec = (AMBomCost)bomcostRoll.Caches <AMBomCost>().Locate(new AMBomCost
                    {
                        BOMID      = ammultiLevelBomData2.ManufacturingBOMID,
                        RevisionID = ammultiLevelBomData2.ManufacturingRevisionID,
                        UserID     = new Guid?(bomcostRoll.Accessinfo.UserID)
                    });
                }
                AMMultiLevelBomData ammultiLevelBomData3 = this.RollCostUpdate(ammultiLevelBomData2, bomCostRec);

                if (ammultiLevelBomData3 != null)
                {
                    list.Add(ammultiLevelBomData3);
                }
            }
            return(list);
        }
示例#6
0
        public virtual bool ExcludeMaterial(AMBomMatl bomMatl, InventoryItem inventoryItem, AMBomItem bomItem, AMBomOper bomOper, DateTime parmDate)
        {
            if (bomMatl?.InventoryID == null || inventoryItem?.InventoryID == null || bomItem?.InventoryID == null)
            {
                return(true);
            }

            if (bomMatl.ExpDate != null && bomMatl.ExpDate.GetValueOrDefault() <= parmDate)
            {
                return(true);
            }

            if (bomMatl.EffDate != null && bomMatl.EffDate.GetValueOrDefault() > parmDate)
            {
                return(true);
            }

            return(false);
        }
示例#7
0
        public virtual void LoadDataRecords(string levelBomid, string levelRevisionID, int?level, decimal?totalQtyReq, AMBomItem parentBomItem, List <LUMStdBomCost> multiLevelBomRecs, AMMultiLevelBomFilter bomFilter)
        {
            if (level == null || level > LowLevel.MaxLowLevel || string.IsNullOrWhiteSpace(levelBomid) || bomFilter == null)
            {
                return;
            }

            // We need a Header for each new level to add the costs from the Cost Roll and to Insert the record as material
            var headerRow = CreateHeaderRow(parentBomItem, multiLevelBomRecs.Count + 1, level.GetValueOrDefault(), totalQtyReq);

            if (headerRow == null)
            {
                return;
            }

            // Simulate report [AM614000] grouping conditions.
            if (multiLevelBomRecs.Exists(rec => rec.ManufBOMID == parentBomItem.BOMID && rec.ManufRevisionID == parentBomItem.RevisionID) == false &&
                parentBomItem.Status == AMBomStatus.Active)
            {
                multiLevelBomRecs.Add(headerRow);
            }

            var bomOpersWithoutMatl     = new List <AMBomOper>();
            var includeOpersWithoutMatl = false;
            var includeOperations       = bomFilter?.IncludeOperations == true;
            var lastOperationCD         = string.Empty;

            if (includeOperations)
            {
                bomOpersWithoutMatl = GetOperationsWithoutMaterial(levelBomid, levelRevisionID).ToList();
            }
            includeOpersWithoutMatl = bomOpersWithoutMatl.Count > 0;

            foreach (PXResult <AMBomMatl, AMBomItem, AMBomOper, InventoryItem, INItemCost> result in PXSelectJoin <AMBomMatl, InnerJoin <AMBomItem, On <AMBomMatl.bOMID, Equal <AMBomItem.bOMID>,
                                                                                                                                                        And <AMBomMatl.revisionID, Equal <AMBomItem.revisionID> > >,
                                                                                                                                         InnerJoin <AMBomOper, On <AMBomMatl.bOMID, Equal <AMBomOper.bOMID>,
                                                                                                                                                                   And <AMBomMatl.revisionID, Equal <AMBomOper.revisionID>,
                                                                                                                                                                        And <AMBomMatl.operationID, Equal <AMBomOper.operationID> > > >,
                                                                                                                                                    InnerJoin <InventoryItem, On <AMBomMatl.inventoryID, Equal <InventoryItem.inventoryID> >,
                                                                                                                                                               LeftJoin <INItemCost, On <AMBomMatl.inventoryID, Equal <INItemCost.inventoryID> > > > > >,
                                                                                                                   Where <AMBomMatl.bOMID, Equal <Required <AMBomMatl.bOMID> >,
                                                                                                                          And <AMBomMatl.revisionID, Equal <Required <AMBomMatl.revisionID> >,
                                                                                                                               And2 <Where <AMBomMatl.effDate, IsNull,
                                                                                                                                            Or <AMBomMatl.effDate, LessEqual <Current <AMMultiLevelBomFilter.bOMDate> > > >,
                                                                                                                                     And <Where <AMBomMatl.expDate, IsNull,
                                                                                                                                                 Or <AMBomMatl.expDate, GreaterEqual <Current <AMMultiLevelBomFilter.bOMDate> > > > > > > >,
                                                                                                                   OrderBy <Asc <AMBomOper.operationCD,
                                                                                                                                 Asc <AMBomMatl.sortOrder,
                                                                                                                                      Asc <AMBomMatl.lineID> > > > > .Select(this, levelBomid, levelRevisionID))
            {
                var amBomMatl = (AMBomMatl)result;
                var amBomItem = (AMBomItem)result;
                var amBomOper = (AMBomOper)result;
                var invItem   = (InventoryItem)result;
                var itemCost  = (INItemCost)result;

                if (ExcludeMaterial(amBomMatl, invItem, amBomItem, amBomOper, bomFilter?.BOMDate ?? Accessinfo.BusinessDate.GetValueOrDefault()))
                {
                    continue;
                }

                var row = CreateDetailRow(amBomMatl, amBomOper, amBomItem, invItem, parentBomItem, multiLevelBomRecs.Count + 1, level.GetValueOrDefault(),
                                          totalQtyReq.GetValueOrDefault(), bomFilter, levelBomid, levelRevisionID);

                if (row == null)
                {
                    continue;
                }

                if (itemCost != null && bomFilter.UseCurrentInventoryCost.GetValueOrDefault())
                {
                    row.UnitCost = BOMCostRoll.GetUnitCostFromINItemCostTable(itemCost) ?? amBomMatl.UnitCost.GetValueOrDefault();
                }

                row.CompExtCost      = row.CompQtyReq * row.UnitCost;
                row.CompTotalExtCost = row.TotalQtyReq * row.UnitCost;

                if (includeOperations && !lastOperationCD.Equals(row.OperationCD))
                {
                    if (includeOpersWithoutMatl)
                    {
                        var indexes2Remove = new List <int>();
                        for (int i = 0; i < bomOpersWithoutMatl.Count; i++)
                        {
                            var op = bomOpersWithoutMatl[i];
                            if (OperationHelper.LessThan(op.OperationCD, row.OperationCD))
                            {
                                indexes2Remove.Add(i);
                                var operBomData = CreateOperationRow(op, parentBomItem, multiLevelBomRecs.Count + 1, level, 0);
                                multiLevelBomRecs.Add(operBomData);
                            }
                        }

                        foreach (var idx in indexes2Remove.OrderByDescending(x => x))
                        {
                            bomOpersWithoutMatl.RemoveAt(idx);
                        }
                    }

                    // include current operation as an entry
                    multiLevelBomRecs.Add(CreateOperationRow(amBomOper, parentBomItem, multiLevelBomRecs.Count + 1, level, 0));
                }

                row.LineID = multiLevelBomRecs.Count + 1;
                multiLevelBomRecs.Add(row);

                if (!string.IsNullOrWhiteSpace(row.ManufBOMID) &&
                    !string.IsNullOrWhiteSpace(row.ManufRevisionID))
                {
                    LoadDataRecords(row.ManufBOMID, row.ManufRevisionID, level + 1, row.TotalQtyReq.GetValueOrDefault(), parentBomItem, multiLevelBomRecs, bomFilter);
                }

                lastOperationCD = row.OperationCD;
            }

            if (includeOpersWithoutMatl)
            {
                foreach (var op in bomOpersWithoutMatl)
                {
                    var operBomData = CreateOperationRow(op, parentBomItem, multiLevelBomRecs.Count + 1, level, 0);
                    multiLevelBomRecs.Add(operBomData);
                }
            }
        }
示例#8
0
        /// <summary>
        /// Process Costs for a BOM.
        /// Copy standard method and add one more parameter to control qty round-up.
        /// </summary>
        protected virtual bool ProcessCost(AMBomItem bomItem, int level, bool isDefault, bool roundup = true)
        {
            var successful = true;

            if (bomItem?.BOMID == null)
            {
                return(false);
            }

            var bomcostrec = new AMBomCost
            {
                InventoryID       = bomItem.InventoryID,
                SubItemID         = bomItem.SubItemID,
                BOMID             = bomItem.BOMID,
                RevisionID        = bomItem.RevisionID,
                SiteID            = bomItem.SiteID,
                MultiLevelProcess = Settings.Current.SnglMlti == RollupSettings.SelectOptSM.Multi,
                UserID            = this.Accessinfo.UserID,
                Level             = level,
                // Might have to update later for subitem indication - currently only looks at INItemSite default BOM ID
                IsDefaultBom = isDefault
            };

            var invItem = JAMS.AM.InventoryHelper.CacheQueryInventoryItem(InvItemRecs.Cache, bomcostrec.InventoryID);

            bomcostrec.ItemClassID = invItem?.ItemClassID;

            //Set the Current and Pending cost from INItemSite
            var inItemSite = JAMS.AM.InventoryHelper.CacheQueryINItemSite(ItemSiteRecs.Cache, bomcostrec.InventoryID, bomcostrec.SiteID);

            bomcostrec.StdCost        = inItemSite?.StdCost;
            bomcostrec.PendingStdCost = inItemSite?.PendingStdCost;

            // Set Lot Size based on Filter Settings
            if (Settings.Current.IgnoreMinMaxLotSizeValues == true)
            {
                bomcostrec.LotSize = 1;
            }
            else if (bomcostrec.BOMID == Settings.Current.BOMID && Settings.Current.LotSize.GetValueOrDefault() != 0 &&
                     Settings.Current.IgnoreMinMaxLotSizeValues == false)
            {
                bomcostrec.LotSize = Settings.Current.LotSize.GetValueOrDefault();
            }
            else
            {
                bomcostrec.LotSize = invItem == null
                                     ? JAMS.AM.InventoryHelper.GetMfgReorderQty(this, bomcostrec.InventoryID, bomcostrec.SiteID)
                                     : JAMS.AM.InventoryHelper.GetMfgReorderQty(this, invItem, inItemSite);
            }

            if (bomcostrec.LotSize.GetValueOrDefault() <= 0)
            {
                bomcostrec.LotSize = 1;
            }

            bomcostrec.FLaborCost = 0;
            bomcostrec.VLaborCost = 0;
            var laborCostAndHours = SetLaborCost(ref bomcostrec, Settings.Current?.IncFixed == true);

            bomcostrec.MachCost = GetMachineCost(bomcostrec);
            bomcostrec.ToolCost = GetToolCost(bomcostrec);

            var allMaterial = PXSelectReadonly2 <AMBomMatl, InnerJoin <InventoryItem, On <AMBomMatl.inventoryID, Equal <InventoryItem.inventoryID> >,
                                                                       LeftJoin <INItemSite, On <AMBomMatl.inventoryID, Equal <INItemSite.inventoryID>,
                                                                                                 And <INItemSite.siteID, Equal <Required <INItemSite.siteID> > > > > >,
                                                 Where <AMBomMatl.bOMID, Equal <Required <AMBomMatl.bOMID> >,
                                                        And <AMBomMatl.revisionID, Equal <Required <AMBomMatl.revisionID> > > > > .Select(this, bomcostrec.SiteID, bomcostrec.BOMID, bomcostrec.RevisionID);

            //Merge of Regular Material and Subcontract Material (excluding Reference/vendor supplied material)
            OperationCosts matlTotal = new OperationCosts();

            if (allMaterial.Count > 0)
            {
                var purchase     = new List <PXResult <AMBomMatl, InventoryItem> >();
                var manufactured = new List <PXResult <AMBomMatl, InventoryItem> >();
                var subcontract  = new List <PXResult <AMBomMatl, InventoryItem> >();
                var refMaterial  = new List <PXResult <AMBomMatl, InventoryItem> >();

                foreach (PXResult <AMBomMatl, InventoryItem, INItemSite> result in allMaterial)
                {
                    var bomMatl = (AMBomMatl)result;
                    if (bomMatl == null ||
                        (bomMatl.EffDate != null && bomMatl.EffDate > Accessinfo.BusinessDate) ||
                        (bomMatl.ExpDate != null && bomMatl.ExpDate <= Accessinfo.BusinessDate))
                    {
                        continue;
                    }

                    // Check for COMP BOMID, if exists, item is Manufactured
                    if (bomMatl.CompBOMID != null)
                    {
                        manufactured.Add(result);
                        continue;
                    }

                    if (bomMatl.MaterialType == AMMaterialType.Subcontract && bomMatl.SubcontractSource != AMSubcontractSource.VendorSupplied)
                    {
                        subcontract.Add(result);
                        continue;
                    }

                    if (bomMatl.MaterialType == AMMaterialType.Subcontract && bomMatl.SubcontractSource == AMSubcontractSource.VendorSupplied)
                    {
                        refMaterial.Add(result);
                        continue;
                    }

                    var replenishmentSource = JAMS.AM.InventoryHelper.GetReplenishmentSource((InventoryItem)result, (INItemSite)result);
                    if (replenishmentSource == INReplenishmentSource.Manufactured)
                    {
                        manufactured.Add(result);
                        continue;
                    }

                    if (replenishmentSource == INReplenishmentSource.Purchased)
                    {
                        purchase.Add(result);
                    }
                }

                var purchaseCost     = GetMaterialCost(bomcostrec, purchase, IsMultiLevel, out var purchaseMatlMessages, roundup);
                var manufacturedCost = GetMaterialCost(bomcostrec, manufactured, IsMultiLevel, out var manufacturedMatlMessages, roundup);
                var subcontractCost  = GetMaterialCost(bomcostrec, subcontract, IsMultiLevel, out var subContractMatlMessages, roundup);
                var refmaterialCost  = GetMaterialCost(bomcostrec, refMaterial, IsMultiLevel, out var refMaterialMatlMessages, roundup);

                if (purchaseMatlMessages != null)
                {
                    foreach (var matlMessage in purchaseMatlMessages)
                    {
                        successful = false;
                        PXTrace.WriteWarning(matlMessage);
                    }
                }

                if (manufacturedMatlMessages != null)
                {
                    foreach (var matlMessage in manufacturedMatlMessages)
                    {
                        successful = false;
                        PXTrace.WriteWarning(matlMessage);
                    }
                }

                if (subContractMatlMessages != null)
                {
                    foreach (var matlMessage in subContractMatlMessages)
                    {
                        successful = false;
                        PXTrace.WriteWarning(matlMessage);
                    }
                }

                if (refMaterialMatlMessages != null)
                {
                    foreach (var matlMessage in refMaterialMatlMessages)
                    {
                        successful = false;
                        PXTrace.WriteWarning(matlMessage);
                    }
                }

                bomcostrec.MatlManufacturedCost    = manufacturedCost?.TotalCost ?? 0m;
                bomcostrec.MatlNonManufacturedCost = purchaseCost?.TotalCost ?? 0m;
                bomcostrec.SubcontractMaterialCost = subcontractCost?.TotalCost ?? 0m;
                bomcostrec.ReferenceMaterialCost   = refmaterialCost?.TotalCost ?? 0m;

                matlTotal = new OperationCosts(manufacturedCost);
                matlTotal.Add(purchaseCost, true);
                matlTotal.Add(subcontractCost, true);
            }

            bomcostrec.FOvdCost = 0;
            bomcostrec.VOvdCost = 0;
            SetOverheadCosts(ref bomcostrec, Settings.Current.IncFixed.GetValueOrDefault(), matlTotal, laborCostAndHours.Item1, laborCostAndHours.Item2);

            bomcostrec.TotalCost = bomcostrec.FLaborCost.GetValueOrDefault()
                                   + bomcostrec.VLaborCost.GetValueOrDefault()
                                   + bomcostrec.MachCost.GetValueOrDefault()
                                   + bomcostrec.MatlManufacturedCost.GetValueOrDefault()
                                   + bomcostrec.MatlNonManufacturedCost.GetValueOrDefault()
                                   + bomcostrec.FOvdCost.GetValueOrDefault()
                                   + bomcostrec.VOvdCost.GetValueOrDefault()
                                   + bomcostrec.ToolCost.GetValueOrDefault()
                                   + bomcostrec.OutsideCost.GetValueOrDefault()
                                   + bomcostrec.DirectCost.GetValueOrDefault()
                                   + bomcostrec.SubcontractMaterialCost.GetValueOrDefault()
                                   + bomcostrec.ReferenceMaterialCost.GetValueOrDefault();

            bomcostrec.UnitCost = UomHelper.PriceCostRound(bomcostrec.TotalCost.GetValueOrDefault() / bomcostrec.LotSize.GetValueOrDefault());

            try
            {
                BomCostRecs.Insert(bomcostrec);
            }
            catch (Exception e)
            {
                if (e is PXOuterException)
                {
                    PXTraceHelper.PxTraceOuterException((PXOuterException)e, PXTraceHelper.ErrorLevel.Error);
                }

                InventoryItem item = PXSelect <InventoryItem, Where <InventoryItem.inventoryID, Equal <Required <InventoryItem.inventoryID> > > > .Select(this, bomcostrec.InventoryID);

                if (item == null)
                {
                    PXTrace.WriteInformation(JAMS.AM.Messages.InvalidInventoryIDOnBOM, bomItem.BOMID);
                    successful = false;
                }
                else
                {
                    throw new PXException(JAMS.AM.Messages.GetLocal(JAMS.AM.Messages.UnableToSaveRecordForInventoryID), JAMS.AM.Messages.GetLocal(JAMS.AM.Messages.BOMCost), item.InventoryCD.Trim(), e.Message);
                }
            }

            return(successful);
        }