//Cancelar //Validar se tem estoque que pode ser cancelado //Se uma parcela ja for dado baixa n pode, precisa cancelar a baixa //Cancelar compra, deve voltar o valor original do produto public void CancelarCompra(CancelarCompra model) { var compraId = new CompraId() { FornecedorId = model.FornecedorId, Modelo = model.Modelo, Numero = model.Numero, Serie = model.Serie }; var result = this.UserDAO.PasswordSignIn(this.UserRequest.UserNome, model.Senha); if (!result.Succeeded) { throw new BusinessException(new { Senha = "Senha inválido" }); } var compra = this.GetByID(compraId); var dataCancelamento = DateTime.Now; foreach (var contaPagar in compra.Parcelas) { if (contaPagar.DataBaixa != null) { throw new BusinessException(new { Numero = "Compra já possuir uma conta a pagar baixada." }); } contaPagar.DataCancelamento = dataCancelamento; contaPagar.UserCancelamento = UserRequest.Id.ToString(); contaPagar.JustificativaCancelamento = model.Justificativa; this.ContaPagarDAO.Update(contaPagar, false); } foreach (var produtoCompra in compra.Produtos) { var produtoDb = this.ProdutoDAO.GetByID(produtoCompra.ProdutoId); //(ValorAtual * (Estoque + QntdCompra)) - (QntdCompra * ValorCompra)) / EstoqueSemCompra var novoCusto = produtoDb.ValorCompra; if (produtoDb.Quantidade - produtoCompra.Quantidade > 0) { novoCusto = (produtoDb.ValorCompra * (produtoDb.Quantidade) - (produtoCompra.Quantidade * produtoCompra.ValorUnitario)) / (produtoDb.Quantidade - produtoCompra.Quantidade); } produtoDb.Quantidade -= produtoCompra.Quantidade; produtoDb.ValorCompra = novoCusto; if (produtoDb.Quantidade < 0) { throw new BusinessException(new { Quantidade = $"Sem Estoque do produto {produtoDb.Nome}" }); } this.ProdutoDAO.Update(produtoDb, false); } compra.DataCancelamento = dataCancelamento; compra.UserCancelamento = UserRequest.Id.ToString(); compra.JustificativaCancelamento = model.Justificativa; this.CompraDAO.Update(compra); }
public virtual IActionResult Cancelar([FromRoute] CompraId id, [FromBody] CancelarCompra model) { this.CompraService.CancelarCompra(model); return(Ok()); }