Subversion Repositories Integrator Subversion

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 espaco 1
package danfe;
2
 
3
import java.io.File;
4
import java.io.IOException;
5
import java.nio.file.Path;
6
import java.nio.file.Paths;
7
import java.text.ParseException;
8
import java.text.SimpleDateFormat;
9
import java.util.ArrayList;
10
import java.util.Collection;
11
import java.util.Date;
12
import java.util.HashMap;
13
import java.util.List;
14
import javax.xml.parsers.DocumentBuilder;
15
import javax.xml.parsers.DocumentBuilderFactory;
16
import javax.xml.parsers.ParserConfigurationException;
17
import net.sf.jasperreports.engine.JRDataSource;
18
import net.sf.jasperreports.engine.JRException;
19
import net.sf.jasperreports.engine.JasperCompileManager;
20
import net.sf.jasperreports.engine.JasperExportManager;
21
import net.sf.jasperreports.engine.JasperFillManager;
22
import net.sf.jasperreports.engine.JasperPrint;
23
import net.sf.jasperreports.engine.JasperReport;
24
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
25
import net.sf.jasperreports.engine.data.JRXmlDataSource;
26
import net.sf.jasperreports.engine.util.JRLoader;
27
import org.w3c.dom.Document;
28
import org.w3c.dom.Element;
29
import org.w3c.dom.Node;
30
import org.w3c.dom.NodeList;
31
import org.xml.sax.SAXException;
32
 
33
/**
34
 *
35
 * @author Junior Tada
36
 *
37
 * Ex: java -jar danfenfe.jar nfce_autorizada.xml
38
 */
39
 
