|
|
@@ -64,16 +64,23 @@ class DashboardService
|
|
|
'custom_schedules.address_type as custom_address_type',
|
|
|
)
|
|
|
->orderBy('schedules.date', 'asc')
|
|
|
+ ->limit(5)
|
|
|
->get();
|
|
|
|
|
|
$lastDoneSchedules = Schedule::where('schedules.client_id', $cliente->id)
|
|
|
->where('schedules.status', 'finished')
|
|
|
->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
|
|
|
->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
|
|
|
+ ->leftJoin('addresses as provider_address', function ($join) {
|
|
|
+ $join->on('provider_address.source_id', '=', 'providers.id')
|
|
|
+ ->where('provider_address.source', 'provider')
|
|
|
+ ->orderBy('provider_address.is_primary', 'desc');
|
|
|
+ })
|
|
|
->select(
|
|
|
'schedules.id',
|
|
|
'schedules.provider_id',
|
|
|
'provider_user.name as provider_name',
|
|
|
+ 'provider_address.district as provider_district',
|
|
|
)
|
|
|
->orderBy('schedules.date', 'desc')
|
|
|
->limit(5)
|
|
|
@@ -82,6 +89,11 @@ class DashboardService
|
|
|
$favoriteProviders = ClientFavoriteProvider::where('client_favorite_providers.client_id', $cliente->id)
|
|
|
->leftJoin('providers', 'providers.id', '=', 'client_favorite_providers.provider_id')
|
|
|
->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
|
|
|
+ ->leftJoin('addresses as provider_address', function ($join) {
|
|
|
+ $join->on('provider_address.source_id', '=', 'providers.id')
|
|
|
+ ->where('provider_address.source', 'provider')
|
|
|
+ ->orderBy('provider_address.is_primary', 'desc');
|
|
|
+ })
|
|
|
->select(
|
|
|
'providers.id as provider_id',
|
|
|
'provider_user.name as provider_name',
|
|
|
@@ -90,14 +102,17 @@ class DashboardService
|
|
|
'providers.daily_price_6h',
|
|
|
'providers.daily_price_4h',
|
|
|
'providers.daily_price_2h',
|
|
|
+ 'provider_address.district as provider_district',
|
|
|
)
|
|
|
+ ->orderBy('client_favorite_providers.created_at', 'desc')
|
|
|
+ ->limit(5)
|
|
|
->get();
|
|
|
|
|
|
$blockedProviderIds = ScheduleBusinessRules::getBlockedProviderIdsForClient($cliente->id);
|
|
|
$providersWithWorkingDays = ScheduleBusinessRules::getProviderIdsWithWorkingDays();
|
|
|
- $clientAddress = Address::where('source', 'client')
|
|
|
+ $clientPrimaryAddress = Address::where('source', 'client')
|
|
|
->where('source_id', $cliente->id)
|
|
|
- ->orderBy('is_primary', 'desc')
|
|
|
+ ->where('is_primary', true)
|
|
|
->first();
|
|
|
|
|
|
$providersClose = Provider::leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
|
|
|
@@ -107,22 +122,26 @@ class DashboardService
|
|
|
*
|
|
|
FROM addresses
|
|
|
WHERE source = 'provider'
|
|
|
+ AND deleted_at IS NULL
|
|
|
ORDER BY source_id, is_primary DESC
|
|
|
) as provider_address
|
|
|
"), 'provider_address.source_id', '=', 'providers.id')
|
|
|
- ->where('provider_address.city_id', '=', $clientAddress->city_id)
|
|
|
+ ->whereNotNull('provider_address.id')
|
|
|
+ ->where('provider_address.city_id', $clientPrimaryAddress?->city_id)
|
|
|
->whereNotIn('providers.id', $blockedProviderIds)
|
|
|
->whereIn('providers.id', $providersWithWorkingDays)
|
|
|
- ->where(function ($query) {
|
|
|
- $query->whereNotNull('providers.daily_price_8h')
|
|
|
- ->orWhereNotNull('providers.daily_price_6h')
|
|
|
- ->orWhereNotNull('providers.daily_price_4h')
|
|
|
- ->orWhereNotNull('providers.daily_price_2h');
|
|
|
- })
|
|
|
+ ->whereNull('providers.deleted_at')
|
|
|
+
|
|
|
->select(
|
|
|
'providers.id as provider_id',
|
|
|
'provider_user.name as provider_name',
|
|
|
+ 'provider_address.id as address_id',
|
|
|
'providers.average_rating',
|
|
|
+ 'providers.total_services',
|
|
|
+ 'providers.daily_price_8h',
|
|
|
+ 'providers.daily_price_6h',
|
|
|
+ 'providers.daily_price_4h',
|
|
|
+ 'providers.daily_price_2h',
|
|
|
DB::raw("(
|
|
|
SELECT COUNT(*)
|
|
|
FROM reviews
|
|
|
@@ -130,17 +149,41 @@ class DashboardService
|
|
|
WHERE reviews.origin = 'provider'
|
|
|
AND schedules.provider_id = providers.id
|
|
|
) as total_reviews"),
|
|
|
- 'providers.total_services',
|
|
|
- 'providers.daily_price_8h',
|
|
|
- 'providers.daily_price_6h',
|
|
|
- 'providers.daily_price_4h',
|
|
|
- 'providers.daily_price_2h',
|
|
|
)
|
|
|
->get();
|
|
|
|
|
|
+ $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',
|
|
|
+ 'schedules.date',
|
|
|
+ DB::raw("TO_CHAR(schedules.date, 'DD \"de\" TMMonth \"de\" YYYY') as formatted_date"),
|
|
|
+ 'schedules.start_time',
|
|
|
+ 'schedules.end_time',
|
|
|
+ 'schedules.period_type',
|
|
|
+ 'schedules.address_id',
|
|
|
+ 'schedules.status',
|
|
|
+ 'schedules.total_amount',
|
|
|
+ DB::raw("(SELECT district FROM addresses WHERE source = 'provider' AND source_id = schedules.provider_id and deleted_at is null ORDER BY is_primary DESC LIMIT 1) as provider_district"),
|
|
|
+ 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"),
|
|
|
+ )
|
|
|
+ ->orderBy('schedules.date', 'asc')
|
|
|
+ ->get();
|
|
|
+
|
|
|
return [
|
|
|
'headerBar' => $headerBar,
|
|
|
'summaryInfos' => $summaryInfos,
|
|
|
+ 'pendingSchedules' => $pendingSchedules,
|
|
|
'nextSchedules' => $nextSchedules,
|
|
|
'lastDoneSchedules' => $lastDoneSchedules,
|
|
|
'favoriteProviders' => $favoriteProviders,
|
|
|
@@ -148,72 +191,6 @@ class DashboardService
|
|
|
];
|
|
|
}
|
|
|
|
|
|
- public function buscaPrestadores(?string $name = null, ?string $date = null): array
|
|
|
- {
|
|
|
- $user = Auth::user();
|
|
|
- $cliente = Client::where('user_id', $user->id)->first();
|
|
|
-
|
|
|
- $blockedProviderIds = ScheduleBusinessRules::getBlockedProviderIdsForClient($cliente->id);
|
|
|
- $providersWithWorkingDays = ScheduleBusinessRules::getProviderIdsWithWorkingDays();
|
|
|
-
|
|
|
- $clientPrimaryAddress = Address::where('source', 'client')
|
|
|
- ->where('source_id', $cliente->id)
|
|
|
- ->orderBy('is_primary', 'desc')
|
|
|
- ->first();
|
|
|
-
|
|
|
- return Provider::leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
|
|
|
- ->leftJoin(DB::raw("
|
|
|
- (
|
|
|
- SELECT DISTINCT ON (source_id)
|
|
|
- *
|
|
|
- FROM addresses
|
|
|
- WHERE source = 'provider'
|
|
|
- ORDER BY source_id, is_primary DESC
|
|
|
- ) as provider_address
|
|
|
- "), 'provider_address.source_id', '=', 'providers.id')
|
|
|
- ->whereNotNull('provider_address.id')
|
|
|
- ->where('provider_address.city_id', $clientPrimaryAddress?->city_id)
|
|
|
- ->whereNotIn('providers.id', $blockedProviderIds)
|
|
|
- ->whereIn('providers.id', $providersWithWorkingDays)
|
|
|
- ->whereNotNull('providers.daily_price_8h')
|
|
|
- ->whereNotNull('providers.daily_price_6h')
|
|
|
- ->whereNotNull('providers.daily_price_4h')
|
|
|
- ->whereNotNull('providers.daily_price_2h')
|
|
|
- ->when($name, fn($q) => $q->where('provider_user.name', 'ILIKE', "%{$name}%"))
|
|
|
- ->select(
|
|
|
- 'providers.id as provider_id',
|
|
|
- 'provider_user.name as provider_name',
|
|
|
- 'provider_address.district',
|
|
|
- 'providers.average_rating',
|
|
|
- 'providers.total_services',
|
|
|
- 'providers.daily_price_8h',
|
|
|
- 'providers.daily_price_6h',
|
|
|
- 'providers.daily_price_4h',
|
|
|
- 'providers.daily_price_2h',
|
|
|
- 'providers.created_at',
|
|
|
- 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"),
|
|
|
- )
|
|
|
- ->orderBy('providers.average_rating', 'desc')
|
|
|
- ->get()
|
|
|
- ->when(
|
|
|
- $date,
|
|
|
- fn($collection) => $collection->whereIn(
|
|
|
- 'provider_id',
|
|
|
- ScheduleBusinessRules::getAvailableProviderIdsForDate(
|
|
|
- $date,
|
|
|
- $collection->pluck('provider_id')
|
|
|
- )->toArray()
|
|
|
- )->values()
|
|
|
- )
|
|
|
- ->toArray();
|
|
|
- }
|
|
|
-
|
|
|
public function dadosDashboardPrestador(): array
|
|
|
{
|
|
|
$user = Auth::user();
|
|
|
@@ -249,6 +226,7 @@ class DashboardService
|
|
|
->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',
|
|
|
'client_user.name as client_name',
|
|
|
@@ -261,6 +239,8 @@ class DashboardService
|
|
|
'schedules.period_type',
|
|
|
'schedules.schedule_type',
|
|
|
'schedules.address_id',
|
|
|
+ 'schedules.status',
|
|
|
+ 'custom_schedules.offers_meal',
|
|
|
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')
|
|
|
@@ -269,6 +249,31 @@ class DashboardService
|
|
|
->orderBy('schedules.date', 'asc')
|
|
|
->get();
|
|
|
|
|
|
+ $todayServices = Schedule::with('address:district,address,number,source_id,source,id')
|
|
|
+ ->where('schedules.provider_id', $provider->id)
|
|
|
+ ->whereIn('schedules.status', ['accepted', 'paid', 'started'])
|
|
|
+ ->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',
|
|
|
+ '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.status',
|
|
|
+ 'custom_schedules.offers_meal',
|
|
|
+ )
|
|
|
+ ->orderBy('schedules.start_time', 'asc')
|
|
|
+ ->get();
|
|
|
+
|
|
|
$nextSchedules = Schedule::with('address:district,address,number,source_id,source,id')
|
|
|
->where('schedules.provider_id', $provider->id)
|
|
|
->whereIn('schedules.status', ['accepted', 'paid'])
|
|
|
@@ -285,6 +290,7 @@ class DashboardService
|
|
|
'schedules.period_type',
|
|
|
'schedules.address_id',
|
|
|
'schedules.schedule_type',
|
|
|
+ 'schedules.status',
|
|
|
'custom_schedules.offers_meal',
|
|
|
)
|
|
|
->orderBy('schedules.date', 'asc')
|
|
|
@@ -306,36 +312,24 @@ class DashboardService
|
|
|
'schedules.period_type',
|
|
|
'schedules.schedule_type',
|
|
|
'schedules.address_id',
|
|
|
- 'custom_schedules.address_type'
|
|
|
+ '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();
|
|
|
|
|
|
- $opportunities = $opportunities->map(function ($item) use ($provider) {
|
|
|
- $price = 0;
|
|
|
- switch ($item->period_type) {
|
|
|
- case 2:
|
|
|
- $price = $provider->daily_price_2h;
|
|
|
- break;
|
|
|
- case 4:
|
|
|
- $price = $provider->daily_price_4h;
|
|
|
- break;
|
|
|
- case 6:
|
|
|
- $price = $provider->daily_price_6h;
|
|
|
- break;
|
|
|
- case 8:
|
|
|
- $price = $provider->daily_price_8h;
|
|
|
- break;
|
|
|
- }
|
|
|
- $item->total_amount = $price;
|
|
|
- return $item;
|
|
|
- });
|
|
|
-
|
|
|
return [
|
|
|
'headerBar' => $headerBar,
|
|
|
'summaryInfos' => $summaryInfos,
|
|
|
'priceSuggested' => $priceSuggested,
|
|
|
'solicitations' => $solicitations,
|
|
|
+ 'todayServices' => $todayServices,
|
|
|
'nextSchedules' => $nextSchedules,
|
|
|
'opportunities' => $opportunities,
|
|
|
];
|