@planning-inspectorate/data-model 1.16.1 → 1.17.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.
@@ -1,13 +1,13 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: appeal-s78.schema.json
3
- # timestamp: 2025-08-29T10:40:44+00:00
3
+ # timestamp: 2025-09-09T11:38:22+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
7
  from enum import Enum
8
8
  from uuid import UUID
9
9
 
10
- from pydantic import AwareDatetime, BaseModel, ConfigDict, Field, RootModel
10
+ from pydantic import AwareDatetime, BaseModel, ConfigDict, Field, RootModel, constr
11
11
 
12
12
 
13
13
  class CaseStatus(Enum):
@@ -302,9 +302,9 @@ class DevelopmentType(Enum):
302
302
  NoneType_None = None
303
303
 
304
304
 
305
- class AppealS78Case(BaseModel):
305
+ class AppealS78Case1(BaseModel):
306
306
  """
307
- Schema defining the metadata for an appeal (S78)
307
+ Group B - Schema defining the metadata for an appeal
308
308
  """
309
309
 
310
310
  model_config = ConfigDict(
@@ -543,7 +543,7 @@ class AppealS78Case(BaseModel):
543
543
  """
544
544
  The statutory deadline for submitting an appeal from the original LPA decision date
545
545
  """
546
- siteAddressLine1: str = Field(..., examples=["96 The Avenue"])
546
+ siteAddressLine1: str | None = Field(None, examples=["96 The Avenue"])
547
547
  """
548
548
  First line of address for the appeal site
549
549
  """
@@ -551,15 +551,15 @@ class AppealS78Case(BaseModel):
551
551
  """
552
552
  Second line of address for the appeal site
553
553
  """
554
- siteAddressTown: str = Field(..., examples=["Maidstone"])
554
+ siteAddressTown: str | None = Field(None, examples=["Maidstone"])
555
555
  """
556
556
  Town / City of the site address
557
557
  """
558
- siteAddressCounty: str | None = Field(..., examples=["Kent"])
558
+ siteAddressCounty: str | None = Field(None, examples=["Kent"])
559
559
  """
560
560
  County of the site address
561
561
  """
562
- siteAddressPostcode: str = Field(..., examples=["MD21 5XY"])
562
+ siteAddressPostcode: str | None = Field(None, examples=["MD21 5XY"])
563
563
  """
564
564
  Postal code of the site address
565
565
  """
@@ -857,8 +857,595 @@ class AppealS78Case(BaseModel):
857
857
  """
858
858
  The net gain in residences of the proposed development
859
859
  """
860
- siteGridReferenceEasting: str | None = None
861
- siteGridReferenceNorthing: str | None = None
860
+ siteGridReferenceEasting: constr(pattern=r"^\d{6}$") | None = Field(
861
+ ..., examples=["357144"]
862
+ )
863
+ siteGridReferenceNorthing: constr(pattern=r"^\d{6}$") | None = Field(
864
+ ..., examples=["400534"]
865
+ )
866
+ siteViewableFromRoad: bool | None = None
867
+ siteWithinSSSI: bool | None = None
868
+ typeOfPlanningApplication: TypeOfPlanningApplication
869
+ developmentType: DevelopmentType
870
+ statementOfCommonGroundDueDate: AwareDatetime | None = Field(
871
+ None, examples=["2023-07-27T20:30:00.000Z"]
872
+ )
873
+ planningObligationDueDate: AwareDatetime | None = Field(
874
+ None, examples=["2023-07-27T20:30:00.000Z"]
875
+ )
876
+
877
+
878
+ class NotificationMethodEnum1EnumEnum(Enum):
879
+ notice = "notice"
880
+ letter = "letter"
881
+ advert = "advert"
882
+
883
+
884
+ class NotificationMethodEnum1(RootModel[NotificationMethodEnum1EnumEnum | None]):
885
+ root: NotificationMethodEnum1EnumEnum | None = None
886
+
887
+
888
+ class AppealS78Case2(BaseModel):
889
+ """
890
+ Group B - Schema defining the metadata for an appeal
891
+ """
892
+
893
+ model_config = ConfigDict(
894
+ extra="allow",
895
+ )
896
+ caseId: int | None = Field(..., examples=[1200])
897
+ """
898
+ Internal case identifier
899
+ """
900
+ caseReference: str = Field(..., examples=["7002471"])
901
+ """
902
+ External case identifier
903
+ """
904
+ submissionId: UUID | None = Field(
905
+ None, examples=["7f45748c-2342-4b59-b934-ad6183e8d834"]
906
+ )
907
+ """
908
+ Case submission id - link to draft submission created by appellant
909
+ """
910
+ caseStatus: CaseStatus
911
+ """
912
+ The processing status for the appeal
913
+ """
914
+ caseType: CaseType
915
+ """
916
+ The internal code for an appeal type, e.g. D (Householder)
917
+ """
918
+ caseProcedure: CaseProcedure
919
+ """
920
+ The type of procedure for the appeal
921
+ """
922
+ lpaCode: str = Field(..., examples=["Q9999"])
923
+ """
924
+ A unique identifier for the Local Planning Authority
925
+ """
926
+ caseOfficerId: str | None = None
927
+ """
928
+ Unique identifier for the case officer assigned to the case
929
+ """
930
+ inspectorId: str | None = None
931
+ """
932
+ Unique identifier for the inspector assigned to the case
933
+ """
934
+ allocationLevel: AllocationLevel
935
+ """
936
+ A level used for allocation purposes
937
+ """
938
+ allocationBand: AllocationBand
939
+ """
940
+ A band used for allocation purposes
941
+ """
942
+ caseSpecialisms: list[str] = Field(
943
+ ...,
944
+ examples=[
945
+ "Access",
946
+ "Listed building and enforcement",
947
+ "Roads and traffics",
948
+ "Natural heritage",
949
+ "Schedule 1",
950
+ ],
951
+ )
952
+ """
953
+ A list of specialisms for allocation purposes
954
+ """
955
+ caseSubmittedDate: AwareDatetime = Field(..., examples=["2023-07-27T20:30:00.000Z"])
956
+ """
957
+ The date the appeal was submitted by the appellant
958
+ """
959
+ caseCreatedDate: AwareDatetime = Field(..., examples=["2023-07-27T20:30:00.000Z"])
960
+ """
961
+ The date the appeal was received
962
+ """
963
+ caseUpdatedDate: AwareDatetime = Field(..., examples=["2023-07-27T20:30:00.000Z"])
964
+ """
965
+ The date the appeal was last updated in the back-office
966
+ """
967
+ caseValidDate: AwareDatetime | None = Field(
968
+ ..., examples=["2023-07-27T20:30:00.000Z"]
969
+ )
970
+ """
971
+ The date since when the appeal was considered valid
972
+ """
973
+ caseValidationDate: AwareDatetime | None = Field(
974
+ ..., examples=["2023-07-27T20:30:00.000Z"]
975
+ )
976
+ """
977
+ The date the appeal was validated in the back-office
978
+ """
979
+ caseValidationOutcome: CaseValidationOutcome
980
+ """
981
+ The outcome of the validation action
982
+ """
983
+ caseValidationInvalidDetails: list[str]
984
+ """
985
+ A list of reasons why the appeal is invalid
986
+ """
987
+ caseValidationIncompleteDetails: list[str]
988
+ """
989
+ A list of reasons why the appeal is incomplete
990
+ """
991
+ caseExtensionDate: AwareDatetime | None = Field(
992
+ ..., examples=["2023-07-27T20:30:00.000Z"]
993
+ )
994
+ """
995
+ When the validation outcome is incomplete, an extension may be granted to provide missing information
996
+ """
997
+ caseStartedDate: AwareDatetime | None = Field(
998
+ ..., examples=["2023-07-27T20:30:00.000Z"]
999
+ )
1000
+ """
1001
+ A date indicating when the case was started, resulting in the creation of a timetable
1002
+ """
1003
+ casePublishedDate: AwareDatetime | None = Field(
1004
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1005
+ )
1006
+ """
1007
+ A date indicating when the case was published
1008
+ """
1009
+ linkedCaseStatus: LinkedCaseStatus
1010
+ """
1011
+ Indicates if the case is linked, and the type of relationship
1012
+ """
1013
+ leadCaseReference: str | None = Field(..., examples=["7002471"])
1014
+ """
1015
+ The reference of the lead case, if the case is a child case
1016
+ """
1017
+ lpaQuestionnaireDueDate: AwareDatetime | None = Field(
1018
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1019
+ )
1020
+ """
1021
+ If the case is started and has a timetable, a deadline for the LPA to provide a response
1022
+ """
1023
+ lpaQuestionnaireSubmittedDate: AwareDatetime | None = Field(
1024
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1025
+ )
1026
+ """
1027
+ The date the LPA provided a response to the case
1028
+ """
1029
+ lpaQuestionnaireCreatedDate: AwareDatetime | None = Field(
1030
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1031
+ )
1032
+ """
1033
+ The date the LPA response was receeived
1034
+ """
1035
+ lpaQuestionnairePublishedDate: AwareDatetime | None = Field(
1036
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1037
+ )
1038
+ """
1039
+ The date indicating when the questionnaire review was completed and the questionnaire published
1040
+ """
1041
+ lpaQuestionnaireValidationOutcome: LpaQuestionnaireValidationOutcome
1042
+ """
1043
+ The outcome of the validation action
1044
+ """
1045
+ lpaQuestionnaireValidationOutcomeDate: AwareDatetime | None = Field(
1046
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1047
+ )
1048
+ """
1049
+ The date the LPA response was validated
1050
+ """
1051
+ lpaQuestionnaireValidationDetails: list[str]
1052
+ """
1053
+ A list of reasons why the questionnaire is incomplete
1054
+ """
1055
+ lpaStatement: str | None = Field(
1056
+ ..., examples=["We refused the application because of ..."]
1057
+ )
1058
+ """
1059
+ A statement provided by the LPA
1060
+ """
1061
+ caseWithdrawnDate: AwareDatetime | None = Field(
1062
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1063
+ )
1064
+ """
1065
+ The date the appeal was withdrawn by the appellant
1066
+ """
1067
+ caseTransferredDate: AwareDatetime | None = Field(
1068
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1069
+ )
1070
+ """
1071
+ The date the appeal was transferred to a new case of a different type
1072
+ """
1073
+ transferredCaseClosedDate: AwareDatetime | None = Field(
1074
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1075
+ )
1076
+ """
1077
+ The date the appeal was closed and the appellant requested to resubmit
1078
+ """
1079
+ caseDecisionOutcomeDate: AwareDatetime | None = Field(
1080
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1081
+ )
1082
+ """
1083
+ The date of the appeal decision
1084
+ """
1085
+ caseDecisionPublishedDate: AwareDatetime | None = Field(
1086
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1087
+ )
1088
+ """
1089
+ The date the appeal decision was published
1090
+ """
1091
+ caseDecisionOutcome: CaseDecisionOutcome
1092
+ """
1093
+ The final outcome for the decision
1094
+ """
1095
+ caseCompletedDate: AwareDatetime | None = Field(
1096
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1097
+ )
1098
+ """
1099
+ The date the appeal decision letter
1100
+ """
1101
+ enforcementNotice: bool | None = None
1102
+ """
1103
+ Indicates if an enforcement notice is the reason for the appeal
1104
+ """
1105
+ applicationReference: str = Field(..., examples=["43010/APP/1/290572"])
1106
+ """
1107
+ The unique identifier of the LPA application
1108
+ """
1109
+ applicationDate: AwareDatetime = Field(..., examples=["2023-07-27T20:30:00.000Z"])
1110
+ """
1111
+ The date of the original LPA application
1112
+ """
1113
+ applicationDecision: ApplicationDecision
1114
+ """
1115
+ The outcome of the original LPA decision
1116
+ """
1117
+ applicationDecisionDate: AwareDatetime | None = Field(
1118
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1119
+ )
1120
+ """
1121
+ The date of the original LPA decision
1122
+ """
1123
+ caseSubmissionDueDate: AwareDatetime | None = Field(
1124
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1125
+ )
1126
+ """
1127
+ The statutory deadline for submitting an appeal from the original LPA decision date
1128
+ """
1129
+ siteAddressLine1: str | None = Field(..., examples=["96 The Avenue"])
1130
+ """
1131
+ First line of address for the appeal site
1132
+ """
1133
+ siteAddressLine2: str | None = None
1134
+ """
1135
+ Second line of address for the appeal site
1136
+ """
1137
+ siteAddressTown: str | None = Field(..., examples=["Maidstone"])
1138
+ """
1139
+ Town / City of the site address
1140
+ """
1141
+ siteAddressCounty: str | None = Field(None, examples=["Kent"])
1142
+ """
1143
+ County of the site address
1144
+ """
1145
+ siteAddressPostcode: str | None = Field(..., examples=["MD21 5XY"])
1146
+ """
1147
+ Postal code of the site address
1148
+ """
1149
+ siteAccessDetails: list[str]
1150
+ """
1151
+ Provided information on site accessibility
1152
+ """
1153
+ siteSafetyDetails: list[str]
1154
+ """
1155
+ Provided information on site health and safety
1156
+ """
1157
+ siteAreaSquareMetres: float | None = Field(..., examples=[45.7])
1158
+ """
1159
+ The site area, in square meters
1160
+ """
1161
+ floorSpaceSquareMetres: float | None = Field(..., examples=[3.5])
1162
+ """
1163
+ The floor space, in square meters
1164
+ """
1165
+ isCorrectAppealType: bool | None = None
1166
+ """
1167
+ Indicates if the LPA considers the appeal type appropriate
1168
+ """
1169
+ isGreenBelt: bool | None = None
1170
+ """
1171
+ Indicates if the site is in a green belt
1172
+ """
1173
+ inConservationArea: bool | None = None
1174
+ """
1175
+ Indicates if the site is in a conservation area
1176
+ """
1177
+ ownsAllLand: bool | None = None
1178
+ """
1179
+ Indicates if the appellant has complete ownership of the site
1180
+ """
1181
+ ownsSomeLand: bool | None = None
1182
+ """
1183
+ Indicates if the appellant has partial ownership of the site
1184
+ """
1185
+ knowsOtherOwners: KnowsOtherOwners
1186
+ """
1187
+ Indicates if the appellant knows other owners of the site
1188
+ """
1189
+ knowsAllOwners: KnowsAllOwners
1190
+ """
1191
+ Indicates if the appellant knows all owners of the site
1192
+ """
1193
+ advertisedAppeal: bool | None = None
1194
+ """
1195
+ Indicates if the appellant has advertised the appeal to the LPA decision
1196
+ """
1197
+ notificationMethod: list[NotificationMethodEnum1]
1198
+ """
1199
+ The methods used to notify relevant parties
1200
+ """
1201
+ ownersInformed: bool | None = None
1202
+ """
1203
+ Indicates if the appellant has informed other owners of the site
1204
+ """
1205
+ originalDevelopmentDescription: str | None = Field(
1206
+ ..., examples=["Replacement of an existing gate to access the property"]
1207
+ )
1208
+ """
1209
+ The original description of the development, as provided by the appellant
1210
+ """
1211
+ changedDevelopmentDescription: bool | None = None
1212
+ """
1213
+ Indicates that the LPA has changed the development description
1214
+ """
1215
+ newConditionDetails: str | None = Field(
1216
+ ...,
1217
+ examples=["Since the original application, a number of things have changed..."],
1218
+ )
1219
+ """
1220
+ New conditions details provided by the LPA
1221
+ """
1222
+ nearbyCaseReferences: list[str]
1223
+ """
1224
+ A list of related case references known to the appellant and the LPA
1225
+ """
1226
+ neighbouringSiteAddresses: list[NeighbouringSiteAddress]
1227
+ """
1228
+ A list of neighbouring site addresses
1229
+ """
1230
+ reasonForNeighbourVisits: str | None = None
1231
+ """
1232
+ A general reason given for the need to visit any neighbours
1233
+ """
1234
+ affectedListedBuildingNumbers: list[str]
1235
+ """
1236
+ A list of affected listed building IDs from Historic England
1237
+ """
1238
+ changedListedBuildingNumbers: list[str]
1239
+ """
1240
+ A list of changed listed building IDs from Historic England
1241
+ """
1242
+ preserveGrantLoan: bool | None = None
1243
+ """
1244
+ A grant or loan has been made to preserve the listed building
1245
+ """
1246
+ consultHistoricEngland: bool | None = None
1247
+ """
1248
+ Are Historic England to be consulted?
1249
+ """
1250
+ appellantCostsAppliedFor: bool | None = None
1251
+ """
1252
+ Indicates if the appellant has applied for costs
1253
+ """
1254
+ lpaCostsAppliedFor: bool | None = None
1255
+ """
1256
+ Indicates if the appellant has applied for costs
1257
+ """
1258
+ agriculturalHolding: bool | None = None
1259
+ """
1260
+ Indicates if the site is an agricultural holding
1261
+ """
1262
+ tenantAgriculturalHolding: bool | None = None
1263
+ """
1264
+ Indicates if the site is a tenant agricultural holding
1265
+ """
1266
+ otherTenantsAgriculturalHolding: bool | None = None
1267
+ """
1268
+ Indicates if the site is an agricultural holding with other tenants
1269
+ """
1270
+ informedTenantsAgriculturalHolding: bool | None = None
1271
+ """
1272
+ If the site is an agricultural holding, indicates tenants are informed
1273
+ """
1274
+ appellantProcedurePreference: AppellantProcedurePreference
1275
+ """
1276
+ The procedure preference indicated by the appellant
1277
+ """
1278
+ appellantProcedurePreferenceDetails: str | None = None
1279
+ """
1280
+ The procedure details preference indicated by the appellant
1281
+ """
1282
+ appellantProcedurePreferenceDuration: float | None = None
1283
+ """
1284
+ The duration of the procedure indicated by the appellant
1285
+ """
1286
+ appellantProcedurePreferenceWitnessCount: float | None = None
1287
+ """
1288
+ The number of witnesses appellant has suggested for inquiries preference
1289
+ """
1290
+ statusPlanningObligation: str | None = None
1291
+ """
1292
+ The planning obligation information, if available
1293
+ """
1294
+ affectsScheduledMonument: bool | None = None
1295
+ """
1296
+ Indicates that a scheduled monument is affected
1297
+ """
1298
+ hasProtectedSpecies: bool | None = None
1299
+ """
1300
+ Indicates the existence of protected species
1301
+ """
1302
+ isAonbNationalLandscape: bool | None = None
1303
+ """
1304
+ Indicates an area of outstanding beauty (National Landscape)
1305
+ """
1306
+ designatedSitesNames: list[str]
1307
+ """
1308
+ The designated site names
1309
+ """
1310
+ isGypsyOrTravellerSite: bool | None = None
1311
+ """
1312
+ Indicates a traveller site
1313
+ """
1314
+ isPublicRightOfWay: bool | None = None
1315
+ """
1316
+ Indicates a PROW (public right of way)
1317
+ """
1318
+ eiaEnvironmentalImpactSchedule: EiaEnvironmentalImpactSchedule
1319
+ """
1320
+ The impact schedule from EIA
1321
+ """
1322
+ eiaDevelopmentDescription: EiaDevelopmentDescription
1323
+ """
1324
+ The development description from EIA
1325
+ """
1326
+ eiaSensitiveAreaDetails: str | None = None
1327
+ """
1328
+ The sensitive area details from EIA
1329
+ """
1330
+ eiaColumnTwoThreshold: bool | None = None
1331
+ """
1332
+ EIA specific threshold
1333
+ """
1334
+ eiaScreeningOpinion: bool | None = None
1335
+ """
1336
+ EIA screening opinion
1337
+ """
1338
+ eiaRequiresEnvironmentalStatement: bool | None = None
1339
+ """
1340
+ EIA environmental statement required
1341
+ """
1342
+ eiaCompletedEnvironmentalStatement: bool | None = None
1343
+ """
1344
+ EIA completed environmental statement required
1345
+ """
1346
+ hasStatutoryConsultees: bool | None = None
1347
+ """
1348
+ Indicates statutory consultees
1349
+ """
1350
+ consultedBodiesDetails: str | None = None
1351
+ """
1352
+ The details of the bodies consulted
1353
+ """
1354
+ hasInfrastructureLevy: bool | None = None
1355
+ """
1356
+ Indicates the existence of an infrastructure levy
1357
+ """
1358
+ isInfrastructureLevyFormallyAdopted: bool | None = None
1359
+ """
1360
+ Indicates if the infrastructure levy is formally adopted
1361
+ """
1362
+ infrastructureLevyAdoptedDate: AwareDatetime | None = Field(
1363
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1364
+ )
1365
+ """
1366
+ The date of the infrastructure levy adoption
1367
+ """
1368
+ infrastructureLevyExpectedDate: AwareDatetime | None = Field(
1369
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1370
+ )
1371
+ """
1372
+ The expected date of the infrastructure levy
1373
+ """
1374
+ lpaProcedurePreference: LpaProcedurePreference
1375
+ """
1376
+ The procedure preference indicated by the LPA
1377
+ """
1378
+ lpaProcedurePreferenceDetails: str | None = None
1379
+ """
1380
+ The procedure details preference indicated by the LPA
1381
+ """
1382
+ lpaProcedurePreferenceDuration: float | None = None
1383
+ """
1384
+ The duration of enquiry indicated by the LPA
1385
+ """
1386
+ caseworkReason: str | None = None
1387
+ importantInformation: str | None = None
1388
+ jurisdiction: str | None = None
1389
+ redeterminedIndicator: str | None = None
1390
+ dateCostsReportDespatched: AwareDatetime | None = Field(
1391
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1392
+ )
1393
+ """
1394
+ The date of the cost report
1395
+ """
1396
+ dateNotRecoveredOrDerecovered: AwareDatetime | None = Field(
1397
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1398
+ )
1399
+ dateRecovered: AwareDatetime | None = Field(
1400
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1401
+ )
1402
+ originalCaseDecisionDate: AwareDatetime | None = Field(
1403
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1404
+ )
1405
+ targetDate: AwareDatetime | None = Field(..., examples=["2023-07-27T20:30:00.000Z"])
1406
+ appellantCommentsSubmittedDate: AwareDatetime | None = Field(
1407
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1408
+ )
1409
+ appellantStatementSubmittedDate: AwareDatetime | None = Field(
1410
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1411
+ )
1412
+ appellantProofsSubmittedDate: AwareDatetime | None = Field(
1413
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1414
+ )
1415
+ finalCommentsDueDate: AwareDatetime | None = Field(
1416
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1417
+ )
1418
+ interestedPartyRepsDueDate: AwareDatetime | None = Field(
1419
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1420
+ )
1421
+ lpaCommentsSubmittedDate: AwareDatetime | None = Field(
1422
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1423
+ )
1424
+ lpaProofsSubmittedDate: AwareDatetime | None = Field(
1425
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1426
+ )
1427
+ lpaStatementSubmittedDate: AwareDatetime | None = Field(
1428
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1429
+ )
1430
+ proofsOfEvidenceDueDate: AwareDatetime | None = Field(
1431
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1432
+ )
1433
+ siteNoticesSentDate: AwareDatetime | None = Field(
1434
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1435
+ )
1436
+ statementDueDate: AwareDatetime | None = Field(
1437
+ ..., examples=["2023-07-27T20:30:00.000Z"]
1438
+ )
1439
+ numberOfResidencesNetChange: float | None = None
1440
+ """
1441
+ The net gain in residences of the proposed development
1442
+ """
1443
+ siteGridReferenceEasting: constr(pattern=r"^\d{6}$") | None = Field(
1444
+ None, examples=["357144"]
1445
+ )
1446
+ siteGridReferenceNorthing: constr(pattern=r"^\d{6}$") | None = Field(
1447
+ None, examples=["400534"]
1448
+ )
862
1449
  siteViewableFromRoad: bool | None = None
863
1450
  siteWithinSSSI: bool | None = None
864
1451
  typeOfPlanningApplication: TypeOfPlanningApplication
@@ -869,3 +1456,10 @@ class AppealS78Case(BaseModel):
869
1456
  planningObligationDueDate: AwareDatetime | None = Field(
870
1457
  None, examples=["2023-07-27T20:30:00.000Z"]
871
1458
  )
1459
+
1460
+
1461
+ class AppealS78Case(RootModel[AppealS78Case1 | AppealS78Case2]):
1462
+ root: AppealS78Case1 | AppealS78Case2 = Field(..., title="Appeal S78 Case")
1463
+ """
1464
+ Group B - Schema defining the metadata for an appeal
1465
+ """