/// <summary> /// Производится вставка данных в таблицу Core /// </summary> public void InsertToCore(FormalizationPosition position, Cost[] costs) { var quantity = GetFieldValueObject(PriceFields.Quantity); var core = new NewOffer { Code = GetFieldValue(PriceFields.Code), CodeCr = GetFieldValue(PriceFields.CodeCr), Unit = GetFieldValue(PriceFields.Unit), Volume = GetFieldValue(PriceFields.Volume), Quantity = quantity is DBNull ? null : quantity.ToString(), Note = GetFieldValue(PriceFields.Note), Doc = (string)GetFieldValueObject(PriceFields.Doc), Junk = (bool)GetFieldValueObject(PriceFields.Junk), Await = (bool)GetFieldValueObject(PriceFields.Await), VitallyImportant = (bool)GetFieldValueObject(PriceFields.VitallyImportant), MinBoundCost = GetDecimalValue(PriceFields.MinBoundCost), MaxBoundCost = GetDecimalValue(PriceFields.MaxBoundCost), OrderCost = GetDecimalValue(PriceFields.OrderCost), MinOrderCount = GetUintOrDefault(PriceFields.MinOrderCount), RequestRatio = GetUintOrDefault(PriceFields.RequestRatio), RegistryCost = GetDecimalValue(PriceFields.RegistryCost), Nds = GetUintOrDefault(PriceFields.Nds), CodeOKP = GetUintOrDefault(PriceFields.CodeOKP), EAN13 = SafeConvert.ToUInt64(GetFieldValue(PriceFields.EAN13)), Series = GetFieldValue(PriceFields.Series), ProducerCost = GetDecimalValue(PriceFields.ProducerCost), OptimizationSkip = (bool)GetFieldValueObject(PriceFields.OptimizationSkip) }; if (quantity is int) { core.QuantityAsInt = (int)quantity; } var rawPeriodValue = GetFieldValueObject(PriceFields.Period); string periodValue; //если получилось преобразовать в дату, то сохраняем в формате даты if (rawPeriodValue is DateTime) { periodValue = ((DateTime)rawPeriodValue).ToString("dd'.'MM'.'yyyy"); } else { //Если не получилось преобразовать, то смотрим на "сырое" значение поле, если оно не пусто, то пишем в базу periodValue = GetFieldRawValue(PriceFields.Period); if (String.IsNullOrEmpty(periodValue)) { periodValue = null; } } core.Period = periodValue; core.Costs = costs; position.Offer = core; }
private static Order OrderParse(ISession session, uint userId, DataTable table) { var user = session.Load <User>(userId); Order order = null; if (table.Rows.Count == 0) { return(null); } var supplierDeliveryId = table.Rows[0]["PODRCD"].ToString(); uint id; unchecked { id = (uint)table.Rows[0]["NUMZ"].GetHashCode(); } var reject = new Reject { DepId = supplierDeliveryId, OrderId = id }; foreach (DataRow row in table.Rows) { uint qunatity; try { qunatity = Convert.ToUInt32(row["QNT"]); } catch (Exception) { qunatity = SafeConvert.ToUInt32(row["QNT"].ToString()); } var cost = Convert.ToDecimal(row["PRICE"]); var offerId = SafeConvert.ToUInt64(row["XCODE"].ToString()); var code = row["CODEPST"].ToString(); var name = row["NAME"].ToString(); reject.Items.Add(new RejectItem(id, code, qunatity, name, cost, offerId)); } var addressIds = Program.GetAddressId(session, supplierDeliveryId, null, Program.SupplierIdForCodeLookup, user); var address = session.Load <Address>(addressIds[0]); var rules = session.Load <OrderRules>(user.Client.Id); rules.Strict = false; rules.CheckAddressAccessibility = false; List <ActivePrice> activePrices; using (StorageProcedures.GetActivePrices((MySqlConnection)session.Connection, userId)) { activePrices = session.Query <ActivePrice>().ToList(); } var existOrder = session.Query <Order>().FirstOrDefault(o => o.UserId == userId && o.ClientOrderId == id && !o.Deleted); if (existOrder != null) { throw new UserFriendlyException( $"Дублирующий заказ {id}, существующий заказ {existOrder.RowId}", "Дублирующая заявка"); } var ordered = new List <RejectItem>(); foreach (var item in reject.Items) { try { var offer = OfferQuery.GetById(session, user, item.OfferId); if (offer == null) { var archiveOffer = session.Get <ArchiveOffer>(item.OfferId); if (archiveOffer == null) { throw new UserFriendlyException($"Не удалось найти предложение {item.OfferId} игнорирую строку", "Заявка сделана по неактуальному прайс-листу"); } offer = archiveOffer.ToOffer(activePrices, item.Price); if (offer == null) { throw new UserFriendlyException( $"Прайс {archiveOffer.PriceList.PriceCode} больше не доступен клиенту игнорирую строку", "Прайс-лист отключен"); } } if (order == null) { order = new Order(offer.PriceList, user, address, rules); order.ClientOrderId = id; } order.AddOrderItem(offer, item.Quantity); ordered.Add(item); } catch (OrderException e) { log.Warn($"Не удалось заказать позицию {item.Name} в количестве {item.Quantity}", e); } } foreach (var rejectItem in ordered) { reject.Items.Remove(rejectItem); } if (order != null && order.OrderItems.Count == 0) { return(null); } return(order); }
private static Order OrderParse(ISession session, uint userId, XDocument doc, List <Reject> rejects, TextWriter logForClient, out uint id) { var user = session.Load <User>(userId); id = 0; Order order = null; var packet = doc.XPathSelectElement("/PACKET"); if (packet == null) { return(null); } var type = (string)packet.Attribute("TYPE"); if (type == null) { return(null); } var predId = (string)packet.Attribute("PRED_ID"); var to = (string)packet.Attribute("TO"); var from = (string)packet.Attribute("FROM"); var depId = (string)doc.XPathSelectElement("/PACKET/ORDER/DEP_ID"); var orderElement = doc.XPathSelectElement("/PACKET/ORDER"); var clientOrderId = SafeConvert.ToUInt32((string)orderElement.XPathSelectElement("ORDER_ID")); id = clientOrderId; var reject = new Reject { To = to, From = @from, PredId = predId, DepId = depId, OrderId = clientOrderId }; var items = orderElement.XPathSelectElements("ITEMS/ITEM"); foreach (var item in items) { var qunatity = SafeConvert.ToUInt32((string)item.XPathSelectElement("QTTY")); var cost = Convert.ToDecimal((string)item.XPathSelectElement("PRICE")); var offerId = SafeConvert.ToUInt64((string)item.XPathSelectElement("XCODE")); var code = (string)item.XPathSelectElement("CODE"); var name = (string)item.XPathSelectElement("NAME"); reject.Items.Add(new RejectItem(clientOrderId, code, qunatity, name, cost, offerId)); } rejects.Add(reject); var addressIds = Program.GetAddressId(session, reject.DepId.Slice(-2, -1), reject.PredId, Program.SupplierIdForCodeLookup, user); var address = session.Load <Address>(addressIds[0]); var rules = session.Load <OrderRules>(user.Client.Id); rules.Strict = false; rules.CheckAddressAccessibility = false; List <ActivePrice> activePrices; using (StorageProcedures.GetActivePrices((MySqlConnection)session.Connection, userId)) { activePrices = session.Query <ActivePrice>().ToList(); } var comment = (string)orderElement.XPathSelectElement("COMMENT"); var existOrder = session.Query <Order>().FirstOrDefault(o => o.UserId == userId && o.ClientOrderId == clientOrderId && !o.Deleted); if (existOrder != null) { throw new UserFriendlyException( $"Дублирующий заказ {clientOrderId}, существующий заказ {existOrder.RowId}", "Дублирующая заявка"); } var ordered = new List <RejectItem>(); foreach (var item in reject.Items) { try { var offer = OfferQuery.GetById(session, user, item.OfferId); if (offer == null) { var archiveOffer = session.Get <ArchiveOffer>(item.OfferId); if (archiveOffer == null) { throw new UserFriendlyException($"Не удалось найти предложение {item.OfferId} игнорирую строку", "Заявка сделана по неактуальному прайс-листу"); } offer = archiveOffer.ToOffer(activePrices, item.Price); if (offer == null) { throw new UserFriendlyException( $"Прайс {archiveOffer.PriceList.PriceCode} больше не доступен клиенту игнорирую строку", "Прайс-лист отключен"); } } if (order == null) { order = new Order(offer.PriceList, user, address, rules); order.ClientAddition = comment; order.ClientOrderId = clientOrderId; } order.AddOrderItem(offer, item.Quantity); ordered.Add(item); } catch (OrderException e) { var message = Utils.TryGetUserFriendlyMessage(e); log.Warn($"Не удалось заказать позицию {item.Name} в количестве {item.Quantity}", e); logForClient.WriteLine("Не удалось заказать позицию {0} по заявке {3} в количестве {1}: {2}", item.Name, item.Quantity, message, clientOrderId); } } foreach (var rejectItem in ordered) { reject.Items.Remove(rejectItem); } if (reject.Items.Count == 0) { rejects.Remove(reject); } if (order != null && order.OrderItems.Count == 0) { return(null); } return(order); }
public override void Read(string tag, string value) { var position = _position; var core = position.Offer; if (tag.Match("Code")) { core.Code = value; return; } if (tag.Match("CodeCr")) { core.CodeCr = value; return; } if (tag.Match("Product")) { position.PositionName = value; return; } if (tag.Match("Producer")) { position.FirmCr = value; return; } if (tag.Match("Unit")) { core.Unit = value; return; } if (tag.Match("Volume")) { core.Volume = value; return; } if (tag.Match("Quantity")) { core.Quantity = value; return; } if (tag.Match("Note")) { core.Note = value; return; } if (tag.Match("Period")) { core.Period = value; return; } if (tag.Match("Doc")) { core.Doc = value; return; } if (tag.Match("Junk")) { if (value == "0") { core.Junk = false; } else if (value == "1") { core.Junk = true; } return; } if (tag.Match("OptimizationSkip")) { core.OptimizationSkip = value == "1"; return; } if (tag.Match("Await")) { if (value == "0") { core.Await = false; } else if (value == "1") { core.Await = true; } return; } if (tag.Match("VitallyImportant")) { if (value == "0") { core.VitallyImportant = false; } else if (value == "1") { core.VitallyImportant = true; } return; } if (tag.Match("NDS")) { uint nds; if (uint.TryParse(value, out nds)) { core.Nds = nds; } return; } if (tag.Match("MinBoundCost")) { decimal minBoindCost; if (decimal.TryParse(value, NumberStyles.Number, CultureInfo.InvariantCulture, out minBoindCost)) { core.MinBoundCost = minBoindCost; } return; } if (tag.Match("MaxBoundCost")) { decimal maxBoundCost; if (decimal.TryParse(value, NumberStyles.Number, CultureInfo.InvariantCulture, out maxBoundCost)) { core.MaxBoundCost = maxBoundCost; } return; } if (tag.Match("RegistryCost")) { decimal registryCost; if (decimal.TryParse(value, NumberStyles.Number, CultureInfo.InvariantCulture, out registryCost)) { core.RegistryCost = registryCost; } return; } if (tag.Match("ProducerCost")) { decimal producerCost; if (decimal.TryParse(value, NumberStyles.Number, CultureInfo.InvariantCulture, out producerCost)) { core.ProducerCost = producerCost; } return; } if (tag.Match("RequestRatio")) { uint requestRatio; if (uint.TryParse(value, out requestRatio)) { core.RequestRatio = requestRatio; } return; } if (tag.Match("MinOrderSum")) { decimal minOrderSum; if (decimal.TryParse(value, NumberStyles.Number, CultureInfo.InvariantCulture, out minOrderSum)) { core.OrderCost = minOrderSum; } return; } if (tag.Match("MinOrderCount")) { uint minOrderCount; if (uint.TryParse(value, out minOrderCount)) { core.MinOrderCount = minOrderCount; } return; } if (tag.Match("CodeOKP")) { core.CodeOKP = SafeConvert.ToUInt32(value); return; } if (tag.Match("EAN13")) { core.EAN13 = SafeConvert.ToUInt64(value); return; } if (tag.Match("Series")) { core.Series = value; return; } }