133 lines
3.5 KiB
PHP
133 lines
3.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Modules\RestaurantDelivery\Observers;
|
|
|
|
use Illuminate\Support\Facades\Log;
|
|
use Modules\RestaurantDelivery\Enums\DeliveryStatus;
|
|
use Modules\RestaurantDelivery\Models\Delivery;
|
|
use Modules\RestaurantDelivery\Services\Tracking\LiveTrackingService;
|
|
|
|
class DeliveryObserver
|
|
{
|
|
public function __construct(
|
|
protected LiveTrackingService $trackingService
|
|
) {}
|
|
|
|
/**
|
|
* Handle the Delivery "created" event.
|
|
*/
|
|
public function created(Delivery $delivery): void
|
|
{
|
|
Log::info('Delivery created', [
|
|
'delivery_id' => $delivery->id,
|
|
'tracking_code' => $delivery->tracking_code,
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Handle the Delivery "updated" event.
|
|
*/
|
|
public function updated(Delivery $delivery): void
|
|
{
|
|
// Check if status changed
|
|
if ($delivery->isDirty('status')) {
|
|
$this->handleStatusChange($delivery);
|
|
}
|
|
|
|
// Check if rider changed
|
|
if ($delivery->isDirty('rider_id')) {
|
|
$this->handleRiderChange($delivery);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handle status change.
|
|
*/
|
|
protected function handleStatusChange(Delivery $delivery): void
|
|
{
|
|
$originalStatus = $delivery->getOriginal('status');
|
|
|
|
Log::info('Delivery status changed', [
|
|
'delivery_id' => $delivery->id,
|
|
'from' => $originalStatus,
|
|
'to' => $delivery->status->value,
|
|
]);
|
|
|
|
// Handle specific status transitions
|
|
if ($delivery->status === DeliveryStatus::DELIVERED) {
|
|
$this->handleDeliveryCompleted($delivery);
|
|
}
|
|
|
|
if ($delivery->status === DeliveryStatus::CANCELLED) {
|
|
$this->handleDeliveryCancelled($delivery);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handle rider change.
|
|
*/
|
|
protected function handleRiderChange(Delivery $delivery): void
|
|
{
|
|
$originalRiderId = $delivery->getOriginal('rider_id');
|
|
$newRiderId = $delivery->rider_id;
|
|
|
|
Log::info('Delivery rider changed', [
|
|
'delivery_id' => $delivery->id,
|
|
'from_rider' => $originalRiderId,
|
|
'to_rider' => $newRiderId,
|
|
]);
|
|
|
|
// Reinitialize tracking with new rider
|
|
if ($newRiderId) {
|
|
$this->trackingService->initializeDeliveryTracking($delivery);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handle delivery completed.
|
|
*/
|
|
protected function handleDeliveryCompleted(Delivery $delivery): void
|
|
{
|
|
// End tracking
|
|
$this->trackingService->endDeliveryTracking($delivery);
|
|
|
|
Log::info('Delivery completed', [
|
|
'delivery_id' => $delivery->id,
|
|
'rider_id' => $delivery->rider_id,
|
|
'duration_minutes' => $delivery->getActualDuration(),
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Handle delivery cancelled.
|
|
*/
|
|
protected function handleDeliveryCancelled(Delivery $delivery): void
|
|
{
|
|
// End tracking
|
|
$this->trackingService->endDeliveryTracking($delivery);
|
|
|
|
Log::info('Delivery cancelled', [
|
|
'delivery_id' => $delivery->id,
|
|
'cancelled_by' => $delivery->cancelled_by,
|
|
'reason' => $delivery->cancellation_reason,
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Handle the Delivery "deleted" event.
|
|
*/
|
|
public function deleted(Delivery $delivery): void
|
|
{
|
|
// End tracking if still active
|
|
if ($delivery->isActive()) {
|
|
$this->trackingService->endDeliveryTracking($delivery);
|
|
}
|
|
|
|
Log::info('Delivery deleted', [
|
|
'delivery_id' => $delivery->id,
|
|
]);
|
|
}
|
|
}
|