@planning-inspectorate/data-model 2.21.0 → 2.21.2

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 (34) hide show
  1. package/README.md +8 -8
  2. package/package.json +1 -1
  3. package/pins_data_model/models/model_appeal_document.py +1 -1
  4. package/pins_data_model/models/model_appeal_event.py +1 -1
  5. package/pins_data_model/models/model_appeal_event_estimate.py +1 -1
  6. package/pins_data_model/models/model_appeal_has.py +1 -1
  7. package/pins_data_model/models/model_appeal_representation.py +1 -1
  8. package/pins_data_model/models/model_appeal_s78.py +1 -1
  9. package/pins_data_model/models/model_dart_response.py +1 -1
  10. package/pins_data_model/models/model_entraid.py +1 -1
  11. package/pins_data_model/models/model_folder.py +1 -1
  12. package/pins_data_model/models/model_gettimesheets_response.py +1 -1
  13. package/pins_data_model/models/model_listed_building.py +1 -1
  14. package/pins_data_model/models/model_listed_buildings.py +1 -1
  15. package/pins_data_model/models/model_nsip_document.py +1 -1
  16. package/pins_data_model/models/model_nsip_exam_timetable.py +1 -1
  17. package/pins_data_model/models/model_nsip_invoice.py +1 -1
  18. package/pins_data_model/models/model_nsip_meeting.py +1 -1
  19. package/pins_data_model/models/model_nsip_project.py +1 -1
  20. package/pins_data_model/models/model_nsip_project_update.py +1 -1
  21. package/pins_data_model/models/model_nsip_representation.py +1 -1
  22. package/pins_data_model/models/model_nsip_subscription.py +1 -1
  23. package/pins_data_model/models/model_pins_inspector.py +1 -1
  24. package/pins_data_model/models/model_pins_lpa.py +1 -1
  25. package/pins_data_model/models/model_s51_advice.py +1 -1
  26. package/pins_data_model/models/model_service_user.py +1 -1
  27. package/schemas/commands/appeals-components/appeal-enforcement-common-submission.schema.json +52 -5
  28. package/schemas/commands/appeals-components/appeal-enforcement-listed-submission.schema.json +1 -49
  29. package/schemas/commands/appeals-components/{appeal-enforcement-submission.schema.json → appeal-enforcement-notice-submission.schema.json} +16 -93
  30. package/schemas/commands/appellant-submission.schema.json +1 -1
  31. package/src/index.d.ts +2 -2
  32. package/src/schemas.d.ts +147 -197
  33. package/tests/appeals/commands/enforcement-listed-submission.test.js +0 -3
  34. package/tests/appeals/commands/{enforcement-submission.test.js → enforcement-notice-submission.test.js} +2 -45
package/README.md CHANGED
@@ -164,30 +164,30 @@ The schemas in this repository are written in jsonc (JSON with comments), and ca
164
164
 
165
165
  ## Node.js Usage
166
166
 
167
- To use these schemas in a Node project, add this repo as a dependency (with a particular tag or commit as the version):
167
+ To use these schemas in a Node project, add this repo as a dependency:
168
168
 
169
- `npm i -s Planning-Inspectorate/data-model#some-tag-or-commit`
169
+ `npm i -s @planning-inspectorate/data-model`
170
+
171
+ As usual with npm you can optionally specify a version:
172
+
173
+ `npm i -s @planning-inspectorate/data-model@2.20.0`
170
174
 
171
175
  Then import as required:
172
176
 
173
177
  ```es6
174
- import {loadAllSchemas} from 'pins-data-model';
178
+ import {loadAllSchemas} from '@planning-inspectorate/data-model';
175
179
  ```
176
180
 
177
181
  or to import enum constants, for example:
178
182
 
179
183
  ```es6
180
- import { APPEAL_CASE_STATUS } from 'pins-data-model';
184
+ import { APPEAL_CASE_STATUS } from '@planning-inspectorate/data-model';
181
185
 
182
186
  if (someAppeal.status === APPEAL_CASE_STATUS.COMPLETE) {
183
187
  console.log(`we're done!`);
184
188
  }
185
189
  ```
186
190
 
187
- To upgrade to a different version, simply doing npm command does not seem to get the correct version, so we need to first uninstall and then reinstall. You can do this by running:
188
-
189
- `npm uninstall pins-data-model && npm prune && npm i -s github:Planning-Inspectorate/data-model#some-tag-or-commit`
190
-
191
191
  ### Tests
