コード例 #1
0
        private void Create(OrderHistoryFile currentFile, bool isSpecialOrder)
        {
            EF.OrderHistoryHeader header = GetHeaderAndMergeCurrentFile(currentFile, isSpecialOrder);

            if (Configuration.DiagnosticsAuditOrderHistoryHeaderChanges)
            {
                ChangeAuditor.AuditChanges(_unitOfWork.Context, header, _log);
            }

            bool hasSpecialItems = false;

            foreach (OrderHistoryDetail currentDetail in currentFile.Details.ToList())
            {
                if (string.IsNullOrWhiteSpace(currentDetail.SpecialOrderHeaderId))
                {
                    hasSpecialItems = true;
                }

                DetermineDetailOnOrder(isSpecialOrder, header, currentDetail);
            }
            RecalcOrderSubtotal(currentFile, header);

            _headerRepo.CreateOrUpdate(header);

            if (hasSpecialItems)
            {
                RemoveSpecialOrderItemsFromHistory(header);
            }
        }
コード例 #2
0
 private static void FillEtaInformation(EF.OrderHistoryHeader orderHistory, Order order)
 {
     order.ScheduledDeliveryTime = orderHistory.ScheduledDeliveryTime;
     order.EstimatedDeliveryTime = orderHistory.EstimatedDeliveryTime;
     order.ActualDeliveryTime    = orderHistory.ActualDeliveryTime;
     order.DeliveryOutOfSequence = orderHistory.DeliveryOutOfSequence;
 }
コード例 #3
0
        private void GetSubtotal(EF.OrderHistoryHeader header)
        {
            Order newOrder = header.ToOrder();

            LookupProductDetails(header.BranchId, newOrder);
            header.OrderSubtotal = (decimal)newOrder.Items.Sum(i => i.LineTotal);
        }
コード例 #4
0
        private EF.OrderHistoryHeader FindHeader(OrderHistoryFile currentFile)
        {
            // first attempt to find the order, look by confirmation number
            EF.OrderHistoryHeader header = null;

            if (!String.IsNullOrEmpty(currentFile.Header.ControlNumber) && !String.IsNullOrEmpty(currentFile.Header.OrderSystem.ToShortString()))
            {
                header = _headerRepo.ReadByConfirmationNumber(currentFile.Header.ControlNumber, currentFile.Header.OrderSystem.ToShortString()).FirstOrDefault();
            }

            // second attempt to find the order, look by invioce number
            if (header == null && !currentFile.Header.InvoiceNumber.Equals("Processing"))
            {
                header = _headerRepo.ReadForInvoice(currentFile.Header.BranchId, currentFile.Header.InvoiceNumber).FirstOrDefault();
            }

            // last ditch effort is to create a new header
            if (header == null)
            {
                header = new EF.OrderHistoryHeader();
                header.OrderDetails = new List <EF.OrderHistoryDetail>();
            }

            return(header);
        }
コード例 #5
0
        /// <summary>
        /// Method to check for a cart/changeorder being submitted
        /// </summary>
        public static bool CheckOrderBlock(UserProfile user, UserSelectedContext catalogInfo, Guid?cartId, string orderNumber,
                                           IPurchaseOrderRepository pORepository, IOrderHistoryHeaderRepsitory hHRepository, ICacheRepository cache)
        {
            if (cartId != null && orderNumber == null) // if we are given cartId but not orderNumber, check for cross-reference
            {
                string cachekey = string.Format("Cart2OrderId_{0}", cartId);
                orderNumber = cache.GetItem <string>(CACHE_GROUPNAME, CACHE_PREFIX, CACHE_NAME, cachekey);
            }

            if (orderNumber != null && cartId == null) // if we are given an orderNumber but not cartId, we could be in changeorder, check for cross-reference
            {
                string cachekey       = string.Format("ChangeOrder_Order2NewOrderId_{0}", orderNumber);
                string newOrderNumber = cache.GetItem <string>(CACHE_GROUPNAME, CACHE_PREFIX, CACHE_NAME, cachekey);
                if (newOrderNumber != null)
                {
                    orderNumber = newOrderNumber;
                }
            }

            EF.OrderHistoryHeader theEFOrder = null;

            Order theOrder = null;

            // to check, we need to build the order and look at its status.
            if (catalogInfo != null && orderNumber != null && hHRepository != null)
            {
                // We just get the header not the details for performance
                theEFOrder = hHRepository.Read(h => h.BranchId.Equals(catalogInfo.BranchId, StringComparison.InvariantCultureIgnoreCase) &&
                                               (h.ControlNumber.Equals(orderNumber))).FirstOrDefault();
            }

            if (theEFOrder == null && pORepository != null && orderNumber != null) // if we don't find a header, try and construct the order from the purchaseOrder
            {
                CS.PurchaseOrder po = pORepository.ReadPurchaseOrderByTrackingNumber(orderNumber);

                theOrder = po.ToOrder();
            }
            else
            {
                if (theEFOrder != null)
                {
                    theOrder = theEFOrder.ToOrder();
                }
            }

            // we provide for no block for sysadmin
            // block a pending or submitted order otherwise
            //if (user.RoleName.Equals("beksysadmin", StringComparison.CurrentCultureIgnoreCase) == false &&
            //    theOrder != null && ((theOrder.Status.Equals("Pending")) | (theOrder.Status.Equals("Submitted"))))
            if (theOrder != null)
            {
                if ((theOrder.Status.Equals("Pending")) | (theOrder.Status.Equals("Submitted")))
                {
                    return(true);
                }
            }

            return(false);
        }
