G Geyseco · Documentació del projecte Tornar al backoffice

Proposta funcional i arquitectura tècnica - Geyseco

Document actualitzat: 31/08/2026

1. Objectiu

Geyseco necessita una aplicació de treball per gestionar congressos mèdics de manera centralitzada. L'eina ha de servir tant per al backoffice intern com per a la publicació de webs públiques de congressos, la gestió d'inscripcions, allotjaments, pagaments manuals, butlletins i comunicacions transaccionals.

La proposta tècnica acordada és un monòlit modular amb Laravel, Inertia i Vue per al backoffice. La web pública es recomana renderitzar-la al servidor amb Blade/SSR, utilitzant Vue només en components puntuals quan aporti valor real.

L'objectiu del MVP no és construir tots els mòduls possibles, sinó validar una vertical completa i operativa:

  1. Crear un congrés.
  2. Assignar-hi equip de gestió.
  3. Configurar dades, idiomes, quotes, extres, allotjaments i web pública.
  4. Publicar la web.
  5. Permetre una inscripció pública.
  6. Generar butlletins i correus.
  7. Gestionar pagaments manuals i allotjaments des del backoffice.

2. Abast funcional del MVP

Entra al MVP

No entra al MVP inicial

Fora d'abast

L'aplicació pot recollir dades fiscals per facilitar la facturació externa de Geyseco, però no generarà factures ni ara ni en fases futures previstes.

3. Decisions funcionals consolidades

Congressos

El congrés és l'entitat mare de la informació operativa. Tota dada que pertanyi a un congrés ha de quedar identificada per congress_id o per una relació clara fins al congrés.

Cal guardar també l'any del congrés per facilitar operacions futures de consulta, arxiu, anonimització o purga.

Usuaris i permisos

El model recomanat és:

Rols inicials:

Els rols vinculats a comunicacions queden preparats per fase 2:

La UI no pot ser l'única protecció. Totes les consultes, exports, downloads, jobs i endpoints han de validar permisos al backend amb Policies de Laravel.

Documentació interna

El menú Programació queda reservat al rol superadmin. Dins d'aquest espai hi ha d'haver una pàgina Documentació del projecte amb accés als documents interns de criteri funcional, arquitectura tècnica, mapa de permisos i futurs documents de planificació.

En el prototip aquests documents poden estar enllaçats com a fitxers locals. El document funcional i tècnic es manté en Markdown com a font i s'exposa també com a HTML navegable perquè el servidor no serveix directament fitxers .md.

En l'aplicació real s'han de servir des del backend amb autenticació, autorització específica, registre d'accés i sense exposar rutes públiques directes a documentació interna.

Equip assignat

Dins de cada congrés hi ha d'haver una pestanya Equip assignat. Un administrador hi podrà indicar quins gestors poden treballar aquell congrés.

La gestió global dels rols viu fora del congrés, a Usuaris/Rols. L'assignació concreta dels gestors viu dins del congrés.

Inscripcions

Una sol·licitud d'inscripció pot tenir:

El responsable pot ser també assistent sense haver d'entrar les mateixes dades dues vegades.

Una persona pot fer la sol·licitud en nom d'altres persones, per exemple una secretària que inscriu diversos metges.

Els extres com sopars, tallers o activitats opcionals s'han d'associar sempre a un assistent concret, per saber qui hi assisteix i qui ho ha contractat.

Imports

Els imports aplicats a una inscripció han de quedar congelats com a línies econòmiques. Si més endavant canvia una quota, un extra o una tarifa hotelera, les inscripcions antigues no s'han de recalcular silenciosament.

Cal separar visualment i tècnicament:

Els diners s'han de guardar sense float:

Pagaments

Al MVP, transferència bancària i Bizum són pagaments manuals. El pagament amb targeta queda fora del MVP.

El pagament no ha de ser només un camp payment_status. Ha de funcionar com un llibre de moviments:

L'estat agregat es calcula comparant imports contractats i moviments:

Si un gestor s'equivoca en entrar un moviment, cal poder corregir-lo. La recomanació tècnica és no esborrar físicament moviments ja consolidats, sinó anul·lar-los o registrar una correcció, conservant auditoria.

