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.LimiteAlcadaDTO;
import br.com.centralit.citcorpore.bean.RequisicaoProdutoDTO;
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.LimiteAlcadaDao;
import br.com.centralit.citcorpore.negocio.RequisicaoProdutoServiceEjb;
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 AlcadaCompras extends AlcadaImpl {
private Integer idGrupoCompras = null;
private GrupoEmpregadoDao grupoEmpregadoDao = null;
@Override
public AlcadaDTO determinaAlcada(IDto objetoNegocioDto, CentroResultadoDTO centroCustoDto, TransactionControler tc) throws Exception {
AlcadaDao alcadaDao = new AlcadaDao();
setTransacaoDao(alcadaDao);
this.objetoNegocioDto = objetoNegocioDto;
alcadaDto = alcadaDao.findByTipo(TipoAlcada.Compras);
if (alcadaDto == null)
throw new LogicException("Tipo de al�ada 'Compras' 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_PRODUTOS, null);
if (idGrupo == null || idGrupo.trim().equals(""))
throw new Exception("Grupo padr�o de requisi��o de produtos n�o parametrizado");
idGrupoCompras = new Integer(idGrupo.trim());
AlcadaCentroResultadoDAO alcadaCentroResultadoDao = new AlcadaCentroResultadoDAO();
setTransacaoDao(alcadaCentroResultadoDao);
centroCustoDto.setColAlcadas(alcadaCentroResultadoDao.findByIdCentroResultadoAndIdAlcada(centroCustoDto.getIdCentroResultado(), alcadaDto.getIdAlcada()));
RequisicaoProdutoDTO requisicaoProdutoDto = (RequisicaoProdutoDTO) objetoNegocioDto;
grupoEmpregadoDao = new GrupoEmpregadoDao();
setTransacaoDao(grupoEmpregadoDao);
Collection<GrupoEmpregadoDTO> colGrupos = grupoEmpregadoDao.findAtivosByIdEmpregado(requisicaoProdutoDto.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(requisicaoProdutoDto.getIdSolicitante());
for (LimiteAlcadaDTO limiteAlcadaDto : colLimites) {
if (!limiteAlcadaDto.getTipoLimite().equalsIgnoreCase("Q"))
continue;
if (!limiteAlcadaDto.getAbrangenciaCentroCusto().equalsIgnoreCase("T"))
continue;
if (mapGrupos.get(""+limiteAlcadaDto.getIdGrupo()) != null) {
Collection<EmpregadoDTO> colResponsaveis = new ArrayList();
colResponsaveis.add(solicitante);
alcadaDto.setColResponsaveis(colResponsaveis);
return alcadaDto;
}
}
RequisicaoProdutoServiceEjb requisicaoProdutoService = new RequisicaoProdutoServiceEjb();
Double valorAprovado = requisicaoProdutoService.calculaValorAprovado(requisicaoProdutoDto, tc);
Date dataAux = new Date(requisicaoProdutoDto.getDataHoraSolicitacao().getTime());
int mes = UtilDatas.getMonth(dataAux);
int ano = UtilDatas.getYear(dataAux);
Double valorAprovadoMensal = requisicaoProdutoService.calculaValorAprovadoMensal(centroCustoDto, mes, ano, tc);
for (LimiteAlcadaDTO limiteAlcadaDto : colLimites) {
if (!limiteAlcadaDto.getTipoLimite().equalsIgnoreCase("F"))
continue;
if (requisicaoProdutoDto.getFinalidade().equalsIgnoreCase("I")){
if (limiteAlcadaDto != null && limiteAlcadaDto.getLimiteItemUsoInterno() != null && limiteAlcadaDto.getLimiteItemUsoInterno().doubleValue() < valorAprovado.doubleValue())
continue;
if (limiteAlcadaDto != null && limiteAlcadaDto.getLimiteMensalUsoInterno() != null && limiteAlcadaDto.getLimiteMensalUsoInterno().doubleValue() < valorAprovadoMensal.doubleValue())
continue;
}else{
if (limiteAlcadaDto != null && limiteAlcadaDto.getLimiteItemAtendCliente() != null && limiteAlcadaDto.getLimiteItemAtendCliente().doubleValue() < valorAprovado.doubleValue())
continue;
if (limiteAlcadaDto != null && limiteAlcadaDto.getLimiteMensalAtendCliente() != null && limiteAlcadaDto.getLimiteMensalAtendCliente().doubleValue() < valorAprovadoMensal.doubleValue())
continue;
}
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");
determinaResponsaveis(grupoDto, limiteAlcadaDto.getAbrangenciaCentroCusto(), centroCustoDto);
//if (alcadaDto.getColResponsaveis().size() > 0)
// break;
}
if (alcadaDto.getColResponsaveis().size() > 0)
return alcadaDto;
for (LimiteAlcadaDTO limiteAlcadaDto : colLimites) {
if (!limiteAlcadaDto.getTipoLimite().equalsIgnoreCase("Q"))
continue;
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");
determinaResponsaveis(grupoDto, limiteAlcadaDto.getAbrangenciaCentroCusto(), centroCustoDto);
if (alcadaDto.getColResponsaveis().size() > 0)
break;
}
}
return alcadaDto;
}
public void determinaResponsaveis(GrupoDTO grupoDto, String abrangenciaCentroCusto, CentroResultadoDTO centroCustoDto) throws Exception {
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 (abrangenciaCentroCusto.equalsIgnoreCase("R")) {
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 (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() == idGrupoCompras)
return false;
}
}
return true;
}
}