@planning-inspectorate/data-model 2.29.0 → 2.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/docs/README.md +4 -0
  2. package/docs/appeal-document.md +96 -93
  3. package/docs/appeal-s78-definitions-significantchangesaffectingapplication.md +14 -0
  4. package/docs/appeal-s78-definitions.md +3 -0
  5. package/docs/appeal-s78-if.md +35 -0
  6. package/docs/appeal-s78-then.md +31 -0
  7. package/docs/appeal-s78.md +360 -197
  8. package/package.json +1 -1
  9. package/pins_data_model/models/model_appeal_document.py +4 -1
  10. package/pins_data_model/models/model_appeal_event.py +1 -1
  11. package/pins_data_model/models/model_appeal_event_estimate.py +1 -1
  12. package/pins_data_model/models/model_appeal_has.py +1 -1
  13. package/pins_data_model/models/model_appeal_representation.py +1 -1
  14. package/pins_data_model/models/model_appeal_s78.py +154 -74
  15. package/pins_data_model/models/model_dart_response.py +1 -1
  16. package/pins_data_model/models/model_entraid.py +1 -1
  17. package/pins_data_model/models/model_folder.py +1 -1
  18. package/pins_data_model/models/model_gettimesheets_response.py +1 -1
  19. package/pins_data_model/models/model_listed_building.py +1 -1
  20. package/pins_data_model/models/model_listed_buildings.py +1 -1
  21. package/pins_data_model/models/model_nsip_document.py +1 -1
  22. package/pins_data_model/models/model_nsip_exam_timetable.py +1 -1
  23. package/pins_data_model/models/model_nsip_invoice.py +1 -1
  24. package/pins_data_model/models/model_nsip_meeting.py +1 -1
  25. package/pins_data_model/models/model_nsip_project.py +1 -1
  26. package/pins_data_model/models/model_nsip_project_update.py +1 -1
  27. package/pins_data_model/models/model_nsip_representation.py +1 -1
  28. package/pins_data_model/models/model_nsip_subscription.py +1 -1
  29. package/pins_data_model/models/model_pins_inspector.py +1 -1
  30. package/pins_data_model/models/model_pins_lpa.py +1 -1
  31. package/pins_data_model/models/model_s51_advice.py +1 -1
  32. package/pins_data_model/models/model_service_user.py +1 -1
  33. package/schemas/appeal-document.schema.json +3 -0
  34. package/schemas/appeal-s78.schema.json +72 -7
  35. package/schemas/commands/appellant-submission.schema.json +2 -1
  36. package/src/enums.cjs +26 -0
  37. package/src/enums.d.ts +24 -0
  38. package/src/enums.js +24 -0
  39. package/src/index.cjs +26 -0
  40. package/src/schemas.d.ts +54 -8
  41. package/tests/appeals/appeal-s78.test.js +21 -1
  42. package/tests/appeals/expedited-appeals.test.js +238 -0
@@ -118,14 +118,10 @@
118
118
  "appellantCommentsSubmittedDate",
119
119
  "appellantStatementSubmittedDate",
120
120
  "appellantProofsSubmittedDate",
121
- "finalCommentsDueDate",
122
- "interestedPartyRepsDueDate",
123
121
  "lpaCommentsSubmittedDate",
124
122
  "lpaProofsSubmittedDate",
125
123
  "lpaStatementSubmittedDate",
126
- "proofsOfEvidenceDueDate",
127
124
  "siteNoticesSentDate",
128
- "statementDueDate",
129
125
  "reasonForNeighbourVisits",
130
126
  "numberOfResidencesNetChange",
131
127
  "siteViewableFromRoad",
@@ -151,6 +147,16 @@
151
147
  }
152
148
  }
153
149
  ],
150
+ "if": {
151
+ "properties": {
152
+ "discontinuanceNoticeServedReason": { "const": "other" }
153
+ }
154
+ },
155
+ "then": {
156
+ "properties": {
157
+ "discontinuanceNoticeServedOtherReason": { "type": "string", "minLength": 1 }
158
+ }
159
+ },
154
160
  "properties": {
155
161
  "caseId": {
156
162
  "type": ["integer", "null"],
@@ -203,7 +209,7 @@
203
209
  },
204
210
  "caseProcedure": {
205
211
  "type": ["string", "null"],
206
- "enum": ["written", "hearing", "inquiry", "writtenPart1", null],
212
+ "enum": ["written", "hearing", "inquiry", "writtenPart1", "writtenPart2", null],
207
213
  "description": "The type of procedure for the appeal",
208
214
  "$comment": "Also available on HAS cases"
209
215
  },
@@ -1035,6 +1041,7 @@
1035
1041
  "minor-commercial-development",
1036
1042
  "advertisement",
1037
1043
  "lawful-development-certificate",
1044
+ "discontinuance-notice",
1038
1045
  null
1039
1046
  ]
1040
1047
  },
@@ -1234,13 +1241,13 @@
1234
1241
  "issueDateOfEnforcementNotice": {
1235
1242
  "type": ["string", "null"],
1236
1243
  "format": "date-time",
1237
- "description": "The date on which an enforcement notice was issued",
1244
+ "description": "The date on which an Enforcement Notice or Discontinuance Notice was issued",
1238
1245
  "examples": ["2023-07-27T20:30:00.000Z"]
1239
1246
  },
