private ShipmentInformation CreateShipmentInformation(tblOrderDTO oldOrder)
        {
            var dateCreated = oldOrder.EntryDate.Value.Date;

            return(new ShipmentInformation
            {
                DateCreated = dateCreated,
                Sequence = _newContextHelper.ShipmentInformationKeys.GetNextSequence(dateCreated),

                Status = ((tblOrderStatus)oldOrder.Status).ToShipmentStatus(),
                PalletWeight = (double?)oldOrder.PalletOR,
                PalletQuantity = (int)(oldOrder.PalletQty ?? 0),
                FreightBillType = oldOrder.FreightBillType,
                ShipmentMethod = oldOrder.ShipVia,
                DriverName = oldOrder.Driver,
                CarrierName = oldOrder.Carrier,
                TrailerLicenseNumber = oldOrder.TrlNbr,
                ContainerSeal = oldOrder.ContSeal,

                RequiredDeliveryDate = oldOrder.DelDueDate,
                ShipmentDate = oldOrder.Date ?? oldOrder.SchShipDate,

                ShipTo = oldOrder.ShipTo,
                FreightBill = oldOrder.BillTo
            });
        }
        private SalesOrderLoad CreateCustomerOrder(tblOrderDTO oldOrder)
        {
            LoadCount.AddRead(EntityType.SalesOrder);

            if (oldOrder.EntryDate == null)
            {
                Log(new CallbackParameters(CallbackReason.EntryDateNull)
                {
                    Order = oldOrder
                });
                return(null);
            }

            var employeeId = _newContextHelper.DefaultEmployee.EmployeeId;

            if (oldOrder.EmployeeID != null)
            {
                employeeId = oldOrder.EmployeeID.Value;
            }
            else
            {
                Log(new CallbackParameters(CallbackReason.EmployeeIDNull)
                {
                    Order = oldOrder
                });
            }

            Models.Company customer = null;
            if (!string.IsNullOrWhiteSpace(oldOrder.Company_IA))
            {
                customer = _newContextHelper.GetCompany(oldOrder.Company_IA, CompanyType.Customer);
                if (customer == null)
                {
                    Log(new CallbackParameters(CallbackReason.CustomerNotFound)
                    {
                        Order = oldOrder
                    });
                    return(null);
                }
            }

            Models.Company broker = null;
            if (!string.IsNullOrWhiteSpace(oldOrder.Broker))
            {
                broker = _newContextHelper.GetCompany(oldOrder.Broker, CompanyType.Broker);
                if (broker == null)
                {
                    Log(new CallbackParameters(CallbackReason.BrokerNotFound)
                    {
                        Order = oldOrder
                    });
                    return(null);
                }
            }

            var warehouse = _newContextHelper.GetFacility(oldOrder.WHID);

            if (warehouse == null)
            {
                Log(new CallbackParameters(CallbackReason.WarehouseNotFound)
                {
                    Order = oldOrder
                });
                return(null);
            }

            var dateReceived = oldOrder.EntryDate.Value.Date;

            if (oldOrder.DateRecd != null)
            {
                dateReceived = oldOrder.DateRecd.Value.Date;
            }
            else
            {
                Log(new CallbackParameters(CallbackReason.DateRecdNull)
                {
                    Order = oldOrder
                });
            }

            if (oldOrder.Status.ToTblOrderStatus() == null)
            {
                Log(new CallbackParameters(CallbackReason.InvalidStatus)
                {
                    Order = oldOrder
                });
                return(null);
            }

            var shipmentInformation = CreateShipmentInformation(oldOrder);

            if (shipmentInformation == null)
            {
                return(null);
            }

            var timestamp = oldOrder.EntryDate.Value.ConvertLocalToUTC();
            var order     = SetItems(new SalesOrderLoad
            {
                CustomerId   = customer == null ? (int?)null : customer.Id,
                BrokerId     = broker == null ? (int?)null : broker.Id,
                PaymentTerms = oldOrder.PayTerms,
                PreShipmentSampleRequired = oldOrder.PreSample,
                OrderStatus   = ((tblOrderStatus)oldOrder.Status).ToCustomerOrderStatus(),
                InvoiceDate   = oldOrder.InvoiceDate,
                InvoiceNotes  = oldOrder.InvoiceNotes,
                CreditMemo    = oldOrder.CreditMemo,
                FreightCharge = (float)(oldOrder.FreightCharge ?? 0.0m),

                SoldTo = oldOrder.SoldTo,
                InventoryShipmentOrder = new InventoryShipmentOrder
                {
                    MoveNum    = oldOrder.OrderNum,
                    EmployeeId = employeeId,
                    TimeStamp  = timestamp,
                    OrderType  = oldOrder.TTypeID.ToOrderType(),
                    ShipmentInfoDateCreated = shipmentInformation.DateCreated,
                    ShipmentInfoSequence    = shipmentInformation.Sequence,
                    ShipmentInformation     = shipmentInformation,
                    DestinationFacilityId   = null,
                    SourceFacilityId        = warehouse.Id,
                    OrderStatus             = oldOrder.Status.ToTblOrderStatus().ToOrderStatus(),

                    PurchaseOrderNumber = oldOrder.PONbr,
                    DateReceived        = dateReceived,
                    RequestedBy         = oldOrder.From,
                    TakenBy             = oldOrder.TakenBy,

                    PickedInventory = new PickedInventory
                    {
                        EmployeeId   = employeeId,
                        TimeStamp    = timestamp,
                        PickedReason = PickedReason.SalesOrder,
                        Archived     = oldOrder.Status > (int)tblOrderStatus.Staged,
                    },
                    InventoryPickOrder = new InventoryPickOrder()
                }
            }, oldOrder);

            var            dateCreated = oldOrder.EntryDate.Value.Date;
            int            sequence;
            ISalesOrderKey key;

            if (_salesOrderKey.TryParse(oldOrder.SerializedKey, out key))
            {
                dateCreated = key.SalesOrderKey_DateCreated;
                sequence    = key.SalesOrderKey_Sequence;
            }
            else
            {
                sequence = PickedInventoryKeyHelper.Singleton.GetNextSequence(dateCreated);
                order.RequiresKeySync = true;
            }
            SetPickedInventoryKey(order, dateCreated, sequence);

            return(order);
        }
        private SalesOrderLoad SetItems(SalesOrderLoad order, tblOrderDTO oldOrder)
        {
            var orderItemSequence  = 0;
            var pickedItemSequence = 0;

            order.SalesOrderItems       = new List <SalesOrderItem>();
            order.SalesOrderPickedItems = new List <SalesOrderPickedItem>();

            var latestStaged = oldOrder.tblOrderDetails.SelectMany(d => d.tblStagedFGs)
                               .OrderByDescending(s => s.EntryDate)
                               .FirstOrDefault();

            if (latestStaged != null)
            {
                order.InventoryShipmentOrder.PickedInventory.TimeStamp = latestStaged.EntryDate.ConvertLocalToUTC();
                if (latestStaged.EmployeeID != null)
                {
                    order.InventoryShipmentOrder.PickedInventory.EmployeeId = latestStaged.EmployeeID.Value;
                }
            }

            foreach (var detail in oldOrder.tblOrderDetails)
            {
                LoadCount.AddRead(EntityType.SalesOrderItem);

                var product = _newContextHelper.GetProduct(detail.ProdID);
                if (product == null)
                {
                    Log(new CallbackParameters(CallbackReason.DetailProductNotFound)
                    {
                        Order  = oldOrder,
                        Detail = detail
                    });
                    continue;
                }

                var packaging = _newContextHelper.GetPackagingProduct(detail.PkgID);
                if (packaging == null)
                {
                    Log(new CallbackParameters(CallbackReason.DetailPackagingNotFound)
                    {
                        Order  = oldOrder,
                        Detail = detail
                    });
                    continue;
                }

                var treatment = _newContextHelper.NoTreatment;
                if (detail.TrtmtID != null)
                {
                    treatment = _newContextHelper.GetInventoryTreatment(detail.TrtmtID.Value);
                    if (treatment == null)
                    {
                        Log(new CallbackParameters(CallbackReason.DetailTreatmentNotFound)
                        {
                            Order  = oldOrder,
                            Detail = detail
                        });
                        continue;
                    }
                }

                IContractItemKey contractItemKey = null;
                if (detail.KDetailID != null)
                {
                    contractItemKey = _newContextHelper.GetContractItemKey(detail.KDetailID);
                    if (contractItemKey == null)
                    {
                        Log(new CallbackParameters(CallbackReason.ContractItemNotFound)
                        {
                            Order  = oldOrder,
                            Detail = detail
                        });
                        continue;
                    }
                }

                order.SalesOrderItems.Add(new SalesOrderItem
                {
                    ItemSequence         = orderItemSequence,
                    ContractYear         = contractItemKey == null ? (int?)null : contractItemKey.ContractKey_Year,
                    ContractSequence     = contractItemKey == null ? (int?)null : contractItemKey.ContractKey_Sequence,
                    ContractItemSequence = contractItemKey == null ? (int?)null : contractItemKey.ContractItemKey_Sequence,
                    PriceBase            = (double)(detail.Price ?? 0),
                    PriceFreight         = (double)(detail.FreightP ?? 0),
                    PriceTreatment       = (double)(detail.TrtnmntP ?? 0),
                    PriceWarehouse       = (double)(detail.WHCostP ?? 0),
                    PriceRebate          = (double)(detail.Rebate ?? 0),
                    ODetail = detail.ODetail,

                    InventoryPickOrderItem = new InventoryPickOrderItem
                    {
                        ItemSequence        = orderItemSequence,
                        ProductId           = product.ProductKey.ProductKey_ProductId,
                        PackagingProductId  = packaging.Id,
                        TreatmentId         = treatment.Id,
                        Quantity            = (int)(detail.Quantity ?? 0),
                        CustomerLotCode     = detail.CustLot,
                        CustomerProductCode = detail.CustProductCode,
                    }
                });

                foreach (var staged in detail.tblStagedFGs)
                {
                    LoadCount.AddRead(EntityType.SalesOrderPickedItem);

                    LotKey lotKey;
                    if (!LotNumberParser.ParseLotNumber(staged.Lot, out lotKey))
                    {
                        Log(new CallbackParameters(CallbackReason.StagedInvalidLotNumber)
                        {
                            Order  = oldOrder,
                            Staged = staged
                        });
                        continue;
                    }

                    packaging = _newContextHelper.GetPackagingProduct(staged.PkgID);
                    if (packaging == null)
                    {
                        Log(new CallbackParameters(CallbackReason.StagedPackagingNotFound)
                        {
                            Order  = oldOrder,
                            Staged = staged
                        });
                        continue;
                    }

                    var currentLocation = _newContextHelper.GetLocation(staged.LocID);
                    if (currentLocation == null)
                    {
                        Log(new CallbackParameters(CallbackReason.StagedLocationNotFound)
                        {
                            Order  = oldOrder,
                            Staged = staged
                        });
                        continue;
                    }

                    var fromLocation = detail.tblOutgoing.Any() ? DeterminePickedFromLocation(detail, staged) : currentLocation;
                    if (fromLocation == null)
                    {
                        Log(new CallbackParameters(CallbackReason.UndeterminedPickedFromLocation)
                        {
                            Order  = oldOrder,
                            Staged = staged
                        });
                        continue;
                    }

                    treatment = _newContextHelper.GetInventoryTreatment(staged.TrtmtID);
                    if (treatment == null)
                    {
                        Log(new CallbackParameters(CallbackReason.StagedTreatmentNotFound)
                        {
                            Order  = oldOrder,
                            Staged = staged
                        });
                        continue;
                    }

                    order.SalesOrderPickedItems.Add(new SalesOrderPickedItem
                    {
                        ItemSequence      = pickedItemSequence,
                        OrderItemSequence = orderItemSequence,

                        PickedInventoryItem = new PickedInventoryItem
                        {
                            DetailID        = staged.EntryDate,
                            ItemSequence    = pickedItemSequence,
                            LotDateCreated  = lotKey.LotKey_DateCreated,
                            LotDateSequence = lotKey.LotKey_DateSequence,
                            LotTypeId       = lotKey.LotKey_LotTypeId,

                            Quantity           = (int)(staged.Quantity ?? 0),
                            PackagingProductId = packaging.Id,
                            FromLocationId     = fromLocation.Id,
                            CurrentLocationId  = currentLocation.Id,
                            TreatmentId        = treatment.Id,
                            ToteKey            = "",

                            CustomerLotCode     = staged.CustLot,
                            CustomerProductCode = staged.CustProductCode
                        }
                    });
                    pickedItemSequence++;
                }
                orderItemSequence++;
            }

            return(order);
        }