Пример #1
0
        private CswNbtNode _makeReceiptLot(CswPrimaryKey MaterialId, CswNbtReceivingDefinition ReceiptDef, DateTime ExpirationDate)
        {
            Action <CswNbtNode> AfterReceiptLot = delegate(CswNbtNode NewNode)
            {
                CswNbtObjClassReceiptLot thisReceiptLot = NewNode;
                thisReceiptLot.Material.RelatedNodeId       = MaterialId;
                thisReceiptLot.RequestItem.RelatedNodeId    = ReceiptDef.RequestItemtNodeId;
                thisReceiptLot.ExpirationDate.DateTimeValue = ExpirationDate;
            };

            CswNbtObjClassReceiptLot ReceiptLot = _CswNbtResources.Nodes.GetNode(ReceiptDef.ReceiptLotNodeId);

            if (null != ReceiptDef.ReceiptLotNodeId && null != ReceiptLot)
            {
                _CswNbtSdTabsAndProps.saveProps(ReceiptLot.NodeId, Int32.MinValue, ReceiptDef.ReceiptLotProps, ReceiptLot.NodeTypeId, null, IsIdentityTab: false);
                AfterReceiptLot(ReceiptLot.Node);
                ReceiptLot.postChanges(false);
            }
            else
            {
                CswNbtMetaDataObjectClass ReceiptLotClass = _CswNbtResources.MetaData.getObjectClass(CswEnumNbtObjectClass.ReceiptLotClass);
                ReceiptLot = _CswNbtResources.Nodes.makeNodeFromNodeTypeId(ReceiptLotClass.FirstNodeType.NodeTypeId, AfterReceiptLot);
            }
            _attachCofA(ReceiptLot.NodeId, ReceiptDef);
            return(ReceiptLot.Node);
        }
Пример #2
0
        } // getPercentDone()

        /// <summary>
        /// Run the next iteration of this batch operation
        /// </summary>
        public void runBatchOp(CswNbtObjClassBatchOp BatchNode)
        {
            try
            {
                if (BatchNode.OpNameValue == CswEnumNbtBatchOpName.Receiving)
                {
                    _CswNbtSdTabsAndProps = new CswNbtSdTabsAndProps(_CswNbtResources);

                    BatchNode.start();

                    ReceivingBatchData BatchData = new ReceivingBatchData(BatchNode.BatchData.Text);

                    CswNbtActReceiving        ActReceiving      = new CswNbtActReceiving(_CswNbtResources);
                    CswNbtReceivingDefinition UpdatedReceiptDef = ActReceiving.receiveContainers(BatchData.ReceiptDef, ref _NodesProcessed, _MaxNodeProcessed);

                    ReceivingBatchData UpdatedBatchData = new ReceivingBatchData(UpdatedReceiptDef);
                    BatchNode.BatchData.Text = UpdatedBatchData.ToString();

                    if (0 == BatchData.CountNumberContainersToCreate() || 0 == _NodesProcessed)
                    {
                        BatchNode.finish();
                    }

                    _NodesProcessed = 0; //reset this for Unit Test purposes

                    BatchNode.PercentDone.Value = getPercentDone(BatchNode);
                    BatchNode.BatchData.Text    = BatchData.ToString();
                    BatchNode.postChanges(false);
                }
            }
            catch (Exception ex)
            {
                BatchNode.error(ex);
            }
        } // runBatchOp()
Пример #3
0
        /// <summary>
        /// Create a new batch operation to handle creation of Containers from the receiving wizard
        /// </summary>
        public CswNbtObjClassBatchOp makeBatchOp(CswNbtReceivingDefinition ReceiptDefinition)
        {
            CswNbtObjClassBatchOp BatchNode = null;
            ReceivingBatchData    BatchData = new ReceivingBatchData(ReceiptDefinition);

            BatchNode = CswNbtBatchManager.makeNew(_CswNbtResources, _BatchOpName, BatchData.ToString());
            return(BatchNode);
        } // makeBatchOp()
