Plain-English summary
Settings is where the organisation's structure and rules are defined — before any order can flow, you need at least an outlet, a register, a payment method, and a tax configuration. In the new admin backoffice (admin.foodops.io) the Settings rail groups the sub-sections into seven groups: Organization, Accounting, Discounts, Outlets, Inventory, Customisation, Integrations (settingsNavConfig.ts). Each sub-section is a standalone page with its own list + form pattern.
Note (NEW STACK): this regroups the old layout. Money config — Currencies, Taxes, Service Fees, Payment Methods — moved out of "Organization" into the new Accounting group; the old "Restaurant" group is now Outlets; and the Inventory settings group now contains only Units of Measure (Brands moved to Catalog, Warehouses to the top-level Inventory area). The Integrations group page exists in the nav but currently shows Coming soon — its REST endpoints aren't exposed yet (BML/Dhiraagu/Twilio etc. will appear when implemented).
When you'd use this
- First-time setup — walk each section once to get the org usable
- Adding a new outlet, payment method, or tax rate
- Customising receipt templates or transaction numbering (invoice series)
- Connecting third-party services (payment gateways, delivery platforms, accounting)
- Changing org-wide defaults — currency, discount reason types, units of measure
Once configured, these screens are rarely touched — most restaurant work happens at POS, Kitchen, Reports, and Purchasing, not here.
How to access
- URL:
/settings/...— pages use a/settings/{group}/{section}pattern (e.g./settings/organization/taxes,/settings/restaurant/outlets,/settings/customisation/pdf-templates) - Sidebar: the gear/Settings entry in the admin sidebar opens the Settings rail (
SettingsShell/SettingsNav)

The setting categories (7 groups)
1. Organization
Org identity + people.
| Page | URL | What it does |
|---|---|---|
| Account Profile | /settings/organization/profile |
Company name, registration details, logo — appears on every receipt and invoice |
| Users | /settings/organization/users |
In-app user admin (Members + Role groups tabs) — see Users & Roles |
| Audit Log | /settings/audit-log |
Immutable record of user actions |
Account Reset / Data Reset still exist as pages (
AccountResetPage.tsx,DataResetPage.tsx) but are not in the Settings rail's nav config; they are reached via the danger-zone surfaces. Currencies/Taxes/Service Fees/Payment Methods are no longer here — see Accounting below.
1b. Accounting (NEW group)
The money config that used to sit under Organization.
| Page | URL | What it does |
|---|---|---|
| Currencies | /settings/organization/currencies |
Currency list + per-currency cash denominations. See Currencies |
| Taxes | /settings/organization/taxes |
Tax types available on items. See Taxes |
| Service Fees | /settings/organization/service-fees |
Auto-applied service charges by order type. See Service Fees |
| Payment Methods | /settings/organization/payment-methods |
Methods available at the POS (Cash / Card / Transfer plus custom) |
| BML Payment Gateway | /settings/organization/bml-payment-gateway |
Connect a Bank of Maldives Connect merchant account (API key, device/app ID, sign method, currency) to enable an "Online" BML QR payment tender at the counter |
Taxes page detail
Two out-of-the-box tax rates:

| Tax | Rate | Notes |
|---|---|---|
| Zero | 0.00% | Tax-exempt items (e.g., certain exports, charities) |
| GST | 8.00% | DEFAULT. Maldives Goods & Services Tax — applies to most F&B sales |
Each tax splits into Output Tax (what you charge customers on sales) and Input Tax (what you pay on purchases — claimable against output in GST filing).
Payment Methods page detail
Three default methods — Cash, Transfer, Card — all Active. The Reference no column shows "—" for Cash (not required) and "Required" for Transfer and Card; an Order column (display sequence) is also present. Add payment method creates custom methods:

