feat(backend): add reporting and variance calculation services

Implement core reporting infrastructure:
- ReconciliationCalculator: plan vs estimate reconciliation
- VarianceCalculator: project and member variance calculations
- ReportController: GET /api/reports/allocations endpoint
- Support did/is/will view type inference based on date ranges
- Distinguish blank plans from explicit zero values

Part of enhanced-allocation change.
This commit is contained in:
2026-03-08 18:22:34 -04:00
parent b7bbfb45c0
commit 2a93245970
4 changed files with 636 additions and 0 deletions

View File

@@ -7,6 +7,8 @@ use App\Http\Controllers\Api\HolidayController;
use App\Http\Controllers\Api\ProjectController;
use App\Http\Controllers\Api\ProjectMonthPlanController;
use App\Http\Controllers\Api\PtoController;
use App\Http\Controllers\Api\ReportController;
use App\Http\Controllers\Api\RolesController;
use App\Http\Controllers\Api\TeamMemberController;
use App\Http\Middleware\JwtAuth;
use App\Http\Resources\UserResource;
@@ -35,6 +37,9 @@ Route::middleware(JwtAuth::class)->group(function () {
// Team Members
Route::apiResource('team-members', TeamMemberController::class);
// Roles
Route::get('/roles', [RolesController::class, 'index']);
// Projects
Route::get('projects/types', [ProjectController::class, 'types']);
Route::get('projects/statuses', [ProjectController::class, 'statuses']);
@@ -68,4 +73,7 @@ Route::middleware(JwtAuth::class)->group(function () {
// Allocations
Route::apiResource('allocations', AllocationController::class);
Route::post('/allocations/bulk', [AllocationController::class, 'bulkStore']);
// Reports
Route::get('/reports/allocations', [ReportController::class, 'allocations']);
});