192
192
 
193
193
  We are starting to add js tests to the models using node test runner
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planning-inspectorate/data-model",
3
- "version": "2.21.0",
3
+ "version": "2.21.2",
4
4
  "description": "JSON Schemas for the Planning Inspectorate's Data Model",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: appeal-document.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:43+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: appeal-event.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: appeal-event-estimate.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: appeal-has.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:43+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: appeal-representation.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:43+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: appeal-s78.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:43+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: dart-response.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: entraid.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: folder.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: gettimesheets-response.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: listed-building.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: listed-buildings.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:43+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: nsip-document.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: nsip-exam-timetable.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:43+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: nsip-invoice.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: nsip-meeting.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: nsip-project.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: nsip-project-update.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: nsip-representation.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:43+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: nsip-subscription.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: pins-inspector.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: pins-lpa.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: s51-advice.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: service-user.schema.json
3
- # timestamp: 2026-02-12T13:24:53+00:00
3
+ # timestamp: 2026-02-14T15:08:42+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -14,7 +14,10 @@
14
14
  "enforcementReference",
15
15
  "caseSubmissionDueDate",
16
16
  "enforcementIssueDate",
17
- "enforcementEffectiveDate"
17
+ "enforcementEffectiveDate",
18
+ "siteAddressLine1",
19
+ "siteAddressTown",
20
+ "siteAddressPostcode"
18
21
  ],
