@extends('layouts.app') @section('title', $project->code.' | LPM') @section('heading', $project->name) @section('content') @php $focusStage = $project->stages->first(fn ($stage) => $stage->status->value === 'active') ?? $project->stages->first(fn ($stage) => $stage->status->value === 'pending') ?? $project->stages->last(); $focusOpenTasks = $focusStage?->tasks->filter(fn ($task) => $task->status->value !== 'completed') ?? collect(); $focusHasTasks = $focusStage?->tasks->isNotEmpty() ?? false; $focusDeliverables = $focusStage?->deliverables ?? collect(); $attentionDeliverable = $focusDeliverables->first(fn ($item) => $item->status->value === 'changes_requested') ?? $focusDeliverables->first(fn ($item) => $item->versions->isEmpty()) ?? $focusDeliverables->first(fn ($item) => $item->status->value === 'draft') ?? $focusDeliverables->first(fn ($item) => $item->status->value === 'in_review'); $clientPendingApproval = $project->stages->flatMap->deliverables->flatMap->approvals ->first(fn ($approval) => $approval->status->value === 'pending' && $approval->reviewer_id === auth()->id()); @endphp
{{ $project->code }}{{ $project->status->label() }}Prioridad {{ strtolower($project->priority->label()) }}

{{ $project->description ?: 'Sin descripción registrada.' }}

@can('update', $project)Editar proyecto@endcan
Área{{ $project->area->name }}
Diseñador{{ $project->designer->name }}
Cliente interno{{ $project->client->name }}
Fecha límite{{ $project->due_date->format('d/m/Y') }}

RUTA DEL PROYECTO

{{ $project->progress() }}% completado

{{ $project->stages->where('status', App\Enums\StageStatus::Completed)->count() }} de {{ $project->stages->count() }} etapas completadas
SIGUIENTE ACCIÓN @if($project->status->value === 'draft')

Activa el proyecto para iniciar Análisis

Las etapas ya están preparadas. Al activar, la primera quedará en curso.

@elseif($project->status->value === 'cancelled')

El proyecto está cancelado

Puedes reactivarlo para continuar desde el punto conservado.

@elseif($project->status->value === 'completed')

Proyecto finalizado

La ruta y sus evidencias permanecen disponibles como historial.

@elseif($clientPendingApproval)

Revisa {{ $clientPendingApproval->deliverable->name }}

La versión {{ $clientPendingApproval->version->version_number }} espera tu decisión.

@elseif(!$focusHasTasks)

Agrega la primera tarea de {{ $focusStage->name }}

Define el trabajo de la etapa, su responsable y fecha límite antes de registrar entregables.

@elseif($focusOpenTasks->isNotEmpty())

Continúa con “{{ $focusOpenTasks->first()->title }}”

Es la siguiente tarea abierta de la etapa {{ $focusStage->name }}.

@elseif($focusDeliverables->isEmpty())

Registra el entregable de {{ $focusStage->name }}

Las tareas ya no bloquean la etapa; agrega la evidencia que deberá revisar el cliente interno.

@elseif($attentionDeliverable && $attentionDeliverable->versions->isEmpty())

Agrega la primera versión de {{ $attentionDeliverable->name }}

Puedes cargar un archivo privado o registrar una liga.

@elseif($attentionDeliverable?->status->value === 'changes_requested')

Atiende los cambios de {{ $attentionDeliverable->name }}

Consulta la observación y carga una nueva versión antes de reenviar.

@elseif($attentionDeliverable?->status->value === 'draft')

Envía {{ $attentionDeliverable->name }} a revisión

La versión más reciente está lista para iniciar una nueva ronda.

@elseif($attentionDeliverable?->status->value === 'in_review')

Espera la decisión del cliente interno

{{ $attentionDeliverable->name }} se encuentra en revisión.

@else

Completa la etapa {{ $focusStage->name }}

Las tareas están cerradas y todos los entregables fueron aprobados.

@endif
@can('manage', $project) @if($project->status->value === 'draft')
@csrf
@elseif($project->status->value === 'cancelled')
@csrf
@elseif($project->status->value === 'active' && !$focusHasTasks) Agregar tarea @elseif($project->status->value === 'active' && $focusOpenTasks->isNotEmpty()) Abrir siguiente tarea @elseif($project->status->value === 'active' && ($focusDeliverables->isEmpty() || $attentionDeliverable)) Ir al entregable @elseif($project->status->value === 'active') Completar etapa @endif @else @if($clientPendingApproval)Revisar ahora @elseif(auth()->user()->isClient())Ver mis pendientes@endif @endcan
@foreach($project->stages as $stage) @php $isFocus = $focusStage?->id === $stage->id; $hasTasks = $stage->tasks->isNotEmpty(); $hasDeliverables = $stage->deliverables->isNotEmpty(); $incompleteTasks = $stage->tasks->filter(fn ($task) => $task->status->value !== 'completed')->count(); $openDeliverables = $stage->deliverables->filter(fn ($item) => $item->status->value !== 'approved')->count(); @endphp
@if($stage->status->value === 'completed')✓@else{{ $stage->position }}@endif {{ $isFocus ? 'ETAPA DE TRABAJO' : 'ETAPA '.$stage->position }}{{ $stage->name }} {{ $stage->tasks->where('status', App\Enums\TaskStatus::Completed)->count() }}/{{ $stage->tasks->count() }} tareas · {{ $stage->deliverables->where('status', App\Enums\DeliverableStatus::Approved)->count() }}/{{ $stage->deliverables->count() }} entregables {{ $stage->status->label() }}
@include('projects.partials.task-list', ['stage' => $stage])
2 · ENTREGABLES

Evidencias y aprobación

Cada envío conserva su versión y su ronda de revisión.

@if(auth()->user()->isClient())Ver bandeja@endif
@can('create', [App\Models\Deliverable::class, $project]) @if($stage->status->value !== 'completed')
+ Crear entregable en {{ $stage->name }}
@csrf
@endif @endcan
@forelse($stage->deliverables as $deliverable) @include('projects.partials.deliverable-card', ['deliverable' => $deliverable]) @empty
Aún no hay entregables en esta etapa.
@endforelse
@can('manage', $project) @if($project->status->value === 'active' && $stage->status->value === 'active')
3 · CIERRE DE ETAPA @if(!$hasTasks || !$hasDeliverables || $incompleteTasks > 0 || $openDeliverables > 0)
Esta etapa aún no puede completarse.@if(!$hasTasks)Agrega al menos una tarea.@elseif($incompleteTasks > 0){{ $incompleteTasks }} {{ $incompleteTasks === 1 ? 'tarea debe completarse' : 'tareas deben completarse' }}.@endif @if(!$hasDeliverables)Agrega al menos un entregable.@elseif($openDeliverables > 0){{ $openDeliverables }} {{ $openDeliverables === 1 ? 'entregable requiere aprobación' : 'entregables requieren aprobación' }}.@endif
@else
@csrf
@endif
@endif @endcan
@endforeach
HISTORIALActividad del proyectoVer últimos movimientos
@forelse($project->activityLogs->take(25) as $activity)
{{ $activity->description }}{{ $activity->user?->name ?? 'Sistema' }} · {{ $activity->created_at->format('d/m/Y H:i') }}
@empty
La actividad aparecerá aquí.
@endforelse
@can('manage', $project) @if(in_array($project->status->value, ['draft','active']))
Opciones administrativas del proyecto

Cancelar proyecto

El proyecto permanecerá disponible y podrá reactivarse después.

@csrf
@endif @endcan @endsection