Ejemplo n.º 1
0
        public async Task <PurchaseDTO> CompleteAsync(PurchasePutRequest model, ApiDbContext apiDbContext, IConfiguration configuration)
        {
            try
            {
                Purchase purchase = await apiDbContext.Purchases.FindAsync(model.Id);

                if (purchase == null)
                {
                    throw new Exception($"No existe la compra con id {model.Id}");
                }

                if (purchase.PaymentStatus.Code.ToUpper().Trim().Equals(configuration["PaymentStatusFinishedCode"].ToString().ToUpper().Trim()))
                {
                    throw new Exception($"La compra no se puede modificar. Ya está completada.");
                }

                // TODO - Aquí habría que implmentar la lógica de pago con TPV si la tienda permite el pago ONLINE

                purchase.Purchase_Carts.ForEach(pc =>
                {
                    pc.UserProductCart.IsCompleted = true;
                });

                await apiDbContext.SaveChangesAsync();

                // TODO - await SendMail(purchase.Purchase_Carts.Select(s => s.UserProductCart).ToList());

                return(ModelToDTO(purchase));
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> Complete(PurchasePutRequest model)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    throw new Exception("Petición de actualización inválida");
                }

                return(Ok(await _purchaseService.CompleteAsync(model, _apiDbContext, _configuration)));
            }
            catch (Exception e)
            {
                return(StatusCode(500, e.Message));
            }
        }
Ejemplo n.º 3
0
        public async Task <PurchaseDTO> UpdateAsync(PurchasePutRequest model, ApiDbContext apiDbContext, IConfiguration configuration)
        {
            try
            {
                Purchase purchase = await apiDbContext.Purchases.FindAsync(model.Id);

                if (purchase == null)
                {
                    throw new Exception($"No existe la compra con id {model.Id}");
                }

                if (purchase.PaymentStatus.Code.ToUpper().Trim().Equals(configuration["PaymentStatusFinishedCode"].ToString().ToUpper().Trim()))
                {
                    throw new Exception($"La compra no se puede modificar. Ya está completada.");
                }

                purchase.Purchase_Carts.RemoveAll(pc => !model.ProductCartIdList.Contains(pc.UserProductCartId));
                model.ProductCartIdList.Where(mp => !purchase.Purchase_Carts.Select(s => s.PurchaseId).ToList().Contains(mp)).ToList().ForEach(pId =>
                {
                    purchase.Purchase_Carts.Add(new Purchase_Cart
                    {
                        PurchaseId        = model.Id,
                        UserProductCartId = pId
                    });
                });

                decimal amount = 0;

                // Todos los productos deben pertenecer a la misma tienda - Se crea un purchase por tienda en el carro
                model.ProductCartIdList.ForEach(id =>
                {
                    decimal am = apiDbContext.Users_Products_Cart.Where(pc => pc.Id == id).First().Product.Pvp;
                    amount    += am;
                });

                purchase.Amount = amount;

                if (purchase.PaymentStatusId != model.PaymentStatusId)
                {
                    purchase.StatusDate = DateTime.Now;
                }

                if (purchase.PurchaseTypeId != model.PurchaseTypeId)
                {
                    if (purchase.PurchaseType.Code.ToUpper().Trim().Equals(configuration["OnlinePurchasTypeCode"].ToString().ToUpper().Trim()))
                    {
                        Delivery delivery = apiDbContext.Deliveries.FirstOrDefault(d => d.PurchaseId == purchase.Id);
                        if (delivery != null)
                        {
                            apiDbContext.Deliveries.Remove(delivery);
                        }
                    }
                }

                purchase.PaymentMethodId = model.PaymentMethodId;
                purchase.PurchaseTypeId  = model.PurchaseTypeId;
                purchase.PaymentStatusId = model.PaymentStatusId;

                await apiDbContext.SaveChangesAsync();

                if (purchase.PurchaseType.Code.ToUpper().Trim().Equals(configuration["OnlinePurchasTypeCode"].ToString().ToUpper().Trim()) && model.DeliveryData != null)
                {
                    Shop shop = apiDbContext.Users_Products_Cart.Where(pc => model.ProductCartIdList.Contains(pc.Id)).ToList().First().Product.Shop;

                    Delivery newDelivery = new Delivery
                    {
                        PurchaseId    = purchase.PurchaseTypeId,
                        DeliveryDate  = DateTime.Now.AddDays(5),
                        DeliveryTaxes = amount < shop.MinAmountTaxes ? shop.Taxes : 0,
                        Address       = model.DeliveryData.Address,
                        Number        = model.DeliveryData.Number,
                        City          = model.DeliveryData.City,
                        PostCode      = model.DeliveryData.PostCode,
                        Region        = model.DeliveryData.Region,
                        IsCompleted   = false,
                        CreationDate  = DateTime.Now
                    };

                    apiDbContext.Deliveries.Add(newDelivery);

                    await apiDbContext.SaveChangesAsync();
                }

                return(ModelToDTO(purchase));
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }