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.
- 26 organizaciones de serie: el Estado (raíz), el Congreso, el Tribunal Supremo, 15 ministerios (Presidencia, Interior y Seguridad, Hacienda y Finanzas, Justicia, Sanidad, Educación, Obras Públicas, Transportes, Trabajo y Empleo, Economía y Comercio, Vivienda y Urbanismo, Cultura y Deportes, Medioambiente, Bienestar Social y Administración Pública), 5 organismos independientes (Comisión Electoral, Tribunal de Cuentas, Defensor del Ciudadano, Oficina de Transparencia y Autoridad de Protección de Datos) y 3 ayuntamientos (Los Santos, Sandy Shores y Paleto Bay). Cada una tiene sus departamentos; los municipios comparten además una plantilla de departamentos municipales.
- Escala de rangos global con salario: 15 rangos desde Aprendiz (nivel 5) hasta Presidente de la República (nivel 100), cada uno con su salario por ciclo y su grupo de permisos. Las organizaciones pueden tener cargos con nombre propio (alcalde, concejal, diputado, magistrado, juez, fiscal, profesor, conserje...) que heredan nivel y salario de un rango base.
- Permisos institucionales por rango: un catálogo de permisos del tipo
ambito.accion(ver plantilla, contratar, ascender, gastar, transferir, asignar partidas, gestionar nóminas, aprobar gastos de otros, ver auditoría...) agrupado en 7 grupos (presidencia, gabinete, ministerio, dirección, jefatura, trabajador y aprendiz). La Presidencia no puede gastar ni asignar partidas a propósito: eso corresponde a Hacienda. - Personal: fichas por ciudadano y organización con rango, departamento, estado (
active,suspended,dismissed), cargo principal e historial de altas, ceses, ascensos y traslados. - Tesorería por organización: cada organización tiene su caja con saldo, libro mayor (asientos con saldo resultante, categoría y concepto) y balance por días. Ingresos, gastos, transferencias entre cajas, pagos a ciudadanos y cobros a ciudadanos son operaciones atómicas en base de datos con clave de idempotencia: una orden repetida no se ejecuta dos veces.
- Nóminas por minutos conectado: el personal acumula minutos de servicio mientras está en línea y cobra su salario cada ciclo (30 minutos por defecto) desde la caja de su organización, con tope de seguridad por ciclo. La nómina se activa o para por organización.
- Partidas presupuestarias y topes por rango: el gasto de cada organización se reparte en partidas por categoría (asignado, gastado, disponible), se puede cerrar el ejercicio y conservar el histórico, y cada rango puede tener tope por operación, tope por periodo y un umbral a partir del cual hace falta la autorización de otro cargo.
- Solicitudes internas: desde el panel institucional cualquier miembro crea solicitudes de 6 tipos (gasto o presupuesto, contratación, ascenso, traslado, permiso o baja y trámite interno) que ven y resuelven los cargos con el permiso correspondiente; nadie se aprueba a sí mismo.
- Dos paneles:
/panelgob(tecla F6 por defecto) para los cargos RP, con pestañas Mi cargo, Personal, Presupuesto y Solicitudes; y/gov_staffpara el staff, con panel principal, gestión de personal, tesorería, presupuestos y nóminas, ministerios y departamentos, municipios, permisos y administración e historial general. Las operaciones de dinero piden confirmación. - Comandos de consola y exports: más de 40 comandos
/gov_*para consultar o administrar todo desde la consola o el chat, y una API de exports de lectura (abierta) y de escritura (solo recursos autorizados) para integrar otros scripts. - Auditoría y migraciones automáticas: cada acción relevante queda en el registro de auditoría con su actor, y las tablas se crean y actualizan solas al arrancar.
Requisitos
- FiveM (FXServer reciente) y Lua 5.4.
- QBCore (
qb-core; también detectaqbx_coreyes_extended, ver "Configuración"). - ox_lib (menús de contexto, callbacks y avisos).
- oxmysql y una base de datos MariaDB o MySQL 8. Las migraciones comprueban qué existe antes de cada cambio, así que funcionan en ambos motores.
- Opcional:
reydi_economypara mover el dinero de los jugadores. Si no está, el recurso usa el dinero directo del framework detectado (QBCore) sin cambiar nada más.
Instalacion
- Descarga el recurso desde tu Portal de Cfx.re con la cuenta con la que lo compraste y copia la carpeta
sbr-presidentesenresources. - Añade en
server.cfg, después deqb-core,ox_libyoxmysql(y dereydi_economysi lo usas):
ensure sbr-presidentes
- 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
- Revisa
config/config_server.lua. La listaConfig.Admin.ownersviene vacía: si quieres licencias con acceso garantizado aunque el ACL falle, ponlas ahí o usa la convarset sbr_gov_owners "licencia1,licencia2"enserver.cfg(se suma a la lista; 40 caracteres hexadecimales, con o sin el prefijolicense:). - Arranca el servidor. Con
Config.Database.autoMigrate = trueel recurso aplica solas las migraciones001a006de la carpetasql/que falten (estructura, personal, tesorería, partidas, solicitudes e índices) y sincronizaconfig_gobierno.luacon la base de datos. No hay que importar ningún.sqla mano. - Decide dos cosas antes de abrir al público:
Config.Economy.requireBudget(por defectotrue): un gasto exige una partida activa para su categoría. Crea las partidas con/gov_partidao desde el panel de staff, o ponlo enfalsepara gastar sin partidas.Config.Api.allowedResources: lista de recursos que pueden usar los exports de escritura (contratar, mover dinero, asignar partidas). Añade ahí tus scripts.- Comprueba con
/gov_infodesde la consola que el núcleo estáLISTOy 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)
| Clave | Valor por defecto | Para qué sirve |
|---|---|---|
Config.Pais | 'Republica de San Andreas' | Nombre del Estado que ven los jugadores. |
Config.Debug | false | Logs 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.autoMigrate | true | Aplica solas las migraciones de sql/ que falten. |
Config.Database.syncConfigOnStart | true | Vuelca config_gobierno.lua a la base de datos en cada arranque. Nunca borra filas. |
Config.Modules.core | true | Organizaciones, rangos, permisos y auditoría. |
Config.Modules.finance | true | Tesorería, libro mayor, nóminas y partidas. |
Config.Modules.* (resto) | false | Módulos de fases futuras; se dejan documentados. |
Config.Audit.enabled | true | Registro de auditoría. |
Config.Audit.retentionDays | 0 | Días que se conservan los registros. 0 conserva todo. |
Config.Audit.purgeEveryHours | 24 | Cada cuántas horas se purga, solo si retentionDays > 0. |
config/config_server.lua (solo servidor, nunca llega al cliente)
| Clave | Valor por defecto | Para 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.debug | false | Imprime el motivo de cada denegación (escribe la licencia; dejar en false en producción). |
Config.Economy.payCycleMinutes | 30 | Minutos 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.maxPayPerCycle | 2000 | Ningún pago automático supera este importe por ciclo. |
Config.Economy.requireBudget | true | Un gasto exige una partida activa para su categoría. |
Config.Economy.idemPendingMinutes | 10 | Minutos tras los que una operación colgada puede reintentarse. |
Config.Economy.maxRequestsPerMinute | 5 | Solicitudes que un ciudadano puede crear por minuto. |
Config.Api.allowedResources | { 'reydi_economy', 'qb-core' } | Recursos que pueden usar los exports de escritura. |
Config.Api.logDenied | true | Avisa en consola cuando se deniega un export. |
Config.Cache.membersTtlMs | 60000 | Vida en memoria de la ficha de personal. |
config/config_bridge.lua (integración con tu servidor)
| Clave | Valor por defecto | Para qué sirve |
|---|---|---|
Config.Bridge.framework | 'auto' | 'auto', 'qb', 'esx' o 'custom'. |
Config.Bridge.frameworks | qb-core, qbx_core, es_extended | Orden 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.exports | GetMoney, AddMoney, RemoveMoney | Nombres de los exports de ese recurso. |
Config.Bridge.economy.accounts | cash = '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 / phone | ox_inventory / ox_target / illenium-appearance / lb-phone | Recursos 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.custom | funciones en nil | Adaptador 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
| Comando | Quién | Qué hace |
|---|---|---|
/panelgob (tecla F6, reasignable) | Cualquier miembro de una organización | Panel institucional: Mi cargo, Personal, Presupuesto y Solicitudes según sus permisos. |
/gov_staff (alias /gov_admin, sin tecla por defecto) | Staff con gov.admin | Panel de administración completo del Gobierno. |
/gov | Cualquier jugador | Menú de contexto con su expediente: cargos, plantilla, caja e historial laboral. |
Diagnóstico y estructura
| Comando | Qué hace |
|---|---|
/gov_info | Estado 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_reload | Recarga configuración y caché sin reiniciar el recurso. |
Personal
| Comando | Qué 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
| Comando | Qué 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
| Comando | Qué 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
- El staff da de alta al primer cargo con
/gov_contrataro desde la pestaña Gestión de personal de/gov_staff, eligiendo jugador conectado, organismo, cargo y departamento en desplegables. - El staff ingresa fondos en las cajas (
/gov_ingresaro 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. - 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. - 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).
- 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.
- Cualquier jugador puede ver su expediente con
/gov.
Para administradores
- Quién administra: solo quien tenga el ACE
gov.admin(ogroup.admin), o una licencia enConfig.Admin.ownerso en la convarsbr_gov_owners. Los cargos RP, incluido el presidente, nunca administran el recurso. - Un gasto dice
partida_inexistente,categoria_requeridaopartida_desactivada: conrequireBudget = truehace falta una partida activa para esa categoría. Créala con/gov_partidao ponConfig.Economy.requireBudget = false. - Un script tuyo recibe
recurso_no_autorizado: añádelo aConfig.Api.allowedResourcesenconfig_server.lua. - Una contratación falla:
Hirerechaza fichas suspendidas (ficha_suspendida), citizenid que no existen (ciudadano_inexistente) y organizaciones inactivas (organizacion_inactiva). - Cambiar la estructura: edita
config_gobierno.luay reinicia el recurso (o/gov_reload). Lo que desaparece de la configuración no se borra de la base de datos; se desactiva a mano. - Economía:
/gov_infomuestra qué recurso de economía detectó. Sireydi_economyno está, el bridge avisa en consola y usa el dinero directo del framework. Si ese recurso arranca más tarde, el bridge lo vuelve a detectar solo. - Ver por qué se deniega un acceso:
Config.Admin.debug = trueimprime el motivo de cada denegación en la consola del servidor (escribe la licencia; vuelve afalsedespués). - Auditoría: todo queda en la tabla
gov_audit_logcon actor, acción y objetivo; también la Operaciones recientes del panel de staff. ConConfig.Audit.retentionDays > 0se purga cadapurgeEveryHours. - Mantenimiento:
/gov_idem_purgarlimpia claves de idempotencia antiguas; las colgadas se liberan solas trasidemPendingMinutes. - Al cambiar el prefijo de tablas: hazlo antes del primer arranque; las migraciones crean las tablas con ese prefijo.
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].
