Files
prn2026/app/Http/Controllers/Admin/Management/PennempatanController.php
2026-06-03 08:51:22 +08:00

108 lines
4.0 KiB
PHP

<?php
namespace App\Http\Controllers\Admin\Management;
use App\Http\Controllers\Controller;
use App\Models\Position;
use App\Models\PusatMengundi;
use App\Models\SaluranMengundi;
use App\Models\StaffAssignment;
use App\Services\Admin\Management\PennempatanService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class PennempatanController extends Controller
{
public function show(PusatMengundi $pusatMengundi, PennempatanService $service): View
{
$pusatMengundi->load(['dun', 'election', 'saluranMengundis']);
$ppmPosition = Position::query()->where('code', 'PPM')->first();
$ppmAssignment = $ppmPosition
? StaffAssignment::query()
->with('application')
->where('pusat_mengundi_id', $pusatMengundi->id)
->where('position_id', $ppmPosition->id)
->where('status', 'active')
->whereNull('saluran_mengundi_id')
->first()
: null;
return view('admin.management.penempatan.show', [
'pusat' => $pusatMengundi,
'ppm' => $ppmAssignment,
'sections' => $service->detailForPusat($pusatMengundi),
]);
}
public function lepas(Request $request, PusatMengundi $pusatMengundi, StaffAssignment $assignment): RedirectResponse
{
abort_unless($assignment->pusat_mengundi_id === $pusatMengundi->id, 404);
$assignment->update([
'status' => 'inactive',
'assigned_by_user_id' => $request->user()->id,
]);
activity('admin_management')
->performedOn($assignment)
->causedBy($request->user())
->log('assignment_removed_by_admin');
return redirect()->route('admin.management.penempatan.show', $pusatMengundi)
->with('status', 'Petugas telah dilepaskan dari tugasan.');
}
public function pindahForm(PusatMengundi $pusatMengundi, StaffAssignment $assignment): View
{
abort_unless($assignment->pusat_mengundi_id === $pusatMengundi->id, 404);
return view('admin.management.penempatan.pindah', [
'pusat' => $pusatMengundi,
'assignment' => $assignment->load(['application', 'position', 'saluranMengundi']),
'pusats' => PusatMengundi::query()->with('election')->orderBy('code')->get(),
'salurans' => SaluranMengundi::query()
->where('pusat_mengundi_id', $pusatMengundi->id)
->orderBy('number')
->get(),
]);
}
public function pindah(Request $request, PusatMengundi $pusatMengundi, StaffAssignment $assignment): RedirectResponse
{
abort_unless($assignment->pusat_mengundi_id === $pusatMengundi->id, 404);
$data = $request->validate([
'pusat_mengundi_id' => ['required', 'exists:pusat_mengundis,id'],
'saluran_mengundi_id' => ['nullable', 'exists:saluran_mengundis,id'],
]);
$newPusat = PusatMengundi::query()->findOrFail($data['pusat_mengundi_id']);
$assignment->update([
'pusat_mengundi_id' => $newPusat->id,
'saluran_mengundi_id' => $data['saluran_mengundi_id'] ?? null,
'assigned_by_user_id' => $request->user()->id,
'assigned_at' => now(),
]);
// Update linked application's pusat too
if ($assignment->application) {
$assignment->application->forceFill(['pusat_mengundi_id' => $newPusat->id])->save();
}
activity('admin_management')
->performedOn($assignment)
->causedBy($request->user())
->withProperties([
'from_pusat_id' => $pusatMengundi->id,
'to_pusat_id' => $newPusat->id,
])
->log('assignment_transferred_by_admin');
return redirect()->route('admin.management.penempatan.show', $newPusat)
->with('status', 'Petugas telah dipindahkan ke '.$newPusat->name.'.');
}
}