@planning-inspectorate/data-model 2.56.0 → 2.58.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.
@@ -261,23 +261,28 @@ The internal code for an appeal type, e.g. D (Householder)
261
261
 
262
262
  **enum**: the value of this property must be equal to one of the following values:
263
263
 
264
- | Value | Explanation |
265
- | :----- | :---------- |
266
- | `"C"` | |
267
- | `"D"` | |
268
- | `"F"` | |
269
- | `"G"` | |
270
- | `"H"` | |
271
- | `"L"` | |
272
- | `"Q"` | |
273
- | `"S"` | |
274
- | `"V"` | |
275
- | `"W"` | |
276
- | `"X"` | |
277
- | `"Y"` | |
278
- | `"Z"` | |
279
- | `"ZA"` | |
280
- | `"ZP"` | |
264
+ | Value | Explanation |
265
+ | :------ | :---------- |
266
+ | `"C"` | |
267
+ | `"D"` | |
268
+ | `"F"` | |
269
+ | `"G"` | |
270
+ | `"H"` | |
271
+ | `"L"` | |
272
+ | `"Q"` | |
273
+ | `"S"` | |
274
+ | `"V"` | |
275
+ | `"W"` | |
276
+ | `"X"` | |
277
+ | `"Y"` | |
278
+ | `"Z"` | |
279
+ | `"ZA"` | |
280
+ | `"ZP"` | |
281
+ | `"TPO"` | |
282
+ | `"TRN"` | |
283
+ | `"HH"` | |
284
+ | `"HR"` | |
285
+ | `"ENV"` | |
281
286
 
282
287
  ## caseProcedure
283
288
 
@@ -364,23 +364,28 @@ The internal code for an appeal type, e.g. D (Householder)
364
364
 
365
365
  **enum**: the value of this property must be equal to one of the following values:
366
366
 
367
- | Value | Explanation |
368
- | :----- | :---------- |
369
- | `"C"` | |
370
- | `"D"` | |
371
- | `"F"` | |
372
- | `"G"` | |
373
- | `"H"` | |
374
- | `"L"` | |
375
- | `"Q"` | |
376
- | `"S"` | |
377
- | `"V"` | |
378
- | `"W"` | |
379
- | `"X"` | |
380
- | `"Y"` | |
381
- | `"Z"` | |
382
- | `"ZA"` | |
383
- | `"ZP"` | |
367
+ | Value | Explanation |
368
+ | :------ | :---------- |
369
+ | `"C"` | |
370
+ | `"D"` | |
371
+ | `"F"` | |
372
+ | `"G"` | |
373
+ | `"H"` | |
374
+ | `"L"` | |
375
+ | `"Q"` | |
376
+ | `"S"` | |
377
+ | `"V"` | |
378
+ | `"W"` | |
379
+ | `"X"` | |
380
+ | `"Y"` | |
381
+ | `"Z"` | |
382
+ | `"ZA"` | |
383
+ | `"ZP"` | |
384
+ | `"TPO"` | |
385
+ | `"TRN"` | |
386
+ | `"HH"` | |
387
+ | `"HR"` | |
388
+ | `"ENV"` | |
384
389
 
385
390
  ## caseProcedure
386
391
 
@@ -1378,6 +1383,7 @@ The final outcome for the decision
1378
1383
  | `"planning_permission_granted"` | |
1379
1384
  | `"quashed_on_legal_grounds"` | |
1380
1385
  | `"notice_varied_and_upheld"` | |
1386
+ | `"notice_quashed"` | |
1381
1387
  | `null` | |
1382
1388
 
1383
1389
  ## caseCompletedDate
@@ -3697,6 +3703,13 @@ The net gain in residences of the proposed development
3697
3703
  | `"lawful-development-certificate"` | |
3698
3704
  | `"discontinuance-notice"` | |
3699
3705
  | `"permission-in-principle"` | |
3706
+ | `"tree-preservation-order"` | |
3707
+ | `"tree-replacement-notice"` | |
3708
+ | `"high-hedge-appeal"` | |
3709
+ | `"hedgerows-appeal"` | |
3710
+ | `"community-infrastructure-levy"` | |
3711
+ | `"planning-obligation"` | |
3712
+ | `"environmental"` | |
3700
3713
  | `null` | |
