Files

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,
]);
}
}