Пример #1
0
        public static IList <NamedOffer> QueryOffers(ISession session, uint userId)
        {
            var query = new OfferQuery();

            query.SelectSynonyms();

            using (StorageProcedures.GetActivePrices((MySqlConnection)session.Connection, userId)) {
                var sql = query.ToSql()
                          .Replace(" as {Offer.Id.CoreId}", " as CoreId")
                          .Replace(" as {Offer.Id.RegionCode}", " as RegionId")
                          .Replace("{Offer.", "")
                          .Replace("}", "");
                var offers = session.CreateSQLQuery(sql)
                             .SetResultTransformer(new AliasToPropertyTransformer(typeof(NamedOffer)))
                             .List <NamedOffer>();
                var activePrices = session.Query <ActivePrice>().Where(p => p.Id.Price.PriceCode > 0).ToList();
                offers.Each(
                    offer =>
                    offer.PriceList =
                        activePrices.First(
                            price => price.Id.Price.PriceCode == offer.PriceCode && price.Id.RegionCode == offer.Id.RegionCode));
                return(offers);
            }
        }
        private static List <OrderResult> Validate(ISession session, User user,
                                                   List <Order> orders, bool force, Dictionary <OrderItem, uint> orderitemMap)
        {
            var errors    = new List <OrderResult>();
            var addressId = orders.Select(o => o.AddressId).FirstOrDefault();

            if (addressId == null)
            {
                return(errors);
            }
            try {
                var cheker = new PreorderChecker((MySqlConnection)session.Connection, user.Client);
                cheker.Check();
                PreorderChecker.CheckDailyOrdersSum(session, session.Load <Address>(addressId), orders);
            }
            catch (OrderException e) {
                errors.AddRange(orders.Select(o => new OrderResult(o.ClientOrderId, e.Message)));
                orders.Clear();
            }

            if (!user.IgnoreCheckMinOrder)
            {
                foreach (var order in orders.ToArray())
                {
                    var controller = new MinReqController(session, order);
                    var result     = controller.ProcessOrder();
                    if (result != null)
                    {
                        var message = result.Type == MinReqStatus.ErrorType.MinReq
                                                        ? "Поставщик отказал в приеме заказа." + " Сумма заказа меньше минимально допустимой." +
                                      $" Минимальный заказ {result.MinReq:0.00} заказано {order.CalculateSum():0.00}."
                                                        : "Поставщик отказал в приеме дозаказа." + " Сумма дозаказа меньше минимально допустимой." +
                                      $" Минимальный дозаказ {result.MinReordering:0.00} заказано {order.CalculateSum():0.00}.";
                        errors.Add(new OrderResult(order.ClientOrderId, message));
                        orders.Remove(order);
                    }
                }
            }

            var checker        = new GroupSumOrderChecker(session);
            var rejectedOrders = checker.Check(orders);

            orders.RemoveEach(rejectedOrders.Keys);
            errors = errors.Concat(rejectedOrders.Keys
                                   .Select(o => new OrderResult(o.ClientOrderId,
                                                                "Сумма заказов в этом" + " месяце по Вашему предприятию превысила установленный лимит." +
                                                                $" Лимит заказа на поставщика {o.PriceList.Supplier.Name} - {rejectedOrders[o]:0.00}")))
                     .ToList();


            var rejectedByLimit = Address.CheckLimits(session, orders);

            orders.RemoveEach(rejectedByLimit.Select(r => r.Item1));
            errors = errors.Concat(rejectedByLimit
                                   .Select(r => new OrderResult(r.Item1.ClientOrderId,
                                                                "Сумма заказов " + "по Вашему предприятию превысила установленный лимит." +
                                                                $" Лимит заказа на поставщика {r.Item1.PriceList.Supplier.Name} - {r.Item2:0.00}")))
                     .ToList();

            if (user.UseAdjustmentOrders && !force)
            {
                var optimizer = new CostOptimizer((MySqlConnection)session.Connection,
                                                  user.Client.Id,
                                                  user.Id);

                var ids = orders.SelectMany(o => o.OrderItems).Select(i => i.ProductId).ToArray();
                if (ids.Length > 0)
                {
                    var query = new OfferQuery();
                    query.Where("c0.ProductId in (:ProductIds)");
                    var offers = session.CreateSQLQuery(query.ToSql())
                                 .AddEntity("Offer", typeof(Offer))
                                 .SetParameterList("ProductIds", ids)
                                 .List <Offer>();
                    var activePrices = session.Query <ActivePrice>().ToList();
                    offers.Each(o => o.PriceList = activePrices.First(
                                    price => price.Id.Price.PriceCode == o.PriceCode && price.Id.RegionCode == o.Id.RegionCode));

                    foreach (var order in orders.ToArray())
                    {
                        var results = new List <OrderLineResult>();
                        foreach (var item in order.OrderItems)
                        {
                            var offer  = FindOffer(offers, item);
                            var result = Check(offer, item,
                                               order.ActivePrice.Id.Price.Supplier.Id == optimizer.SupplierId,
                                               orderitemMap);
                            results.Add(result);
                        }

                        if (results.Any(r => r.Result != LineResultStatus.OK))
                        {
                            orders.Remove(order);
                            errors.Add(new OrderResult(order.ClientOrderId,
                                                       "В заказе обнаружены позиции с измененной ценой или количеством",
                                                       results));
                        }
                    }
                }
            }

            return(errors);
        }