/// <summary> /// Atualiza os dados de um produto da saída /// </summary> /// <param name="saidaProduto"></param> /// <param name="saida"></param> public void Atualizar(SaidaProduto saidaProduto, Saida saida) { if (saidaProduto.Quantidade == 0) { throw new NegocioException("A quantidade do produto não pode ser igual a zero."); } else if (saidaProduto.ValorVendaAVista <= 0) { throw new NegocioException("O preço de venda do produto deve ser maior que zero."); } else if (saida.TipoSaida == Saida.TIPO_VENDA) { throw new NegocioException("Não é possível alterar produtos de uma Venda cujo Comprovante Fiscal já foi emitido."); } else if ((saida.TipoSaida == Saida.TIPO_REMESSA_DEPOSITO) && (saida.Nfe != null) && (!saida.Nfe.Equals(""))) { throw new NegocioException("Não é possível alterar produtos numa transferência para depósito cuja nota fiscal já foi emitida."); } else if ((saida.TipoSaida == Saida.TIPO_DEVOLUCAO_FORNECEDOR) && (saida.Nfe != null) && (!saida.Nfe.Equals(""))) { throw new NegocioException("Não é possível alterar produtos numa devolução para fornecedor cuja nota fiscal já foi emitida."); } var query = from saidaProdutoE in saceContext.SaidaProdutoSet where saidaProdutoE.codSaidaProduto == saidaProduto.CodSaidaProduto select saidaProdutoE; foreach (SaidaProdutoE _saidaProdutoE in query) { Atribuir(saidaProduto, _saidaProdutoE); } saceContext.SaveChanges(); }
/// <summary> /// Insere um novo produto na saída /// </summary> /// <param name="saidaProduto"></param> /// <param name="saida"></param> /// <returns></returns> public Int64 Inserir(SaidaProduto saidaProduto, Saida saida) { if (saidaProduto.Quantidade == 0) { throw new NegocioException("A quantidade do produto não pode ser igual a zero."); } else if (saidaProduto.ValorVendaAVista <= 0) { throw new NegocioException("O preço de venda do produto deve ser maior que zero."); } else if (saida.TipoSaida.Equals(Saida.TIPO_VENDA)) { throw new NegocioException("Não é possível inserir produtos de uma Venda cujo Comprovante Fiscal já foi emitido."); } else if (saida.TipoSaida.Equals(Saida.TIPO_REMESSA_DEPOSITO) && string.IsNullOrEmpty(saida.Nfe)) { throw new NegocioException("Não é possível inserir produtos em uma transferência para depósito cuja nota fiscal já foi emitida."); } else if (saida.TipoSaida.Equals(Saida.TIPO_RETORNO_DEPOSITO) && string.IsNullOrEmpty(saida.Nfe)) { throw new NegocioException("Não é possível inserir produtos em um retorno de depósito cuja nota fiscal já foi emitida."); } else if (saida.TipoSaida.Equals(Saida.TIPO_DEVOLUCAO_FORNECEDOR) && string.IsNullOrEmpty(saida.Nfe)) { throw new NegocioException("Não é possível inserir produtos em uma devolução para fornecedor cuja nota fiscal já foi emitida."); } SaidaProdutoE _saidaProdutoE = new SaidaProdutoE(); Atribuir(saidaProduto, _saidaProdutoE); repSaidaProduto.Inserir(_saidaProdutoE); repSaidaProduto.SaveChanges(); return(_saidaProdutoE.codSaidaProduto); }
/// <summary> /// Estorna dos lotes do estoque uma determinada quantidade /// </summary> /// <param name="produto"></param> /// <param name="dataValidade"></param> /// <param name="quantidadeDevolvida"></param> private void EstornarItensVendidosEstoque(SaidaProduto saidaProduto) { decimal quantidadeDevolvida = Math.Abs(saidaProduto.Quantidade); List <EntradaProduto> entradaProdutos = ObterVendidosOrdenadoPorEntrada(saidaProduto.CodProduto); Decimal quantidadeRetornada = 0; if (entradaProdutos != null) { if (saidaProduto.TemVencimento) { foreach (EntradaProduto entradaProduto in entradaProdutos) { if ((entradaProduto.DataValidade.Date.Equals(saidaProduto.DataValidade.Date)) && (quantidadeRetornada < quantidadeDevolvida)) { if (entradaProduto.Quantidade <= (entradaProduto.QuantidadeDisponivel + (quantidadeDevolvida - quantidadeRetornada))) { entradaProduto.QuantidadeDisponivel += quantidadeDevolvida - quantidadeRetornada; quantidadeRetornada += quantidadeDevolvida - quantidadeRetornada; Atualizar(entradaProduto); } } if (quantidadeDevolvida == quantidadeRetornada) { break; } } } // acontece quando uma data de validade não existe no estoque if (quantidadeRetornada < quantidadeDevolvida) { foreach (EntradaProduto entradaProduto in entradaProdutos) { if (entradaProduto.Quantidade >= (entradaProduto.QuantidadeDisponivel + (quantidadeDevolvida - quantidadeRetornada))) { entradaProduto.QuantidadeDisponivel += quantidadeDevolvida - quantidadeRetornada; quantidadeRetornada += quantidadeDevolvida - quantidadeRetornada; } else { quantidadeRetornada += entradaProduto.Quantidade - entradaProduto.QuantidadeDisponivel; entradaProduto.QuantidadeDisponivel = entradaProduto.Quantidade; } Atualizar(entradaProduto); if (quantidadeDevolvida == quantidadeRetornada) { break; } } } } // acontece quando uma data de validade não existe no estoque if (quantidadeRetornada < quantidadeDevolvida) { BaixarItensVendidosEstoqueEntradaPadrao(saidaProduto, ((-1) * (quantidadeDevolvida - quantidadeRetornada))); } }
/// <summary> /// Baixar uma certa quantidade de produtos da entrada padrão que contém todos os produtos sem entradas associadas /// </summary> /// <param name="produtoPesquisa"></param> /// <param name="quantidade"></param> /// <returns></returns> private decimal BaixarItensVendidosEstoqueEntradaPadrao(SaidaProduto saidaProduto, decimal quantidade) { List <EntradaProduto> entradaProdutos = (List <EntradaProduto>)Obter(Global.ENTRADA_PADRAO, saidaProduto.CodProduto); Produto produto = GerenciadorProduto.GetInstance().Obter(new ProdutoPesquisa() { CodProduto = saidaProduto.CodProduto }); EntradaProduto entradaProduto = null; if (entradaProdutos.Count > 0) { entradaProduto = entradaProdutos[0]; } if (entradaProduto != null) { entradaProduto.QuantidadeDisponivel -= quantidade; Atualizar(entradaProduto); } else { entradaProduto = new EntradaProduto(); entradaProduto.CodEntrada = Global.ENTRADA_PADRAO; entradaProduto.CodProduto = produto.CodProduto; entradaProduto.UnidadeCompra = produto.Unidade; entradaProduto.Quantidade = 10000; entradaProduto.QuantidadeEmbalagem = produto.QuantidadeEmbalagem == 0 ? 1 : produto.QuantidadeEmbalagem; entradaProduto.QuantidadeDisponivel = (entradaProduto.Quantidade * entradaProduto.QuantidadeEmbalagem) - quantidade; entradaProduto.ValorUnitario = produto.UltimoPrecoCompra; //entradaProduto.ValorTotal = 0; entradaProduto.BaseCalculoICMS = 0; entradaProduto.BaseCalculoICMSST = 0; entradaProduto.DataValidade = DateTime.Now; // para não perder os dados do produto entradaProduto.LucroPrecoVendaAtacado = produto.LucroPrecoVendaAtacado; entradaProduto.LucroPrecoVendaVarejo = produto.LucroPrecoVendaVarejo; entradaProduto.PrecoVendaAtacado = produto.PrecoVendaAtacado; entradaProduto.PrecoVendaVarejo = produto.PrecoVendaVarejo; entradaProduto.Frete = produto.Frete; entradaProduto.Icms = 7; entradaProduto.IcmsSubstituto = 20; entradaProduto.Ipi = produto.Ipi; entradaProduto.Ncmsh = produto.Ncmsh; entradaProduto.QtdProdutoAtacado = produto.QtdProdutoAtacado; entradaProduto.DataEntrada = produto.DataUltimoPedido; entradaProduto.Desconto = produto.Desconto; entradaProduto.PrecoCusto = produto.PrecoCusto; entradaProduto.ValorDesconto = 0; entradaProduto.CodCST = produto.CodCST; entradaProduto.Cfop = 9999; Inserir(entradaProduto, Entrada.TIPO_ENTRADA); } return(0); }
/// <summary> /// Salva os dados de um produto inserido na saída /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSalvar_Click(object sender, EventArgs e) { saida = (Saida)saidaBindingSource.Current; if (saida.CodSaida <= 0) { saida.CodSaida = GerenciadorSaida.GetInstance(null).Inserir(saida); codSaidaTextBox.Text = saida.CodSaida.ToString(); } SaidaProduto saidaProduto = new SaidaProduto(); if (produto != null) { saidaProduto.CodProduto = produto.CodProduto; saidaProduto.CodSaida = Convert.ToInt64(codSaidaTextBox.Text); saidaProduto.Desconto = Global.DESCONTO_PADRAO; saidaProduto.Quantidade = Convert.ToDecimal(quantidadeTextBox.Text); saidaProduto.ValorVendaAVista = Convert.ToDecimal(precoVendatextBox.Text); saidaProduto.DataValidade = Convert.ToDateTime(data_validadeDateTimePicker.Text); saidaProduto.BaseCalculoICMS = Convert.ToDecimal(baseCalculoICMSTextBox.Text); saidaProduto.ValorICMS = Convert.ToDecimal(valorICMSTextBox.Text); saidaProduto.BaseCalculoICMSSubst = Convert.ToDecimal(baseCalculoICMSSubstTextBox.Text); saidaProduto.ValorICMSSubst = Convert.ToDecimal(valorICMSSubstTextBox.Text); saidaProduto.ValorIPI = Convert.ToDecimal(valorIPITextBox.Text); saidaProduto.CodCST = produto.CodCST; saidaProduto.CodCfop = cfopPadrao; codProdutoComboBox.Focus(); codProdutoComboBox.Text = ""; InicializarValoresProdutos(); bool saidaProdutoInvalida = (saidaProduto.CodProduto == 1) || (saidaProduto.Quantidade == 0) || (saidaProduto.ValorVendaAVista == 0); if (estado.Equals(EstadoFormulario.INSERIR_DETALHE) && !saidaProdutoInvalida) { GerenciadorSaidaProduto.GetInstance(null).Inserir(saidaProduto, saida); codSaidaTextBox_TextChanged(sender, e); saidaProdutoBindingSource.MoveLast(); if (saida.TipoSaida == Saida.TIPO_ORCAMENTO && GerenciadorProdutoLoja.GetInstance(null).ObterEstoque(saidaProduto.CodProduto) < saidaProduto.Quantidade) { MessageBox.Show("Estoque INSUFICIENTE em caso de VENDA", "ATENÇÃO", MessageBoxButtons.OK); } } } saidaBindingSource.ResumeBinding(); }
/// <summary> /// Permite excluir o pedido /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void excluirProduto(object sender, EventArgs e) { if (MessageBox.Show("Confirma exclusão do produto?", "Confirmar Exclusão", MessageBoxButtons.YesNo) == DialogResult.Yes) { if (tb_saida_produtoDataGridView.Rows.Count > 0) { SaidaProduto saidaProduto = (SaidaProduto)saidaProdutoBindingSource.Current; //saida = GerenciadorSaida.GetInstance().Obter(saida.CodSaida); Negocio.GerenciadorSaidaProduto.GetInstance(null).Remover(saidaProduto, saida); saidaProdutoBindingSource.RemoveCurrent(); } } estado = EstadoFormulario.INSERIR_DETALHE; codSaidaTextBox_TextChanged(sender, e); codProdutoComboBox.Focus(); }
/// <summary> /// Remover um produto de uma saída /// </summary> /// <param name="saidaProduto"></param> /// <param name="saida"></param> public void Remover(SaidaProduto saidaProduto, Saida saida) { if (saida.TipoSaida == Saida.TIPO_VENDA) { throw new NegocioException("Não é possível remover produtos de uma Venda cujo Comprovante Fiscal já foi emitido."); } else if ((saida.TipoSaida == Saida.TIPO_REMESSA_DEPOSITO) && (saida.Nfe != null) && (!saida.Nfe.Equals(""))) { throw new NegocioException("Não é possível remover produtos de uma Saída para Deposito com Nota Fiscal já emitida."); } else if ((saida.TipoSaida == Saida.TIPO_DEVOLUCAO_FORNECEDOR) && (saida.Nfe != null) && (!saida.Nfe.Equals(""))) { throw new NegocioException("Não é possível remover produtos de uma Devolução para Fornecedor com Nota Fiscal já emitida."); } DbTransaction transaction = null; try { if (saceContext.Connection.State == System.Data.ConnectionState.Closed) { saceContext.Connection.Open(); } transaction = saceContext.Connection.BeginTransaction(); var query = from _saidaProduto in saceContext.SaidaProdutoSet where _saidaProduto.codSaidaProduto == saidaProduto.CodSaidaProduto select _saidaProduto; foreach (SaidaProdutoE saidaProdutoE in query) { repSaidaProduto.Remover(saidaProdutoE); } repSaidaProduto.SaveChanges(); transaction.Commit(); } catch (Exception e) { transaction.Rollback(); throw new DadosException("Saída de Produtos", e.Message, e); } finally { saceContext.Connection.Close(); } }
/// <summary> /// Atribui entidade para entidade persistente /// </summary> /// <param name="saidaProduto"></param> /// <param name="_saidaProdutoE"></param> private static void Atribuir(SaidaProduto saidaProduto, SaidaProdutoE _saidaProdutoE) { _saidaProdutoE.baseCalculoICMS = saidaProduto.BaseCalculoICMS; _saidaProdutoE.baseCalculoICMSSubst = saidaProduto.BaseCalculoICMSSubst; _saidaProdutoE.codProduto = saidaProduto.CodProduto; _saidaProdutoE.codSaida = saidaProduto.CodSaida; _saidaProdutoE.data_validade = saidaProduto.DataValidade; _saidaProdutoE.desconto = saidaProduto.Desconto; _saidaProdutoE.quantidade = saidaProduto.Quantidade; _saidaProdutoE.subtotal = saidaProduto.Subtotal; _saidaProdutoE.subtotalAVista = saidaProduto.SubtotalAVista; _saidaProdutoE.valorICMS = saidaProduto.ValorICMS; _saidaProdutoE.valorICMSSubst = saidaProduto.ValorICMSSubst; _saidaProdutoE.valorIPI = saidaProduto.ValorIPI; _saidaProdutoE.valorVenda = saidaProduto.ValorVenda; _saidaProdutoE.codCST = saidaProduto.CodCST; _saidaProdutoE.cfop = saidaProduto.CodCfop; }
/// <summary> /// Atualiza o preço de venda a prazo com o acréscimo padrão /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void precoVendatextBox_Leave(object sender, EventArgs e) { if (!panelBalcao.Visible) { FormatTextBox.NumeroCom3CasasDecimais(precoVendatextBox); SaidaProduto saidaProduto = new SaidaProduto(); saidaProduto.ValorVendaAVista = Convert.ToDecimal(precoVendatextBox.Text); if (saida.TipoSaida.Equals(Saida.TIPO_PRE_REMESSA_DEPOSITO) || saida.TipoSaida.Equals(Saida.TIPO_PRE_DEVOLUCAO_FORNECEDOR) || saida.TipoSaida.Equals(Saida.TIPO_PRE_RETORNO_DEPOSITO)) { precoVendaSemDescontoTextBox.Text = saidaProduto.ValorVendaAVista.ToString("N3"); } else { precoVendaSemDescontoTextBox.Text = saidaProduto.ValorVenda.ToString("N3"); } AtualizarSubTotal(); codSaidaTextBox_Leave(sender, e); } }
/// <summary> /// Baixa dos lotes do estoque uma determinada quantidade vendida /// </summary> /// <param name="produto"></param> /// <param name="dataValidade"></param> /// <param name="quantidadeVendida"></param> /// <returns></returns> public Decimal BaixarItensVendidosEstoque(SaidaProduto saidaProduto) { List <EntradaProduto> entradaProdutos = (List <EntradaProduto>)ObterDisponiveisPorEntrada(saidaProduto.CodProduto); decimal somaPrecosCusto = 0; decimal quantidadeBaixas = 0; if (saidaProduto.Quantidade < 0) { EstornarItensVendidosEstoque(saidaProduto); } else if (entradaProdutos.Count > 0) { // reduz a quantidade de itens disponíveis nos lotes de entrada foreach (EntradaProduto entradaProduto in entradaProdutos) { if (saidaProduto.Quantidade == quantidadeBaixas) { break; } if (saidaProduto.TemVencimento) { // quando produto tem vencimento if ((entradaProduto.DataValidade.Date.Equals(saidaProduto.DataValidade.Date)) && (quantidadeBaixas < saidaProduto.Quantidade)) { if (entradaProduto.QuantidadeDisponivel >= (saidaProduto.Quantidade - quantidadeBaixas)) { entradaProduto.QuantidadeDisponivel -= saidaProduto.Quantidade - quantidadeBaixas; somaPrecosCusto += (saidaProduto.Quantidade - quantidadeBaixas) * entradaProduto.PrecoCusto; quantidadeBaixas += (saidaProduto.Quantidade - quantidadeBaixas); } } } else { if (quantidadeBaixas < saidaProduto.Quantidade) { if (entradaProduto.QuantidadeDisponivel >= (saidaProduto.Quantidade - quantidadeBaixas)) { entradaProduto.QuantidadeDisponivel -= saidaProduto.Quantidade - quantidadeBaixas; somaPrecosCusto += (saidaProduto.Quantidade - quantidadeBaixas) * entradaProduto.PrecoCusto; quantidadeBaixas += (saidaProduto.Quantidade - quantidadeBaixas); } else { quantidadeBaixas += entradaProduto.QuantidadeDisponivel; somaPrecosCusto += entradaProduto.QuantidadeDisponivel * entradaProduto.PrecoCusto; entradaProduto.QuantidadeDisponivel = 0; } } } Atualizar(entradaProduto); } } if (quantidadeBaixas < saidaProduto.Quantidade) { somaPrecosCusto += BaixarItensVendidosEstoqueEntradaPadrao(saidaProduto, (saidaProduto.Quantidade - quantidadeBaixas)); } saceContext.SaveChanges(); return(somaPrecosCusto); }
public static string SalvarPedido(DateTime data, Dictionary <int, int> produtos, string nomeTabela, bool entrada) { var ret = ""; int idLocalArmazenamento = 0; try { var numPedido = ""; var numPedidoCalculo = 0; if (nomeTabela.Equals("entrada_produto")) { EntradaProduto resultadoConsulta = null; var quantidadeEntradas = ctx.EntradasProdutos.Count(); if (quantidadeEntradas > 0) { resultadoConsulta = ctx.EntradasProdutos.OrderByDescending(x => x.Id).Take(1).Single(); numPedidoCalculo = (Convert.ToInt32(resultadoConsulta.Numero) + 1); numPedido = numPedidoCalculo.ToString(); } else { numPedido = Convert.ToString(1); } } else if (nomeTabela.Equals("saida_produto")) { SaidaProduto resultadoConsulta = null; var quantidadeSaidas = ctx.SaidasProdutos.Count(); if (quantidadeSaidas > 0) { resultadoConsulta = ctx.SaidasProdutos.OrderByDescending(x => x.Id).Take(1).Single(); numPedidoCalculo = (Convert.ToInt32(resultadoConsulta.Numero) + 1); numPedido = numPedidoCalculo.ToString(); } else { numPedido = Convert.ToString(1); } } using (var transacao = ctx.Database.BeginTransaction()) { foreach (var produto in produtos) { if (nomeTabela.Equals("entrada_produto")) { EntradaProduto ep = new EntradaProduto(); ep.Numero = numPedido; ep.Data = data; ep.IdProduto = produto.Key; ep.Quantidade = produto.Value; ctx.EntradasProdutos.Add(ep); Produto recuperado = ctx.Produtos.Find(produto.Key); var existingProduto = ctx.Produtos.Include("LocalArmazenamento").FirstOrDefault(x => x.Id == produto.Key); if (existingProduto != null) { ctx.Entry(existingProduto).State = EntityState.Detached; } idLocalArmazenamento = existingProduto.IdLocalArmazenamento; try { ctx.Produtos.Attach(recuperado); recuperado.QuantEstoque = recuperado.QuantEstoque + produto.Value; ctx.Entry(recuperado).State = EntityState.Modified; ctx.SaveChanges(); LocalArmazenamentoDao.AtualizarCapacidadeAtual(idLocalArmazenamento, produto.Value, "Cadastrar"); } catch (System.Exception ex) { throw; } } else if (nomeTabela.Equals("saida_produto")) { SaidaProduto ep = new SaidaProduto(); ep.Numero = numPedido; ep.Data = data; ep.IdProduto = produto.Key; ep.Quantidade = produto.Value; ctx.SaidasProdutos.Add(ep); Produto recuperado = ctx.Produtos.Find(produto.Key); var existingProduto = ctx.Produtos.Include("LocalArmazenamento").FirstOrDefault(x => x.Id == produto.Key); if (existingProduto != null) { ctx.Entry(existingProduto).State = EntityState.Detached; } idLocalArmazenamento = existingProduto.IdLocalArmazenamento; try { ctx.Produtos.Attach(recuperado); if ((recuperado.QuantEstoque - produto.Value) < 0) { recuperado.QuantEstoque = 0; } else { recuperado.QuantEstoque = recuperado.QuantEstoque - produto.Value; } ctx.Entry(recuperado).State = EntityState.Modified; ctx.SaveChanges(); LocalArmazenamentoDao.AtualizarCapacidadeAtual(idLocalArmazenamento, produto.Value, "Remover"); } catch (System.Exception ex) { throw; } } } transacao.Commit(); ret = numPedido; } } catch (Exception ex) { } return(ret); }