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); }