public void AtualizarCompra(Compra compra)
 {
     compra.Validar();
     compra.ItensCompra.ForEach(x => x.Validar());
     AssertionConcern.AssertArgumentNotEquals(0, compra.CompraCodigo,
         string.Format(Erros.NotZeroParameter, "CompraCodigo"));
     var compraAtual = _compraRepository.ObterPorCodigoComItensCompra(compra.CompraCodigo);
     if (compra.StatusCompra == StatusCompraEnum.Aberto)
     {
         AplicaValidacoesPadrao(compra);
         AdicionaFornecedorFormaECondicaoDePagamento(compra, compraAtual);
         AtualizaItensCompra(compraAtual, compra.ItensCompra);
         compraAtual.StatusCompra = StatusCompraEnum.Confirmado;
         AdicionaContaPagarNaCompra(compraAtual);
         compraAtual.ContasPagar.ForEach(x => x.Validar());
         AdicionarNoEstoque(compra.ItensCompra, compra);
     }
     else
     {
         compraAtual.StatusCompra = StatusCompraEnum.Cancelado;
         RemoveContaPagarDaCompra(compraAtual);
         AtualizarDoEstoque(compraAtual.ItensCompra);
     }
     _compraRepository.Atualizar(compraAtual);
 }
 public void Deletar(Compra compra)
 {
     _context.Compras.Remove(compra);
     _context.SaveChanges();
 }
 public void Criar(Compra compra)
 {
     _context.Compras.Add(compra);
     _context.SaveChanges();
 }
 public void Atualizar(Compra compra)
 {
     _context.Entry(compra).State = System.Data.Entity.EntityState.Modified;
     _context.SaveChanges();
 }
 public void CriarCompra(Compra compra)
 {
     compra.Validar();
     compra.ItensCompra.ForEach(x => x.Validar());
     AssertionConcern.AssertArgumentEquals(compra.StatusCompra, StatusCompraEnum.Aberto, Erros.StatusOfDifferentPurchasingOpen);
     AplicaValidacoesPadrao(compra);
     var usuario = _usuarioRepository.ObterPorCodigo(compra.Usuario.UsuarioCodigo);
     compra.Usuario = usuario;
     compra.Fornecedor = null;
     compra.FormaPagamento = null;
     compra.CondicaoPagamento = null;
     _compraRepository.Criar(compra);
 }
 private void RemoveContaPagarDaCompra(Compra compra)
 {
     var contasReceber = _contaPagarRepository.ObterListaPorCodigoCompra(compra.CompraCodigo);
     contasReceber.ForEach(x =>
     {
         _contaPagarRepository.Deletar(x);
     });
 }
 private void AtualizaItensCompra(Compra compraAtual, IEnumerable<ItemCompra> itensCompra)
 {
     var itensCompraAtual = compraAtual.ItensCompra.ToList();
     itensCompraAtual.ForEach(x =>
     {
         _itemCompraRepository.Deletar(x);
     });
     compraAtual.ItensCompra.Clear();
     itensCompra.ForEach(x =>
     {
         x.Compra = compraAtual;
         var novoItem = _itemCompraRepository.Criar(x);
         compraAtual.ItensCompra.Add(novoItem);
     });
 }
 private void AdicionarNoEstoque(IEnumerable<ItemCompra> itensCompra, Compra compra)
 {
     itensCompra.ForEach(x =>
     {
         var estoqueAtual = _estoqueRepository.ObterPorCodigoProduto(x.ProdutoCodigo);
         if (estoqueAtual != null)
         {
             estoqueAtual.Compra = _compraRepository.ObterPorCodigo(compra.CompraCodigo);
             estoqueAtual.DataUltimaEntrada = DateTime.Now;
             estoqueAtual.Quantidade += x.Quantidade;
             _estoqueRepository.Atualizar(estoqueAtual);
         }
         else
         {
             _estoqueRepository.Criar(new Estoque
             {
                 DataUltimaEntrada = DateTime.Now,
                 Compra = _compraRepository.ObterPorCodigo(compra.CompraCodigo),
                 Produto = _produtoRepository.ObterPorCodigo(x.ProdutoCodigo),
                 Quantidade = x.Quantidade
             });
         }
     });
 }
 private void AdicionaFornecedorFormaECondicaoDePagamento(Compra compra, Compra compraAtual)
 {
     AssertionConcern.AssertArgumentNotEquals(0, compra.Fornecedor.PessoaCodigo, Erros.ProviderNotSet);
     AssertionConcern.AssertArgumentNotEquals(0, compra.FormaPagamento.FormaPagamentoCodigo,
         Erros.NotSetPayment);
     AssertionConcern.AssertArgumentNotEquals(0, compra.CondicaoPagamento.CondicaoPagamentoCodigo,
         Erros.PaymentConditionNotSet);
     var fornecedor = _pessoaRepository.ObterPorCodigo(compra.Fornecedor.PessoaCodigo);
     var formaPagamento = _formaPagamentoRepository.ObterPorCodigo(compra.FormaPagamento.FormaPagamentoCodigo);
     var condicaoPagamento =
         _condicaoPagamentoRepository.ObterPorCodigo(compra.CondicaoPagamento.CondicaoPagamentoCodigo);
     compraAtual.Fornecedor = fornecedor;
     compraAtual.FormaPagamento = formaPagamento;
     compraAtual.CondicaoPagamento = condicaoPagamento;
 }
 private static void AplicaValidacoesPadrao(Compra compra)
 {
     AssertionConcern.AssertArgumentEquals(compra.ItensCompra.Sum(x => x.ValorBruto), compra.ValorTotalBruto,
             Erros.SumDoNotMatchTotalCrudeValue);
     var valorTotalLiquidoSemFrete = compra.ItensCompra.Sum(x => x.ValorLiquido);
     var valorTotalLiquidoComFrete = valorTotalLiquidoSemFrete + compra.ValorTotalFrete;
     AssertionConcern.AssertArgumentEquals(valorTotalLiquidoComFrete, compra.ValorTotalLiquido,
         Erros.SumDoNotMatchTotalValueLiquid);
 }
 private static void AdicionaContaPagarNaCompra(Compra compra)
 {
     compra.ContasPagar = new List<ContaPagar>();
     for (var i = 0; i < compra.CondicaoPagamento.QuantidadeParcelas; i++)
     {
         compra.ContasPagar.Add(new ContaPagar
         {
             DataVencimento = DateTime.Now.AddDays(1).AddMonths(i),
             Pago = false,
             StatusContaPagar = StatusContaPagarEnum.Aberto,
             ValorDocumento = compra.ValorTotalLiquido / compra.CondicaoPagamento.QuantidadeParcelas,
             Compra = compra
         });
     }
 }