Note: Integrations appears in the Settings nav but currently shows "Coming soon" (
/settings/integrations— "Integration management endpoints are not yet exposed via REST API"). Provider connections (Dhiraagu, Twilio, etc.) will appear here when implemented; don't promise it as functional yet. BML Payment Gateway shipped as its own page under Accounting (/settings/organization/bml-payment-gateway), backed bybmlMerchantService— it's a working credential-save form (API key, device/app ID, sign method), not part of this Integrations stub. (Live-verified 2026-06-29; BML re-pointed 2026-07-22.)
- Cash — physical currency, drives Cash Summary report
- Transfer — bank transfer, needs account details linked
- Card — card terminal / payment gateway payment
Add custom methods (Venmo, mobile money) via Add Method. Each method can be gated to specific outlets or registers.
2. Discounts
Rules for promotional and standing discounts.
| Page | URL | What it does |
|---|---|---|
| Discounts | /settings/discounts/list |
Create named discount rules (e.g., "Happy Hour 20%", "Staff Meal") |
| Discount Reason Types | /settings/discounts/reason-types |
Reasons that must be chosen when applying an ad-hoc discount at POS (for audit) |
3. Outlets
Physical-layout and operational config specific to the restaurant concept. (This is the group the old layout called "Restaurant".)
| Page | URL | What it does |
|---|---|---|
| General | /settings/restaurant/general |
Org-wide POS/restaurant preferences that apply across every outlet — see below |
| Outlets | /settings/restaurant/outlets |
Each physical location — see below |
| Delivery Sectors | /settings/restaurant/delivery-sectors |
Delivery zones with per-zone fees and ETAs |
General page detail
General (/settings/restaurant/general) is the org-wide preferences page — the default behaviours the POS and printed documents use unless an outlet overrides them (e.g. receipt/printing defaults and other restaurant-wide POS preferences). It's org-scoped: change something here and it applies everywhere, versus the per-outlet configuration on the Outlets page. Think of General as "how this restaurant behaves by default" and Outlets as "how each location differs."
Outlets page detail
The Outlets page is deep — each outlet is a self-contained configuration block:

Each outlet has:
- Outlet Details — address, phone, linked warehouse
- Registers — named registers with cash drawers; each Register has an open/close session lifecycle
- Kitchens — KDS stations for this outlet (see Kitchen Display)
- Services — toggle Dine-In / Delivery / Takeout on or off; each service can be routed to a specific register
- Floor Layout — the visual canvas for Dine-In. Add floors, drag tables, set seat counts; print table QR codes for scan-to-order
- Bank Details — linked bank accounts for outlet-level transfers
- Reference Numbers — outlet-level reference number settings (new section rendered after Bank Details for every outlet; exact fields not yet documented, screenshot 44 needs refresh)
4. Inventory
The Inventory settings group contains Units of Measure and — for users with a maintenance role — Stock Readiness (requiresInventory).
| Page | URL | What it does |
|---|---|---|
| Units of Measure | /settings/inventory/units |
Units + unit conversions for ingredients |
| Stock Readiness | /settings/inventory/stock-readiness |
Diagnose & repair an org's stock configuration, and reset stock to a clean baseline before the first count — maintenance-role only (see detail below) |
Note: Brands and Warehouses moved OUT of Settings In the new stack Brands live under Catalog (
/catalog/brands) and Warehouses under the top-level Inventory area (/inventory/warehouses) — they are no longer Settings sub-pages. The Warehouses/Units detail blocks below are retained for conceptual reference; the warehouse one now describes a non-Settings page.
Warehouses page detail

Every outlet gets a default Primary Warehouse on creation. Multi-warehouse mode (toggle on this page) is needed for central warehouses serving multiple outlets.
Units of Measure page detail
~30 pre-loaded units across 6 unit types:

