Subversion Repositories Integrator Subversion

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
414 espaco 1
/**
2
 *
3
 */
4
package br.com.swconsultoria.nfe.util;
5
 
6
import br.com.swconsultoria.nfe.exception.NfeException;
7
import br.com.swconsultoria.nfe.schema.consCad.TConsCad;
8
import br.com.swconsultoria.nfe.schema.distdfeint.DistDFeInt;
9
import br.com.swconsultoria.nfe.schema.envEventoCancNFe.TEnvEvento;
10
import br.com.swconsultoria.nfe.schema.envEventoCancNFe.TRetEnvEvento;
11
import br.com.swconsultoria.nfe.schema_4.consReciNFe.TConsReciNFe;
12
import br.com.swconsultoria.nfe.schema_4.consSitNFe.TConsSitNFe;
13
import br.com.swconsultoria.nfe.schema_4.consStatServ.TConsStatServ;
14
import br.com.swconsultoria.nfe.schema_4.enviNFe.*;
15
import br.com.swconsultoria.nfe.schema_4.inutNFe.TInutNFe;
16
import br.com.swconsultoria.nfe.schema_4.inutNFe.TProcInutNFe;
17
import br.com.swconsultoria.nfe.schema_4.inutNFe.TRetInutNFe;
18
import br.com.swconsultoria.nfe.schema_4.retConsSitNFe.TRetConsSitNFe;
19
import lombok.extern.java.Log;
20
 
21
import javax.xml.bind.*;
22
import javax.xml.datatype.DatatypeConfigurationException;
23
import javax.xml.datatype.DatatypeConstants;
24
import javax.xml.datatype.DatatypeFactory;
25
import javax.xml.datatype.XMLGregorianCalendar;
26
import javax.xml.namespace.QName;
27
import javax.xml.transform.stream.StreamSource;
28
import java.io.*;
29
import java.nio.charset.Charset;
30
import java.nio.file.Files;
31
import java.nio.file.Paths;
32
import java.security.InvalidParameterException;
33
import java.security.MessageDigest;
34
import java.security.NoSuchAlgorithmException;
35
import java.time.LocalDateTime;
36
import java.time.ZoneId;
37
import java.util.Base64;
38
import java.util.GregorianCalendar;
39
import java.util.List;
40
import java.util.StringJoiner;
41
import java.util.zip.GZIPInputStream;
42
 
43
/**
44
 * Classe Responsavel por Metodos referentes ao XML
45
 *
46
 * @author Samuel Oliveira
47
 */
