# Grants module — PRD coverage map

Single source of truth mapping PRD requirement IDs (`setup/PRD.md` §5.1
Fund Administration) to the symbols that implement them. Reviewers and PRD
sign-off can grep an ID to find its implementation; deletions / renames must
update this file.

## Funding record lifecycle (FRFA-GPS001–027)

| PRD ID | Description | Implementing symbol |
| --- | --- | --- |
| GPS001 | Initialise a grant record | `funding_views.FundingRecordCreateView` |
| GPS002 | Issue Grant ID on approval | `funding.approve_funding_record` |
| GPS003 | Persist as Draft | `models.FundingRecord.Status.DRAFT` |
| GPS005 | Donor & funding source on the record | `forms.FundingRecordForm` (donor / funding_source fields) |
| GPS006 | Strategic objectives | `apps.rims.operations.views.StrategicObjective*` |
| GPS007–009 | Donor profile admin (with duplicate detection) | `apps.rims.operations.views.Donor*` + `operations/templates/operations/donor_form.html` |
| GPS010–013 | Multi-currency budget structure | `forms.GrantBudgetLineFormSet`, `models.FundingBudgetLine` |
| GPS014–016 | Reporting schedule generation | `views.calendar_*` (call-side) |
| GPS017 | Staff assignment (programme, finance, grant manager) | `forms.FundingRecordForm` (programme_lead, finance_officer, grant_manager) |
| GPS018 | Block submit until staff assigned | `funding.submit_funding_for_approval` (assignment gate) |
| GPS019 | Notify assigned staff | downstream notification signals |
| GPS020 | Mandatory completeness validation | `funding.submit_funding_for_approval` |
| GPS021 | Route to approver | `funding_views.FundingSubmitForApprovalView` |
| GPS023 | Approval status + notification | `funding_views.FundingApproveView` |
| GPS024 | Return for revision | `funding_views.FundingRejectView`, `FundingRecordUpdateView` |
| GPS025 | Audit trail | `audit_helper.audit_rims` (called from every state transition) |
| GPS026 | Versioning on transitions | `funding.submit_funding_for_approval` (versioning logic) |
| GPS027 | Controlled edit window | `FundingRecordUpdateView.form_valid` (status guard) |

## Call lifecycle (FRFA-CS, application & review)

| PRD ID range | Implementing symbol |
| --- | --- |
| FRFA-CS publish/close/complete | `views.GrantsManagerMixin` views (`call_publish`, `call_close_submissions`, `call_complete`) |
| FRFA-CS030 (withdraw) | `views.call_withdraw` |
| FRFA-AP applications | `views.ApplyCallView`, `ApplicationDetailView`, `ApplicationReviseView` |
| FRFA-RV reviews | `views.ReviewerAccessMixin` views, `views.ReviewSubmitView` |
| FRFA-AW awards | `views.AwardCreateView`, `AwardDetailView`, `award_form.html` |
| FRFA-CO close-out (CO005–010) | `award_closeout.html` + `final_report_decision` view |

## Cross-cutting

- **Audit (NFRFA011)** — every state transition calls `audit_rims`; the
  resulting rows surface in `apps.rims.operations.views.AuditLogView`.
- **Permissions** — `RimsAccessMixin` (in `apps/core/permissions/`) gates all
  views; module-specific roles defined on `FundingManagerMixin`,
  `FundingApproveMixin`, `ReviewerAccessMixin`, `ProgramOfficerAccessMixin`.
