Пример #1
0
        public async Task <IActionResult> PostReturn(NSTransactionDto newTransaction)
        {
            var userId       = HttpContext.GetUserId();
            var isSuccessful = await _repo.AddTransaction(newTransaction, userId);

            if (isSuccessful)
            {
                return(RedirectToAction("Success", "Home"));
            }

            return(RedirectToAction("Error", "Home"));
        }
Пример #2
0
        public async Task <bool> AddTransaction(NSTransactionDto newTransaction, int userId)
        {
            if (newTransaction.ClientId == 0 && string.IsNullOrEmpty(newTransaction.ClientName))
            {
                return(false);
            }
            var addedUserId = 0;

            newTransaction.ClientName = newTransaction.ClientName?.Trim();
            if (newTransaction.ClientId == 0) // Create new user
            {
                var newUser = new User
                {
                    Name     = newTransaction.ClientName,
                    District = newTransaction.ClientDistrict,
                    Contact  = newTransaction.ClientPhone,
                    Password = "******",
                    Role     = Role.User
                };
                addedUserId = await _usersRepository.AddUser(newUser);
            }

            var isClient = await _context.UserClients
                           .AsNoTracking()
                           .AnyAsync(c => c.UserId == userId && c.ClientId == newTransaction.ClientId);

            if (!isClient)
            {
                UserClient newClient;
                if (newTransaction.ClientId == 0) // If we are adding user by name
                {
                    newClient = new UserClient
                    {
                        UserId     = userId,
                        ClientId   = addedUserId,
                        Debt       = 0,
                        ClientName = newTransaction.ClientName
                    };
                }
                else
                {
                    newClient = new UserClient
                    {
                        UserId     = userId,
                        ClientId   = newTransaction.ClientId,
                        ClientName = "EXISTING_USER",
                        Debt       = 0
                    };
                }
                await _context.UserClients.AddAsync(newClient);

                await _context.SaveChangesAsync();
            }

            var transaction = new Transaction
            {
                Description = newTransaction.Description,
                Date        = DateTime.Now,
                FromId      = userId,
                ToId        = newTransaction.ClientId == 0 ? addedUserId : newTransaction.ClientId,
                TotalAmount = newTransaction.Content.Sum(dto => dto.SalePrice * dto.Count),
                Content     = newTransaction.Content
                              .Where(dto => dto != null)
                              .Select(dto => new Transaction_Product
                {
                    ProductId = dto.ProductId,
                    Count     = dto.Count,
                    SalePrice = dto.SalePrice
                }).ToList()
            };

            var clientUser = await _context.Users
                             .Include(u => u.Products)
                             .FirstOrDefaultAsync(u => u.Id == newTransaction.ClientId) ??
                             await _context.Users
                             .Include(u => u.Products)
                             .FirstOrDefaultAsync(u => u.Id == addedUserId);

            var client = await _context.UserClients // Find client by Id
                         .FirstOrDefaultAsync(c => c.ClientId == newTransaction.ClientId &&
                                              c.UserId == userId) ??
                         await _context.UserClients // Find client by name
                         .FirstOrDefaultAsync(c => c.ClientName == newTransaction.ClientName &&
                                              c.UserId == userId);

            if (client == null)
            {
                Console.WriteLine("CLIENT WAS NULL");
                return(false);
            }

            if (newTransaction.Type == "return")
            {
                client.Debt     -= transaction.TotalAmount;
                transaction.Type = TransactionType.Return;
            }
            else
            {
                client.Debt     += transaction.TotalAmount;
                transaction.Type = TransactionType.Sale;
            }
            client.LastSaleDate = DateTime.Now;
            foreach (var p in transaction.Content)
            {
                var existingProduct = await _context.Products
                                      .FirstOrDefaultAsync(pr => pr.Id == p.ProductId);

                if (existingProduct == null)
                {
                    continue;
                }

                existingProduct.StockCount -= p.Count;
                // If client already owns this product
                var owns = clientUser.Products.Any(pr => pr.Name == existingProduct.Name);
                if (owns)
                {
                    var product = await _context.Products
                                  .Include(pr => pr.ProductionPrices)
                                  .FirstOrDefaultAsync(pr => pr.Name == existingProduct.Name && pr.OwnerId == clientUser.Id);

                    if (product == null)
                    {
                        Console.WriteLine("EXISTING_PRODUCT_NULL");
                        continue;
                    }

                    product.StockCount += p.Count;
                    product.ProductionPrices.Add(new Price
                    {
                        AdditionDate = DateTime.Now,
                        Value        = p.SalePrice
                    });
                }
                else
                {
                    // Add product for client
                    var newProduct = new Product
                    {
                        Name             = existingProduct.Name,
                        Packaging        = existingProduct.Packaging,
                        ExpirationDate   = existingProduct.ExpirationDate,
                        ProductionDate   = existingProduct.ProductionDate,
                        ProductionPrices = new List <Price>
                        {
                            new Price {
                                Value = p.SalePrice, AdditionDate = DateTime.Now
                            }
                        },
                        SalePrice  = p.SalePrice,
                        OwnerId    = newTransaction.ClientId == 0 ? addedUserId : newTransaction.ClientId,
                        StockCount = p.Count
                    };
                    await _context.Products.AddAsync(newProduct);

                    await _context.SaveChangesAsync();
                }
            }

            await _context.Transactions.AddAsync(transaction);

            var dbRes = await _context.SaveChangesAsync();

            return(dbRes > 0);
        }