diff --git a/app/Http/Controllers/Api/V1/Admin/AdminDropOffPointController.php b/app/Http/Controllers/Api/V1/Admin/AdminDropOffPointController.php index 2b25b44..c3dfd88 100644 --- a/app/Http/Controllers/Api/V1/Admin/AdminDropOffPointController.php +++ b/app/Http/Controllers/Api/V1/Admin/AdminDropOffPointController.php @@ -10,12 +10,15 @@ use App\Http\Resources\DropOffCapacityLogResource; use App\Http\Resources\DropOffPointResource; use App\Models\DropOffCapacityLog; use App\Models\DropOffPoint; +use App\Services\DropOff\DropOffPointFinder; +use Illuminate\Support\Facades\DB; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use MatanYadaev\EloquentSpatial\Objects\Point; class AdminDropOffPointController extends ApiController { + public function __construct(private readonly DropOffPointFinder $dopFinder) {} public function index(Request $request): JsonResponse { $request->validate([ @@ -89,12 +92,28 @@ class AdminDropOffPointController extends ApiController public function update(UpdateDropOffPointRequest $request, DropOffPoint $dropOffPoint): JsonResponse { $data = $request->validated(); + $oldStatus = $dropOffPoint->status; + $newStatus = $data['status'] ?? $oldStatus; + if (isset($data['lat'], $data['lng'])) { $data['coordinates'] = $this->makePoint($data); } unset($data['lat'], $data['lng']); - $dropOffPoint->update($data); + DB::transaction(function () use ($dropOffPoint, $data, $oldStatus, $newStatus) { + $dropOffPoint->update($data); + + if ($newStatus !== DropOffPoint::STATUS_ACTIVE && $oldStatus === DropOffPoint::STATUS_ACTIVE) { + $households = $dropOffPoint->households; + foreach ($households as $household) { + $nearest = $this->dopFinder->nearest( + $household->coordinates->latitude, + $household->coordinates->longitude + ); + $household->update(['assigned_drop_off_point_id' => $nearest?->id]); + } + } + }); return $this->ok( new DropOffPointResource($dropOffPoint->fresh()->load('barangay')), diff --git a/app/Http/Controllers/Api/V1/Admin/AdminDumpsiteController.php b/app/Http/Controllers/Api/V1/Admin/AdminDumpsiteController.php index 543cb2b..842efda 100644 --- a/app/Http/Controllers/Api/V1/Admin/AdminDumpsiteController.php +++ b/app/Http/Controllers/Api/V1/Admin/AdminDumpsiteController.php @@ -7,6 +7,7 @@ use App\Http\Requests\Dumpsite\StoreDumpsiteRequest; use App\Http\Requests\Dumpsite\UpdateDumpsiteRequest; use App\Http\Resources\DumpsiteResource; use App\Models\Dumpsite; +use Illuminate\Support\Facades\DB; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use MatanYadaev\EloquentSpatial\Objects\LineString; @@ -102,7 +103,25 @@ class AdminDumpsiteController extends ApiController } } - $dumpsite->update($payload); + $oldStatus = $dumpsite->status; + $newStatus = $payload['status'] ?? $oldStatus; + + DB::transaction(function () use ($dumpsite, $payload, $oldStatus, $newStatus) { + $dumpsite->update($payload); + + if ($newStatus !== Dumpsite::STATUS_ACTIVE && $oldStatus === Dumpsite::STATUS_ACTIVE) { + $trips = \App\Models\Trip::where('dumpsite_id', $dumpsite->id) + ->whereIn('status', [\App\Models\Trip::STATUS_SCHEDULED, \App\Models\Trip::STATUS_IN_PROGRESS, \App\Models\Trip::STATUS_AT_DUMPSITE]) + ->get(); + + foreach ($trips as $trip) { + $trip->update([ + 'status' => \App\Models\Trip::STATUS_CANCELLED, + 'notes' => trim(($trip->notes ?? '') . "\nSystem: Trip cancelled because the dumpsite was moved to " . $newStatus . " status."), + ]); + } + } + }); return $this->ok( new DumpsiteResource($dumpsite->fresh()->load('cityMunicipality')), diff --git a/resources/views/admin/drop-off-points.blade.php b/resources/views/admin/drop-off-points.blade.php index 13efe8c..c61394f 100644 --- a/resources/views/admin/drop-off-points.blade.php +++ b/resources/views/admin/drop-off-points.blade.php @@ -33,10 +33,11 @@ Address Capacity Status + Actions - Loading… + Loading… @@ -46,7 +47,7 @@
-

New drop-off point

+ @@ -58,7 +59,7 @@
- +
@@ -93,6 +94,14 @@
+
+ + +
+
+ + +