/**
  *
  *Edita la informacion de una caja
  *
  * @param id_caja int Id de la caja a editar
  * @param descripcion string Descripcion de la caja
  * @param token string Token generado por el pos client
  **/
 public static function EditarCaja($id_caja, $control_billetes = null, $descripcion = null, $token = null)
 {
     Logger::log("Editando caja");
     //Valida los parametros de la caja y que la caja este activa
     $validar = self::validarParametrosCaja($id_caja, null, $token, $descripcion);
     if (is_string($validar)) {
         Logger::error($validar);
         throw new Exception($validar);
     }
     $caja = CajaDAO::getByPK($id_caja);
     if (!$caja->getActiva()) {
         Logger::error("La caja no esta activa, no se puede editar");
         throw new Exception("La caja no esta activa, no se puede editar");
     }
     //Si un parametro no es nulo, se toma como actualizacion
     if (!is_null($descripcion)) {
         $caja->setDescripcion($descripcion);
         $cc = CuentaContableDAO::getByPK($caja->getIdCuentaContable());
         if (count($cc) > 0) {
             $cc->setNombreCuenta($descripcion);
             DAO::transBegin();
             try {
                 CuentaContableDAO::save($cc);
             } catch (Exception $e) {
                 DAO::transRollback();
                 Logger::error("No se pudo editar la cuenta contable de la caja {$descripcion}: " . $e);
                 throw new Exception("No se pudo editar la cuenta contable de la caja {$descripcion}");
             }
             DAO::transEnd();
             Logger::log("Cuenta contable de la caja: {$descripcion} editada correctamente");
         }
     }
     //fin if $descripcion
     if (!is_null($token)) {
         $caja->setToken($token);
     }
     if (!is_null($control_billetes)) {
         $caja->setControlBilletes($control_billetes);
     }
     DAO::transBegin();
     try {
         CajaDAO::save($caja);
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("No se pudo editar la caja: " . $e);
         throw new Exception("No se pudo editar la caja");
     }
     DAO::transEnd();
     Logger::log("Caja editada exitosamente");
 }
