SCRIPT

Documentación de Gobierno 360

Gobierno 360

Núcleo de gobierno para servidores de rol: un Estado completo con 26 organizaciones, rangos con escala salarial, departamentos, personal, tesorería por organización con libro mayor, nóminas por minutos conectado, partidas presupuestarias con topes por rango y solicitudes internas, todo con auditoría y dos paneles: uno para los cargos RP y otro para el staff.

Que hace

sbr-presidentes monta la estructura institucional de tu ciudad y la mantiene sincronizada con la base de datos a partir de un archivo de configuración.

Requisitos

Instalacion

  1. Descarga el recurso desde tu Portal de Cfx.re con la cuenta con la que lo compraste y copia la carpeta sbr-presidentes en resources.
  2. Añade en server.cfg, después de qb-core, ox_lib y oxmysql (y de reydi_economy si lo usas):
   ensure sbr-presidentes
  1. Da el permiso de staff a tu grupo de administración. Es un ACE, no un cargo RP: ni el presidente administra el recurso.
   add_ace group.admin gov.admin allow
  1. Revisa config/config_server.lua. La lista Config.Admin.owners viene vacía: si quieres licencias con acceso garantizado aunque el ACL falle, ponlas ahí o usa la convar set sbr_gov_owners "licencia1,licencia2" en server.cfg (se suma a la lista; 40 caracteres hexadecimales, con o sin el prefijo license:).
  2. Arranca el servidor. Con Config.Database.autoMigrate = true el recurso aplica solas las migraciones 001 a 006 de la carpeta sql/ que falten (estructura, personal, tesorería, partidas, solicitudes e índices) y sincroniza config_gobierno.lua con la base de datos. No hay que importar ningún .sql a mano.
  3. Decide dos cosas antes de abrir al público:
  4. Config.Economy.requireBudget (por defecto true): un gasto exige una partida activa para su categoría. Crea las partidas con /gov_partida o desde el panel de staff, o ponlo en false para gastar sin partidas.
  5. Config.Api.allowedResources: lista de recursos que pueden usar los exports de escritura (contratar, mover dinero, asignar partidas). Añade ahí tus scripts.
  6. Comprueba con /gov_info desde la consola que el núcleo está LISTO y qué framework y economía detectó.

