<?php
//  vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: 
/**
* Consolidado de víctimas.
 *
 * PHP version 5
 *
 * @category  SIVeL
 * @package   SIVeL
 * @author    Vladimir Támara <vtamara@pasosdeJesus.org>
 * @copyright 2004 Dominio público. Sin garantías.
 * @license   http://creativecommons.org/licenses/publicdomain/ Dominio Público. Sin garantías.
 * @version   $Id: consolidado.php,v 1.36 2009/05/03 12:23:21 vtamara Exp $
 * @link      http://sivel.sf.net
*/

/**
 * Consolidado de víctimas.
 */

require_once "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 'misc.php';


/**
 * Responde a botón 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
 */
class AccionConsolidado extends HTML_QuickForm_Action
{

    /* 
     *
     */

    /**
     * Presenta categorias que conformaran cada columna de la tabla.
     * Depuración 
     * 
     * @param handle  &$db    Conexión a BD
     * @param array   $cataux Cat
     * @param unknown $pResto pResto
     * @param unknown $ncol   Número de columnas
     *
     * @return void   
     */
    function depTabla(&$db, $cataux, $pResto, $ncol) 
    {
        $n = 1;
        $sep = "";
        foreach ($cataux as $l => $lc) {
            $p = DB_DataObject::factory('parametros_reporte_consolidado');
            if (PEAR::isError($p)) {
                die($p->getMessage());
            }
            if ($n==($ncol+1)) {
                $rot = '(Resto)';
            } else if ($p->get($n)==1) {
                $rot = "(" . $p->rotulo.")";
            } else {
                $rot = '';
            }
            if ($n<($ncol+1) || ($pResto && $n==($ncol+1))) {
                echo $sep;
                echo "<b>$l " . $rot . ":</b>";
                foreach ($lc as $cc) {
                    echo $cc . " ";
                }
                $sep = "; ";
            }
            $n++;
        }
    }


    /**
     * Llena arreglo de presuntos responsables que conformaran cada columna de 
     *  la tabla.  Muestra en pantalla si muestra es true 
     * 
     * @param object  &$db     Conexión a BD
     * @param array   &$tpresp Tabla de presuntos responsables
     * @param unknown $muestra Muestra
     *
     * @return void   
     */
    function muestraPresp(&$db, &$tpresp, $muestra) 
    {
        $n = 1;
        $sep = "";
        $q = " SELECT distinct id_p_responsable " .
            "FROM p_responsable_agrede_persona ORDER BY 1";
        //die("q es $q<br>");
        $result = $db->query($q);
        if (PEAR::isError($result)) {
            die("Problema ejecutando consulta: '$q', " .
                $result->getMessage()."'");
        }
        $tpresp = array();
        $l = 1;
        while ($result->fetchInto($row)) {
            $d = DB_DataObject::factory('presuntos_responsables');
            if (PEAR::isError($d)) {
                die($d->getMessage());
            }
            $d->get($row[0]);
            $tpresp[$row[0]] = $l;
            if ($muestra) {
                echo "<b>" . $l . "</b>: " . $d->nombre.";";
            }
            $l++;
        }
    }



    /**
     * Realiza consulta
     * 
     * @param unknown &$page      Página
     * @param unknown $actionName nombre de la acción
     *
     * @return void   
     * @access public 
     */
    function perform(&$page, $actionName) 
    {
        $d = DB_DataObject::factory('categoria');
        if (PEAR::isError($d)) {
            die($d->getMessage());
        }
        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'] . ")");
        }

        $fb =& DB_DataObject_FormBuilder::create($d);
        $db =& $d->getDatabaseConnection();

        $pFini = varPostEscapa('fini');
        $pFfin = varPostEscapa('ffin');
        $pFinchasta = varPostEscapa('finchasta');
        $pResto = varPostEscapa('resto');
        assert($pFinchasta['Y'] == '' || ($pFinchasta['Y'] >= 1900));
        $pMuestra = varPostEscapa('muestra');
        $pIdClase   = varPostEscapa('id_clase');
        $pIdMunicipio = varPostEscapa('id_municipio');
        $pIdDepartamento = varPostEscapa('id_departamento');

        $campos = array('caso_id' => 'Cód.');
        $tablas = "victima, caso, categoria_personal, municipio, departamento";
        $where = "";

        busand_sinap($where, "victima.id_caso", "caso.id");
        busand_sinap($where, "victima.id", "categoria_personal.id_victima");
        busand($db, $where, "caso.fecha", 
            $GLOBALS['consulta_web_fecha_min'], ">=");
        busand($db, $where, "caso.fecha", 
            $GLOBALS['consulta_web_fecha_max'], "<=");