48
@Log
49
public class XmlNfeUtil {
50
 
51
    private static final String STATUS = "TConsStatServ";
52
    private static final String SITUACAO_NFE = "TConsSitNFe";
53
    private static final String ENVIO_NFE = "TEnviNFe";
54
    private static final String DIST_DFE = "DistDFeInt";
55
    private static final String INUTILIZACAO = "TInutNFe";
56
    private static final String NFEPROC = "TNfeProc";
57
    private static final String NFE = "TNFe";
58
    private static final String EVENTO = "TEnvEvento";
59
    private static final String TPROCEVENTO = "TProcEvento";
60
    private static final String TCONSRECINFE = "TConsReciNFe";
61
    private static final String TCONS_CAD = "TConsCad";
62
    private static final String TPROCINUT = "TProcInutNFe";
63
    private static final String RETORNO_ENVIO = "TRetEnviNFe";
64
    private static final String SITUACAO_NFE_RET = "TRetConsSitNFe";
65
    private static final String RET_RECIBO_NFE = "TRetConsReciNFe";
66
    private static final String RET_STATUS_SERVICO = "TRetConsStatServ";
67
    private static final String RET_CONS_CAD = "TRetConsCad";
68
 
69
    private static final String RET_ENV_EVENTO = "TRetEnvEvento";
70
 
71
    private static final String RET_INUT_NFE = "TRetInutNFe";
72
 
73
    private static final String TPROCCANCELAR = "br.com.swconsultoria.nfe.schema.envEventoCancNFe.TProcEvento";
74
    private static final String TPROCATORINTERESSADO = "br.com.swconsultoria.nfe.schema.envEventoAtorInteressado.TProcEvento";
75
    private static final String TPROCCANCELARSUBST = "br.com.swconsultoria.nfe.schema.envEventoCancSubst.TProcEvento";
76
    private static final String TPROCCCE = "br.com.swconsultoria.nfe.schema.envcce.TProcEvento";
77
    private static final String TPROCEPEC = "br.com.swconsultoria.nfe.schema.envEpec.TProcEvento";
78
    private static final String TPROCMAN = "br.com.swconsultoria.nfe.schema.envConfRecebto.TProcEvento";
79
 
80
    private static final String TProtNFe = "TProtNFe";
81
    private static final String TProtEnvi = "br.com.swconsultoria.nfe.schema_4.enviNFe.TProtNFe";
82
    private static final String TProtCons = "br.com.swconsultoria.nfe.schema_4.retConsSitNFe.TProtNFe";
83
    private static final String TProtReci = "br.com.swconsultoria.nfe.schema_4.retConsReciNFe.TProtNFe";
84
 
85
    private static final String CANCELAR = "br.com.swconsultoria.nfe.schema.envEventoCancNFe.TEnvEvento";
86
    private static final String ATOR_INTERESSADO = "br.com.swconsultoria.nfe.schema.envEventoAtorInteressado.TEnvEvento";
87
    private static final String CANCELAR_SUBSTITUICAO = "br.com.swconsultoria.nfe.schema.envEventoCancSubst.TEnvEvento";
88
    private static final String CCE = "br.com.swconsultoria.nfe.schema.envcce.TEnvEvento";
89
    private static final String EPEC = "br.com.swconsultoria.nfe.schema.envEpec.TEnvEvento";
90
    private static final String MANIFESTAR = "br.com.swconsultoria.nfe.schema.envConfRecebto.TEnvEvento";
91
 
92
    private static final String RET_CANCELAR = "br.com.swconsultoria.nfe.schema.envEventoCancNFe.TRetEnvEvento";
93
    private static final String RET_ATOR_INTERESSADO = "br.com.swconsultoria.nfe.schema.envEventoAtorInteressado.TRetEnvEvento";
94
    private static final String RET_CANCELAR_SUBSTITUICAO = "br.com.swconsultoria.nfe.schema.envEventoCancSubst.TRetEnvEvento";
95
    private static final String RET_CCE = "br.com.swconsultoria.nfe.schema.envcce.TRetEnvEvento";
96
    private static final String RET_EPEC = "br.com.swconsultoria.nfe.schema.envEpec.TRetEnvEvento";
97
    private static final String RET_MANIFESTAR = "br.com.swconsultoria.nfe.schema.envConfRecebto.TRetEnvEvento";
98
 
99
    /**
100
     * Transforma o String do XML em Objeto
101
     *
102
     * @param xml
103
     * @param classe
104
     * @return T
105
     */
106
    public static <T> T xmlToObject(String xml, Class<T> classe) throws JAXBException {
107
        return JAXB.unmarshal(new StreamSource(new StringReader(xml)), classe);
108
    }
109
 
110
    /**
111
     * Transforma o Objeto em XML(String)
112
     *
113
     * @param obj
114
     * @return
115
     * @throws JAXBException
116
     * @throws NfeException
117
     */
118
    public static <T> String objectToXml(Object obj) throws JAXBException, NfeException {
119
        return objectToXml(obj, Charset.forName("UTF-8"));
120
    }
121
 
122
    public static <T> String objectToXml(Object obj, Charset encode) throws JAXBException, NfeException {
123
 
124
        JAXBContext context;
125
        JAXBElement<?> element;
126
 
127
        switch (obj.getClass().getSimpleName()) {
128
 
129
            case STATUS:
130
                context = JAXBContext.newInstance(TConsStatServ.class);
131
                element = new br.com.swconsultoria.nfe.schema_4.consStatServ.ObjectFactory().createConsStatServ((TConsStatServ) obj);
132
                break;
133
 
134
            case ENVIO_NFE:
135
                context = JAXBContext.newInstance(TEnviNFe.class);
136
                element = new br.com.swconsultoria.nfe.schema_4.enviNFe.ObjectFactory().createEnviNFe((TEnviNFe) obj);
137
                break;
138
 
139
            case RETORNO_ENVIO:
140
                context = JAXBContext.newInstance(TRetEnviNFe.class);
141
                element = XsdUtil.enviNfe.createTRetEnviNFe((TRetEnviNFe) obj);
142
                break;
143
 
144
            case SITUACAO_NFE:
145
                context = JAXBContext.newInstance(TConsSitNFe.class);
146
                element = new br.com.swconsultoria.nfe.schema_4.consSitNFe.ObjectFactory().createConsSitNFe((TConsSitNFe) obj);
147
                break;
148
 
149
            case DIST_DFE:
150
                context = JAXBContext.newInstance(DistDFeInt.class);
151
                element = XsdUtil.distDFeInt.createDistDFeInt((DistDFeInt) obj);
152
                break;
153
 
154
            case TCONSRECINFE:
155
                context = JAXBContext.newInstance(TConsReciNFe.class);
156
                element = new br.com.swconsultoria.nfe.schema_4.consReciNFe.ObjectFactory().createConsReciNFe((TConsReciNFe) obj);
157
                break;
158
 
159
            case TCONS_CAD:
160
                context = JAXBContext.newInstance(TConsCad.class);
161
                element = new br.com.swconsultoria.nfe.schema.consCad.ObjectFactory().createConsCad((TConsCad) obj);
162
                break;
163
 
164
            case INUTILIZACAO:
165
                context = JAXBContext.newInstance(TInutNFe.class);
166
                element = new br.com.swconsultoria.nfe.schema_4.inutNFe.ObjectFactory().createInutNFe((TInutNFe) obj);
167
                break;
168
 
169
            case RET_INUT_NFE:
170
                context = JAXBContext.newInstance(TRetInutNFe.class);
171
                element = XsdUtil.inutNfe.createTRetInutNfe((TRetInutNFe) obj);
172
                break;
173
 
174
            case SITUACAO_NFE_RET:
175
                context = JAXBContext.newInstance(TRetConsSitNFe.class);
176
                element = new br.com.swconsultoria.nfe.schema_4.retConsSitNFe.ObjectFactory().createRetConsSitNFe((TRetConsSitNFe) obj);
177
                break;
178
 
179
            case RET_RECIBO_NFE:
180
                context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema_4.retConsReciNFe.TRetConsReciNFe.class);
181
                element = new br.com.swconsultoria.nfe.schema_4.retConsReciNFe.ObjectFactory().createRetConsReciNFe((br.com.swconsultoria.nfe.schema_4.retConsReciNFe.TRetConsReciNFe) obj);
182
                break;
183
 
184
            case RET_STATUS_SERVICO:
185
                context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema_4.retConsStatServ.TRetConsStatServ.class);
186
                element = new br.com.swconsultoria.nfe.schema_4.retConsStatServ.ObjectFactory().createRetConsStatServ((br.com.swconsultoria.nfe.schema_4.retConsStatServ.TRetConsStatServ) obj);
187
                break;
188
 
189
            case RET_CONS_CAD:
190
                context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.retConsCad.TRetConsCad.class);
