|
|
@@ -8,8 +8,10 @@ use App\Models\ClientFavoriteProvider;
|
|
|
use App\Models\Provider;
|
|
|
use App\Models\Review;
|
|
|
use App\Models\Schedule;
|
|
|
+use App\Rules\ScheduleBusinessRules;
|
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
+use Illuminate\Support\Facades\Log;
|
|
|
|
|
|
class DashboardService
|
|
|
{
|
|
|
@@ -20,28 +22,37 @@ class DashboardService
|
|
|
$user = Auth::user();
|
|
|
$cliente = Client::where('user_id', $user->id)->first();
|
|
|
$headerBar = [
|
|
|
- 'rating' => $cliente->average_rating,
|
|
|
- 'total_ratings' => Review::where('reviews.origin', 'provider')->leftJoin('schedules', 'schedules.id', '=', 'reviews.schedule_id')->where('schedules.client_id', $cliente->id)->count(),
|
|
|
+ 'rating' => $cliente->average_rating,
|
|
|
+ 'total_ratings' => Review::where('reviews.origin', 'provider')
|
|
|
+ ->leftJoin('schedules', 'schedules.id', '=', 'reviews.schedule_id')
|
|
|
+ ->where('schedules.client_id', $cliente->id)
|
|
|
+ ->count(),
|
|
|
'total_services' => $cliente->total_services,
|
|
|
];
|
|
|
|
|
|
+ $address = Address::where('source', 'client')
|
|
|
+ ->where('source_id', $cliente->id)
|
|
|
+ ->with(['city', 'state'])
|
|
|
+ ->first();
|
|
|
+
|
|
|
$summaryInfos = [
|
|
|
- 'name' => $user->name,
|
|
|
- 'address' => Address::where('source', 'client')->where('source_id', $cliente->id)->with(['city', 'state'])->first(),
|
|
|
- 'pending_services' => Schedule::where('client_id', $cliente->id)->where('status', 'pending')->count(),
|
|
|
+ 'name' => $user->name,
|
|
|
+ 'address' => $address,
|
|
|
+ 'pending_services' => Schedule::where('client_id', $cliente->id)
|
|
|
+ ->where('status', 'pending')
|
|
|
+ ->count(),
|
|
|
];
|
|
|
|
|
|
- $nextSchedules = Schedule::where('schedules.client_id', $cliente->id)
|
|
|
+ $nextSchedules = Schedule::with('address:district,address,number,source_id,source,id,address_type')
|
|
|
+ ->where('schedules.client_id', $cliente->id)
|
|
|
->whereIn('schedules.status', ['accepted', 'paid'])
|
|
|
->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');
|
|
|
- })
|
|
|
+ ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
|
|
|
->where('schedules.date', '>=', now()->toDateString())
|
|
|
->select(
|
|
|
'schedules.id',
|
|
|
+ 'schedules.provider_id',
|
|
|
'provider_user.name as provider_name',
|
|
|
'schedules.date',
|
|
|
'schedules.start_time',
|
|
|
@@ -49,8 +60,8 @@ class DashboardService
|
|
|
'schedules.total_amount',
|
|
|
'schedules.period_type',
|
|
|
'schedules.schedule_type',
|
|
|
- 'provider_address.district',
|
|
|
- 'provider_address.address_type',
|
|
|
+ 'schedules.address_id',
|
|
|
+ 'custom_schedules.address_type as custom_address_type',
|
|
|
)
|
|
|
->orderBy('schedules.date', 'asc')
|
|
|
->get();
|
|
|
@@ -59,56 +70,77 @@ class DashboardService
|
|
|
->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');
|
|
|
- })
|
|
|
->select(
|
|
|
'schedules.id',
|
|
|
+ 'schedules.provider_id',
|
|
|
'provider_user.name as provider_name',
|
|
|
)
|
|
|
->orderBy('schedules.date', 'desc')
|
|
|
->limit(5)
|
|
|
->get();
|
|
|
|
|
|
- $favoriteProviders = ClientFavoriteProvider::where('client_id', $cliente->id)
|
|
|
+ $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')
|
|
|
->select(
|
|
|
- 'providers.id',
|
|
|
+ 'providers.id as provider_id',
|
|
|
'provider_user.name as provider_name',
|
|
|
'providers.average_rating',
|
|
|
+ 'providers.daily_price_8h',
|
|
|
+ 'providers.daily_price_6h',
|
|
|
+ 'providers.daily_price_4h',
|
|
|
+ 'providers.daily_price_2h',
|
|
|
)
|
|
|
->get();
|
|
|
|
|
|
+ $blockedProviderIds = ScheduleBusinessRules::getBlockedProviderIdsForClient($cliente->id);
|
|
|
+ $providersWithWorkingDays = ScheduleBusinessRules::getProviderIdsWithWorkingDays();
|
|
|
+
|
|
|
$providersClose = Provider::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');
|
|
|
})
|
|
|
->leftJoin('addresses as client_address', function ($join) use ($cliente) {
|
|
|
- $join->where('client_address.source_id', $cliente->id)
|
|
|
- ->where('client_address.source', 'client');
|
|
|
+ $join->where('client_address.source_id', $cliente->id)
|
|
|
+ ->where('client_address.source', 'client');
|
|
|
})
|
|
|
->whereColumn('provider_address.city_id', '=', 'client_address.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');
|
|
|
+ })
|
|
|
->select(
|
|
|
- 'providers.id',
|
|
|
+ 'providers.id as provider_id',
|
|
|
'provider_user.name as provider_name',
|
|
|
- 'provider_address.address_type', // refatorar para pegar o bairro
|
|
|
+ 'provider_address.district',
|
|
|
'providers.average_rating',
|
|
|
- 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"),
|
|
|
'providers.total_services',
|
|
|
'providers.daily_price_8h',
|
|
|
+ 'providers.daily_price_6h',
|
|
|
+ 'providers.daily_price_4h',
|
|
|
+ 'providers.daily_price_2h',
|
|
|
)
|
|
|
->get();
|
|
|
|
|
|
return [
|
|
|
- 'headerBar' => $headerBar,
|
|
|
- 'summaryInfos' => $summaryInfos,
|
|
|
- 'nextSchedules' => $nextSchedules,
|
|
|
+ 'headerBar' => $headerBar,
|
|
|
+ 'summaryInfos' => $summaryInfos,
|
|
|
+ 'nextSchedules' => $nextSchedules,
|
|
|
'lastDoneSchedules' => $lastDoneSchedules,
|
|
|
'favoriteProviders' => $favoriteProviders,
|
|
|
- 'providersClose' => $providersClose,
|
|
|
+ 'providersClose' => $providersClose,
|
|
|
];
|
|
|
}
|
|
|
|
|
|
@@ -123,9 +155,10 @@ class DashboardService
|
|
|
'total_services' => $provider->total_services,
|
|
|
];
|
|
|
|
|
|
+ $address = Address::where('source', 'provider')->where('source_id', $provider->id)->with(['city', 'state'])->first();
|
|
|
$summaryInfos = [
|
|
|
'name' => $user->name,
|
|
|
- 'address' => Address::where('source', 'provider')->where('source_id', $provider->id)->with(['city', 'state'])->first(),
|
|
|
+ 'address' => $address,
|
|
|
'pending_services' => Schedule::where('provider_id', $provider->id)->where('status', 'pending')->count(),
|
|
|
];
|
|
|
|
|
|
@@ -141,14 +174,11 @@ class DashboardService
|
|
|
'your_price' => $priceActual,
|
|
|
];
|
|
|
|
|
|
- $solicitations = Schedule::where('schedules.provider_id', $provider->id)
|
|
|
+ $solicitations = Schedule::with('address:district,source_id,source,id')
|
|
|
+ ->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('addresses as client_address', function ($join) {
|
|
|
- $join->on('client_address.source_id', '=', 'clients.id')
|
|
|
- ->where('client_address.source', 'client');
|
|
|
- })
|
|
|
->select(
|
|
|
'schedules.id',
|
|
|
'client_user.name as client_name',
|
|
|
@@ -160,20 +190,21 @@ class DashboardService
|
|
|
'schedules.total_amount',
|
|
|
'schedules.period_type',
|
|
|
'schedules.schedule_type',
|
|
|
- 'client_address.district',
|
|
|
+ 'schedules.address_id',
|
|
|
+ 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();
|
|
|
|
|
|
- $nextSchedules = Schedule::where('schedules.provider_id', $provider->id)
|
|
|
+ $nextSchedules = Schedule::with('address:district,address,number,source_id,source,id')
|
|
|
+ ->where('schedules.provider_id', $provider->id)
|
|
|
->whereIn('schedules.status', ['accepted', 'paid'])
|
|
|
->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')
|
|
|
- ->leftJoin('addresses as client_address', function ($join) {
|
|
|
- $join->on('client_address.source_id', '=', 'clients.id')
|
|
|
- ->where('client_address.source', 'client');
|
|
|
- })
|
|
|
->select(
|
|
|
'schedules.id',
|
|
|
'client_user.name as client_name',
|
|
|
@@ -182,21 +213,19 @@ class DashboardService
|
|
|
'schedules.end_time',
|
|
|
'schedules.total_amount',
|
|
|
'schedules.period_type',
|
|
|
+ 'schedules.address_id',
|
|
|
'schedules.schedule_type',
|
|
|
'custom_schedules.offers_meal',
|
|
|
- 'client_address.district',
|
|
|
)
|
|
|
->orderBy('schedules.date', 'asc')
|
|
|
->get();
|
|
|
|
|
|
- $opportunities = Schedule::where('schedules.schedule_type', 'custom')
|
|
|
+ $opportunities = Schedule::with('address:district,source_id,source,id')
|
|
|
+ ->where('schedules.schedule_type', 'custom')
|
|
|
->where('schedules.status', 'pending')
|
|
|
->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
|
|
|
->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
|
|
|
- ->leftJoin('addresses as client_address', function ($join) {
|
|
|
- $join->on('client_address.source_id', '=', 'clients.id')
|
|
|
- ->where('client_address.source', 'client');
|
|
|
- })
|
|
|
+ ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
|
|
|
->select(
|
|
|
'schedules.id',
|
|
|
'client_user.name as client_name',
|
|
|
@@ -206,7 +235,8 @@ class DashboardService
|
|
|
'schedules.end_time',
|
|
|
'schedules.period_type',
|
|
|
'schedules.schedule_type',
|
|
|
- 'client_address.district',
|
|
|
+ 'schedules.address_id',
|
|
|
+ 'custom_schedules.address_type'
|
|
|
)
|
|
|
->orderBy('schedules.date', 'asc')
|
|
|
->get();
|