public DealPaymentUndistributedPartInfo(DealPaymentDocument dealPaymentDocument, DateTime appearenceDate, decimal sum) { DealPaymentDocument = dealPaymentDocument; AppearenceDate = appearenceDate; Sum = sum; }
public void Delete(DealPaymentDocument value) { CurrentSession.SaveOrUpdate(value); }
/// <summary> /// Получение для платежного документа информации о неразнесенных частях оплаты и датах их появления /// </summary> /// <param name="dealPaymentDocument">Платежный документ по сделке</param> private IEnumerable <DealPaymentUndistributedPartInfo> GetDealPaymentUndistributedPartsInfoByDealPayment(DealPaymentDocument dealPaymentDocument) { // информация о неразнесенных частях оплаты и датах их появления var paymentDistributionPartsInfo = new List <DealPaymentUndistributedPartInfo>(); // добавляем все отрицательные разнесения (освободились после возврата оплаты от клиента) foreach (var distribution in dealPaymentDocument.Distributions.Where(x => x.Sum < 0 && x is DealPaymentDocumentDistributionToReturnFromClientWaybill)) { // получаем сумму разнесений из данного разнесения на накладные реализации var distributionsToSaleWaybillSum = dealPaymentDocument.Distributions.Where(x => x.Sum > 0 && x is DealPaymentDocumentDistributionToSaleWaybill && (x as DealPaymentDocumentDistributionToSaleWaybill).SourceDistributionToReturnFromClientWaybill == distribution).Sum(x => x.Sum); // получаем сумму разнесений из данного разнесения на платежные документы var distributionsToDealPaymentDocumentSum = dealPaymentDocument.Distributions.Where(x => x.Sum > 0 && x is DealPaymentDocumentDistributionToDealPaymentDocument && (x as DealPaymentDocumentDistributionToDealPaymentDocument).SourceDistributionToReturnFromClientWaybill == distribution).Sum(x => x.Sum); // получаем чистый остаток для разнесения // для получения положительной суммы distribution.Sum берем с минусом var distributionSum = (-distribution.Sum) - distributionsToSaleWaybillSum - distributionsToDealPaymentDocumentSum; if (distributionSum != 0) { paymentDistributionPartsInfo.Add(new DealPaymentUndistributedPartInfo(dealPaymentDocument, distribution.DistributionDate, distributionSum) { DealPaymentDocumentDistributionToReturnFromClientWaybill = (distribution as DealPaymentDocumentDistributionToReturnFromClientWaybill) }); } } // добавляем в словарь сумму «чистого» неразнесенного остатка, т.е. который еще никогда никуда не разносился var clearRest = dealPaymentDocument.UndistributedSum - paymentDistributionPartsInfo.Sum(x => x.Sum); if (clearRest != 0) { paymentDistributionPartsInfo.Add(new DealPaymentUndistributedPartInfo(dealPaymentDocument, dealPaymentDocument.Date, clearRest)); } return(paymentDistributionPartsInfo); }
public void Save(DealPaymentDocument value) { CurrentSession.SaveOrUpdate(value); CurrentSession.Flush(); }
/// <summary> /// Разнести неразнесенные части платежных документов на платежный документ-«назначение» (заданной наперед суммой). /// После разнесения у «источника» может оставаться неоплаченный остаток. /// Если до разнесения «назначение» не имеет положительного неоплаченного остатка, разнесение платежного документа не будет создано. /// При полной оплате «назначения» происходит установка признака того, что оно полностью оплачено. /// </summary> /// <param name="sourceDealPaymentUndistributedPartsInfo">Информация о неразнесенных остатках платежных документов</param> /// <param name="destinationDealPaymentDocument">Платежный документ, на который выполняется разнесение</param> /// <param name="sumToDistribute">Сумма для разнесения</param> /// <param name="currentDate">Дата операции</param> private void PayDealPaymentDocument(List <DealPaymentUndistributedPartInfo> sourceDealPaymentUndistributedPartsInfo, DealPaymentDocument destinationDealPaymentDocument, decimal sumToDistribute, DateTime currentDate) { // разносим неразнесенные части оплат foreach (var distributionPartInfo in sourceDealPaymentUndistributedPartsInfo.OrderBy(x => x.AppearenceDate)) { var sourceDealPaymentDocument = distributionPartInfo.DealPaymentDocument; // cумма создаваемого разнесения платежного документа var sum = Math.Min(distributionPartInfo.Sum, sumToDistribute); // вычитаем разносимую сумму distributionPartInfo.Sum -= sum; sumToDistribute -= sum; // дата создаваемого разнесения var distributionDate = DateTimeUtils.GetMaxDate(distributionPartInfo.AppearenceDate, destinationDealPaymentDocument.Date); ValidationUtils.Assert(sourceDealPaymentDocument.Type.ContainsIn(DealPaymentDocumentType.DealPaymentFromClient, DealPaymentDocumentType.DealCreditInitialBalanceCorrection), "Разносимый платежный документ имеет недопустимый тип."); ValidationUtils.Assert(destinationDealPaymentDocument.Type.ContainsIn(DealPaymentDocumentType.DealPaymentToClient, DealPaymentDocumentType.DealDebitInitialBalanceCorrection), "Платежный документ, на который выполняется разнесение, имеет недопустимый тип."); ValidationUtils.Assert(sum > 0, "Сумма для разнесения должна быть положительной."); ValidationUtils.Assert(sourceDealPaymentDocument.UndistributedSum >= sum, "Неразнесенный остаток по платежному документу меньше суммы для разнесения."); ValidationUtils.Assert(sum <= destinationDealPaymentDocument.UndistributedSum, String.Format("Сумма для разнесения ({0} р.) превышает неоплаченный остаток платежного документа, на который выполняется разнесение ({1} р.)", sum.ForDisplay(ValueDisplayType.Money), destinationDealPaymentDocument.UndistributedSum.ForDisplay(ValueDisplayType.Money))); ValidationUtils.Assert(sourceDealPaymentDocument.Team == destinationDealPaymentDocument.Team, "Разносимый платежный документ и платежный документ, на который выполняется разнесение, должны относиться к одной команде."); var dealPaymentDocumentDistributionToDealPaymentDocument = new DealPaymentDocumentDistributionToDealPaymentDocument(sourceDealPaymentDocument, destinationDealPaymentDocument, sum, distributionDate, currentDate) { SourceDistributionToReturnFromClientWaybill = distributionPartInfo.DealPaymentDocumentDistributionToReturnFromClientWaybill }; sourceDealPaymentDocument.AddDealPaymentDocumentDistribution(dealPaymentDocumentDistributionToDealPaymentDocument); // IsFullyDistributed у обоих ставится само if (destinationDealPaymentDocument.UndistributedSum == 0M) // Если вся сумма оплачена, завершаем цикл { break; } } // удаляем полностью разнесенные части var undistributedPartsToDelete = sourceDealPaymentUndistributedPartsInfo.Where(x => x.Sum == 0).ToList(); foreach (var item in undistributedPartsToDelete) { sourceDealPaymentUndistributedPartsInfo.Remove(item); } }