# Customer Portal — Information Architecture + Sidebar Nav **Module**: `fusion_plating_portal` (touches `portal.portal_layout` inherit) **Date**: 2026-05-17 **Status**: Design locked, awaiting implementation plan **Surface**: every `/my/*` page on `https://enplating.com` **Sub-project**: A (of A/B/C); B = multi-user, C = portal search — deferred to separate brainstorms. ## Problem The post-2026-05-17 portal redesign gave us a credible dashboard + jobs-detail page, but the navigation between pages is still "scroll the standard Odoo portal cards and hope you find the right entry point." Eight distinct customer surfaces (`/my/home`, `/my/jobs`, `/my/quote_requests`, `/my/configurator`, `/my/purchase_orders`, `/my/fp_invoices`, `/my/deliveries`, `/my/certifications`) and there's no persistent way to move between them. The customer's competitor screenshot (Mobility Specialties Inc / Drive Medical) shows the right pattern: a sticky left sidebar that lists every section, current page highlighted, secondary "Company Account" group at the bottom. This spec restructures the portal around that sidebar pattern, audits the existing pages (replace thin custom pages with Odoo defaults where the default is better), and adds one missing page — a consolidated **Account Summary** with tabbed Invoices / Credit Memos / Statements + an Open Balance pill — that the existing thin `/my/fp_invoices` page doesn't deliver. ## User stories 1. **As a returning customer**, I want a persistent sidebar showing every section so I can jump between Quote Requests and Work Orders without going through the dashboard. 2. **As an accounting clerk**, when I open the portal I want a single Account Summary page with Open Balance + filterable invoices + credit memos + downloadable monthly statements — without hunting through three separate menu items. 3. **As any customer**, I want the active page visually marked so I always know where I am. 4. **As a mobile user**, the sidebar should collapse to a hamburger so the page content gets the screen. ## Locked design decisions (from brainstorming 2026-05-17) | Decision | Choice | Why | |---|---|---| | Decomposition | A first (IA), B (multi-user) + C (search) deferred to separate brainstorms | Sidebar + pages are the foundation; building search before pages exist or a Users tab before the sidebar shape is locked would be rework. | | Sidebar shape | Option B — Dashboard at top, then 3 grouped sections (Activity / Documents / Account) | 10 items needs grouping to scan; matches how the redesigned dashboard already groups (KPI tiles → jobs hero → secondary panels). | | Account Summary tabs | 3 tabs: Invoices · Credit Memos · Statements, plus an "Open Balance: $X" pill in the page header | Mirrors competitor; one summary number front-of-mind, three drilldowns. | | Future placeholders | NEITHER "Users (soon)" nor a search input shown in the sidebar today | Empty placeholders add visual noise; ship them when sub-B / sub-C land. | | Sidebar persistence | Sticky on scroll; visible on every `/my/*` page (including Odoo defaults via `portal.portal_layout` inherit); sub-pages keep their parent highlighted | Industry standard. Consistency means the customer never loses their place. | | Mobile collapse | Below 768px the sidebar collapses to a hamburger button in the page header; opens as a slide-in drawer | Standard portal pattern, no content rearrangement needed. | | Single quote-creation path | `/my/quote_requests/new` redirects to `/my/configurator/new` | Two paths to the same outcome confuses customers; the configurator is the more complete flow. | | Sign Out placement | Bottom of sidebar, separated by a hairline border | Matches competitor; gets sign-out off the page chrome. | ## Scope **IN SCOPE — pages restructured / new:** - `/my/home` — keep dashboard, gets sidebar - `/my/jobs` — keep list, gets sidebar - `/my/jobs/` — keep detail, gets sidebar (highlight parent) - `/my/quote_requests` — keep list, gets sidebar - `/my/quote_requests/` — keep detail, gets sidebar - `/my/quote_requests/new` — **REDIRECT** to `/my/configurator/new` - `/my/configurator` — keep landing, gets sidebar - `/my/configurator/new`, `.../coating`, `.../estimate` — keep wizard, gets sidebar - `/my/purchase_orders` — **REDIRECT** to Odoo default `/my/orders`; controller + template deleted - `/my/fp_invoices` — **REDIRECT** to new `/my/account_summary`; controller + template deleted - `/my/account_summary` — **NEW** tabbed page (this spec) - `/my/deliveries` — keep, gets sidebar - `/my/certifications` — keep, gets sidebar - `/my/account` — Odoo default, gets sidebar - `/my/orders/` — Odoo default, gets sidebar **IN SCOPE — chrome:** - New `fp_portal_shell` template that inherits `portal.portal_layout` and wraps every `o_portal` page body with a sticky 240px sidebar on the left. - Sidebar SCSS partial (`fp_portal_sidebar.scss`) — brand-teal active state, mint gradient highlight, hairline section dividers. - Mobile breakpoint: hamburger toggle + slide-in drawer below 768px. - All Odoo default portal pages (`/my/account`, `/my/orders`, `/my/orders/`, `/my/invoices/`, etc.) get the sidebar via the `portal.portal_layout` inherit — zero per-page edits. **OUT OF SCOPE — deferred to other sub-projects:** - Multi-user account management (sub-project B): Users tab in sidebar, invitation flow, per-action ACLs. - Portal search (sub-project C): global search input above Dashboard, search-result page. - Saved drafts (separate brainstorm — needs its own scoping). - Top Recurring Parts / Favorites / SerialNumber Lookup (defer until customer demand confirmed). - RMA customer portal (sub-project after RMA backend ships). **OUT OF SCOPE — explicit non-goals:** - Top-bar navigation, breadcrumbs redesign, footer changes — none of these are part of A. - Restyling Odoo default `/my/account` or `/my/orders/` page BODIES. We give them the sidebar via the layout inherit, but their content stays Odoo-standard. ## Architecture ### Sidebar shell ``` fusion_plating_portal/views/fp_portal_shell.xml └── inherits portal.portal_layout └── injects .o_fp_portal_shell wrapper that contains: ├──