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

/**
 * Pestaña Ubicación de la ficha de captura de un caso
 */
require_once 'PagBaseMultiple.php';
require_once 'Caso.php';

/** 
 * Ubicación.
 * 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 PagUbicacion extends PagBaseMultiple
{
    /** Ubicación independiente del caso */
    var $bubicacion;
    /** Ubicación asociada al caso */
    var $bubicacion_caso;

    var $titulo = 'Ubicación';
            
    var $tcorto = 'Ubicación';

    var $pref = "fub";

    var $nuevaCopia = false;

    var $clase_modelo = 'ubicacion_caso';

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

    /**
     * Retorna una identificación del registro actual. 
     *
     * @return string Identifación
     */
    function copiaId()
    {
        return $this->bubicacion->_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('ubicacion_caso');
            $db =& $do->getDatabaseConnection();
            $do->id_caso = $_SESSION['basicos_id'];
            $do->id_ubicacion = varEscapa($valores['id'], $db);

            $du =& DB_DataObject::factory('ubicacion');
            $du->id = varEscapa($valores['id'], $db);

            if ($do->find()==1) {
                $do->delete();
                $du->find();
                $du->delete();
                $_SESSION['fub_total']--;
            }
            return true;
        }
        return false;
    }

    /**
     * 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()
    {
        $dubicacion_caso=& DB_DataObject::factory('ubicacion_caso');
        $dubicacion=& DB_DataObject::factory('ubicacion');

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

        $idu = array();
        $row = array();
        $tot = 0;
        $q = 'SELECT id_ubicacion ' .
            'FROM ubicacion_caso ' .
            "WHERE id_caso='$idcaso' " .
            'ORDER BY id_ubicacion';
        $result = $db->query($q);
        while (isset($result) && !PEAR::isError($result) 
            && $result->fetchInto($row)) {
            $idu[] = $row[0];
            $tot++;
        }

        $_SESSION['fub_total'] = $tot;
        $ni = $_SESSION['fub_pag'];
        if ($ni >= 0 && $ni < $tot) {
            $dubicacion_caso->id_ubicacion = $idu[$ni];
            $dubicacion->id = $idu[$ni];
            if ($dubicacion_caso->find()>0) {
                $dubicacion_caso->fetch();
            } 
            if ($dubicacion->find()>0) {
                $dubicacion->fetch();
            }
        }

        $this->bubicacion_caso=& 
            DB_DataObject_FormBuilder::create($dubicacion_caso, 
            array('requiredRuleMessage' => $GLOBALS['mreglareq'],
            'ruleViolationMessage' => $GLOBALS['mreglavio'] ));
        $this->bubicacion=& 
            DB_DataObject_FormBuilder::create($dubicacion, 
            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 PagUbicacion($nomForma, $mreq)
    {
        parent::PagBaseMultiple($nomForma, $mreq, 'Ubicación', 'Ubicación',
            'fub', 'ubicacion_caso');

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

        $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->bubicacion->id) ? $this->bubicacion->id : '';
        $this->addElement('hidden', 'id', $vv);

        $ubi =& $this->addElement('select', 'id_ubicacion', 
            'Ubicacion: ', array());
        $ubi->addOption('', '');
        if (isset($GLOBALS['etiqueta']['ubicacion'])) {
            $ubi->setLabel($GLOBALS['etiqueta']['ubicacion']);
        }
        $q = "SELECT id_departamento, id_municipio, id_clase " .
            "FROM clase_caso " .
            "WHERE id_caso='$idcaso'";
        $result = $db->query($q);
        $row = array();
        $dep = $db->getAssoc("SELECT id, nombre " .
                "FROM departamento ");
        while ($result != null && !PEAR::isError($result)
            && $result->fetchInto($row)) {
            $mun = $db->getAssoc("SELECT id, nombre " .
                "FROM municipio " .
                "WHERE id_departamento='" . $row[0] . "' " .
                "AND id='" . $row[1] . "';"); 
            $cla = $db->getAssoc("SELECT id, nombre " .
                "FROM clase " .
                " WHERE id_departamento='" . $row[0] . "' " .
                "AND id_municipio='" . $row[1] . "' " .
                "AND id='" . $row[2] . "';");
            $n = $dep[$row[0]] . ":" . $mun[$row[1]] . ":" . $cla[$row[2]];
            $i = $row[0] . ":" . $row[1] . ":" . $row[2];
            $ubi->addOption($n, $i);
        }

        $q = "SELECT id_departamento, id_municipio " .
            "FROM municipio_caso " .
            "WHERE id_caso='$idcaso'";
        $result = $db->query($q);
        $row = array();
        while ($result != null && !PEAR::isError($result)
            && $result->fetchInto($row)) {
            $mun = $db->getAssoc("SELECT id, nombre " .
                "FROM municipio " .
                "WHERE id_departamento='" . $row[0] . "' " .
                "AND id='" . $row[1] . "';"); 
            $n = $dep[$row[0]] . ":" . $mun[$row[1]];
            $i = $row[0] . ":" . $row[1];
            $ubi->addOption($n, $i);
        }

        $q = "SELECT id_departamento " .
            "FROM departamento_caso " .
            "WHERE id_caso='$idcaso'";
        $result = $db->query($q);
        $row = array();
        while ($result != null && !PEAR::isError($result)
            && $result->fetchInto($row)) {
            $n = $dep[$row[0]];
            $i = $row[0];
            $ubi->addOption($n, $i);
        }

        $this->bubicacion->createSubmit = 0;
        $this->bubicacion->useForm($this);
        $this->bubicacion->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)
    {
        $nid = '';
        $ubi =& $this->getElement('id_ubicacion');
        if (isset($_SESSION['nuevo_copia_id'])) {
            $id = $_SESSION['nuevo_copia_id'];
            unset($_SESSION['nuevo_copia_id']);
            $d =& DB_DataObject::factory('ubicacion');
            $d->id = $id;
            $d->find();
            $d->fetch();
            foreach ($d->fb_fieldsToRender as $c) {
                $cq = $this->getElement($c);
                $cq->setValue($d->$c);
            }
            $nid = $d->id_departamento;
            $nid .= isset($d->id_municipio)?
                ":" . $d->id_municipio : "";
            $nid .= isset($d->id_clase)?
                ":" . $d->id_clase : "";
        }

        if ($this->bubicacion->_do->id != null) {
            $nid = $this->bubicacion->_do->id_departamento;
            $nid .= isset($this->bubicacion->_do->id_municipio)?
                ":" . $this->bubicacion->_do->id_municipio : "";
            $nid .= isset($this->bubicacion->_do->id_clase)?
                ":" . $this->bubicacion->_do->id_clase : "";
        }
        if ($nid != '') {
            $ubi->setValue($nid);
        }
    }


    /**
     * 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));
        $db->query("DELETE FROM ubicacion_caso WHERE id_caso='$idcaso'");
    }


    /**
     * 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['lugar']) || $valores['lugar'] == '') &&
            (!isset($valores['sitio']) || $valores['sitio'] == '') &&
            (!isset($valores['id_ubicacion']) || $valores['id_ubicacion'] == '') 
        ;

        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();

        $this->bubicacion_caso->_do->id_caso = $_SESSION['basicos_id'];
        $this->bubicacion_caso->_do->id_ubicacion = varEscapa($valores['id'], $db);
        if (strstr($valores['id_ubicacion'], ':')!=false) {
            $t = explode(":", varEscapa($valores['id_ubicacion'], $db));
            $this->bubicacion->_do->id_departamento = $t[0];
            $this->bubicacion->_do->id_municipio = $t[1];
            if (isset($t[2])) {
                $this->bubicacion->_do->id_clase = $t[2];
            }
        } else {
            $this->bubicacion->_do->id_departamento = $valores['id_ubicacion'];
        }
        $this->bubicacion->_do->id = varEscapa($valores['id'], $db);
        $this->bubicacion->_do->lugar = varEscapa($valores['lugar'], $db);
        $this->bubicacion->_do->sitio = varEscapa($valores['sitio'], $db);

        $dcaso = DataObjects_Caso::staticGet('id',
            $this->bubicacion_caso->_do->id_caso);
        $this->bubicacion->_do->tipo = $dcaso->tipo_ubicacion;
        if ($this->bubicacion->_do->id == null) {
            $this->bubicacion->_do->insert();
            $this->bubicacion_caso->_do->id_ubicacion=
                $this->bubicacion->_do->id;
            $this->bubicacion_caso->_do->insert();
            $_SESSION['fub_total']++;
        } else {
            if ($this->bubicacion->_do->id_municipio == '') {
                $this->bubicacion->_do->id_municipio = 'null';
            }
            if ($this->bubicacion->_do->id_clase == '') {
                $this->bubicacion->_do->id_clase = 'null';
            }
            $this->bubicacion->_do->update();
        }
        funcionario_caso($_SESSION['basicos_id']);
        return  true;
    }

    /**
     * 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('ubicacion_caso');
        $duc->id_caso = (int)($dCaso->id);
        if ($duc->find()>0) {
            $t .= ", ubicacion_caso, ubicacion";
            busand_sinap($w, "ubicacion_caso.id_caso", "caso.id", "=", "AND");
            busand_sinap($w, "ubicacion_caso.id_ubicacion", 
                "ubicacion.id", "=", "AND");
            $w3="";
            while ($duc->fetch()) {
                $du=& DB_DataObject::factory('ubicacion');
                $du->get((int)($duc->id_ubicacion));
                $w2="";
                busand($db, $w2, "ubicacion.id_departamento",
                    (int)($du->id_departamento), '=', 'AND');
                busand($db, $w2, "ubicacion.id_municipio",
                    (int)($du->id_municipio), '=', 'AND');
                busand($db, $w2, "ubicacion.id_clase",
                    (int)($du->id_clase), '=', 'AND');
                if ($du->lugar != '') {
                    busand($db, $w2, "ubicacion.lugar",
                        $du->lugar, '=', 'AND');
                }
                if ($du->sitio != '') {
                    busand($db, $w2, "ubicacion.sitio",
                        $du->sitio, '=', 'AND');
                }
                if ($w2!="") {
                    $w3 = $w3=="" ? "($w2)" : "$w3 OR ($w2)";
                }
            }
            if ($w3!="") {
                $w .= " AND ($w3)";
            }    
        }
    }

}

?>
