package br.com.citframework.integracao;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import br.com.centralit.citcorpore.util.CITCorporeUtil;
import br.com.citframework.dto.LookupDTO;
import br.com.citframework.excecao.LogicException;
import br.com.citframework.util.Campo;
import br.com.citframework.util.Constantes;
import br.com.citframework.util.LookupFieldUtil;
import br.com.citframework.util.UtilDatas;
import br.com.citframework.util.UtilFormatacao;
/**
*
* @author rodrigo.oliveira
*
*/
@SuppressWarnings({"rawtypes","unchecked"})
public class LookupProcessConhecimentoDao extends LookupProcessDefaultDao {
public List processLookup(LookupDTO lookupObject) throws LogicException, Exception {
StringBuilder sql = new StringBuilder();
String camposDesejados = "";
String where = "";
LookupFieldUtil lookUpField = new LookupFieldUtil();
Collection colCamposRet = lookUpField.getCamposRetorno(lookupObject.getNomeLookup());
Iterator itRet = colCamposRet.iterator();
Campo cp;
//Os valores que podem ser consultados sao os referentes a:
while(itRet.hasNext()){
cp = (Campo)itRet.next();
if (!camposDesejados.equalsIgnoreCase("")){
camposDesejados = camposDesejados + ",";
}
camposDesejados = camposDesejados + cp.getNomeFisico();
}
//Montando sql de busca
sql.append("SELECT " + camposDesejados + " ");
sql.append("FROM " + lookUpField.getTabela(lookupObject.getNomeLookup()) + " ");
sql.append("INNER JOIN ");
sql.append("(SELECT MAX(idbaseconhecimento) AS idbaseconhecimento, MAX(versao), CASE WHEN versao = '1.0' ");
if(CITCorporeUtil.SGBD_PRINCIPAL.trim().equalsIgnoreCase("ORACLE")){
sql.append("THEN titulo ELSE SUBSTR(titulo,1, LENGTH(titulo) - 7) END FROM baseconhecimento WHERE datafim IS NULL AND STATUS = 'S' ");
sql.append("GROUP BY CASE WHEN versao = '1.0' THEN titulo ELSE SUBSTR(titulo,1, LENGTH(titulo) - 7) END) AS aux ");
}else{
sql.append("THEN titulo ELSE SUBSTRING(titulo,1, LENGTH(titulo) - 7) END FROM baseconhecimento WHERE datafim IS NULL AND STATUS = 'S' ");
sql.append("GROUP BY CASE WHEN versao = '1.0' THEN titulo ELSE SUBSTRING(titulo,1, length(titulo) - 7) END) AS aux ");
}
sql.append("ON baseconhecimento.idbaseconhecimento = aux.idbaseconhecimento ");
Collection colCamposPesq = lookUpField.getCamposPesquisa(lookupObject.getNomeLookup());
Iterator itPesq = colCamposPesq.iterator();
String obj = null;
int count = 1;
while(itPesq.hasNext()){
cp = (Campo)itPesq.next();
obj = null;
obj = this.getValueParmLookup(lookupObject, count);
if (obj != null){
String[] trataGetNomeFisico = cp.getNomeFisico().split("\\.");
String nomeFisico = cp.getNomeFisico();
if(trataGetNomeFisico.length > 1){
cp.setNomeFisico(trataGetNomeFisico[1]);
nomeFisico = trataGetNomeFisico[0] + "." + trataGetNomeFisico[1];
}
if (!obj.equalsIgnoreCase("")){
if (!where.equalsIgnoreCase("")){
where = where + " AND ";
}
if (cp.getType().equalsIgnoreCase(Constantes.getValue("FIELDTYPE_TEXT").trim()) || cp.getType().equalsIgnoreCase(Constantes.getValue("FIELDTYPE_TEXTAREA").trim())){
String func = Constantes.getValue("FUNCAO_CONVERTE_MAIUSCULO");
if (func != null && !func.trim().equalsIgnoreCase("")){
if(nomeFisico.equalsIgnoreCase("TITULO")){
where = where + func + "(baseconhecimento.titulo)";
} else if(nomeFisico.equalsIgnoreCase("CONTEUDO")){
where = where + func + "(baseconhecimento.conteudo)";
} else {
where = where + func + "(" + nomeFisico + ")";
}
}else{
where = where + cp.getNomeFisico();
}
where = where + " LIKE '%";
}else{
if (cp.getType().equalsIgnoreCase(Constantes.getValue("FIELDTYPE_COMBO").trim())){
where = where + cp.getNomeFisico();
where = where + " IN (";
}else if (cp.getType().equalsIgnoreCase("DATE")){
where = where + cp.getNomeFisico();
where = where + " = '";
}else{
where = where + cp.getNomeFisico();
where = where + " = ";
}
}
if (StringUtils.contains(obj, "'")){
obj = StringUtils.replace(obj, "'", "\\'");
}
where = where + obj;
if (cp.getType().equalsIgnoreCase(Constantes.getValue("FIELDTYPE_TEXT").trim()) ||
cp.getType().equalsIgnoreCase(Constantes.getValue("FIELDTYPE_TEXTAREA").trim())){
where = where + "%'";
}else if (cp.getType().equalsIgnoreCase("DATE")){
where = where + "'";
}else if (cp.getType().equalsIgnoreCase(Constantes.getValue("FIELDTYPE_COMBO").trim())){
where = where + ")";
}
}
}
count++;
}
String strAux;
if (!where.equalsIgnoreCase("")){
sql.append(" WHERE " + where);
strAux = lookUpField.getWhere(lookupObject.getNomeLookup());
if (!strAux.equalsIgnoreCase("")){
sql.append(" AND ");
sql.append(strAux);
}
}else{
strAux = lookUpField.getWhere(lookupObject.getNomeLookup());
if (!strAux.equalsIgnoreCase("")){
sql.append(" WHERE " + strAux);
}
}
Collection colCamposOrd = lookUpField.getCamposOrdenacao(lookupObject.getNomeLookup());
Iterator itOrd = colCamposOrd.iterator();
String ordem = "";
while(itOrd.hasNext()){
cp = (Campo)itOrd.next();
if (!ordem.equalsIgnoreCase("")){
ordem = ordem + ",";
}
ordem = ordem + cp.getNomeFisico();
}
if (!ordem.equalsIgnoreCase("")){
sql.append(" ORDER BY " + ordem);
}
//sql.append(" LIMIT 0,400");
String sqlFinal = sql.toString().toUpperCase();
List lista = execSQL(sqlFinal,null);
if(lista== null || lista.size()==0){
TransactionControler tc = this.getTransactionControler();
if (tc != null){
tc.close();
}
return null;
}
//Processa o resultado.
List result = new ArrayList();
if(lista== null || lista.size()==0){
TransactionControler tc = this.getTransactionControler();
if (tc != null){
tc.close();
}
return result;
}
if (lista.size() > 400){
TransactionControler tc = this.getTransactionControler();
if (tc != null){
tc.close();
}
throw new LogicException("A consulta retornou mais de 400 registros, por favor, especifique melhor a consulta!");
}
Iterator it = lista.iterator();
Campo campoAux;
int i;
Collection colAux;
Object auxObj;
while(it.hasNext()){
Object[] row = (Object[])it.next();
itRet = colCamposRet.iterator();
i = 0;
campoAux = null;
colAux = new ArrayList();
while(itRet.hasNext()){
cp = (Campo)itRet.next();
campoAux = new Campo(cp.getNomeFisico(),cp.getDescricao(),cp.isObrigatorio(),cp.getType(),cp.getTamanho());
if (cp.getType().equalsIgnoreCase(Constantes.getValue("FIELDTYPE_TEXT").trim()) ||
cp.getType().equalsIgnoreCase(Constantes.getValue("FIELDTYPE_TEXTAREA").trim())){
if(row[i]==null){
auxObj = new String("");
}else{
String str = new String(row[i].toString());
auxObj = str.replaceAll("\"", """).
replaceAll("'", "´");
}
campoAux.setObjValue(auxObj);
} else if (cp.getType().equalsIgnoreCase(Constantes.getValue("FIELDTYPE_DATE").trim())) {
if (row[i]==null){
campoAux.setObjValue(null);
}else{
auxObj = row[i];
if ((auxObj instanceof java.sql.Date)) {
campoAux.setObjValue(UtilDatas.dateToSTR((java.sql.Date) auxObj));
}else if ((auxObj instanceof java.sql.Timestamp)) {
campoAux.setObjValue(UtilDatas.dateToSTR((java.sql.Timestamp) auxObj));
}else{
campoAux.setObjValue(auxObj.toString());
}
}
} else if (cp.getType().equalsIgnoreCase(Constantes.getValue("FIELDTYPE_MOEDA").trim())) {
if (row[i]==null){
campoAux.setObjValue(null);
}else{
auxObj = row[i];
String valorTransf = null;
if ((auxObj instanceof Double)) {
valorTransf = UtilFormatacao.formatBigDecimal(new BigDecimal(((Double)auxObj).doubleValue()), 2);
}else if ((auxObj instanceof BigDecimal)) {
valorTransf = UtilFormatacao.formatBigDecimal(((BigDecimal)auxObj), 2);
}else{
valorTransf = auxObj.toString();
}
campoAux.setObjValue(valorTransf);
}
}
colAux.add(campoAux);
i++;
}
result.add(colAux);
}
TransactionControler tc = this.getTransactionControler();
if (tc != null){
tc.close();
}
return result;
}
}