191
                element = new br.com.swconsultoria.nfe.schema.retConsCad.ObjectFactory().createRetConsCad((br.com.swconsultoria.nfe.schema.retConsCad.TRetConsCad) obj);
192
                break;
193
 
194
            case TPROCEVENTO:
195
                switch (obj.getClass().getName()) {
196
                    case TPROCCANCELAR:
197
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.envEventoCancNFe.TProcEvento.class);
198
                        element = XsdUtil.envEventoCancNFe.createTProcEvento((br.com.swconsultoria.nfe.schema.envEventoCancNFe.TProcEvento) obj);
199
                        break;
200
                    case TPROCATORINTERESSADO:
201
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.envEventoAtorInteressado.TProcEvento.class);
202
                        element = XsdUtil.envEventoAtorInteressado.createTProcEvento((br.com.swconsultoria.nfe.schema.envEventoAtorInteressado.TProcEvento) obj);
203
                        break;
204
                    case TPROCCANCELARSUBST:
205
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.envEventoCancSubst.TProcEvento.class);
206
                        element = XsdUtil.envEventoCancSubst.createTProcEvento((br.com.swconsultoria.nfe.schema.envEventoCancSubst.TProcEvento) obj);
207
                        break;
208
                    case TPROCCCE:
209
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.envcce.TProcEvento.class);
210
                        element =  XsdUtil.envcce.createTProcEvento((br.com.swconsultoria.nfe.schema.envcce.TProcEvento) obj);
