• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

wmixvideo / nfe / #6266

21 Mar 2025 11:46AM UTC coverage: 52.671% (+25.7%) from 26.996%
#6266

push

luciano.antunes
Nota Fiscal Fácil

0 of 21 new or added lines in 2 files covered. (0.0%)

2924 existing lines in 401 files now uncovered.

14002 of 26584 relevant lines covered (52.67%)

0.53 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

83.33
/src/main/java/com/fincatto/documentofiscal/nfe400/utils/NFGeraQRCode.java
1
package com.fincatto.documentofiscal.nfe400.utils;
2

3
import com.fincatto.documentofiscal.DFAmbiente;
4
import com.fincatto.documentofiscal.DFUnidadeFederativa;
5
import com.fincatto.documentofiscal.nfe.NFeConfig;
6
import com.fincatto.documentofiscal.nfe400.classes.nota.NFNota;
7
import org.apache.commons.lang3.StringUtils;
8

9
import java.math.BigInteger;
10
import java.nio.charset.Charset;
11
import java.security.MessageDigest;
12
import java.security.NoSuchAlgorithmException;
13
import java.time.ZonedDateTime;
14
import java.time.format.DateTimeFormatter;
15

16
public class NFGeraQRCode {
17

18
    private final NFNota nota;
19
    private final NFeConfig config;
20

21
    public NFGeraQRCode(final NFNota nota, final NFeConfig config) {
1✔
22
        this.nota = nota;
1✔
23
        this.config = config;
1✔
24
    }
1✔
25
    
26
    public String getQRCodev2() throws NoSuchAlgorithmException {
27
        String url = this.config.getAmbiente().equals(DFAmbiente.PRODUCAO) ? this.nota.getInfo().getIdentificacao().getUf().getQrCodeProducao() : this.nota.getInfo().getIdentificacao().getUf().getQrCodeHomologacao();
1✔
28
        
29
        if (StringUtils.isBlank(url)) {
1✔
UNCOV
30
            throw new IllegalArgumentException("URL para consulta do QRCode nao informada para uf " + this.nota.getInfo().getIdentificacao().getUf() + "!");
×
31
        }
32
        if (StringUtils.isBlank(this.config.getCodigoSegurancaContribuinte())) {
1✔
UNCOV
33
            throw new IllegalArgumentException("CSC nao informado nas configuracoes!");
×
34
        }
35
        if ((this.config.getCodigoSegurancaContribuinteID() == null) || (this.config.getCodigoSegurancaContribuinteID() == 0)) {
1✔
UNCOV
36
            throw new IllegalArgumentException("IdCSC nao informado nas configuracoes!");
×
37
        }
38
        
39
        final StringBuilder parametros = new StringBuilder();
1✔
40
        parametros.append(this.nota.getInfo().getChaveAcesso()).append("|"); // Chave de Acesso da NFC-e
1✔
41
        parametros.append("2").append("|"); // Versao do QRCode
1✔
42
        parametros.append(this.config.getAmbiente().getCodigo()).append("|");
1✔
43
        parametros.append(this.config.getCodigoSegurancaContribuinteID());
1✔
44
        
45
        return url.concat("?p=").concat(parametros.toString().concat("|").concat(StringUtils.upperCase(NFGeraQRCode.createHash(parametros.toString(), this.config.getCodigoSegurancaContribuinte()))));
1✔
46
    }
47

48
    public String getQRCode() throws NoSuchAlgorithmException {
49
        String url = this.config.getAmbiente().equals(DFAmbiente.PRODUCAO) ? this.nota.getInfo().getIdentificacao().getUf().getQrCodeProducao() : this.nota.getInfo().getIdentificacao().getUf().getQrCodeHomologacao();
1✔
50

51
        /* FIXME TODO Workaround para corrigir erro :
52
         *<cStat>395</cStat><xMotivo>Endereco do site da UF da Consulta via QR-Code diverge do previsto. Novo endereco:http://www.fazenda.pr.gov.br/nfce/qrcode</xMotivo>
53
         * corrigir em DFUnidadeFederativa quando a URL da versao 3.10 do PR for desabilitada.
54
         */
55
        if (this.nota.getInfo().getIdentificacao().getUf().equals(DFUnidadeFederativa.PR) && this.nota.getInfo().getVersao().equals("4.00")) {
1✔
UNCOV
56
            url = "http://www.fazenda.pr.gov.br/nfce/qrcode";
×
57
        }
58

59
        if (StringUtils.isBlank(url)) {
1✔
UNCOV
60
            throw new IllegalArgumentException("URL para consulta do QRCode nao informada para uf " + this.nota.getInfo().getIdentificacao().getUf() + "!");
×
61
        }
62
        if (StringUtils.isBlank(this.config.getCodigoSegurancaContribuinte())) {
1✔
UNCOV
63
            throw new IllegalArgumentException("CSC nao informado nas configuracoes!");
×
64
        }
65
        if ((this.config.getCodigoSegurancaContribuinteID() == null) || (this.config.getCodigoSegurancaContribuinteID() == 0)) {
1✔
UNCOV
66
            throw new IllegalArgumentException("IdCSC nao informado nas configuracoes!");
×
67
        }
68

69
        final ZonedDateTime dt = this.nota.getInfo().getIdentificacao().getDataHoraEmissao();
1✔
70
        final String dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX").format(dt);
1✔
71

72
        final String cpfj = this.nota.getInfo().getDestinatario() == null ? null : this.nota.getInfo().getDestinatario().getCpfj();
1✔
73

74
        // Monta os parametros do qrcode: https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx?chNFe=43160493062776000117650010000012891000012891&nVersao=100&tpAmb=1&cDest=00400437031&dhEmi=323031362d30342d31355431363a32313a35312d30333a3030&vNF=88.00&vICMS=0.00&digVal=787971704e2f7771446134687070486e6b6b6c34705a39536a36633d&cIdToken=000001&cHashQRCode=852E4B5BC4EB9BF65484AEEBB06BE4A65F0E8E13
75
        final StringBuilder parametros = new StringBuilder();
1✔
76
        parametros.append("chNFe=").append(this.nota.getInfo().getChaveAcesso()).append("&"); // Chave de Acesso da NFC-e
1✔
77
        parametros.append("nVersao=100").append("&"); // Versao do QRCode
1✔
78
        parametros.append("tpAmb=").append(this.config.getAmbiente().getCodigo()).append("&");
1✔
79

80
        if (StringUtils.isNotBlank(cpfj)) {
1✔
81
            parametros.append("cDest=").append(cpfj).append("&");// Documento de Identificacao do Consumidor (CNPJ/CPF/ID Estrangeiro)
1✔
82
        }
83

84
        parametros.append("dhEmi=").append(NFGeraQRCode.toHex(dtf)).append("&");// Data e Hora de Emissão da NFC-e
1✔
85
        parametros.append("vNF=").append(this.nota.getInfo().getTotal().getIcmsTotal().getValorTotalNFe()).append("&"); // Valor Total da NFC-e
1✔
86
        parametros.append("vICMS=").append(this.nota.getInfo().getTotal().getIcmsTotal().getValorTotalICMS()).append("&");// NFC-e Valor Total ICMS na NFC-e
1✔
87
        parametros.append("digVal=").append(NFGeraQRCode.toHex(this.nota.getAssinatura().getSignedInfo().getReference().getDigestValue())).append("&");// Digest Value da NFC-e
1✔
88
        parametros.append("cIdToken=").append(String.format("%06d", this.config.getCodigoSegurancaContribuinteID()));// Identificador do CSC – Codigo de Seguranca do Contribuinte no Banco de Dados da SEFAZ
1✔
89

90
        // retorna a url do qrcode
91
        return url + "?" + parametros.toString() + "&cHashQRCode=" + NFGeraQRCode.createHash(parametros.toString(), this.config.getCodigoSegurancaContribuinte());
1✔
92
    }
93

94
    public static String createHash(final String campos, final String csc) throws NoSuchAlgorithmException {
95
        return NFGeraQRCode.sha1(campos + csc);
1✔
96
    }
97

98
    public static String toHex(final String arg) {
99
        return String.format("%040x", new BigInteger(1, arg.getBytes(Charset.forName("UTF-8"))));
1✔
100
    }
101

102
    public static String sha1(final String input) throws NoSuchAlgorithmException {
103
        final StringBuilder sb = new StringBuilder();
1✔
104
        for (final byte element : MessageDigest.getInstance("SHA1").digest(input.getBytes(Charset.forName("UTF-8")))) {
1✔
105
            sb.append(Integer.toString((element & 0xff) + 0x100, 16).substring(1));
1✔
106
        }
107
        return sb.toString();
1✔
108
    }
109
    
110
    public String urlConsultaChaveAcesso() {
UNCOV
111
        return this.config.getAmbiente().equals(DFAmbiente.PRODUCAO) ? this.nota.getInfo().getIdentificacao().getUf().getConsultaChaveAcessoProducao() : this.nota.getInfo().getIdentificacao().getUf().getConsultaChaveAcessoHomologacao();
×
112
    }
113
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc