id()). * Kanban-style grouped by status. */ class MechanicBoard extends Page { protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-wrench'; protected static ?string $navigationLabel = 'Atelierul meu'; protected static string|\UnitEnum|null $navigationGroup = 'Service'; protected static ?int $navigationSort = 25; protected static ?string $title = 'Atelierul meu'; protected string $view = 'filament.tenant.pages.mechanic-board'; public function getColumns(): array { $userId = auth()->id(); if (! $userId) return []; $all = WorkOrder::with(['client', 'vehicle']) ->where('master_id', $userId) ->whereIn('status', ['in_work', 'awaiting_parts', 'ready', 'done', 'approved', 'diagnosis']) ->orderBy('opened_at', 'desc') ->get(); return [ [ 'key' => 'in_work', 'label' => 'În lucru', 'color' => '#f59e0b', 'items' => $all->where('status', 'in_work')->values(), ], [ 'key' => 'awaiting_parts', 'label' => 'Așteaptă piese', 'color' => '#8b5cf6', 'items' => $all->whereIn('status', ['awaiting_parts'])->values(), ], [ 'key' => 'ready', 'label' => 'Gata', 'color' => '#10b981', 'items' => $all->where('status', 'ready')->values(), ], [ 'key' => 'recent', 'label' => 'Recente / restul', 'color' => '#64748b', 'items' => $all->whereIn('status', ['done', 'approved', 'diagnosis']) ->take(20) ->values(), ], ]; } public ?int $blockingWorkId = null; public string $blockReason = 'missing_part'; public string $blockNote = ''; public function startWork(int $id): void { $w = WorkOrderWork::find($id); if ($w && $w->workOrder?->master_id === auth()->id()) $w->start(); } public function pauseWork(int $id): void { $w = WorkOrderWork::find($id); if ($w && $w->workOrder?->master_id === auth()->id()) $w->pause(); } public function resumeWork(int $id): void { $w = WorkOrderWork::find($id); if ($w && $w->workOrder?->master_id === auth()->id()) $w->resume(); } public function doneWork(int $id): void { $w = WorkOrderWork::find($id); if ($w && $w->workOrder?->master_id === auth()->id()) $w->markDone(); } public function openBlockModal(int $id): void { $this->blockingWorkId = $id; $this->blockReason = 'missing_part'; $this->blockNote = ''; } public function confirmBlock(): void { if (! $this->blockingWorkId) return; $work = WorkOrderWork::find($this->blockingWorkId); if (! $work) return; // Only own work if ($work->workOrder?->master_id !== auth()->id()) { $this->blockingWorkId = null; return; } $work->block($this->blockReason, trim($this->blockNote) ?: null); Notification::make()->title('Lucrare blocată')->body($work->name . ' · ' . WorkOrderWork::BLOCK_REASONS[$this->blockReason])->warning()->send(); $this->blockingWorkId = null; } public function getWorksFor(int $woId): array { return WorkOrderWork::where('work_order_id', $woId)->orderBy('id')->get()->all(); } public function getCounts(): array { $userId = auth()->id(); return [ 'active' => $userId ? WorkOrder::where('master_id', $userId) ->whereIn('status', ['in_work', 'awaiting_parts', 'ready']) ->count() : 0, 'closed_today' => $userId ? WorkOrder::where('master_id', $userId) ->where('status', 'done') ->whereDate('closed_at', today()) ->count() : 0, ]; } }