Skip to content

Commit 7e2a91b

Browse files
authored
Merge pull request #71 from hhunterx/master
Suporte a QR-CODE versão 3.0 da NT2025.001
2 parents eed6b19 + 11d6094 commit 7e2a91b

File tree

2 files changed

+85
-10
lines changed

2 files changed

+85
-10
lines changed

NFe.Utils/Enums.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ public enum VersaoQrCode
1717
QrCodeVersao1 = 100,
1818

1919
[Description("Versão 2.0 do QR-Code")]
20-
QrCodeVersao2 = 2
20+
QrCodeVersao2 = 2,
21+
22+
[Description("Versão 3.0 do QR-Code")]
23+
QrCodeVersao3 = 3,
24+
2125
}
2226
}

NFe.Utils/InformacoesSuplementares/ExtinfNFeSupl.cs

Lines changed: 80 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ private static List<EnderecoConsultaPublicaNfce> CarregarUrls()
9494
{Estado.RR, versao3E4, "https://www.sefaz.rr.gov.br/nfce/servlet/qrcode"},
9595
{Estado.MG, versao3E4, "https://portalsped.fazenda.mg.gov.br/portalnfce/sistema/qrcode.xhtml"}
9696
};
97-
adicionarUrls(TipoAmbiente.Producao, TipoUrlConsultaPublica.UrlQrCode, new[] { VersaoQrCode.QrCodeVersao1, VersaoQrCode.QrCodeVersao2 }, urlsQrCodeProducaoQrCode1E2);
97+
adicionarUrls(TipoAmbiente.Producao, TipoUrlConsultaPublica.UrlQrCode, new[] { VersaoQrCode.QrCodeVersao1, VersaoQrCode.QrCodeVersao2, VersaoQrCode.QrCodeVersao3 }, urlsQrCodeProducaoQrCode1E2);
9898

9999
var urlsQrCodeProducaoQrCode1 = new TupleList<Estado, VersaoServico[], string>
100100
{
@@ -116,7 +116,7 @@ private static List<EnderecoConsultaPublicaNfce> CarregarUrls()
116116
{Estado.TO, versao4, "http://apps.sefaz.to.gov.br/portal-nfce/qrcodeNFCe"},
117117
{Estado.SC, versao4, "https://sat.sef.sc.gov.br/nfce/consulta"}
118118
};
119-
adicionarUrls(TipoAmbiente.Producao, TipoUrlConsultaPublica.UrlQrCode, new[] { VersaoQrCode.QrCodeVersao2 }, urlsQrCodeProducaoQrCode2);
119+
adicionarUrls(TipoAmbiente.Producao, TipoUrlConsultaPublica.UrlQrCode, new[] { VersaoQrCode.QrCodeVersao2, VersaoQrCode.QrCodeVersao3 }, urlsQrCodeProducaoQrCode2);
120120

121121
#endregion
122122

@@ -148,7 +148,7 @@ private static List<EnderecoConsultaPublicaNfce> CarregarUrls()
148148
{Estado.TO, versao3E4, "http://apps.sefaz.to.gov.br/portal-nfce-homologacao/qrcodeNFCe"},
149149
{Estado.MG, versao3E4, "https://portalsped.fazenda.mg.gov.br/portalnfce/sistema/qrcode.xhtml"}
150150
};
151-
adicionarUrls(TipoAmbiente.Homologacao, TipoUrlConsultaPublica.UrlQrCode, new[] { VersaoQrCode.QrCodeVersao1, VersaoQrCode.QrCodeVersao2 }, urlsQrCodeHomologacaoQrCode1E2);
151+
adicionarUrls(TipoAmbiente.Homologacao, TipoUrlConsultaPublica.UrlQrCode, new[] { VersaoQrCode.QrCodeVersao1, VersaoQrCode.QrCodeVersao2, VersaoQrCode.QrCodeVersao3 }, urlsQrCodeHomologacaoQrCode1E2);
152152