211
                        break;
212
                    case TPROCEPEC:
213
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.envEpec.TProcEvento.class);
214
                        element = XsdUtil.epec.createTProcEvento((br.com.swconsultoria.nfe.schema.envEpec.TProcEvento) obj);
215
                        break;
216
                    case TPROCMAN:
217
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.envConfRecebto.TProcEvento.class);
218
                        element = XsdUtil.manifestacao.createTProcEvento((br.com.swconsultoria.nfe.schema.envConfRecebto.TProcEvento) obj);
219
                        break;
220
                    default:
221
                        throw new NfeException("Objeto não mapeado no XmlUtil:" + obj.getClass().getSimpleName());
222
                }
223
 
224
                break;
225
 
226
            case NFEPROC:
227
                context = JAXBContext.newInstance(TNfeProc.class);
228
                element = XsdUtil.enviNfe.createTNfeProc((TNfeProc) obj);
229
                break;
230
 
231
            case NFE:
232
                context = JAXBContext.newInstance(TNFe.class);
233
                element = new JAXBElement<>(new QName("http://www.portalfiscal.inf.br/nfe", "NFe"), TNFe.class, null, (br.com.swconsultoria.nfe.schema_4.enviNFe.TNFe) obj);
234
                break;
235
 
236
            case TPROCINUT:
237
                context = JAXBContext.newInstance(TProcInutNFe.class);
238
                element = XsdUtil.inutNfe.createTProcInutNFe((TProcInutNFe) obj);
239
                break;
240
 
241
            case EVENTO:
242
                switch (obj.getClass().getName()) {
243
                    case CANCELAR:
244
                        context = JAXBContext.newInstance(TEnvEvento.class);
245
                        element = new br.com.swconsultoria.nfe.schema.envEventoCancNFe.ObjectFactory().createEnvEvento((TEnvEvento) obj);
246
                        break;
247
                    case CANCELAR_SUBSTITUICAO:
248
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.envEventoCancSubst.TEnvEvento.class);
249
                        element = new br.com.swconsultoria.nfe.schema.envEventoCancSubst.ObjectFactory().createEnvEvento((br.com.swconsultoria.nfe.schema.envEventoCancSubst.TEnvEvento) obj);
250
                        break;
251
                    case CCE:
252
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.envcce.TEnvEvento.class);
253
                        element = new br.com.swconsultoria.nfe.schema.envcce.ObjectFactory().createEnvEvento((br.com.swconsultoria.nfe.schema.envcce.TEnvEvento) obj);
254
                        break;
255
                    case EPEC:
256
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.envEpec.TEnvEvento.class);
257
                        element = new br.com.swconsultoria.nfe.schema.envEpec.ObjectFactory().createEnvEvento((br.com.swconsultoria.nfe.schema.envEpec.TEnvEvento) obj);
258
                        break;
259
                    case MANIFESTAR:
260
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.envConfRecebto.TEnvEvento.class);
261
                        element = new br.com.swconsultoria.nfe.schema.envConfRecebto.ObjectFactory().createEnvEvento((br.com.swconsultoria.nfe.schema.envConfRecebto.TEnvEvento) obj);
262
                        break;
263
                    case ATOR_INTERESSADO:
264
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.envEventoAtorInteressado.TEnvEvento.class);
265
                        element = new br.com.swconsultoria.nfe.schema.envEventoAtorInteressado.ObjectFactory().createEnvEvento((br.com.swconsultoria.nfe.schema.envEventoAtorInteressado.TEnvEvento) obj);
266
                        break;
267
                    default:
268
                        throw new NfeException("Objeto não mapeado no XmlUtil:" + obj.getClass().getSimpleName());
269
                }
270
                break;
271
 
272
            case RET_ENV_EVENTO:
