// // Private // private async Task <IActionResult> ProcessPaymentOptionsPost(Guid lowellReferenceSurrogateKey, PaymentOptionsVm paymentOptionsVmWithUserEntries) { if (!ModelState.IsValid) { var outstandingPayment = paymentOptionsVmWithUserEntries.FullPaymentAmountDerived; bool isDirectDebitPayment = paymentOptionsVmWithUserEntries.SelectedPlanSetupOption == PlanSetupOptions.AverageSetupValue || paymentOptionsVmWithUserEntries.SelectedPlanSetupOption == PlanSetupOptions.DisposableIncome || paymentOptionsVmWithUserEntries.SelectedPlanSetupOption == PlanSetupOptions.OtherPaymentOffer; if (isDirectDebitPayment && paymentOptionsVmWithUserEntries.DirectDebitAmount > outstandingPayment) { ModelState.Clear(); paymentOptionsVmWithUserEntries.DirectDebitAmount = null; ModelState.AddModelError(nameof(PaymentOptionsVm.SelectedPlanSetupOption), $"{ValidationMessages.AmountGreaterThenAllowed}{outstandingPayment}"); } else if (!isDirectDebitPayment && paymentOptionsVmWithUserEntries.PartialPaymentAmount.HasValue && paymentOptionsVmWithUserEntries.PartialPaymentAmount.Value > outstandingPayment) { ModelState.Clear(); paymentOptionsVmWithUserEntries.PartialPaymentAmount = null; ModelState.AddModelError(nameof(PaymentOptionsVm.PartialPaymentAmount), $"{ValidationMessages.AmountGreaterThenAllowed}{outstandingPayment}"); } else if (!isDirectDebitPayment && paymentOptionsVmWithUserEntries.PartialPaymentAmount.HasValue && paymentOptionsVmWithUserEntries.PartialPaymentAmount.Value < 1.0m ) { ModelState.Clear(); paymentOptionsVmWithUserEntries.PartialPaymentAmount = null; ModelState.AddModelError(nameof(PaymentOptionsVm.PartialPaymentAmount), $"{ValidationMessages.AmountLessThanOneGbp}"); } Debug.Assert(paymentOptionsVmWithUserEntries.InitialState != null, "Initial state must be stashed to re-create view on round-trip"); return(View(paymentOptionsVmWithUserEntries)); } if (paymentOptionsVmWithUserEntries.SelectedPaymentOption == PaymentOptionsSelectionsVm.Values.PartialPayment || paymentOptionsVmWithUserEntries.SelectedPaymentOption == PaymentOptionsSelectionsVm.Values.FullPayment) { OneOffPaymentReviewVm oneOffPaymentReviewVm; { // // IMPORTANT: Validates models again versus CaseFlow, to ensure no tamper or state changes since // started process of entering payment information // var result = await _buildOneOffPaymentReviewVmService.ValidateAndBuild( LoggedInUser, ApplicationSessionState, lowellReferenceSurrogateKey, paymentOptionsVmWithUserEntries, GetCaseflowUserId()); if (result.IsValid == false) { return(View("ValidationFailed")); } oneOffPaymentReviewVm = result.OneOffPaymentReviewVm; } // Stash state of payment options form, so that 'change' feature can return oneOffPaymentReviewVm.FilledInPaymentOptionsState = SerialiseModel(paymentOptionsVmWithUserEntries); var oneOffPaymentDto = _mapper.Map <OneOffPaymentReviewVm, OneOffPaymentDto>(oneOffPaymentReviewVm); _logger.LogDebug("Before AddVerifoneTransactionAsync"); await _verifonePaymentProviderService.AddVerifoneTransactionAsync( new VerifoneTransactionDto { CompanyCode = 1, //LFL TransactionGuid = oneOffPaymentReviewVm.VerifoneTransactionGuid, TransactionData = JsonConvert.SerializeObject(oneOffPaymentDto) }); _gtmService.RaiseOneOffPaymentEvent_OptionsSelected(oneOffPaymentReviewVm, LoggedInUserId, "Regular Account"); await _webActivityService.LogOneOffPaymentSelected(oneOffPaymentReviewVm.LowellReference, LoggedInUserId, !oneOffPaymentReviewVm.PaidInFull, oneOffPaymentReviewVm.DiscountSelected); // Ensure no model state is used in view render ModelState.Clear(); ApplicationSessionState.LogPaymentResult = true; return(View("OneOff", oneOffPaymentReviewVm)); } if (paymentOptionsVmWithUserEntries.SelectedPaymentOption == PaymentOptionsSelectionsVm.Values.DirectDebit) { // Not validated here - occurs on the final step (DirectDebitComplete) var directDebitDetailsVm = _buildDirectDebitDetailsVmService.Build(paymentOptionsVmWithUserEntries); // Stash model in state, to allow view to be rebuilt on postback directDebitDetailsVm.InitialState = SerialiseModel(directDebitDetailsVm); // Stash payment options VM in Direct Debit VM to allow it to be passed back // (e.g. if user clicks 'change' and goes back to Payment Options) directDebitDetailsVm.PaymentOptionsFilledInState = SerialiseModel(paymentOptionsVmWithUserEntries); if (directDebitDetailsVm.DiscountSelected) { await LogDiscountDirectDebitOptionsSelected(paymentOptionsVmWithUserEntries); } else { await LogDirectDebitOptionsSelected(paymentOptionsVmWithUserEntries); } // TODO: change over to building and returning view directly _gtmService.RaiseDirectDebitEvent_OptionsSelected(directDebitDetailsVm, LoggedInUserId, "Regular Account"); ApplicationSessionState.LogSetUpPlanResult = true; return(View("DirectDebit", directDebitDetailsVm)); } throw new ApplicationException("Invalid SelectedPaymentOption"); }