02 — Solution
One Docker image: .NET 9 API, Next.js 15 website and React admin
We designed and built the whole system from scratch. The .NET 9 application serves the API and the admin and forwards public pages to Next.js via YARP. One image, one pipeline, simple operations.
01Public website with a CMS page tree
Next.js 15 with server-side rendering. Content is a page tree with four page types: category, Markdown page, system page and document. System pages cover news, events, accredited training events, contacts, full-text search and a map-based therapist finder.
02Member area
Sign-in with Google or a one-time code sent by e-mail. Members get job ads, webinars and partner discount codes, pay their fee via QR code and download a PDF membership confirmation. The public can verify membership online.
03Online filing office
A step-by-step form for three request types: training event accreditation, lifelong-learning certificate and job ad publication. Each request gets a reference number, an "awaiting payment" state and, once processed, an electronically signed PDF.
04Automatic payment matching via the Fio API
A background job downloads transactions from Fio bank and matches them to membership fees and requests using QR payment data (SPAYD). The integration replaced the previous processing of bank e-mail notifications. Annual membership renewal runs automatically.
05Events with registration and credits
Event registration with ticket types, custom form fields and billing details (auto-filled from the ARES company registry). Attendees receive credits and a certificate of attendance.
0616-module admin
React 19 + MUI 7 in three groups — Records (members, groups, pricing, facilities, partners, filing office, invoices), Content (pages, job ads, webinars, events, discount codes, contacts, e-mailing) and System (CDN, users). Per-module permissions, a Markdown editor and drag-and-drop page ordering.
07Legacy link migration
Old URLs of journal articles 308-redirect to their new addresses, so links from other websites keep working.