Пример #1
0
        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?.DateTimeOffsetValue.DateTime;
                }
                if (ide.dhSaiEnt.HasValue)
                {
                    model.DataSaidaEntrada = ide.dhSaiEnt?.DateTimeOffsetValue.DateTime;
                }

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

                if (!string.IsNullOrWhiteSpace(ide.hSaiEnt))
                {
                    model.HoraSaidaEntrada = TimeSpan.Parse(ide.hSaiEnt);
                }
            }
        }
Пример #2
0
        public static DanfeViewModel CreateFromXml(ProcNFe procNfe)
        {
            DanfeViewModel model = new DanfeViewModel();

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

            model.TipoEmissao = ide.tpEmis;

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

            if (!FormasEmissaoSuportadas.Contains(model.TipoEmissao))
            {
                throw new NotSupportedException($"O tpEmis {ide.tpEmis} não é suportado.");
            }

            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);

            // Local retirada e entrega
            if (infNfe.retirada != null)
            {
                model.LocalRetirada = CreateLocalRetiradaEntrega(infNfe.retirada);
            }

            if (infNfe.entrega != null)
            {
                model.LocalEntrega = CreateLocalRetiradaEntrega(infNfe.entrega);
            }

            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)
            {
                var duplicatas = infNfe.cobr.dup.Select(x => new DuplicataViewModel
                {
                    Numero    = x.nDup,
                    Valor     = x.vDup,
                    Vecimento = x.dVenc
                });
                model.Duplicatas = duplicatas.ToList();
            }

            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);

            // Contingência SVC-AN e SVC-RS
            if (model.TipoEmissao == FormaEmissao.ContingenciaSVCAN || model.TipoEmissao == FormaEmissao.ContingenciaSVCRS)
            {
                model.ContingenciaDataHora      = ide.dhCont?.DateTimeOffsetValue.DateTime;
                model.ContingenciaJustificativa = ide.xJust;
            }

            return(model);
        }