fullstack
LAPOR BANG MADE
Approval workflow for items visitors hand in at an immigration detention centre, with email and WhatsApp updates.
- Role
- Fullstack
- Date
- January 2026
Technologies
- php
- laravel
- mysql
- blade
- vite
- bootstrap
- sass
- jquery
- datatables
- twilio
- mailgun
Problem
Handing items to someone inside a detention centre is a chain of custody, not a delivery. Before this, the process lived in notebooks and in conversation: what was brought, by whom, for which detainee, whether the food was allowed, and who signed it off. Without a record there is no accountability. And the visitor who travelled across the island has no way to learn whether their parcel was cleared, or why it was not.
Solution
A Laravel MVC app with two very different faces. Visitors get a public form with no login, where one submission can carry several items with photos. Staff get a queue, and the queue is the point: approval is a chain of roles rather than one decision. RAP reviews goods, Perkes reviews food, Kamtib validates and confirms the photo, and Duta Layanan sorts the item into the right category. Rejection is not a status you can change in a hurry: it requires a written reason of at least thirty characters, so “no” always arrives with an explanation attached.
The queues use server-side pagination, so a growing list never ships to the browser. Status is a
single enum the visitor can read at a glance, and every change is announced by email and
WhatsApp (which is what people here actually check). Phone numbers are normalised from the local
08… form to the international 628… one before sending, and values that should not sit in
plain text go through the app’s AES-256-CBC helper.
Privacy shaped the design more than anything else: the people in this system are visitors and detainees, so the public side collects only what the process needs, and staff see only the stages they are responsible for.
Contact
Interested in working together?
Tell me what you are building and what you need. A short note is enough.