{{-- Project status report body — swapped by the period picker via HTMX. Expects: $report: array - ReportEngine::buildReport() output for [$projectId] $period: \Leantime\Domain\Reports\Models\ReportPeriod $projectId: int --}} @php $summary = $report['summaries'][$projectId] ?? null; $stats = $report['stats']; $deltas = $report['deltas']; $inFlightMilestones = array_merge($report['milestones']['overdue'], $report['milestones']['inProgress']); $fmt = fn ($n) => \Illuminate\Support\Number::format((float) $n, maxPrecision: 1); @endphp
{{-- Header band: status, progress, timeline --}} @if ($summary !== null)
@include('reports::partials.statusPill', ['status' => $summary->latestStatus, 'date' => $summary->latestStatusDate]) {{ round($summary->progress['percent'] ?? 0) }}% {{ __('label.report_complete') }} @php $completionState = $summary->progress['estimatedCompletionState'] ?? 'ready'; @endphp @if ($completionState === 'needs_more_data') · {{ __('label.complete_more_todos') }} @elseif ($completionState === 'complete') · {{ __('label.project_complete_onto_next') }} @elseif (!empty($summary->progress['estimatedCompletionDate']) && $summary->progress['estimatedCompletionDate'] !== false) · {{ __('label.estimated_completion') }} {{ $summary->progress['estimatedCompletionDate'] }} @endif {{ $period->label() }}
@endif @include('reports::partials.statTiles', ['tiles' => [ ['label' => __('label.milestones_completed'), 'value' => $stats['completed'], 'delta' => ['value' => $deltas['completedDelta'], 'goodWhenUp' => true, 'vs' => __('label.vs_prior_period_short')]], ['label' => __('label.milestones_in_flight'), 'value' => $stats['inFlight']], ['label' => __('label.milestones_overdue'), 'value' => $stats['overdue'], 'tone' => 'danger'], ['label' => __('label.hours_logged'), 'value' => $fmt($stats['hoursLogged']), 'delta' => ['value' => $deltas['hoursDelta'], 'goodWhenUp' => null, 'vs' => __('label.vs_prior_period_short')]], ]]) @include('reports::partials.needsAttention', ['needsAttention' => $report['needsAttention'], 'showProjects' => false])
{{ __('subtitles.accomplished_this_period') }} {{ count($report['milestones']['completed']) }}
@include('reports::partials.milestoneList', [ 'milestones' => $report['milestones']['completed'], 'mode' => 'completed', 'allowOutcomeEdit' => true, 'effortByMilestone' => $report['effort']['byMilestone'], 'period' => $period, 'emptyText' => __('text.report_no_completed_milestones'), ]) @include('reports::partials.changedThisPeriod', ['slippage' => $report['milestones']['slippage'], 'showProjects' => false])
{{ __('subtitles.in_flight') }} {{ count($inFlightMilestones) }}
@include('reports::partials.milestoneList', [ 'milestones' => $inFlightMilestones, 'mode' => 'inflight', 'effortByMilestone' => $report['effort']['byMilestone'], 'period' => $period, 'emptyText' => __('text.report_no_inflight_milestones'), ])
{{ __('subtitles.coming_up') }}
@if (count($report['milestones']['upcomingByQuarter']) === 0)
{{ __('text.report_no_upcoming_milestones') }}
@else @foreach ($report['milestones']['upcomingByQuarter'] as $quarterLabel => $quarterMilestones)
{{ $quarterLabel }}
@include('reports::partials.milestoneList', [ 'milestones' => $quarterMilestones, 'mode' => 'upcoming', 'period' => $period, 'emptyText' => '', ]) @endforeach @endif
{{ __('subtitles.goals_kpis') }}
@include('reports::partials.goalTable', [ 'goals' => $report['goals']['goals'], 'emptyText' => __('text.report_no_goals'), ])
{{ __('subtitles.status_narrative') }}
@include('reports::partials.statusNarrative', [ 'updatesByProject' => $report['statusUpdates'], 'summaries' => $report['summaries'], 'showProjects' => false, 'emptyText' => __('text.report_no_status_updates'), ])