feat: implement drop-off points & dumpsites edit/delete and status transition logic

This commit is contained in:
Super Admin
2026-06-29 23:15:55 +08:00
parent f2c1573f00
commit cfd7166a24
6 changed files with 355 additions and 33 deletions

View File

@@ -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')),

View File

@@ -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')),