private void CashFlowFormed(Session ssn)
        {
            XPQuery <crmCashFlowRegister> cashFlowDocs = new XPQuery <crmCashFlowRegister>(ssn);
            var queryCF = from cashFlowDoc in cashFlowDocs
                          select(csCDocRCB)(cashFlowDoc.PaymentDocument);

            XPQuery <csCDocRCB> paymentDocs = new XPQuery <csCDocRCB>(ssn);
            var queryPD = from paymentDoc in paymentDocs
                          select paymentDoc;

            XPQuery <fmCPRRepaymentJurnal> repaymentJournalDocs = new XPQuery <fmCPRRepaymentJurnal>(ssn);
            var queryRJ = from repaymentJournalDoc in repaymentJournalDocs
                          select(csCDocRCB)(repaymentJournalDoc.PaymentDocument);

            var queryDOC = (queryPD.Except <csCDocRCB>(queryCF)).Intersect(queryRJ).Distinct();

            foreach (var paymentDoc in queryDOC)
            {
                fmCDocRCB fmPaymentDoc = paymentDoc as fmCDocRCB;
                if (fmPaymentDoc == null)
                {
                    continue;
                }
                var repaymentJournalQuery = from repaymentJournal in repaymentJournalDocs
                                            where repaymentJournal.PaymentDocument == fmPaymentDoc
                                            select repaymentJournal;
                foreach (var repaymentJournalRecord in repaymentJournalQuery)
                {
                    // Разброс суммы в CashFlow
                    DistributeSum(ssn, repaymentJournalRecord);
                }
            }
        }
        private Boolean GetAnswer(UnitOfWork uow, fmCDocRCB paymentDocument, fmCPRPaymentRequest paymentRequest)
        {
            Decimal _Accuracy = 0.01m;  // Сопоставление с точностью до копейки

            // Сумма Платёжного документа по OperationJournal (в валюте платежа)
            Decimal operationPaymentDocSumIn = 0, operationPaymentDocSumOut = 0;

            GetPaymentDocSumByOperationJournal(uow, paymentDocument, out operationPaymentDocSumIn, out operationPaymentDocSumOut);
            // Одна из сумм operationPaymentDocSumIn или operationPaymentDocSumOut обязательно равна 0

            // Сумма Платёжного документа по RepaymentJournal (в валюте платежа - это величины SumIn и SumOut)
            Decimal repaymentDocSumIn = 0, repaymentDocSumOut = 0;

            GetPaymentDocSumByRepaymentJournal(uow, paymentDocument, out repaymentDocSumIn, out repaymentDocSumOut);
            // Одна из сумм repaymentDocSumIn или repaymentDocSumOut также обязательно равна 0

            // Величина непокрытия Платёжного документа Заявками (все суммы в валюте платежа)
            Decimal deltaDocSumIn  = operationPaymentDocSumIn - repaymentDocSumIn;
            Decimal deltaDocSumOut = operationPaymentDocSumOut - repaymentDocSumOut;

            if (Decimal.Compare(Math.Abs(deltaDocSumIn) + Math.Abs(deltaDocSumOut), _Accuracy) <= 0)
            {
                return(false);
            }
            // Всё сопоставлено уже с точностью до _Accuracy - так условились!
            return(true);
        }
Пример #3
0
 public fmCPRRepaymentJurnal(
     Session session,
     fmCPRRepaymentTask repaymentTask,
     fmCDocRCB paymentDocument,
     fmCPRPaymentRequest paymentRequest,
     crmBankAccount bankAccount,
     Decimal sumIn,
     Decimal sumObligationIn,
     Decimal sumOut,
     Decimal sumObligationOut,
     DateTime paymentDate,
     csValuta valutaPayment,
     csValuta valutaObligation,
     CRM.Contract.Analitic.PlaneFact planFact)
     : base(session)
 {
     this.RepaymentTask    = repaymentTask;
     this.PaymentDocument  = paymentDocument;
     this.PaymentRequest   = paymentRequest;
     this.BankAccount      = bankAccount;
     this.SumIn            = sumIn;
     this.SumObligationIn  = sumObligationIn;
     this.SumOut           = sumOut;
     this.SumObligationOut = sumObligationOut;
     this.ValutaPayment    = valutaPayment;
     this.ValutaObligation = valutaObligation;
     this.PaymentDate      = paymentDate;
     this.PlaneFact        = planFact;
 }
 public void ClearFilter()
 {
     this.DateBegin   = System.DateTime.MinValue;
     this.DateEnd     = System.DateTime.MinValue;
     this.Bank        = null;
     this.BankAccount = null;
     this.PaymentDoc  = null;
 }
        private void GetPaymentDocSumByRepaymentJournal(UnitOfWork uow, fmCDocRCB PaymentDocument, out Decimal SumIn, out Decimal SunOut)
        {
            XPQuery <fmCPRRepaymentJurnal> repaymentJournals = new XPQuery <fmCPRRepaymentJurnal>(uow);
            var queryRepaymentJournals = from repaymentJournal in repaymentJournals
                                         where repaymentJournal.PaymentDocument == PaymentDocument
                                         select repaymentJournal;

            // В журнале привязок хранятся величины сумм для валют - платежа и обязательства. Суммы берём в валюте платежа.
            SumIn  = queryRepaymentJournals.Sum(x => x.SumIn);
            SunOut = queryRepaymentJournals.Sum(x => x.SumOut);
        }
        private void GetPaymentDocSumByOperationJournal(UnitOfWork uow, fmCDocRCB PaymentDocument, out Decimal SumIn, out Decimal SunOut)
        {
            XPQuery <fmCSAOperationJournal> operationJournals = new XPQuery <fmCSAOperationJournal>(uow);
            var queryOperationJournals = from operationJournal in operationJournals
                                         where operationJournal.PaymentDocument == PaymentDocument
                                         select operationJournal;

            // Как я понял, валюта выписки определяется по 3-м знакам счёта выписки, поэтому валюта везде одинаковая и суммирование ниже корректно.
            // В Валюте платежа
            SumIn  = queryOperationJournals.Sum(x => x.SumIn);
            SunOut = queryOperationJournals.Sum(x => x.SumOut);
        }
Пример #7
0
 public void AutoBinding(fmCPRRepaymentTask RepaymentTask)
 {
     foreach (fmCSAStatementAccountDoc sad in this.PayInDocs)
     {
         fmCDocRCB paymentDoc = sad.PaymentDocument;
         paymentDoc.AutoBinding(BankAccount, RepaymentTask);
     }
     foreach (fmCSAStatementAccountDoc sad in this.PayOutDocs)
     {
         fmCDocRCB paymentDoc = sad.PaymentDocument;
         paymentDoc.AutoBinding(BankAccount, RepaymentTask);
     }
 }
