XML serialization - NFC e-element [closed]

5

I'm trying to serialize an XML from the electronic invoice, but when I got to the id element where it is an Array object I packed myself because I get the error "Object reference not set to an instance of an object." Based on an XML from an NFe I generated the classes to be serialized, using the Visual Studio automatic option, edit / paste special / Paste XML as classes.

And to test I made the following code.

private void button1_Click_1(object sender, EventArgs e)
    {
        try
        {
            nfeProc nota = new nfeProc();
            nota.versao = 3.10M;
            nota.NFe = new nfeProcNFe();
            nota.NFe.infNFe = new nfeProcNFeInfNFe();
            nota.NFe.infNFe.Id = "NFe13130604501136000136650020000973882010222458";
            nota.NFe.infNFe.versao = 3.10M;

            nota.NFe.infNFe.ide = new nfeProcNFeInfNFeIde();
            nota.NFe.infNFe.ide.cUF = 11;
            nota.NFe.infNFe.ide.cNF = 01022245;
            nota.NFe.infNFe.ide.natOp = "VENDA DE MERCADORIA";
            nota.NFe.infNFe.ide.indPag = 0;
            nota.NFe.infNFe.ide.mod = 65;
            nota.NFe.infNFe.ide.serie = 1;
            nota.NFe.infNFe.ide.nNF = 23354;
            nota.NFe.infNFe.ide.dhEmi = DateTime.Now;
            nota.NFe.infNFe.ide.tpNF = 1;
            nota.NFe.infNFe.ide.idDest = 1;
            nota.NFe.infNFe.ide.cMunFG = 1100114;
            nota.NFe.infNFe.ide.tpImp = 4;
            nota.NFe.infNFe.ide.tpEmis = 1;
            nota.NFe.infNFe.ide.cDV = 8;
            nota.NFe.infNFe.ide.tpAmb = 2;
            nota.NFe.infNFe.ide.finNFe = 1;
            nota.NFe.infNFe.ide.indFinal = 1;
            nota.NFe.infNFe.ide.indPres = 1;
            nota.NFe.infNFe.ide.procEmi = 0;
            nota.NFe.infNFe.ide.verProc = "1.0";

            nota.NFe.infNFe.emit = new nfeProcNFeInfNFeEmit();
            nota.NFe.infNFe.emit.CNPJ = 55555555555555;
            nota.NFe.infNFe.emit.xNome = "LOJA FAKE CONFECCOES";

            nota.NFe.infNFe.emit.enderEmit = new nfeProcNFeInfNFeEmitEnderEmit();
            nota.NFe.infNFe.emit.enderEmit.xLgr = "AVENIDA TESTE I";
            nota.NFe.infNFe.emit.enderEmit.nro = 1257;
            nota.NFe.infNFe.emit.enderEmit.xCpl = "COMERCIO";
            nota.NFe.infNFe.emit.enderEmit.xBairro = "BAIRRO";
            nota.NFe.infNFe.emit.enderEmit.cMun = 1100114;
            nota.NFe.infNFe.emit.enderEmit.xMun = "JARULANDIA";
            nota.NFe.infNFe.emit.enderEmit.UF = "RO";
            nota.NFe.infNFe.emit.enderEmit.CEP = 76590000;
            nota.NFe.infNFe.emit.enderEmit.cPais = 1058;
            nota.NFe.infNFe.emit.enderEmit.xPais = "BRASIL";
            nota.NFe.infNFe.emit.enderEmit.fone = 333333333;
            nota.NFe.infNFe.emit.IE = 2222222;
            nota.NFe.infNFe.emit.CRT = 1;

            nota.NFe.infNFe.dest = new nfeProcNFeInfNFeDest();
            nota.NFe.infNFe.dest.CPF = 98765432198;
            nota.NFe.infNFe.dest.xNome = "";

            nota.NFe.infNFe.dest.enderDest = new nfeProcNFeInfNFeDestEnderDest();
            nota.NFe.infNFe.dest.enderDest.xLgr = "";
            nota.NFe.infNFe.dest.enderDest.nro = 0;
            nota.NFe.infNFe.dest.enderDest.xCpl = "";
            nota.NFe.infNFe.dest.enderDest.xBairro = "";
            nota.NFe.infNFe.dest.enderDest.cMun = 0;
            nota.NFe.infNFe.dest.enderDest.xMun = "";
            nota.NFe.infNFe.dest.enderDest.UF = "";
            nota.NFe.infNFe.dest.enderDest.CEP = 0;
            nota.NFe.infNFe.dest.enderDest.cPais = 0;
            nota.NFe.infNFe.dest.enderDest.xPais = "";
            nota.NFe.infNFe.dest.enderDest.fone = 0;
            nota.NFe.infNFe.dest.indIEDest = 0;

            /*Aqui o problema ao instanciar a classe ide, tentei fazer a instancia usando a linha que está comentada abaixo e deu o mesmo erro*/
            //nota.NFe.infNFe.det = new nfeProcNFeInfNFeDet[1];
            nota.NFe.infNFe.det[1]= new nfeProcNFeInfNFeDet();
            nota.NFe.infNFe.det[0].nItem = 1;

            /*fim do campo com problemas*/

            XmlSerializer ser = new XmlSerializer(typeof(nfeProc));
            FileStream arquivo = new FileStream("xmls/serializado.xml",FileMode.OpenOrCreate);

            ser.Serialize(arquivo,nota);
            MessageBox.Show("Xml Gerado");
        }
        catch (Exception erro)
        {
            MessageBox.Show(erro.Message,"Erro ao gerar NFe");
        }
    }

