|
|
@@ -11,6 +11,7 @@ use App\Models\ClientFavoriteProvider;
|
|
|
use App\Models\ClientPaymentMethod;
|
|
|
use App\Models\Notification;
|
|
|
use App\Models\Provider;
|
|
|
+use App\Models\ProviderSpeciality;
|
|
|
use App\Models\Review;
|
|
|
use App\Models\Schedule;
|
|
|
use App\Models\ScheduleProposal;
|
|
|
@@ -93,7 +94,7 @@ class DashboardService
|
|
|
'schedules.address_id',
|
|
|
'custom_schedules.address_type as custom_address_type',
|
|
|
|
|
|
- DB::raw("
|
|
|
+ DB::raw("
|
|
|
(
|
|
|
SELECT spi.service_package_id
|
|
|
FROM service_package_items spi
|
|
|
@@ -102,7 +103,7 @@ class DashboardService
|
|
|
) AS service_package_id
|
|
|
"),
|
|
|
|
|
|
- DB::raw("
|
|
|
+ DB::raw("
|
|
|
(
|
|
|
SELECT COUNT(*)
|
|
|
FROM service_package_items spi_count
|
|
|
@@ -114,10 +115,10 @@ class DashboardService
|
|
|
)
|
|
|
) AS service_package_items_count
|
|
|
"),
|
|
|
- )
|
|
|
- ->orderBy('schedules.date', 'asc')
|
|
|
- ->limit(5)
|
|
|
- ->get();
|
|
|
+ )
|
|
|
+ ->orderBy('schedules.date', 'asc')
|
|
|
+ ->limit(5)
|
|
|
+ ->get();
|
|
|
|
|
|
$nextSchedules->each(function ($item) {
|
|
|
$item->gender_label = GenderEnum::labelFor($item->gender);
|
|
|
@@ -131,25 +132,25 @@ class DashboardService
|
|
|
$lastDoneSchedules = Schedule::joinSub($latestPerProvider, 'latest', function ($join) {
|
|
|
$join->on('schedules.id', '=', 'latest.max_id');
|
|
|
})
|
|
|
- ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
|
|
|
- ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
|
|
|
- ->leftJoinSub(
|
|
|
- Address::preferredForProvider(),
|
|
|
- 'provider_address',
|
|
|
- fn($join) =>
|
|
|
- $join->on('provider_address.source_id', '=', 'providers.id')
|
|
|
- ->where('provider_address.rn', 1)
|
|
|
- )
|
|
|
- ->select(
|
|
|
- 'schedules.id',
|
|
|
- 'schedules.provider_id',
|
|
|
- 'provider_user.name as provider_name',
|
|
|
- 'providers.gender',
|
|
|
- 'provider_address.district as provider_district',
|
|
|
- )
|
|
|
- ->orderBy('schedules.date', 'desc')
|
|
|
- ->limit(5)
|
|
|
- ->get();
|
|
|
+ ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
|
|
|
+ ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
|
|
|
+ ->leftJoinSub(
|
|
|
+ Address::preferredForProvider(),
|
|
|
+ 'provider_address',
|
|
|
+ fn($join) =>
|
|
|
+ $join->on('provider_address.source_id', '=', 'providers.id')
|
|
|
+ ->where('provider_address.rn', 1)
|
|
|
+ )
|
|
|
+ ->select(
|
|
|
+ 'schedules.id',
|
|
|
+ 'schedules.provider_id',
|
|
|
+ 'provider_user.name as provider_name',
|
|
|
+ 'providers.gender',
|
|
|
+ 'provider_address.district as provider_district',
|
|
|
+ )
|
|
|
+ ->orderBy('schedules.date', 'desc')
|
|
|
+ ->limit(5)
|
|
|
+ ->get();
|
|
|
|
|
|
$lastDoneSchedules->each(function ($item) {
|
|
|
$item->gender_label = GenderEnum::labelFor($item->gender);
|
|
|
@@ -205,7 +206,7 @@ class DashboardService
|
|
|
data_get($clientCoordinates, 'longitude'),
|
|
|
);
|
|
|
|
|
|
- $providerAddressLatestSubquery = DB::raw("
|
|
|
+ $providerAddressLatestSubquery = DB::raw("
|
|
|
(
|
|
|
SELECT DISTINCT ON (source_id)
|
|
|
*
|
|
|
@@ -258,7 +259,7 @@ class DashboardService
|
|
|
'providers.daily_price_4h',
|
|
|
'providers.daily_price_2h',
|
|
|
|
|
|
- DB::raw("
|
|
|
+ DB::raw("
|
|
|
(
|
|
|
SELECT COUNT(*)
|
|
|
FROM reviews
|
|
|
@@ -269,10 +270,10 @@ class DashboardService
|
|
|
) AS total_reviews
|
|
|
"),
|
|
|
|
|
|
- $providersCloseDistanceSelect,
|
|
|
- )
|
|
|
- ->orderByRaw('distance_km ASC NULLS LAST')
|
|
|
- ->get();
|
|
|
+ $providersCloseDistanceSelect,
|
|
|
+ )
|
|
|
+ ->orderByRaw('distance_km ASC NULLS LAST')
|
|
|
+ ->get();
|
|
|
|
|
|
$this->zipCodeCoordinatesService->preload(
|
|
|
$providersClose->whereNull('distance_km')->pluck('provider_zip_code')
|
|
|
@@ -319,30 +320,31 @@ class DashboardService
|
|
|
});
|
|
|
|
|
|
$providersClose = $providersClose
|
|
|
+ ->sortBy(fn($provider) => $provider->distance_km ?? PHP_FLOAT_MAX)
|
|
|
->sortBy(fn($provider) => $provider->distance_km ?? PHP_FLOAT_MAX)
|
|
|
->values();
|
|
|
|
|
|
$pendingSchedules = Schedule::with([
|
|
|
'address:district,address,number,source_id,source,id,address_type',
|
|
|
])
|
|
|
- ->where('schedules.client_id', $cliente->id)
|
|
|
- ->whereIn('schedules.status', ['pending', 'accepted'])
|
|
|
- ->where('schedules.schedule_type', 'default')
|
|
|
- ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
|
|
|
- ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
|
|
|
- ->select(
|
|
|
- 'schedules.id',
|
|
|
- 'schedules.provider_id',
|
|
|
- 'provider_user.name as provider_name',
|
|
|
- 'providers.gender',
|
|
|
- 'schedules.date',
|
|
|
- 'schedules.address_id',
|
|
|
- 'schedules.status',
|
|
|
- 'schedules.total_amount',
|
|
|
- 'schedules.start_time',
|
|
|
- 'schedules.end_time',
|
|
|
-
|
|
|
- DB::raw("
|
|
|
+ ->where('schedules.client_id', $cliente->id)
|
|
|
+ ->whereIn('schedules.status', ['pending', 'accepted'])
|
|
|
+ ->where('schedules.schedule_type', 'default')
|
|
|
+ ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
|
|
|
+ ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
|
|
|
+ ->select(
|
|
|
+ 'schedules.id',
|
|
|
+ 'schedules.provider_id',
|
|
|
+ 'provider_user.name as provider_name',
|
|
|
+ 'providers.gender',
|
|
|
+ 'schedules.date',
|
|
|
+ 'schedules.address_id',
|
|
|
+ 'schedules.status',
|
|
|
+ 'schedules.total_amount',
|
|
|
+ 'schedules.start_time',
|
|
|
+ 'schedules.end_time',
|
|
|
+
|
|
|
+ DB::raw("
|
|
|
CASE
|
|
|
WHEN (NOW() - schedules.created_at) < INTERVAL '1 hour' THEN
|
|
|
CONCAT(
|
|
|
@@ -362,7 +364,7 @@ class DashboardService
|
|
|
END AS time_since_request
|
|
|
"),
|
|
|
|
|
|
- DB::raw("
|
|
|
+ DB::raw("
|
|
|
(
|
|
|
SELECT spi.service_package_id
|
|
|
FROM service_package_items spi
|
|
|
@@ -371,7 +373,7 @@ class DashboardService
|
|
|
) AS service_package_id
|
|
|
"),
|
|
|
|
|
|
- DB::raw("
|
|
|
+ DB::raw("
|
|
|
(
|
|
|
SELECT COUNT(*)
|
|
|
FROM service_package_items spi_count
|
|
|
@@ -383,9 +385,9 @@ class DashboardService
|
|
|
)
|
|
|
) AS service_package_items_count
|
|
|
"),
|
|
|
- )
|
|
|
- ->orderBy('schedules.date', 'asc')
|
|
|
- ->get();
|
|
|
+ )
|
|
|
+ ->orderBy('schedules.date', 'asc')
|
|
|
+ ->get();
|
|
|
|
|
|
$pendingSchedules->each(function ($item) {
|
|
|
$item->gender_label = GenderEnum::labelFor($item->gender);
|
|
|
@@ -498,28 +500,28 @@ class DashboardService
|
|
|
$todaySchedules = Schedule::with([
|
|
|
'address:district,address,number,source_id,source,id,address_type',
|
|
|
])
|
|
|
- ->where('schedules.client_id', $cliente->id)
|
|
|
- ->whereIn('schedules.status', ['accepted', 'paid', 'started', 'cancelled', 'finished'])
|
|
|
- ->whereDate('schedules.date', now()->toDateString())
|
|
|
- ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
|
|
|
- ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
|
|
|
- ->select(
|
|
|
- 'schedules.id',
|
|
|
- 'schedules.provider_id',
|
|
|
- 'provider_user.name as provider_name',
|
|
|
- 'providers.gender',
|
|
|
- 'schedules.date',
|
|
|
- 'schedules.start_time',
|
|
|
- 'schedules.end_time',
|
|
|
- 'schedules.total_amount',
|
|
|
- 'schedules.period_type',
|
|
|
- 'schedules.schedule_type',
|
|
|
- 'schedules.address_id',
|
|
|
- 'schedules.status',
|
|
|
- 'schedules.code_verified',
|
|
|
- 'schedules.code',
|
|
|
-
|
|
|
- DB::raw("
|
|
|
+ ->where('schedules.client_id', $cliente->id)
|
|
|
+ ->whereIn('schedules.status', ['accepted', 'paid', 'started', 'cancelled', 'finished'])
|
|
|
+ ->whereDate('schedules.date', now()->toDateString())
|
|
|
+ ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
|
|
|
+ ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
|
|
|
+ ->select(
|
|
|
+ 'schedules.id',
|
|
|
+ 'schedules.provider_id',
|
|
|
+ 'provider_user.name as provider_name',
|
|
|
+ 'providers.gender',
|
|
|
+ 'schedules.date',
|
|
|
+ 'schedules.start_time',
|
|
|
+ 'schedules.end_time',
|
|
|
+ 'schedules.total_amount',
|
|
|
+ 'schedules.period_type',
|
|
|
+ 'schedules.schedule_type',
|
|
|
+ 'schedules.address_id',
|
|
|
+ 'schedules.status',
|
|
|
+ 'schedules.code_verified',
|
|
|
+ 'schedules.code',
|
|
|
+
|
|
|
+ DB::raw("
|
|
|
(
|
|
|
SELECT spi.service_package_id
|
|
|
FROM service_package_items spi
|
|
|
@@ -528,7 +530,7 @@ class DashboardService
|
|
|
) AS service_package_id
|
|
|
"),
|
|
|
|
|
|
- DB::raw("
|
|
|
+ DB::raw("
|
|
|
(
|
|
|
SELECT COUNT(*)
|
|
|
FROM service_package_items spi_count
|
|
|
@@ -541,7 +543,7 @@ class DashboardService
|
|
|
) AS service_package_items_count
|
|
|
"),
|
|
|
|
|
|
- DB::raw("
|
|
|
+ DB::raw("
|
|
|
EXISTS (
|
|
|
SELECT 1
|
|
|
FROM reviews
|
|
|
@@ -551,14 +553,14 @@ class DashboardService
|
|
|
AND reviews.deleted_at IS NULL
|
|
|
) AS client_reviewed
|
|
|
"),
|
|
|
- )
|
|
|
- ->orderBy('schedules.start_time', 'asc')
|
|
|
- ->get()
|
|
|
- ->map(function ($item) {
|
|
|
+ )
|
|
|
+ ->orderBy('schedules.start_time', 'asc')
|
|
|
+ ->get()
|
|
|
+ ->map(function ($item) {
|
|
|
$item->gender_label = GenderEnum::labelFor($item->gender);
|
|
|
|
|
|
- return $item;
|
|
|
- });
|
|
|
+ return $item;
|
|
|
+ });
|
|
|
|
|
|
$providerCollections = collect([
|
|
|
$nextSchedules,
|
|
|
@@ -671,32 +673,32 @@ class DashboardService
|
|
|
'address:district,source_id,source,id,zip_code,latitude,longitude',
|
|
|
'customSchedule.specialities',
|
|
|
])
|
|
|
- ->where('schedules.provider_id', $provider->id)
|
|
|
- ->where('schedules.status', 'pending')
|
|
|
- ->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
|
|
|
- ->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
|
|
|
- ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
|
|
|
- ->select(
|
|
|
- 'schedules.id',
|
|
|
- 'schedules.client_id',
|
|
|
- 'client_user.name as client_name',
|
|
|
- 'clients.average_rating',
|
|
|
- 'schedules.date',
|
|
|
-
|
|
|
- DB::raw("
|
|
|
+ ->where('schedules.provider_id', $provider->id)
|
|
|
+ ->where('schedules.status', 'pending')
|
|
|
+ ->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
|
|
|
+ ->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
|
|
|
+ ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
|
|
|
+ ->select(
|
|
|
+ 'schedules.id',
|
|
|
+ 'schedules.client_id',
|
|
|
+ 'client_user.name as client_name',
|
|
|
+ 'clients.average_rating',
|
|
|
+ 'schedules.date',
|
|
|
+
|
|
|
+ DB::raw("
|
|
|
TO_CHAR(schedules.date, 'DD/MM/YYYY') AS formatted_date
|
|
|
"),
|
|
|
|
|
|
- 'schedules.start_time',
|
|
|
- 'schedules.end_time',
|
|
|
- 'schedules.total_amount',
|
|
|
- 'schedules.period_type',
|
|
|
- 'schedules.schedule_type',
|
|
|
- 'schedules.address_id',
|
|
|
- 'schedules.status',
|
|
|
- 'custom_schedules.offers_meal',
|
|
|
+ 'schedules.start_time',
|
|
|
+ 'schedules.end_time',
|
|
|
+ 'schedules.total_amount',
|
|
|
+ 'schedules.period_type',
|
|
|
+ 'schedules.schedule_type',
|
|
|
+ 'schedules.address_id',
|
|
|
+ 'schedules.status',
|
|
|
+ 'custom_schedules.offers_meal',
|
|
|
|
|
|
- DB::raw("
|
|
|
+ DB::raw("
|
|
|
CASE
|
|
|
WHEN (NOW() - schedules.created_at) < INTERVAL '1 day' THEN
|
|
|
CONCAT(
|
|
|
@@ -719,7 +721,7 @@ class DashboardService
|
|
|
END AS time_since_request
|
|
|
"),
|
|
|
|
|
|
- DB::raw("
|
|
|
+ DB::raw("
|
|
|
(
|
|
|
SELECT service_package_items.service_package_id
|
|
|
FROM service_package_items
|
|
|
@@ -727,9 +729,9 @@ class DashboardService
|
|
|
LIMIT 1
|
|
|
) AS service_package_id
|
|
|
"),
|
|
|
- )
|
|
|
- ->orderBy('schedules.date', 'asc')
|
|
|
- ->get()
|
|
|
+ )
|
|
|
+ ->orderBy('schedules.date', 'asc')
|
|
|
+ ->get()
|
|
|
->append('specialities')
|
|
|
->makeHidden('customSchedule');
|
|
|
|
|
|
@@ -747,9 +749,58 @@ class DashboardService
|
|
|
$todayServices = Schedule::with([
|
|
|
'address:district,address,number,source_id,source,id',
|
|
|
])
|
|
|
+ ->where('schedules.provider_id', $provider->id)
|
|
|
+ ->whereIn('schedules.status', ['accepted', 'paid', 'started', 'finished'])
|
|
|
+ ->whereDate('schedules.date', now()->toDateString())
|
|
|
+ ->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
|
|
|
+ ->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
|
|
|
+ ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
|
|
|
+ ->select(
|
|
|
+ 'schedules.id',
|
|
|
+ 'schedules.client_id',
|
|
|
+ 'client_user.name as client_name',
|
|
|
+ 'schedules.date',
|
|
|
+ 'schedules.start_time',
|
|
|
+ 'schedules.end_time',
|
|
|
+ 'schedules.total_amount',
|
|
|
+ 'schedules.period_type',
|
|
|
+ 'schedules.address_id',
|
|
|
+ 'schedules.schedule_type',
|
|
|
+ 'schedules.status',
|
|
|
+ 'schedules.code_verified',
|
|
|
+ 'schedules.code',
|
|
|
+ 'custom_schedules.offers_meal',
|
|
|
+
|
|
|
+ DB::raw("
|
|
|
+ EXISTS (
|
|
|
+ SELECT 1
|
|
|
+ FROM reviews
|
|
|
+ WHERE reviews.schedule_id = schedules.id
|
|
|
+ AND reviews.origin = 'provider'
|
|
|
+ AND reviews.origin_id = {$provider->id}
|
|
|
+ AND reviews.deleted_at IS NULL
|
|
|
+ ) AS provider_reviewed
|
|
|
+ "),
|
|
|
+
|
|
|
+ DB::raw("
|
|
|
+ (
|
|
|
+ SELECT service_package_items.service_package_id
|
|
|
+ FROM service_package_items
|
|
|
+ WHERE service_package_items.schedule_id = schedules.id
|
|
|
+ LIMIT 1
|
|
|
+ ) AS service_package_id
|
|
|
+ "),
|
|
|
+ )
|
|
|
+ ->orderBy('schedules.start_time', 'asc')
|
|
|
+ ->get();
|
|
|
+
|
|
|
+
|
|
|
+ $pendingConfirmation = Schedule::with(
|
|
|
+ 'address:district,address,number,source_id,source,id,zip_code,latitude,longitude'
|
|
|
+ )
|
|
|
->where('schedules.provider_id', $provider->id)
|
|
|
- ->whereIn('schedules.status', ['accepted', 'paid', 'started', 'finished'])
|
|
|
- ->whereDate('schedules.date', now()->toDateString())
|
|
|
+ ->where('schedules.status', 'accepted')
|
|
|
+ ->whereDate('schedules.date', '>=', now()->toDateString())
|
|
|
->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
|
|
|
->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
|
|
|
->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
|
|
|
@@ -765,36 +816,34 @@ class DashboardService
|
|
|
'schedules.address_id',
|
|
|
'schedules.schedule_type',
|
|
|
'schedules.status',
|
|
|
- 'schedules.code_verified',
|
|
|
- 'schedules.code',
|
|
|
'custom_schedules.offers_meal',
|
|
|
|
|
|
DB::raw("
|
|
|
- EXISTS (
|
|
|
- SELECT 1
|
|
|
- FROM reviews
|
|
|
- WHERE reviews.schedule_id = schedules.id
|
|
|
- AND reviews.origin = 'provider'
|
|
|
- AND reviews.origin_id = {$provider->id}
|
|
|
- AND reviews.deleted_at IS NULL
|
|
|
- ) AS provider_reviewed
|
|
|
- "),
|
|
|
-
|
|
|
- DB::raw("
|
|
|
- (
|
|
|
- SELECT service_package_items.service_package_id
|
|
|
- FROM service_package_items
|
|
|
- WHERE service_package_items.schedule_id = schedules.id
|
|
|
- LIMIT 1
|
|
|
- ) AS service_package_id
|
|
|
- "),
|
|
|
+ (
|
|
|
+ SELECT service_package_items.service_package_id
|
|
|
+ FROM service_package_items
|
|
|
+ WHERE service_package_items.schedule_id = schedules.id
|
|
|
+ LIMIT 1
|
|
|
+ ) AS service_package_id
|
|
|
+ "),
|
|
|
)
|
|
|
- ->orderBy('schedules.start_time', 'asc')
|
|
|
+ ->orderBy('schedules.date', 'asc')
|
|
|
->get();
|
|
|
|
|
|
+ $pendingConfirmation->each(function ($schedule) use ($address) {
|
|
|
+ $schedule->distance_km = $this->zipCodeCoordinatesService->calculateDistance(
|
|
|
+ $address?->latitude !== null ? (float) $address->latitude : null,
|
|
|
+ $address?->longitude !== null ? (float) $address->longitude : null,
|
|
|
+ $address?->zip_code,
|
|
|
+ $schedule->address?->latitude !== null ? (float) $schedule->address->latitude : null,
|
|
|
+ $schedule->address?->longitude !== null ? (float) $schedule->address->longitude : null,
|
|
|
+ $schedule->address?->zip_code,
|
|
|
+ );
|
|
|
+ });
|
|
|
+
|
|
|
$nextSchedules = Schedule::with('address:district,address,number,source_id,source,id,zip_code,latitude,longitude')
|
|
|
->where('schedules.provider_id', $provider->id)
|
|
|
- ->whereIn('schedules.status', ['accepted', 'paid'])
|
|
|
+ ->where('schedules.status', 'paid')
|
|
|
->whereDate('schedules.date', '>=', now()->toDateString())
|
|
|
->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
|
|
|
->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
|
|
|
@@ -839,7 +888,8 @@ class DashboardService
|
|
|
$clientCollections = collect([
|
|
|
$solicitations,
|
|
|
$todayServices,
|
|
|
- $nextSchedules,
|
|
|
+ $pendingConfirmation,
|
|
|
+ $nextSchedules
|
|
|
]);
|
|
|
|
|
|
$clientPhotoUrls = $this->clientPhotoUrls(
|
|
|
@@ -884,6 +934,7 @@ class DashboardService
|
|
|
'priceSuggested' => $priceSuggested,
|
|
|
'solicitations' => $solicitations,
|
|
|
'todayServices' => $todayServices,
|
|
|
+ 'pendingConfirmation' => $pendingConfirmation,
|
|
|
'nextSchedules' => $nextSchedules,
|
|
|
'opportunities' => $opportunities,
|
|
|
'notifications' => $notifications,
|