Пример #8
0
        protected void TestStatementAccountPostProcess(IObjectSpace os, fmCSAStatementAccount sa)
        {
            Assert.AreNotEqual(sa.ImportResult, null);
            IList <fmCSAOperationJournal> opers = os.GetObjects <fmCSAOperationJournal>(
                CriteriaOperator.And(new BinaryOperator("BankAccount", sa.BankAccount),
                                     new BinaryOperator("OperationDate", sa.DateFrom.Date, BinaryOperatorType.GreaterOrEqual),
                                     new BinaryOperator("OperationDate", sa.DateTo.Date.AddDays(1), BinaryOperatorType.Less)), true);
            Decimal summ = 0;

            summ = opers.Sum(oper => oper.SumIn);
            Assert.AreEqual(sa.TotalRecaivedAtAccount, summ);
            summ = opers.Sum(oper => oper.SumOut);
            Assert.AreEqual(sa.TotalWriteOfAccount, summ);
            foreach (fmCSAStatementAccountDoc doc in sa.PayInDocs)
            {
                summ = opers.Where(oper => oper.PaymentDocument == doc.PaymentDocument).Sum(oper => oper.SumIn);
                Assert.AreEqual(doc.PaymentCost, summ);
            }
            foreach (fmCSAStatementAccountDoc doc in sa.PayOutDocs)
            {
                summ = opers.Where(oper => oper.PaymentDocument == doc.PaymentDocument).Sum(oper => oper.SumOut);
                Assert.AreEqual(doc.PaymentCost, summ);
            }
            foreach (fmCDocRCBRequisites req in sa.DocRCBRequisites)
            {
                Assert.AreNotEqual(req.StatementOfAccountDoc, null);
                Assert.AreEqual(sa.BankAccount, req.BankAccount);
                Assert.AreEqual(sa.Bank, req.Bank);
                fmCSAStatementAccountDoc doc = req.StatementOfAccountDoc;
                Assert.AreEqual(doc.ImportResult, sa.ImportResult);
                Assert.AreNotEqual(doc.PaymentPayerRequisites.BankAccount, doc.PaymentReceiverRequisites.BankAccount);
                TestDocRCBRequsites(os, doc.PaymentPayerRequisites);
                TestDocRCBRequsites(os, doc.PaymentReceiverRequisites);
                Assert.AreNotEqual(doc.PaymentDocument, null);
                fmCDocRCB paydoc = doc.PaymentDocument;
                TestDocRCBRequsites(os, paydoc.PaymentPayerRequisites);
                TestDocRCBRequsites(os, paydoc.PaymentReceiverRequisites);
                Assert.AreEqual(doc.PaymentPayerRequisites.BankAccount, paydoc.PaymentPayerRequisites.BankAccount);
                Assert.AreEqual(doc.PaymentPayerRequisites.Bank, paydoc.PaymentPayerRequisites.Bank);
                Assert.AreEqual(doc.PaymentReceiverRequisites.BankAccount, paydoc.PaymentReceiverRequisites.BankAccount);
                Assert.AreEqual(doc.PaymentReceiverRequisites.Bank, paydoc.PaymentReceiverRequisites.Bank);
                if (doc.PaymentReceiverRequisites == req)
                {
                    Assert.AreEqual(doc.StatementAccountIn, sa);
                }
                if (doc.PaymentPayerRequisites == req)
                {
                    Assert.AreEqual(doc.StatementAccountOut, sa);
                }
            }
        }
        public Decimal GetSumRepaymentJournal(Session ssn, fmCDocRCB paymentDoc)
        {
            Decimal repaymentJournalSum = 0;

            XPQuery <fmCPRRepaymentJurnal> repaymentJournals = new XPQuery <fmCPRRepaymentJurnal>(ssn);
            var repaymentJournalQuery = from repaymentJournal in repaymentJournals
                                        where repaymentJournal.PaymentDocument == paymentDoc
                                        select repaymentJournal;

            foreach (var repaymentJournal in repaymentJournalQuery)
            {
                repaymentJournalSum += repaymentJournal.SumOut * csCNMValutaCourse.GetCrossCourceOnDate(ssn, repaymentJournal.PaymentDate.Date, repaymentJournal.ValutaPayment, GetValutaByCode(ssn, "RUB"));
            }

            return(repaymentJournalSum);
        }
Пример #10
0
        //private csValuta GetValutaByBankAccount(Session ses, crmBankAccount bankAccount) {
        //    //XPQuery<csValuta> valutas = new XPQuery<csValuta>(ses);
        //    //return (from valuta in valutas
        //    //                    where valuta.CodeCurrencyValue == bankAccount.Number.Substring(5, 3)
        //    //                    select valuta).First();
        //    return new XPQuery<csValuta>(ses).Where(p => p.CodeCurrencyValue == bankAccount.Number.Substring(5, 3)).First();
        //}

        private void AssignCommonProperty(fmCDocRCB paymentDoc, fmCSAStatementAccountDoc doc)
        {
            paymentDoc.AcceptanceDuration       = doc.AcceptanceDuration;
            paymentDoc.AccountNumberSupplier    = doc.AccountNumberSupplier;
            paymentDoc.AdvancedConditions       = doc.AdvancedConditions;
            paymentDoc.AkkreditiveKind          = doc.AkkreditiveKind;
            paymentDoc.CompilerStatus           = doc.CompilerStatus;
            paymentDoc.CompilerStatus           = doc.CompilerStatus;
            paymentDoc.DateIndicator            = doc.DateIndicator;
            paymentDoc.DeductedFromPayerAccount = doc.DeductedFromPayerAccount;
            paymentDoc.DocDate             = doc.DocDate;
            paymentDoc.DocNumber           = doc.DocNumber;
            paymentDoc.DocType             = doc.DocType; // 2012-04-12 раскомментил
            paymentDoc.DocumentSendingDate = doc.DocumentSendingDate;
            paymentDoc.KBKStatus           = doc.KBKStatus;
            paymentDoc.NumberIndicator     = doc.NumberIndicator;
            paymentDoc.OKATO                   = doc.OKATO;
            paymentDoc.OperationKind           = doc.OperationKind;
            paymentDoc.PaymentByRepresentation = doc.PaymentByRepresentation;
            paymentDoc.PaymentCondition        = doc.PaymentCondition;
            paymentDoc.PaymentCost             = doc.PaymentCost;
            paymentDoc.PaymentCostCopybook     = doc.PaymentCostCopybook;
            paymentDoc.PaymentDeadLine         = doc.PaymentDeadLine;
            //paymentDoc.PaymentDocument = doc.PaymentDocument;
            paymentDoc.PaymentFunction     = doc.PaymentFunction;
            paymentDoc.PaymentFunctionCode = doc.PaymentFunctionCode;
            paymentDoc.PaymentKind         = doc.PaymentKind;
            //paymentDoc.PaymentPayerRequisites = doc.PaymentPayerRequisites;   // 2012-04-11
            //paymentDoc.PaymentReceiverRequisites = doc.PaymentReceiverRequisites;   // 2012-04-11
            paymentDoc.PaymentResField         = doc.PaymentResField;
            paymentDoc.PaymentSequence         = doc.PaymentSequence;
            paymentDoc.PeriodIndicator         = doc.PeriodIndicator;
            paymentDoc.ReasonIndicator         = doc.ReasonIndicator;
            paymentDoc.ReceivedByPayerBankDate = doc.ReceivedByPayerBankDate;
            paymentDoc.TicketContent           = doc.TicketContent;
            paymentDoc.TicketDate    = doc.TicketDate;
            paymentDoc.TicketTime    = doc.TicketTime;
            paymentDoc.TypeIndicator = doc.TypeIndicator;

            AssignRequsites(paymentDoc.PaymentPayerRequisites, doc.PaymentPayerRequisites);
            AssignRequsites(paymentDoc.PaymentReceiverRequisites, doc.PaymentReceiverRequisites);
        }
        private Decimal GetRequestSumByCourse(UnitOfWork uow, fmCDocRCB PaymentDocument, fmCPRPaymentRequest paymentRequest, csValuta valutaPayment)
        {
            // Поясение о вычислении. Сумма в заявке - это в в валюте обязательств, чтобы её сравнить
            // с суммой платежа, надо перевести по кросс-курсу к валюте платежа и уже полученную сумму сравнить. Вопрос: на
            // какой день брать курс? Предлагается брать непустую из двух дат: this.DeductedFromPayerAccount или this.ReceivedByPayerBankDate

            // Тривиальный случай: валюта платежа совпадает с валютой обязательство
            if (paymentRequest.Valuta == valutaPayment)
            {
                return(paymentRequest.Summ);   //.PaymentSumm;
            }


            // Валюты платежа и обязательств не совпадают. Надо вычислять кросс-курс на дату courseDate (изменения счёта)
            DateTime courseDate  = (PaymentDocument.DeductedFromPayerAccount != DateTime.MinValue) ? PaymentDocument.DeductedFromPayerAccount : PaymentDocument.ReceivedByPayerBankDate; //paymentRequest.PayDate;
            Decimal  crossCource = csCNMValutaCourse.GetCrossCourceOnDate(uow, courseDate, paymentRequest.Valuta, valutaPayment);

            Decimal resultSum = Math.Round(paymentRequest.Summ * crossCource, 4);

            return(resultSum);
        }