        $tgeo = "";
        if ($pIdClase != '') {
            $tgeo = "clase_caso, ";
            busand_sinap($where, "clase_caso.id_caso", "caso.id");
            busand_sinap($where, "clase_caso.id_departamento",
                $pIdDepartamento);
            busand_sinap($where, "clase_caso.id_municipio",
                $pIdMunicipio);
            busand_sinap($where, "clase_caso.id_clase", $pIdClase);
        } else if ($pIdMunicipio != '') {
            $tgeo = "municipio_caso, ";
            if ($where != "") {
                $where .= " AND ";
            }
            $where .= "(caso.id in (SELECT id_caso FROM municipio_caso " .
                "WHERE id_municipio='$pIdMunicipio' AND " .
                "id_departamento='$pIdDepartamento') ";
            $where .= "OR caso.id in (SELECT id_caso FROM clase_caso " .
                "WHERE id_municipio='$pIdMunicipio' AND " .
                "id_departamento='$pIdDepartamento') ";
            $where .= ")";
        } else if ($pIdDepartamento != '') {
            $tgeo = "departamento_caso, ";
            if ($where != "") {
                $where .= " AND ";
            }
            $where .= "(caso.id in (SELECT id_caso FROM departamento_caso " .
                "WHERE id_departamento='$pIdDepartamento') ";
            $where .= "OR caso.id in (SELECT id_caso FROM municipio_caso " .
                "WHERE id_departamento='$pIdDepartamento') ";
            $where .= "OR caso.id in (SELECT id_caso FROM clase_caso " .
                "WHERE id_departamento='$pIdDepartamento'))";
        }
        $q = "SELECT MAX(col_rep_consolidado) FROM categoria;";
        $ncol = $db->getOne($q);

        if (PEAR::isError($ncol)) {
            die($ncol->getMessage());
        }
        if ($ncol <= 0) {
            die('Falta información para reporte consolidado en tabla categoria');
        }
        $d->orderBy('id');
        $d->find();
        while ($d->fetch()) {
            if (isset($d->col_rep_consolidado) && $d->col_rep_consolidado > 0) {
                $ic = chr($d->col_rep_consolidado+64);
            } else {
                $ic = chr($ncol+65);
            }
            $cataux[$ic] = isset($cataux[$ic]) ? 
                $cataux[$ic]+array($d->id => $d->id) :
                array($d->id => $d->id); 
        }
        ksort($cataux);
        if ($pMuestra == "tabla") {
            $this->depTabla($db, $cataux, $pResto, $ncol); 
            echo "<p>Presuntos Responsables<br>";
        }
        $this->muestraPresp($db, $r_presp, $pMuestra == "tabla");
        $cat = $cataux;

