<?php 
// vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker:
/**
 * Página del multi-formulario para capturar caso (captura_caso.php). 
 *
 * 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: PagTipoViolencia.php,v 1.60 2009/05/03 12:23:21 vtamara Exp $
 * @link      http://sivel.sf.net
 */

/**
 * Pestaña Tipo de Violencia de la ficha de captura de un caso
 */
require_once 'PagBaseSimple.php';
require_once 'ResConsulta.php';

/** 
 * Facilita cambio de supracategorias cuando el usuario cambia tipo de
 * violencia al menos en estadistica.php y estadistica_comb.php
 *
 * @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 CamTipoViolencia extends HTML_QuickForm_Action 
{
    /**
     * Ejecuta acción
     *
     * @param object &$page      Página
     * @param string $actionName Acción
     *
     * @return void
     */
    function perform(&$page, $actionName)
    {
        $_SESSION['camTipoViolencia'] = $page->_submitValues['id_tipo_violencia'];
        $pageName =  $page->getAttribute('id');
        $data     =& $page->controller->container();
        $data['values'][$pageName] = $page->exportValues();
        $data['valid'][$pageName]  = $page->validate();

        $page->handle('display');        
    }

}


/** 
 * Tipo de Violencia.
 * Ver documentación de funciones en clase base.
 *
 * @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 PagBaseSimple
*/
class PagTipoViolencia extends PagBaseSimple
{

    /* Variables DB_DataObject_FormBuilder */

    /** Categorias del caso */
    var $bcategoria_caso;

    /** Contextos del caso */
    var $bcaso_contexto;

    /** Antecedentes del caso */
    var $bantecedente_caso;
   
    var $titulo = 'Clasificación de Violencia';

    var $clase_modelo = 'categoria_caso';

    /**
     * Inicializa variables y datos de la pestaña.
     * Ver documentación completa en clase base.
     *
     * @return handle Conexión a base de datos
     */
     function iniVar()
    {
        list($db, $dcaso, $idcaso) = parent::iniVar(true, true);

        $dcategoria_caso =& DB_DataObject::factory('categoria_caso');
        $dcaso_contexto =& DB_DataObject::factory('caso_contexto');
        $dantecedente_caso =& DB_DataObject::factory('antecedente_caso');

        $dcaso->id = $dcategoria_caso->id_caso = $dcaso_contexto->id_caso
            = $dantecedente_caso->id_caso = $idcaso;
        $result = $db->query("SELECT  id FROM caso WHERE id='$idcaso'");
        $row = array();
        if (!isset($result) || PEAR::isError($result) ||
            (!$result->fetchInto($row) && $idcaso != $GLOBALS['idbus'])) {
                die("No pudo consultarse caso " . $idcaso);
        }
        $dcategoria_caso->find(); 
        $dcaso_contexto->find();
        $dantecedente_caso->find();

        $this->bcategoria_caso=& DB_DataObject_FormBuilder::create($dcategoria_caso,
            array('requiredRuleMessage' => $GLOBALS['mreglareq'],
                'ruleViolationMessage' => $GLOBALS['mreglavio'] ));
        $this->bcaso_contexto=& DB_DataObject_FormBuilder::create($dcaso_contexto,
            array('requiredRuleMessage' => $GLOBALS['mreglareq'],
                'ruleViolationMessage' => $GLOBALS['mreglavio'] ));
        $this->bantecedente_caso=& 
            DB_DataObject_FormBuilder::create($dantecedente_caso,
            array('requiredRuleMessage' => $GLOBALS['mreglareq'],
                'ruleViolationMessage' => $GLOBALS['mreglavio'] ));

        return $db;
    }

    /**
     * Constructora.
     * Ver documentación completa en clase base.
     *
     * @param string $nomForma Nombre 
     * @param string $mreq     Mensaje de dato requerido
     *
     * @return void
     */
    function PagTipoViolencia($nomForma, $mreq)
    {
        parent::PagBaseSimple($nomForma, $mreq, 'Clasificación de Violencia');

        $this->addAction('siguiente', new Siguiente('salvaTipoViolencia'));
        $this->addAction('anterior', new Anterior('salvaTipoViolencia'));
    }