40
public class DanfeNfe {
41
 
42
    private static HashMap map = new HashMap();
43
 
44
    /**
45
     * @param args the command line arguments
46
     */
47
 
48
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, ParseException{
49
        String xml_nfe = null;
50
        String qrcode = null;
51
        String p = null;
52
        String logo = null;
53
        String prestador_fantasia = "";
54
        String tomador_fantasia = "";
55
        String path = System.getProperty("user.dir");
56
        Path danfe_nfce_80 = Paths.get(path, "src/main/resources/relatorios/danfe","danfe_nfce_80.jasper");
57
        String url = danfe_nfce_80.toAbsolutePath().toString();
58
 
59
        // Default impressao em papel 80mm para quando for compilar
60
        // String jrxml = "/home/junior/JaspersoftWorkspace/MyReports/danfe_nfce_80.jrxml";
61
        for(String arg: args){
62
            if(arg.contains(".xml")){
63
                xml_nfe = arg;
64
            }
65
            if(arg.contains("qrcode=")){
66
                qrcode = arg.replace("qrcode=", "");
67
            }
68
            if(arg.contains("url=")){
69
                url = arg.replace("url=", "");
70
            }
71
            if(arg.contains("logo=")){
72
                logo = arg.replace("logo=", "");
73
            }
74
            if(arg.contains("prestador=")){
75
                prestador_fantasia = arg.replace("prestador=", "");
76
            }
77
            if(arg.contains("tomador=")){
78
                // nome fantasia do tomador/cliente
79
                tomador_fantasia = arg.replace("tomador=", "");
80
            }
81
            if(arg.contains("p=")){
82
                p = arg.replace("p=", "");
83
            switch (p){
84
                case "58mm":
85
                    //jrxml = "/home/junior/JaspersoftWorkspace/MyReports/danfe_nfce_58.jrxml";
86
                    Path danfe_nfce_58 = Paths.get(path, "danfe","danfe_nfce_58.jasper");
87
                    url =  danfe_nfce_58.toAbsolutePath().toString();
88
                    break;
89
                case "A4":
90
                    //jrxml = "/home/junior/JaspersoftWorkspace/MyReports/danfe_nfce_A4.jrxml";
91
                    Path danfe_nfce_A4 = Paths.get(path, "danfe","danfe_nfce_A4.jasper");
92
                    url =  danfe_nfce_A4.toAbsolutePath().toString();
93
                    break;
94
                case "nfe":
95
                    //nfe A4 retrato
96
                    Path nfe = Paths.get(path, "danfe","danfeR.jasper");
97
                    url =  nfe.toAbsolutePath().toString();
98
                    // teste
99
                    //url = "/home/junior/JaspersoftWorkspace/MyReports/danfeR.jasper";
100
                    break;
101
                case "nfse":
102
                    //nfse A4 retrato
103
                    Path nfse = Paths.get(path, "danfe","danfe_nfse.jasper");
104
                    url =  nfse.toAbsolutePath().toString();
105
                    break;
106
                default:
107
                    //jrxml = "/home/junior/JaspersoftWorkspace/MyReports/danfe_nfce_80.jrxml";
108
                    url =  danfe_nfce_80.toAbsolutePath().toString();
109
                    break;
110
                }
111
            }
112
        }
113
        // Leitura de arquivo para xml de nfe
114
        if(!p.equals("nfse")){
115
            File inputFile = new File(xml_nfe);
116
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
117
            DocumentBuilder builder = factory.newDocumentBuilder();
118
            Document xml = builder.parse(inputFile);
119
            xml.getDocumentElement().normalize();
120
            // Dados do emitente
121
            NodeList emitList = xml.getElementsByTagName("emit");
122
            Node emitNode = emitList.item(0);
123
            Element emitElement = (Element) emitNode;
124
            List <String> emit = new ArrayList<>();
125
            emit.add(emitElement.getElementsByTagName("xNome").item(0).getTextContent());
126
            emit.add(emitElement.getElementsByTagName("CNPJ").item(0).getTextContent());
127
            emit.add(emitElement.getElementsByTagName("IE").item(0).getTextContent());
128
            emit.add(emitElement.getElementsByTagName("xLgr").item(0).getTextContent());
129
            emit.add(emitElement.getElementsByTagName("nro").item(0).getTextContent());
130
            emit.add(emitElement.getElementsByTagName("xBairro").item(0).getTextContent());
131
            emit.add(emitElement.getElementsByTagName("xMun").item(0).getTextContent());
132
            emit.add(emitElement.getElementsByTagName("UF").item(0).getTextContent());
133
            emit.add(emitElement.getElementsByTagName("CEP").item(0).getTextContent());
134
            //for(int i = 0; i < emit.size(); i++){
135
            //    System.out.println(emit.get(i)+" "+i);
136
            //}
137
            List <String> dest = new ArrayList<>();
138
 
139
            // Dados do Destinatário
140
            NodeList destList = xml.getElementsByTagName("dest");
141
            if(destList.getLength() > 0){
142
                Node destNode = destList.item(0);
143
                Element destElement = (Element) destNode;
144
                try {
145
                    dest.add("CPF: "+destElement.getElementsByTagName("CPF").item(0).getTextContent());
146
                } catch (Exception e) {
147
                    dest.add("CNPJ: "+destElement.getElementsByTagName("CNPJ").item(0).getTextContent());
148
                }
149
                if(p.equalsIgnoreCase("nfe")){
150
                    dest.add(destElement.getElementsByTagName("xNome").item(0).getTextContent());
151
                    dest.add(destElement.getElementsByTagName("xLgr").item(0).getTextContent());
152
                    dest.add(destElement.getElementsByTagName("nro").item(0).getTextContent());
153
                    dest.add(destElement.getElementsByTagName("xBairro").item(0).getTextContent());
154
                    dest.add(destElement.getElementsByTagName("xMun").item(0).getTextContent());
155
                    dest.add(destElement.getElementsByTagName("UF").item(0).getTextContent());
156
                    dest.add(destElement.getElementsByTagName("CEP").item(0).getTextContent());
157
                }
158
 
159
                //for(int i = 0; i < dest.size(); i++){
160
                //    System.out.println(dest.get(i)+" "+i);
161
                //}
162
            }      
163
 
164
            // Dados dos Itens
165
            Collection <Item>  itens = new ArrayList<Item>();
166
            NodeList itensList = xml.getElementsByTagName("det");
167
            for(int i = 0; i < itensList.getLength(); i++){
168
                Node itensNode = itensList.item(i);
169
                Element itensElement = (Element) itensNode;
170
                Item item = new Item();
171
                item.setCodigo(itensElement.getElementsByTagName("cProd").item(0).getTextContent());
172
                item.setDescricao(itensElement.getElementsByTagName("xProd").item(0).getTextContent());
173
                item.setNcm(itensElement.getElementsByTagName("NCM").item(0).getTextContent());
174
                item.setCfop(itensElement.getElementsByTagName("CFOP").item(0).getTextContent());
175
                item.setQuantidade(itensElement.getElementsByTagName("qCom").item(0).getTextContent());
176
                item.setUnidade(itensElement.getElementsByTagName("uCom").item(0).getTextContent());
177
                item.setTotal(itensElement.getElementsByTagName("vUnCom").item(0).getTextContent());
178
                item.setValor(itensElement.getElementsByTagName("vProd").item(0).getTextContent());
179
                // csosn
180
                item.setCsosn(itensElement.getElementsByTagName("CSOSN").item(0).getTextContent());
181
                itens.add(item);
182
            }
183
            JRDataSource jr = new JRBeanCollectionDataSource(itens);
184
            // Dados da nota
185
            List <String> nota = new ArrayList<>();
186
            // Total
187
            NodeList totList = xml.getElementsByTagName("ICMSTot");
188
            Node totNode = totList.item(0);
189
            Element totElement = (Element) totNode;
190
            nota.add(totElement.getElementsByTagName("vNF").item(0).getTextContent());
191
            // Numero, Serie, Emissao
192
            NodeList ideList = xml.getElementsByTagName("ide");
193
            Node ideNode = ideList.item(0);
194
            Element ideElement = (Element) ideNode;
195
            nota.add(ideElement.getElementsByTagName("nNF").item(0).getTextContent());          // Numero
196
            nota.add(ideElement.getElementsByTagName("serie").item(0).getTextContent());        // serie
197
            String data = ideElement.getElementsByTagName("dhEmi").item(0).getTextContent();    
198
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");  
199
            SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
200
            Date date = sdf.parse(data);
201
            nota.add(f.format(date));                                                           // Data/hora
202
            // Chave, Protocolo, Data/Hora Autorização
203
            NodeList protList = xml.getElementsByTagName("infProt");
204
            Node protNode = protList.item(0);
205
            Element protElement = (Element) protNode;
206
            nota.add(protElement.getElementsByTagName("chNFe").item(0).getTextContent());       // Chave
207
            nota.add(protElement.getElementsByTagName("nProt").item(0).getTextContent());       // Protocolo
208
            String dhRecbto = protElement.getElementsByTagName("dhRecbto").item(0).getTextContent();
209
            Date data_recibo = sdf.parse(dhRecbto);
210
            nota.add(f.format(data_recibo));                                                    // Data/Hora recibo
211
            // Pagamento
212
            NodeList pagList = xml.getElementsByTagName("pag");
213
            Node pagNode = pagList.item(0);
214
            Element pagElement = (Element) pagNode;
215
            // Grupo obrigatório para a NFC-e, a critério da UF. Não informar para a NF-e.
216
            String tPag = "";
217
            try {
218
                tPag = pagElement.getElementsByTagName("tPag").item(0).getTextContent();
219
            switch (tPag){
220
                case "01":
221
                    tPag = "Dinheiro";
222
                    break;
223
                case "02":
224
                    tPag = "Cheque";
225
                    break;
226
                case "03":
227
                    tPag = "Cartão de Crédito";
228
                    break;
229
                case "04":
230
                    tPag = "Cartão de Débito";
231
                    break;
232
                case "05":
233
                    tPag = "Crédito Loja";
234
                    break;
235
                case "10":
236
                    tPag = "Vale Alimentação";
237
                    break;
238
                case "11":
239
                    tPag = "Vale Refeição";
240
                    break;
241
                case "12":
242
                    tPag = "Vale Presente";
243
                    break;
244
                case "13":
245
                    tPag = "Vale Combustível";
246
                    break;
247
                case "99":
248
                    tPag = "Outros";
249
                    break;
250
                default:
251
                    tPag = "Outros";
252
 
253
            }
254
            } catch (Exception e) {
255
                System.out.println("Grupo obrigatório para a NFC-e, a critério da UF. Não informar para a NF-e: " + e);
256
            }
257
            nota.add(tPag);
258
            nota.add(itens.size()+"");
259
 
260
            // Tributos aprox
261
            try {
262
                nota.add(totElement.getElementsByTagName("vTotTrib").item(0).getTextContent());
263
            } catch (Exception e) {
264
                System.out.println("Valor total de tributos: " + e);
265
            }
266
            // Informação adicional
267
            try {
268
                NodeList infoList = xml.getElementsByTagName("infAdic");
269
                Node infoNode = infoList.item(0);
270
                Element infoElement = (Element) infoNode;
271
                nota.add(infoElement.getElementsByTagName("infAdFisco").item(0).getTextContent());
272
            } catch (Exception e) {
273
                nota.add("");
274
                System.out.println("Informação adicional: " + e);
275
            }
276
 
277
 
278
            //for(int z = 0; z < nota.size(); z++){
279
            //    System.out.println(nota.get(z)+" "+z);
280
            //}
281
            // Dante NF-e
282
            // java -jar nota_autorizada.xml p=nfe
283
            if(p.equalsIgnoreCase("nfe")){
284
                gerarDanfeNFe(url, emit, dest, nota, jr);
285
            }
286
            // Danfe NFC-e
287
            else{
288
               gerarDanfe(url, emit, dest, nota, jr, qrcode);
289
            }
290
        }
291
        // Leitura de arquivo xml para nfse
292
        else{
293
            File inputFile = new File(xml_nfe);
294
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
295
            DocumentBuilder builder = factory.newDocumentBuilder();
296
            Document xml = builder.parse(inputFile);
297
            xml.getDocumentElement().normalize();
298
 
299
            // Dados do prestador
300
            NodeList emitList = xml.getElementsByTagName("PrestadorServico");
301
            Node emitNode = emitList.item(0);
302
            Element emitElement = (Element) emitNode;
303
            List <String> emit = new ArrayList<>();
304
            emit.add(emitElement.getElementsByTagName("Cnpj").item(0).getTextContent());
305
            emit.add(emitElement.getElementsByTagName("InscricaoMunicipal").item(0).getTextContent());
306
            emit.add(emitElement.getElementsByTagName("RazaoSocial").item(0).getTextContent());
307
            emit.add(emitElement.getElementsByTagName("Endereco").item(1).getTextContent());
308
            emit.add(emitElement.getElementsByTagName("Numero").item(0).getTextContent());
309
            emit.add(emitElement.getElementsByTagName("Bairro").item(0).getTextContent());
310
            if(emitElement.getElementsByTagName("CodigoMunicipio").item(0).getTextContent().equals("3525904")){
311
                emit.add("Jundiaí");
312
            }
313
            else{
314
                emit.add(emitElement.getElementsByTagName("CodigoMunicipio").item(0).getTextContent());
315
            }
316
            emit.add(emitElement.getElementsByTagName("Uf").item(0).getTextContent());
317
            emit.add(emitElement.getElementsByTagName("Cep").item(0).getTextContent());
318
            emit.add(emitElement.getElementsByTagName("Telefone").item(0).getTextContent());
319
            emit.add(emitElement.getElementsByTagName("Email").item(0).getTextContent());
320
            // Nome Fantasia Prestador
321
            emit.add(prestador_fantasia);
322
            // Debug
323
//            System.out.println("Prestador");
324
//            for(int i = 0; i < emit.size(); i++){
325
//                System.out.println(emit.get(i)+" "+i);
326
//            }
327
 
328
            // Dados do tomador
329
            NodeList destList = xml.getElementsByTagName("TomadorServico");
330
            Node destNode = destList.item(0);
331
            Element destElement = (Element) destNode;
332
            List <String> dest = new ArrayList<>();
333
            dest.add(destElement.getElementsByTagName("Cnpj").item(0).getTextContent());
334
            dest.add(destElement.getElementsByTagName("InscricaoMunicipal").item(0).getTextContent());
335
            dest.add(destElement.getElementsByTagName("RazaoSocial").item(0).getTextContent());
336
            dest.add(destElement.getElementsByTagName("Endereco").item(1).getTextContent());
337
            dest.add(destElement.getElementsByTagName("Numero").item(0).getTextContent());
338
            dest.add(destElement.getElementsByTagName("Bairro").item(0).getTextContent());
339
            if(destElement.getElementsByTagName("CodigoMunicipio").item(0).getTextContent().equals("3525904")){
340
                dest.add("Jundiaí");
341
            }
342
            else{
343
                dest.add(destElement.getElementsByTagName("CodigoMunicipio").item(0).getTextContent());
344
            }
345
            dest.add(destElement.getElementsByTagName("Uf").item(0).getTextContent());
346
            dest.add(destElement.getElementsByTagName("Cep").item(0).getTextContent());
347
            dest.add(destElement.getElementsByTagName("Telefone").item(0).getTextContent());
348
            dest.add(destElement.getElementsByTagName("Email").item(0).getTextContent());
349
            // Nome fantasia tomador
350
            dest.add(tomador_fantasia);
351
            // Debug
352
//            System.out.println("Tomador");
353
//            for(int i = 0; i < dest.size(); i++){
354
//                System.out.println(dest.get(i)+" "+i);
355
//            }
356
 
357
            // Dados do serviço
358
            NodeList serList = xml.getElementsByTagName("Servico");
359
            Node serNode = serList.item(0);
360
            Element serElement = (Element) serNode;
361
            List <String> ser = new ArrayList<>();
362
            ser.add(serElement.getElementsByTagName("ValorServicos").item(0).getTextContent());
363
            ser.add(serElement.getElementsByTagName("IssRetido").item(0).getTextContent());
364
            ser.add(serElement.getElementsByTagName("ValorIss").item(0).getTextContent());
365
            ser.add(serElement.getElementsByTagName("ValorIssRetido").item(0).getTextContent());
366
            ser.add(serElement.getElementsByTagName("BaseCalculo").item(0).getTextContent());
367
            ser.add(serElement.getElementsByTagName("Aliquota").item(0).getTextContent());
368
            ser.add(serElement.getElementsByTagName("ValorLiquidoNfse").item(0).getTextContent());
369
            ser.add(serElement.getElementsByTagName("ItemListaServico").item(0).getTextContent());
370
            ser.add(serElement.getElementsByTagName("CodigoTributacaoMunicipio").item(0).getTextContent());
371
            ser.add(serElement.getElementsByTagName("Discriminacao").item(0).getTextContent());
372
            ser.add(serElement.getElementsByTagName("CodigoMunicipio").item(0).getTextContent());
373
            // Debug
374
            //System.out.println("Serviço");
375
            //for(int i = 0; i < ser.size(); i++){
376
            //    System.out.println(ser.get(i)+" "+i);
377
            //}
378
 
379
            // Dados da nota
380
            NodeList notaList = xml.getElementsByTagName("InfNfse");
381
            Node notaNode = notaList.item(0);
382
            Element notaElement = (Element) notaNode;
383
            List <String> nota = new ArrayList<>();
384
            nota.add(notaElement.getElementsByTagName("Numero").item(0).getTextContent());
385
            nota.add(notaElement.getElementsByTagName("CodigoVerificacao").item(0).getTextContent());
386
            // Ajusta data/hora emissão
387
            String data_xml = notaElement.getElementsByTagName("DataEmissao").item(0).getTextContent();
388
            SimpleDateFormat data_entrada = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");  
389
            SimpleDateFormat data_saida = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
390
            Date date = data_entrada.parse(data_xml);
391
            nota.add(data_saida.format(date));  
392
            nota.add(notaElement.getElementsByTagName("NaturezaOperacao").item(0).getTextContent());
393
            nota.add(notaElement.getElementsByTagName("RegimeEspecialTributacao").item(0).getTextContent());
394
            nota.add(notaElement.getElementsByTagName("OptanteSimplesNacional").item(0).getTextContent());
395
            nota.add(notaElement.getElementsByTagName("IncentivadorCultural").item(0).getTextContent());
396
            // Ajusta data Competência
397
            String data_c = notaElement.getElementsByTagName("Competencia").item(0).getTextContent();
398
            SimpleDateFormat data_c_entrada = new SimpleDateFormat("yyyy-MM-dd");  
399
            SimpleDateFormat data_c_saida = new SimpleDateFormat("dd/MM/yyyy");
400
            Date data_competencia = data_c_entrada.parse(data_c);
401
            nota.add(data_c_saida.format(data_competencia));
402
            // Debug
403
//            System.out.println("Nota");
404
//            for(int i = 0; i < nota.size(); i++){
405
//                System.out.println(nota.get(i)+" "+i);
406
//            }
407
 
408
            // Gera o danfe com jasper
409
            gerarDanfeNfse(url, emit, dest, ser, nota, xml_nfe, logo);
410
        }  
411
    }
412
 
413
    // Cria o Danfe com os dados do xml
414
    private static void gerarDanfe(String url, List<String> emit, List<String> dest, List<String> nota, JRDataSource itens, String qrcode){
415
        try {
416
            // Teste
417
            //String compilado = System.getProperty("user.dir") + "/danfe_nfce_80.jasper";;
418
            String output = "danfe.pdf";
419
            map.put("emit", emit);
420
            map.put("dest", dest);
421
            map.put("nota", nota);
422
            map.put("qrcode", qrcode);
423
            // Relatório compilado
424
            JasperReport report = (JasperReport) JRLoader.loadObjectFromFile(url);
425
            //InputStream jasperStream = getClass().getResourceAsStream("/Foo.jasper");
426
            //JasperReport report = (JasperReport) JRLoader.loadObject(jasperStream);
427
            // Relatório nao compilado
428
            //JasperReport report = JasperCompileManager.compileReport(jrxml);
429
            JasperPrint print = JasperFillManager.fillReport(report, map, itens);
430
            JasperExportManager.exportReportToPdfFile(print, output);
431
        } catch (JRException e) {
432
            System.out.println("erro: "+e.getMessage());
433
        }
434
    }
435
 
436
    private static void gerarDanfeNFe(String url, List<String> emit, List<String> dest, List<String> nota, JRDataSource itens) {
437
        try {
438
            // Teste
439
            //String compilado = System.getProperty("user.dir") + "/danfe_nfce_80.jasper";;
440
            String output = "danfe.pdf";
441
            map.put("emit", emit);
442
            map.put("dest", dest);
443
            map.put("nota", nota);
444
            // Relatório compilado
445
            JasperReport report = (JasperReport) JRLoader.loadObjectFromFile(url);
446
            JasperPrint print = JasperFillManager.fillReport(report, map, itens);
447
            JasperExportManager.exportReportToPdfFile(print, output);
448
        } catch (JRException e) {
449
            System.out.println("erro: "+e.getMessage());
450
        }
451
    }
452
 
453
    private static void gerarDanfeNfse(String url, List<String> emit, List<String> dest, List<String> ser, List<String> nota, String xml, String logo) {
454
        try {
455
            // Teste
456
            //String compilado = System.getProperty("user.dir") + "/danfe_nfce_80.jasper";;
457
            String output = "danfe.pdf";
458
            map.put("emit", emit);
459
            map.put("dest", dest);
460
            map.put("ser", ser);
461
            map.put("nota", nota);
462
            map.put("logo", logo);
463
            // brasao
464
            String brasao = Paths.get(System.getProperty("user.dir"), "danfe","brasao.png").toAbsolutePath().toString();
465
            map.put("brasao", brasao);
466
            // JrDataSource
467
            JRDataSource jr = new JRXmlDataSource(xml);
468
            // Relatório compilado
469
            JasperReport report = (JasperReport) JRLoader.loadObjectFromFile(url);
470
            JasperPrint print = JasperFillManager.fillReport(report, map, jr);
471
            JasperExportManager.exportReportToPdfFile(print, output);
472
        } catch (JRException e) {
473
            System.out.println("erro: "+e.getMessage());
474
        }
475
    }
476
 
477
}