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); } }
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)); } }
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); } }