3701
3714
 
3702
3715
  ## developmentType
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planning-inspectorate/data-model",
3
- "version": "2.56.0",
3
+ "version": "2.58.0",
4
4
  "description": "JSON Schemas for the Planning Inspectorate's Data Model",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
@@ -36,7 +36,7 @@
36
36
  "@commitlint/cli": "^21.0.0",
37
37
  "@commitlint/config-conventional": "^21.0.0",
38
38
  "@eslint/js": "^10.0.1",
39
- "@planning-inspectorate/coding-standards": "^1.1.1",
39
+ "@planning-inspectorate/coding-standards": "^2.0.0",
40
40
  "ajv": "^8.17.1",
41
41
  "ajv-formats": "^3.0.1",
42
42
  "conventional-changelog-conventionalcommits": "^10.2.0",
@@ -39,6 +39,11 @@ class CaseType(Enum):
39
39
  Z = "Z"
40
40
  ZA = "ZA"
41
41
  ZP = "ZP"
42
+ TPO = "TPO"
43
+ TRN = "TRN"
44
+ HH = "HH"
45
+ HR = "HR"
46
+ ENV = "ENV"
42
47
  NoneType_None = None
43
48
 
44
49
 
@@ -58,6 +63,7 @@ class DocumentType(Enum):
58
63
  The type of document, used for exchange, migrations and consumption from the appeal back-office system
