package br.com.centralit.citcorpore.integracao;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import br.com.centralit.citcorpore.bean.EmpregadoDTO;
import br.com.centralit.citcorpore.bean.UnidadeDTO;
import br.com.centralit.citcorpore.bean.UsuarioDTO;
import br.com.centralit.citcorpore.negocio.EmpregadoService;
import br.com.centralit.citcorpore.negocio.UnidadeService;
import br.com.centralit.citcorpore.util.Arvore;
import br.com.centralit.citcorpore.util.CITCorporeUtil;
import br.com.centralit.citcorpore.util.ParametroUtil;
import br.com.citframework.dto.IDto;
import br.com.citframework.excecao.LogicException;
import br.com.citframework.excecao.PersistenceException;
import br.com.citframework.excecao.ServiceException;
import br.com.citframework.integracao.Condition;
import br.com.citframework.integracao.CrudDaoDefaultImpl;
import br.com.citframework.integracao.Field;
import br.com.citframework.integracao.Order;
import br.com.citframework.service.ServiceLocator;
import br.com.citframework.util.Constantes;
import br.com.citframework.util.SQLConfig;
public class UnidadeDao extends CrudDaoDefaultImpl {
public UnidadeDao() {
super(Constantes.getValue("DATABASE_ALIAS"), null);
}
private static final String SQL_NOMEUNIDADE = "select idunidade, nome from unidade where idunidade not in(select idunidade from usuario)";
private static final String SQL_NOMEEMPREGADO = "select idunidade, nome from unidade where idunidade not in(select idunidade from empregados)";
@Override
public Class<UnidadeDTO> getBean() {
return UnidadeDTO.class;
}
@Override
public Collection<Field> getFields() {
final Collection<Field> listFields = new ArrayList<>();
listFields.add(new Field("idUnidade", "idUnidade", true, true, false, false));
listFields.add(new Field("idUnidadePai", "idUnidadePai", false, false, false, false));
listFields.add(new Field("idTipoUnidade", "idTipoUnidade", false, false, false, false));
listFields.add(new Field("idEmpresa", "idEmpresa", false, false, false, false));
listFields.add(new Field("nome", "nome", false, false, false, false));
listFields.add(new Field("dataInicio", "dataInicio", false, false, false, false));
listFields.add(new Field("dataFim", "dataFim", false, false, false, false));
listFields.add(new Field("descricao", "descricao", false, false, false, false));
listFields.add(new Field("email", "email", false, false, false, false));
listFields.add(new Field("idEndereco", "idEndereco", false, false, false, false));
listFields.add(new Field("aceitaEntregaProduto", "aceitaEntregaProduto", false, false, false, false));
return listFields;
}
public Collection findSemPai() throws Exception {
final String sql = "SELECT idUnidade, idUnidadePai, nome, descricao, dataInicio FROM Unidade WHERE idUnidadePai IS NULL AND dataFim IS NULL ORDER BY nome ";
final List<?> colDados = this.execSQL(sql, null);
if (colDados != null) {
final List<String> fields = new ArrayList<>();
fields.add("idUnidade");
fields.add("idUnidadePai");
fields.add("nome");
fields.add("descricao");
fields.add("dataInicio");
return this.listConvertion(UnidadeDTO.class, colDados, fields);
}
return null;
}
public Collection findSemPaiMultContrato(final Integer idContrato) throws Exception {
final String sql = "SELECT idUnidade, idUnidadePai, nome, descricao, dataInicio FROM Unidade WHERE idUnidadePai IS NULL AND dataFim IS NULL and idUnidade in "
+ "(select idUnidade from ContratosUnidades where idContrato = ?) ORDER BY nome ";
final List<?> colDados = this.execSQL(sql, new Object[] {idContrato});
if (colDados != null) {
final List<String> fields = new ArrayList<>();
fields.add("idUnidade");
fields.add("idUnidadePai");
fields.add("nome");
fields.add("descricao");
fields.add("dataInicio");
return this.listConvertion(UnidadeDTO.class, colDados, fields);
}
return null;
}
public Collection findByIdPai(final Integer idPai) throws Exception {
final String sql = "SELECT idUnidade, idUnidadePai, nome, descricao, dataInicio FROM Unidade WHERE idUnidadePai = ? AND dataFim IS NULL ORDER BY nome ";
final List<?> colDados = this.execSQL(sql, new Object[] {idPai});
if (colDados != null) {
final List<String> fields = new ArrayList<>();
fields.add("idUnidade");
fields.add("idUnidadePai");
fields.add("nome");
fields.add("descricao");
fields.add("dataInicio");
return this.listConvertion(UnidadeDTO.class, colDados, fields);
}
return null;
}
@Override
public String getTableName() {
return "Unidade";
}
@Override
public Collection<UnidadeDTO> find(final IDto obj) throws PersistenceException {
return null;
}
@Override
public Collection list() throws PersistenceException {
final List<Order> list = new ArrayList<>();
list.add(new Order("nome"));
return super.list(list);
}
/**
* @return
* @throws Exception
* Lista idunidade e nome de unidade que n�o estejam cadastrado na tabela USUARIO
*/
public Collection findByIdUnidade() throws Exception {
final String sql = SQL_NOMEUNIDADE;
final List<Object> lista = this.execSQL(sql, null);
final List<String> listRetorno = new ArrayList<>();
listRetorno.add("idUnidade");
listRetorno.add("nome");
return engine.listConvertion(this.getBean(), lista, listRetorno);
}
/**
* @return
* @throws Exception
* Lista idunidade e nome de unidade que n�o estejam cadastrado na tabela EMPREGADOS
*/
public Collection findByIdEmpregado() throws Exception {
final String sql = SQL_NOMEEMPREGADO;
final List<?> lista = this.execSQL(sql, null);
final List<String> listRetorno = new ArrayList<>();
listRetorno.add("idUnidade");
listRetorno.add("nome");
return engine.listConvertion(this.getBean(), lista, listRetorno);
}
/**
* Verifica se idUnidade informado possui filho.
*
* @param idUnidade
* @return true - possui; false - n�o possui
* @throws PersistenceException
*/
public boolean verificarSeUnidadePossuiFilho(final Integer idUnidade) throws PersistenceException {
final StringBuilder sql = new StringBuilder();
final List<Integer> parametro = new ArrayList<>();
sql.append("SELECT idunidade FROM " + this.getTableName() + " where idunidadepai = ? and datafim is null ");
parametro.add(idUnidade);
final List<?> list = this.execSQL(sql.toString(), parametro.toArray());
if (list != null && !list.isEmpty()) {
return true;
}
return false;
}
/**
* Verifica se Unidade informada existe.
*
* @param unidadeDTO
* @return true - existe; false - n�o existe;
* @throws PersistenceException
*/
public boolean verificarSeUnidadeExiste(final UnidadeDTO unidadeDTO) throws PersistenceException {
final List<Object> parametro = new ArrayList<>();
final StringBuilder sql = new StringBuilder();
sql.append("SELECT idunidade FROM " + this.getTableName() + " WHERE nome = ? AND datafim IS NULL AND idunidade <> ? ");
parametro.add(unidadeDTO.getNome());
parametro.add(unidadeDTO.getIdUnidade() == null ? 0 : unidadeDTO.getIdUnidade());
final List<?> list = this.execSQL(sql.toString(), parametro.toArray());
if (list != null && !list.isEmpty()) {
return true;
}
return false;
}
public Collection findByNomeUnidade(final UnidadeDTO unidadeDTO) throws Exception {
final List<Condition> condicao = new ArrayList<>();
final List<Order> ordenacao = new ArrayList<>();
condicao.add(new Condition("nome", "=", unidadeDTO.getNome()));
condicao.add(new Condition(Condition.AND, "dataFim", "is", null));
ordenacao.add(new Order("nome"));
return super.findByCondition(condicao, ordenacao);
}
/**
* Filtra unidade pelo id
*
* @param idUnidade
* @return Collection
* @throws Exception
*/
public Collection findById(final Integer idUnidade) throws Exception {
final StringBuilder sql = new StringBuilder();
final List<Integer> parametro = new ArrayList<>();
sql.append("SELECT idunidade,nome,idunidadepai FROM " + this.getTableName() + " where idUnidade = ? and datafim is null ");
parametro.add(idUnidade);
final List<?> list = this.execSQL(sql.toString(), parametro.toArray());
final List<String> listRetorno = new ArrayList<>();
listRetorno.add("idUnidade");
listRetorno.add("nome");
listRetorno.add("idUnidadePai");
return engine.listConvertion(this.getBean(), list, listRetorno);
}
/**
* Lista as unidades ativas do contrato se o id passado for maior que zero do contr�rio traz todas as unidades ativas.
*
* @author euler.ramos
* @param idContrato
* @return
* @throws Exception
*/
public Collection<UnidadeDTO> listarAtivasPorContrato(final Integer idContrato) {
List result;
try {
final List<Integer> parametro = new ArrayList<>();
final List<String> listRetorno = new ArrayList<>();
listRetorno.add("idUnidade");
listRetorno.add("nome");
final StringBuilder sql = new StringBuilder();
sql.append("select u.idunidade,u.nome from unidade as u ");
if (idContrato > 0) {
sql.append("join contratosunidades as c on c.idcontrato=? and u.idunidade = c.idunidade ");
parametro.add(idContrato);
}
sql.append("where u.dataFim IS NULL ");
sql.append("order by u.nome");
final List<?> resp = this.execSQL(sql.toString(), parametro.toArray());
result = engine.listConvertion(this.getBean(), resp, listRetorno);
} catch (final PersistenceException e) {
e.printStackTrace();
result = null;
} catch (final Exception e) {
e.printStackTrace();
result = null;
}
return result == null || result.size() <= 0 ? new ArrayList<UnidadeDTO>() : result;
}
public Collection<UnidadeDTO> listUnidadePorContrato(final Integer idcontrato) throws Exception {
final StringBuilder sql = new StringBuilder();
final List<Integer> parametro = new ArrayList<>();
sql.append("SELECT uni.idunidade, uni.nome FROM unidade uni ");
sql.append("LEFT JOIN contratosunidades contratoUnidade ON uni.idunidade = contratoUnidade.idunidade ");
sql.append("LEFT JOIN contratos contr ON contratoUnidade.idcontrato = contr.idcontrato ");
sql.append("WHERE contr.idcontrato = ?");
parametro.add(idcontrato);
final List<?> list = this.execSQL(sql.toString(), parametro.toArray());
final List<String> listRetorno = new ArrayList<>();
listRetorno.add("idUnidade");
listRetorno.add("nome");
return engine.listConvertion(this.getBean(), list, listRetorno);
}
/**
* Procura pelas unidades ativas do contrato se o id passado for maior que zero do contr�rio traz todas as unidades ativas que possuem no nome o texto passado como par�metro.
*
* @author euler.ramos
* @param nome
* @param idContrato
* @return
* @throws Exception
*/
public Collection<UnidadeDTO> findByNomeEcontrato(String nome, final Integer idContrato, final Integer limite) {
List result;
try {
final List<Object> parametro = new ArrayList<>();
final List<String> listRetorno = new ArrayList<>();
listRetorno.add("idUnidade");
listRetorno.add("nome");
listRetorno.add("idUnidadePai");
final StringBuilder sql = new StringBuilder();
sql.append("select ");
//Limitando registros para n�o pesar a constru��o da lista hier�rquica no autocomplete
if (CITCorporeUtil.SGBD_PRINCIPAL.trim().toUpperCase().equalsIgnoreCase(SQLConfig.SQLSERVER) && limite != null && limite.intValue() > 0 ){
if ((limite != null)&&(limite.intValue()>0)){
sql.append("TOP "+limite.toString()+" ");
}
}
sql.append("u.idunidade, u.nome, u.idunidadepai from unidade as u ");
if (idContrato != 0 && idContrato != -1) {
sql.append("join contratosunidades as c on c.idcontrato=? and u.idunidade = c.idunidade ");
parametro.add(idContrato);
}
sql.append("where ");
if (CITCorporeUtil.SGBD_PRINCIPAL.trim().toUpperCase().equalsIgnoreCase(SQLConfig.ORACLE) && limite != null && limite.intValue() > 0) {
sql.append("(ROWNUM <= ?) and ");
parametro.add(limite);
}
sql.append("(u.dataFim IS NULL) ");
if (nome != null && nome.length() > 0) {
nome = "%" + nome.toUpperCase() + "%";
sql.append("and (UPPER(u.nome) like UPPER(?)) ");
parametro.add(nome);
}
sql.append("order by u.nome");
if ((CITCorporeUtil.SGBD_PRINCIPAL.trim().toUpperCase().equalsIgnoreCase(SQLConfig.POSTGRESQL)
|| CITCorporeUtil.SGBD_PRINCIPAL.trim().toUpperCase().equalsIgnoreCase(SQLConfig.MYSQL)) && limite != null && limite.intValue() > 0) {
sql.append(" LIMIT ? ");
parametro.add(limite);
}
final List resp = this.execSQL(sql.toString(), parametro.toArray());
result = engine.listConvertion(this.getBean(), resp, listRetorno);
} catch (final PersistenceException e) {
e.printStackTrace();
result = null;
} catch (final Exception e) {
e.printStackTrace();
result = null;
}
return result == null || result.size() <= 0 ? new ArrayList<UnidadeDTO>() : result;
}
/**
* @author euler.ramos
* @param idUnidade
* @param idContrato
* @return Retorna a unidade pesquisada pelo seu id, se o idContrato est� vinculado a ela
*/
public Collection<UnidadeDTO> findByIdEcontrato(Integer idUnidade, Integer idContrato) {
List result;
try {
List resp = new ArrayList();
List parametro = new ArrayList();
List listRetorno = new ArrayList();
listRetorno.add("idUnidade");
listRetorno.add("nome");
listRetorno.add("idUnidadePai");
StringBuilder sql = new StringBuilder();
sql.append("select ");
sql.append("u.idunidade, u.nome, u.idunidadepai from unidade as u ");
if ((idContrato!=null)&&(idContrato!=0)){
sql.append("join contratosunidades as c on c.idcontrato=? and u.idunidade = c.idunidade ");
parametro.add(idContrato);
}
sql.append("where ");
if ((idUnidade!=null)&&(idUnidade>0)){
sql.append("(u.idunidade=?) and ");
parametro.add(idUnidade);
}
sql.append("(u.dataFim IS NULL)");
resp = this.execSQL(sql.toString(), parametro.toArray());
result = this.engine.listConvertion(getBean(), resp, listRetorno);
} catch (PersistenceException e) {
e.printStackTrace();
result = null;
} catch (Exception e) {
e.printStackTrace();
result = null;
}
return (((result == null)||(result.size()<=0)) ? new ArrayList<UnidadeDTO>() : result);
}
/**
* Recupera a lista hier�rquica da unidade passada como par�metro
*
* @author euler.ramos
* @param unidadeDTO
* @return
* @throws Exception
*/
public List<UnidadeDTO> recuperaHierarquiaUnidade(final UnidadeDTO unidadeDTO) throws Exception {
final List<UnidadeDTO> hierarquiaUnidade = new ArrayList<UnidadeDTO>();
if (unidadeDTO != null) {
UnidadeDTO unAux = unidadeDTO;
do {
hierarquiaUnidade.add(0, unAux); // Desta forma ficar� na ordem de hierarquia
unAux = this.retornaUnidadePai(unAux);
} while (unAux != null && this.naoFoiAdicionado(unAux, hierarquiaUnidade)); // Pensar como evitar looping, por causa de elementos j� presentes na hierarquia (Erro
// de dados no banco)!!!!
}
return hierarquiaUnidade;
}
private boolean naoFoiAdicionado(final UnidadeDTO unAux, final List<UnidadeDTO> hierarquiaUnidade) {
boolean encontrou = false;
for (final UnidadeDTO unidadeDTO : hierarquiaUnidade) {
if (unidadeDTO.getIdUnidade().equals(unAux.getIdUnidade())) {
encontrou = true;
break;
}
}
return !encontrou;
}
/**
* Retorna o pai da unidade passada como par�metro
*
* @author euler.ramos
* @param unidadeDTO
* @return
* @throws Exception
*/
public UnidadeDTO retornaUnidadePai(final UnidadeDTO unidadeDTO) throws Exception {
// Se for o pr�prio retorna o mesmo objeto
if (unidadeDTO.getIdUnidade().equals(unidadeDTO.getIdUnidadePai())) {
return unidadeDTO;
} else {
if (unidadeDTO.getIdUnidadePai() == null) {
return null;
} else {
// Buscando no banco o pai da unidade
UnidadeDTO unidadePaiDTO;
final List<UnidadeDTO> listaPai = (List<UnidadeDTO>) this.findById(unidadeDTO.getIdUnidadePai());
if (listaPai != null && listaPai.size() > 0) {
unidadePaiDTO = listaPai.get(0);
} else {
unidadePaiDTO = null;
}
return unidadePaiDTO;
}
}
}
public String retornaNomeUnidadeByID(final Integer id) throws Exception {
UnidadeDTO unidadeDTO = new UnidadeDTO();
final List<UnidadeDTO> listaPai = (ArrayList<UnidadeDTO>) this.findById(id);
if ((listaPai != null) && (listaPai.size() > 0)) {
unidadeDTO = listaPai.get(0);
}
if (unidadeDTO != null) {
return unidadeDTO.getNome();
}
return null;
}
public String obtenIDsUnidadesUsuario(UsuarioDTO usuarioLogado) throws ServiceException, Exception {
String resultado = "";
if ((usuarioLogado!=null)&&(usuarioLogado.getIdUsuario()!=null)&&(usuarioLogado.getIdUsuario().intValue()>0)) {
EmpregadoDTO empregadoDTO = new EmpregadoDTO();
try {
EmpregadoService empregadoService = (EmpregadoService) ServiceLocator.getInstance().getService(EmpregadoService.class, null);
empregadoDTO.setIdEmpregado(usuarioLogado.getIdEmpregado());
empregadoDTO = (EmpregadoDTO) empregadoService.restore(empregadoDTO);
} catch (LogicException e1) {
e1.printStackTrace();
} catch (ServiceException e1) {
e1.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
Integer idUnidadeColaborador = ((empregadoDTO.getIdUnidade() != null) && (empregadoDTO.getIdUnidade().intValue() > 0)) ? empregadoDTO.getIdUnidade() : 0;
String tipoHierarquia = ParametroUtil.getValorParametroCitSmartHashMap(br.com.centralit.citcorpore.util.Enumerados.ParametroSistema.TIPO_HIERARQUIA_UNIDADE, "1");
Arvore arvore = new Arvore();
UnidadeService unidadeService = (UnidadeService) ServiceLocator.getInstance().getService(UnidadeService.class, null);
arvore = unidadeService.obtemArvoreUnidades("", 0, idUnidadeColaborador, tipoHierarquia, 0);
List<Integer> listaID = arvore.getListaID();
for (Integer id : listaID) {
if (resultado.length()>0){
resultado +=',';
}
resultado += id.toString();
}
}
return (resultado.length()>0)?resultado:"0";
}
public UnidadeDTO checkIsInContrato(Integer idUnidade, Integer idContrato) throws Exception{
StringBuilder sql = new StringBuilder();
List parametros = new ArrayList();
List retorno = new ArrayList();
sql.append("SELECT u.idUnidade, u.nome, u.idUnidadePai ");
sql.append("FROM unidade u ");
sql.append("JOIN contratosunidades c ON c.idUnidade = u.idUnidade ");
if(idUnidade != null){
sql.append("AND u.idUnidade = ? ");
parametros.add(idUnidade);
}
if(idContrato != null){
sql.append("AND c.idcontrato = ? ");
parametros.add(idContrato);
}
List resposta = execSQL(sql.toString(), parametros.toArray());
retorno.add("idUnidade");
retorno.add("nome");
retorno.add("idUnidadePai");
retorno = this.engine.listConvertion(getBean(), resposta, retorno);
if(retorno != null && !retorno.isEmpty()){
return (UnidadeDTO) retorno.toArray()[0];
}
return null;
}
}