Exemplo n.º 1
0
        public async Task <IActionResult> Create([Bind("ID,Name,Description,PriceHighSeason,PriceOffSeason,Image,Size,Year,Cabins,AirCond")] Yacht yacht)
        {
            if (ModelState.IsValid)
            {
                _context.Add(yacht);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            return(View(yacht));
        }
Exemplo n.º 2
0
        public async Task <IActionResult> Index(CheckoutViewModel model)
        {
            if (ModelState.IsValid)
            {
                // load cart
                if (Request.Cookies.ContainsKey("cartId"))
                {
                    if (Guid.TryParse(Request.Cookies["cartId"], out var cartId))
                    {
                        model.Cart = await _oContext.Carts
                                     .Include(carts => carts.CartItems)
                                     .ThenInclude(cartitems => cartitems.Yacht)
                                     .FirstOrDefaultAsync(x => x.CookieIdentifier == cartId);
                    }
                }

                Order order = new Order
                {
                    TrackingNumber = Guid.NewGuid().ToString(),
                    OrderDate      = DateTime.Now,
                    OrderItems     = model.Cart.CartItems.Select(x => new OrderItem
                    {
                        Yacht = x.Yacht,

                        DatesFrom = x.DatesFrom,
                        DatesTo   = x.DatesTo
                    }).ToArray(),
                    FirstName   = model.FirstName,
                    LastName    = model.LastName,
                    Email       = model.Email,
                    Address     = model.Address,
                    Country     = model.Country,
                    Zip         = model.Zip,
                    PhoneNumber = model.PhoneNumber
                };


                Braintree.Customer customer            = null;
                Braintree.CustomerSearchRequest search = new Braintree.CustomerSearchRequest();
                search.Email.Is(model.Email);
                var searchResult = await _braintreeGateway.Customer.SearchAsync(search);

                if (searchResult.Ids.Count == 0)
                {
                    //Create  a new Braintree Customer
                    Braintree.Result <Customer> creationResult =
                        await _braintreeGateway.Customer.CreateAsync(new Braintree.CustomerRequest
                    {
                        Email = model.Email,
                        Phone = model.PhoneNumber
                    });

                    customer = creationResult.Target;
                }
                else
                {
                    customer = searchResult.FirstItem;
                }


                //More on card testing: https://developers.braintreepayments.com/reference/general/testing/dotnet
                var transaction = new TransactionRequest
                {
                    Amount = model.Cart.CartItems.Sum(x => (x.Yacht.PriceHighSeason ?? 0)),

                    CreditCard = new TransactionCreditCardRequest
                    {
                        Number          = model.CCnumber,
                        CardholderName  = model.NameOnCard,
                        CVV             = model.CVV,
                        ExpirationMonth = model.ExpirationMonth?.PadLeft(2, '0'),
                        ExpirationYear  = model.ExpirationYear
                    },
                    CustomerId = customer.Id,
                    LineItems  = model.Cart.CartItems.Select(x => new TransactionLineItemRequest
                    {
                        Name = x.Yacht.Name,
                        // Description = x.Yacht.Description,
                        ProductCode  = x.Yacht.ID.ToString(),
                        Quantity     = '1',
                        LineItemKind = TransactionLineItemKind.DEBIT,
                        UnitAmount   = x.Yacht.PriceHighSeason, //* x.Quantity,
                        TotalAmount  = x.Yacht.PriceHighSeason  // * x.Quantity
                    }).ToArray()
                };
                var transactionResult = await _braintreeGateway.Transaction.SaleAsync(transaction);

                if (transactionResult.IsSuccess())
                {
                    _oContext.Orders.Add(order);
                    _oContext.CartItems.RemoveRange(model.Cart.CartItems);
                    _oContext.Carts.Remove(model.Cart);
                    await _oContext.SaveChangesAsync();

                    Response.Cookies.Delete("cartId");
                    return(RedirectToAction("Receipt", new { id = order.ID }));
                }
            }

            return(View(model));
        }