@planning-inspectorate/data-model 1.11.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 (131) hide show
  1. package/.azure/ci.yml +60 -0
  2. package/.azure/release.yml +57 -0
  3. package/.github/dependabot.yml +11 -0
  4. package/.husky/install.mjs +7 -0
  5. package/.husky/pre-commit +1 -0
  6. package/.prettierignore +11 -0
  7. package/.prettierrc +19 -0
  8. package/LICENSE +21 -0
  9. package/README.md +237 -0
  10. package/commitlint.config.js +8 -0
  11. package/docs/README.md +85 -0
  12. package/docs/appeal-document.md +776 -0
  13. package/docs/appeal-event-estimate.md +108 -0
  14. package/docs/appeal-event.md +404 -0
  15. package/docs/appeal-has.md +1960 -0
  16. package/docs/appeal-representation.md +375 -0
  17. package/docs/appeal-s78.md +3607 -0
  18. package/docs/appeal.md +1879 -0
  19. package/docs/case-schedule.md +8 -0
  20. package/docs/dart-response.md +1413 -0
  21. package/docs/employee.md +70 -0
  22. package/docs/entraid.md +108 -0
  23. package/docs/folder.md +147 -0
  24. package/docs/gettimesheets-response.md +188 -0
  25. package/docs/interested-party.md +284 -0
  26. package/docs/listed-building.md +113 -0
  27. package/docs/listed-buildings.md +113 -0
  28. package/docs/nsip-document.md +966 -0
  29. package/docs/nsip-exam-timetable-defs-event.md +223 -0
  30. package/docs/nsip-exam-timetable-defs-line-item.md +51 -0
  31. package/docs/nsip-exam-timetable-defs.md +3 -0
  32. package/docs/nsip-exam-timetable-submission.md +113 -0
  33. package/docs/nsip-exam-timetable.md +352 -0
  34. package/docs/nsip-project-update.md +163 -0
  35. package/docs/nsip-project.md +2098 -0
  36. package/docs/nsip-representation-defs-attachment.md +133 -0
  37. package/docs/nsip-representation-defs.md +3 -0
  38. package/docs/nsip-representation.md +448 -0
  39. package/docs/nsip-subscription.md +193 -0
  40. package/docs/pins-inspector.md +184 -0
  41. package/docs/pins-lpa.md +260 -0
  42. package/docs/s51-advice.md +460 -0
  43. package/docs/service-user.md +575 -0
  44. package/eslint.config.js +21 -0
  45. package/jsconfig.json +12 -0
  46. package/package.json +55 -0
  47. package/pins_data_model/__init__.py +0 -0
  48. package/pins_data_model/gen_models.py +51 -0
  49. package/pins_data_model/load_schemas.py +51 -0
  50. package/pins_data_model/models/__init__.py +0 -0
  51. package/pins_data_model/models/model_appeal_document.py +294 -0
  52. package/pins_data_model/models/model_appeal_event.py +117 -0
  53. package/pins_data_model/models/model_appeal_event_estimate.py +37 -0
  54. package/pins_data_model/models/model_appeal_has.py +585 -0
  55. package/pins_data_model/models/model_appeal_representation.py +132 -0
  56. package/pins_data_model/models/model_appeal_s78.py +864 -0
  57. package/pins_data_model/models/model_case_schedule.py +11 -0
  58. package/pins_data_model/models/model_dart_response.py +292 -0
  59. package/pins_data_model/models/model_entraid.py +37 -0
  60. package/pins_data_model/models/model_folder.py +56 -0
  61. package/pins_data_model/models/model_gettimesheets_response.py +45 -0
  62. package/pins_data_model/models/model_listed_building.py +33 -0
  63. package/pins_data_model/models/model_listed_buildings.py +33 -0
  64. package/pins_data_model/models/model_nsip_document.py +199 -0
  65. package/pins_data_model/models/model_nsip_exam_timetable.py +90 -0
  66. package/pins_data_model/models/model_nsip_project.py +488 -0
  67. package/pins_data_model/models/model_nsip_project_update.py +60 -0
  68. package/pins_data_model/models/model_nsip_representation.py +83 -0
  69. package/pins_data_model/models/model_nsip_subscription.py +60 -0
  70. package/pins_data_model/models/model_pins_inspector.py +53 -0
  71. package/pins_data_model/models/model_pins_lpa.py +69 -0
  72. package/pins_data_model/models/model_s51_advice.py +109 -0
  73. package/pins_data_model/models/model_service_user.py +121 -0
  74. package/requirements.txt +2 -0
  75. package/schemas/__init__.py +0 -0
  76. package/schemas/appeal-document.schema.json +250 -0
  77. package/schemas/appeal-event-estimate.schema.json +31 -0
  78. package/schemas/appeal-event.schema.json +123 -0
  79. package/schemas/appeal-has.schema.json +576 -0
  80. package/schemas/appeal-representation.schema.json +131 -0
  81. package/schemas/appeal-s78.schema.json +1060 -0
  82. package/schemas/commands/__init__.py +0 -0
  83. package/schemas/commands/appeal-common-submission.schema.json +202 -0
  84. package/schemas/commands/appeal-has-submission.schema.json +82 -0
  85. package/schemas/commands/appeal-representation-submission.schema.json +192 -0
  86. package/schemas/commands/appeal-s78-submission.schema.json +100 -0
  87. package/schemas/commands/appellant-submission.schema.json +164 -0
  88. package/schemas/commands/interested-party.schema.json +80 -0
  89. package/schemas/commands/lpa-questionnaire-common.schema.json +110 -0
  90. package/schemas/commands/lpa-questionnaire-has.schema.json +69 -0
  91. package/schemas/commands/lpa-questionnaire-s78.schema.json +218 -0
  92. package/schemas/commands/lpa-questionnaire.schema.json +125 -0
  93. package/schemas/commands/new-deadline-submission.schema.json +59 -0
  94. package/schemas/commands/nsip-exam-timetable-submission.schema.json +27 -0
  95. package/schemas/commands/register-nsip-subscription.schema.json +32 -0
  96. package/schemas/commands/register-representation.schema.json +51 -0
  97. package/schemas/dart-response.schema.json +350 -0
  98. package/schemas/entraid.schema.json +31 -0
  99. package/schemas/folder.schema.json +49 -0
  100. package/schemas/gettimesheets-response.schema.json +46 -0
  101. package/schemas/listed-building.schema.json +31 -0
  102. package/schemas/listed-buildings.schema.json +31 -0
  103. package/schemas/nsip-document.schema.json +235 -0
  104. package/schemas/nsip-exam-timetable.schema.json +101 -0
  105. package/schemas/nsip-project-update.schema.json +49 -0
  106. package/schemas/nsip-project.schema.json +539 -0
  107. package/schemas/nsip-representation.schema.json +110 -0
  108. package/schemas/nsip-subscription.schema.json +52 -0
  109. package/schemas/pins-inspector.schema.json +47 -0
  110. package/schemas/pins-lpa.schema.json +63 -0
  111. package/schemas/s51-advice.schema.json +113 -0
  112. package/schemas/service-user.schema.json +152 -0
  113. package/setup.py +15 -0
  114. package/src/enums.cjs +632 -0
  115. package/src/enums.d.ts +573 -0
  116. package/src/enums.js +573 -0
  117. package/src/gen-docs.js +34 -0
  118. package/src/gen-enums.js +119 -0
  119. package/src/gen-types.js +70 -0
  120. package/src/index.cjs +746 -0
  121. package/src/index.d.ts +18 -0
  122. package/src/index.js +34 -0
  123. package/src/lib/load.js +78 -0
  124. package/src/schemas.d.ts +4570 -0
  125. package/tests/appeals/appeal-event.test.js +62 -0
  126. package/tests/appeals/commands/appeal-representation-submission.test.js +107 -0
  127. package/tests/appeals/commands/has-questionnaire.test.js +92 -0
  128. package/tests/appeals/commands/has-submission.test.js +113 -0
  129. package/tests/appeals/commands/s78-questionnaire.test.js +96 -0
  130. package/tests/appeals/commands/s78-submission.test.js +119 -0
  131. package/tests/schemas.test.js +97 -0
