Esempio n. 1
0
        /// <summary>
        /// Create a single Transaction checkout
        /// </summary>
        /// <param name="key">Encrypted key of the transaction to claim</param>
        /// <returns>Transaction checkout view</returns>
        public ActionResult Checkout(string key)
        {
            var transactionId = Common.Utils.SafeConvert.ToGuid(key.DecryptUrl());

            using (var context = dataContextFactory.CreateByUser())
                using (var basket = BasketWrapper.CreateByTransaction(dataContextFactory, transactionId))
                {
                    if (basket.Transaction == null)
                    {
                        throw new EntityNotFoundException("Transaction SKUs are not accessible to current user!");
                    }

                    if (basket.Transaction.Status == TransactionStatus.Complete)
                    {
                        throw new EntityOperationNotSupportedException("Transaction is already claimed!");
                    }

                    var owningCustomerQuery     = (from x in context.Customers orderby x.Name select x);
                    var purchasingCustomerQuery = (from x in context.Customers orderby x.Name select x);
                    var countryQuery            = (from x in context.Countries orderby x.CountryName select x);

                    var viewModel = new TransactionCheckoutViewModel(basket.Transaction,
                                                                     owningCustomerQuery.ToList(), purchasingCustomerQuery.ToList(), countryQuery.ToList());

                    return(View(viewModel));
                }
        }
Esempio n. 2
0
        /// <summary>
        /// Report transaction complete
        /// </summary>
        /// <param name="key">Encoded key for the transaction</param>
        /// <returns>Transaction complete view</returns>
        /// <remarks>
        /// Does not use cookie. Cookie is removed before this step so a new transaction can
        /// be started once the transaction has become pending.
        /// </remarks>
        public ActionResult Complete(string key)
        {
            var transactionId = Common.Utils.SafeConvert.ToGuid(key.DecryptUrl());

            using (var basket = BasketWrapper.CreateByTransaction(dataContextFactory, transactionId))
            {
                basket.ExecuteComplete();

                var viewModel = new TransactionDetailsViewModel(basket.Transaction);

                return(View(viewModel));
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Resend an email to claim transaction
        /// </summary>
        /// <param name="key">Id of the transaction</param>
        /// <returns>Result of sending</returns>
        public ActionResult Remind(string key)
        {
            var transactionId = Common.Utils.SafeConvert.ToGuid(key.DecryptUrl());

            using (var basket = BasketWrapper.CreateByTransaction(dataContextFactory, transactionId))
            {
                if (basket.Transaction == null)
                {
                    throw new EntityNotFoundException("Transaction could not be resolved!");
                }

                basket.ExecuteRemind();

                mailService.SendTransactionMail(basket.Transaction.PurchaserName,
                                                basket.Transaction.PurchaserEmail,
                                                basket.Transaction.TransactionId);

                return(RedirectToAction("Index"));
            }
        }
Esempio n. 4
0
        public ActionResult Checkout(string key, TransactionCheckoutViewModel viewModel)
        {
            var transactionId = Common.Utils.SafeConvert.ToGuid(key.DecryptUrl());

            if (ModelState.IsValid)
            {
                using (var context = dataContextFactory.CreateByUser())
                    using (var basket = BasketWrapper.CreateByTransaction(dataContextFactory, transactionId))
                    {
                        if (basket.Transaction == null)
                        {
                            throw new EntityNotFoundException("Transaction SKUs are not accessible to current user!");
                        }

                        if (basket.Transaction.Status == TransactionStatus.Complete)
                        {
                            throw new EntityOperationNotSupportedException("Transaction is already claimed!");
                        }

                        viewModel.ToEntity(basket.Transaction);

                        Customer purchasingCustomer;
                        Customer owningCustomer;

                        if (viewModel.ExistingPurchasingCustomer)
                        {
                            purchasingCustomer = context.Customers.SingleOrDefault(x => x.ObjectId == viewModel.PurchasingCustomerId);

                            if (purchasingCustomer == null)
                            {
                                return(new HttpStatusCodeResult(HttpStatusCode.InternalServerError));
                            }
                        }
                        else
                        {
                            purchasingCustomer = viewModel.NewPurchasingCustomer.ToEntity(null);
                        }

                        if (viewModel.OwningCustomerIsPurchasingCustomerId)
                        {
                            owningCustomer = purchasingCustomer;
                        }
                        else
                        {
                            if (viewModel.ExistingOwningCustomer)
                            {
                                owningCustomer = context.Customers.SingleOrDefault(x => x.ObjectId == viewModel.OwningCustomerId);

                                if (owningCustomer == null)
                                {
                                    return(new HttpStatusCodeResult(HttpStatusCode.InternalServerError));
                                }
                            }
                            else
                            {
                                owningCustomer = viewModel.NewOwningCustomer.ToEntity(null);
                            }
                        }

                        basket.ExecuteCheckout(purchasingCustomer, owningCustomer);

                        return(RedirectToAction("Complete", new { key = basket.Transaction.TransactionId.ToString().EncryptUrl() }));
                    }
            }
            else
            {
                return(View(viewModel));
            }
        }