Modificacions i revisions

Quan Geyseco modifica conceptes, imports o allotjaments d'una inscripció ja confirmada, el sistema ha de detectar si hi ha:

Les modificacions pendents s'han d'agrupar en una única comunicació pendent fins que el gestor revisi i enviï el nou butlletí.

Per imports pendents o retorns:

Butlletins i correus

Quan una sol·licitud inclou diversos assistents, el comportament ha de ser configurable per congrés.

Configuració recomanada:

El butlletí del responsable pot incloure assistents, conceptes contractats, imports, estat de pagament i instruccions.

El butlletí de l'assistent ha d'incloure només dades informatives personals: congrés, assistent, quota, activitats o allotjament propi si aplica, sense totals ni dades d'altres persones.

Cada inscripció ha de guardar el seu idioma de comunicació. El butlletí s'envia en aquest idioma, no necessàriament en l'idioma de treball del backoffice.

Els textos generals dels butlletins han de venir del catàleg global de traduccions revisades. Només s'han de personalitzar per congrés si hi ha un missatge específic.

Allotjaments

Per defecte, una reserva hotelera s'hauria de confirmar automàticament si hi ha disponibilitat. Tot i això, el comportament ha de ser configurable per congrés.

Si no hi ha disponibilitat o el congrés requereix validació manual, la inscripció ha de poder finalitzar igualment. L'allotjament pot quedar pendent i Geyseco el podrà afegir manualment més endavant.

Quan Geyseco afegeix manualment un allotjament a una inscripció ja confirmada, el sistema no ha d'enviar automàticament el butlletí. Ha de mostrar una alerta indicant que cal revisar i enviar manualment la comunicació.

Normalment hi haurà una habitació per assistent. Si diversos assistents comparteixen habitació, n'hi ha prou amb indicar:

La disponibilitat s'ha de controlar per nit:

Web pública

La web pública ha de ser responsive i ha de mantenir l'estructura acordada al prototip:

El contingut de la web es divideix en dos orígens:

Les opcions activades des de Dades del congrés no s'han de duplicar a Web > Continguts. A Web > Continguts s'ha de veure una simulació del menú públic amb totes les possibilitats, indicant quines estan actives o inactives i on es configuren.

Al MVP, el contingut publicat pot mostrar l'última versió guardada. La recomanació tècnica és deixar preparada l'estructura per revisions i publicació versionada, encara que la gestió completa de revisions pugui quedar per una evolució.

Web > Configuració

Aquesta secció ha d'incloure:

El botó Crear web ha d'estar dins del bloc Publicació, un cop configurats els punts previs.

Web > Textos legals

Els textos legals globals es mantenen a Configuració > Textos legals i han de ser multiidioma.

Dins de cada congrés, Web > Textos legals ha de permetre:

Les pàgines legals del web públic han de ser rutes reals, accessibles des del footer, però no han d'aparèixer al menú principal del congrés.

Agenda corporativa de Geyseco

Cal distingir dues opcions:

Dins d'un congrés, l'opció Publicació agenda ha de publicar:

Per tant, dins d'aquesta pantalla el camp editable principal és el cartell. La resta ha de venir de dades ja informades en altres seccions.

Multiidioma

Cal separar clarament:

Les traduccions del backoffice s'han de gestionar amb fitxers d'idioma o catàleg global de traduccions. Els continguts públics del congrés s'han de traduir dins de cada congrés.

Per als continguts públics editables, es recomana oferir un botó de proposta de traducció amb IA dins del bloc de l'idioma de destí. La traducció proposada ha de quedar visualment diferenciada fins que un usuari la revisi, modifiqui o validi.

Si falta una traducció pública, el sistema ha de fer fallback a l'idioma per defecte del congrés i marcar-ho internament com a pendent de revisió.

4. Arquitectura tècnica recomanada

Recomanació:

Laravel modular + Inertia/Vue per al backoffice + Blade/SSR per a webs públiques + PostgreSQL + Redis/Queues + Outbox transaccional + jobs auditables + storage S3 compatible + proveïdor transaccional de correu + desplegament i operació mitjançant Mestral.

