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("<", "<") |
||
| 382 | .replace(">", ">") |
||
| 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 | } |