Example NFe XML Link View or Download XML

Only instantiated the class det and assigns a value to the attribute nItem .

    
asked by anonymous 22.09.2016 / 01:22

2 answers

6

By analyzing your code, I believe the problem is when instantiating infNFe.det

Because before adding elements to Arrya you should instantiate it by stating its size

What you did

nota.NFe.infNFe.det[1]= new nfeProcNFeInfNFeDet();
nota.NFe.infNFe.det[0].nItem = 1;

How should it be

int tamanho = 1;
nota.NFe.infNFe.det = new TNFeInfNFeDet[tamanho];
int indice = 0;
nota.NFe.infNFe.det[indice]= new nfeProcNFeInfNFeDet();
nota.NFe.infNFe.det[indice].nItem = 1;

Here's a complete example of how I do using product list integration

#region Produtos
var produtos = NotaFiscalEletronicaBusiness2.PesquisarEstoque(nfeEntity.NFeId).OrderBy(a => a.EstoqueProdutoId).ToList();
nfe.infNFe.det = new TNFeInfNFeDet[produtos.Count()];
foreach (var produto in produtos)
{
    decimal valorVenda = produto.ValorVenda;
    decimal valorAcrescimo = Math.Abs(produto.ValorAcrescimo);

    if (produto.AcrescimoDesconto == false)
    {
        valorVenda = produto.ValorVenda + Math.Abs(produto.ValorAcrescimo) - Math.Abs(produto.ValorDesconto);
    }

    TNFeInfNFeDet infNfeDet = new TNFeInfNFeDet();
    infNfeDet.nItem = i.ToString();
    infNfeDet.prod = new TNFeInfNFeDetProd();
    infNfeDet.prod.cProd = produto.ProdutoId.ToString();
    if (produto.CodBarras == null)
        produto.CodBarras = "";
    infNfeDet.prod.cEAN = produto.CodBarras;

    infNfeDet.prod.xProd = produto.Descricao;

    infNfeDet.prod.NCM = produto.CodigoNCM;
    if (produto.CFOPNFe.HasValue)
        infNfeDet.prod.CFOP = GetCFOP(produto.CFOPNFe.Value);
    if (produto.UnidadeComercial != null)
        infNfeDet.prod.uCom = produto.UnidadeComercial.Trim();
    else infNfeDet.prod.uCom = "UN";
    infNfeDet.prod.qCom = Math.Abs(produto.Quantidade).ToString("#0.0000", CultureInfo.InvariantCulture);
    infNfeDet.prod.vUnCom = valorVenda.ToString("#0.0000", CultureInfo.InvariantCulture);

    var vProd = valorVenda * Math.Abs(produto.Quantidade);
    infNfeDet.prod.vProd = vProd.ToString("#0.00", CultureInfo.InvariantCulture);

    decimal vOutros = 0;
    if (produto.AcrescimoDesconto == true)
    {
        vOutros = valorAcrescimo * produto.QuantidadeAbs;
        if (vOutros > 0)
            infNfeDet.prod.vOutro = vOutros.ToString("#0.00", CultureInfo.InvariantCulture);
    }

    infNfeDet.prod.cEANTrib = produto.CodBarras;
    infNfeDet.prod.vUnTrib = valorVenda.ToString("#0.0000", CultureInfo.InvariantCulture);

    infNfeDet.prod.uTrib = infNfeDet.prod.uCom;
    infNfeDet.prod.qTrib = Math.Abs(produto.Quantidade).ToString("#0.0000", CultureInfo.InvariantCulture);

    decimal valorDesconto = 0;
    if (produto.AcrescimoDesconto == true)
    {
        valorDesconto = Math.Abs(produto.ValorDesconto * Math.Abs(produto.Quantidade));
        if (valorDesconto > 0)
            infNfeDet.prod.vDesc = valorDesconto.ToString("#0.00", CultureInfo.InvariantCulture);
    }
    infNfeDet.prod.indTot = TNFeInfNFeDetProdIndTot.Item1;

    TNFeInfNFeDetImpostoICMS icms = SetaIcms(ref vBC, ref vICMS, ref vST, ref vBCST, produto);

    TNFeInfNFeDetImpostoPIS pis = SetaPis();

    var estoqueProdutoIpi = Context.EstoqueProdutoIpi.FirstOrDefault(a => a.EstoqueProdutoIpiId == produto.EstoqueProdutoId);

    TIpi ipi = null;
    if (estoqueProdutoIpi != null)
    {

        ipi = new TIpi();

        if (!String.IsNullOrWhiteSpace(estoqueProdutoIpi.clEnq))
            ipi.clEnq = estoqueProdutoIpi.clEnq;

        if (!String.IsNullOrWhiteSpace(estoqueProdutoIpi.CNPJProd))
            ipi.CNPJProd = estoqueProdutoIpi.CNPJProd;

        if (!String.IsNullOrWhiteSpace(estoqueProdutoIpi.cSelo))
            ipi.cSelo = estoqueProdutoIpi.cSelo;

        if (estoqueProdutoIpi.qSelo.HasValue)
            ipi.qSelo = estoqueProdutoIpi.qSelo.Value.ToString();

        if (!String.IsNullOrWhiteSpace(estoqueProdutoIpi.cEnq))
            ipi.cEnq = estoqueProdutoIpi.cEnq;

        if (estoqueProdutoIpi.CST.StartsWith("IPITRIB"))
        {
            TIpiIPITrib ipiTrib = new TIpiIPITrib();

            switch (estoqueProdutoIpi.CST)
            {
                case "IPITRIB00":
                    ipiTrib.CST = TIpiIPITribCST.Item00;
                    break;

                case "IPITRIB49":
                    ipiTrib.CST = TIpiIPITribCST.Item49;
                    break;

                case "IPITRIB50":
                    ipiTrib.CST = TIpiIPITribCST.Item50;
                    break;

                case "IPITRIB99":
                    ipiTrib.CST = TIpiIPITribCST.Item99;
                    break;
            };

            //Percentual
            if (estoqueProdutoIpi.TipoCalculo.HasValue && estoqueProdutoIpi.TipoCalculo.Value == 0)
            {
                ipiTrib.Items = new string[2];
                ipiTrib.ItemsElementName = new ItemsChoiceType[2];
                if (estoqueProdutoIpi.vBC.HasValue)
                {
                    ipiTrib.Items[0] = estoqueProdutoIpi.vBC.Value.ToString("#0.00", CultureInfo.InvariantCulture);
                    ipiTrib.ItemsElementName[0] = ItemsChoiceType.vBC;
                }


                if (estoqueProdutoIpi.pIPI.HasValue)
                {
                    ipiTrib.Items[1] = estoqueProdutoIpi.pIPI.Value.ToString("#0.00", CultureInfo.InvariantCulture);
                    ipiTrib.ItemsElementName[1] = ItemsChoiceType.pIPI;
                }
            }
            //Valor
            else if (estoqueProdutoIpi.TipoCalculo.HasValue && estoqueProdutoIpi.TipoCalculo.Value == 1)
            {
                ipiTrib.Items = new string[2];
                ipiTrib.ItemsElementName = new ItemsChoiceType[2];

                if (estoqueProdutoIpi.qUnid.HasValue)
                {
                    ipiTrib.Items[0] = estoqueProdutoIpi.qUnid.Value.ToString("#0.0000", CultureInfo.InvariantCulture);
                    ipiTrib.ItemsElementName[0] = ItemsChoiceType.qUnid;
                }

                if (estoqueProdutoIpi.vUnid.HasValue)
                {
                    ipiTrib.Items[1] = estoqueProdutoIpi.vUnid.Value.ToString("#0.0000", CultureInfo.InvariantCulture);
                    ipiTrib.ItemsElementName[1] = ItemsChoiceType.vUnid;
                }
            }

            if (estoqueProdutoIpi.vIPI.HasValue)
            {
                ipiTrib.vIPI = estoqueProdutoIpi.vIPI.Value.ToString("#0.00", CultureInfo.InvariantCulture);
                vIPI += estoqueProdutoIpi.vIPI.Value;
            }

            ipi.Item = ipiTrib;

        }
        else if (estoqueProdutoIpi.CST.StartsWith("IPINT"))
        {
            TIpiIPINT ipiInt = new TIpiIPINT();
            switch (estoqueProdutoIpi.CST)
            {
                case "IPINT01": ipiInt.CST = TIpiIPINTCST.Item01; break;
                case "IPINT02": ipiInt.CST = TIpiIPINTCST.Item02; break;
                case "IPINT03": ipiInt.CST = TIpiIPINTCST.Item03; break;
                case "IPINT04": ipiInt.CST = TIpiIPINTCST.Item04; break;
                case "IPINT05": ipiInt.CST = TIpiIPINTCST.Item05; break;
                case "IPINT51": ipiInt.CST = TIpiIPINTCST.Item51; break;
                case "IPINT52": ipiInt.CST = TIpiIPINTCST.Item52; break;
                case "IPINT53": ipiInt.CST = TIpiIPINTCST.Item53; break;
                case "IPINT54": ipiInt.CST = TIpiIPINTCST.Item54; break;
                case "IPINT55": ipiInt.CST = TIpiIPINTCST.Item55; break;
            };

            ipi.Item = ipiInt;
        }
    }

    infNfeDet.imposto = new TNFeInfNFeDetImposto();
    if (infNfeDet.imposto.Items == null)
    {
        if (ipi != null)
            infNfeDet.imposto.Items = new object[2];
        else infNfeDet.imposto.Items = new object[1];
    }
    infNfeDet.imposto.Items[0] = icms;
    if (ipi != null)
        infNfeDet.imposto.Items[1] = ipi;

    infNfeDet.imposto.PIS = pis;
    infNfeDet.imposto.COFINS = new TNFeInfNFeDetImpostoCOFINS();
    infNfeDet.imposto.COFINS.Item = new TNFeInfNFeDetImpostoCOFINSCOFINSNT();
    (infNfeDet.imposto.COFINS.Item as TNFeInfNFeDetImpostoCOFINSCOFINSNT).CST = TNFeInfNFeDetImpostoCOFINSCOFINSNTCST.Item07;

    nfe.infNFe.det[j] = infNfeDet;
    j++;
    i++;

    valorTotal += (valorVenda * produto.QuantidadeAbs);
    nfeValorDesconto += valorDesconto;
    nfeVoutros += vOutros;
}
#endregion
    
23.09.2016 / 16:13
7

nota.NFe.infNFe.det expects a array of nfeProcNFeInfNFeDet a solution would be:

var det = new TNFeInfNFeDet
{
    nItem = "1",
    prod = new TNFeInfNFeDetProd()
    {
        xProd = "Nome produto",
        cProd = "123"
    },
    imposto = new TNFeInfNFeDetImposto(),
    infAdProd = ""
};
var det2 = new TNFeInfNFeDet
{
    nItem = "2",
    prod = new TNFeInfNFeDetProd()
    {
        xProd = "Nome produto 2",
        cProd = "123456"
    },
    imposto = new TNFeInfNFeDetImposto(),
    infAdProd = "nonono"
};
nota.det = new[] { det, det2 };
  

Result:

  

The class name is different but the principle is the same

    
22.09.2016 / 06:26