273
                switch (obj.getClass().getName()) {
274
                    case RET_CANCELAR:
275
                        context = JAXBContext.newInstance(TRetEnvEvento.class);
276
                        element = XsdUtil.retEnvEvento.createTRetEnvEvento((TRetEnvEvento) obj);
277
                        break;
278
                    case RET_CANCELAR_SUBSTITUICAO:
279
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.envEventoCancSubst.TRetEnvEvento.class);
280
                        element = XsdUtil.retEnvEvento.createTRetEnvEvento((br.com.swconsultoria.nfe.schema.envEventoCancSubst.TRetEnvEvento) obj);
281
                        break;
282
                    case RET_CCE:
283
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.envcce.TRetEnvEvento.class);
284
                        element = XsdUtil.retEnvEvento.createTRetEnvEvento((br.com.swconsultoria.nfe.schema.envcce.TRetEnvEvento) obj);
285
                        break;
286
                    case RET_EPEC:
287
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.envEpec.TRetEnvEvento.class);
288
                        element = XsdUtil.retEnvEvento.createTRetEnvEvento((br.com.swconsultoria.nfe.schema.envEpec.TRetEnvEvento) obj);
289
                        break;
290
                    case RET_MANIFESTAR:
291
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.envConfRecebto.TRetEnvEvento.class);
292
                        element = XsdUtil.retEnvEvento.createTRetEnvEvento((br.com.swconsultoria.nfe.schema.envConfRecebto.TRetEnvEvento) obj);
293
                        break;
294
                    case RET_ATOR_INTERESSADO:
295
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema.envEventoAtorInteressado.TRetEnvEvento.class);
296
                        element = XsdUtil.retEnvEvento.createTRetEnvEvento((br.com.swconsultoria.nfe.schema.envEventoAtorInteressado.TRetEnvEvento) obj);
297
                        break;
298
                    default:
299
                        throw new NfeException("Objeto não mapeado no XmlUtil:" + obj.getClass().getSimpleName());
300
                }
301
                break;
302
 
303
            case TProtNFe:
304
                switch (obj.getClass().getName()) {
305
                    case TProtEnvi:
306
                        context = JAXBContext.newInstance(TProtNFe.class);
307
                        element = XsdUtil.enviNfe.createTProtNFe((br.com.swconsultoria.nfe.schema_4.enviNFe.TProtNFe) obj);
308
                        break;
309
                    case TProtCons:
310
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema_4.retConsSitNFe.TProtNFe.class);
311
                        element = XsdUtil.retConsSitNfe.createTProtNFe((br.com.swconsultoria.nfe.schema_4.retConsSitNFe.TProtNFe) obj);
312
                        break;
313
                    case TProtReci:
314
                        context = JAXBContext.newInstance(br.com.swconsultoria.nfe.schema_4.retConsReciNFe.TProtNFe.class);
315
                        element = XsdUtil.retConsReciNfe.createTProtNFe((br.com.swconsultoria.nfe.schema_4.retConsReciNFe.TProtNFe) obj);
316
                        break;
317
                    default:
318
                        throw new NfeException("Objeto não mapeado no XmlUtil:" + obj.getClass().getSimpleName());
319
                }
320
                break;
321
 
322
            default:
323
                throw new NfeException("Objeto não mapeado no XmlUtil:" + obj.getClass().getSimpleName());
324
        }
325
        assert context != null;
326
        Marshaller marshaller = context.createMarshaller();
327
 
328
        marshaller.setProperty("jaxb.encoding", "Unicode");
329
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE);
330
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
331
 
332
        StringWriter sw = new StringWriter(4096);
333
 
334
        String encodeXml = encode == null || !Charset.isSupported(encode.displayName()) ? "UTF-8" : encode.displayName();
335
 
336
        sw.append("<?xml version=\"1.0\" encoding=\"" + encodeXml + "\"?>");
337
 
338
        marshaller.marshal(element, sw);
339
 
340
        if ((obj.getClass().getSimpleName().equals(TPROCEVENTO))) {
341
            return replacesNfe(sw.toString().replace("procEvento", "procEventoNFe"));
342
        }
343
 
344
        return replacesNfe(sw.toString());
345
 
346
    }
347
 
