@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-has.schema.json
3
- # timestamp: 2025-08-29T10:40:44+00:00
3
+ # timestamp: 2025-09-09T11:38:23+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):
@@ -142,6 +142,17 @@ class ApplicationDecision(Enum):
142
142
  not_received = "not_received"
143
143
 
144
144
 
145
+ class LpaProcedurePreference(Enum):
146
+ """
147
+ The procedure preference indicated by the LPA
148
+ """
149
+
150
+ written = "written"
151
+ hearing = "hearing"
152
+ inquiry = "inquiry"
153
+ NoneType_None = None
154
+
155
+
145
156
  class KnowsOtherOwners(Enum):
146
157
  """
147
158
  Indicates if the appellant knows other owners of the site
@@ -225,9 +236,9 @@ class TypeOfPlanningApplication(Enum):
225
236
  NoneType_None = None
226
237
 
227
238
 
228
- class AppealHasCase(BaseModel):
239
+ class AppealHasCase1(BaseModel):
229
240
  """
230
- Schema defining the metadata for an appeal
241
+ Group A - Schema defining the metadata for an appeal
231
242
  """
232
243
 
233
244
  model_config = ConfigDict(
@@ -466,7 +477,7 @@ class AppealHasCase(BaseModel):
466
477
  """
467
478
  The statutory deadline for submitting an appeal from the original LPA decision date
468
479
  """
469
- siteAddressLine1: str = Field(..., examples=["96 The Avenue"])
480
+ siteAddressLine1: str | None = Field(None, examples=["96 The Avenue"])
470
481
  """
471
482
  First line of address for the appeal site
472
483
  """
@@ -474,15 +485,15 @@ class AppealHasCase(BaseModel):
474
485
  """
475
486
  Second line of address for the appeal site
476
487
  """
477
- siteAddressTown: str = Field(..., examples=["Maidstone"])
488
+ siteAddressTown: str | None = Field(None, examples=["Maidstone"])
478
489
  """
479
490
  Town / City of the site address
480
491
  """
481
- siteAddressCounty: str | None = Field(..., examples=["Kent"])
492
+ siteAddressCounty: str | None = Field(None, examples=["Kent"])
482
493
  """
483
494
  County of the site address
484
495
  """
485
- siteAddressPostcode: str = Field(..., examples=["MD21 5XY"])
496
+ siteAddressPostcode: str | None = Field(None, examples=["MD21 5XY"])
486
497
  """
487
498
  Postal code of the site address
488
499
  """
@@ -514,6 +525,104 @@ class AppealHasCase(BaseModel):
514
525
  """
515
526
  Indicates if the site is in a conservation area
516
527
  """
528
+ affectsScheduledMonument: bool | None = None
529
+ """
530
+ Indicates if the development affects a scheduled monument
531
+ """
532
+ hasProtectedSpecies: bool | None = None
533
+ """
534
+ Indicates if the site hosts protected species
535
+ """
536
+ isAonbNationalLandscape: bool | None = None
537
+ """
538
+ Indicates an area of outstanding beauty (National Landscape)
539
+ """
540
+ isSiteOnHighwayLand: bool | None = None
541
+ """
542
+ Indicates if site is on highway land
543
+ """
544
+ designatedSitesNames: list[str] | None = None
545
+ """
546
+ The designated site names
547
+ """
548
+ hasInfrastructureLevy: bool | None = None
549
+ """
550
+ Indicates the existence of an infrastructure levy
551
+ """
552
+ isInfrastructureLevyFormallyAdopted: bool | None = None
553
+ """
554
+ Indicates if the infrastructure levy is formally adopted
555
+ """
556
+ infrastructureLevyAdoptedDate: AwareDatetime | None = Field(
557
+ None, examples=["2023-07-27T20:30:00.000Z"]
558
+ )
559
+ """
560
+ The date of the infrastructure levy adoption
561
+ """
562
+ infrastructureLevyExpectedDate: AwareDatetime | None = Field(
563
+ None, examples=["2023-07-27T20:30:00.000Z"]
564
+ )
565
+ """
566
+ The expected date of the infrastructure levy
567
+ """
568
+ lpaProcedurePreference: LpaProcedurePreference | None = None
569
+ """
570
+ The procedure preference indicated by the LPA
571
+ """
572
+ lpaProcedurePreferenceDetails: str | None = None
573
+ """
574
+ The procedure details preference indicated by the LPA
575
+ """
576
+ lpaProcedurePreferenceDuration: float | None = None
577
+ """
578
+ The duration of enquiry indicated by the LPA
579
+ """
580
+ caseworkReason: str | None = None
581
+ """
582
+ TBC
583
+ """
584
+ importantInformation: str | None = None
585
+ """
586
+ Information relevant to case...
587
+ """
588
+ jurisdiction: str | None = None
589
+ """
590
+ Under whose jurisdiction the decision falls
591
+ """
592
+ redeterminedIndicator: bool | None = None
593
+ """
594
+ Has the case been selected for redetermination
595
+ """
596
+ dateCostsReportDespatched: AwareDatetime | None = Field(
597
+ None, examples=["2023-07-27T20:30:00.000Z"]
598
+ )
599
+ """
600
+ The date that the costs report was sent
601
+ """
602
+ dateNotRecoveredOrDerecovered: AwareDatetime | None = Field(
603
+ None, examples=["2023-07-27T20:30:00.000Z"]
604
+ )
605
+ """
606
+ The date that is TBC
607
+ """
608
+ dateRecovered: AwareDatetime | None = Field(
609
+ None, examples=["2023-07-27T20:30:00.000Z"]
610
+ )
611
+ """
612
+ The date that case was recovered
613
+ """
614
+ originalCaseDecisionDate: AwareDatetime | None = Field(
615
+ None, examples=["2023-07-27T20:30:00.000Z"]
616
+ )
617
+ """
618
+ The original case decision date
619
+ """
620
+ targetDate: AwareDatetime | None = Field(
621
+ None, examples=["2023-07-27T20:30:00.000Z"]
622
+ )
623
+ """
624
+ The target date for case completion
625
+ """
517
626
  ownsAllLand: bool | None = None
518
627
  """
