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

/** 
 * Pestaña Víctima Individual de la ficha de captura de caso 
 */

require_once 'PagBaseMultiple.php';
require_once 'ResConsulta.php';

require_once 'Rango_edad.php';
require_once 'Sector_social.php';
require_once 'Vinculo_estado.php';
require_once 'Filiacion.php';
require_once 'Organizacion.php';
require_once 'Profesion.php';
require_once 'Presuntos_responsables.php';
require_once 'Resultado_agresion.php';

/** 
 * Victima Individual.
 * 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 PagVictimaIndividual extends PagBaseMultiple
{

    /** Víctima */
    var $bvictima;

    /** Presuntos responsables */
    var $bvind_responsable;

    /** Antecedentes */
    var $bantecedente_victima;

    /** Categorias */
    var $bcategoria_personal;

    var $titulo = 'Víctima Individual';

    var $tcorto = 'Victima';

    var $pref = "fvi";

    var $nuevaCopia = false;

    var $clase_modelo = 'victima';

    /*var $bt;  Benchmark_Timer */

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

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

    /**
     * Elimina de base de datos el registro actual.
     *
     * @param array &$valores Valores enviados por formulario.
     *
     * @return null
     */
    function elimina(&$valores)
    {
        $this->iniVar();
        if (isset($this->bvictima->_do->id)) {
            $this->eliminaVic($this->bvictima->_do, true);
            $_SESSION['fvi_total']--;
        }
    }


    /**
     * Inicializa variables.
     * 
     * @param integer $id_victima Id  de víctima 
     *
     * @return handle Conexión a base de datos
     */
    function iniVar($id_victima = null)
    {
/*        if (!isset($bt)) {
            $bt = new Benchmark_Timer(true);
        }
        $bt->setMarker("iniVar");*/
        $dvictima=& DB_DataObject::factory('victima');
        $dvind_responsable=& 
            DB_DataObject::factory('p_responsable_agrede_persona');
        $dantecedente_victima =& DB_DataObject::factory('antecedente_victima');
        $dcategoria_personal =& DB_DataObject::factory('categoria_personal');

        $db =& $dvictima->getDatabaseConnection();

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

        $idp = array();
        $ndp = array();
        $edp = array();
        $indid = -1;
        //$bt->setMarker("iniVar: antes de extrae víctimas");
        $tot = ResConsulta::extrae_victimas($idcaso, $db, $idp, $ndp,
            $id_victima, $indid, $edp);
        //$bt->setMarker("iniVar: después de extrae víctimas");
        $_SESSION['fvi_total'] = $tot;
        if ($indid >= 0) {
            $_SESSION['fvi_pag'] = $indid;
        }
        $dvictima->id_caso= $idcaso;
        if ($_SESSION['fvi_pag'] < 0 || $_SESSION['fvi_pag'] >= $tot) {
            $dvictima->id = null;
        } else {
            $dvictima->id = $idp[$_SESSION['fvi_pag']];
            $dvictima->find();
            $dvictima->fetch();
        }
        $dvind_responsable->id_victima = $dvictima->id;
        $dantecedente_victima->id_victima = $dvictima->id;
        $dcategoria_personal->id_victima = $dvictima->id;

        $this->bvictima=& DB_DataObject_FormBuilder::create($dvictima,
            array('requiredRuleMessage' => $GLOBALS['mreglareq'],
                'ruleViolationMessage' => $GLOBALS['mreglavio'] ));
        $this->bvictima->useMutators = true;
        $this->bvind_responsable =& 
            DB_DataObject_FormBuilder::create($dvind_responsable,
            array('requiredRuleMessage' => $GLOBALS['mreglareq'],
                'ruleViolationMessage' => $GLOBALS['mreglavio'] ));
        $this->bantecedente_victima =& 
            DB_DataObject_FormBuilder::create($dantecedente_victima, 
            array('requiredRuleMessage' => $GLOBALS['mreglareq'],
                'ruleViolationMessage' => $GLOBALS['mreglavio'] ));
        $this->bcategoria_personal =& 
            DB_DataObject_FormBuilder::create($dcategoria_personal, 
            array('requiredRuleMessage' => $GLOBALS['mreglareq'],
                'ruleViolationMessage' => $GLOBALS['mreglavio'] ));

        //$bt->setMarker("iniVar: fin");
        return $db;
    }


    /**
     * Constructora.
     * Ver documentación completa en clase base.
     *
     * @param string $nomForma Nombre 
     * @param string $mreq     Mensaje de dato requerido
     *
     * @return void
     */
    function PagVictimaIndividual($nomForma, $mreq)
    {
        parent::PagBaseMultiple($nomForma, $mreq, 'Victima Individual',
                    'Victima', 'fvi', 'victima');

        $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)
    {
        $vv = isset($this->bvictima->_do->id) ? $this->bvictima->_do->id : '';
        $this->addElement('hidden', 'id', $vv);

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

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

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

        $sel =& $this->addElement('select', 'id_categoria',
            'Tipo Violencia');
        $sel->setMultiple(true);
        ResConsulta::llenaSelCategoria($db, 
            "SELECT id_tipo_violencia, id_supracategoria, " .
            "id_categoria FROM categoria_caso " .
            "WHERE id_caso='" . $this->bvictima->_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)
    {

        $vv = isset($this->bvictima->_do->id) ? $this->bvictima->_do->id : '';

        $campos = array_merge(array('id_p_responsable', 'id_antecedente',
            'id_categoria'), $this->bvictima->_do->fb_fieldsToRender);

        if (isset($_SESSION['recuperaErrorValida'])) {
            $v = $_SESSION['recuperaErrorValida'];
        } else {
            //        $scp =& $this->getElement('id_p_responsable');
            $valscp = array();
            //       $sca =& $this->getElement('id_antecedente');
            $valsca = array();
            //        $scc =& $this->getElement('id_categoria');
            $valscc = array();


            foreach ($this->bvictima->_do->fb_fieldsToRender as $c) {
                //$cq = $this->getElement($c);
                if (isset($this->bvictima->_do->$c)) {
                    $v[$c] = $this->bvictima->_do->$c;
                    //$cq->setValue($this->bvictima->_do->$c);
                }
            }
            $d =& DB_DataObject::factory('victima');
            $db = $d->getDatabaseConnection();
            // Modificamos selects para marcar las ya seleccionadas
            if ($vv != '') {

                $this->bvind_responsable->_do->find();
                while ($this->bvind_responsable->_do->fetch()) {
                    $valscp[] = $this->bvind_responsable->_do->id_p_responsable;
                }

                $this->bantecedente_victima->_do->find();
                while ($this->bantecedente_victima->_do->fetch()) {
                    $valsca[] = $this->bantecedente_victima->_do->id_antecedente;
                }

                $this->bcategoria_personal->_do->find();
                while ($this->bcategoria_personal->_do->fetch()) {
                    $valscc[] = $this->bcategoria_personal->_do->id_tipo_violencia
                        .":" . $this->bcategoria_personal->_do->id_supracategoria
                        .":" . $this->bcategoria_personal->_do->id_categoria;
                }
            } else if (isset($_SESSION['nuevo_copia_id'])) {
                $id = $_SESSION['nuevo_copia_id'];
                unset($_SESSION['nuevo_copia_id']);

                $d->get('id', $id);
                foreach ($d->fb_fieldsToRender as $c) {
                    $v[$c] = $d->$c;
                /*$cq = $this->getElement($c);
                $cq->setValue($d->$c); */
                }

                $d =& DB_DataObject::factory('p_responsable_agrede_persona');
                $d->id_victima = $id;
                $d->find();
                while ($d->fetch()) {
                    $valscp[] = $d->id_p_responsable;
                }

                $d =& DB_DataObject::factory('antecedente_victima');
                $d->id_victima = $id;
                $d->find();
                while ($d->fetch()) {
                    $valsca[] = $d->id_antecedente;
                }

                $d =& DB_DataObject::factory('categoria_personal');
                $d->id_victima = $id;
                $d->find();
                while ($d->fetch()) {
                    $valscc[] = $d->id_tipo_violencia
                        .":" . $d->id_supracategoria
                        .":" . $d->id_categoria;
                }
            } 
            $v['id_p_responsable'] = $valscp;
            $v['id_antecedente'] = $valsca;
            $v['id_categoria'] = $valscc;
        /*$scp->setValue($valscp); 
        $sca->setValue($valsca); 
        $scc->setValue($valscc); */
        }

        formularioValoresEstablece($this, $campos, $v);

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

    }

    /**
    * Elimina datos relacionados con la víctima y opcionalmente datos de
    * la víctima.
    *
    * @param object $dvictima DB_DataObject con datos de víctima 
    * @param bool   $elimVic  Si es <b>true</b> elimina datos de víctima también
    *
    * @return void
    */
    function eliminaVic($dvictima, $elimVic = false) 
    {
        assert(isset($dvictima) && $dvictima != null);
        assert(isset($dvictima->id));
        assert($dvictima->id != null);
        assert($dvictima->id != '');

        $db =& $dvictima->getDatabaseConnection();
        $idvictima = $dvictima->id;

        $q = "DELETE FROM p_responsable_agrede_persona " .
            "WHERE id_victima='$idvictima'";
        $result = $db->query($q);
        $q = "DELETE FROM antecedente_victima WHERE id_victima='$idvictima'";
        $result = $db->query($q);
        $q = "DELETE FROM categoria_personal " .
            "WHERE id_victima='$idvictima'";
        $result = $db->query($q);
        if ($elimVic) {
            $q = "DELETE FROM victima WHERE id='$idvictima'";
            $result = $db->query($q);
        }
    }

    /**
     * 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) && $idcaso != null);
        $dvictima =& DB_DataObject::factory('victima');
        $dvictima->id_caso = $idcaso;
        $dvictima->find();
        $cvic = array();
        while ($dvictima->fetch()) {
            $cvic[] = $dvictima->id;
        }
        foreach ($cvic as $idv) {
            //echo "Por eliminar víctima con código $idv";
            $dvictima =& DB_DataObject::factory('victima');
            $dvictima->id_caso = $idcaso;
            $dvictima->id = $idv;
            $dvictima->find(1);
            PagVictimaIndividual::eliminaVic($dvictima);
            $dvictima->delete();
        }
    }

    /**
     * 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)
    {
        //$bt=new Benchmark_Timer(true);
        $es_vacio = (!isset($valores['nombre']) || $valores['nombre'] == '') &&
            (!isset($valores['edad']) || $valores['edad'] == '') &&
            (!isset($valores['hijos']) || $valores['hijos'] == '') &&
            (!isset($valores['sexo']) || $valores['sexo'] == 'S') &&
            (!isset($valores['id_profesion']) 
            || $valores['id_profesion']==DataObjects_Profesion::id_sininfo()) &&
            (!isset($valores['id_rango_edad']) 
            || $valores['id_rango_edad']==DataObjects_Rango_edad::id_sininfo()) &&
            (!isset($valores['id_filiacion']) 
            || $valores['id_filiacion']==DataObjects_Filiacion::id_sininfo()) &&
            (!isset($valores['id_sector_social']) 
            || $valores['id_sector_social']==
                DataObjects_Sector_social::id_sininfo()) &&
            (!isset($valores['id_organizacion']) 
            || $valores['id_organizacion']==
                DataObjects_Organizacion::id_sininfo()) &&
            (!isset($valores['id_vinculo_estado']) 
            || $valores['id_vinculo_estado']==
                DataObjects_Vinculo_estado::id_sininfo()) &&
            (!isset($valores['id_organizacion_armada']) 
            || $valores['id_organizacion_armada']==
                DataObjects_Presuntos_responsables::id_sininfo()) &&
            (!isset($valores['id_p_responsable']) 
                || $valores['id_p_responsable'] == array()) &&
            (!isset($valores['id_antecedente']) 
                || $valores['id_antecedente'] == array()) &&
            (!isset($valores['id_categoria']) 
                || $valores['id_categoria'] == 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['id_p_responsable']) ||
            $valores['id_p_responsable'] == array())) {
            errorValida('Falta especificar presunto responsable', $valores);
            return false;
        }

        if ((!isset($_SESSION['forma_modo']) 
            || $_SESSION['forma_modo'] != 'busqueda') && (
            !isset($valores['id_categoria']) ||
            $valores['id_categoria'] == array())) {
            errorValida('Falta especificar tipo de violencia', $valores);
            return false;
        }

        if ((!isset($_SESSION['forma_modo']) 
            || $_SESSION['forma_modo'] != 'busqueda') && (
            !isset($valores['nombre']) ||
            trim($valores['nombre'])=='')) {
            errorValida('Falta nombre de víctima', $valores);
            return false;
        }



        if ($valores['id_rango_edad']!=DataObjects_Rango_edad::id_sininfo() &&
          $valores['edad'] != '') {
              $r = varEscapa($valores['id_rango_edad'], $db);
              $e = varEscapa($valores['edad'], $db);
            if (!verifica_edad_y_rango($e, $r)) {
                errorValida('La edad debe corresponder al rango de edad',
                    $valores);
                return false;
            }
        } else if ($valores['edad'] != '') { //Autocompleta
            $re = rango_de_edad(varEscapa($valores['edad'], $db));
            if ($re == 0) {
                errorValida('La edad ingresada no corresponde a rango alguno',
                    $valores);
                return false;
            }
            $valores['id_rango_edad'] = $re;
        }

        //$bt->setMarker("procesa: antes de iniVar");
        if (!isset($valores['id']) || $valores['id'] == '') {
            $valores['id'] = null;
            $db = $this->iniVar();
        } else {
            $db = $this->iniVar($valores['id']);
        }
        //$bt->setMarker("procesa: después de iniVar");

        $nuevo = $this->bvictima->_do->id == null;
        //$bt->setMarker("procesa: antes de process");
        $ret = $this->process(array(&$this->bvictima, 'processForm'), false);
        //$bt->setMarker("procesa: después de process");
        if (PEAR::isError($ret)) {
            die($ret->getMessage());
        }

        if (isset($this->bvictima->_do->id)) {
            $idvictima = $this->bvictima->_do->id;
            if ($nuevo) {
                $_SESSION['fvi_total']++;
            } else {
                //$bt->setMarker("procesa: por eliminar responsables");
                $this->eliminaVic($this->bvictima->_do, false);
            }
            if (isset($valores['id_p_responsable'])) {
                foreach ($valores['id_p_responsable'] as $k => $v) {
                    $this->bvind_responsable->_do->id_victima = $idvictima;
                    $this->bvind_responsable->_do->id_p_responsable = varEscapa($v);
                    $this->bvind_responsable->_do->insert();
                }
            }
            if (isset($valores['id_antecedente'])) {
                foreach ($valores['id_antecedente'] as $k => $v) {
                    $this->bantecedente_victima->_do->id_victima = $idvictima;
                    $this->bantecedente_victima->_do->id_antecedente = varEscapa($v);
                    $this->bantecedente_victima->_do->insert();
                }
            }
            if (isset($valores['id_categoria'])) {
                foreach ($valores['id_categoria'] as $k => $v) {
                    $t = explode(":", varEscapa($v, $db));
                    $this->bcategoria_personal->_do->id_victima = $idvictima;
                    $this->bcategoria_personal->_do->id_tipo_violencia = $t[0];
                    $this->bcategoria_personal->_do->id_supracategoria = $t[1];
                    $this->bcategoria_personal->_do->id_categoria = $t[2];
                    $this->bcategoria_personal->_do->insert();
                }
            }
        }
        //$bt->setMarker("procesa: antes de funcionario_caso");
        funcionario_caso($_SESSION['basicos_id']);
        //$bt->_Benchmark_Timer();
        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) 
    {
        PagVictimaCombatiente::busPag($w, $t, (int)($dCaso->id), 'victima',
            'id_victima',
            array('p_responsable_agrede_persona', 'antecedente_victima', 
                'categoria_personal'));
    }

}

?>
