コード例 #1
0
        public async Task <int> DeleteAsync(Domain.Models.Operation operation)
        {
            _unit.OperationRepository.Delete(operation);
            await UpdateStockOnDelete(operation);

            return(await _unit.CommitChangesAsync());
        }
コード例 #2
0
        private async Task UpdateStockOnUpdate(Domain.Models.Operation operation)
        {
            var currentStock = await _unit.StockRepository.FindAvailableByProductAndProvider(operation.ProductId, operation.ProviderId);

            if (currentStock != null)
            {
                var lastOperation = await _unit.OperationRepository.FindByProductAndProvider(operation.Id, operation.ProductId, operation.ProviderId);

                if (lastOperation != null)
                {
                    if (operation.Amount <= currentStock.Amount + lastOperation.Amount)
                    {
                        var amount = lastOperation.Amount - operation.Amount;
                        currentStock.Amount += amount;
                        _unit.StockRepository.Update(currentStock.Id, currentStock);
                    }
                    else
                    {
                        throw new Exception("Saldo insuficiente para o produto e fornecedor selecionados!");
                    }
                }
                else
                {
                    throw new ArgumentException("Não é possível alterar produto/fornecedor ao editar operação!");
                }
            }
            else
            {
                throw new Exception("Estoque inexistente para o produto e fornecedor selecionados!");
            }
        }
コード例 #3
0
        private async Task ValidadeOperation(Domain.Models.Operation operation)
        {
            if (operation.Amount <= 0)
            {
                throw new ArgumentException("A quantidade selecionada deve ser maior que zero!");
            }

            if (operation.ProductId <= 0)
            {
                throw new ArgumentException("Um produto deve ser selecionado!");
            }

            if (operation.ProviderId <= 0)
            {
                throw new ArgumentException("Um fornecedor deve ser selecionado!");
            }

            if (operation.UnitPrice <= 0)
            {
                throw new ArgumentException("O preço deve ser maior que zero!");
            }

            var available = await _unit.StockRepository.HasAvailable(operation.ProductId, operation.ProviderId);

            if (!available)
            {
                throw new ArgumentException("Estoque indisponível para o produto e fornecedor selecionados!");
            }
        }
コード例 #4
0
        public async Task <int> UpdateAsync(Domain.Models.Operation operation)
        {
            await ValidadeOperation(operation);
            await UpdateStockOnUpdate(operation);

            _unit.OperationRepository.Update(operation.Id, operation);
            return(await _unit.CommitChangesAsync());
        }
コード例 #5
0
        public async Task <IActionResult> Post([FromBody] Domain.Models.Operation operation)
        {
            await _operationService.AddAsync(operation);

            return(Created($"/api/operation/{operation.Id}", new Domain.Models.Operation {
                Id = operation.Id
            }));
        }
コード例 #6
0
        public async Task <int> AddAsync(Domain.Models.Operation operation)
        {
            await ValidadeOperation(operation);

            AddUserToOperation(operation);
            _unit.OperationRepository.Add(operation);
            await UpdateStockOnInsert(operation);

            return(await _unit.CommitChangesAsync());
        }
コード例 #7
0
        private async Task UpdateStockOnDelete(Domain.Models.Operation operation)
        {
            var currentStock = await _unit.StockRepository.FindAvailableByProductAndProvider(operation.ProductId, operation.ProviderId);

            if (currentStock != null)
            {
                currentStock.Amount += operation.Amount;
                _unit.StockRepository.Update(currentStock.Id, currentStock);
            }
            else
            {
                throw new Exception("Estoque inexistente para o produto e fornecedor selecionados!");
            }
        }
コード例 #8
0
 private void AddUserToOperation(Domain.Models.Operation operation)
 {
     operation.UserId = _unit.UserId ?? 0;
 }
コード例 #9
0
        public async Task <IActionResult> Put([FromBody] Domain.Models.Operation operation)
        {
            await _operationService.UpdateAsync(operation);

            return(Ok());
        }