519
628
  Indicates if the appellant has complete ownership of the site
@@ -584,3 +693,533 @@ class AppealHasCase(BaseModel):
584
693
  Indicates if the appellant has applied for costs
585
694
  """
586
695
  typeOfPlanningApplication: TypeOfPlanningApplication | None = None
696
+ siteGridReferenceEasting: constr(pattern=r"^\d{6}$") | None = Field(
697
+ ..., examples=["357144"]
698
+ )
699
+ siteGridReferenceNorthing: constr(pattern=r"^\d{6}$") | None = Field(
700
+ ..., examples=["400534"]
701
+ )
702
+ hasLandownersPermission: bool | None = None
703
+ """
704
+ Indicates if the appellant has land owners permission
705
+ """
706
+ isAdvertInPosition: bool | None = None
707
+ """
708
+ Indicates if the advert is already in position
709
+ """
710
+ isSiteInAreaOfSpecialControlAdverts: bool | None = None
711
+ """
712
+ Indicates if the site is in an area of special control for adverts
713
+ """
714
+ wasApplicationRefusedDueToHighwayOrTraffic: bool | None = None
715
+ """
716
+ Indicates if the application was refused because of highway or traffic public safety?
717
+ """
718
+ didAppellantSubmitCompletePhotosAndPlans: bool | None = None
719
+ """
720
+ Indicates if the appellant submitted complete and accurate photographs and plans
721
+ """
722
+ advertType: str | None = None
723
+
724
+
725
+ class NotificationMethodEnum1EnumEnum(Enum):
726
+ notice = "notice"
727
+ letter = "letter"
728
+ advert = "advert"
729
+
730
+
731
+ class NotificationMethodEnum1(RootModel[NotificationMethodEnum1EnumEnum | None]):
732
+ root: NotificationMethodEnum1EnumEnum | None = None
733
+
734
+
735
+ class AppealHasCase2(BaseModel):
736
+ """
737
+ Group A - Schema defining the metadata for an appeal
738
+ """
739
+
740
+ model_config = ConfigDict(
741
+ extra="allow",
742
+ )
743
+ caseId: int | None = Field(..., examples=[1200])
744
+ """
745
+ Internal case identifier
746
+ """
747
+ caseReference: str = Field(..., examples=["7002471"])
748
+ """
749
+ External case identifier
750
+ """
751
+ submissionId: UUID | None = Field(
752
+ None, examples=["7f45748c-2342-4b59-b934-ad6183e8d834"]
753
+ )
754
+ """
755
+ Case submission id - link to draft submission created by appellant
756
+ """
757
+ caseStatus: CaseStatus
758
+ """
759
+ The processing status for the appeal
760
+ """
761
+ caseType: CaseType
762
+ """
763
+ The internal code for an appeal type, e.g. D (Householder)
764
+ """
765
+ caseProcedure: CaseProcedure
766
+ """
767
+ The type of procedure for the appeal
768
+ """
769
+ lpaCode: str = Field(..., examples=["Q9999"])
770
+ """
771
+ A unique identifier for the Local Planning Authority
772
+ """
773
+ caseOfficerId: str | None = None
774
+ """
775
+ Unique identifier for the case officer assigned to the case
776
+ """
777
+ inspectorId: str | None = None
778
+ """
779
+ Unique identifier for the inspector assigned to the case
780
+ """
781
+ allocationLevel: AllocationLevel
782
+ """
783
+ A level used for allocation purposes
784
+ """
785
+ allocationBand: AllocationBand
786
+ """
787
+ A band used for allocation purposes
788
+ """
789
+ caseSpecialisms: list[str] = Field(
790
+ ...,
791
+ examples=[
792
+ "Access",
793
+ "Listed building and enforcement",
794
+ "Roads and traffics",
795
+ "Natural heritage",
796
+ "Schedule 1",
797
+ ],
798
+ )
799
+ """
800
+ A list of specialisms for allocation purposes
801
+ """
802
+ caseSubmittedDate: AwareDatetime = Field(..., examples=["2023-07-27T20:30:00.000Z"])
803
+ """
804
+ The date the appeal was submitted by the appellant
805
+ """
806
+ caseCreatedDate: AwareDatetime = Field(..., examples=["2023-07-27T20:30:00.000Z"])
807
+ """
808
+ The date the appeal was received
809
+ """
810
+ caseUpdatedDate: AwareDatetime = Field(..., examples=["2023-07-27T20:30:00.000Z"])
811
+ """
812
+ The date the appeal was last updated in the back-office
813
+ """
814
+ caseValidDate: AwareDatetime | None = Field(
815
+ ..., examples=["2023-07-27T20:30:00.000Z"]
816
+ )
817
+ """
818
+ The date since when the appeal was considered valid
819
+ """
820
+ caseValidationDate: AwareDatetime | None = Field(
821
+ ..., examples=["2023-07-27T20:30:00.000Z"]
822
+ )
823
+ """
824
+ The date the appeal was validated in the back-office
825
+ """
826
+ caseValidationOutcome: CaseValidationOutcome
827
+ """
828
+ The outcome of the validation action
829
+ """
830
+ caseValidationInvalidDetails: list[str]
831
+ """
832
+ A list of reasons why the appeal is invalid
833
+ """
834
+ caseValidationIncompleteDetails: list[str]
835
+ """
836
+ A list of reasons why the appeal is incomplete
837
+ """
838
+ caseExtensionDate: AwareDatetime | None = Field(
839
+ ..., examples=["2023-07-27T20:30:00.000Z"]
840
+ )
841
+ """
842
+ When the validation outcome is incomplete, an extension may be granted to provide missing information
843
+ """
844
+ caseStartedDate: AwareDatetime | None = Field(
845
+ ..., examples=["2023-07-27T20:30:00.000Z"]
846
+ )
847
+ """
848
+ A date indicating when the case was started, resulting in the creation of a timetable
849
+ """
850
+ casePublishedDate: AwareDatetime | None = Field(
851
+ ..., examples=["2023-07-27T20:30:00.000Z"]
852
+ )
853
+ """
854
+ A date indicating when the case was published
855
+ """
856
+ linkedCaseStatus: LinkedCaseStatus
857
+ """
858
+ Indicates if the case is linked, and the type of relationship
859
+ """
860
+ leadCaseReference: str | None = Field(..., examples=["7002471"])
861
+ """
862
+ The reference of the lead case, if the case is a child case
863
+ """
864
+ lpaQuestionnaireDueDate: AwareDatetime | None = Field(
865
+ ..., examples=["2023-07-27T20:30:00.000Z"]
866
+ )
867
+ """
868
+ If the case is started and has a timetable, a deadline for the LPA to provide a response
869
+ """
870
+ lpaQuestionnaireSubmittedDate: AwareDatetime | None = Field(
871
+ ..., examples=["2023-07-27T20:30:00.000Z"]
872
+ )
873
+ """
874
+ The date the LPA provided a response to the case
875
+ """
876
+ lpaQuestionnaireCreatedDate: AwareDatetime | None = Field(
877
+ ..., examples=["2023-07-27T20:30:00.000Z"]
878
+ )
879
+ """
880
+ The date the LPA response was receeived
881
+ """
882
+ lpaQuestionnairePublishedDate: AwareDatetime | None = Field(
883
+ ..., examples=["2023-07-27T20:30:00.000Z"]
884
+ )
885
+ """
886
+ The date indicating when the questionnaire review was completed and the questionnaire published
887
+ """
888
+ lpaQuestionnaireValidationOutcome: LpaQuestionnaireValidationOutcome
889
+ """
890
+ The outcome of the validation action
891
+ """
892
+ lpaQuestionnaireValidationOutcomeDate: AwareDatetime | None = Field(
893
+ ..., examples=["2023-07-27T20:30:00.000Z"]
894
+ )
895
+ """
896
+ The date the LPA response was validated
897
+ """
898
+ lpaQuestionnaireValidationDetails: list[str]
899
+ """
900
+ A list of reasons why the questionnaire is incomplete
901
+ """
902
+ lpaStatement: str | None = Field(
903
+ ..., examples=["We refused the application because of ..."]
904
+ )
905
+ """
906
+ A statement provided by the LPA
907
+ """
908
+ caseWithdrawnDate: AwareDatetime | None = Field(
909
+ ..., examples=["2023-07-27T20:30:00.000Z"]
910
+ )
911
+ """
912
+ The date the appeal was withdrawn by the appellant
913
+ """
914
+ caseTransferredDate: AwareDatetime | None = Field(
915
+ ..., examples=["2023-07-27T20:30:00.000Z"]
916
+ )
917
+ """
918
+ The date the appeal was transferred to a new case of a different type
919
+ """
920
+ transferredCaseClosedDate: AwareDatetime | None = Field(
921
+ ..., examples=["2023-07-27T20:30:00.000Z"]
922
+ )
923
+ """
924
+ The date the appeal was closed and the appellant requested to resubmit
925
+ """
926
+ caseDecisionOutcomeDate: AwareDatetime | None = Field(
927
+ ..., examples=["2023-07-27T20:30:00.000Z"]
928
+ )
929
+ """
930
+ The date of the appeal decision
931
+ """
932
+ caseDecisionPublishedDate: AwareDatetime | None = Field(
933
+ ..., examples=["2023-07-27T20:30:00.000Z"]
934
+ )
935
+ """
936
+ The date the appeal decision was published
937
+ """
938
+ caseDecisionOutcome: CaseDecisionOutcome
939
+ """
940
+ The final outcome for the decision
941
+ """
942
+ caseCompletedDate: AwareDatetime | None = Field(
943
+ ..., examples=["2023-07-27T20:30:00.000Z"]
944
+ )
945
+ """
946
+ The date the appeal decision letter
947
+ """
948
+ enforcementNotice: bool | None = None
949
+ """
950
+ Indicates if an enforcement notice is the reason for the appeal
951
+ """
952
+ applicationReference: str = Field(..., examples=["43010/APP/1/290572"])
953
+ """
954
+ The unique identifier of the LPA application
955
+ """
956
+ applicationDate: AwareDatetime = Field(..., examples=["2023-07-27T20:30:00.000Z"])
957
+ """
958
+ The date of the original LPA application
959
+ """
960
+ applicationDecision: ApplicationDecision
961
+ """
962
+ The outcome of the original LPA decision
963
+ """
964
+ applicationDecisionDate: AwareDatetime | None = Field(
965
+ ..., examples=["2023-07-27T20:30:00.000Z"]
966
+ )
967
+ """
968
+ The date of the original LPA decision
969
+ """
970
+ caseSubmissionDueDate: AwareDatetime | None = Field(
971
+ ..., examples=["2023-07-27T20:30:00.000Z"]
972
+ )
973
+ """
974
+ The statutory deadline for submitting an appeal from the original LPA decision date
975
+ """
976
+ siteAddressLine1: str | None = Field(..., examples=["96 The Avenue"])
977
+ """
978
+ First line of address for the appeal site
979
+ """
980
+ siteAddressLine2: str | None = None
981
+ """
982
+ Second line of address for the appeal site
983
+ """
984
+ siteAddressTown: str | None = Field(..., examples=["Maidstone"])
985
+ """
986
+ Town / City of the site address
987
+ """
988
+ siteAddressCounty: str | None = Field(None, examples=["Kent"])
989
+ """
990
+ County of the site address
991
+ """
992
+ siteAddressPostcode: str | None = Field(..., examples=["MD21 5XY"])
993
+ """
994
+ Postal code of the site address
995
+ """
996
+ siteAccessDetails: list[str]
997
+ """
998
+ Provided information on site accessibility
999
+ """
1000
+ siteSafetyDetails: list[str]
1001
+ """
1002
+ Provided information on site health and safety
1003
+ """
1004
+ siteAreaSquareMetres: float | None = Field(..., examples=[45.7])
1005
+ """
1006
+ The site area, in square meters
1007
+ """
1008
+ floorSpaceSquareMetres: float | None = Field(..., examples=[3.5])
1009
+ """
1010
+ The floor space, in square meters
1011
+ """
1012
+ isCorrectAppealType: bool | None = None
1013
+ """
1014
+ Indicates if the LPA considers the appeal type appropriate
1015
+ """
1016
+ isGreenBelt: bool | None = None
1017
+ """
1018
+ Indicates if the site is in a green belt
1019
+ """
1020
+ inConservationArea: bool | None = None
1021
+ """
1022
+ Indicates if the site is in a conservation area
1023
+ """
1024
+ affectsScheduledMonument: bool | None = None
1025
+ """
1026
+ Indicates if the development affects a scheduled monument
1027
+ """
1028
+ hasProtectedSpecies: bool | None = None
1029
+ """
1030
+ Indicates if the site hosts protected species
1031
+ """
1032
+ isAonbNationalLandscape: bool | None = None
1033
+ """
1034
+ Indicates an area of outstanding beauty (National Landscape)
1035
+ """
1036
+ isSiteOnHighwayLand: bool | None = None
1037
+ """
1038
+ Indicates if site is on highway land
1039
+ """
1040
+ designatedSitesNames: list[str] | None = None
1041
+ """
1042
+ The designated site names
1043
+ """
1044
+ hasInfrastructureLevy: bool | None = None
1045
+ """
1046
+ Indicates the existence of an infrastructure levy
1047
+ """
1048
+ isInfrastructureLevyFormallyAdopted: bool | None = None
1049
+ """
1050
+ Indicates if the infrastructure levy is formally adopted
1051
+ """
1052
+ infrastructureLevyAdoptedDate: AwareDatetime | None = Field(
1053
+ None, examples=["2023-07-27T20:30:00.000Z"]
1054
+ )
1055
+ """
1056
+ The date of the infrastructure levy adoption
1057
+ """
1058
+ infrastructureLevyExpectedDate: AwareDatetime | None = Field(
1059
+ None, examples=["2023-07-27T20:30:00.000Z"]
1060
+ )
1061
+ """
1062
+ The expected date of the infrastructure levy
1063
+ """
1064
+ lpaProcedurePreference: LpaProcedurePreference | None = None
1065
+ """
1066
+ The procedure preference indicated by the LPA
1067
+ """
1068
+ lpaProcedurePreferenceDetails: str | None = None
1069
+ """
1070
+ The procedure details preference indicated by the LPA
1071
+ """
1072
+ lpaProcedurePreferenceDuration: float | None = None
1073
+ """
1074
+ The duration of enquiry indicated by the LPA
1075
+ """
1076
+ caseworkReason: str | None = None
1077
+ """
1078
+ TBC
1079
+ """
1080
+ importantInformation: str | None = None
1081
+ """
1082
+ Information relevant to case...
1083
+ """
1084
+ jurisdiction: str | None = None
1085
+ """
1086
+ Under whose jurisdiction the decision falls
1087
+ """
1088
+ redeterminedIndicator: bool | None = None
1089
+ """
1090
+ Has the case been selected for redetermination
1091
+ """
1092
+ dateCostsReportDespatched: AwareDatetime | None = Field(
1093
+ None, examples=["2023-07-27T20:30:00.000Z"]
1094
+ )
1095
+ """
1096
+ The date that the costs report was sent
1097
+ """
1098
+ dateNotRecoveredOrDerecovered: AwareDatetime | None = Field(
1099
+ None, examples=["2023-07-27T20:30:00.000Z"]
1100
+ )
1101
+ """
1102
+ The date that is TBC
1103
+ """
1104
+ dateRecovered: AwareDatetime | None = Field(
1105
+ None, examples=["2023-07-27T20:30:00.000Z"]
1106
+ )
1107
+ """
1108
+ The date that case was recovered
1109
+ """
1110
+ originalCaseDecisionDate: AwareDatetime | None = Field(
1111
+ None, examples=["2023-07-27T20:30:00.000Z"]
1112
+ )
1113
+ """
1114
+ The original case decision date
1115
+ """
1116
+ targetDate: AwareDatetime | None = Field(
1117
+ None, examples=["2023-07-27T20:30:00.000Z"]
1118
+ )
1119
+ """
1120
+ The target date for case completion
1121
+ """
1122
+ ownsAllLand: bool | None = None
1123
+ """
1124
+ Indicates if the appellant has complete ownership of the site
1125
+ """
1126
+ ownsSomeLand: bool | None = None
1127
+ """
1128
+ Indicates if the appellant has partial ownership of the site
1129
+ """
1130
+ knowsOtherOwners: KnowsOtherOwners
1131
+ """
1132
+ Indicates if the appellant knows other owners of the site
1133
+ """
1134
+ knowsAllOwners: KnowsAllOwners
1135
+ """
1136
+ Indicates if the appellant knows all owners of the site
1137
+ """
1138
+ advertisedAppeal: bool | None = None
1139
+ """
1140
+ Indicates if the appellant has advertised the appeal to the LPA decision
1141
+ """
1142
+ notificationMethod: list[NotificationMethodEnum1]
1143
+ """
1144
+ The methods used to notify relevant parties
1145
+ """
1146
+ ownersInformed: bool | None = None
1147
+ """
1148
+ Indicates if the appellant has informed other owners of the site
1149
+ """
1150
+ originalDevelopmentDescription: str | None = Field(
1151
+ ..., examples=["Replacement of an existing gate to access the property"]
1152
+ )
1153
+ """
1154
+ The original description of the development, as provided by the appellant
1155
+ """
1156
+ changedDevelopmentDescription: bool | None = None
1157
+ """
1158
+ Indicates that the LPA has changed the development description
1159
+ """
1160
+ newConditionDetails: str | None = Field(
1161
+ ...,
1162
+ examples=["Since the original application, a number of things have changed..."],
1163
+ )
1164
+ """
1165
+ New conditions details provided by the LPA
1166
+ """
1167
+ nearbyCaseReferences: list[str]
1168
+ """
1169
+ A list of related case references known to the appellant and the LPA
1170
+ """
1171
+ neighbouringSiteAddresses: list[NeighbouringSiteAddress]
1172
+ """
1173
+ A list of neighbouring site addresses
1174
+ """
1175
+ reasonForNeighbourVisits: str | None = None
1176
+ """
1177
+ A general reason given for the need to visit any neighbours
1178
+ """
1179
+ affectedListedBuildingNumbers: list[str]
1180
+ """
1181
+ A list of affected listed building IDs from Historic England
1182
+ """
1183
+ appellantCostsAppliedFor: bool | None = None
1184
+ """
1185
+ Indicates if the appellant has applied for costs
1186
+ """
1187
+ lpaCostsAppliedFor: bool | None = None
1188
+ """
1189
+ Indicates if the appellant has applied for costs
1190
+ """
1191
+ typeOfPlanningApplication: TypeOfPlanningApplication | None = None
1192
+ siteGridReferenceEasting: constr(pattern=r"^\d{6}$") | None = Field(
1193
+ None, examples=["357144"]
1194
+ )
1195
+ siteGridReferenceNorthing: constr(pattern=r"^\d{6}$") | None = Field(
1196
+ None, examples=["400534"]
1197
+ )
1198
+ hasLandownersPermission: bool | None = None
1199
+ """
1200
+ Indicates if the appellant has land owners permission
1201
+ """
1202
+ isAdvertInPosition: bool | None = None
1203
+ """
1204
+ Indicates if the advert is already in position
1205
+ """
1206
+ isSiteInAreaOfSpecialControlAdverts: bool | None = None
1207
+ """
1208
+ Indicates if the site is in an area of special control for adverts
1209
+ """
1210
+ wasApplicationRefusedDueToHighwayOrTraffic: bool | None = None
1211
+ """
1212
+ Indicates if the application was refused because of highway or traffic public safety?
1213
+ """
1214
+ didAppellantSubmitCompletePhotosAndPlans: bool | None = None
1215
+ """
1216
+ Indicates if the appellant submitted complete and accurate photographs and plans
1217
+ """
1218
+ advertType: str | None = None
1219
+
1220
+
1221
+ class AppealHasCase(RootModel[AppealHasCase1 | AppealHasCase2]):
1222
+ root: AppealHasCase1 | AppealHasCase2 = Field(..., title="Appeal HAS Case")
1223
+ """
1224
+ Group A - Schema defining the metadata for an appeal
1225
+ """