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); }
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); }
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); } }
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); }
//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); }
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; //} }
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)); }
// 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); } } }
//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); }
/* * 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); // ??? Надо обновлять ??? * } * } */ }