Subversion Repositories Integrator Subversion

Rev

Blame | Last modification | View Log | Download | RSS feed

/**
 *
 */

package br.com.swconsultoria.nfe.dom;

import br.com.swconsultoria.certificado.Certificado;
import br.com.swconsultoria.certificado.exception.CertificadoException;
import br.com.swconsultoria.nfe.dom.enuns.AmbienteEnum;
import br.com.swconsultoria.nfe.dom.enuns.EstadosEnum;
import br.com.swconsultoria.nfe.util.ConstantesUtil;
import br.com.swconsultoria.nfe.util.ObjetoUtil;

import java.io.InputStream;
import java.lang.reflect.Field;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.time.ZoneId;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * @author Samuel Oliveira
 * <p>
 * Responsável por iniciar as configurações das operações NF-e.
 * <p>
 * Para iniciar as configurações chame o método estático
 * iniciaConfiguracoes:<br>
 * {@code
 * ConfiguracoesIniciaisNfe.iniciaConfiguracoes(estado, ambiente, certificado, schemas);
 * }
 * @see ConfiguracoesNfe
 * @see ConfiguracoesWebNfe
 */

public class ConfiguracoesNfe {

    private EstadosEnum estado;
    private AmbienteEnum ambiente;
    private Certificado certificado;
    private String pastaSchemas;
    private Proxy proxy;
    private Integer timeout;
    private boolean contigenciaSVC;
    private boolean validacaoDocumento = true;
    private String arquivoWebService;
    private Integer retry;
    private InputStream cacert;
    private Charset encode;
    private ZoneId zoneId;

    /**
     * Este método recebe como parâmetro os dados necessários para iniciar a
     * comunicação de operações dos eventos da NF-e. Retorna uma instância dela
     * mesma.
     * Nessa inicializacao é usado o ZoneId padrao America/Sao_Paulo
     *
     * @param estado       enumeration Estados, UF do emitente.
     * @param ambiente     Enumeration AmbienteEnum
     * @param certificado  objeto Certificado
     * @param pastaSchemas local dos arquivo de schemas da NF-e.
     * @return ConfiguracoesIniciaisNfe
     * @see br.com.swconsultoria.certificado.Certificado
     * @see EstadosEnum
     */

    public static ConfiguracoesNfe criarConfiguracoes(EstadosEnum estado, AmbienteEnum ambiente, Certificado certificado, String pastaSchemas) throws CertificadoException {
        return criarConfiguracoes(estado,ambiente,certificado,pastaSchemas, ZoneId.of("America/Sao_Paulo"));
    }

    /**
     * Este método recebe como parâmetro os dados necessários para iniciar a
     * comunicação de operações dos eventos da NF-e. Retorna uma instância dela
     * mesma.
     *
     * @param estado       enumeration Estados, UF do emitente.
     * @param ambiente     Enumeration AmbienteEnum
     * @param certificado  objeto Certificado
     * @param pastaSchemas local dos arquivo de schemas da NF-e.
     * @param zoneId       Zona para configuracoes de data
     * @return ConfiguracoesIniciaisNfe
     * @see br.com.swconsultoria.certificado.Certificado
     * @see EstadosEnum
     */

    public static ConfiguracoesNfe criarConfiguracoes(EstadosEnum estado, AmbienteEnum ambiente, Certificado certificado, String pastaSchemas, ZoneId zoneId) throws CertificadoException {

        ConfiguracoesNfe configuracoesNfe = new ConfiguracoesNfe();
        configuracoesNfe.setEstado(ObjetoUtil.verifica(estado).orElseThrow(() -> new IllegalArgumentException("Estado não pode ser Nulo.")));
        configuracoesNfe.setAmbiente(ObjetoUtil.verifica(ambiente).orElseThrow(() -> new IllegalArgumentException("Ambiente não pode ser Nulo.")));
        configuracoesNfe.setCertificado(ObjetoUtil.verifica(certificado).orElseThrow(() -> new IllegalArgumentException("Certificado não pode ser Nulo.")));
        configuracoesNfe.setPastaSchemas(pastaSchemas);
        configuracoesNfe.setZoneId(ObjetoUtil.verifica(zoneId).orElseThrow(() -> new IllegalArgumentException("Zone ID não pode ser Nulo.")));

        /**
         * Para as versões Java até 11, Eu ainda seto o Encoding por que é permitido.
         * Para quem trabalha com Java 12+, Aconselhasse setar o Encoding :
         * -Dfile.encoding="UTF-8"
         * -Dsun.jnu.encoding="UTF-8"
         *
         */

        if (Integer.parseInt(System.getProperty("java.class.version").substring(0, 2)) < 56) {
            try {
                //Setando Encoding.
                System.setProperty("file.encoding", "UTF-8");
                Field charset = Charset.class.getDeclaredField("defaultCharset");
                charset.setAccessible(true);
                charset.set(null, null);
            } catch (NoSuchFieldException | IllegalAccessException e) {
                throw new CertificadoException("Erro ao setar Encoding.");
            }
        }

        if (Logger.getLogger("").isLoggable(Level.SEVERE)) {
            System.err.println("####################################################################");
            System.err.println("       Api Java Nfe - Versão 4.00.26 - 21/08/2023");
            if (Logger.getLogger("").isLoggable(Level.WARNING)) {
                System.err.println(" Samuel Olivera - samuel@swconsultoria.com.br ");
            }
            System.err.println(" Pasta Schemas: " + pastaSchemas);
            System.err.println(" Ambiente: " + (ambiente.equals(AmbienteEnum.PRODUCAO) ? "Produção" : "Homologação") + " - Estado: " + estado.getNome());
            System.err.println("####################################################################");
        }
        if (!certificado.isValido()) {
            throw new CertificadoException("Certificado Vencido/Inválido");
        }
        return configuracoesNfe;
    }