1240
1247
  "effectiveDateOfEnforcementNotice": {
1241
1248
  "type": ["string", "null"],
1242
1249
  "format": "date-time",
1243
- "description": "The effective date of an enforcement notice",
1250
+ "description": "The effective date of an Enforcement Notice or Discontinuance Notice",
1244
1251
  "examples": ["2023-07-27T20:30:00.000Z"]
1245
1252
  },
1246
1253
  "didAppellantAppealLpaDecision": {
@@ -1329,6 +1336,64 @@
1329
1336
  "lpaAppealInvalidReasons": {
1330
1337
  "type": ["string", "null"],
1331
1338
  "description": "Reason(s) why LPA consider the appeal invalid"
1339
+ },
1340
+ "discontinuanceNoticeServedReason": {
1341
+ "type": ["string", "null"],
1342
+ "enum": ["risk-of-injury-to-the-amenity-of-locality", "danger-to-members-of-the-public", "other", null]
1343
+ },
1344
+ "discontinuanceNoticeServedOtherReason": {
1345
+ "type": ["string", "null"],
1346
+ "description": "Other reason for serving a discontinuance notice, for discontinuanceNoticeServedReason: other"
1347
+ },
1348
+ "wasRetrospectivePlanningApplicationMade": {
1349
+ "type": ["boolean", "null"]
1350
+ },
1351
+ "reasonForAppealAppellant": {
1352
+ "type": ["string", "null"],
1353
+ "maxLength": 250,
1354
+ "description": "Reason for appeal as provided by the appellant (Expedited Appeals)"
1355
+ },
1356
+ "screeningOpinionIndicatesEiaRequired": {
1357
+ "type": ["boolean", "null"],
1358
+ "description": "Indicates if the screening opinion specifies that an EIA is required (Expedited Appeals)"
1359
+ },
1360
+ "significantChangesAffectingApplicationAppellant": {
1361
+ "type": ["array", "null"],
1362
+ "items": {
1363
+ "type": "object",
1364
+ "properties": {
1365
+ "value": {
1366
+ "$ref": "#/definitions/SignificantChangesAffectingApplication"
1367
+ },
1368
+ "comment": {
1369
+ "type": ["string", "null"]
1370
+ }
1371
+ },
1372
+ "required": ["value"]
1373
+ },
1374
+ "description": "Significant changes affecting the application as reported by the appellant (Expedited Appeals)"
1375
+ },
1376
+ "significantChangesAffectingApplicationLpa": {
1377
+ "type": ["array", "null"],
1378
+ "items": {
1379
+ "type": "object",
1380
+ "properties": {
1381
+ "value": {
1382
+ "$ref": "#/definitions/SignificantChangesAffectingApplication"
1383
+ },
1384
+ "comment": {
1385
+ "type": ["string", "null"]
1386
+ }
1387
+ },
1388
+ "required": ["value"]
1389
+ },
1390
+ "description": "Significant changes affecting the application as reported by the LPA (Expedited Appeals)"
1391
+ }
1392
+ },
1393
+ "definitions": {
1394
+ "SignificantChangesAffectingApplication": {
1395
+ "type": "string",
1396
+ "enum": ["adopted-a-new-local-plan", "national-policy-change", "court-judgement", "other"]
1332
1397
  }
1333
1398
  }
1334
1399
  }
@@ -168,7 +168,8 @@
168
168
  "groundKSupporting",
169
169
  "groundAFeeReceipt",
170
170
  null,
171
- "environmentalAssessment"
171
+ "environmentalAssessment",
172
+ "eiaEnvironmentalStatement"
172
173
  ],
173
174
  "description": "The type of document, used for exchange, migrations and consumption from the appeal back-office system"
174
175
  }
package/src/enums.cjs CHANGED
@@ -29,6 +29,19 @@ const APPEAL_HAS_CASE_STATUS = Object.freeze({
29
29
  WITHDRAWN: 'withdrawn',
30
30
  });
31
31
 
