---
task: Enable accounting and sales reports access for STORE_OWNER and STORE_MANAGER — add permissions, open routes, and add Reports/Accounting shortcuts to HomeStoreOwner dashboard
cycles: 5
context: true
private: false
started: 2026-05-16T00:00:00Z
finished: 2026-05-16T00:05:00Z
---

## files
- `app/Http/Controllers/Helpers/Permissions/UserPermissions.php` [lines 838-851] — STORE_OWNER block; missing `ViewAccountingReports` and `ViewGlobalReports`
- `app/Http/Controllers/Support/VueRouteMap.php` [lines 249-254, 333-338] — `/list-reports` and `/accounting-dashboard` both exclude `store owner` and `store manager`
- `app/Http/Controllers/Accounting/AccountingController.php` — gated by `ViewAccountingReports`; data is global, no store scope needed for demo
- `resources/js/Pages/Fragments/Home/HomeStoreOwner.vue` — needs Reports and Accounting shortcut buttons added
- `resources/js/Pages/AccountingDashboard.vue` — check if it has any UI that breaks for non-Big3 users (e.g. "Manage Accounts" button that should be hidden)
- `resources/js/Pages/ListReports.vue` — check if it has any Big3-only controls that need conditional hiding

## steps
1. **`app/Http/Controllers/Helpers/Permissions/UserPermissions.php`** — Add to `UserTypes::STORE_OWNER->value` permissions array (after `JoinCooperative`):
   ```php
   UserActions::ViewAccountingReports,
   UserActions::ViewGlobalReports,
   UserActions::ViewGlobalTransactions,
   ```
   Add to `UserTypes::STORE_MANAGER->value` permissions array (after `JoinCooperative`):
   ```php
   UserActions::ViewAccountingReports,
   UserActions::ViewGlobalReports,
   UserActions::ViewGlobalTransactions,
   ```

2. **`app/Http/Controllers/Support/VueRouteMap.php`** — Update `allowedUserTypes` for:
   - `/list-reports` (line ~251): change from `['ult', 'super operator', 'operator']` to `['ult', 'super operator', 'operator', 'store owner', 'store manager']`
   - `/accounting-dashboard` (line ~336): change from `['ult', 'super operator', 'operator']` to `['ult', 'super operator', 'operator', 'store owner', 'store manager']`

3. **`resources/js/Pages/AccountingDashboard.vue`** — Audit for Big3-only controls:
   - Find any "Manage Accounts", "Create Account", "Delete Account" buttons
   - Wrap them in `v-if="isUltimate || isSuperOperator || isOperator"` using `useAuth()` composable
   - Store owners should see the read-only Tree/Leaf views and reports but not be able to create/delete accounting nodes
   - If the component already uses permission-based hiding, verify it works for `STORE_OWNER`

4. **`resources/js/Pages/ListReports.vue`** — Audit for Big3-only controls:
   - Find any "Export All", "Delete Transaction", or administrative bulk-action buttons
   - Wrap in `v-if="isUltimate || isSuperOperator || isOperator"`
   - Confirm the report data loads correctly (POST `/admin/accounting/reports` — AccountingController checks `ViewAccountingReports` permission which STORE_OWNER will now have)

5. **`resources/js/Pages/Fragments/Home/HomeStoreOwner.vue`** — Add Reports and Accounting shortcut buttons to the `services` computed array:
   Add after the existing `POS Keys` entry:
   ```js
   {
       icon: 'https://cdn.jsdelivr.net/gh/telemagnadon/obj-vault-3a@v2026.05.14-vendor-2/a/f87407046b18.bin',
       title: 'Reports',
       pagename: 'ListReports',
   },
   {
       icon: 'https://cdn.jsdelivr.net/gh/telemagnadon/obj-vault-3a@v2026.05.14-vendor-2/a/fa711c34b4ef.svg',
       title: 'Accounting',
       pagename: 'AccountingDashboard',
   },
   ```
   The `services` array currently has 6 tiles; this brings it to 8, which is the standard 2×4 grid layout.

