- GovTech & grievance mechanisms
FUNAE – MGQR (Grievance Redress Mechanism)
Platform where citizens submit grievances, complaints and suggestions to FUNAE, with automatic routing to officers and role-based dashboards.
- Period
- 2025–2026
- Status
- Archived
- Role
- Full-stack developer and largest contributor on the team (automatic assignment, notifications, login, roles, frontend)
- Client
- FUNAE – Fundo de Energia, FP
- Partners
- TechSolutions, Enabel
Problem
FUNAE's Enabel-funded energy projects require a formal grievance redress mechanism (GRM). Submissions, identified or anonymous, had to be recorded, routed to the right team, tracked against deadlines and reported to management.
Solution
A Laravel 12 + Inertia + Vue 3 application built by a TechSolutions team. I wrote the automatic assignment service, the notification service, multichannel login, the Deputy Manager role and much of the Vue dashboards. Colleagues built the initial scaffold, the legal deadlines and the CI/CD pipeline.
Context
FUNAE – Fundo de Energia runs electrification projects funded by Enabel. The funder requires a grievance redress mechanism (GRM): anyone affected by a project must be able to complain, and the complaint must be answered within set deadlines.
TechSolutions won the development contract and put together a team of nine developers. I opened the repository with the documentation, milestones and issues, and was the developer who delivered the most work between November 2025 and April 2026.
The life of a complaint
The citizen chooses to be identified or anonymous, describes the case and attaches evidence. The system generates a public reference in the GRM-YYYY-XXXXXXXX format so they can track its status.
From there the submission moves through explicit states: under review, assigned, in progress, pending approval and finally resolved, rejected or closed. The officer cannot close it alone: they request closure and the manager approves or sends it back. Every change is kept in the submission's history.
Automatic assignment: a capacity rule
I wrote the service that decides who handles each submission. It is not a complex algorithm, on purpose. It looks for an available officer on the same project whose current workload plus the new submission's weight fits their capacity, and who is below 50% of it. If there is one, it assigns inside a transaction and fires an event to send notifications.
If nobody meets the rule, the submission stays "under review" and goes to the manager. We preferred a human decision to piling work on someone who is already busy. Two scheduled commands complete the service: one retries pending submissions and the other rebalances workload.
Notifications and multichannel login
The notification service emails the officer and the manager on assignment and on closure requests, using nine email templates. Every send is logged, and a command retries the failed ones. SMS integration was left for later.
Many citizens do not use email. The login accepts an email, a phone number or a username, detects which one was typed and normalises the phone number before looking it up.
Roles and permissions
Access uses spatie/laravel-permission with seven roles: Citizen, Officer, Manager, Deputy Manager, Director, Board Chair and Admin. I built the Deputy Manager role end to end (migration, seeders, controllers, middleware and screens) and merged the old Super Admin and Admin into one role.
Each role has its own dashboard. I did much of the Vue frontend: dashboards, attachment gallery, submission form and dark mode, plus production fixes such as the 419 error on first login and project location by province, district and administrative post.
What colleagues built
The Laravel scaffold was set up by a colleague. The legal deadlines (10 working days to acknowledge and 20 to respond, with "overdue" and "due soon" states) were implemented by another colleague. The GitHub Actions CI/CD pipeline (lint, build and tests) is also a colleague's work. The PDF and Excel reports were mostly by other authors.
Training and verifiable numbers
In the same period, TechSolutions ran a training programme for FUNAE staff on managing systems and web platforms, so the in-house team can operate and maintain them. I took part as a trainer; TechSolutions' public news item is in the links.
In numbers: 214 Vue components, 50 migrations, 7 roles and 11 PHPUnit test files. The production address no longer responds, so there is no link to the application.
Technical decisions
01
Capacity-based assignment with a human fallback
A simple rule: assign only to an available officer on the same project who is below 50% of capacity. If nobody qualifies, the submission goes to "under review" for the manager to decide, instead of overloading someone.
02
An observer that never blocks the submission
When a submission is created, the observer logs history, notifies and attempts assignment, each step isolated in try/catch. An email or assignment failure never stops the citizen from submitting.
03
Explicit state machine
submitted → under review → assigned → in progress → pending approval → resolved/rejected/closed. The officer requests closure and the manager approves or sends it back.
04
Notifications with a log and retries
Every send is stored in its own table; a scheduled command retries failed notifications.
05
Server-side pagination tested with load data
The manager dashboard moved to server-side pagination, checked against a seeder with 500 citizens, 20 officers and 2,000 complaints.
Images
01 / 05 — Sign-in screen of FUNAE's grievance and suggestion management system
Technologies
- Laravel
- PHP
- MySQL
- Vue
- Inertia.js
- Tailwind CSS
Verifiable results
- access roles (Citizen to Admin)
- 7
- Vue components in the application
- 214
- transactional email types
- 9
What I learned
With nine developers in one repository, numbered issues and clear ownership of areas matter more than any tool. And a simple assignment rule with a way out to a human is easier to explain to a client than a clever algorithm.
SDGs

SDG 16 · Peace, Justice and Strong Institutionsprimary
A formal grievance redress mechanism: anyone affected by an electrification project submits identified or anonymously, with legal deadlines, an auditable history and a public reference to track the case.

SDG 7 · Affordable and Clean Energycomplementary
The grievances serve Enabel-funded energy access projects, so that grid expansion also answers to the communities it affects.
