/// <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;
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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;
            }
        }