package com.rjconsultores.ventaboletos.service.impl; import java.util.Calendar; import java.util.List; import javax.mail.SendFailedException; import org.apache.commons.collections.CollectionUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.rjconsultores.ventaboletos.constantes.Constantes; import com.rjconsultores.ventaboletos.dao.LogHistoricoContingenciaDAO; import com.rjconsultores.ventaboletos.entidad.Constante; import com.rjconsultores.ventaboletos.entidad.EmpresaEmail; import com.rjconsultores.ventaboletos.entidad.EmpresaEmailConfig; import com.rjconsultores.ventaboletos.entidad.LogHistoricoContingencia; import com.rjconsultores.ventaboletos.enums.EAmbienteContingencia; import com.rjconsultores.ventaboletos.enums.EStatusContingencia; import com.rjconsultores.ventaboletos.exception.BusinessException; import com.rjconsultores.ventaboletos.rest.ContingenciaClienteRest; import com.rjconsultores.ventaboletos.service.ConstanteService; import com.rjconsultores.ventaboletos.service.ContingenciaService; import com.rjconsultores.ventaboletos.service.EmpresaEmailConfigService; import com.rjconsultores.ventaboletos.service.EmpresaEmailService; import com.rjconsultores.ventaboletos.utilerias.SendMail; import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado; /** * @author vjcor * */ @Service("contingenciaService") public class ContingenciaServiceImpl implements ContingenciaService { private static final String EMAIL_COPIA_OCULTA = "suportesco@rjconsultores.com.br"; private static Logger log = Logger.getLogger(ContingenciaServiceImpl.class); @Autowired private LogHistoricoContingenciaDAO histContingenciaDAO; @Autowired private EmpresaEmailService empresaEmailService; @Autowired private EmpresaEmailConfigService empresaEmailConfigService; @Autowired private ConstanteService constanteService; public List buscarHistorico(Integer empresaID, Integer estadoID) { return histContingenciaDAO.buscarHistorico(empresaID, estadoID); } @Transactional public LogHistoricoContingencia salvarHistoricoContingencia(LogHistoricoContingencia historicoCont) throws BusinessException{ historicoCont.setUsuario(UsuarioLogado.getUsuarioLogado()); historicoCont.setDataHora(Calendar.getInstance().getTime()); if (historicoCont.getEmpresa() == null) { throw new BusinessException("Não é possível salvar sem a empresa"); } if (historicoCont.getEstado() == null) { throw new BusinessException("Não é possível salvar sem o estado referente"); } if (historicoCont.getMotivo() == null) { throw new BusinessException("Não é possível salvar sem o motivo referente"); } try { definirStatusContingencia(historicoCont); if (EStatusContingencia.CONTINGENCIA.equals(getStatusContingencia(historicoCont))) { enviaEmail(historicoCont); } } catch (SendFailedException e) { log.error(String.format("Erro no envio de e-mail de contingência da empresa %s para o estado %s.", historicoCont.getEmpresa().getEmpresaId(),historicoCont.getEstado()),e); String motivo = historicoCont.getMotivo(); motivo = motivo.concat("**Problema no envio de E-mail de notificação. Favor checar."); historicoCont.setMotivo(motivo); } return histContingenciaDAO.suscribir(historicoCont); } private void definirStatusContingencia(LogHistoricoContingencia historicoCont) { List constantesContig = constanteService.buscarPorNomeConstanteLike(Constantes.BPE_URL_CONTIG); if (CollectionUtils.isEmpty(constantesContig)) { Constante constanteBPeURL = constanteService.buscarPorNomeConstante(Constantes.BPE_URL); constantesContig.add(constanteBPeURL); } for (Constante constante : constantesContig) { try { String bpeURL = constante.getValorconstante(); ContingenciaClienteRest.getInstance().definir(bpeURL, historicoCont.getEstado().getCveestado(), historicoCont.getAmbiente().toString(), historicoCont.getEmpresa().getCnpj(), Integer.valueOf(historicoCont.getStatus())); } catch (Exception e) { log.error("", e); } } } private EStatusContingencia getStatusContingencia(LogHistoricoContingencia historicoCont) { return EStatusContingencia.getStatusContingencia(Integer.valueOf(historicoCont.getStatus())); } private void enviaEmail(LogHistoricoContingencia historicoCont) throws SendFailedException { SendMail mail = new SendMail(); EmpresaEmail empresaEmail = empresaEmailService.buscarPorEmpresa(historicoCont.getEmpresa()); EmpresaEmailConfig empresaEmailConfig = empresaEmailConfigService.buscarPorEmpresa(historicoCont.getEmpresa()); mail.setAuth(empresaEmailConfig.getIndAutenticacao()); mail.setEmailFrom(empresaEmail.getEmailDe()); mail.setSmtpHost(empresaEmailConfig.getSmtp()); mail.setSmtpPassword(empresaEmailConfig.getSenha()); mail.setSmtpPort(empresaEmailConfig.getSmtpPorta()); mail.setSmtpUser(empresaEmailConfig.getSmtpEmail()); mail.setSubject("Contingência Off-line BP-e"); mail.setText(getMensagem(historicoCont)); mail.setEmailTo(empresaEmail.getDestinatario()); mail.setEmailToCO(EMAIL_COPIA_OCULTA); mail.send(); } private String getMensagem(LogHistoricoContingencia historicoContingencia) { StringBuilder mensagem = new StringBuilder(); mensagem.append(String.format("A empresa %s está com a emissão do BP-e em contingência off-line para a UF %s no ambiente de %s. ", historicoContingencia.getEmpresa().getNombempresa(), historicoContingencia.getEstado().getCveestado(), EAmbienteContingencia.getAmbienteContingencia(historicoContingencia.getAmbiente()).getDescricao())); mensagem.append("A emissão em contingência deve ser tratada como exceção, sendo que a regra deve ser a emissão com autorização em tempo real."); mensagem.append("O Fisco poderá solicitar esclarecimentos, e até mesmo restringir ao contribuinte a utilização da modalidade de contingência off-line, caso seja identificado que o emissor do BP-e utiliza a contingência em demasia e sem justificativa aceitável, quando comparado a outros contribuintes em situação similar."); mensagem.append("Na utilização de contingência off-line, o contribuinte assume o risco de perda da informação dos "); mensagem.append("BP-e emitidos em contingência, até que os mesmos constem da base de dados do Fisco."); return mensagem.toString(); } }