コード例 #6
0
        public static void MergeWithEntity(this OrderHistoryHeader header, ref EF.OrderHistoryHeader entity)
        {
            entity.OrderSystem    = header.OrderSystem.ToShortString();
            entity.BranchId       = header.BranchId;
            entity.CustomerNumber = header.CustomerNumber;
            entity.InvoiceNumber  = header.InvoiceNumber;
            entity.OrderDateTime  = header.OrderDateTime;
            entity.DeliveryDate   = header.DeliveryDate.ToDateTime().Value.ToLongDateFormat();
            entity.PONumber       = header.PONumber ?? entity.PONumber;
            //entity.ControlNumber = header.ControlNumber.Trim();
            // the original control number is actually set from the entity already
            // and because the order history header is actually a converted confirmation
            // it does not know the original control number so it is seeing it as null
            // and screwing up the original control number
            //entity.OriginalControlNumber = string.IsNullOrEmpty(header.OriginalControlNumber) ? header.ControlNumber.Trim() : header.OriginalControlNumber.Trim();
            entity.OrderStatus = header.OrderStatus;
            entity.FutureItems = header.FutureItems;
            entity.ErrorStatus = header.ErrorStatus;
            entity.RouteNumber = header.RouteNumber;
            entity.StopNumber  = header.StopNumber;
            //entity.IsSpecialOrder =

            if (string.IsNullOrEmpty(entity.ControlNumber))
            {
                entity.ControlNumber = header.ControlNumber.Trim();
                if (string.IsNullOrEmpty(entity.OriginalControlNumber))
                {
                    entity.OriginalControlNumber = header.ControlNumber.Trim();
                }
            }
            else
            {
                // update the history file with EF data
                int valueControlNumber;
                if (!int.TryParse(header.ControlNumber, out valueControlNumber))
                {
                    valueControlNumber = 0;
                }

                int entityControlNumber;
                if (!int.TryParse(entity.ControlNumber, out entityControlNumber))
                {
                    entityControlNumber = 0;
                }

                if (entityControlNumber > valueControlNumber)
                {
                    header.ControlNumber = entity.ControlNumber;
                }
                else
                {
                    entity.ControlNumber = header.ControlNumber;
                }
                //value.ControlNumber = entityControlNumber >= valueControlNumber? entity.ControlNumber : value.ControlNumber;
                header.OriginalControlNumber = entity.OriginalControlNumber ?? entity.ControlNumber;
            }
        }
コード例 #7
0
        private EF.OrderHistoryDetail SeekMatchingDetail(EF.OrderHistoryHeader header, OrderHistoryDetail currentDetail)
        {
            EF.OrderHistoryDetail detail = null;

            if (header.OrderDetails != null && header.OrderDetails.Count > 0)
            {
                detail = header.OrderDetails.Where(d => (d.LineNumber == currentDetail.LineNumber)).FirstOrDefault();
            }

            return(detail);
        }