Пример #4
0
        public void testReceivingBarcodesNoBarcode()
        {
            CswNbtMetaDataNodeType ChemicalNT   = TestData.CswNbtResources.MetaData.getNodeType("Chemical");
            CswNbtObjClassChemical ChemicalNode = TestData.CswNbtResources.Nodes.makeNodeFromNodeTypeId(ChemicalNT.NodeTypeId);

            CswNbtObjClassUnitOfMeasure GramNode = TestData.CswNbtResources.Nodes.GetNode(new CswPrimaryKey("nodes", 26745));

            CswNbtMetaDataNodeType SizeNT = TestData.CswNbtResources.MetaData.getNodeType("Size");
            CswNbtObjClassSize     Size   = TestData.CswNbtResources.Nodes.makeNodeFromNodeTypeId(SizeNT.NodeTypeId, OnAfterMakeNode : delegate(CswNbtNode NewNode)
            {
                CswNbtObjClassSize AsSize       = NewNode;
                AsSize.Material.RelatedNodeId   = ChemicalNode.NodeId;
                AsSize.UnitCount.Value          = 5;
                AsSize.InitialQuantity.Quantity = 10;
                AsSize.InitialQuantity.UnitId   = GramNode.NodeId;
            }, OverrideUniqueValidation: true);

            CswNbtActReceiving ReceivingAction = new CswNbtActReceiving(TestData.CswNbtResources, ChemicalNode.NodeId);

            CswNbtMetaDataNodeType  ContainerNT      = TestData.CswNbtResources.MetaData.getNodeType("Container");
            CswNbtObjClassContainer InitialContainer = ReceivingAction.makeContainer(null);
            JObject ContainerAddProps = ReceivingAction.getContainerAddProps(InitialContainer);

            int NumContainers = 2;
            CswNbtReceivingDefinition ReceiptDef = new CswNbtReceivingDefinition()
            {
                ContainerNodeId     = InitialContainer.NodeId,
                ContainerNodeTypeId = ContainerNT.NodeTypeId,
                ContainerProps      = ContainerAddProps,
                MaterialNodeId      = ChemicalNode.NodeId,
                Quantities          = new Collection <CswNbtAmountsGridQuantity>()
                {
                    new CswNbtAmountsGridQuantity()
                    {
                        NumContainers = NumContainers,
                        Quantity      = 10,
                        SizeName      = Size.NodeName,
                        SizeNodeId    = Size.NodeId,
                        UnitNodeId    = GramNode.NodeId,
                        ContainerIds  = new Collection <string>()
                        {
                            InitialContainer.NodeId.ToString()
                        }
                    }
                }
            };

            CswNbtMetaDataNodeTypeProp BarcodeNTP = ContainerNT.getNodeTypePropByObjectClassProp(CswNbtObjClassContainer.PropertyName.Barcode);
            string Before = BarcodeNTP.Sequence.getCurrent();

            ReceivingAction.receiveMaterial(ReceiptDef);
            string After = BarcodeNTP.Sequence.getCurrent();

            Assert.AreNotEqual(Before, After, "Creating containers in receiving with no custom barcodes specified did not consume sequence values when it should have");
        }
Пример #5
0
        public CswNbtWebServiceReceiving.CswNbtReceivingDefinitionReturn Receive(CswNbtReceivingDefinition Request)
        {
            CswNbtWebServiceReceiving.CswNbtReceivingDefinitionReturn Ret = new CswNbtWebServiceReceiving.CswNbtReceivingDefinitionReturn();
            var GetViewDriverType = new CswWebSvcDriver <CswNbtWebServiceReceiving.CswNbtReceivingDefinitionReturn, CswNbtReceivingDefinition>(
                CswWebSvcResourceInitializer: new CswWebSvcResourceInitializerNbt(_Context, null),
                ReturnObj: Ret,
                WebSvcMethodPtr: CswNbtWebServiceReceiving.ReceiveMaterial,
                ParamObj: Request
                );

            GetViewDriverType.run();
            return(Ret);
        }
