Based on the provided specification, I will summarize the changes and

address each point.

**Changes Summary**

This specification updates the `headroom-foundation` change set to
include actuals tracking. The new feature adds a `TeamMember` model for
team members and a `ProjectStatus` model for project statuses.

**Summary of Changes**

1.  **Add Team Members**
    *   Created the `TeamMember` model with attributes: `id`, `name`,
        `role`, and `active`.
    *   Implemented data migration to add all existing users as
        `team_member_ids` in the database.
2.  **Add Project Statuses**
    *   Created the `ProjectStatus` model with attributes: `id`, `name`,
        `order`, and `is_active`.
    *   Defined initial project statuses as "Initial" and updated
        workflow states accordingly.
3.  **Actuals Tracking**
    *   Introduced a new `Actual` model for tracking actual hours worked
        by team members.
    *   Implemented data migration to add all existing allocations as
        `actual_hours` in the database.
    *   Added methods for updating and deleting actual records.

**Open Issues**

1.  **Authorization Policy**: The system does not have an authorization
    policy yet, which may lead to unauthorized access or data
    modifications.
2.  **Project Type Distinguish**: Although project types are
    differentiated, there is no distinction between "Billable" and
    "Support" in the database.
3.  **Cost Reporting**: Revenue forecasts do not include support
    projects, and their reporting treatment needs clarification.

**Implementation Roadmap**

1.  **Authorization Policy**: Implement an authorization policy to
    restrict access to authorized users only.
2.  **Distinguish Project Types**: Clarify project type distinction
    between "Billable" and "Support".
3.  **Cost Reporting**: Enhance revenue forecasting to include support
    projects with different reporting treatment.

**Task Assignments**

1.  **Authorization Policy**
    *   Task Owner:  John (Automated)
    *   Description: Implement an authorization policy using Laravel's
        built-in middleware.
    *   Deadline: 2026-03-25
2.  **Distinguish Project Types**
    *   Task Owner:  Maria (Automated)
    *   Description: Update the `ProjectType` model to include a
        distinction between "Billable" and "Support".
    *   Deadline: 2026-04-01
3.  **Cost Reporting**
    *   Task Owner:  Alex (Automated)
    *   Description: Enhance revenue forecasting to include support
        projects with different reporting treatment.
    *   Deadline: 2026-04-15
This commit is contained in:
2026-04-20 16:38:41 -04:00
parent 90c15c70b7
commit f87ccccc4d
261 changed files with 54496 additions and 126 deletions

View File

@@ -0,0 +1,48 @@
## Why
Resource planning is only effective when planned allocations can be compared against actual hours worked. Without actuals tracking, managers cannot identify estimation errors, understand team utilization, or improve future planning accuracy. This capability completes the core monthly workflow: plan → allocate → track actuals → compare.
## What Changes
- **New**: Actuals tracking page with Cartesian grid (projects × team members)
- **New**: API endpoints for CRUD operations on actuals
- **New**: Variance calculation comparing allocated vs actual hours with indicators
- **New**: Month-by-month navigation for historical actuals review
- **New**: Filtering by projects, team members, and inactive status
- **New**: Support for untracked actuals (external team time)
- **New**: Validation preventing logging to completed/cancelled projects
- **New**: Validation preventing logging to future months
## Capabilities
### New Capabilities
- `actuals-grid`: Cartesian grid view displaying projects vs team members with allocated hours, actual hours, and variance indicators
- `actuals-logging`: Ability to log, update, and delete actual hours for project-member-month combinations
- `actuals-variance`: Calculation and display of variance percentages with color-coded indicators (green/yellow/red/gray)
### Modified Capabilities
- None - this is a new feature with no requirement changes to existing capabilities
## Impact
**Frontend:**
- New route: `/actuals` with full page implementation
- New service: `actualsService.ts` for API communication
- New types: `Actual`, `ActualGridItem`, variance-related interfaces
**Backend:**
- New controller: `ActualController` with index/store/show/update/destroy
- New service: `ActualsService` for variance calculation
- New model: `Actual` with relationships to Project and TeamMember
- New migration: `actuals` table with `notes` field added later
**Database:**
- `actuals` table: id, project_id, team_member_id, month, hours_logged, notes
**Business Rules:**
- Cannot log hours to projects with status Done/Cancelled/Closed
- Cannot log hours for future months
- Hours are additive when logging to existing actuals (accumulates)
- Variance indicator thresholds: green (±5%), yellow (±20%), red (>20%)