public ActionResult CreatePayment(CreatePaymentViewModel model, FormCollection form) { long orderId = Convert.ToInt64(form["orderId"]); IEnumerable <PayableOrderViewModel> payableOrders = paymentProvider.CreatePaymentFromOrder(orderId); Order order = orderProvider.GetOrder(orderId); decimal deliveryCharge = order.DeliveryCharge; decimal discValue = order.DiscValue; decimal totalOrder = payableOrders.Sum(p => p.Quantity * p.UnitPrice - p.DiscValue); //decimal serviceChargePercent = configurationProvider.GetConfiguration<decimal>(ConfigurationKeys.ServiceChargePercent); //decimal serviceChargeValue = (serviceChargePercent / 100) * totalOrder; decimal taxPercent = configurationProvider.GetConfiguration <decimal>(ConfigurationKeys.TaxPercent); decimal taxValue = (taxPercent / 100) * (totalOrder - discValue); decimal billableAmount = totalOrder + /*serviceChargeValue +*/ deliveryCharge - discValue + taxValue; decimal totalPayment = PaymentDetailSessionWrapper.TotalPayment; if (totalPayment < billableAmount) { TempData["message"] = "Insufficient payment"; return(RedirectToAction("CreatePayment", new { orderId = orderId })); } else { if (PaymentDetailSessionWrapper.TotalNonCash > billableAmount) { TempData["message"] = "Non-cash payment(s) exceed billable amount"; return(RedirectToAction("CreatePayment", new { orderId = orderId })); } } var payment = new Payment() { BilledAmount = billableAmount, Date = DateTime.Today, OrderId = orderId, PaidAmount = totalPayment }; var paymentDetail = new List <PaymentDetail>(); mapper.Map(PaymentDetailSessionWrapper.Detail, paymentDetail); if (totalPayment > billableAmount) { decimal change = totalPayment - billableAmount; var paymentDetailChange = new PaymentDetail(); paymentDetailChange.PaymentTypeId = 1; paymentDetailChange.Amount = change * -1; paymentDetailChange.Notes = "Change"; paymentDetail.Add(paymentDetailChange); } payment.PaymentDetails.AddRange(paymentDetail); paymentProvider.AddPayment(order, payment); long paymentId = payment.Id; TempData["PaymentId"] = paymentId; OrderDetailSessionWrapper.Clear(); PaymentDetailSessionWrapper.Clear(); return(RedirectToAction("Detail", new { id = paymentId, mode = StringHelper.XorString("confirmation") })); }