Subversion Repositories Integrator Subversion

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
778 blopes 1
package nfe.util;
2
 
3
import br.com.swconsultoria.nfe.Assinar;
4
import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe;
5
import br.com.swconsultoria.nfe.dom.Evento;
6
import br.com.swconsultoria.nfe.dom.enuns.AssinaturaEnum;
7
import br.com.swconsultoria.nfe.dom.enuns.ManifestacaoEnum;
8
import br.com.swconsultoria.nfe.exception.NfeException;
9
import br.com.swconsultoria.nfe.schema.envConfRecebto.TEnvEvento;
10
import br.com.swconsultoria.nfe.schema.envConfRecebto.TEvento;
11
import br.com.swconsultoria.nfe.schema.envConfRecebto.TProcEvento;
12
import br.com.swconsultoria.nfe.schema.envConfRecebto.TretEvento;
13
 
14
import javax.xml.bind.JAXBException;
15
import java.util.Collections;
16
import java.util.List;
17
import java.util.Optional;
18
 
19
/**
20
 * @author Samuel Oliveira - samuk.exe@hotmail.com
21
 * Data: 02/03/2019 - 22:51
22
 */
23
public class ManifestacaoUtil {
24
 
25
    private ManifestacaoUtil() {}
26
 
27
    /**
28
     * MOnta o Evento de Manifestacao Unico
29
     *
30
     * @param manifesta
31
     * @param configuracao
32
     * @return
33
     * @throws NfeException
34
     */
35
    public static TEnvEvento montaManifestacao(Evento manifesta, ConfiguracoesNfe configuracao) throws NfeException {
36
        return montaManifestacao(Collections.singletonList(manifesta), configuracao);
37
    }
38
 
39
    /**
40
     * MOnta o Evento de Manifestacao Lote
41
     *
42
     * @param listaManifestacao
43
     * @param configuracao
44
     * @return
45
     * @throws NfeException
46
     */
47
    public static TEnvEvento montaManifestacao(List<Evento> listaManifestacao, ConfiguracoesNfe configuracao) throws NfeException {
48
 
49
        if (listaManifestacao.size() > 20) {
50
            throw new NfeException("Podem ser enviados no máximo 20 eventos no Lote.");
51
        }
52
 
53
        TEnvEvento enviEvento = new TEnvEvento();
54
        enviEvento.setVersao(ConstantesUtil.VERSAO.EVENTO_MANIFESTAR);
55
        enviEvento.setIdLote("1");
56
 
57
        listaManifestacao.forEach(manifestacao -> {
58
 
59
            String id = "ID" + manifestacao.getTipoManifestacao().getCodigo() + manifestacao.getChave() + "01";
60
 
61
            TEvento evento = new TEvento();
62
            evento.setVersao(ConstantesUtil.VERSAO.EVENTO_MANIFESTAR);
63
 
64
            TEvento.InfEvento infEvento = new TEvento.InfEvento();
65
            infEvento.setId(id);
66
            infEvento.setCOrgao("91");
67
            infEvento.setTpAmb(configuracao.getAmbiente().getCodigo());
68
 
69
            infEvento.setCPF(manifestacao.getCpf());
70
            infEvento.setCNPJ(manifestacao.getCnpj());
71
 
72
            infEvento.setChNFe(manifestacao.getChave());
73
            infEvento.setDhEvento(XmlNfeUtil.dataNfe(manifestacao.getDataEvento(), configuracao.getZoneId()));
74
            infEvento.setTpEvento(manifestacao.getTipoManifestacao().getCodigo());
75
            infEvento.setNSeqEvento("1");
76
            infEvento.setVerEvento(ConstantesUtil.VERSAO.EVENTO_MANIFESTAR);
77
 
78
            TEvento.InfEvento.DetEvento detEvento = new TEvento.InfEvento.DetEvento();
79
            detEvento.setVersao(ConstantesUtil.VERSAO.EVENTO_MANIFESTAR);
80
            detEvento.setDescEvento(manifestacao.getTipoManifestacao().getValor());
81
            if (ManifestacaoEnum.OPERACAO_NAO_REALIZADA.equals(manifestacao.getTipoManifestacao())) {
82
                detEvento.setXJust(manifestacao.getMotivo());
83
            }
84
            infEvento.setDetEvento(detEvento);
85
            evento.setInfEvento(infEvento);
86
            enviEvento.getEvento().add(evento);
87
        });
88
 
89
        return enviEvento;
90
    }
91
 
92
    /**
93
     * Cria e assina o tag procEventoNFe
94
     *
95
     * @param config Um {@link ConfiguracoesNfe}, interface de configuração da NF-e ou NFC-e.
96
     * @param enviEvento Um {@link TEnvEvento} com a estrutura com a mensagem enviada para o sistema de distribuição.
97
     * @param retorno Um {@link TretEvento} com os dadps do resultado do Envio do Evento.
98
     * @return Uma {@link String} retornando um XML de evento assinado.
99
     * @throws JAXBException
100
     * @throws NfeException
101
     */
102
    public static String criaProcEventoManifestacao(ConfiguracoesNfe config, TEnvEvento enviEvento, TretEvento retorno) throws JAXBException, NfeException {
103
 
104
        String xml = XmlNfeUtil.objectToXml(enviEvento, config.getEncode());
105
        xml = xml.replaceAll(" xmlns:ns2=\"http://www.w3.org/2000/09/xmldsig#\"", "");
106
        xml = xml.replace("<evento v", "<evento xmlns=\"http://www.portalfiscal.inf.br/nfe\" v");
107
 
108
        String assinado = Assinar.assinaNfe(ConfiguracoesUtil.iniciaConfiguracoes(config), xml, AssinaturaEnum.EVENTO);
109
 
110
        TProcEvento procEvento = new TProcEvento();
111
        procEvento.setVersao(ConstantesUtil.VERSAO.EVENTO_MANIFESTAR);
112
 
113
        Optional<TEvento> optEvento = XmlNfeUtil.xmlToObject(assinado, TEnvEvento.class)
114
                        .getEvento()
115
                        .stream()
116
                        .filter(e -> e.getInfEvento().getChNFe().equalsIgnoreCase(retorno.getInfEvento().getChNFe()))
117
                        .findFirst();
118
 
119
        if (optEvento.isPresent()) {
120
            procEvento.setEvento(optEvento.get());
121
        }
122
 
123
        procEvento.setRetEvento(retorno);
124
 
125
        return XmlNfeUtil.objectToXml(procEvento, config.getEncode());
126
    }
127
 
128
}