Protección y edición. El recurso viene protegido con Asset Escrow de Cfx.re: se descarga desde tu Portal y solo funciona en servidores de tu cuenta. Según el escrow_ignore del fxmanifest.lua quedan sin cifrar: web/** (toda la interfaz de los dos paneles), config/.lua (los cuatro archivos de configuración), sql/.sql (las migraciones), shared/sh_util.lua, bridge/*.lua (la integración con framework, economía y avisos) y docs/**. Así puedes adaptar el framework, la economía, la estructura del Estado, los textos y el aspecto sin tocar el código cifrado, que es solo el de server/ y client/.

Configuracion

Toda la configuración vive en la carpeta config/. Ningún archivo de server/ o client/ nombra un recurso externo.

config/config.lua (compartido con el cliente)

ClaveValor por defectoPara qué sirve
Config.Pais'Republica de San Andreas'Nombre del Estado que ven los jugadores.
Config.DebugfalseLogs detallados en consola.
Config.Locale'es'Idioma de los textos. Por ahora solo español.
Config.Database.prefix'gov_'Prefijo de todas las tablas. Cambiarlo antes del primer arranque.
Config.Database.autoMigratetrueAplica solas las migraciones de sql/ que falten.
Config.Database.syncConfigOnStarttrueVuelca config_gobierno.lua a la base de datos en cada arranque. Nunca borra filas.
Config.Modules.coretrueOrganizaciones, rangos, permisos y auditoría.
Config.Modules.financetrueTesorería, libro mayor, nóminas y partidas.
Config.Modules.* (resto)falseMódulos de fases futuras; se dejan documentados.
Config.Audit.enabledtrueRegistro de auditoría.
Config.Audit.retentionDays0Días que se conservan los registros. 0 conserva todo.
Config.Audit.purgeEveryHours24Cada cuántas horas se purga, solo si retentionDays > 0.

config/config_server.lua (solo servidor, nunca llega al cliente)

ClaveValor por defectoPara qué sirve
Config.Admin.ace'gov.admin'ACE principal de staff.
Config.Admin.aces{ 'gov.admin', 'group.admin' }Cualquiera de estos ACEs abre el panel de staff y los comandos.
Config.Admin.owners{}Licencias con administración total aunque el ACL falle. Se suma la convar sbr_gov_owners.
Config.Admin.debugfalseImprime el motivo de cada denegación (escribe la licencia; dejar en false en producción).
Config.Economy.payCycleMinutes30Minutos de servicio que componen un ciclo de nómina.
Config.Economy.payoutAccount'bank'Cuenta donde se abona la nómina ('bank' o 'cash').
Config.Economy.maxPayPerCycle2000Ningún pago automático supera este importe por ciclo.
Config.Economy.requireBudgettrueUn gasto exige una partida activa para su categoría.
Config.Economy.idemPendingMinutes10Minutos tras los que una operación colgada puede reintentarse.
Config.Economy.maxRequestsPerMinute5Solicitudes que un ciudadano puede crear por minuto.
Config.Api.allowedResources{ 'reydi_economy', 'qb-core' }Recursos que pueden usar los exports de escritura.
Config.Api.logDeniedtrueAvisa en consola cuando se deniega un export.
Config.Cache.membersTtlMs60000Vida en memoria de la ficha de personal.

config/config_bridge.lua (integración con tu servidor)

ClaveValor por defectoPara qué sirve
Config.Bridge.framework'auto''auto', 'qb', 'esx' o 'custom'.
Config.Bridge.frameworksqb-core, qbx_core, es_extendedOrden de detección con 'auto'.
Config.Bridge.economy.resource'reydi_economy'Recurso de economía. nil o ausente: dinero directo del framework.
Config.Bridge.economy.exportsGetMoney, AddMoney, RemoveMoneyNombres de los exports de ese recurso.
Config.Bridge.economy.accountscash = 'cash', bank = 'bank'Traducción de cuentas.
Config.Bridge.notify.mode'ox_lib''ox_lib', 'qb', 'chat' o 'custom'.
Config.Bridge.notify.title'Gobierno'Título de los avisos.
Config.Bridge.inventory / target / appearance / phoneox_inventory / ox_target / illenium-appearance / lb-phoneRecursos opcionales reservados para fases futuras; pon nil en los que no tengas.
Config.Bridge.players.table / column'players' / 'citizenid'Tabla de personajes (solo lectura) para comprobar que un ciudadano existe y mostrar nombres. Para ESX: esxTable = 'users', esxColumn = 'identifier'.
Config.Bridge.customfunciones en nilAdaptador propio para un framework no contemplado.

config/config_gobierno.lua (estructura del Estado)

Es la fuente de verdad de la estructura: Config.Gobierno.rangos (escala global con slug, label, level, salary y perms), Config.Gobierno.departamentosBase (8 departamentos comunes: dirección, administración, recepción, seguridad, limpieza, mantenimiento, conserjería y almacén), Config.Gobierno.organizaciones (las 26, con slug, type, parent, label, description y sus departamentos), Config.Gobierno.departamentosMunicipales (14 para los ayuntamientos), Config.Gobierno.municipios (centro y radio de cada municipio para enrutar por coordenadas) y Config.Gobierno.rangosEspecificos (cargos con nombre propio por organización). Añadir un ministerio, un municipio o un departamento es añadir una entrada y reiniciar el recurso; el slug no se cambia nunca, el label sí.

config/config_permisos.lua (permisos institucionales)

Config.Permisos es el catálogo de permisos con su descripción y Config.GruposPermisos asigna permisos a cada grupo de rango (presidencia, gabinete, ministerio, direccion, jefatura, trabajador, aprendiz). El comodín concede un ámbito completo (finance.).

Comandos y permisos

Todos los comandos /gov_* del servidor exigen el ACE gov.admin (o cualquiera de Config.Admin.aces, o una licencia de owners) y también funcionan desde la consola del servidor. Ningún cargo RP, ni siquiera el presidente, puede usarlos. Donde dice <idJugador|citizenid> vale el ID de servidor de un jugador conectado o su citizenid.

Paneles y menús

ComandoQuiénQué hace
/panelgob (tecla F6, reasignable)Cualquier miembro de una organizaciónPanel institucional: Mi cargo, Personal, Presupuesto y Solicitudes según sus permisos.
/gov_staff (alias /gov_admin, sin tecla por defecto)Staff con gov.adminPanel de administración completo del Gobierno.
/govCualquier jugadorMenú de contexto con su expediente: cargos, plantilla, caja e historial laboral.

Diagnóstico y estructura

ComandoQué hace
/gov_infoEstado del núcleo, prefijo de tablas, resumen de la estructura y qué detectó el bridge.
/gov_orgs [tipo]Lista organizaciones, opcionalmente por tipo (estado, poder, ministerio, municipio, organismo).
/gov_depts <organizacion>Departamentos de una organización.
/gov_rangos [organizacion]Rangos con nivel, salario y número de permisos.
/gov_permiso <rango> <permiso> [organizacion]Comprueba si un rango tiene un permiso.
/gov_municipio <x> <y>Municipio que corresponde a unas coordenadas.
/gov_reloadRecarga configuración y caché sin reiniciar el recurso.

Personal

ComandoQué hace
`/gov_ficha <idJugador\citizenid>`Fichas de un ciudadano, incluidas las inactivas, y salario total.
/gov_plantilla <organizacion> [departamento]Personal en activo.
`/gov_contratar <idJugador\citizenid> <organizacion> <rango> [departamento]`Alta.
`/gov_rango_asignar <idJugador\citizenid> <organizacion> <rango> [motivo]`Ascenso o descenso.
`/gov_trasladar <idJugador\citizenid> <organizacion> <departamento\-> [motivo]`Traslado; - lo deja sin departamento.
`/gov_cesar <idJugador\citizenid> <organizacion> [motivo]`Cese; conserva ficha e histórico.
`/gov_estado_miembro <idJugador\citizenid> <organizacion> <active\suspended\dismissed>`Estado de la ficha.
`/gov_principal <idJugador\citizenid> <organizacion>`Marca el cargo principal.
`/gov_historial <idJugador\citizenid> [limite]`Histórico de un ciudadano.

Tesorería y nóminas

ComandoQué hace
/gov_caja <organizacion>Saldo, estado de la nómina y coste por ciclo.
/gov_cajas [tipo]Todas las cajas de mayor a menor saldo, con total.
/gov_libro <organizacion> [limite]Últimos asientos del libro mayor.
/gov_balance <organizacion> [dias]Ingresos, gastos y neto de los últimos días.
`/gov_servicio <idJugador\citizenid>`Minutos de servicio y nómina pendiente.
/gov_ingresar <organizacion> <importe> [concepto]Ingreso en caja.
/gov_gastar <organizacion> <importe> <categoria> [concepto]Gasto; la categoría decide qué partida se consume.
`/gov_gastar_autorizado <organizacion> <importe> <categoria> <idJugador\citizenid que autoriza> [concepto]`Gasto con segunda autorización de otro cargo.
/gov_transferir <origen> <destino> <importe> [concepto]Transferencia entre cajas.
`/gov_pagar <organizacion> <idJugador\citizenid> <importe> [concepto]`Pago puntual a un ciudadano conectado.
`/gov_cobrar <organizacion> <idJugador\citizenid> <importe> [concepto]`Cobro a un ciudadano conectado (tasas, multas).
`/gov_nomina <organizacion> <on\off>`Activa o para la nómina automática.

Partidas y topes

ComandoQué hace
/gov_partidas <organizacion>Presupuesto completo: partidas y topes.
/gov_partida <organizacion> <categoria> <importe> [etiqueta]Crea una partida o fija su importe.
/gov_partida_ajustar <organizacion> <categoria> <importe +/->Suma o resta a una partida.
`/gov_partida_estado <organizacion> <categoria> <on\off>`Desactivada bloquea el gasto de esa categoría.
/gov_partida_cerrar <organizacion> <categoria>Cierra el ejercicio: guarda el periodo y pone el gasto a 0.
/gov_partida_historial <organizacion> [limite]Ejercicios cerrados.
/gov_topes <organizacion>Topes de gasto por rango.
/gov_tope <organizacion> <rango> <topePorOperacion> <topePorPeriodo> [minutos] [aprobacionPorEncimaDe]Fija topes; 0 = sin tope; minutos por defecto 1440.
`/gov_tope_probar <idJugador\citizenid> <organizacion> <importe>`Simula si un ciudadano podría gastar ese importe.
/gov_idem_purgar [dias]Limpia claves de idempotencia resueltas (7 días por defecto).

Exports. Lectura, abiertos a cualquier recurso: Ready, GetStatus, GetOrganization(s), GetDepartments, GetMunicipalities, GetMunicipalityAt, GetRanks, GetRank, RankHasPermission, GetSalary, IsGovAdmin, GetMemberships, GetMember, GetPrimaryMember, IsMember, GetRoster, HasPermission, PlayerHasPermission, GetOrgBalance, GetTreasuryAccount, GetOrgLedger, GetOrgStatement, GetServiceTime, GetPayrollLog, GetOrgBudgets, GetBudgetSummary, GetRankSpendLimits, CheckSpendLimit, entre otros. Escritura, solo desde Config.Api.allowedResources: HireMember, SetMemberRank, TransferMember, SetMemberStatus, FireMember, SetPrimaryMember, DepositFunds, SpendFunds, TransferFunds, PayCitizen, CollectFromCitizen, SetPayrollEnabled, FlushPendingPayroll, AllocateBudget, AdjustBudget, SetBudgetActive, ResetBudget, SetRankSpendLimit, PurgeIdempotencyKeys. Un recurso no autorizado recibe false, 'recurso_no_autorizado'.

Como se usa

  1. El staff da de alta al primer cargo con /gov_contratar o desde la pestaña Gestión de personal de /gov_staff, eligiendo jugador conectado, organismo, cargo y departamento en desplegables.
  2. El staff ingresa fondos en las cajas (/gov_ingresar o Tesorería), crea las partidas por categoría (Presupuestos y nóminas o /gov_partida) y activa la nómina de cada organización (/gov_nomina ... on). La activación de la nómina pide confirmación porque empieza a mover dinero real.
  3. Un cargo abre /panelgob (F6) y ve en Mi cargo su institución, rango, departamento, salario y permisos efectivos; si tiene varios cargos, cambia de organización en el desplegable superior.
  4. En Personal contrata, asciende o traslada según sus permisos; en Presupuesto consulta partidas, saldo y libro mayor; en Solicitudes crea una solicitud (tipo, importe, partida, asunto y detalle) o aprueba y rechaza las de su bandeja (el rechazo exige motivo).
  5. Mientras el personal está conectado acumula minutos; cada ciclo cobra su salario desde la caja de su organización y el pago queda en el historial de nóminas.
  6. Cualquier jugador puede ver su expediente con /gov.

Para administradores

Preguntas frecuentes

¿Funciona sin reydi_economy? Sí. Si el recurso no existe, el bridge cae al dinero directo del framework detectado y lo avisa en consola. También puedes dejar Config.Bridge.economy.resource = nil.

¿Funciona con ESX o Qbox? El bridge detecta qb-core, qbx_core y es_extended, y config_bridge.lua permite un adaptador propio. En esta versión solo se ha validado la integración con QBCore.

¿Tengo que importar los .sql a mano? No. Con autoMigrate = true el recurso aplica al arrancar las migraciones que falten y las registra en gov_migrations. Las migraciones están sin cifrar por si quieres revisarlas.

¿Por qué el presidente no puede gastar? Es deliberado: el grupo presidencia no tiene finance.spend ni finance.budget; gastar y asignar partidas corresponde a Hacienda (grupo ministerio). Puedes cambiarlo en config_permisos.lua.

¿Qué pasa si el servidor se cae a mitad de una operación de dinero? Cargos, abonos y traspasos son una sola transacción en base de datos con clave de idempotencia: o se aplica todo o nada, y un reintento devuelve lo ya hecho. El único límite es el dinero del jugador, que vive en el framework: ahí una caída entre el cargo a la caja y el abono al jugador no la cubre SQL.

¿Puedo añadir un ministerio o un municipio nuevo? Sí: una entrada más en Config.Gobierno.organizaciones (y en Config.Gobierno.municipios si tiene zona geográfica) y reinicio del recurso.

¿Está probado en juego? Esta versión 1.0.0 ha pasado pruebas automatizadas de la lógica de servidor (personal, tesorería, partidas, nóminas, solicitudes e idempotencia) y las migraciones se han aplicado en una base de datos real, pero no se ha probado de principio a fin dentro del juego. Prueba los paneles y las nóminas en tu servidor antes de abrirlo al público.

Actualizaciones y soporte

Las versiones nuevas aparecen en tu Portal de Cfx.re y en la tienda. Antes de actualizar, guarda una copia de la carpeta config/ y de web/ si cambiaste la interfaz; las migraciones nuevas se aplican solas al arrancar y nunca borran datos. Soporte: [enlace de soporte].