Nonprofit ERP Nonprofit management system: beneficiaries, double-entry accounting, approvals and a permission-bound AI assistant
A full back office for a Saudi association with double-entry accounting and approval cycles, extended on a live system without downtime.
- 667
- commits
- 107
- new migrations
- 73K+
- lines added
- 13
- assistant tools
The problem
The association runs on disbursement decisions and approvals that must stand up to regulators. Any error in a journal entry or a decision number surfaces in official reports.
Overview
I took over an existing Laravel system for a Saudi nonprofit and have extended it since June 2026 to cover beneficiaries, double-entry accounting, approvals and inventory, plus an AI assistant inside the system. It stayed in production the whole time.
What I built
- Beneficiaries, case studies and in-kind and cash aid requests
- Balanced double-entry journals generated on voucher approval and reversed on cancellation
- A 5-stage approval cycle signed by the vice-chair and the board chair
- Membership, board, inventory, assets and suppliers
- An AI assistant with 13 tools that only sees the tools the user is allowed to use
- AI configuration fails closed: a missing setting stops with a clear error instead of running on a default
The engineering call
The archive screen showed times three hours early. The stored instants were right all along; only the display was wrong, so the fix was configuration with no data migration. A test ships with it that checks the real MySQL session offset, because the setting lives in two files and changing only one raises no error at all.