/* * 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); // ??? Надо обновлять ??? * } * } */ }
// 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); } } }
private void UpdateRegister(Session ses, fmCSAStatementAccount statementAccount) { DateTime DatePeriodBegin = statementAccount.DateFrom.Date; DateTime DatePeriodEnd = statementAccount.DateTo.Date; XPQuery <fmCSAOperationJournal> OperJur = new XPQuery <fmCSAOperationJournal>(ses, true); var OperJurFact = from oper in OperJur where oper.OperationDate.Date >= DatePeriodBegin && oper.OperationDate.Date < DatePeriodEnd.Date.AddDays(1) && oper.BankAccount == statementAccount.BankAccount group oper by new { oper.OperationDate, oper.PaymentDocument } into registerGroup select new OperationJurnal { Date = registerGroup.Key.OperationDate, PayDoc = registerGroup.Key.PaymentDocument, StatementDoc = null, CurrentSumIn = registerGroup.Sum(oper => oper.SumIn), CurrentSumOut = registerGroup.Sum(oper => oper.SumOut) }; XPQuery <fmCSAStatementAccountDoc> StatAccountDoc = new XPQuery <fmCSAStatementAccountDoc>(ses, true); var OperJurStatIn = from doc in StatAccountDoc where doc.PaymentReceiverRequisites.StatementOfAccount == statementAccount && doc.ReceivedByPayerBankDate != DateTime.MinValue select new OperationJurnal { Date = doc.ReceivedByPayerBankDate, PayDoc = doc.PaymentDocument, StatementDoc = doc, StatementSumIn = doc.PaymentCost, }; var OperJurStatOut = from doc in StatAccountDoc where doc.PaymentPayerRequisites.StatementOfAccount == statementAccount && doc.DeductedFromPayerAccount != DateTime.MinValue select new OperationJurnal { Date = doc.DeductedFromPayerAccount, PayDoc = doc.PaymentDocument, StatementDoc = doc, StatementSumOut = doc.PaymentCost, }; var OperJurUnion = from oper in OperJurFact.Union(OperJurStatIn).Union(OperJurStatOut) group oper by new { Date = oper.Date, PayDoc = oper.PayDoc } into oper_group select new OperationJurnal { Date = oper_group.Key.Date, PayDoc = oper_group.Key.PayDoc, // StatementOper = oper_group.First(oper => oper.StatementDoc != null), CurrentSumIn = oper_group.Sum(oper => oper.CurrentSumIn), CurrentSumOut = oper_group.Sum(oper => oper.CurrentSumOut), StatementSumIn = oper_group.Sum(oper => oper.StatementSumIn), StatementSumOut = oper_group.Sum(oper => oper.StatementSumOut) }; foreach (OperationJurnal oper in OperJurUnion) { if (oper.CurrentSumIn != oper.StatementSumIn || oper.CurrentSumOut != oper.StatementSumOut) { fmCSAOperationJournal oper_delta = new fmCSAOperationJournal(ses); oper_delta.DateRecord = DateTime.Now; // oper_delta. oper_delta.OperationDate = oper.Date; oper_delta.BankAccount = statementAccount.BankAccount; oper_delta.PaymentDocument = oper.PayDoc; // oper_delta.StatementAccountDoc = itemSA.StatementDocument; oper_delta.SumIn = oper.StatementSumIn - oper.CurrentSumIn; oper_delta.SumOut = oper.StatementSumOut - oper.CurrentSumOut; // Валюта, для которой указаны суммы SumIn и SumOut oper_delta.Valuta = crmBankAccount.GetValutaByBankAccount(ses, statementAccount.BankAccount); //GetValutaByBankAccount(ses, statementAccount.BankAccount); } } }
//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); } } }