Пример #1
0
        //переелать
        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} был отменён. Деньги вернутся в ближайшее время.");
            }
        }
Пример #2
0
        //НЕ СМОТРЕТЬ НА ЭТОТ УЖАС, может добавить полное изменение запчасти
        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);
            }
        }
Пример #3
0
        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);
            }
        }