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 override void UpdateDatabaseAfterUpdateSchema()
        {
            base.UpdateDatabaseAfterUpdateSchema();
            // Disable version
            if (this.CurrentDBVersion != new Version("0.0.0.0"))
            {
                return;
            }
            //
            using (IObjectSpace os = ObjectSpace.CreateNestedObjectSpace()) {
                csValuta val_rub = os.FindObject <csValuta>(
                    XPQuery <csValuta> .TransformExpression(((ObjectSpace)os).Session,
                                                            val => val.Code == "RUB"));
//                fmCAVTInvoiceVersion ver;
                IList <fmCAVTInvoiceVersion> ver_list = os.GetObjects <fmCAVTInvoiceVersion>(
                    XPQuery <fmCAVTInvoiceVersion> .TransformExpression(((ObjectSpace)os).Session,
                                                                        inv => inv.Valuta == null));
                foreach (fmCAVTInvoiceVersion ver in ver_list)
                {
                    ver.Valuta = val_rub;
                }
                os.CommitChanges();
            }
            using (IObjectSpace os = ObjectSpace.CreateNestedObjectSpace()) {
                IList <fmCAVTInvoiceBase> inv_list = os.GetObjects <fmCAVTInvoiceBase>(new UnaryOperator(UnaryOperatorType.IsNull, "InvoiceIntType"));
                foreach (fmCAVTInvoiceBase inv in inv_list)
                {
                    inv.InvoiceIntType = fmCAVTInvoiceIntType.NORMAL;
                }
                os.CommitChanges();
            }
            ObjectSpace.CommitChanges();
        }
Example #3
0
        protected virtual void FillDatabase(Session ssn)
        {
            department1           = Prepare_hrmDepartment(ssn, "1");
            department2           = Prepare_hrmDepartment(ssn, "2");
            country1              = Prepare_csCountry(ssn, "1");
            address1              = Prepare_csAddress(ssn, "1", country1);
            address2              = Prepare_csAddress(ssn, "1", country1);
            contractCategory1     = Prepare_crmContractCategory(ssn, "1");
            documentCategory1     = Prepare_crmDocumentCategory(ssn, "1");
            legalPersonRussianRu1 = Prepare_crmCLegalPerson(ssn, "1", address1);
            legalPersonRussianRu2 = Prepare_crmCLegalPerson(ssn, "2", address2);
            partyRu1              = legalPersonRussianRu1.Party; // Prepare_crmPartyRu(ssn, "1", address1, legalPersonRussianRu1);
            partyRu2              = legalPersonRussianRu2.Party; // Prepare_crmPartyRu(ssn, "2", address2, legalPersonRussianRu2);

            unit1             = Prepare_csUnit(ssn, "1");
            nomenclatureType1 = Prepare_csNomenclatureType(ssn, "1");
            costItem1         = Prepare_fmCostItem(ssn, "1");

            valuta1 = Prepare_csValuta(ssn, "1", nomenclatureType1, unit1, costItem1);

            physicalPersonRu1 = Prepare_crmPhysicalPerson(ssn, "1", address1);
            physicalPersonRu2 = Prepare_crmPhysicalPerson(ssn, "1", address2);
            staff1            = Prepare_hrmStaff(ssn, "1", physicalPersonRu1, department1);
            staff2            = Prepare_hrmStaff(ssn, "2", physicalPersonRu2, department2);
        }
        private void FillCurrencyOnDate(String CurrencyCode, Decimal[] mCourse, DateTime checkDate, Int32 i)
        {
            csValuta valuta = GetValutaByCode(CurrencyCode);

            if (valuta == null)
            {
                return;
            }

            XPQuery <csCNMValutaCourse> CurrencyCourses = new XPQuery <csCNMValutaCourse>(Ssn);
            var query = from currencyCourse in CurrencyCourses
                        where currencyCourse.Valuta == valuta &&
                        currencyCourse.CourseDate == checkDate
                        select currencyCourse;

            if (query.Count() > 0)
            {
                foreach (var currency in query)
                {
                    currency.Course = mCourse[i];
                    break;
                }
            }
            else
            {
                CreateCurrencyCourse(valuta, checkDate, mCourse[i]);
            }
        }
Example #5
0
        public crmCostValue GetCostValue(crmCostModel cm, csValuta val)
        {
            crmCostValue cv = null;

            if (cm == null || val == null)
            {
                return(null);
            }
            foreach (crmCostValue ccv in this.CostItems)
            {
                if (ccv.Valuta == val && ccv.CostModel == cm)
                {
                    cv = ccv;
                }
            }
            if (cv == null)
            {
                foreach (crmCostValue ccv in this.CostItems)
                {
                    if (ccv.Valuta == val)
                    {
                        cv           = ccv.Copy();
                        cv.CostModel = cm;
                    }
                }
                if (cv == null)
                {
                    cv           = new crmCostValue(this.Session);
                    cv.CostCol   = this;
                    cv.CostModel = cm;
                    cv.Valuta    = val;
                }
            }
            return(cv);
        }
        private csValuta GetValutaByCode(Session ssn, string code)
        {
            XPQuery <csValuta> valutas = new XPQuery <csValuta>(ssn);
            csValuta           Valuta  = (from valuta in valutas
                                          where valuta.Code.ToUpper() == code.ToUpper()
                                          select valuta).FirstOrDefault();

            return(Valuta);
        }
        private void CreateCurrencyCourse(csValuta valuta, DateTime courseDate, Decimal Course)
        {
            csCNMValutaCourse valutaCourse = new csCNMValutaCourse(Ssn);

            valutaCourse.Valuta     = valuta;
            valutaCourse.CourseDate = courseDate;
            valutaCourse.Course     = Course;
            valutaCourse.Save();
        }
Example #8
0
        public void TestEditor()
        {
            IObjectSpace os;

            using (os = Application.CreateObjectSpace()) {
                csValuta val1 = os.CreateObject <csValuta>();
                val1.Code            = "USD";
                val1.ConversionIndex = 1;
                csValuta val2 = os.CreateObject <csValuta>();
                val2.Code            = "EUR";
                val2.ConversionIndex = 1;
                //
                os.CommitChanges();
            }
            DateTime date = DateTime.Now;

            os = Application.CreateObjectSpace();
            csCNMCourseEditor editor = os.CreateObject <csCNMCourseEditor>();

            Assert.AreEqual(editor.CourseDayTable.Count, 0);
            editor.CourseDate = date;
            Assert.AreEqual(editor.CourseDayTable.Count, 2);
            foreach (var course in editor.CourseDayTable)
            {
                Assert.AreEqual(course.CourseDate, editor.CourseDate);
            }
            editor.CourseDate = editor.CourseDate.AddDays(1);
            Assert.AreEqual(editor.CourseDayTable.Count, 2);
            foreach (var course in editor.CourseDayTable)
            {
                Assert.AreEqual(course.CourseDate, editor.CourseDate);
            }
            using (IObjectSpace os2 = Application.CreateObjectSpace()) {
                csValuta val3 = os2.CreateObject <csValuta>();
                val3.Code            = "RUB";
                val3.ConversionIndex = 1;
                //
                os2.CommitChanges();
            }
            editor.CourseDate = editor.CourseDate.AddDays(-1);
            Assert.AreEqual(editor.CourseDayTable.Count, 3);
            foreach (var course in editor.CourseDayTable)
            {
                Assert.AreEqual(course.CourseDate, editor.CourseDate);
            }
            os.CommitChanges();
            os     = Application.CreateObjectSpace();
            editor = os.CreateObject <csCNMCourseEditor>();
            Assert.AreEqual(editor.CourseDayTable.Count, 0);
            editor.CourseDate = date;
            Assert.AreEqual(editor.CourseDayTable.Count, 3);
            foreach (var course in editor.CourseDayTable)
            {
                Assert.AreEqual(course.CourseDate, editor.CourseDate);
            }
        }
Example #9
0
        protected virtual csValuta Prepare_csValuta(Session ssn, string modificator, csNomenclatureType nomenclatureType, csUnit unit, fmCostItem costItem)
        {
            csValuta valuta1 = new csValuta(ssn);

            valuta1.NomenclatureType = nomenclatureType;
            valuta1.Code             = "Р" + modificator;
            valuta1.NameShort        = "Р" + modificator;
            valuta1.NameFull         = "Руб" + modificator;
            valuta1.BaseUnit         = unit;
            valuta1.CostItem         = costItem;
            return(valuta1);
        }
 private static Decimal CheckSumm(TrwBudgetPeriod period, csValuta valuta, Decimal summ)
 {
     if (period.Valuta == valuta)
     {
         return(summ);
     }
     else
     {
         foreach (var exchange in period.CurrencyExchanges)
         {
             if (exchange.Valuta == valuta)
             {
                 return(exchange.Rate * summ);
             }
         }
         throw new ArgumentOutOfRangeException("Valuta", valuta.Code);
     }
 }
Example #11
0
        /// <summary>
        /// Сумма заявки в рублях по курсу указанной в заявке валюты на указанную там же дату
        /// </summary>
        /// <param name="paymentRequest">Заявка</param>
        /// <param name="valutaPayment">Валюта к которой надо привести сумму</param>
        /// <returns>Сумма в валюте valutaPayment</returns>
        private Decimal GetRequestSumByCourse(fmCPRPaymentRequest paymentRequest, csValuta valutaPayment)
        {
            // Поясение о вычислении. Сумма в заявке - это в валюте обязательств, чтобы её сравнить
            // с суммой платежа, надо перевести по кросс-курсу к валюте платежа и уже полученную сумму сравнить.
            // Предлагается в качестве даты курса брать непустую из двух дат: this.DeductedFromPayerAccount или this.ReceivedByPayerBankDate

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

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

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

            return(resultSum);
        }
