//переелать public async Task CancelOrder(Account account, Order order) { using (CarPartDbContext context = _contextFactory.CreateDbContext()) { if (order == null) { throw new Exception("Вы не выбрали заказ"); } if (order.Status == OrderStatus.FINISHED || order.Status == OrderStatus.DELIVERED) { throw new Exception("Вы не можете отменить отправленный либо законченный заказ"); } Order selectedOrder = await Get(order.Id); double price = 0; order.Status = OrderStatus.CANCELLED; foreach (var p in selectedOrder.Parts) { price += p.AmountPart * p.Price; PartProvider pp = await context.PartProviders.FirstOrDefaultAsync(x => x.PartId == p.PartId && x.ProviderId == p.ProviderId); pp.TotalParts += p.AmountPart; } account.Balance += price; context.Accounts.Update(account); context.Orders.Update(order); await context.SaveChangesAsync(); await _emailService.SendOrderEmail(order, "Магазин автозапчастей: изменение статуса заказа", $"Ваш заказ с номером {order.Id} был отменён. Деньги вернутся в ближайшее время."); } }
//НЕ СМОТРЕТЬ НА ЭТОТ УЖАС, может добавить полное изменение запчасти public async Task <bool> SaveProviderAndCar(Part part, int amountParts, double price) { using (CarPartDbContext context = _contextFactory.CreateDbContext()) { _addPartProviderFlag = false; PartProvider possibblePartProvider = part.PartProviders.Last(); CarPart possibleCarPart = part.CarParts.Last(); if (context.PartProviders.Where(a => a.PartId == possibblePartProvider.PartId && a.ProviderId == possibblePartProvider.ProviderId).Count() == 0) { _addPartProviderFlag = true; await context.PartProviders.AddAsync(possibblePartProvider); await context.SaveChangesAsync(); } else { PartProvider pp = await context.PartProviders.FirstOrDefaultAsync(x => x.PartId == possibblePartProvider.PartId && x.ProviderId == possibblePartProvider.ProviderId); pp.PartCost = price; pp.TotalParts += amountParts; context.PartProviders.Update(pp); await context.SaveChangesAsync(); foreach (var p in context.Accounts.Include(a => a.Carts)) { foreach (var l in p.Carts) { if (l.PartId == pp.PartId) { await _emailService.SendPartEmail(p, "Поступление на склад", $"Сообщаем Вам о том, что запчаcть из вашей корзины(id: {pp.PartId}) поступила в продажу"); } } } } if (context.CarParts.Where(a => a.PartId == possibleCarPart.PartId && a.CarId == possibleCarPart.CarId).Count() == 0) { await context.CarParts.AddAsync(possibleCarPart); await context.SaveChangesAsync(); } if (_addPartProviderFlag == false) { return(false); } return(true); } }
public async Task <double> CreateOrder(Account account, List <PartFullInfo> partInCar, Address address) { using (CarPartDbContext context = _contextFactory.CreateDbContext()) { if (partInCar.Count() == 0) { throw new Exception("Вы не выбрали деталей для заказа"); } var results = new List <ValidationResult>(); var addrContext = new ValidationContext(address); StringBuilder errorResult = new StringBuilder(); if (!Validator.TryValidateObject(address, addrContext, results, true)) { foreach (var error in results) { errorResult.Append(error.ErrorMessage + '\n'); } throw new Exception(errorResult.ToString()); } StringBuilder idParts = new StringBuilder(); double price = 0; Order order = new Order() { Address = address, OrderCreationTime = DateTime.Now, Status = OrderStatus.CREATED }; List <OrderParts> orderParts = new List <OrderParts>(); foreach (var p in partInCar) { PartProvider pp = context.PartProviders.FirstOrDefault(x => x.PartId == p.PartId && x.ProviderId == p.ProviderId);//acc check if (pp.TotalParts < p.ProviderPartAmount) { idParts.Append(pp.PartId.ToString() + ' '); } } if (idParts.Length != 0) { throw new Exception($"Данного числа запчастей нет на складе.\nId: {idParts}\nО поступлении мы вам cообщим по e-mail"); } foreach (var p in partInCar) { orderParts.Add(new OrderParts() { AmountPart = p.ProviderPartAmount, OrderId = order.Id, PartId = p.PartId, Price = p.ProviderPartPrice, ProviderId = p.ProviderId }); price += p.ProviderPartPrice * p.ProviderPartAmount; PartProvider pp = context.PartProviders.FirstOrDefault(x => x.PartId == p.PartId && x.ProviderId == p.ProviderId);//acc check if (pp != null && (pp.TotalParts > p.ProviderPartAmount)) { pp.TotalParts -= p.ProviderPartAmount; context.PartProviders.Update(pp); } } if (price > account.Balance) { throw new Exception("Недостаточно денег для заказа"); } order.Parts = orderParts; account.Balance -= price; order.Status = OrderStatus.PAYED; account.Orders.Add(order); context.Accounts.Update(account); await context.SaveChangesAsync(); await _emailService.SendOrderEmail(order, "Магазин автозапчастей: оплата заказа", $"Ваш заказ с номером {order.Id} был оплачен. Cтоимость: {price}. Ожидайте смены статуса заказа на DELIVERED."); return(price); } }