Centralized grievance and complaint management for social protection programs. Receives complaints through multiple channels (email, portal, manual entry), tracks resolution through customizable workflow stages, and monitors service level agreements. Links complaints to individual or group registrants and supports anonymous submissions.
- Multi-channel intake: Email alias integration creates tickets from inbound messages, portal form for beneficiaries, manual entry by officers
- Stage-based workflow: Define stages with access control restrictions, approval requirements, and decision enforcement before closure
- SLA tracking: Automatically compute deadlines based on category/subcategory configuration, monitor status (on track, at risk, breached), post notifications on breach
- Team assignment: Organize handlers into teams with geographic area responsibilities, auto-assign based on category defaults
- Appeals and escalation: Reference original tickets for appeals, track escalation history and reasons, mark tickets as escalated
- Hierarchical categorization: Two-level category/subcategory system with inherited defaults for severity, sensitivity, SLA hours, and team assignment
- Decision tracking: Record final decisions (upheld, partially upheld, rejected, withdrawn, redirected, referred to case) with resolution summaries
- Anonymous complaints: Optional contact fields for complainants not in the registry
| Model | Description |
|---|---|
spp.grm.ticket |
Main complaint/grievance with SLA tracking and decision fields |
spp.grm.ticket.stage |
Workflow stage with access control and closure configuration |
spp.grm.ticket.category |
Primary classification with hierarchical structure |
spp.grm.ticket.subcategory |
Second-level classification under category |
spp.grm.team |
Team of handlers with manager and geographic areas |
spp.grm.sla.rule |
Conditional SLA rules with escalation targets |
spp.grm.ticket.tag |
Tags for flexible ticket classification |
spp.grm.ticket.channel |
Communication channel (email, phone, walk-in, portal, etc.) |
After installing:
- Navigate to Helpdesk > Configuration > Stages to define workflow stages with closure and approval flags
- Create categories under Helpdesk > Configuration > Categories with default severity, SLA hours, and team assignments
- Set up teams under Helpdesk > Configuration > Teams with members and geographic area assignments
- Configure SLA rules under Helpdesk > Configuration > SLA Rules with conditions and escalation targets
- Set up email alias under Settings > Technical > Email > Aliases to enable automatic ticket creation from inbound messages
- Menu: Helpdesk (top-level menu item)
- Tickets: Helpdesk > Tickets
- Configuration: Helpdesk > Configuration (manager access required)
- Portal: Beneficiaries can view and create tickets at
/my/tickets - Registrant Profile: Stat button shows ticket count and opens related tickets
| Group | Access |
|---|---|
group_grm_viewer |
Read only |
group_grm_officer |
Read/Write/Create (no delete) |
group_grm_manager |
Full CRUD including configuration |
base.group_portal |
Read/Write/Create tickets (no delete) |
Stage transitions to approval-required stages are restricted by Python
code to users in group_grm_supervisor or higher, but this group has
no direct model access entries.
- Override
_compute_sla_deadline()onspp.grm.ticketto implement custom SLA calculation logic - Install
spp_grm_celto providespp.grm.escalation.rulemodel, which is automatically invoked when SLA status changes to breached - Inherit
spp.grm.ticketto add domain-specific fields (extended byspp_grm_registry,spp_grm_programs) - Extend
spp.grm.ticket.stageto add workflow state fields - Override
evaluate_ticket()onspp.grm.sla.ruleto add custom matching conditions
base, mail, portal, spp_registry, spp_area,
spp_user_roles, spp_security
Table of contents
- fix(security): portal users can now only access their OWN grievance
tickets. The
spp.grm.ticketportal access was read/write/create with no record rule, so any portal user could read and rewrite every grievance in the system over RPC (#380). Added a portal record rule scoping to the user's own partner and reduced the portal access-control entry to read-only (submission is handled by the sudo'd portal controller, which needs no direct model write). The rule covers all four operations, so the scoping also holds if a future access-control change ever re-grants portal write. - fix: SLA-breach handling (auto-escalation and the breach chatter note)
no longer runs inside the stored
sla_statuscompute. It is deferred to the end of the triggering transaction, so the escalation engine's writes, savepoints and flushes never execute mid-computation. Same transaction, same outcome. An unsaved form edit queues nothing: the compute also runs on the pseudo-record of an onchange, whose ids resolve back to the real ticket, which would have escalated it for a change the user never saved.
- fix(views): gate the "Helpdesk" top-level menu
(
spp_grm_ticket_main_menu) ongroup_grm_viewer. Previously the root menu had nogroups=attribute and was visible to every logged-in user; the OP#951 menu audit requires several roles to NOT see it (Registry Viewer, Global Finance, Global Program Manager, Program Viewer/Validator/Cycle Approver, Global Registrar, CR roles, Farm User/Manager).
- Initial migration to OpenSPP2
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed feedback.
Do not contact contributors directly about support or help with technical issues.
- OpenSPP.org
Current maintainers:
This module is part of the OpenSPP/OpenSPP2 project on GitHub.
You are welcome to contribute.





