* feat(fusion_portal): funding-source selector on accessibility forms Reps can now mark an accessibility assessment's funding source on the web form (Private / March of Dimes / ODSP / WSIB / Hardship / Insurance / Other) so the generated draft sale order routes to the correct funding pipeline instead of always defaulting to private pay. Adds Hardship to the x_fc_funding_source selection + sale_type_map; the new form <select> is auto-serialised by the existing FormData submit, and accessibility_assessment_save now maps funding_source -> x_fc_funding_source. The model + SO routing were already in place (2026-04 audit fix) — this closes the form + controller gap. Plan: docs/superpowers/plans/2026-06-02-accessibility-funding-selector.md Spec: docs/superpowers/specs/2026-06-02-assessment-visit-funding-design.md Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(fusion_portal): validate funding_source in accessibility save (parity with booking) Coerce an unexpected/tampered funding_source to direct_private instead of passing it raw into create() (which would raise on the Selection field). Mirrors the /book-assessment controller; the whitelist is derived from the model selection so it auto-covers hardship and any future values. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3.4 KiB
Accessibility Funding-Source Selector — Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: superpowers:executing-plans (inline) — this is a 3-file change. Steps use
- [ ]checkboxes.
Goal: Let the rep mark an accessibility assessment's funding source (Private / March of Dimes / ODSP / WSIB / Hardship / Insurance / Other) on the web form, so the generated sale order routes to the correct funding pipeline instead of always defaulting to private pay.
Architecture: The model (fusion.accessibility.assessment.x_fc_funding_source) and the SO routing (_create_draft_sale_order → sale_type_map → x_fc_sale_type) already exist (the "2026-04 portal audit fix"). The only gaps: (1) the form has no funding field, (2) the save controller never reads funding_source from the POST, (3) hardship is missing from the selectable funding sources. The submit JS already serialises every named form field via FormData, so no JS change is needed.
Tech Stack: Odoo 19, QWeb portal template, JSON-RPC controller. Module fusion_portal (worktree K:\Github\Odoo-Modules-wt-portal, branch feat/assessment-visit).
Verification constraint: fusion_portal depends on Enterprise knowledge, so it can NOT be installed on the local Community Docker. Syntax-check with host Python; functional verification is on westin (or a clone): pick "March of Dimes" on a form → the draft SO gets x_fc_sale_type='march_of_dimes' and lands in the MOD pipeline.
Task 1: Add Hardship to the funding source + route it
Files: Modify fusion_portal/models/accessibility_assessment.py (selection ~:71-87, sale_type_map ~:771-779)
- Step 1: Add
('hardship', 'Hardship Funding')to thex_fc_funding_sourceselection list (after'wsib'). - Step 2: Add
'hardship': 'hardship',tosale_type_mapin_create_draft_sale_order(the targetx_fc_sale_type='hardship'already exists infusion_claimssale_order.py:332). - Step 3:
python -m py_compile fusion_portal/models/accessibility_assessment.py→ no error. - Step 4: Commit.
Task 2: Add the funding select to the shared client-info form
Files: Modify fusion_portal/views/portal_accessibility_templates.xml (accessibility_client_info_section, ~:366-375)
- Step 1: Add a new row with a
<select name="funding_source">(options mirror the model selection;direct_privatepre-selected so existing private behaviour is unchanged) right after the phone/email row, before the card closes. - Step 2: Validate XML well-formedness (
[xml]parse). - Step 3: Commit.
Task 3: Capture funding_source in the save controller
Files: Modify fusion_portal/controllers/portal_main.py (accessibility_assessment_save vals, ~:2498-2511)
- Step 1: Add
'x_fc_funding_source': post.get('funding_source') or 'direct_private',to thevalsdict. - Step 2:
python -m pyflakes fusion_portal/controllers/portal_main.py→ no new undefined-name errors. - Step 3: Commit.
Task 4: Verify + ship
- Step 1: Grep confirms
funding_sourceflows form → controller →x_fc_funding_source→sale_type_map. - Step 2: Deploy to westin (backup → scp the 3 files →
-u fusion_portal→ cache-bust → restart) and confirm: open/my/accessibility/stairlift/straight, pick "March of Dimes", complete → the new SO showsx_fc_sale_type = march_of_dimesand appears in the MOD pipeline.