operations · laravel · 2023
Alumni membership, application to renewal in one place
Asociación de Ex-Becarios Paraguayos en el Japón
A membership platform for an alumni association: public applications with an approval workflow, member records, a searchable directory, dues, and automated greetings.
The operation
The Asociación de Ex-Becarios Paraguayos en el Japón is the alumni association of Paraguayans who studied in Japan on scholarships. It needed one place to run its membership rather than several.
The system covers the whole member lifecycle: a public application form, an admin approval step, member profiles and scholarship records, a searchable directory, dues tracking, and automated birthday greetings that go out on a scheduled job every morning.
The part that was actually hard
Logging in as a Paraguayan. Members identify themselves by email, by cedula, or by mobile number, depending on who they are and what they remember. One login field accepts all three, and a normalizer standardizes Paraguayan mobile formats so the same person typing their number two different ways still gets in. Keeping those login fields consistent with the profile data behind them, duplicates and placeholders included, is its own scheduled reconciliation.
Approving somebody. An approval is not a status change. It provisions the user account, the member profile and the scholarship records together, generates credentials, and sends the welcome mail, as one coordinated transaction with file uploads and email side effects hanging off it.
Deploying somewhere with no SSH
Worth its own section, because this is the constraint institutional clients actually have and it is usually treated as a reason to give up on good practice.
The host is shared DirectAdmin: FTP only, no SSH, no command line. So the deploy runs from GitHub Actions, with the test suite as the gate, and reaches the server through token-protected HTTP endpoints that toggle maintenance mode, clear caches and run migrations. The tokens are compared in constant time.
The client did not have to change hosting, and the project still got continuous integration.
Where it stands
Built in 2023 and in production use since then, at socios.aebpj.org.py. The interface, the emails and the reports are all in Spanish.