@@ -0,0 +1,864 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: appeal-s78.schema.json
3
+ # timestamp: 2025-07-16T14:06:09+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from uuid import UUID
9
+
10
+ from pydantic import AwareDatetime, BaseModel, ConfigDict, Field, RootModel
11
+
12
+
13
+ class CaseStatus(Enum):
14
+ """
15
+ The processing status for the appeal
16
+ """
17
+
18
+ assign_case_officer = "assign_case_officer"
19
+ validation = "validation"
20
+ ready_to_start = "ready_to_start"
21
+ lpa_questionnaire = "lpa_questionnaire"
22
+ issue_determination = "issue_determination"
23
+ statements = "statements"
24
+ evidence = "evidence"
25
+ witnesses = "witnesses"
26
+ final_comments = "final_comments"
27
+ complete = "complete"
28
+ invalid = "invalid"
29
+ closed = "closed"
30
+ withdrawn = "withdrawn"
31
+ awaiting_transfer = "awaiting_transfer"
32
+ transferred = "transferred"
33
+ event = "event"
34
+ awaiting_event = "awaiting_event"
35
+
36
+
37
+ class CaseType(Enum):
38
+ """
39
+ The internal code for an appeal type, e.g. D (Householder)
40
+ """
41
+
42
+ C = "C"
43
+ D = "D"
44
+ F = "F"
45
+ G = "G"
46
+ H = "H"
47
+ L = "L"
48
+ Q = "Q"
49
+ S = "S"
50
+ V = "V"
51
+ W = "W"
52
+ X = "X"
53
+ Y = "Y"
54
+ Z = "Z"
55
+ ZA = "ZA"
56
+ ZP = "ZP"
57
+
58
+
59
+ class CaseProcedure(Enum):
60
+ """
61
+ The type of procedure for the appeal
62
+ """
63
+
64
+ written = "written"
65
+ hearing = "hearing"
66
+ inquiry = "inquiry"
67
+ NoneType_None = None
68
+
69
+
70
+ class AllocationLevel(Enum):
71
+ """
72
+ A level used for allocation purposes
73
+ """
74
+
75
+ A = "A"
76
+ B = "B"
77
+ C = "C"
78
+ D = "D"
79
+ E = "E"
80
+ F = "F"
81
+ G = "G"
82
+ H = "H"
83
+ NoneType_None = None
84
+
85
+
86
+ class AllocationBand(Enum):
87
+ """
88
+ A band used for allocation purposes
89
+ """
90
+
91
+ int_1 = 1
92
+ int_2 = 2
93
+ int_3 = 3
94
+ NoneType_None = None
95
+
96
+
97
+ class CaseValidationOutcome(Enum):
98
+ """
99
+ The outcome of the validation action
100
+ """
101
+
102
+ valid = "valid"
103
+ invalid = "invalid"
104
+ incomplete = "incomplete"
105
+ NoneType_None = None
106
+
107
+
108
+ class LinkedCaseStatus(Enum):
109
+ """
110
+ Indicates if the case is linked, and the type of relationship
111
+ """
112
+
113
+ lead = "lead"
114
+ child = "child"
115
+ NoneType_None = None
116
+
117
+
118
+ class LpaQuestionnaireValidationOutcome(Enum):
119
+ """
120
+ The outcome of the validation action
121
+ """
122
+
123
+ complete = "complete"
124
+ incomplete = "incomplete"
125
+ NoneType_None = None
126
+
127
+
128
+ class CaseDecisionOutcome(Enum):
129
+ """
130
+ The final outcome for the decision
131
+ """
132
+
133
+ allowed = "allowed"
134
+ split_decision = "split_decision"
135
+ dismissed = "dismissed"
136
+ invalid = "invalid"
137
+ NoneType_None = None
138
+
139
+
140
+ class ApplicationDecision(Enum):
141
+ """
142
+ The outcome of the original LPA decision
143
+ """
144
+
145
+ granted = "granted"
146
+ refused = "refused"
147
+ not_received = "not_received"
148
+
149
+
150
+ class KnowsOtherOwners(Enum):
151
+ """
152
+ Indicates if the appellant knows other owners of the site
153
+ """
154
+
155
+ Yes = "Yes"
156
+ No = "No"
157
+ Some = "Some"
158
+ NoneType_None = None
159
+
160
+
161
+ class KnowsAllOwners(Enum):
162
+ """
163
+ Indicates if the appellant knows all owners of the site
164
+ """
165
+
166
+ Yes = "Yes"
167
+ No = "No"
168
+ Some = "Some"
169
+ NoneType_None = None
170
+
171
+
172
+ class NotificationMethodEnumEnumEnum(Enum):
173
+ notice = "notice"
174
+ letter = "letter"
175
+ advert = "advert"
176
+
177
+
178
+ class NotificationMethodEnum(RootModel[NotificationMethodEnumEnumEnum | None]):
179
+ root: NotificationMethodEnumEnumEnum | None = None
180
+
181
+
182
+ class NeighbouringSiteAddress(BaseModel):
183
+ model_config = ConfigDict(
184
+ extra="allow",
185
+ )
186
+ neighbouringSiteAddressLine1: str = Field(..., examples=["96 The Avenue"])
187
+ """
188
+ First line of address of the site
189
+ """
190
+ neighbouringSiteAddressLine2: str | None = None
191
+ """
192
+ Second line of address of the site
193
+ """
194
+ neighbouringSiteAddressTown: str = Field(..., examples=["Maidstone"])
195
+ """
196
+ Town / City of the site address
197
+ """
198
+ neighbouringSiteAddressCounty: str | None = Field(..., examples=["Kent"])
199
+ """
200
+ County of the site address
201
+ """
202
+ neighbouringSiteAddressPostcode: str = Field(..., examples=["MD21 5XY"])
203
+ """
204
+ Postal code of the site address
205
+ """
206
+ neighbouringSiteAccessDetails: str | None = Field(
207
+ ..., examples=["Ongoing road works at this address"]
208
+ )
209
+ """
210
+ Provided information on site accessibility on this address
211
+ """
212
+ neighbouringSiteSafetyDetails: str | None = Field(
213
+ ..., examples=["Ongoing road works at this address"]
214
+ )
215
+ """
216
+ Provided information on site health and safety on this address
217
+ """
218
+
219
+
220
+ class AppellantProcedurePreference(Enum):
221
+ """
222
+ The procedure preference indicated by the appellant
223
+ """
224
+
225
+ written = "written"
226
+ hearing = "hearing"
227
+ inquiry = "inquiry"
228
+ NoneType_None = None
229
+
230
+
231
+ class EiaEnvironmentalImpactSchedule(Enum):
232
+ """
233
+ The impact schedule from EIA
234
+ """
235
+
236
+ schedule_1 = "schedule-1"
237
+ schedule_2 = "schedule-2"
238
+ NoneType_None = None
239
+
240
+
241
+ class EiaDevelopmentDescription(Enum):
242
+ """
243
+ The development description from EIA
244
+ """
245
+
246
+ agriculture_aquaculture = "agriculture-aquaculture"
247
+ change_extensions = "change-extensions"
248
+ chemical_industry = "chemical-industry"
249
+ energy_industry = "energy-industry"
250
+ extractive_industry = "extractive-industry"
251
+ food_industry = "food-industry"
252
+ infrastructure_projects = "infrastructure-projects"
253
+ mineral_industry = "mineral-industry"
254
+ other_projects = "other-projects"
255
+ production_processing_of_metals = "production-processing-of-metals"
256
+ rubber_industry = "rubber-industry"
257
+ textile_industries = "textile-industries"
258
+ tourism_leisure = "tourism-leisure"
259
+ NoneType_None = None
260
+
261
+
262
+ class LpaProcedurePreference(Enum):
263
+ """
264
+ The procedure preference indicated by the LPA
265
+ """
266
+
267
+ written = "written"
268
+ hearing = "hearing"
269
+ inquiry = "inquiry"
270
+ NoneType_None = None
271
+
272
+
273
+ class TypeOfPlanningApplication(Enum):
274
+ full_appeal = "full-appeal"
275
+ householder_planning = "householder-planning"
276
+ outline_planning = "outline-planning"
277
+ prior_approval = "prior-approval"
278
+ reserved_matters = "reserved-matters"
279
+ removal_or_variation_of_conditions = "removal-or-variation-of-conditions"
280
+ listed_building = "listed-building"
281
+ minor_commercial_development = "minor-commercial-development"
282
+ NoneType_None = None
283
+
284
+
285
+ class DevelopmentType(Enum):
286
+ householder = "householder"
287
+ change_of_use = "change-of-use"
288
+ major_dwellings = "major-dwellings"
289
+ major_industry_storage = "major-industry-storage"
290
+ major_offices = "major-offices"
291
+ major_retail_services = "major-retail-services"
292
+ major_traveller_caravan = "major-traveller-caravan"
293
+ mineral_workings = "mineral-workings"
294
+ minor_dwellings = "minor-dwellings"
295
+ minor_industry_storage = "minor-industry-storage"
296
+ minor_offices = "minor-offices"
297
+ minor_retail_services = "minor-retail-services"
298
+ minor_traveller_caravan = "minor-traveller-caravan"
299
+ other_major = "other-major"
300
+ other_minor = "other-minor"
301
+ NoneType_None = None
302
+
303
+
304
+ class AppealS78Case(BaseModel):
305
+ """
306
+ Schema defining the metadata for an appeal (S78)
307
+ """
308
+
309
+ model_config = ConfigDict(
310
+ extra="allow",
311
+ )
312
+ caseId: int | None = Field(..., examples=[1200])
313
+ """
314
+ Internal case identifier
315
+ """
316
+ caseReference: str = Field(..., examples=["7002471"])
317
+ """
318
+ External case identifier
319
+ """
320
+ submissionId: UUID | None = Field(
321
+ None, examples=["7f45748c-2342-4b59-b934-ad6183e8d834"]
322
+ )
323
+ """
324
+ Case submission id - link to draft submission created by appellant
325
+ """
326
+ caseStatus: CaseStatus
327
+ """
328
+ The processing status for the appeal
329
+ """
330
+ caseType: CaseType
331
+ """
332
+ The internal code for an appeal type, e.g. D (Householder)
333
+ """
334
+ caseProcedure: CaseProcedure
335
+ """
336
+ The type of procedure for the appeal
337
+ """
338
+ lpaCode: str = Field(..., examples=["Q9999"])
339
+ """
340
+ A unique identifier for the Local Planning Authority
341
+ """
342
+ caseOfficerId: str | None = None
343
+ """
344
+ Unique identifier for the case officer assigned to the case
345
+ """
346
+ inspectorId: str | None = None
347
+ """
348
+ Unique identifier for the inspector assigned to the case
349
+ """
350
+ allocationLevel: AllocationLevel
351
+ """
352
+ A level used for allocation purposes
353
+ """
354
+ allocationBand: AllocationBand
355
+ """
356
+ A band used for allocation purposes
357
+ """
358
+ caseSpecialisms: list[str] = Field(
359
+ ...,
360
+ examples=[
361
+ "Access",
362
+ "Listed building and enforcement",
363
+ "Roads and traffics",
364
+ "Natural heritage",
365
+ "Schedule 1",
366
+ ],
367
+ )
368
+ """
369
+ A list of specialisms for allocation purposes
370
+ """
371
+ caseSubmittedDate: AwareDatetime = Field(..., examples=["2023-07-27T20:30:00.000Z"])
372
+ """
373
+ The date the appeal was submitted by the appellant
374
+ """
375
+ caseCreatedDate: AwareDatetime = Field(..., examples=["2023-07-27T20:30:00.000Z"])
376
+ """
377
+ The date the appeal was received
378
+ """
379
+ caseUpdatedDate: AwareDatetime = Field(..., examples=["2023-07-27T20:30:00.000Z"])
380
+ """
381
+ The date the appeal was last updated in the back-office
382
+ """
383
+ caseValidDate: AwareDatetime | None = Field(
384
+ ..., examples=["2023-07-27T20:30:00.000Z"]
385
+ )
386
+ """
387
+ The date since when the appeal was considered valid
388
+ """
389
+ caseValidationDate: AwareDatetime | None = Field(
390
+ ..., examples=["2023-07-27T20:30:00.000Z"]
391
+ )
392
+ """
393
+ The date the appeal was validated in the back-office
394
+ """
395
+ caseValidationOutcome: CaseValidationOutcome
396
+ """
397
+ The outcome of the validation action
398
+ """
399
+ caseValidationInvalidDetails: list[str]
400
+ """
401
+ A list of reasons why the appeal is invalid
402
+ """
403
+ caseValidationIncompleteDetails: list[str]
404
+ """
405
+ A list of reasons why the appeal is incomplete
406
+ """
407
+ caseExtensionDate: AwareDatetime | None = Field(
408
+ ..., examples=["2023-07-27T20:30:00.000Z"]
409
+ )
410
+ """
411
+ When the validation outcome is incomplete, an extension may be granted to provide missing information
412
+ """
413
+ caseStartedDate: AwareDatetime | None = Field(
414
+ ..., examples=["2023-07-27T20:30:00.000Z"]
415
+ )
416
+ """
417
+ A date indicating when the case was started, resulting in the creation of a timetable
418
+ """
419
+ casePublishedDate: AwareDatetime | None = Field(
420
+ ..., examples=["2023-07-27T20:30:00.000Z"]
421
+ )
422
+ """
423
+ A date indicating when the case was published
424
+ """
425
+ linkedCaseStatus: LinkedCaseStatus
426
+ """
427
+ Indicates if the case is linked, and the type of relationship
428
+ """
429
+ leadCaseReference: str | None = Field(..., examples=["7002471"])
430
+ """
431
+ The reference of the lead case, if the case is a child case
432
+ """
433
+ lpaQuestionnaireDueDate: AwareDatetime | None = Field(
434
+ ..., examples=["2023-07-27T20:30:00.000Z"]
435
+ )
436
+ """
437
+ If the case is started and has a timetable, a deadline for the LPA to provide a response
438
+ """
439
+ lpaQuestionnaireSubmittedDate: AwareDatetime | None = Field(
440
+ ..., examples=["2023-07-27T20:30:00.000Z"]
441
+ )
442
+ """
443
+ The date the LPA provided a response to the case
444
+ """
445
+ lpaQuestionnaireCreatedDate: AwareDatetime | None = Field(
446
+ ..., examples=["2023-07-27T20:30:00.000Z"]
447
+ )
448
+ """
449
+ The date the LPA response was receeived
450
+ """
451
+ lpaQuestionnairePublishedDate: AwareDatetime | None = Field(
452
+ ..., examples=["2023-07-27T20:30:00.000Z"]
453
+ )
454
+ """
455
+ The date indicating when the questionnaire review was completed and the questionnaire published
456
+ """
457
+ lpaQuestionnaireValidationOutcome: LpaQuestionnaireValidationOutcome
458
+ """
459
+ The outcome of the validation action
460
+ """
461
+ lpaQuestionnaireValidationOutcomeDate: AwareDatetime | None = Field(
462
+ ..., examples=["2023-07-27T20:30:00.000Z"]
463
+ )
464
+ """
465
+ The date the LPA response was validated
466
+ """
467
+ lpaQuestionnaireValidationDetails: list[str]
468
+ """
469
+ A list of reasons why the questionnaire is incomplete
470
+ """
471
+ lpaStatement: str | None = Field(
472
+ ..., examples=["We refused the application because of ..."]
473
+ )
474
+ """
475
+ A statement provided by the LPA
476
+ """
477
+ caseWithdrawnDate: AwareDatetime | None = Field(
478
+ ..., examples=["2023-07-27T20:30:00.000Z"]
479
+ )
480
+ """
481
+ The date the appeal was withdrawn by the appellant
482
+ """
483
+ caseTransferredDate: AwareDatetime | None = Field(
484
+ ..., examples=["2023-07-27T20:30:00.000Z"]
485
+ )
486
+ """
487
+ The date the appeal was transferred to a new case of a different type
488
+ """
489
+ transferredCaseClosedDate: AwareDatetime | None = Field(
490
+ ..., examples=["2023-07-27T20:30:00.000Z"]
491
+ )
492
+ """
493
+ The date the appeal was closed and the appellant requested to resubmit
494
+ """
495
+ caseDecisionOutcomeDate: AwareDatetime | None = Field(
496
+ ..., examples=["2023-07-27T20:30:00.000Z"]
497
+ )
498
+ """
499
+ The date of the appeal decision
500
+ """
501
+ caseDecisionPublishedDate: AwareDatetime | None = Field(
502
+ ..., examples=["2023-07-27T20:30:00.000Z"]
503
+ )
504
+ """
505
+ The date the appeal decision was published
506
+ """
507
+ caseDecisionOutcome: CaseDecisionOutcome
508
+ """
509
+ The final outcome for the decision
510
+ """
511
+ caseCompletedDate: AwareDatetime | None = Field(
512
+ ..., examples=["2023-07-27T20:30:00.000Z"]
513
+ )
514
+ """
515
+ The date the appeal decision letter
516
+ """
517
+ enforcementNotice: bool | None = None
518
+ """
519
+ Indicates if an enforcement notice is the reason for the appeal
520
+ """
521
+ applicationReference: str = Field(..., examples=["43010/APP/1/290572"])
522
+ """
523
+ The unique identifier of the LPA application
524
+ """
525
+ applicationDate: AwareDatetime = Field(..., examples=["2023-07-27T20:30:00.000Z"])
526
+ """
527
+ The date of the original LPA application
528
+ """
529
+ applicationDecision: ApplicationDecision
530
+ """
531
+ The outcome of the original LPA decision
532
+ """
533
+ applicationDecisionDate: AwareDatetime | None = Field(
534
+ ..., examples=["2023-07-27T20:30:00.000Z"]
535
+ )
536
+ """
537
+ The date of the original LPA decision
538
+ """
539
+ caseSubmissionDueDate: AwareDatetime | None = Field(
540
+ ..., examples=["2023-07-27T20:30:00.000Z"]
541
+ )
542
+ """
543
+ The statutory deadline for submitting an appeal from the original LPA decision date
544
+ """
545
+ siteAddressLine1: str = Field(..., examples=["96 The Avenue"])
546
+ """
547
+ First line of address for the appeal site
548
+ """
549
+ siteAddressLine2: str | None = None
550
+ """
551
+ Second line of address for the appeal site
552
+ """
553
+ siteAddressTown: str = Field(..., examples=["Maidstone"])
554
+ """
555
+ Town / City of the site address
556
+ """
557
+ siteAddressCounty: str | None = Field(..., examples=["Kent"])
558
+ """
559
+ County of the site address
560
+ """
561
+ siteAddressPostcode: str = Field(..., examples=["MD21 5XY"])
562
+ """
563
+ Postal code of the site address
564
+ """
565
+ siteAccessDetails: list[str]
566
+ """
567
+ Provided information on site accessibility
568
+ """
569
+ siteSafetyDetails: list[str]
570
+ """
571
+ Provided information on site health and safety
572
+ """
573
+ siteAreaSquareMetres: float | None = Field(..., examples=[45.7])
574
+ """
575
+ The site area, in square meters
576
+ """
577
+ floorSpaceSquareMetres: float | None = Field(..., examples=[3.5])
578
+ """
579
+ The floor space, in square meters
580
+ """
581
+ isCorrectAppealType: bool | None = None
582
+ """
583
+ Indicates if the LPA considers the appeal type appropriate
584
+ """
585
+ isGreenBelt: bool | None = None
586
+ """
587
+ Indicates if the site is in a green belt
588
+ """
589
+ inConservationArea: bool | None = None
590
+ """
591
+ Indicates if the site is in a conservation area
592
+ """
593
+ ownsAllLand: bool | None = None
594
+ """
595
+ Indicates if the appellant has complete ownership of the site
596
+ """
597
+ ownsSomeLand: bool | None = None
598
+ """
599
+ Indicates if the appellant has partial ownership of the site
600
+ """
601
+ knowsOtherOwners: KnowsOtherOwners
602
+ """
603
+ Indicates if the appellant knows other owners of the site
604
+ """
605
+ knowsAllOwners: KnowsAllOwners
606
+ """
607
+ Indicates if the appellant knows all owners of the site
608
+ """
609
+ advertisedAppeal: bool | None = None
610
+ """
611
+ Indicates if the appellant has advertised the appeal to the LPA decision
612
+ """
613
+ notificationMethod: list[NotificationMethodEnum]
614
+ """
615
+ The methods used to notify relevant parties
616
+ """
617
+ ownersInformed: bool | None = None
618
+ """
619
+ Indicates if the appellant has informed other owners of the site
620
+ """
621
+ originalDevelopmentDescription: str | None = Field(
622
+ ..., examples=["Replacement of an existing gate to access the property"]
623
+ )
624
+ """
625
+ The original description of the development, as provided by the appellant
626
+ """
627
+ changedDevelopmentDescription: bool | None = None
628
+ """
629
+ Indicates that the LPA has changed the development description
630
+ """
631
+ newConditionDetails: str | None = Field(
632
+ ...,
633
+ examples=["Since the original application, a number of things have changed..."],
634
+ )
635
+ """
636
+ New conditions details provided by the LPA
637
+ """
638
+ nearbyCaseReferences: list[str]
639
+ """
640
+ A list of related case references known to the appellant and the LPA
641
+ """
642
+ neighbouringSiteAddresses: list[NeighbouringSiteAddress]
643
+ """
644
+ A list of neighbouring site addresses
645
+ """
646
+ reasonForNeighbourVisits: str | None = None
647
+ """
648
+ A general reason given for the need to visit any neighbours
649
+ """
650
+ affectedListedBuildingNumbers: list[str]
651
+ """
652
+ A list of affected listed building IDs from Historic England
653
+ """
654
+ changedListedBuildingNumbers: list[str]
655
+ """
656
+ A list of changed listed building IDs from Historic England
657
+ """
658
+ preserveGrantLoan: bool | None = None
659
+ """
660
+ A grant or loan has been made to preserve the listed building
661
+ """
662
+ consultHistoricEngland: bool | None = None
663
+ """
664
+ Are Historic England to be consulted?
665
+ """
666
+ appellantCostsAppliedFor: bool | None = None
667
+ """
668
+ Indicates if the appellant has applied for costs
669
+ """
670
+ lpaCostsAppliedFor: bool | None = None
671
+ """
672
+ Indicates if the appellant has applied for costs
673
+ """
674
+ agriculturalHolding: bool | None = None
675
+ """
676
+ Indicates if the site is an agricultural holding
677
+ """
678
+ tenantAgriculturalHolding: bool | None = None
679
+ """
680
+ Indicates if the site is a tenant agricultural holding
681
+ """
682
+ otherTenantsAgriculturalHolding: bool | None = None
683
+ """
684
+ Indicates if the site is an agricultural holding with other tenants
685
+ """
686
+ informedTenantsAgriculturalHolding: bool | None = None
687
+ """
688
+ If the site is an agricultural holding, indicates tenants are informed
689
+ """
690
+ appellantProcedurePreference: AppellantProcedurePreference
691
+ """
692
+ The procedure preference indicated by the appellant
693
+ """
694
+ appellantProcedurePreferenceDetails: str | None = None
695
+ """
696
+ The procedure details preference indicated by the appellant
697
+ """
698
+ appellantProcedurePreferenceDuration: float | None = None
699
+ """
700
+ The duration of the procedure indicated by the appellant
701
+ """
702
+ appellantProcedurePreferenceWitnessCount: float | None = None
703
+ """
704
+ The number of witnesses appellant has suggested for inquiries preference
705
+ """
706
+ statusPlanningObligation: str | None = None
707
+ """
708
+ The planning obligation information, if available
709
+ """
710
+ affectsScheduledMonument: bool | None = None
711
+ """
712
+ Indicates that a scheduled monument is affected
713
+ """
714
+ hasProtectedSpecies: bool | None = None
715
+ """
716
+ Indicates the existence of protected species
717
+ """
718
+ isAonbNationalLandscape: bool | None = None
719
+ """
720
+ Indicates an area of outstanding beauty (National Landscape)
721
+ """
722
+ designatedSitesNames: list[str]
723
+ """
724
+ The designated site names
725
+ """
726
+ isGypsyOrTravellerSite: bool | None = None
727
+ """
728
+ Indicates a traveller site
729
+ """
730
+ isPublicRightOfWay: bool | None = None
731
+ """
732
+ Indicates a PROW (public right of way)
733
+ """
734
+ eiaEnvironmentalImpactSchedule: EiaEnvironmentalImpactSchedule
735
+ """
736
+ The impact schedule from EIA
737
+ """
738
+ eiaDevelopmentDescription: EiaDevelopmentDescription
739
+ """
740
+ The development description from EIA
741
+ """
742
+ eiaSensitiveAreaDetails: str | None = None
743
+ """
744
+ The sensitive area details from EIA
745
+ """
746
+ eiaColumnTwoThreshold: bool | None = None
747
+ """
748
+ EIA specific threshold
749
+ """
750
+ eiaScreeningOpinion: bool | None = None
751
+ """
752
+ EIA screening opinion
753
+ """
754
+ eiaRequiresEnvironmentalStatement: bool | None = None
755
+ """
756
+ EIA environmental statement required
757
+ """
758
+ eiaCompletedEnvironmentalStatement: bool | None = None
759
+ """
760
+ EIA completed environmental statement required
761
+ """
762
+ hasStatutoryConsultees: bool | None = None
763
+ """
764
+ Indicates statutory consultees
765
+ """
766
+ consultedBodiesDetails: str | None = None
767
+ """
768
+ The details of the bodies consulted
769
+ """
770
+ hasInfrastructureLevy: bool | None = None
771
+ """
772
+ Indicates the existence of an infrastructure levy
773
+ """
774
+ isInfrastructureLevyFormallyAdopted: bool | None = None
775
+ """
776
+ Indicates if the infrastructure levy is formally adopted
777
+ """
778
+ infrastructureLevyAdoptedDate: AwareDatetime | None = Field(
779
+ ..., examples=["2023-07-27T20:30:00.000Z"]
780
+ )
781
+ """
782
+ The date of the infrastructure levy adoption
783
+ """
784
+ infrastructureLevyExpectedDate: AwareDatetime | None = Field(
785
+ ..., examples=["2023-07-27T20:30:00.000Z"]
786
+ )
787
+ """
788
+ The expected date of the infrastructure levy
789
+ """
790
+ lpaProcedurePreference: LpaProcedurePreference
791
+ """
792
+ The procedure preference indicated by the LPA
793
+ """
794
+ lpaProcedurePreferenceDetails: str | None = None
795
+ """
796
+ The procedure details preference indicated by the LPA
797
+ """
798
+ lpaProcedurePreferenceDuration: float | None = None
799
+ """
800
+ The duration of enquiry indicated by the LPA
801
+ """
802
+ caseworkReason: str | None = None
803
+ importantInformation: str | None = None
804
+ jurisdiction: str | None = None
805
+ redeterminedIndicator: str | None = None
806
+ dateCostsReportDespatched: AwareDatetime | None = Field(
807
+ ..., examples=["2023-07-27T20:30:00.000Z"]
808
+ )
809
+ """
810
+ The date of the cost report
811
+ """
812
+ dateNotRecoveredOrDerecovered: AwareDatetime | None = Field(
813
+ ..., examples=["2023-07-27T20:30:00.000Z"]
814
+ )
815
+ dateRecovered: AwareDatetime | None = Field(
816
+ ..., examples=["2023-07-27T20:30:00.000Z"]
817
+ )
818
+ originalCaseDecisionDate: AwareDatetime | None = Field(
819
+ ..., examples=["2023-07-27T20:30:00.000Z"]
820
+ )
821
+ targetDate: AwareDatetime | None = Field(..., examples=["2023-07-27T20:30:00.000Z"])
822
+ appellantCommentsSubmittedDate: AwareDatetime | None = Field(
823
+ ..., examples=["2023-07-27T20:30:00.000Z"]
824
+ )
825
+ appellantStatementSubmittedDate: AwareDatetime | None = Field(
826
+ ..., examples=["2023-07-27T20:30:00.000Z"]
827
+ )
828
+ appellantProofsSubmittedDate: AwareDatetime | None = Field(
829
+ ..., examples=["2023-07-27T20:30:00.000Z"]
830
+ )
831
+ finalCommentsDueDate: AwareDatetime | None = Field(
832
+ ..., examples=["2023-07-27T20:30:00.000Z"]
833
+ )
834
+ interestedPartyRepsDueDate: AwareDatetime | None = Field(
835
+ ..., examples=["2023-07-27T20:30:00.000Z"]
836
+ )
837
+ lpaCommentsSubmittedDate: AwareDatetime | None = Field(
838
+ ..., examples=["2023-07-27T20:30:00.000Z"]
839
+ )
840
+ lpaProofsSubmittedDate: AwareDatetime | None = Field(
841
+ ..., examples=["2023-07-27T20:30:00.000Z"]
842
+ )
843
+ lpaStatementSubmittedDate: AwareDatetime | None = Field(
844
+ ..., examples=["2023-07-27T20:30:00.000Z"]
845
+ )
846
+ proofsOfEvidenceDueDate: AwareDatetime | None = Field(
847
+ ..., examples=["2023-07-27T20:30:00.000Z"]
848
+ )
849
+ siteNoticesSentDate: AwareDatetime | None = Field(
850
+ ..., examples=["2023-07-27T20:30:00.000Z"]
851
+ )
852
+ statementDueDate: AwareDatetime | None = Field(
853
+ ..., examples=["2023-07-27T20:30:00.000Z"]
854
+ )
855
+ numberOfResidencesNetChange: float | None = None
856
+ """
857
+ The net gain in residences of the proposed development
858
+ """
859
+ siteGridReferenceEasting: str | None = None
860
+ siteGridReferenceNorthing: str | None = None
861
+ siteViewableFromRoad: bool | None = None
862
+ siteWithinSSSI: bool | None = None
863
+ typeOfPlanningApplication: TypeOfPlanningApplication
864
+ developmentType: DevelopmentType