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