feat: implement drop-off points & dumpsites edit/delete and status transition logic
This commit is contained in:
@@ -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')),
|
||||
|
||||
Reference in New Issue
Block a user