    /**
     * Retorna o local da pasta dos schemas da NF-e(.xsd)
     *
     * @return pastaSchemas
     */

    public String getPastaSchemas() {
        return pastaSchemas;
    }

    /**
     * Atribui uma string que representa o local da pasta dos schemas da NF-e
     * (.xsd)
     *
     * @param pastaSchemas
     */

    private void setPastaSchemas(String pastaSchemas) {
        this.pastaSchemas = pastaSchemas;
    }

    /**
     * Retorna um enuns que representa o ambiente de operações da NF-e.<br>
     *
     * @return ambiente
     */

    public AmbienteEnum getAmbiente() {
        return ambiente;
    }

    /**
     * Atribui uma String que representa o ambiente de operação da NF-e.<br>
     * Ex.:<br>
     * {@code
     * ConfiguracoesIniciaisNfe.iniciaConfiguracoes(
     * estado,
     * AmbienteEnum.HOMOLOGACAO,
     * certificado,
     * schemas);
     * }
     *
     * @param ambiente
     * @see ConstantesUtil
     */

    public void setAmbiente(AmbienteEnum ambiente) {
        this.ambiente = ambiente;
    }

    /**
     * Retorna o objeto Certificado.
     *
     * @return certificado
     * @see br.com.swconsultoria.certificado
     */

    public Certificado getCertificado() {
        return certificado;
    }

    /**
     * Atribui um objeto Certificado.
     *
     * @param certificado
     */

    private void setCertificado(Certificado certificado) {
        this.certificado = certificado;
    }

    /**
     * Retorna um valor booleano que representa se as operações de NF-e estão,
     * ou, não operando no modo de Contingência.
     *
     * @return contigenciaSCAN
     */

    public boolean isContigenciaSVC() {
        return contigenciaSVC;
    }

    /**
     * Atribui um valor para contigenciaSVC. Caso True, as operações da NF-e
     * funcionarão no modo de Contingência. <br>
     * Usar para situações em que não for possível estabelecer conexão com o
     * WebService SEFAZ Origem.
     *
     * @param contigenciaSVC
     */

    public void setContigenciaSVC(boolean contigenciaSVC) {
        this.contigenciaSVC = contigenciaSVC;
    }

    /**
     * Retorna um objeto Estado que representa o UF do emissor da NF-e.
     *
     * @return estado
     * @see EstadosEnum
     */

    public EstadosEnum getEstado() {
        return estado;
    }

    /**
     * Atribui um valor para o atribuito Estado.
     *
     * @param estado estado
     * @see EstadosEnum
     */

    public void setEstado(EstadosEnum estado) {
        this.estado = estado;
    }

    /**
     * Retorna o valor do atributo proxyUtil.
     *
     * @return proxyUtil
     * @see Proxy
     */

    public Proxy getProxy() {
        return proxy;
    }

    /**
     * Atribui um valor para o proxuUtil.
     *
     * @param proxy
     */

    public void setProxy(Proxy proxy) {
        this.proxy = proxy;
    }

    /**
     * Retorna o valor do atributo timeout.
     *
     * @return timeout
     */

    public Integer getTimeout() {
        return timeout;
    }

    /**
     * Atribui o valor de timeout.<br>
     * O timeout é o limite de tempo(em milisegundos) de comunicação com
     * WebService. Sugerido pelo manual do contribuinte: 30000.
     *
     * @param timeout
     */

    public void setTimeout(Integer timeout) {
        this.timeout = timeout;
    }

    /**
     * Retorna o valor da validacaoDocumento.
     *
     * @return validacaoDocumento
     */

    public boolean isValidacaoDocumento() {
        return validacaoDocumento;
    }

    /**
     * Atribui um valor para validacaoDocumento. Caso True, irá validar o
     * documento do emitente com o documento do certificado. <br>
     *
     * @param validacaoDocumento
     */

    public void setValidacaoDocumento(boolean validacaoDocumento) {
        this.validacaoDocumento = validacaoDocumento;
    }

    public String getArquivoWebService() {
        return arquivoWebService;
    }

    public void setArquivoWebService(String arquivoWebService) {
        this.arquivoWebService = arquivoWebService;
    }

    /**
     * Retorna o valor do atributo retry.
     *
     * @return
     */

    public Integer getRetry() {
        return retry;
    }

    /**
     * Permite informar um retry. O padrão é de 3.<br>
     * Ao definir um retry indicamos o valor a ser usado como um número de
     * tentativas para a conexão com WebService.
     *
     * @param retry
     */

    public void setRetry(Integer retry) {
        this.retry = retry;
    }

    public InputStream getCacert() {
        return cacert;
    }

    public void setCacert(InputStream cacert) {
        this.cacert = cacert;
    }

    /**
     * Recupera encode que será utilizado na geração do arquivo XML.
     *
     * @return
     */

    public Charset getEncode() {return encode;}

    /**
     * Altera o encode utilizado para criar o arquivo xml.<br>
     * Por padrão é utilizado o UTF-8 em caso de erro ou não ser
     * informado nada.
     *
     * @param encode
     */

    public void setEncode(Charset encode) {this.encode = encode;}

    /**
     * Passar encode via String para o xml.
     *
     * @param nomeEncode
     */

    public void setEncode(String nomeEncode) {
        if (nomeEncode != null && !nomeEncode.equals("")) {
            try {
                this.encode = Charset.forName(nomeEncode);
            } catch (Exception ex) {
                this.encode = StandardCharsets.UTF_8;
            }
        }
    }

    public ZoneId getZoneId() {
        return zoneId;
    }

    public void setZoneId(ZoneId zoneId) {
        this.zoneId = zoneId;
    }
}