package br.com.centralit.citcorpore.negocio;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import br.com.centralit.citcorpore.bean.AlcadaCentroResultadoDTO;
import br.com.centralit.citcorpore.bean.CentroResultadoDTO;
import br.com.centralit.citcorpore.bean.HistoricoRespCentroResultadoDTO;
import br.com.centralit.citcorpore.bean.ResponsavelCentroResultadoDTO;
import br.com.centralit.citcorpore.bean.ResponsavelCentroResultadoProcessoDTO;
import br.com.centralit.citcorpore.integracao.AlcadaCentroResultadoDAO;
import br.com.centralit.citcorpore.integracao.CentroResultadoDao;
import br.com.centralit.citcorpore.integracao.HistoricoRespCentroResultadoDao;
import br.com.centralit.citcorpore.integracao.ResponsavelCentroResultadoDao;
import br.com.centralit.citcorpore.integracao.ResponsavelCentroResultadoProcessoDao;
import br.com.centralit.citged.bean.ControleGEDDTO;
import br.com.centralit.citged.integracao.ControleGEDDao;
import br.com.centralit.citged.negocio.ControleGEDServiceBean;
import br.com.citframework.dto.IDto;
import br.com.citframework.excecao.LogicException;
import br.com.citframework.excecao.ServiceException;
import br.com.citframework.integracao.TransactionControler;
import br.com.citframework.integracao.TransactionControlerImpl;
import br.com.citframework.service.CrudServiceImpl;
import br.com.citframework.util.UtilDatas;
@SuppressWarnings({"rawtypes", "unchecked"})
public class CentroResultadoServiceEjb extends CrudServiceImpl implements CentroResultadoService {
private CentroResultadoDao dao;
@Override
protected CentroResultadoDao getDao() {
if (dao == null) {
dao = new CentroResultadoDao();
}
return dao;
}
@Override
public Collection list() throws ServiceException, LogicException {
Collection lista = null;
try {
lista = this.getDao().list();
} catch (final Exception e) {
e.printStackTrace();
}
return lista;
}
@Override
public Collection findByIdPai(final Integer idPai) throws Exception {
return this.getDao().findByIdPai(idPai);
}
@Override
public void recuperaImagem(final CentroResultadoDTO centroResultadoDTO) throws Exception {
centroResultadoDTO.setImagem(null);
final List<ControleGEDDTO> colGed = (List<ControleGEDDTO>) new ControleGEDDao().listByIdTabelaAndID(ControleGEDDTO.TABELA_CENTRORESULTADO,
centroResultadoDTO.getIdCentroResultado());
if (colGed != null & !colGed.isEmpty()) {
centroResultadoDTO.setImagem(new ControleGEDServiceBean().getRelativePathFromGed(colGed.get(0)));
}
}
@Override
public Collection findSemPai() throws Exception {
return this.getDao().findSemPai();
}
@Override
public boolean temFilhos(final int idCentroResultado) throws Exception {
return this.getDao().temFilhos(idCentroResultado);
}
@Override
public Collection find(final CentroResultadoDTO centroResultadoDTO) throws Exception {
return this.getDao().find(centroResultadoDTO);
}
@Override
public Collection listAtivos() throws Exception {
return this.getHierarquia(false, false);
}
public Collection getHierarquia(final boolean acrescentarInativos, final boolean somenteRequisicaoProdutos) throws Exception {
final Collection<CentroResultadoDTO> colSemPai = this.getDao().findSemPai();
if (colSemPai == null) {
return null;
}
final Collection colRetorno = new ArrayList();
boolean bAcrescenta;
for (final CentroResultadoDTO centroResultadoDto : colSemPai) {
bAcrescenta = true;
/*
* if (!acrescentarInativos && !centroResultadoDto.getSituacao().equalsIgnoreCase("A"))
* bAcrescenta = false;
* if (bAcrescenta) {
* if (somenteRequisicaoProdutos && centroResultadoDto.getPermiteRequisicaoProduto() != null && !centroResultadoDto.getPermiteRequisicaoProduto().equalsIgnoreCase("S"))
* bAcrescenta = false;
* }
*/
if (bAcrescenta) {
centroResultadoDto.setNivel(new Integer(0));
colRetorno.add(centroResultadoDto);
final Collection colFilhos = this.carregaFilhos(centroResultadoDto.getIdCentroResultado(), 0, acrescentarInativos, somenteRequisicaoProdutos);
if (colFilhos != null) {
colRetorno.addAll(colFilhos);
}
}
}
return colRetorno;
}
@Override
public Collection listAtivosVinculados(final Integer idSolicitante, final String tipoAlcada) throws Exception {
return this.getHierarquiaSomenteVinculados(idSolicitante, tipoAlcada);
}
public Collection getHierarquiaSomenteVinculados(final Integer idSolicitante, final String tipoAlcada) throws Exception {
final Collection<CentroResultadoDTO> colSemPai = this.getDao().findPaisVinculados(idSolicitante, tipoAlcada);
if (colSemPai == null) {
return null;
}
final Collection colRetorno = new ArrayList();
for (final CentroResultadoDTO centroResultadoDto : colSemPai) {
centroResultadoDto.setNivel(new Integer(0));
final Collection colFilhos = this.carregaFilhosVinculados(centroResultadoDto.getIdCentroResultado(), idSolicitante, 0, tipoAlcada);
if (colFilhos != null) {
colRetorno.add(centroResultadoDto);
colRetorno.addAll(colFilhos);
}
}
return colRetorno;
}
/**
* Lista centros de custos que possuem vinculo com a al�ada
*
* @param acrescentarInativos
* @param somenteRequisicaoProdutos
* @return
* @throws Exception
*/
@Override
public Collection getHierarquiaCentroDeCustoAtivo(final boolean acrescentarInativos, final boolean somenteRequisicaoProdutos, final boolean somenteRequisicaoViagem)
throws Exception {
Collection<CentroResultadoDTO> colSemPai;
if (somenteRequisicaoViagem) {
colSemPai = this.getDao().findPaisVinculados("Viagem");
} else {
colSemPai = this.getDao().findSemPai();
}
if (colSemPai == null) {
return null;
}
final Collection colRetorno = new ArrayList();
boolean bAcrescenta;
for (final CentroResultadoDTO centroResultadoDto : colSemPai) {
bAcrescenta = true;
if (bAcrescenta) {
centroResultadoDto.setNivel(new Integer(0));
colRetorno.add(centroResultadoDto);
Collection colFilhos;
if (somenteRequisicaoViagem) {
colFilhos = this.carregaFilhosComAlcadaVinculado(centroResultadoDto.getIdCentroResultado(), 0, acrescentarInativos, somenteRequisicaoProdutos);
} else {
colFilhos = this.carregaFilhosComAlcadaViagemVinculado(centroResultadoDto.getIdCentroResultado(), 0, acrescentarInativos, somenteRequisicaoProdutos);
}
if (colFilhos != null) {
colRetorno.addAll(colFilhos);
}
}
}
return colRetorno;
}
/**
* Lista centros de custos que possuem vinculo com a al�ada
*
* @param idPai
* @param nivel
* @param acrescentarInativos
* @param somenteRequisicaoProdutos
* @return
* @throws Exception
*/
private Collection carregaFilhosComAlcadaVinculado(final Integer idPai, final int nivel, final boolean acrescentarInativos, final boolean somenteRequisicaoProdutos)
throws Exception {
// Conforme requisito da iniciativa 078 - Melhorias no m�dulo de viagem. Somente ser�o exibidos centro de custo com al�ada vinculada
final Collection<CentroResultadoDTO> colFilhos = this.getDao().consultarCentroDeCustoComVinculoViagemNaAlcada(idPai);
if (colFilhos == null) {
return null;
}
final Collection colRetorno = new ArrayList();
boolean bAcrescenta;
for (final CentroResultadoDTO centroResultadoDto : colFilhos) {
bAcrescenta = true;
if (!acrescentarInativos && !centroResultadoDto.getSituacao().equalsIgnoreCase("A")) {
bAcrescenta = false;
}
if (bAcrescenta) {
if (somenteRequisicaoProdutos && !centroResultadoDto.getPermiteRequisicaoProduto().equalsIgnoreCase("S")) {
bAcrescenta = false;
}
}
if (bAcrescenta) {
centroResultadoDto.setNivel(new Integer(nivel + 1));
colRetorno.add(centroResultadoDto);
final Collection colFilhosFilhos = this.carregaFilhos(centroResultadoDto.getIdCentroResultado(), nivel + 1, acrescentarInativos, somenteRequisicaoProdutos);
if (colFilhosFilhos != null) {
colRetorno.addAll(colFilhosFilhos);
}
}
}
return colRetorno;
}
/**
* Lista centros de custos que possuem vinculo com a al�ada
*
* @param idPai
* @param nivel
* @param acrescentarInativos
* @param somenteRequisicaoProdutos
* @return
* @throws Exception
*/
private Collection carregaFilhosComAlcadaViagemVinculado(final Integer idPai, final int nivel, final boolean acrescentarInativos, final boolean somenteRequisicaoProdutos)
throws Exception {
// Conforme requisito da iniciativa 078 - Melhorias no m�dulo de viagem. Somente ser�o exibidos centro de custo com al�ada vinculada
final Collection<CentroResultadoDTO> colFilhos = this.getDao().consultarCentroDeCustoComVinculoViagemNaAlcada(idPai);
if (colFilhos == null) {
return null;
}
final Collection colRetorno = new ArrayList();
boolean bAcrescenta;
for (final CentroResultadoDTO centroResultadoDto : colFilhos) {
bAcrescenta = true;
if (!acrescentarInativos && !centroResultadoDto.getSituacao().equalsIgnoreCase("A")) {
bAcrescenta = false;
}
if (bAcrescenta) {
if (somenteRequisicaoProdutos && !centroResultadoDto.getPermiteRequisicaoProduto().equalsIgnoreCase("S")) {
bAcrescenta = false;
}
}
if (bAcrescenta) {
centroResultadoDto.setNivel(new Integer(nivel + 1));
colRetorno.add(centroResultadoDto);
final Collection colFilhosFilhos = this.carregaFilhos(centroResultadoDto.getIdCentroResultado(), nivel + 1, acrescentarInativos, somenteRequisicaoProdutos);
if (colFilhosFilhos != null) {
colRetorno.addAll(colFilhosFilhos);
}
}
}
return colRetorno;
}
private Collection carregaFilhos(final Integer idPai, final int nivel, final boolean acrescentarInativos, final boolean somenteRequisicaoProdutos) throws Exception {
final Collection<CentroResultadoDTO> colFilhos = this.getDao().findByIdPai(idPai);
if (colFilhos == null) {
return null;
}
final Collection colRetorno = new ArrayList();
boolean bAcrescenta;
for (final CentroResultadoDTO centroResultadoDto : colFilhos) {
bAcrescenta = true;
if (!acrescentarInativos && !centroResultadoDto.getSituacao().equalsIgnoreCase("A")) {
bAcrescenta = false;
}
if (bAcrescenta) {
if (somenteRequisicaoProdutos && !centroResultadoDto.getPermiteRequisicaoProduto().equalsIgnoreCase("S")) {
bAcrescenta = false;
}
}
if (bAcrescenta) {
centroResultadoDto.setNivel(new Integer(nivel + 1));
colRetorno.add(centroResultadoDto);
final Collection colFilhosFilhos = this.carregaFilhos(centroResultadoDto.getIdCentroResultado(), nivel + 1, acrescentarInativos, somenteRequisicaoProdutos);
if (colFilhosFilhos != null) {
colRetorno.addAll(colFilhosFilhos);
}
}
}
return colRetorno;
}
private Collection carregaFilhosVinculados(final Integer idPai, final Integer idSolicitante, final int nivel, final String tipoAlcada) throws Exception {
final Collection<CentroResultadoDTO> colFilhos = this.getDao().findFilhosVinculados(idPai, idSolicitante, tipoAlcada);
if (colFilhos == null) {
return null;
}
final Collection colRetorno = new ArrayList();
for (final CentroResultadoDTO centroResultadoDto : colFilhos) {
centroResultadoDto.setNivel(new Integer(nivel + 1));
colRetorno.add(centroResultadoDto);
final Collection colFilhosFilhos = this.carregaFilhos(centroResultadoDto.getIdCentroResultado(), nivel + 1, false, false);
if (colFilhosFilhos != null) {
colRetorno.addAll(colFilhosFilhos);
}
}
return colRetorno;
}
@Override
public Collection listPermiteRequisicaoProduto() throws Exception {
return this.getHierarquia(false, true);
}
@Override
public Collection listPermiteRequisicaoProdutoAlcadaAtivo() throws Exception {
return this.getHierarquiaCentroDeCustoAtivo(false, false, true);
}
@Override
public Collection findByIdAlcada(final Integer idAlcada) throws Exception {
return this.getDao().findByIdAlcada(idAlcada);
}
@Override
public IDto create(final IDto model) throws ServiceException, LogicException {
final ResponsavelCentroResultadoDao responsavelCentroResultadoDao = new ResponsavelCentroResultadoDao();
final TransactionControler tc = new TransactionControlerImpl(this.getDao().getAliasDB());
try {
this.validaCreate(model);
this.getDao().setTransactionControler(tc);
responsavelCentroResultadoDao.setTransactionControler(tc);
tc.start();
CentroResultadoDTO centroResultadoDto = (CentroResultadoDTO) model;
centroResultadoDto = (CentroResultadoDTO) this.getDao().create(centroResultadoDto);
this.atualizaResponsaveis(centroResultadoDto, responsavelCentroResultadoDao);
tc.commit();
tc.close();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
}
return model;
}
private void atualizaResponsaveis(final CentroResultadoDTO centroResultadoDto, final ResponsavelCentroResultadoDao responsavelCentroResultadoDao) throws Exception {
final Collection<ResponsavelCentroResultadoDTO> colExistentes = responsavelCentroResultadoDao.findByIdCentroResultado(centroResultadoDto.getIdCentroResultado());
final HashMap<String, ResponsavelCentroResultadoDTO> mapExistentes = new HashMap();
final HashMap<String, ResponsavelCentroResultadoDTO> mapAtuais = new HashMap();
if (colExistentes != null) {
for (final ResponsavelCentroResultadoDTO responsavelCentroResultadoDto : colExistentes) {
mapExistentes.put("" + responsavelCentroResultadoDto.getIdResponsavel(), responsavelCentroResultadoDto);
}
}
final HistoricoRespCentroResultadoDao historicoRespCentroResultadoDao = new HistoricoRespCentroResultadoDao();
historicoRespCentroResultadoDao.setTransactionControler(responsavelCentroResultadoDao.getTransactionControler());
final ResponsavelCentroResultadoProcessoDao respCentroResultadoProcessoDao = new ResponsavelCentroResultadoProcessoDao();
respCentroResultadoProcessoDao.setTransactionControler(responsavelCentroResultadoDao.getTransactionControler());
respCentroResultadoProcessoDao.deleteByIdCentroResultado(centroResultadoDto.getIdCentroResultado());
responsavelCentroResultadoDao.deleteByIdCentroResultado(centroResultadoDto.getIdCentroResultado());
if (centroResultadoDto.getColResponsaveis() != null) {
for (final ResponsavelCentroResultadoDTO responsavelDto : centroResultadoDto.getColResponsaveis()) {
if (responsavelDto.getIdProcessoNegocio() == null || responsavelDto.getIdProcessoNegocio().length == 0) {
throw new Exception("Processo de neg�cio n�o informado");
}
if (responsavelDto.getIdResponsavel() == null) {
throw new Exception("Empregado n�o informado");
}
responsavelDto.setIdCentroResultado(centroResultadoDto.getIdCentroResultado());
responsavelCentroResultadoDao.create(responsavelDto);
for (int i = 0; i < responsavelDto.getIdProcessoNegocio().length; i++) {
final ResponsavelCentroResultadoProcessoDTO respCentroResultadoProcessoDto = new ResponsavelCentroResultadoProcessoDTO();
respCentroResultadoProcessoDto.setIdCentroResultado(responsavelDto.getIdCentroResultado());
respCentroResultadoProcessoDto.setIdResponsavel(responsavelDto.getIdResponsavel());
respCentroResultadoProcessoDto.setIdProcessoNegocio(responsavelDto.getIdProcessoNegocio()[i]);
respCentroResultadoProcessoDao.create(respCentroResultadoProcessoDto);
}
if (mapExistentes.get("" + responsavelDto.getIdResponsavel()) == null) {
final HistoricoRespCentroResultadoDTO historicoDto = new HistoricoRespCentroResultadoDTO();
historicoDto.setIdCentroResultado(responsavelDto.getIdCentroResultado());
historicoDto.setIdResponsavel(responsavelDto.getIdResponsavel());
historicoDto.setDataInicio(UtilDatas.getDataAtual());
historicoRespCentroResultadoDao.create(historicoDto);
}
mapAtuais.put("" + responsavelDto.getIdResponsavel(), responsavelDto);
}
}
final Collection<HistoricoRespCentroResultadoDTO> colHistorico = historicoRespCentroResultadoDao.findAtuaisByIdCentroResultado(centroResultadoDto.getIdCentroResultado());
if (colHistorico != null) {
for (final HistoricoRespCentroResultadoDTO historicoDto : colHistorico) {
if (mapAtuais.get("" + historicoDto.getIdResponsavel()) == null) {
historicoDto.setDataFim(UtilDatas.getDataAtual());
historicoRespCentroResultadoDao.update(historicoDto);
}
}
}
}
@Override
public void update(final IDto model) throws ServiceException, LogicException {
final ResponsavelCentroResultadoDao responsavelCentroResultadoDao = new ResponsavelCentroResultadoDao();
final TransactionControler tc = new TransactionControlerImpl(this.getDao().getAliasDB());
try {
this.validaUpdate(model);
this.getDao().setTransactionControler(tc);
responsavelCentroResultadoDao.setTransactionControler(tc);
tc.start();
final CentroResultadoDTO centroResultadoDto = (CentroResultadoDTO) model;
this.getDao().update(centroResultadoDto);
this.atualizaResponsaveis(centroResultadoDto, responsavelCentroResultadoDao);
tc.commit();
tc.close();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
}
}
@Override
public IDto createAntigo(final IDto model) throws ServiceException, LogicException {
final AlcadaCentroResultadoDAO alcadaCentroResultadoDao = new AlcadaCentroResultadoDAO();
final TransactionControler tc = new TransactionControlerImpl(this.getDao().getAliasDB());
try {
this.validaCreate(model);
this.getDao().setTransactionControler(tc);
alcadaCentroResultadoDao.setTransactionControler(tc);
tc.start();
CentroResultadoDTO centroResultadoDto = (CentroResultadoDTO) model;
centroResultadoDto = (CentroResultadoDTO) this.getDao().create(centroResultadoDto);
this.atualizaAlcadas(centroResultadoDto, alcadaCentroResultadoDao);
tc.commit();
tc.close();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
}
return model;
}
private void atualizaAlcadas(final CentroResultadoDTO centroResultadoDto, final AlcadaCentroResultadoDAO alcadaCentroResultadoDao) throws Exception {
alcadaCentroResultadoDao.deleteByIdCentroResultado(centroResultadoDto.getIdCentroResultado());
if (centroResultadoDto.getColAlcadas() != null) {
for (final AlcadaCentroResultadoDTO alcadaDto : centroResultadoDto.getColAlcadas()) {
if (alcadaDto.getIdAlcada() == null) {
throw new Exception("Al�ada n�o informada");
}
if (alcadaDto.getIdEmpregado() == null) {
throw new Exception("Empregado n�o informado");
}
if (alcadaDto.getDataInicio() == null) {
throw new Exception("Data de in�cio informada");
}
if (alcadaDto.getDataFim() != null && alcadaDto.getDataFim().compareTo(alcadaDto.getDataInicio()) < 0) {
throw new Exception("Data de in�cio n�o pode ser maior que a data fim");
}
alcadaDto.setIdCentroResultado(centroResultadoDto.getIdCentroResultado());
alcadaCentroResultadoDao.create(alcadaDto);
}
}
}
@Override
public void updateAntigo(final IDto model) throws ServiceException, LogicException {
final AlcadaCentroResultadoDAO alcadaCentroResultadoDao = new AlcadaCentroResultadoDAO();
final TransactionControler tc = new TransactionControlerImpl(this.getDao().getAliasDB());
try {
this.validaUpdate(model);
this.getDao().setTransactionControler(tc);
alcadaCentroResultadoDao.setTransactionControler(tc);
tc.start();
final CentroResultadoDTO centroResultadoDto = (CentroResultadoDTO) model;
this.getDao().update(centroResultadoDto);
this.atualizaAlcadas(centroResultadoDto, alcadaCentroResultadoDao);
tc.commit();
tc.close();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
}
}
@Override
public Collection consultarCentroDeCustoComVinculoViagemNaAlcada(final Integer idPai) throws Exception {
return null;
}
}