store/app/Enums/OrderStatus.php
Yoga Pangestu 27f101e830
Some checks are pending
linter / quality (push) Waiting to run
tests / ci (8.3) (push) Waiting to run
tests / ci (8.4) (push) Waiting to run
tests / ci (8.5) (push) Waiting to run
feat: update transition logic for PENDING status to allow completion
2026-07-31 12:54:00 +07:00

103 lines
3.2 KiB
PHP

<?php
namespace App\Enums;
use App\Traits\ProvidesEnumOptions;
use InvalidArgumentException;
enum OrderStatus: string
{
use ProvidesEnumOptions;
case PENDING = 'pending';
case PROCESSING = 'processing';
case COMPLETED = 'completed';
case CANCELLED = 'cancelled';
public function label(): string
{
return match ($this) {
self::PENDING => 'Menunggu',
self::PROCESSING => 'Diproses',
self::COMPLETED => 'Selesai',
self::CANCELLED => 'Dibatalkan',
};
}
public function isEditable(): bool
{
return in_array($this, [self::PENDING, self::PROCESSING], true);
}
public function transitionStatusMessage(): string
{
return match ($this) {
self::PROCESSING => 'Pesanan berhasil dikirim.',
self::COMPLETED => 'Pesanan berhasil diselesaikan.',
self::CANCELLED => 'Pesanan berhasil dibatalkan.',
default => 'Status pesanan berhasil diperbarui.',
};
}
public function canTransitionTo(self $status): bool
{
return match ($this) {
self::PENDING => in_array($status, [self::PROCESSING, self::COMPLETED, self::CANCELLED], true),
self::PROCESSING => in_array($status, [self::COMPLETED, self::CANCELLED], true),
self::COMPLETED, self::CANCELLED => false,
};
}
public function transitionPermission(): Permission
{
return match ($this) {
self::PROCESSING => Permission::ORDERS_SEND,
self::COMPLETED => Permission::ORDERS_COMPLETE,
self::CANCELLED => Permission::ORDERS_CANCEL,
default => throw new InvalidArgumentException('Status tidak mendukung transisi.'),
};
}
/**
* @return list<array{status: string, label: string, destructive: bool, permission: string, icon_only: bool}>
*/
public function availableActions(): array
{
return match ($this) {
self::PENDING => [
[
'status' => self::PROCESSING->value,
'label' => 'Kirim',
'destructive' => false,
'permission' => Permission::ORDERS_SEND->value,
'icon_only' => true,
],
[
'status' => self::CANCELLED->value,
'label' => 'Batalkan',
'destructive' => true,
'permission' => Permission::ORDERS_CANCEL->value,
'icon_only' => true,
],
],
self::PROCESSING => [
[
'status' => self::COMPLETED->value,
'label' => 'Selesai',
'destructive' => false,
'permission' => Permission::ORDERS_COMPLETE->value,
'icon_only' => true,
],
[
'status' => self::CANCELLED->value,
'label' => 'Batalkan',
'destructive' => true,
'permission' => Permission::ORDERS_CANCEL->value,
'icon_only' => true,
],
],
default => [],
};
}
}