public virtual async Task <ActionResult> Index(FormCollection formValues)
        {
            BicycleQuote quote = new BicycleQuote();

            TryUpdateModel(quote, formValues);

            IEnumerable <ErrorInfo> errors = ViewModelValidator.Validate(quote.Question, "Question");

            ModelStateUtil.AddModelStateErrors(ViewData.ModelState, errors, null, x => true, GetQuestionError);

            if (!ModelState.IsValid)
            {
                ViewData.SetReferenceData(_questionFormHandler.CreateReferenceData());

                return(ValidationError(quote));
            }

            // do this after validation, no point creating a policy if the form is invalid.
            long?     policyId = this.GetPolicyId(false);
            PolicyDTO policy;

            if (policyId == null)
            {
                policy = await _questionFormHandler.CreatePolicy(quote.Question);

                this.SetPolicyId(policy.Id);
            }
            else
            {
                policy = await _questionFormHandler.UpdatePolicy(policyId, quote.Question);
            }

            return(NavigateToAction(LocalMVC.Quote.Index()));
        }
        public virtual async Task <ActionResult> Index(FormCollection formValues)
        {
            BicycleQuote model = new BicycleQuote();

            TryUpdateModel(model, formValues);

            long?policyId = this.GetPolicyId();

            Result <Transaction> transaction = await _paymentFormHandler.ProcessPayment(policyId, model.PolicyPayment.PaymentDetails.BrainTree.payment_method_nonce);

            if (transaction != null && transaction.IsSuccess())
            {
                model.PolicyPayment.PaymentDetails.BrainTree.PaymentFailed = false;
                await _paymentFormHandler.IssuePolicy(policyId, transaction);
            }
            else
            {
                model.PolicyPayment.PaymentDetails.BrainTree.PaymentFailed = true;
            }

            // validate model
            IEnumerable <ErrorInfo> errors = ViewModelValidator.Validate(model.PolicyPayment, "PolicyPayment");

            ModelStateUtil.AddModelStateErrors(ViewData.ModelState, errors, null, x => true, GetQuestionError);

            if (ModelState.IsValid) // continue if payment succeeded
            {
                return(NavigateToAction(LocalMVC.Confirmation.Index()));
            }
            else
            {
                await _paymentFormHandler.UpdateModelFromDto(this.GetPolicyId(), model);

                ViewData.SetReferenceData(_paymentFormHandler.CreateReferenceData());

                model.PolicyPayment.PaymentDetails.BrainTree.ClientToken = _paymentFormHandler.GetBraintreeClientToken();

                return(ValidationError(model));
            }
        }
        public virtual async Task <ActionResult> Index(FormCollection formValues)
        {
            BicycleQuote quote = new BicycleQuote();

            TryUpdateModel(quote, formValues);

            IEnumerable <ErrorInfo> errors = ViewModelValidator.Validate(quote.PolicyDetail, "PolicyDetail");

            ModelStateUtil.AddModelStateErrors(ViewData.ModelState, errors, null, x => true, GetQuestionError);

            if (!ModelState.IsValid)
            {
                PolicyDTO policy = await _policyDetailFormHandler.GetPolicy(this.GetPolicyId());

                SetReferenceData(policy, quote);

                return(ValidationError(quote));
            }

            await _policyDetailFormHandler.UpdateContactDetails(this.GetPolicyId(), quote);

            return(NavigateToAction(LocalMVC.Payment.Index()));
        }