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, pagament amb targeta/TPV, formularis d'inscripció 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:
- Crear un congrés.
- Assignar-hi equip de gestió.
- Configurar dades, idiomes, quotes, extres, allotjaments i web pública.
- Publicar la web.
- Permetre una inscripció pública.
- Generar formularis d'inscripció i correus.
- Gestionar pagaments manuals, pagament amb targeta/TPV i allotjaments des del backoffice.
2. Abast funcional del MVP
Entra al MVP
- Autenticació, logout i recuperació de contrasenya.
- Gestió d'usuaris interns.
- Rols inicials: Súperadministrador, Administrador i Gestor de congressos.
- Assignació de gestors a congressos concrets mitjançant l'opció Equip assignat dins de cada congrés.
- Accés intern a documentació del projecte dins de Programació, només per a Súperadministradors.
- Alta, edició, arxiu i gestió de congressos.
- Multiidioma complet per backoffice, web pública, formularis i correus.
- Configuració de quotes, tarifes, extres i camps d'inscripció.
- Formulari públic d'inscripció.
- Àrea personal pública per a responsables i assistents, amb accés segur sense compte clàssic.
- Alta manual d'inscripcions des del backoffice.
- Separació entre responsable/contacte, assistents, dades fiscals i conceptes econòmics.
- Extres associats a cada assistent.
- Línies econòmiques congelades a cada inscripció.
- Pagaments manuals per transferència bancària i Bizum com a llibre de moviments.
- Pagament amb targeta o TPV virtual dins del formulari públic d'inscripció.
- Confirmació automàtica del pagament quan el TPV retorna una operació acceptada.
- Estat agregat del pagament derivat dels imports contractats i els moviments registrats.
- Moviments de devolució i correccions auditables.
- Allotjaments amb hotels, tipus d'habitació, inventari per nit i reserves vinculades a inscripcions.
- Possibilitat d'acabar una inscripció encara que l'allotjament quedi pendent.
- Formularis d'inscripció multiidioma, registre d'enviament i reenviament manual.
- Web pública amb URL configurable, aparença, continguts editables, menú públic i peu legal.
- Textos legals globals multiidioma i personalització puntual per congrés.
- Publicació del congrés a l'agenda corporativa de Geyseco.
- Auditoria de canvis rellevants.
- Estructura de dades preparada per arxivar, anonimitzar i purgar per congrés o any.
No entra al MVP inicial
- Comunicacions científiques, avaluadors i superavaluadors.
- Estadístiques avançades.
- Constructor visual lliure de pàgines.
- Revisions editorials completes tipus CMS avançat, si encareixen massa el MVP.
Fora d'abast
- Emissió de factures dins l'aplicació.
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:
- Rol global de l'usuari.
- Assignació per congrés quan el rol no té accés global.
Rols inicials:
superadmin: perfil tècnic d'aTotArreu, amb accés a Programació i configuració tècnica.admin: accés operatiu complet a tots els congressos.manager: accés només als congressos assignats.
Els rols vinculats a comunicacions queden preparats per fase 2:
reviewersuper_reviewercommunicator
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:
- Responsable o contacte principal.
- Un o diversos assistents.
- Dades fiscals úniques per tota la sol·licitud.
- Quotes, extres i allotjaments.
- Moviments de pagament.
- Formularis d'inscripció i comunicacions associades.
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.
Àrea personal
El nom públic recomanat és Àrea personal. Internament cal distingir dos perfils d'accés:
- Responsable de la sol·licitud.
- Assistent individual.
L'Àrea personal no s'ha de modelar com a usuaris interns del backoffice. Al MVP es recomana accés limitat mitjançant enllaç segur, codi temporal o validació per email.
El responsable pot consultar:
- Resum de la sol·licitud.
- Assistents inclosos.
- Dades fiscals.
- Imports contractats.
- Estat de pagament.
- Instruccions de pagament.
- Formularis d'inscripció o documents de la sol·licitud.
- Allotjaments vinculats.
- Comunicacions pendents de Geyseco.
L'assistent individual pot consultar només:
- Les seves dades personals.
- Congrés al qual està inscrit.
- Quota assignada.
- Extres propis.
- Allotjament propi si aplica.
- Informació pràctica.
- Acreditació, QR o certificat quan correspongui.
- Formulari personal d'inscripció.
L'assistent no ha de veure imports globals, dades fiscals ni dades d'altres assistents.
Si el responsable també és assistent, l'accés pot mostrar dues seccions:
- La meva sol·licitud.
- La meva zona d'assistent.
Cal registrar els accessos i permetre regenerar l'enllaç o codi des del web públic amb comprovació per email i codi d'inscripció, DNI/NIE o un identificador equivalent.
Obertura d'inscripcions
Cal separar la visibilitat del mòdul i l'admissió de noves sol·licituds. El check Activar inscripciones controla si la pàgina apareix al menú públic. Amb el mòdul visible, l'obertura es configura amb tres modes: segons dates, obertes manualment o tancades manualment. Els modes manuals tenen prioritat i conserven les dates, sense aplicar-les. En mode automàtic, l'inici és inclusiu i el tancament s'aplica a l'instant de fi; una data buida significa que aquell límit no existeix. Les hores s'editen en la zona horària del congrés i es desen en UTC.
Quan no s'admeten noves inscripcions, la pàgina conserva el menú i mostra un avís traduït, sense el formulari: obertura prevista amb data/hora, termini finalitzat o tancament temporal manual. L'estat es calcula en cada petició, sense scheduler. El POST torna a validar l'obertura dins de la transacció, perquè un formulari obert abans del tancament no permeti enviar una sol·licitud fora de termini. No es cancel·len ni es recalculen sol·licituds existents; es mantenen les confirmacions i l'Àrea personal mentre el mòdul continua activat. El backoffice conserva l'alta manual per gestionar excepcions.
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.
Una mateixa quota pot tenir diversos períodes de preu consecutius, amb una denominació compartida i una data límit, preu, IVA i disponibilitat online per període. Les dates límit inclouen tot el dia en la zona horària del congrés; el període següent comença l'endemà. Només l'últim pot no tenir data límit. El formulari públic mostra una sola opció per quota amb el preu vigent, i el backoffice reutilitza el mateix criteri per a nous conceptes. La línia contractada congela el període, el preu aplicat i la data de valoració. Un canvi de preu mentre el formulari públic és obert obliga a revisar el nou import abans de confirmar l'enviament. No s'aplica un període antic com a alternativa si el període actual és offline o tots han vençut.
Cal separar visualment i tècnicament:
- Imports contractats: quotes, extres, allotjaments.
- Moviments econòmics: cobraments, devolucions, ajustos.
- Balanç resultant: pendent, parcial, pagat o import a retornar.
Els diners s'han de guardar sense float:
- Imports en cèntims enters o
numeric. - Moneda ISO, inicialment
EUR. - IVA, descomptes, totals i imports pendents com a valors explícits.
Pagaments
Al MVP entren tres vies de pagament:
- Targeta o TPV virtual: pagament automàtic dins del formulari públic.
- Transferència bancària: pagament manual revisat per Geyseco.
- Bizum: pagament manual revisat per Geyseco.
Només el pagament amb targeta/TPV pot marcar una inscripció com a pagada de manera automàtica quan el proveïdor confirma l'operació. Transferència i Bizum han de requerir sempre un moviment manual al backoffice.
El pagament no ha de ser només un camp payment_status. Ha de funcionar com un llibre de moviments i transaccions:
- Transacció de TPV creada.
- Transacció de TPV acceptada o rebutjada.
- Transferència rebuda.
- Bizum rebut.
- Ajust manual.
- Devolució.
- Correcció per error.
Els retorns o ajustos posteriors també s'han de registrar com a moviments auditables.
L'estat agregat es calcula comparant imports contractats i moviments:
- Pendent.
- Pagat parcialment.
- Pagat.
- Import a retornar.
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.
La integració amb TPV ha de tenir:
- Proveïdor configurable.
- Clau d'idempotència per evitar dobles cobraments.
- Registre de peticions i respostes rellevants.
- Webhook o retorn segur per confirmar l'operació.
- Reconciliació manual si hi ha discrepàncies entre backoffice i proveïdor.
Modificacions i revisions
Quan Geyseco modifica conceptes, imports o allotjaments d'una inscripció ja confirmada, el sistema ha de detectar si hi ha:
- Import pendent.
- Import a retornar.
- Canvi informatiu sense impacte econòmic.
Les modificacions pendents s'han d'agrupar en una única comunicació pendent fins que el gestor revisi i enviï el nou formulari d'inscripció.
Per imports pendents o retorns:
- Hi ha d'haver un text genèric configurable per congrés.
- El gestor l'ha de poder editar puntualment abans d'enviar la revisió.
- Els retorns s'han de poder marcar com a retornats mitjançant moviment econòmic negatiu o de devolució.
Formularis d'inscripció i correus
Quan una sol·licitud inclou diversos assistents, el comportament ha de ser configurable per congrés.
Configuració recomanada:
- Enviar al responsable un formulari d'inscripció detallat de la sol·licitud.
- Enviar a cada assistent un formulari personal i informatiu d'inscripció, sense dades econòmiques ni dades d'altres assistents.
El formulari d'inscripció del responsable pot incloure assistents, conceptes contractats, imports, estat de pagament i instruccions.
El formulari d'inscripció 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.
Els documents i els correus són conceptes diferents: es conserva cada document individual, però els destinats a una mateixa adreça s'agrupen en un únic correu dins de la mateixa sol·licitud i revisió, sense còpies a altres destinataris. S'aplica a les confirmacions inicials i a les revisions manuals, respectant els destinataris configurats al congrés.
- Un únic assistent que també és el responsable: un correu amb el PDF detallat, sense adjuntar un segon PDF personal redundant. El document personal es conserva i continua accessible a l'Àrea personal quan està habilitada.
- Responsable que també assisteix amb més persones: un correu amb el detall de la sol·licitud i el seu document personal. Cada altra adreça rep només els documents personals que li corresponen.
- Responsable que no assisteix: rep el detall; els assistents reben els seus documents informatius. Si diversos assistents comparteixen adreça, els seus PDF personals viatgen junts, sense afegir-hi dades econòmiques.
- Només es considera redundant el document personal del responsable únic identificat explícitament com a assistent; compartir adreça no implica ser la mateixa persona. Si l'enviament del resum està desactivat, el document personal s'envia igualment.
- El cos del correu prioritza el resum del responsable quan existeix. Cada PDF manté el seu idioma; un avís traduït indica quan hi ha diversos adjunts.
- La previsualització mostra correus previstos i PDF per destinatari. L'historial conserva els documents i diferencia el nombre de correus reals, els adjunts i el document personal inclòs en el resum. Tots els documents d'un mateix enviament comparteixen identificador de lliurament i resultat; els resultats incerts requereixen revisió, sense reenviament automàtic.
Cada inscripció ha de guardar el seu idioma de comunicació. El formulari d'inscripció s'envia en aquest idioma, no necessàriament en l'idioma de treball del backoffice.
Els textos generals dels formularis d'inscripció 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.
Denominacions reutilitzables
Configuració global disposa d'un catàleg ampliable de denominacions en CA, ES, EN i PT. Inicialment inclou Inscripció de soci i Inscripció de no soci, i els tipus d'habitació Individual, Doble, Triple i Quàdruple.
En configurar una quota o habitació es poden copiar les traduccions del catàleg o introduir una denominació pròpia del congrés, amb edició manual per idioma. El catàleg no defineix imports, condicions, capacitats o disponibilitat. Els canvis globals no reescriuen les còpies existents; les inscripcions conserven els conceptes contractats i els seus textos com a snapshots.
La quota Curso completo (3 jornadas) és particular del congrés SEGCD26D, no una entrada del catàleg global. Els administradors poden ampliar, editar o desactivar denominacions globals, amb auditoria. Els permisos concrets dels gestors continuen pendents de validació amb el client.
Comptes bancaris globals
Configuració > Comptes bancaris permet als administradors gestionar entitat, IBAN i SWIFT/BIC. A Dades del congrés > Inscripcions, el compte se selecciona des d'un desplegable, no per text lliure. La selecció conserva una còpia de les dades bancàries del congrés i no modifica les confirmacions històriques.
Els comptes assignats no es poden modificar ni eliminar fins que se substitueixi la selecció dels congressos afectats. Les operacions són auditades. Les dades anteriors es preserven durant la transició, però els comptes de mostra del prototip no s'importen com a comptes reals; Geyseco ha d'introduir i verificar els comptes de producció.
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 formulari d'inscripció. 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:
- Titular de l'habitació.
- Ocupants.
- Nits.
- Hotel i tipus d'habitació.
La disponibilitat s'ha de controlar per nit:
- Hotel.
- Tipus d'habitació.
- Data/nit.
- Estoc total.
- Bloquejades.
- Confirmades.
- Pendents.
Web pública
La web pública ha de ser responsive i ha de mantenir l'estructura acordada al prototip:
- Banner superior a tota l'amplada.
- Menú lateral esquerre en escriptori.
- Menú hamburguesa en mòbil i tauleta.
- Àrea principal de contingut.
- Footer amb textos legals.
El contingut de la web es divideix en dos orígens:
- Dades del congrés: dates, seu, URL, idiomes, inscripcions, allotjaments, comunicacions i secretaria tècnica.
- Web > Continguts: pàgines editorials com Presentació, Comitès, Programa, Ponents, Informació general i Crèdits.
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ó.
Programa: llista o horari
A Web > Continguts > Programa es tria la vista Listado o Horario per congrés. La selecció s'aplica a la web pública i al PDF generat automàticament, reutilitzant els mateixos dies, activitats i traduccions. Els programes existents continuen en format de llista fins que es canviï i es desi aquesta selecció.
- Horari: dies en columnes, hores en files i activitats amb inici i fi obligatoris. Les activitats simultànies es distribueixen en columnes paral·leles, sense superposar contingut.
- Colors suaus derivats dels colors principal i secundari del congrés; tipus de sessió, plenària, taller, pausa i activitat social identificats també amb text, no només amb color.
- En mòbil es pot seleccionar el dia que es vol consultar; les graelles paral·leles amples tenen desplaçament limitat al seu contenidor.
- El PDF d'horari es genera en A4 apaïsat, amb la capçalera del congrés, paginació de graelles i indicació de continuació quan cal. Els textos extensos es conserven íntegres en un annex de detall, sense reduir tota la graella a una lletra il·legible. La vista de llista manté el PDF vertical.
- Un PDF adjuntat manualment conserva el seu disseny original: canviar la vista no transforma aquest fitxer. Per obtenir la graella cal seleccionar Generar desde contenido i desar.
Configuració > Personalització agrupa els catàlegs generals en dos apartats interns: Cuotas y habitaciones i Tipos de actividad. Hi ha una única pestanya superior Personalización; comptes bancaris i textos legals continuen separats. Aquesta organització permet incorporar més catàlegs sense multiplicar les opcions del menú superior.
Els tipus d'activitat es gestionen a Configuració > Personalització > Tipus d'activitat, només per a administradors i súperadministradors: nom en CA/ES/EN/PT, color exacte i estat actiu/inactiu. El catàleg inclou inicialment sessió, plenària, taller, pausa i activitat social. No hi ha eliminació del catàleg; la desactivació evita noves seleccions sense afectar programes existents.
A Web > Continguts > Programa, el botó Tipos de actividad permet incorporar tipus actius del catàleg i afegir-ne de particulars. Cada congrés conserva una còpia editable de noms, color i disponibilitat, independent del catàleg global. Els canvis locals s'apliquen en desar la pàgina, amb auditoria. Els tipus utilitzats no es poden treure del programa; desactivar-los conserva les activitats existents i impedeix noves assignacions. Els tipus no utilitzats es poden retirar de la selecció del congrés. Web i PDF generat comparteixen noms traduïts i colors, amb contrast automàtic del text.
Web > Configuració
Aquesta secció ha d'incloure:
- Domini i contacte.
- Tecnologia del web: web pròpia o WordPress si en algun cas es decideix així.
- Aparença: banner, colors, tipografia, menú i comportament responsive.
- Publicació: crear web, estat publicada/en manteniment, preview i enllaç públic.
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:
- Triar quins enllaços apareixen al footer.
- Configurar l'etiqueta de cada enllaç per idioma.
- Assignar un text global base.
- Personalitzar puntualment el text legal per aquell congrés i idioma.
- Previsualitzar el footer públic.
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:
- Agenda general del backoffice: llistat cronològic de congressos, filtrable per mes i any.
- Publicació agenda del congrés: dades que es publiquen a
https://www.grupogeyseco.com/agenda/.
Dins d'un congrés, l'opció Publicació agenda ha de publicar:
- Cartell del congrés.
- Dates del congrés, provinents de Dades del congrés i preferentment readonly.
- URL del web públic, provinent de Web > Configuració > Domini i contacte.
- Estat de publicació a l'agenda corporativa.
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:
- Idioma de treball del backoffice: preferència de cada usuari.
- Idiomes actius del congrés: idiomes disponibles al web públic, formulari i correus.
- Idioma de comunicació de cada inscripció: idioma en què rebrà formularis d'inscripció i comunicacions.
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 + MySQL/MariaDB + Redis/Queues + Outbox transaccional + jobs auditables + storage S3 compatible + proveïdor transaccional de correu + proveïdor de pagament TPV + 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
MySQL/MariaDB
|
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:
- Identitat i permisos.
- Congressos.
- Equip assignat.
- Publicació web i dominis.
- Continguts web.
- Textos legals.
- Agenda corporativa.
- Inscripcions i assistents.
- Àrea personal.
- Catàleg, quotes, tarifes i extres.
- Allotjaments.
- Pagaments.
- Formularis d'inscripció i correus.
- Pagament amb targeta/TPV.
- Fitxers.
- Documentació interna.
- Auditoria i retenció.
- Operacions i jobs.
- Comunicacions, fase 2.
6. Base de dades
Decisió operativa: MySQL/MariaDB al servidor actual.
Motivació:
- Integritat i restriccions.
- Concurrència de reserves hoteleres.
- Consultes i informes futurs.
- JSON per blocs configurables validats.
- Millor evolució cap a comunicacions, avaluacions i auditoria.
PostgreSQL continua sent una alternativa tècnica vàlida, però aprofitar MySQL/MariaDB existent redueix dependències d'infraestructura. Caldrà posar especial atenció en transaccions d'allotjaments, índexs, backups i consultes d'informes.
Taules conceptuals principals:
usersrolesuser_rolescongressescongress_user_assignmentscongress_languagescongress_translationsbank_accountscongress_payment_settingsregistration_feesregistration_extrasregistration_form_fieldsregistration_form_field_translationsregistrationsregistration_contactsregistration_attendeesregistration_tax_dataregistration_itemsregistration_revisionsportal_access_tokensportal_sessionsportal_access_logspayment_gateway_transactionspayment_webhook_eventspayment_movementspayment_movement_audit_logshotelshotel_room_typeshotel_room_inventoryhotel_reservationshotel_reservation_nights(assignacio d'una habitacio per nit; nomes s'identifica el titular de la reserva)websiteswebsite_domainswebsite_themewebsite_pageswebsite_page_translationswebsite_legal_linkslegal_textslegal_text_translationsagenda_publicationsemail_templatesemail_template_translationsemail_logsoutbox_eventsoperationsfilesaudit_eventspurge_jobs
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:
- Tipus d'operació.
- Congrés.
- Usuari que l'ha iniciada.
- Estat.
- Progrés.
- Resultat.
- Error.
- Dates d'inici i finalització.
- Clau d'idempotència.
Operacions candidates:
- Enviaments de correus.
- Reenviaments de formularis d'inscripció.
- Exports.
- Purgues.
- Publicació o regeneració de webs.
- Publicació a l'agenda corporativa.
Per evitar perdre esdeveniments si Redis falla, es recomana patró outbox:
- La transacció desa la inscripció o canvi funcional.
- La mateixa transacció desa l'esdeveniment pendent a MySQL/MariaDB.
- Un worker processa l'outbox.
- 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:
- Plantilles multiidioma.
- Locale utilitzat.
- Registre de cada missatge.
- Relació amb inscripció, assistent i congrés.
- Webhooks de lliurament, rebot i queixa.
- Idempotència per evitar dobles confirmacions.
- Reenviament manual auditable.
9. Fitxers i backups
Fitxers:
- Laravel Flysystem des del principi.
- Disc local només en desenvolupament o storage privat del servidor.
- S3 compatible en producció si l'operativa ho permet.
- Fitxers privats per defecte.
- URL temporal per descàrregues privades.
- Metadades a base de dades.
- Validació de tipus i mida.
Backups:
- Backup diari de MySQL/MariaDB.
- Backup de fitxers/object storage.
- Còpia fora del servidor.
- Retenció definida.
- Prova real de restauració.
- RPO i RTO acordats.
Un backup que no s'ha restaurat mai no és encara una garantia.
10. Desplegament i operativa
Processos separats en producció:
- Nginx.
- PHP-FPM.
- MySQL/MariaDB.
- Redis.
- Workers Laravel.
- Scheduler Laravel.
- Monitoratge i health checks.
Entorns:
- Desenvolupament.
- Staging.
- Producció.
El desplegament ha de contemplar:
- Migracions controlades.
- Rollback de codi.
- Workers amb la mateixa versió que l'aplicació.
- Reinici ordenat de workers.
- Releases sense processos antics executant jobs nous.
- Logs centralitzats o consultables.
- Backups i restauració provada.
11. Observabilitat i auditoria
Cal registrar:
- Login i canvis d'usuari rellevants.
- Assignacions d'equip a congressos.
- Canvis funcionals del congrés.
- Canvis d'estat i moviments de pagament.
- Modificacions de conceptes i revisions pendents.
- Publicacions de web.
- Canvis en textos legals.
- Publicacions a l'agenda corporativa.
- Enviaments i reenviaments de correu.
- Exports.
- Purgues i anonimitzacions.
- Errors de jobs.
L'auditoria ha de guardar com a mínim:
- Usuari.
- Congrés.
- Acció.
- Entitat afectada.
- Data i hora.
- Valors rellevants abans/després quan tingui sentit.
- IP o context si aplica.
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.
- Sprint 0: base tècnica, entorns, Laravel, DB, Redis, queues, auth base, CI mínim.
- Sprint 1: usuaris, rols, permisos i equip assignat.
- Sprint 2: congressos, dades generals, idiomes, estat i arxiu.
- Sprint 3: configuració d'inscripcions, quotes, extres i camps.
- Sprint 4: formulari públic d'inscripció, responsable, assistents i dades fiscals.
- Sprint 5: pagaments manuals, targeta/TPV, transaccions, webhooks, moviments, estat agregat, retorns, correccions i auditoria.
- Sprint 6: formularis d'inscripció, Àrea personal, correus, outbox, registre i reenviaments.
- Sprint 7: allotjaments, inventari per nit i reserves.
- Sprint 8: web pública, continguts, URL, aparença, textos legals i publicació agenda.
- 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:
- Hosting final: servidor actual, VPS nou o entorn gestionat.
- Base de dades MySQL/MariaDB: confirmar credencials, backups i restauració.
- Proveïdor transaccional de correu.
- Proveïdor de pagament amb targeta/TPV.
- Comptes bancaris i instruccions de transferència.
- Operativa exacta de Bizum.
- Caducitat i política de regeneració dels accessos a l'Àrea personal.
- Idiomes inicials per al primer congrés real.
- Textos legals definitius globals.
- Política de backups, retenció i restauració.
- Criteri final de dominis: subdominis, dominis propis o ambdues opcions.
Decisions funcionals ja orientades:
- Laravel + Inertia + Vue per al backoffice.
- Blade/SSR per a webs públiques.
- Rols globals + assignació per congrés.
- Comunicacions en fase 2.
- Factures fora d'abast.
- Web amb blocs controlats, no constructor lliure.
- Textos legals globals amb personalització per congrés.
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 + MySQL/MariaDB + Redis/Queues + Outbox transaccional + jobs auditables + storage S3 compatible + correu transaccional extern + proveïdor de pagament TPV + desplegament i operació mitjançant Mestral.
Els punts que no s'han de deixar per més endavant són:
- Integritat del model econòmic.
- Imports congelats per inscripció.
- Concurrència d'allotjaments.
- Moviments de pagament auditables.
- Jobs visibles i idempotents.
- Auditoria.
- Multiidioma real.
- Textos legals globals i per web.
- Publicació web coherent.
- Dominis i SSL.
- Observabilitat.
- Backups restaurables.
- Seguretat i retenció de dades.