diff --git a/app/Http/Controllers/Api/V1/DropOff/DropOffPointController.php b/app/Http/Controllers/Api/V1/DropOff/DropOffPointController.php
index 5fa0e7e..4129293 100644
--- a/app/Http/Controllers/Api/V1/DropOff/DropOffPointController.php
+++ b/app/Http/Controllers/Api/V1/DropOff/DropOffPointController.php
@@ -16,7 +16,7 @@ class DropOffPointController extends ApiController
$data = $request->validate([
'lat' => ['required', 'numeric', 'between:-90,90'],
'lng' => ['required', 'numeric', 'between:-180,180'],
- 'radius_km' => ['nullable', 'numeric', 'min:0.1', 'max:50'],
+ 'radius_km' => ['nullable', 'numeric', 'min:0.1', 'max:25000'],
'limit' => ['nullable', 'integer', 'min:1', 'max:50'],
]);
diff --git a/bootstrap/app.php b/bootstrap/app.php
index 1c651cf..d6e8e13 100644
--- a/bootstrap/app.php
+++ b/bootstrap/app.php
@@ -52,6 +52,7 @@ return Application::configure(basePath: dirname(__DIR__))
$exceptions->render(function (ValidationException $e, Request $request) {
if ($request->is('api/*') || $request->expectsJson()) {
+ \Illuminate\Support\Facades\Log::error('API Validation Failed: ' . json_encode($e->errors()));
return ApiResponse::error(
'Validation failed',
$e->errors(),
diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php
index e614422..a4a117f 100644
--- a/database/seeders/DatabaseSeeder.php
+++ b/database/seeders/DatabaseSeeder.php
@@ -11,8 +11,8 @@ class DatabaseSeeder extends Seeder
$this->call([
RoleSeeder::class,
SamplePsgcSeeder::class,
- DevelopmentSeeder::class,
QuezonCitySeeder::class,
+ SuperAdminSeeder::class,
]);
}
}
diff --git a/database/seeders/SampleDropOffPointsSeeder.php b/database/seeders/SampleDropOffPointsSeeder.php
index 397c902..76bfbff 100644
--- a/database/seeders/SampleDropOffPointsSeeder.php
+++ b/database/seeders/SampleDropOffPointsSeeder.php
@@ -43,9 +43,16 @@ class SampleDropOffPointsSeeder extends Seeder
];
foreach ($dops as $d) {
+ $tenantId = null;
+ if ($d['barangay']) {
+ $tenant = \App\Models\Tenant::where('city_municipality_id', $d['barangay']->city_municipality_id)->first();
+ $tenantId = $tenant?->id;
+ }
+
DropOffPoint::updateOrCreate(
['code' => $d['code']],
[
+ 'tenant_id' => $tenantId,
'name' => $d['name'],
'barangay_id' => $d['barangay']?->id,
'coordinates' => new Point($d['lat'], $d['lng'], 4326),
diff --git a/resources/views/admin/lgus.blade.php b/resources/views/admin/lgus.blade.php
index 1d9293e..178a7ac 100644
--- a/resources/views/admin/lgus.blade.php
+++ b/resources/views/admin/lgus.blade.php
@@ -334,6 +334,38 @@
});
}
+ async function loadProvinces(regionCode) {
+ provinceSelect.innerHTML = '';
+ citySelect.innerHTML = '';
+ provinceSelect.disabled = true;
+ citySelect.disabled = true;
+ cityIdInput.value = '';
+
+ if (!regionCode) return;
+
+ const provRes = await window.Verde.apiFetch(`/api/v1/geo/provinces?region=${regionCode}`);
+ if (provRes.ok) {
+ provinceSelect.innerHTML = '' +
+ provRes.body.data.map(p => ``).join('');
+ provinceSelect.disabled = false;
+ }
+ }
+
+ async function loadCities(provCode) {
+ citySelect.innerHTML = '';
+ citySelect.disabled = true;
+ cityIdInput.value = '';
+
+ if (!provCode) return;
+
+ const cityRes = await window.Verde.apiFetch(`/api/v1/geo/cities?province=${provCode}`);
+ if (cityRes.ok) {
+ citySelect.innerHTML = '' +
+ cityRes.body.data.map(c => ``).join('');
+ citySelect.disabled = false;
+ }
+ }
+
// Load PSGC Geographics Dropdowns
async function loadGeoDropdowns() {
const res = await window.Verde.apiFetch('/api/v1/geo/regions');
@@ -342,39 +374,8 @@
regionSelect.innerHTML = '' +
res.body.data.map(r => ``).join('');
- regionSelect.addEventListener('change', async () => {
- provinceSelect.innerHTML = '';
- citySelect.innerHTML = '';
- provinceSelect.disabled = true;
- citySelect.disabled = true;
- cityIdInput.value = '';
-
- const regionCode = regionSelect.value;
- if (!regionCode) return;
-
- const provRes = await window.Verde.apiFetch(`/api/v1/geo/provinces?region=${regionCode}`);
- if (provRes.ok) {
- provinceSelect.innerHTML = '' +
- provRes.body.data.map(p => ``).join('');
- provinceSelect.disabled = false;
- }
- });
-
- provinceSelect.addEventListener('change', async () => {
- citySelect.innerHTML = '';
- citySelect.disabled = true;
- cityIdInput.value = '';
-
- const provCode = provinceSelect.value;
- if (!provCode) return;
-
- const cityRes = await window.Verde.apiFetch(`/api/v1/geo/cities?province=${provCode}`);
- if (cityRes.ok) {
- citySelect.innerHTML = '' +
- cityRes.body.data.map(c => ``).join('');
- citySelect.disabled = false;
- }
- });
+ regionSelect.addEventListener('change', () => loadProvinces(regionSelect.value));
+ provinceSelect.addEventListener('change', () => loadCities(provinceSelect.value));
citySelect.addEventListener('change', () => {
const opt = citySelect.options[citySelect.selectedIndex];
@@ -615,19 +616,15 @@
if (reg) {
regionSelect.value = reg.psgc_code;
- regionSelect.dispatchEvent(new Event('change'));
+ await loadProvinces(reg.psgc_code);
- setTimeout(async () => {
- if (prov) {
- provinceSelect.value = prov.psgc_code;
- provinceSelect.dispatchEvent(new Event('change'));
-
- setTimeout(() => {
- citySelect.value = city.psgc_code;
- cityIdInput.value = city.id;
- }, 300);
- }
- }, 300);
+ if (prov) {
+ provinceSelect.value = prov.psgc_code;
+ await loadCities(prov.psgc_code);
+
+ citySelect.value = city.psgc_code;
+ cityIdInput.value = city.id;
+ }
}
}
@@ -731,6 +728,11 @@
payload.city_municipality_id = parseInt(cityIdInput.value, 10);
+ if (editingTenantUuid) {
+ delete payload.admin_email;
+ delete payload.admin_password;
+ }
+
const method = editingTenantUuid ? 'PATCH' : 'POST';
const url = editingTenantUuid
? `/api/v1/super-admin/tenants/${editingTenantUuid}`
diff --git a/tests/Feature/Api/V1/SuperAdmin/SuperAdminTenantTest.php b/tests/Feature/Api/V1/SuperAdmin/SuperAdminTenantTest.php
index c3c166e..bee62cd 100644
--- a/tests/Feature/Api/V1/SuperAdmin/SuperAdminTenantTest.php
+++ b/tests/Feature/Api/V1/SuperAdmin/SuperAdminTenantTest.php
@@ -187,4 +187,11 @@ class SuperAdminTenantTest extends TestCase
'id' => $tenant->id,
]);
}
+
+ public function test_per_page_validation(): void
+ {
+ Sanctum::actingAs($this->superAdmin);
+ $response = $this->getJson('/api/v1/super-admin/tenants?per_page=100');
+ $response->assertStatus(200);
+ }
}