private Boolean GetAnswer(UnitOfWork uow, fmCDocRCB paymentDocument, fmCPRPaymentRequest paymentRequest) { Decimal _Accuracy = 0.01m; // Сопоставление с точностью до копейки // Сумма Платёжного документа по OperationJournal (в валюте платежа) Decimal operationPaymentDocSumIn = 0, operationPaymentDocSumOut = 0; GetPaymentDocSumByOperationJournal(uow, paymentDocument, out operationPaymentDocSumIn, out operationPaymentDocSumOut); // Одна из сумм operationPaymentDocSumIn или operationPaymentDocSumOut обязательно равна 0 // Сумма Платёжного документа по RepaymentJournal (в валюте платежа - это величины SumIn и SumOut) Decimal repaymentDocSumIn = 0, repaymentDocSumOut = 0; GetPaymentDocSumByRepaymentJournal(uow, paymentDocument, out repaymentDocSumIn, out repaymentDocSumOut); // Одна из сумм repaymentDocSumIn или repaymentDocSumOut также обязательно равна 0 // Величина непокрытия Платёжного документа Заявками (все суммы в валюте платежа) Decimal deltaDocSumIn = operationPaymentDocSumIn - repaymentDocSumIn; Decimal deltaDocSumOut = operationPaymentDocSumOut - repaymentDocSumOut; if (Decimal.Compare(Math.Abs(deltaDocSumIn) + Math.Abs(deltaDocSumOut), _Accuracy) <= 0) { return(false); } // Всё сопоставлено уже с точностью до _Accuracy - так условились! return(true); }
private void EnableButton() { if (View == null || View.CurrentObject == null || View.CurrentObject as fmCPRPaymentRequest == null) { return; } fmCPRPaymentRequest current = View.CurrentObject as fmCPRPaymentRequest; if (current.State != PaymentRequestStates.IN_PAYMENT && current.State != PaymentRequestStates.IN_BANK) { this.InBankAction.Enabled[DO_ENABLED] = false; this.InPaymentAction.Enabled[DO_ENABLED] = false; } else if (current.State == PaymentRequestStates.IN_PAYMENT) { this.InBankAction.Enabled[DO_ENABLED] = true; this.InPaymentAction.Enabled[DO_ENABLED] = false; } else if (current.State == PaymentRequestStates.IN_BANK) { this.InBankAction.Enabled[DO_ENABLED] = false; this.InPaymentAction.Enabled[DO_ENABLED] = true; } // В связи с настройка триады кнопок перехода по бизнесс-процессу, две кнопки пока прячем, // затем их надо будет удалить навсегда. Аминь. this.InBankAction.Active[DO_ACTIVE] = false; this.InPaymentAction.Active[DO_ACTIVE] = false; }
private void EnableButton() { if (View == null || View.CurrentObject == null || View.CurrentObject as fmCPRPaymentRequest == null) { return; } fmCPRPaymentRequest current = View.CurrentObject as fmCPRPaymentRequest; if (current.State != PaymentRequestStates.TEMPLATE) { this.CreateTemplate.Enabled[DO_ENABLED] = true; } else if (current.State == PaymentRequestStates.TEMPLATE) { this.CreateTemplate.Enabled[DO_ENABLED] = false; } // Кнопка Утвердить служебны. записку if (current.State != PaymentRequestStates.OPEN || current.State != PaymentRequestStates.REGISTERED) { this.ApproveMemorandum.Enabled[DO_ENABLED] = true; if (this.ObjectSpace.GetObjectsToSave(true).Count > 0) { this.ApproveMemorandum.Enabled[DO_ENABLED] = false; } } else if (current.State == PaymentRequestStates.TEMPLATE) { this.ApproveMemorandum.Enabled[DO_ENABLED] = false; } // В связи с настройка триады кнопок перехода по бизнесс-процессу, две кнопки пока прячем, // затем их надо будет удалить навсегда. Аминь. this.ApproveMemorandum.Active[DO_ACTIVE] = false; }
private void GetPaymentRequestSumByRepaymentJournal(UnitOfWork uow, fmCPRPaymentRequest PaymentRequest, out Decimal SumIn, out Decimal SunOut, out Decimal SumObligationIn, out Decimal SunObligationOut) { XPQuery <fmCPRRepaymentJurnal> repaymentJournals = new XPQuery <fmCPRRepaymentJurnal>(uow); var queryRepaymentJournals = from repaymentJournal in repaymentJournals where repaymentJournal.PaymentRequest == PaymentRequest select repaymentJournal; SumIn = queryRepaymentJournals.Sum(x => x.SumIn); SunOut = queryRepaymentJournals.Sum(x => x.SumOut); SumObligationIn = queryRepaymentJournals.Sum(x => x.SumObligationIn); SunObligationOut = queryRepaymentJournals.Sum(x => x.SumObligationOut); }
private void GetPaymentRequestSumByRepaymentJournal(fmCPRPaymentRequest PaymentRequest, crmBankAccount bankAccount, out Decimal SumIn, out Decimal SunOut, out Decimal SumObligationIn, out Decimal SunObligationOut) { XPQuery <fmCPRRepaymentJurnal> repaymentJournals = new XPQuery <fmCPRRepaymentJurnal>(this.Session, true); var queryRepaymentJournals = (from repaymentJournal in repaymentJournals where repaymentJournal.PaymentRequest == PaymentRequest && repaymentJournal.BankAccount == bankAccount select repaymentJournal).ToList <fmCPRRepaymentJurnal>(); SumIn = queryRepaymentJournals.Sum(x => x.SumIn); SunOut = queryRepaymentJournals.Sum(x => x.SumOut); SumObligationIn = queryRepaymentJournals.Sum(x => x.SumObligationIn); SunObligationOut = queryRepaymentJournals.Sum(x => x.SumObligationOut); }
private void DeclineAction_Execute(object sender, SimpleActionExecuteEventArgs e) { if (View == null || e.CurrentObject == null || e.CurrentObject as fmCPRPaymentRequest == null) { return; } ObjectSpace.CommitChanges(); fmCPRPaymentRequest paymentRequest = e.CurrentObject as fmCPRPaymentRequest; fmCPRPaymentRequestBusinesLogic.DoDeclineAction(ObjectSpace, paymentRequest); ObjectSpace.CommitChanges(); if (View is DetailView) { View.Close(); } }
private void SuspendAction_Execute(object sender, SimpleActionExecuteEventArgs e) { if (View == null || e.CurrentObject == null || e.CurrentObject as fmCPRPaymentRequest == null) { return; } ObjectSpace.CommitChanges(); fmCPRPaymentRequest paymentRequest = e.CurrentObject as fmCPRPaymentRequest; fmCPRPaymentRequestBusinesLogic.DoSuspendAction(ObjectSpace, paymentRequest); ObjectSpace.CommitChanges(); if (View is DetailView) { View.Close(); } //fmCPRPaymentRequestBusinesLogic.DoTransitAction(ObjectSpace, e.Object as fmCPRPaymentRequest, (PaymentRequestStates)(e.OldValue), (PaymentRequestStates)(e.NewValue)); }
/// <summary> /// Привязать созданную заявку, включить в список всех заявок /// </summary> /// <param name="obj"></param> private void BindRequest(fmCPRPaymentRequest request, IObjectSpace workOS) { if (View.CurrentObject as fmCPRRepaymentTask == null) { return; } if (request == null) { return; } fmCPRRepaymentTask task = View.CurrentObject as fmCPRRepaymentTask; fmCPRRepaymentTask nTask = workOS.GetObject <fmCPRRepaymentTask>(task); // Включение в список заявок в задаче nTask.AddRequestToAll(request, true); // обработка nTask.DoBindingRequest(request, true, 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); }
private void StateChange() { if (View == null || View.CurrentObject == null || View.CurrentObject as fmCPRPaymentRequest == null) { return; } fmCPRPaymentRequest current = View.CurrentObject as fmCPRPaymentRequest; if (current.State != PaymentRequestStates.IN_PAYMENT && current.State != PaymentRequestStates.IN_BANK) { return; } if (current.State == PaymentRequestStates.IN_BANK) { current.State = PaymentRequestStates.IN_PAYMENT; } else { current.State = PaymentRequestStates.IN_BANK; } EnableButton(); }
/// <summary> /// Создать заявку выбранного типа и показать в модальном окне /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void NewRequestAction_Execute(object sender, SingleChoiceActionExecuteEventArgs e) { if (e.SelectedChoiceActionItem != null) { // Вариант с явным показом заявки в модальном окне (пользователь вручную дорабатывает её) IObjectSpace workOS = ObjectSpace.CreateNestedObjectSpace(); //IObjectSpace workOS = ObjectSpace; //fmCPRPaymentRequest request = CreateRequest(e.SelectedChoiceActionItem.Data as SuperRequest, workOS); SuperRequest superRequest = e.SelectedChoiceActionItem.Data as SuperRequest; fmCPRPaymentRequest request = fmCPRPaymentRequestBusinesLogic.CreateRequest(workOS, View.CurrentObject as fmCPRRepaymentTask, superRequest.RequestType as Type, GetFinRequestKindByIndex(superRequest.RequestKind)); Boolean byFin = false; if (request.State == PaymentRequestStates.FINANCE_PAYMENT) { byFin = true; } if (request != null) { // Привязка BindRequest(request, workOS); } if (byFin) { request.State = PaymentRequestStates.FINANCE_PAYMENT; } // Показать картинку ShowRequest(workOS, request, e.ShowViewParameters); //, workOS); // Сброс выбора в списке NewRequestAction.SelectedItem = null; // Не обновляется форма в Root после сохранения вложенного ObjectSpace и заявки нет в списке всех заявок } }
private void CreateCFRegisterRecord(Session ssn, ForCashFlowRecord cashFlowRecord) //, crmCParty ourParty) { { crmCashFlowRegister cfr = new crmCashFlowRegister(ssn); fmCPRRepaymentTask repaymentTask = cashFlowRecord.repaymentTask; fmCDocRCB paymentDoc = cashFlowRecord.paymentDoc; fmCPRPaymentRequest paymentRequest = cashFlowRecord.paymentRequest; Guid token = paymentRequest.Oid; cfr.Token = token; cfr.Section = CashFlowRegisterSection.REPAYMENT_JOURNAL; cfr.SourceGUID = repaymentTask.Oid; // Будет пустой GUID cfr.SourceType = repaymentTask.GetType(); cfr.PaymentDocument = paymentDoc; cfr.BankAccount = repaymentTask.BankAccount; cfr.Bank = repaymentTask.BankAccount.Bank; cfr.OperationDate = cashFlowRecord.date; fmCPRPaymentRequestContract paymentRequestContract = paymentRequest as fmCPRPaymentRequestContract; //if (paymentRequestContract != null && paymentRequestContract.ContractDeal != null) { // cfr.Contract = paymentRequestContract.ContractDeal.Contract; //} if (paymentRequestContract != null) { cfr.Contract = paymentRequestContract.Contract; cfr.ContractDeal = paymentRequestContract.ContractDeal; } cfr.fmOrder = cashFlowRecord.paymentRequestObligation.Order; cfr.CostItem = cashFlowRecord.paymentRequestObligation.CostItem; cfr.Subject = (cashFlowRecord.paymentRequestObligation.Order != null) ? cashFlowRecord.paymentRequestObligation.Order.Subject : null; cfr.PrimaryParty = paymentRequest.PartyPaySender; cfr.ContragentParty = paymentRequest.PartyPayReceiver; //cfr.ObligationUnit = //cfr.PaymentItem = cfr.ValutaPayment = paymentDoc.GetAccountValuta(); cfr.ValutaObligation = cashFlowRecord.paymentRequestObligation.Valuta; // В валюте платежа //cfr.SumIn = this.PaymentDocument.GetSumIn(this.BankAccount); //cfr.SumOut = this.PaymentDocument.GetSumOut(this.BankAccount); /* * if (paymentDoc.PaymentReceiverRequisites.INN == ourParty.INN) { // && this.PaymentDocument.PaymentReceiverRequisites.StatementOfAccount.BankAccount == this.BankAccount) { * cfr.SumIn = paymentDoc.PaymentCost; * } * if (paymentDoc.PaymentPayerRequisites.INN == ourParty.INN) { // && this.PaymentDocument.PaymentPayerRequisites.StatementOfAccount.BankAccount == this.BankAccount) { * cfr.SumOut = paymentDoc.PaymentCost; * } */ if (paymentDoc.PaymentReceiverRequisites.BankAccount == cashFlowRecord.repaymentJournalRecord.BankAccount) // && this.PaymentDocument.PaymentReceiverRequisites.StatementOfAccount.BankAccount == this.BankAccount) { //cfr.SumIn = cashFlowRecord.repaymentJournalRecord.SumIn; { cfr.SumIn = cashFlowRecord.sum; } if (paymentDoc.PaymentPayerRequisites.BankAccount == cashFlowRecord.repaymentJournalRecord.BankAccount) // && this.PaymentDocument.PaymentPayerRequisites.StatementOfAccount.BankAccount == this.BankAccount) { //cfr.SumOut = cashFlowRecord.repaymentJournalRecord.SumOut; { cfr.SumOut = cashFlowRecord.sum; } // В валюте обязательств /* * if (paymentDoc.PaymentReceiverRequisites.INN == ourParty.INN) { // && this.PaymentDocument.PaymentReceiverRequisites.StatementOfAccount.BankAccount == this.BankAccount) { * cfr.SumObligationIn = cashFlowRecord.sum; * } * if (paymentDoc.PaymentPayerRequisites.INN == ourParty.INN) { // && this.PaymentDocument.PaymentPayerRequisites.StatementOfAccount.BankAccount == this.BankAccount) { * cfr.SumObligationOut = cashFlowRecord.sum; * } */ if (paymentDoc.PaymentReceiverRequisites.BankAccount == cashFlowRecord.repaymentJournalRecord.BankAccount) // && this.PaymentDocument.PaymentReceiverRequisites.StatementOfAccount.BankAccount == this.BankAccount) { //cfr.SumObligationIn = cashFlowRecord.sum; { cfr.SumObligationIn = Math.Round(cfr.SumIn * csCNMValutaCourse.GetCrossCourceOnDate(ssn, paymentDoc.GetAccountDateChange(), cfr.ValutaPayment, cfr.ValutaObligation), 4); } if (paymentDoc.PaymentPayerRequisites.BankAccount == cashFlowRecord.repaymentJournalRecord.BankAccount) // && this.PaymentDocument.PaymentPayerRequisites.StatementOfAccount.BankAccount == this.BankAccount) { //cfr.SumObligationOut = cashFlowRecord.sum; { cfr.SumObligationOut = Math.Round(cfr.SumOut * csCNMValutaCourse.GetCrossCourceOnDate(ssn, paymentDoc.GetAccountDateChange(), cfr.ValutaPayment, cfr.ValutaObligation), 4); } // В рублях try { cfr.SumInAcc = Math.Round(cfr.SumIn * csCNMValutaCourse.GetCrossCourceOnDate(ssn, paymentDoc.GetAccountDateChange(), cfr.ValutaPayment, GetValutaByCode(ssn, "RUB")), 4); cfr.SumOutAcc = Math.Round(cfr.SumOut * csCNMValutaCourse.GetCrossCourceOnDate(ssn, paymentDoc.GetAccountDateChange(), cfr.ValutaPayment, GetValutaByCode(ssn, "RUB")), 4); } catch { } cfr.PaymentRequestObligationGUID = cashFlowRecord.paymentRequestObligationGUID; //if (this.PaymentReceiverRequisites.INN == OurParty.INN && this.PaymentReceiverRequisites.StatementOfAccount.BankAccount == bankAccount) { // Res = this.PaymentCost; //} }
public Decimal GetSumRepaymentJournalOnDate(Session ssn, DateTime operationDate, fmCDocRCB paymentDoc, fmCPRPaymentRequest paymentRequest) { Decimal repaymentJournalSum = 0; XPQuery <fmCPRRepaymentJurnal> repaymentJournals = new XPQuery <fmCPRRepaymentJurnal>(ssn); var repaymentJournalQuery = from repaymentJournal in repaymentJournals where repaymentJournal.PaymentDocument == paymentDoc && repaymentJournal.PaymentDate == operationDate select repaymentJournal; foreach (var repaymentJournal in repaymentJournalQuery) { repaymentJournalSum += repaymentJournal.SumOut * csCNMValutaCourse.GetCrossCourceOnDate(ssn, repaymentJournal.PaymentDate.Date, repaymentJournal.ValutaPayment, GetValutaByCode(ssn, "RUB")); } return(repaymentJournalSum); }
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); }
public virtual void AutoBinding(crmBankAccount BankAccount, fmCPRPaymentRequest PaymentRequest, fmCPRRepaymentTask RepaymentTask) { // Привязка с распределением счетов // Проверка на уже связанность заявки XPQuery <fmCPRRepaymentJurnal> repaymentJurnalExists = new XPQuery <fmCPRRepaymentJurnal>(this.Session); var queryRepaymentJurnalExists = from repaymentJurnal in repaymentJurnalExists where repaymentJurnal.PaymentDocument == this select repaymentJurnal; if (queryRepaymentJurnalExists.Count() > 0) { DevExpress.XtraEditors.XtraMessageBox.Show("Заявка уже привязана"); return; } // Проверка на превышение сумм if (RepaymentTask.RepaymentRegisterSum + PaymentRequest.Summ > RepaymentTask.OperationRegisterSum) { DevExpress.XtraEditors.XtraMessageBox.Show("Сумма связанных заявок превысит сумму по документам выписки. Привязка невозможна."); return; } // Наша организация crmCParty OurParty = GetOurParty(); // Привязка в принципе возможна, т.е. выбранная заявка добавляется в fmCPRRepaymentJurnal fmCPRRepaymentJurnal newRepaymentJournalRecord = new fmCPRRepaymentJurnal(Session); newRepaymentJournalRecord.BankAccount = BankAccount; //newRepaymentJournalRecord.PaymentDate = newRepaymentJournalRecord.PaymentDocument = this; newRepaymentJournalRecord.PaymentRequest = PaymentRequest; newRepaymentJournalRecord.PlaneFact = CRM.Contract.Analitic.PlaneFact.FACT; if (OurParty.INN == PaymentRequest.PartyPayReceiver.INN) { newRepaymentJournalRecord.SumIn = PaymentRequest.Summ; } if (OurParty.INN == PaymentRequest.PartyPaySender.INN) { newRepaymentJournalRecord.SumOut = PaymentRequest.Summ; } newRepaymentJournalRecord.ValutaObligation = PaymentRequest.Valuta; // Валюта обязательств newRepaymentJournalRecord.ValutaPayment = PaymentRequest.PaymentValuta; // Валюта платежа // Обновление таблицы RepaymentTaskLines // Удаление всех записей из fmCPRRepaymentTaskLine Session.Delete(RepaymentTask.RepaymentTaskLines); //Session.PurgeDeletedObjects(); // Журнал привязок XPQuery <fmCPRRepaymentJurnal> repaymentJurnals = new XPQuery <fmCPRRepaymentJurnal>(this.Session); var queryRepaymentJurnals = from repaymentJurnal in repaymentJurnals where repaymentJurnal.PaymentDocument == this select repaymentJurnal; var queryGroupRepaymentJurnals = from repaymentJurnal in queryRepaymentJurnals group repaymentJurnal by new { repaymentJurnal.PaymentRequest } into grj select new { PaymentRequest = grj.Key.PaymentRequest, GroupSumIn = grj.Sum(row => row.SumIn), GroupSumOut = grj.Sum(row => row.SumOut) }; foreach (var grj in queryGroupRepaymentJurnals) { // Добавляем запись в fmCPRRepaymentTaskLine fmCPRRepaymentTaskLine newLine = new fmCPRRepaymentTaskLine(Session); newLine.RepaymentTask = RepaymentTask; RepaymentTask.RepaymentTaskLines.Add(newLine); newLine.PaymentRequest = PaymentRequest; newLine.RequestSum = grj.GroupSumIn + grj.GroupSumOut; // Одна из них равна 0 } }
private void gridView_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e) { XafGridView gridView = (XafGridView)sender; selectedPaymentRequest = gridView.GetRow(e.FocusedRowHandle) as fmCPRPaymentRequest; }