    /**
     * Agrega elementos al formulario.
     * Ver documentación completa en clase base.
     *
     * @param handle &$db    Conexión a base de datos
     * @param string $idcaso Id del caso
     *
     * @return void
     *
     * @see PagBaseSimple
     */
    function formularioAgrega(&$db, $idcaso)
    {
        $sel =& $this->addElement('select', 'clasificacion',
            'Clasificación de Violencia');
        $sel->setMultiple(true);
        $sel->setSize(10);
        ResConsulta::llenaSelCategoria($db, 
            "SELECT id_tipo_violencia, id_supracategoria, " .
            "id FROM categoria ORDER BY id_tipo_violencia, id;",
            $sel);

        $this->bcaso_contexto->createSubmit = 0;
        $this->bcaso_contexto->useForm($this);
        $this->bcaso_contexto->getForm();

        $this->bantecedente_caso->createSubmit = 0;
        $this->bantecedente_caso->useForm($this);
        $this->bantecedente_caso->getForm();

        $this->bcaso->_do->fb_fieldsToRender = $this->bcaso->_do->fb_preDefOrder=
            array('bienes');
        $this->bcaso->createSubmit = 0;
        $this->bcaso->useForm($this);
        $this->bcaso->getForm();

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

    
    /**
     * Llena valores del formulario.  
     * Ver documentación completa en clase base.
     *
     * @param handle  &$db    Conexión a base de datos
     * @param integer $idcaso Id del caso
     *
     * @return void
     * @see PagBaseSimple
     */
    function formularioValores(&$db, $idcaso)
    {
        if (isset($_SESSION['recuperaErrorValida'])) {
            $v = $_SESSION['recuperaErrorValida'];
        } else {
            $scc =& $this->getElement('clasificacion');
            $valscc = array();
            $ndo = $this->bcategoria_caso->_do;
            $ndo->find();
            while ($ndo->fetch()) {
                $fc = $this->cadenaDeCodcat($ndo->id_tipo_violencia,
                    $ndo->id_supracategoria,
                    $ndo->id_categoria);
                $valscc[] = $fc;
            }
            $v['clasificacion'] = $valscc;

            //$scc->setValue($valscc); 

            $scd =& $this->getElement('id_contexto');
            $valscd = array();
            $ndo = $this->bcaso_contexto->_do;
            $ndo->find();
            while ($ndo->fetch()) {
                $valscd[] = $ndo->id_contexto;
            }
            //$scd->setValue($valscd); 
            $v['id_contexto'] = $valscd;

            $sca =& $this->getElement('id_antecedente');
            $valsca = array();
            $ndo = $this->bantecedente_caso->_do;
            $ndo->find();
            while ($ndo->fetch()) {
                $valsca[] = $ndo->id_antecedente;
            }
            $v['id_antecedente'] = $valsca;
            //$sca->setValue($valsca);  

            $v['bienes'] = $this->bcaso->_do->bienes;
            //$b =& $this->getElement('bienes');
            //$b->setValue($this->bcaso->_do->bienes);
        } 

        formularioValoresEstablece($this, array('clasificacion',
            'id_contexto', 'id_antecedente', 'bienes'), $v);

        if (isset($_SESSION['recuperaErrorValida'])) {
            unset($_SESSION['recuperaErrorValida']);
        }
    }


    /**
     * Elimina registros de tablas relacionadas con caso de este formulario.
     * Ver documentación completa en clase base.
     *
     * @param handle  &$db    Conexión a base de datos
     * @param integer $idcaso Id del caso
     *
     * @return void
     * @see PagBaseSimple
     */
    static function eliminaDep(&$db, $idcaso) 
    {
        assert($db != null);
        assert(isset($idcaso));
        $result = $db->query("DELETE FROM categoria_comunidad " .
            "WHERE id_caso='$idcaso'");
        $result = $db->query("DELETE FROM categoria_personal " .
            "WHERE id_victima IN (SELECT id FROM victima " .
            "WHERE id_caso='$idcaso')");
        $result = $db->query("DELETE FROM categoria_p_responsable_caso " .
            "WHERE id_caso='$idcaso'");
        $result = $db->query("DELETE FROM categoria_caso " .
            "WHERE id_caso='$idcaso'");
        $result = $db->query("DELETE FROM caso_contexto " .
            "WHERE id_caso='$idcaso'");
        $result = $db->query("DELETE FROM antecedente_caso " .
            "WHERE id_caso='$idcaso'");
    }

    /** Verifica si se violaría integridad referencial al cambiar 
    * una categoria
    *
    * @param handle  &$db     Base de datos
    * @param integer $idcaso  Número de caso
    * @param string  $tv      Tipo de Violencia
    * @param integer $s       Supracategoria
    * @param integer $c       Categoria
    * @param string  $fc      Categoria por mostrar al usuario
    * @param integer $valores Valores enviados por formulario
    *
    * @return bool Verdadero si y solo cumple integridad ref.
    */
    static function integridadRef(&$db, $idcaso, $tv, $s, $c, $fc, $valores)
    {
        $q = "SELECT COUNT(id_p_responsable) FROM " .
            "categoria_p_responsable_caso WHERE " .
            "id_caso='" . $idcaso . "' AND " .
            "id_tipo_violencia='" . $tv . "' AND " .
            "id_supracategoria='" . $s . "' AND " .
            "id_categoria='" . $c . "'";
        $nr = $db->getOne($q);            
        if ($nr > 0) {
            errorValida('Hay ' . $nr . ' presunto(s) responsable(s) ' .
            ' con la clasificación ' . $fc.
            '.<br>  Por favor cambielo(s) antes', $valores);
            return false;
        }
        $q = "SELECT COUNT(id_victima) FROM " .
        "categoria_personal, victima WHERE " .
        "id_victima=victima.id AND " .
        "victima.id_caso='" . $idcaso . "' AND " .
        "id_tipo_violencia='" . $tv . "' AND " .
        "id_supracategoria='" . $s . "' AND " .
        "id_categoria='" . $c . "'";
        $nr = $db->getOne($q);            
        if ($nr > 0) {
            errorValida('Hay ' . $nr . ' victima(s) individual(es) ' .
            ' con la clasificación ' . $fc.
            '.<br>  Por favor cambiela(s) antes', $valores);
            return false;
        }
        $q = "SELECT COUNT(id_v_colectiva) FROM " .
        "categoria_comunidad WHERE " .
        "id_caso='" . $idcaso . "' AND " .
        "id_tipo_violencia='" . $tv . "' AND " .
        "id_supracategoria='" . $s . "' AND " .
        "id_categoria='" . $c . "'";
        $nr = $db->getOne($q);            
        if ($nr > 0) {
            errorValida('Hay ' . $nr . ' victima(s) colectiva(s)' .
            ' con la clasificación ' . $fc.
            '.<br>  Por favor cambiela(s) antes', $valores);
            return false;
        }
        return true;
    }

    /**
     * Procesa valores del formulario enviados por el usuario.
     * Ver documentación completa en clase base.
     *
     * @param handle &$valores Valores ingresados por usuario
     *
     * @return bool Verdadero si y solo si puede completarlo con éxito
     * @see PagBaseSimple
     */
    function procesa(&$valores) 
    {
        $es_vacio=!isset($valores['clasificacion']) &&
            (!isset($valores['id_contexto']) 
            || $valores['id_contexto'] == array()) &&
            (!isset($valores['id_antecedente']) 
            || $valores['id_antecedente'] == array()) &&
            ($valores['bienes'] == null || $valores['bienes'] == '');

        if ($es_vacio) {
            return true;
        }
        if (!$this->validate() ) {
            return false;
        }

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


        $db = $this->iniVar();

        $idcaso = $this->bcaso->_do->id;

        // Verificamos no ir a violar integridad referencial
        // en caso de modificación
        $ndo = $this->bcategoria_caso->_do;
        while ($ndo->fetch()) {
            $fc = $this->cadenaDeCodcat($ndo->id_tipo_violencia,
                $ndo->id_supracategoria,
                $ndo->id_categoria);
            if (!in_array($fc, $valores['clasificacion'])) {
                // Modificación detectada fc ya no está
                if (!$this->integridadRef($db, $idcaso, 
                    $ndo->id_tipo_violencia, $ndo->id_supracategoria,
                    $ndo->id_categoria, $fc, $valores)) {
                    return false;
                }
                $q= "DELETE FROM categoria_caso WHERE " .
                    "id_caso='" . $idcaso . "' AND " .
                    "id_tipo_violencia='" .
                    $ndo->id_tipo_violencia . "' AND " .
                    "id_supracategoria='" .
                    $ndo->id_supracategoria . "' AND " .
                    "id_categoria='" .
                    $ndo->id_categoria."'";
                $result = $db->query($q);
            }
        }

        $result = $db->query("DELETE FROM caso_contexto " .
            "WHERE id_caso='$idcaso'");
        $result = $db->query("DELETE FROM antecedente_caso " .
            "WHERE id_caso='$idcaso'");
        //        if (!isset($result) || PEAR::isError($result) ||
        if (isset($valores['clasificacion']) && 
            is_array($valores['clasificacion'])) {
            foreach ($valores['clasificacion'] as $k => $v) {
                $this->bcategoria_caso->_do->id_caso = $idcaso;
                $this->codcatDeCadena(varEscapa($v, $db), 
                    $this->bcategoria_caso->_do->id_tipo_violencia,
                    $this->bcategoria_caso->_do->id_supracategoria,
                    $this->bcategoria_caso->_do->id_categoria);
                $this->bcategoria_caso->_do->insert();
            }
        }
        if (isset($valores['id_contexto'])) {
             foreach ($valores['id_contexto'] as $k => $v) {
                 $this->bcaso_contexto->_do->id_caso = $idcaso;
                 $this->bcaso_contexto->_do->id_contexto = $v;
                 $this->bcaso_contexto->_do->insert();
            }
        }

        if (isset($valores['id_antecedente'])) {
             foreach ($valores['id_antecedente'] as $k => $v) {
                 $this->bantecedente_caso->_do->id_caso = $idcaso;
                 $this->bantecedente_caso->_do->id_antecedente = $v;
                 $this->bantecedente_caso->_do->insert();
             }
        }
        $this->bcaso->forceQueryType(DB_DATAOBJECT_FORMBUILDER_QUERY_FORCEUPDATE);

        $ret = $this->process(array(&$this->bcaso, 'processForm'), 
            false);
        funcionario_caso($_SESSION['basicos_id']);
        return  $ret;
    }

    /** 
    * Retorna una cadena que identifica una categoria (con tipo de violencia
    * y supracategoria).
    *
    * @param string  $tv Tipo de violencia
    * @param integer $s  Supracategoria
    * @param integer $c  Categoria
    *
    * @return string Identificación
    */
    function cadenaDeCodcat($tv, $s, $c) 
    {
        return $tv . ":" . $s . ":" . $c;
    }

    /** 
    * Dada una cadena creada con cadenaDeCodcat retorna el 
    * código de la categoria llenando las referencias.
    *
    * @param string  $cadena identificación retornada por cadenaDeCodcat
    * @param string  &$tv    Referencia donde llena tipo de violencia
    * @param integer &$s     Referencia para poner supracategoria
    * @param integer &$c     Referencia para poner categoria
    *
    * @return void
    */
    function codcatDeCadena($cadena, &$tv, &$s, &$c) 
    {
        $t = explode(":", $cadena);
        $tv = $t[0];
        $s = $t[1];
        $c = $t[2];
    }

    /**
     * Prepara consulta SQL para buscar datos de este formulario.
     * Ver documentación completa en clase base.
     *
     * @param string &$w       Consulta que se construye
     * @param string &$t       Tablas
     * @param object &$dCaso   Objeto con caso
     * @param string &$subcons Subconsulta
     *
     * @return void
     * @see PagBaseSimple
     */
    function datosBusqueda(&$w, &$t, &$dCaso, &$subcons) 
    {
        $db = $dCaso->getDatabaseConnection();
        busor_muchos($w, $t, 'categoria_caso');
        busor_muchos($w, $t, 'caso_contexto');
        busor_muchos($w, $t, 'antecedente_caso');
        busand($db, $w, "caso.bienes", $dCaso->bienes);
    }

}

?>
