Beispiel #1
0
        /// <summary>
        /// Cria uma Nota Fiscal Eletrônica de acordo com o movimento informado
        /// </summary>
        /// <param name="movimento">Movimento que será transformado em Nota Fiscal Eletrônica</param>
        /// <returns></returns>
        public override void AfterSave(bool updating)
        {
            base.AfterSave(updating);

            if (updating)
                Connection.ExecuteNonQuery("DELETE FROM fat_LanMovNFInfAdic WHERE GUIDLanMovNF	 = @p1;",
                    new Parameter[]{
                    new Parameter
                    {
                        ParameterName = "@p1",
                        Value = GUID.ToString()
                    }});

            foreach (IInfAdic inf in InformacoesAdicionais)
            {
                inf.Parent = this;
                inf.Save();
            }

            Eventos.Save<IEvento, INF>(this, () =>
            {
                if (updating)
                {
                    Connection.ExecuteNonQuery("DELETE FROM fat_LanMovNFEventos WHERE GUIDLanMovNF	 = @p1", new Parameter[]{
                new Parameter
                {
                    ParameterName = "@p1",
                    Value = GUID.ToString()
                    }});
                }

            });

            #region Movimentos vinculados
            foreach (IMovimento movimentoVinculado in MovimentosVinculados)
            {
                Model.Faturamento.Lancamento.ILanSK sk = new Data.Faturamento.Lancamento.LanSK();
                sk.GUIDSK = this.GUID;
                sk.Pai = this.GUID;
                sk.Filho = movimentoVinculado.GUID;
                sk.TableHash = this.GetTableHash();
                sk.Save();

                this.Connection.ExecuteNonQuery("UPDATE fat_Lan SET Status = @status WHERE GUID = @guid", new[] {
                        new Parameter{
                            ParameterName = "@status",
                            GenericDbType= GenericDbType.Integer,
                            Value = (int)Enuns.Faturamento.Lancamento.Status.Impresso
                        },
                        new Parameter{
                            ParameterName = "@guid",
                            Value = movimentoVinculado.GUID
                        }
                    });
            }
            #endregion
        }
        /// <summary>
        /// Ocorrea antes de excluir uma devolução da base de dados
        /// </summary>
        public override void BeforeDelete()
        {
            base.BeforeDelete();

            ILanSK sk = new LanSK(this.GUID, this.GetTableHash());
            //Se essa devolução já foi utilizada como voucher, não podemos excluí-la
            if (!sk.Filho.IsNullOrEmpty())
                throw new DevolucaoJaUtilizada();
        }
        public override void AfterSave(bool updating)
        {
            base.AfterSave(updating);

            if (this is Voucher)
            {
                Voucher v = this as Voucher;

                IList<Devolucao> dev = DbContext.Find(new Devolucao(), new Where()
                {
                   {"fat_LanMov.EGUID",v.NumeroVoucher },
                });

                Devolucao devolucao = dev.Count > 0 ? dev[0] as Devolucao : null;

                if (!devolucao.IsNullOrEmpty())
                {
                    // salva o vinculo na lanSK
                    ILanSK sk = new LanSK();
                    sk.GUIDSK = devolucao.GUID;
                    sk.Pai = devolucao.GUID;
                    sk.Filho = GUID;
                    sk.TableHash = devolucao.GetTableHash();
                    sk.Save();

                    //Determina que o valor do voucher já foi pago ao cliente
                    Connection.ExecuteNonQuery(@"UPDATE fat_lan SET status = @status WHERE guid = @guid;", new Parameter[]
                    {
                        new Parameter
                        {
                            ParameterName = "@status",
                            Value = (int)Enuns.Faturamento.Lancamento.Status.VoucherRecebido
                        },
                        new Parameter
                        {
                            ParameterName = "@guid",
                            Value = devolucao.GUID.ToString()
                        }
                    });
                }
            }
        }
        public override void AfterSave(bool updating)
        {
            base.AfterSave(updating);

            #region movimento vinculado

            if (updating)
            {
                foreach (IMovimento movimentoVinculado in MovimentosVinculados)
                {
                    ILanSK sk = new LanSK();
                    sk.GUIDSK = this.GUID;
                    sk.Pai = this.GUID;
                    sk.Filho = movimentoVinculado.GUID;
                    sk.TableHash = this.GetTableHash();
                    sk.Save();

                    this.Connection.ExecuteNonQuery("UPDATE fat_Lan SET Status = @status WHERE GUID = @guid", new[] {
                        new Parameter{
                            ParameterName = "@status",
                            GenericDbType= GenericDbType.Integer,
                            Value = (int)Enuns.Faturamento.Lancamento.Status.ImpressoCupom
                        },
                        new Parameter{
                            ParameterName = "@guid",
                            Value = movimentoVinculado.GUID
                        }
                    });
                }
            }
            #endregion

            #region Registro 04

            /*TODO: Conforme ir fazendo os ajustes na Venda de Cupom fiscal será necessários informar os valroes corretos para os registros 04 e 05;
             * Ajustes no Registro 04:
             * CCF, COO, ValorSubtotal, ValorDescontoSubtotal, TipoDescontoSubtotal, ValorAcrescimoSubtotal, TipoAcrescimoSubtotal, Cancelado
             * ValorCancelamentoAcrescimoSubtotal, OrdemDescontoAcrescimo
             * Ajustes no Registro 05:
             * COO, CCF, CodigoTotalalizadorParcial, Cancelado, QuantidadeCancelada, ValorCancelado, ValorCancelamentoAcrescimo,QuantidadeCasaDecimal
             * QuantidadeCasaDecimalVlrUnit
            */

            IRegistro04 reg04 = new Registro04();

            //Gravar os dados da venda de cupom fiscal no registro 04
            //-------------------------------------------------------------------------
            // Procurar a impressora pelo PDV
            //-------------------------------------------------------------------------

            IList<IImpressora> impressoras = new Impressora().Find<IImpressora>(new Where {
                {"ecf_Impressora.GUIDPDV = @p1", new Parameter{
                    ParameterName = "@p1",
                    Value = AbreFechaCaixa.Caixa.PDV.GUID
                }}
            });

            if (impressoras.Count > 0 && !updating)
            {
                IImpressora ecfAtual = impressoras[0];

                reg04.Movimento = this;
                reg04.MFAdicional = ecfAtual.MFAdicional;
                reg04.ModeloECF = Unimake.Convert.ToString(ecfAtual.ModeloACBR);
                reg04.NumeroUsuario = Unimake.Convert.ToInt(ecfAtual.NumeroUsuario);
                reg04.CCF = this.CCF;
                reg04.COO = this.COO;
                reg04.DataEmissao = this.DataEmissao;
                reg04.ValorSubtotal = this.ValorTotalBruto;
                reg04.ValorDescontoSubtotal = 0;
                reg04.TipoDescontoSubtotal = IndicadorTipo.Monetario;
                reg04.ValorAcrescimoSubtotal = 0;
                reg04.TipoAcrescimoSubtotal = IndicadorTipo.Monetario;
                reg04.ValorTotalLiquido = this.ValorTotalLiquido;
                reg04.Cancelado = IndicadorCancelamento.Nao;
                reg04.ValorCancelamentoAcrescimoSubtotal = 0;
                reg04.OrdemDescontoAcrescimo = IndicadorOrdem.Desconto;
                reg04.NumeroFabricacao = ecfAtual.Serie;

                if (DadoPessoa != null)
                {
                    reg04.NomeAdquirente = this.DadoPessoa.NomeFantasia.Substring(0, 40);

                    if (this.DadoPessoa.Cliente.FisicaJuridica == Enuns.Cadastro.Pessoa.FisicaJuridica.Fisica)
                        reg04.CPFCNPJAdquirente = Unimake.Utilities.OnlyNumbers(this.DadoPessoa.Cliente.Fisica.CPF.ToString(), "./-").ToString();
                    else
                        reg04.CPFCNPJAdquirente = Unimake.Utilities.OnlyNumbers(this.DadoPessoa.Cliente.Juridica.CNPJ.ToString(), "./-").ToString();
                }

                int numeroItemECF = 0;

                foreach (IItem item in this.Itens)
                {
                    numeroItemECF += 1;
                    //Gravar os dados dos itens do cupom fiscal no registro 05
                    IRegistro05 reg05 = new Registro05();
                    reg05.ItemMovimentado = item;
                    reg05.NumeroFabricacao = ecfAtual.Identificacao;
                    reg05.MFAdicional = ecfAtual.MFAdicional;
                    reg05.ModeloECF = Unimake.Convert.ToString(ecfAtual.ModeloACBR);
                    reg05.NumeroUsuario = reg04.NumeroUsuario;
                    reg05.COO = reg04.COO;
                    reg05.CCF = reg04.CCF;
                    reg05.NumeroItem = numeroItemECF;
                    reg05.CodigoTotalalizadorParcial = "I01";
                    reg05.SituacaoTributaria = item.SituacaoTributaria;

                    if (Unimake.Convert.ToEnum<Enuns.Faturamento.Lancamento.Movimento.Item.Status>(item.Status) == Enuns.Faturamento.Lancamento.Movimento.Item.Status.Cancelado)
                    {
                        reg05.Cancelado = "S";
                        reg05.QuantidadeCancelada = item.Quantidade;
                        reg05.ValorCancelado = item.ValorTotalBruto;
                    }
                    else
                    {
                        reg05.Cancelado = "N";
                        reg05.QuantidadeCancelada = 0;
                        reg05.ValorCancelado = 0;
                    }

                    Model.Cadastro.Item.Produto.IProduto produto = item.ItemMovimentado as Model.Cadastro.Item.Produto.IProduto;
                    reg05.ValorCancelamentoAcrescimo = 0;
                    reg05.IndicadorTruncamento = produto.IndicadorTruncamento;
                    reg05.IndicadorProducao = produto.IndicadorProducao;
                    reg05.QuantidadeCasaDecimal = 2;
                    reg05.QuantidadeCasaDecimalVlrUnit = 2;
                    reg05.NumeroFabricacao = reg04.NumeroFabricacao;
                    reg04.Registros05.Add(reg05);

                    reg04.Save();
                }
            }
            #endregion
        }
