<?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: PagPResponsables.php,v 1.53 2009/05/03 12:23:21 vtamara Exp $
 * @link      http://sivel.sf.net
 */

/**
 * Pestaña Presuntos Responsables de la ficha de captura de caso
 */
require_once 'PagBaseMultiple.php';
require_once 'ResConsulta.php';
require_once 'Presuntos_responsables.php';

/** 
 * Página presuntos responsables.
 * 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 PagBaseMultiple
*/
class PagPResponsables extends PagBaseMultiple
{
    /** Relaciona caso con presuntos responsables */
    var $bpresuntos_responsables_caso;
    /** Categorias de cada presunto responsable */
    var $bcategoria;

    var $titulo = 'Presuntos Responsables';

    var $tcorto = 'P. Resp.';

    var $pref = "fpr";

    var $nuevaCopia = false;

    var $clase_modelo = 'presuntos_responsables_caso';

    /**
     * Pone en null variables asociadas a tablas de la pestaña.
     *
     * @return null
     */
    function nullVar() 
    {
        $this->bpresuntos_responsables_caso = null;
        $this->bcategoria = null;
    }

    /**
     * Retorna una identificación del registro actual. 
     *
     * @return string Identifación
     */
    function copiaId()
    {
        return $this->bpresuntos_responsables_caso->_do->id_p_responsable .
            ":" . $this->bpresuntos_responsables_caso->_do->id;
    }

    /**
     * Elimina de base de datos el registro actual.
     *
     * @param array &$valores Valores enviados por formulario.
     *
     * @return null
     */
    function elimina(&$valores)
    {
        if ($valores['id'] != null) {
            $do =& DB_DataObject::factory('presuntos_responsables_caso');
            $db =& $do->getDatabaseConnection();
            $do->id_caso = $_SESSION['basicos_id'];
            $do->id_p_responsable = varEscapa($valores['id_p_responsable'], $db);
            $do->id = varEscapa($valores['id'], $db);
            if (PagPResponsables::integridadRef($db, $do->id_caso, 
                $do->id_p_responsable, 'eliminar', $valores) && $do->find()==1) {
                $q = "DELETE FROM " .
                    "categoria_p_responsable_caso WHERE " .
                    "id_caso='" . (int)$do->id_caso . "' AND " .
                    "id='" . varEscapa($do->id, $db) . "' AND " .
                    "id_p_responsable='" .
                    varEscapa($do->id_p_responsable, $db) . "';";
                $db->query($q);
                $do->delete();
                $_SESSION['fpr_total']--;
            }

        }
    }




