## Representations Refactor — Behaviour-Preserving Structural Improvements This PR delivers a full refactor of the representations flow, improving structure, readability, and maintainability while preserving all existing behaviour. The work was completed using a controlled, slice-based approach with strict guardrails and regression validation at each step. No changes have been made to user journeys, payloads, routing, or EN/CY behaviour. The result is a cleaner, more maintainable codebase with reduced coupling and clearer separation of concerns, ready for future enhancements without increased risk. --- ## What Was Done The refactor was delivered incrementally across the following slices: - **R1** — Representation entry logic extraction - **R2** — Page loader separation (SSR/data orchestration) - **R3** — Journey step resolution extraction - **R4** — Flow shell decomposition - **R5** — Representation elements normalisation - **R6** — Data/service layer cleanup - **R7** — Summary rendering proof slice - **R8** — Submission/finalisation boundary isolation - **R9** — Summary rollout (Batch 1) Each slice: - was isolated to a single concern - followed strict guardrails - was validated before merge Full detail is available in: `context/representations-refactor-tracker.md` --- ## Key Improvements - Reduced coupling across the representations journey - Separated data loading, orchestration, and rendering concerns - Simplified complex conditional logic into testable helpers - Standardised summary rendering using shared primitives (`SummaryCard`, `SummaryRow`) - Isolated submission/finalisation sequencing into explicit boundaries - Improved overall readability and maintainability --- ## Behaviour Preservation This refactor does **not** change: - User journeys (APP / IP / Agent / LPA) - Route and query behaviour - Payload contracts and API interactions - Redux state shape and usage - Validation rules and messaging - EN/CY behaviour - File upload / PDF / email sequencing - Linked-case logic All changes are structural only. --- ## Validation ### Automated - `npm run lint` — passed (warnings only, no new errors) - `npm run test:reps` — passed (7/7) ### Manual Validated end-to-end across: - APP - IP - Agent - LPA Including: - representation creation - editing/resuming representations - submission flow - confirmation/completion behaviour - summary rendering across case types - EN/CY parity --- ## Risk Management The refactor targeted several high-risk areas: - Case summary entry logic - Representation submission/finalisation sequencing - Dual-mode entry (new vs existing representation) Risk was controlled through: - small, incremental slices - one branch per slice - regression validation per slice - strict behaviour-preservation guardrails - controlled rollout for summary rendering changes --- ## Reviewer Guidance Suggested areas to focus on: - End-to-end representation journey (create → submit → complete) - S...
118 lines
3.5 KiB
JavaScript
118 lines
3.5 KiB
JavaScript
export function showRepsLocal(startDate, endDate) {
|
|
let date = new Date();
|
|
date = new Date(date.toDateString());
|
|
const start = new Date(startDate);
|
|
const end = new Date(endDate);
|
|
|
|
return date >= start && date <= end ? true : false;
|
|
}
|
|
|
|
export function showRepsEndedLocal(startDate, endDate) {
|
|
let date = new Date();
|
|
date = new Date(date.toDateString());
|
|
const start = new Date(startDate);
|
|
const end = new Date(endDate);
|
|
return date > start && date > end ? true : false;
|
|
}
|
|
|
|
export function isConsultationWindowOpen(detailsObj) {
|
|
return showRepsLocal(
|
|
detailsObj.pinswg_consultationopen,
|
|
detailsObj.pinswg_consultationclose
|
|
);
|
|
}
|
|
|
|
export function isGeneralRepresentationWindowOpen(detailsObj) {
|
|
return (
|
|
(Object.prototype.hasOwnProperty.call(detailsObj, "pinswg_startdate") ||
|
|
Object.prototype.hasOwnProperty.call(
|
|
detailsObj,
|
|
"pinswg_applicationacceptedasvalid"
|
|
) ||
|
|
Object.prototype.hasOwnProperty.call(
|
|
detailsObj,
|
|
"pinswg_startdates"
|
|
)) &&
|
|
showRepsLocal(
|
|
detailsObj.pinswg_startdate ||
|
|
detailsObj.pinswg_startdates ||
|
|
detailsObj.pinswg_applicationacceptedasvalid,
|
|
detailsObj.pinswg_finalcommentsduedate ||
|
|
detailsObj.pinswg_endofrepresentationperiod
|
|
)
|
|
);
|
|
}
|
|
|
|
export function canShowRepButtonForAppealType({
|
|
appealType,
|
|
isLPA,
|
|
searchDetailsObj
|
|
}) {
|
|
switch (appealType) {
|
|
case 846040012:
|
|
case 846040013:
|
|
case 846040014:
|
|
//for ROW case 846040015:
|
|
case 846040020:
|
|
case 846040021:
|
|
case 846040023:
|
|
case 846040024:
|
|
return false;
|
|
case 846040004:
|
|
return isLPA ? true : false;
|
|
|
|
case 846040015:
|
|
return searchDetailsObj[0].value[0].pinswg_specialistcaseprocess ==
|
|
846040001
|
|
? showRepsLocal(
|
|
searchDetailsObj[0].value[0].pinswg_startdate,
|
|
searchDetailsObj[0].value[0].pinswg_finalcommentsduedate
|
|
)
|
|
: true;
|
|
|
|
case 846040018:
|
|
let shouldShow =
|
|
searchDetailsObj[0].value[0].pinswg_speacialistcaseprocess ==
|
|
846040000 && isLPA
|
|
? true
|
|
: searchDetailsObj[0].value[0]
|
|
.pinswg_speacialistcaseprocess == 846040001
|
|
? true
|
|
: false;
|
|
|
|
return shouldShow;
|
|
|
|
case 846040019:
|
|
return showRepsLocal(
|
|
searchDetailsObj[0].value[0].pinswg_startdate,
|
|
searchDetailsObj[0].value[0].pinswg_statementduedate
|
|
);
|
|
|
|
default:
|
|
return true;
|
|
}
|
|
}
|
|
|
|
export function getEntryCtaLabelKey(appealType) {
|
|
return appealType == 846040002
|
|
? "case:summary-make-consultation-label"
|
|
: "case:summary-make-representation-label";
|
|
}
|
|
|
|
export function shouldSuppressBlockedMessage({ appealType, isLPA }) {
|
|
return !isLPA && appealType == 846040004;
|
|
}
|
|
|
|
export function getGeneralBlockedEndDate(detailsObj, appealType) {
|
|
return appealType == 846040019
|
|
? detailsObj.pinswg_statementduedate
|
|
: detailsObj.pinswg_finalcommentsduedate;
|
|
}
|
|
|
|
export function isRepresentationPeriodEnded(detailsObj) {
|
|
return showRepsEndedLocal(
|
|
detailsObj.pinswg_startdate,
|
|
detailsObj.pinswg_finalcommentsduedate
|
|
);
|
|
}
|