コード例 #8
0
        private void UpdateOrder(SpecialOrderResponseModel specialorder, EF.OrderHistoryDetail detail)
        {
            EF.OrderHistoryHeader header = _headerRepo.ReadById(detail.OrderHistoryHeader.Id);
            header.DeliveryDate = specialorder.Item.EstimatedArrival;
            _headerRepo.Update(header);

            detail.ItemStatus = Constants.CONFIRMATION_DETAIL_FILLED_CODE;
            _detailRepo.Update(detail);

            _unitOfWork.SaveChanges();
        }
コード例 #9
0
        private EF.OrderHistoryDetail MergeWithCurrentOrderDetail
            (bool isSpecialOrder, EF.OrderHistoryHeader header, OrderHistoryDetail currentDetail, EF.OrderHistoryDetail detail)
        {
            currentDetail.MergeWithEntityFrameworkModel(ref detail);

            detail.BranchId      = header.BranchId;
            detail.InvoiceNumber = header.InvoiceNumber;
            if (isSpecialOrder)
            {
                detail.ItemStatus = KeithLink.Svc.Core.Constants.SPECIALORDERITEM_REQ_STATUS_TRANSLATED_CODE;
            }

            return(detail);
        }
コード例 #10
0
        private EF.OrderHistoryDetail AddNewDetailToOrder(bool isSpecialOrder, EF.OrderHistoryHeader header, OrderHistoryDetail currentDetail)
        {
            EF.OrderHistoryDetail tempDetail = currentDetail.ToEntityFrameworkModel();
            tempDetail.BranchId           = header.BranchId;
            tempDetail.InvoiceNumber      = header.InvoiceNumber;
            tempDetail.OrderHistoryHeader = header;

            if (isSpecialOrder)
            {
                tempDetail.ItemStatus = KeithLink.Svc.Core.Constants.SPECIALORDERITEM_REQ_STATUS_TRANSLATED_CODE;
            }

            header.OrderDetails.Add(tempDetail);
            return(tempDetail);
        }
コード例 #11
0
        private void SaveRejectedConfirmationAsOrderHistory(ConfirmationFile confFile)
        {
            //Assume we will only get rejections for Entree Orders
            Core.Enumerations.Order.OrderSource orderSource = Core.Enumerations.Order.OrderSource.Entree;
            EF.OrderHistoryHeader header = _historyRepo.ReadByConfirmationNumber(confFile.Header.ConfirmationNumber, orderSource.ToShortString()).FirstOrDefault();

            if (header != null)
            {
                header.OrderStatus   = Constants.CONFIRMATION_HEADER_REJECTED_CODE;
                header.InvoiceNumber = Constants.CONFIRMATION_HEADER_REJECTED_STATUS;

                _historyRepo.CreateOrUpdate(header);
                _uow.SaveChanges();
            }
        }
コード例 #12
0
        private void DetermineDetailOnOrder(bool isSpecialOrder, EF.OrderHistoryHeader header, OrderHistoryDetail currentDetail)
        {
            EF.OrderHistoryDetail detail = SeekMatchingDetail(header, currentDetail);

            if (detail == null)
            {
                detail = AddNewDetailToOrder(isSpecialOrder, header, currentDetail);
            }
            else
            {
                detail = MergeWithCurrentOrderDetail(isSpecialOrder, header, currentDetail, detail);
            }

            if (Configuration.DiagnosticsAuditOrderHistoryDetailChanges)
            {
                ChangeAuditor.AuditChanges(_unitOfWork.Context, detail, _log);
            }
        }
コード例 #13
0
        public static OrderHistoryHeader ToOrderHistoryHeader(this EF.OrderHistoryHeader entity)
        {
            OrderHistoryHeader header = new OrderHistoryHeader();

            header.OrderSystem           = OrderSource.Entree; // TODO: entity.OrderSystem.ToShortString();
            header.BranchId              = entity.BranchId;
            header.CustomerNumber        = entity.CustomerNumber;
            header.InvoiceNumber         = entity.InvoiceNumber;
            header.DeliveryDate          = entity.DeliveryDate.ToDateTime().Value.ToLongDateFormat();
            header.PONumber              = entity.PONumber;
            header.ControlNumber         = entity.ControlNumber;
            header.OriginalControlNumber = string.IsNullOrEmpty(entity.OriginalControlNumber) ? entity.ControlNumber.Trim() : entity.OriginalControlNumber.Trim();
            header.OrderStatus           = entity.OrderStatus;
            header.FutureItems           = entity.FutureItems;
            header.ErrorStatus           = entity.ErrorStatus;
            header.RouteNumber           = entity.RouteNumber;
            header.StopNumber            = entity.StopNumber;

            return(header);
        }