32
+ const APPEAL_HAS_TYPE_OF_PLANNING_APPLICATION = Object.freeze({
33
+ ADVERTISEMENT: 'advertisement',
34
+ FULL_APPEAL: 'full-appeal',
35
+ HOUSEHOLDER_PLANNING: 'householder-planning',
36
+ LAWFUL_DEVELOPMENT_CERTIFICATE: 'lawful-development-certificate',
37
+ LISTED_BUILDING: 'listed-building',
38
+ MINOR_COMMERCIAL_DEVELOPMENT: 'minor-commercial-development',
39
+ OUTLINE_PLANNING: 'outline-planning',
40
+ PRIOR_APPROVAL: 'prior-approval',
41
+ REMOVAL_OR_VARIATION_OF_CONDITIONS: 'removal-or-variation-of-conditions',
42
+ RESERVED_MATTERS: 'reserved-matters',
43
+ });
44
+
32
45
  const APPEAL_ALLOCATION_LEVEL = Object.freeze({
33
46
  A: 'A',
34
47
  B: 'B',
@@ -85,6 +98,7 @@ const APPEAL_CASE_PROCEDURE = Object.freeze({
85
98
  INQUIRY: 'inquiry',
86
99
  WRITTEN: 'written',
87
100
  WRITTEN_PART_1: 'writtenPart1',
101
+ WRITTEN_PART_2: 'writtenPart2',
88
102
  });
89
103
 
90
104
  const APPEAL_CASE_STAGE = Object.freeze({
@@ -163,6 +177,12 @@ const APPEAL_DEVELOPMENT_TYPE = Object.freeze({
163
177
  OTHER_MINOR: 'other-minor',
164
178
  });
165
179
 
180
+ const APPEAL_DISCONTINUANCE_NOTICE_SERVED_REASON = Object.freeze({
181
+ DANGER_TO_MEMBERS_OF_THE_PUBLIC: 'danger-to-members-of-the-public',
182
+ OTHER: 'other',
183
+ RISK_OF_INJURY_TO_THE_AMENITY_OF_LOCALITY: 'risk-of-injury-to-the-amenity-of-locality',
184
+ });
185
+
166
186
  const APPEAL_DOCUMENT_TYPE = Object.freeze({
167
187
  APPEAL_NOTIFICATION: 'appealNotification',
168
188
  APPELLANT_CASE_CORRESPONDENCE: 'appellantCaseCorrespondence',
@@ -189,7 +209,9 @@ const APPEAL_DOCUMENT_TYPE = Object.freeze({
189
209
  DELEGATED_REPORT: 'delegatedReport',
190
210
  DESIGN_ACCESS_STATEMENT: 'designAccessStatement',
191
211
  DEVELOPMENT_PLAN_POLICIES: 'developmentPlanPolicies',
212
+ DISCONTINUANCE_NOTICE: 'discontinuanceNotice',
192
213
  EIA_ENVIRONMENTAL_STATEMENT: 'eiaEnvironmentalStatement',
214
+ EIA_ENVIRONMENTAL_STATEMENT_APPELLANT: 'eiaEnvironmentalStatementAppellant',
193
215
  EIA_SCOPING_OPINION: 'eiaScopingOpinion',
194
216
  EIA_SCREENING_DIRECTION: 'eiaScreeningDirection',
195
217
  EIA_SCREENING_OPINION: 'eiaScreeningOpinion',
@@ -233,6 +255,7 @@ const APPEAL_DOCUMENT_TYPE = Object.freeze({
233
255
  OTHER_PARTY_REPRESENTATIONS: 'otherPartyRepresentations',
234
256
  OTHER_RELEVANT_MATTERS: 'otherRelevantMatters',
235
257
  OTHER_RELEVANT_POLICIES: 'otherRelevantPolicies',
258
+ OTHER_SUPPORTING_INFORMATION_APPELLANT: 'otherSupportingInformationAppellant',
236
259
  OWNERSHIP_CERTIFICATE: 'ownershipCertificate',
237
260
  PLAN_SHOWING_EXTENT_OF_ORDER: 'planShowingExtentOfOrder',
238
261
  PLANNING_CONTRAVENTION_NOTICE: 'planningContraventionNotice',
@@ -393,6 +416,7 @@ const APPEAL_SOURCE_SYSTEM = Object.freeze({
393
416
 
394
417
  const APPEAL_TYPE_OF_PLANNING_APPLICATION = Object.freeze({
395
418
  ADVERTISEMENT: 'advertisement',
419
+ DISCONTINUANCE_NOTICE: 'discontinuance-notice',
396
420
  FULL_APPEAL: 'full-appeal',
397
421
  HOUSEHOLDER_PLANNING: 'householder-planning',
398
422
  LAWFUL_DEVELOPMENT_CERTIFICATE: 'lawful-development-certificate',
@@ -798,6 +822,7 @@ exports.APPEAL_CASE_STATUS = APPEAL_CASE_STATUS;
798
822
  exports.APPEAL_CASE_TYPE = APPEAL_CASE_TYPE;
799
823
  exports.APPEAL_CASE_VALIDATION_OUTCOME = APPEAL_CASE_VALIDATION_OUTCOME;
800
824
  exports.APPEAL_DEVELOPMENT_TYPE = APPEAL_DEVELOPMENT_TYPE;
825
+ exports.APPEAL_DISCONTINUANCE_NOTICE_SERVED_REASON = APPEAL_DISCONTINUANCE_NOTICE_SERVED_REASON;
801
826
  exports.APPEAL_DOCUMENT_TYPE = APPEAL_DOCUMENT_TYPE;
802
827
  exports.APPEAL_EIA_DEVELOPMENT_DESCRIPTION = APPEAL_EIA_DEVELOPMENT_DESCRIPTION;
803
828
  exports.APPEAL_EIA_ENVIRONMENTAL_IMPACT_SCHEDULE = APPEAL_EIA_ENVIRONMENTAL_IMPACT_SCHEDULE;
@@ -806,6 +831,7 @@ exports.APPEAL_EVENT_TYPE = APPEAL_EVENT_TYPE;
806
831
  exports.APPEAL_HAS_CASE_DECISION_OUTCOME = APPEAL_HAS_CASE_DECISION_OUTCOME;
807
832
  exports.APPEAL_HAS_CASE_PROCEDURE = APPEAL_HAS_CASE_PROCEDURE;
808
833
  exports.APPEAL_HAS_CASE_STATUS = APPEAL_HAS_CASE_STATUS;
834
+ exports.APPEAL_HAS_TYPE_OF_PLANNING_APPLICATION = APPEAL_HAS_TYPE_OF_PLANNING_APPLICATION;
809
835
  exports.APPEAL_INVALID_OR_INCOMPLETE_DETAILS = APPEAL_INVALID_OR_INCOMPLETE_DETAILS;
810
836
  exports.APPEAL_KNOWS_ALL_OWNERS = APPEAL_KNOWS_ALL_OWNERS;
811
837
  exports.APPEAL_KNOWS_OTHER_OWNERS = APPEAL_KNOWS_OTHER_OWNERS;
package/src/enums.d.ts CHANGED
@@ -27,6 +27,19 @@ export const APPEAL_HAS_CASE_STATUS = {
27
27
  WITHDRAWN: 'withdrawn',
28
28
  } as const;
29
29
 
30
+ export const APPEAL_HAS_TYPE_OF_PLANNING_APPLICATION = {
31
+ ADVERTISEMENT: 'advertisement',
32
+ FULL_APPEAL: 'full-appeal',
33
+ HOUSEHOLDER_PLANNING: 'householder-planning',
34
+ LAWFUL_DEVELOPMENT_CERTIFICATE: 'lawful-development-certificate',
35
+ LISTED_BUILDING: 'listed-building',
36
+ MINOR_COMMERCIAL_DEVELOPMENT: 'minor-commercial-development',
37
+ OUTLINE_PLANNING: 'outline-planning',
38
+ PRIOR_APPROVAL: 'prior-approval',
39
+ REMOVAL_OR_VARIATION_OF_CONDITIONS: 'removal-or-variation-of-conditions',
40
+ RESERVED_MATTERS: 'reserved-matters',
41
+ } as const;
42
+
30
43
  export const APPEAL_ALLOCATION_LEVEL = {
31
44
  A: 'A',
32
45
  B: 'B',
@@ -83,6 +96,7 @@ export const APPEAL_CASE_PROCEDURE = {
83
96
  INQUIRY: 'inquiry',
84
97
  WRITTEN: 'written',
85
98
  WRITTEN_PART_1: 'writtenPart1',
99
+ WRITTEN_PART_2: 'writtenPart2',
86
100
  } as const;
87
101
 
88
102
  export const APPEAL_CASE_STAGE = {
@@ -161,6 +175,12 @@ export const APPEAL_DEVELOPMENT_TYPE = {
161
175
  OTHER_MINOR: 'other-minor',
162
176
  } as const;
163
177
 
178
+ export const APPEAL_DISCONTINUANCE_NOTICE_SERVED_REASON = {
179
+ DANGER_TO_MEMBERS_OF_THE_PUBLIC: 'danger-to-members-of-the-public',
180
+ OTHER: 'other',
181
+ RISK_OF_INJURY_TO_THE_AMENITY_OF_LOCALITY: 'risk-of-injury-to-the-amenity-of-locality',
182
+ } as const;
183
+
164
184
  export const APPEAL_DOCUMENT_TYPE = {
165
185
  APPEAL_NOTIFICATION: 'appealNotification',
166
186
  APPELLANT_CASE_CORRESPONDENCE: 'appellantCaseCorrespondence',
@@ -187,7 +207,9 @@ export const APPEAL_DOCUMENT_TYPE = {
187
207
  DELEGATED_REPORT: 'delegatedReport',
188
208
  DESIGN_ACCESS_STATEMENT: 'designAccessStatement',
189
209
  DEVELOPMENT_PLAN_POLICIES: 'developmentPlanPolicies',
210
+ DISCONTINUANCE_NOTICE: 'discontinuanceNotice',
190
211
  EIA_ENVIRONMENTAL_STATEMENT: 'eiaEnvironmentalStatement',
212
+ EIA_ENVIRONMENTAL_STATEMENT_APPELLANT: 'eiaEnvironmentalStatementAppellant',
191
213
  EIA_SCOPING_OPINION: 'eiaScopingOpinion',
192
214
  EIA_SCREENING_DIRECTION: 'eiaScreeningDirection',
193
215
  EIA_SCREENING_OPINION: 'eiaScreeningOpinion',
@@ -231,6 +253,7 @@ export const APPEAL_DOCUMENT_TYPE = {
231
253
  OTHER_PARTY_REPRESENTATIONS: 'otherPartyRepresentations',
232
254
  OTHER_RELEVANT_MATTERS: 'otherRelevantMatters',
233
255
  OTHER_RELEVANT_POLICIES: 'otherRelevantPolicies',
256
+ OTHER_SUPPORTING_INFORMATION_APPELLANT: 'otherSupportingInformationAppellant',
234
257
  OWNERSHIP_CERTIFICATE: 'ownershipCertificate',
235
258
  PLAN_SHOWING_EXTENT_OF_ORDER: 'planShowingExtentOfOrder',
236
259
  PLANNING_CONTRAVENTION_NOTICE: 'planningContraventionNotice',
@@ -391,6 +414,7 @@ export const APPEAL_SOURCE_SYSTEM = {
391
414
 
392
415
  export const APPEAL_TYPE_OF_PLANNING_APPLICATION = {
393
416
  ADVERTISEMENT: 'advertisement',
417
+ DISCONTINUANCE_NOTICE: 'discontinuance-notice',
394
418
  FULL_APPEAL: 'full-appeal',
395
419
  HOUSEHOLDER_PLANNING: 'householder-planning',
396
420
  LAWFUL_DEVELOPMENT_CERTIFICATE: 'lawful-development-certificate',
package/src/enums.js CHANGED
@@ -27,6 +27,19 @@ export const APPEAL_HAS_CASE_STATUS = Object.freeze({
27
27
  WITHDRAWN: 'withdrawn',
28
28
  });
29
29
 
30
+ export const APPEAL_HAS_TYPE_OF_PLANNING_APPLICATION = Object.freeze({
31
+ ADVERTISEMENT: 'advertisement',
32
+ FULL_APPEAL: 'full-appeal',
33
+ HOUSEHOLDER_PLANNING: 'householder-planning',
34
+ LAWFUL_DEVELOPMENT_CERTIFICATE: 'lawful-development-certificate',
35
+ LISTED_BUILDING: 'listed-building',
36
+ MINOR_COMMERCIAL_DEVELOPMENT: 'minor-commercial-development',
37
+ OUTLINE_PLANNING: 'outline-planning',
38
+ PRIOR_APPROVAL: 'prior-approval',
39
+ REMOVAL_OR_VARIATION_OF_CONDITIONS: 'removal-or-variation-of-conditions',
40
+ RESERVED_MATTERS: 'reserved-matters',
41
+ });
42
+
30
43
  export const APPEAL_ALLOCATION_LEVEL = Object.freeze({
31
44
  A: 'A',
32
45
  B: 'B',
@@ -83,6 +96,7 @@ export const APPEAL_CASE_PROCEDURE = Object.freeze({
83
96
  INQUIRY: 'inquiry',
84
97
  WRITTEN: 'written',
85
98
  WRITTEN_PART_1: 'writtenPart1',
99
+ WRITTEN_PART_2: 'writtenPart2',
86
100
  });
87
101
 
88
102
  export const APPEAL_CASE_STAGE = Object.freeze({
@@ -161,6 +175,12 @@ export const APPEAL_DEVELOPMENT_TYPE = Object.freeze({
161
175
  OTHER_MINOR: 'other-minor',
162
176
  });
163
177
 
178
+ export const APPEAL_DISCONTINUANCE_NOTICE_SERVED_REASON = Object.freeze({
179
+ DANGER_TO_MEMBERS_OF_THE_PUBLIC: 'danger-to-members-of-the-public',
180
+ OTHER: 'other',
181
+ RISK_OF_INJURY_TO_THE_AMENITY_OF_LOCALITY: 'risk-of-injury-to-the-amenity-of-locality',
182
+ });
183
+
164
184
  export const APPEAL_DOCUMENT_TYPE = Object.freeze({
165
185
  APPEAL_NOTIFICATION: 'appealNotification',
166
186
  APPELLANT_CASE_CORRESPONDENCE: 'appellantCaseCorrespondence',
@@ -187,7 +207,9 @@ export const APPEAL_DOCUMENT_TYPE = Object.freeze({
187
207
  DELEGATED_REPORT: 'delegatedReport',
188
208
  DESIGN_ACCESS_STATEMENT: 'designAccessStatement',
189
209
  DEVELOPMENT_PLAN_POLICIES: 'developmentPlanPolicies',
210
+ DISCONTINUANCE_NOTICE: 'discontinuanceNotice',
190
211
  EIA_ENVIRONMENTAL_STATEMENT: 'eiaEnvironmentalStatement',
212
+ EIA_ENVIRONMENTAL_STATEMENT_APPELLANT: 'eiaEnvironmentalStatementAppellant',
191
213
  EIA_SCOPING_OPINION: 'eiaScopingOpinion',
192
214
  EIA_SCREENING_DIRECTION: 'eiaScreeningDirection',
193
215
  EIA_SCREENING_OPINION: 'eiaScreeningOpinion',
@@ -231,6 +253,7 @@ export const APPEAL_DOCUMENT_TYPE = Object.freeze({
231
253
  OTHER_PARTY_REPRESENTATIONS: 'otherPartyRepresentations',
232
254
  OTHER_RELEVANT_MATTERS: 'otherRelevantMatters',
233
255
  OTHER_RELEVANT_POLICIES: 'otherRelevantPolicies',
256
+ OTHER_SUPPORTING_INFORMATION_APPELLANT: 'otherSupportingInformationAppellant',
234
257
  OWNERSHIP_CERTIFICATE: 'ownershipCertificate',
235
258
  PLAN_SHOWING_EXTENT_OF_ORDER: 'planShowingExtentOfOrder',
236
259
  PLANNING_CONTRAVENTION_NOTICE: 'planningContraventionNotice',
@@ -391,6 +414,7 @@ export const APPEAL_SOURCE_SYSTEM = Object.freeze({
391
414
 
392
415
  export const APPEAL_TYPE_OF_PLANNING_APPLICATION = Object.freeze({
393
416
  ADVERTISEMENT: 'advertisement',
417
+ DISCONTINUANCE_NOTICE: 'discontinuance-notice',
394
418
  FULL_APPEAL: 'full-appeal',
395
419
  HOUSEHOLDER_PLANNING: 'householder-planning',
396
420
  LAWFUL_DEVELOPMENT_CERTIFICATE: 'lawful-development-certificate',
package/src/index.cjs CHANGED
@@ -110,6 +110,19 @@ const APPEAL_HAS_CASE_STATUS = Object.freeze({
110
110
  WITHDRAWN: 'withdrawn',
111
111
  });
112
112
 
113
+ const APPEAL_HAS_TYPE_OF_PLANNING_APPLICATION = Object.freeze({
114
+ ADVERTISEMENT: 'advertisement',
115
+ FULL_APPEAL: 'full-appeal',
116
+ HOUSEHOLDER_PLANNING: 'householder-planning',
117
+ LAWFUL_DEVELOPMENT_CERTIFICATE: 'lawful-development-certificate',
118
+ LISTED_BUILDING: 'listed-building',
119
+ MINOR_COMMERCIAL_DEVELOPMENT: 'minor-commercial-development',
120
+ OUTLINE_PLANNING: 'outline-planning',
121
+ PRIOR_APPROVAL: 'prior-approval',
122
+ REMOVAL_OR_VARIATION_OF_CONDITIONS: 'removal-or-variation-of-conditions',
123
+ RESERVED_MATTERS: 'reserved-matters',
124
+ });
125
+
113
126
  const APPEAL_ALLOCATION_LEVEL = Object.freeze({
114
127
  A: 'A',
115
128
  B: 'B',
@@ -166,6 +179,7 @@ const APPEAL_CASE_PROCEDURE = Object.freeze({
166
179
  INQUIRY: 'inquiry',
167
180
  WRITTEN: 'written',
168
181
  WRITTEN_PART_1: 'writtenPart1',
182
+ WRITTEN_PART_2: 'writtenPart2',
169
183
  });
170
184
 
171
185
  const APPEAL_CASE_STAGE = Object.freeze({
@@ -244,6 +258,12 @@ const APPEAL_DEVELOPMENT_TYPE = Object.freeze({
244
258
  OTHER_MINOR: 'other-minor',
245
259
  });
246
260
 
261
+ const APPEAL_DISCONTINUANCE_NOTICE_SERVED_REASON = Object.freeze({
262
+ DANGER_TO_MEMBERS_OF_THE_PUBLIC: 'danger-to-members-of-the-public',
263
+ OTHER: 'other',
264
+ RISK_OF_INJURY_TO_THE_AMENITY_OF_LOCALITY: 'risk-of-injury-to-the-amenity-of-locality',
265
+ });
266
+
247
267
  const APPEAL_DOCUMENT_TYPE = Object.freeze({
248
268
  APPEAL_NOTIFICATION: 'appealNotification',
249
269
  APPELLANT_CASE_CORRESPONDENCE: 'appellantCaseCorrespondence',
@@ -270,7 +290,9 @@ const APPEAL_DOCUMENT_TYPE = Object.freeze({
270
290
  DELEGATED_REPORT: 'delegatedReport',
271
291
  DESIGN_ACCESS_STATEMENT: 'designAccessStatement',
272
292
  DEVELOPMENT_PLAN_POLICIES: 'developmentPlanPolicies',
293
+ DISCONTINUANCE_NOTICE: 'discontinuanceNotice',
273
294
  EIA_ENVIRONMENTAL_STATEMENT: 'eiaEnvironmentalStatement',
295
+ EIA_ENVIRONMENTAL_STATEMENT_APPELLANT: 'eiaEnvironmentalStatementAppellant',
274
296
  EIA_SCOPING_OPINION: 'eiaScopingOpinion',
275
297
  EIA_SCREENING_DIRECTION: 'eiaScreeningDirection',
276
298
  EIA_SCREENING_OPINION: 'eiaScreeningOpinion',
@@ -314,6 +336,7 @@ const APPEAL_DOCUMENT_TYPE = Object.freeze({
314
336
  OTHER_PARTY_REPRESENTATIONS: 'otherPartyRepresentations',
315
337
  OTHER_RELEVANT_MATTERS: 'otherRelevantMatters',
316
338
  OTHER_RELEVANT_POLICIES: 'otherRelevantPolicies',
339
+ OTHER_SUPPORTING_INFORMATION_APPELLANT: 'otherSupportingInformationAppellant',
317
340
  OWNERSHIP_CERTIFICATE: 'ownershipCertificate',
318
341
  PLAN_SHOWING_EXTENT_OF_ORDER: 'planShowingExtentOfOrder',
319
342
  PLANNING_CONTRAVENTION_NOTICE: 'planningContraventionNotice',
@@ -474,6 +497,7 @@ const APPEAL_SOURCE_SYSTEM = Object.freeze({
474
497
 
475
498
  const APPEAL_TYPE_OF_PLANNING_APPLICATION = Object.freeze({
476
499
  ADVERTISEMENT: 'advertisement',
500
+ DISCONTINUANCE_NOTICE: 'discontinuance-notice',
477
501
  FULL_APPEAL: 'full-appeal',
478
502
  HOUSEHOLDER_PLANNING: 'householder-planning',
479
503
  LAWFUL_DEVELOPMENT_CERTIFICATE: 'lawful-development-certificate',
@@ -911,6 +935,7 @@ exports.APPEAL_CASE_STATUS = APPEAL_CASE_STATUS;
911
935
  exports.APPEAL_CASE_TYPE = APPEAL_CASE_TYPE;
912
936
  exports.APPEAL_CASE_VALIDATION_OUTCOME = APPEAL_CASE_VALIDATION_OUTCOME;
913
937
  exports.APPEAL_DEVELOPMENT_TYPE = APPEAL_DEVELOPMENT_TYPE;
938
+ exports.APPEAL_DISCONTINUANCE_NOTICE_SERVED_REASON = APPEAL_DISCONTINUANCE_NOTICE_SERVED_REASON;
914
939
  exports.APPEAL_DOCUMENT_TYPE = APPEAL_DOCUMENT_TYPE;
915
940
  exports.APPEAL_EIA_DEVELOPMENT_DESCRIPTION = APPEAL_EIA_DEVELOPMENT_DESCRIPTION;
916
941
  exports.APPEAL_EIA_ENVIRONMENTAL_IMPACT_SCHEDULE = APPEAL_EIA_ENVIRONMENTAL_IMPACT_SCHEDULE;
@@ -919,6 +944,7 @@ exports.APPEAL_EVENT_TYPE = APPEAL_EVENT_TYPE;
919
944
  exports.APPEAL_HAS_CASE_DECISION_OUTCOME = APPEAL_HAS_CASE_DECISION_OUTCOME;
920
945
  exports.APPEAL_HAS_CASE_PROCEDURE = APPEAL_HAS_CASE_PROCEDURE;
921
946
  exports.APPEAL_HAS_CASE_STATUS = APPEAL_HAS_CASE_STATUS;
947
+ exports.APPEAL_HAS_TYPE_OF_PLANNING_APPLICATION = APPEAL_HAS_TYPE_OF_PLANNING_APPLICATION;
922
948
  exports.APPEAL_INVALID_OR_INCOMPLETE_DETAILS = APPEAL_INVALID_OR_INCOMPLETE_DETAILS;
923
949
  exports.APPEAL_KNOWS_ALL_OWNERS = APPEAL_KNOWS_ALL_OWNERS;
924
950
  exports.APPEAL_KNOWS_OTHER_OWNERS = APPEAL_KNOWS_OTHER_OWNERS;
package/src/schemas.d.ts CHANGED
@@ -175,6 +175,9 @@ export interface AppealDocument {
175
175
  | 'groundISupporting'
176
176
  | 'groundJSupporting'
177
177
  | 'groundKSupporting'
178
+ | 'discontinuanceNotice'
179
+ | 'otherSupportingInformationAppellant'
180
+ | 'eiaEnvironmentalStatementAppellant'
178
181
  | null;
179
182
  /**
180
183
  * The system mastering the metadata for the current document
@@ -972,7 +975,7 @@ export type AppealS78Case = (GridReference | SiteAddress) & {
972
975
  /**
973
976
  * The type of procedure for the appeal
974
977
  */
975
- caseProcedure: 'written' | 'hearing' | 'inquiry' | 'writtenPart1' | null;
978
+ caseProcedure: 'written' | 'hearing' | 'inquiry' | 'writtenPart1' | 'writtenPart2' | null;
976
979
  /**
977
980
  * A unique identifier for the Local Planning Authority
978
981
  */
@@ -1460,14 +1463,14 @@ export type AppealS78Case = (GridReference | SiteAddress) & {
1460
1463
  appellantStatementDueDate?: string | null;
1461
1464
  appellantStatementSubmittedDate: string | null;
1462
1465
  appellantProofsSubmittedDate: string | null;
1463
- finalCommentsDueDate: string | null;
1464
- interestedPartyRepsDueDate: string | null;
1466
+ finalCommentsDueDate?: string | null;
1467
+ interestedPartyRepsDueDate?: string | null;
1465
1468
  lpaCommentsSubmittedDate: string | null;
1466
1469
  lpaProofsSubmittedDate: string | null;
1467
1470
  lpaStatementSubmittedDate: string | null;
1468
- proofsOfEvidenceDueDate: string | null;
1471
+ proofsOfEvidenceDueDate?: string | null;
1469
1472
  siteNoticesSentDate: string | null;
1470
- statementDueDate: string | null;
1473
+ statementDueDate?: string | null;
1471
1474
  /**
1472
1475
  * The date of the Case Management Conference (CMC)
1473
1476
  */
@@ -1491,6 +1494,7 @@ export type AppealS78Case = (GridReference | SiteAddress) & {
1491
1494
  | 'minor-commercial-development'
1492
1495
  | 'advertisement'
1493
1496
  | 'lawful-development-certificate'
1497
+ | 'discontinuance-notice'
1494
1498
  | null;
1495
1499
  developmentType:
1496
1500
  | 'householder'
@@ -1626,11 +1630,11 @@ export type AppealS78Case = (GridReference | SiteAddress) & {
1626
1630
  */
1627
1631
  previousPlanningPermissionGranted?: boolean | null;
1628
1632
  /**
1629
- * The date on which an enforcement notice was issued
1633
+ * The date on which an Enforcement Notice or Discontinuance Notice was issued
1630
1634
  */
1631
1635
  issueDateOfEnforcementNotice?: string | null;
1632
1636
  /**
1633
- * The effective date of an enforcement notice
1637
+ * The effective date of an Enforcement Notice or Discontinuance Notice
1634
1638
  */
1635
1639
  effectiveDateOfEnforcementNotice?: string | null;
1636
1640
  /**
@@ -1691,8 +1695,49 @@ export type AppealS78Case = (GridReference | SiteAddress) & {
1691
1695
  * Reason(s) why LPA consider the appeal invalid
1692
1696
  */
1693
1697
  lpaAppealInvalidReasons?: string | null;
1698
+ discontinuanceNoticeServedReason?:
1699
+ | 'risk-of-injury-to-the-amenity-of-locality'
1700
+ | 'danger-to-members-of-the-public'
1701
+ | 'other'
1702
+ | null;
1703
+ /**
1704
+ * Other reason for serving a discontinuance notice, for discontinuanceNoticeServedReason: other
1705
+ */
1706
+ discontinuanceNoticeServedOtherReason?: string | null;
1707
+ wasRetrospectivePlanningApplicationMade?: boolean | null;
1708
+ /**
1709
+ * Reason for appeal as provided by the appellant (Expedited Appeals)
1710
+ */
1711
+ reasonForAppealAppellant?: string | null;
1712
+ /**
1713
+ * Indicates if the screening opinion specifies that an EIA is required (Expedited Appeals)
1714
+ */
1715
+ screeningOpinionIndicatesEiaRequired?: boolean | null;
1716
+ /**
1717
+ * Significant changes affecting the application as reported by the appellant (Expedited Appeals)
1718
+ */
1719
+ significantChangesAffectingApplicationAppellant?:
1720
+ | {
1721
+ value: SignificantChangesAffectingApplication;
1722
+ comment?: string | null;
1723
+ }[]
1724
+ | null;
1725
+ /**
1726
+ * Significant changes affecting the application as reported by the LPA (Expedited Appeals)
1727
+ */
1728
+ significantChangesAffectingApplicationLpa?:
1729
+ | {
1730
+ value: SignificantChangesAffectingApplication;
1731
+ comment?: string | null;
1732
+ }[]
1733
+ | null;
1694
1734
  [k: string]: unknown;
1695
1735
  };
1736
+ export type SignificantChangesAffectingApplication =
1737
+ | 'adopted-a-new-local-plan'
1738
+ | 'national-policy-change'
1739
+ | 'court-judgement'
1740
+ | 'other';
1696
1741
 
1697
1742
  export interface GridReference {
1698
1743
  siteGridReferenceEasting: string;
@@ -3877,7 +3922,8 @@ export interface AppellantSubmissionCommand {
3877
3922
  | 'groundKSupporting'
3878
3923
  | 'groundAFeeReceipt'
3879
3924
  | null
3880
- | 'environmentalAssessment';
3925
+ | 'environmentalAssessment'
3926
+ | 'eiaEnvironmentalStatement';
3881
3927
  [k: string]: unknown;
3882
3928
  }[];
3883
3929
  /**
@@ -247,7 +247,27 @@ describe(schema, () => {
247
247
  assert.strictEqual(validationResult, false);
248
248
  });
249
249
 
250
- const groupBAppealTypes = ['C', 'F', 'H', 'W', 'X', 'Y', 'Z'];
250
+ it('should enforce other for discontinuanceNoticeServedReason', () => {
251
+ const test = structuredClone(appealS78);
252
+ test.discontinuanceNoticeServedReason = 'other';
253
+ test.discontinuanceNoticeServedOtherReason = '';
254
+ const validationResult = ajv.validate(schema, test);
255
+ assert.strictEqual(validationResult, false);
256
+
257
+ test.discontinuanceNoticeServedOtherReason = null;
258
+ const validationResult2 = ajv.validate(schema, test);
259
+ assert.strictEqual(validationResult2, false);
260
+ });
261
+
262
+ it('should allow no reason for non other discontinuanceNoticeServedOtherReason', () => {
263
+ const test = structuredClone(appealS78);
264
+ test.discontinuanceNoticeServedReason = 'danger-to-members-of-the-public';
265
+ test.discontinuanceNoticeServedOtherReason = null;
266
+ const validationResult = ajv.validate(schema, test);
267
+ assert.strictEqual(validationResult, true);
268
+ });
269
+
270
+ const groupBAppealTypes = ['C', 'F', 'G', 'H', 'W', 'X', 'Y', 'Z'];
251
271
  groupBAppealTypes.forEach((appealType) => {
252
272
  it(`should support group B appeal type ${appealType}`, () => {
253
273
  const test = structuredClone(appealS78);