Beispiel #1
0
 public DealPaymentUndistributedPartInfo(DealPaymentDocument dealPaymentDocument, DateTime appearenceDate, decimal sum)
 {
     DealPaymentDocument = dealPaymentDocument;
     AppearenceDate      = appearenceDate;
     Sum = sum;
 }
Beispiel #2
0
 public void Delete(DealPaymentDocument value)
 {
     CurrentSession.SaveOrUpdate(value);
 }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
 public void Save(DealPaymentDocument value)
 {
     CurrentSession.SaveOrUpdate(value);
     CurrentSession.Flush();
 }
Beispiel #5
0
        /// <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);
            }
        }