# Query Profile Compatibility Contract ## Purpose This document records the current compatibility contract around: - `actions/selectQueryTypes.js` That file is primarily: - **CRM/OData query-shape configuration** - **CRM compatibility handling** It is **not primarily business-rule logic**. Its main job today is to ensure the portal requests the fields that each CRM entity actually exposes so downstream case-summary, representation, status, lifecycle, and infrastructure views continue to function. --- ## Source of Truth The **CRM field names are the source of truth**. The website must query the fields that actually exist on each CRM entity. This includes preserving: - historic naming differences - spelling mistakes - singular/plural variants - entity-specific field names - legislation-specific field models Future work must treat field selection as a **compatibility-sensitive integration concern first**. The goal is not to make the query profiles look tidy. The goal is to preserve the fields that the live system currently depends on. --- ## Appeal-Type Differences Different appeal types legitimately require different fields because they support different: - legislation - workflows - representation windows - event models - authority models - infrastructure/project processes This means: - similar-looking appeal types must **not automatically be treated as identical** - near-duplicate field bundles must **not automatically be collapsed** - infrastructure-style entities must **not automatically be forced into planning-style shapes** - minimal profiles must **not automatically be expanded to match richer bundles** Bundle-by-bundle evaluation is required. --- ## CRM Compatibility Variants The current compatibility contract includes representative field variants that must be preserved. ### Specialist-process variants - `pinswg_specialistcaseprocess` - `pinswg_speacialistcaseprocess` These are not interchangeable in the current query profiles. Representative characterization showed: - ROW uses `pinswg_specialistcaseprocess` - Adverts uses `pinswg_speacialistcaseprocess` ### Start-date variants - `pinswg_startdate` - `pinswg_startdates` - `pinswg_applicationacceptedasvalid` These reflect different representation-window and process models across entities. ### Statement-date variants - `pinswg_statementduedate` - `pinswg_statementsduedate` These must not be normalized away. ### Project description variants - `pinswg_projectdescription` - `pinswg_projectdiscription` Harbour Revision Orders currently preserve the misspelled variant. ### Decision variant - `pinswg_dicision` Planning S78 currently preserves this field name in its query profile. ### Other representative compatibility-sensitive variants - `pinswg_otherpartiesstatement` - `pinswg_otherpartiesstatements` - `pinswg_otherpartiesstmt` - `pinswg_suspensionstartdates` - `pinswg_suspensionstartdate` - `pinswg_startdateofevent` - `pinswg_startdateoftheevent` - `pinswg_starttimeofevent` - `pinswg_starttimeoftheevent` - `pinswg_startdatetimeiftheevent` These variants must be preserved until characterization-based extraction or change work explicitly proves otherwise. --- ## Characterized Field Families The current characterization work identifies the following conceptual families already present inside `selectQueryTypes.js`. ### 1. Planning-style fields Representative concerns include: - base case identity fields - planning-style address fields - decision/date/status fields - event support fields These appear across many planning and enforcement-style entities, but not always with identical field names. ### 2. Representation-window fields Representative fields include: - `pinswg_startdate` - `pinswg_startdates` - `pinswg_applicationacceptedasvalid` - `pinswg_statementduedate` - `pinswg_statementsduedate` - `pinswg_finalcommentsduedate` - `pinswg_endofrepresentationperiod` These coexist today and reflect different entity models. ### 3. Specialist-process fields Representative fields include: - `pinswg_specialistcaseprocess` - `pinswg_speacialistcaseprocess` These must not be silently unified. ### 4. Infrastructure / project fields Representative concerns include: - project description - project location - submission / publication milestones - recommendation / report fields - suspension dates - grid-reference fields These are particularly important in DNS / Harbour / Transport / Electricity style bundles. ### 5. Authority / LPA fields Representative fields include: - `_pinswg_localplanningauthority_value` - `_pinswg_associatedlpa_value` - `pinswg_relevantauthorityname` These represent different authority models across bundles. ### 6. Consultation fields Representative fields include: - `pinswg_consultationopen` - `pinswg_consultationclose` These are currently characteristic of SIPS-style profiles. ### 7. Minimal-profile bundles Representative examples include: - `pinswg_nonvalidations` - `pinswg_ldps` These are intentionally smaller than richer planning and infrastructure bundles. --- ## Characterized Divergences Characterization work also confirmed that some similar bundles intentionally differ. Representative examples: ### Advert vs ROW specialist-process fields - Advert preserves `pinswg_speacialistcaseprocess` - ROW preserves `pinswg_specialistcaseprocess` These must not be accidentally collapsed into one shared field choice. ### Harbour vs DNS project-description fields - Harbour preserves `pinswg_projectdiscription` - DNS preserves `pinswg_projectdescription` ### Suspension-start variants - DNS preserves `pinswg_suspensionstartdates` - Harbour and Transport preserve `pinswg_suspensionstartdate` ### Authority / LPA model differences - S78 preserves `_pinswg_localplanningauthority_value` - ROW preserves `_pinswg_associatedlpa_value` plus `pinswg_relevantauthorityname` - DNS preserves `_pinswg_associatedlpa_value` without the planning-style relevant-authority field ### Event-date and event-time variants Representative coexistence includes: - `pinswg_startdateofevent` - `pinswg_startdateoftheevent` - `pinswg_starttimeofevent` - `pinswg_starttimeoftheevent` - `pinswg_startdatetimeiftheevent` ### Representation-support differences in similar bundles Representative differences include: - singular vs plural other-parties fields - singular vs plural statement-due-date fields - bundle-specific combinations of proof/questionnaire/final-comments fields These differences must be treated as compatibility-sensitive unless explicitly re-characterized. --- ## Future Guidance Future work in this area should follow these rules: 1. **Characterize first** - prove current behaviour before changing structure 2. **Extract later** - do not extract shared bundles or constants until the current compatibility contract is protected 3. **Preserve compatibility** - CRM field variants are not “cleanup noise”; they are part of the current live contract 4. **Evaluate bundle-by-bundle** - each bundle should be assessed on its own actual field requirements 5. **Avoid broad normalization** - do not assume similar names mean safe consolidation 6. **Protect intentional differences** - especially for: - specialist-process fields - representation-window fields - project-description fields - suspension-start fields - authority/LPA fields - event-date/time fields The safest sequence remains: - characterize current bundles - characterize current families - characterize duplicated clusters and divergences - only then consider bounded extraction work --- ## Explicit Non-Goals This characterization and documentation work does **not**: - rename CRM fields - remove typo fields - redesign CRM entities - standardize legislation-specific data - force appeal types into identical query profiles - introduce a query DSL - move this concern into a broader business-rule domain boundary Any future cleanup or extraction must preserve the documented compatibility contract unless an explicit behaviour-change decision is made.