Пример #1
0
        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();
            }
        }
Пример #2
0
        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();
            }
        }
Пример #3
0
        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();
                }
            }
        }
Пример #4
0
        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();
            }
        }