define("BYPASS_INSTANCE_CHECK", false);
require_once "../../../server//bootstrap.php";
$page = new GerenciaTabPage();
// Parametros necesarios
//
$controller = new ContabilidadController();
$page->requireParam("cid", "GET", "Esta empresa no existe.");
$cuenta = $controller::DetalleCuenta($_GET["cid"]);
$cuentas = $controller::BuscarCuenta($cuenta["id_catalogo_cuentas"]);
//titulos
$page->addComponent(new TitleComponent("Editando cuenta " . $cuenta["nombre_cuenta"], 2));
$menu = new MenuComponent();
$menu->addItem("<< Regresar", "contabilidad.cuentas.ver.php?cid=" . $_GET["cid"]);
$page->addComponent($menu);
$form = new DAOFormComponent(CuentaContableDAO::getByPK($_GET["cid"]));
$form->hideField(array("id_cuenta_contable", "clave", "nivel", "consecutivo_en_nivel", "afectable", "activa", "clasificacion", "id_catalogo_cuentas"));
$form->sendHidden("id_cuenta_contable");
$form->createComboBoxJoin("cargos_aumentan", "cargos_aumentan", array(array("id" => 0, "caption" => "No"), array("id" => 1, "caption" => "Si")), $cuenta["cargos_aumentan"]);
$form->createComboBoxJoin("abonos_aumentan", "abonos_aumentan", array(array("id" => 0, "caption" => "No"), array("id" => 1, "caption" => "Si")), $cuenta["abonos_aumentan"]);
$form->createComboBoxJoin("es_cuenta_mayor", "es_cuenta_mayor", array(array("id" => 0, "caption" => "No"), array("id" => 1, "caption" => "Si")), $cuenta["es_cuenta_mayor"]);
$form->createComboBoxJoin("es_cuenta_orden", "es_cuenta_orden", array(array("id" => 0, "caption" => "No"), array("id" => 1, "caption" => "Si")), $cuenta["es_cuenta_orden"]);
$cuentas_p = array();
//para enviar el id de cuenta contable en el combo de id_cuenta_padre se debe hacer este foreach
foreach ($cuentas["resultados"] as $cta) {
    array_push($cuentas_p, array("id" => $cta->getIdCuentaContable(), "caption" => $cta->getNombreCuenta()));
}
//se llena el combo con los ids cambiados para que no se envien los id_cuenta_padre si no el id de la cuenta
$form->createComboBoxJoin("id_cuenta_padre", "nombre_cuenta", $cuentas_p, $cuenta["id_cuenta_padre"]);
$form->createComboBoxJoin("tipo_cuenta", "tipo_cuenta", array(array("id" => "Balance", "caption" => "Balance"), array("id" => "Estado de Resultados", "caption" => "Estado de Resultados")), $cuenta["tipo_cuenta"]);
$form->createComboBoxJoin("naturaleza", "naturaleza", array(array("id" => "Acreedora", "caption" => "Acreedora"), array("id" => "Deudora", "caption" => "Deudora")), $cuenta["naturaleza"]);
 /**
  *
  *
  *Dado un id obtiene una cuenta contable en el sistema que corresponda con ese id.
  *
  * @param id_cuenta_contable int id de la cuenta contable
  **/
 public static function DetalleCuenta($id_cuenta_contable)
 {
     $cuenta = CuentaContableDAO::getByPK($id_cuenta_contable);
     if (is_null($cuenta)) {
         throw new InvalidDatabaseOperationException("La cuenta con id " . $id_cuenta_contable . " no existe");
     }
     return object_to_array($cuenta);
 }
 public function testNuevaCuentaSeaAfectablePadreNoAfectable()
 {
     $id_catalogo_cuentas = self::NuevoCatalogoCuentas();
     $randmon_str = "Cuenta Padre " . time();
     $id_nueva_cuenta = ContabilidadController::NuevaCuenta(0, 1, 'Activo Circulante', 1, 0, $id_catalogo_cuentas, "Deudora", $randmon_str, "Balance", $id_cuenta_padre = "");
     $padre = CuentaContableDAO::getByPK($id_nueva_cuenta['id_cuenta_contable']);
     $this->assertEquals($padre->getAfectable(), 1);
     $randmon_str = "Cuenta Hija " . time();
     $id_nueva_cuenta2 = ContabilidadController::NuevaCuenta(0, 1, 'Activo Circulante', 1, 0, $id_catalogo_cuentas, "Deudora", $randmon_str, "Balance", $id_nueva_cuenta['id_cuenta_contable']);
     $hija = CuentaContableDAO::getByPK($id_nueva_cuenta2['id_cuenta_contable']);
     //se vuelve a trar a cuenta padre para obtener el valor actualzado
     $padre = CuentaContableDAO::getByPK($id_nueva_cuenta['id_cuenta_contable']);
     $this->assertEquals($hija->getAfectable(), 1);
     $this->assertEquals($padre->getAfectable(), 0);
 }
 /**
  *
  *Edita un concepto de ingreso
  *
  * @param id_concepto_ingreso int Id del concepto de ingreso a modificar
  * @param id_cuenta_contable int El id de la cuenta contable
  * @param descripcion string Descripcion larga del concepto de ingreso
  * @param nombre string Justificacion que aparecera despues de la leyenda "ingreso por concepto de"
  **/
 public static function EditarConceptoIngreso($id_concepto_ingreso, $id_cuenta_contable, $descripcion = null, $nombre = null)
 {
     Logger::log("Editando concepto de ingreso");
     //valida si ha recibido algun parametro para la edicion
     if (!$nombre && !$descripcion && !$id_cuenta_contable) {
         Logger::warn("No se ha recibido un parametro a editar, no hay nada que editar");
         throw new Exception("No se ha recibido un parametro a editar, no hay nada que editar");
     }
     //valida los parametros recibidos
     $validar = self::validarParametrosConceptoIngreso($id_concepto_ingreso, $nombre, $descripcion, $id_cuenta_contable);
     if (is_string($validar)) {
         Logger::error($validar);
         throw new Exception($validar);
     }
     $concepto_ingreso = ConceptoIngresoDAO::getByPK($id_concepto_ingreso);
     $cuenta = CuentaContableDAO::getByPK($id_cuenta_contable);
     //se toman como actualizacion aquellos parametros que no son null
     if (!is_null($nombre)) {
         $concepto_gasto->setNombre($nombre);
         $cuenta->setNombreCuenta($nombre);
     }
     if (!is_null($descripcion)) {
         $concepto_ingreso->setDescripcion($descripcion);
     }
     if (!is_null($monto)) {
         $concepto_ingreso->setIdCuentaContable($id_cuenta_contable);
     }
     DAO::transBegin();
     try {
         ConceptoIngresoDAO::save($concepto_ingreso);
         CuentaContableDAO::save($cuenta);
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("No se pudo editar el concepto de ingreso: " . $e);
         throw new Exception("No se pudo editar el concepto de ingreso");
     }
     DAO::transEnd();
     Logger::log("Concepto de Ingreso editado exitosamente");
 }