Пример #12
0
        private void CreateCFRegisterRecord(Session ssn, ForCashFlowRecord cashFlowRecord)     //, crmCParty ourParty) {
        {
            crmCashFlowRegister cfr = new crmCashFlowRegister(ssn);

            fmCPRRepaymentTask  repaymentTask  = cashFlowRecord.repaymentTask;
            fmCDocRCB           paymentDoc     = cashFlowRecord.paymentDoc;
            fmCPRPaymentRequest paymentRequest = cashFlowRecord.paymentRequest;

            Guid token = paymentRequest.Oid;

            cfr.Token   = token;
            cfr.Section = CashFlowRegisterSection.REPAYMENT_JOURNAL;

            cfr.SourceGUID = repaymentTask.Oid;   // Будет пустой GUID
            cfr.SourceType = repaymentTask.GetType();

            cfr.PaymentDocument = paymentDoc;
            cfr.BankAccount     = repaymentTask.BankAccount;
            cfr.Bank            = repaymentTask.BankAccount.Bank;
            cfr.OperationDate   = cashFlowRecord.date;

            fmCPRPaymentRequestContract paymentRequestContract = paymentRequest as fmCPRPaymentRequestContract;

            //if (paymentRequestContract != null && paymentRequestContract.ContractDeal != null) {
            //    cfr.Contract = paymentRequestContract.ContractDeal.Contract;
            //}
            if (paymentRequestContract != null)
            {
                cfr.Contract     = paymentRequestContract.Contract;
                cfr.ContractDeal = paymentRequestContract.ContractDeal;
            }

            cfr.fmOrder  = cashFlowRecord.paymentRequestObligation.Order;
            cfr.CostItem = cashFlowRecord.paymentRequestObligation.CostItem;
            cfr.Subject  = (cashFlowRecord.paymentRequestObligation.Order != null) ? cashFlowRecord.paymentRequestObligation.Order.Subject : null;

            cfr.PrimaryParty    = paymentRequest.PartyPaySender;
            cfr.ContragentParty = paymentRequest.PartyPayReceiver;

            //cfr.ObligationUnit =
            //cfr.PaymentItem =

            cfr.ValutaPayment    = paymentDoc.GetAccountValuta();
            cfr.ValutaObligation = cashFlowRecord.paymentRequestObligation.Valuta;

            // В валюте платежа
            //cfr.SumIn = this.PaymentDocument.GetSumIn(this.BankAccount);
            //cfr.SumOut = this.PaymentDocument.GetSumOut(this.BankAccount);

            /*
             * if (paymentDoc.PaymentReceiverRequisites.INN == ourParty.INN) {   // && this.PaymentDocument.PaymentReceiverRequisites.StatementOfAccount.BankAccount == this.BankAccount) {
             *  cfr.SumIn = paymentDoc.PaymentCost;
             * }
             * if (paymentDoc.PaymentPayerRequisites.INN == ourParty.INN) {   // && this.PaymentDocument.PaymentPayerRequisites.StatementOfAccount.BankAccount == this.BankAccount) {
             *  cfr.SumOut = paymentDoc.PaymentCost;
             * }
             */
            if (paymentDoc.PaymentReceiverRequisites.BankAccount == cashFlowRecord.repaymentJournalRecord.BankAccount)     // && this.PaymentDocument.PaymentReceiverRequisites.StatementOfAccount.BankAccount == this.BankAccount) {
            //cfr.SumIn = cashFlowRecord.repaymentJournalRecord.SumIn;
            {
                cfr.SumIn = cashFlowRecord.sum;
            }
            if (paymentDoc.PaymentPayerRequisites.BankAccount == cashFlowRecord.repaymentJournalRecord.BankAccount)     // && this.PaymentDocument.PaymentPayerRequisites.StatementOfAccount.BankAccount == this.BankAccount) {
            //cfr.SumOut = cashFlowRecord.repaymentJournalRecord.SumOut;
            {
                cfr.SumOut = cashFlowRecord.sum;
            }



            // В валюте обязательств

            /*
             * if (paymentDoc.PaymentReceiverRequisites.INN == ourParty.INN) {   // && this.PaymentDocument.PaymentReceiverRequisites.StatementOfAccount.BankAccount == this.BankAccount) {
             *  cfr.SumObligationIn = cashFlowRecord.sum;
             * }
             * if (paymentDoc.PaymentPayerRequisites.INN == ourParty.INN) {   // && this.PaymentDocument.PaymentPayerRequisites.StatementOfAccount.BankAccount == this.BankAccount) {
             *  cfr.SumObligationOut = cashFlowRecord.sum;
             * }
             */
            if (paymentDoc.PaymentReceiverRequisites.BankAccount == cashFlowRecord.repaymentJournalRecord.BankAccount)     // && this.PaymentDocument.PaymentReceiverRequisites.StatementOfAccount.BankAccount == this.BankAccount) {
            //cfr.SumObligationIn = cashFlowRecord.sum;
            {
                cfr.SumObligationIn = Math.Round(cfr.SumIn * csCNMValutaCourse.GetCrossCourceOnDate(ssn, paymentDoc.GetAccountDateChange(), cfr.ValutaPayment, cfr.ValutaObligation), 4);
            }
            if (paymentDoc.PaymentPayerRequisites.BankAccount == cashFlowRecord.repaymentJournalRecord.BankAccount)     // && this.PaymentDocument.PaymentPayerRequisites.StatementOfAccount.BankAccount == this.BankAccount) {
            //cfr.SumObligationOut = cashFlowRecord.sum;
            {
                cfr.SumObligationOut = Math.Round(cfr.SumOut * csCNMValutaCourse.GetCrossCourceOnDate(ssn, paymentDoc.GetAccountDateChange(), cfr.ValutaPayment, cfr.ValutaObligation), 4);
            }

            // В рублях
            try {
                cfr.SumInAcc  = Math.Round(cfr.SumIn * csCNMValutaCourse.GetCrossCourceOnDate(ssn, paymentDoc.GetAccountDateChange(), cfr.ValutaPayment, GetValutaByCode(ssn, "RUB")), 4);
                cfr.SumOutAcc = Math.Round(cfr.SumOut * csCNMValutaCourse.GetCrossCourceOnDate(ssn, paymentDoc.GetAccountDateChange(), cfr.ValutaPayment, GetValutaByCode(ssn, "RUB")), 4);
            }
            catch {
            }

            cfr.PaymentRequestObligationGUID = cashFlowRecord.paymentRequestObligationGUID;

            //if (this.PaymentReceiverRequisites.INN == OurParty.INN && this.PaymentReceiverRequisites.StatementOfAccount.BankAccount == bankAccount) {
            //    Res = this.PaymentCost;
            //}
        }