Diagrama lògic

Internet
   |
   v
Nginx + TLS
   |
   +-- Backoffice: Laravel + Inertia + Vue
   +-- Web pública: Laravel Blade/SSR + components Vue puntuals
   +-- Formularis públics i portals limitats
   +-- API de webhooks i futures integracions
              |
              v
         PostgreSQL
              |
        Outbox transaccional
              |
              v
       Redis + Laravel Queues
              |
      +-------+--------+
      v       v        v
   Correus  Purgues  Processos llargs
      |
      v
Proveïdor transaccional

5. Organització modular interna

Continua sent una sola aplicació i un sol desplegament. No es proposen microserveis.

Mòduls interns:

6. Base de dades

Preferència tècnica: PostgreSQL.

Motivació:

Si el hosting final obliga a MySQL/MariaDB, el model es pot adaptar, però caldrà revisar especialment concurrència d'allotjaments, JSON i consultes futures.

Taules conceptuals principals:

Regla de disseny: tota taula funcional que pengi d'un congrés ha de tenir congress_id directe o una relació inequívoca fins al congrés. Això facilita permisos, exports, auditories i purgues.

7. Jobs, cues, outbox i idempotència

Una cua tècnica no substitueix un job de negoci visible.

A més de Laravel Queues, cal una taula operations o job_runs amb:

Operacions candidates:

Per evitar perdre esdeveniments si Redis falla, es recomana patró outbox:

  1. La transacció desa la inscripció o canvi funcional.
  2. La mateixa transacció desa l'esdeveniment pendent a PostgreSQL.
  3. Un worker processa l'outbox.
  4. La idempotència evita duplicats.

8. Correus

Els correus han de sortir per un proveïdor transaccional extern, no directament des de la IP del servidor web.

Cal preveure:

9. Fitxers i backups

Fitxers:

Backups:

Un backup que no s'ha restaurat mai no és encara una garantia.

10. Desplegament i operativa

Processos separats en producció:

Entorns:

El desplegament ha de contemplar:

11. Observabilitat i auditoria

Cal registrar:

L'auditoria ha de guardar com a mínim:

12. Ordre de desenvolupament recomanat

Es recomana construir primer una vertical completa, no tots els CRUD de manera horitzontal.

Aquest apartat és el resum executiu. El detall operatiu queda desenvolupat al document pla-programacio-laravel-geyseco.md.

  1. Sprint 0: base tècnica, entorns, Laravel, DB, Redis, queues, auth base, CI mínim.
  2. Sprint 1: usuaris, rols, permisos i equip assignat.
  3. Sprint 2: congressos, dades generals, idiomes, estat i arxiu.
  4. Sprint 3: configuració d'inscripcions, quotes, extres i camps.
  5. Sprint 4: formulari públic d'inscripció, responsable, assistents i dades fiscals.
  6. Sprint 5: pagaments manuals, moviments, estat agregat, retorns, correccions i auditoria.
  7. Sprint 6: butlletins, correus, outbox, registre i reenviaments.
  8. Sprint 7: allotjaments, inventari per nit i reserves.
  9. Sprint 8: web pública, continguts, URL, aparença, textos legals i publicació agenda.
  10. Sprint 9: QA, responsive, permisos, backups, restauració, logs i validació client.

Aquest ordre valida aviat permisos, dades, emails, imports i publicació pública, que són els punts de més risc.

13. Decisions pendents abans de programar

Decisions que cal tancar o confirmar abans de Sprint 0:

Decisions funcionals ja orientades:

14. Recomanació final

La tecnologia proposada és adequada, però el projecte ha de néixer amb arquitectura operativa completa.

La recomanació final és:

Laravel modular + Inertia/Vue per al backoffice + Blade/SSR per a webs públiques + PostgreSQL + Redis/Queues + Outbox transaccional + jobs auditables + storage S3 compatible + correu transaccional extern + desplegament i operació mitjançant Mestral.

Els punts que no s'han de deixar per més endavant són: