package br.com.centralit.citcorpore.negocio.alcada;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import br.com.centralit.citcorpore.bean.AlcadaCentroResultadoDTO;
import br.com.centralit.citcorpore.bean.AlcadaDTO;
import br.com.centralit.citcorpore.bean.CentroResultadoDTO;
import br.com.centralit.citcorpore.bean.EmpregadoDTO;
import br.com.centralit.citcorpore.bean.GrupoDTO;
import br.com.centralit.citcorpore.bean.GrupoEmpregadoDTO;
import br.com.centralit.citcorpore.bean.IntegranteViagemDTO;
import br.com.centralit.citcorpore.bean.LimiteAlcadaDTO;
import br.com.centralit.citcorpore.bean.RequisicaoViagemDTO;
import br.com.centralit.citcorpore.bean.SolicitacaoServicoDTO;
import br.com.centralit.citcorpore.integracao.AlcadaCentroResultadoDAO;
import br.com.centralit.citcorpore.integracao.AlcadaDao;
import br.com.centralit.citcorpore.integracao.CentroResultadoDao;
import br.com.centralit.citcorpore.integracao.GrupoDao;
import br.com.centralit.citcorpore.integracao.GrupoEmpregadoDao;
import br.com.centralit.citcorpore.integracao.IntegranteViagemDao;
import br.com.centralit.citcorpore.integracao.LimiteAlcadaDao;
import br.com.centralit.citcorpore.util.Enumerados.ParametroSistema;
import br.com.centralit.citcorpore.util.Enumerados.TipoAlcada;
import br.com.centralit.citcorpore.util.ParametroUtil;
import br.com.citframework.dto.IDto;
import br.com.citframework.excecao.LogicException;
import br.com.citframework.integracao.TransactionControler;
import br.com.citframework.util.UtilDatas;
@SuppressWarnings({"unchecked","rawtypes"})
public class AlcadaRequisicaoViagem extends AlcadaImpl {
private Integer idGrupoViagem = null;
private GrupoEmpregadoDao grupoEmpregadoDao = null;
private Collection<IntegranteViagemDTO> listaIntegratesViagem = null;
@Override
public AlcadaDTO determinaAlcada(IDto objetoNegocioDto, CentroResultadoDTO centroCustoDto, TransactionControler tc) throws Exception {
AlcadaDao alcadaDao = new AlcadaDao();
IntegranteViagemDao integranteViagemDao = new IntegranteViagemDao();
setTransacaoDao(alcadaDao);
this.objetoNegocioDto = objetoNegocioDto;
alcadaDto = alcadaDao.findByTipo(TipoAlcada.Viagem);
if (alcadaDto == null)
throw new LogicException("Tipo de al�ada 'Viagem' n�o encontrada");
if (isNovaAlcada()) {
alcadaDto.setColResponsaveis(AlcadaProcessoNegocio.getInstance().getResponsaveis((SolicitacaoServicoDTO) objetoNegocioDto, centroCustoDto, tc));
}else{
LimiteAlcadaDao limiteAlcadaDao = new LimiteAlcadaDao();
setTransacaoDao(limiteAlcadaDao);
Collection<LimiteAlcadaDTO> colLimites = limiteAlcadaDao.findByIdAlcada(alcadaDto.getIdAlcada());
if (colLimites == null || colLimites.isEmpty())
throw new LogicException("N�o foram encontrados limites de valores para a al�ada '"+alcadaDto.getNomeAlcada()+"'");
String idGrupo = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.ID_GRUPO_PADRAO_REQ_VIAGEM_EXECUCAO, null);
if (idGrupo == null || idGrupo.trim().equals(""))
throw new Exception("Grupo padr�o de requisi��o de produtos n�o parametrizado");
idGrupoViagem = new Integer(idGrupo.trim());
AlcadaCentroResultadoDAO alcadaCentroResultadoDao = new AlcadaCentroResultadoDAO();
setTransacaoDao(alcadaCentroResultadoDao);
centroCustoDto.setColAlcadas(alcadaCentroResultadoDao.findByIdCentroResultadoAndIdAlcada(centroCustoDto.getIdCentroResultado(), alcadaDto.getIdAlcada()));
RequisicaoViagemDTO requisicaoViagemDto = (RequisicaoViagemDTO) objetoNegocioDto;
grupoEmpregadoDao = new GrupoEmpregadoDao();
setTransacaoDao(grupoEmpregadoDao);
Collection<GrupoEmpregadoDTO> colGrupos = grupoEmpregadoDao.findAtivosByIdEmpregado(requisicaoViagemDto.getIdSolicitante());
HashMap<String, GrupoEmpregadoDTO> mapGrupos = new HashMap();
if (colGrupos != null) {
for (GrupoEmpregadoDTO grupoEmpregadoDto : colGrupos)
mapGrupos.put(""+grupoEmpregadoDto.getIdGrupo(), grupoEmpregadoDto);
}
GrupoDao grupoDao = new GrupoDao();
setTransacaoDao(grupoDao);
alcadaDto.setColResponsaveis(new ArrayList());
solicitante = recuperaEmpregado(requisicaoViagemDto.getIdSolicitante());
if(requisicaoViagemDto.getIdSolicitacaoServico()!=null){
listaIntegratesViagem = integranteViagemDao.findAllByIdSolicitacao(requisicaoViagemDto.getIdSolicitacaoServico());
}
for (LimiteAlcadaDTO limiteAlcadaDto : colLimites) {
GrupoDTO grupoDto = new GrupoDTO();
grupoDto.setIdGrupo(limiteAlcadaDto.getIdGrupo());
grupoDto = (GrupoDTO) grupoDao.restore(grupoDto);
if (grupoDto == null){
throw new LogicException("Grupo "+limiteAlcadaDto.getIdGrupo()+" n�o encontrado");
}
if(limiteAlcadaDto.getTipoLimite().equalsIgnoreCase("Q") && limiteAlcadaDto.getAbrangenciaCentroCusto().equalsIgnoreCase("T")){
if (mapGrupos.get(""+limiteAlcadaDto.getIdGrupo()) != null) {
Collection<EmpregadoDTO> colResponsaveis = new ArrayList();
colResponsaveis.add(solicitante);
alcadaDto.setColResponsaveis(colResponsaveis);
return alcadaDto;
}
}
determinaResponsaveis(grupoDto, limiteAlcadaDto.getAbrangenciaCentroCusto(), centroCustoDto , limiteAlcadaDto.getTipoLimite(),requisicaoViagemDto);
}
if (alcadaDto.getColResponsaveis().size() > 0)
return alcadaDto;
}
return alcadaDto;
}
public void determinaResponsaveis(GrupoDTO grupoDto, String abrangenciaCentroCusto, CentroResultadoDTO centroCustoDto,String tipoLimite,RequisicaoViagemDTO requisicaoViagemDto) throws Exception {
Date dataAtual = UtilDatas.getDataAtual();
Collection<GrupoEmpregadoDTO> colGrupoEmpregado = grupoEmpregadoDao.findByIdGrupo(grupoDto.getIdGrupo());
if (colGrupoEmpregado == null || colGrupoEmpregado.isEmpty())
return;
Collection<EmpregadoDTO> colResponsaveis = alcadaDto.getColResponsaveis();
if (colResponsaveis == null) {
colResponsaveis = new ArrayList();
alcadaDto.setColResponsaveis(colResponsaveis);
}
HashMap<String, EmpregadoDTO> mapResponsaveis = new HashMap();
for (EmpregadoDTO empregadoDto : colResponsaveis)
mapResponsaveis.put(""+empregadoDto.getIdEmpregado(), empregadoDto);
for (GrupoEmpregadoDTO grupoEmpregadoDto : colGrupoEmpregado) {
if (mapResponsaveis.get(""+grupoEmpregadoDto.getIdEmpregado()) != null)
continue;
if (tipoLimite.equalsIgnoreCase("F") || tipoLimite.equalsIgnoreCase("Q") && abrangenciaCentroCusto.equalsIgnoreCase("R")) {
if(requisicaoViagemDto.getDataInicioViagem().compareTo(dataAtual)>=0){
if (centroCustoDto.getColAlcadas() != null) {
for (AlcadaCentroResultadoDTO alcadaCentroResultadoDto : centroCustoDto.getColAlcadas()) {
if (alcadaCentroResultadoDto.getIdEmpregado() != null && alcadaCentroResultadoDto.getIdEmpregado().intValue() == grupoEmpregadoDto.getIdEmpregado().intValue()) {
if (!permiteResponsavel(grupoEmpregadoDto.getIdEmpregado()))
continue;
EmpregadoDTO empregadoDto = recuperaEmpregado(grupoEmpregadoDto.getIdEmpregado());
if (empregadoDto != null) {
mapResponsaveis.put(""+empregadoDto.getIdEmpregado(), empregadoDto);
colResponsaveis.add(empregadoDto);
}
}
}
}
}
}else{
if (tipoLimite.equalsIgnoreCase("F") && abrangenciaCentroCusto.equalsIgnoreCase("T")) {
if(requisicaoViagemDto.getDataInicioViagem().compareTo(dataAtual)>=0){
if (!permiteResponsavel(grupoEmpregadoDto.getIdEmpregado()))
continue;
EmpregadoDTO empregadoDto = recuperaEmpregado(grupoEmpregadoDto.getIdEmpregado());
if (empregadoDto != null) {
mapResponsaveis.put(""+empregadoDto.getIdEmpregado(), empregadoDto);
colResponsaveis.add(empregadoDto);
}
}
}else{
if(tipoLimite.equalsIgnoreCase("Q") && abrangenciaCentroCusto.equalsIgnoreCase("T")){
if (!permiteResponsavel(grupoEmpregadoDto.getIdEmpregado()))
continue;
EmpregadoDTO empregadoDto = recuperaEmpregado(grupoEmpregadoDto.getIdEmpregado());
if (empregadoDto != null) {
mapResponsaveis.put(""+empregadoDto.getIdEmpregado(), empregadoDto);
colResponsaveis.add(empregadoDto);
}
}
}
}
}
if (colResponsaveis.size() == 0 && centroCustoDto.getIdCentroResultadoPai() != null) {
CentroResultadoDTO ccustoPaiDto = new CentroResultadoDTO();
ccustoPaiDto.setIdCentroResultado(centroCustoDto.getIdCentroResultadoPai());
CentroResultadoDao centroResultadoDao = new CentroResultadoDao();
setTransacaoDao(centroResultadoDao);
ccustoPaiDto = (CentroResultadoDTO) centroResultadoDao.restore(ccustoPaiDto);
if (ccustoPaiDto != null)
determinaResponsaveis(grupoDto, abrangenciaCentroCusto, ccustoPaiDto);
}
}
@Override
public boolean permiteResponsavel(Integer idEmpregado) throws Exception {
if (idEmpregado.intValue() == solicitante.getIdEmpregado().intValue())
return false;
Collection<GrupoEmpregadoDTO> colGrupos = grupoEmpregadoDao.findAtivosByIdEmpregado(idEmpregado);
if (colGrupos != null) {
for (GrupoEmpregadoDTO grupoEmpregadoDto : colGrupos) {
if (grupoEmpregadoDto.getIdGrupo().intValue() == idGrupoViagem)
return false;
}
}
if(listaIntegratesViagem!=null){
for(IntegranteViagemDTO integranteViagemDto : listaIntegratesViagem){
if(integranteViagemDto.getIntegranteFuncionario().equals("N"))
continue;
if (integranteViagemDto.getIdEmpregado().intValue() == idEmpregado.intValue())
return false;
}
}
return true;
}
}