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

wmixvideo / nfe / #9348

07 Jul 2026 02:20PM UTC coverage: 50.838% (+23.8%) from 26.996%
#9348

push

web-flow
Nt2020.005 (#1175)

* Implementação de serviço de recepção síncrono do MDF-e (MDFeRecepcaoSinc). Serviços Assíncronos serão desativados na data de 30 de Junho de 2024 conforme versa a NT 2024.001.

* Revert "Implementação de serviço de recepção síncrono do MDF-e (MDFeRecepcaoSinc). Serviços Assíncronos serão desativados na data de 30 de Junho de 2024 conforme versa a NT 2024.001."

This reverts commit d597f6919.

* Atualização dos schemas e campos conforme NT2023.004.

* Correção da Tag DFeReferenciado e adicionado validação para chave de acesso.

* Corrigindo a estrutura da Classe TCIBS - faltava o field vIBS.

Adiciondo static nas inner class para possibilitar a desserialização do xml do CT-e.

* Correção do set que deve ser um BigDecimal.

* Adequa campos nDI, nAdicao, nSeqAdic e nDraw à NT 2020.005 v1.21

Ajustes no grupo I01 (Declaração de Importação) do NFe 4.00 conforme
Nota Técnica 2020.005 v1.21 (seções 2.1.2, 2.1.8 e 3.2 do leiaute):

- nDI (I19): tamanho máximo alterado de 12 para 15 caracteres.
- nAdicao (I26): campo passa de obrigatório (1-1) para opcional (0-1),
  já que não deve ser preenchido no caso de DUImp.
- nSeqAdic (I27): tamanho máximo alterado de 3 para 5 dígitos.
- nDraw (I29a / I51 - detExport): campo deixa de ser numérico e passa
  a ser alfanumérico, com tamanho máximo de 20 caracteres (antes,
  numérico com até 11 dígitos).

Classes alteradas:
- NFNotaInfoItemProdutoDeclaracaoImportacao (nDI)
- NFNotaInfoItemProdutoDeclaracaoImportacaoAdicao (nAdicao, nSeqAdic, nDraw)
- NFNotaInfoItemDetalheExportacao (nDraw)
- DFIntegerValidador (novo método tamanho5)

Testes unitários correspondentes atualizados para refletir os novos
limites e a mudança de tipo do campo nDraw (BigInteger -> String).

---------

Co-authored-by: ediva <ediva@emsnote5>
Co-authored-by: Walter Portugal <walter@softlandsistemas.com.br>

10 of 10 new or added lines in 5 files covered. (100.0%)

2949 existing lines in 402 files now uncovered.

14927 of 29362 relevant lines covered (50.84%)

0.51 hits per line

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

0.0
/src/main/java/com/fincatto/documentofiscal/cte300/utils/CTeGeraChave.java
1
package com.fincatto.documentofiscal.cte300.utils;
2

3
import com.fincatto.documentofiscal.cte300.classes.nota.CTeNota;
4
import com.fincatto.documentofiscal.cte300.classes.os.CTeOS;
5
import org.apache.commons.lang3.StringUtils;
6

7
import java.time.ZonedDateTime;
8
import java.time.format.DateTimeFormatter;
9
import java.util.Random;
10

11
public class CTeGeraChave {
12
    
13
    private final CTeNota nota;
14
    private final CTeOS cteOS;
15

16
    public CTeGeraChave(final CTeNota nota) {
×
UNCOV
17
        this.nota = nota;
×
UNCOV
18
        this.cteOS = null;
×
19
    }
×
20

UNCOV
21
    public CTeGeraChave(final CTeOS cteOS) {
×
UNCOV
22
        this.nota = null;
×
UNCOV
23
        this.cteOS = cteOS;
×
24
    }
×
25
    
26
    public String geraCodigoRandomico() {
27
        long seed;
28
        if (nota != null) {
×
29
            seed = this.nota.getCteNotaInfo().getIdentificacao().getDataEmissao().toInstant().toEpochMilli();
×
30
        } else {
31
            seed = this.cteOS.getInfo().getIdentificacao().getDataEmissao().toInstant().toEpochMilli();
×
32
        }
UNCOV
33
        final Random random = new Random(seed);
×
34
        return StringUtils.leftPad(String.valueOf(random.nextInt(100000000)), 8, "0");
×
35
    }
36
    
37
    public String getChaveAcesso() {
UNCOV
38
        return String.format("%s%s", this.geraChaveAcessoSemDV(), this.getDV());
×
39
    }
40
    
41
    public Integer getDV() {
UNCOV
42
        final char[] valores = this.geraChaveAcessoSemDV().toCharArray();
×
43
        final int[] valoresInt = {2, 3, 4, 5, 6, 7, 8, 9};
×
44
        int indice = 0;
×
UNCOV
45
        int soma = 0;
×
46
        int valorTemp;
47
        int multTemp;
48
        for (int i = valores.length; i > 0; i--) {
×
49
            if (indice >= valoresInt.length) {
×
UNCOV
50
                indice = 0;
×
51
            }
52
    
53
            valorTemp = Integer.parseInt(String.valueOf(valores[i - 1]));
×
54
            multTemp = valoresInt[indice++];
×
55
            soma += valorTemp * multTemp;
×
56
        }
57
        final int dv = 11 - (soma % 11);
×
58
        return ((dv == 11) || (dv == 10)) ? 0 : dv;
×
59
    }
60
    
61
    private String geraChaveAcessoSemDV() {
62
        String codigoNumerico;
63
        String codigoUF;
64
        ZonedDateTime dataEmissao;
65
        String cnpj;
66
        String modelo;
67
        String serie;
68
        String numero;
69
        String tipoEmissao;
UNCOV
70
        if (nota != null) {
×
UNCOV
71
            codigoUF = this.nota.getCteNotaInfo().getIdentificacao().getCodigoUF().getCodigoIbge();
×
UNCOV
72
            dataEmissao = this.nota.getCteNotaInfo().getIdentificacao().getDataEmissao();
×
UNCOV
73
            cnpj = this.nota.getCteNotaInfo().getEmitente().getCnpj();
×
UNCOV
74
            modelo = this.nota.getCteNotaInfo().getIdentificacao().getModelo().getCodigo();
×
UNCOV
75
            serie = this.nota.getCteNotaInfo().getIdentificacao().getSerie().toString();
×
UNCOV
76
            numero = this.nota.getCteNotaInfo().getIdentificacao().getNumero().toString();
×
UNCOV
77
            tipoEmissao = this.nota.getCteNotaInfo().getIdentificacao().getTipoEmissao().getCodigo();
×
UNCOV
78
            codigoNumerico = this.nota.getCteNotaInfo().getIdentificacao().getCodigoNumerico();
×
79
        } else {
UNCOV
80
            codigoUF = this.cteOS.getInfo().getIdentificacao().getCodigoUF().getCodigoIbge();
×
UNCOV
81
            dataEmissao = this.cteOS.getInfo().getIdentificacao().getDataEmissao();
×
UNCOV
82
            cnpj = this.cteOS.getInfo().getEmitente().getCnpj();
×
UNCOV
83
            modelo = this.cteOS.getInfo().getIdentificacao().getModelo().getCodigo();
×
UNCOV
84
            serie = this.cteOS.getInfo().getIdentificacao().getSerie().toString();
×
UNCOV
85
            numero = this.cteOS.getInfo().getIdentificacao().getNumero().toString();
×
UNCOV
86
            tipoEmissao = this.cteOS.getInfo().getIdentificacao().getTipoEmissao().getCodigo();
×
UNCOV
87
            codigoNumerico = this.cteOS.getInfo().getIdentificacao().getCodigoNumerico();
×
88
        }
UNCOV
89
        if (StringUtils.isBlank(codigoNumerico)) {
×
UNCOV
90
            throw new IllegalStateException("Codigo numerico deve estar presente para gerar a chave de acesso");
×
91
        }
UNCOV
92
        return StringUtils.leftPad(codigoUF, 2, "0") + StringUtils.leftPad(DateTimeFormatter.ofPattern("yyMM").format(dataEmissao), 4, "0") + StringUtils.leftPad(cnpj, 14, "0") + StringUtils.leftPad(modelo, 2, "0") + StringUtils.leftPad(serie, 3, "0") + StringUtils.leftPad(numero, 9, "0") + StringUtils.leftPad(tipoEmissao, 1, "0") + StringUtils.leftPad(codigoNumerico, 8, "0");
×
93
    }
94
}
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

© 2026 Coveralls, Inc