private async Task ValidarRequisitosOrdemCompra(string clienteId, Produto produto, int quantidadeCompra) { var cliente = await _clienteRepositorio.ConsultarPorId(clienteId).ConfigureAwait(false); var valorOperacao = Math.Round(produto.PrecoUnitario * quantidadeCompra, 2); if (quantidadeCompra <= 0) { throw new InvalidOperationException("Quantidade solicitada não suficiente para compra."); } if (produto.Estoque <= 0) { throw new InvalidOperationException("Quantidade em estoque não suficiente para compra."); } if (valorOperacao > cliente.Saldo) { throw new InvalidOperationException("Cliente não possui saldo suficiente para compra."); } if (CalcularValorTotalDaCompra(produto.PrecoUnitario, quantidadeCompra) < produto.ValorMinimoDeCompra) { throw new InvalidOperationException("Quantidade mínima não atendida para compra."); } if (quantidadeCompra > produto.Estoque) { throw new InvalidOperationException("Quantidade em estoque não suficiente para compra."); } }
public async Task <ResultadoBase <bool> > SolicitarRegistroOrdemCompra(OrdemCompraDTO ordemCompraDTO) { var novaOrdemCompra = ordemCompraDTO.Mapear(); if (!novaOrdemCompra.Valida()) { return new ResultadoBase <bool>() { CodigoErro = MensagemErro.OMS_010, Resultado = false, TipoErro = TipoErro.Validacao } } ; var cliente = await _clienteRepositorio.ConsultarPorId(novaOrdemCompra.IdCliente); if (cliente == null) { return new ResultadoBase <bool>() { CodigoErro = MensagemErro.OMS_001, Resultado = false, TipoErro = TipoErro.Validacao } } ; var produto = await _produtoRepositorio.ConsultarPorId(novaOrdemCompra.IdProduto); if (produto == null) { return new ResultadoBase <bool>() { CodigoErro = MensagemErro.OMS_002, Resultado = false, TipoErro = TipoErro.Validacao } } ; var contaCorrente = await _contaCorrenteRepositorio.ObterPorId(novaOrdemCompra.IdCliente); if (contaCorrente == null) { return new ResultadoBase <bool>() { CodigoErro = MensagemErro.OMS_003, Resultado = false, TipoErro = TipoErro.Validacao } } ; var resultado = await _ordemCompraDominoServico.PermiteRegistroDeOrdemCompra(cliente, produto, contaCorrente, novaOrdemCompra); if (resultado.Resultado) { //faz a solictacao de registro await _mensageriaRepoSitorio.EnviarMensagem <OrdemCompra>(TopicosMensageria.SolicitacaoRegistroOrdem, novaOrdemCompra); } return(resultado); } } }
public async Task <IActionResult> GetById([FromRoute] int idCliente) { var clientes = await _clienteRepositorio.ConsultarPorId(idCliente).ConfigureAwait(false); if (clientes == null) { return(NoContent()); } return(Ok(clientes)); }
public async Task <string> RegistrarOrdemCompra(string clienteId, int produtoId, int quantidadeCompra) { var cliente = await _clienteRepositorio.ConsultarPorId(clienteId).ConfigureAwait(false); var produto = await _produtoRepositorio.ConsultarPorId(produtoId).ConfigureAwait(false); if (quantidadeCompra <= 0) { throw new InvalidOperationException("Quantidade solicitada não suficiente para compra."); } if (produto.Estoque <= 0) { throw new InvalidOperationException("Quantidade em estoque não suficiente para compra."); } var valorOperacao = Math.Round(decimal.Parse(produto.PrecoUnitario) * quantidadeCompra, 2); if (valorOperacao > cliente.Saldo) { throw new InvalidOperationException("Cliente não possui saldo suficiente para compra."); } if (Math.Round(quantidadeCompra * decimal.Parse(produto.PrecoUnitario), 2) < produto.ValorMinimoDeCompra) { throw new InvalidOperationException("Quantidade mínima não atendida para compra."); } if (valorOperacao > produto.Estoque) { throw new InvalidOperationException("Quantidade em estoque não suficiente para compra."); } var novaOrdemDeCompra = new OrdemCompra { ClienteId = cliente.Id, ProdutoId = produto.Id, DataOperacao = DateTime.Now, PrecoUnitario = decimal.Parse(produto.PrecoUnitario), ValorOperacao = valorOperacao, QuantidadeSolicitada = quantidadeCompra }; return(await _ordemCompraRepositorio.RegistrarOrdemCompra(novaOrdemDeCompra).ConfigureAwait(false)); }
public async Task <ActionResult <Cliente> > GetById([FromRoute] string idCliente) { try { var cliente = await _clienteRepositorio.ConsultarPorId(idCliente).ConfigureAwait(false); if (cliente == null) { return(NotFound()); } return(Ok(cliente)); } catch (Exception ex) { _logger.Log($"Erro ao obter cliente. {ex}", EventLevel.Error); throw; //deixar subir o erro para retornar 500 } }
public async Task <Result> RegistrarOrdemCompra(int clienteId, int produtoId, int quantidadeCompra) { var cliente = await _clienteRepositorio.ConsultarPorId(clienteId).ConfigureAwait(false); var produto = await _produtoRepositorio.ConsultarPorId(produtoId).ConfigureAwait(false); var novaOrdemDeCompra = OrdemCompra.CriarSolicitacaoOrdemDeCompra( produto, cliente, quantidadeCompra); if (!novaOrdemDeCompra.EhValido) { return(Result <string> .Fail(novaOrdemDeCompra .Notifications .Select(s => s.Message))); } var id = await _ordemCompraRepositorio.RegistrarOrdemCompra(novaOrdemDeCompra).ConfigureAwait(false); return(Result <Guid> .Ok(id)); }
public async Task <Cliente> ConsultarPorId(string id) { return(await _clienteRepositorio.ConsultarPorId(id)); }
public async Task <ClienteViewModel> ConsultarPorId(Guid id) { return(_mapper.Map <ClienteViewModel>(await _clienteRepositorio.ConsultarPorId(id).ConfigureAwait(false))); }
public async Task <Cliente> ConsultarPorId(int idCliente) { return(await _clienteRepositorio.ConsultarPorId(idCliente).ConfigureAwait(false)); }