@@ -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