コード例 #14
0
        public static EF.OrderHistoryHeader ToEntityFrameworkModel(this OrderHistoryHeader header)
        {
            EF.OrderHistoryHeader entity = new EF.OrderHistoryHeader();

            entity.OrderSystem           = header.OrderSystem.ToShortString();
            entity.BranchId              = header.BranchId;
            entity.CustomerNumber        = header.CustomerNumber;
            entity.InvoiceNumber         = header.InvoiceNumber;
            entity.OrderDateTime         = header.OrderDateTime;
            entity.DeliveryDate          = header.DeliveryDate.ToDateTime().Value.ToLongDateFormat();
            entity.PONumber              = header.PONumber;
            entity.ControlNumber         = header.ControlNumber;
            entity.OriginalControlNumber = string.IsNullOrEmpty(header.OriginalControlNumber) ? header.ControlNumber.Trim() : header.OriginalControlNumber.Trim();
            entity.OrderStatus           = header.OrderStatus;
            entity.FutureItems           = header.FutureItems;
            entity.ErrorStatus           = header.ErrorStatus;
            entity.RouteNumber           = header.RouteNumber;
            entity.StopNumber            = header.StopNumber;

            return(entity);
        }
コード例 #15
0
 private void ProcessOrderHistoryDetailOnDeletedOrPurgedStatusUpdate(EF.OrderHistoryDetail detail)
 {
     EF.OrderHistoryHeader header = detail.OrderHistoryHeader;
     if (header != null)
     {
         if (header.OrderDetails.Count > 1)
         {
             _detailRepo.Delete(detail);
         }
         else
         {
             _headerRepo.Delete(header);
         }
         _unitOfWork.SaveChanges();
     }
     else
     {
         _detailRepo.Delete(detail);
         _unitOfWork.SaveChanges();
     }
 }
コード例 #16
0
        private EF.OrderHistoryHeader GetHeaderAndMergeCurrentFile(OrderHistoryFile currentFile, bool isSpecialOrder)
        {
            // add retry helper logic to attempt to resolve race conflict
            EF.OrderHistoryHeader header = KeithLink.Svc.Impl.Helpers.Retry.Do <EF.OrderHistoryHeader>
                                               (() => FindHeader(currentFile),
                                               TimeSpan.FromSeconds(1), 3);

            currentFile.Header.MergeWithEntity(ref header);

            // set isSpecialOrder if that is true; but don't set otherwise (used from two places)
            if (isSpecialOrder)
            {
                header.IsSpecialOrder = true;
            }

            if (string.IsNullOrEmpty(header.OriginalControlNumber))
            {
                header.OriginalControlNumber = currentFile.Header.ControlNumber;
            }

            return(header);
        }
コード例 #17
0
        private void DetermineCatalogNotesSpecialOrder(PurchaseOrder po, ref EF.OrderHistoryHeader header)
        {
            //_log.WriteInformationLog("InternalOrderHistoryLogic.PullCatalogFromPurchaseOrderItemsToOrder() LineItems=" +
            //    ((CommerceServer.Foundation.CommerceRelationshipList)po.Properties["LineItems"]).Count);
            string catalogId = null;
            string catalogType;

            if (po.Properties["LineItems"] != null)
            {
                foreach (var lineItem in ((CommerceServer.Foundation.CommerceRelationshipList)po.Properties["LineItems"]))
                {
                    var item = (CS.LineItem)lineItem.Target;
                    catalogId   = item.CatalogName;
                    catalogType = _catalogLogic.GetCatalogTypeFromCatalogId(item.CatalogName);
                }
            }
            // Look for certain catalogs names or at least the start to be one of the special catalogs
            if (catalogId.IndexOf("unfi") > -1)
            {
                header.IsSpecialOrder = true;
            }
        }
