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 }); }
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); }
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 }); }
/// <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); }
/// <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); }
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); }
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); } } }
/// <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); }