Exemplo n.º 1
0
        // TODO: провести рефакторинг расчета показателей (убрать дублирование)

        /// <summary>
        /// Пересчет показателей возвратов от клиентов при проводке накладной возврата от клиента
        /// </summary>
        public void ReturnFromClientWaybillAccepted(ReturnFromClientWaybill waybill)
        {
            // проведенные возвраты
            var acceptedIndicators = new List <AcceptedReturnFromClientIndicator>();
            // возвраты на дату проводки накладной реализации
            var bySaleAcceptanceDateIndicators = new List <ReturnFromClientBySaleAcceptanceDateIndicator>();
            // возвраты на дату отгрузки накладной реализации
            var bySaleShippingDateIndicators = new List <ReturnFromClientBySaleShippingDateIndicator>();

            foreach (var row in waybill.Rows)
            {
                ValidationUtils.Assert(row.SaleWaybillRow.SaleWaybill.Is <ExpenditureWaybill>(),
                                       "Расчет показателя для данного типа накладной реализации еще не реализован.");

                var saleWaybillRow = row.SaleWaybillRow.As <ExpenditureWaybillRow>();

                ValidationUtils.Assert(saleWaybillRow.AvailableToReturnCount >= row.ReturnCount,
                                       String.Format("Недостаточно реализованного товара «{0}» для возврата.", row.Article.FullName));

                saleWaybillRow.SetReturnCounts(saleWaybillRow.AcceptedReturnCount + row.ReturnCount, saleWaybillRow.ReceiptedReturnCount);

                // увеличиваем проведенное возвращенное от клиента кол-во
                var acceptedIndicator = CreateAcceptedReturnFromClientIndicator(waybill.AcceptanceDate.Value, row, 1);
                acceptedIndicators.Add(acceptedIndicator);

                // увеличиваем возвраты на дату проводки накладной реализации
                // TODO: не самый оптимальный вариант расчета. В итоге тянет из БД данные для каждой позиции накладной возврата
                var bySaleAcceptanceDateIndicator = CreateReturnFromClientBySaleAcceptanceDateIndicator(row, 1);

                returnFromClientBySaleAcceptanceDateIndicatorService.Update(row.SaleWaybillRow.SaleWaybill.AcceptanceDate.Value,
                                                                            waybill.Deal.Id, waybill.Curator.Id, receiptWaybillRepository.GetRowSubQuery(row.ReceiptWaybillRow.Id),
                                                                            new List <ReturnFromClientBySaleAcceptanceDateIndicator>()
                {
                    bySaleAcceptanceDateIndicator
                });

                // увеличиваем возвраты на дату отгрузки накладной реализации
                // TODO: не самый оптимальный вариант расчета. В итоге тянет из БД данные для каждой позиции накладной возврата
                var bySaleShippingDateIndicator = CreateReturnFromClientBySaleShippingDateIndicator(row, 1);

                returnFromClientBySaleShippingDateIndicatorService.Update(row.SaleWaybillRow.SaleWaybill.As <ExpenditureWaybill>().ShippingDate.Value,
                                                                          waybill.Deal.Id, waybill.Curator.Id, receiptWaybillRepository.GetRowSubQuery(row.ReceiptWaybillRow.Id),
                                                                          new List <ReturnFromClientBySaleShippingDateIndicator>()
                {
                    bySaleShippingDateIndicator
                });
            }

            acceptedReturnFromClientIndicatorService.Update(waybill.AcceptanceDate.Value, waybill.Deal.Id, waybill.Curator.Id,
                                                            returnFromClientWaybillRepository.GetArticleBatchesSubquery(waybill.Id), acceptedIndicators);
        }