Пример #13
0
        private void DistributeSum(Session ssn, fmCPRRepaymentJurnal repaymentJournalRecord)
        {
            // Задача привязки
            fmCPRRepaymentTask repaymentTask = new fmCPRRepaymentTask(ssn);
            fmCDocRCB          paymentDoc    = repaymentJournalRecord.PaymentDocument;

            repaymentTask.BankAccount     = repaymentJournalRecord.BankAccount;
            repaymentTask.PaymentDocument = paymentDoc;
            //repaymentTask.FillRepaymentTaskLines();
            //repaymentTask.FillRequestList();

            // Сумма, которую надо распределить между обязательствами заявки
            Decimal distributeSum = 0;                                                                  // repaymentJournalRecord.SumOut;   //GetSumRepaymentJournal(ssn, paymentDoc);

            if (paymentDoc.PaymentReceiverRequisites.BankAccount == repaymentJournalRecord.BankAccount) // && this.PaymentDocument.PaymentReceiverRequisites.StatementOfAccount.BankAccount == this.BankAccount) {
            {
                distributeSum = repaymentJournalRecord.SumIn;
            }
            if (paymentDoc.PaymentPayerRequisites.BankAccount == repaymentJournalRecord.BankAccount)     // && this.PaymentDocument.PaymentPayerRequisites.StatementOfAccount.BankAccount == this.BankAccount) {
            {
                distributeSum = repaymentJournalRecord.SumOut;
            }

            if (distributeSum == 0)
            {
                return;
            }

            List <ForCashFlowRecord> cashFlowRecordList = new List <ForCashFlowRecord>();

            // Применяем механизм пропорциональной разбивки
            Decimal intermediateDistributeSum = 0;

            if (distributeSum != 0)
            {
                Decimal totalOblSum = 0;
                foreach (fmCPRPaymentRequestObligation pro in repaymentJournalRecord.PaymentRequest.PaySettlmentOfObligations)
                {
                    totalOblSum += pro.Summ;
                }


                foreach (fmCPRPaymentRequestObligation pro in repaymentJournalRecord.PaymentRequest.PaySettlmentOfObligations)
                {
                    Decimal proSum = Math.Round((pro.Summ / totalOblSum) * distributeSum, 4);

                    // Пишем в промежуточный объект ForCashFlowRecord
                    ForCashFlowRecord cashFlowRecord = new ForCashFlowRecord();
                    cashFlowRecord.repaymentJournalRecord   = repaymentJournalRecord;
                    cashFlowRecord.paymentDoc               = paymentDoc;
                    cashFlowRecord.repaymentTask            = repaymentTask;
                    cashFlowRecord.paymentRequest           = repaymentJournalRecord.PaymentRequest;
                    cashFlowRecord.paymentRequestObligation = pro;
                    cashFlowRecord.sum  = proSum;
                    cashFlowRecord.date = paymentDoc.GetAccountDateChange();
                    cashFlowRecord.paymentRequestObligationGUID = pro.Oid;

                    cashFlowRecordList.Add(cashFlowRecord);

                    intermediateDistributeSum += proSum;
                }
            }

            // Разница между distributeSum и суммой по подуровню в результате ошибки округления
            Decimal diff = intermediateDistributeSum - distributeSum;

            if (diff != 0)
            {
                // Внесение поправки: нахождение самого большого по модулю значения и изменение этого значения
                // (без помощи linq)
                Decimal valueMax = 0;
                for (int i = 0; i < cashFlowRecordList.Count(); i++)
                {
                    if (Math.Abs(cashFlowRecordList[i].sum) > valueMax)
                    {
                        valueMax = Math.Abs(cashFlowRecordList[i].sum);
                    }
                }

                for (int i = 0; i < cashFlowRecordList.Count(); i++)
                {
                    if (Math.Abs(cashFlowRecordList[i].sum) == valueMax)
                    {
                        cashFlowRecordList[i].sum -= diff;
                        break;
                    }
                }
            }

            CreateCFRegisterRecords(ssn, cashFlowRecordList);   //, GetOurParty(ssn));
        }
Пример #14
0
        // 2012-04-12 От шаблона по типу можно отказаться?
        public void CreatePaymentDocuments(Session ses, fmCSAStatementAccount statementAccount)
        {
            var queryStatementDocs = (statementAccount.PayInDocs.Union(statementAccount.PayOutDocs));

            foreach (var doc in queryStatementDocs)
            {
                //if (doc.NameTypeOfRCBDocument != typeof(typeDoc).FullName) continue;

                // Проверка наличия Платёжного документа, подходящего для данного документа выписки doc
                // 1. Тип документа, например, fmCDocRCBPaymentOrder и т.п.
                // 2. Номер счёта плательщика
                // 3. Номер документа DocNumber
                // 4. Дата документа DocDate

                XPQuery <fmCDocRCB> paymentDocs = new XPQuery <fmCDocRCB>(ses, true);
                // 2012-04-12 Новый способ проверки: Тип (учитывается как параметр), Номер документа, Дата документа, БИК банка плательщика,
                // счёт плательщика, БИК банка получаетля, счёт получателя
                var queryPaymentDocs = from paymentDoc in paymentDocs
                                       where paymentDoc.DocType == doc.DocType &&
                                       paymentDoc.DocNumber == doc.DocNumber &&
                                       paymentDoc.DocDate == doc.DocDate &&
                                       paymentDoc.PaymentPayerRequisites.RCBIC == doc.PaymentPayerRequisites.RCBIC && paymentDoc.PaymentPayerRequisites.AccountParty == doc.PaymentPayerRequisites.AccountParty &&
                                       paymentDoc.PaymentReceiverRequisites.RCBIC == doc.PaymentReceiverRequisites.RCBIC && paymentDoc.PaymentReceiverRequisites.AccountParty == doc.PaymentReceiverRequisites.AccountParty &&
                                       paymentDoc.PaymentFunction == doc.PaymentFunction
                                       select paymentDoc;


                bool isFound = false;
                foreach (var paymentDoc in queryPaymentDocs)
                {
                    isFound = true;

                    // Найден какой-то Платёжный документ заданного типа -> сумма выписки учитывается в регистре, а сам Платёжный документ припиывается
                    // документу выписки
                    doc.PaymentDocument = paymentDoc;
                    AssignCommonProperty(paymentDoc, doc); // ??? Надо обновлять ???

                    break;
                }

                if (!isFound)
                {
                    // Не найден никакой документ заданного типа -> создаётся Платёжный документ соответствующего типа
                    fmCDocRCB paymentDoc = null;
                    if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBPaymentOrder).FullName)
                    {
                        paymentDoc = new fmCDocRCBPaymentOrder(ses);
                    }
                    if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBPaymentRequest).FullName)
                    {
                        paymentDoc = new fmCDocRCBPaymentRequest(ses);
                    }
                    if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBAkkreditivRequest).FullName)
                    {
                        paymentDoc = new fmCDocRCBAkkreditivRequest(ses);
                    }
                    if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBInkassOrder).FullName)
                    {
                        paymentDoc = new fmCDocRCBInkassOrder(ses);
                    }
                    if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBOthers).FullName)
                    {
                        paymentDoc = new fmCDocRCBOthers(ses);
                    }

                    paymentDoc.DocType  = doc.DocType;
                    paymentDoc.State    = PaymentDocProcessingStates.IMPORTED;
                    doc.PaymentDocument = paymentDoc;
                    AssignCommonProperty(paymentDoc, doc);
                }
            }
        }
