public async Task <Stream> UploadSalesOrderAsync(MemoryStream memoryStream) { IDictionary <Stream, string> streams = new Dictionary <Stream, string>(); using (ZipArchive archive = new ZipArchive(memoryStream)) { var headerStream = archive.Entries.SingleOrDefault(x => x.FullName.Equals("sales_order_header.csv")).Open(); var lineStream = archive.Entries.SingleOrDefault(x => x.FullName.Equals("sales_order_lines.csv")).Open(); streams.Add(headerStream, "sales_order_header.csv"); streams.Add(lineStream, "sales_order_lines.csv"); var headerRecords = new List <SalesOrderHeader>(); var lineItemRecords = new List <SalesOrderLine>(); foreach (var stream in streams) { using (var reader = new StreamReader(stream.Key)) using (var csv = new CsvReader(reader)) { if (stream.Value.Equals("sales_order_header.csv")) { csv.Configuration.RegisterClassMap <SalesOrderHeaderMapping>(); headerRecords.AddRange(csv.GetRecords <SalesOrderHeader>()); } else { csv.Configuration.RegisterClassMap <BulkSalesOrderLineMapping>(); lineItemRecords.AddRange(csv.GetRecords <SalesOrderLine>()); } } } SalesOrderList salesOrders = new SalesOrderList(); foreach (var header in headerRecords) { //var provider = new CultureInfo("en-GB"); var startDate = DateTime.ParseExact(header.StartDate, "dd/MM/yyyy", CultureInfo.InvariantCulture); var postingDate = DateTime.ParseExact(header.PostingDate, "dd/MM/yyyy", CultureInfo.InvariantCulture); var salesOrder = new SalesOrder(); salesOrder.ObjectNodeSenderTechnicalID = header.ExternalReference; salesOrder.Name.Text = header.Name; salesOrder.DataOriginTypeCode = "4"; salesOrder.DeliveryTerms.DeliveryPriorityCode = GetDeliveryPriorityValue(header.DeliveryPriorityCode); salesOrder.SalesAndServiceBusinessArea.DistributionChannelCode = GetDistributionChannelValue(header.DistributionChannelCode); salesOrder.SalesUnitParty.PartyID = header.SalesUnitPartyId; salesOrder.BillToParty.PartyID = header.BuyerPartyId; salesOrder.AccountParty.PartyID = header.BuyerPartyId; salesOrder.PricingTerms.GrossAmountIndicator = "false"; salesOrder.RequestedFulfillmentPeriodPeriodTerms.StartDateTime.Text = Convert.ToDateTime(startDate).ToString("s") + "Z"; salesOrder.RequestedFulfillmentPeriodPeriodTerms.StartDateTime.TimeZoneCode = "UTC+1"; salesOrder.PostingDate = Convert.ToDateTime(postingDate).ToString("s") + "Z"; salesOrder.EmployeeResponsibleParty.PartyID = header.EmployeeResponsible; //salesOrder.RequestedFulfillmentPeriodPeriodTerms.EndDateTime.Text = endDate.ToString("yyyy-MM-dd"); var lineItems = lineItemRecords.FindAll(x => x.ExternalReference == header.ExternalReference); foreach (var line in lineItems) { int lineItemId = 10; var item = new Models.SalesOrders.Item(); item.ID = lineItemId.ToString(); item.ProcessingTypeCode = "TAN"; item.ItemProduct.ProductID = line.ProductId; item.ItemScheduleLine.Quantity.Text = line.Quantity; item.ItemScheduleLine.Quantity.UnitCode = line.QuantityUnitCode; item.PriceAndTaxCalculationItem.TaxationCharacteristicsCode.Text = line.TaxCode; item.PriceAndTaxCalculationItem.TaxationCharacteristicsCode.ListID = "1"; item.ShipFromItemLocation.LocationID.Text = line.ShipFromLocationId; salesOrder.Items.Add(item); lineItemId = lineItemId + 10; } salesOrders.SalesOrders.Add(salesOrder); } //var soJson = HelperExtensions.SerializeObject(salesOrders.SalesOrders); var salesOrderXml = HelperExtensions.SerializeToXml(salesOrders); //read createxml file string filePath = Path.Combine(HostingEnvironment.ContentRootPath, "xmlfiles/salesOrder.xml"); //merge xml files XmlDocument doc = new XmlDocument(); doc.Load(filePath); var nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("soapenv", "http://schemas.xmlsoap.org/soap/envelope/"); nsmgr.AddNamespace("glob", "http://sap.com/xi/SAPGlobal20/Global"); var element = doc.SelectSingleNode("/soapenv:Envelope/soapenv:Body/glob:SalesOrderBundleMaintainRequest_sync", nsmgr); if (element != null) { var subDoc = new XmlDocument(); subDoc.LoadXml(salesOrderXml); var nsmgr1 = new XmlNamespaceManager(subDoc.NameTable); nsmgr1.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema"); nsmgr1.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); var salesOrderListNodes = subDoc.SelectNodes("//SalesOrderList/SalesOrder", nsmgr1); var sb = new StringBuilder(); foreach (XmlNode child in salesOrderListNodes) { sb.AppendLine("<SalesOrder>"); sb.AppendLine(child.InnerXml); sb.AppendLine("</SalesOrder>"); } var res = sb.ToString(); element.InnerXml = sb.ToString(); var basicMsgNode = doc.CreateNode(XmlNodeType.Element, "BasicMessageHeader", null); XmlNode salesOrderNode = doc.SelectSingleNode("//SalesOrder"); element.InsertBefore(basicMsgNode, salesOrderNode); doc.Save(filePath); StreamReader sr = new StreamReader(filePath); string soapXml = sr.ReadToEnd(); sr.Close(); var tenantSetting = await _tenantSettingService.GetSetting(); UriBuilder urlBuilder = new UriBuilder(tenantSetting.BaseUrl) { Path = "/sap/bc/srt/scs/sap/managesalesorderin5" }; var request = new HttpRequestMessage(HttpMethod.Post, urlBuilder.ToString()); request.Headers.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/xml")); var byteArray = Encoding.ASCII.GetBytes($"{tenantSetting.User}:{tenantSetting.Password}"); request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); request.Content = new StringContent(soapXml, Encoding.UTF8, "text/xml"); var response = await _client.HttpClient.SendAsync(request); if (response.IsSuccessStatusCode) { var responseData = await response.Content.ReadAsStreamAsync(); return(responseData); } } } return(null); }
public async Task <Tuple <int, Stream> > UploadSingleSalesOrderAsync(MemoryStream memoryStream) { using (var reader = new StreamReader(memoryStream)) using (var csv = new CsvReader(reader)) { csv.Configuration.IgnoreBlankLines = false; csv.Configuration.RegisterClassMap <SalesOrderHeaderMapping>(); csv.Configuration.RegisterClassMap <SalesOrderLineMapping>(); var headerRecords = new List <SalesOrderHeader>(); var lineItemRecords = new List <SalesOrderLine>(); var isHeader = true; while (csv.Read()) { if (isHeader) { csv.ReadHeader(); isHeader = false; continue; } if (string.IsNullOrEmpty(csv.GetField(0))) { isHeader = true; continue; } switch (csv.Context.HeaderRecord[0]) { case "ExternalReference": headerRecords.Add(csv.GetRecord <SalesOrderHeader>()); break; case "ProductId": lineItemRecords.Add(csv.GetRecord <SalesOrderLine>()); break; default: throw new InvalidOperationException("Unknown record type."); } } SalesOrderList salesOrders = new SalesOrderList(); foreach (var header in headerRecords) { //var provider = new CultureInfo("en-GB"); var startDate = DateTime.ParseExact(header.StartDate, "dd/MM/yyyy", CultureInfo.InvariantCulture); var endDate = DateTime.ParseExact(header.EndDate, "dd/MM/yyyy", CultureInfo.InvariantCulture); var salesOrder = new SalesOrder(); salesOrder.ObjectNodeSenderTechnicalID = header.ExternalReference; salesOrder.Name.Text = header.Name; salesOrder.DataOriginTypeCode = header.DataOriginTypeCode; salesOrder.DeliveryTerms.DeliveryPriorityCode = header.DeliveryPriorityCode; salesOrder.SalesUnitParty.PartyID = header.SalesUnitPartyId; salesOrder.BillToParty.PartyID = header.BuyerPartyId; salesOrder.PricingTerms.GrossAmountIndicator = "false"; salesOrder.RequestedFulfillmentPeriodPeriodTerms.StartDateTime.Text = startDate.ToString("yyyy-MM-dd"); salesOrder.RequestedFulfillmentPeriodPeriodTerms.EndDateTime.Text = endDate.ToString("yyyy-MM-dd"); var lineItems = lineItemRecords.FindAll(x => x.ExternalReference == header.ExternalReference); foreach (var line in lineItems) { int lineItemId = 10; var item = new Models.SalesOrders.Item(); item.ID = lineItemId.ToString(); item.ProcessingTypeCode = line.ProcessingTypeCode; item.ItemProduct.ProductID = line.ProductId; item.ItemScheduleLine.Quantity.Text = line.Quantity; item.ItemScheduleLine.Quantity.UnitCode = line.QuantityUnitCode; salesOrder.Items.Add(item); lineItemId += 10; } salesOrders.SalesOrders.Add(salesOrder); } //var soJson = HelperExtensions.SerializeObject(salesOrders.SalesOrders); var salesOrderXml = HelperExtensions.SerializeToXml(salesOrders); //read createxml file string filePath = Path.Combine(HostingEnvironment.ContentRootPath, "xmlfiles/salesOrder.xml"); //merge xml files XmlDocument doc = new XmlDocument(); doc.Load(filePath); var nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("soapenv", "http://schemas.xmlsoap.org/soap/envelope/"); nsmgr.AddNamespace("glob", "http://sap.com/xi/SAPGlobal20/Global"); var element = doc.SelectSingleNode("/soapenv:Envelope/soapenv:Body/glob:SalesOrderBundleMaintainRequest_sync", nsmgr); if (element != null) { var subDoc = new XmlDocument(); subDoc.LoadXml(salesOrderXml); var nsmgr1 = new XmlNamespaceManager(subDoc.NameTable); nsmgr1.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema"); nsmgr1.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); var salesOrderListNodes = subDoc.SelectNodes("//SalesOrderList/SalesOrder", nsmgr1); var sb = new StringBuilder(); foreach (XmlNode child in salesOrderListNodes) { sb.AppendLine("<SalesOrder>"); sb.AppendLine(child.InnerXml); sb.AppendLine("</SalesOrder>"); } var res = sb.ToString(); element.InnerXml = sb.ToString(); var basicMsgNode = doc.CreateNode(XmlNodeType.Element, "BasicMessageHeader", null); XmlNode salesOrderNode = doc.SelectSingleNode("//SalesOrder"); element.InsertBefore(basicMsgNode, salesOrderNode); doc.Save(filePath); StreamReader sr = new StreamReader(filePath); string soapXml = sr.ReadToEnd(); sr.Close(); var tenantSetting = await _tenantSettingService.GetSetting(); UriBuilder urlBuilder = new UriBuilder(tenantSetting.BaseUrl) { Path = "/sap/bc/srt/scs/sap/managesalesorderin5" }; var request = new HttpRequestMessage(HttpMethod.Post, urlBuilder.ToString()); request.Headers.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/xml")); var byteArray = Encoding.ASCII.GetBytes($"{tenantSetting.User}:{tenantSetting.Password}"); request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); request.Content = new StringContent(soapXml, Encoding.UTF8, "text/xml"); var response = await _client.HttpClient.SendAsync(request); if (response.IsSuccessStatusCode) { var responseData = await response.Content.ReadAsStreamAsync(); return(Tuple.Create((int)response.StatusCode, responseData)); } var errorResponse = await response.Content.ReadAsStreamAsync(); return(Tuple.Create((int)response.StatusCode, errorResponse)); } } return(null); }