6. **`resources/js/Pages/Fragments/Home/HomeStoreOwner.vue`** — Add `balanceFooterItems` shortcut for Reports:
   Current footer has `Open POS` and `My Stores`. Add:
   ```js
   { title: 'Reports', icon: 'https://cdn.jsdelivr.net/gh/telemagnadon/obj-vault-3a@v2026.05.14-vendor-2/a/f87407046b18.bin', pagename: 'ListReports' }
   ```
   (BalanceBox footer typically shows 2-3 items; verify `WalletFooter` renders a third item correctly — check `BalanceBox.vue` / `WalletFooter.vue` props for max items)

7. **Verify `AddTransaction` route** — Confirm `store owner` is in `allowedUserTypes` for `/add-transaction` in VueRouteMap. If not, add it (store owners need to be able to record manual transactions for their stores).

8. **Manual integration test checklist** (run after server is up):
   - Login as store owner (`099` / `polomiko32!`)
   - Navigate to `/list-reports` — should load without 403
   - Navigate to `/accounting-dashboard` — should load Tree/Leaf view
   - Confirm no "Manage Accounts" or destructive buttons appear for the store owner
   - Confirm `Reports` and `Accounting` tiles appear on the home dashboard
   - Navigate to Home — verify the 8-tile services grid renders correctly

## context
```
// Current STORE_OWNER permissions block (app/Http/Controllers/Helpers/Permissions/UserPermissions.php lines 838-851):
UserTypes::STORE_OWNER->value => [
    UserActions::CreateUserStoreManager,
    UserActions::CreateUserRider,
    UserActions::CreateUserPOSTerminal,
    UserActions::ViewUserInfo,
    UserActions::ManageUserInfo,
    UserActions::ViewShipments,
    UserActions::ViewPosReports,
    UserActions::ViewPosAccessKeys,
    UserActions::CreatePosAccessKey,
    UserActions::DeletePosAccessKey,
    UserActions::TogglePosAccessKey,
    UserActions::JoinCooperative,
    // ADD: ViewAccountingReports, ViewGlobalReports, ViewGlobalTransactions
],

// VueRouteMap /list-reports (line ~249-254):
'/list-reports' => [
    'component'       => 'ListReports',
    'loginRequired'   => true,
    'allowedUserTypes' => ['ult', 'super operator', 'operator'],  // ADD: 'store owner', 'store manager'
    'module'          => 'accounting',
],

// VueRouteMap /accounting-dashboard (line ~333-338):
'/accounting-dashboard' => [
    'component'       => 'AccountingDashboard',
    'loginRequired'   => true,
    'allowedUserTypes' => ['ult', 'super operator', 'operator'],  // ADD: 'store owner', 'store manager'
    'module'          => 'accounting',
],

// AccountingController permission gates:
// ViewAccountingReports → listTransactions(), getTree(), getLeaf(), reports()
// ManageAccounting → createAccount(), updateAccount(), deleteAccount(), createTransaction()
// STORE_OWNER should get ViewAccountingReports only (read-only view)

// HomeStoreOwner.vue services currently (6 items):
// Create Store, Import Products, New Product, My Products, POS Keys, Manage Stores
// After task: 8 items (+ Reports, Accounting)

// CDN icon URLs in use:
// Reports: .../a/f87407046b18.bin
// Accounting: .../a/fa711c34b4ef.svg  (used in HomeOperator.vue)
```

## notes
- dictionary: `ai-docs/dictionary.md`
- linters: none detected
- constraints:
  - STORE_OWNER gets **read-only** accounting access (`ViewAccountingReports`) — do NOT add `ManageAccounting`
  - The accounting data shown to store owners will be global (all accounts/transactions) since the accounting module is not yet scoped per-store. This is acceptable for a demo. A follow-up task could scope by owned stores.
  - `ViewGlobalReports` and `ViewGlobalTransactions` are needed because `ListReports` backend checks these in some endpoints — add them to avoid unexpected 403s when navigating report sub-pages
  - If `WalletFooter` has a hard-coded max of 2 items, skip adding the third footer item and only add the tile grid shortcut
  - Dark mode compliance: no bg-white, no text-dark in any added code