348
    public static String gZipToXml(byte[] conteudo) throws IOException {
349
        if (conteudo == null || conteudo.length == 0) {
350
            return "";
351
        }
352
        GZIPInputStream gis;
353
        gis = new GZIPInputStream(new ByteArrayInputStream(conteudo));
354
        BufferedReader bf = new BufferedReader(new InputStreamReader(gis, "UTF-8"));
355
        StringBuilder outStr = new StringBuilder();
356
        String line;
357
        while ((line = bf.readLine()) != null) {
358
            outStr.append(line);
359
        }
360
 
361
        return outStr.toString();
362
    }
363
 
364
    public static String criaNfeProc(TEnviNFe enviNfe, Object retorno) throws JAXBException, NfeException {
365
 
366
        TNfeProc nfeProc = new TNfeProc();
367
        nfeProc.setVersao("4.00");
368
        nfeProc.setNFe(enviNfe.getNFe().get(0));
369
        String xml = XmlNfeUtil.objectToXml(retorno);
370
        nfeProc.setProtNFe(XmlNfeUtil.xmlToObject(xml, TProtNFe.class));
371
 
372
        return XmlNfeUtil.objectToXml(nfeProc);
373
    }
374
 
375
    private static String replacesNfe(String xml) {
376
 
377
        return xml.replace("<!\\[CDATA\\[<!\\[CDATA\\[", "<!\\[CDATA\\[")
378
                .replace("\\]\\]>\\]\\]>", "\\]\\]>")
379
                .replace("ns2:", "")
380
                .replace("ns3:", "")
381
                .replace("&lt;", "<")
382
                .replace("&gt;", ">")
383
                .replace("<Signature>", "<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\">")
384
                .replace(" xmlns:ns2=\"http://www.w3.org/2000/09/xmldsig#\"", "")
385
                .replace(" xmlns=\"\" xmlns:ns3=\"http://www.portalfiscal.inf.br/nfe\"", "")
386
                .replace("<NFe>", "<NFe xmlns=\"http://www.portalfiscal.inf.br/nfe\">");
387
 
388
    }
389
 
390
    /**
391
     * Le o Arquivo XML e retona String
392
     *
393
     * @return String
394
     * @throws NfeException
395
     */
396
    public static String leXml(String arquivo) throws IOException {
397
 
398
        ObjetoUtil.verifica(arquivo).orElseThrow(() -> new IllegalArgumentException("Arquivo xml não pode ser nulo/vazio."));
399
        if (!Files.exists(Paths.get(arquivo))) {
400
            throw new FileNotFoundException("Arquivo " + arquivo + " não encontrado.");
401
        }
402
        List<String> list = Files.readAllLines(Paths.get(arquivo));
403
        StringJoiner joiner = new StringJoiner("\n");
404
        list.forEach(joiner::add);
405
 
406
        return joiner.toString();
407
    }
408
 
409
    public static String dataNfe(LocalDateTime dataASerFormatada) {
410
        return dataNfe(dataASerFormatada, ZoneId.systemDefault());
411
    }
412
 
413
    public static String dataNfe(LocalDateTime dataASerFormatada, ZoneId zoneId) {
414
        try {
415
            GregorianCalendar calendar = GregorianCalendar.from(dataASerFormatada.atZone(ObjetoUtil.verifica(zoneId).orElse(ZoneId.of("Brazil/East"))));
416
 
417
            XMLGregorianCalendar xmlCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
418
            xmlCalendar.setMillisecond(DatatypeConstants.FIELD_UNDEFINED);
419
            return xmlCalendar.toString();
420
 
421
        } catch (DatatypeConfigurationException e) {
422
            log.warning(e.getMessage());
423
        }
424
        return null;
425
    }
426
 
427
    public static byte[] geraHashCSRT(String chave, String csrt) throws NoSuchAlgorithmException {
428
 
429
        ObjetoUtil.verifica(chave).orElseThrow(() -> new InvalidParameterException("Chave não deve ser nula ou vazia"));
430
        ObjetoUtil.verifica(csrt).orElseThrow(() -> new InvalidParameterException("CSRT não deve ser nulo ou vazio"));
431
        if (chave.length() != 44) {
432
            throw new InvalidParameterException("Chave deve conter 44 caracteres.");
433
        }
434
        MessageDigest md = MessageDigest.getInstance("SHA-1");
435
        md.update((csrt + chave).getBytes());
436
        return Base64.getEncoder().encode(md.digest());
437
    }
438
}