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