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

/**
 * Pestaña Otras Fuentes de la ficha de captura de caso
 */
require_once 'PagBaseMultiple.php';

/** 
 * Página otras fuentes.
 * 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 PagOtrasFuentes extends PagBaseMultiple
{

    /* Objetos DB_DataObject_FormBuilder */
    /** Fuente directa independiente de caso */
    var $bfuente_directa;
    /** Relación entre fuente directa y caso */
    var $bfuente_directa_caso;

    var $titulo = 'Otras Fuentes';

    var $tcorto = 'Fuente';

    var $pref = "fd";

    var $nuevaCopia = false;

    var $clase_modelo = 'fuente_directa_caso';



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


    /**
     * Retorna una identificación del registro actual. 
     *
     * @return string Identifación
     */
    function copiaId()
    {
        return $this->bfuente_directa->_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 ($this->bfuente_directa_caso->_do->id_fuente_directa != null &&
            $this->bfuente_directa_caso->_do->fecha != null) {
            $this->bfuente_directa_caso->_do->delete();
            $_SESSION['fd_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()
    {
        $do =& DB_DataObject::factory('fuente_directa_caso');
        $do_fd =& DB_DataObject::factory('fuente_directa');
        $db =& $do->getDatabaseConnection();
        $idcaso =& $_SESSION['basicos_id'];
        if (!isset($idcaso) || $idcaso == null) {
            die("Bug: idcaso no debería ser null");
        } 
        $do->id_caso = $idcaso;

        $result = $db->query("SELECT  id_fuente_directa, fecha " .
            "FROM fuente_directa_caso, fuente_directa " .
            "WHERE id_caso='$idcaso' AND id_fuente_directa=id " .
            "ORDER BY nombre, fecha;");
        $row = array();
        $idp = array();
        $idp2=array();
        $tot = 0;
        while ($result->fetchInto($row)) {
            $idp[] = $row[0];
            $idp2[] = $row[1];
            $tot++;
        }
        $_SESSION['fd_total'] = $tot;
        if ($_SESSION['fd_pag'] < 0 || $_SESSION['fd_pag'] >= $tot) {
            $do->id_fuente_directa = null;
        } else {
            $do->id_fuente_directa = $idp[$_SESSION['fd_pag']];
            $do->fecha = $idp2[$_SESSION['fd_pag']];
            $do->find();
            $do->fetch();
            $do_fd->id = $do->id_fuente_directa;
            $do_fd->find();
            $do_fd->fetch();
        }

        $this->bfuente_directa_caso =& DB_DataObject_FormBuilder::create($do,
            array('requiredRuleMessage' => $GLOBALS['mreglareq'],
                  'ruleViolationMessage' => $GLOBALS['mreglavio'] )); 
        $this->bfuente_directa =& DB_DataObject_FormBuilder::create($do_fd,
            array('requiredRuleMessage' => $GLOBALS['mreglareq'],
                  'ruleViolationMessage' => $GLOBALS['mreglavio'] )); 

        if ($this->bfuente_directa_caso == null) {
            die("bfuente_directa_caso es null");
        }
        if ($this->bfuente_directa == null) {
            die("bfuente_directa es null");
        }
        
        return $db;
    }


    /**
     * Constructora.
     * Ver documentación completa en clase base.
     *
     * @param string $nomForma Nombre 
     * @param string $mreq     Mensaje de dato requerido
     *
     * @return void
     */
    function PagOtrasFuentes($nomForma, $mreq)
    {
        parent::PagBaseMultiple($nomForma, $mreq, 'Otras Fuentes',
            'Fuente', 'fd', 'fuente_directa_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)
    {
        $this->bfuente_directa->createSubmit = 0;
        $this->bfuente_directa->useForm($this);
        $this->bfuente_directa->getForm();

        $this->bfuente_directa_caso->createSubmit = 0;
        $this->bfuente_directa_caso->useForm($this);
        $this->bfuente_directa_caso->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)
    {

        if (isset($_SESSION['recuperaErrorValida'])) {
            $v = $_SESSION['recuperaErrorValida'];
        } else {
            $v = array();
            foreach ($this->bfuente_directa->_do->fb_fieldsToRender as $c) {
                $cq = $this->getElement($c);
                if (isset($this->bfuente_directa->_do->$c)) {
                    $v[$c] = $this->bfuente_directa->_do->$c;
                }
            }
            foreach ($this->bfuente_directa_caso->_do->fb_fieldsToRender as $c) {
                $cq = $this->getElement($c);
                if (isset($this->bfuente_directa_caso->_do->$c)) {
                    $v[$c] =$this->bfuente_directa_caso->_do->$c;
                }
            }
            if (isset($_SESSION['nuevo_copia_id'])) {
                $id = $_SESSION['nuevo_copia_id'];
                unset($_SESSION['nuevo_copia_id']);

                foreach (array('fuente_directa' => 'id', 
                    'fuente_directa_caso' => 'id_fuente_directa') as $n => $k) {
                    $d =& DB_DataObject::factory($n);
                    $d->get($k, $id);
                    foreach ($d->fb_fieldsToRender as $c) {
                        $cq = $this->getElement($c); 
                        $v[$c] = $d->$c;
                    }
                }
            }
        }

        $campos = array_merge($this->bfuente_directa->_do->fb_fieldsToRender,
            $this->bfuente_directa_caso->_do->fb_fieldsToRender);
        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));
        $db->query("DELETE FROM fuente_directa_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['nombre'] == null || $valores['nombre'] == '') &&
            ($valores['anotacion'] == null || $valores['anotacion'] == '') &&
            ($valores['ubicacion_fisica'] == null 
                || $valores['ubicacion_fisica'] == '') ;

        if ($es_vacio) {
            return true;
        }
        if (!$this->validate() || $valores['nombre'] == null || 
            $valores['fecha'] == null) {
            die("no valido = " . $es_vacio);
            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();

        $do =& DB_DataObject::factory('caso');
        $do->id = $this->bfuente_directa_caso->_do->id_caso;
        $do->find();
        $do->fetch();
        $df= call_user_func($this->bfuente_directa_caso->dateToDatabaseCallback,
            varEscapa($valores['fecha'], $db));

        if (strtotime($df)<strtotime($do->fecha)) {
            errorValida('Fecha de fuente no puede ser anterior a la del caso',
                $valores);
            return false;
        }

        if ($this->bfuente_directa_caso->_do->id_fuente_directa != null &&
            $this->bfuente_directa_caso->_do->fecha != null) {
            $this->bfuente_directa_caso->_do->delete();
            $_SESSION['fd_total']--;
        }
        $this->bfuente_directa_caso->
            forceQueryType(DB_DATAOBJECT_FORMBUILDER_QUERY_FORCEINSERT);
        $q = "SELECT  id FROM fuente_directa WHERE " .
            "nombre='".varEscapa($valores['nombre'], $db)."';";
        $result = $db->query($q);
        $row = array();
        if (isset($result) && !PEAR::isError($result) &&
            $result->fetchInto($row)) {
            $this->bfuente_directa->_do->get('id', $row[0]);
        } else {
            $this->bfuente_directa->_do->id = null;
            $this->bfuente_directa->_do->nombre = varEscapa($valores['nombre'], $db);
            $this->bfuente_directa->_do->insert();
        }

        $this->bfuente_directa_caso->_do->id_fuente_directa=
            $this->bfuente_directa->_do->id;
        $ret = $this->process(array(&$this->bfuente_directa_caso, 'processForm'), 
            false);
        $_SESSION['fd_total']++;

        $this->bfuente_directa_caso = null;
        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('fuente_directa_caso');
        $duc->id_caso = (int)$dCaso->id;
        if ($duc->find()>0) {
            $t .= ", fuente_directa_caso, fuente_directa";
            busand_sinap($w, "fuente_directa_caso.id_caso", 
                "caso.id", "=", "AND");
            busand_sinap($w, "fuente_directa_caso.id_fuente_directa", 
                "fuente_directa.id", "=", "AND");
            $w3="";
            while ($duc->fetch()) {
                $w2="";
                if (isset($duc->anotacion) && $duc->anotacion != '') {
                    busand($db, $w2, "fuente_directa_caso.anotacion", 
                        $duc->anotacion, "=", "AND");
                }
                if (isset($duc->ubicacion_fisica) && 
                    $duc->ubicacion_fisica != '') {
                    busand($db, $w2, "fuente_directa_caso.ubicacion_fisica", 
                        $duc->ubicacion_fisica, "=", "AND");
                }
                if (isset($duc->tipo_fuente) && $duc->tipo_fuente != '') {
                    busand($db, $w2, "fuente_directa_caso.tipo_fuente", 
                        $duc->tipo_fuente, "=", "AND");
                }
    
                $du=& DB_DataObject::factory('fuente_directa');
                $du->get((int)($duc->id_fuente_directa));
                busand($db, $w2, "fuente_directa.nombre",
                    $du->nombre, '=', 'AND');
                if ($w2!="") {
                    $w3 = $w3=="" ? "($w2)" : "$w3 OR ($w2)";
                }
            }
            if ($w3!="") {
                $w .= " AND ($w3)";
            }    
        }
    }

}

?>