Beispiel #5
0
        /// <summary>
        /// Método para vincular DAVOS com outro DAVOS
        /// </summary>
        /// <param name="dav">objeto do tipo DAV-OS</param>
        public IDAV VinculaDAVOS()
        {
            if(IsVinculado)
                throw new OpenPOS.Exceptions.Faturamento.Lancamento.Movimento.MovimentoIsReadOnly();

            IDAV dav = new OpenPOS.Data.Faturamento.Lancamento.Movimento.DAV.OS.DAV(GUID);
            // Atualiza o objeto dav para a cópia
            this.New = true;
            this.GUID = GUID.Create();

            // Adiciona os vinculos
            foreach(IItem item in this.Itens)
            {
                IItem itemPai = dav.Itens.Contains(item) ? dav.Itens.First(i => i.GUID.Equals(item.GUID)) : null;
                if(itemPai != null)
                    itemPai.ItensParent.Add(item);
            }

            ((List<IItem>)Itens).ForEach(k => k.New = true);

            // salva o vinculo na lanSK
            ILanSK sk = new LanSK();
            sk.GUIDSK = dav.GUID;
            sk.Pai = dav.GUID;
            sk.Filho = GUID;
            sk.TableHash = dav.GetTableHash();
            foreach(IItem item in dav.Itens)
                foreach(Model.Faturamento.Lancamento.Movimento.Item.IItem p in Itens)
                    if(item.ItensParent.Contains(p))
                        sk.SKItens.Add(new LanSKItem() { ItemPai = item.GUID, ItemFilho = p.GUID, SKPai = dav.GUID, SKFilho = GUID, TableHash = item.GetTableHash() });
            sk.Save();
            dav.IsVinculado = true;
            dav.Save();
            return this;
        }
        public override void AfterSave(bool updating)
        {
            base.AfterSave(updating);

            GUID[] guidItens = (from x in Itens
                                select x.GUID).ToArray();

            //-------------------------------------------------------------------------
            // Aqui iremos excluir todos os:
            // -> itens;
            // -> rateios;
            //-------------------------------------------------------------------------
            if(guidItens.Count() > 0)
            {
                Connection.ExecuteNonQuery(String.Format(@"
                                                    DELETE FROM fat_LanMovItem WHERE Rateio = 0 AND GUID NOT IN ({0}) AND GUIDLanMov = '{1}';
                                                    DELETE FROM fat_LanMovItem WHERE Rateio = 1 AND GUIDLanMov = '{1}';",
                                        guidItens.Join(), GUID));
            }

            #region Dados pessoa
            DadoPessoa.Parent = this;
            DadoPessoa.Save();
            #endregion

            #region itens
            foreach(IItem item in Itens)
            {
                item.Parent = this;
                // Irá calcular os tributos neste momento apenas se for diferente de cupom fiscal
                if(!(this is IVendaCF))
                    CalculaTributo(item);

                CalculaImpostosAproximados(item);

                item.Save();
            }
            #endregion

            #region Movimentos parent
            foreach(IMovimento movimento in MovimentosMesclados)
            {
                ILanSK sk = new LanSK();
                sk.GUIDSK = this.GUID;
                sk.Pai = this.GUID;
                sk.Filho = movimento.GUID;
                sk.TableHash = Unimake.Convert.ToInt(this.GetTableHash());
                foreach(IItem item in ((IMovimento)this).Itens)
                {
                    foreach(Model.Faturamento.Lancamento.Movimento.Item.IItem p in item.ItensParent)
                    {
                        if(p.Parent.GUID.Equals(movimento.GUID))
                            sk.SKItens.Add(new LanSKItem() { ItemPai = item.GUID, ItemFilho = p.GUID, SKPai = this.GUID, SKFilho = p.Parent.GUID, TableHash = item.GetTableHash() });
                    }
                }

                sk.Save();

                //Vamos mesclar um DAV somente quando possuir mais de dois ou mais DAV´s selecionados
                if(MovimentosMesclados.Count > 1)
                {
                    //TODO André: Atualizar o Status do DAV para mesclado. Por enquanto só está mesclando o DAV, que por sua vez está sendo chamado do formulário FormMesclarCarregarDAV.
                    //Quando for mesclar uma Pré-Venda é necessário fazer os tratamentos corretos
                    Connection.ExecuteNonQuery("UPDATE fat_Lan SET Status = @p1 WHERE GUID = @p2;", new[]
                    {
                        new Parameter
                        {
                            ParameterName = "@p1",
                            GenericDbType = GenericDbType.Integer,
                            Value = (int)Enuns.Faturamento.Lancamento.Status.Mesclado
                        },
                        new Parameter
                        {
                            ParameterName = "@p2",
                            GenericDbType = GenericDbType.String,
                            Value = movimento.GUID
                        }
                    });
                }
            }
            #endregion

            #region Rateios
            IList<IRateio> rateios = Rateio.GerarRateio(this);

            foreach(IRateio rateio in rateios)
            {
                rateio.Parent = this;
                rateio.Save();
            }
            #endregion

            #region Parcelas
            //-------------------------------------------------------------------------
            // Se não possuir parcelas geradas, deverão ser geradas as parcelas.
            // Se já existir salvar as parcelas que foram informadas
            //-------------------------------------------------------------------------

            if(Parcelas == null || Parcelas.Count == 0 && !Temp)
            {
                //TODO André: Ver com a equipe a cerca da condição de pagamento na Pré-Venda/DAV e Cupom Fiscal
                //Na Pré-Venda é obrigatório informar uma condição de pagamento que por sua vez irá gerar parcelas, isso se e somente se a condição de pagamento estiver parcelas cadastradas
                //No cupom fiscal na forma de pagamento a dinheiro não geramos parcelas, porem temos a seguinte situação, como o componente "FormaPagamento", já traz uma condição de pagamento
                //devido ser um componente "SearchField" que por sua vez já é populado automaticamente quando temos um registro. Vamos deixar dessa forma? Pois quando o cliente paga com dinheiro
                //esta gerando parcelas. Podemos fazer um tratamento para gerar parcelas somente quando é "Parcelado". Analisar!!!
                if(CondicaoPagamento != null && GUID.IsValid(CondicaoPagamento.GUID))
                {
                    Parcelas = (from x in CondicaoPagamento.GerarParcelas(ValorTotalLiquido, DataEmissao)
                                let parcela = Data.Abstract.Financeiro.Lancamento.PagarReceberBase.Create(this, x)
                                select parcela).ToList<Model.Financeiro.Lancamento.IParcela>();
                }
            }

            if(updating)
            {
                GUID[] guidParcelas = (from x in Parcelas
                                       group x by x.GUID into g
                                       select g.Key).ToArray();

                if(guidParcelas.Length > 0)
                {
                    //Apagar todas as parcelas desse movimento e apagar o lançamento de conta a pagar. Pois os mesmos serão gerados novamente logo abaixo
                    Connection.ExecuteNonQuery(String.Format(@"
                                               DELETE FROM fat_LanSK WHERE GUIDLanPai = @pai AND TableHash = @th;
                                               DELETE FROM fat_Lan   WHERE GUID IN
                                               (SELECT GUIDLanFilho FROM fat_LanSK WHERE GUIDLanPai = @pai AND GUIDLanFilho NOT IN ({0}) AND TableHash = @th);",
                                               guidParcelas.Join()),
                                                 new[] {
                                                        new Parameter {
                                                            ParameterName = "@pai",
                                                            Value = GUID
                                                        },
                                                        new Parameter{
                                                            ParameterName = "@th",
                                                            Value = Unimake.Utilities.GetTableHash(typeof(IPagarReceber))
                                                        }
                                                    }
                                               );

                }
            }

            foreach(var parcela in Parcelas)
            {
                parcela.ContaCorrente = DadoPessoa.Cliente.ContaCorrente;
                parcela.Connection = Connection;
                GUID guidParcela = parcela.Save();
                LanSK lanSK = new LanSK(GUID, guidParcela, Utilities.GetTableHash(typeof(IPagarReceber)));
                lanSK.Connection = Connection;
                lanSK.Save();
            }
            #endregion

            #region Ocorrências
            Connection.ExecuteNonQuery(@"DELETE FROM fat_LanMovOcorrencia WHERE GUIDLanMov = @guid;", new[]
            {
                new Parameter
                {
                    ParameterName = "@guid",
                    Value = GUID
                }
            });

            foreach (Model.Faturamento.Lancamento.Movimento.Ocorrencia.IOcorrencia ocorrencia in Ocorrencias)
            {
                ocorrencia.Parent = this;
                ocorrencia.Save();
            }
            #endregion

            #region Baixas
            if (Baixa != null)
            {
                Baixa.Parent = this;
                Baixa.Save();
            }
            #endregion
        }