19
22
  "properties": {
20
23
  "submissionId": {
@@ -83,6 +86,54 @@
83
86
  "description": "The statutory deadline for submitting an appeal from the original LPA decision date",
84
87
  "$comment": "Calculated from the applicationDecisionDate"
85
88
  },
89
+ "siteAddressLine1": {
90
+ "type": ["string", "null"],
91
+ "examples": ["96 The Avenue"],
92
+ "description": "First line of address for the appeal site"
93
+ },
94
+ "siteAddressLine2": {
95
+ "type": ["string", "null"],
96
+ "description": "Second line of address for the appeal site"
97
+ },
98
+ "siteAddressTown": {
99
+ "type": ["string", "null"],
100
+ "examples": ["Maidstone"],
101
+ "description": "Town / City of the site address"
102
+ },
103
+ "siteAddressCounty": {
104
+ "type": ["string", "null"],
105
+ "examples": ["Kent"],
106
+ "description": "County of the site address"
107
+ },
108
+ "siteAddressPostcode": {
109
+ "type": ["string", "null"],
110
+ "examples": ["MD21 5XY"],
111
+ "description": "Postal code of the site address"
112
+ },
113
+ "contactAddressLine1": {
114
+ "type": ["string", "null"],
115
+ "examples": ["96 The Avenue"],
116
+ "description": "First line of address for the appeal site"
117
+ },
118
+ "contactAddressLine2": {
119
+ "type": ["string", "null"],
120
+ "description": "Second line of address for the appeal site"
121
+ },
122
+ "contactAddressTown": {
123
+ "type": ["string", "null"],
124
+ "examples": ["Maidstone"],
125
+ "description": "Town / City of the site address"
126
+ },
127
+ "contactAddressCounty": {
128
+ "type": ["string", "null"],
129
+ "examples": ["Kent"],
130
+ "description": "County of the site address"
131
+ },
132
+ "contactAddressPostcode": {
133
+ "type": ["string", "null"],
134
+ "examples": ["MD21 5XY"],
135
+ "description": "Postal code of the site address"
136
+ },
86
137
  "siteAccessDetails": {
87
138
  "type": ["array", "null"],
88
139
  "items": {
@@ -121,10 +172,6 @@
121
172
  "type": ["number", "null"],
122
173
  "description": "The number of witnesses appellant has suggested for inquiries preference"
123
174
  },
124
- "statusPlanningObligation": {
125
- "type": ["string", "null"],
126
- "description": "The planning obligation information, if available"
127
- },
128
175
  "nearbyCaseReferences": {
129
176
  "type": ["array", "null"],
130
177
  "items": {
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "commands/appeals-components/appeal-enforcement-listed-submission.schema.json",
4
4
  "title": "Appellant enforcement listed building submission properties",
5
- "description": "Schema defining any properties for enforcement listed building appeals",
5
+ "description": "Schema defining any properties specific to enforcement listed building appeals",
6
6
  "type": "object",
7
7
  "additionalProperties": true,
8
8
  "required": [],
@@ -31,54 +31,6 @@
31
31
  },
32
32
  "description": "A list of individuals named on the enforcement notice"
33
33
  },
34
- "siteAddressLine1": {
35
- "type": ["string", "null"],
36
- "examples": ["96 The Avenue"],
37
- "description": "First line of address for the appeal site"
38
- },
39
- "siteAddressLine2": {
40
- "type": ["string", "null"],
41
- "description": "Second line of address for the appeal site"
42
- },
43
- "siteAddressTown": {
44
- "type": ["string", "null"],
45
- "examples": ["Maidstone"],
46
- "description": "Town / City of the site address"
47
- },
48
- "siteAddressCounty": {
49
- "type": ["string", "null"],
50
- "examples": ["Kent"],
51
- "description": "County of the site address"
52
- },
53
- "siteAddressPostcode": {
54
- "type": ["string", "null"],
55
- "examples": ["MD21 5XY"],
56
- "description": "Postal code of the site address"
57
- },
58
- "contactAddressLine1": {
59
- "type": ["string", "null"],
60
- "examples": ["96 The Avenue"],
61
- "description": "First line of address for the appeal site"
62
- },
63
- "contactAddressLine2": {
64
- "type": ["string", "null"],
65
- "description": "Second line of address for the appeal site"
66
- },
67
- "contactAddressTown": {
68
- "type": ["string", "null"],
69
- "examples": ["Maidstone"],
70
- "description": "Town / City of the site address"
71
- },
72
- "contactAddressCounty": {
73
- "type": ["string", "null"],
74
- "examples": ["Kent"],
75
- "description": "County of the site address"
76
- },
77
- "contactAddressPostcode": {
78
- "type": ["string", "null"],
79
- "examples": ["MD21 5XY"],
80
- "description": "Postal code of the site address"
81
- },
82
34
  "appealGrounds": {
83
35
  "type": ["array", "null"],
84
36
  "items": {
@@ -1,32 +1,23 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "commands/appeals-components/appeal-enforcement-submission.schema.json",
4
- "title": "Appellant enforcement submission properties",
5
- "description": "Schema defining any properties for enforcement appeals",
3
+ "$id": "commands/appeals-components/appeal-enforcement-notice-submission.schema.json",
4
+ "title": "Appellant enforcement notice specific submission properties",
5
+ "description": "Schema defining properties specific to enforcement notice appeals",
6
6
  "type": "object",
7
7
  "additionalProperties": true,
8
8
  "required": [],
9
- "anyOf": [
10
- {
11
- "required": ["siteGridReferenceEasting", "siteGridReferenceNorthing"],
12
- "properties": {
13
- "siteGridReferenceEasting": { "type": "string" },
14
- "siteGridReferenceNorthing": { "type": "string" }
15
- }
16
- },
17
- {
18
- "required": ["siteAddressLine1", "siteAddressTown", "siteAddressPostcode"],
19
- "properties": {
20
- "siteAddressLine1": { "type": "string" },
21
- "siteAddressTown": { "type": "string" },
22
- "siteAddressPostcode": { "type": "string" }
23
- }
24
- }
25
- ],
26
9
  "properties": {
27
10
  "applicationMadeAndFeePaid": {
28
11
  "type": ["boolean", "null"],
29
- "description": "Whether a planning application was made"
12
+ "description": "Whether a planning application was made - historic question"
13
+ },
14
+ "retrospectiveApplication": {
15
+ "type": ["boolean", "null"],
16
+ "description": "Whether a retrospective planning application was made"
17
+ },
18
+ "groundAFeePaid": {
19
+ "type": ["boolean", "null"],
20
+ "description": "Whether a ground (a) fee has been paid"
30
21
  },
31
22
  "applicationDevelopmentAllOrPart": {
32
23
  "type": ["string", "null"],
@@ -73,81 +64,13 @@
73
64
  "examples": ["2023-07-27T20:30:00.000Z"],
74
65
  "description": "The date of the appeal against the original LPA decision"
75
66
  },
76
- "siteAddressLine1": {
77
- "type": ["string", "null"],
78
- "examples": ["96 The Avenue"],
79
- "description": "First line of address for the appeal site"
80
- },
81
- "siteAddressLine2": {
82
- "type": ["string", "null"],
83
- "description": "Second line of address for the appeal site"
84
- },
85
- "siteAddressTown": {
86
- "type": ["string", "null"],
87
- "examples": ["Maidstone"],
88
- "description": "Town / City of the site address"
89
- },
90
- "siteAddressCounty": {
91
- "type": ["string", "null"],
92
- "examples": ["Kent"],
93
- "description": "County of the site address"
94
- },
95
- "siteAddressPostcode": {
96
- "type": ["string", "null"],
97
- "examples": ["MD21 5XY"],
98
- "description": "Postal code of the site address"
99
- },
100
- "contactAddressLine1": {
101
- "type": ["string", "null"],
102
- "examples": ["96 The Avenue"],
103
- "description": "First line of address for the appeal site"
104
- },
105
- "contactAddressLine2": {
106
- "type": ["string", "null"],
107
- "description": "Second line of address for the appeal site"
108
- },
109
- "contactAddressTown": {
110
- "type": ["string", "null"],
111
- "examples": ["Maidstone"],
112
- "description": "Town / City of the site address"
113
- },
114
- "contactAddressCounty": {
115
- "type": ["string", "null"],
116
- "examples": ["Kent"],
117
- "description": "County of the site address"
118
- },
119
- "contactAddressPostcode": {
120
- "type": ["string", "null"],
121
- "examples": ["MD21 5XY"],
122
- "description": "Postal code of the site address"
123
- },
124
- "siteGridReferenceEasting": {
125
- "type": ["string", "null"],
126
- "pattern": "^\\d{6,7}$",
127
- "examples": ["357144"]
128
- },
129
- "siteGridReferenceNorthing": {
130
- "type": ["string", "null"],
131
- "pattern": "^\\d{6,7}$",
132
- "examples": ["400534"]
133
- },
134
- "retrospectiveApplication": {
67
+ "planningObligation": {
135
68
  "type": ["boolean", "null"],
136
- "description": "Whether a retrospective planning application was made"
137
- },
138
- "contactGridReferenceEasting": {
139
- "type": ["string", "null"],
140
- "pattern": "^\\d{6,7}$",
141
- "examples": ["357144"]
69
+ "description": "Indicates the existence of a planning obligation"
142
70
  },
143
- "contactGridReferenceNorthing": {
71
+ "statusPlanningObligation": {
144
72
  "type": ["string", "null"],
145
- "pattern": "^\\d{6,7}$",
146
- "examples": ["400534"]
147
- },
148
- "groundAFeePaid": {
149
- "type": ["boolean", "null"],
150
- "description": "Whether a ground (a) fee has been paid"
73
+ "description": "The planning obligation information, if available"
151
74
  },
152
75
  "writtenOrVerbalPermission": {
153
76
  "type": ["string", "null"],
@@ -60,8 +60,8 @@
60
60
  "$comment": "Enforcement notice",
61
61
  "allOf": [
62
62
  { "properties": { "caseType": { "enum": ["C"] } } },
63
- { "$ref": "appeals-components/appeal-enforcement-submission.schema.json" },
64
63
  { "$ref": "appeals-components/appeal-enforcement-common-submission.schema.json" },
64
+ { "$ref": "appeals-components/appeal-enforcement-notice-submission.schema.json" },
65
65
  { "$ref": "appeals-components/appellant-procedure-preference.schema.json" }
66
66
  ]
67
67
  },
package/src/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import * as Schemas from './schemas';
2
- export * from './enums';
1
+ import * as Schemas from './schemas.js';
2
+ export * from './enums.js';
3
3
 
4
4
  export interface LoadedSchemas {
5
5
  schemas: {
package/src/schemas.d.ts CHANGED
@@ -3753,158 +3753,6 @@ export type AppellantProcedurePreferenceProperties = {
3753
3753
  */
3754
3754
  appellantProcedurePreferenceWitnessCount?: number | null;
3755
3755
  };
3756
- /**
3757
- * Schema defining any properties for enforcement appeals
3758
- */
3759
- export type AppellantEnforcementSubmissionProperties = (
3760
- | {
3761
- siteGridReferenceEasting: string;
3762
- siteGridReferenceNorthing: string;
3763
- }
3764
- | {
3765
- siteAddressLine1: string;
3766
- siteAddressTown: string;
3767
- siteAddressPostcode: string;
3768
- }
3769
- ) & {
3770
- /**
3771
- * Whether a planning application was made
3772
- */
3773
- applicationMadeAndFeePaid?: boolean | null;
3774
- /**
3775
- * Did the application relate to all or part of the development
3776
- */
3777
- applicationDevelopmentAllOrPart?: 'all-of-the-development' | 'part-of-the-development' | null;
3778
- /**
3779
- * A description of the proposed development
3780
- */
3781
- originalDevelopmentDescription?: string | null;
3782
- /**
3783
- * An updated description of the proposed development
3784
- */
3785
- changedDevelopmentDescription?: boolean | null;
3786
- /**
3787
- * The unique identifier of the LPA application
3788
- */
3789
- applicationReference?: string | null;
3790
- /**
3791
- * The date of the original LPA application
3792
- */
3793
- applicationDate?: string | null;
3794
- /**
3795
- * The outcome of the original LPA decision
3796
- */
3797
- applicationDecision?: 'granted' | 'refused' | 'not_received' | null;
3798
- /**
3799
- * The date of the original LPA decision
3800
- */
3801
- applicationDecisionDate?: string | null;
3802
- /**
3803
- * Whether an appeal was made against the original LPA decision
3804
- */
3805
- applicationDecisionAppealed?: boolean | null;
3806
- /**
3807
- * The date of the appeal against the original LPA decision
3808
- */
3809
- appealDecisionDate?: string | null;
3810
- /**
3811
- * First line of address for the appeal site
3812
- */
3813
- siteAddressLine1?: string | null;
3814
- /**
3815
- * Second line of address for the appeal site
3816
- */
3817
- siteAddressLine2?: string | null;
3818
- /**
3819
- * Town / City of the site address
3820
- */
3821
- siteAddressTown?: string | null;
3822
- /**
3823
- * County of the site address
3824
- */
3825
- siteAddressCounty?: string | null;
3826
- /**
3827
- * Postal code of the site address
3828
- */
3829
- siteAddressPostcode?: string | null;
3830
- /**
3831
- * First line of address for the appeal site
3832
- */
3833
- contactAddressLine1?: string | null;
3834
- /**
3835
- * Second line of address for the appeal site
3836
- */
3837
- contactAddressLine2?: string | null;
3838
- /**
3839
- * Town / City of the site address
3840
- */
3841
- contactAddressTown?: string | null;
3842
- /**
3843
- * County of the site address
3844
- */
3845
- contactAddressCounty?: string | null;
3846
- /**
3847
- * Postal code of the site address
3848
- */
3849
- contactAddressPostcode?: string | null;
3850
- siteGridReferenceEasting?: string | null;
3851
- siteGridReferenceNorthing?: string | null;
3852
- /**
3853
- * Whether a retrospective planning application was made
3854
- */
3855
- retrospectiveApplication?: boolean | null;
3856
- contactGridReferenceEasting?: string | null;
3857
- contactGridReferenceNorthing?: string | null;
3858
- /**
3859
- * Whether a ground (a) fee has been paid
3860
- */
3861
- groundAFeePaid?: boolean | null;
3862
- /**
3863
- * If required, whether the individual has permission to use the appeal land
3864
- */
3865
- writtenOrVerbalPermission?: string | null;
3866
- /**
3867
- * A list of individuals named on the enforcement notice
3868
- */
3869
- namedIndividuals?:
3870
- | {
3871
- /**
3872
- * First name of the individual
3873
- */
3874
- firstName: string;
3875
- /**
3876
- * Last name of the individual
3877
- */
3878
- lastName: string;
3879
- /**
3880
- * Individual's interest in the appeal land
3881
- */
3882
- interestInLand: string;
3883
- /**
3884
- * If required, whether the individual has permission to use the appeal land
3885
- */
3886
- writtenOrVerbalPermission: string | null;
3887
- [k: string]: unknown;
3888
- }[]
3889
- | null;
3890
- /**
3891
- * A list of appeal grounds being pleaded
3892
- */
3893
- appealGrounds?:
3894
- | {
3895
- /**
3896
- * Name of the appeal ground
3897
- */
3898
- groundRef: 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g';
3899
- /**
3900
- * Facts supporting the appeal ground
3901
- */
3902
- factsForGround: string;
3903
- [k: string]: unknown;
3904
- }[]
3905
- | null;
3906
- [k: string]: unknown;
3907
- };
3908
3756
 
3909
3757
  /**
3910
3758
  * Schema defining the data produced by the Front-Office when an appeal is requested
@@ -3940,8 +3788,8 @@ export interface AppellantSubmissionCommand {
3940
3788
  AppellantProcedurePreferenceProperties)
3941
3789
  | ({
3942
3790
  caseType?: 'C';
3943
- } & AppellantEnforcementSubmissionProperties &
3944
- AppellantEnforcementCommonSubmissionProperties &
3791
+ } & AppellantEnforcementCommonSubmissionProperties &
3792
+ AppellantEnforcementNoticeSpecificSubmissionProperties &
3945
3793
  AppellantProcedurePreferenceProperties)
3946
3794
  | ({
3947
3795
  caseType?: 'X';
@@ -4232,6 +4080,46 @@ export interface AppellantEnforcementCommonSubmissionProperties {
4232
4080
  * The statutory deadline for submitting an appeal from the original LPA decision date
4233
4081
  */
4234
4082
  caseSubmissionDueDate: string | null;
4083
+ /**
4084
+ * First line of address for the appeal site
4085
+ */
4086
+ siteAddressLine1: string | null;
4087
+ /**
4088
+ * Second line of address for the appeal site
4089
+ */
4090
+ siteAddressLine2?: string | null;
4091
+ /**
4092
+ * Town / City of the site address
4093
+ */
4094
+ siteAddressTown: string | null;
4095
+ /**
4096
+ * County of the site address
4097
+ */
4098
+ siteAddressCounty?: string | null;
4099
+ /**
4100
+ * Postal code of the site address
4101
+ */
4102
+ siteAddressPostcode: string | null;
4103
+ /**
4104
+ * First line of address for the appeal site
4105
+ */
4106
+ contactAddressLine1?: string | null;
4107
+ /**
4108
+ * Second line of address for the appeal site
4109
+ */
4110
+ contactAddressLine2?: string | null;
4111
+ /**
4112
+ * Town / City of the site address
4113
+ */
4114
+ contactAddressTown?: string | null;
4115
+ /**
4116
+ * County of the site address
4117
+ */
4118
+ contactAddressCounty?: string | null;
4119
+ /**
4120
+ * Postal code of the site address
4121
+ */
4122
+ contactAddressPostcode?: string | null;
4235
4123
  /**
4236
4124
  * Provided information on site accessibility
4237
4125
  */
@@ -4260,14 +4148,116 @@ export interface AppellantEnforcementCommonSubmissionProperties {
4260
4148
  * The number of witnesses appellant has suggested for inquiries preference
4261
4149
  */
4262
4150
  appellantProcedurePreferenceWitnessCount?: number | null;
4151
+ /**
4152
+ * A list of related case references known to the appellant and the LPA
4153
+ */
4154
+ nearbyCaseReferences?: string[] | null;
4155
+ [k: string]: unknown;
4156
+ }
4157
+ /**
4158
+ * Schema defining properties specific to enforcement notice appeals
4159
+ */
4160
+ export interface AppellantEnforcementNoticeSpecificSubmissionProperties {
4161
+ /**
4162
+ * Whether a planning application was made - historic question
4163
+ */
4164
+ applicationMadeAndFeePaid?: boolean | null;
4165
+ /**
4166
+ * Whether a retrospective planning application was made
4167
+ */
4168
+ retrospectiveApplication?: boolean | null;
4169
+ /**
4170
+ * Whether a ground (a) fee has been paid
4171
+ */
4172
+ groundAFeePaid?: boolean | null;
4173
+ /**
4174
+ * Did the application relate to all or part of the development
4175
+ */
4176
+ applicationDevelopmentAllOrPart?: 'all-of-the-development' | 'part-of-the-development' | null;
4177
+ /**
4178
+ * A description of the proposed development
4179
+ */
4180
+ originalDevelopmentDescription?: string | null;
4181
+ /**
4182
+ * An updated description of the proposed development
4183
+ */
4184
+ changedDevelopmentDescription?: boolean | null;
4185
+ /**
4186
+ * The unique identifier of the LPA application
4187
+ */
4188
+ applicationReference?: string | null;
4189
+ /**
4190
+ * The date of the original LPA application
4191
+ */
4192
+ applicationDate?: string | null;
4193
+ /**
4194
+ * The outcome of the original LPA decision
4195
+ */
4196
+ applicationDecision?: 'granted' | 'refused' | 'not_received' | null;
4197
+ /**
4198
+ * The date of the original LPA decision
4199
+ */
4200
+ applicationDecisionDate?: string | null;
4201
+ /**
4202
+ * Whether an appeal was made against the original LPA decision
4203
+ */
4204
+ applicationDecisionAppealed?: boolean | null;
4205
+ /**
4206
+ * The date of the appeal against the original LPA decision
4207
+ */
4208
+ appealDecisionDate?: string | null;
4209
+ /**
4210
+ * Indicates the existence of a planning obligation
4211
+ */
4212
+ planningObligation?: boolean | null;
4263
4213
  /**
4264
4214
  * The planning obligation information, if available
4265
4215
  */
4266
4216
  statusPlanningObligation?: string | null;
4267
4217
  /**
4268
- * A list of related case references known to the appellant and the LPA
4218
+ * If required, whether the individual has permission to use the appeal land
4269
4219
  */
4270
- nearbyCaseReferences?: string[] | null;
4220
+ writtenOrVerbalPermission?: string | null;
4221
+ /**
4222
+ * A list of individuals named on the enforcement notice
4223
+ */
4224
+ namedIndividuals?:
4225
+ | {
4226
+ /**
4227
+ * First name of the individual
4228
+ */
4229
+ firstName: string;
4230
+ /**
4231
+ * Last name of the individual
4232
+ */
4233
+ lastName: string;
4234
+ /**
4235
+ * Individual's interest in the appeal land
4236
+ */
4237
+ interestInLand: string;
4238
+ /**
4239
+ * If required, whether the individual has permission to use the appeal land
4240
+ */
4241
+ writtenOrVerbalPermission: string | null;
4242
+ [k: string]: unknown;
4243
+ }[]
4244
+ | null;
4245
+ /**
4246
+ * A list of appeal grounds being pleaded
4247
+ */
4248
+ appealGrounds?:
4249
+ | {
4250
+ /**
4251
+ * Name of the appeal ground
4252
+ */
4253
+ groundRef: 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g';
4254
+ /**
4255
+ * Facts supporting the appeal ground
4256
+ */
4257
+ factsForGround: string;
4258
+ [k: string]: unknown;
4259
+ }[]
4260
+ | null;
4271
4261
  [k: string]: unknown;
4272
4262
  }
4273
4263
  /**
@@ -4286,7 +4276,7 @@ export interface LDCSpecificProperties {
4286
4276
  [k: string]: unknown;
4287
4277
  }
4288
4278
  /**
4289
- * Schema defining any properties for enforcement listed building appeals
4279
+ * Schema defining any properties specific to enforcement listed building appeals
4290
4280
  */
4291
4281
  export interface AppellantEnforcementListedBuildingSubmissionProperties {
4292
4282
  /**
@@ -4309,46 +4299,6 @@ export interface AppellantEnforcementListedBuildingSubmissionProperties {
4309
4299
  [k: string]: unknown;
4310
4300
  }[]
4311
4301
  | null;
4312
- /**
4313
- * First line of address for the appeal site
4314
- */
4315
- siteAddressLine1?: string | null;
4316
- /**
4317
- * Second line of address for the appeal site
4318
- */
4319
- siteAddressLine2?: string | null;
4320
- /**
4321
- * Town / City of the site address
4322
- */
4323
- siteAddressTown?: string | null;
4324
- /**
4325
- * County of the site address
4326
- */
4327
- siteAddressCounty?: string | null;
4328
- /**
4329
- * Postal code of the site address
4330
- */
4331
- siteAddressPostcode?: string | null;
4332
- /**
4333
- * First line of address for the appeal site
4334
- */
4335
- contactAddressLine1?: string | null;
4336
- /**
4337
- * Second line of address for the appeal site
4338
- */
4339
- contactAddressLine2?: string | null;
4340
- /**
4341
- * Town / City of the site address
4342
- */
4343
- contactAddressTown?: string | null;
4344
- /**
4345
- * County of the site address
4346
- */
4347
- contactAddressCounty?: string | null;
4348
- /**
4349
- * Postal code of the site address
4350
- */
4351
- contactAddressPostcode?: string | null;
4352
4302
  /**
4353
4303
  * A list of appeal grounds being pleaded
4354
4304
  */
@@ -46,8 +46,6 @@ const exampleEnforcementListedSubmissionSchema = {
46
46
  siteAddressTown: 'et',
47
47
  siteAddressCounty: 'velit',
48
48
  siteAddressPostcode: 'nisi minim laboris sed',
49
- siteGridReferenceEasting: '357144',
50
- siteGridReferenceNorthing: '400534',
51
49
  contactAddressLine1: null,
52
50
  contactAddressLine2: null,
53
51
  contactAddressTown: null,
@@ -60,7 +58,6 @@ const exampleEnforcementListedSubmissionSchema = {
60
58
  appellantProcedurePreferenceDetails: 'eiusmod ex exercitation',
61
59
  appellantProcedurePreferenceDuration: 10816414.941069126,
62
60
  appellantProcedurePreferenceWitnessCount: -91300569.36444478,
63
- statusPlanningObligation: 'proident aute',
64
61
  nearbyCaseReferences: ['incididunt'],
65
62
  namedIndividuals: [
66
63
  {
@@ -60,8 +60,6 @@ const exampleEnforcementSubmissionSchema = {
60
60
  siteAddressTown: 'et',
61
61
  siteAddressCounty: 'velit',
62
62
  siteAddressPostcode: 'nisi minim laboris sed',
63
- siteGridReferenceEasting: '357144',
64
- siteGridReferenceNorthing: '400534',
65
63
  contactAddressLine1: null,
66
64
  contactAddressLine2: null,
67
65
  contactAddressTown: null,
@@ -76,7 +74,7 @@ const exampleEnforcementSubmissionSchema = {
76
74
  appellantProcedurePreferenceDetails: 'eiusmod ex exercitation',
77
75
  appellantProcedurePreferenceDuration: 10816414.941069126,
78
76
  appellantProcedurePreferenceWitnessCount: -91300569.36444478,
79
- statusPlanningObligation: 'proident aute',
77
+ statusPlanningObligation: 'finalised',
80
78
  nearbyCaseReferences: ['incididunt'],
81
79
  namedIndividuals: [
82
80
  {
@@ -108,52 +106,11 @@ describe('enforcement submission command schema', () => {
108
106
  assert.strictEqual(validationResult, true);
109
107
  });
110
108
 
111
- it('should enforce eastings-northings pattern', () => {
112
- const invalidPatterns = [
113
- { easting: 'abc123', northing: '400534', description: 'easting with letters' },
114
- { easting: '1234567*', northing: '400534', description: 'easting too long' },
115
- { easting: '12345', northing: '400534', description: 'easting too short' },
116
- { easting: '357144', northing: 'xyz123', description: 'northing with letters' },
117
- { easting: '357144', northing: '12345678', description: 'northing too long' },
118
- { easting: '357144', northing: '12345', description: 'northing too short' },
119
- { easting: '', northing: '400534', description: 'empty easting' },
120
- { easting: '357144', northing: '', description: 'empty northing' }
121
- ];
122
-
123
- for (const pattern of invalidPatterns) {
124
- const test = structuredClone(exampleEnforcementSubmissionSchema);
125
- test.casedata.siteGridReferenceEasting = pattern.easting;
126
- test.casedata.siteGridReferenceNorthing = pattern.northing;
127
-
128
- const validationResult = ajv.validate(schema, test);
129
- assert.strictEqual(validationResult, false, `Expected validation to fail for ${pattern.description}`);
130
- }
131
- });
132
-
133
- it('should allow only eastings-northings', () => {
134
- const test = structuredClone(exampleEnforcementSubmissionSchema);
135
- test.casedata.siteAddressPostcode = undefined;
136
- test.casedata.siteAddressLine1 = null;
137
- test.casedata.siteAddressTown = null;
138
- const validationResult = ajv.validate(schema, test);
139
- assert.strictEqual(validationResult, true);
140
- });
141
-
142
- it('should allow only site address', () => {
143
- const test = structuredClone(exampleEnforcementSubmissionSchema);
144
- test.casedata.siteGridReferenceEasting = undefined;
145
- test.casedata.siteGridReferenceNorthing = null;
146
- const validationResult = ajv.validate(schema, test);
147
- assert.strictEqual(validationResult, true);
148
- });
149
-
150
- it('should enforce either site address or easting-northing', () => {
109
+ it('should enforce site address', () => {
151
110
  const test = structuredClone(exampleEnforcementSubmissionSchema);
152
111
  test.casedata.siteAddressPostcode = undefined;
153
112
  test.casedata.siteAddressLine1 = null;
154
113
  test.casedata.siteAddressTown = null;
155
- test.casedata.siteGridReferenceEasting = undefined;
156
- test.casedata.siteGridReferenceNorthing = null;
157
114
  const validationResult = ajv.validate(schema, test);
158
115
  assert.strictEqual(validationResult, false);
159
116
  });