<?php
// vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: 
/**
 * Consulta para la página web.
 * Una versión inicial que sirvió de referencia fue desarrollada por
 * Mauricio Rivera (mauricio.rivera.p@gmail.com) en 2004.
 *
 * PHP version 5
 *
 * @category  SIVeL
 * @package   SIVeL
 * @author    Vladimir Támara <vtamara@pasosdeJesus.org>
 * @copyright 2005 Dominio público. Sin garantías.
 * @license   http://creativecommons.org/licenses/publicdomain/ Dominio Público. Sin garantías.
 * @version   $Id: consulta_web.php,v 1.71 2009/05/03 12:23:21 vtamara Exp $
 * @link      http://sivel.sf.net
 */

/**
 * Consulta web.
 */
include "aut/conf.php";
require_once 'HTML/QuickForm/Controller.php';

require_once 'HTML/QuickForm/Action/Display.php';
require_once 'HTML/QuickForm/Action/Next.php';
require_once 'HTML/QuickForm/Action/Back.php';
require_once 'HTML/QuickForm/Action/Jump.php';
require_once 'HTML/QuickForm/header.php';
require_once 'HTML/QuickForm/date.php';
require_once 'HTML/QuickForm/text.php';

require_once 'PagLocalizacion.php';
require_once 'PagTipoViolencia.php';
require_once 'ResConsulta.php';
require_once 'PagUbicacion.php';

/** 
 * Responde a botón para hacer consulta.
 *
 * @category SIVeL
 * @package  SIVeL
 * @author   Vladimir Támara <vtamara@pasosdeJesus.org>
 * @license  http://creativecommons.org/licenses/publicdomain/ Dominio Público.
 * @link     http://sivel.sf.net/tec
 * @see BuscaId
 */
class AccionConsultaWeb extends HTML_QuickForm_Action
{

