internal static void ExtrairDatas(DanfeViewModel model, InfNFe infNfe)
        {
            var ide = infNfe.ide;

            if (infNfe.Versao.Maior >= 3)
            {
                if (ide.dhEmi.HasValue)
                {
                    model.DataHoraEmissao = ide.dhEmi.Value.DateTimeOffsetValue.DateTime;
                }
                if (ide.dhSaiEnt.HasValue)
                {
                    model.DataSaidaEntrada = ide.dhSaiEnt.Value.DateTimeOffsetValue.DateTime;
                }

                if (model.DataSaidaEntrada.HasValue)
                {
                    model.HoraSaidaEntrada = model.DataSaidaEntrada.Value.TimeOfDay;
                }
            }
            else
            {
                model.DataHoraEmissao  = ide.dEmi;
                model.DataSaidaEntrada = ide.dSaiEnt;

                if (!String.IsNullOrWhiteSpace(ide.hSaiEnt))
                {
                    model.HoraSaidaEntrada = TimeSpan.Parse(ide.hSaiEnt);
                }
            }
        }
Beispiel #2
0
        public BlocoDuplicataFatura(DanfeSharp.Modelo.DanfeViewModel viewModel, Estilo estilo)
            : base(viewModel, estilo)
        {
            var de = viewModel.Duplicatas.Select(x => new Duplicata(estilo, x)).ToList();
            var eh = de.First().Height;

            int numeroElementosLinha = ViewModel.IsPaisagem ? 7 : 6;
            int i = 0;

            while (i < de.Count)
            {
                FlexibleLine fl = new FlexibleLine(Width, eh);

                int i2;
                for (i2 = 0; i2 < numeroElementosLinha && i < de.Count; i2++, i++)
                {
                    fl.ComElemento(de[i]);
                }

                for (; i2 < numeroElementosLinha; i2++)
                {
                    fl.ComElemento(new ElementoVazio());
                }

                fl.ComLargurasIguais();
                MainVerticalStack.Add(fl);
            }
        }
        public static DanfeViewModel CreateFromXml(ProcNFe procNfe)
        {
            DanfeViewModel model = new DanfeViewModel();

            var nfe    = procNfe.NFe;
            var infNfe = nfe.infNFe;
            var ide    = infNfe.ide;

            if (ide.mod != 55)
            {
                throw new Exception("Somente o mod==55 está implementado.");
            }

            if (ide.tpEmis != FormaEmissao.Normal)
            {
                throw new Exception("Somente o tpEmis==1 está implementado.");
            }


            model.Orientacao = ide.tpImp == 1 ? Orientacao.Retrato : Orientacao.Paisagem;

            var infProt = procNfe.protNFe.infProt;

            model.CodigoStatusReposta    = infProt.cStat;
            model.DescricaoStatusReposta = infProt.xMotivo;

            model.TipoAmbiente     = (int)ide.tpAmb;
            model.NfNumero         = ide.nNF;
            model.NfSerie          = ide.serie;
            model.NaturezaOperacao = ide.natOp;
            model.ChaveAcesso      = procNfe.NFe.infNFe.Id.Substring(3);
            model.TipoNF           = (int)ide.tpNF;

            model.Emitente     = CreateEmpresaFrom(infNfe.emit);
            model.Destinatario = CreateEmpresaFrom(infNfe.dest);

            model.NotasFiscaisReferenciadas = ide.NFref.Select(x => x.ToString()).ToList();

            // Informações adicionais de compra
            if (infNfe.compra != null)
            {
                model.Contrato    = infNfe.compra.xCont;
                model.NotaEmpenho = infNfe.compra.xNEmp;
                model.Pedido      = infNfe.compra.xPed;
            }

            foreach (var det in infNfe.det)
            {
                ProdutoViewModel produto = new ProdutoViewModel();
                produto.Codigo                = det.prod.cProd;
                produto.Descricao             = det.prod.xProd;
                produto.Ncm                   = det.prod.NCM;
                produto.Cfop                  = det.prod.CFOP;
                produto.Unidade               = det.prod.uCom;
                produto.Quantidade            = det.prod.qCom;
                produto.ValorUnitario         = det.prod.vUnCom;
                produto.ValorTotal            = det.prod.vProd;
                produto.InformacoesAdicionais = det.infAdProd;

                var imposto = det.imposto;

                if (imposto != null)
                {
                    if (imposto.ICMS != null)
                    {
                        var icms = imposto.ICMS.ICMS;

                        if (icms != null)
                        {
                            produto.ValorIcms    = icms.vICMS;
                            produto.BaseIcms     = icms.vBC;
                            produto.AliquotaIcms = icms.pICMS;
                            produto.OCst         = icms.orig + icms.CST + icms.CSOSN;
                        }
                    }

                    if (imposto.IPI != null)
                    {
                        var ipi = imposto.IPI.IPITrib;

                        if (ipi != null)
                        {
                            produto.ValorIpi    = ipi.vIPI;
                            produto.AliquotaIpi = ipi.pIPI;
                        }
                    }
                }

                model.Produtos.Add(produto);
            }

            if (infNfe.cobr != null)
            {
                foreach (var item in infNfe.cobr.dup)
                {
                    DuplicataViewModel duplicata = new DuplicataViewModel();
                    duplicata.Numero    = item.nDup;
                    duplicata.Valor     = item.vDup;
                    duplicata.Vecimento = item.dVenc;

                    model.Duplicatas.Add(duplicata);
                }
            }

            model.CalculoImposto = CriarCalculoImpostoViewModel(infNfe.total.ICMSTot);

            var issqnTotal = infNfe.total.ISSQNtot;

            if (issqnTotal != null)
            {
                var c = model.CalculoIssqn;
                c.InscricaoMunicipal = infNfe.emit.IM;
                c.BaseIssqn          = issqnTotal.vBC;
                c.ValorTotalServicos = issqnTotal.vServ;
                c.ValorIssqn         = issqnTotal.vISS;
                c.Mostrar            = true;
            }

            var transp              = infNfe.transp;
            var transportadora      = transp.transporta;
            var transportadoraModel = model.Transportadora;

            transportadoraModel.ModalidadeFrete = (int)transp.modFrete;

            if (transp.veicTransp != null)
            {
                transportadoraModel.VeiculoUf  = transp.veicTransp.UF;
                transportadoraModel.CodigoAntt = transp.veicTransp.RNTC;
                transportadoraModel.Placa      = transp.veicTransp.placa;
            }

            if (transportadora != null)
            {
                transportadoraModel.RazaoSocial        = transportadora.xNome;
                transportadoraModel.EnderecoUf         = transportadora.UF;
                transportadoraModel.CnpjCpf            = !String.IsNullOrWhiteSpace(transportadora.CNPJ) ? transportadora.CNPJ : transportadora.CPF;
                transportadoraModel.EnderecoLogadrouro = transportadora.xEnder;
                transportadoraModel.Municipio          = transportadora.xMun;
                transportadoraModel.Ie = transportadora.IE;
            }


            var vol = transp.vol.FirstOrDefault();

            if (vol != null)
            {
                transportadoraModel.QuantidadeVolumes = vol.qVol;
                transportadoraModel.Especie           = vol.esp;
                transportadoraModel.Marca             = vol.marca;
                transportadoraModel.Numeracao         = vol.nVol;
                transportadoraModel.PesoBruto         = vol.pesoB;
                transportadoraModel.PesoLiquido       = vol.pesoL;
            }


            var infAdic = infNfe.infAdic;

            if (infAdic != null)
            {
                model.InformacoesComplementares  = procNfe.NFe.infNFe.infAdic.infCpl;
                model.InformacoesAdicionaisFisco = procNfe.NFe.infNFe.infAdic.infAdFisco;
            }

            var infoProto = procNfe.protNFe.infProt;

            model.ProtocoloAutorizacao = String.Format(Formatador.Cultura, "{0} - {1}", infoProto.nProt, infoProto.dhRecbto.DateTimeOffsetValue.DateTime);

            ExtrairDatas(model, infNfe);

            return(model);
        }
        // Manual de Especificacoes Tecnicas do DANFE NFCeQRCode_Versao3.4_26_10_2015
        public static DanfeViewModel CreateFromProcNFCe(ProcNFe procNfe)
        {
            DanfeViewModel model = new DanfeViewModel();

            var nfe    = procNfe.NFe;
            var infNfe = nfe.infNFe;
            var ide    = infNfe.ide;

            if (ide.mod != 65)
            {
                throw new Exception("Modelo da nota difere de 65");
            }

            if (ide.tpEmis != FormaEmissao.Normal && ide.tpEmis != FormaEmissao.ContingenciaDPEC && ide.tpEmis != FormaEmissao.ContingenciaFSDA && ide.tpEmis != FormaEmissao.ContingenciaSVCAN && ide.tpEmis != FormaEmissao.ContingenciaSVCRS)
            {
                throw new Exception("Somente o tpEmis==1 está implementado.");
            }

            // Divisão 1 - Informações do Cabeçalho
            model.Emitente.RazaoSocial = !string.IsNullOrWhiteSpace(infNfe.emit.xNome) ? infNfe.emit.xNome : null;
            model.Emitente.CnpjCpf     = !string.IsNullOrWhiteSpace(infNfe.emit.CNPJ) ? infNfe.emit.CNPJ : infNfe.emit.CPF;

            if (infNfe.emit.Endereco != null)
            {
                model.Emitente.EnderecoLogadrouro = infNfe?.emit?.Endereco?.xLgr;
                model.Emitente.EnderecoNumero     = infNfe?.emit?.Endereco?.nro;
                model.Emitente.EnderecoBairro     = infNfe?.emit?.Endereco?.xBairro;
                model.Emitente.Municipio          = infNfe?.emit?.Endereco?.xMun;
                model.Emitente.EnderecoUf         = infNfe?.emit?.Endereco?.UF;
            }

            // Divisão 2 - Identificação do DANFE NFCe
            // Está no bloco TabelaProdutosServicosNFC

            // Divisão 3 - Informações de detalhes de produtos/serviços
            foreach (var det in infNfe.det)
            {
                var produto = new ProdutoViewModel();
                produto.Codigo        = det.prod.cProd;
                produto.Descricao     = det.prod.xProd;
                produto.Unidade       = det.prod.uCom;
                produto.Quantidade    = det.prod.qCom;
                produto.ValorUnitario = det.prod.vUnCom;
                produto.ValorTotal    = det.prod.vProd;

                model.Produtos.Add(produto);
            }

            // Divisão 4 - Informações de Totais do DANFE NFCe
            model.CalculoImposto = new CalculoImpostoViewModel()
            {
                QuantidadeTotal    = model.Produtos.Count(),
                ValorTotalProdutos = infNfe.total.ICMSTot.vProd,
                ValorFrete         = infNfe.total.ICMSTot.vFrete,
                ValorSeguro        = infNfe.total.ICMSTot.vSeg,
                OutrasDespesas     = infNfe.total.ICMSTot.vOutro,
                Desconto           = infNfe.total.ICMSTot.vDesc,
                ValorTotalNota     = infNfe.total.ICMSTot.vNF,
            };

            foreach (var pag in infNfe.pag)
            {
                var pagamento = new PagamentoViewModel();
                pagamento.DetalhePagamento = new System.Collections.Generic.List <DetalheViewModel>();
                pagamento.Troco            = pag.vTroco;

                foreach (var detPag in pag.detPag)
                {
                    var detalhe = new DetalheViewModel();

                    detalhe.FormaPagamento = (FormaPagamento)detPag.tPag;
                    detalhe.Valor          = detPag.vPag;

                    pagamento.DetalhePagamento.Add(detalhe);
                }

                model.Pagamento.Add(pagamento);
            }

            // Divisão 5 - Área de Mensagem Fiscal (BlocoInformacaoFiscal)
            model.TipoAmbiente = (int)ide.tpAmb;

            // Divisão 6 - Informações de Identificação da NFC-e e do Protocolo de Autorização
            model.NfNumero        = ide.nNF;
            model.NfSerie         = ide.serie;
            model.DataHoraEmissao = ide.dhEmi.GetValueOrDefault().DateTimeOffsetValue.DateTime;

            // consultar os sites para consultar nfce --> http://nfce.encat.org/consulte-sua-nota-qr-code-versao-2-0/
            if (ide.tpAmb == TAmb.Producao)
            {
                model.EndConsulta = infNfe?.emit?.Endereco?.UF.UrlNFCeProduction();
            }
            else if (ide.tpAmb == TAmb.Homologacao)
            {
                model.EndConsulta = infNfe?.emit?.Endereco?.UF.UrlNFCeTest();
            }

            // dividir a chave de acesso em 11 blocos com espaço em cada bloco 999 999 999 999 999 999 999 999 999 999 999
            model.ChaveAcesso = procNfe.NFe.infNFe.Id.Substring(3).SpaceOnAccessKey();

            model.ProtocoloAutorizacao = String.Format(Formatador.Cultura, "{0}  {1}", procNfe.protNFe.infProt.nProt, procNfe.protNFe.infProt.dhRecbto.DateTimeOffsetValue.DateTime);

            // Divisão 7 - Informações sobre o Consumidor
            model.Destinatario.RazaoSocial = !string.IsNullOrWhiteSpace(infNfe?.dest?.xNome) ? infNfe.dest.xNome : null;

            if (infNfe.dest != null)
            {
                if (!string.IsNullOrWhiteSpace(infNfe?.dest?.CPF))
                {
                    model.Destinatario.CnpjCpf = infNfe.dest.CPF;
                }

                if (!string.IsNullOrWhiteSpace(infNfe?.dest?.CNPJ))
                {
                    model.Destinatario.CnpjCpf = infNfe.dest.CNPJ;
                }

                if (infNfe.dest != null && infNfe.dest.Endereco != null)
                {
                    model.Destinatario.EnderecoLogadrouro = infNfe.dest.Endereco.xLgr;
                    model.Destinatario.EnderecoNumero     = infNfe.dest.Endereco.nro;
                    model.Destinatario.EnderecoBairro     = infNfe.dest.Endereco.xBairro;
                    model.Destinatario.Municipio          = infNfe.dest.Endereco.xMun;
                    model.Destinatario.EnderecoUf         = infNfe.dest.Endereco.UF;
                }
            }
            // Divisão 8 - Informações da Consulta via QR CODE
            model.QrCode = nfe.infNFeSupl.qrCode;

            // Divisão 9 - Mensagem de Interesse do Contribuinte
            model.CalculoImposto.ValorAproximadoTributos = infNfe.total.ICMSTot.vICMS + infNfe.total.ICMSTot.vST + infNfe.total.ICMSTot.vII + infNfe.total.ICMSTot.vIPI + infNfe.total.ICMSTot.vPIS + infNfe.total.ICMSTot.vCOFINS;

            model.CalculoImposto.ValorAproximadoTributosEstaduais = infNfe.total.ICMSTot.vICMS + infNfe.total.ICMSTot.vST;
            model.CalculoImposto.ValorAproximadoTributosFederais  = infNfe.total.ICMSTot.vII + infNfe.total.ICMSTot.vIPI + infNfe.total.ICMSTot.vPIS + infNfe.total.ICMSTot.vCOFINS;

            return(model);
        }