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

/** 
 * Pestaña Localización de la ficha de captura de caso
 */
require_once 'PagBaseMultiple.php';
require_once 'ResConsulta.php';


/** 
 * Responde a acción cambio de departamento.
 *
 * @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 BuscarId
 */
class CamDepartamento extends HTML_QuickForm_Action 
{
    /**
     * Ejecuta acción
     *
     * @param object &$page      Página
     * @param string $actionName Acción
     *
     * @return void
     */
    function perform(&$page, $actionName)
    {
        $_SESSION['camDepartamento'] = $page->_submitValues['id_departamento'];
        $_SESSION['camMunicipio'] = '';
        $pageName =  $page->getAttribute('id');
        $data     =& $page->controller->container();
        $data['values'][$pageName] = $page->exportValues();
        $data['valid'][$pageName]  = $page->validate();

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

}


/** 
 * Responde a acción cambio de municipio .
 *
 * @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 BuscarId
 */
class CamMunicipio extends HTML_QuickForm_Action 
{
    /**
     * Ejecuta acción
     *
     * @param object &$page      Página
     * @param string $actionName Acción
     *
     * @return void
     */
    function perform(&$page, $actionName)
    {

        $_SESSION['camDepartamento'] = $page->_submitValues['id_departamento'];
        $_SESSION['camMunicipio'] = $page->_submitValues['id_municipio'];
        $pageName =  $page->getAttribute('id');
        $data     =& $page->controller->container();
        $data['values'][$pageName] = $page->exportValues();
        $data['valid'][$pageName]  = $page->validate();

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

/** 
 * Localización.
 * Ver también documentación de 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 PagLocalizacion extends PagBaseMultiple
{
    /** 
    * Clase geográfica donde se localiza el caso
    * Ver documentación de funciones en clase base.
    */
    var $bclase_caso;

    var $titulo = 'Localización';

    var $tcorto = 'Localización';

    var $pref = "fub";

    var $clase_modelo = 'clase_caso';

    var $nuevaCopia = false;

    /**
     * Pone en null variables asociadas a tablas de la pestaña.
     *
     * @return null
     */
    function nullVar()
    {
        unset($_SESSION['camDepartamento']);
        unset($_SESSION['camMunicipio']);
        $this->bclase_caso = null;
    }

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


    /** Verifica integridad referencial antes de eliminar o modificar
     *
     * @param handle  &$db     Base de datos
     * @param integer $idcaso  Id. del caso
     * @param integer $dep     id de departamento
     * @param integer $mun     id del municipio
     * @param integer $cla     id de la clase
     * @param integer $valores Valores enviados por formulario
     *
     * @return bool Verdaderdo si y solo si hay integridad referencial
     */
    function integridadRef(&$db, $idcaso, $dep, $mun, $cla, $valores) 
    {
        if (!isset($dep)) {
            return true;
        }
        $q = "SELECT COUNT(id) FROM ubicacion, ubicacion_caso WHERE " .
        "ubicacion_caso.id_ubicacion=ubicacion.id AND " .
        "ubicacion_caso.id_caso='" . $idcaso . "' AND " .
        "ubicacion.id_departamento='" . $dep . "'";  
        if ($mun != null) {
            $q .= " AND ubicacion.id_municipio='" . $mun . "'";  
        } else {
            $q .= " AND ubicacion.id_municipio IS null";  
        }
        if ($cla != null) {
            $q .= " AND ubicacion.id_clase='" . $cla . "'";  
        } else {
            $q .= " AND ubicacion.id_clase IS null";  
        }
//        echo $q;
        $nr = $db->getOne($q);
        if ($nr > 0) {
            errorValida('Hay ' . $nr . ' ubicaciones que emplean esta ' .
            ' localización.<br>' .
            'Por favor cambiela(s) antes.', $valores);
            return false;
        }
        return true;
    }

    /**
     * Elimina de base de datos el registro actual.
     * 
     * @param array &$valores Valores enviados por formulario.
     * 
     * @return null
     */
    function elimina(&$valores)
    {
        $db = $this->iniVar();
        if (!$this->integridadRef($db, $this->bclase_caso->_do->id_caso, 
            $this->bclase_caso->_do->id_departamento,
            $this->bclase_caso->_do->id_municipio,
            $this->bclase_caso->_do->id_clase, $valores)) {
            return false;
        }

        // Si está refernciada en ubicación no eliminar.
        if ($this->bclase_caso->_do->id_clase != null) {
            $this->bclase_caso->_do->delete();
            $_SESSION['fvloc_total']--;
        } else if ($this->bclase_caso->_do->id_municipio != null) {
            $do =& DB_DataObject::factory('municipio_caso');
            $do->id_caso = $this->bclase_caso->_do->id_caso;
            $do->id_municipio = $this->bclase_caso->_do->id_municipio;
            $do->id_departamento = $this->bclase_caso->_do->id_departamento;
            $do->delete();
            $_SESSION['fvloc_total']--;
        } else if ($this->bclase_caso->_do->id_departamento != null) {
            $do =& DB_DataObject::factory('departamento_caso');
            $do->id_departamento = $this->bclase_caso->_do->id_departamento;
            $do->id_caso = $this->bclase_caso->_do->id_caso;
            $do->delete();
            $_SESSION['fvloc_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()
    {
        $dclase_caso =& DB_DataObject::factory('clase_caso');

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

        $idd = array(); // Identificaciones
        $idm = array();
        $idc = array();
        $ndd = array(); // Nombres
        $ndm = array();
        $ndc = array();
        $row = array();
        $tot=  ResConsulta::extrae_localizacion_caso($idcaso, $db, 
            $idd, $ndd, $idm, $ndm, $idc, $ndc);

        $_SESSION['fvloc_total'] = $tot;
        $ni = $_SESSION['fvloc_pag'];
        if ($ni >= 0 && $ni < $tot) {
            $dclase_caso->id_departamento = $idd[$ni];
            $dclase_caso->id_municipio = $idm[$ni];
            $dclase_caso->id_clase = $idc[$ni];
        }


        $this->bclase_caso =& DB_DataObject_FormBuilder::create($dclase_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 PagLocalizacion($nomForma, $mreq)
    {
        parent::PagBaseMultiple($nomForma, $mreq, 'Localización', 
            'Localización', 'fvloc', 'clase_caso', false);

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

    /**
    * Retorna identificación del departamento elegido por usuario para
    * actualizar municipio.
    *
    * @return string Id. Departamento
    */
    function idDepartamento() 
    {
        $ndepartamento = null;
        if (isset($this->_submitValues['id_departamento'])) {
            $ndepartamento = $this->_submitValues['id_departamento'] ;
        } else if (isset($_SESSION['camDepartamento'])) {
            $ndepartamento = $_SESSION['camDepartamento'] ;
        } else if ($this->bclase_caso->_do->id_departamento != null) {
            $ndepartamento = $this->bclase_caso->_do->id_departamento;
        }
        return $ndepartamento;
    }
    
    /**
    * Retorna identificación del municipio elegido por usuario para
    * actualizar clase geográfica.
    *
    * @return string Id. Municipio
    */
    function idMunicipio() 
    {
        $nmunicipio = null;
        if (isset($this->_submitValues['id_municipio'])) {
            $nmunicipio = $this->_submitValues['id_municipio'] ;
        } else if (isset($_SESSION['camMunicipio'])) {
            $nmunicipio = $_SESSION['camMunicipio'] ;
        } else if ($this->bclase_caso->_do->id_municipio != null) {
            $nmunicipio = $this->bclase_caso->_do->id_municipio;
        }
        return $nmunicipio;
    }
    
    /**
     * Retorna identificación de la clase geográfica elegida por usuario.
     *
    * @return string Id. Clase
    */
    function idClase() 
    {
        $nclase = null;
        if (isset($this->_submitValues['id_clase'])) {
            $nclase= $this->_submitValues['id_clase'] ;
        } else if (isset($this->bclase_caso->_do->id_clase)) {
            $nclase = $this->bclase_caso->_do->id_clase;
        }
        return $nclase;
    }
    
    
    /**
     * 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)
    {
        $dep =& $this->addElement('select', 'id_departamento', 
            'Departamento ', array());
        if (isset($GLOBALS['etiqueta']['departamento'])) {
            $dep->setLabel($GLOBALS['etiqueta']['departamento']);
        }
        $result = $db->query("SELECT  id, nombre FROM departamento " .
            "ORDER BY nombre");
        $options = array();
        $options[''] = '';
        $row = array();
        while ($result->fetchInto($row)) {
            $options[$row[0]] = $row[1];
        }
        $dep->loadArray($options);
        $dep->updateAttributes(array('onchange' => 
            'envia(\'localizacion:id_departamento\')'));
    
        $mun =& $this->addElement('select', 'id_municipio', 
            'Municipio: ', array());
        $mun->updateAttributes(array('onchange' => 
            'envia(\'localizacion:id_municipio\')'));
        if (isset($GLOBALS['etiqueta']['municipio'])) {
            $mun->setLabel($GLOBALS['etiqueta']['municipio']);
        } 

        $cla =& $this->addElement('select', 'id_clase',
            'Clase: ', array());
        if (isset($GLOBALS['etiqueta']['clase'])) {
            $cla->setLabel($GLOBALS['etiqueta']['clase']);
        } 
        $ndepartamento = $this->idDepartamento();
        if ($ndepartamento != null) {
            $dep->setValue($ndepartamento);
            $result = $db->query("SELECT  id, nombre FROM municipio " .
                "WHERE id_departamento='$ndepartamento' ORDER BY nombre");
            $options = array();
            $options[''] = '';
            $row = array();
            while ($result != null && !PEAR::isError($result) && 
            $result->fetchInto($row)) {
                $options[$row[0]] = $row[1];
            }
            $mun->loadArray($options);
            $cla->loadArray(array());
        }
        $nmunicipio = $this->idMunicipio();
        if ($nmunicipio != null) {
            $mun->setValue($nmunicipio);
            $result = $db->query("SELECT id, nombre || ' (' || " .
                "id_tipo_clase || ')' FROM clase " .
                "WHERE id_departamento='$ndepartamento' AND " .
                "id_municipio='$nmunicipio' ORDER BY nombre");
            $options = array();
            $options[''] = '';
            $row = array();
            while ($result != null && !PEAR::isError($result) && 
                $result->fetchInto($row)) {
                $options[$row[0]] = $row[1];
            }
            $cla->loadArray($options);
        }

        $_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)
    { 
        $ndepartamento = $this->idDepartamento();
        if ($ndepartamento != null) {
            $dep =& $this->getElement('id_departamento');
            $dep->setValue($ndepartamento);
        }
        $nmunicipio = $this->idMunicipio();
        if ($nmunicipio != null) {
            $mun =& $this->getElement('id_municipio');
            $mun->setValue($nmunicipio);
        }
        $nclase = $this->idClase();
        if ($nclase != null) {
            $cla =& $this->getElement('id_clase');
            $cla->setValue($nclase);
        }
    }


    /**
     * 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 departamento_caso WHERE id_caso='$idcaso'");
        $db->query("DELETE FROM municipio_caso WHERE id_caso='$idcaso'");
        $db->query("DELETE FROM clase_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 = ($valores['id_departamento'] == null 
            || $valores['id_departamento'] == '') &&
            (!isset($valores['id_municipio']) 
            || $valores['id_municipio'] == '') &&
            (!isset($valores['id_clase']) || $valores['id_clase'] == '' )
        ;
    
        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->bclase_caso->_do->id_caso;

        if (($this->bclase_caso->_do->id_departamento == 
            $valores['id_departamento'] 
            || (!isset($this->bclase_caso->_do->id_departamento) 
                && $valores['id_departamento'] == '')) &&
            ($this->bclase_caso->_do->id_municipio == $valores['id_municipio'] 
                || (!isset($this->bclase_caso->_do->id_municipio) 
                && $valores['id_municipio'] == '')) &&
            ($this->bclase_caso->_do->id_clase == $valores['id_clase'] 
                || (!isset($this->bclase_caso->_do->id_clase) 
                && $valores['id_clase'] == '')) ) {
            return true; // Es igual, no se requiere cambio.
        }

        if (!$this->integridadRef($db, $idcaso, 
            $this->bclase_caso->_do->id_departamento,
            $this->bclase_caso->_do->id_municipio,
            $this->bclase_caso->_do->id_clase, $valores)) {
            return false;
        }

        $row = array();
        $q = "";
        $do = null;
    
        if ($this->bclase_caso->_do->id_clase != null) {
            $this->bclase_caso->_do->delete();
            $_SESSION['fvloc_total']--;
        } else if ($this->bclase_caso->_do->id_municipio != null) {
            $do =& DB_DataObject::factory('municipio_caso');
            $do->id_caso = $this->bclase_caso->_do->id_caso;
            $do->id_municipio = $this->bclase_caso->_do->id_municipio;
            $do->id_departamento = $this->bclase_caso->_do->id_departamento;
            $do->delete();
            $_SESSION['fvloc_total']--;
        } else if ($this->bclase_caso->_do->id_departamento != null) {
            $do =& DB_DataObject::factory('departamento_caso');
            $do->id_departamento = $this->bclase_caso->_do->id_departamento;
            $do->id_caso = $this->bclase_caso->_do->id_caso;
            $do->delete();
            $_SESSION['fvloc_total']--;
        }
    
        if (isset($valores['id_clase']) && $valores['id_clase'] != null 
            && $valores['id_clase'] != '') {
            $q = 'SELECT id_clase ' .
                'FROM clase_caso ' .
                "WHERE id_caso='$idcaso' AND " .
                'id_departamento=\'' .
                varEscapa($valores['id_departamento'], $db).'\' AND ' .
                'id_municipio=\'' .
                varEscapa($valores['id_municipio'], $db).'\' AND ' .
                'id_clase=\''.varEscapa($valores['id_clase'], $db).'\'';
            $do =& $this->bclase_caso->_do;
            $do->id_departamento = varEscapa($valores['id_departamento'], $db);
            $do->id_municipio = varEscapa($valores['id_municipio'], $db);
            $do->id_clase = varEscapa($valores['id_clase'], $db);
        } else if ($valores['id_municipio'] != null 
                && $valores['id_municipio'] != '') {
            $q = 'SELECT id_municipio ' .
                'FROM municipio_caso ' .
                "WHERE id_caso='$idcaso' AND " .
                'id_departamento=\'' .
                varEscapa($valores['id_departamento'], $db).'\'' .
               ' AND ' .
                'id_municipio=\''.varEscapa($valores['id_municipio'], $db).'\'';
            $do =& DB_DataObject::factory('municipio_caso');
            $do->id_caso = $idcaso;
            $do->id_departamento = varEscapa($valores['id_departamento'], $db);
            $do->id_municipio = varEscapa($valores['id_municipio'], $db);
        } else {
            $q = 'SELECT id_departamento ' .
                'FROM departamento_caso ' .
                "WHERE id_caso='$idcaso' AND " .
                'id_departamento=\''.varEscapa($valores['id_departamento'], $db)
                .'\'';
            $do =& DB_DataObject::factory('departamento_caso');
            $do->id_caso = $idcaso;
            $do->id_departamento = varEscapa($valores['id_departamento'], $db);
        }
        if ($q != '') {
            $result = $db->query($q);
            if (PEAR::isError($result) || !$result->fetchInto($row)) {
                $do->insert();
                $_SESSION['fvloc_total']++;
            }
        }
    
        unset($_SESSION['camDepartamento']);
        unset($_SESSION['camMunicipio']);
        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) 
    {
        $d=& DB_DataObject::factory('departamento_caso');
        $d->id_caso = (int)$dCaso->id;
        if ($d->find()>0) {
            while ($d->fetch()) {
                if ($subcons != "") {
                    $subcons .= " UNION ";
                }
                $subcons .= "SELECT id_caso FROM departamento_caso WHERE " .
                    "id_departamento='" . (int)($d->id_departamento) . "'"; 
                $subcons .= " UNION SELECT id_caso FROM municipio_caso WHERE " .
                    "id_departamento='" . (int)($d->id_departamento) . "'";
                $subcons .= " UNION SELECT id_caso FROM clase_caso WHERE " .
                    "id_departamento='" . (int)($d->id_departamento) . "' ";
            }
        }
        $d=& DB_DataObject::factory('municipio_caso');
        $d->id_caso = (int)$dCaso->id;
        if ($d->find()>0) {
            while ($d->fetch()) {
                if ($subcons != "") {
                    $subcons .= " UNION ";
                }
                $subcons .= "SELECT id_caso FROM municipio_caso WHERE " .
                    "id_departamento='" . (int)($d->id_departamento) .
                    "' AND id_municipio='" . (int)($d->id_municipio) . "'";
                $subcons .= " UNION SELECT id_caso FROM clase_caso WHERE " .
                    "id_departamento='" . (int)($d->id_departamento) .
                    "' AND id_municipio='" . (int)($d->id_municipio) . "'";
            }
        }
        $d=& DB_DataObject::factory('clase_caso');
        $d->id_caso = (int)$dCaso->id;
        if ($d->find()>0) {
            while ($d->fetch()) {
                if ($subcons != "") {
                    $subcons .= " UNION ";
                }
                $subcons .= "SELECT id_caso FROM clase_caso WHERE " .
                    "id_departamento='" . (int)($d->id_departamento) .
                    "' AND id_municipio='" . (int)($d->id_municipio) .
                    "' AND id_clase='" . (int)($d->id_clase) . "'";
            }
        }

    }


}

?>