Пример #6
0
        private void _attachCofA(CswPrimaryKey ReceiptLotId, CswNbtReceivingDefinition ReceiptDef)
        {
            CswNbtObjClassCofADocument CofADoc = _CswNbtResources.Nodes.GetNode(ReceiptDef.CofADocNodeId);

            if (null != CofADoc)
            {
                _CswNbtSdTabsAndProps.saveProps(CofADoc.NodeId, Int32.MinValue, ReceiptDef.CofAPropsJSON, CofADoc.NodeTypeId, null, IsIdentityTab: false);
                if ((CofADoc.FileType.Value == CswNbtPropertySetDocument.CswEnumDocumentFileTypes.File && false == string.IsNullOrEmpty(CofADoc.File.FileName)) ||
                    (CofADoc.FileType.Value == CswNbtPropertySetDocument.CswEnumDocumentFileTypes.Link && false == string.IsNullOrEmpty(CofADoc.Link.Href)))
                {
                    CofADoc.Owner.RelatedNodeId = ReceiptLotId;
                    CofADoc.PromoteTempToReal();
                }
            }
        }
        /// <summary>
        /// Simulates clicking "Finish" on the Receiving Wizard
        /// </summary>
        private CswNbtReceivingDefinition FinishWizard()
        {
            CswNbtMetaDataNodeType  ContainerNT      = TestData.CswNbtResources.MetaData.getNodeType("Container");
            CswNbtObjClassContainer InitialContainer = _ReceivingAction.makeContainer(null);
            JObject ContainerAddProps = _ReceivingAction.getContainerAddProps(InitialContainer);

            CswNbtObjClassUnitOfMeasure GramNode = TestData.CswNbtResources.Nodes.GetNode(new CswPrimaryKey("nodes", 26745));     //TODO: don't hardcode this Gram

            //CREATES 16 CONTAINERS
            CswNbtReceivingDefinition ReceiptDef = new CswNbtReceivingDefinition()
            {
                ContainerNodeId     = InitialContainer.NodeId,
                ContainerNodeTypeId = ContainerNT.NodeTypeId,
                ContainerProps      = ContainerAddProps,
                MaterialNodeId      = _FirstChemicalNode.NodeId,
                Quantities          = new Collection <CswNbtAmountsGridQuantity>()
                {
                    new CswNbtAmountsGridQuantity()
                    {
                        NumContainers = 11,
                        Quantity      = 10,
                        SizeName      = _SizeOne.NodeName,
                        SizeNodeId    = _SizeOne.NodeId,
                        UnitNodeId    = GramNode.NodeId,
                        ContainerIds  = new Collection <string>()
                        {
                            InitialContainer.NodeId.ToString()
                        }
                    },
                    new CswNbtAmountsGridQuantity()
                    {
                        NumContainers = 5,
                        Quantity      = 100,
                        SizeName      = _SizeTwo.NodeName,
                        SizeNodeId    = _SizeTwo.NodeId,
                        UnitNodeId    = GramNode.NodeId
                    }
                }
            };

            //This should create out receipt lot and finalize the initial container
            int nodesProcessed = 0;

            _ReceivingAction.receiveContainers(ReceiptDef, ref nodesProcessed, 1);

            return(ReceiptDef);
        }
        public void TestContainerCreation()
        {
            CswNbtReceivingDefinition ReceiptDef = FinishWizard(); //This method is testing by the "TestInitialContainerCreate" test

            CswNbtBatchOpReceiving ReceivingBatchOp = new CswNbtBatchOpReceiving(TestData.CswNbtResources);

            ReceivingBatchOp.OverrideMaxProcessed(10);
            CswNbtObjClassBatchOp Op = ReceivingBatchOp.makeBatchOp(ReceiptDef);

            double PercentDone    = 0;
            int    NumInterations = 0;   //Just in case

            while (PercentDone != 100.0) //there should never be more than 2 iteration if we're doing 10 containers at a time and we have 16 containers to do
            {
                ReceivingBatchOp.runBatchOp(Op);
                PercentDone = ReceivingBatchOp.getPercentDone(Op);

                NumInterations++; //If we get to three, we exit and report a failure
                if (3 == NumInterations)
                {
                    break; //Prevent infinate loops
                }
            }

            ReceiptDef = ReceivingBatchOp.GetBatchData(Op);
            Assert.AreEqual(2, NumInterations, "runBatchOp() ran more than two times when it shouldn have only run twice");

            int NumContainerIds = 0;

            foreach (CswNbtAmountsGridQuantity Quant in ReceiptDef.Quantities)
            {
                NumContainerIds += Quant.ContainerIds.Count;
            }

            int NumContainers = 0;

            foreach (CswNbtAmountsGridQuantity Quant in ReceiptDef.Quantities)
            {
                NumContainers += Quant.NumContainers;
            }
            Assert.AreEqual(NumContainers, NumContainerIds, "The batch op created " + NumContainerIds + " containers when it expected " + NumContainers);
        }
Пример #9
0
 public ReceivingBatchData(string ReceiptDefinitionStr)
 {
     _receiptDef = CswSerialize <CswNbtReceivingDefinition> .ToObject(ReceiptDefinitionStr);
 }
Пример #10
0
 public ReceivingBatchData(CswNbtReceivingDefinition ReceiptDefinition)
 {
     _receiptDef = ReceiptDefinition;
 }