コード例 #18
0
        public static Order ToOrderHeaderOnly(this EF.OrderHistoryHeader entity)
        {
            Order order = new Order();

            order.OrderNumber = entity.InvoiceNumber;

            switch (entity.OrderStatus.Trim())
            {
            case "":
                order.Status = "Ordered";
                break;

            case "I":
                order.Status = "Invoiced";
                break;

            case "P":
                order.Status = "Processing";
                break;

            default:
                order.Status = "Unknown";
                break;
            }

            order.CreatedDate          = DateTime.SpecifyKind(entity.CreatedUtc.ToLocalTime(), DateTimeKind.Unspecified);
            order.DeliveryDate         = entity.DeliveryDate.ToDateTime().Value.ToLongDateFormat();
            order.InvoiceNumber        = entity.InvoiceNumber.Trim();
            order.InvoiceStatus        = "N/A";
            order.ItemCount            = entity.OrderDetails == null ? 0 : entity.OrderDetails.Count;
            order.OrderTotal           = (double)entity.OrderDetails.Sum(d => d.ShippedQuantity * d.SellPrice);
            order.RequestedShipDate    = entity.DeliveryDate.ToDateTime().Value.ToLongDateFormat();
            order.IsChangeOrderAllowed = false;
            order.CommerceId           = Guid.Empty;
            FillEtaInformation(entity, order);

            return(order);
        }
コード例 #19
0
        private void RemoveSpecialOrderItemsFromHistory(EF.OrderHistoryHeader order)
        {
            // clean up any previous orders where the special order item existed
            var specialOrderInfo = order.OrderDetails.Where(currentDetail => !String.IsNullOrEmpty(currentDetail.SpecialOrderHeaderId))
                                   .Select(d => new { HeaderId = d.SpecialOrderHeaderId, LineNumber = d.SpecialOrderLineNumber })
                                   .Distinct()
                                   .ToList();

            // loop through each special order item in the current order
            foreach (var specialOrderItem in specialOrderInfo)
            {
                // find all detail records with the current line's special order info that is not the current order
                var specialLines = _detailRepo.Read(d => d.BranchId.Equals(order.BranchId) &&
                                                    d.SpecialOrderHeaderId.Equals(specialOrderItem.HeaderId) &&
                                                    d.SpecialOrderLineNumber.Equals(specialOrderItem.LineNumber) &&
                                                    !d.InvoiceNumber.Equals(order.InvoiceNumber))
                                   .ToList();

                // loop through each found detail record
                foreach (var line in specialLines)
                {
                    _detailRepo.Delete(line);

                    // check to see if there are any more records on the detail's header record
                    if (_detailRepo.Read(d => d.BranchId.Equals(line.BranchId) &&
                                         d.InvoiceNumber.Equals(line.InvoiceNumber))
                        .Any() == false)
                    {
                        _headerRepo.Delete(h => h.BranchId.Equals(line.BranchId) &&
                                           h.InvoiceNumber.Equals(line.InvoiceNumber));
                    }
                }
            }

            // this is commented out so that all updates to EF happen in one transaction for the current order
            //_unitOfWork.SaveChanges();
        }
