'Proses', self::COMPLETED => 'Selesai', self::VERIFIED => 'Terverifikasi', self::REJECTED => 'Ditolak', }; } public function isEditable(): bool { return in_array($this, [self::IN_PROGRESS, self::REJECTED], true); } public function canTransitionTo(self $status): bool { return match ($this) { self::IN_PROGRESS => $status === self::COMPLETED, self::COMPLETED => in_array($status, [self::VERIFIED, self::REJECTED, self::IN_PROGRESS], true), self::REJECTED => $status === self::IN_PROGRESS, default => false, }; } public function transitionPermission(): Permission { return match ($this) { self::COMPLETED => Permission::CUTTINGS_COMPLETE, self::VERIFIED => Permission::CUTTINGS_VERIFY, self::REJECTED => Permission::CUTTINGS_REJECT, self::IN_PROGRESS => Permission::CUTTINGS_UPDATE, default => throw new InvalidArgumentException('Status tidak mendukung transisi.'), }; } /** * @return list */ public function availableActions(): array { return match ($this) { self::IN_PROGRESS => [ [ 'status' => self::COMPLETED->value, 'label' => 'Selesai', 'destructive' => false, 'permission' => Permission::CUTTINGS_COMPLETE->value, 'icon_only' => false, ], ], self::COMPLETED => [ [ 'status' => self::VERIFIED->value, 'label' => 'Verifikasi', 'destructive' => false, 'permission' => Permission::CUTTINGS_VERIFY->value, 'icon_only' => false, ], [ 'status' => self::REJECTED->value, 'label' => 'Tolak', 'destructive' => true, 'permission' => Permission::CUTTINGS_REJECT->value, 'icon_only' => false, ], [ 'status' => self::IN_PROGRESS->value, 'label' => 'Kembalikan ke Proses', 'destructive' => true, 'permission' => Permission::CUTTINGS_REJECT->value, 'icon_only' => false, ], ], self::REJECTED => [ [ 'status' => self::IN_PROGRESS->value, 'label' => 'Kembalikan ke Proses', 'destructive' => false, 'permission' => Permission::CUTTINGS_UPDATE->value, 'icon_only' => false, ], ], default => [], }; } }