Exemplo n.º 1
0
        protected void _(Events.RowSelected <AMMultiLevelBomFilter> e)
        {
            AMMultiLevelBomFilter row = e.Row;

            if (row != null)
            {
                bool enabled = PXSelect <LifeSyncPreference> .Select(this).TopFirst.EnableProdCostAnlys ?? false;

                PXUIFieldAttribute.SetEnabled <AMMultiLevelBomFilterExt.usrEnblItemRoundUp>(e.Cache, row, enabled);
            }

            Results.SetProcessDelegate(delegate(List <LUMStdBomCost> lists)
            {
                try
                {
                    GenerateBOMCost(lists, row);

                    PXProcessing.SetProcessed();
                }
                catch (Exception ex)
                {
                    PXProcessing.SetError(ex);
                    throw;
                }
            });
        }
Exemplo n.º 2
0
        public virtual void LoadAllData(AMMultiLevelBomFilter bomFilter)
        {
            DeleteWrkTableRecs(this.Accessinfo.UserID);

            Filter.Current = bomFilter;

            var multiLevelBomRecs = new List <LUMStdBomCost>();

            PXSelectBase <AMBomItem> cmdBOM = new PXSelect <AMBomItem>(this);

            if (bomFilter.BOMDate != null)
            {
                cmdBOM.WhereAnd <Where <Current <AMMultiLevelBomFilter.bOMDate>, Between <AMBomItem.effStartDate, AMBomItem.effEndDate>,
                                        Or <Where <AMBomItem.effStartDate, LessEqual <Current <AMMultiLevelBomFilter.bOMDate> >,
                                                   And <AMBomItem.effEndDate, IsNull> > > > >();
            }

            if (bomFilter.BOMID != null)
            {
                cmdBOM.WhereAnd <Where <AMBomItem.bOMID, Equal <Current <AMMultiLevelBomFilter.bOMID> > > >();
            }

            if (bomFilter.InventoryID != null)
            {
                cmdBOM.WhereAnd <Where <AMBomItem.inventoryID, Equal <Current <AMMultiLevelBomFilter.inventoryID> > > >();
            }

            foreach (AMBomItem bomitem in cmdBOM.Select())
            {
                LoadDataRecords(bomitem.BOMID, bomitem.RevisionID, 0, 1, bomitem, multiLevelBomRecs, bomFilter);
            }

            if (bomFilter.RollCosts.GetValueOrDefault())
            {
                multiLevelBomRecs = RollCostUpdate(multiLevelBomRecs);
            }

            for (int i = 0; i < multiLevelBomRecs.Count; i++)
            {
                BOMCost.Insert(multiLevelBomRecs[i]);
            }

            this.Actions.PressSave();
        }
Exemplo n.º 3
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);
        }
Exemplo n.º 4
0
        public static void GenerateBOMCost(List <LUMStdBomCost> lists, AMMultiLevelBomFilter bomFilter)
        {
            var graph = CreateInstance <LUMMultiLevelBomProc>();

            graph.LoadAllData(bomFilter);
        }
Exemplo n.º 5
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);
                }
            }
        }