/**
  *
  *Crea una nueva retencion
  *
  * @param es_monto float Si es veradera, el campo monto_porcentaje sera tomado como un monto fijo, si es falso, sera tomado como un porcentaje
  * @param monto_porcentaje float Monto o procentaje que representa esta retencion
  * @param nombre string Nombre de la retencion
  * @param descripcion string Descripcion larga de la retencion
  * @return id_retencion int Id de la retencion creada
  **/
 public static function NuevaRetencion($es_monto, $monto_porcentaje, $nombre, $descripcion = null)
 {
     Logger::log("Creando una nueva retencion");
     //Se validan los parametros recibidos
     $e = self::validarEsMonto($es_monto);
     if (is_string($e)) {
         Logger::error($e);
         throw new Exception($e);
     }
     $e = self::validarMontoPorcentaje($monto_porcentaje);
     if (is_string($e)) {
         Logger::error($e);
         throw new Exception($e);
     }
     $e = self::validarNombre($nombre);
     if (is_string($e)) {
         Logger::error($e);
         throw new Exception($e);
     }
     if (!is_null($descripcion)) {
         $e = self::validarDescripcion($descripcion);
         if (is_string($e)) {
             Logger::error($e);
             throw new Exception($e);
         }
     }
     $retencion = new Retencion(array("es_monto" => $es_monto, "monto_porcentaje" => $monto_porcentaje, "nombre" => $nombre, "descripcion" => $descripcion));
     DAO::transBegin();
     try {
         RetencionDAO::save($retencion);
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("No se ha podido crear la nueva retencion: " . $e);
         throw new Exception("No se ha podido crear la nueva retencion, consulte a su administrador de sistema");
     }
     DAO::transEnd();
     Logger::log("Retencion creada exitosamente");
     return array("id_retencion" => $retencion->getIdRetencion());
 }