210 lines
6.5 KiB
PHP
210 lines
6.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Modules\RestaurantDelivery\Enums;
|
|
|
|
enum DeliveryStatus: string
|
|
{
|
|
case PENDING = 'pending';
|
|
case CONFIRMED = 'confirmed';
|
|
case PREPARING = 'preparing';
|
|
case READY_FOR_PICKUP = 'ready_for_pickup';
|
|
case RIDER_ASSIGNED = 'rider_assigned';
|
|
case RIDER_AT_RESTAURANT = 'rider_at_restaurant';
|
|
case PICKED_UP = 'picked_up';
|
|
case ON_THE_WAY = 'on_the_way';
|
|
case ARRIVED = 'arrived';
|
|
case DELIVERED = 'delivered';
|
|
case CANCELLED = 'cancelled';
|
|
case FAILED = 'failed';
|
|
|
|
public function label(): string
|
|
{
|
|
return match ($this) {
|
|
self::PENDING => 'Order Placed',
|
|
self::CONFIRMED => 'Order Confirmed',
|
|
self::PREPARING => 'Preparing',
|
|
self::READY_FOR_PICKUP => 'Ready for Pickup',
|
|
self::RIDER_ASSIGNED => 'Rider Assigned',
|
|
self::RIDER_AT_RESTAURANT => 'Rider at Restaurant',
|
|
self::PICKED_UP => 'Picked Up',
|
|
self::ON_THE_WAY => 'On The Way',
|
|
self::ARRIVED => 'Arrived',
|
|
self::DELIVERED => 'Delivered',
|
|
self::CANCELLED => 'Cancelled',
|
|
self::FAILED => 'Failed',
|
|
};
|
|
}
|
|
|
|
public function description(): string
|
|
{
|
|
return match ($this) {
|
|
self::PENDING => 'Waiting for restaurant confirmation',
|
|
self::CONFIRMED => 'Restaurant is preparing your food',
|
|
self::PREPARING => 'Your food is being prepared',
|
|
self::READY_FOR_PICKUP => 'Food is ready, waiting for rider',
|
|
self::RIDER_ASSIGNED => 'A rider has been assigned',
|
|
self::RIDER_AT_RESTAURANT => 'Rider has arrived at restaurant',
|
|
self::PICKED_UP => 'Rider has picked up your order',
|
|
self::ON_THE_WAY => 'Rider is on the way to you',
|
|
self::ARRIVED => 'Rider has arrived at your location',
|
|
self::DELIVERED => 'Order has been delivered',
|
|
self::CANCELLED => 'Order has been cancelled',
|
|
self::FAILED => 'Delivery failed',
|
|
};
|
|
}
|
|
|
|
public function color(): string
|
|
{
|
|
return match ($this) {
|
|
self::PENDING => '#6B7280',
|
|
self::CONFIRMED => '#3B82F6',
|
|
self::PREPARING => '#F59E0B',
|
|
self::READY_FOR_PICKUP => '#8B5CF6',
|
|
self::RIDER_ASSIGNED => '#06B6D4',
|
|
self::RIDER_AT_RESTAURANT => '#14B8A6',
|
|
self::PICKED_UP => '#22C55E',
|
|
self::ON_THE_WAY => '#10B981',
|
|
self::ARRIVED => '#059669',
|
|
self::DELIVERED => '#047857',
|
|
self::CANCELLED => '#EF4444',
|
|
self::FAILED => '#DC2626',
|
|
};
|
|
}
|
|
|
|
public function icon(): string
|
|
{
|
|
return match ($this) {
|
|
self::PENDING => 'clock',
|
|
self::CONFIRMED => 'check-circle',
|
|
self::PREPARING => 'fire',
|
|
self::READY_FOR_PICKUP => 'package',
|
|
self::RIDER_ASSIGNED => 'user-check',
|
|
self::RIDER_AT_RESTAURANT => 'map-pin',
|
|
self::PICKED_UP => 'shopping-bag',
|
|
self::ON_THE_WAY => 'truck',
|
|
self::ARRIVED => 'home',
|
|
self::DELIVERED => 'check-double',
|
|
self::CANCELLED => 'x-circle',
|
|
self::FAILED => 'alert-triangle',
|
|
};
|
|
}
|
|
|
|
public function canTransitionTo(DeliveryStatus $newStatus): bool
|
|
{
|
|
$allowedTransitions = match ($this) {
|
|
self::PENDING => [self::CONFIRMED, self::CANCELLED],
|
|
self::CONFIRMED => [self::PREPARING, self::CANCELLED],
|
|
self::PREPARING => [self::READY_FOR_PICKUP, self::CANCELLED],
|
|
self::READY_FOR_PICKUP => [self::RIDER_ASSIGNED, self::CANCELLED],
|
|
self::RIDER_ASSIGNED => [self::RIDER_AT_RESTAURANT, self::CANCELLED, self::READY_FOR_PICKUP], // Can reassign
|
|
self::RIDER_AT_RESTAURANT => [self::PICKED_UP, self::CANCELLED],
|
|
self::PICKED_UP => [self::ON_THE_WAY, self::FAILED],
|
|
self::ON_THE_WAY => [self::ARRIVED, self::FAILED],
|
|
self::ARRIVED => [self::DELIVERED, self::FAILED],
|
|
self::DELIVERED => [],
|
|
self::CANCELLED => [],
|
|
self::FAILED => [],
|
|
};
|
|
|
|
return in_array($newStatus, $allowedTransitions);
|
|
}
|
|
|
|
public function isActive(): bool
|
|
{
|
|
return ! in_array($this, [self::DELIVERED, self::CANCELLED, self::FAILED]);
|
|
}
|
|
|
|
public function isCompleted(): bool
|
|
{
|
|
return $this === self::DELIVERED;
|
|
}
|
|
|
|
public function isCancelled(): bool
|
|
{
|
|
return $this === self::CANCELLED;
|
|
}
|
|
|
|
public function isFailed(): bool
|
|
{
|
|
return $this === self::FAILED;
|
|
}
|
|
|
|
public function isPickedUp(): bool
|
|
{
|
|
return in_array($this, [self::PICKED_UP, self::ON_THE_WAY, self::ARRIVED, self::DELIVERED]);
|
|
}
|
|
|
|
public function requiresRider(): bool
|
|
{
|
|
return in_array($this, [
|
|
self::RIDER_ASSIGNED,
|
|
self::RIDER_AT_RESTAURANT,
|
|
self::PICKED_UP,
|
|
self::ON_THE_WAY,
|
|
self::ARRIVED,
|
|
]);
|
|
}
|
|
|
|
public function isTrackable(): bool
|
|
{
|
|
return in_array($this, [
|
|
self::RIDER_ASSIGNED,
|
|
self::RIDER_AT_RESTAURANT,
|
|
self::PICKED_UP,
|
|
self::ON_THE_WAY,
|
|
self::ARRIVED,
|
|
]);
|
|
}
|
|
|
|
public static function activeStatuses(): array
|
|
{
|
|
return [
|
|
self::PENDING,
|
|
self::CONFIRMED,
|
|
self::PREPARING,
|
|
self::READY_FOR_PICKUP,
|
|
self::RIDER_ASSIGNED,
|
|
self::RIDER_AT_RESTAURANT,
|
|
self::PICKED_UP,
|
|
self::ON_THE_WAY,
|
|
self::ARRIVED,
|
|
];
|
|
}
|
|
|
|
public static function completedStatuses(): array
|
|
{
|
|
return [self::DELIVERED, self::CANCELLED, self::FAILED];
|
|
}
|
|
|
|
public static function riderActiveStatuses(): array
|
|
{
|
|
return [
|
|
self::RIDER_ASSIGNED,
|
|
self::RIDER_AT_RESTAURANT,
|
|
self::PICKED_UP,
|
|
self::ON_THE_WAY,
|
|
self::ARRIVED,
|
|
];
|
|
}
|
|
|
|
public function sortOrder(): int
|
|
{
|
|
return match ($this) {
|
|
self::PENDING => 1,
|
|
self::CONFIRMED => 2,
|
|
self::PREPARING => 3,
|
|
self::READY_FOR_PICKUP => 4,
|
|
self::RIDER_ASSIGNED => 5,
|
|
self::RIDER_AT_RESTAURANT => 6,
|
|
self::PICKED_UP => 7,
|
|
self::ON_THE_WAY => 8,
|
|
self::ARRIVED => 9,
|
|
self::DELIVERED => 10,
|
|
self::CANCELLED => 11,
|
|
self::FAILED => 12,
|
|
};
|
|
}
|
|
}
|