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