public async Task <int> DeleteAsync(Domain.Models.Operation operation) { _unit.OperationRepository.Delete(operation); await UpdateStockOnDelete(operation); return(await _unit.CommitChangesAsync()); }
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!"); } }
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!"); } }
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()); }
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 })); }
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()); }
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!"); } }
private void AddUserToOperation(Domain.Models.Operation operation) { operation.UserId = _unit.UserId ?? 0; }
public async Task <IActionResult> Put([FromBody] Domain.Models.Operation operation) { await _operationService.UpdateAsync(operation); return(Ok()); }