예제 #1
0
        private void ProcessResponse(XmlDocument responseString, string prefix)
        {
            object ediDocument   = null;
            int    bskIdentifier = 0;

            switch (prefix)
            {
            case "OrderResponse":
                ediDocument   = ExtractResponseMessage <OrderResponse>(responseString);
                bskIdentifier = ((OrderResponse)ediDocument).OrderHeader.BSKIdentifier;
                break;

            case "ShippingNotification":
                ediDocument   = ExtractResponseMessage <ShippingNotification>(responseString);
                bskIdentifier = ((ShippingNotification)ediDocument).ShipmentOrderHeader.BSKIdentifier;

                break;

            case "InvoiceNotification":
                ediDocument   = ExtractResponseMessage <InvoiceNotification>(responseString);
                bskIdentifier = ((InvoiceNotification)ediDocument).InvoiceOrderHeader.BSKIdentifier;
                break;

            case "Statuses":
                ediDocument = XDocument.Parse(responseString.OuterXml);
                break;
            }

            Connector connector = null;

            using (var unit = GetUnitOfWork())
            {
                if (bskIdentifier != 0)
                {
                    connector = unit.Scope.Repository <Connector>().GetSingle(x => x.BSKIdentifier == bskIdentifier);
                }
                else
                {
                    if (ediDocument != null)
                    {
                        var connectorid = int.Parse(((XDocument)ediDocument).Root.Attribute("ConnectorID").Value);
                        connector = unit.Scope.Repository <Connector>().GetSingle(x => x.ConnectorID == connectorid);
                    }
                }

                if (connector == null)
                {
                    string bsk     = bskIdentifier.ToString();
                    var    setting = unit.Scope.Repository <ConnectorSetting>().GetSingle(x => x.SettingKey == "ShopOrderBSK" && x.Value == bsk);

                    if (setting != null)
                    {
                        connector = setting.Connector;
                    }

                    if (connector == null)
                    {
                        log.WarnFormat("Process response failed for {0} message", prefix);
                        return;
                    }
                }
            }

            OrderHelper      helper = new OrderHelper(connector.Connection);
            sales_flat_order order  = null;

            switch (prefix)
            {
            case "OrderResponse":
                OrderResponse ediResponse = ediDocument as OrderResponse;



                order = helper.GetSalesOrder(ediResponse.OrderHeader.WebSiteOrderNumber);

                if (order != null)
                {
                    order.state  = "processing";
                    order.status = "concentrator";


                    log.Info("For order " + order.increment_id + " updating the status to concentrator ");
                    helper.UpdateOrderStatus(ediResponse.OrderHeader.WebSiteOrderNumber, MagentoOrderState.Processing, MagentoOrderStatus.concentrator);

                    int cancelledlines = 0;
                    int backorderLines = 0;
                    int lines          = 0;

                    foreach (var line in ediResponse.OrderDetails)
                    {
                        //var responseLine = (from r in mctx.sales_flat_order_item
                        //                    where r.item_id == line.LineNumber
                        //                    select r).FirstOrDefault();



                        helper.UpdateOrderLine(order, line);
                        lines++;
                        var lineEntity = helper.GetOrderLine(order, line.ProductIdentifier.ManufacturerItemID);

                        //if (responseLine != null)
                        //{
                        //  lines++;

                        if (line.Quantity.QuantityCancelled > 0)
                        {
                            cancelledlines++;
                        }

                        if (line.Quantity.QuantityBackordered > 0)
                        {
                            backorderLines++;
                        }
                    }

                    #region REPLACED WITH FUNCTION : DiSCUSS WITH FREEK

                    //if (cancelledlines == lines)
                    //{
                    //  // helper.UpdateOrderStatus(order.increment_id, MagentoOrderState.canceled, MagentoOrderStatus.canceled);
                    //  log.Info("For order " + order.increment_id + " , trying to call the cancel shipment url ");
                    //  if (((ConnectorSystemType)connector.ConnectorSystemType).Has(ConnectorSystemType.CallShipmentLink))
                    //  {

                    //    int ediOrderLines = ediResponse.OrderDetails.Count();

                    //    var isIgnorable = (ediOrderLines == 1 && (ediResponse.OrderDetails.First().ProductIdentifier.ProductNumber.ToLower() == "ShippingCostProductID_IDEAL".ToLower() || ediResponse.OrderDetails.First().ProductIdentifier.ProductNumber.ToLower() == "ShippingCostProductID_CREDITCARD".ToLower()));
                    //    if (!isIgnorable)
                    //    {
                    //      string url = connector.ConnectorSettings.GetValueByKey("CancelShipmentUrl", string.Empty);
                    //      if (!string.IsNullOrEmpty(url))
                    //      {
                    //        var skus = new Dictionary<string, int>();
                    //        StringBuilder sb = new StringBuilder();


                    //        for (int i = 0; i < ediOrderLines; i++)
                    //        {
                    //          var line = ediResponse.OrderDetails[i];

                    //          sb.Append(HttpUtility.HtmlEncode(line.ProductIdentifier.ManufacturerItemID) + "," + line.Quantity.QuantityShipped);
                    //          if (i != ediOrderLines - 1) sb.Append(";");
                    //        }

                    //        ///basstock/shipment/shippartialorder/order_id/100000342/items/SKU1,5;SKU2,7/trackin_code/123,2345

                    //        url = string.Format(url, ediResponse.OrderHeader.WebSiteOrderNumber, HttpUtility.UrlEncode(sb.ToString()));
                    //        log.Info("For order " + order.increment_id + " , called cancel shipment url " + url);
                    //        WebRequest req = WebRequest.Create(url);
                    //        using (WebResponse resp = req.GetResponse())
                    //        {
                    //          log.AuditInfo("Url for partial shipment called for " + connector.Name + " returned:" + (((HttpWebResponse)resp).StatusDescription));
                    //        }
                    //      }
                    //    }
                    //  }
                    //}

                    #endregion

                    if (cancelledlines > 0)
                    {
                        int totalLines = 0;
                        totalLines = helper.GetOrderLinesCount(order, true);
                        CancelItems(order, connector, ediResponse, cancelledlines, totalLines, helper);
                    }

                    //if (backorderLines == lines)
                    //{
                    //  //helper.UpdateOrderStatus(order.increment_id, MagentoOrderState.Processing, MagentoOrderStatus.backorder);
                    //}
                }
                log.DebugFormat("Processed OrderResponse for order {0} (Connector : {1})", ediResponse.OrderHeader.WebSiteOrderNumber, connector.Name);

                break;

            case "ShippingNotification":
                ShippingNotification ediShipment = ediDocument as ShippingNotification;
                log.Info("Shipment order for " + ediShipment.ShipmentOrderHeader.WebSiteOrderNumber);

                bool shopOrder = false;
                order = helper.GetSalesOrder(ediShipment.ShipmentOrderHeader.WebSiteOrderNumber);


                if (order != null)
                {
                    if (ediShipment.ShipmentOrderHeader.CustomerOrder.Contains("Winkel#") ||
                        ediShipment.ShipmentOrderHeader.CustomerOrder.Contains("#winkel"))
                    {
                        shopOrder = true;
                    }

                    int cancelledlines = 0;
                    int lines          = 0;
                    foreach (var line in ediShipment.ShipmentOrderDetails)
                    {
                        long lineNumber = 0;

                        if (long.TryParse(line.LineNumber, out lineNumber))
                        {
                            var responseLine = helper.GetOrderLine(order, line.ProductIdentifier.ManufacturerItemID);

                            if (responseLine != null)
                            {
                                lines++;

                                if (line.Quantity.QuantityCancelled > 0)
                                {
                                    cancelledlines++;
                                }

                                helper.UpdateOrderLine(order, line);
                            }
                        }
                    }

                    log.Info("Number of cancelled lines " + cancelledlines);

                    log.Info("For order " + order.increment_id + " trying to call shipment url");
                    if (((ConnectorSystemType)connector.ConnectorSystemType).Has(ConnectorSystemType.CallShipmentLink))
                    {
                        int ediOrderLines = ediShipment.ShipmentOrderDetails.Count();

                        JsonOrder orderJson = new JsonOrder();
                        orderJson.id             = order.increment_id;
                        orderJson.tracking_codes = ediShipment.ShipmentOrderDetails.Select(x => x.ShipmentInformation.TrackAndTraceNumber).Distinct().ToArray();
                        orderJson.lines          = new JsonOrderLine[ediOrderLines];

                        var isIgnorable = (ediOrderLines == 1 && (ediShipment.ShipmentOrderDetails.First().ProductIdentifier.ManufacturerItemID.ToLower() == "ShippingCostProductID_IDEAL".ToLower() || ediShipment.ShipmentOrderDetails.First().ProductIdentifier.ManufacturerItemID.ToLower() == "ShippingCostProductID_CREDITCARD".ToLower()));
                        if (!isIgnorable)
                        {
                            string url = connector.ConnectorSettings.GetValueByKey("SCBUrl", string.Empty);
                            if (!string.IsNullOrEmpty(url))
                            {
                                var skus = new Dictionary <string, int>();

                                for (int i = 0; i < ediOrderLines; i++)
                                {
                                    var line = ediShipment.ShipmentOrderDetails[i];

                                    orderJson.lines[i] = new JsonOrderLine()
                                    {
                                        lineid = line.ProductIdentifier.ManufacturerItemID,
                                        qty    = line.Quantity.QuantityShipped,
                                        status = "S"
                                    };
                                }

                                SendGenericUpdate(orderJson, connector, helper);
                            }
                        }
                    }
                }

                log.DebugFormat("Processed ShippingNotification for order {0} (Connector : {1})", ediShipment.ShipmentOrderHeader.WebSiteOrderNumber, connector.Name);

                break;

            case "InvoiceNotification":
                InvoiceNotification ediInvoice = ediDocument as InvoiceNotification;

                order = helper.GetSalesOrder(ediInvoice.InvoiceOrderHeader.WebSiteOrderNumber);

                if (order != null)
                {
                    foreach (var line in ediInvoice.InvoiceOrderDetails)
                    {
                        long lineNumber = 0;

                        if (long.TryParse(line.LineNumber, out lineNumber))
                        {
                            var responseLine = helper.GetOrderLine(order, line.ProductIdentifier.ManufacturerItemID);

                            if (responseLine != null)
                            {
                                helper.UpdateOrderLine(order, line);
                            }
                        }
                    }
                }
                log.DebugFormat("Processed InvoiceNotification for order {0} (Connector : {1})", ediInvoice.InvoiceOrderHeader.WebSiteOrderNumber, connector.Name);

                break;

            case "Statuses":
                string websiteOrderNumber = ((XDocument)ediDocument).Root.Attribute("WebsiteOrderNumber").Value;

                Dictionary <string, string> urls = new Dictionary <string, string>();

                var statuses = ((XDocument)ediDocument).Root.Elements("Status").GroupBy(x => x.Element("StatusDescription").Value).ToArray();

                foreach (var statusGroup in statuses)
                {
                    var count     = statusGroup.Count();
                    var statusId  = statusGroup.Key;
                    var statusUrl = connector.ConnectorSettings.GetValueByKey(statusGroup.Key, string.Empty);

                    JsonOrder ord = new JsonOrder();
                    ord.id             = websiteOrderNumber;
                    ord.tracking_codes = new string[0];
                    ord.lines          = new JsonOrderLine[count];

                    int c = 0;

                    foreach (var stat in statusGroup)
                    {
                        ord.lines[c] = new JsonOrderLine()
                        {
                            lineid = stat.Element("VendorItemNumber").Value,
                            qty    = int.Parse(stat.Element("Quantity").Value),
                            status = statusId[0].ToString().ToUpper()
                        };
                        c++;
                    }
                    SendGenericUpdate(ord, connector, helper, statusUrl);
                }
                break;
            }
        }
예제 #2
0
        public InvoiceNotification GenerateInvoiceNotification(EdiOrderResponse response, IEdiProcessor processor, System.Configuration.Configuration config)
        {
            List <EdiOrderResponseLine> responseLines = response.EdiOrderResponseLines.ToList();
            EdiOrder order = response.EdiOrder;

            if (order == null)
            {
                order = processor.GetOrderInformation(response, config);
            }

            List <InvoiceOrderDetail> replyItems = new List <InvoiceOrderDetail>();

            foreach (var line in responseLines)
            {
                InvoiceOrderDetail lineItem = new InvoiceOrderDetail();
                if (line.EdiOrderLineID.HasValue)
                {
                    lineItem.ProductIdentifier = new Concentrator.Web.Objects.EDI.ProductIdentifier();
                    lineItem.ProductIdentifier.ProductNumber = line.EdiOrderLine.ProductID.HasValue ? line.EdiOrderLine.ProductID.Value.ToString() : line.EdiOrderLine.CustomerItemNumber;
                    //lineItem.ProductIdentifier.ManufacturerItemID = line.EdiOrderLine.ProductID.HasValue ? line.EdiOrderLine.Product.VendorItemNumber : string.Empty;
                    //if (line.EdiOrderLine.ProductID.HasValue && line.EdiOrderLine.Product.ProductBarcodes.Count > 0)
                    //  lineItem.ProductIdentifier.EANIdentifier = line.EdiOrderLine.Product.ProductBarcodes.FirstOrDefault().Barcode;

                    lineItem.CustomerReference = new Concentrator.Web.Objects.EDI.CustomerReference();
                    lineItem.CustomerReference.CustomerItemNumber = line.EdiOrderLine.CustomerItemNumber;
                    lineItem.CustomerReference.CustomerOrder      = line.EdiOrderLine.CustomerOrderNr;
                    lineItem.CustomerReference.CustomerOrderLine  = line.EdiOrderLine.CustomerEdiOrderLineNr;
                    lineItem.LineNumber = line.EdiOrderLineID.ToString();
                }
                else
                {
                    lineItem.ProductIdentifier = new Concentrator.Web.Objects.EDI.ProductIdentifier();
                    lineItem.ProductIdentifier.ProductNumber = line.VendorItemNumber;
                    //lineItem.ProductIdentifier.ManufacturerItemID = line.EdiOrderLine.ProductID.HasValue ? line.EdiOrderLine.Product.VendorItemNumber : string.Empty;
                    //if (line.EdiOrderLine.ProductID.HasValue && line.EdiOrderLine.Product.ProductBarcodes.Count > 0)
                    //  lineItem.ProductIdentifier.EANIdentifier = line.EdiOrderLine.Product.ProductBarcodes.FirstOrDefault().Barcode;

                    lineItem.CustomerReference = new Concentrator.Web.Objects.EDI.CustomerReference();
                    lineItem.CustomerReference.CustomerItemNumber = string.Empty;
                    lineItem.CustomerReference.CustomerOrder      = line.Remark;
                    lineItem.CustomerReference.CustomerOrderLine  = line.VendorLineNumber;
                }

                if (line.DeliveryDate.HasValue)
                {
                    lineItem.PromissedDeliveryDate = line.DeliveryDate.Value;
                }

                if (line.RequestDate.HasValue)
                {
                    lineItem.RequestedDate = line.RequestDate.Value;
                }
                else if (order.RequestDate.HasValue)
                {
                    lineItem.RequestedDate = order.RequestDate.Value;
                }

                lineItem.Quantity = new Quantity();
                lineItem.Quantity.QuantityBackordered          = line.Backordered;
                lineItem.Quantity.QuantityBackorderedSpecified = true;
                lineItem.Quantity.QuantityCancelled            = line.Cancelled;
                lineItem.Quantity.QuantityCancelledSpecified   = true;
                lineItem.Quantity.QuantityOrdered          = line.Ordered;
                lineItem.Quantity.QuantityShipped          = line.Invoiced;
                lineItem.Quantity.QuantityShippedSpecified = true;

                if (string.IsNullOrEmpty(line.EdiOrderResponse.VendorDocumentNumber))
                {
                    lineItem.StatusCode = StatusCode.Reject;
                }
                else if (line.Cancelled == line.Ordered)
                {
                    lineItem.StatusCode = StatusCode.Delete;
                }
                else if (line.Ordered != line.Shipped)
                {
                    lineItem.StatusCode = StatusCode.Change;
                }
                else
                {
                    lineItem.StatusCode = StatusCode.Accept;
                }

                if (line.VatAmount.HasValue)
                {
                    lineItem.TaxAmount = line.VatAmount.Value;
                }

                lineItem.UnitOfMeasure = InvoiceOrderDetailUnitOfMeasure.EA;
                lineItem.UnitPrice     = line.Price;

                lineItem.ShipmentInformation                     = new ShipmentInformation();
                lineItem.ShipmentInformation.CarrierCode         = line.CarrierCode;
                lineItem.ShipmentInformation.NumberOfColli       = line.NumberOfUnits.HasValue ? line.NumberOfUnits.Value.ToString() : "1";
                lineItem.ShipmentInformation.NumberOfPallet      = line.NumberOfPallets.HasValue ? line.NumberOfPallets.Value.ToString() : "0";
                lineItem.ShipmentInformation.TrackAndTraceNumber = line.TrackAndTrace;

                lineItem.ExtendedPrice          = line.Price;
                lineItem.ExtendedPriceSpecified = false;

                lineItem.InvoiceNumber = response.InvoiceDocumentNumber;
                if (!string.IsNullOrEmpty(line.SerialNumbers))
                {
                    lineItem.SerialNumbers = line.SerialNumbers.Split(';');
                }

                replyItems.Add(lineItem);
            }

            InvoiceOrderHeader header = new InvoiceOrderHeader()
            {
                BSKIdentifier          = order.ConnectorRelationID.HasValue ? order.ConnectorRelationID.Value : 0,
                CustomerOrder          = order.CustomerOrderReference,
                OrderNumber            = response.VendorDocumentNumber,
                RequestedDate          = response.ReqDeliveryDate.HasValue ? response.ReqDeliveryDate.Value : order.ReceivedDate,
                RequestedDateSpecified = response.ReqDeliveryDate.HasValue,
                WebSiteOrderNumber     = order.WebSiteOrderNumber,
            };

            header.PackingInformation = new PackingInformation();
            header.PackingInformation.PackingDateTime = response.ReceiveDate;
            header.PackingInformation.PackingNumber   = response.ShippingNumber;

            if (response.PartialDelivery.HasValue && response.PartialDelivery.Value)
            {
                header.FullfillmentCode = InvoiceOrderHeaderFullfillmentCode.Partial;
            }
            else
            {
                header.FullfillmentCode = InvoiceOrderHeaderFullfillmentCode.Complete;
            }

            if (response.ShippedToCustomer != null)
            {
                header.ShipToCustomer   = FillShipToCustomer(response.ShippedToCustomer);
                header.CustomerOverride = FillCustomerOverride(response.ShippedToCustomer);
            }
            else
            {
                header.ShipToCustomer   = FillShipToCustomer(order.ShippedToCustomer);
                header.CustomerOverride = FillCustomerOverride(order.ShippedToCustomer);
            }

            if (response.SoldToCustomer != null)
            {
                header.SoldToCustomer = FillShipToCustomer(response.SoldToCustomer);
            }
            else
            {
                header.SoldToCustomer = FillShipToCustomer(order.SoldToCustomer);
            }

            if (response.InvoiceDate.HasValue)
            {
                header.InvoiceDate = response.InvoiceDate.Value;
            }

            header.InvoiceNumber = response.InvoiceDocumentNumber;
            if (response.VatAmount.HasValue)
            {
                header.InvoiceTax = response.VatAmount.Value.ToString();
            }
            if (response.TotalExVat.HasValue)
            {
                header.InvoiceTaxableAmount = response.TotalExVat.Value.ToString();
            }
            if (response.TotalAmount.HasValue)
            {
                header.InvoiceTotalInc = response.TotalAmount.Value.ToString();
            }
            if (!string.IsNullOrEmpty(response.PaymentConditionDiscount))
            {
                header.DisountAmount = response.PaymentConditionDiscount;
            }

            InvoiceNotification invoiceNotification = new InvoiceNotification()
            {
                InvoiceOrderDetails = replyItems.ToArray(),
                InvoiceOrderHeader  = header,
                Version             = "1.0"
            };

            return(invoiceNotification);
        }