    /**
     * Ejecuta acción
     *
     * @param object &$page      Página
     * @param string $actionName Acción
     *
     * @return void
     */
    function perform(&$page, $actionName)
    {
        $d = DB_DataObject::factory('departamento');
        if (PEAR::isError($d)) {
            die($d->getMessage());
        }
        $fb =& DB_DataObject_FormBuilder::create($d);
        $db =& $d->getDatabaseConnection();

        $pFini      = varPostEscapa('fini');
        $pFfin      = varPostEscapa('ffin');
        $pMostrar   = varPostEscapa('mostrar');
        $pOrdenar   = varPostEscapa('ordenar');
        $pUsuario   = varPostEscapa('usuario');
        $pIdCasos   = varPostEscapa('id_casos');
        $pIdClase   = varPostEscapa('id_clase');
        $pIdMunicipio = varPostEscapa('id_municipio');
        $pIdDepartamento = varPostEscapa('id_departamento');
        $pClasificacion = varPostEscapa('clasificacion');
        $pPresponsable = varPostEscapa('presponsable');
        $pSsocial= varPostEscapa('ssocial');
        $pApellido =  varPostEscapa('apellido');
        $pMFuentes  = varPostEscapa('m_fuentes');
        $pRetroalimentacion = varPostEscapa('retroalimentacion');
        $pVarLineas = varPostEscapa('m_varlineas');
        $pTeX = varPostEscapa('m_tex');
        $pTitulo =    varPostEscapa('titulo');
        $pFormato =   varPostEscapa('formato');

        if (!isset($_POST['evita_csrf']) ||
            $_POST['evita_csrf'] != $_SESSION['sin_csrf']) {
            die("Datos enviados no pasaron verificación CSRF (" .
            $_SESSION['sin_csrf'] . ", " . $_POST['evita_csrf'] . ")");
        }

        $campos = array(); //'caso_id' => 'Cód.');
        $tablas = "caso";
        $where = "";
        $ordCasos = array();
        if ($pIdCasos != '') {
            $ordCasos = explode(' ', $pIdCasos);
            $wc = "";
            foreach ($ordCasos as $cc) {
                busand($db, $wc, "caso.id", (int)$cc, "=", "OR");
            }
            if ($wc != "") {
                $where .= "(" . $wc . ") ";
            }
        }
        if ($pTitulo != '') {
            if ($where != "") {
                $where .= " AND ";
            }
            $where .= " (caso.titulo LIKE '%" . $pTitulo . "%') ";
        }
        if ($pFini['Y'] != '') {
            busand($db, $where, "caso.fecha", 
                arr_a_fecha($pFini, true), ">=");
        }
        if ($pFfin['Y'] != '') {
            busand($db, $where, "caso.fecha", 
                arr_a_fecha($pFfin, false), "<=");
        }

        busand($db, $where, "caso.fecha", 
            $GLOBALS['consulta_web_fecha_min'], ">=");
        busand($db, $where, "caso.fecha", 
            $GLOBALS['consulta_web_fecha_max'], "<=");

        if ($pIdClase != '') {
            busand_sinap($where, "clase_caso.id_caso", "caso.id");
            busand($db, $where, "clase_caso.id_departamento", 
                $pIdDepartamento);
            busand($db, $where, "clase_caso.id_municipio", 
                $pIdMunicipio);
            busand($db, $where, "clase_caso.id_clase", $pIdClase);
            $tablas .= ", clase_caso";
        } else if ($pIdMunicipio != '') {
            $mun = $pIdMunicipio;
            $pDep = $pIdDepartamento;
            if ($where != "") {
                $where .= " AND ";
            }
            $where .= "(caso.id in (SELECT id_caso FROM municipio_caso " .
                "WHERE id_municipio='$mun' AND " .
                "id_departamento='$pDep') ";
            $where .= "OR caso.id in (SELECT id_caso FROM clase_caso " .
                "WHERE id_municipio='$mun' AND " .
                "id_departamento='$pDep') ";
            $where .= ")";
        } else if ($pIdDepartamento != '') {
            $dep = $pIdDepartamento;
            if ($where != "") {
                $where .= " AND ";
            }
            $where .= "(caso.id in (SELECT id_caso FROM departamento_caso " .
                "WHERE id_departamento='$dep') ";
            $where .= "OR caso.id in (SELECT id_caso FROM municipio_caso " .
                "WHERE id_departamento='$dep') ";
            $where .= "OR caso.id in (SELECT id_caso FROM clase_caso " .
                "WHERE id_departamento='$dep'))";
        }
        //busor_muchos($where, $tablas, 'ubicacion_caso');

        if ($pClasificacion != '') {
            busand_sinap($where, "categoria_caso.id_caso", "caso.id");
            $ini = '(';
            $so = '';
            foreach ($pClasificacion as $cla) {
                $r = explode(":", $cla);
                $so2='';
                busand($db, $so2, "categoria_caso.id_tipo_violencia", $r[0]);
                busand($db, $so2, "categoria_caso.id_supracategoria", $r[1]);
                busand($db, $so2, "categoria_caso.id_categoria", $r[2]);
                $so .= $ini . $so2 . ')';
                $ini = ' OR (';
            }
            if ($so != '') {
                $where .= ' AND (' . $so . ')';
            }
            $tablas .= ", categoria_caso";
        } 

        if ($pPresponsable != '') {
            busand_sinap($where, "presuntos_responsables_caso.id_caso", 
                "caso.id");
            busand($db, $where, "presuntos_responsables_caso.id_p_responsable", 
                $pPresponsable);
            $tablas .= ', presuntos_responsables_caso';
        } 

        if ($pUsuario != '') {
            $tablas .= ", funcionario_caso";
            busand_sinap($where, "funcionario_caso.id_caso", "caso.id");
            busand($db, $where, "funcionario_caso.id_funcionario", $pUsuario);
        } 

        if ($pApellido != "" || $pSsocial != "") {
            $tablas .= ", victima";
            busand_sinap($where, "victima.id_caso", "caso.id");
        }

        if ($pSsocial != '') {
            busand($db, $where, "victima.id_sector_social", 
                $pSsocial);
        } 

        if ($pApellido != '') {
            if ($where != "") {
                $where .= " AND";
            }
            $where .= " (victima.nombre LIKE '%" . $pApellido . "%' " .
                " AND victima.id_caso=caso.id) ";
        }

        // Búsqueda por víctima no incluye combatientes para evitar sobreconteos
        // Emplear consulta_externa
        $conv = array('caso_id' => 0, 'caso_fecha' => 1, 'caso_memo' =>2);
        $q = "SELECT DISTINCT ";
        $sep = "";
        foreach ($conv as $k => $v) {
            $q .= $sep . str_replace("_", ".", $k);
            $sep = ", ";
        }
        $q .= " FROM " . $tablas
            ."  WHERE caso.id<>'" . $GLOBALS['idbus'] . "'" ;
        if ($where != "") {
            $q .= " AND " . $where;
        }
        ad_orden_cons($q, $pOrdenar);

        //echo "OJO q es $q";
        $result = $db->query($q);
        if (PEAR::isError($result)) {
            die("Problema ejecutando consulta q='$q', " .
                $result->getMessage()."'");
        }

        foreach ($GLOBALS['cw_ncampos'] as $idc => $dc) {
            if (isset($_REQUEST[$idc]) && $_REQUEST[$idc] == 1) {
                $campos[$idc] = $dc;
            }
        }
        if ($pMFuentes == 1 && in_array(42, $page->opciones)) { 
            $campos['m_fuentes'] = 'Fuentes';
        }

        $ar =& $result;
        $r = new ResConsulta($campos, $db, $ar, $conv, $pMostrar, 
            array('varlineas' => $pVarLineas, 'tex' => $pTeX),
            $ordCasos, null, $pOrdenar);
        $r->aHtml($pRetroalimentacion == 1);
    }
}