153153
var urlsQrCodeHomologacaoQrCode1 = new TupleList<Estado, VersaoServico[], string>
154154
{
@@ -166,7 +166,7 @@ private static List<EnderecoConsultaPublicaNfce> CarregarUrls()
166166
{Estado.SP, versao4, "https://www.homologacao.nfce.fazenda.sp.gov.br/qrcode"},
167167
{Estado.SC, versao4, "https://hom.sat.sef.sc.gov.br/nfce/consulta"},
168168
};
169-
adicionarUrls(TipoAmbiente.Homologacao, TipoUrlConsultaPublica.UrlQrCode, new[] { VersaoQrCode.QrCodeVersao2 }, urlsQrCodeHomologacaoQrCode2);
169+
adicionarUrls(TipoAmbiente.Homologacao, TipoUrlConsultaPublica.UrlQrCode, new[] { VersaoQrCode.QrCodeVersao2, VersaoQrCode.QrCodeVersao3 }, urlsQrCodeHomologacaoQrCode2);
170170

171171
#endregion
172172

@@ -273,8 +273,8 @@ private static List<EnderecoConsultaPublicaNfce> CarregarUrls()
273273
{Estado.RR, versao3E4, "www.sefaz.rr.gov.br/nfce/consulta"}
274274
};
275275

276-
adicionarUrls(TipoAmbiente.Homologacao, TipoUrlConsultaPublica.UrlConsulta, new[] { VersaoQrCode.QrCodeVersao2 }, urlsConsultaHomologacaoEProducao2);
277-
adicionarUrls(TipoAmbiente.Producao, TipoUrlConsultaPublica.UrlConsulta, new[] { VersaoQrCode.QrCodeVersao2 }, urlsConsultaHomologacaoEProducao2);
276+
adicionarUrls(TipoAmbiente.Homologacao, TipoUrlConsultaPublica.UrlConsulta, new[] { VersaoQrCode.QrCodeVersao2, VersaoQrCode.QrCodeVersao3 }, urlsConsultaHomologacaoEProducao2);
277+
adicionarUrls(TipoAmbiente.Producao, TipoUrlConsultaPublica.UrlConsulta, new[] { VersaoQrCode.QrCodeVersao2, VersaoQrCode.QrCodeVersao3 }, urlsConsultaHomologacaoEProducao2);
278278

279279
#endregion
280280

@@ -293,7 +293,7 @@ private static List<EnderecoConsultaPublicaNfce> CarregarUrls()
293293
{Estado.SC, versao3E4, "https://sat.sef.sc.gov.br/nfce/consulta" }
294294
};
295295

296-
adicionarUrls(TipoAmbiente.Producao, TipoUrlConsultaPublica.UrlConsulta, new[] { VersaoQrCode.QrCodeVersao2 }, urlsConsultaProducao2);
296+
adicionarUrls(TipoAmbiente.Producao, TipoUrlConsultaPublica.UrlConsulta, new[] { VersaoQrCode.QrCodeVersao2, VersaoQrCode.QrCodeVersao3 }, urlsConsultaProducao2);
297297

298298
#endregion
299299

@@ -312,7 +312,7 @@ private static List<EnderecoConsultaPublicaNfce> CarregarUrls()
312312
{Estado.SC, versao3E4, "https://hom.sat.sef.sc.gov.br/nfce/consulta" }
313313
};
314314

315-
adicionarUrls(TipoAmbiente.Homologacao, TipoUrlConsultaPublica.UrlConsulta, new[] { VersaoQrCode.QrCodeVersao2 }, urlsConsultaHomologacao2);
315+
adicionarUrls(TipoAmbiente.Homologacao, TipoUrlConsultaPublica.UrlConsulta, new[] { VersaoQrCode.QrCodeVersao2, VersaoQrCode.QrCodeVersao3 }, urlsConsultaHomologacao2);
316316

317317
#endregion
318318

