Exemple #1
0
        public async Task <bool> PaymentOnDelivery(OrderItemsVm itemsVm, string username)
        {
            var orderVms  = itemsVm.orderedProducts;
            var addressVm = itemsVm.address;

            if (orderVms.Count == 0 || orderVms == null)
            {
                throw new Exception("The order is null or empty");
            }

            var bucketEntity = await _dbContext.Orders
                               .Include(o => o.Items)
                               .ThenInclude(c => c.Coffee)
                               .Where(o => o.ClientId == username)
                               .FirstOrDefaultAsync(o => o.IsPaymentCompleted == false);

            if (bucketEntity == null || bucketEntity.Items.Count == 0)
            {
                throw new Exception("Bucket is empty");
            }

            long dbPriceSum = 0;

            foreach (OrderVm order in orderVms)
            {
                var item = bucketEntity.Items.FirstOrDefault(i => i.Id == order.id);
                dbPriceSum += (long)(item.Price * 100);

                if (item.Id != order.id)
                {
                    throw new Exception("The order's id is invalid");
                }

                item.PaymentStatus = (PaymentStatus)2;
                _dbContext.OrderItems.Update(item);
            }
            await _dbContext.SaveChangesAsync();

            var amount = (long)(orderVms.Sum(o => o.price) * 100);

            if (amount != dbPriceSum)
            {
                return(false);
            }

            bucketEntity.City          = addressVm.place;
            bucketEntity.Street        = addressVm.road;
            bucketEntity.HouseNumber   = addressVm.houseNumber;
            bucketEntity.PostalCode    = addressVm.zipcode;
            bucketEntity.Latitude      = addressVm.latLng.latitude;
            bucketEntity.Longitude     = addressVm.latLng.longitude;
            bucketEntity.PaymentMethod = "On Delivery";
            bucketEntity.PaymentCard   = "";
            _dbContext.Update(bucketEntity);
            await _dbContext.SaveChangesAsync();

            return(true);
        }
Exemple #2
0
        public async Task <ActionResult> OnDelivery(OrderItemsVm itemsVm)
        {
            var identity = HttpContext.User.Identity as ClaimsIdentity;
            var username = _userService.GetUserName(identity);

            try
            {
                if (await _paymentService.PaymentOnDelivery(itemsVm, username))
                {
                    await _paymentService.Success(username);

                    return(Ok(new { status = 200, message = "Order complete" }));
                }
                await _paymentService.Cancel(username);

                return(StatusCode(406, new { status = 406, message = "Something went wrong." }));
            }
            catch (Exception e)
            {
                await _paymentService.Cancel(username);

                return(StatusCode(406, new { status = 406, message = e.Message }));
            }
        }
Exemple #3
0
        public async Task <bool> Payment(OrderItemsVm itemsVm, string username)
        {
            var orderVms  = itemsVm.orderedProducts;
            var addressVm = itemsVm.address;
            var token     = itemsVm.token;

            StripeConfiguration.ApiKey = System.Environment.GetEnvironmentVariable("STRIPE_SKKEY");

            if (orderVms.Count == 0 || orderVms == null)
            {
                throw new Exception("The order is null or empty.");
            }

            var bucketEntity = await _dbContext.Orders
                               .Include(o => o.Items)
                               .ThenInclude(c => c.Coffee)
                               .Where(o => o.ClientId == username)
                               .FirstOrDefaultAsync(o => o.IsPaymentCompleted == false);

            if (bucketEntity == null || bucketEntity.Items.Count == 0)
            {
                throw new Exception("Bucket is empty");
            }

            long dbPriceSum = 0;

            foreach (OrderVm order in orderVms)
            {
                var item = bucketEntity.Items.FirstOrDefault(i => i.Id == order.id);
                dbPriceSum += (long)(item.Price * 100);

                if (item.Id != order.id)
                {
                    throw new Exception("The order's id is invalid");
                }

                item.PaymentStatus = (PaymentStatus)2;
                _dbContext.OrderItems.Update(item);
            }
            await _dbContext.SaveChangesAsync();

            var amount = (long)(orderVms.Sum(o => o.price) * 100);

            if (amount != dbPriceSum)
            {
                return(false);
            }

            bucketEntity.City        = addressVm.place;
            bucketEntity.Street      = addressVm.road;
            bucketEntity.HouseNumber = addressVm.houseNumber;
            bucketEntity.PostalCode  = addressVm.zipcode;
            bucketEntity.Latitude    = addressVm.latLng.latitude;
            bucketEntity.Longitude   = addressVm.latLng.longitude;
            _dbContext.Update(bucketEntity);
            await _dbContext.SaveChangesAsync();

            var options = new ChargeCreateOptions
            {
                Amount      = amount,
                Currency    = "pln",
                Description = "Płatność",
                Source      = token
            };
            var    service = new ChargeService();
            Charge charge  = service.Create(options);

            bucketEntity.PaymentMethod = charge.PaymentMethodDetails.Card.Brand;
            bucketEntity.PaymentCard   = "**** **** **** " + charge.PaymentMethodDetails.Card.Last4;
            await _dbContext.SaveChangesAsync();

            return(true);
        }