public virtual IPurchaseOrder PlaceOrder(ICart cart, ModelStateDictionary modelState, CheckoutViewModel checkoutViewModel) { try { var paymentProcessingResults = cart.ProcessPayments(_paymentProcessor, _orderGroupCalculator); if (paymentProcessingResults.Any(r => !r.IsSuccessful)) { modelState.AddModelError("", _localizationService.GetString("/Checkout/Payment/Errors/ProcessingPaymentFailure") + string.Join(", ", paymentProcessingResults.Select(p => p.Message))); return(null); } var redirectPayment = paymentProcessingResults.FirstOrDefault(r => !string.IsNullOrEmpty(r.RedirectUrl)); if (redirectPayment != null) { checkoutViewModel.RedirectUrl = redirectPayment.RedirectUrl; return(null); } var processedPayments = cart.GetFirstForm().Payments.Where(x => x.Status.Equals(PaymentStatus.Processed.ToString())); if (!processedPayments.Any()) { // Return null in case there is no payment was processed. return(null); } var totalProcessedAmount = processedPayments.Sum(x => x.Amount); if (totalProcessedAmount != cart.GetTotal(_orderGroupCalculator).Amount) { throw new InvalidOperationException("Wrong amount"); } PurchaseValidation validation = null; if (checkoutViewModel.IsAuthenticated) { validation = AuthenticatedPurchaseValidation; } else { validation = AnonymousPurchaseValidation; } if (!validation.ValidateOrderOperation(modelState, _cartService.RequestInventory(cart))) { return(null); } var orderReference = _orderRepository.SaveAsPurchaseOrder(cart); var purchaseOrder = _orderRepository.Load <IPurchaseOrder>(orderReference.OrderGroupId); _orderRepository.Delete(cart.OrderLink); return(purchaseOrder); } catch (PaymentException ex) { modelState.AddModelError("", _localizationService.GetString("/Checkout/Payment/Errors/ProcessingPaymentFailure") + ex.Message); } return(null); }
public virtual bool ValidateOrder(ModelStateDictionary modelState, CheckoutViewModel viewModel, Dictionary <ILineItem, List <ValidationIssue> > validationIssueCollections) { PurchaseValidation validation = null; if (viewModel.IsAuthenticated) { validation = AuthenticatedPurchaseValidation; } else { validation = AnonymousPurchaseValidation; } return(validation.ValidateModel(modelState, viewModel) && validation.ValidateOrderOperation(modelState, validationIssueCollections)); }