Пример #15
0
        //public void CreatePaymentDocument(fmStatementOfAccount statementAccount) {
        public void CreatePaymentDocuments <typeDoc>(Session ses, fmCSAStatementAccount statementAccount) where typeDoc : fmCDocRCB
        {
            //DateTime DatePeriodBegin = statementAccount.DateFrom.Date;
            //DateTime DatePeriodEnd = statementAccount.DateTo.Date;

            /* 2012-04-11
             * XPQuery<fmCSAStatementAccountDoc> docs = new XPQuery<fmCSAStatementAccountDoc>(ses, true);
             * var queryStatementDocs = from statementDoc in docs
             *                       where //statementDoc.PaymentDocument == null
             * //                                         && (statementAccount.PayInDocs.Contains<fmCSAStatementAccountDoc>(statementDoc) || statementAccount.PayOutDocs.Contains<fmCSAStatementAccountDoc>(statementDoc))
             *                             (statementDoc.PaymentPayerRequisites.StatementOfAccount == statementAccount ||
             *                              statementDoc.PaymentReceiverRequisites.StatementOfAccount == statementAccount)
             *                           && statementDoc.NameTypeOfRCBDocument == typeof(typeDoc).FullName
             *                       select statementDoc;
             */

            var queryStatementDocs = (statementAccount.PayInDocs.Union(statementAccount.PayOutDocs)).Where(d => d.NameTypeOfRCBDocument == typeof(typeDoc).FullName);

            foreach (var doc in queryStatementDocs)
            {
                //if (doc.NameTypeOfRCBDocument != typeof(typeDoc).FullName) continue;

                // Проверка наличия Платёжного документа, подходящего для данного документа выписки doc
                // 1. Тип документа, например, fmCDocRCBPaymentOrder и т.п.
                // 2. Номер счёта плательщика
                // 3. Номер документа DocNumber
                // 4. Дата документа DocDate

                XPQuery <typeDoc> paymentDocs = new XPQuery <typeDoc>(ses, true);

                /* 2012-04-11
                 * var queryPaymentDocs = from paymentDoc in paymentDocs
                 *                     where (doc.PaymentPayerRequisites.AccountParty == statementAccount.BankAccountText
                 *                           && paymentDoc.PaymentPayerRequisites.AccountParty == doc.PaymentPayerRequisites.AccountParty
                 ||
                 ||                           doc.PaymentReceiverRequisites.AccountParty == statementAccount.BankAccountText
                 ||                          && paymentDoc.PaymentReceiverRequisites.AccountParty == doc.PaymentReceiverRequisites.AccountParty)
                 ||                        && paymentDoc.DocNumber == doc.DocNumber
                 ||                        && paymentDoc.DocDate == doc.DocDate
                 ||                    select paymentDoc;
                 */
                // Для входящих платежей - дополнительная проверка по тексту PaymentFunction
                // В качестве признака входящего/исходящего платежа можно взять условие непустоты полей StatementAccountIn/StatementAccountOut
                // 2012-04-12 Телефонный разговор: сменилась концепция проверки подходящего платёжного документа

                /*
                 * var queryPaymentDocs = from paymentDoc in paymentDocs
                 *                     where (doc.PaymentPayerRequisites.AccountParty == statementAccount.BankAccountText
                 *                           && paymentDoc.PaymentPayerRequisites.AccountParty == doc.PaymentPayerRequisites.AccountParty
                 ||
                 ||                           doc.PaymentReceiverRequisites.AccountParty == statementAccount.BankAccountText
                 ||                          && paymentDoc.PaymentReceiverRequisites.AccountParty == doc.PaymentReceiverRequisites.AccountParty)
                 ||                        && paymentDoc.PaymentPayerRequisites.INN == doc.PaymentPayerRequisites.INN && paymentDoc.PaymentPayerRequisites.KPP == doc.PaymentPayerRequisites.KPP
                 ||                        && paymentDoc.PaymentReceiverRequisites.INN == doc.PaymentReceiverRequisites.INN && paymentDoc.PaymentReceiverRequisites.KPP == doc.PaymentReceiverRequisites.KPP
                 ||                        && paymentDoc.DocNumber == doc.DocNumber
                 ||                        && paymentDoc.DocDate == doc.DocDate
                 ||                        && (doc.StatementAccountIn == null || paymentDoc.PaymentFunction == doc.PaymentFunction)
                 ||                    select paymentDoc;
                 */
                // 2012-04-12 Новый способ проверки: Тип (учитывается как параметр), Номер документа, Дата документа, БИК банка плательщика,
                // счёт плательщика, БИК банка получаетля, счёт получателя
                var queryPaymentDocs = from paymentDoc in paymentDocs
                                       where paymentDoc.DocType == doc.DocType &&
                                       paymentDoc.DocNumber == doc.DocNumber &&
                                       paymentDoc.DocDate == doc.DocDate &&
                                       paymentDoc.PaymentPayerRequisites.RCBIC == doc.PaymentPayerRequisites.RCBIC && paymentDoc.PaymentPayerRequisites.AccountParty == doc.PaymentPayerRequisites.AccountParty &&
                                       paymentDoc.PaymentReceiverRequisites.RCBIC == doc.PaymentReceiverRequisites.RCBIC && paymentDoc.PaymentReceiverRequisites.AccountParty == doc.PaymentReceiverRequisites.AccountParty &&
                                       paymentDoc.PaymentFunction == doc.PaymentFunction
                                       select paymentDoc;


                bool isFound = false;
                foreach (var paymentDoc in queryPaymentDocs)
                {
                    isFound = true;

                    // Найден какой-то Платёжный документ заданного типа -> сумма выписки учитывается в регистре, а сам Платёжный документ припиывается
                    // документу выписки
                    doc.PaymentDocument = paymentDoc;
                    AssignCommonProperty(paymentDoc, doc); // ??? Надо обновлять ???

                    break;
                }

                if (!isFound)
                {
                    // Не найден никакой документ заданного типа -> создаётся Платёжный документ соответствующего типа
                    fmCDocRCB paymentDoc = null;
                    if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBPaymentOrder).FullName)
                    {
                        paymentDoc = new fmCDocRCBPaymentOrder(ses);
                    }
                    if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBPaymentRequest).FullName)
                    {
                        paymentDoc = new fmCDocRCBPaymentRequest(ses);
                    }
                    if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBAkkreditivRequest).FullName)
                    {
                        paymentDoc = new fmCDocRCBAkkreditivRequest(ses);
                    }
                    if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBInkassOrder).FullName)
                    {
                        paymentDoc = new fmCDocRCBInkassOrder(ses);
                    }
                    if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBOthers).FullName)
                    {
                        paymentDoc = new fmCDocRCBOthers(ses);
                    }

                    paymentDoc.DocType  = doc.DocType;
                    paymentDoc.State    = PaymentDocProcessingStates.IMPORTED;
                    doc.PaymentDocument = paymentDoc;
                    AssignCommonProperty(paymentDoc, doc);
                }
            }
        }
        public override void UpdateDatabaseAfterUpdateSchema()
        {
            base.UpdateDatabaseAfterUpdateSchema();
            // Disable version
            if (this.CurrentDBVersion != new Version("0.0.0.0"))
            {
                return;
            }
            //

            IObjectSpace os  = ObjectSpace;
            Session      ssn = ((ObjectSpace)os).Session;

            // Заполнение кодов ценностей и курсов валют
            UpdaterVaultaCourse uvc = new UpdaterVaultaCourse(ssn);

            uvc.FixValutaCourseEtc();
            os.CommitChanges();

            if (this.CurrentDBVersion.ToString() != "1.1.1.107")
            {
                return;
            }

            XPQuery <fmAutoBindingUpdater> autoBindingUpdaters = new XPQuery <fmAutoBindingUpdater>(ssn);
            fmAutoBindingUpdater           ABU = (from autoBindingUpdater in autoBindingUpdaters
                                                  select autoBindingUpdater).FirstOrDefault();

            if (ABU == null)
            {
                ABU = os.CreateObject <fmAutoBindingUpdater>();
            }
            if (ABU.AutoBindingUpdater)
            {
                return; // Updater уже исполнялся
            }
            // Зачистка fmCPRRepaymentJurnal результатов предыдущей автоматической привязки
            XPQuery <fmCPRRepaymentJurnal> paymentJurnals = new XPQuery <fmCPRRepaymentJurnal>(ssn);
            var queryRJ = (from paymentJurnal in paymentJurnals
                           select paymentJurnal).ToList <fmCPRRepaymentJurnal>();

            ssn.Delete(queryRJ);
            //ssn.PurgeDeletedObjects();
            //os.CommitChanges();
            //ssn.ExecuteQuery("UPDATE \"fmPRRepaymentJurnal\" SET \"GCRecord\"=null;");

            // Зачистка fmCPRRepaymentTask результатов предыдущей автоматической привязки
            XPQuery <fmCPRRepaymentTask> repaymentTasks = new XPQuery <fmCPRRepaymentTask>(ssn);
            var queryRT = (from repaymentTask in repaymentTasks
                           select repaymentTask).ToList <fmCPRRepaymentTask>();

            ssn.Delete(queryRT);
            ssn.PurgeDeletedObjects();
            os.CommitChanges();

            // Возвращение PAYED в IN_PAYMENT
            XPQuery <fmCPRPaymentRequest> paymentRequests = new XPQuery <fmCPRPaymentRequest>(ssn, true);
            var queryPR = (from paymentRequest in paymentRequests
                           where paymentRequest.State == PaymentRequestStates.PAYED
                           select paymentRequest).ToList <fmCPRPaymentRequest>();

            foreach (var pr in queryPR)
            {
                pr.State = PaymentRequestStates.IN_PAYMENT;
            }
            os.CommitChanges();

            // "Наша" организация (она там одна, отсев не нужен)
            crmUserParty.CurrentUserParty = ValueManager.GetValueManager <crmUserParty>("UserParty");
            XPQuery <crmUserParty> userParties = new XPQuery <crmUserParty>(ssn);
            var queryUP = (from userParty in userParties
                           select userParty).ToList <crmUserParty>();

            foreach (var up in queryUP)
            {
                crmUserParty.CurrentUserParty.Value = (crmUserParty)up;
                break;
            }

            // Новая автоматическая привязка
            DateTime startDate = new DateTime(2012, 4, 1);
            XPQuery <fmCSAImportResult> importResults = new XPQuery <fmCSAImportResult>(ssn);
            var queryIR = (from importResult in importResults
                           select importResult).ToList <fmCSAImportResult>();

            foreach (var ir in queryIR)
            {
                //ir.AutoBinding(null);

                foreach (fmCSAStatementAccount sa in ir.StatementOfAccounts)
                {
                    //ssa.AutoBinding(null);
                    foreach (fmCSAStatementAccountDoc sad in sa.PayInDocs)
                    {
                        if (sad.DocDate >= startDate)
                        {
                            fmCDocRCB paymentDoc = sad.PaymentDocument;
                            paymentDoc.AutoBinding(sa.BankAccount, null);
                        }
                    }
                    foreach (fmCSAStatementAccountDoc sad in sa.PayOutDocs)
                    {
                        if (sad.DocDate >= startDate)
                        {
                            fmCDocRCB paymentDoc = sad.PaymentDocument;
                            paymentDoc.AutoBinding(sa.BankAccount, null);
                        }
                    }
                }

                os.CommitChanges();
            }



            // Простановка признаков заявкам и документам, что они были привязаны, чтобы следующее выполнение этого updater
            // не изменяло ничего.
            ABU.AutoBindingUpdater = true;

            os.CommitChanges();
        }
        public static fmCPRPaymentRequest CreateRequest(IObjectSpace workOS, fmCPRRepaymentTask repaymentTask, Type objType, FinRequestKind requestKind)
        {
            if (repaymentTask == null)
            {
                return(null);
            }

            fmCPRPaymentRequest req = workOS.CreateObject(objType) as fmCPRPaymentRequest;

            if (req != null)
            {
                req.State = PaymentRequestStates.OPEN;
                //req.ExtDocDate = DateTime.Now;
                req.Date = DateTime.Now;
                if (repaymentTask.PaymentDocument != null)
                {
                    fmCDocRCB doc  = repaymentTask.PaymentDocument;
                    fmCDocRCB nDoc = workOS.GetObject <fmCDocRCB>(doc);
                    if (nDoc.PaymentPayerRequisites != null)
                    {
                        req.PartyPaySender = nDoc.PaymentPayerRequisites.Party;
                    }
                    if (nDoc.PaymentReceiverRequisites != null)
                    {
                        req.PartyPayReceiver = nDoc.PaymentReceiverRequisites.Party;
                    }
                    //                    req.Number = nDoc.DocNumber;
                    req.ExtDocNumber = nDoc.DocNumber;
                    req.ExtDocDate   = nDoc.DocDate;
                    //                    req.Date = DateTime.Now;
                    req.Summ          = nDoc.PaymentCost; // По умолчанию указывваем полную сумму платёжного документа
                    req.PayDate       = nDoc.GetAccountDateChange();
                    req.PaymentValuta = nDoc.GetAccountValuta();
                    //req.Valuta = nDoc.GetAccountValuta();   // По умолчания указываем валюту платежа в качестве валюты обязательств
                    req.Comment = nDoc.PaymentFunction;

                    // Случай финансовой заявки
                    fmCPRPaymentRequestFinOrder reqFin = req as fmCPRPaymentRequestFinOrder;
                    if (reqFin != null)
                    {
                        reqFin.FinanceRequestKind = requestKind;

                        if (requestKind == FinRequestKind.BANK_COMISSION || requestKind == FinRequestKind.PAYMENT_PERCENTS)
                        {
                            if (nDoc.PaymentReceiverRequisites.Party == null && nDoc.PaymentReceiverRequisites.BankAccount != null && nDoc.PaymentReceiverRequisites.BankAccount != null && nDoc.PaymentReceiverRequisites.BankAccount.Bank != null)
                            {
                                nDoc.PaymentReceiverRequisites.Party = nDoc.PaymentReceiverRequisites.BankAccount.Bank.Party;
                            }
                        }
                        if (requestKind == FinRequestKind.RECEIVING_PERCENTS)
                        {
                            if (nDoc.PaymentPayerRequisites.Party == null && nDoc.PaymentPayerRequisites.BankAccount != null && nDoc.PaymentPayerRequisites.BankAccount != null && nDoc.PaymentPayerRequisites.BankAccount.Bank != null)
                            {
                                nDoc.PaymentPayerRequisites.Party = nDoc.PaymentPayerRequisites.BankAccount.Bank.Party;
                            }
                        }
                        if (requestKind == FinRequestKind.PURSHASE_CURRENCY || requestKind == FinRequestKind.SALE_CURRENCY)
                        {
                            if (repaymentTask.BankAccount == nDoc.PaymentPayerRequisites.BankAccount)
                            {
                                if (nDoc.PaymentReceiverRequisites.Party == null && nDoc.PaymentReceiverRequisites.BankAccount != null && nDoc.PaymentReceiverRequisites.BankAccount != null && nDoc.PaymentReceiverRequisites.BankAccount.Bank != null)
                                {
                                    nDoc.PaymentReceiverRequisites.Party = nDoc.PaymentReceiverRequisites.BankAccount.Bank.Party;
                                }
                            }
                            else if (repaymentTask.BankAccount == nDoc.PaymentReceiverRequisites.BankAccount)
                            {
                                if (nDoc.PaymentPayerRequisites.Party == null && nDoc.PaymentPayerRequisites.BankAccount != null && nDoc.PaymentPayerRequisites.BankAccount != null && nDoc.PaymentPayerRequisites.BankAccount.Bank != null)
                                {
                                    nDoc.PaymentPayerRequisites.Party = nDoc.PaymentPayerRequisites.BankAccount.Bank.Party;
                                }
                            }
                        }

                        reqFin.SetSum(nDoc.PaymentCost);

                        reqFin.State = PaymentRequestStates.FINANCE_PAYMENT;   // ПОзволено редактирование Заказа, статьи, суммы
                        //nDoc.State = PaymentDocProcessingStates.PROCESSED;
                    }
                }
            }
            return(req);
        }
