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

wmixvideo / nfe / #9456

23 Jul 2026 08:27PM UTC coverage: 50.851% (-0.9%) from 51.794%
#9456

push

web-flow
Adiciona suporte ao CT-e Simplificado (tpCTe=5, NT 2024.002) (#1180)

* Adiciona suporte nativo ao CT-e Simplificado (tpCTe=5, NT 2024.002)
Implementa o Conhecimento de Transporte Eletrônico Simplificado (Ajuste
SINIEF 46/2023) como variante de modelo 57, seguindo o CT-e OS como molde
e a convenção de nomes = tags XML já usada no IBSCBS.
Classes de domínio (cte400/classes/simp/):
- CTeNotaSimp (raiz CTeSimp), CTeNotaSimpInfo, ...Identificacao, ...Tomador,
  ...Det (+ Comp, InfNFe, InfDocAnt, InfDocAntNFeParcial), ...Total
- Reutiliza emit, infModal, infCarga e imp do CT-e normal
- Raiz CTeSimp sem atributo versao (só infCte o possui)
Webservice e transporte:
- WSRecepcaoCTeSimp (assina infCte, GZip+Base64, síncrono sem lote)
- CTeRecepcaoSimpV4Stub — literais conferidos contra os WSDL reais de
  homologação de MT e SVRS (namespace, operação cteRecepcaoSimp, cteDadosMsg,
  cteRecepcaoSimpResult, soapAction)
- CTeSimpEnvioRetorno/...Dados e CTeSimpProcessado (cteSimpProc)
- Overload WSFacade.enviaCTe(CTeNotaSimp)
Autorizador e validação:
- CTAutorizador400.getCteRecepcaoSimp nos 8 autorizadores (produção +
  homologação); MT usa path atípico cte-ws/services/
- DFXMLValidador.validaNotaCteSimp400 (cteSimp_v4.00.xsd, RTC 1.14)
Teste:
- CTeNotaSimpTest faz round-trip serializa→valida contra o XSD; toda a
  estrutura de negócio valida (só falta Signature, aplicado no envio)

* Adiciona suporte nativo ao CT-e Simplificado (tpCTe=5, NT 2024.002)
Implementa o Conhecimento de Transporte Eletrônico Simplificado (Ajuste
SINIEF 46/2023) como variante de modelo 57, seguindo o CT-e OS como molde
e a convenção de nomes = tags XML já usada no IBSCBS.
Classes de domínio (cte400/classes/simp/):
- CTeNotaSimp (raiz CTeSimp), CTeNotaSimpInfo, ...Identificacao, ...Tomador,
  ...Det (+ Comp, InfNFe, InfDocAnt, InfDocAntNFeParcial), ...Total
- Reutiliza emit, infModal, infCarga e imp do CT-e normal
- Raiz CTeSimp sem atributo versao (só infCte o possui)
Webservice e transpor... (continued)

130 of 324 new or added lines in 15 files covered. (40.12%)

711 existing lines in 42 files now uncovered.

15094 of 29683 relevant lines covered (50.85%)

0.51 hits per line

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

97.44
/src/main/java/com/fincatto/documentofiscal/utils/DFUtils.java
1
package com.fincatto.documentofiscal.utils;
2

3
import java.util.Arrays;
4
import java.util.List;
5
import java.util.regex.Pattern;
6

UNCOV
7
public abstract class DFUtils {
×
8
    private static final Pattern SOMENTE_NUMEROS = Pattern.compile("\\d+");
1✔
9
    private static final Pattern CNPJ_PATTERN = Pattern.compile("^[0-9A-Z]{12}[0-9]{2}$");
1✔
10
    private static final Pattern CPF_PATTERN = Pattern.compile("^[0-9]{11}$");
1✔
11

12
    private static final List<String> CPFS_INVALIDOS = Arrays.asList("00000000000", "11111111111", "22222222222",
1✔
13
            "33333333333", "44444444444", "55555555555", "66666666666", "77777777777", "88888888888", "99999999999",
14
            "12345678909");
15

16
    /**
17
     * Verifica se o CNPJ informado eh valido. <br>
18
     * Nao verifica o tamanho e presume que este seja de 14 digidos e somente numeros.
19
     *
20
     * @param cnpj CNPJ a ser validado.
21
     * @return Se o CNPJ informado eh valido ou nao.
22
     */
23
    public static boolean isCnpjValido(final String cnpj) {
24
        if (cnpj == null || !CNPJ_PATTERN.matcher(cnpj.toUpperCase()).matches()) {
1✔
25
            return false;
1✔
26
        }
27

28
        final String cnpjNormalizado = cnpj.toUpperCase();
1✔
29
        if (cnpjNormalizado.chars().distinct().count() == 1) {
1✔
30
            return false;
1✔
31
        }
32

33
        final int primeiroDigito = calcularDigitoVerificadorCnpj(cnpjNormalizado, 12);
1✔
34
        final int segundoDigito = calcularDigitoVerificadorCnpj(cnpjNormalizado, 13);
1✔
35

36
        return primeiroDigito == Character.getNumericValue(cnpjNormalizado.charAt(12))
1✔
37
                && segundoDigito == Character.getNumericValue(cnpjNormalizado.charAt(13));
1✔
38
    }
39

40
    private static int calcularDigitoVerificadorCnpj(final String cnpj, final int quantidadePosicoes) {
41
        int soma = 0;
1✔
42
        int peso = 2;
1✔
43
        for (int i = quantidadePosicoes - 1; i >= 0; i--) {
1✔
44
            final int valor = cnpj.charAt(i) - 48;
1✔
45
            soma += valor * peso;
1✔
46
            peso = (peso == 9) ? 2 : peso + 1;
1✔
47
        }
48
        final int resto = soma % 11;
1✔
49

50
        return (resto < 2) ? 0 : 11 - resto;
1✔
51
    }
52

53
    /**
54
     * Verifica se o CPF informado eh valido. <br>
55
     * Nao verifica o tamanho e presume que este seja de 11 digidos e somente numeros.
56
     *
57
     * @param cpf CPF a ser validado.
58
     * @return Se o CPF informado eh valido ou nao.
59
     */
60
    public static boolean isCpfValido(final String cpf) {
61
        if (cpf == null || !CPF_PATTERN.matcher(cpf).matches()) {
1✔
62
            return false;
1✔
63
        }
64

65
        // verifica por falsos positivos
66
        if (CPFS_INVALIDOS.contains(cpf)) {
1✔
67
            return false;
1✔
68
        }
69

70
        int d1 = 0, d2 = 0;
1✔
71
        for (int i = 1; i < 10; i++) {
1✔
72
            final int digitoCPF = Integer.parseInt(cpf.substring(i - 1, i));
1✔
73

74
            // multiplique a ultima casa por 2 a seguinte por 3 a seguinte por 4 e assim por diante
75
            d1 += (11 - i) * digitoCPF;
1✔
76

77
            // para o segundo digito repita o procedimento incluindo o primeiro digito calculado no passo anterior
78
            d2 += (12 - i) * digitoCPF;
1✔
79
        }
80

81
        // primeiro resto da divisao por 11
82
        int resto = d1 % 11;
1✔
83

84
        // se o resultado for 0 ou 1 o digito eh 0 caso contrario o digito eh 11 menos o resultado anterior
85
        final int digito1 = resto < 2 ? 0 : 11 - resto;
1✔
86

87
        // segundo resto da divisao por 11
88
        resto = (d2 + (2 * digito1)) % 11;
1✔
89
        // se o resultado for 0 ou 1 o digito eh 0 caso contrario o digito eh 11 menos o resultado anterior
90
        final int digito2 = resto < 2 ? 0 : 11 - resto;
1✔
91

92
        // digito verificador do CPF que estah sendo validado
93
        final String nDigVerific = cpf.substring(cpf.length() - 2);
1✔
94

95
        // concatenando o primeiro resto com o segundo
96
        final String nDigResult = String.valueOf(digito1) + digito2;
1✔
97

98
        // comparar o digito verificador do cpf com o primeiro resto + o segundo resto
99
        return nDigVerific.equals(nDigResult);
1✔
100
    }
101

102
    /**
103
     * Indica se a String informada é formada por somente caracteres numericos.
104
     * @param str String a ser verificada
105
     * @return Se a String é numerica.
106
     */
107
    public static boolean isNumerico(final String str) {
108
        return str != null && SOMENTE_NUMEROS.matcher(str).matches();
1✔
109
    }
110
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc