using HRM_MQ_Consumer_Service.OData; using System; using System.Threading.Tasks; using System.Xml; namespace HRM_MQ_Consumer_Service.Parsers { internal class CounterpartyXMLParser { private Logger.Logger _logger; private static QDocWrapper _wrapper; public CounterpartyXMLParser() { _logger = new Logger.Logger("Counterparties_test"); _wrapper = new QDocWrapper(_logger); } public async Task Parse(string message) { var package = new PackageInfo(); var xml = new XmlDocument(); xml.LoadXml(message); XmlElement xRoot = xml.DocumentElement; XmlNodeList nodes = xRoot.SelectNodes("*"); package = GetPackageInfo(nodes, package); foreach (var counterparty in package.AllLoadedComp) { if (counterparty.UpdCounterparty != null) { await _wrapper.UpdateCounterparty(counterparty); } else { await _wrapper.CreateCounterparty(counterparty); } } _logger.Info("Package loading complete."); return true; } private static PackageInfo GetPackageInfo(XmlNodeList nodeList, PackageInfo packageInfo) { foreach (XmlNode node in nodeList) { packageInfo = RecurseXmlDocumentNoSiblings(node, packageInfo); } return packageInfo; } private static PackageInfo RecurseXmlDocumentNoSiblings(XmlNode root, PackageInfo packageInfo) { if (root is XmlElement) { if (root.HasChildNodes) return RecurseXmlDocument(root.FirstChild, packageInfo).Result; } return packageInfo; } private static async Task RecurseXmlDocument(XmlNode root, PackageInfo packageInfo) { if (root is XmlElement) { if (root.Name == "m:Дата") // Dialogs.NotifyMessage("Дата отправки пакета " + root.InnerText); packageInfo.DateReceived = DateTime.Parse(root.InnerText); if (root.Name == "m:Номер") // Dialogs.NotifyMessage("Номер пакета " + root.InnerText); packageInfo.Id = root.InnerText; if (root.Name == "m:Объекты") { XmlNodeList allObjLoad = root.ChildNodes; if (allObjLoad.Count > 0) { //"Осуществляется загрузка контрагентов со следующими параметрами:" foreach (XmlNode item in allObjLoad) { CounterParty tempCompany = null; tempCompany = new CounterParty(); foreach (XmlNode Countparty in item.ChildNodes) { if (Countparty.Name == "m:Тип" && Countparty.InnerText != "Справочник.Контрагенты") { //$"Это не контрагент, тип {Countparty.InnerText}" packageInfo.ErrorsList.Add($"Это не контрагент, тип {Countparty.InnerText}"); continue; } if (Countparty.Name == "m:Реквизиты") { foreach (XmlNode CountpartyOthers in Countparty.ChildNodes) { string tempKey = CountpartyOthers.ChildNodes[0].InnerText; string tempValue = CountpartyOthers.ChildNodes[1].Name == "m:ЗначениеСсылка" ? CountpartyOthers.ChildNodes[1].ChildNodes[1].InnerText : CountpartyOthers.ChildNodes[1].InnerText; switch (tempKey) { case "Наименование": tempCompany.Name = tempValue; break; case "ГоловнойКонтрагент": tempCompany.GeneralCompany = tempValue; break; case "НаименованиеПолное": tempCompany.LegalName = tempValue; break; case "Код": tempCompany.Code = tempValue; break; case "БИН": tempCompany.Bin = tempValue; break; case "ЮрАдрес": tempCompany.LegalAddress = tempValue; break; case "ФактАдрес": tempCompany.PostalAddress = tempValue; break; case "Резидент": tempCompany.Resident = bool.Parse(tempValue); break; default: break; } } } if (!string.IsNullOrEmpty(tempCompany.Bin)) { tempCompany.UpdCounterparty = _wrapper.GetCompanyByBIN(tempCompany.Bin).Result; } else { tempCompany.UpdCounterparty = _wrapper.GetCompanyByGuid(tempCompany.Guid).Result; } if (Countparty.Name == "m:Ид") { tempCompany.UpdCounterparty = _wrapper.GetCompanyByGuid(Countparty.InnerText).Result; tempCompany.Guid = Countparty.InnerText; } if (Countparty.Name == "m:ПометкаУдаления") tempCompany.Deleted = Countparty.InnerText; } //if (armad.ExchangeKZ.BusinessUnits.GetAll().FirstOrDefault(x => x.BINArmadoc == tempCompany.Bin) != null) if (_wrapper.GetBusinessUnitByBin(tempCompany.Bin).Result) { continue; } packageInfo.AllLoadedComp.Add(tempCompany); } } return packageInfo; } if (root.HasChildNodes) packageInfo = RecurseXmlDocument(root.FirstChild, packageInfo).Result; if (root.NextSibling != null) packageInfo = RecurseXmlDocument(root.NextSibling, packageInfo).Result; } return packageInfo; } } }