Example #12
0
        public void AutoBindingResearch()
        {
            DateTime startDate = new DateTime(2012, 4, 1);
            DateTime endDate   = new DateTime(2012, 5, 20);

            Debug.WriteLine(String.Format("{0} {1} - {2}", "Интервал дат: ", startDate, endDate));
            Debug.WriteLine("\n");

            using (UnitOfWork uow = new UnitOfWork(Common.dataLayer)) {
                // Анализ Платёжных документов. Общая таблица с аналитическими признаками в границах указаннных дат.
                Dictionary <String, csValuta> dictValuta = new Dictionary <string, csValuta>();
                XPQuery <csValuta>            valutas    = new XPQuery <csValuta>(uow);
                var queryValuta = (from valuta in valutas
                                   //where valuta.CodeCurrencyValue == doc.paymentDocument.PaymentValuta
                                   select valuta).Distinct <csValuta>();
                foreach (var valuta in queryValuta)
                {
                    dictValuta.Add(valuta.CodeCurrencyValue, valuta);
                }


                // Список счетов "нашей" организации
                //List<crmBankAccount> = new
                XPQuery <crmBankAccount> ourBankAccounts = new XPQuery <crmBankAccount>(uow);
                var OurBankAccounts = (from bankAccount in ourBankAccounts
                                       where bankAccount.PrefferedParty.Code == "2518"
                                       select bankAccount).ToList <crmBankAccount>();
                Debug.WriteLine(String.Format("{0} {1}", "Всего счетов нашей организации", OurBankAccounts.Count()));
                Debug.WriteLine("\n");

                // --------------------- ПЛАТЁЖНЫЕ ДОКУМЕНТЫ -----------------------//
                Debug.WriteLine("\n");
                Debug.WriteLine("ПЛАТЁЖНЫЕ ДОКУМЕНТЫ");
                Debug.WriteLine("\n");


                String prmDocType = ""; //"Платежное поручение";
                XPQuery <fmCDocRCB> paymentDocuments = new XPQuery <fmCDocRCB>(uow);
                var queryPaymentDocuments            = (from paymentDocument in paymentDocuments
                                                        where paymentDocument.DocDate.Date >= startDate &&
                                                        paymentDocument.DocDate.Date < endDate &&
                                                        (prmDocType == "" || paymentDocument.DocType == prmDocType)
                                                        select new {
                    PaymentDocument = paymentDocument,
                    DocType = paymentDocument.DocType,
                    DocDate = paymentDocument.DocDate,
                    IsDocDate = (paymentDocument.DocDate != DateTime.MinValue),

                    IsSum = (paymentDocument.PaymentCost != 0m),
                    SumIn = ((paymentDocument.PaymentReceiverRequisites.BankAccount.PrefferedParty.Code == "2518") ? paymentDocument.PaymentCost : 0m),
                    SumOut = ((paymentDocument.PaymentPayerRequisites.BankAccount.PrefferedParty.Code == "2518") ? paymentDocument.PaymentCost : 0m),

                    //PaymentValuta = crmBankAccount.GetValutaByBankAccount(uow, paymentDocument.PaymentPayerRequisites.BankAccount),
                    PaymentValuta = paymentDocument.PaymentPayerRequisites.BankAccount.Number.Substring(5, 3),
                    PaymentReceiverValuta = paymentDocument.PaymentReceiverRequisites.BankAccount.Number.Substring(5, 3),

                    ReceiverAccount = (paymentDocument.PaymentReceiverRequisites.AccountParty != ""),
                    PayerAccount = (paymentDocument.PaymentPayerRequisites.AccountParty != ""),
                    ReceiverBankAccount = (paymentDocument.PaymentReceiverRequisites.BankAccount != null),
                    PayerBankAccount = (paymentDocument.PaymentPayerRequisites.BankAccount != null),

                    ReceiverBankRCBIC = (paymentDocument.PaymentReceiverRequisites.RCBIC != ""),
                    ReceiverBank = (paymentDocument.PaymentReceiverRequisites.Bank != null),
                    PayerBankRCBIC = (paymentDocument.PaymentPayerRequisites.RCBIC != ""),
                    PayerBank = (paymentDocument.PaymentPayerRequisites.Bank != null),

                    ReceiverINN = (paymentDocument.PaymentReceiverRequisites.INN != ""),
                    PayerINN = (paymentDocument.PaymentPayerRequisites.INN != ""),

                    ReceiverKPP = (paymentDocument.PaymentReceiverRequisites.KPP != ""),
                    PayerKPP = (paymentDocument.PaymentPayerRequisites.KPP != ""),

                    DateIn = (paymentDocument.ReceivedByPayerBankDate != DateTime.MinValue),
                    DateOut = (paymentDocument.DeductedFromPayerAccount != DateTime.MinValue),
                    DateAccountChanged = (paymentDocument.ReceivedByPayerBankDate != DateTime.MinValue) ? paymentDocument.ReceivedByPayerBankDate : ((paymentDocument.DeductedFromPayerAccount != DateTime.MinValue) ? paymentDocument.DeductedFromPayerAccount : DateTime.MinValue)
                }).ToList();

                // Статистика по queryPaymentDocuments
                Int32 TotalPaymentCount = queryPaymentDocuments.Count();
                Debug.WriteLine(String.Format("{0} {1}", "Всего платёжных документов в системе", TotalPaymentCount));
                Debug.WriteLine("\n");

                // Нашша сторона - плательщик (РАСХОДНЫЕ)
                List <fmCDocRCB> totalConditionPaymentDocument = new List <fmCDocRCB>();
                var queryOurDocPayer = (from doc in queryPaymentDocuments
                                        where OurBankAccounts.Contains <crmBankAccount>(doc.PaymentDocument.PaymentPayerRequisites.BankAccount)
                                        select doc).ToList();
                Debug.WriteLine(String.Format("{0} {1}", "Наша сторона - плательщик (РАСХОДНЫЕ)", queryOurDocPayer.Count()));
                foreach (var doc in queryOurDocPayer)
                {
                    // БЕЗ ВЫДАЧИ СПИСКА Debug.Write(String.Format("{0}, ", doc.PaymentDocument.DocNumber));
                    if (!totalConditionPaymentDocument.Contains(doc.PaymentDocument))
                    {
                        totalConditionPaymentDocument.Add(doc.PaymentDocument);
                    }
                }
                Debug.WriteLine("\n");


                // --------------------- ЗАЯВКИ -----------------------//
                Debug.WriteLine("\n");
                Debug.WriteLine("ЗАЯВКИ");
                Debug.WriteLine("\n");


                // Анализ Платёжных документов. Общая таблица с аналитическими признаками в границах указаннных дат.
                //String prmReqType = ""; //"Платежное поручение";
                XPQuery <fmCPRPaymentRequest> paymentRequests = new XPQuery <fmCPRPaymentRequest>(uow);
                var queryPaymenRequests = (from paymentRequest in paymentRequests
                                           select new {
                    PaymentRequest = paymentRequest,
                    SumIn = 0m,
                    SumOut = paymentRequest.Summ,                                // По факту все заявки - расходные
                    ObligationValuta = paymentRequest.Valuta
                }).ToList();
                Debug.WriteLine(String.Format("{0} {1}", "Всего заявок в системе", queryPaymenRequests.Count()));
                Debug.WriteLine("\n");


                // Заявки, прошедшие утверждение фин. отдела и сформированные правильно
                List <fmCPRPaymentRequest> totalConditionPaymentRequest = new List <fmCPRPaymentRequest>();
                var queryInPaymentRequestRightly = (from doc in queryPaymenRequests
                                                    where doc.PaymentRequest.Date != null &&
                                                    doc.ObligationValuta != null &&
                                                    doc.PaymentRequest.Summ != 0m &&
                                                    doc.PaymentRequest.PartyPaySender != null &&
                                                    doc.PaymentRequest.PartyPayReceiver != null &&
                                                    (doc.PaymentRequest.State == PaymentRequestStates.IN_PAYMENT || doc.PaymentRequest.State == PaymentRequestStates.IN_BANK || doc.PaymentRequest.State == PaymentRequestStates.PAYED)
                                                    select doc).ToList();
                Debug.WriteLine(String.Format("{0} {1}", "Заявки, прошедшие утверждение фин. отдела и сформированные правильно", queryInPaymentRequestRightly.Count()));
                foreach (var doc in queryInPaymentRequestRightly)
                {
                    // БЕЗ ВЫДАЧИ СПИСКА Debug.Write(String.Format("{0}, ", doc.PaymentRequest.ExtDocNumber));
                    if (!totalConditionPaymentRequest.Contains(doc.PaymentRequest))
                    {
                        totalConditionPaymentRequest.Add(doc.PaymentRequest);
                    }
                }
                Debug.WriteLine("\n");



                // --------------------- ЗАЯВКИ и ПЛАТЁЖНЫЕ ДОКУМЕНТЫ -----------------------//
                Debug.WriteLine("\n");
                Debug.WriteLine("ЗАЯВКИ и ПЛАТЁЖНЫЕ ДОКУМЕНТЫ");
                Debug.WriteLine("\n");


                // Соединение по максимуму условий (абсолютно точное совпадение)
                List <ConditionPair>       hardConditionPair            = new List <ConditionPair>();
                List <fmCPRPaymentRequest> hardConditionPaymentRequest  = new List <fmCPRPaymentRequest>();
                List <fmCDocRCB>           hardConditionPaymentDocument = new List <fmCDocRCB>();
                // Полный набор максимальных условий:
                // Стороны попарно совпадают, суммы в пересчёте к сумме платежа совпадают (до 1 коп.),
                // дата оплаты в платёжном документе отстоит от даты "к оплате" в заявке не более, чем на 2 дня
                var queryMaxConditions = from paymentRequest in queryInPaymentRequestRightly //queryPaymenRequests
                                         join paymentDocument in queryOurDocPayer            //queryPaymentDocuments
                                         on new {
                    P1 = paymentRequest.PaymentRequest.PartyPaySender,
                    P2 = paymentRequest.PaymentRequest.PartyPayReceiver
                } equals new {
                    P1 = paymentDocument.PaymentDocument.PaymentPayerRequisites.Party,
                    P2 = paymentDocument.PaymentDocument.PaymentReceiverRequisites.Party
                }
                into RD
                from doc in RD
                where OurBankAccounts.Contains <crmBankAccount>(doc.PaymentDocument.PaymentPayerRequisites.BankAccount) &&
                doc.DateAccountChanged.Date > paymentRequest.PaymentRequest.Date.Date &&                                //&& doc.DateAccountChanged.Date < paymentRequest.PaymentRequest.Date.AddDays(3).Date
                (paymentRequest.PaymentRequest.State == PaymentRequestStates.IN_PAYMENT || paymentRequest.PaymentRequest.State == PaymentRequestStates.IN_BANK || paymentRequest.PaymentRequest.State == PaymentRequestStates.PAYED)
                select new {
                    paymentRequest,
                    paymentDocument = doc
                };
                Int32 queryMaxConditionsCount            = 0;
                Int32 queryMaxConditionsValutaErrorCount = 0;
                foreach (var doc in queryMaxConditions)
                {
                    csValuta pValuta = (from valuta in valutas
                                        where valuta.CodeCurrencyValue == doc.paymentDocument.PaymentValuta
                                        select valuta).FirstOrDefault <csValuta>();
                    if (pValuta == null)
                    {
                        queryMaxConditionsValutaErrorCount++;
                        continue;
                    }
                    Decimal crossCource = csCNMValutaCourse.GetCrossCourceOnDate(uow, doc.paymentDocument.DateAccountChanged, doc.paymentRequest.ObligationValuta, pValuta);
                    Decimal paymentSumOutPaymentValuta = doc.paymentRequest.SumOut * crossCource;
                    Boolean bRes = (Decimal.Compare(Math.Abs(paymentSumOutPaymentValuta - doc.paymentDocument.PaymentDocument.PaymentCost), 0.01m) <= 0);
                    if (bRes)
                    {
                        // БЕЗ ВЫДАЧИ СПИСКА Debug.Write(String.Format("({0}, {1}); ", doc.paymentRequest.PaymentRequest.ExtDocNumber, doc.paymentDocument.PaymentDocument.DocNumber));
                        queryMaxConditionsCount++;
                        ConditionPair pair = new ConditionPair()
                        {
                            paymentDocument = doc.paymentDocument.PaymentDocument, paymentRequest = doc.paymentRequest.PaymentRequest
                        };
                        //hardConditionPair.Add(pair);
                        if (!hardConditionPair.Contains(pair))
                        {
                            hardConditionPair.Add(pair);
                        }
                        if (!hardConditionPaymentRequest.Contains(doc.paymentRequest.PaymentRequest))
                        {
                            hardConditionPaymentRequest.Add(doc.paymentRequest.PaymentRequest);
                        }
                        if (!hardConditionPaymentDocument.Contains(doc.paymentDocument.PaymentDocument))
                        {
                            hardConditionPaymentDocument.Add(doc.paymentDocument.PaymentDocument);
                        }
                    }
                }
                Debug.WriteLine("\n");
                Debug.WriteLine(String.Format("{0} {1}", "Соединение по максимуму условий (абсолютно точное совпадение), случай расходного документа", queryMaxConditionsCount));
                Debug.WriteLine(String.Format("{0} {1}", "Уникальных пар потенциальных привязок, количество ", hardConditionPair.Count()));
                Debug.WriteLine(String.Format("{0} {1}", "Неопознана валюта в платёжном документе, количество ", queryMaxConditionsValutaErrorCount));
                Debug.WriteLine(String.Format("{0} {1}", "hard Заявок в слое, количество ", hardConditionPaymentRequest.Count()));
                Debug.WriteLine(String.Format("{0} {1}", "hard Документов в слое, количество ", hardConditionPaymentDocument.Count()));
                Debug.WriteLine("\n");



                // -------------- Сколько имеется привяок в связи с отработкой имеющегося алгоритма автопривязки --------------------- //
                Int32 queryyRepaymentJurnalCount = 0;
                List <ConditionPair>           ExistsConditionPairs    = new List <ConditionPair>();
                List <fmCPRPaymentRequest>     UsedPaymentRequestList  = new List <fmCPRPaymentRequest>();
                List <fmCDocRCB>               UsedPaymentDocumentList = new List <fmCDocRCB>();
                XPQuery <fmCPRRepaymentJurnal> repaymentJurnals        = new XPQuery <fmCPRRepaymentJurnal>(uow);
                var queryRepaymentJurnals = (from record in repaymentJurnals
                                             select record).Distinct().ToList();
                Debug.WriteLine(String.Format("{0} {1}", "Сколько имеется привязок в связи с отработкой имеющегося алгоритма автопривязки", queryRepaymentJurnals.Count()));
                //Debug.WriteLine("\n");
                foreach (var record in queryRepaymentJurnals)
                {
                    //Debug.Write(String.Format("({0}, {1}); ", UsedPaymentDocumentList.PaymentRequest.ExtDocNumber, doc.paymentDocument.PaymentDocument.DocNumber));
                    queryyRepaymentJurnalCount++;
                    ConditionPair pair = new ConditionPair();
                    pair.paymentRequest  = record.PaymentRequest;
                    pair.paymentDocument = record.PaymentDocument;
                    if (!ExistsConditionPairs.Contains(pair))
                    {
                        ExistsConditionPairs.Add(pair);
                    }
                    if (!UsedPaymentRequestList.Contains(record.PaymentRequest))
                    {
                        UsedPaymentRequestList.Add(record.PaymentRequest);
                    }
                    if (!UsedPaymentDocumentList.Contains(record.PaymentDocument))
                    {
                        UsedPaymentDocumentList.Add(record.PaymentDocument);
                    }
                }
                //Debug.WriteLine(String.Format("{0} {1}", "Всего  в журнале привязок, количество ", queryyRepaymentJurnalCount));
                Debug.WriteLine(String.Format("{0} {1}", "Уникальных пар в журнале привязок, количество ", ExistsConditionPairs.Count()));
                Debug.WriteLine(String.Format("{0} {1}", "Заявок в журнале привязок, количество ", UsedPaymentRequestList.Count()));
                Debug.WriteLine(String.Format("{0} {1}", "Документов в журнале привязок, количество ", UsedPaymentDocumentList.Count()));
                Debug.WriteLine("\n");


                // ОТВЕТЫ НА ВОПРОСЫ: КАКАЯ РАЗНИЦА МЕЖДУ СПИСКАМИ?
                Debug.WriteLine(String.Format("{0}", "ЗАЯВКИ, КОТОРЫЕ ЕСТЬ В ПОТЕНЦИАЛЬНОМ СПИСКЕ, НО ОТСУТСТВУЮТ В РЕАЛЬНОМ"));
                var requestInPotentialNoInReal = from req in hardConditionPaymentRequest
                                                 where !UsedPaymentRequestList.Contains(req)
                                                 orderby req.ExtDocNumber ascending
                                                 select req;
                foreach (var req in requestInPotentialNoInReal)
                {
                    Debug.WriteLine(String.Format("{0} \t\t {1} \t\t {2}", req.ExtDocNumber, req.Number, req.Date));
                }
                Debug.WriteLine("\n");

                Debug.WriteLine(String.Format("{0}", "ЗАЯВКИ, КОТОРЫЕ ЕСТЬ В РЕАЛЬНОМ СПИСКЕ, НО ОТСУТСТВУЮТ В ПОТЕНЦИАЛЬНОМ"));
                var requestInRealNoInPotential = from req in UsedPaymentRequestList
                                                 where !hardConditionPaymentRequest.Contains(req)
                                                 orderby req.ExtDocNumber ascending
                                                 select req;
                foreach (var req in requestInRealNoInPotential)
                {
                    Debug.WriteLine(String.Format("{0} \t\t {1} \t\t {2}", req.ExtDocNumber, req.Number, req.Date));
                }
                Debug.WriteLine("\n");

                Debug.WriteLine(String.Format("{0}", "ДОКУМЕНТЫ, КОТОРЫЕ ЕСТЬ В ПОТЕНЦИАЛЬНОМ СПИСКЕ, НО ОТСУТСТВУЮТ В РЕАЛЬНОМ"));
                var docInPotentialNoInReal = from doc in hardConditionPaymentDocument
                                             where !UsedPaymentDocumentList.Contains(doc)
                                             orderby doc.DocNumber ascending
                                             select doc;
                foreach (var doc in docInPotentialNoInReal)
                {
                    Debug.WriteLine(String.Format("{0} \t\t {1}", doc.DocNumber, doc.DocDate));
                }
                Debug.WriteLine("\n");

                Debug.WriteLine(String.Format("{0}", "ДОКУМЕНТЫ, КОТОРЫЕ ЕСТЬ В РЕАЛЬНОМ СПИСКЕ, НО ОТСУТСТВУЮТ В ПОТЕНЦИАЛЬНОМ"));
                var docInRealNoInPotential = from doc in UsedPaymentDocumentList
                                             where !hardConditionPaymentDocument.Contains(doc)
                                             orderby doc.DocNumber ascending
                                             select doc;
                foreach (var doc in docInRealNoInPotential)
                {
                    Debug.WriteLine(String.Format("{0} \t\t {1}", doc.DocNumber, doc.DocDate));
                }
                Debug.WriteLine("\n");
            }
        }
        protected void FillDatabaseForAnalysis(Session ssn)
        {
            IObjectSpace objectSpace = new ObjectSpace((UnitOfWork)ssn);

            int  RecordCountGenerated = 10000; // Максимальное количество генерируемых записей в журнале регистрации crmCashFlowRegister
            Guid token = Guid.NewGuid();

            // Делаем три валюты
            IList <csValuta> valutaList = new List <csValuta>();

            csValuta valutaRUR = objectSpace.CreateObject <csValuta>();

            valutaRUR.Code      = "RUR";
            valutaRUR.NameShort = "Руб.";
            valutaRUR.NameFull  = "Рубль";
            valutaList.Add(valutaRUR);

            csValuta valutaUSD = objectSpace.CreateObject <csValuta>();

            valutaUSD.Code      = "USD";
            valutaUSD.NameShort = "bak";
            valutaUSD.NameFull  = "Dollar";
            valutaList.Add(valutaUSD);

            csValuta valutaEUR = objectSpace.CreateObject <csValuta>();

            valutaEUR.Code      = "EUR";
            valutaEUR.NameShort = "euro";
            valutaEUR.NameFull  = "Euro";
            valutaList.Add(valutaEUR);

            objectSpace.CommitChanges();


            //// Создаём maxContractDocumentCount документов
            //int maxContractDocumentCount = 300;
            //IList<fmSubject> ContractDocumentList = new List<fmSubject>();

            //for (int i = 0; i < maxContractDocumentCount; i++) {
            //    fmSubject сontractDocument = objectSpace.CreateObject<fmSubject>();
            //    сontractDocument.Code = "S" + i.ToString();
            //    сontractDocument.Name = "Subj" + i.ToString();
            //    сontractDocument.DateBegin = DateTime.Now;
            //    сontractDocument.DateEnd = DateTime.Now.AddDays(GetRandomIntegerFromInterval(1, 30));
            //    ContractDocumentList.Add(subject);
            //}

            //objectSpace.CommitChanges();


            // Создаём maxSubjectCount тем
            int maxSubjectCount = 120;
            IList <fmCSubjectExt> subjectList = new List <fmCSubjectExt>();

            for (int i = 0; i < maxSubjectCount; i++)
            {
                fmCSubjectExt subject = objectSpace.CreateObject <fmCSubjectExt>();
                subject.Code      = "S" + i.ToString();
                subject.Name      = "Subj" + i.ToString();
                subject.DateBegin = DateTime.Now;
                subject.DateEnd   = DateTime.Now.AddDays(GetRandomIntegerFromInterval(1, 30));
                subjectList.Add(subject);
            }

            objectSpace.CommitChanges();

            // Создаём maxCostItemCount
            int maxCostItemCount            = 10;
            IList <fmCostItem> costItemList = new List <fmCostItem>();

            for (int i = 0; i < maxCostItemCount; i++)
            {
                fmCostItem costItem = objectSpace.CreateObject <fmCostItem>();
                costItem.Code = "CI" + i.ToString();
                costItem.Name = "CostItem" + i.ToString();
                costItemList.Add(costItem);
            }

            objectSpace.CommitChanges();


            // Заготавливаем maxCostModelCount
            int maxCostModelCount = 5;
            IList <crmCostModel> CostModelList = new List <crmCostModel>();

            for (int i = 0; i < maxCostModelCount; i++)
            {
                crmCostModel costModel = objectSpace.CreateObject <crmCostModel>();

                costModel.Code        = "CM: " + i.ToString();
                costModel.Description = "CostModel: " + i.ToString();
                costModel.Name        = "CostModel " + i.ToString();

                CostModelList.Add(costModel);

                //objectSpace.CommitChanges();
            }

            objectSpace.CommitChanges();

            /*
             * // Заготавливаем maxContragentPartyRuCount штук контрагентов
             * int maxContragentPartyRuCount = 120;
             * IList<crmPartyRu> ContragentPartyRuList = new List<crmPartyRu>();
             *
             * for (int i = 0; i < maxContragentPartyRuCount; i++) {
             *  crmPartyRu partyRu = objectSpace.CreateObject<crmPartyRu>();
             *
             *  partyRu.Code = "cF";
             *  partyRu.Description = "ContragentParty " + i.ToString();
             *
             *  //crmPhysicalPerson person = objectSpace.CreateObject<crmPhysicalPerson>();
             *  //person.INN = "CP INN" + i;
             *  //person.FirstName = "Гадя " + i;
             *  //person.MiddleName = "Петрович " + i;
             *  //person.MiddleName = "Хренова " + i;
             *
             *  crmCPerson person = objectSpace.CreateObject<crmCPerson>();
             *  person.INN = "CP INN" + i;
             *  //person.FirstName = "Гадя " + i;
             *  //person.MiddleName = "Петрович " + i;
             *  //person.MiddleName = "Хренова " + i;
             *
             *  partyRu.Person = person;
             *  person.Partys.Add(partyRu);
             *
             *  ContragentPartyRuList.Add(partyRu);
             *
             *  //objectSpace.CommitChanges();
             * }
             *
             * objectSpace.CommitChanges();
             */


            // Заготавливаем maxContragentcLegalPersonCount штук контрагентов
            int maxCLegalPersonCount = 120;
            IList <crmCLegalPerson> CLegalPersonList = new List <crmCLegalPerson>();

            for (int i = 0; i < maxCLegalPersonCount; i++)
            {
                crmCLegalPerson cLegalPerson = objectSpace.CreateObject <crmCLegalPerson>();
                cLegalPerson.Name        = "ИнтекоАГ" + i;
                cLegalPerson.NameFull    = "ИнтекоАГ" + i;
                cLegalPerson.INN         = "ИНН 1111111111";
                cLegalPerson.Code        = "LP" + i;
                cLegalPerson.Description = "LegalPerson Description" + i;
                cLegalPerson.KPP         = "КПП 222222222";
                cLegalPerson.RegCode     = "RC";
                //cLegalPerson.Person.Address = address;
                //cLegalPerson.Party.AddressFact = address;
                //cLegalPerson.Party.AddressPost = address;
                cLegalPerson.Party.Person = cLegalPerson.Person;

                CLegalPersonList.Add(cLegalPerson);
            }

            objectSpace.CommitChanges();

            // Заготавливаем maxContractPartyCount штук участников договоров
            int maxContractPartyCount = 50;
            IList <crmContractParty> ContractPartyList = new List <crmContractParty>();

            for (int i = 0; i < maxContractPartyCount; i++)
            {
                crmContractParty contractParty = objectSpace.CreateObject <crmContractParty>();

                contractParty.INN       = "INN: " + i.ToString();
                contractParty.KPP       = "KPP: " + i.ToString();
                contractParty.Name      = "ContractParty " + i.ToString();
                contractParty.Party     = CLegalPersonList[GetRandomIntegerFromInterval(1, CLegalPersonList.Count) - 1].Party;
                contractParty.RegNumber = "RegNumber " + i.ToString();

                ContractPartyList.Add(contractParty);

                //objectSpace.CommitChanges();
            }

            objectSpace.CommitChanges();

            // SHU 2011-12-26 Order не вводится, т.к. имеет срабатывает правило Validation Required для какого-то поля
            // Заготавливаем maxOrderCount штук заказов
            int maxOrderCount             = 30;
            IList <fmCOrderExt> OrderList = new List <fmCOrderExt>();

            for (int i = 0; i < maxOrderCount; i++)
            {
                fmCOrderExt order = objectSpace.CreateObject <fmCOrderExt>();

                //order.Code = "Ord: " + i.ToString();
                order.Description = "Order: " + i.ToString();
                //order.Name = "Order " + i.ToString();
                //order.DateBegin = DateTime.Now;
                //order.DateEnd = DateTime.Now.AddDays(GetRandomIntegerFromInterval(1, 30));
                order.Subject = subjectList[GetRandomIntegerFromInterval(1, subjectList.Count) - 1];

                OrderList.Add(order);

                //objectSpace.CommitChanges();
            }

            objectSpace.CommitChanges();

            // Заготавливаем maxNDSRateCount штук формул расчёта НДС
            int maxNDSRateCount           = 1;
            IList <csNDSRate> NDSRateList = new List <csNDSRate>();

            for (int i = 0; i < maxNDSRateCount; i++)
            {
                csNDSRate ndsRate = objectSpace.CreateObject <csNDSRate>();

                ndsRate.Code        = "20/120"; // + i.ToString();
                ndsRate.Numerator   = 20;       // + i.ToString();
                ndsRate.Denominator = 120;      // + i.ToString();
                ndsRate.Name        = "20/120";
                //ndsRate.RateOfNDS = 120/100;

                NDSRateList.Add(ndsRate);

                //objectSpace.CommitChanges();
            }

            objectSpace.CommitChanges();


            // Создаём maxStageCount этапов
            int maxStageCount          = 20;
            IList <crmStage> stageList = new List <crmStage>();

            for (int i = 0; i < maxStageCount; i++)
            {
                crmDeliveryPlan deliveryPlan = objectSpace.CreateObject <crmDeliveryPlan>();
                deliveryPlan.DateBegin      = DateTime.Now.AddDays(GetRandomIntegerFromInterval(1, 5));
                deliveryPlan.DateEnd        = DateTime.Now.AddDays(GetRandomIntegerFromInterval(1, 15));
                deliveryPlan.CostItem       = costItemList[GetRandomIntegerFromInterval(1, costItemList.Count) - 1];
                deliveryPlan.CostModel      = CostModelList[GetRandomIntegerFromInterval(1, CostModelList.Count) - 1];
                deliveryPlan.DeliveryMethod = DeliveryMethod.UNIT_AT_THE_END;
                deliveryPlan.NDSRate        = NDSRateList[GetRandomIntegerFromInterval(1, NDSRateList.Count) - 1];
                deliveryPlan.Valuta         = valutaList[GetRandomIntegerFromInterval(1, valutaList.Count) - 1];

                crmPaymentPlan paymentPlan = objectSpace.CreateObject <crmPaymentPlan>();
                paymentPlan.DateBegin = DateTime.Now.AddDays(GetRandomIntegerFromInterval(1, 5));
                paymentPlan.DateEnd   = DateTime.Now.AddDays(GetRandomIntegerFromInterval(1, 15));
                paymentPlan.CostItem  = costItemList[GetRandomIntegerFromInterval(1, costItemList.Count) - 1];
                paymentPlan.CostModel = CostModelList[GetRandomIntegerFromInterval(1, CostModelList.Count) - 1];
                paymentPlan.NDSRate   = NDSRateList[GetRandomIntegerFromInterval(1, NDSRateList.Count) - 1];
                paymentPlan.Valuta    = valutaList[GetRandomIntegerFromInterval(1, valutaList.Count) - 1];

                crmStage stage = objectSpace.CreateObject <crmStage>();
                deliveryPlan.Stage = stage;
                stage.Code         = "S" + i.ToString();
                //stage.DeliveryDate = null; // ОТВАЛИВАЕТСЯ, ПОКА НЕТ ВРЕМЕНИ РАЗБИРАТЬСЯ !!! DateTime.Now.AddDays(GetRandomIntegerFromInterval(1, 20));
                ////stage.CurrentCost = "Stg" + i.ToString();
                ////stage.CurrentPayment = "Stg" + i.ToString();
                //stage.Customer = null; // ОТВАЛИВАЕТСЯ, ПОКА НЕТ ВРЕМЕНИ РАЗБИРАТЬСЯ !!! ContractPartyList[GetRandomIntegerFromInterval(1, ContractPartyList.Count) - 1];
                ////stage.DeliveryItem = "Stg" + i.ToString();
                ////stage.DeliveryItems = "Stg" + i.ToString();
                // ОТВАЛИВАЕТСЯ, ПОКА НЕТ ВРЕМЕНИ РАЗБИРАТЬСЯ !!! stage.DeliveryMethod = DeliveryMethod.UNIT_AT_THE_END;
                ////stage.DeliveryUnits = "Stg" + i.ToString();
                stage.DescriptionLong  = "Stage" + i.ToString();
                stage.DescriptionShort = "Stg" + i.ToString();
                //stage.FullCode = "Stg" + i.ToString();
                // ОТВАЛИВАЕТСЯ, ПОКА НЕТ ВРЕМЕНИ РАЗБИРАТЬСЯ !!! stage.Order = OrderList[GetRandomIntegerFromInterval(1, OrderList.Count) - 1];
                // ОТВАЛИВАЕТСЯ, ПОКА НЕТ ВРЕМЕНИ РАЗБИРАТЬСЯ !!! stage.PaymentMethod = PaymentMethod.ADVANCE;
                stage.DeliveryPlan = deliveryPlan; // ДОРАБОТАТЬ!!! "Stg" + i.ToString();
                stage.PaymentPlan  = paymentPlan;  // ДОРАБОТАТЬ!!! "Stg" + i.ToString();
                stage.CostItem     = costItemList[GetRandomIntegerFromInterval(1, costItemList.Count) - 1];
                stage.CostModel    = CostModelList[GetRandomIntegerFromInterval(1, CostModelList.Count) - 1];

                //stage.PaymentUnits = "Stg" + i.ToString();
                // ОТВАЛИВАЕТСЯ, ПОКА НЕТ ВРЕМЕНИ РАЗБИРАТЬСЯ !!! stage.PaymentValuta = valutaList[GetRandomIntegerFromInterval(1, valutaList.Count) - 1];
                //stage.Settlement = "Stg" + i.ToString();
                stage.SettlementDate = DateTime.Now.AddDays(GetRandomIntegerFromInterval(1, 50));
                stage.StageStructure = null;  // ДОРАБОТАТЬ!!! "Stg" + i.ToString();
                //stage.StageMain = "Stg" + i.ToString();
                // ОТВАЛИВАЕТСЯ, ПОКА НЕТ ВРЕМЕНИ РАЗБИРАТЬСЯ !!! stage.StageType = StageType.FINANCE;
                //stage.Supplier = null; // ОТВАЛИВАЕТСЯ, ПОКА НЕТ ВРЕМЕНИ РАЗБИРАТЬСЯ !!! ContractPartyList[GetRandomIntegerFromInterval(1, ContractPartyList.Count) - 1];
                // ОТВАЛИВАЕТСЯ, ПОКА НЕТ ВРЕМЕНИ РАЗБИРАТЬСЯ !!! stage.Valuta = valutaList[GetRandomIntegerFromInterval(1, valutaList.Count) - 1];

                stage.DateFinish = DateTime.Now.AddDays(GetRandomIntegerFromInterval(1, 40));
                // ОТВАЛИВАЕТСЯ, ПОКА НЕТ ВРЕМЕНИ РАЗБИРАТЬСЯ !!! stage.DateBegin = DateTime.Now;
                // ОТВАЛИВАЕТСЯ, ПОКА НЕТ ВРЕМЕНИ РАЗБИРАТЬСЯ !!! stage.DateEnd = DateTime.Now.AddDays(GetRandomIntegerFromInterval(1, 30));

                stageList.Add(stage);
            }

            objectSpace.CommitChanges();

            // Создаём maxContractCategoryCount Категорий контрактов
            int maxContractCategoryCount = 10;
            IList <crmContractCategory> сontractCategoryList = new List <crmContractCategory>();

            for (int i = 0; i < maxContractCategoryCount; i++)
            {
                crmContractCategory contractCategory = objectSpace.CreateObject <crmContractCategory>();
                contractCategory.Code = "CC" + i.ToString();
                contractCategory.Name = "ContractCategory " + i.ToString();
                сontractCategoryList.Add(contractCategory);
            }

            objectSpace.CommitChanges();

            // Создаём maxDepartmentCount подразделений
            int maxDepartmentCount = 20;
            IList <hrmDepartment> departmentList = new List <hrmDepartment>();

            for (int i = 0; i < maxDepartmentCount; i++)
            {
                hrmDepartment department = objectSpace.CreateObject <hrmDepartment>();
                department.Code = "Dep" + i.ToString();
                department.Name = "Department " + i.ToString();
                departmentList.Add(department);
            }

            objectSpace.CommitChanges();

            // Создаём maxStaffCount сотрудников
            int maxStaffCount = 30;
            IList <hrmStaff>          staffList          = new List <hrmStaff>();
            IList <crmPhysicalPerson> physicalPersonList = new List <crmPhysicalPerson>();

            for (int i = 0; i < maxStaffCount; i++)
            {
                crmPhysicalPerson physicalPerson = objectSpace.CreateObject <crmPhysicalPerson>();
                physicalPerson.FirstName  = "Иван " + i.ToString();
                physicalPerson.MiddleName = "Иванович " + i.ToString();
                physicalPerson.LastName   = "Иванов " + i.ToString();
                physicalPerson.INN        = "ИНН " + i.ToString();

                hrmStaff staff = objectSpace.CreateObject <hrmStaff>();
                staff.PhysicalPerson = physicalPerson;
                staff.Department     = departmentList[GetRandomIntegerFromInterval(1, departmentList.Count) - 1];
                staffList.Add(staff);
            }

            // Создаём maxDocumentCategoryCount видов категорий документов
            int maxDocumentCategoryCount = 10;
            IList <crmContractDocumentType> contractDocumentTypeList = new List <crmContractDocumentType>();

            for (int i = 0; i < maxDocumentCategoryCount; i++)
            {
                crmContractDocumentType contractDocumentType = objectSpace.CreateObject <crmContractDocumentType>();
                contractDocumentType.Code = "CD " + i.ToString();
                contractDocumentType.Name = "Contract Document Type " + i.ToString();
                contractDocumentTypeList.Add(contractDocumentType);
            }

            objectSpace.CommitChanges();

            // Создаём maxPaymentItemCount
            int maxPaymentItemCount = 10;
            IList <crmPaymentMoney> paymentItemList = new List <crmPaymentMoney>();

            for (int i = 0; i < maxPaymentItemCount; i++)
            {
                crmPaymentMoney paymentItem = objectSpace.CreateObject <crmPaymentMoney>();
                paymentItem.AccountSumma  = GetRandomIntegerFromInterval(1, 100);
                paymentItem.AccountValuta = valutaList[GetRandomIntegerFromInterval(1, valutaList.Count) - 1];
                //paymentItem.CostItem;
                //paymentItem.CostModel;
                //paymentItem.CurrentCost;
                paymentItem.Date        = DateTime.Now;
                paymentItem.Description = "PaymentItem " + i.ToString();
                paymentItemList.Add(paymentItem);
            }

            objectSpace.CommitChanges();


            // Создаём maxObligationUnitCount обязательств
            int maxObligationUnitCount = 20;
            IList <crmObligationUnit> obligationUnitList = new List <crmObligationUnit>();

            for (int i = 0; i < maxObligationUnitCount; i++)
            {
                crmPaymentUnit obligationUnit = objectSpace.CreateObject <crmPaymentUnit>();
                obligationUnit.Code      = "PU" + i.ToString();
                obligationUnit.Name      = "PaymentUnit" + i.ToString();
                obligationUnit.CostItem  = costItemList[GetRandomIntegerFromInterval(1, costItemList.Count) - 1];
                obligationUnit.CostModel = CostModelList[GetRandomIntegerFromInterval(1, CostModelList.Count) - 1];
                ////obligationUnit.Creditor = ContractPartyList[GetRandomIntegerFromInterval(1, ContractPartyList.Count) - 1];
                //obligationUnit.CurrentCost = "Subj" + i.ToString();
                ////obligationUnit.Debitor = ContractPartyList[GetRandomIntegerFromInterval(1, ContractPartyList.Count) - 1];
                obligationUnit.NDSRate  = NDSRateList[GetRandomIntegerFromInterval(1, NDSRateList.Count) - 1];
                obligationUnit.Order    = OrderList[GetRandomIntegerFromInterval(1, OrderList.Count) - 1];
                obligationUnit.Receiver = ContractPartyList[GetRandomIntegerFromInterval(1, ContractPartyList.Count) - 1];
                obligationUnit.Sender   = ContractPartyList[GetRandomIntegerFromInterval(1, ContractPartyList.Count) - 1];
                ////obligationUnit.Stage = stageList[GetRandomIntegerFromInterval(1, stageList.Count) - 1];
                ////obligationUnit.SummCost = GetRandomIntegerFromInterval(1, 100);
                ////obligationUnit.SummNDS = GetRandomIntegerFromInterval(1, 100);
                obligationUnit.SummFull  = GetRandomIntegerFromInterval(1, 100);
                obligationUnit.Valuta    = valutaList[GetRandomIntegerFromInterval(1, valutaList.Count) - 1];
                obligationUnit.DatePlane = DateTime.Now.AddDays(GetRandomIntegerFromInterval(1, 40));
                obligationUnit.DateBegin = DateTime.Now;
                obligationUnit.DateEnd   = DateTime.Now.AddDays(GetRandomIntegerFromInterval(1, 30));

                obligationUnitList.Add(obligationUnit);
            }

            objectSpace.CommitChanges();

            //const int maxObligationUnitCount = 30;
            //IList<crmObligationUnit> obligationUnitList = new List<crmObligationUnit>();

            for (int i = 0; i < maxObligationUnitCount; i++)
            {
                crmDeliveryUnit obligationUnit = objectSpace.CreateObject <crmDeliveryUnit>();
                obligationUnit.Code      = "DU" + i.ToString();
                obligationUnit.Name      = "DeliveryUnit" + i.ToString();
                obligationUnit.CostItem  = costItemList[GetRandomIntegerFromInterval(1, costItemList.Count) - 1];
                obligationUnit.CostModel = CostModelList[GetRandomIntegerFromInterval(1, CostModelList.Count) - 1];
                ////obligationUnit.Creditor = ContractPartyList[GetRandomIntegerFromInterval(1, ContractPartyList.Count) - 1];
                //obligationUnit.CurrentCost = "Subj" + i.ToString();
                ////obligationUnit.Debitor = ContractPartyList[GetRandomIntegerFromInterval(1, ContractPartyList.Count) - 1];
                obligationUnit.NDSRate = NDSRateList[GetRandomIntegerFromInterval(1, NDSRateList.Count) - 1];
                if (OrderList.Count > 0)
                {
                    obligationUnit.Order = OrderList[GetRandomIntegerFromInterval(1, OrderList.Count) - 1];
                }
                obligationUnit.Receiver = ContractPartyList[GetRandomIntegerFromInterval(1, ContractPartyList.Count) - 1];
                obligationUnit.Sender   = ContractPartyList[GetRandomIntegerFromInterval(1, ContractPartyList.Count) - 1];
                ////obligationUnit.Stage = stageList[GetRandomIntegerFromInterval(1, stageList.Count) - 1];
                ////obligationUnit.SummCost = GetRandomIntegerFromInterval(1, 100);
                ////obligationUnit.SummNDS = GetRandomIntegerFromInterval(1, 100);
                obligationUnit.SummFull  = GetRandomIntegerFromInterval(1, 100);
                obligationUnit.Valuta    = valutaList[GetRandomIntegerFromInterval(1, valutaList.Count) - 1];
                obligationUnit.DatePlane = DateTime.Now.AddDays(GetRandomIntegerFromInterval(1, 40));
                obligationUnit.DateBegin = DateTime.Now;
                obligationUnit.DateEnd   = DateTime.Now.AddDays(GetRandomIntegerFromInterval(1, 30));

                obligationUnitList.Add(obligationUnit);
            }

            objectSpace.CommitChanges();

            /*
             * // Заготавливаем maxPrimaryPartyRuCount штук первичных участников договоров
             * int maxPrimaryPartyRuCount = 7;
             * IList<crmPartyRu> primaryPartyRuList = new List<crmPartyRu>();
             *
             * for (int i = 0; i < maxPrimaryPartyRuCount; i++) {
             *  crmPartyRu partyRu = objectSpace.CreateObject<crmPartyRu>();
             *
             *  partyRu.Code = "pF";
             *  partyRu.Description = "PrimaryParty " + i.ToString();
             *
             *  //crmPhysicalPerson person = objectSpace.CreateObject<crmPhysicalPerson>();
             *  //person.INN = "PP INN" + i;
             *  //person.FirstName = "Ганс " + i;
             *  //person.MiddleName = "Христиан " + i;
             *  //person.MiddleName = "Андерсен " + i;
             *
             *  crmCPerson person = objectSpace.CreateObject<crmCPerson>();
             *  person.INN = "PP INN" + i;
             *  //person.FirstName = "Ганс " + i;
             *  //person.MiddleName = "Христиан " + i;
             *  //person.MiddleName = "Андерсен " + i;
             *
             *  partyRu.Person = person;
             *  person.Partys.Add(partyRu);
             *
             *  primaryPartyRuList.Add(partyRu);
             * }
             *
             * objectSpace.CommitChanges();
             */


            // Заготавливаем maxContragentcLegalPersonCount штук контрагентов
            int maxPrimaryCLegalPersonCount = 120;
            IList <crmCLegalPerson> PrimaryCLegalPersonList = new List <crmCLegalPerson>();

            for (int i = 0; i < maxPrimaryCLegalPersonCount; i++)
            {
                crmCLegalPerson cLegalPerson = objectSpace.CreateObject <crmCLegalPerson>();
                cLegalPerson.Name        = "Кремль" + i;
                cLegalPerson.NameFull    = "Кремль" + i;
                cLegalPerson.INN         = "ИНН ААААААААА";
                cLegalPerson.Code        = "LPK" + i;
                cLegalPerson.Description = "LegalPerson Кремль Description" + i;
                cLegalPerson.KPP         = "КПП ББББББББ";
                cLegalPerson.RegCode     = "RCK";
                //cLegalPerson.Person.Address = address;
                //cLegalPerson.Party.AddressFact = address;
                //cLegalPerson.Party.AddressPost = address;
                cLegalPerson.Party.Person = cLegalPerson.Person;

                PrimaryCLegalPersonList.Add(cLegalPerson);
            }

            objectSpace.CommitChanges();


            // Создаём maxContractCount контрактов
            int maxContractCount             = 300;
            IList <crmContract> contractList = new List <crmContract>();

            for (int i = 0; i < maxContractCount; i++)
            {
                crmContractDocument contractDocument = objectSpace.CreateObject <crmContractDocument>();
                contractDocument.Date             = DateTime.Now;
                contractDocument.DocumentCategory = contractDocumentTypeList[GetRandomIntegerFromInterval(1, contractDocumentTypeList.Count) - 1];
                contractDocument.Number           = "Doc № " + i.ToString();


                crmContractDeal contractDeal = objectSpace.CreateObject <crmContractDeal>();
                contractDeal.Category          = сontractCategoryList[GetRandomIntegerFromInterval(1, сontractCategoryList.Count) - 1];
                contractDeal.ContractKind      = ContractKind.CONTRACT;
                contractDeal.CuratorDepartment = departmentList[GetRandomIntegerFromInterval(1, departmentList.Count) - 1];
                //contractDeal.Customer = ContractPartyList[GetRandomIntegerFromInterval(1, ContractPartyList.Count) - 1].Party;
                contractDeal.DateRegistration = DateTime.Now;
                //contractDeal.Supplier = ContractPartyList[GetRandomIntegerFromInterval(1, ContractPartyList.Count) - 1].Party;
                contractDeal.UserRegistrator       = staffList[GetRandomIntegerFromInterval(1, staffList.Count) - 1];
                contractDeal.DepartmentRegistrator = contractDeal.UserRegistrator.Department;

                //contractDeal.Customer = ContragentPartyRuList[GetRandomIntegerFromInterval(1, ContragentPartyRuList.Count) - 1];
                //contractDeal.DealVersions
                //contractDeal.Project = ;
                //contractDeal.State
                //contractDeal.Supplier = ContragentPartyRuList[GetRandomIntegerFromInterval(1, ContragentPartyRuList.Count) - 1];


                //---
                crmDealVersion dealVersion = objectSpace.CreateObject <crmDealVersion>();
                //dealVersion.Category = сontractCategoryList[GetRandomIntegerFromInterval(1, сontractCategoryList.Count) - 1];
                //dealVersion.ContractDeal = contractDeal;
                //dealVersion.ContractDocument = contractDocument;
                //dealVersion.ContractDocuments.Add(contractDocument);
                //dealVersion.Customer = ContractPartyList[GetRandomIntegerFromInterval(1, ContractPartyList.Count) - 1].Party;
                dealVersion.CostItem = costItemList[GetRandomIntegerFromInterval(1, costItemList.Count) - 1];
                //dealVersion.Supplier = ContractPartyList[GetRandomIntegerFromInterval(1, ContractPartyList.Count) - 1].Party;
                dealVersion.CostModel = CostModelList[GetRandomIntegerFromInterval(1, CostModelList.Count) - 1];
                //dealVersion.Curator = contractDeal.CuratorDepartment;
                dealVersion.DateBegin  = DateTime.Now;
                dealVersion.DateEnd    = DateTime.Now.AddDays(10);
                dealVersion.DateFinish = DateTime.Now.AddDays(20);
                dealVersion.DealCode   = "DC " + i.ToString();
                //dealVersion.DealDocument = contractDocument;
                //dealVersion.DealNomenclatures.Add(
                if (dealVersion != null)
                {
                    dealVersion.DescriptionLong  = "Полное описание для " + dealVersion.DealCode;
                    dealVersion.DescriptionShort = "Краткое описание для " + dealVersion.DealCode;
                }
                dealVersion.NDSRate = NDSRateList[GetRandomIntegerFromInterval(1, NDSRateList.Count) - 1];
                if (OrderList.Count > 0)
                {
                    dealVersion.Order = OrderList[GetRandomIntegerFromInterval(1, OrderList.Count) - 1];
                }
                dealVersion.PaymentValuta = valutaList[GetRandomIntegerFromInterval(1, valutaList.Count) - 1];
                //dealVersion.Registrator = contractDeal.DepartmentRegistrator;
                dealVersion.Valuta = valutaList[GetRandomIntegerFromInterval(1, valutaList.Count) - 1];
                //dealVersion.StageStructure
                //---


                contractDeal.Current = dealVersion;
                contractDeal.DealVersions.Add(dealVersion);

                crmContract contract = objectSpace.CreateObject <crmContract>();
                contract.ContractCategory = сontractCategoryList[GetRandomIntegerFromInterval(1, сontractCategoryList.Count) - 1];

                contractDeal.Contract         = contract;
                contractDeal.ContractDocument = contractDocument;
                contractDeal.ContractDocuments.Add(contractDocument);
                contractDocument.Contract = contract;
                contract.ContractDeals.Add(contractDeal);
                contract.ContractDocuments.Add(contractDocument);

                //contract.ContractDocument = DateTime.Now;
                //contract.Delo = "Delo " + i.ToString();
                contract.Description           = "Описание документа " + i.ToString();
                contract.UserRegistrator       = contractDeal.UserRegistrator;
                contract.DepartmentRegistrator = contract.UserRegistrator.Department;
                contractList.Add(contract);

                //this.ObjectSpace.CommitChanges();
                if ((i % 100) == 0)
                {
                    objectSpace.CommitChanges();
                }
            }

            objectSpace.CommitChanges();



            // Создаём записи регистра crmDebtorCreditorDebtRegister
            for (int i = 0; i < RecordCountGenerated; i++)
            {
                //try {
                // crmDebtorCreditorDebtRegister
                crmDebtorCreditorDebtRegister debtorCreditorDebtRegister = objectSpace.CreateObject <crmDebtorCreditorDebtRegister>();

                debtorCreditorDebtRegister.Token = token;

                debtorCreditorDebtRegister.ContragentParty = CLegalPersonList[GetRandomIntegerFromInterval(1, CLegalPersonList.Count) - 1].Party;
                debtorCreditorDebtRegister.PrimaryParty    = PrimaryCLegalPersonList[GetRandomIntegerFromInterval(1, PrimaryCLegalPersonList.Count) - 1].Party;

                debtorCreditorDebtRegister.Contract     = contractList[GetRandomIntegerFromInterval(1, contractList.Count) - 1];
                debtorCreditorDebtRegister.ContractDeal = debtorCreditorDebtRegister.Contract.ContractDeals[0];

                debtorCreditorDebtRegister.CreditValuta    = valutaList[GetRandomIntegerFromInterval(1, valutaList.Count) - 1];
                debtorCreditorDebtRegister.CreditCost      = GetRandomIntegerFromInterval(1, 100);
                debtorCreditorDebtRegister.CreditCostInRUR = GetRandomIntegerFromInterval(1, 100);

                debtorCreditorDebtRegister.DebitValuta    = debtorCreditorDebtRegister.CreditValuta;
                debtorCreditorDebtRegister.DebitCost      = GetRandomIntegerFromInterval(1, 100);
                debtorCreditorDebtRegister.DebitCostInRUR = GetRandomIntegerFromInterval(1, 100);

                debtorCreditorDebtRegister.CostItem = costItemList[GetRandomIntegerFromInterval(1, costItemList.Count) - 1];
                if (OrderList.Count > 0)
                {
                    debtorCreditorDebtRegister.fmOrder = OrderList[GetRandomIntegerFromInterval(1, OrderList.Count) - 1];
                }
                debtorCreditorDebtRegister.ObligationUnit         = obligationUnitList[GetRandomIntegerFromInterval(1, obligationUnitList.Count) - 1];
                debtorCreditorDebtRegister.ObligationUnitDateTime = DateTime.Now;
                debtorCreditorDebtRegister.PlaneFact = ((i % 2) == 0) ? PlaneFact.PLAN : PlaneFact.FACT;
                debtorCreditorDebtRegister.Stage     = stageList[GetRandomIntegerFromInterval(1, stageList.Count) - 1];
                //debtorCreditorDebtRegister.StageTech = ;
                if (subjectList.Count > 0)
                {
                    debtorCreditorDebtRegister.Subject = subjectList[GetRandomIntegerFromInterval(1, subjectList.Count) - 1];
                }

                //cashFlowRegister.Save();
                //objectSpace.CommitChanges();
                //} catch {
                //}
                if ((i % 1000) == 0)
                {
                    objectSpace.CommitChanges();
                }
            }

            objectSpace.CommitChanges();


            // Создаём записи регистра crmCashFlowRegister
            for (int i = 0; i < RecordCountGenerated; i++)
            {
                //try {
                // crmCashFlowRegister
                crmCashFlowRegister cashFlowRegister = objectSpace.CreateObject <crmCashFlowRegister>();

                cashFlowRegister.Token = token;

                cashFlowRegister.ContragentParty = CLegalPersonList[GetRandomIntegerFromInterval(1, CLegalPersonList.Count) - 1].Party;
                cashFlowRegister.PrimaryParty    = PrimaryCLegalPersonList[GetRandomIntegerFromInterval(1, PrimaryCLegalPersonList.Count) - 1].Party;

                cashFlowRegister.Contract     = contractList[GetRandomIntegerFromInterval(1, contractList.Count) - 1];
                cashFlowRegister.ContractDeal = cashFlowRegister.Contract.ContractDeals[0];       //cashFlowRegister.Contract.ContractDeals[0];
                cashFlowRegister.Cost         = GetRandomIntegerFromInterval(1, 100);
                //cashFlowRegister.CostInRUR = GetRandomIntegerFromInterval(1, 100);
                cashFlowRegister.SumIn    = GetRandomIntegerFromInterval(1, 100);
                cashFlowRegister.CostItem = costItemList[GetRandomIntegerFromInterval(1, costItemList.Count) - 1];
                if (OrderList.Count > 0)
                {
                    cashFlowRegister.fmOrder = OrderList[GetRandomIntegerFromInterval(1, OrderList.Count) - 1];
                }
                if (obligationUnitList.Count > 0)
                {
                    cashFlowRegister.ObligationUnit = obligationUnitList[GetRandomIntegerFromInterval(1, obligationUnitList.Count) - 1];
                }
                cashFlowRegister.ObligationUnitDateTime = DateTime.Now;
                cashFlowRegister.PaymentCost            = GetRandomIntegerFromInterval(1, 100);
                cashFlowRegister.PaymentItem            = paymentItemList[GetRandomIntegerFromInterval(1, paymentItemList.Count) - 1];
                cashFlowRegister.PaymentValuta          = valutaList[GetRandomIntegerFromInterval(1, valutaList.Count) - 1];
                //cashFlowRegister.PlaneFact = ((i % 2) == 0) ? PlaneFact.PLAN : PlaneFact.FACT;
                cashFlowRegister.Section = CashFlowRegisterSection.CONTRACT_PLAN;       // Исправить на нормальное назначение
                //cashFlowRegister.Stage = stageList[GetRandomIntegerFromInterval(1, stageList.Count) - 1];
                //cashFlowRegister.StageTech = ;
                if (subjectList.Count > 0)
                {
                    cashFlowRegister.Subject = subjectList[GetRandomIntegerFromInterval(1, subjectList.Count) - 1];
                }
                cashFlowRegister.Valuta = valutaList[GetRandomIntegerFromInterval(1, valutaList.Count) - 1];

                //cashFlowRegister.FinancialDeal


                //cashFlowRegister.Save();
                //objectSpace.CommitChanges();
                //} catch {
                //}
                if ((i % 1000) == 0)
                {
                    objectSpace.CommitChanges();
                }
            }

            objectSpace.CommitChanges();
        }
        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);
        }
