fixes bug #AL-2143
parent
ae6a253304
commit
357f2311af
2
pom.xml
2
pom.xml
|
@ -3,7 +3,7 @@
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>br.com.rjconsultores</groupId>
|
<groupId>br.com.rjconsultores</groupId>
|
||||||
<artifactId>ModelWeb</artifactId>
|
<artifactId>ModelWeb</artifactId>
|
||||||
<version>1.0.39</version>
|
<version>1.0.40</version>
|
||||||
<distributionManagement>
|
<distributionManagement>
|
||||||
<repository>
|
<repository>
|
||||||
<id>rj-releases</id>
|
<id>rj-releases</id>
|
||||||
|
|
|
@ -1,208 +1,211 @@
|
||||||
package com.rjconsultores.ventaboletos.service.impl;
|
package com.rjconsultores.ventaboletos.service.impl;
|
||||||
|
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import javax.mail.AuthenticationFailedException;
|
import javax.mail.AuthenticationFailedException;
|
||||||
import javax.mail.SendFailedException;
|
import javax.mail.SendFailedException;
|
||||||
|
|
||||||
import org.apache.commons.collections.CollectionUtils;
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import com.rjconsultores.ventaboletos.constantes.Constantes;
|
import com.rjconsultores.ventaboletos.constantes.Constantes;
|
||||||
import com.rjconsultores.ventaboletos.dao.LogHistoricoContingenciaDAO;
|
import com.rjconsultores.ventaboletos.dao.LogHistoricoContingenciaDAO;
|
||||||
import com.rjconsultores.ventaboletos.entidad.Constante;
|
import com.rjconsultores.ventaboletos.entidad.Constante;
|
||||||
import com.rjconsultores.ventaboletos.entidad.EmpresaEmail;
|
import com.rjconsultores.ventaboletos.entidad.EmpresaEmail;
|
||||||
import com.rjconsultores.ventaboletos.entidad.EmpresaEmailConfig;
|
import com.rjconsultores.ventaboletos.entidad.EmpresaEmailConfig;
|
||||||
import com.rjconsultores.ventaboletos.entidad.LogHistoricoContingencia;
|
import com.rjconsultores.ventaboletos.entidad.LogHistoricoContingencia;
|
||||||
import com.rjconsultores.ventaboletos.enums.EAmbienteContingencia;
|
import com.rjconsultores.ventaboletos.enums.EAmbienteContingencia;
|
||||||
import com.rjconsultores.ventaboletos.enums.EStatusContingencia;
|
import com.rjconsultores.ventaboletos.enums.EStatusContingencia;
|
||||||
import com.rjconsultores.ventaboletos.exception.BusinessException;
|
import com.rjconsultores.ventaboletos.exception.BusinessException;
|
||||||
import com.rjconsultores.ventaboletos.rest.ContingenciaClienteRest;
|
import com.rjconsultores.ventaboletos.rest.ContingenciaClienteRest;
|
||||||
import com.rjconsultores.ventaboletos.service.ConstanteService;
|
import com.rjconsultores.ventaboletos.service.ConstanteService;
|
||||||
import com.rjconsultores.ventaboletos.service.ContingenciaService;
|
import com.rjconsultores.ventaboletos.service.ContingenciaService;
|
||||||
import com.rjconsultores.ventaboletos.service.EmpresaEmailConfigService;
|
import com.rjconsultores.ventaboletos.service.EmpresaEmailConfigService;
|
||||||
import com.rjconsultores.ventaboletos.service.EmpresaEmailService;
|
import com.rjconsultores.ventaboletos.service.EmpresaEmailService;
|
||||||
import com.rjconsultores.ventaboletos.utilerias.SendMail;
|
import com.rjconsultores.ventaboletos.utilerias.SendMail;
|
||||||
import com.rjconsultores.ventaboletos.utilerias.StringHelper;
|
import com.rjconsultores.ventaboletos.utilerias.StringHelper;
|
||||||
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
|
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
|
||||||
import com.rjconsultores.ventaboletos.utilerias.SendMail.AuthType;
|
import com.rjconsultores.ventaboletos.utilerias.SendMail.AuthType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author vjcor
|
* @author vjcor
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@Service("contingenciaService")
|
@Service("contingenciaService")
|
||||||
public class ContingenciaServiceImpl implements ContingenciaService {
|
public class ContingenciaServiceImpl implements ContingenciaService {
|
||||||
|
|
||||||
private static final String EMAIL_COPIA_OCULTA = "suportesco@rjconsultores.com.br";
|
private static final String EMAIL_SUPORTE_SCO_RJCONSULTORES = "EMAIL_SUPORTE_SCO_RJCONSULTORES";
|
||||||
|
|
||||||
private static Logger log = Logger.getLogger(ContingenciaServiceImpl.class);
|
private static Logger log = Logger.getLogger(ContingenciaServiceImpl.class);
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private LogHistoricoContingenciaDAO histContingenciaDAO;
|
private LogHistoricoContingenciaDAO histContingenciaDAO;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private EmpresaEmailService empresaEmailService;
|
private EmpresaEmailService empresaEmailService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private EmpresaEmailConfigService empresaEmailConfigService;
|
private EmpresaEmailConfigService empresaEmailConfigService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ConstanteService constanteService;
|
private ConstanteService constanteService;
|
||||||
|
|
||||||
public List<LogHistoricoContingencia> buscarHistorico(Integer empresaID, Integer estadoID) {
|
public List<LogHistoricoContingencia> buscarHistorico(Integer empresaID, Integer estadoID) {
|
||||||
return histContingenciaDAO.buscarHistorico(empresaID, estadoID);
|
return histContingenciaDAO.buscarHistorico(empresaID, estadoID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public LogHistoricoContingencia salvarHistoricoContingencia(LogHistoricoContingencia historicoCont) throws BusinessException, SendFailedException, AuthenticationFailedException{
|
public LogHistoricoContingencia salvarHistoricoContingencia(LogHistoricoContingencia historicoCont) throws BusinessException, SendFailedException, AuthenticationFailedException{
|
||||||
historicoCont.setUsuario(UsuarioLogado.getUsuarioLogado());
|
historicoCont.setUsuario(UsuarioLogado.getUsuarioLogado());
|
||||||
historicoCont.setDataHora(Calendar.getInstance().getTime());
|
historicoCont.setDataHora(Calendar.getInstance().getTime());
|
||||||
|
|
||||||
if (historicoCont.getEmpresa() == null) {
|
if (historicoCont.getEmpresa() == null) {
|
||||||
throw new BusinessException("N<>o <20> poss<73>vel salvar sem a empresa");
|
throw new BusinessException("N<>o <20> poss<73>vel salvar sem a empresa");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (historicoCont.getEstado() == null) {
|
if (historicoCont.getEstado() == null) {
|
||||||
throw new BusinessException("N<>o <20> poss<73>vel salvar sem o estado referente");
|
throw new BusinessException("N<>o <20> poss<73>vel salvar sem o estado referente");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (historicoCont.getMotivo() == null) {
|
if (historicoCont.getMotivo() == null) {
|
||||||
throw new BusinessException("N<>o <20> poss<73>vel salvar sem o motivo referente");
|
throw new BusinessException("N<>o <20> poss<73>vel salvar sem o motivo referente");
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Integer retorno = definirStatusContingencia(historicoCont);
|
Integer retorno = definirStatusContingencia(historicoCont);
|
||||||
|
|
||||||
if (retorno == null) {
|
if (retorno == null) {
|
||||||
throw new BusinessException(" entre em contato com o administrador do sistema.");
|
throw new BusinessException(" entre em contato com o administrador do sistema.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EStatusContingencia.CONTINGENCIA.equals(getStatusContingencia(historicoCont))) {
|
if (EStatusContingencia.CONTINGENCIA.equals(getStatusContingencia(historicoCont))) {
|
||||||
enviaEmail(historicoCont);
|
enviaEmail(historicoCont);
|
||||||
}
|
}
|
||||||
} catch (SendFailedException e2 ) {
|
} catch (SendFailedException e2 ) {
|
||||||
setMotivoNaoTrocaStatus(historicoCont, e2);
|
setMotivoNaoTrocaStatus(historicoCont, e2);
|
||||||
histContingenciaDAO.suscribir(historicoCont);
|
histContingenciaDAO.suscribir(historicoCont);
|
||||||
throw e2;
|
throw e2;
|
||||||
}catch (AuthenticationFailedException e2) {
|
}catch (AuthenticationFailedException e2) {
|
||||||
setMotivoNaoTrocaStatus(historicoCont, e2);
|
setMotivoNaoTrocaStatus(historicoCont, e2);
|
||||||
histContingenciaDAO.suscribir(historicoCont);
|
histContingenciaDAO.suscribir(historicoCont);
|
||||||
throw e2;
|
throw e2;
|
||||||
}
|
}
|
||||||
|
|
||||||
return histContingenciaDAO.suscribir(historicoCont);
|
return histContingenciaDAO.suscribir(historicoCont);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setMotivoNaoTrocaStatus(LogHistoricoContingencia historicoCont, Exception e) {
|
private void setMotivoNaoTrocaStatus(LogHistoricoContingencia historicoCont, Exception e) {
|
||||||
log.error(String.format("Erro no envio de e-mail de conting<6E>ncia da empresa %s para o estado %s.", historicoCont.getEmpresa().getEmpresaId(),historicoCont.getEstado()), e);
|
log.error(String.format("Erro no envio de e-mail de conting<6E>ncia da empresa %s para o estado %s.", historicoCont.getEmpresa().getEmpresaId(),historicoCont.getEstado()), e);
|
||||||
|
|
||||||
String motivo = historicoCont.getMotivo();
|
String motivo = historicoCont.getMotivo();
|
||||||
motivo = motivo.concat("**Problema no envio de E-mail de notifica<63><61>o. Favor checar.");
|
motivo = motivo.concat("**Problema no envio de E-mail de notifica<63><61>o. Favor checar.");
|
||||||
|
|
||||||
historicoCont.setMotivo(motivo);
|
historicoCont.setMotivo(motivo);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Integer definirStatusContingencia(LogHistoricoContingencia historicoCont) {
|
private Integer definirStatusContingencia(LogHistoricoContingencia historicoCont) {
|
||||||
|
|
||||||
Integer statusEnviado = Integer.valueOf(historicoCont.getStatus());
|
Integer statusEnviado = Integer.valueOf(historicoCont.getStatus());
|
||||||
|
|
||||||
List<Constante> constantesContig = constanteService.buscarPorNomeConstanteLike(Constantes.BPE_URL_CONTIG);
|
List<Constante> constantesContig = constanteService.buscarPorNomeConstanteLike(Constantes.BPE_URL_CONTIG);
|
||||||
if (CollectionUtils.isEmpty(constantesContig)) {
|
if (CollectionUtils.isEmpty(constantesContig)) {
|
||||||
Constante constanteBPeURL = constanteService.buscarPorNomeConstante(Constantes.BPE_URL);
|
Constante constanteBPeURL = constanteService.buscarPorNomeConstante(Constantes.BPE_URL);
|
||||||
constantesContig.add(constanteBPeURL);
|
constantesContig.add(constanteBPeURL);
|
||||||
}
|
}
|
||||||
|
|
||||||
HashMap<Constante, Integer> retornos = new HashMap<Constante, Integer>();
|
HashMap<Constante, Integer> retornos = new HashMap<Constante, Integer>();
|
||||||
|
|
||||||
for (Constante constante : constantesContig) {
|
for (Constante constante : constantesContig) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String url = constante.getValorconstante();
|
String url = constante.getValorconstante();
|
||||||
Integer retorno = ContingenciaClienteRest.getInstance().consultar(url, historicoCont.getEstado().getCveestado(), historicoCont.getAmbiente().toString(), StringHelper.retornaSomenteNumeros(historicoCont.getEmpresa().getCnpj()));
|
Integer retorno = ContingenciaClienteRest.getInstance().consultar(url, historicoCont.getEstado().getCveestado(), historicoCont.getAmbiente().toString(), StringHelper.retornaSomenteNumeros(historicoCont.getEmpresa().getCnpj()));
|
||||||
retornos.put(constante, retorno);
|
retornos.put(constante, retorno);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("", e);
|
log.error("", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Entry<Constante, Integer> entry : retornos.entrySet()) {
|
for (Entry<Constante, Integer> entry : retornos.entrySet()) {
|
||||||
if (entry.getValue() == null || (entry.getValue() != null && entry.getValue().equals(statusEnviado))) {
|
if (entry.getValue() == null || (entry.getValue() != null && entry.getValue().equals(statusEnviado))) {
|
||||||
log.info("O Servidor:" + entry.getKey().getValorconstante() + "enviou: " + statusEnviado + " recebeu " + entry.getValue());
|
log.info("O Servidor:" + entry.getKey().getValorconstante() + "enviou: " + statusEnviado + " recebeu " + entry.getValue());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Constante constante : constantesContig) {
|
for (Constante constante : constantesContig) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String bpeURL = constante.getValorconstante();
|
String bpeURL = constante.getValorconstante();
|
||||||
|
|
||||||
Integer retorno = ContingenciaClienteRest.getInstance().definir(bpeURL, historicoCont.getEstado().getCveestado(),
|
Integer retorno = ContingenciaClienteRest.getInstance().definir(bpeURL, historicoCont.getEstado().getCveestado(),
|
||||||
historicoCont.getAmbiente().toString(), StringHelper.retornaSomenteNumeros(historicoCont.getEmpresa().getCnpj()),
|
historicoCont.getAmbiente().toString(), StringHelper.retornaSomenteNumeros(historicoCont.getEmpresa().getCnpj()),
|
||||||
Integer.valueOf(historicoCont.getStatus()));
|
Integer.valueOf(historicoCont.getStatus()));
|
||||||
|
|
||||||
log.info("Servidor:" + bpeURL + " status:" + retorno);
|
log.info("Servidor:" + bpeURL + " status:" + retorno);
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("", e);
|
log.error("", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return statusEnviado;
|
return statusEnviado;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private EStatusContingencia getStatusContingencia(LogHistoricoContingencia historicoCont) {
|
private EStatusContingencia getStatusContingencia(LogHistoricoContingencia historicoCont) {
|
||||||
return EStatusContingencia.getStatusContingencia(Integer.valueOf(historicoCont.getStatus()));
|
return EStatusContingencia.getStatusContingencia(Integer.valueOf(historicoCont.getStatus()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void enviaEmail(LogHistoricoContingencia historicoCont) throws SendFailedException, AuthenticationFailedException {
|
private void enviaEmail(LogHistoricoContingencia historicoCont) throws SendFailedException, AuthenticationFailedException {
|
||||||
|
|
||||||
EmpresaEmail empresaEmail = empresaEmailService.buscarPorEmpresa(historicoCont.getEmpresa());
|
EmpresaEmail empresaEmail = empresaEmailService.buscarPorEmpresa(historicoCont.getEmpresa());
|
||||||
EmpresaEmailConfig empresaEmailConfig = empresaEmailConfigService.buscarPorEmpresa(historicoCont.getEmpresa());
|
EmpresaEmailConfig empresaEmailConfig = empresaEmailConfigService.buscarPorEmpresa(historicoCont.getEmpresa());
|
||||||
|
Constante emailSuporRJConstante = constanteService.buscarPorNomeConstante(EMAIL_SUPORTE_SCO_RJCONSULTORES);
|
||||||
if (empresaEmail != null && empresaEmailConfig != null &&
|
String emailSuporRJ = emailSuporRJConstante !=null ? emailSuporRJConstante.getValorconstante() : null;
|
||||||
empresaEmailConfig.getIndAutenticacao() != null && empresaEmail.getEmailDe() != null &&
|
if (empresaEmail != null && empresaEmailConfig != null &&
|
||||||
empresaEmailConfig.getTipoAutorizacao() != null && empresaEmailConfig.getSmtp() != null &&
|
empresaEmailConfig.getIndAutenticacao() != null && empresaEmail.getEmailDe() != null &&
|
||||||
empresaEmailConfig.getSenha() != null && empresaEmailConfig.getSmtpPorta() != null &&
|
empresaEmailConfig.getTipoAutorizacao() != null && empresaEmailConfig.getSmtp() != null &&
|
||||||
empresaEmailConfig.getSmtpEmail() != null && empresaEmail.getDestinatario() != null) {
|
empresaEmailConfig.getSenha() != null && empresaEmailConfig.getSmtpPorta() != null &&
|
||||||
|
empresaEmailConfig.getSmtpEmail() != null && empresaEmail.getDestinatario() != null) {
|
||||||
SendMail mail = new SendMail();
|
|
||||||
mail.setAuth(empresaEmailConfig.getIndAutenticacao());
|
SendMail mail = new SendMail();
|
||||||
if (StringUtils.isNotEmpty(empresaEmailConfig.getTipoAutorizacao())) {
|
mail.setAuth(empresaEmailConfig.getIndAutenticacao());
|
||||||
mail.setAuthType(AuthType.valueOf(empresaEmailConfig.getTipoAutorizacao()));
|
if (StringUtils.isNotEmpty(empresaEmailConfig.getTipoAutorizacao())) {
|
||||||
}
|
mail.setAuthType(AuthType.valueOf(empresaEmailConfig.getTipoAutorizacao()));
|
||||||
mail.setEmailFrom(empresaEmail.getEmailDe());
|
}
|
||||||
mail.setSmtpHost(empresaEmailConfig.getSmtp());
|
mail.setEmailFrom(empresaEmail.getEmailDe());
|
||||||
mail.setSmtpPassword(empresaEmailConfig.getSenha());
|
mail.setSmtpHost(empresaEmailConfig.getSmtp());
|
||||||
mail.setSmtpPort(empresaEmailConfig.getSmtpPorta());
|
mail.setSmtpPassword(empresaEmailConfig.getSenha());
|
||||||
mail.setSmtpUser(empresaEmailConfig.getSmtpEmail());
|
mail.setSmtpPort(empresaEmailConfig.getSmtpPorta());
|
||||||
mail.setSubject("Conting<6E>ncia Off-line BP-e");
|
mail.setSmtpUser(empresaEmailConfig.getSmtpEmail());
|
||||||
mail.setText(getMensagem(historicoCont));
|
mail.setSubject("Conting<6E>ncia Off-line BP-e");
|
||||||
mail.setEmailTo(empresaEmail.getDestinatario());
|
mail.setText(getMensagem(historicoCont));
|
||||||
mail.setEmailToCO(EMAIL_COPIA_OCULTA);
|
mail.setEmailTo(empresaEmail.getDestinatario());
|
||||||
mail.send();
|
if(StringUtils.isNotBlank(emailSuporRJ)) {
|
||||||
}
|
mail.setEmailToCO(emailSuporRJ);
|
||||||
}
|
}
|
||||||
|
mail.send();
|
||||||
private String getMensagem(LogHistoricoContingencia historicoContingencia) {
|
}
|
||||||
StringBuilder mensagem = new StringBuilder();
|
}
|
||||||
mensagem.append(String.format("A empresa %s est<73> com a emiss<73>o do BP-e em conting<6E>ncia off-line para a UF %s no ambiente de %s. ",
|
|
||||||
historicoContingencia.getEmpresa().getNombempresa(), historicoContingencia.getEstado().getCveestado(),
|
private String getMensagem(LogHistoricoContingencia historicoContingencia) {
|
||||||
EAmbienteContingencia.getAmbienteContingencia(historicoContingencia.getAmbiente()).getDescricao()));
|
StringBuilder mensagem = new StringBuilder();
|
||||||
mensagem.append("A emiss<73>o em conting<6E>ncia deve ser tratada como exce<63><65>o, sendo que a regra deve ser a emiss<73>o com autoriza<7A><61>o em tempo real.");
|
mensagem.append(String.format("A empresa %s est<73> com a emiss<73>o do BP-e em conting<6E>ncia off-line para a UF %s no ambiente de %s. ",
|
||||||
mensagem.append("O Fisco poder<65> solicitar esclarecimentos, e at<61> mesmo restringir ao contribuinte a utiliza<7A><61>o da modalidade de conting<6E>ncia off-line, caso seja identificado que o emissor do BP-e utiliza a conting<6E>ncia em demasia e sem justificativa aceit<69>vel, quando comparado a outros contribuintes em situa<75><61>o similar.");
|
historicoContingencia.getEmpresa().getNombempresa(), historicoContingencia.getEstado().getCveestado(),
|
||||||
mensagem.append("Na utiliza<7A><61>o de conting<6E>ncia off-line, o contribuinte assume o risco de perda da informa<6D><61>o dos ");
|
EAmbienteContingencia.getAmbienteContingencia(historicoContingencia.getAmbiente()).getDescricao()));
|
||||||
mensagem.append("BP-e emitidos em conting<6E>ncia, at<61> que os mesmos constem da base de dados do Fisco.");
|
mensagem.append("A emiss<73>o em conting<6E>ncia deve ser tratada como exce<63><65>o, sendo que a regra deve ser a emiss<73>o com autoriza<7A><61>o em tempo real.");
|
||||||
return mensagem.toString();
|
mensagem.append("O Fisco poder<65> solicitar esclarecimentos, e at<61> mesmo restringir ao contribuinte a utiliza<7A><61>o da modalidade de conting<6E>ncia off-line, caso seja identificado que o emissor do BP-e utiliza a conting<6E>ncia em demasia e sem justificativa aceit<69>vel, quando comparado a outros contribuintes em situa<75><61>o similar.");
|
||||||
}
|
mensagem.append("Na utiliza<7A><61>o de conting<6E>ncia off-line, o contribuinte assume o risco de perda da informa<6D><61>o dos ");
|
||||||
|
mensagem.append("BP-e emitidos em conting<6E>ncia, at<61> que os mesmos constem da base de dados do Fisco.");
|
||||||
}
|
return mensagem.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue