@planning-inspectorate/data-model 1.20.0 → 1.22.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 (57) hide show
  1. package/docs/README.md +11 -1
  2. package/docs/appeal-has.md +30 -49
  3. package/docs/appeal-s78.md +241 -144
  4. package/docs/pins-inspector-defs-specialism.md +80 -0
  5. package/docs/pins-inspector-defs.md +3 -0
  6. package/docs/pins-inspector.md +311 -3
  7. package/package.json +1 -1
  8. package/pins_data_model/models/model_appeal_document.py +1 -1
  9. package/pins_data_model/models/model_appeal_event.py +1 -1
  10. package/pins_data_model/models/model_appeal_event_estimate.py +1 -1
  11. package/pins_data_model/models/model_appeal_has.py +72 -27
  12. package/pins_data_model/models/model_appeal_representation.py +1 -1
  13. package/pins_data_model/models/model_appeal_s78.py +95 -8
  14. package/pins_data_model/models/model_dart_response.py +1 -1
  15. package/pins_data_model/models/model_entraid.py +1 -1
  16. package/pins_data_model/models/model_folder.py +1 -1
  17. package/pins_data_model/models/model_gettimesheets_response.py +1 -1
  18. package/pins_data_model/models/model_listed_building.py +1 -1
  19. package/pins_data_model/models/model_listed_buildings.py +1 -1
  20. package/pins_data_model/models/model_nsip_document.py +1 -1
  21. package/pins_data_model/models/model_nsip_exam_timetable.py +1 -1
  22. package/pins_data_model/models/model_nsip_project.py +1 -1
  23. package/pins_data_model/models/model_nsip_project_update.py +1 -1
  24. package/pins_data_model/models/model_nsip_representation.py +1 -1
  25. package/pins_data_model/models/model_nsip_subscription.py +1 -1
  26. package/pins_data_model/models/model_pins_inspector.py +75 -6
  27. package/pins_data_model/models/model_pins_lpa.py +1 -1
  28. package/pins_data_model/models/model_s51_advice.py +1 -1
  29. package/pins_data_model/models/model_service_user.py +1 -1
  30. package/schemas/appeal-has.schema.json +52 -21
  31. package/schemas/appeal-s78.schema.json +62 -7
  32. package/schemas/commands/appeals-components/appeal-advert.submission.schema.json +53 -0
  33. package/schemas/commands/{appeal-common-submission.schema.json → appeals-components/appeal-common-submission.schema.json} +8 -8
  34. package/schemas/commands/{appeal-has-submission.schema.json → appeals-components/appeal-has-submission.schema.json} +2 -2
  35. package/schemas/commands/{appeal-s78-submission.schema.json → appeals-components/appeal-s78-submission.schema.json} +2 -2
  36. package/schemas/commands/appeals-components/appellant-procedure-preference.schema.json +37 -0
  37. package/schemas/commands/appeals-components/changed-listed-building-number.schema.json +23 -0
  38. package/schemas/commands/appeals-components/lpa-procedure-preference.schema.json +28 -0
  39. package/schemas/commands/{lpa-questionnaire-cas-advert.schema.json → appeals-components/lpa-questionnaire-advert.schema.json} +8 -33
  40. package/schemas/commands/{lpa-questionnaire-common.schema.json → appeals-components/lpa-questionnaire-common.schema.json} +1 -1
  41. package/schemas/commands/{lpa-questionnaire-has.schema.json → appeals-components/lpa-questionnaire-has.schema.json} +1 -1
  42. package/schemas/commands/{lpa-questionnaire-s78.schema.json → appeals-components/lpa-questionnaire-s78.schema.json} +2 -21
  43. package/schemas/commands/appellant-submission.schema.json +21 -10
  44. package/schemas/commands/lpa-questionnaire.schema.json +24 -10
  45. package/schemas/pins-inspector.schema.json +108 -3
  46. package/src/index.cjs +6 -2
  47. package/src/index.d.ts +4 -0
  48. package/src/index.js +5 -2
  49. package/src/schemas.d.ts +385 -802
  50. package/tests/appeals/appeal-has.test.js +30 -5
  51. package/tests/appeals/appeal-s78.test.js +17 -3
  52. package/tests/appeals/commands/adverts-questionnaire.test.js +1 -0
  53. package/tests/appeals/commands/adverts-submission.test.js +13 -13
  54. package/tests/appeals/commands/cas-adverts-submission.test.js +184 -0
  55. package/tests/appeals/commands/has-submission.test.js +2 -2
  56. package/tests/appeals/commands/s78-submission.test.js +2 -2
  57. package/schemas/commands/appeal-advert.submission.schema.json +0 -23
@@ -0,0 +1,80 @@
1
+ ## specialism Type
2
+
3
+ `object` ([Details](pins-inspector-defs-specialism.md))
4
+
5
+ # specialism Properties
6
+
7
+ | Property | Type | Required | Nullable | Defined by |
8
+ | :-------------------------- | :------- | :------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------- |
9
+ | [name](#name) | `string` | Required | cannot be null | [PINS Inspector](pins-inspector-defs-specialism-properties-name.md "pins-inspector.schema.json#/$defs/specialism/properties/name") |
10
+ | [proficiency](#proficiency) | `string` | Required | can be null | [PINS Inspector](pins-inspector-defs-specialism-properties-proficiency.md "pins-inspector.schema.json#/$defs/specialism/properties/proficiency") |
11
+ | [validFrom](#validfrom) | `string` | Required | can be null | [PINS Inspector](pins-inspector-defs-specialism-properties-validfrom.md "pins-inspector.schema.json#/$defs/specialism/properties/validFrom") |
12
+ | Additional Properties | Any | Optional | can be null | |
13
+
14
+ ## name
15
+
16
+ Working above band is stored as a specialism
17
+
18
+ `name`
19
+
20
+ * is required
21
+
22
+ * Type: `string`
23
+
24
+ * cannot be null
25
+
26
+ * defined in: [PINS Inspector](pins-inspector-defs-specialism-properties-name.md "pins-inspector.schema.json#/$defs/specialism/properties/name")
27
+
28
+ ### name Type
29
+
30
+ `string`
31
+
32
+ ## proficiency
33
+
34
+ trained or in-training
35
+
36
+ `proficiency`
37
+
38
+ * is required
39
+
40
+ * Type: `string`
41
+
42
+ * can be null
43
+
44
+ * defined in: [PINS Inspector](pins-inspector-defs-specialism-properties-proficiency.md "pins-inspector.schema.json#/$defs/specialism/properties/proficiency")
45
+
46
+ ### proficiency Type
47
+
48
+ `string`
49
+
50
+ ## validFrom
51
+
52
+ Date training started or date training was completed.
53
+
54
+ `validFrom`
55
+
56
+ * is required
57
+
58
+ * Type: `string`
59
+
60
+ * can be null
61
+
62
+ * defined in: [PINS Inspector](pins-inspector-defs-specialism-properties-validfrom.md "pins-inspector.schema.json#/$defs/specialism/properties/validFrom")
63
+
64
+ ### validFrom Type
65
+
66
+ `string`
67
+
68
+ ### validFrom Constraints
69
+
70
+ **date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification")
71
+
72
+ ### validFrom Examples
73
+
74
+ ```json
75
+ "2023-07-27T20:30:00.000Z"
76
+ ```
77
+
78
+ ## Additional Properties
79
+
80
+ Additional properties are allowed and do not have to follow a specific schema
@@ -0,0 +1,3 @@
1
+ ## $defs Type
2
+
3
+ unknown
@@ -6,7 +6,9 @@
6
6
 
7
7
  | Property | Type | Required | Nullable | Defined by |
8
8
  | :------------------------------------ | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------ |
9
- | [horizonId](#horizonid) | `string` | Required | cannot be null | [PINS Inspector](pins-inspector-properties-horizonid.md "pins-inspector.schema.json#/properties/horizonId") |
9
+ | [entraId](#entraid) | `string` | Required | can be null | [PINS Inspector](pins-inspector-properties-entraid.md "pins-inspector.schema.json#/properties/entraId") |
10
+ | [sapId](#sapid) | `string` | Required | can be null | [PINS Inspector](pins-inspector-properties-sapid.md "pins-inspector.schema.json#/properties/sapId") |
11
+ | [horizonId](#horizonid) | `string` | Optional | cannot be null | [PINS Inspector](pins-inspector-properties-horizonid.md "pins-inspector.schema.json#/properties/horizonId") |
10
12
  | [firstName](#firstname) | `string` | Required | cannot be null | [PINS Inspector](pins-inspector-properties-firstname.md "pins-inspector.schema.json#/properties/firstName") |
11
13
  | [lastName](#lastname) | `string` | Required | cannot be null | [PINS Inspector](pins-inspector-properties-lastname.md "pins-inspector.schema.json#/properties/lastName") |
12
14
  | [postName](#postname) | `string` | Optional | can be null | [PINS Inspector](pins-inspector-properties-postname.md "pins-inspector.schema.json#/properties/postName") |
@@ -15,15 +17,60 @@
15
17
  | [salutation](#salutation) | `string` | Optional | can be null | [PINS Inspector](pins-inspector-properties-salutation.md "pins-inspector.schema.json#/properties/salutation") |
16
18
  | [qualifications](#qualifications) | `string` | Optional | can be null | [PINS Inspector](pins-inspector-properties-qualifications.md "pins-inspector.schema.json#/properties/qualifications") |
17
19
  | [email](#email) | `string` | Required | can be null | [PINS Inspector](pins-inspector-properties-email.md "pins-inspector.schema.json#/properties/email") |
20
+ | [grade](#grade) | `string` | Required | cannot be null | [PINS Inspector](pins-inspector-properties-grade.md "pins-inspector.schema.json#/properties/grade") |
21
+ | [fte](#fte) | `number` | Required | cannot be null | [PINS Inspector](pins-inspector-properties-fte.md "pins-inspector.schema.json#/properties/fte") |
22
+ | [unit](#unit) | `string` | Required | cannot be null | [PINS Inspector](pins-inspector-properties-unit.md "pins-inspector.schema.json#/properties/unit") |
23
+ | [service](#service) | `string` | Required | cannot be null | [PINS Inspector](pins-inspector-properties-service.md "pins-inspector.schema.json#/properties/service") |
24
+ | [group](#group) | `string` | Required | cannot be null | [PINS Inspector](pins-inspector-properties-group.md "pins-inspector.schema.json#/properties/group") |
25
+ | [inspectorManager](#inspectormanager) | `string` | Required | cannot be null | [PINS Inspector](pins-inspector-properties-inspectormanager.md "pins-inspector.schema.json#/properties/inspectorManager") |
26
+ | [validFrom](#validfrom) | `string` | Optional | can be null | [PINS Inspector](pins-inspector-properties-validfrom.md "pins-inspector.schema.json#/properties/validFrom") |
27
+ | [address](#address) | `object` | Required | cannot be null | [PINS Inspector](pins-inspector-properties-address.md "pins-inspector.schema.json#/properties/address") |
28
+ | [specialisms](#specialisms) | `array` | Required | cannot be null | [PINS Inspector](pins-inspector-properties-specialisms.md "pins-inspector.schema.json#/properties/specialisms") |
18
29
  | Additional Properties | Any | Optional | can be null | |
19
30
 
31
+ ## entraId
32
+
33
+ EntraID of the Inspector if available in ODW.
34
+
35
+ `entraId`
36
+
37
+ * is required
38
+
39
+ * Type: `string`
40
+
41
+ * can be null
42
+
43
+ * defined in: [PINS Inspector](pins-inspector-properties-entraid.md "pins-inspector.schema.json#/properties/entraId")
44
+
45
+ ### entraId Type
46
+
47
+ `string`
48
+
49
+ ## sapId
50
+
51
+ SAPID of the Inspector if available in ODW.
52
+
53
+ `sapId`
54
+
55
+ * is required
56
+
57
+ * Type: `string`
58
+
59
+ * can be null
60
+
61
+ * defined in: [PINS Inspector](pins-inspector-properties-sapid.md "pins-inspector.schema.json#/properties/sapId")
62
+
63
+ ### sapId Type
64
+
65
+ `string`
66
+
20
67
  ## horizonId
21
68
 
22
69
  The PINS-generated unique horizon ID
23
70
 
24
71
  `horizonId`
25
72
 
26
- * is required
73
+ * is optional
27
74
 
28
75
  * Type: `string`
29
76
 
@@ -163,7 +210,7 @@ The qualifications of the inspector
163
210
 
164
211
  ## email
165
212
 
166
- The email address of the inspector
213
+ PINS Email address for the Inspector
167
214
 
168
215
  `email`
169
216
 
@@ -179,6 +226,267 @@ The email address of the inspector
179
226
 
180
227
  `string`
181
228
 
229
+ ### email Constraints
230
+
231
+ **email**: the string must be an email address, according to [RFC 5322, section 3.4.1](https://tools.ietf.org/html/rfc5322 "check the specification")
232
+
233
+ ## grade
234
+
235
+ Grades as a coded value e.g. B1, B2, B3, FTC-B1, FTC-B2, FTC-B3, PL
236
+
237
+ `grade`
238
+
239
+ * is required
240
+
241
+ * Type: `string`
242
+
243
+ * cannot be null
244
+
245
+ * defined in: [PINS Inspector](pins-inspector-properties-grade.md "pins-inspector.schema.json#/properties/grade")
246
+
247
+ ### grade Type
248
+
249
+ `string`
250
+
251
+ ## fte
252
+
253
+ FTE Decimal value e.g. 1, 0.5 etc
254
+
255
+ `fte`
256
+
257
+ * is required
258
+
259
+ * Type: `number`
260
+
261
+ * cannot be null
262
+
263
+ * defined in: [PINS Inspector](pins-inspector-properties-fte.md "pins-inspector.schema.json#/properties/fte")
264
+
265
+ ### fte Type
266
+
267
+ `number`
268
+
269
+ ## unit
270
+
271
+ The personnel area of the Inspector
272
+
273
+ `unit`
274
+
275
+ * is required
276
+
277
+ * Type: `string`
278
+
279
+ * cannot be null
280
+
281
+ * defined in: [PINS Inspector](pins-inspector-properties-unit.md "pins-inspector.schema.json#/properties/unit")
282
+
283
+ ### unit Type
284
+
285
+ `string`
286
+
287
+ ## service
288
+
289
+ The personnel sub area of the Inspector
290
+
291
+ `service`
292
+
293
+ * is required
294
+
295
+ * Type: `string`
296
+
297
+ * cannot be null
298
+
299
+ * defined in: [PINS Inspector](pins-inspector-properties-service.md "pins-inspector.schema.json#/properties/service")
300
+
301
+ ### service Type
302
+
303
+ `string`
304
+
305
+ ## group
306
+
307
+ Group of the Inspector
308
+
309
+ `group`
310
+
311
+ * is required
312
+
313
+ * Type: `string`
314
+
315
+ * cannot be null
316
+
317
+ * defined in: [PINS Inspector](pins-inspector-properties-group.md "pins-inspector.schema.json#/properties/group")
318
+
319
+ ### group Type
320
+
321
+ `string`
322
+
323
+ ## inspectorManager
324
+
325
+ Name of the Inspector's manager.
326
+
327
+ `inspectorManager`
328
+
329
+ * is required
330
+
331
+ * Type: `string`
332
+
333
+ * cannot be null
334
+
335
+ * defined in: [PINS Inspector](pins-inspector-properties-inspectormanager.md "pins-inspector.schema.json#/properties/inspectorManager")
336
+
337
+ ### inspectorManager Type
338
+
339
+ `string`
340
+
341
+ ## validFrom
342
+
343
+ Date the Inspector record was first recorded.
344
+
345
+ `validFrom`
346
+
347
+ * is optional
348
+
349
+ * Type: `string`
350
+
351
+ * can be null
352
+
353
+ * defined in: [PINS Inspector](pins-inspector-properties-validfrom.md "pins-inspector.schema.json#/properties/validFrom")
354
+
355
+ ### validFrom Type
356
+
357
+ `string`
358
+
359
+ ### validFrom Constraints
360
+
361
+ **date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification")
362
+
363
+ ### validFrom Examples
364
+
365
+ ```json
366
+ "2023-07-27T20:30:00.000Z"
367
+ ```
368
+
369
+ ## address
370
+
371
+
372
+
373
+ `address`
374
+
375
+ * is required
376
+
377
+ * Type: `object` ([Details](pins-inspector-properties-address.md))
378
+
379
+ * cannot be null
380
+
381
+ * defined in: [PINS Inspector](pins-inspector-properties-address.md "pins-inspector.schema.json#/properties/address")
382
+
383
+ ### address Type
384
+
385
+ `object` ([Details](pins-inspector-properties-address.md))
386
+
387
+ ## specialisms
388
+
389
+
390
+
391
+ `specialisms`
392
+
393
+ * is required
394
+
395
+ * Type: `object[]` ([Details](pins-inspector-defs-specialism.md))
396
+
397
+ * cannot be null
398
+
399
+ * defined in: [PINS Inspector](pins-inspector-properties-specialisms.md "pins-inspector.schema.json#/properties/specialisms")
400
+
401
+ ### specialisms Type
402
+
403
+ `object[]` ([Details](pins-inspector-defs-specialism.md))
404
+
182
405
  ## Additional Properties
183
406
 
184
407
  Additional properties are allowed and do not have to follow a specific schema
408
+
409
+ # PINS Inspector Definitions
410
+
411
+ ## Definitions group specialism
412
+
413
+ Reference this group by using
414
+
415
+ ```json
416
+ {"$ref":"pins-inspector.schema.json#/$defs/specialism"}
417
+ ```
418
+
419
+ | Property | Type | Required | Nullable | Defined by |
420
+ | :-------------------------- | :------- | :------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------- |
421
+ | [name](#name) | `string` | Required | cannot be null | [PINS Inspector](pins-inspector-defs-specialism-properties-name.md "pins-inspector.schema.json#/$defs/specialism/properties/name") |
422
+ | [proficiency](#proficiency) | `string` | Required | can be null | [PINS Inspector](pins-inspector-defs-specialism-properties-proficiency.md "pins-inspector.schema.json#/$defs/specialism/properties/proficiency") |
423
+ | [validFrom](#validfrom-1) | `string` | Required | can be null | [PINS Inspector](pins-inspector-defs-specialism-properties-validfrom.md "pins-inspector.schema.json#/$defs/specialism/properties/validFrom") |
424
+ | Additional Properties | Any | Optional | can be null | |
425
+
426
+ ### name
427
+
428
+ Working above band is stored as a specialism
429
+
430
+ `name`
431
+
432
+ * is required
433
+
434
+ * Type: `string`
435
+
436
+ * cannot be null
437
+
438
+ * defined in: [PINS Inspector](pins-inspector-defs-specialism-properties-name.md "pins-inspector.schema.json#/$defs/specialism/properties/name")
439
+
440
+ #### name Type
441
+
442
+ `string`
443
+
444
+ ### proficiency
445
+
446
+ trained or in-training
447
+
448
+ `proficiency`
449
+
450
+ * is required
451
+
452
+ * Type: `string`
453
+
454
+ * can be null
455
+
456
+ * defined in: [PINS Inspector](pins-inspector-defs-specialism-properties-proficiency.md "pins-inspector.schema.json#/$defs/specialism/properties/proficiency")
457
+
458
+ #### proficiency Type
459
+
460
+ `string`
461
+
462
+ ### validFrom
463
+
464
+ Date training started or date training was completed.
465
+
466
+ `validFrom`
467
+
468
+ * is required
469
+
470
+ * Type: `string`
471
+
472
+ * can be null
473
+
474
+ * defined in: [PINS Inspector](pins-inspector-defs-specialism-properties-validfrom.md "pins-inspector.schema.json#/$defs/specialism/properties/validFrom")
475
+
476
+ #### validFrom Type
477
+
478
+ `string`
479
+
480
+ #### validFrom Constraints
481
+
482
+ **date time**: the string must be a date time string, according to [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339 "check the specification")
483
+
484
+ #### validFrom Examples
485
+
486
+ ```json
487
+ "2023-07-27T20:30:00.000Z"
488
+ ```
489
+
490
+ ### Additional Properties
491
+
492
+ Additional properties are allowed and do not have to follow a specific schema
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planning-inspectorate/data-model",
3
- "version": "1.20.0",
3
+ "version": "1.22.0",
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: 2025-10-30T20:02:31+00:00
3
+ # timestamp: 2025-11-04T12:33:59+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: 2025-10-30T20:02:31+00:00
3
+ # timestamp: 2025-11-04T12:33:59+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: 2025-10-30T20:02:31+00:00
3
+ # timestamp: 2025-11-04T12:33:59+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: 2025-10-30T20:02:31+00:00
3
+ # timestamp: 2025-11-07T15:19:29+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -232,6 +232,38 @@ class TypeOfPlanningApplication(Enum):
232
232
  NoneType_None = None
233
233
 
234
234
 
235
+ class AdvertType(Enum):
236
+ field_4_6_Sheet_Non_Illuminated = "4-6 Sheet Non-Illuminated"
237
+ field_4_6_Sheet_Illuminated = "4-6 Sheet Illuminated"
238
+ field_12_16_32_Sheet_Non_Illuminated = "12/16/32 Sheet Non-Illuminated"
239
+ field_12_16_32_Sheet_Illuminated = "12/16/32 Sheet Illuminated"
240
+ field_48_64_96_Sheet_Non_Illuminated = "48/64/96 Sheet Non-Illuminated"
241
+ field_48_64_96_Sheet_Illuminated = "48/64/96 Sheet Illuminated"
242
+ Fascia_Projecting_Signs_Non_Illuminated = "Fascia Projecting Signs Non-Illuminated"
243
+ Fascia_Projecting_Signs_Illuminated = "Fascia Projecting Signs Illuminated"
244
+ Directional___Others_Non_Illuminated = "Directional & Others Non-Illuminated"
245
+ Directional___Others_Illuminated = "Directional & Others Illuminated"
246
+ Monolith_Totem_Signs_Non_Illuminated = "Monolith/Totem Signs Non-Illuminated"
247
+ Monolith_Totem_Signs_Illuminated = "Monolith/Totem Signs Illuminated"
248
+ Other = "Other"
249
+ NoneType_None = None
250
+
251
+
252
+ class AdvertDetail(BaseModel):
253
+ model_config = ConfigDict(
254
+ extra="allow",
255
+ )
256
+ advertType: AdvertType
257
+ isAdvertInPosition: bool | None = None
258
+ """
259
+ Is the advertisement in position?
260
+ """
261
+ isSiteOnHighwayLand: bool | None = None
262
+ """
263
+ Is the site on highway land?
264
+ """
265
+
266
+
235
267
  class AppealHasCase1(BaseModel):
236
268
  """
237
269
  Group A - Schema defining the metadata for an appeal
@@ -684,33 +716,47 @@ class AppealHasCase1(BaseModel):
684
716
  Indicates if the appellant has applied for costs
685
717
  """
686
718
  typeOfPlanningApplication: TypeOfPlanningApplication | None = None
687
- siteGridReferenceEasting: constr(pattern=r"^\d{6}$") | None = Field(
719
+ siteGridReferenceEasting: constr(pattern=r"^\d{6,7}$") = Field(
688
720
  ..., examples=["357144"]
689
721
  )
690
- siteGridReferenceNorthing: constr(pattern=r"^\d{6}$") | None = Field(
722
+ siteGridReferenceNorthing: constr(pattern=r"^\d{6,7}$") = Field(
691
723
  ..., examples=["400534"]
692
724
  )
693
725
  hasLandownersPermission: bool | None = None
694
726
  """
695
- Indicates if the appellant has land owners permission
727
+ Does the appellant have the landowners permission
696
728
  """
697
- isAdvertInPosition: bool | None = None
729
+ wasApplicationRefusedDueToHighwayOrTraffic: bool | None = None
730
+ """
731
+ Did the LPA refuse the application because of highway or traffic public safety?
732
+ """
733
+ didAppellantSubmitCompletePhotosAndPlans: bool | None = None
698
734
  """
699
- Indicates if the advert is already in position
735
+ Did the appellant submit complete photos and plans?
700
736
  """
701
737
  isSiteInAreaOfSpecialControlAdverts: bool | None = None
702
738
  """
703
- Indicates if the site is in an area of special control for adverts
739
+ Is the site in an area of special control of advertisements?
704
740
  """
705
- wasApplicationRefusedDueToHighwayOrTraffic: bool | None = None
741
+ advertDetails: list[AdvertDetail] | None = None
706
742
  """
707
- Indicates if the application was refused because of highway or traffic public safety?
743
+ A list of advertisements for the appeal
708
744
  """
709
- didAppellantSubmitCompletePhotosAndPlans: bool | None = None
745
+
746
+
747
+ class AdvertDetail1(BaseModel):
748
+ model_config = ConfigDict(
749
+ extra="allow",
750
+ )
751
+ advertType: AdvertType
752
+ isAdvertInPosition: bool | None = None
753
+ """
754
+ Is the advertisement in position?
710
755
  """
711
- Indicates if the appellant submitted complete and accurate photographs and plans
756
+ isSiteOnHighwayLand: bool | None = None
757
+ """
758
+ Is the site on highway land?
712
759
  """
713
- advertType: str | None = None
714
760
 
715
761
 
716
762
  class AppealHasCase2(BaseModel):
@@ -947,7 +993,7 @@ class AppealHasCase2(BaseModel):
947
993
  """
948
994
  The statutory deadline for submitting an appeal from the original LPA decision date
949
995
  """
950
- siteAddressLine1: str | None = Field(..., examples=["96 The Avenue"])
996
+ siteAddressLine1: str = Field(..., examples=["96 The Avenue"])
951
997
  """
952
998
  First line of address for the appeal site
953
999
  """
@@ -955,7 +1001,7 @@ class AppealHasCase2(BaseModel):
955
1001
  """
956
1002
  Second line of address for the appeal site
957
1003
  """
958
- siteAddressTown: str | None = Field(..., examples=["Maidstone"])
1004
+ siteAddressTown: str = Field(..., examples=["Maidstone"])
959
1005
  """
960
1006
  Town / City of the site address
961
1007
  """
@@ -963,7 +1009,7 @@ class AppealHasCase2(BaseModel):
963
1009
  """
964
1010
  County of the site address
965
1011
  """
966
- siteAddressPostcode: str | None = Field(..., examples=["MD21 5XY"])
1012
+ siteAddressPostcode: str = Field(..., examples=["MD21 5XY"])
967
1013
  """
968
1014
  Postal code of the site address
969
1015
  """
@@ -1165,33 +1211,32 @@ class AppealHasCase2(BaseModel):
1165
1211
  Indicates if the appellant has applied for costs
1166
1212
  """
1167
1213
  typeOfPlanningApplication: TypeOfPlanningApplication | None = None
1168
- siteGridReferenceEasting: constr(pattern=r"^\d{6}$") | None = Field(
1214
+ siteGridReferenceEasting: constr(pattern=r"^\d{6,7}$") | None = Field(
1169
1215
  None, examples=["357144"]
1170
1216
  )
1171
- siteGridReferenceNorthing: constr(pattern=r"^\d{6}$") | None = Field(
1217
+ siteGridReferenceNorthing: constr(pattern=r"^\d{6,7}$") | None = Field(
1172
1218
  None, examples=["400534"]
1173
1219
  )
1174
1220
  hasLandownersPermission: bool | None = None
1175
1221
  """
1176
- Indicates if the appellant has land owners permission
1222
+ Does the appellant have the landowners permission
1177
1223
  """
1178
- isAdvertInPosition: bool | None = None
1224
+ wasApplicationRefusedDueToHighwayOrTraffic: bool | None = None
1179
1225
  """
1180
- Indicates if the advert is already in position
1226
+ Did the LPA refuse the application because of highway or traffic public safety?
1181
1227
  """
1182
- isSiteInAreaOfSpecialControlAdverts: bool | None = None
1228
+ didAppellantSubmitCompletePhotosAndPlans: bool | None = None
1183
1229
  """
1184
- Indicates if the site is in an area of special control for adverts
1230
+ Did the appellant submit complete photos and plans?
1185
1231
  """
1186
- wasApplicationRefusedDueToHighwayOrTraffic: bool | None = None
1232
+ isSiteInAreaOfSpecialControlAdverts: bool | None = None
1187
1233
  """
1188
- Indicates if the application was refused because of highway or traffic public safety?
1234
+ Is the site in an area of special control of advertisements?
1189
1235
  """
1190
- didAppellantSubmitCompletePhotosAndPlans: bool | None = None
1236
+ advertDetails: list[AdvertDetail1] | None = None
1191
1237
  """
1192
- Indicates if the appellant submitted complete and accurate photographs and plans
1238
+ A list of advertisements for the appeal
1193
1239
  """
1194
- advertType: str | None = None
1195
1240
 
1196
1241
 
1197
1242
  class AppealHasCase(RootModel[AppealHasCase1 | AppealHasCase2]):
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: appeal-representation.schema.json
3
- # timestamp: 2025-10-30T20:02:31+00:00
3
+ # timestamp: 2025-11-04T12:33:59+00:00
4
4
 
5
5
  from __future__ import annotations
6
6