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

/** 
 * Pestaña Víctima Combatiente 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';

/**
 * Víctima Combatiente.
 * 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 PagVictimaCombatiente extends PagBaseMultiple
{

    /** Combatiente */
    var $bcombatiente;
    /** Antecedentes */
    var $bantecedente_combatiente;

    var $titulo = 'Víctima Combatiente';  

    var $tcorto = 'Comb.';

    var $pref = "fvm";

    var $nuevaCopia = false;

    var $clase_modelo = 'combatiente';

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


    /**
     * Retorna una identificación del registro actual. 
     *
     * @return string Identifación
     */
    function copiaId()
    {
        return $this->bcombatiente->_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->bcombatiente->_do->id)) {
            $this->eliminaVic($this->bcombatiente->_do, true);
            $_SESSION['fvm_total']--;
        }
    }

     /**
     * Inicializa variables.
     * 
     * @param integer $id_combatiente Id  de víctima combatiente
     *
     * @return handle Conexión a base de datos
     */
    function iniVar($id_combatiente = null)
    {
        $dcombatiente =& DB_DataObject::factory('combatiente');
        $dantecedente_combatiente =& 
            DB_DataObject::factory('antecedente_combatiente');
        $db =& $dcombatiente->getDatabaseConnection();

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

        $idp = array();
        $ndp = array();
        $indid = -1;
        $tot = ResConsulta::extrae_combatientes($idcaso, $db, $idp, 
            $ndp, $id_combatiente, $indid);
        $_SESSION['fvm_total'] = $tot;
        if ($indid >= 0) {
            $_SESSION['fvm_pag'] = $indid;
        }
        $dcombatiente->id_caso = $idcaso;
        if ($_SESSION['fvm_pag'] < 0 || $_SESSION['fvm_pag'] >= $tot) {
            $dcombatiente->id = null;
        } else {
            $dcombatiente->id = $idp[$_SESSION['fvm_pag']];
            $dcombatiente->find();
            $dcombatiente->fetch();
        }
        $dantecedente_combatiente->id_combatiente = $dcombatiente->id;

        $this->bcombatiente =& DB_DataObject_FormBuilder::create($dcombatiente,
            array('requiredRuleMessage' => $GLOBALS['mreglareq'], 
                'ruleViolationMessage' => $GLOBALS['mreglavio'] ));
        $this->bcombatiente->useMutators = true;
        $this->bantecedente_combatiente =& 
            DB_DataObject_FormBuilder::create($dantecedente_combatiente, 
            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 PagVictimaCombatiente($nomForma, $mreq)
    {
        parent::PagBaseMultiple($nomForma, $mreq, 'Victima Combatiente', 
            'Comb.', 'fvm', 'combatiente');
        $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->bcombatiente->_do->id) ?
            $this->bcombatiente->_do->id : '';
        $this->addElement('hidden', 'id', $vv);

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

        $this->bantecedente_combatiente->createSubmit = 0;
        $this->bantecedente_combatiente->useForm($this);
        $this->bantecedente_combatiente->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)
    {
        $vv = isset($this->bcombatiente->_do->id) ?
            $this->bcombatiente->_do->id : '';

        $campos = array_merge($this->bcombatiente->_do->fb_fieldsToRender,
            array('id_antecedente'));
        //$sca =& $this->getElement('id_antecedente');
            $valsca = array();

        if (isset($_SESSION['recuperaErrorValida'])) {
            $v = $_SESSION['recuperaErrorValida'];
        } else if (isset($_SESSION['nuevo_copia_id'])) {
            $id = $_SESSION['nuevo_copia_id'];
            unset($_SESSION['nuevo_copia_id']);

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

            $d =& DB_DataObject::factory('antecedente_combatiente');
            $d->id_combatiente = $id;
            $d->find();
            while ($d->fetch()) {
                $valsca[] = $d->id_antecedente;
            }
            $v['id_antecedente'] = $valsca; 
        } else {
            foreach ($this->bcombatiente->_do->fb_fieldsToRender as $c) {
                $cq = $this->getElement($c);
                if (isset($this->bcombatiente->_do->$c)) {
                    $v[$c] = $this->bcombatiente->_do->$c;
                    //$cq->setValue($this->bcombatiente->_do->$c);
                }
            }


            if ($vv != '') {
                $this->bantecedente_combatiente->_do->find();
                while ($this->bantecedente_combatiente->_do->fetch()) {
                    $valsca[] = 
                        $this->bantecedente_combatiente->_do->id_antecedente;
                }
            }         
            $v['id_antecedente'] = $valsca; 
        }
        formularioValoresEstablece($this, $campos, $v);

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


    /**
     * Elimina de la base antecedentes de un combatiente y opcionalmente 
     * datos del combatiente también.
     *
     * @param object $dcombatiente    objeto con campos ya llenos identifican
     * datos de combatiente por eliminar
     * @param bool   $elimcombatiente elimina también el combatiente.
     *
     * @return void
     */
    function eliminaVic($dcombatiente, $elimcombatiente = false)
    {
        assert($dcombatiente != null);
        assert($dcombatiente->id != null);

        if ($dcombatiente->id != null) {
            $db =& $dcombatiente->getDatabaseConnection();
            $idcombatiente = $dcombatiente->id;
            $result = $db->query("DELETE FROM antecedente_combatiente " .
                    "WHERE id_combatiente='$idcombatiente'");
            if ($elimcombatiente) {
                $dcombatiente->delete();
            }
        }
    }


    /**
     * 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));

        $dcombatiente =& DB_DataObject::factory('combatiente');
        $dcombatiente->id_caso = $idcaso;
        $dcombatiente->find();

        $cp = array();
        while ($dcombatiente->fetch()) {
            $cp[] = $dcombatiente->id;
        }
        foreach ($cp as $idv) {
            $dcombatiente->get('id', $idv);
            PagVictimaCombatiente::eliminaVic($dcombatiente, 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['nombre']) || $valores['nombre'] == '') &&
            (!isset($valores['alias']) || $valores['alias'] == '') &&
            (!isset($valores['edad']) || $valores['edad'] == '') &&
            (!isset($valores['sexo']) || $valores['sexo'] == 'S') &&
            (!isset($valores['id_rango_edad']) || 
            $valores['id_rango_edad']==DataObjects_Rango_edad::id_sininfo()) &&
            (!isset($valores['id_sector_social']) || 
            $valores['id_sector_social']==
                DataObjects_Sector_social::id_sininfo()) &&
            (!isset($valores['id_vinculo_estado']) || 
            $valores['id_vinculo_estado']==
                DataObjects_Vinculo_estado::id_sininfo()) &&
            (!isset($valores['id_filiacion']) || 
            $valores['id_filiacion']==DataObjects_Filiacion::id_sininfo()) &&
            (!isset($valores['id_profesion']) 
            || $valores['id_profesion']==DataObjects_Profesion::id_sininfo()) &&
            (!isset($valores['id_organizacion']) 
            || $valores['id_organizacion']== 
                DataObjects_Organizacion::id_sininfo()) &&
            (!isset($valores['id_organizacion_armada']) 
            || $valores['id_organizacion_armada']==
                DataObjects_Presuntos_responsables::id_sininfo())
            ;
        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 ($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, 'fvm_error_valida');
                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, 'fvm_error_valida');
                return false;
            }
            $valores['id_rango_edad'] = $re;
        }

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

        if (!isset($valores['id']) || $valores['id'] == '') {
            $valores['id'] = null;
            $db = $this->iniVar();
        } else {
            $db = $this->iniVar($valores['id']);
        }

        $idcaso = $this->bcombatiente->_do->id_caso;
        $nuevo = $this->bcombatiente->_do->id == null; 
        $ret = $this->process(array(&$this->bcombatiente, 'processForm'), 
            false);
        if (PEAR::isError($ret)) {
            die($ret->getMessage());
        }
        if (isset($this->bcombatiente->_do->id)) {
            $idcombatiente = $this->bcombatiente->_do->id;
            if ($nuevo) {
                $_SESSION['fvm_total']++;
            } else {
                $this->eliminaVic($this->bcombatiente->_do, false); 
            }
/*            $q = "DELETE FROM antecedente_combatiente " .
                "WHERE id_combatiente='$idcombatiente'";
            $result = $db->query($q); */
            if (isset($valores['id_antecedente'])) {
                foreach ($valores['id_antecedente'] as $k => $v) {
                    $this->bantecedente_combatiente->_do->id_combatiente = 
                        $idcombatiente;
                    $this->bantecedente_combatiente->_do->id_antecedente = 
                        varEscapa($v, $db);
                    $this->bantecedente_combatiente->_do->insert();
                }
            }

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

    /**
    * Prepara datos para búsqueda. Es llamada por datosBusqueda por
    * lo menos de esta clase y de PagVictimaIndividual.
    *
    * @param string  &$w        sentencia WHERE por retornar
    * @param string  &$t        tablas donde buscar 
    * @param integer $idcaso    Identificación del caso por usar
    * @param string  $tabp      Tablas adicionales donde buscar
    * @param string  $idotratab Identifcacion en otras tablas
    * @param array   $otrastab  Arreglo con nombres de otras tablas relacionadas 
    *   con la tabla $tabp con un campo de nombre $idotrastab.
    *
    * @return void
    */
    function busPag(&$w, &$t, $idcaso, $tabp, $idotratab, $otrastab) 
    {
        $do = DB_DataObject::factory($tabp);
        if (PEAR::isError($do)) {
            die($do->getMessage());
        }
        $db =& $do->getDatabaseConnection();
        $do->id_caso = (int)$idcaso;
        if ($do->find()==0) {
            return;
        }
        busand_sinap($w, varEscapa($tabp, $db) . ".id_caso", "caso.id");
        $t .= ", $tabp";
        $ign = $do->camposSinInfo();
        $w3="";
        while ($do->fetch()) {
            $w2="";
            foreach ($do->fb_fieldsToRender as $c) {
                if (isset($do->$c) && 
                    $do->$c != '' && 
                    (!array_key_exists($c, $ign) ||
                      $do->$c != $ign[$c])
                ) {
                    busand($db, $w2, $tabp . "." . $c, $do->$c);
                }
            }
            foreach ($otrastab as $ot) {
                busor_muchos($w2, $t, $ot,
                    'AND', $idotratab, varEscapa($do->id, $db), $tabp . '.id');
            } 
            if ($w2!="") {
                $w3 = $w3=="" ? "($w2)" : "$w3 OR ($w2)";
            }
        } 
        if ($w3!="") {
            $w .= " AND ($w3)";
        }
    }

    /**
     * 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) 
    {
        $this->busPag($w, $t, $dCaso->id, 'combatiente', 'id_combatiente',
            array('antecedente_combatiente'));
    }


}

?>
