121 lines
5.3 KiB
PHP
121 lines
5.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin\Management;
|
|
|
|
use App\Http\Concerns\SortsQuery;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\Admin\Management\AssignApplicationRequest;
|
|
use App\Http\Requests\Admin\Management\StoreManualApplicationRequest;
|
|
use App\Http\Requests\Admin\Management\UpdateManagedApplicationRequest;
|
|
use App\Models\Application;
|
|
use App\Models\Election;
|
|
use App\Models\Position;
|
|
use App\Models\PusatMengundi;
|
|
use App\Models\SaluranMengundi;
|
|
use App\Models\StaffAssignment;
|
|
use App\Services\Admin\Management\AdminApplicationManagementService;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\View\View;
|
|
|
|
class ManagedApplicationController extends Controller
|
|
{
|
|
use SortsQuery;
|
|
|
|
public function index(Request $request): View
|
|
{
|
|
$query = Application::query()
|
|
->with(['election', 'pusatMengundi', 'requestedPosition', 'approvedPosition', 'selectedKtmAssignment.user'])
|
|
->when($request->filled('status'), fn ($q) => $q->where('status', $request->string('status')))
|
|
->when($request->filled('pusat_mengundi_id'), fn ($q) => $q->where('pusat_mengundi_id', $request->integer('pusat_mengundi_id')))
|
|
->when($request->filled('position_id'), function ($q) use ($request): void {
|
|
$q->where(function ($nested) use ($request): void {
|
|
$nested->where('requested_position_id', $request->integer('position_id'))
|
|
->orWhere('approved_position_id', $request->integer('position_id'));
|
|
});
|
|
})
|
|
->when($request->filled('q'), function ($q) use ($request): void {
|
|
$term = '%'.$request->string('q')->toString().'%';
|
|
$q->where(fn ($nested) => $nested
|
|
->where('name', 'like', $term)
|
|
->orWhere('ic_number', 'like', $term)
|
|
->orWhere('email', 'like', $term));
|
|
});
|
|
|
|
$applications = $this->sortedQuery($query, ['name', 'status', 'created_at'], 'created_at', 'desc')
|
|
->paginate(15)
|
|
->withQueryString();
|
|
|
|
return view('admin.management.applications.index', [
|
|
'applications' => $applications,
|
|
'positions' => Position::query()->orderBy('sort_order')->orderBy('name')->get(),
|
|
'pusats' => PusatMengundi::query()->orderBy('name')->get(),
|
|
'filters' => $request->only(['status', 'pusat_mengundi_id', 'position_id', 'q']),
|
|
]);
|
|
}
|
|
|
|
public function create(): View
|
|
{
|
|
return view('admin.management.applications.create', $this->formData([
|
|
'application' => new Application,
|
|
]));
|
|
}
|
|
|
|
public function store(StoreManualApplicationRequest $request, AdminApplicationManagementService $service): RedirectResponse
|
|
{
|
|
$application = $service->create($request->user(), $request->validated());
|
|
|
|
return redirect()->route('admin.management.applications.edit', $application->public_uuid)
|
|
->with('status', 'Permohonan manual telah disimpan.');
|
|
}
|
|
|
|
public function edit(Application $application): View
|
|
{
|
|
return view('admin.management.applications.edit', $this->formData([
|
|
'application' => $application->load(['election.settings', 'pusatMengundi', 'requestedPosition', 'approvedPosition', 'documents', 'staffAssignments.position', 'staffAssignments.saluranMengundi', 'statusHistories']),
|
|
]));
|
|
}
|
|
|
|
public function update(UpdateManagedApplicationRequest $request, Application $application, AdminApplicationManagementService $service): RedirectResponse
|
|
{
|
|
$service->update($application, $request->user(), $request->validated());
|
|
|
|
return redirect()->route('admin.management.applications.edit', $application->public_uuid)
|
|
->with('status', 'Permohonan telah dikemas kini.');
|
|
}
|
|
|
|
public function assign(AssignApplicationRequest $request, Application $application, AdminApplicationManagementService $service): RedirectResponse
|
|
{
|
|
$service->assign($application, $request->user(), $request->validated());
|
|
|
|
return redirect()->route('admin.management.applications.edit', $application->public_uuid)
|
|
->with('status', 'Tugasan staf telah dikemas kini.');
|
|
}
|
|
|
|
/**
|
|
* @param array<string, mixed> $extra
|
|
* @return array<string, mixed>
|
|
*/
|
|
private function formData(array $extra = []): array
|
|
{
|
|
$ktmPosition = Position::query()->where('code', 'KTM')->first();
|
|
|
|
return [
|
|
...$extra,
|
|
'elections' => Election::query()->with('settings')->orderByDesc('id')->get(),
|
|
'pusats' => PusatMengundi::query()->with('election')->orderBy('name')->get(),
|
|
'salurans' => SaluranMengundi::query()->with('pusatMengundi')->orderBy('number')->get(),
|
|
'positions' => Position::query()->where('is_assignable', true)->orderBy('sort_order')->orderBy('name')->get(),
|
|
'ktmAssignments' => $ktmPosition
|
|
? StaffAssignment::query()
|
|
->with(['user', 'pusatMengundi', 'saluranMengundi'])
|
|
->where('position_id', $ktmPosition->id)
|
|
->where('status', 'active')
|
|
->whereNotNull('saluran_mengundi_id')
|
|
->orderByDesc('id')
|
|
->get()
|
|
: collect(),
|
|
];
|
|
}
|
|
}
|