public void PayOrders(int clientLegalPersonId) { using (var сontextTransaction = _context.Database.BeginTransaction()) { var dbTran = сontextTransaction.GetDbTransaction(); var unpaidOrders = _paymentProcessor .GetUnpaidOrdersByLegalPersonId(clientLegalPersonId) .OrderBy(o => o.ClientLegalPersonId).ThenBy(o => o.Id); // Перебираем не оплаченные заказы с оплатой из аванса foreach (var order in unpaidOrders) { if (order.AccountOrder == null) { continue; } var undisposedPayments = _paymentProcessor .GetUndisposedPaymentsByOrder(order) .OrderBy(p => p.PaymentDate); var orderDebt = (float)Math.Round(order.Sum - order.Paid, 2); // Перебираем платежи и распределяем их на заказ foreach (var payment in undisposedPayments) { // Если заказ оплачен - выходим из цикла if (orderDebt == 0) { break; } // Если остаток платежа меньше не распределённой части заказа // полностью распределяем его на заказ // Иначе распределяем на заказ только часть суммы, // необходимую для оплаты var orderPaymentSum = payment.UndisposedSum <= orderDebt ? payment.UndisposedSum : orderDebt; var undisposedSum = payment.UndisposedSum - orderPaymentSum; _paymentProcessor.AddOrderToPayment(payment, order); _paymentProcessor.UpdateUndisposedSum(payment, undisposedSum, dbTran); _paymentProcessor.CreateOrderPayment(order, payment, orderPaymentSum, dbTran); // Увеличиваем оплаченную сумму заказа order.Paid += orderPaymentSum; _orderProcessor.UpdateOrder(order, dbTran); orderDebt -= orderPaymentSum; } } _context.SaveChanges(); dbTran.Commit(); } }
public void CreateOrderPosition(OrderPositionData opd) { using (var сontextTransaction = _context.Database.BeginTransaction()) { var dbTran = сontextTransaction.GetDbTransaction(); // Получаем заказ-корзину var basketOrder = _orderProcessor.GetBasketOrder(opd.ClientLegalPersonId, opd.PriceId); // Если заказа-корзины не существует - создаём её if (basketOrder == null) { basketOrder = _orderProcessor.CreateBasketOrder(opd, dbTran); } // Получааем скидку клиента var clientDiscount = _clientProcessor.GetDiscount( opd.ClientLegalPersonId, basketOrder.BusinessUnitId, opd.SupplierId, opd.FormatData.FormatTypeId); // Сохраняем позицию заказа int orderPositionId = _orderPositionProcessor.CreateFullOrderPosition( basketOrder.BusinessUnitId, basketOrder.Id, null, clientDiscount, opd, dbTran); // Сохраняем пакетные позиции заказа foreach (var child in opd.Childs) { _orderPositionProcessor.CreateFullOrderPosition( basketOrder.BusinessUnitId, basketOrder.Id, orderPositionId, clientDiscount, child, dbTran); } // Обновляем заказ-корзину _orderProcessor.UpdateOrder(basketOrder.Id, dbTran); _context.SaveChanges(); dbTran.Commit(); } }
public void ResetIsNeedPrepayment(int clientLegalPersonId) { var accountSettings = _accountSettingsProcessor.GetAccountSettingsByLegalPersonId(clientLegalPersonId); if (!accountSettings.IsNeedPrepayment) { accountSettings.IsNeedPrepayment = true; using (var сontextTransaction = _context.Database.BeginTransaction()) { var dbTran = сontextTransaction.GetDbTransaction(); _accountSettingsProcessor.UpdateAccountSettings(accountSettings, dbTran); _context.SaveChanges(); dbTran.Commit(); } } }
public void ApplyPaymentInTimeDiscount(int accountId) { var account = _context.Accounts .Include(ac => ac.AccountPositions) .Include(ac => ac.AccountOrders).ThenInclude(ao => ao.Order) .Single(ac => ac.Id == accountId); var discount = _paymentInTimeDiscountProvider.GetByValue(account.BusinessUnitId); if (discount == 0) { return; } var description = string.Format("Доп. скидка {0}%.", discount); using (var сontextTransaction = _context.Database.BeginTransaction()) { var dbTran = сontextTransaction.GetDbTransaction(); // Удаляем старые позиции счёта foreach (var accountPosition in account.AccountPositions) { _clientAccountProcessor.DeleteAccountPosition(accountPosition, dbTran); } foreach (var accountOrder in account.AccountOrders) { var order = accountOrder.Order; var orderPositions = _context.OrderPositions .Include(op => op.Supplier).ThenInclude(op => op.Company) .Include(op => op.Supplier).ThenInclude(op => op.City) .Include(op => op.PricePosition).ThenInclude(pp => pp.PricePositionEx) .Include(op => op.PricePosition).ThenInclude(pp => pp.PricePositionType) .Include(op => op.PricePosition).ThenInclude(pp => pp.Unit) .Where(op => op.OrderId == order.Id) .ToList(); foreach (var orderPosition in orderPositions) { orderPosition.Discount += discount; // Сохраняем позицию заказа _orderPositionProcessor.UpdateOrderPosition(orderPosition, order.Id, dbTran); // Если позиция заказа - не часть пакета if (orderPosition.ParentOrderPositionId == null) { // находим её пакетные позиции var packagePositions = orderPositions .Where(op => op.ParentOrderPositionId == orderPosition.Id) .ToList(); // Создаём позицию счёта var accountPosition = _clientAccountProcessor .CreateAccountPosition(account.Id, orderPosition, packagePositions, dbTran); } } // Пересчитываем сумму заказа order.Sum = (float)Math.Round( orderPositions .Sum( op => op.Price.Value * op.GraphicPositions .Where( gp => gp.ParenGraphicPositiontId == gp.Id && op.ParentOrderPositionId == null) .Sum(gp => gp.Count) * (1 - op.Discount / 100)), 2); order.AccountDescription = description; _orderProcessor.UpdateOrder(order, dbTran); } // Пересчитываем сумму счёта account.Sum = (float)Math.Round(account.AccountOrders.Sum(o => o.Order.Sum), 2); account.Description = description; _clientAccountProcessor.UpdateClientAccout(account, dbTran); _context.SaveChanges(); dbTran.Commit(); } }