How completeness was checked
- Every route in app/router.js is referenced by at least one feature.
- 100 of 101 controllers and all feature-bearing route files are referenced; the remaining route files are pageHeader-only parents.
- The side menu (utils/get-side-nav-menu.js) was walked entry by entry, including commented-out and module-disabled entries.
- Unreferenced models, serializers and components were traced to their templates to find hidden features (mobile-app config, login methods, integrations, social wifi, Froged, analytics, the dormant action log).
- All 2,598 translation keys used literally in code were checked against translations.json.
Sources
- app/router.js — 9 top-level product areas, ~140 routes
- app/routes/, app/controllers/ — behaviour, actions and error handling
- app/models/** — 130 models;
get validations()blocks are the authoritative source for failure paths - app/abilities/** — 55 ember-can classes; the authoritative source for role and module gating
- app/enums/** — statuses, types and filter palettes
- translations.json — 3,214 keys; feature names come from
menu.navbar.*/title.header.*and failure messages fromerror.*and the per-feature namespaces
Features added by the review pass
- Runtime environment & white-label boot — Platform & Access
- Back-office interface language — Platform & Access
- In-app help & support chat (Froged) — Platform & Access
- Product analytics & error monitoring — Cross-cutting
- Mobile app configuration — Configuration
- Customer login methods (Google, Facebook) — Configuration
- Third-party integrations & connectors — Configuration
- Social wifi & location services — Configuration
- Customer action log (dormant) — CRM
Notes
- Permissions in this product are three-dimensional: staff level x centre module x record state. A feature can be invisible for any of the three reasons, and the UI rarely says which.
- Failure paths are taken from the code, not inferred: model
validationsblocks,.catch()handlers andthrowguards. Where a failure is swallowed or leaves a stuck spinner, that is recorded as the handling, because it is what an operator will actually experience. - Several translation namespaces have no remaining code references and look like dead or not-yet-built surface:
bonusRequest(22 keys),dmr-weekly,marketing-analytics(16 keys),commerce-stay-alert(4 keys, though an ability and a menu key still exist), plus partial remnants ofleasing,lineitemandsupplier. They are deliberately not listed as features. - Two CSV-import implementations coexist (
nf-importand the olderimport-csv) with different robustness;import-csv.errors.load.required-selectionsis still in Portuguese while its siblings are English.