/** 
 * Fórmulario para consulta web.
 *
 * @category SIVeL
 * @package  SIVeL
 * @author   Vladimir Támara <vtamara@pasosdeJesus.org>
 * @license  http://creativecommons.org/licenses/publicdomain/ Dominio Público.
 * @link     http://sivel.sf.net/tec
 */
class ConsultaWeb extends HTML_QuickForm_Page
{

    /**
     * Opciones
     */
    var $opciones;

    /** 
     * Constructora 
     *
     * @param array $opciones opciones
     *
     * @return void
     */ 
    function ConsultaWeb($opciones)
    {
        $this->opciones = $opciones;
        $this->HTML_QuickForm_Page('consultaWeb', 'post', '_self', null);

        $this->addAction('id_departamento', new CamDepartamento());
        $this->addAction('id_municipio', new CamMunicipio()); 

        $this->addAction('consulta', new AccionConsultaWeb());
     }

    /**
     * Construye formulario.
     *
     * @return void
     */
    function buildForm()
    {
        $this->_formBuilt = true;
    
        $pMostrar   =varReqEscapa('mostrar');
        $pCategoria =varReqEscapa('categoria');
        $pSinCampos =varReqEscapa('sincampos');
        $pOrden     =varReqEscapa('orden');
   

        encabezado_envia('Consulta Web', $GLOBALS['cabezote_consulta_web']);
        $x =&  DB_DataObject::factory('departamento');
        $db = $x->getDatabaseConnection();
        
        $e =& $this->addElement('header', null, 'Periodo de Consulta ' .
            $GLOBALS['consulta_web_fecha_min'].
            ' hasta ' .
            $GLOBALS['consulta_web_fecha_max']);
    
        if ($this->opciones != array()) {
            $cod =& $this->addElement('text', 'id_casos', 
                'Código(s): ');
            $cod->setSize(80);
        }
     
        $sel =& $this->addElement('text', 'titulo', 'Titulo del caso:');
        $sel->setSize(80);
    
    
        $dep =& $this->addElement('select', 'id_departamento', 
            'Departamento: ', array());
            $options= array('' => '') + 
                $db->getAssoc("SELECT  id, nombre FROM departamento " .
                "ORDER BY nombre");
        $dep->loadArray($options);
        $dep->updateAttributes(array('onchange' => 
            'envia(\'consultaWeb:id_departamento\')'));
    
        $mun =& $this->addElement('select', 'id_municipio', 
            'Municipio: ', array());
        $mun->updateAttributes(array('onchange' => 
            'envia(\'consultaWeb:id_municipio\')'));
    
        $cla =& $this->addElement('select', 'id_clase',
            'Centro Poblado: ', array());
    
        $ndepartamento = idDepartamento($this);
        if ($ndepartamento != null) {
            $dep->setValue($ndepartamento);
            $options= array('' => '') +
                $db->getAssoc("SELECT  id, nombre FROM municipio " .
                "WHERE id_departamento='$ndepartamento' ORDER BY nombre");
            $mun->loadArray($options);
            $cla->loadArray(array());
        }
        $nmunicipio = idMunicipio($this);
        if ($nmunicipio != null && $ndepartamento != null) {
            $mun->setValue($nmunicipio);
            $options = array('' => '') +
                $db->getAssoc("SELECT id, nombre FROM clase " .
                "WHERE id_departamento='$ndepartamento' AND " .
                "id_municipio='$nmunicipio' ORDER BY nombre");
            $cla->loadArray($options);
        }
    
        $sel =& $this->addElement('text', 'apellido', 
            'Nombre o apellido de la víctima');
        $sel->setSize(80);
    
        $cy = date('Y');
        if ($cy < 2005) {
            $cy = 2005;
        }
        $ay = explode('-', $GLOBALS['consulta_web_fecha_min']);
        $e =& $this->addElement('date', 'fini', 'Desde: ',
            array('language' => 'es', 'addEmptyOption' => true, 
            'minYear' => $ay[0], 'maxYear' => $cy));
        $e =& $this->addElement('date', 'ffin', 'Hasta:', 
            array('language' => 'es', 'addEmptyOption' => true,
            'minYear' => $ay[0], 'maxYear' => $cy));
    
        $sel =& $this->addElement('select',   
            'presponsable', 'Presunto Responsable');
        $options = array('' => '') +
            $db->getAssoc("SELECT id, nombre FROM presuntos_responsables " .
            "WHERE fecha_deshabilitacion is null");
        $sel->loadArray($options);
    
        $sel =& $this->addElement('select', 'clasificacion',
            'Clasificación de Violencia');
        $sel->setMultiple(true);
        $sel->setSize(5);
        ResConsulta::llenaSelCategoria($db,
            "SELECT id_tipo_violencia, id_supracategoria, " .
            "id FROM categoria ORDER BY id_tipo_violencia," .
            "id_supracategoria, id;",
            $sel);
        if ($pCategoria == 'belicas') {
            $valscc = array();
            $d =&  DB_DataObject::factory('categoria');
            $d->id_tipo_violencia = 'C';
            $d->find();
            while ($d->fetch()) {
                $fc = PagTipoViolencia::cadenaDeCodcat($d->id_tipo_violencia,
                $d->id_supracategoria,
                $d->id);
                $valscc[] = $fc;
            }
            $sel->setValue($valscc); 
        }
        if ($pCategoria == 'nobelicas') {
            $valscc = array();
            $d =&  DB_DataObject::factory('categoria');
            $d->whereAdd('id_tipo_violencia<>\'C\'');
            $d->find();
            while ($d->fetch()) {
                $fc = PagTipoViolencia::cadenaDeCodcat($d->id_tipo_violencia,
                $d->id_supracategoria,
                $d->id);
                $valscc[] = $fc;
            }
            $sel->setValue($valscc); 
        }
    
        $sel =& $this->addElement('select',   
            'ssocial', 'Sector Social Víctima');
        $options = array('' => '') +
        $db->getAssoc("SELECT id, nombre FROM sector_social");
        $sel->loadArray($options);
     
        if (isset($_SESSION['id_funcionario'])) {
            include "aut/conf.php";
            $aut_usuario = "";
            autenticaUsuario($dsn, $accno, $aut_usuario, 0);
            if (in_array(42, $_SESSION['opciones'])) {
                $sel =& $this->addElement('select',
                    'usuario', 'Usuario');
                $options= array(''=>' ') +
                $db->getAssoc("SELECT id, nombre FROM funcionario");
                $sel->loadArray($options);
            }
        }
    
        $ae = array();
        $x =& $this->createElement('radio', 'ordenar', 'fecha', 'Fecha', 'fecha');
        $ae[] =&  $x;
        if ($pOrden == '' || $pOrden == 'fecha') {
            $t =& $x;
        }
        $x =& $this->createElement('radio', 'ordenar', 'localizacion', 
            'Localización', 'localizacion');
        $ae[] =& $x;
        if ($pOrden == 'localizacion') {
            $t =& $x;
        }
    
        if ($this->opciones != array()) {
            $x =& $this->createElement('radio', 'ordenar', 'codigo', 
                'Código', 'codigo');
            $ae[] =& $x; 
            if ($pOrden == 'codigo') {
                $t =& $x;
            }
        }
        $this->addGroup($ae, null, 'Ordenar por', '&nbsp;', false);
        $t->setChecked(true);
    
        $ae = array();
        $t =& $this->createElement('radio', 'mostrar', 'tabla', 'Tabla', 'tabla');
        $ae[] =&  $t;
    
        $x =&  $this->createElement('radio', 'mostrar', 'revista', 
            'Reporte Revista', 'revista');
        $ae[] =& $x;
        if ($pMostrar == 'revista') {
            $t =& $x;
        }
 
        if (isset($this->opciones) && in_array(42, $this->opciones)) {
            $x =&  $this->createElement('radio', 'mostrar',  
                'general', 'Reporte General', 'general');
            $ae[] =& $x;
            if ($pMostrar == 'general') {
                $t =& $x;
            }
        }

        $x =& $this->createElement('radio', 'mostrar', 'csv', 'CSV', 'csv');
        $ae[] =&  $x;
        if ($pMostrar == 'csv') {
            $t =& $x;
        }

        $this->addGroup($ae, null, 'Forma de presentación', '&nbsp;', false);
        $t->setChecked(true);
    
        $asinc = array();
        if ($pSinCampos != '') {
            $asinc = explode(',', $pSinCampos);
        }
        $opch = array();
        foreach ($GLOBALS['cw_ncampos'] as $idc => $dc) {
            if ($this->opciones != array() || $idc != 'caso_id') {
                $sel =& $this->createElement('checkbox',   
                    $idc, $dc, $dc);
                if (!in_array($idc, $asinc)) {     
                    $sel->setValue(true);
                }
                $opch[] =& $sel;
            }
        };
    
        if (in_array(42, $this->opciones)) { // Podría ver rep. gen?
            $sel =& $this->createElement('checkbox',   
                'm_fuentes', 'Fuentes', 'Fuentes');
            if (!in_array('m_fuentes', $asinc)) {     
                $sel->setValue(true);
            }
            $opch[] =& $sel;
        }
        $sel =& $this->createElement('checkbox',   
                'retroalimentacion', 'Retroalimentación', 'Retroalimentación');
        $sel->setValue(true);
        $opch[] =& $sel;
    
        $this->addGroup($opch, null, 'Campos por mostrar', '&nbsp;', false);
        
        $opch = array();
        $sel =& $this->createElement('checkbox',   
            'm_varlineas', 'Memo en varias lineas', 'Memo en varias lineas');
        if (!in_array('m_varlineas', $asinc)) {     
            $sel->setValue(true);
        }
        $opch[] =& $sel;
        $sel =& $this->createElement('checkbox',   
            'm_tex', 'Conversión a TeX', 'Conversión a TeX');
        if (!in_array('m_tex', $asinc)) {     
            $sel->setValue(false);
        }
        $opch[] =& $sel;

        $this->addGroup($opch, null, 'Detalles de la presentación', 
            '&nbsp;', false);
    
        $opch = array();
        $sel =& $this->createElement('submit',   
            $this->getButtonName('consulta'), 'Consulta');
        $opch[] =& $sel;
    
        $this->addGroup($opch, null, '', '&nbsp;', false);

        if (isset($this->opciones) && in_array(42, $this->opciones)) {
            $tpie = "<div align=right><a href=\"index.php\">" .
                "Menú Principal</a></div>";
        } else {
            $tpie = "&nbsp;";
        }
        $e =& $this->addElement('header', null, $tpie);

        if (!isset($_POST['evita_csrf'])) {
            $_SESSION['sin_csrf'] = mt_rand(0, 1000);
        }
        $this->addElement('hidden', 'evita_csrf', $_SESSION['sin_csrf']);

        $this->setDefaultAction('consulta');
    
    }

}


/**
 * Inicia Controlador del formulario
 *
 * @return void
 */
function runController() 
{
    $snru = nomSesion();
    if (!isset($_SESSION) || session_name()!=$snru) {
        session_name($snru);
        session_start();
    }

    /* No autenticamos porque pueden usarlo usuarios no autenticados */
    $nv = "_auth_" . $snru;
    $opciones = array();
    if (isset($_SESSION[$nv]['username'])) {
        $d = DB_DataObject::factory('caso');
        if (PEAR::isError($d)) {
            die($d->getMessage());
        }
        $db =& $d->getDatabaseConnection();
        $rol = "";
        sacaOpciones($_SESSION[$nv]['username'], $db, $opciones, $rol);
    }

    $wizard =& new HTML_QuickForm_Controller('Consulta', false);
    $consweb = new ConsultaWeb($opciones);

    $wizard->addPage($consweb);

    $wizard->addAction('display', new HTML_QuickForm_Action_Display());
    $wizard->addAction('jump', new HTML_QuickForm_Action_Jump());
    $wizard->addAction('process', new AccionConsultaWeb());

    $wizard->run();
}

runController();

?>