- Weight: tonne, kilogram, gram, milligram, microgram
- Volume: litre, millilitre, cubic metre
- Length: kilometer, metre, centimeter, millimeter, Micrometer, Nanometer
- Area: square metre
- Time: hour, minute, second
- Quantity: pieces, bag, case, Nos, Each, lump sum, Unit, Pallet, Package, Box
Recipes need compatible units — e.g., if an ingredient is bought in kg but used in g per serving, Foodops converts automatically.
Stock Readiness page detail
Stock Readiness is a diagnostic-and-repair tool for an org's inventory setup. It is only visible to users with a maintenance role (e.g. the Owner) — most staff never see it. Its stated purpose: "Check whether this organisation is configured correctly for stock, repair any problems, and reset stock to a clean baseline before an opening count." It's mainly a pre-launch / support tool. [code: foodops-admin-app/apps/admin/src/pages/settings/inventory/StockReadinessPage.tsx @cb5f1c22]
It has four things, top to bottom:
- Checks — runs a set of configuration checks and lists each with a status and sample offenders. Re-run checks re-evaluates.
- Fix configuration — creates any missing warehouses, stock locations, virtual locations and transaction reasons, and seeds item stock rows. It never changes stock on hand. It may release stale committed-stock reservations — stock held by nothing (no pending stock document or open sales order behind it) — which is often what unblocks a reset. It reports exactly what it changed (and any warnings where it declined to act).
- Discard in-flight stock documents (danger zone) — cancels the org's open sales orders, discards its pending stock documents, and releases every stock reservation they hold. Stock on hand is not changed. This is the escape hatch when committed stock is backed by real live documents that "Fix configuration" won't touch. Requires typing a confirm phrase. Cannot be undone.
- Reset stock to zero (danger zone) — sets every item's stock on hand to zero, clears all stock locations and cost layers, and archives the existing stock ledger. Intended for a pre-launch org before its first stock count. Requires typing the org name to confirm, and is blocked while any of the above blockers exist. Cannot be undone.
Warning: The two danger-zone actions are irreversible and org-wide. They exist for pre-launch setup and support recovery, not day-to-day operations — a live restaurant should never need "Reset stock to zero."
5. Customisation
Look-and-feel and numbering customisation.
| Page | URL | What it does |
|---|---|---|
| PDF Templates | /settings/customisation/pdf-templates (list) → /settings/customisation/pdf-templates/{new,:id/edit} (editor) |
Receipt, invoice, PO template customisation via a full-page visual block-builder (drag-and-drop blocks, live preview, Visual/HTML toggle) — see PDF Templates |
| Transaction Series | /settings/customisation/transaction-series |
Numbering series — e.g., invoices start at INV-0001, prefix "2026-", reset yearly |
| Import Wizard | /settings/customisation/import-wizard |
Bulk import suppliers, customers, items via spreadsheet |
6. Integrations
Third-party connections. The page exists at the bottom of the settings hub; specific integrations vary by org.
Finance-only settings (not part of FoodOps)
Some settings sections in the same back-office nav belong to Hubits Finance, not FoodOps, and only appear for finance-enabled orgs (showForBrands: ['finance']) — they are out of scope for FoodOps and are documented by the Finance product, not here:
- Accountants (
/settings/organization/bookkeepers, page title "Accountants & Bookkeepers") — inviting external accountants/bookkeepers to a Finance org. - Period Locks (
/settings/period-locks) — locking accounting periods so past-period entries can't be changed.
If someone asks how to use Accountants or Period Locks, that's a Hubits Finance question — FoodOps settings doesn't include them. [code: foodops-admin-app/apps/admin/src/pages/settings/settingsNavConfig.ts — showForBrands:['finance'] / FINANCE_ONLY @cb5f1c22]
Walkthrough — first-time configuration order
For a brand-new org, a sensible sequence:
- Account Profile — company name, logo, legal details (first impression on every receipt)
- Currencies — confirm MVR default; add others if needed
- Taxes — verify GST rate matches your jurisdiction (8% for Maldives); add Zero-rated if needed
- Units of Measure — review the pre-loaded list; add anything exotic
- Brands — if running multi-brand, create them now before menu setup
- Warehouses — single Primary Warehouse is fine for single-outlet start
- Outlets — create each physical location with its registers, kitchens, floors, tables
- Payment Methods — verify Cash/Card/Transfer defaults; add custom
- Service Fees — set service charge if applicable
- Discounts — create promotional rules for happy hour, staff meals, etc.
- Discount Reason Types — define audit reasons before cashiers need them
- Delivery Sectors — if doing delivery, define zones and fees
- PDF Templates — customise receipts and invoices (logo, footer)
- Transaction Series — set numbering conventions before first orders
- Users — invite staff via the SSO portal (see Users & Roles)
Once done, the org is ready for menu setup → POS operation.
Key concepts
- Outlet — one physical location (restaurant, branch). Has its own registers, kitchens, floors, tables, warehouse. Orders happen at outlets.
- Register — a cashier station within an outlet. Has an open/close session with cash float. Orders are attached to the open session; reports reconcile per session.
- Warehouse — a stock location. Every outlet has a Primary by default; multi-warehouse mode unlocks cross-outlet stock management.
- Brand — a layer between the organisation and its products. Lets one org run multiple concepts with separate menus, branding, and reports.
- Service Fee — percentage charge added automatically (e.g., 10% dine-in service). Configured globally in Settings, applied per-outlet or per-service.
- Transaction Series — the numbering convention for invoices, POs, quotes, sales receipts. Prefixed and reset-able (e.g., "INV-2026-0001" resetting each year).
- Discount Reason Type — audit gate. Before applying an ad-hoc discount at POS, the cashier picks a Reason from a pre-defined list — prevents "10% off for no reason" entries.
- Delivery Sector — named delivery zone with a fee and ETA. Customer address is matched to a sector at order time.
- Account Reset / Data Reset — destructive operations. Use with extreme caution — the former wipes the org; the latter wipes specific data categories. Both require explicit confirmation.
Common questions
Q: Where is Users in Settings?
A: Settings → Organization → Users (/settings/organization/users) — it's a real in-app page now (Members + Role groups tabs), not a redirect. It still uses the shared Hubits identity service under the hood. See Users & Roles.
Q: How do I add a second outlet? A: Settings → Outlets → Add Outlet. Note: multi-outlet requires the appropriate plan. Starter plan is typically single-outlet; upgrade for more.
Q: GST rate changed — do I have to update every existing order? A: No. Historical orders keep the tax rate at time of creation for audit integrity. Edit the GST entry in Taxes → going forward, new orders use the new rate. Output Tax Statement and other reports respect the historical rates.
Q: How do I reset the test data so I can start fresh?
A: Data Reset (/settings/datareset) — scoped resets (e.g., orders only). For a full wipe, Account Reset (/settings/organisations/resetaccount) — preserves the org shell but clears all transactional data.
Q: Where do I connect an accounting tool (QuickBooks, Xero, etc.)? A: There is no external accounting connector yet. The Integrations page (Settings → Integrations) is where these will live, but it currently shows Coming soon — QuickBooks, Xero and similar tools cannot be connected today. If you need sales data in an external accounting tool, contact support to discuss options. (Hubits also offers its own accounting product, Hubits Finance.)
Q: Can I have a different service fee per outlet? A: Service fees are global by default. Fine-grained per-outlet service fees may be plan-gated — check plan boundaries.
Q: What's the difference between Currencies and Default Currency on a customer? A: Currencies here enables currencies on the org. The customer-level Default Currency picks from that enabled list for that specific customer's transactions.
Q: My receipts look plain — how do I add a logo and custom footer? A: Settings → PDF Templates. Upload logo, edit header/footer text, set font styling. Changes apply to all future prints.
Q: How do QR codes at the table work? A: From the outlet's Floor Layout section, click QR Codes → generates a per-table QR printable sheet. Scan-to-order takes the customer to a table-linked menu on their phone. Requires the online-ordering integration.
Q: Where do I connect an accounting tool (QuickBooks, Xero, etc.)? A: There is no external accounting connector yet. The Integrations page (Settings → Integrations) is where these will live, but it currently shows Coming soon — QuickBooks, Xero and similar tools cannot be connected today. If you need sales data in an external accounting tool, contact support to discuss options. (Hubits also offers its own accounting product, Hubits Finance.)
Q: What does "No account assigned" on a payment method mean? A: The payment method exists but has no linked bank account for reconciliation. Fine for Cash (no bank needed). For Transfer/Card, link an account from Payment Methods → Edit → Account so received amounts flow into reconciliation reports.
Q: How do I change the invoice number format? A: Settings → Transaction Series → pick "Invoice" → edit prefix, starting number, reset frequency (yearly/monthly/never). Changes apply to next issued invoice; historical numbers don't change.
Edge cases and known issues
Currency change breaks pricing
- Symptom: Changed default currency; now menu prices look wrong
- Cause: Prices are stored as decimals without currency tags; changing default currency changes the interpretation but not the number
- Workaround: Bulk-update item prices when changing currency. Or keep MVR as primary and add a secondary currency for specific customers.
Payment method added but not visible at POS
- Symptom: Created a custom payment method; cashier doesn't see it on the payment screen
- Cause: Outlet-specific payment method gating — the method is created but not enabled on the active outlet
- Workaround: Check the payment method's outlet settings; enable for the current outlet. Or verify "Active" toggle is on.
Can't delete a tax rate
- Symptom: GST has been superseded; system won't let you delete it
- Cause: Tax rate is referenced by historical orders/items — deletion would orphan those records
- Workaround: Mark inactive instead of deleting. Historical records keep their reference; new items can't pick it.
Units of Measure "too many" — want to hide irrelevant ones
- Symptom: Units list has 30 entries including Nanometer, Bouvet Islands area, etc. — hard to scroll
- Cause: Pre-loaded unit library is comprehensive
- Workaround: Mark unused units Inactive (currently all show ACTIVE). An inactive unit won't appear in unit pickers on recipe/item forms.
Outlet reset vs Account reset confusion
- Symptom: User expected to wipe orders but kept the outlet — used Account Reset and lost everything
- Cause: Account Reset is the org-wide nuclear option; Data Reset is scoped
- Workaround: Read the confirmation dialogue carefully. For partial wipes, always use Data Reset with specific scopes ticked. Back up exports first.
Plan limits
Settings itself has no per-plan gating, but most sub-features do:
Plan tiers and their limits are not listed here — they are DB-backed and change with the lineup. See Pricing for the live catalogue.
Confirm against the in-app subscription page.
What changed since 2026-04-15 (NEW 2026-05)
- Outlet image upload refactored to AJAX (commit
ee5fa8c, 2026-04-22) — affects the Outlets section. Logo and payment-QR uploads on the outlet add/edit form now use AJAX endpoints with drag-and-drop. See Outlets for details including screenshot 131 (outlet detail block with drag-and-drop logo/QR upload areas confirmed 2026-05-04). - No other behavior-affecting commits to the curated Settings paths since 2026-04-15. ServiceFees received
11da4a62026-04-05 (chart-of-account field on add/edit) just before the cutoff — seeservice-fees.md.
API and integration notes
- New stack: Settings pages are React pages in
foodops-admin-app(apps/admin/src/pages/settings/**+components/settings/**), backed byhubits-api-salescontrollers — primarilySettingsController(taxes, payment methods, service fees, currencies/denominations, org settings, restaurant/general) andRestaurantSettingsController(outlets + registers/kitchens/floors/tables/delivery-sectors/bank-details), plusDocumentTemplatesController(PDF templates). User/role admin calls the identity service (haafai.app.identity, staging). The legacyhaafai.app.foodopsthree-project Razor split (Haafai.Restaurant.App/Haafai.Sales/Haafai.LayoutsAreas/Settings) is retired at launch. - Org-settings persistence fix: the org-settings bulk-save (
SettingsController.UpdateOrgSettingsBulk,PUT org/bulk) loads rows with.AsTracking()before mutating — the DbContext defaults to NoTracking, so the old NoTracking bulk-save silently no-op'd (saves didn't persist). With the tracking fix, settings now actually persist.[code: hubits-api-sales/Hubits.Sales.Api/Controllers/SettingsController.cs:2307-2310 "AsTracking() is required — the DbContext defaults to NoTracking, so without it the DefaultValue mutations below silently no-op on SaveChanges" @ main] - Cache: the bulk-save calls
cacheInvalidator.InvalidateSettingsAsync(orgId)on save, so org-setting changes invalidate the settings cache automatically (the old manual "Reload Cache" step is no longer the primary mechanism).[code: SettingsController.cs UpdateOrgSettingsBulk @ main] - Integration connections (payment gateways, delivery platforms) store credentials in org-level secure storage — not visible via CSV export
Related
Users & Roles — user management deep-link target
POS Takeaway Order — the operational flow that consumes most settings
Kitchen Display — uses outlet kitchen configuration
Dine-In & Tables — uses outlet floor layout
Inventory — uses warehouses and units of measure
User Stories: Settings — config scenarios
2026-07-20 (foodops-admin-app 8ebb1d2..289bf0e): The Warehouses settings page (
components/settings/inventory/WarehousesView.tsx) — already flagged in the 2026-07-09 note as needing a detail-block refresh for its Status filter/column — gets a further, purely mechanical list-UI change: the old fixedPAGE_SIZE = 50with manual Previous/Next buttons is replaced by a sharedPaginationcomponent (usePagination/usePagedRowshooks) that adds a page-size selector (onPageSizeChange), so users can now change how many warehouses show per page instead of a fixed 50. This doesn't touch or contradict any claim this entry documents (Primary Warehouse default, Enable Multiple Warehouse toggle, or the entry's framing of Warehouses as a non-Settings page retained for conceptual reference) — it's list-chrome plumbing, not a business-behavior change. Worth folding into the same pending Warehouses screenshot/detail refresh already noted on 2026-07-09 rather than an immediate edit. No other diff hunks in this commit range (PDF template edit fix, recipe soft-delete button, PO filter fix, admin coverage tests) intersect this entry's cited surface. (auto-applied by the truth pipeline; adversarially gated) (auto-applied by the truth pipeline; adversarially gated)2026-07-09 (foodops-admin-app 5c36f1b..2e6faec): Two additive changes land in sections this entry documents, neither contradicting existing claims. (1) Inventory > Warehouses (
components/settings/inventory/WarehousesView.tsx) gains a Status filter (Active/Archived/All segmented tabs, hidden for Salesmade orgs whose warehouses can't be archived) plus a new Status column rendering Active/Archived/Deleted pills (recordStatusId1/2/4);ChangeWarehouseStatusDialog.tsx's delete action moved fromstatusId: 3tostatusId: 4to match. This is new archive/restore/soft-delete lifecycle tooling on the Warehouses page that the entry's current Warehouses detail block (Primary Warehouse + 'Enable Multiple Warehouse toggle' only, screenshot 45) doesn't mention — worth folding in on next refresh, including a note on the underlying non-Settings/inventory/warehousesroute this entry already flags as a conceptual carry-over. The identical statusId 3→4 delete-status change also lands inChangeBrandStatusDialog.tsx, but Brands isn't part of this entry (moved to Catalog per the existing Inventory note). (2) The PDF Templates block-builder's Code/HTML view (template-editor/state.tsx/CodeView.tsx) changed its Visual/HTML round-trip: editing raw HTML now collapses the whole body into a single custom-html block (SET_BODY_HTML, with a newPARSE_BODY_HTMLto re-expand back to blocks) instead of appending a custom block alongside the existing ones — fixes a bug where the old behavior made the editor 'feel uneditable' by re-emitting original blocks on top of edits. This doesn't change the entry's generic 'Visual/HTML toggle' claim but is worth a line in pdf-templates.md. No other diff hunks (recipe delete-button, PO filter fix, audit-log/organisation-groups tests) touch any claim in this entry. (auto-applied by the truth pipeline; adversarially gated)2026-07-07 (hubits-api-sales e31810a..3f133da): New currency exchange-rate capability lands under Settings > Accounting > Currencies (backed by SettingsController). A new
PUT currencies/{currencyId}/exchange-rateendpoint (UpdateCurrencyExchangeRateRequest) lets orgs set a fixed exchange rate for a non-base currency — the base currency itself is now always pinned to an ExchangeRate of 1 (previously could resolve to 0 for API-key callers that don't forwardCallContext.CurrencyId, sinceGetCurrencies/GetCurrencynow call a newResolveBaseCurrencyId(orgId)fallback to the org's authoritativeCurrencyIdwhen the JWT/header value isn't present — relevant to the admin-app's API-key-driven calls this entry's API notes already reference). TheGetCurrencies/GetCurrency/GetCurrencyDenominationscache entries also gainedSettingsCacheTags(orgId)tagging so an exchange-rate write is now correctly evicted viaInvalidateSettingsAsync's tag-basedRemoveByTagAsync, rather than only aging out on TTL as before. None of this contradicts the entry's existing Currencies row ('Currency list + per-currency cash denominations') or the Cache paragraph — it's additive. Worth folding an exchange-rate mention into the Currencies row/currencies.md on next content refresh. The unrelated hunk in this same commit range (dashboard hourly-sales org-timezone fix) doesn't touch any claim in this entry. (auto-applied by the truth pipeline; adversarially gated)2026-07-05 (foodops-admin-app 8ec1ab1..6642e57): Two additive enhancements land inside the Users settings surface that this entry's Organization > Users row already generalizes as 'In-app user admin (Members + Role groups tabs)'. (1) MembersTab.tsx gains a new 'Roles' button (ShieldCheck icon) next to 'Manage' on each row, opening a new read-only UserRolesDialog.tsx that composes GET /Users/{id} + GET /RoleGroups/{id} to show a member's assigned role groups and the roles each grants, with a deduped unique-role count and a name filter — role assignment itself still happens only through the existing Manage/EditUserDialog flow. (2) MyAccessTab.tsx ('My Access', commit subject 'split My Access into role groups vs roles + permissions dialog') now separates a signed-in user's own Role groups from named Roles (previously one flat chip list) and adds a new MyPermissionsDialog.tsx surfacing the underlying dotted permission strings (e.g. 'sales.invoice.view') grouped by domain with a filter — a materially richer self-service access-visibility view. Neither change contradicts anything this overview documents: Users still lives at /settings/organization/users with Members + Role groups tabs, no nav/URL restructuring occurred. Worth folding into the Users row and users-roles.md on next content refresh (new per-member Roles dialog + My Access permissions breakdown). Unrelated hunks in this same diff (PriceListDetailsRail.tsx and AuditLogPage.tsx switching timestamp rendering to org-timezone formatting via useOrgTimeZone/formatDateOrgTz) don't touch any claim this entry makes — Audit Log's row still correctly describes it as an 'Immutable record of user actions', and Price Lists aren't part of this entry's Inventory settings table at all. (auto-applied by the truth pipeline; adversarially gated)
2026-07-04 (hubits-api-sales a4c6ced..7b2a1a9): Backend evidence surfaces for the outlet 'Reference Numbers' section this entry already flagged (2026-07-04 note) as present in the UI but with 'exact fields not yet documented'. New
GetOutletReferenceConfigendpoint (GET outlets/{id}/reference-configonRestaurantSettingsController) andOutletReferenceConfigDtoshow the section covers four document-numbering series — Invoice (INV), Credit Note (CN), Payment (PAY), Quotation (QT) — each with a per-outlet custom prefix and starting number (backed byOutletSequenceNumberSettings), gated by an outlet-levelUseUniqueReferenceNumberstoggle: when on and sequences are initialized, the outlet uses its own counters ('Using outlet-specific sequences'); otherwise it falls back to the org-wide sequence ('Using organization-wide sequences'). The endpoint also previews the next number per series without allocating it (e.g. 'QT-0094' style formatting). This doesn't contradict anything documented — it fills the gap the entry already called out — so worth folding into the Outlets 'Reference Numbers' bullet and detail block on next screenshot/content refresh rather than an immediate edit. No other diff hunks in this commit range intersect this entry's cited surface (Taxes, Payment Methods, Currencies, Service Fees, Units of Measure, Warehouses, and DocumentTemplatesController are all untouched here). (auto-applied by the truth pipeline; adversarially gated)2026-07-04: foodops-admin-app (d4ac7b5..cc539d1) adds two behaviors to sections this entry documents, neither contradicting existing claims. (1) Outlets —
OutletDetailPanelnow renders a newReferenceNumbersSectionafter Bank Details for EVERY outlet (restaurant and retail alike, unconditional onisRetail), so the 'Each outlet has:' bullet list (Outlet Details, Registers, Kitchens, Services, Floor Layout, Bank Details) is now missing a 7th block — worth adding 'Reference Numbers' to that list and to screenshot 44 on next refresh. (2) Customisation > Import Wizard — the flow gained aCategoryMappingStep(when an uploaded file would auto-create new categories, the wizard now prompts to map them to outlets/menus before import runs) and a dedicated post-importImportResultPage.tsx(summary stats: Total/Created/Updated/Failed rows, plus a per-row error list) replacing inline toast-only feedback. The existing Import Wizard row description ('Bulk import suppliers, customers, items via spreadsheet') isn't wrong but is now thin relative to actual flow complexity. The already-known outlet-type retail/restaurant split (OUTLET_TYPE_RETAIL, Store badge, getBrandOutletTypeId scoping) reappears in this cumulative diff unchanged from the 2026-07-02 note — no new information there. Nothing in this diff touches Taxes, Payment Methods, Currencies, Service Fees, Units of Measure, or Warehouses. (auto-applied by the truth pipeline; adversarially gated) (auto-applied by the truth pipeline; adversarially gated)2026-07-02: foodops-admin-app (d4ac7b5..395decb) introduces an outlet-type split (retail vs restaurant, via
outletTypeId/OUTLET_TYPE_RETAIL) inside the same Outlets settings surface this entry documents. For retail-type outlets,OutletDetailPanelnow hides Kitchens, Services, and Floor Layout entirely ('restaurant-only concepts' per the code comment); a new outlet-type badge (Store icon + label) now renders in the Outlet Details block for every outlet; and the Outlets list (OutletsPage.tsx) is now scoped togetBrandOutletTypeId()rather than returning all of the org's outlets. This entry's walkthrough/screenshot (44-settings-outlets.png, 'KB Test Outlet') is confirmed restaurant-type — it still shows Kitchens/Services/Floor Layout, so the documented behavior is unaffected for FoodOps. No FoodOps-facing claim is contradicted, but the underlying admin app is evidently shared with a retail/Shops outlet type, and a small new UI element (the outlet-type badge) isn't yet reflected in the Outlet Details bullet list or screenshot. Worth a screenshot refresh and a one-line mention of the outlet-type badge next re-verification; not urgent enough to force NEEDS_EDIT today. (auto-applied by the truth pipeline; adversarially gated)
Success: Verified 2026-04-15 · playwright Status:
stable· Review due: 2026-07-14 This entry was verified against the live app on the date above. The weekly sync (see_meta/failure-log.md) re-runs the Playwright scenarios tied to this module and will surface any drift as a[!failure]callout here.
Note: Code-verified 2026-05-04 · codebase Verified_by:
codebase· Last verified: 2026-05-04 ·haafai.app.foodops:ee5fa8cCuratedsource_repos[]to a single broad glob{Haafai.Restaurant.App,Haafai.Sales,Haafai.Layouts}/Areas/Settings/**covering all three solution projects that host Settings UI. Watermark commit isee5fa8c2026-04-22 (outlet image AJAX refactor — see "What changed" above), the only behavior-affecting commit to any Settings area path since 2026-04-15. Sub-section entries (currencies, discounts, taxes, etc.) carry tighter per-section globs and their own per-section watermarks.
Note: Re-pointed after backend microservice split 2026-06-03 · codebase Verified_by:
codebase· Last verified: 2026-06-03 ·haafai.app.foodops:bf7c9d2+foodops-admin-app:f3ae3e9Addedhaafai/foodops-admin-app(FoodOps backoffice, prodmain) with a broad settings globapps/admin/src/{pages/settings/**,components/settings/**,pages/taxes/**,components/taxes/**}— the React backoffice that now fronts the full Settings hub (organization / discounts / restaurant / inventory / customisation, plus tax-rate config). This is the cross-cutting settings overview, so it carries the broad admin-app glob; per-section entries (outlets, currencies, discounts, taxes, service-fees, pdf-templates, users-roles) carry tighter admin-app globs. Paths verified viagh api ...?ref=main. Monolith broad glob still resolves onmain; re-pinned to prod HEADbf7c9d2. Did NOT addfoodops.apiorhubits.microservices.
Note: Re-verified 2026-06-04 · codebase — Customisation section refreshed Verified_by:
codebase·foodops-admin-app:mainTriaged all admin-apppages/settings/**commits since the 2026-05-04 cutoff. Two affect this overview's Customisation section: (1) the PDF Templates editor was rewritten from an HTML-textarea modal to a full-page visual block-builder (commitsf4cadc0/5cfc40d/0d4b53c/a69b09e, 2026-05-26) — updated the Customisation table row + cross-linked the detailedpdf-templates.mdentry; (2) the Import Wizard became a real React page (ImportWizardPage.tsx,06cf8aa, 2026-06-03) — existing row already accurate. Other settings commits in-window touch sections owned by sibling entries (account-profile Cloudflare logoa808e38, currency dynamic-org-handling7eddcd0, OrganisationGroups CRUD26d0a8a, approvals sunsetd6afb49, period-locks audit24f1378) — no change to this overview's tables. Driver commit3a73eb6was a combobox/quote change, not a settings-capability change — no edit triggered by it. Taxes section unchanged (no commits topages/taxessince the monorepo restructure). Monolith re-verified atbf7c9d2; no behavior change to monolith Settings areas.
Important: Re-verified 2026-06-29 · codebase — NEW-STACK re-point (legacy app.foodops retired) Verified_by:
codebase·foodops-admin-app:f6ffd0b(main) +hubits-api-sales:19190b9(main) Legacyhaafai.app.foodopsremoved fromsource_repos. Re-pointed the whole settings map to the admin backoffice +hubits-api-salescontrollers. STRUCTURAL CHANGES (fromsettingsNavConfig.ts): 6 categories → 7 groups — a new Accounting group now holds Currencies/Taxes/Service Fees/Payment Methods (moved out of Organization); "Restaurant" group renamed Outlets; the Inventory settings group now contains only Units of Measure (Brands → Catalog, Warehouses → top-level Inventory). All sub-page URLs re-pointed to the/settings/{group}/{section}pattern. API notes rewritten (SettingsController / RestaurantSettingsController / DocumentTemplatesController + identity). Added the AsTracking org-settings persistence fix (SettingsController.cs:2307-2310— old NoTracking bulk-save silently no-op'd) and auto settings-cache invalidation. Users Q&A corrected (in-app page, not SSO redirect). RESIDUAL: the Taxes/Payment-Methods/Warehouses/Units page-detail screenshot blocks are legacy-derived and need fresh admin-app screenshots; Integrations group contents not enumerated against code.
Additional verification events are appended here by the weekly KB sync and by manual re-verification passes. See _meta/failure-log.md for the global failure index.