|
|
@@ -66,15 +66,17 @@ class DashboardService
|
|
|
->count(),
|
|
|
];
|
|
|
|
|
|
- $nextSchedules = Schedule::with('address:district,address,source_id,source,id,address_type')
|
|
|
+ $nextSchedules = Schedule::with([
|
|
|
+ 'address:district,address,source_id,source,id,address_type',
|
|
|
+ ])
|
|
|
->where('schedules.client_id', $cliente->id)
|
|
|
->whereIn('schedules.status', ['accepted', 'paid'])
|
|
|
->whereDate('schedules.date', '>=', now()->toDateString())
|
|
|
+ ->where('schedules.date', '>=', now()->toDateString())
|
|
|
->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
|
|
|
->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
|
|
|
->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
|
|
|
->leftJoin('media as provider_media', 'provider_media.id', '=', 'providers.profile_media_id')
|
|
|
- ->where('schedules.date', '>=', now()->toDateString())
|
|
|
->select(
|
|
|
'schedules.id',
|
|
|
'schedules.provider_id',
|
|
|
@@ -89,17 +91,27 @@ class DashboardService
|
|
|
'custom_schedules.address_type as custom_address_type',
|
|
|
'provider_media.path as provider_photo_path',
|
|
|
|
|
|
- DB::raw("(SELECT ci.cart_id FROM cart_items ci WHERE ci.schedule_id = schedules.id LIMIT 1) as cart_id"),
|
|
|
-
|
|
|
- DB::raw(
|
|
|
- "(SELECT COUNT(*) FROM cart_items ci_count
|
|
|
+ DB::raw("
|
|
|
+ (
|
|
|
+ SELECT ci.cart_id
|
|
|
+ FROM cart_items ci
|
|
|
+ WHERE ci.schedule_id = schedules.id
|
|
|
+ LIMIT 1
|
|
|
+ ) AS cart_id
|
|
|
+ "),
|
|
|
+
|
|
|
+ DB::raw("
|
|
|
+ (
|
|
|
+ SELECT COUNT(*)
|
|
|
+ FROM cart_items ci_count
|
|
|
WHERE ci_count.cart_id = (
|
|
|
- SELECT ci.cart_id FROM cart_items ci
|
|
|
- WHERE ci.schedule_id = schedules.id
|
|
|
- LIMIT 1
|
|
|
+ SELECT ci.cart_id
|
|
|
+ FROM cart_items ci
|
|
|
+ WHERE ci.schedule_id = schedules.id
|
|
|
+ LIMIT 1
|
|
|
)
|
|
|
- ) as cart_items_count"
|
|
|
- ),
|
|
|
+ ) AS cart_items_count
|
|
|
+ "),
|
|
|
)
|
|
|
->orderBy('schedules.date', 'asc')
|
|
|
->limit(5)
|
|
|
@@ -196,21 +208,34 @@ class DashboardService
|
|
|
$clientPrimaryAddress?->longitude !== null ? (float) $clientPrimaryAddress->longitude : null,
|
|
|
);
|
|
|
|
|
|
- $providersClose = Provider::leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
|
|
|
+ $providersClose = Provider::leftJoin(
|
|
|
+ 'users as provider_user',
|
|
|
+ 'provider_user.id',
|
|
|
+ '=',
|
|
|
+ 'providers.user_id'
|
|
|
+ )
|
|
|
->visibleToCustomers()
|
|
|
->leftJoin(
|
|
|
- DB::raw(
|
|
|
- "(SELECT DISTINCT ON (source_id) * FROM addresses
|
|
|
- WHERE source = 'provider'
|
|
|
+ DB::raw("
|
|
|
+ (
|
|
|
+ SELECT DISTINCT ON (source_id)
|
|
|
+ *
|
|
|
+ FROM addresses
|
|
|
+ WHERE source = 'provider'
|
|
|
AND deleted_at IS NULL
|
|
|
- ORDER BY source_id, is_primary DESC
|
|
|
- ) as provider_address"
|
|
|
- ),
|
|
|
+ ORDER BY source_id, is_primary DESC
|
|
|
+ ) AS provider_address
|
|
|
+ "),
|
|
|
'provider_address.source_id',
|
|
|
'=',
|
|
|
'providers.id'
|
|
|
)
|
|
|
- ->leftJoin('media as provider_media', 'provider_media.id', '=', 'providers.profile_media_id')
|
|
|
+ ->leftJoin(
|
|
|
+ 'media as provider_media',
|
|
|
+ 'provider_media.id',
|
|
|
+ '=',
|
|
|
+ 'providers.profile_media_id'
|
|
|
+ )
|
|
|
->whereNotNull('provider_address.id')
|
|
|
->where('provider_address.city_id', $clientPrimaryAddress?->city_id)
|
|
|
->whereNotIn('providers.id', $blockedProviderIds)
|
|
|
@@ -230,13 +255,16 @@ class DashboardService
|
|
|
'providers.daily_price_4h',
|
|
|
'providers.daily_price_2h',
|
|
|
|
|
|
- DB::raw(
|
|
|
- "(SELECT COUNT(*) FROM reviews
|
|
|
- LEFT JOIN schedules ON schedules.id = reviews.schedule_id
|
|
|
- WHERE reviews.origin = 'provider'
|
|
|
- AND schedules.provider_id = providers.id
|
|
|
- ) as total_reviews"
|
|
|
- ),
|
|
|
+ DB::raw("
|
|
|
+ (
|
|
|
+ SELECT COUNT(*)
|
|
|
+ FROM reviews
|
|
|
+ LEFT JOIN schedules
|
|
|
+ ON schedules.id = reviews.schedule_id
|
|
|
+ WHERE reviews.origin = 'provider'
|
|
|
+ AND schedules.provider_id = providers.id
|
|
|
+ ) AS total_reviews
|
|
|
+ "),
|
|
|
|
|
|
$providersCloseDistanceSelect,
|
|
|
|
|
|
@@ -258,7 +286,9 @@ class DashboardService
|
|
|
$item->daily_price_2h = $this->applyCreditCardFee($item->daily_price_2h);
|
|
|
});
|
|
|
|
|
|
- $pendingSchedules = Schedule::with('address:district,address,number,source_id,source,id,address_type')
|
|
|
+ $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')
|
|
|
@@ -276,27 +306,49 @@ class DashboardService
|
|
|
'schedules.start_time',
|
|
|
'schedules.end_time',
|
|
|
|
|
|
- DB::raw(
|
|
|
- "CASE
|
|
|
- WHEN (now() - schedules.created_at) < INTERVAL '1 hour' THEN CONCAT(ROUND(EXTRACT(EPOCH FROM (now() - schedules.created_at)) / 60), 'min')
|
|
|
- WHEN (now() - schedules.created_at) < INTERVAL '1 day' THEN CONCAT(ROUND(EXTRACT(EPOCH FROM (now() - schedules.created_at)) / 3600), 'h')
|
|
|
- ELSE CONCAT(ROUND(EXTRACT(EPOCH FROM (now() - schedules.created_at)) / 86400), 'd')
|
|
|
- END as time_since_request"
|
|
|
- ),
|
|
|
+ DB::raw("
|
|
|
+ CASE
|
|
|
+ WHEN (NOW() - schedules.created_at) < INTERVAL '1 hour' THEN
|
|
|
+ CONCAT(
|
|
|
+ ROUND(EXTRACT(EPOCH FROM (NOW() - schedules.created_at)) / 60),
|
|
|
+ 'min'
|
|
|
+ )
|
|
|
+ WHEN (NOW() - schedules.created_at) < INTERVAL '1 day' THEN
|
|
|
+ CONCAT(
|
|
|
+ ROUND(EXTRACT(EPOCH FROM (NOW() - schedules.created_at)) / 3600),
|
|
|
+ 'h'
|
|
|
+ )
|
|
|
+ ELSE
|
|
|
+ CONCAT(
|
|
|
+ ROUND(EXTRACT(EPOCH FROM (NOW() - schedules.created_at)) / 86400),
|
|
|
+ 'd'
|
|
|
+ )
|
|
|
+ END AS time_since_request
|
|
|
+ "),
|
|
|
|
|
|
'provider_media.path as provider_photo_path',
|
|
|
|
|
|
- DB::raw("(SELECT ci.cart_id FROM cart_items ci WHERE ci.schedule_id = schedules.id LIMIT 1) as cart_id"),
|
|
|
-
|
|
|
- DB::raw(
|
|
|
- "(SELECT COUNT(*) FROM cart_items ci_count
|
|
|
+ DB::raw("
|
|
|
+ (
|
|
|
+ SELECT ci.cart_id
|
|
|
+ FROM cart_items ci
|
|
|
+ WHERE ci.schedule_id = schedules.id
|
|
|
+ LIMIT 1
|
|
|
+ ) AS cart_id
|
|
|
+ "),
|
|
|
+
|
|
|
+ DB::raw("
|
|
|
+ (
|
|
|
+ SELECT COUNT(*)
|
|
|
+ FROM cart_items ci_count
|
|
|
WHERE ci_count.cart_id = (
|
|
|
- SELECT ci.cart_id FROM cart_items ci
|
|
|
- WHERE ci.schedule_id = schedules.id
|
|
|
- LIMIT 1
|
|
|
+ SELECT ci.cart_id
|
|
|
+ FROM cart_items ci
|
|
|
+ WHERE ci.schedule_id = schedules.id
|
|
|
+ LIMIT 1
|
|
|
)
|
|
|
- ) as cart_items_count"
|
|
|
- ),
|
|
|
+ ) AS cart_items_count
|
|
|
+ "),
|
|
|
)
|
|
|
->orderBy('schedules.date', 'asc')
|
|
|
->get();
|
|
|
@@ -315,25 +367,43 @@ class DashboardService
|
|
|
);
|
|
|
|
|
|
$schedulesProposals = ScheduleProposal::query()
|
|
|
- ->leftJoin('schedules', 'schedule_proposals.schedule_id', '=', 'schedules.id')
|
|
|
- ->leftJoin('providers', 'schedule_proposals.provider_id', '=', 'providers.id')
|
|
|
+ ->leftJoin(
|
|
|
+ 'schedules',
|
|
|
+ 'schedule_proposals.schedule_id',
|
|
|
+ '=',
|
|
|
+ 'schedules.id'
|
|
|
+ )
|
|
|
+ ->leftJoin(
|
|
|
+ 'providers',
|
|
|
+ 'schedule_proposals.provider_id',
|
|
|
+ '=',
|
|
|
+ 'providers.id'
|
|
|
+ )
|
|
|
->whereNotNull('providers.recipient_default_bank_account')
|
|
|
->whereRaw("providers.recipient_default_bank_account::text <> '{}'")
|
|
|
->whereRaw("providers.recipient_default_bank_account::text <> '[]'")
|
|
|
->leftJoin('users', 'providers.user_id', '=', 'users.id')
|
|
|
->leftJoin(
|
|
|
- DB::raw(
|
|
|
- "(SELECT DISTINCT ON (source_id) * FROM addresses
|
|
|
+ DB::raw("
|
|
|
+ (
|
|
|
+ SELECT DISTINCT ON (source_id)
|
|
|
+ *
|
|
|
+ FROM addresses
|
|
|
WHERE source = 'provider'
|
|
|
- AND deleted_at IS NULL
|
|
|
- ORDER BY source_id, is_primary DESC
|
|
|
- ) as provider_address"
|
|
|
- ),
|
|
|
+ AND deleted_at IS NULL
|
|
|
+ ORDER BY source_id, is_primary DESC
|
|
|
+ ) AS provider_address
|
|
|
+ "),
|
|
|
'provider_address.source_id',
|
|
|
'=',
|
|
|
'providers.id'
|
|
|
)
|
|
|
- ->leftJoin('media as provider_media', 'provider_media.id', '=', 'providers.profile_media_id')
|
|
|
+ ->leftJoin(
|
|
|
+ 'media as provider_media',
|
|
|
+ 'provider_media.id',
|
|
|
+ '=',
|
|
|
+ 'providers.profile_media_id'
|
|
|
+ )
|
|
|
->where('schedules.client_id', $cliente->id)
|
|
|
->where('schedules.schedule_type', 'custom')
|
|
|
->where('schedules.status', 'pending')
|
|
|
@@ -343,7 +413,9 @@ class DashboardService
|
|
|
->select([
|
|
|
'schedule_proposals.id',
|
|
|
|
|
|
- DB::raw("DATE_PART('year', AGE(providers.birth_date)) as idade"),
|
|
|
+ DB::raw("
|
|
|
+ DATE_PART('year', AGE(providers.birth_date)) AS idade
|
|
|
+ "),
|
|
|
|
|
|
'providers.id as provider_id',
|
|
|
'schedules.id as schedule_id',
|
|
|
@@ -379,7 +451,9 @@ class DashboardService
|
|
|
unset($item->provider_photo_path);
|
|
|
});
|
|
|
|
|
|
- $todaySchedules = Schedule::with('address:district,address,number,source_id,source,id,address_type')
|
|
|
+ $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', 'finished'])
|
|
|
->whereDate('schedules.date', now()->toDateString())
|
|
|
@@ -402,33 +476,47 @@ class DashboardService
|
|
|
'schedules.code',
|
|
|
'media.path as provider_photo',
|
|
|
|
|
|
- DB::raw("(SELECT ci.cart_id FROM cart_items ci WHERE ci.schedule_id = schedules.id LIMIT 1) as cart_id"),
|
|
|
-
|
|
|
- DB::raw(
|
|
|
- "(SELECT COUNT(*) FROM cart_items ci_count
|
|
|
+ DB::raw("
|
|
|
+ (
|
|
|
+ SELECT ci.cart_id
|
|
|
+ FROM cart_items ci
|
|
|
+ WHERE ci.schedule_id = schedules.id
|
|
|
+ LIMIT 1
|
|
|
+ ) AS cart_id
|
|
|
+ "),
|
|
|
+
|
|
|
+ DB::raw("
|
|
|
+ (
|
|
|
+ SELECT COUNT(*)
|
|
|
+ FROM cart_items ci_count
|
|
|
WHERE ci_count.cart_id = (
|
|
|
- SELECT ci.cart_id FROM cart_items ci
|
|
|
- WHERE ci.schedule_id = schedules.id
|
|
|
- LIMIT 1
|
|
|
+ SELECT ci.cart_id
|
|
|
+ FROM cart_items ci
|
|
|
+ WHERE ci.schedule_id = schedules.id
|
|
|
+ LIMIT 1
|
|
|
)
|
|
|
- ) as cart_items_count"
|
|
|
- ),
|
|
|
-
|
|
|
- DB::raw(
|
|
|
- "EXISTS(
|
|
|
- SELECT 1 FROM reviews
|
|
|
- WHERE reviews.schedule_id = schedules.id
|
|
|
- AND reviews.origin = 'client'
|
|
|
- AND reviews.origin_id = {$cliente->id}
|
|
|
- AND reviews.deleted_at IS NULL
|
|
|
- ) as client_reviewed"
|
|
|
- ),
|
|
|
+ ) AS cart_items_count
|
|
|
+ "),
|
|
|
+
|
|
|
+ DB::raw("
|
|
|
+ EXISTS (
|
|
|
+ SELECT 1
|
|
|
+ FROM reviews
|
|
|
+ WHERE reviews.schedule_id = schedules.id
|
|
|
+ AND reviews.origin = 'client'
|
|
|
+ AND reviews.origin_id = {$cliente->id}
|
|
|
+ AND reviews.deleted_at IS NULL
|
|
|
+ ) AS client_reviewed
|
|
|
+ "),
|
|
|
)
|
|
|
->orderBy('schedules.start_time', 'asc')
|
|
|
->get()
|
|
|
->map(function ($item) {
|
|
|
$item->provider_photo = $item->provider_photo
|
|
|
- ? Storage::temporaryUrl($item->provider_photo, now()->addMinutes(60))
|
|
|
+ ? Storage::temporaryUrl(
|
|
|
+ $item->provider_photo,
|
|
|
+ now()->addMinutes(60)
|
|
|
+ )
|
|
|
: null;
|
|
|
|
|
|
return $item;
|
|
|
@@ -453,81 +541,21 @@ class DashboardService
|
|
|
$hasPaymentMethods = ClientPaymentMethod::where('client_id', $cliente->id)->exists();
|
|
|
|
|
|
return [
|
|
|
- 'headerBar' => $headerBar,
|
|
|
- 'summaryInfos' => $summaryInfos,
|
|
|
- 'pendingSchedules' => $pendingSchedules,
|
|
|
- 'nextSchedules' => $nextSchedules,
|
|
|
- 'lastDoneSchedules' => $lastDoneSchedules,
|
|
|
- 'favoriteProviders' => $favoriteProviders,
|
|
|
- 'providersClose' => $providersClose,
|
|
|
- 'todaySchedules' => $todaySchedules,
|
|
|
- 'schedulesProposals' => $schedulesProposals,
|
|
|
+ 'headerBar' => $headerBar,
|
|
|
+ 'summaryInfos' => $summaryInfos,
|
|
|
+ 'pendingSchedules' => $pendingSchedules,
|
|
|
+ 'nextSchedules' => $nextSchedules,
|
|
|
+ 'lastDoneSchedules' => $lastDoneSchedules,
|
|
|
+ 'favoriteProviders' => $favoriteProviders,
|
|
|
+ 'providersClose' => $providersClose,
|
|
|
+ 'todaySchedules' => $todaySchedules,
|
|
|
+ 'schedulesProposals' => $schedulesProposals,
|
|
|
'customSchedulesNoProposals' => $custom_schedules_with_no_proposals,
|
|
|
- 'notifications' => $notifications,
|
|
|
- 'has_payment_methods' => $hasPaymentMethods,
|
|
|
+ 'notifications' => $notifications,
|
|
|
+ 'has_payment_methods' => $hasPaymentMethods,
|
|
|
];
|
|
|
}
|
|
|
|
|
|
- public function getScheduleClienteDetails(int $scheduleId): array
|
|
|
- {
|
|
|
- $user = Auth::user();
|
|
|
-
|
|
|
- $cliente = Client::where('user_id', $user->id)->firstOrFail();
|
|
|
-
|
|
|
- $schedule = Schedule::where('schedules.id', $scheduleId)
|
|
|
- ->where('schedules.client_id', $cliente->id)
|
|
|
- ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
|
|
|
- ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
|
|
|
- ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
|
|
|
- ->leftJoin('media', 'media.id', '=', 'providers.profile_media_id')
|
|
|
- ->select(
|
|
|
- 'schedules.provider_id',
|
|
|
- 'provider_user.name as provider_name',
|
|
|
- 'providers.birth_date as provider_birth_date',
|
|
|
- 'media.path as provider_photo',
|
|
|
- 'custom_schedules.offers_meal',
|
|
|
- )
|
|
|
- ->firstOrFail();
|
|
|
-
|
|
|
- $allSpecialities = Speciality::where('active', true)
|
|
|
- ->select('id', 'description')
|
|
|
- ->orderBy('description')
|
|
|
- ->get();
|
|
|
-
|
|
|
- $providerSpecialityIds = ProviderSpeciality::where('provider_id', $schedule->provider_id)
|
|
|
- ->pluck('speciality_id')
|
|
|
- ->all();
|
|
|
-
|
|
|
- $specialities = $allSpecialities->map(fn($sp) => [
|
|
|
- 'id' => $sp->id,
|
|
|
- 'description' => $sp->description,
|
|
|
- 'has_speciality' => in_array($sp->id, $providerSpecialityIds),
|
|
|
- ])->values();
|
|
|
-
|
|
|
- return [
|
|
|
- 'provider_name' => $schedule->provider_name,
|
|
|
- 'provider_birth_date' => $schedule->provider_birth_date,
|
|
|
- 'offers_meal' => $schedule->offers_meal,
|
|
|
- 'specialities' => $specialities,
|
|
|
-
|
|
|
- 'provider_photo' => $schedule->provider_photo
|
|
|
- ? Storage::temporaryUrl($schedule->provider_photo, now()->addMinutes(60))
|
|
|
- : null,
|
|
|
- ];
|
|
|
- }
|
|
|
-
|
|
|
- // aplicação da taxa
|
|
|
- private function applyCreditCardFee(?float $price): ?float
|
|
|
- {
|
|
|
- if ($price === null) {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- $rate = (float) config('services.pagarme.platform_credit_card_fee_rate');
|
|
|
-
|
|
|
- return round($price * (1 + $rate), 2);
|
|
|
- }
|
|
|
-
|
|
|
public function dadosDashboardPrestador(): array
|
|
|
{
|
|
|
$user = Auth::user();
|
|
|
@@ -568,7 +596,9 @@ class DashboardService
|
|
|
'your_price' => $priceActual,
|
|
|
];
|
|
|
|
|
|
- $solicitations = Schedule::with('address:district,source_id,source,id,latitude,longitude')
|
|
|
+ $solicitations = Schedule::with([
|
|
|
+ 'address:district,source_id,source,id,latitude,longitude',
|
|
|
+ ])
|
|
|
->where('schedules.provider_id', $provider->id)
|
|
|
->where('schedules.status', 'pending')
|
|
|
->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
|
|
|
@@ -581,7 +611,9 @@ class DashboardService
|
|
|
'clients.average_rating',
|
|
|
'schedules.date',
|
|
|
|
|
|
- DB::raw("TO_CHAR(schedules.date, 'DD/MM/YYYY') as formatted_date"),
|
|
|
+ DB::raw("
|
|
|
+ TO_CHAR(schedules.date, 'DD/MM/YYYY') AS formatted_date
|
|
|
+ "),
|
|
|
|
|
|
'schedules.start_time',
|
|
|
'schedules.end_time',
|
|
|
@@ -593,12 +625,28 @@ class DashboardService
|
|
|
'custom_schedules.offers_meal',
|
|
|
'client_media.path as customer_photo_path',
|
|
|
|
|
|
- DB::raw(
|
|
|
- "CASE
|
|
|
- WHEN (now() - schedules.created_at) < INTERVAL '1 day' THEN CONCAT(ROUND(EXTRACT(EPOCH FROM (now() - schedules.created_at)) / 3600), ' hours ago')
|
|
|
- ELSE CONCAT(ROUND(EXTRACT(EPOCH FROM (now() - schedules.created_at)) / 86400), ' days ago')
|
|
|
- END as time_since_request"
|
|
|
- ),
|
|
|
+ DB::raw("
|
|
|
+ CASE
|
|
|
+ WHEN (NOW() - schedules.created_at) < INTERVAL '1 day' THEN
|
|
|
+ CONCAT(
|
|
|
+ ROUND(
|
|
|
+ EXTRACT(
|
|
|
+ EPOCH FROM (NOW() - schedules.created_at)
|
|
|
+ ) / 3600
|
|
|
+ ),
|
|
|
+ ' hours ago'
|
|
|
+ )
|
|
|
+ ELSE
|
|
|
+ CONCAT(
|
|
|
+ ROUND(
|
|
|
+ EXTRACT(
|
|
|
+ EPOCH FROM (NOW() - schedules.created_at)
|
|
|
+ ) / 86400
|
|
|
+ ),
|
|
|
+ ' days ago'
|
|
|
+ )
|
|
|
+ END AS time_since_request
|
|
|
+ "),
|
|
|
)
|
|
|
->orderBy('schedules.date', 'asc')
|
|
|
->get();
|
|
|
@@ -621,7 +669,9 @@ class DashboardService
|
|
|
);
|
|
|
});
|
|
|
|
|
|
- $todayServices = Schedule::with('address:district,address,number,source_id,source,id')
|
|
|
+ $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())
|
|
|
@@ -646,15 +696,16 @@ class DashboardService
|
|
|
'custom_schedules.offers_meal',
|
|
|
'client_media.path as customer_photo_path',
|
|
|
|
|
|
- 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("
|
|
|
+ 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
|
|
|
+ "),
|
|
|
)
|
|
|
->orderBy('schedules.start_time', 'asc')
|
|
|
->get();
|
|
|
@@ -707,36 +758,6 @@ class DashboardService
|
|
|
);
|
|
|
});
|
|
|
|
|
|
- // $opportunities = Schedule::with('address:district,source_id,source,id')
|
|
|
- // ->where('schedules.schedule_type', 'custom')
|
|
|
- // ->where('schedules.status', 'pending')
|
|
|
- // ->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',
|
|
|
- // 'custom_schedules.id as custom_schedule_id',
|
|
|
- // 'client_user.name as client_name',
|
|
|
- // 'clients.average_rating',
|
|
|
- // 'schedules.date',
|
|
|
- // 'schedules.start_time',
|
|
|
- // 'schedules.end_time',
|
|
|
- // 'schedules.period_type',
|
|
|
- // 'schedules.schedule_type',
|
|
|
- // 'schedules.address_id',
|
|
|
- // 'custom_schedules.address_type',
|
|
|
- // DB::raw("CASE
|
|
|
- // WHEN schedules.period_type = '2' THEN {$provider->daily_price_2h}
|
|
|
- // WHEN schedules.period_type = '4' THEN {$provider->daily_price_4h}
|
|
|
- // WHEN schedules.period_type = '6' THEN {$provider->daily_price_6h}
|
|
|
- // WHEN schedules.period_type = '8' THEN {$provider->daily_price_8h}
|
|
|
- // ELSE 0
|
|
|
- // END as total_amount"),
|
|
|
- // )
|
|
|
- // ->orderBy('schedules.date', 'asc')
|
|
|
- // ->get();
|
|
|
-
|
|
|
$notifications = Notification::where('user_id', $user->id)
|
|
|
->orderBy('read', 'asc')
|
|
|
->orderBy('created_at', 'desc')
|
|
|
@@ -773,6 +794,67 @@ class DashboardService
|
|
|
];
|
|
|
}
|
|
|
|
|
|
+ public function getScheduleClienteDetails(int $scheduleId): array
|
|
|
+ {
|
|
|
+ $user = Auth::user();
|
|
|
+
|
|
|
+ $cliente = Client::where('user_id', $user->id)->firstOrFail();
|
|
|
+
|
|
|
+ $schedule = Schedule::where('schedules.id', $scheduleId)
|
|
|
+ ->where('schedules.client_id', $cliente->id)
|
|
|
+ ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
|
|
|
+ ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
|
|
|
+ ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
|
|
|
+ ->leftJoin('media', 'media.id', '=', 'providers.profile_media_id')
|
|
|
+ ->select(
|
|
|
+ 'schedules.provider_id',
|
|
|
+ 'provider_user.name as provider_name',
|
|
|
+ 'providers.birth_date as provider_birth_date',
|
|
|
+ 'media.path as provider_photo',
|
|
|
+ 'custom_schedules.offers_meal',
|
|
|
+ )
|
|
|
+ ->firstOrFail();
|
|
|
+
|
|
|
+ $allSpecialities = Speciality::where('active', true)
|
|
|
+ ->select('id', 'description')
|
|
|
+ ->orderBy('description')
|
|
|
+ ->get();
|
|
|
+
|
|
|
+ $providerSpecialityIds = ProviderSpeciality::where('provider_id', $schedule->provider_id)
|
|
|
+ ->pluck('speciality_id')
|
|
|
+ ->all();
|
|
|
+
|
|
|
+ $specialities = $allSpecialities->map(fn($sp) => [
|
|
|
+ 'id' => $sp->id,
|
|
|
+ 'description' => $sp->description,
|
|
|
+ 'has_speciality' => in_array($sp->id, $providerSpecialityIds),
|
|
|
+ ])->values();
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'provider_name' => $schedule->provider_name,
|
|
|
+ 'provider_birth_date' => $schedule->provider_birth_date,
|
|
|
+ 'offers_meal' => $schedule->offers_meal,
|
|
|
+ 'specialities' => $specialities,
|
|
|
+
|
|
|
+ 'provider_photo' => $schedule->provider_photo
|
|
|
+ ? Storage::temporaryUrl($schedule->provider_photo, now()->addMinutes(60))
|
|
|
+ : null,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ private function applyCreditCardFee(?float $price): ?float
|
|
|
+ {
|
|
|
+ if ($price === null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ $rate = (float) config('services.pagarme.platform_credit_card_fee_rate');
|
|
|
+
|
|
|
+ return round($price * (1 + $rate), 2);
|
|
|
+ }
|
|
|
+
|
|
|
private function distanceSelect(?float $clientLatitude, ?float $clientLongitude): \Illuminate\Contracts\Database\Query\Expression
|
|
|
{
|
|
|
return DistanceService::sqlExpression($clientLatitude, $clientLongitude);
|