diff --git a/app/Http/Controllers/Pos/LocationController.php b/app/Http/Controllers/Pos/LocationController.php index ed08183..bba3ebd 100644 --- a/app/Http/Controllers/Pos/LocationController.php +++ b/app/Http/Controllers/Pos/LocationController.php @@ -23,10 +23,9 @@ class LocationController extends Controller private SubscriptionService $subscriptions, ) {} - public function index(Request $request): View + public function index(Request $request): RedirectResponse { $owner = $this->ownerRef($request); - $account = ladill_account() ?? $request->user(); abort_unless( app(\App\Services\Pos\PosMemberResolver::class)->canManageBranches( @@ -37,13 +36,7 @@ class LocationController extends Controller 403, ); - $branches = PosLocation::owned($owner)->orderBy('name')->get(); - - return view('pos.branches.index', [ - 'branches' => $branches, - 'canAddBranch' => $this->subscriptions->canAddLocation($account, $owner), - 'hasMultiLocation' => $this->subscriptions->canUseMultiLocation($account), - ]); + return redirect()->route('pos.settings')->withFragment('branches'); } public function create(Request $request): View|RedirectResponse @@ -85,7 +78,7 @@ class LocationController extends Controller 'is_default' => $isFirst, ]); - return redirect()->route('pos.branches.index')->with('success', 'Branch created.'); + return redirect()->route('pos.settings')->withFragment('branches')->with('success', 'Branch created.'); } public function edit(Request $request, PosLocation $location): View|RedirectResponse @@ -130,7 +123,7 @@ class LocationController extends Controller 'service_style' => $data['service_style'], ]); - return redirect()->route('pos.branches.index')->with('success', 'Branch updated.'); + return redirect()->route('pos.settings')->withFragment('branches')->with('success', 'Branch updated.'); } public function destroy(Request $request, PosLocation $location): RedirectResponse @@ -165,7 +158,7 @@ class LocationController extends Controller $request->session()->forget('ladill_pos_location'); } - return redirect()->route('pos.branches.index')->with('success', 'Branch removed.'); + return redirect()->route('pos.settings')->withFragment('branches')->with('success', 'Branch removed.'); } public function switch(Request $request): RedirectResponse diff --git a/app/Http/Controllers/Pos/MemberController.php b/app/Http/Controllers/Pos/MemberController.php index 0998102..0a13700 100644 --- a/app/Http/Controllers/Pos/MemberController.php +++ b/app/Http/Controllers/Pos/MemberController.php @@ -12,7 +12,6 @@ use App\Services\Pos\SubscriptionService; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Validation\Rule; -use Illuminate\View\View; class MemberController extends Controller { @@ -20,20 +19,13 @@ class MemberController extends Controller public function __construct(private SubscriptionService $subscriptions) {} - public function index(Request $request): View|RedirectResponse + public function index(Request $request): RedirectResponse { if ($redirect = $this->guardManage($request)) { return $redirect; } - $owner = $this->ownerRef($request); - $members = PosMember::owned($owner)->with('location')->orderBy('created_at')->get(); - - return view('pos.team.index', [ - 'members' => $members, - 'roles' => config('pos.roles', []), - 'branches' => PosLocation::owned($owner)->orderBy('name')->get(), - ]); + return redirect()->route('pos.settings')->withFragment('team'); } public function store(Request $request, IdentityTeamClient $identity): RedirectResponse @@ -89,7 +81,7 @@ class MemberController extends Controller ], ); - return back()->with('success', 'Invitation sent to '.$email.'.'); + return back()->withFragment('team')->with('success', 'Invitation sent to '.$email.'.'); } public function destroy(Request $request, PosMember $member): RedirectResponse @@ -107,7 +99,7 @@ class MemberController extends Controller $member->delete(); - return back()->with('success', 'Team member removed.'); + return back()->withFragment('team')->with('success', 'Team member removed.'); } private function guardManage(Request $request): ?RedirectResponse diff --git a/app/Http/Controllers/Pos/SettingsController.php b/app/Http/Controllers/Pos/SettingsController.php index 123670e..e604b50 100644 --- a/app/Http/Controllers/Pos/SettingsController.php +++ b/app/Http/Controllers/Pos/SettingsController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Pos; use App\Http\Controllers\Controller; use App\Http\Controllers\Pos\Concerns\ScopesToAccount; use App\Models\PosLocation; +use App\Models\PosMember; use App\Models\PosTable; use App\Services\Import\CrmProductImportService; use App\Services\Import\MerchantCatalogImportService; @@ -28,9 +29,21 @@ class SettingsController extends Controller { $owner = $this->ownerRef($request); $location = $this->location($request); + $account = ladill_account() ?? $request->user(); + $scope = $this->locationScope($request); + + $branches = $scope === null + ? PosLocation::owned($owner)->orderBy('name')->get() + : PosLocation::owned($owner)->whereKey($scope)->orderBy('name')->get(); return view('pos.settings', [ 'location' => $location, + 'branches' => $branches, + 'members' => PosMember::owned($owner)->with('location')->orderBy('created_at')->get(), + 'roles' => config('pos.roles', []), + 'hasMultiLocation' => $this->subscriptions->canUseMultiLocation($account), + 'hasTeamFeatures' => $this->subscriptions->canManageTeam($account), + 'canAddBranch' => $this->subscriptions->canAddLocation($account, $owner), 'merchantImportEnabled' => (bool) config('pos.merchant_import_enabled', true), 'tables' => $this->scopeToLocation($request, PosTable::owned($owner)) ->orderBy('area')->orderBy('position')->orderBy('label')->get(), diff --git a/resources/views/partials/topbar-location-switcher.blade.php b/resources/views/partials/topbar-location-switcher.blade.php index 093886b..2865e36 100644 --- a/resources/views/partials/topbar-location-switcher.blade.php +++ b/resources/views/partials/topbar-location-switcher.blade.php @@ -20,7 +20,7 @@ @endforeach @if (! empty($canManageBranches))
- Manage branches + Manage branches
@endif diff --git a/resources/views/pos/branches/create.blade.php b/resources/views/pos/branches/create.blade.php index 2b1afcd..dd5c92c 100644 --- a/resources/views/pos/branches/create.blade.php +++ b/resources/views/pos/branches/create.blade.php @@ -23,7 +23,7 @@
- Cancel + Cancel
diff --git a/resources/views/pos/branches/edit.blade.php b/resources/views/pos/branches/edit.blade.php index 10666f4..4cdb8b5 100644 --- a/resources/views/pos/branches/edit.blade.php +++ b/resources/views/pos/branches/edit.blade.php @@ -28,7 +28,7 @@ Default branch for admins
- Cancel + Back
diff --git a/resources/views/pos/settings.blade.php b/resources/views/pos/settings.blade.php index c024803..65004bc 100644 --- a/resources/views/pos/settings.blade.php +++ b/resources/views/pos/settings.blade.php @@ -1,19 +1,6 @@ - -
-

- Editing {{ $location->name }} -

-
- @if (! empty($canManageBranches)) - Branches - @endif - @if (! empty($canManageTeam)) - Team - @endif -
-
- + +
@csrf @method('PUT') @@ -98,6 +85,14 @@
+
+ @include('pos.settings._branches-section') + + @if (! empty($canManageTeam)) + @include('pos.settings._team-section') + @endif +
+ @if ($location->isRestaurant())
diff --git a/resources/views/pos/settings/_branches-section.blade.php b/resources/views/pos/settings/_branches-section.blade.php new file mode 100644 index 0000000..efcf7ed --- /dev/null +++ b/resources/views/pos/settings/_branches-section.blade.php @@ -0,0 +1,52 @@ + + @if ($branches->isNotEmpty()) +
    + @foreach ($branches as $branch) +
  • +
    +

    + {{ $branch->name }} + @if ($branch->id === $location->id) + Active + @endif + @if ($branch->is_default) + Default + @endif +

    +

    + {{ strtoupper($branch->currency) }} + · {{ $branch->isRestaurant() ? 'Restaurant' : 'Retail' }} +

    +
    +
    + @if ($branch->id !== $location->id) +
    + @csrf + + +
    + @endif + @if (! empty($canManageBranches) && $hasMultiLocation) + Edit + @endif +
    +
  • + @endforeach +
+ @else +

No branches yet.

+ @endif + +
+ @if (! empty($canManageBranches) && $hasMultiLocation && $canAddBranch) + Add branch + @endif + @unless ($hasMultiLocation) +

+ Multi-branch POS is available on + Pro or Business. + Your account is limited to one branch. +

+ @endunless +
+
diff --git a/resources/views/pos/settings/_team-section.blade.php b/resources/views/pos/settings/_team-section.blade.php new file mode 100644 index 0000000..d634c2d --- /dev/null +++ b/resources/views/pos/settings/_team-section.blade.php @@ -0,0 +1,88 @@ + + @if (! empty($canManageTeam) && $hasTeamFeatures) +
+ @csrf +
+ + +
+
+ + +
+
+ + +

+ Required for cashiers — they will only see this branch on the register and in sales. +

+
+
+ +
+
+ +
+

Team members

+ @if ($members->isEmpty()) +

No team members yet. Invite a cashier or manager above.

+ @else +
+ + + + + + + + + + + @foreach ($members as $member) + @php + $display = str_contains($member->user_ref, '@') + ? $member->user_ref + : (\App\Models\User::where('public_id', $member->user_ref)->value('email') ?? $member->user_ref); + @endphp + + + + + + + @endforeach + +
MemberRoleBranch
{{ $display }}{{ $roles[$member->role] ?? $member->role }}{{ $member->location?->name ?? 'All branches' }} + @if ($member->user_ref !== auth()->user()->public_id && $member->user_ref !== strtolower((string) auth()->user()->email)) +
+ @csrf + @method('DELETE') + +
+ @endif +
+
+ @endif +
+ @else +

+ Team invites and branch assignment require + Ladill POS Pro or Business. +

+ @endif +
diff --git a/tests/Feature/PosMultiBranchTest.php b/tests/Feature/PosMultiBranchTest.php index d811e35..e8ddc2b 100644 --- a/tests/Feature/PosMultiBranchTest.php +++ b/tests/Feature/PosMultiBranchTest.php @@ -99,7 +99,7 @@ class PosMultiBranchTest extends TestCase 'currency' => 'GHS', 'service_style' => 'retail', ]) - ->assertRedirect(route('pos.branches.index')); + ->assertRedirect(route('pos.settings').'#branches'); $this->assertSame(2, PosLocation::owned($owner->public_id)->count()); }