Пример #18
0
        /*
         * public void CreateOtherPaymentDocument() {
         *  XPQuery<fmCStatementAccountDoc> StatementDocs = new XPQuery<fmCStatementAccountDoc>(this.Session);
         *  var queryStatementDocs = from statementDoc in StatementDocs
         *                           where statementDoc.PaymentDocument == null &&
         *                                 statementDoc.DocType != null &&
         *                                 statementDoc.DocType.Trim() != ""
         * //                                           !string.IsNullOrEmpty(statementDoc.DocType)
         *                           select statementDoc;
         *
         *  foreach (var doc in queryStatementDocs) {
         *      fmCDocRCBOthers otherDoc = new fmCDocRCBOthers(this.Session);
         *      doc.PaymentDocument = otherDoc;
         *      AssignCommonProperty(otherDoc, doc);
         *      otherDoc.DocType = doc.DocType;
         *  }
         * }
         */

        //public void CreatePaymentDocument(fmStatementOfAccount statementAccount) {
        public void CreatePaymentDocument <typeDoc>(fmCSAStatementAccount statementAccount) where typeDoc : fmCDocRCB
        {
            DateTime DatePeriodBegin = statementAccount.DateFrom.Date;
            DateTime DatePeriodEnd   = statementAccount.DateTo.Date;

            XPQuery <fmCSAStatementAccountDoc> statementDocs = new XPQuery <fmCSAStatementAccountDoc>(this.Session);
            var queryStatementDocs = from statementDoc in statementDocs
                                     where statementDoc.PaymentDocument == null &&
                                     (statementDoc.PaymentPayerRequisites.StatementOfAccount == statementAccount || statementDoc.PaymentReceiverRequisites.StatementOfAccount == statementAccount) &&
                                     statementDoc.NameTypeOfRCBDocument == typeof(typeDoc).FullName
                                     //&& statementDoc.PaymentPayerRequisites.AccountParty == statementAccount.BankAccountText
                                     select statementDoc;

            foreach (var doc in queryStatementDocs)
            {
                //if (doc.NameTypeOfRCBDocument != typeof(typeDoc).FullName) continue;

                // Проверка наличия Платёжного документа, подходящего для данного документа выписки doc
                // 1. Тип документа, например, fmCDocRCBPaymentOrder и т.п.
                // 2. Номер счёта плательщика
                // 3. Номер документа DocNumber
                // 4. Дата документа DocDate

                XPQuery <typeDoc> paymentDocs = new XPQuery <typeDoc>(this.Session, true);
                var queryPaymentDocs          = from paymentDoc in paymentDocs
                                                where paymentDoc.PaymentPayerRequisites.AccountParty == doc.PaymentPayerRequisites.AccountParty &&
                                                paymentDoc.DocNumber == doc.DocNumber &&
                                                paymentDoc.DocDate == doc.DocDate
                                                select paymentDoc;

                bool isFound = false;
                foreach (var paymentDoc in queryPaymentDocs)
                {
                    isFound = true;

                    // Найден какой-то Платёжный документ заданного типа -> сумма выписки учитывается в регистре, а сам Платёжный документ припиывается
                    // документу выписки
                    doc.PaymentDocument = paymentDoc;
                    //AssignCommonProperty(paymentDoc, doc); // ??? Надо обновлять ???

                    // Минусуем
                    // ????????? Даты границ берутся как даты документа или как даты списания со счёта ???????????????

                    /*
                     * XPQuery<fmSettlmentRegister> registers = new XPQuery<fmSettlmentRegister>(this.Session, true);
                     * var queryRegisters = from register in registers
                     *                       where register.PaymentDocument == paymentDoc
                     *                       && register.PaymentDocument.DocDate.Date >= DatePeriodBegin
                     *                       && register.PaymentDocument.DocDate.Date <= DatePeriodEnd
                     *                       && register.PaymentDocument.ComponentType.FullName == typeof(typeDoc).FullName
                     *                       select register;
                     */
                    XPQuery <fmSettlmentRegister> registers = new XPQuery <fmSettlmentRegister>(this.Session, true);
                    var queryRegisters = from register in registers
                                         where register.PaymentDocument == paymentDoc &&
                                         register.DeductedFromPayerAccount.Date >= DatePeriodBegin &&
                                         register.DeductedFromPayerAccount.Date <= DatePeriodEnd &&
                                         register.PaymentDocument.ComponentType.FullName == typeof(typeDoc).FullName
                                         select register;

                    foreach (var reg in queryRegisters)
                    {
                        if (reg.Sum > 0)
                        {
                            reg.Sum = -reg.Sum;
                        }
                    }

                    // Внесение корректировок в регистр. Правила следующие:
                    // 1. Если сверх имеющихся параметров (тип документа, номер документа, дата окумента, номер Счёта плательщика)
                    //    совпала сумма, то ничего не делаем, т.к. это попросту повторный документ выписки (уже присылали ранее)
                    // 2. Если сумма не совпала, то находим разность и вносим в регистр эту разность.
                    //if (paymentDoc.PaymentCost != doc.PaymentCost) {
                    decimal diff = doc.PaymentCost - paymentDoc.PaymentCost;

                    // Размещение в регистре
                    fmSettlmentRegister rg = new fmSettlmentRegister(Session);
                    rg.PaymentDocument     = paymentDoc;
                    rg.StatementAccountDoc = doc;
                    rg.Sum = diff;
                    //}

                    break;
                }

                if (!isFound)
                {
                    // Не найден никакой документ заданного типа -> создаётся Платёжный документ соответствующего типа
                    fmCDocRCB paymentDoc = null;
                    if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBPaymentOrder).FullName)
                    {
                        paymentDoc = new fmCDocRCBPaymentOrder(Session);
                    }
                    if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBPaymentRequest).FullName)
                    {
                        paymentDoc = new fmCDocRCBPaymentRequest(Session);
                    }
                    if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBAkkreditivRequest).FullName)
                    {
                        paymentDoc = new fmCDocRCBAkkreditivRequest(Session);
                    }
                    if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBInkassOrder).FullName)
                    {
                        paymentDoc = new fmCDocRCBInkassOrder(Session);
                    }
                    if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBOthers).FullName)
                    {
                        paymentDoc = new fmCDocRCBOthers(Session);
                    }

                    paymentDoc.DocType  = doc.DocType;
                    doc.PaymentDocument = paymentDoc;
                    AssignCommonProperty(paymentDoc, doc);

                    // Размещение в регистре
                    fmSettlmentRegister rg = new fmSettlmentRegister(Session);
                    rg.PaymentDocument     = paymentDoc;
                    rg.StatementAccountDoc = doc;
                    rg.Sum = doc.PaymentCost;
                }
            }

            /*
             * foreach (var doc in queryStatementDocs) {
             *
             *  // Проверка наличия Платёжного документа, подходящего для данного документа выписки doc
             *  // 1. Тип документа, например, fmCDocRCBPaymentOrder и т.п.
             *  // 2. Номер счёта плательщика
             *  // 3. Номер документа DocNumber
             *  // 4. Дата документа DocDate
             *
             *
             *  CriteriaOperator criteriaAND = new GroupOperator();
             *  ((GroupOperator)criteriaAND).OperatorType = GroupOperatorType.And;
             *
             *  // Номер счёта
             *  // Объяснение для Павла: если я создал Платёжный документ по какому-то предшествующему документу выписки,
             *  // то в этом Платёжном документе определён Плательщик как объект. С другой стороны, в документе выписки должен был определиться
             *  // Плательщик одинаковый с Плательщиком в родственном (т.е. оплачивающий доугую часть суммы) документе выписки.
             *  // Поэтому можно сравнивать по реквизитам, а не по самим счетам.
             *  CriteriaOperator criteria1 = new BinaryOperator(new OperandProperty("PaymentPayerRequisites.AccountParty"), new ConstantValue(doc.PaymentPayerRequisites.AccountParty), BinaryOperatorType.Equal);
             *
             *  // Номер документа
             *  CriteriaOperator criteria2 = new BinaryOperator(new OperandProperty("DocNumber"), new ConstantValue(doc.DocNumber), BinaryOperatorType.Equal);
             *
             *  // Дата документа
             *  CriteriaOperator criteria3 = new BinaryOperator(new OperandProperty("DocDate"), new ConstantValue(doc.DocDate), BinaryOperatorType.Equal);
             *
             *  // Проверка совпадения типа
             *  CriteriaOperator criteria4 = new BinaryOperator(new OperandProperty("ComponentType"), new ConstantValue(Type.GetType(doc.NameTypeOfRCBDocument)), BinaryOperatorType.Equal);
             *
             *  //OperandProperty propBank = new OperandProperty("Bank");
             *  //CriteriaOperator opBank = propBank == requisites.Bank;
             *
             *  //OperandProperty propPerson = new OperandProperty("Person");
             *  //CriteriaOperator opPerson = propPerson == requisites.Party.Person;
             *  //CriteriaOperator criteria3 = CriteriaOperator.Parse("Person.INN == '" + requisites.Party.Person.INN + "'");
             *
             *  ((GroupOperator)criteriaAND).Operands.Add(criteria1);
             *  ((GroupOperator)criteriaAND).Operands.Add(criteria3);
             *  ((GroupOperator)criteriaAND).Operands.Add(criteria3);
             *  ((GroupOperator)criteriaAND).Operands.Add(criteria4);
             *
             *  fmCDocRCB paymentDoc = this.Session.FindObject<fmCDocRCB>(criteriaAND);
             *  if (paymentDoc == null) {
             *      // Не найден никакой документ заданного типа -> создаётся Платёжный документ соответствующего типа
             *      if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBPaymentOrder).FullName) paymentDoc = new fmCDocRCBPaymentOrder(Session);
             *      if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBPaymentRequest).FullName) paymentDoc = new fmCDocRCBPaymentRequest(Session);
             *      if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBAkkreditivRequest).FullName) paymentDoc = new fmCDocRCBAkkreditivRequest(Session);
             *      if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBInkassOrder).FullName) paymentDoc = new fmCDocRCBInkassOrder(Session);
             *      if (doc.NameTypeOfRCBDocument == typeof(fmCDocRCBOthers).FullName) paymentDoc = new fmCDocRCBOthers(Session);
             *
             *      paymentDoc.DocType = doc.DocType;
             *      doc.PaymentDocument = paymentDoc;
             *      AssignCommonProperty(paymentDoc, doc);
             *
             *  } else {
             *      // Найден какой-то Платёжный документ заданного типа -> сумма выписки учитывается в регистре, а сам Платёжный документ припиывается
             *      // документу выписки
             *      doc.PaymentDocument = paymentDoc;
             *      //AssignCommonProperty(paymentDoc, doc); // ??? Надо обновлять ???
             *  }
             * }
             */
        }