public AddOrderResult AddOrder(Cart cart, User user, OrderShippingInfo orderInfo) { if (cart == null) throw new ArgumentException("cart is null"); if (cart.Items == null) throw new ArgumentException("cart items is null"); if (user == null) throw new ArgumentException("user is null"); if (orderInfo == null) throw new ArgumentException("orderInfo is null"); // construct order var orderLines = new List<OrderLine>(); var orderOutcomes = new List<Outcome>(); foreach (CartItem item in cart.Items) { IList<Income> incomes = FindOldestIncomesForProduct(item.Product, item.Quantity); int quantity = item.Quantity; var outcomes = new List<Outcome>(); foreach (Income income in incomes) { int n = Math.Min(quantity, income.QuantityCurrent); income.QuantityCurrent -= n; _daoTemplate.Save(income); Outcome outcome = new Outcome(item.Product.Price, n, income, user.Discount + cart.CurrentDiscount()); quantity -= n; outcomes.Add(outcome); } orderOutcomes.AddRange(outcomes); orderLines.Add(new OrderLine(item.Product, item.Quantity, outcomes)); } Order order = new Order(orderOutcomes, orderLines); order.Comment = orderInfo.Comment ?? ""; DeliverPrices prices = _daoTemplate.FindAll<DeliverPrices>()[0]; if (orderInfo.PaymentType == PaymentType.OnPost) { order.DeliverPrice = prices.PostWhenReceived(cart.SummDiscount()); } else { order.DeliverPrice = GetPrice(orderInfo.DeliverType); } order.CopyFrom(orderInfo); order.User = user; order.Discount = user.Discount + cart.CurrentDiscount(); _daoTemplate.Save(order); order.Uid = _daoTemplate.FindByID<UniqueId>(order.Id).Uid; _daoTemplate.Save(order); return new AddOrderResult(){Order = order}; }