130 lines
4.6 KiB
PHP
130 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api\V1\Helper;
|
|
|
|
use App\Http\Controllers\Api\V1\ApiController;
|
|
use App\Http\Resources\TeamMemberResource;
|
|
use App\Models\TeamMember;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
|
|
class HelperAssignmentController extends ApiController
|
|
{
|
|
public function assignment(Request $request): JsonResponse
|
|
{
|
|
$user = $request->user();
|
|
$today = now()->toDateString();
|
|
|
|
$assignment = TeamMember::query()
|
|
->where('user_id', $user->id)
|
|
->where('role_in_team', TeamMember::ROLE_HELPER)
|
|
->whereDate('assigned_from', '<=', $today)
|
|
->where(function ($q) use ($today) {
|
|
$q->whereNull('assigned_until')->orWhereDate('assigned_until', '>=', $today);
|
|
})
|
|
->with(['team.driver', 'team.scanner', 'team.truck', 'team.area'])
|
|
->orderBy('id', 'desc')
|
|
->first();
|
|
|
|
if (! $assignment) {
|
|
return $this->ok(null, 'No active assignment for today.');
|
|
}
|
|
|
|
return $this->ok(new TeamMemberResource($assignment));
|
|
}
|
|
|
|
public function accept(Request $request): JsonResponse
|
|
{
|
|
$user = $request->user();
|
|
$today = now()->toDateString();
|
|
|
|
$assignment = TeamMember::query()
|
|
->where('user_id', $user->id)
|
|
->where('role_in_team', TeamMember::ROLE_HELPER)
|
|
->whereDate('assigned_from', '<=', $today)
|
|
->where(function ($q) use ($today) {
|
|
$q->whereNull('assigned_until')->orWhereDate('assigned_until', '>=', $today);
|
|
})
|
|
->orderBy('id', 'desc')
|
|
->first();
|
|
|
|
if (! $assignment) {
|
|
return $this->fail('No active assignment to accept.', null, 404);
|
|
}
|
|
|
|
$assignment->update(['status' => TeamMember::STATUS_ACCEPTED]);
|
|
|
|
return $this->ok(new TeamMemberResource($assignment->load(['team.driver', 'team.scanner', 'team.truck', 'team.area'])), 'Assignment accepted.');
|
|
}
|
|
|
|
public function reject(Request $request): JsonResponse
|
|
{
|
|
$user = $request->user();
|
|
$today = now()->toDateString();
|
|
|
|
$assignment = TeamMember::query()
|
|
->where('user_id', $user->id)
|
|
->where('role_in_team', TeamMember::ROLE_HELPER)
|
|
->whereDate('assigned_from', '<=', $today)
|
|
->where(function ($q) use ($today) {
|
|
$q->whereNull('assigned_until')->orWhereDate('assigned_until', '>=', $today);
|
|
})
|
|
->orderBy('id', 'desc')
|
|
->first();
|
|
|
|
if (! $assignment) {
|
|
return $this->fail('No active assignment to reject.', null, 404);
|
|
}
|
|
|
|
$assignment->update(['status' => TeamMember::STATUS_REJECTED]);
|
|
|
|
return $this->ok(new TeamMemberResource($assignment->load(['team.driver', 'team.scanner', 'team.truck', 'team.area'])), 'Assignment rejected.');
|
|
}
|
|
|
|
public function activeTrip(Request $request): JsonResponse
|
|
{
|
|
$user = $request->user();
|
|
$today = now()->toDateString();
|
|
|
|
$assignment = TeamMember::query()
|
|
->where('user_id', $user->id)
|
|
->where('role_in_team', TeamMember::ROLE_HELPER)
|
|
->whereDate('assigned_from', '<=', $today)
|
|
->where(function ($q) use ($today) {
|
|
$q->whereNull('assigned_until')->orWhereDate('assigned_until', '>=', $today);
|
|
})
|
|
->first();
|
|
|
|
if (! $assignment) {
|
|
return $this->ok(null, 'No active assignment for today.');
|
|
}
|
|
|
|
$trip = \App\Models\Trip::query()
|
|
->where('team_id', $assignment->team_id)
|
|
->whereIn('status', [\App\Models\Trip::STATUS_SCHEDULED, \App\Models\Trip::STATUS_IN_PROGRESS, \App\Models\Trip::STATUS_AT_DUMPSITE])
|
|
->with(['route', 'team.driver', 'team.scanner', 'truck', 'dumpsite', 'stops.dropOffPoint'])
|
|
->orderBy('scheduled_date')
|
|
->first();
|
|
|
|
if (! $trip) {
|
|
return $this->ok(null, 'No active trip for assigned team.');
|
|
}
|
|
|
|
return $this->ok(\App\Http\Resources\TripResource::make($trip));
|
|
}
|
|
|
|
public function history(Request $request): JsonResponse
|
|
{
|
|
$user = $request->user();
|
|
|
|
$assignments = TeamMember::query()
|
|
->where('user_id', $user->id)
|
|
->where('role_in_team', TeamMember::ROLE_HELPER)
|
|
->with(['team.driver', 'team.scanner', 'team.truck', 'team.area'])
|
|
->orderBy('assigned_from', 'desc')
|
|
->paginate($request->integer('per_page', 15));
|
|
|
|
return $this->ok(TeamMemberResource::collection($assignments));
|
|
}
|
|
}
|