        $nc2l = array();
        $sep = "";
        $tc = "";
        foreach ($cat as $c => $lc) {
            foreach ($lc as $nc) {
                $tc .= $sep . "'" . $nc . "'";
                $sep = ", ";
                $nc2l[$nc] = $c;
            }
        }

        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), "<=");
        }

        $q = " SELECT caso.id, victima.id, victima.nombre, caso.fecha, " .
            "categoria_personal.id_categoria FROM $tgeo victima, caso, " .
            "categoria_personal WHERE $where " ;
        $q = "(" . $q . ") ORDER BY 3";
        //echo "q es $q<br>";
        $result = $db->query($q);
        if (PEAR::isError($result)) {
            die("Problema ejecutando consulta: '$q', " .
                $result->getMessage()."'");
        }

        $datv = array();
        $dn = array();
        $tv = 0;
        while ($result->fetchInto($row)) {
            $excl = false;
            if ($pFinchasta['Y'] != '' && $pFinchasta['M'] != '' &&
                $pFinchasta['d'] != '') {
                    /* Se hace así porque puede haber casos que no
                    tengan asociado funcionario --cuando vienen de otro
                    banco (?), antiguos*/
                $q = "SELECT MIN(fecha_inicio) FROM funcionario_caso WHERE " .
                    "id_caso='" . $row[0] . "';";
                $rfc = $db->query($q);
                if (PEAR::isError($rfc)) {
                    die("Problema ejecutando consulta: '$q', " .
                    $rfc->getMessage()."'");
                }
                if ($rfc->fetchInto($minf)) {
                    $arf = explode('-', $minf[0]);
                    if ($pFinchasta['Y'] < $arf[0] ||
                      ($pFinchasta['Y'] == $arf[0] && $pFinchasta['M'] < $arf[1]) ||
                      ($pFinchasta['Y'] == $arf[0] && $pFinchasta['M'] == $arf[1] &&
                        $pFinchasta['d'] < $arf[2])) {
                        if ($pMuestra == "tabla") {
                            echo "Excluyendo :" . $row[0] . "<br>";
                            $excl = true;
                        }
                    }
                }
            }
            if (!$excl) {
                if (!isset($dv[$row[0]][$row[1]])) {
                    $datv[$tv] = array($row[0], $row[1], $row[2], $row[3]);
                    $tv++;
                }
                $dv[$row[0]][$row[1]][$nc2l[$row[4]]]=1;
            }
        }

        $suma = array();
        if ($pMuestra == "tabla") {
            echo "<table border='1'>\n";
            echo "<tr><th>Fecha</th><th>Ubicación</th><th>Víctimas</th>";
        } elseif ($pMuestra == "csv") {
            header("Content-type: text/csv");
            echo '"Fecha", "Ubicación", "Víctimas", ""';
        } elseif ($pMuestra == 'latex') {
            //header("Content-type: application/x-latex");
            echo "<pre>";
            echo '\\textbf{Fecha} & \\textbf{Ubicacion} & \\textbf{Víctimas} ';
        }
        foreach ($cat as $idcat => $cp) {
            if ($pResto || $idcat != chr($ncol+65)) {
                if ($pMuestra == "tabla") {
                    echo "<th>$idcat</th>";
                } elseif ($pMuestra == 'csv') {
                    echo ", \"$idcat\"";
                } elseif ($pMuestra == 'latex') {
                    echo "& \\textbf{" . $idcat . "} ";
                }
            }
            $suma[$idcat]=0;
        }
        if ($pMuestra == "tabla") {
            echo "<td>PR</td></tr>";
        } elseif ($pMuestra == 'csv') {
            echo ", PR\n";
        } elseif ($pMuestra == 'latex') {
            echo "& \textbf{PR} \\\\ \n\hline\n";
        }

        for ($v = 0;$v < $tv; $v++) {
            $idcaso = $datv[$v][0];
            $idvic = $datv[$v][1];
            $nom = $datv[$v][2];
            $fecha = $datv[$v][3];
            $ubi = "";
            $u =&  DB_DataObject::factory('clase_caso');
            if (PEAR::isError($u)) {
                die($u->getMessage());
            }
            $u->id_caso = $idcaso;
            if ($u->find()==0) {
                $u =&  DB_DataObject::factory('municipio_caso');
                $u->id_caso = $idcaso;
                if ($u->find()==0) {
                    $u =&  DB_DataObject::factory('departamento_caso');
                    $u->id_caso = $idcaso;
                    if ($u->find()==0) {
                        $u = null;
                        die("Caso sin localización: " .
                            "$idcaso -- estadística incompleta!!!");
                    }
                }
            }
            $u->fetch();
            if ($u != null) {
                $d = $u->getLink('id_departamento');
                $ubi = trim($d->nombre);
                if (isset($u->id_municipio)) {
                    $m =&  DB_DataObject::factory('municipio');
                    if (PEAR::isError($m)) {
                        die($u->getMessage());
                    }
                    $m->id = $u->id_municipio;
                    $m->id_departamento = $u->id_departamento;
                    if ($m->find()==0) {
                        die("Caso " . $idcaso . 
                            " referencia municipio inexistente " . 
                            $m->id.", " . $m->id_departamento);
                    }
                    $m->fetch();
                    $ubi .= " - ".trim($m->nombre);
                }
            }
 
            if ($pMuestra == "tabla") {
                echo "<tr><td>" . $fecha . "</td><td>" . $ubi . "</td><td>" .
                trim($nom)."</td>";
            } elseif ($pMuestra == 'csv') {
                echo $fecha . ", " . $ubi . ", ".trim($nom).", ";
            } elseif ($pMuestra == 'latex') {
                echo txt2latex($fecha)." & ".txt2latex($ubi).
                    " & ".txt2latex(trim($nom))." ";
            }
            foreach ($cat as $idcat => $cp) {
                if (isset($dv[$idcaso][$idvic][$idcat])) {
                    if ($pResto || $idcat != chr($ncol+65)) {
                        if ($pMuestra == "tabla") {
                            echo "<td>X</td>";
                        } elseif ($pMuestra == 'csv') {
                            echo ", X";
                        } elseif ($pMuestra == 'latex') {
                            echo "& X ";
                        }
                    }
                    if ($dv[$idcaso][$idvic][$idcat] == 1) {
                        $suma[$idcat]++;
                    } else {
                        die("Sobreconteo por caso " . $idcaso . 
                            " que saldría más de una vez en la columna " . 
                            $idcat);
                    }
                    $dv[$idcaso][$idvic][$idcat]++;
                } else {
                    if ($pResto || $idcat != chr($ncol+65)) {
                        if ($pMuestra == "tabla") {
                            echo "<td>&nbsp;</td>";
                        } elseif ($pMuestra == 'csv') {
                            echo ", ";
                        } elseif ($pMuestra == 'latex') {
                            echo "& ";
                        }
                    }
                }
            }
            $u =&  DB_DataObject::factory('p_responsable_agrede_persona');
            $u->id_victima = $idvic;
            if ($u->find()==0) {
                $u = null;
                echo "Víctima sin presunto responsable '$idvic', " .
                    "'$nom' en caso '$idcaso' -- estadística incompleta!!!";
            } else {
                $pr_sep = $presp = "";
                while ($u->fetch()) {
                    $d = $u->getLink('id_p_responsable');
                    $presp .= $pr_sep . $r_presp[$d->id];
                    $pr_sep = ";";
                    }
            }

 
            if ($pMuestra == "tabla") {
                echo "<td>" . $presp . "</td></tr>\n";
            } elseif ($pMuestra == 'csv') {
                echo ",$presp \n";
            } elseif ($pMuestra == 'latex') {
                echo "& $presp \\\\\n \hline\n";
            }

        }
        if ($pMuestra == "tabla") {
            echo "<tr><td></td><td></td><td></td>";
        } elseif ($pMuestra == 'csv') {
            echo '"", "", "", ""';
        } elseif ($pMuestra == 'latex') {
            echo ' & & ';
        }

        foreach ($cat as $idcat => $cp) {
            if ($pResto || $idcat != chr($ncol+65)) {
                if ($pMuestra == "tabla") {
                    echo "<td>" . $suma[$idcat] . "</td>";
                } elseif ($pMuestra == 'csv') {
                    echo ", " . $suma[$idcat];
                } elseif ($pMuestra == 'latex') {
                    echo "& " . $suma[$idcat] . " ";
                }
            }
        }
        if ($pMuestra == "tabla") {
            echo "</tr>";
            echo "</table>";
        } elseif ($pMuestra == 'csv') {
            echo "\n";
        } elseif ($pMuestra == 'latex') {
            echo "\\\\\n \hline\n";
        }
    }
}


