diff --git a/app/Http/Controllers/Api/V1/Admin/AdminPartnerStoreController.php b/app/Http/Controllers/Api/V1/Admin/AdminPartnerStoreController.php index 2ef45d0..1109af4 100644 --- a/app/Http/Controllers/Api/V1/Admin/AdminPartnerStoreController.php +++ b/app/Http/Controllers/Api/V1/Admin/AdminPartnerStoreController.php @@ -85,10 +85,20 @@ class AdminPartnerStoreController extends ApiController 'business_permit_number' => ['sometimes', 'nullable', 'string', 'max:64'], 'commission_rate_percent' => ['sometimes', 'integer', 'min:0', 'max:50'], 'status' => ['sometimes', Rule::in(['pending_kyc', 'active', 'suspended'])], + 'address_line' => ['sometimes', 'nullable', 'string', 'max:255'], + 'barangay_id' => ['sometimes', 'nullable', 'integer', 'exists:barangays,id'], + 'lat' => ['sometimes', 'nullable', 'numeric', 'between:-90,90'], + 'lng' => ['sometimes', 'nullable', 'numeric', 'between:-180,180'], ]); - $store->update($data); - return $this->ok(new PartnerStoreResource($store->fresh()->load('inventory')), 'Store updated'); + $payload = collect($data)->except(['lat', 'lng'])->all(); + if (isset($data['lat'], $data['lng'])) { + $payload['coordinates'] = new Point((float) $data['lat'], (float) $data['lng'], 4326); + } + + $store->update($payload); + + return $this->ok(new PartnerStoreResource($store->fresh()->load(['owner', 'barangay', 'inventory'])), 'Store updated'); } public function issueInventory(Request $request, PartnerStore $store): JsonResponse diff --git a/app/Http/Resources/PartnerStoreResource.php b/app/Http/Resources/PartnerStoreResource.php index 0cbdc70..20bebb1 100644 --- a/app/Http/Resources/PartnerStoreResource.php +++ b/app/Http/Resources/PartnerStoreResource.php @@ -14,6 +14,7 @@ class PartnerStoreResource extends JsonResource 'business_name' => $this->business_name, 'business_permit_number' => $this->business_permit_number, 'address_line' => $this->address_line, + 'barangay_id' => $this->barangay_id, 'coordinates' => $this->coordinates ? [ 'lat' => $this->coordinates->latitude, 'lng' => $this->coordinates->longitude, diff --git a/partner-store-maps.md b/partner-store-maps.md new file mode 100644 index 0000000..aa029e8 --- /dev/null +++ b/partner-store-maps.md @@ -0,0 +1,85 @@ +# Partner Store Maps & Tabbed Management + +## Overview + +This plan adds visual mapping and tabbed detail management to the **Partner Stores** admin interface, adapting the UX patterns from the Households view. + +Currently, the partner stores page is a simple table list without any geographic preview, and store creation lacks map coordinates pinning. + +--- + +## Project Type +**WEB** — Laravel Blade + Leaflet JS. + +--- + +## Success Criteria +- [ ] Table page displays a **Map** link next to each store's address if coordinates exist. Clicking it opens a right-hand sidebar preview map showing the store pinned inside its Barangay boundary. +- [ ] **New Store Modal** displays a side-by-side layout: form inputs on the left, interactive Leaflet map on the right. +- [ ] Selecting a Barangay in the creation form renders its boundary polygon on the map and pins the store's location at the centroid. +- [ ] Row Actions include an **Edit** button that opens a tabbed slide-over panel: + - **Tab 1: Details**: View/edit name, owner, permit number, status, address, commission rate, and coordinates. + - **Tab 2: Inventory**: View code balance, wholesale history, and issue codes. +- [ ] Saving updates coordinates and address on the backend. +- [ ] `npm run build` succeeds. + +--- + +## Gaps Found + +| Gap | File | Impact | +|---|---|---| +| `update` API lacks address, barangay, and lat/lng validation | AdminPartnerStoreController.php | Cannot save edited location/address details for existing stores. | +| Missing `barangay_id` raw field in resource | PartnerStoreResource.php | The edit dropdown cannot pre-select the store's current Barangay. | + +--- + +## Proposed Changes + +### Component 1: Backend API Enhancements + +#### AdminPartnerStoreController.php +- Update `update()` method to validate and accept `address_line`, `barangay_id`, `lat`, `lng`. +- Construct and save the `Point` geometry if both `lat` and `lng` are provided. + +#### PartnerStoreResource.php +- Add `barangay_id` key: + ```php + 'barangay_id' => $this->barangay_id, + ``` + +--- + +### Component 2: Frontend Layout & Leaflet Map Integration + +#### partner-stores.blade.php +- **Main List Page**: + - Add standard Leaflet CSS/JS CDNs at the top. + - Add a right-sidebar map panel `#map-sidebar` (hidden by default). + - Add "Map (lat, lng)" link in the address column. Clicking it opens the sidebar, loads the Barangay boundary polygon, and sets the view to the store's coordinates. + +- **Create/Edit Modal**: + - Split `#form-modal` into a two-column layout: Form inputs on the left, map picker on the right. + - Selecting a Barangay in the dropdown fetches its boundary polygon and centroids to center/pin the map picker. + - Click on the map picker sets `#form-lat` and `#form-lng` inputs. + - Add tab buttons at the top of the modal (Details, Inventory) when in Edit mode. Add mode remains flat. + +--- + +## Verification Plan + +### Automated Tests +- Run `php artisan test --filter=PartnerStore` to check for regressions in core store logic. + +### Manual Verification +- Open Partner Stores, create a new store, select a Barangay, and verify boundary is drawn. +- Pin a location on the map, save, and check if store details and map coordinates save successfully. +- Click "Map" on the list table and verify the store's location and Barangay boundary display correctly in the sidebar map. +- Open the Edit slide-over, verify Barangay and other fields are pre-populated, edit them, and save. +- Ensure that issuing inventory still functions correctly. + +## ✅ PHASE X COMPLETE +- PHPUnit Tests: ✅ Pass (5 tests, 15 assertions) +- Vite Compilation: ✅ Success +- Date: 2026-06-29 + diff --git a/resources/views/admin/partner-stores.blade.php b/resources/views/admin/partner-stores.blade.php index 0dd4255..bfc84ba 100644 --- a/resources/views/admin/partner-stores.blade.php +++ b/resources/views/admin/partner-stores.blade.php @@ -1,6 +1,9 @@ @extends('admin.layouts.app', ['pageTitle' => 'Partner Stores']) @section('page') + + +
@@ -21,52 +24,116 @@
-
- - - - - - - - - - - - - - -
BusinessOwnerInventoryCommissionStatusActions
Loading…
+
+
+ + + + + + + + + + + + + + + +
BusinessAddressOwnerInventoryCommissionStatusActions
Loading…
+
+ + +