Пример #11
0
        } // makeContainer()

        public JObject receiveMaterial(CswNbtReceivingDefinition ReceiptDefinition)
        {
            JObject Ret = new JObject();

            CswNbtObjClassContainer InitialContainerNode = _CswNbtResources.Nodes[ReceiptDefinition.ContainerNodeId];

            if (null != InitialContainerNode && ReceiptDefinition.Quantities.Count > 0)
            {
                //Generate the barcodes upfront and treat them as custom barcodes so all Containers in this Receipt Def have similar numbers
                CswNbtMetaDataNodeTypeProp BarcodeProp = (CswNbtMetaDataNodeTypeProp)InitialContainerNode.NodeType.getBarcodeProperty();
                for (int i = 0; i < ReceiptDefinition.Quantities.Count; i++)
                {
                    CswNbtAmountsGridQuantity quantity = ReceiptDefinition.Quantities[i];
                    while (quantity.getNumBarcodes() < quantity.NumContainers)
                    {
                        if (quantity.getNumBarcodes() == 0 && i == 0 && false == String.IsNullOrEmpty(InitialContainerNode.Barcode.Barcode))    //special case: the Initial Container node already has a barcode, so insert that one if a user didn't specify a custom barcode
                        {
                            quantity.AddBarcode(InitialContainerNode.Barcode.Barcode);
                        }
                        else
                        {
                            if (null != BarcodeProp.Sequence)
                            {
                                quantity.AddBarcode(BarcodeProp.Sequence.getNext());
                            }
                        }
                    }
                }

                CswNbtNode ReceiptLot = _makeReceiptLot(ReceiptDefinition.MaterialNodeId, ReceiptDefinition, InitialContainerNode.ExpirationDate.DateTimeValue);
                if (null == ReceiptDefinition.ReceiptLotNodeId)
                {
                    ReceiptDefinition.ReceiptLotNodeId = ReceiptLot.NodeId;
                }

                ReceiptDefinition.Quantities[0].ContainerIds.Add(InitialContainerNode.NodeId.ToString());
                int processed = 0;
                receiveContainers(ReceiptDefinition, ref processed, 1);   //process only the first container (the initial one)

                commitSDSDocNode(ReceiptDefinition.MaterialNodeId, ReceiptDefinition.SDSNodeId, ReceiptDefinition.SDSProps);

                int  TotalContainersToMake = ReceiptDefinition.CountNumberContainersToMake();
                int  Threshhold            = CswConvert.ToInt32(_CswNbtResources.ConfigVbls.getConfigVariableValue("batchthreshold"));
                bool UseBatchOp            = TotalContainersToMake >= Threshhold;
                Collection <CswPrimaryKey> ContainerIds = null;
                if (UseBatchOp)
                {
                    //Containers will be created in a batch op
                    CswNbtBatchOpReceiving ReceivingBatchOp = new CswNbtBatchOpReceiving(_CswNbtResources);
                    ReceivingBatchOp.makeBatchOp(ReceiptDefinition);
                }
                else
                {
                    //Create the containers now
                    int nodesProcessed = 0;
                    CswNbtReceivingDefinition ReceivedContainers = receiveContainers(ReceiptDefinition, ref nodesProcessed, TotalContainersToMake + 1);
                    ContainerIds = new Collection <CswPrimaryKey>();
                    foreach (CswNbtAmountsGridQuantity Quantity in ReceivedContainers.Quantities)
                    {
                        foreach (string ContainerId in Quantity.ContainerIds)
                        {
                            ContainerIds.Add(CswConvert.ToPrimaryKey(ContainerId));
                        }
                    }
                }

                CswNbtNode MaterialNode = _CswNbtResources.Nodes.GetNode(ReceiptDefinition.MaterialNodeId);
                Ret = getLandingPageData(_CswNbtResources, MaterialNode, UseBatchOp, ContainerIds);
            }

            return(Ret);
        }
