Three business applications for a public body: e-Budget, e-Courrier and e-Matière, on one platform.

- Client
- Senegalese public sector
- Key result
- 3 apps on one platform
Context
Budget, mail and supplies were managed separately, mostly on paper, inside an infrastructure that had to stay on premise. Every budget commitment and every incoming letter had to be traceable to a person and a date.
What I built
One Spring Boot platform with three business modules behind a single Angular app: e-Budget follows budget execution from commitment to payment order, e-Courrier captures incoming mail from the mailboxes, reads attachments with OCR and tracks deadlines, and e-Matière manages stock movements, inventories and valuation. Permissions are declared per module and action, an AOP audit trail covers about 600 operations, and notifications arrive in real time over WebSocket (STOMP). Deployed as Docker images behind Nginx on the client's own server, with PostgreSQL.
Result
Three applications in production on the client's own infrastructure.
Architecture
One modular monolith for three apps
Budget, mail and stock live in separate modules of one Spring Boot application, so the client runs a single deployment with one sign-in and one audit trail.
Permissions as module and action
About thirty roles are described as module:action permissions and checked by an annotation on each endpoint, so access rules read like the organisation chart.
An audit trail that cannot block the work
An aspect records who did what, from where and with which values on about 600 operations, written asynchronously in its own transaction so a logging failure never cancels a business action.
Mail captured, read and followed up
Mailboxes are polled every five minutes, attachments go through a Tesseract OCR service, key fields are extracted, and an hourly job flags overdue replies.
Budget figures recomputed, never typed
Engaged, liquidated and ordered amounts are aggregated per budget line from the underlying documents, so the totals always match the paperwork.
Real time over STOMP
Users receive their notifications over WebSocket as soon as a letter is assigned to them.
Stack
- Spring Boot
- Java
- Angular
- PostgreSQL
- WebSocket (STOMP)
- Spring AOP
- Tesseract OCR
- Docker
- Nginx
- Windows Server