$form->createComboBoxJoin("control_billetes", "control_billetes", array(array("id" => 0, "caption" => "No"), array("id" => 1, "caption" => "Si")), $esta_caja->getControlBilletes());
$form->createComboBoxJoin("abierta", "abierta", array(array("id" => 0, "caption" => "No"), array("id" => 1, "caption" => "Si")), $esta_caja->getAbierta());
$page->addComponent($form);
if ($esta_caja->getControlBilletes()) {
    $page->addComponent(new TitleComponent("Billetes en esta caja", 3));
    $tabla = new TableComponent(array("id_billete" => "Billete", "cantidad" => "Cantidad"), BilleteCajaDAO::search(new BilleteCaja(array("id_caja" => $_GET["cid"]))));
    function funcion_billete($id_billete)
    {
        return BilleteDAO::getByPK($id_billete) ? BilleteDAO::getByPK($id_billete)->getNombre() : "------";
    }
    $tabla->addColRender("id_billete", "funcion_billete");
    $tabla->addOnClick("id_billete", "(function(a){window.location = 'efectivo.billete.ver.php?bid='+a;})");
    $page->addComponent($tabla);
}
$page->addComponent(new TitleComponent("Aperturas"));
$tabla = new TableComponent(array("fecha" => "Fecha", "saldo" => "Saldo", "id_cajero" => "Cajero"), AperturaCajaDAO::search(new AperturaCaja(array("id_caja" => $_GET["cid"]))));
function funcion_cajero($id_cajero)
{
    return UsuarioDAO::getByPK($id_cajero) ? UsuarioDAO::getByPK($id_cajero)->getNombre() : "------";
}
$tabla->addColRender("id_cajero", "funcion_cajero");
$page->addComponent($tabla);
$page->addComponent(new TitleComponent("Cortes"));
$tabla = new TableComponent(array("fecha" => "Fecha", "saldo_real" => "Saldo Encontrado", "saldo_esperado" => "Saldo Esperado", "saldo_final" => "Saldo Final", "id_cajero" => "Cajero"), CorteDeCajaDAO::search(new CorteDeCaja(array("id_caja" => $_GET["cid"]))));
$tabla->addColRender("id_cajero", "funcion_cajero");
$page->addComponent($tabla);
$page->addComponent(new TitleComponent("Cierres"));
$tabla = new TableComponent(array("fecha" => "Fecha", "saldo_real" => "Saldo Encontrado", "saldo_esperado" => "Saldo Esperado", "id_cajero" => "Cajero"), CierreCajaDAO::search(new CierreCaja(array("id_caja" => $_GET["cid"]))));
$tabla->addColRender("id_cajero", "funcion_cajero");
$page->addComponent($tabla);
$page->render();
 /**
  *
  *Hace un corte en los flujos de dinero de la sucursal. El Id de la sucursal se tomara de la sesion actual. La fehca se tomara del servidor.
  *
  * @param saldo_real float Saldo que hay actualmente en la caja
  * @param billetes json Ids de billetes y sus cantidades encontrados en la caja al hacer el cierre
  * @param id_cajero int Id del cajero en caso de que no sea este el que realiza el cierre
  * @return id_cierre int Id del cierre autogenerado.
  **/
 public static function CerrarCaja($id_caja, $saldo_real, $billetes = null, $id_cajero = null)
 {
     Logger::log("Cerrando caja " . $id_caja);
     //Se valida la caja obtenida, que exista, que este activa y que este abierta
     $caja = CajaDAO::getByPK($id_caja);
     if (is_null($caja)) {
         Logger::error("La caja con id:" . $id_caja . " no existe");
         throw new Exception("La caja con id:" . $id_caja . " no existe");
     }
     if (!$caja->getActiva()) {
         Logger::error("La caja proporcionada no esta activa, no se puede cerrar");
         throw new Exception("La caja proporcionada no esta activa, no se puede cerrar");
     }
     if (!$caja->getAbierta()) {
         Logger::warn("La caja proporcionada ya esta cerrada");
         throw new Exception("La caja proporcionada ya esta cerrada");
     }
     //Se valida que el cajero exista y tenga rol de cajero
     if (!is_null($id_cajero)) {
         $cajero = UsuarioDAO::getByPK($id_cajero);
         if (is_null($cajero)) {
             Logger::error("El cajero con id: " . $id_cajero . " no existe");
             throw new Exception("El cajero no existe");
         }
         if ($cajero->getIdRol() != 3) {
             Logger::error("El usuario " . $id_cajero . " no tiene rol de cajero");
             throw new Exception("El usuario no tiene rol de cajero");
         }
     }
     //Se valida el parametro saldo real.
     $validar = self::validarNumero($saldo_real, 1.8E+200, "saldo real");
     if (is_string($validar)) {
         Logger::error($validar);
         throw new Exception($validar);
     }
     //Se crea el registro de la tabla cierre_caja
     $cierre_caja = new CierreCaja(array("id_caja" => $id_caja, "id_cajero" => $id_cajero, "fecha" => time(), "saldo_real" => $saldo_real, "saldo_esperado" => $caja->getSaldo()));
     //Se realizan los movimientos de la caja antes de cerrarla, pues al cerrar la caja
     //ya no se pueden realizar movimientos sobre la misma.
     try {
         CajasController::modificarCaja($id_caja, 0, $billetes, $caja->getSaldo());
     } catch (Exception $e) {
         throw new Exception("No se pudo modificar la caja");
     }
     DAO::transBegin();
     try {
         //Se guardan los cambios en caja y cierre_caja
         $caja->setAbierta(0);
         CierreCajaDAO::save($cierre_caja);
         CajaDAO::save($caja);
         //Si la caja lleva control de los billetes, se crea un registro de la tabla billete_cierre_caja
         //y se registran cuantos billetes fueron encontrados, cuantos sobraron y cuantos faltaron.
         if ($caja->getControlBilletes()) {
             $billetes = object_to_array($billetes);
             //Se regitran los billetes recibidos como cantidad encontrada.
             $billete_cierre_caja = new BilleteCierreCaja(array("id_cierre_caja" => $cierre_caja->getIdCierreCaja()));
             $billete_cierre_caja->setCantidadFaltante(0);
             $billete_cierre_caja->setCantidadSobrante(0);
             foreach ($billetes as $b) {
                 $billete_cierre_caja->setIdBillete($b["id_billete"]);
                 $billete_cierre_caja->setCantidadEncontrada($b["cantidad"]);
                 BilleteCierreCajaDAO::save($billete_cierre_caja);
             }
             //Se buscan los billetes de la caja y se buscan en la tabla billete_cierre_caja
             //Si no se encuentra, se crea un registro nuevo
             //Si despues de haber modificado la caja, quedan billetes en ella, significa que
             //esos billetes estan faltando.
             //En cambio, si esos billetes tienen cantidad negativa, significa que estan sobrando
             $billetes_caja = BilleteCajaDAO::search(new BilleteCaja(array("id_caja" => $id_caja)));
             foreach ($billetes_caja as $b_c) {
                 $billete_cierre_caja = BilleteCierreCajaDAO::getByPK($b_c->getIdBillete(), $cierre_caja->getIdCierreCaja());
                 if (is_null($billete_cierre_caja)) {
                     $billete_cierre_caja = new BilleteCierreCaja(array("id_billete" => $b_c->getIdBillete(), "id_cierre_caja" => $cierre_caja->getIdCierreCaja(), "cantidad_encontrada" => 0, "cantidad_sobrante" => 0, "cantidad_faltante" => 0));
                 }
                 if ($b_c->getCantidad() < 0) {
                     $billete_cierre_caja->setCantidadSobrante($b_c->getCantidad());
                 } else {
                     if ($b_c->getCantidad() > 0) {
                         $billete_cierre_caja->setCantidadFaltante($b_c->getCantidad() * -1);
                     } else {
                         continue;
                     }
                 }
                 //Al final pone su cantidad en cero, pues al cerrar una caja esta debe quedar vacía.
                 $b_c->setCantidad(0);
                 BilleteCierreCajaDAO::save($billete_cierre_caja);
                 BilleteCajaDAO::save($b_c);
             }
             /* Fin foreach bil;etes_caja */
         }
         /* Fin if contrik billetes */
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("Error al cerrar la caja: " . $e);
         throw new Exception("Error al cerrar la caja");
     }
     DAO::transEnd();
     Logger::log("Caja cerrada exitosamente");
     return array("id_cierre" => $cierre_caja->getIdCierreCaja());
 }