Пример #12
0
        public CswNbtReceivingDefinition receiveContainers(CswNbtReceivingDefinition ReceiptDef, ref int NodesProcessed, int MaxProcessed)
        {
            CswNbtMetaDataNodeType ContainerNt = _CswNbtResources.MetaData.getNodeType(ReceiptDef.ContainerNodeTypeId);

            foreach (CswNbtAmountsGridQuantity QuantityDef in ReceiptDef.Quantities)
            {
                CswNbtObjClassSize  AsSize  = _CswNbtResources.Nodes.GetNode(QuantityDef.SizeNodeId);
                string              Barcode = string.Empty;
                Action <CswNbtNode> After   = delegate(CswNbtNode NewNode)
                {
                    CswNbtObjClassContainer thisContainer = NewNode;
                    if (QuantityDef.getNumBarcodes() <= QuantityDef.NumContainers && false == string.IsNullOrEmpty(Barcode))
                    {
                        thisContainer.Barcode.setBarcodeValueOverride(Barcode, false);
                    }
                    thisContainer.Size.RelatedNodeId     = QuantityDef.SizeNodeId;
                    thisContainer.Material.RelatedNodeId = ReceiptDef.MaterialNodeId;
                    if (AsSize.QuantityEditable.Checked != CswEnumTristate.True)
                    {
                        QuantityDef.Quantity   = AsSize.InitialQuantity.Quantity;
                        QuantityDef.UnitNodeId = AsSize.InitialQuantity.UnitId;
                    }
                    if (null == thisContainer.Quantity.UnitId || Int32.MinValue == thisContainer.Quantity.UnitId.PrimaryKey)
                    {
                        thisContainer.Quantity.UnitId = QuantityDef.UnitNodeId;
                    }
                    thisContainer.DispenseIn(CswEnumNbtContainerDispenseType.Receive, QuantityDef.Quantity, QuantityDef.UnitNodeId, ReceiptDef.RequestItemtNodeId);
                    thisContainer.Disposed.Checked         = CswEnumTristate.False;
                    thisContainer.ReceiptLot.RelatedNodeId = ReceiptDef.ReceiptLotNodeId;
                };

                for (Int32 C = 0; C < QuantityDef.NumContainers; C += 1)
                {
                    if (NodesProcessed < MaxProcessed)
                    {
                        //we promote the first container before the batch op starts, so there should always be at least one container id in the first set of quantities
                        CswPrimaryKey ContainerId = null;
                        if (C < QuantityDef.ContainerIds.Count)
                        {
                            ContainerId = CswConvert.ToPrimaryKey(QuantityDef.ContainerIds[C]);
                        }
                        CswCommaDelimitedString Barcodes = QuantityDef.getBarcodes();
                        Barcode = (QuantityDef.getNumBarcodes() > C ? Barcodes[C] : string.Empty);

                        if (null == ContainerId)  //only create a container if we haven't already
                        {
                            CswNbtNodeKey           ContainerNodeKey;
                            CswNbtObjClassContainer Container = _CswNbtSdTabsAndProps.addNode(ContainerNt, ReceiptDef.ContainerProps, out ContainerNodeKey, After);
                            QuantityDef.ContainerIds.Add(Container.NodeId.ToString());
                            NodesProcessed++;
                        }
                        else
                        {
                            CswNbtNode InitialContainerNode = _CswNbtResources.Nodes.GetNode(ContainerId);
                            if (null != InitialContainerNode && InitialContainerNode.IsTemp)
                            {
                                _CswNbtSdTabsAndProps.saveNodeProps(InitialContainerNode, ReceiptDef.ContainerProps);
                                After(InitialContainerNode);
                                InitialContainerNode.PromoteTempToReal();
                                NodesProcessed++;
                            }
                        }
                    }
                } //for( Int32 C = 0; C < NoContainers; C += 1 )
            }

            return(ReceiptDef);
        }
Пример #13
0
        public static void ReceiveMaterial(ICswResources CswResources, CswNbtReceivingDefinitionReturn Response, CswNbtReceivingDefinition ReceivingDefiniton)
        {
            CswNbtResources    NbtResources = (CswNbtResources)CswResources;
            CswNbtActReceiving ActReceiving = new CswNbtActReceiving(NbtResources, ReceivingDefiniton.MaterialNodeId);
            JObject            ActionData   = ActReceiving.receiveMaterial(ReceivingDefiniton);

            Response.Data.ActionData = ActionData.ToString();


            //Create Print Job
            if (null != ReceivingDefiniton.PrintLabelId && null != ReceivingDefiniton.PrinterNodeId)
            {
                CswNbtObjClassContainer InitialContainer = NbtResources.Nodes.GetNode(ReceivingDefiniton.ContainerNodeId);

                Collection <Dictionary <string, string> > PropVals = new Collection <Dictionary <string, string> >();
                foreach (CswNbtAmountsGridQuantity Quant in ReceivingDefiniton.Quantities)
                {
                    CswNbtObjClassUnitOfMeasure UoMNode = NbtResources.Nodes.GetNode(Quant.UnitNodeId);
                    for (int i = 0; i < Quant.NumContainers; i++)
                    {
                        Dictionary <string, string> vals = InitialContainer.Node.getPropertiesAndValues();
                        vals[InitialContainer.Barcode.PropName]  = Quant.getBarcodes()[i];
                        vals[InitialContainer.Quantity.PropName] = Quant.Quantity + " " + UoMNode.BaseUnit.Text;
                        PropVals.Add(vals);
                    }
                }

                CswNbtWebServicePrintLabels.newPrintJob(CswResources, ReceivingDefiniton.PrinterNodeId, ReceivingDefiniton.PrintLabelId, ReceivingDefiniton.ContainerNodeId, PropVals);
            }
        }
Пример #14
0
 public CswNbtReceivingDefinitionReturn()
 {
     Data = new CswNbtReceivingDefinition();
 }