    /**
     * 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()
    {
        $drespCaso =& DB_DataObject::factory('presuntos_responsables_caso');
        $dcategoria =& DB_DataObject::factory('categoria_p_responsable_caso');

        $db =& $drespCaso->getDatabaseConnection();
        $idcaso =& $_SESSION['basicos_id'];
        if (!isset($idcaso) || $idcaso == null) {
            die("Bug: idcaso no debería ser null");
        }

        $idp = array();
        $idp2 = array();
        $ndp = array();
        $tot = ResConsulta::extrae_presponsables($idcaso, $db, $idp, 
            $idp2, $ndp);

        $_SESSION['fpr_total'] = $tot;
        $drespCaso->id_caso = $idcaso;
        $dcategoria->id_caso = $idcaso;
        if ($_SESSION['fpr_pag'] < 0 || $_SESSION['fpr_pag'] >= $tot) {
            $drespCaso->id_p_responsable = null;
            $q = "SELECT (max(id)) FROM " .
                    "presuntos_responsables_caso WHERE " .
                    "id_caso='" . $idcaso . "'";
            $id = (int)($db->getOne($q)) + 1;
            $drespCaso->id = $id;
            $dcategoria->id_p_responsable = null;
            $dcategoria->id = null;
            $dcategoria->id_tipo_violencia = null;
            $dcategoria->id_supracategoria = null;
            $dcategoria->id_categoria = null;
        } else {
            $drespCaso->id_p_responsable = $idp[$_SESSION['fpr_pag']];
            $drespCaso->id = $idp2[$_SESSION['fpr_pag']];
            $drespCaso->find();
            $drespCaso->fetch();
            $dcategoria->id_p_responsable = $idp[$_SESSION['fpr_pag']];
            $dcategoria->id = $idp2[$_SESSION['fpr_pag']];
        }

        $this->bpresuntos_responsables_caso =& 
            DB_DataObject_FormBuilder::create($drespCaso,
            array('requiredRuleMessage' => $GLOBALS['mreglareq'],
                'ruleViolationMessage' => $GLOBALS['mreglavio'] ));
        $this->bcategoria =& DB_DataObject_FormBuilder::create($dcategoria,
            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 PagPResponsables($nomForma, $mreq)
    {
        parent::PagBaseMultiple($nomForma, $mreq, 'Presuntos Responsables',
            'Responsable', 'fpr', 'presuntos_responsables_caso');

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


    /**
     * 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)
    {
        if (isset($this->bpresuntos_responsables_caso->_do->id)) {
            $vv = $this->bpresuntos_responsables_caso->_do->id;
        } else {
            $vv = '';
        }
        $this->addElement('hidden', 'id', $vv);

        $this->bpresuntos_responsables_caso->createSubmit = 0;
        $q = "SELECT DISTINCT tipo FROM presuntos_responsables_caso " .
            "WHERE id_caso='" . $_SESSION['basicos_id'] . "' " .
            "ORDER BY tipo;";
        $result = $db->query($q);
        if (PEAR::isError($result)) {
            die($result->getMessage());
        }
        $row = array();
        $l = array('0' => 'A', '1' => 'B', '2'=> 'C');
        $op = array();
        reset($l);
        while ($result->fetchInto($row)) {
            list($llave, $op[$row[0]]) = each($l);
        }
        while (count($op)<3) {
            list($llave, $op[]) = each($l);
        }
        $this->bpresuntos_responsables_caso->_do->es_enumOptions['tipo'] = $op;
        if (isset($_SESSION['forma_modo']) && 
            $_SESSION['forma_modo'] == 'busqueda') {
                $this->bpresuntos_responsables_caso->_do->es_enumOptions['tipo']=
                    array('' => '') + $op;
        }

        $this->bpresuntos_responsables_caso->useForm($this);
        $this->bpresuntos_responsables_caso->getForm();

        $sel =& $this->addElement('select', 'clasificacion',
            'Clasificación de Violencia');
        $this->addRule('clasificacion', 'requerido', 
            'Clasificación de Violencia', 'required', '', 'client');
        $sel->setMultiple(true);
        ResConsulta::llenaSelCategoria($db, 
            "SELECT id_tipo_violencia, id_supracategoria, " .
            "id_categoria FROM categoria_caso " .
            "WHERE id_caso='" . 
            $this->bpresuntos_responsables_caso->_do->id_caso . "';", 
            $sel);

        $_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)
    {
        $d =& DB_DataObject::factory('presuntos_responsables_caso');
        $campos = array_merge(array('id_p_responsable', 'clasificacion'), 
            $d->fb_fieldsToRender);

        if (isset($_SESSION['recuperaErrorValida'])) {
            $v = $_SESSION['recuperaErrorValida'];
        } else {
            $v['id_p_responsable'] = 
                $this->bpresuntos_responsables_caso->_do->id_p_responsable;
    
    /*        $pr=& $this->getElement('id_p_responsable');
            $pr->setValue($this->bpresuntos_responsables_caso->
                _do->id_p_responsable);
            $scc =& $this->getElement('clasificacion');
     */
            $valscc = array();
            if (isset($_SESSION['nuevo_copia_id']) &&
                strstr($_SESSION['nuevo_copia_id'], ':') != false) {
                list($idpr, $id) = explode(':', $_SESSION['nuevo_copia_id']);
                unset($_SESSION['nuevo_copia_id']);
                $d->id_caso = $idcaso;
                $d->id_p_responsable = $idpr;
                $d->id = $id;
                $d->find();
                $d->fetch();
                foreach ($d->fb_fieldsToRender as $c) {
                    $cq = $this->getElement($c); 
                    $v[$c] = $d->$c;
//                    $cq->setValue($d->$c);
                }
                $dc =& DB_DataObject::factory('categoria_p_responsable_caso');
                $dc->id_caso = $idcaso;
                $dc->id_p_responsable = $idpr;
                $dc->id = $id;
                $dc->find();
                while ($dc->fetch()) {
                    $valscc[] = $dc->id_tipo_violencia . ":" .
                    $dc->id_supracategoria . ":" .
                    $dc->id_categoria;
                }
                $v['clasificacion'] = $valscc;
    //            $scc->setValue($valscc);
            }
            if (isset($this->bcategoria->_do->id) &&
                isset($this->bcategoria->_do->id_p_responsable)) {
                $this->bcategoria->_do->find();
                while ($this->bcategoria->_do->fetch()) {
                    $valscc[] = $this->bcategoria->_do->id_tipo_violencia . 
                        ":" . $this->bcategoria->_do->id_supracategoria . 
                        ":" . $this->bcategoria->_do->id_categoria;
                }
                $v['clasificacion'] = $valscc;
            //$scc->setValue($valscc);
            }
        }
        
        formularioValoresEstablece($this, $campos, $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));
        $q = "DELETE FROM categoria_p_responsable_caso WHERE id_caso='$idcaso'";
        $db->query($q);

        $q = "DELETE FROM presuntos_responsables_caso WHERE id_caso='$idcaso'";
        $db->query($q);
    }

     /** Verifica integridad referencial antes de eliminar o modificar
     *
     * @param handle  &$db     Base de datos
     * @param integer $idcaso  Id. del caso
     * @param integer $idpres  Id del presunto responsable
     * @param integer $accion  Acción
     * @param integer $valores Valores enviados por formulario
     *
     * @return bool Verdaderdo si y solo si hay integridad referencial
     */
    static function integridadRef(&$db, $idcaso, $idpres, $accion, $valores) 
    {
        $q = "SELECT COUNT(id_victima) FROM " .
        "p_responsable_agrede_persona, victima WHERE " .
        "victima.id_caso='" . $idcaso . "' AND " .
        "id_p_responsable='" . $idpres . "' AND " .
        "victima.id=id_victima";
        $nr = $db->getOne($q);            
        if ($nr > 0) {
            errorValida('Hay ' . $nr . ' victima(s) ' .
            'individual(es) con el presunto responsable que ' .
            " quiere $accion <br>" .
            'Por favor cambiela(s) antes', $valores);
            return false;
        }
        $q = "SELECT COUNT(id_combatiente) FROM " .
        "p_responsable_agrede_combatiente, combatiente WHERE " .
        "combatiente.id_caso='" . $idcaso . "' AND " .
        "id_p_responsable='" . $idpres . "' AND " .
        "combatiente.id=id_combatiente";
        $nr = $db->getOne($q);            
        if ($nr > 0) {
            errorValida('Hay ' . $nr . ' victima(s) ' .
            'combatiente(s) con el presunto responsable que ' .
            ' quiere ' . $accion . '.<br>  ' .
            ' Por favor cambiela(s) antes', $valores);
            return false;
        }
        $q = "SELECT COUNT(id_v_colectiva) FROM " .
        "p_responsable_agrede_comunidad WHERE " .
        "id_caso='" . $idcaso . "' AND " .
        "id_p_responsable='" . $idpres . "'";
        $nr = $db->getOne($q);            
        if ($nr > 0) {
            errorValida('Hay ' . $nr . ' victima(s) ' .
            'colectiva(s) con el presunto responsable que ' .
            ' quiere ' . $accion . '.<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['bloque']) || $valores['bloque'] == '') &&
            (!isset($valores['frente']) || $valores['frente'] == '') &&
            (!isset($valores['brigada']) || $valores['brigada'] == '') &&
            (!isset($valores['batallon']) || $valores['batallon'] == '') &&
            (!isset($valores['division']) || $valores['division'] == '') &&
            (!isset($valores['otro']) || $valores['otro'] == '') &&
            $valores['tipo'] == 0 &&
            $valores['id_p_responsable'] ==
            DataObjects_Presuntos_responsables::id_sininfo() &&
            (!isset($valores['clasificacion']) ||  
            $valores['clasificacion'] == array()) 
            ;

        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'] . ")");
        }

        if ((!isset($_SESSION['forma_modo'])  ||
            $_SESSION['forma_modo'] != 'busqueda') && (
            !isset($valores['clasificacion']) ||  
            $valores['clasificacion'] == array())) {
                errorValida('Falta especificar clasificación', $valores);
                return false;
        }
        $db = $this->iniVar();
        $this->bpresuntos_responsables_caso->
            forceQueryType(DB_DATAOBJECT_FORMBUILDER_QUERY_FORCEINSERT);
        if (isset($this->bpresuntos_responsables_caso->_do->id) &&
            isset($this->bpresuntos_responsables_caso->_do->id_p_responsable) ) {
            $id = varEscapa($valores['id'], $db);
            $idcaso = $this->bpresuntos_responsables_caso->_do->id_caso;
            $idpres = $this->bpresuntos_responsables_caso->_do->id_p_responsable;
            if (isset($idpres) && $idpres != '' && 
                $valores['id_p_responsable'] != $idpres) {
                if (!$this->integridadRef($db, $idcaso, $idpres, 'modificar',
                        $valores)) {
                    return false;
                }
            }
            $q = "DELETE FROM " .
                    "categoria_p_responsable_caso WHERE " .
                    "id_caso='" . $idcaso . "' AND " .
                    "id='" . $id . "' AND " .
                    "id_p_responsable='" . $idpres . "'";
            $result = $db->query($q);            
            $this->bpresuntos_responsables_caso->_do->delete();
            $this->bpresuntos_responsables_caso->_do->id = $id;
            $this->bpresuntos_responsables_caso->_do->id_caso = $idcaso;
        } else {
            $_SESSION['fpr_total']++;
        }

        $ret = $this->process(array(&$this->bpresuntos_responsables_caso,
            'processForm'), false);
        if (PEAR::isError($ret)) {
            die($ret->getMessage());
        }
        if (isset($valores['clasificacion'])) {
            foreach ($valores['clasificacion'] as $k => $v) {
                $t = explode(":", varEscapa($v, $db));
                $this->bcategoria->_do->id=
                    $this->bpresuntos_responsables_caso->_do->id;
                $this->bcategoria->_do->id_caso=
                    $this->bpresuntos_responsables_caso->_do->id_caso;
                $this->bcategoria->_do->id_p_responsable=
                    $this->bpresuntos_responsables_caso->_do->id_p_responsable;
                $this->bcategoria->_do->id_tipo_violencia = $t[0];
                $this->bcategoria->_do->id_supracategoria = $t[1];
                $this->bcategoria->_do->id_categoria = $t[2];
                $this->bcategoria->_do->insert();
            }
        }

        funcionario_caso($_SESSION['basicos_id']);
        return  $ret;
    }

    /**
     * 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();
        $duc=& DB_DataObject::factory('presuntos_responsables_caso');
        $duc->id_caso = (int)$dCaso->id;
        if ($duc->find()>0) {
            $t .= ", presuntos_responsables_caso";
            busand_sinap($w, "presuntos_responsables_caso.id_caso", 
                "caso.id", "=", "AND");
            $w3="";
            while ($duc->fetch()) {
                $w2="";
                busand($db, $w2, "presuntos_responsables_caso.id_p_responsable",
                    (int)($duc->id_p_responsable), "=", "AND");
                if (isset($duc->tipo)) {
                    busand($db, $w2, "presuntos_responsables_caso.tipo",
                    $duc->tipo, "=", "AND");
                }
                if (isset($duc->bloque) && $duc->bloque != '') {
                    busand($db, $w2, "presuntos_responsables_caso.bloque",
                    $duc->bloque, "=", "AND");
                }
                if (isset($duc->frente) && $duc->frente != '') {
                    busand($db, $w2, "presuntos_responsables_caso.frente",
                        $duc->frente, "=", "AND");
                }
                if (isset($duc->brigada) && $duc->brigada != '') {
                    busand($db, $w2, "presuntos_responsables_caso.brigada",
                        $duc->brigada, "=", "AND");
                }
                if (isset($duc->batallon) && $duc->batallon != '') {
                    busand($db, $w2, "presuntos_responsables_caso.batallon",
                        $duc->batallon, "=", "AND");
                }
                if (isset($duc->division) && $duc->division != '') {
                    busand($db, $w2, "presuntos_responsables_caso.division",
                        $duc->division, "=", "AND");
                }
                if (isset($duc->otro) && $duc->otro != '') {
                    busand($db, $w2, "presuntos_responsables_caso.otro",
                        $duc->otro, "=", "AND");
                }
                $du=& DB_DataObject::factory('Categoria_p_responsable_caso');
                $du->id_caso = (int)$dCaso->id;
                $du->id_p_responsable = (int)$dCaso->id;
                if ($du->find()>0) {
                    $t .= ", categoria_p_responsable_caso";
                    busand_sinap($w, "categoria_p_responsable_caso.id_caso", 
                        "caso.id", "=", "AND");
                    busand_sinap($w, 
                        "categoria_p_responsable_caso.id_p_responsable", 
                        "presuntos_responsables_caso.id_p_responsable", "=", 
                        "AND");
                    while ($du->fetch()) {
                        busand($db, $w2, 
                            "categoria_p_responsable_caso.id_tipo_violencia", 
                            $du->id_tipo_violencia, '=', 'AND');
                        busand($db, $w2, 
                            "categoria_p_responsable_caso.id_supracategoria", 
                            $du->id_supracategoria, '=', 'AND');
                        busand($db, $w2, 
                            "categoria_p_responsable_caso.id_categoria",
                            $du->id_categoria, '=', 'AND');
                    }
                }
                if ($w2!="") {
                    $w3 = $w3 == "" ? "($w2)" : "$w3 OR ($w2)";
                }
            }
            if ($w3!="") {
                $w .= " AND ($w3)";
            }    
        }
    }


}

?>