Example #15
0
        public void CreateAllReferencesOnlyTest([Values("", "0", "1", "2", "3", "4")]  string modificator)
        {
            //Session ssn = session1;
            UnitOfWork ssn = new UnitOfWork(Common.dataLayer);

            crmContractCategory contractCategory = Prepare_crmContractCategory(ssn, modificator);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(contractCategory, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            crmCostModel costModel = Prepare_crmCostModel(ssn, modificator);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(costModel, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            csCountry country = Prepare_csCountry(ssn, modificator);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(country, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            csUnit unit = Prepare_csUnit(ssn, modificator);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(unit, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            csNomenclatureType nomenclatureType = Prepare_csNomenclatureType(ssn, modificator);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(nomenclatureType, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            fmCostItem costItem = Prepare_fmCostItem(ssn, modificator);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(costItem, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            csMaterial material = Prepare_csMaterial(ssn, modificator, nomenclatureType, unit, costItem);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(material, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            csService service = Prepare_csService(ssn, modificator, nomenclatureType, unit, costItem);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(service, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            csValuta valuta = Prepare_csValuta(ssn, modificator, nomenclatureType, unit, costItem);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(valuta, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            csAddress address = Prepare_csAddress(ssn, modificator, country);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(address, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            crmPhysicalPerson physicalPersonRu = Prepare_crmPhysicalPerson(ssn, modificator, address);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(physicalPersonRu, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            crmCBusinessman businessmanRu = Prepare_crmBusinessmanRu(ssn, modificator, physicalPersonRu, address);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(businessmanRu, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            crmCLegalPerson legalPersonRussianRu = Prepare_crmCLegalPerson(ssn, modificator, address);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(legalPersonRussianRu, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            //crmPartyRu partyRu = Prepare_crmPartyRu(ssn, modificator, address, legalPersonRussianRu);
            //if (Common.CheckValidationRule) {
            //    ruleResult = ruleSet.ValidateTarget(partyRu, DefaultContexts.Save);
            //    Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            //}

            fmCSubject subject = Prepare_fmSubject(ssn, modificator);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(subject, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            hrmDepartment department = Prepare_hrmDepartment(ssn, modificator);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(department, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            hrmStaff staff = Prepare_hrmStaff(ssn, modificator, physicalPersonRu, department);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(staff, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            crmUserParty userParty = Prepare_crmUserParty(ssn, modificator, legalPersonRussianRu.Party);

            if (Common.CheckValidationRule)
            {
                ruleResult = ruleSet.ValidateTarget(userParty, DefaultContexts.Save);
                Assert.AreEqual(ValidationState.Valid, ruleResult.State);
            }

            ssn.CommitChanges();
        }
Example #16
0
        public virtual void AutoBinding(crmBankAccount BankAccount, fmCPRRepaymentTask RepaymentTask)
        {
            // Несколько замечаний.
            // Сопоставление ведётся только с уже существующими заявками в статусе IN_PAY.
            // Для данного платёжного документа выбираются только такие заявки, в которых Плательщик и Получатель
            // соответствуют таковым в платёжном документе.
            // Часть суммы платёжного документа, не покрытая заявками, должна равняться части суммы Заявки, не истраченной
            // на Платёжные документы.
            // Распределение средств Заявки из предыдущего пункта происходит по дням в операционном журнале.

            // Список счетов "нашей" организации
            XPQuery <crmBankAccount> ourBankAccounts = new XPQuery <crmBankAccount>(Session);
            var OurBankAccounts = (from bankAccount in ourBankAccounts
                                   where bankAccount.PrefferedParty.Code == GetOurParty().Code   //"2518"
                                   select bankAccount).ToList <crmBankAccount>();

            DateTime DateAccountChanged = (this.ReceivedByPayerBankDate != DateTime.MinValue) ? this.ReceivedByPayerBankDate : ((this.DeductedFromPayerAccount != DateTime.MinValue) ? this.DeductedFromPayerAccount : DateTime.MinValue);
            csValuta paymentValuta      = crmBankAccount.GetValutaByBankAccount(Session, BankAccount);

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

            GetPaymentDocSumByOperationJournal(this, BankAccount, out operationPaymentDocSumIn, out operationPaymentDocSumOut);     // @@@@@@@@@@@ Добавить проверку по BankAccount
            // Одна из сумм operationPaymentDocSumIn или operationPaymentDocSumOut обязательно равна 0

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

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

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

            if (Decimal.Compare(Math.Abs(deltaDocSumIn) + Math.Abs(deltaDocSumOut), _Accuracy) <= 0)
            {
                return; // Всё сопоставлено уже с точностью до _Accuracy - так условились!
            }
            // Одна (или обе) из сумм deltaDocSumIn или deltaDocSumOut также равна (равны) 0
            Decimal deltaDocSum = deltaDocSumIn + deltaDocSumOut;   // !!!!!!! ПЕРЕСМОТРЕТЬ ?????????

            // Поиск подходящей заявки (Статус, Плательщик, Получатель, остаточные суммы)
            XPQuery <fmCPRPaymentRequest> paymentRequests = new XPQuery <fmCPRPaymentRequest>(Session, true);
            var queryPaymentRequests = from paymentRequest in paymentRequests
                                       where (paymentRequest.State == PaymentRequestStates.IN_PAYMENT || paymentRequest.State == PaymentRequestStates.IN_BANK) &&
                                       paymentRequest.PartyPayReceiver == this.PaymentReceiverRequisites.Party &&
                                       paymentRequest.PartyPaySender == this.PaymentPayerRequisites.Party &&
                                       OurBankAccounts.Contains <crmBankAccount>(this.PaymentPayerRequisites.BankAccount) && // Означает РАСХОД
                                       DateAccountChanged.Date >= paymentRequest.Date.Date                                   //&& DateAccountChanged.Date < paymentRequest.Date.AddDays(3).Date
                                       select paymentRequest;

            foreach (var paymentRequest in queryPaymentRequests)
            {
                // Отбраковка:
                // (1) сумма заявки не должна быть исчерпана полностью,
                // (2) остаточная сумма должна равняться величине непокрытия Платёжного документа

                Decimal paymentRequestSumIn = 0, paymentRequestSumOut = 0;                     // Эти суммы в валюте платежа
                Decimal paymentRequestSumObligationIn = 0, paymentRequestSumObligationOut = 0; // Эти суммы в валюте обязательств
                GetPaymentRequestSumByRepaymentJournal(
                    paymentRequest,
                    BankAccount,
                    out paymentRequestSumIn,
                    out paymentRequestSumOut,
                    out paymentRequestSumObligationIn,
                    out paymentRequestSumObligationOut
                    );

                // Величина неиспользованности Заявки   !!!!!!!! ПЕРЕСМОТРЕТЬ !!!!!!!!!!!
                // Поясение о вычислении неиспользованности. Сумма в заявке - это в валюте обязательств, чтобы её сравнить
                // с суммой платежа, надо перевести по кросс-курсу к валюте платежа и уже полученную сумму сравнить. Вопрос: на
                // какой день брать курс? Предлагается брать DateAccountChanged
                //Decimal deltaRequestSum = GetRequestSumByCourse(paymentRequest, paymentRequest.Valuta);   // В валюте платежа
                Decimal deltaRequestSum = GetRequestSumByCourse(paymentRequest, paymentValuta);   // В валюте платежа
                if (this.PaymentPayerRequisites.BankAccount == BankAccount)
                {
                    deltaRequestSum -= paymentRequestSumOut;
                }
                else if (this.PaymentReceiverRequisites.BankAccount == BankAccount)
                {
                    deltaRequestSum -= paymentRequestSumIn;
                }

                if (Decimal.Compare(Math.Abs(deltaRequestSum), _Accuracy) <= 0)
                {
                    continue;   // Переход к следующей заявке (тогда у заявки должен был бы быть статус PAYED и она не должна была попасть в рассмотрение - это предусловие контракта)
                }
                // Сравнение с точностью до 1 копейки
                if (Decimal.Compare(Math.Abs(deltaDocSum - deltaRequestSum), _Accuracy) <= 0)
                {
                    // Создаём задачу привязки
                    Session uow = this.Session;
                    //using (UnitOfWork uow = new UnitOfWork(Session.ObjectLayer)) {
                    fmCPRRepaymentTask task = new fmCPRRepaymentTask(uow);
                    task.BankAccount     = BankAccount;
                    task.PaymentDocument = this;
                    task.FillRepaymentTaskLines();
                    task.FillRequestList();
                    task.DoBindingRequest(paymentRequest, true, 0);
                    //uow.CommitChanges();
                    //}
                    // Поскольку заявка исчерпана, то меняем ей статус
                    paymentRequest.State = PaymentRequestStates.PAYED;
                    this.State           = PaymentDocProcessingStates.PROCESSED;

                    // Заявка и документ выписки полностью взаимопокрылись, поэтому
                    break;
                }
            }
        }