@@ -372,6 +372,8 @@ public static string ObterUrlQrCode(this infNFeSupl infNFeSupl, Classes.NFe nfe,
372372
return ObterUrlQrCode1(infNFeSupl, nfe, cIdToken, csc, versaoServico);
373373
case VersaoQrCode.QrCodeVersao2:
374374
return ObterUrlQrCode2(infNFeSupl, nfe, cIdToken, csc, versaoServico);
375+
case VersaoQrCode.QrCodeVersao3:
376+
return ObterUrlQrCode3(infNFeSupl, nfe, versaoServico);
375377
default:
376378
throw new ArgumentOutOfRangeException("versaoQrCode", versaoQrCode, null);
377379
}
@@ -397,7 +399,7 @@ private static string ObterUrlQrCode1(infNFeSupl infNFeSupl, Classes.NFe nfe, st
397399
if (nfe.infNFe.dest != null)
398400
cDest = "&cDest=" + nfe.infNFe.dest.CPF + nfe.infNFe.dest.CNPJ + nfe.infNFe.dest.idEstrangeiro;
399401

400-
//Passo 3: Substituir os valores (dhEmi e digVal) nos parâmetros;
402+
//Passo 3: Substituir os valores ("dhEmi" e "digVal") nos parâmetros;
401403
var dadosBase =
402404
"chNFe=" + nfe.infNFe.Id.Substring(3) +
403405
"&nVersao=100" +
@@ -486,5 +488,74 @@ public static string ObterUrlQrCode2ComParametro(this infNFeSupl infNFeSupl, Tip
486488
url += parametro;
487489
return url;
488490
}
491+
492+
/// <summary>
493+
/// Obtém a URL para uso no QR-Code, versão 3.0 - leiaute 4.00+
494+
/// </summary>
495+
private static string ObterUrlQrCode3(infNFeSupl infNFeSupl, Classes.NFe nfe, VersaoServico versaoServico)
496+
{
497+
const string pipe = "|";
498+
499+
// Chave de Acesso da NFC-e
500+
var chave = nfe.infNFe.Id.Substring(3);
501+
// Versão do QR-Code
502+
var versaoQrCode = 3;
503+
// Identificação do Ambiente (1 – Produção, 2 – Homologação)
504+
var ambiente = (int)nfe.infNFe.ide.tpAmb;
505+
506+
// Monta os parâmetros base
507+
var dadosBase = string.Concat(
508+
chave, pipe,
509+
versaoQrCode, pipe,
510+
ambiente
511+
);
512+
513+
if (nfe.infNFe.ide.tpEmis == TipoEmissao.teOffLine)
514+
{
515+
// Dia da emissão
516+
var diaEmi = nfe.infNFe.ide.dhEmi.Day.ToString("D2");
517+
// Valor total da NFC-e
518+
var valorNfce = nfe.infNFe.total.ICMSTot.vNF.ToString("0.00").Replace(',', '.');
519+
520+
// tp_idDest e idDest
521+
string tp_idDest = string.Empty;
522+
string idDest = string.Empty;
523+
if (nfe.infNFe.dest != null)
524+
{
525+
if (!string.IsNullOrEmpty(nfe.infNFe.dest.idEstrangeiro))
526+
{
527+
tp_idDest = "3";
528+
idDest = nfe.infNFe.dest.idEstrangeiro.Trim();
529+
}
530+
else if (!string.IsNullOrEmpty(nfe.infNFe.dest.CPF) && nfe.infNFe.dest.CPF.Length == 11)
531+
{
532+
tp_idDest = "2";
533+
idDest = nfe.infNFe.dest.CPF.Replace(".", "").Replace("/", "").Replace("-", "").Trim();
534+
}
535+
else if (!string.IsNullOrEmpty(nfe.infNFe.dest.CNPJ) && nfe.infNFe.dest.CNPJ.Length == 14)
536+
{
537+
tp_idDest = "1";
538+
idDest = nfe.infNFe.dest.CNPJ.Replace(".", "").Replace("/", "").Replace("-", "").Trim();
539+
}
540+
}
541+
542+
// Monta os parâmetros base
543+
dadosBase = string.Concat(dadosBase, pipe,
544+
diaEmi, pipe,
545+
valorNfce, pipe,
546+
tp_idDest, pipe,
547+
idDest
548+
);
549+
550+
// Assinatura SHA-1 dos parâmetros + CSC
551+
var assinatura = Conversao.ObterHexSha1DeString(dadosBase);
552+
dadosBase = string.Concat(dadosBase, pipe, assinatura);
553+
}
554+
555+
var url = ObterUrlQrCode2ComParametro(infNFeSupl, nfe.infNFe.ide.tpAmb, nfe.infNFe.ide.cUF, versaoServico);
556+
557+
// Monta a URL base
558+
return string.Concat(url, "?p=", dadosBase);
559+
}
489560
}
490561
}

0 commit comments

Comments
 (0)