/**
  *
  *Registra un nuevo ingreso
  *
  * @param fecha_ingreso string Fecha del ingreso
  * @param id_empresa int Id de la empresa a la que pertenece este ingreso
  * @param monto float Monto del ingreso en caso de que no este contemplado por el concepto de ingreso o que sea diferente
  * @param id_sucursal int Id de la caja a la que pertenece este ingreso
  * @param id_concepto_ingreso int Id del concepto al que hace referencia el ingreso
  * @param id_caja int Id de la caja en la que se registra el ingreso
  * @param folio string Folio de la factura del ingreso
  * @param nota string Nota del ingreso
  * @param descripcion string Descripcion del ingreso en caso de no este contemplado en la lista de conceptos de ingreso
  * @return id_ingreso int Id autogenerado por la insercion del ingreso
  **/
 public static function NuevoIngreso($fecha_ingreso, $id_empresa, $billetes = null, $descripcion = null, $folio = null, $id_caja = null, $id_concepto_ingreso = null, $id_sucursal = null, $monto = null, $nota = null)
 {
     Logger::log("Creando nuevo ingreso");
     //Se obtiene al usuario de la sesion
     $id_usuario = SesionController::getCurrentUser();
     $id_usuario = $id_usuario->getIdUsuario();
     if (is_null($id_usuario)) {
         Logger::error("No se pudo obtener el usuario de la sesion, ya inicio sesion?");
         throw new Exception("No se pudo obtener el usuario de la sesion, ya inicio sesion?");
     }
     //Se validan los parametros obtenidos
     $validar = self::validarParametrosIngreso(null, $id_empresa, $id_concepto_ingreso, $fecha_ingreso, $id_sucursal, $id_caja, $nota, $descripcion, $folio, $monto);
     if (is_string($validar)) {
         Logger::error($validar);
         throw new Exception($validar);
     }
     //Verifica el monto del ingreso, si no se ha recibido un monto, se busca en el concepto.
     //Si el concepto no se recibe o no tiene monto se manda una excepcion
     if (is_null($monto)) {
         Logger::log("No se recibio monto, se procede a buscar en el concepto de ingreso");
         if (is_null($id_concepto_ingreso)) {
             Logger::error("No se recibio un concepto de ingreso");
             throw new Exception("No se recibio un concepto de ingreso ni un monto");
         }
         $concepto_ingreso = ConceptoIngresoDAO::getByPK($id_concepto_ingreso);
         $monto = $concepto_ingreso->getMonto();
         if (is_null($monto)) {
             Logger::error("El concepto de ingreso recibido no cuenta con un monto");
             throw new Exception("El concepto de ingreso recibido no cuenta con un monto ni se recibio un monto");
         }
     }
     //Si no se recibe sucursal, se obtiene la acutal,
     //si no se logro obtener se registra el ingreso sin sucursal
     if (!$id_sucursal) {
         $id_sucursal = self::getSucursal();
     }
     //Si no se recibe caja, se obtiene la actual,
     //si no se obtiene la actual, se registra el ingreso sin caja
     if (!$id_caja) {
         $id_caja = self::getCaja();
     }
     //Si se obtuvo una caja, se le agrega a su saldo el monto del ingreso
     if (!is_null($id_caja)) {
         try {
             CajasController::modificarCaja($id_caja, 1, $billetes, $monto);
         } catch (Exception $e) {
             throw $e;
         }
     }
     //Se inicializa el registro de ingreso
     $ingreso = new Ingreso();
     $ingreso->setCancelado(0);
     $ingreso->setDescripcion($descripcion);
     // fecha_ingreso might be in the format : 2012-10-21T00:00:00
     // if this is the case then act acordingly
     if (is_int($fecha_ingreso)) {
         $ingreso->setFechaDelIngreso($fecha_ingreso);
     } else {
         $ingreso->setFechaDelIngreso(strtotime($fecha_ingreso));
     }
     $ingreso->setFolio($folio);
     $ingreso->setIdCaja($id_caja);
     $ingreso->setIdConceptoIngreso($id_concepto_ingreso);
     $ingreso->setIdEmpresa($id_empresa);
     $ingreso->setIdSucursal($id_sucursal);
     $ingreso->setIdUsuario($id_usuario);
     $ingreso->setMonto($monto);
     $ingreso->setNota($nota);
     $ingreso->setFechaDeRegistro(time());
     DAO::transBegin();
     try {
         IngresoDAO::save($ingreso);
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("Error al guardar el nuevo ingreso: " . $e);
         throw new Exception("Error al guardar el nuevo ingreso");
     }
     DAO::transEnd();
     Logger::log("Ingreso creado exitosamente!");
     return array("id_ingreso" => $ingreso->getIdIngreso());
 }