コード例 #20
0
        public void SaveConfirmationAsOrderHistory(ConfirmationFile confFile)
        {
            if (confFile.Header.ConfirmationStatus.Equals(Constants.CONFIRMATION_HEADER_REJECTED_CODE, StringComparison.InvariantCultureIgnoreCase))
            {
                SaveRejectedConfirmationAsOrderHistory(confFile);
            }
            else
            {
                OrderHistoryFile currentFile = confFile.ToOrderHistoryFile();

                EF.OrderHistoryHeader header = _historyRepo.ReadForInvoice(currentFile.Header.BranchId, currentFile.Header.InvoiceNumber).FirstOrDefault();

                // second attempt to find the order, look by confirmation number
                if (header == null)
                {
                    header = _historyRepo.ReadByConfirmationNumber(currentFile.Header.ControlNumber, currentFile.Header.OrderSystem.ToShortString()).FirstOrDefault();

                    if (header != null)
                    {
                        header.InvoiceNumber = confFile.Header.InvoiceNumber;
                    }
                }

                // last ditch effort is to create a new header
                if (header == null)
                {
                    header = new EF.OrderHistoryHeader();
                    header.OrderDetails = new List <EF.OrderHistoryDetail>();
                }

                currentFile.Header.MergeWithEntity(ref header);

                foreach (OrderHistoryDetail currentDetail in currentFile.Details)
                {
                    EF.OrderHistoryDetail detail = null;

                    if (header.OrderDetails != null && header.OrderDetails.Count > 0)
                    {
                        detail = header.OrderDetails.Where(d => (d.LineNumber == currentDetail.LineNumber)).FirstOrDefault();
                    }

                    if (detail == null)
                    {
                        EF.OrderHistoryDetail tempDetail = currentDetail.ToEntityFrameworkModel();
                        tempDetail.BranchId      = header.BranchId;
                        tempDetail.InvoiceNumber = header.InvoiceNumber;

                        header.OrderDetails.Add(currentDetail.ToEntityFrameworkModel());
                    }
                    else
                    {
                        currentDetail.MergeWithEntityFrameworkModel(ref detail);

                        detail.BranchId      = header.BranchId;
                        detail.InvoiceNumber = header.InvoiceNumber;
                    }
                }

                //Mark missing items as deleted
                foreach (var deletedItem in header.OrderDetails.Where(d => !currentFile.Details.Any(c => c.LineNumber.Equals(d.LineNumber))).ToList())
                {
                    deletedItem.ItemDeleted     = true;
                    deletedItem.OrderQuantity   = 0;
                    deletedItem.ShippedQuantity = 0;
                }

                GetSubtotal(header);

                _historyRepo.CreateOrUpdate(header);
                _uow.SaveChangesAndClearContext();
            }
        }
コード例 #21
0
        public static Order ToOrder(this EF.OrderHistoryHeader entity)
        {
            Order order = new Order();

            //retVal.OrderNumber = value.InvoiceNumber;
            order.OrderNumber = entity.ControlNumber;

            switch (entity.OrderStatus.Trim())
            {
            case "":
                order.Status = "Ordered";
                break;

            case "I":
                order.Status = "Invoiced";
                break;

            case "P":
                order.Status = "Processing";
                break;

            case "D":
                order.Status = "Deleted";
                break;

            default:
                break;
            }

            order.CreatedDate = DateTime.SpecifyKind(entity.CreatedUtc.ToLocalTime(), DateTimeKind.Unspecified);

            if (string.IsNullOrWhiteSpace(entity.OrderDateTime) == false)
            {
                var orderDateTime = entity.OrderDateTime.ToDateTime();
                if (orderDateTime.HasValue)
                {
                    order.CreatedDate = orderDateTime.Value;
                }
            }

            order.DeliveryDate  = entity.DeliveryDate.ToDateTime().Value.ToLongDateFormat();
            order.InvoiceNumber = entity.InvoiceNumber.Trim();
            order.InvoiceStatus = "N/A";
            order.ItemCount     = entity.OrderDetails == null ? 0 : entity.OrderDetails.Count;

            order.RequestedShipDate    = entity.DeliveryDate.ToDateTime().Value.ToLongDateFormat();
            order.IsChangeOrderAllowed = false;
            order.CommerceId           = Guid.Empty;
            FillEtaInformation(entity, order);
            order.PONumber       = entity.PONumber;
            order.IsSpecialOrder = entity.IsSpecialOrder;
            order.OrderTotal     = (double)entity.OrderSubtotal;

            order.OrderSystem = new OrderSource().Parse(entity.OrderSystem).ToString();

            if (entity.OrderDetails != null && entity.OrderDetails.Count > 0)
            {
                var lineItems = new BlockingCollection <OrderLine>();

                Parallel.ForEach(entity.OrderDetails, d =>
                {
                    lineItems.Add(d.ToOrderLine(entity.OrderStatus));
                });

                order.Items = lineItems.OrderBy(i => i.LineNumber).ToList();
            }

            return(order);
        }
コード例 #22
0
 private void RecalcOrderSubtotal(OrderHistoryFile currentFile, EF.OrderHistoryHeader header)
 {
     // since we keep an ordersubtotal in the header, we need to recalibrate it (especially for catchweight items) when processing order updates
     LookupAverageWeightOnDetails(currentFile);
     header.OrderSubtotal = (decimal)currentFile.Details.Sum(i => i.LineTotal);
 }