migrate to gtea from bistbucket

This commit is contained in:
2026-03-15 17:08:23 +07:00
commit 129ca2260c
3716 changed files with 566316 additions and 0 deletions

View File

@@ -0,0 +1,132 @@
<?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,
]);
}
}

View File

@@ -0,0 +1,63 @@
<?php
declare(strict_types=1);
namespace Modules\RestaurantDelivery\Observers;
use Illuminate\Support\Facades\Log;
use Modules\RestaurantDelivery\Models\DeliveryRating;
class DeliveryRatingObserver
{
/**
* Handle the DeliveryRating "created" event.
*/
public function created(DeliveryRating $rating): void
{
Log::info('Delivery rating created', [
'rating_id' => $rating->id,
'delivery_id' => $rating->delivery_id,
'rider_id' => $rating->rider_id,
'overall_rating' => $rating->overall_rating,
]);
// Auto-approve high ratings without review
if ($rating->overall_rating >= 4 && ! $rating->review) {
$rating->approve();
}
}
/**
* Handle the DeliveryRating "updated" event.
*/
public function updated(DeliveryRating $rating): void
{
// Check if moderation status changed
if ($rating->isDirty('moderation_status')) {
Log::info('Rating moderation status changed', [
'rating_id' => $rating->id,
'from' => $rating->getOriginal('moderation_status'),
'to' => $rating->moderation_status,
]);
// Recalculate rider's rating if approved or rejected
if (in_array($rating->moderation_status, ['approved', 'rejected'])) {
$rating->rider?->recalculateRating();
}
}
}
/**
* Handle the DeliveryRating "deleted" event.
*/
public function deleted(DeliveryRating $rating): void
{
Log::info('Delivery rating deleted', [
'rating_id' => $rating->id,
'rider_id' => $rating->rider_id,
]);
// Recalculate rider's rating
$rating->rider?->recalculateRating();
}
}

View File

@@ -0,0 +1,147 @@
<?php
declare(strict_types=1);
namespace Modules\RestaurantDelivery\Observers;
use Illuminate\Support\Facades\Log;
use Modules\RestaurantDelivery\Models\Rider;
use Modules\RestaurantDelivery\Notifications\RiderWarningNotification;
use Modules\RestaurantDelivery\Services\Firebase\FirebaseService;
class RiderObserver
{
public function __construct(
protected FirebaseService $firebase
) {}
/**
* Handle the Rider "created" event.
*/
public function created(Rider $rider): void
{
Log::info('Rider created', [
'rider_id' => $rider->id,
'name' => $rider->full_name,
]);
}
/**
* Handle the Rider "updated" event.
*/
public function updated(Rider $rider): void
{
// Check if status changed
if ($rider->isDirty('status')) {
$this->handleStatusChange($rider);
}
// Check if online status changed
if ($rider->isDirty('is_online')) {
$this->handleOnlineStatusChange($rider);
}
// Check if rating changed
if ($rider->isDirty('rating')) {
$this->handleRatingChange($rider);
}
// Check if verification status changed
if ($rider->isDirty('is_verified')) {
$this->handleVerificationChange($rider);
}
}
/**
* Handle status change.
*/
protected function handleStatusChange(Rider $rider): void
{
$originalStatus = $rider->getOriginal('status');
Log::info('Rider status changed', [
'rider_id' => $rider->id,
'from' => $originalStatus,
'to' => $rider->status,
]);
// Update Firebase
if ($this->firebase->isEnabled()) {
$this->firebase->updateRiderStatus($rider->id, $rider->status);
}
// Handle suspension
if ($rider->status === 'suspended') {
Log::warning('Rider suspended', [
'rider_id' => $rider->id,
]);
}
}
/**
* Handle online status change.
*/
protected function handleOnlineStatusChange(Rider $rider): void
{
Log::info('Rider online status changed', [
'rider_id' => $rider->id,
'is_online' => $rider->is_online,
]);
// Update Firebase
if ($this->firebase->isEnabled()) {
$this->firebase->updateRiderStatus(
$rider->id,
$rider->is_online ? 'online' : 'offline'
);
}
}
/**
* Handle rating change.
*/
protected function handleRatingChange(Rider $rider): void
{
$originalRating = $rider->getOriginal('rating');
$newRating = $rider->rating;
Log::info('Rider rating changed', [
'rider_id' => $rider->id,
'from' => $originalRating,
'to' => $newRating,
]);
$thresholds = config('restaurant-delivery.rating.thresholds');
$minRatings = $thresholds['minimum_ratings_for_threshold'] ?? 10;
// Only check thresholds if rider has enough ratings
if ($rider->rating_count >= $minRatings) {
// Check warning threshold
$warningThreshold = $thresholds['warning_threshold'] ?? 3.0;
if ($newRating <= $warningThreshold && $originalRating > $warningThreshold) {
$rider->notify(new RiderWarningNotification($rider, 'low_rating'));
}
}
}
/**
* Handle verification change.
*/
protected function handleVerificationChange(Rider $rider): void
{
Log::info('Rider verification status changed', [
'rider_id' => $rider->id,
'is_verified' => $rider->is_verified,
]);
}
/**
* Handle the Rider "deleted" event.
*/
public function deleted(Rider $rider): void
{
Log::info('Rider deleted', [
'rider_id' => $rider->id,
]);
}
}