# Representations Refactor — Current State of Play ## Purpose This document captures the **pre-refactor state** of the representations flow and defines the starting point for the behaviour-preserving refactor stream. It mirrors the approach used for the new appeal refactor and will be updated as slices are completed. --- ## Executive Summary The representations flow is: - functionally complete and live - behaviourally stable - structurally complex and tightly coupled The flow currently: - spans multiple entry points - mixes UI, workflow, and data logic - contains duplicated branching and rendering logic - relies heavily on shared global state (`currentView`, `searchResultsObj`) --- ## Journey Overview The user journey is: 1. Navigate to case summary page 2. Click **Make representation / consultation** 3. Enter representation flow 4. Select capacity 5. Select representation type 6. Enter content and upload files 7. Review check answers 8. Submit representation 9. View confirmation/completion --- ## Entry Points ### Primary Entry - `CaseSummary` component - CTA button logic determines: - whether representation is allowed - which label to display - which route to navigate to ### Route - `/myportal/representation?case=` --- ## Dual Mode Behaviour (Critical) The flow operates in two modes: ### 1. New Representation (from search/case) - triggered from case summary CTA - loads case data via search + details APIs - initializes new representation state --- ### 2. Existing Representation (resume/edit) - triggered via query param (`state`) - loads representation from blob storage - hydrates existing data and files --- This dual-mode behaviour is a **major complexity driver**. --- ## Architecture Overview ### High-Level Structure - Page layer (SSR + Redux hydration) - Case component (core orchestration) - Representation flow components (capacity/type/content/check) - Shared helpers (`representationElements`) - Service layer (case data, blob storage, CRM integration) --- ### Key Components - `CaseSummary` → entry + CTA logic - `Case` → main orchestration component - Representation flow components: - capacity selection - representation type selection - content entry - check answers - completion --- ### State Management Primary state dependencies: - `currentView` - `searchResultsObj` - `myRepresentations` - `filesForRepresentations` Heavy reliance on deeply nested props. --- ## Current Architecture Issues ### 1. High Coupling - UI, workflow logic, and data fetching are tightly mixed - large components handle multiple responsibilities --- ### 2. Deep Prop Chains Examples: - `props.currentView.caseReference.*` - `props.searchResultsObj.*` This reduces readability and increases fragility. --- ### 3. Duplicated Logic - appeal-type branching repeated across components - summary rendering duplicated by case type - representation form structure repeated across capacity types --- ### 4. Dual Entry Complexity - separate logic paths for new vs existing representation - mixed within the same components --- ### 5. Async Data Complexity - chained service calls: - `getCase` - `getPortalModuleDetails` - repeated across different contexts - hard to reason about and test --- ### 6. Inline Business Logic - eligibility rules embedded in UI components - date checks and appeal-type logic duplicated - LPA-specific behaviour scattered --- ## Risk Areas High-risk areas that require extra caution: - CaseSummary eligibility logic - SSR/data-loading logic for representation page - submission/finalisation flow - file upload handling - dual-mode entry (new vs existing) - Redux hydration and state consistency --- ## Behavioural Constraints (Must Not Change) - eligibility rules for making a representation - journey step order and navigation - validation rules and messaging - payload structure sent to backend/CRM - file upload and metadata behaviour - submission/finalisation behaviour - confirmation page behaviour - route/query parameter structure - EN/CY parity --- ## Comparison to New Appeal Flow ### Similarities - step-based user journey - check answers before submission - file upload and validation steps - finalisation/confirmation stage --- ### Differences (Important) - dual-mode entry (new vs existing) - more reliance on external data sources - less structured “engine” (more implicit logic) - heavier coupling to case summary and search flows --- ## Refactor Readiness The flow is suitable for refactor because: - behaviour is stable - clear boundaries can be identified - repeated patterns exist - appeal refactor provides a proven model --- ## Refactor Strategy The refactor will follow a **slice-based, behaviour-preserving approach**: 1. Extract entry logic (CaseSummary) 2. Separate SSR/data-loading concerns 3. isolate step resolution logic 4. decompose large components 5. clean up shared helpers 6. stabilize async/service layers 7. isolate submission/finalisation --- ## Initial Slice Focus ### Slice R1 — Entry Logic Extraction Target: - representation eligibility logic in `CaseSummary` Goal: - reduce coupling - isolate decision logic - prepare for safe downstream refactor --- ## Validation Position At start of refactor: - behaviour is assumed correct - no structural isolation exists - regression testing is manual Each slice must: - prove behaviour unchanged - reduce complexity incrementally --- ## Conclusion The representations flow is: - behaviourally stable - structurally complex - suitable for controlled refactor The goal is to: - reduce coupling - improve clarity - enable safer future changes without altering live behaviour. --- ## Next Step Begin **Slice R1 — Representation Entry Logic Extraction** Following strict guardrails and regression validation.