/* * Sistema de Ouvidoria: um canal através do qual os usuários * podem encaminhar suas reclamações, elogios e sugestões. * * Copyright (C) 2011 SERPRO * * Este programa é software livre; você pode redistribuí-lo e/ou * modificá-lo sob os termos da Licença Pública Geral GNU, conforme * publicada pela Free Software Foundation; tanto a versão 2 da * Licença como (a seu critério) qualquer versão mais nova. * * Este programa é distribuído na expectativa de ser útil, mas SEM * QUALQUER GARANTIA; sem mesmo a garantia implícita de * COMERCIALIZAÇÃO ou de ADEQUAÇÃO A QUALQUER PROPÓSITO EM * PARTICULAR. Consulte a Licença Pública Geral GNU para obter mais * detalhes. * * Você deve ter recebido uma cópia da Licença Pública Geral GNU, * sob o título "LICENCA.txt", junto com esse programa. Se não, * acesse o Portal do Software Público Brasileiro no endereço * http://www.softwarepublico.gov.br/ ou escreva para a Fundação do * Software Livre (FSF) Inc., 51 Franklin St, Fifth Floor, Boston, * MA 02111-1301, USA. * * Contatos através do seguinte endereço internet: * http://www.serpro.gov.br/sistemaouvidoria/ */ package br.gov.serpro.ouvidoria.util; import java.sql.SQLException; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.oro.text.perl.Perl5Util; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.DynaActionForm; import br.gov.serpro.ouvidoria.controller.gerencial.administracao.OrgaoCtrl; import br.gov.serpro.ouvidoria.dao.DaoFactory; import br.gov.serpro.ouvidoria.dao.hibernate.HibernateDaoFactory; import br.gov.serpro.ouvidoria.model.Orgao; import br.gov.serpro.ouvidoria.util.collection.ArrayKit; import br.gov.serpro.ouvidoria.util.freechart.data.DBUtilsKit; import br.gov.serpro.ouvidoria.util.freechart.data.StringKit; /** * * @author SERPRO * @version $Revision: 1.1.2.5 $, $Date: 2011/10/21 18:53:46 $ * @version 0.1, Date: 2005/01/28 */ public class ReportHelperInt { public final static class ReportDynaActionForm extends DynaActionForm { private static final long serialVersionUID = 1L; public void reset(ActionMapping mapping, HttpServletRequest request) { this.set("sel_itens_tabela", new String[0]); } } public static String[] getTableList() { String[] result = ReportKit.getConfig().getStringArray( ReportKit.TABLE_LIST); return result; } public static List getComboList(HttpServletRequest request) throws SQLException { final DaoFactory daoFactory = new HibernateDaoFactory(); String sIndex = request.getParameter(ReportKit.SEL_TABELA); if (sIndex == null || sIndex.length() == 0) { sIndex = "-1"; } OrgaoCtrl orgaoCtrl = new OrgaoCtrl(daoFactory); return getComboList(sIndex, (Orgao) orgaoCtrl.get((String) request .getSession().getAttribute(Constants.ID_SESSAO_ORGAO))); } public static String getComboListsAsArray(HttpServletRequest request) throws SQLException { // obter o órgão atual final DaoFactory daoFactory = new HibernateDaoFactory(); OrgaoCtrl orgaoCtrl = new OrgaoCtrl(daoFactory); String idSessaoOrgao = (String) request.getSession().getAttribute( Constants.ID_SESSAO_ORGAO); Orgao orgao = (Orgao) orgaoCtrl.get(idSessaoOrgao); return getComboListsAsArray(orgao); } public static String getComboListsAsArray(Orgao orgao) throws SQLException { StringBuffer sb = new StringBuffer(15 * 1024); for (int i = 0; i < 12; i++) { ReportKit.toJSArray(_getComboList(String.valueOf(i), orgao) .iterator(), sb); sb.append(",\n"); } sb.setLength(sb.length() - 2); return sb.toString(); } public static List getComboList(String index, Orgao orgao) throws SQLException { return _getComboList(index, orgao); } private static List _getComboList(String index, Orgao orgao) throws SQLException { String query = ReportKit.getConfig().getString( ReportKit.II_COMBO_QUERY + index); if (isCodInstitTable(index)) { query = MessageFormat.format(query, new Object[] { orgao.getId() }); } return DBUtilsKit.selectAsListMap(query); } public static boolean isCodInstitTable(String index) { final String[] II_COD_INSTIT_TABLE_ARRAY = ReportKit.getConfig() .getStringArray(ReportKit.II_COD_INSTIT_TABLES); return ArrayKit.searchEqual(II_COD_INSTIT_TABLE_ARRAY, index) >= 0; } public static List getRecordList(HttpServletRequest request) throws SQLException { String query = getQuery(request); List result = DBUtilsKit.selectAsListMap(query); result.add(new Double(100f / ReportKit.getCountFromList(result))); return result; } public static Object getDataSet(String index, String chart_type, boolean detailed, boolean table_on_x_axis, Object[] ii_itens_tabela, String[] sel_itens_tabela, String h_locais, Orgao orgao, String txt_periodo_i, String txt_periodo_f) throws SQLException { String query = getQuery(index, chart_type, detailed, table_on_x_axis, ii_itens_tabela, sel_itens_tabela, h_locais, orgao, txt_periodo_i, txt_periodo_f); Object result = ReportKit.getDataSet(chart_type, !(detailed && table_on_x_axis), query, true); return result; } public static String getQuery(HttpServletRequest request) { boolean table_on_x_axis = false; final DaoFactory daoFactory = new HibernateDaoFactory(); if ("0".equalsIgnoreCase(request.getParameter("r_base_x"))) table_on_x_axis = true; boolean detail = false; if ("d".equalsIgnoreCase(request.getParameter("r_modo_exibicao"))) detail = true; OrgaoCtrl orgaoCtrl = new OrgaoCtrl(daoFactory); Orgao orgao = (Orgao) orgaoCtrl.get((String) request.getSession() .getAttribute(Constants.ID_SESSAO_ORGAO)); return getQuery(request.getParameter("sel_tabela"), request.getParameter("sel_tipo_grafico"), detail, table_on_x_axis, new ArrayList((List) request.getAttribute("ii_itens_tabela")) .toArray(), request.getParameterValues("sel_itens_tabela"), request.getParameter("h_locais"), orgao, request.getParameter("txt_periodo_i"), request.getParameter("txt_periodo_f")); } private final static Perl5Util p5Util = new Perl5Util(); public static String getNoOutrosQuery(HttpServletRequest request) { boolean table_on_x_axis = false; final DaoFactory daoFactory = new HibernateDaoFactory(); if ("0".equalsIgnoreCase(request.getParameter("r_base_x"))) table_on_x_axis = true; boolean detail = false; if ("d".equalsIgnoreCase(request.getParameter("r_modo_exibicao"))) detail = true; String index = request.getParameter("sel_tabela"); OrgaoCtrl orgaoCtrl = new OrgaoCtrl(daoFactory); Orgao orgao = (Orgao) orgaoCtrl.get((String) request.getSession() .getAttribute(Constants.ID_SESSAO_ORGAO)); Object[] ii_itens_tabela = new ArrayList( (List) request.getAttribute("ii_itens_tabela")).toArray(); String[] sel_itens_tabela = request .getParameterValues("sel_itens_tabela"); String noOutros = getClauseForNoOutros(index, ii_itens_tabela, sel_itens_tabela); if (noOutros == null) return null; String query = getQuery(index, request.getParameter("sel_tipo_grafico"), detail, table_on_x_axis, ii_itens_tabela, sel_itens_tabela, request.getParameter("h_locais"), orgao, request.getParameter("txt_periodo_i"), request.getParameter("txt_periodo_f")); query = p5Util .substitute("s/(GROUP\\sBY)/" + noOutros + " $1/i", query); return query; } public static String getQuery(String index, String chart_type, boolean detailed, boolean table_on_x_axis, Object[] ii_itens_tabela, String[] sel_itens_tabela, String h_locais, Orgao orgao, String txt_periodo_i, String txt_periodo_f) { final boolean isPie = chart_type.indexOf("pie") >= 0; final boolean processFirstFields = !(isPie && !table_on_x_axis); String baseQuery = ReportKit.getConfig().getString("ii.base.sql"); String dateCrit = ReportKit.getDateCrit(txt_periodo_i, txt_periodo_f); String locCrit = ReportKit.getLocationCrit(h_locais); String query = ""; String queryUnion = ""; String script = "Outros"; String firstFieldsKey = !detailed ? "ii.firstFields.cons." + (table_on_x_axis ? "table" : "loc") : "ii.firstFields.detail"; String firstFields = ReportKit.getConfig().getString(firstFieldsKey); if (processFirstFields) { firstFields = MessageFormat.format( firstFields, new Object[] { ReportKit.getConfig().getString( "ii.case_field.cons." + index), getCaseForTableItems(ii_itens_tabela, sel_itens_tabela) }); } String fromTable = ReportKit.getConfig().getString( ReportKit.II_FROM_TABLES + index); String whereTable = ReportKit.getConfig().getString( ReportKit.II_WHERE_TABLES + index); if (isCodInstitTable(index)) { whereTable = MessageFormat.format(whereTable, new Object[] { orgao.getId() }); } String groupByKey = !detailed ? "ii.groupBy.cons." + (table_on_x_axis ? "table" : "loc") : "ii.groupBy.detail"; String groupBy = ReportKit.getConfig().getString(groupByKey); query = MessageFormat.format( baseQuery, new Object[] { firstFields, fromTable, whereTable, dateCrit, locCrit + (table_on_x_axis ? "" : getWhereForTableItems(index, sel_itens_tabela)), groupBy }); // UNION para totalizar acionamentos realizados por SCRIPTS if (index.equals("10")) { baseQuery = ReportKit.getConfig().getString("ii.base.sql.union"); query = MessageFormat.format( baseQuery, new Object[] { firstFields, fromTable, whereTable, dateCrit, locCrit + (table_on_x_axis ? "" : getWhereForTableItems(index, sel_itens_tabela)) }); for (int i = 0; i < sel_itens_tabela.length; i++) { if (sel_itens_tabela[i].equals("")) { script = "Scripts"; break; } } queryUnion = " SELECT '" + script + "' as ID, count(distinct atend.cod_atend) as COUNT " + " FROM atendimento atend " + " , funcionariolocalocorrencia funloc " + " WHERE " + ReportKit.getDateCritUnion(txt_periodo_i, txt_periodo_f) + " AND funloc.cod_func = atend.cod_func " + " AND funloc.cod_local_ocorr IN (" + h_locais + ")" + " GROUP BY ID"; query = " SELECT a.ID, SUM(a.COUNT) as COUNT FROM (" + query + " UNION " + queryUnion + ") AS a GROUP BY a.ID ORDER BY ID"; } return query; } private static String getCaseForTableItems(Object[] ii_itens_tabela, String[] sel_itens_tabela) { if (sel_itens_tabela == null || sel_itens_tabela.length < 1) return ""; StringBuffer sb = new StringBuffer(1024); for (int i = 0; i < ii_itens_tabela.length; i++) { Map el = (Map) ii_itens_tabela[i]; Object elID = el.get("id"); if (ArrayKit.searchEqual(sel_itens_tabela, elID.toString()) < 0) continue; sb.append(" WHEN "); if (elID instanceof String) sb.append("'"); sb.append(elID); if (elID instanceof String) sb.append("'"); sb.append(" THEN '").append(el.get("descricao")).append("'"); } return sb.toString(); } private static String getClauseForNoOutros(String index, Object[] ii_itens_tabela, String[] sel_itens_tabela) { if (sel_itens_tabela == null || sel_itens_tabela.length < 1) return ""; StringBuffer sb = new StringBuffer(1024); sb.append(" AND " + ReportKit.getConfig() .getString("ii.case_field.cons." + index) + " in ("); int itemCount = 0; for (int i = 0; i < ii_itens_tabela.length; i++) { Object elID = ((Map) ii_itens_tabela[i]).get("id"); if (ArrayKit.searchEqual(sel_itens_tabela, elID.toString()) < 0) continue; if (elID instanceof String) sb.append("'"); sb.append(elID); if (elID instanceof String) sb.append("',"); else sb.append(","); itemCount++; } sb.setLength(sb.length() - 1); sb.append(")"); return itemCount == 0 ? null : sb.toString(); } private static String getWhereForTableItems(String index, String[] sel_itens_tabela) { if (sel_itens_tabela == null || sel_itens_tabela.length < 1) return ""; String sep = "1".equals(index) ? "'" : ""; boolean hasNull = false; String item; List list = new ArrayList(sel_itens_tabela.length); for (int i = 0; i < sel_itens_tabela.length; i++) { item = sel_itens_tabela[i]; if (item == null || item.length() < 1) { hasNull = true; continue; } list.add(item); } final String fieldName = ReportKit.getConfig().getString( "ii.case_field.cons." + index); String result = fieldName + " IN (" + StringKit.join(list.toArray(), sep, sep, ",") + ")"; if (hasNull) { result = "(" + result + " OR " + fieldName + " IS NULL)"; } return " AND " + result; } }