package br.com.centralit.citcorpore.ajaxForms;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import br.com.centralit.citajax.html.AjaxFormAction;
import br.com.centralit.citajax.html.DocumentHTML;
import br.com.centralit.citajax.html.HTMLForm;
import br.com.centralit.citajax.html.HTMLSelect;
import br.com.centralit.citcorpore.bean.AbstractGestaoForcaAtendimentoDTO;
import br.com.centralit.citcorpore.bean.CidadesDTO;
import br.com.centralit.citcorpore.bean.ClienteDTO;
import br.com.centralit.citcorpore.bean.ContratoDTO;
import br.com.centralit.citcorpore.bean.FornecedorDTO;
import br.com.centralit.citcorpore.bean.GrupoDTO;
import br.com.centralit.citcorpore.bean.UfDTO;
import br.com.centralit.citcorpore.bean.UsuarioDTO;
import br.com.centralit.citcorpore.negocio.CidadesService;
import br.com.centralit.citcorpore.negocio.ClienteService;
import br.com.centralit.citcorpore.negocio.ContratoService;
import br.com.centralit.citcorpore.negocio.FornecedorService;
import br.com.centralit.citcorpore.negocio.GrupoService;
import br.com.centralit.citcorpore.negocio.UfService;
import br.com.centralit.citcorpore.util.Enumerados.ParametroSistema;
import br.com.centralit.citcorpore.util.Enumerados.TipoDate;
import br.com.centralit.citcorpore.util.ParametroUtil;
import br.com.centralit.citcorpore.util.WebUtil;
import br.com.citframework.service.ServiceLocator;
import br.com.citframework.util.UtilDatas;
import br.com.citframework.util.UtilI18N;
import com.google.gson.Gson;
/**
* {@link AjaxFormAction} contendo opera��es comuns entre os controllers das telas da {@code Gest�o da For�a de Atendimento}
*
* @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a>
*
*/
public abstract class AbstractGestaoForcaAtendimento<E extends AbstractGestaoForcaAtendimentoDTO, R> extends AjaxFormAction {
private static final Logger LOGGER = Logger.getLogger(AbstractGestaoForcaAtendimento.class.getName());
protected static final Gson GSON = new Gson();
protected static final String ID_CIDADE = "idCidade";
protected static final String ID_CONTRATO = "idContrato";
protected static final String ID_GRUPO = "idGrupo";
protected static final String ID_UF = "idUF";
protected static final String FUNC_WAIT_WINDOW_HIDE = "waitWindow.hide();";
protected static final String FUNC_HANDLE_SEARCH_RESULT = "$().handleSearchResult(%s);";
protected abstract List<R> getListResultSearch(final DocumentHTML document, final HttpServletRequest request) throws Exception;
public void performSearch(final DocumentHTML document, final HttpServletRequest request, final HttpServletResponse response) {
try {
final List<R> result = this.getListResultSearch(document, request);
document.executeScript(String.format(FUNC_HANDLE_SEARCH_RESULT, GSON.toJson(result)));
} catch (final Exception e) {
document.alert(UtilI18N.internacionaliza(request, "MSE02"));
LOGGER.log(Level.WARNING, e.getMessage(), e);
}
document.executeScript(FUNC_WAIT_WINDOW_HIDE);
}
@Override
public void load(final DocumentHTML document, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
final HTMLForm form = document.getForm("form");
form.clear();
}
public void loadComboUFs(final DocumentHTML document, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
final HTMLSelect combo = document.getSelectById(ID_UF);
this.inicializaCombo(combo, request);
final Collection<UfDTO> list = this.getUFService().list();
for (final UfDTO uf : list) {
final Integer idUf = uf.getIdUf();
if (idUf.intValue() != 0) {
combo.addOption(uf.getIdUf().toString(), uf.getNomeUf());
}
}
document.executeScript(FUNC_WAIT_WINDOW_HIDE);
}
public void loadComboCidades(final DocumentHTML document, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
final E historico = (E) document.getBean();
final Integer idUF = historico.getIdUF();
final List<CidadesDTO> listCidade = (List) this.getCidadesService().listByIdUf(idUF);
final HTMLSelect comboCidade = document.getSelectById(ID_CIDADE);
this.inicializaCombo(comboCidade, request);
if (listCidade != null) {
for (final CidadesDTO cidade : listCidade) {
comboCidade.addOption(cidade.getIdCidade().toString(), cidade.getNomeCidade());
}
}
document.executeScript(FUNC_WAIT_WINDOW_HIDE);
}
public void loadComboContratos(final DocumentHTML document, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
String COLABORADORES_VINC_CONTRATOS = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.COLABORADORES_VINC_CONTRATOS, "N");
if (StringUtils.isBlank(COLABORADORES_VINC_CONTRATOS)) {
COLABORADORES_VINC_CONTRATOS = "N";
}
final HTMLSelect contratos = document.getSelectById(ID_CONTRATO);
this.inicializaCombo(contratos, request);
final UsuarioDTO usuario = WebUtil.getUsuario(request);
Collection<ContratoDTO> listContratoAtivo = null;
if (COLABORADORES_VINC_CONTRATOS != null && COLABORADORES_VINC_CONTRATOS.equalsIgnoreCase("S")) {
listContratoAtivo = this.getContratoService().findAtivosByIdEmpregado(usuario.getIdEmpregado());
} else {
listContratoAtivo = this.getContratoService().listAtivos();
}
if (listContratoAtivo != null && !listContratoAtivo.isEmpty()) {
for (final ContratoDTO contrato : listContratoAtivo) {
contrato.setNome(this.tratarNomeContrato(contrato, request, document.getLanguage()));
}
contratos.addOptions(listContratoAtivo, ID_CONTRATO, "nome", null);
}
document.executeScript(FUNC_WAIT_WINDOW_HIDE);
}
public void loadComboGrupos(final DocumentHTML document, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
final E posicionamentoAtendente = (E) document.getBean();
final HTMLSelect gruposExecutores = document.getSelectById(ID_GRUPO);
gruposExecutores.removeAllOptions();
gruposExecutores.addOption("0", this.makeSelectLabel(request));
final Collection<GrupoDTO> grupos = this.getGrupoService().listGrupoAtivosByIdContrato(posicionamentoAtendente.getIdContrato());
gruposExecutores.addOptions(grupos, ID_GRUPO, "nome", null);
document.executeScript(FUNC_WAIT_WINDOW_HIDE);
}
protected void inicializaCombo(final HTMLSelect combo, final HttpServletRequest request) {
combo.removeAllOptions();
combo.addOption("0", this.makeSelectLabel(request));
}
protected void inicializarCombosOnLoad(final List<HTMLSelect> combos, final HttpServletRequest request) {
for (final HTMLSelect combo : combos) {
this.inicializaCombo(combo, request);
combo.setSelectedIndex(0);
}
}
private String tratarNomeContrato(final ContratoDTO contrato, final HttpServletRequest request, final String language) throws Exception {
final ClienteDTO cliente = new ClienteDTO();
cliente.setIdCliente(contrato.getIdCliente());
final ClienteDTO clienteOnDB = (ClienteDTO) this.getClienteService().restore(cliente);
final FornecedorDTO fornecedor = new FornecedorDTO();
fornecedor.setIdFornecedor(contrato.getIdFornecedor());
final FornecedorDTO fornecedorOnDb = (FornecedorDTO) this.getFornecedorService().restore(fornecedor);
final Boolean hasNomeCliente = clienteOnDB != null && StringUtils.isNotBlank(clienteOnDB.getNomeRazaoSocial());
final Boolean hasNomeFornecedor = fornecedorOnDb != null && StringUtils.isNotBlank(fornecedorOnDb.getRazaoSocial());
final StringBuilder nomeContrato = new StringBuilder();
nomeContrato.append(contrato.getNumero());
nomeContrato.append(this.makeOfLabel(language));
nomeContrato.append(UtilDatas.convertDateToString(TipoDate.DATE_DEFAULT, contrato.getDataContrato(), language));
if (hasNomeCliente && hasNomeFornecedor) {
nomeContrato.append(" (");
nomeContrato.append(clienteOnDB.getNomeRazaoSocial());
nomeContrato.append(" - ");
nomeContrato.append(fornecedorOnDb.getRazaoSocial());
nomeContrato.append(")");
} else if (hasNomeCliente && !hasNomeFornecedor) {
nomeContrato.append(" (");
nomeContrato.append(clienteOnDB.getNomeRazaoSocial());
nomeContrato.append(")");
} else if (!hasNomeCliente && hasNomeFornecedor) {
nomeContrato.append(" (");
nomeContrato.append(fornecedorOnDb.getRazaoSocial());
nomeContrato.append(")");
}
return nomeContrato.toString();
}
private String selectLabel;
private String makeSelectLabel(final HttpServletRequest request) {
if (StringUtils.isBlank(selectLabel)) {
final StringBuilder select = new StringBuilder();
select.append("--- ");
select.append(UtilI18N.internacionaliza(request, "citcorpore.comum.selecioneItens"));
select.append(" ---");
selectLabel = select.toString();
}
return selectLabel;
}
private String ofLabel;
private String makeOfLabel(final String language) {
if (StringUtils.isBlank(ofLabel)) {
ofLabel = " " + UtilI18N.internacionaliza(language, "citcorpore.comum.of") + " ";
}
return ofLabel;
}
protected E normalizeDates(final E bean) {
final E normalized = bean;
Date startDate = bean.getDataInicio();
Date finishDate = bean.getDataFim();
final Integer maxDayInterval = ParametroUtil.getValorParametro(ParametroSistema.PERIODO_MAXIMO_DIAS_LISTAGEM, "30");
if (startDate == null && finishDate == null) {
final Date today = new Date();
startDate = UtilDatas.subtractDaysFromDate(this.adjustDateToInitOfDay(today), maxDayInterval);
finishDate = UtilDatas.toTimestampSQL(this.adjustDateToFinalOfDay(today));
} else if (startDate == null && finishDate != null) {
startDate = UtilDatas.subtractDaysFromDate(this.adjustDateToInitOfDay(finishDate), maxDayInterval);
finishDate = UtilDatas.toTimestampSQL(this.adjustDateToFinalOfDay(finishDate));
} else if (startDate != null && finishDate == null) {
startDate = UtilDatas.toTimestampSQL(this.adjustDateToInitOfDay(startDate));
finishDate = UtilDatas.addDaysOnDate(this.adjustDateToFinalOfDay(startDate), maxDayInterval);
}
normalized.setDataInicio(UtilDatas.toDateSQL(startDate));
normalized.setDataFim(UtilDatas.toDateSQL(finishDate));
normalized.setTimestampInicio(UtilDatas.toTimestampSQL(this.adjustDateToInitOfDay(startDate)));
normalized.setTimestampFim(UtilDatas.toTimestampSQL(this.adjustDateToFinalOfDay(finishDate)));
return normalized;
}
private Date adjustDateToInitOfDay(final Date date) {
final Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
private Date adjustDateToFinalOfDay(final Date date) {
final Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 999);
return cal.getTime();
}
private CidadesService cidadesService;
private ClienteService clienteService;
private ContratoService contratoService;
private FornecedorService fornecedorService;
private GrupoService grupoService;
private UfService ufService;
private CidadesService getCidadesService() throws Exception {
if (cidadesService == null) {
cidadesService = (CidadesService) ServiceLocator.getInstance().getService(CidadesService.class, null);
}
return cidadesService;
}
private ClienteService getClienteService() throws Exception {
if (clienteService == null) {
clienteService = (ClienteService) ServiceLocator.getInstance().getService(ClienteService.class, null);
}
return clienteService;
}
private ContratoService getContratoService() throws Exception {
if (contratoService == null) {
contratoService = (ContratoService) ServiceLocator.getInstance().getService(ContratoService.class, null);
}
return contratoService;
}
private FornecedorService getFornecedorService() throws Exception {
if (fornecedorService == null) {
fornecedorService = (FornecedorService) ServiceLocator.getInstance().getService(FornecedorService.class, null);
}
return fornecedorService;
}
private GrupoService getGrupoService() throws Exception {
if (grupoService == null) {
grupoService = (GrupoService) ServiceLocator.getInstance().getService(GrupoService.class, null);
}
return grupoService;
}
private UfService getUFService() throws Exception {
if (ufService == null) {
ufService = (UfService) ServiceLocator.getInstance().getService(UfService.class, null);
}
return ufService;
}
}