Subversion Repositories Integrator Subversion

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
414 espaco 1
/**
2
 *
3
 */
4
package br.com.swconsultoria.nfe.dom;
5
 
6
import br.com.swconsultoria.certificado.Certificado;
7
import br.com.swconsultoria.certificado.exception.CertificadoException;
8
import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum;
9
import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum;
10
import br.com.swconsultoria.nfe.util.ConstantesUtil;
11
import br.com.swconsultoria.nfe.util.ObjetoUtil;
12
 
13
import java.io.InputStream;
14
import java.lang.reflect.Field;
15
import java.nio.charset.Charset;
16
import java.nio.charset.StandardCharsets;
17
import java.time.ZoneId;
18
import java.util.logging.Level;
19
import java.util.logging.Logger;
20
 
21
/**
22
 * @author Samuel Oliveira
23
 * <p>
24
 * Responsável por iniciar as configurações das operações NF-e.
25
 * <p>
26
 * Para iniciar as configurações chame o método estático
27
 * iniciaConfiguracoes:<br>
28
 * {@code
29
 * ConfiguracoesIniciaisNfe.iniciaConfiguracoes(estado, ambiente, certificado, schemas);
30
 * }
31
 * @see ConfiguracoesNfe
32
 * @see ConfiguracoesWebNfe
33
 */
34
public class ConfiguracoesNfe {
35
 
36
    private EstadosEnum estado;
37
    private AmbienteEnum ambiente;
38
    private Certificado certificado;
39
    private String pastaSchemas;
40
    private Proxy proxy;
41
    private Integer timeout;
42
    private boolean contigenciaSVC;
43
    private boolean validacaoDocumento = true;
44
    private String arquivoWebService;
45
    private Integer retry;
46
    private InputStream cacert;
47
    private Charset encode;
48
    private ZoneId zoneId;
49
 
50
    /**
51
     * Este método recebe como parâmetro os dados necessários para iniciar a
52
     * comunicação de operações dos eventos da NF-e. Retorna uma instância dela
53
     * mesma.
54
     * Nessa inicializacao é usado o ZoneId padrao America/Sao_Paulo
55
     *
56
     * @param estado       enumeration Estados, UF do emitente.
57
     * @param ambiente     Enumeration AmbienteEnum
58
     * @param certificado  objeto Certificado
59
     * @param pastaSchemas local dos arquivo de schemas da NF-e.
60
     * @return ConfiguracoesIniciaisNfe
61
     * @see br.com.swconsultoria.certificado.Certificado
62
     * @see EstadosEnum
63
     */
64
    public static ConfiguracoesNfe criarConfiguracoes(EstadosEnum estado, AmbienteEnum ambiente, Certificado certificado, String pastaSchemas) throws CertificadoException {
65
        return criarConfiguracoes(estado,ambiente,certificado,pastaSchemas, ZoneId.of("America/Sao_Paulo"));
66
    }
67
 
68
    /**
69
     * Este método recebe como parâmetro os dados necessários para iniciar a
70
     * comunicação de operações dos eventos da NF-e. Retorna uma instância dela
71
     * mesma.
72
     *
73
     * @param estado       enumeration Estados, UF do emitente.
74
     * @param ambiente     Enumeration AmbienteEnum
75
     * @param certificado  objeto Certificado
76
     * @param pastaSchemas local dos arquivo de schemas da NF-e.
77
     * @param zoneId       Zona para configuracoes de data
78
     * @return ConfiguracoesIniciaisNfe
79
     * @see br.com.swconsultoria.certificado.Certificado
80
     * @see EstadosEnum
81
     */
82
    public static ConfiguracoesNfe criarConfiguracoes(EstadosEnum estado, AmbienteEnum ambiente, Certificado certificado, String pastaSchemas, ZoneId zoneId) throws CertificadoException {
83
 
84
        ConfiguracoesNfe configuracoesNfe = new ConfiguracoesNfe();
85
        configuracoesNfe.setEstado(ObjetoUtil.verifica(estado).orElseThrow(() -> new IllegalArgumentException("Estado não pode ser Nulo.")));
86
        configuracoesNfe.setAmbiente(ObjetoUtil.verifica(ambiente).orElseThrow(() -> new IllegalArgumentException("Ambiente não pode ser Nulo.")));
87
        configuracoesNfe.setCertificado(ObjetoUtil.verifica(certificado).orElseThrow(() -> new IllegalArgumentException("Certificado não pode ser Nulo.")));
88
        configuracoesNfe.setPastaSchemas(pastaSchemas);
89
        configuracoesNfe.setZoneId(ObjetoUtil.verifica(zoneId).orElseThrow(() -> new IllegalArgumentException("Zone ID não pode ser Nulo.")));
90
 
91
        /**
92
         * Para as versões Java até 11, Eu ainda seto o Encoding por que é permitido.
93
         * Para quem trabalha com Java 12+, Aconselhasse setar o Encoding :
94
         * -Dfile.encoding="UTF-8"
95
         * -Dsun.jnu.encoding="UTF-8"
96
         *
97
         */
98
        if (Integer.parseInt(System.getProperty("java.class.version").substring(0, 2)) < 56) {
99
            try {
100
                //Setando Encoding.
101
                System.setProperty("file.encoding", "UTF-8");
102
                Field charset = Charset.class.getDeclaredField("defaultCharset");
103
                charset.setAccessible(true);
104
                charset.set(null, null);
105
            } catch (NoSuchFieldException | IllegalAccessException e) {
106
                throw new CertificadoException("Erro ao setar Encoding.");
107
            }
108
        }
109
 
110
        if (Logger.getLogger("").isLoggable(Level.SEVERE)) {
111
            System.err.println("####################################################################");
112
            System.err.println("       Api Java Nfe - Versão 4.00.26 - 21/08/2023");
113
            if (Logger.getLogger("").isLoggable(Level.WARNING)) {
114
                System.err.println(" Samuel Olivera - samuel@swconsultoria.com.br ");
115
            }
116
            System.err.println(" Pasta Schemas: " + pastaSchemas);
117
            System.err.println(" Ambiente: " + (ambiente.equals(AmbienteEnum.PRODUCAO) ? "Produção" : "Homologação") + " - Estado: " + estado.getNome());
118
            System.err.println("####################################################################");
119
        }
120
        if (!certificado.isValido()) {
121
            throw new CertificadoException("Certificado Vencido/Inválido");
122
        }
123
        return configuracoesNfe;
124
    }
125
 
126
    /**
127
     * Retorna o local da pasta dos schemas da NF-e(.xsd)
128
     *
129
     * @return pastaSchemas
130
     */
131
    public String getPastaSchemas() {
132
        return pastaSchemas;
133
    }
134
 
135
    /**
136
     * Atribui uma string que representa o local da pasta dos schemas da NF-e
137
     * (.xsd)
138
     *
139
     * @param pastaSchemas
140
     */
141
    private void setPastaSchemas(String pastaSchemas) {
142
        this.pastaSchemas = pastaSchemas;
143
    }
144
 
145
    /**
146
     * Retorna um enuns que representa o ambiente de operações da NF-e.<br>
147
     *
148
     * @return ambiente
149
     */
150
    public AmbienteEnum getAmbiente() {
151
        return ambiente;
152
    }
153
 
154
    /**
155
     * Atribui uma String que representa o ambiente de operação da NF-e.<br>
156
     * Ex.:<br>
157
     * {@code
158
     * ConfiguracoesIniciaisNfe.iniciaConfiguracoes(
159
     * estado,
160
     * AmbienteEnum.HOMOLOGACAO,
161
     * certificado,
162
     * schemas);
163
     * }
164
     *
165
     * @param ambiente
166
     * @see ConstantesUtil
167
     */
168
    public void setAmbiente(AmbienteEnum ambiente) {
169
        this.ambiente = ambiente;
170
    }
171
 
172
    /**
173
     * Retorna o objeto Certificado.
174
     *
175
     * @return certificado
176
     * @see br.com.swconsultoria.certificado
177
     */
178
    public Certificado getCertificado() {
179
        return certificado;
180
    }
181
 
182
    /**
183
     * Atribui um objeto Certificado.
184
     *
185
     * @param certificado
186
     */
187
    private void setCertificado(Certificado certificado) {
188
        this.certificado = certificado;
189
    }
190
 
191
    /**
192
     * Retorna um valor booleano que representa se as operações de NF-e estão,
193
     * ou, não operando no modo de Contingência.
194
     *
195
     * @return contigenciaSCAN
196
     */
197
    public boolean isContigenciaSVC() {
198
        return contigenciaSVC;
199
    }
200
 
201
    /**
202
     * Atribui um valor para contigenciaSVC. Caso True, as operações da NF-e
203
     * funcionarão no modo de Contingência. <br>
204
     * Usar para situações em que não for possível estabelecer conexão com o
205
     * WebService SEFAZ Origem.
206
     *
207
     * @param contigenciaSVC
208
     */
209
    public void setContigenciaSVC(boolean contigenciaSVC) {
210
        this.contigenciaSVC = contigenciaSVC;
211
    }
212
 
213
    /**
214
     * Retorna um objeto Estado que representa o UF do emissor da NF-e.
215
     *
216
     * @return estado
217
     * @see EstadosEnum
218
     */
219
    public EstadosEnum getEstado() {
220
        return estado;
221
    }
222
 
223
    /**
224
     * Atribui um valor para o atribuito Estado.
225
     *
226
     * @param estado estado
227
     * @see EstadosEnum
228
     */
229
    public void setEstado(EstadosEnum estado) {
230
        this.estado = estado;
231
    }
232
 
233
    /**
234
     * Retorna o valor do atributo proxyUtil.
235
     *
236
     * @return proxyUtil
237
     * @see Proxy
238
     */
239
    public Proxy getProxy() {
240
        return proxy;
241
    }
242
 
243
    /**
244
     * Atribui um valor para o proxuUtil.
245
     *
246
     * @param proxy
247
     */
248
    public void setProxy(Proxy proxy) {
249
        this.proxy = proxy;
250
    }
251
 
252
    /**
253
     * Retorna o valor do atributo timeout.
254
     *
255
     * @return timeout
256
     */
257
    public Integer getTimeout() {
258
        return timeout;
259
    }
260
 
261
    /**
262
     * Atribui o valor de timeout.<br>
263
     * O timeout é o limite de tempo(em milisegundos) de comunicação com
264
     * WebService. Sugerido pelo manual do contribuinte: 30000.
265
     *
266
     * @param timeout
267
     */
268
    public void setTimeout(Integer timeout) {
269
        this.timeout = timeout;
270
    }
271
 
272
    /**
273
     * Retorna o valor da validacaoDocumento.
274
     *
275
     * @return validacaoDocumento
276
     */
277
    public boolean isValidacaoDocumento() {
278
        return validacaoDocumento;
279
    }
280
 
281
    /**
282
     * Atribui um valor para validacaoDocumento. Caso True, irá validar o
283
     * documento do emitente com o documento do certificado. <br>
284
     *
285
     * @param validacaoDocumento
286
     */
287
    public void setValidacaoDocumento(boolean validacaoDocumento) {
288
        this.validacaoDocumento = validacaoDocumento;
289
    }
290
 
291
    public String getArquivoWebService() {
292
        return arquivoWebService;
293
    }
294
 
295
    public void setArquivoWebService(String arquivoWebService) {
296
        this.arquivoWebService = arquivoWebService;
297
    }
298
 
299
    /**
300
     * Retorna o valor do atributo retry.
301
     *
302
     * @return
303
     */
304
    public Integer getRetry() {
305
        return retry;
306
    }
307
 
308
    /**
309
     * Permite informar um retry. O padrão é de 3.<br>
310
     * Ao definir um retry indicamos o valor a ser usado como um número de
311
     * tentativas para a conexão com WebService.
312
     *
313
     * @param retry
314
     */
315
    public void setRetry(Integer retry) {
316
        this.retry = retry;
317
    }
318
 
319
    public InputStream getCacert() {
320
        return cacert;
321
    }
322
 
323
    public void setCacert(InputStream cacert) {
324
        this.cacert = cacert;
325
    }
326
 
327
    /**
328
     * Recupera encode que será utilizado na geração do arquivo XML.
329
     *
330
     * @return
331
     */
332
    public Charset getEncode() {return encode;}
333
 
334
    /**
335
     * Altera o encode utilizado para criar o arquivo xml.<br>
336
     * Por padrão é utilizado o UTF-8 em caso de erro ou não ser
337
     * informado nada.
338
     *
339
     * @param encode
340
     */
341
    public void setEncode(Charset encode) {this.encode = encode;}
342
 
343
    /**
344
     * Passar encode via String para o xml.
345
     *
346
     * @param nomeEncode
347
     */
348
    public void setEncode(String nomeEncode) {
349
        if (nomeEncode != null && !nomeEncode.equals("")) {
350
            try {
351
                this.encode = Charset.forName(nomeEncode);
352
            } catch (Exception ex) {
353
                this.encode = StandardCharsets.UTF_8;
354
            }
355
        }
356
    }
357
 
358
    public ZoneId getZoneId() {
359
        return zoneId;
360
    }
361
 
362
    public void setZoneId(ZoneId zoneId) {
363
        this.zoneId = zoneId;
364
    }
365
}