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