f7fc69077b
- Convert static $modelLabel/$pluralModelLabel/$title to getter methods - Wrap ->label()/->placeholder()/->helperText()/->description()/->title()/->body() args - Wrap Section::make()/Fieldset::make()/Notification::make()->title() args - Fix RelationManagers::getTitle() signature to match parent (Model, string) - Fix Pages::getTitle() to instance method (BasePage::getTitle is non-static) - Extend lang/ru.json + lang/en.json with 700+ common terms; identity fallback for the rest - Remove duplicate getters in 5 resources that had manual getModelLabel already All 306 tests pass. Missing translations fall back to the RO key so the UI never breaks. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
154 lines
4.6 KiB
PHP
154 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Tenant\Pages;
|
|
|
|
use App\Models\Tenant\WorkOrder;
|
|
use App\Models\Tenant\WorkOrderWork;
|
|
use Filament\Notifications\Notification;
|
|
use Filament\Pages\Page;
|
|
|
|
/**
|
|
* Mobile-first dashboard for a single mechanic — shows ONLY work orders
|
|
* assigned to the currently logged-in user (master_id = auth()->id()).
|
|
* Kanban-style grouped by status.
|
|
*/
|
|
class MechanicBoard extends Page
|
|
{
|
|
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-wrench';
|
|
|
|
public static function getNavigationLabel(): string
|
|
{
|
|
return __('nav.label.Atelierul meu');
|
|
}
|
|
|
|
public static function getNavigationGroup(): ?string
|
|
{
|
|
return __('nav.group.Service');
|
|
}
|
|
|
|
protected static ?int $navigationSort = 25;
|
|
|
|
protected static ?string $title = null;
|
|
|
|
public function getTitle(): string
|
|
{
|
|
return __('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,
|
|
];
|
|
}
|
|
}
|