59
64
  """
60
65
 
66
+ appellantCase = "appellantCase"
61
67
  appellantCaseCorrespondence = "appellantCaseCorrespondence"
62
68
  appellantCaseWithdrawalLetter = "appellantCaseWithdrawalLetter"
63
69
  appellantCostsApplication = "appellantCostsApplication"
@@ -72,6 +78,7 @@ class DocumentType(Enum):
72
78
  whoNotifiedLetterToNeighbours = "whoNotifiedLetterToNeighbours"
73
79
  whoNotifiedPressAdvert = "whoNotifiedPressAdvert"
74
80
  conservationMap = "conservationMap"
81
+ lpaQuestionnaire = "lpaQuestionnaire"
75
82
  lpaCaseCorrespondence = "lpaCaseCorrespondence"
76
83
  lpaCostsApplication = "lpaCostsApplication"
77
84
  lpaCostsCorrespondence = "lpaCostsCorrespondence"
@@ -0,0 +1,458 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: appeal-group-c.schema.json
3
+
4
+ from __future__ import annotations
5
+
6
+ from enum import Enum, StrEnum
7
+
8
+ from pydantic import AwareDatetime, BaseModel, ConfigDict, Field, constr
9
+
10
+
11
+ class CaseType(StrEnum):
12
+ """
13
+ Internal letter code for appeal types
14
+ """
15
+
16
+ C = "C"
17
+ D = "D"
18
+ F = "F"
19
+ G = "G"
20
+ H = "H"
21
+ L = "L"
22
+ Q = "Q"
23
+ S = "S"
24
+ V = "V"
25
+ W = "W"
26
+ X = "X"
27
+ Y = "Y"
28
+ Z = "Z"
29
+ ZA = "ZA"
30
+ ZP = "ZP"
31
+ TPO = "TPO"
32
+ TRN = "TRN"
33
+ HH = "HH"
34
+ HR = "HR"
35
+ ENV = "ENV"
36
+
37
+
38
+ class CaseStatus(StrEnum):
39
+ """
40
+ The processing status for the appeal
41
+ """
42
+
43
+ assign_case_officer = "assign_case_officer"
44
+ validation = "validation"
45
+ ready_to_start = "ready_to_start"
46
+ lpa_questionnaire = "lpa_questionnaire"
47
+ issue_determination = "issue_determination"
48
+ statements = "statements"
49
+ evidence = "evidence"
50
+ witnesses = "witnesses"
51
+ final_comments = "final_comments"
52
+ complete = "complete"
53
+ invalid = "invalid"
54
+ closed = "closed"
55
+ withdrawn = "withdrawn"
56
+ awaiting_transfer = "awaiting_transfer"
57
+ transferred = "transferred"
58
+ event = "event"
59
+ awaiting_event = "awaiting_event"
60
+ notice_withdrawn = "notice_withdrawn"
61
+ closed_opened_in_error = "closed_opened_in_error"
62
+
63
+
64
+ class CaseProcedure(Enum):
65
+ """
66
+ The type of procedure for the appeal
67
+ """
68
+
69
+ written = "written"
70
+ hearing = "hearing"
71
+ inquiry = "inquiry"
72
+ writtenPart1 = "writtenPart1"
73
+ writtenPart2 = "writtenPart2"
74
+ NoneType_None = None
75
+
76
+
77
+ class CaseValidationOutcome(Enum):
78
+ """
79
+ The outcome of the validation action
80
+ """
81
+
82
+ valid = "valid"
83
+ invalid = "invalid"
84
+ incomplete = "incomplete"
85
+ NoneType_None = None
86
+
87
+
88
+ class LpaQuestionnaireValidationOutcome(Enum):
89
+ """
90
+ The outcome of the LPA questionnaire validation action
91
+ """
92
+
93
+ complete = "complete"
94
+ incomplete = "incomplete"
95
+ NoneType_None = None
96
+
97
+
98
+ class CaseDecisionOutcome(Enum):
99
+ """
100
+ The final outcome for the decision
101
+ """
102
+
103
+ allowed = "allowed"
104
+ split_decision = "split_decision"
105
+ dismissed = "dismissed"
106
+ invalid = "invalid"
107
+ notice_upheld = "notice_upheld"
108
+ planning_permission_granted = "planning_permission_granted"
109
+ quashed_on_legal_grounds = "quashed_on_legal_grounds"
110
+ notice_varied_and_upheld = "notice_varied_and_upheld"
111
+ notice_quashed = "notice_quashed"
112
+ NoneType_None = None
113
+
114
+
115
+ class AllocationLevel(Enum):
116
+ """
117
+ A level used for allocation purposes
118
+ """
119
+
120
+ A = "A"
121
+ B = "B"
122
+ C = "C"
123
+ D = "D"
124
+ E = "E"
125
+ F = "F"
126
+ G = "G"
127
+ H = "H"
128
+ NoneType_None = None
129
+
130
+
131
+ class AllocationBand(Enum):
132
+ """
133
+ A band used for allocation purposes
134
+ """
135
+
136
+ int_1 = 1
137
+ int_2 = 2
138
+ int_3 = 3
139
+ NoneType_None = None
140
+
141
+
142
+ class TypeOfPlanningApplication(Enum):
143
+ """
144
+ The type of application or notice that is the subject of the appeal
145
+ """
146
+
147
+ full_appeal = "full-appeal"
148
+ householder_planning = "householder-planning"
149
+ outline_planning = "outline-planning"
150
+ prior_approval = "prior-approval"
151
+ reserved_matters = "reserved-matters"
152
+ removal_or_variation_of_conditions = "removal-or-variation-of-conditions"
153
+ listed_building = "listed-building"
154
+ minor_commercial_development = "minor-commercial-development"
155
+ advertisement = "advertisement"
156
+ lawful_development_certificate = "lawful-development-certificate"
157
+ discontinuance_notice = "discontinuance-notice"
158
+ permission_in_principle = "permission-in-principle"
159
+ tree_preservation_order = "tree-preservation-order"
160
+ tree_replacement_notice = "tree-replacement-notice"
161
+ high_hedge_appeal = "high-hedge-appeal"
162
+ hedgerows_appeal = "hedgerows-appeal"
163
+ community_infrastructure_levy = "community-infrastructure-levy"
164
+ planning_obligation = "planning-obligation"
165
+ environmental = "environmental"
166
+ NoneType_None = None
167
+
168
+
169
+ class CaseSubType(Enum):
170
+ """
171
+ Sub-type categorization for generic/low-volume appeals
172
+ """
173
+
174
+ anti_pollution_works_notice = "anti_pollution_works_notice"
175
+ contaminated_land = "contaminated_land"
176
+ marine_licensing = "marine_licensing"
177
+ waste_carriers = "waste_carriers"
178
+ water_abstraction = "water_abstraction"
179
+ environmental_liability = "environmental_liability"
180
+ environmental_permitting = "environmental_permitting"
181
+ hazardous_substances = "hazardous_substances"
182
+ silage_and_slurry = "silage_and_slurry"
183
+ sssi = "sssi"
184
+ affordable_housing = "affordable_housing"
185
+ NoneType_None = None
186
+
187
+
188
+ class LinkedCaseStatus(Enum):
189
+ """
190
+ Indicates if the case is linked, and the type of relationship
191
+ """
192
+
193
+ lead = "lead"
194
+ child = "child"
195
+ NoneType_None = None
196
+
197
+
198
+ class EnvironmentalPermitSubtypes(Enum):
199
+ """
200
+ Case sub-division applying to Environmental Permitting caseSubType
201
+ """
202
+
203
+ refusal_of_a_permit = "refusal_of_a_permit"
204
+ deemed_refusal = "deemed_refusal"
205
+ conditions_attached_to_a_permit = "conditions_attached_to_a_permit"
206
+ decision_to_impose_conditions_by_regulator = (
207
+ "decision_to_impose_conditions_by_regulator"
208
+ )
209
+ deemed_withdrawal = "deemed_withdrawal"
210
+ enforcement_notice = "enforcement_notice"
211
+ suspension_notice = "suspension_notice"
212
+ closure_notice = "closure_notice"
213
+ flood_risk_activity = "flood_risk_activity"
214
+ revocation_notice = "revocation_notice"
215
+ prohibition_notice = "prohibition_notice"
216
+ NoneType_None = None
217
+
218
+
219
+ class AppealGroupCCase(BaseModel):
220
+ """
221
+ Group C - Schema defining the metadata for generic and low-volume appeals
222
+ """
223
+
224
+ model_config = ConfigDict(
225
+ extra="allow",
226
+ )
227
+ caseId: int | None = Field(..., examples=[6000001])
228
+ """
229
+ Internal case identifier
230
+ """
231
+ caseReference: constr(pattern=r"^6\d{6}$") = Field(..., examples=["6000001"])
232
+ """
233
+ External case identifier for Group C appeals (7 digit number starting in 6)
234
+ """
235
+ caseType: CaseType
236
+ """
237
+ Internal letter code for appeal types
238
+ """
239
+ caseStatus: CaseStatus
240
+ """
241
+ The processing status for the appeal
242
+ """
243
+ caseProcedure: CaseProcedure | None
244
+ """
245
+ The type of procedure for the appeal
246
+ """
247
+ caseCreatedDate: AwareDatetime = Field(..., examples=["2026-07-27T20:30:00.000Z"])
248
+ """
249
+ The date the appeal was received
250
+ """
251
+ caseSubmittedDate: AwareDatetime | None = Field(
252
+ ..., examples=["2026-07-27T20:30:00.000Z"]
253
+ )
254
+ """
255
+ The date the appeal was submitted by the appellant
256
+ """
257
+ caseUpdatedDate: AwareDatetime | None = Field(
258
+ ..., examples=["2026-07-27T20:30:00.000Z"]
259
+ )
260
+ """
261
+ The date the appeal was last updated in the back-office
262
+ """
263
+ caseValidDate: AwareDatetime | None = Field(
264
+ ..., examples=["2026-07-27T20:30:00.000Z"]
265
+ )
266
+ """
267
+ The date since when the appeal was considered valid
268
+ """
269
+ caseValidationDate: AwareDatetime | None = Field(
270
+ ..., examples=["2026-07-27T20:30:00.000Z"]
271
+ )
272
+ """
273
+ The date the appeal was validated in the back-office
274
+ """
275
+ caseValidationOutcome: CaseValidationOutcome | None
276
+ """
277
+ The outcome of the validation action
278
+ """
279
+ caseStartedDate: AwareDatetime | None = Field(
280
+ ..., examples=["2026-07-27T20:30:00.000Z"]
281
+ )
282
+ """
283
+ A date indicating when the case was started, resulting in the creation of a timetable
284
+ """
285
+ casePublishedDate: AwareDatetime | None = Field(
286
+ ..., examples=["2026-07-27T20:30:00.000Z"]
287
+ )
288
+ """
289
+ A date indicating when the case was published
290
+ """
291
+ lpaQuestionnaireCreatedDate: AwareDatetime | None = Field(
292
+ ..., examples=["2026-07-27T20:30:00.000Z"]
293
+ )
294
+ """
295
+ The date the LPA response was received
296
+ """
297
+ lpaQuestionnaireSubmittedDate: AwareDatetime | None = Field(
298
+ ..., examples=["2026-07-27T20:30:00.000Z"]
299
+ )
300
+ """
301
+ The date the LPA provided a response to the case
302
+ """
303
+ lpaQuestionnaireValidationOutcome: LpaQuestionnaireValidationOutcome | None
304
+ """
305
+ The outcome of the LPA questionnaire validation action
306
+ """
307
+ lpaQuestionnaireDueDate: AwareDatetime | None = Field(
308
+ ..., examples=["2026-07-27T20:30:00.000Z"]
309
+ )
310
+ """
311
+ If the case is started and has a timetable, a deadline for the LPA to provide a response
312
+ """
313
+ caseDecisionOutcomeDate: AwareDatetime | None = Field(
314
+ ..., examples=["2026-07-27T20:30:00.000Z"]
315
+ )
316
+ """
317
+ The date of the appeal decision
318
+ """
319
+ caseDecisionOutcome: CaseDecisionOutcome | None
320
+ """
321
+ The final outcome for the decision
322
+ """
323
+ caseCompletedDate: AwareDatetime | None = Field(
324
+ ..., examples=["2026-07-27T20:30:00.000Z"]
325
+ )
326
+ """
327
+ The date the appeal decision letter was issued
328
+ """
329
+ lpaCode: str | None = Field(..., examples=["Q9999"])
330
+ """
331
+ A unique identifier for the Local Planning Authority
332
+ """
333
+ caseOfficerId: str | None
334
+ """
335
+ Unique identifier for the case officer assigned to the case
336
+ """
337
+ inspectorId: str | None
338
+ """
339
+ Unique identifier for the inspector assigned to the case
340
+ """
341
+ padsSapId: str | None
342
+ """
343
+ padsSapId for PADS inspectors
344
+ """
345
+ allocationLevel: AllocationLevel | None
346
+ """
347
+ A level used for allocation purposes
348
+ """
349
+ allocationBand: AllocationBand | None
350
+ """
351
+ A band used for allocation purposes
352
+ """
353
+ caseSpecialisms: list[str] | None = Field(..., examples=[["Environmental", "SSSI"]])
354
+ """
355
+ A list of specialisms for allocation purposes
356
+ """
357
+ siteAddressLine1: str | None = Field(..., examples=["96 The Avenue"])
358
+ """
359
+ First line of address for the appeal site
360
+ """
361
+ siteAddressLine2: str | None
362
+ """
363
+ Second line of address for the appeal site
364
+ """
365
+ siteAddressTown: str | None = Field(..., examples=["Maidstone"])
366
+ """
367
+ Town / City of the site address
368
+ """
369
+ siteAddressCounty: str | None = Field(..., examples=["Kent"])
370
+ """
371
+ County of the site address
372
+ """
373
+ siteAddressPostcode: str | None = Field(..., examples=["MD21 5XY"])
374
+ """
375
+ Postal code of the site address
376
+ """
377
+ caseManagementConferenceDate: AwareDatetime | None = Field(
378
+ None, examples=["2026-07-27T20:30:00.000Z"]
379
+ )
380
+ """
381
+ The date of the Case Management Conference (CMC)
382
+ """
383
+ statementDueDate: AwareDatetime | None = Field(
384
+ None, examples=["2026-07-27T20:30:00.000Z"]
385
+ )
386
+ """
387
+ Deadline for statements
388
+ """
389
+ proofsOfEvidenceDueDate: AwareDatetime | None = Field(
390
+ None, examples=["2026-07-27T20:30:00.000Z"]
391
+ )
392
+ """
393
+ Deadline for proofs of evidence
394
+ """
395
+ finalCommentsDueDate: AwareDatetime | None = Field(
396
+ None, examples=["2026-07-27T20:30:00.000Z"]
397
+ )
398
+ """
399
+ Deadline for final comments
400
+ """
401
+ interestedPartyRepsDueDate: AwareDatetime | None = Field(
402
+ None, examples=["2026-07-27T20:30:00.000Z"]
403
+ )
404
+ """
405
+ Deadline for interested party representations
406
+ """
407
+ statementOfCommonGroundDueDate: AwareDatetime | None = Field(
408
+ None, examples=["2026-07-27T20:30:00.000Z"]
409
+ )
410
+ """
411
+ Deadline for statement of common ground
412
+ """
413
+ planningObligationDueDate: AwareDatetime | None = Field(
414
+ None, examples=["2026-07-27T20:30:00.000Z"]
415
+ )
416
+ """
417
+ Deadline for planning obligation
418
+ """
419
+ typeOfPlanningApplication: TypeOfPlanningApplication | None = None
420
+ """
421
+ The type of application or notice that is the subject of the appeal
422
+ """
423
+ caseSubType: CaseSubType | None = None
424
+ """
425
+ Sub-type categorization for generic/low-volume appeals
426
+ """
427
+ caseWithdrawnDate: AwareDatetime | None = Field(
428
+ ..., examples=["2026-07-27T20:30:00.000Z"]
429
+ )
430
+ """
431
+ The date the appeal was withdrawn by the appellant
432
+ """
433
+ caseTransferredDate: AwareDatetime | None = Field(
434
+ ..., examples=["2026-07-27T20:30:00.000Z"]
435
+ )
436
+ """
437
+ The date the appeal was transferred to a new case of a different type
438
+ """
439
+ enforcementNoticeReference: str | None = Field(None, examples=["myC45e-123"])
440
+ """
441
+ The reference number of the enforcement notice
442
+ """
443
+ applicationReference: str | None = Field(None, examples=["43010/APP/1/290572"])
444
+ """
445
+ The unique identifier of the LPA or regulator application
446
+ """
447
+ linkedCaseStatus: LinkedCaseStatus | None = None
448
+ """
449
+ Indicates if the case is linked, and the type of relationship
450
+ """
451
+ leadCaseReference: str | None = Field(None, examples=["6000001"])
452
+ """
453
+ The reference of the lead case, if the case is a child case
454
+ """
455
+ environmentalPermitSubtypes: EnvironmentalPermitSubtypes | None = None
456
+ """
457
+ Case sub-division applying to Environmental Permitting caseSubType
458
+ """
@@ -51,6 +51,11 @@ class CaseType(StrEnum):
51
51
  Z = "Z"
52
52
  ZA = "ZA"
53
53
  ZP = "ZP"
54
+ TPO = "TPO"
55
+ TRN = "TRN"
56
+ HH = "HH"
57
+ HR = "HR"
58
+ ENV = "ENV"
54
59
 
55
60
 
56
61
  class CaseProcedure(Enum):
@@ -55,6 +55,11 @@ class CaseType(StrEnum):
55
55
  Z = "Z"
56
56
  ZA = "ZA"
57
57
  ZP = "ZP"
58
+ TPO = "TPO"
59
+ TRN = "TRN"
60
+ HH = "HH"
61
+ HR = "HR"
62
+ ENV = "ENV"
58
63
 
59
64
 
60
65
  class CaseProcedure(Enum):
@@ -141,6 +146,7 @@ class CaseDecisionOutcome(Enum):
141
146
  planning_permission_granted = "planning_permission_granted"
142
147
  quashed_on_legal_grounds = "quashed_on_legal_grounds"
143
148
  notice_varied_and_upheld = "notice_varied_and_upheld"
149
+ notice_quashed = "notice_quashed"
144
150
  NoneType_None = None
145
151
 
146
152
 
@@ -288,6 +294,13 @@ class TypeOfPlanningApplication(Enum):
288
294
  lawful_development_certificate = "lawful-development-certificate"
289
295
  discontinuance_notice = "discontinuance-notice"
290
296
  permission_in_principle = "permission-in-principle"
297
+ tree_preservation_order = "tree-preservation-order"
298
+ tree_replacement_notice = "tree-replacement-notice"
299
+ high_hedge_appeal = "high-hedge-appeal"
300
+ hedgerows_appeal = "hedgerows-appeal"
301
+ community_infrastructure_levy = "community-infrastructure-levy"
302
+ planning_obligation = "planning-obligation"
303
+ environmental = "environmental"
291
304
  NoneType_None = None
292
305
 
293
306