/**
 * Formulario de reporte consolidado
 *
 * @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 PagConsolidado extends HTML_QuickForm_Page
{

    /**
     * Constructora.
     *
     * @return void
     */
    function PagConsolidado()
    {
        $this->HTML_QuickForm_Page('consolidado', 'post', '_self', null);

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


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


    /**
     * Construye formulario
     * 
     * @return void  
     * @access public
     */
    function buildForm()
    {
        encabezado_envia();
        $this->_formBuilt = true;
        $x =&  DB_DataObject::factory('departamento');
        $db = $x->getDatabaseConnection();

        $e =& $this->addElement('header', null, 'Reporte consolidado');

        $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', 'Clase: ', 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);
        }

        $cy = date('Y');
        if ($cy < 2005) {
            $cy = 2005;
        }
        $e =& $this->addElement('date', 'fini', 'Desde: ',
            array('language' => 'es', 'addEmptyOption' => true, 
            'minYear' => $GLOBALS['anio_min'], 'maxYear' => $cy));
        $e =& $this->addElement('date', 'ffin', 'Hasta', 
            array('language' => 'es', 'addEmptyOption' => true,
            'minYear' => $GLOBALS['anio_min'], 'maxYear' => $cy));
        if (isset($_SESSION['id_funcionario'])) {
            $aut_usuario = "";
            include "aut/conf.php";
            autenticaUsuario($dsn, $accno, $aut_usuario, 0);
            if (in_array(42, $_SESSION['opciones'])) {
                $e =& $this->addElement('date', 'finchasta', 
                    'Ingresado en base hasta', array('language' => 'es', 
                    'addEmptyOption' => true,
                    'minYear' => $GLOBALS['anio_min'], 'maxYear' => $cy));
                $e =& $this->addElement('checkbox', 'resto',
                    'Agregar columna con resto', '');
            }
        }

        $ae = array();
        $t =&  $this->createElement('radio', 'muestra', 'tabla',
            'Tabla HTML', 'tabla');
        $ae[] =& $t;
        $ae[] =&  $this->createElement('radio', 'muestra', 'csv',
            'Formato CSV (hoja de cálculo)', 'csv');
        $ae[] =&  $this->createElement('radio', 'muestra', 'latex',
            'LaTeX', 'latex');
        $this->addGroup($ae, null, 'Forma de presentación', '&nbsp;', false);
        $t->setChecked(true);

        $prevnext = array();
        $sel =& $this->createElement('submit',   
            $this->getButtonName('consulta'), 'Consulta');
        $prevnext[] =& $sel;

        $this->addGroup($prevnext, null, '', '&nbsp;', false);

        $tpie = "<div align=right><a href=\"index.php\">" .
            "Menú Principal</a></div>";
        $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');

    }

}

$aut_usuario = "";
autenticaUsuario($dsn, $accno, $aut_usuario, 43);

$wizard =& new HTML_QuickForm_Controller('Consolidado', false);
$consweb = new PagConsolidado();

$wizard->addPage($consweb);


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

$wizard->addAction('process', new AccionConsolidado());

$wizard->run();
?>
