@planning-inspectorate/data-model 2.49.0 → 2.50.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 (31) hide show
  1. package/docs/README.md +23 -1
  2. package/docs/address.md +366 -0
  3. package/docs/applications-application-defs-address.md +108 -0
  4. package/docs/applications-application-defs-contact.md +98 -0
  5. package/docs/applications-application-defs-organisation.md +117 -0
  6. package/docs/applications-application-defs.md +3 -0
  7. package/docs/{application-update.md → applications-application-update.md} +22 -22
  8. package/docs/applications-application.md +2250 -0
  9. package/docs/applications-notify-email-defs-contact.md +93 -0
  10. package/docs/applications-notify-email-defs.md +3 -0
  11. package/docs/applications-notify-email.md +458 -0
  12. package/docs/applications-representation-definitions-contact.md +93 -0
  13. package/docs/applications-representation-definitions-representationdocument.md +152 -0
  14. package/docs/applications-representation-definitions.md +3 -0
  15. package/docs/applications-representation.md +834 -0
  16. package/package.json +1 -1
  17. package/pins_data_model/models/model_address.py +69 -0
  18. package/pins_data_model/models/model_applications_application.py +518 -0
  19. package/pins_data_model/models/model_applications_application_update.py +55 -0
  20. package/pins_data_model/models/model_applications_notify_email.py +124 -0
  21. package/pins_data_model/models/model_applications_representation.py +207 -0
  22. package/schemas/address.schema.json +87 -0
  23. package/schemas/{application-update.schema.json → applications-application-update.schema.json} +1 -1
  24. package/schemas/applications-application.schema.json +539 -0
  25. package/schemas/applications-notify-email.schema.json +118 -0
  26. package/schemas/applications-representation.schema.json +202 -0
  27. package/src/enums.cjs +147 -0
  28. package/src/enums.d.ts +131 -0
  29. package/src/enums.js +131 -0
  30. package/src/index.cjs +147 -0
  31. package/src/schemas.d.ts +678 -1
@@ -0,0 +1,539 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "applications-application.schema.json",
4
+ "title": "Crown Development Application",
5
+ "description": "Main application details for Crown Development Project",
6
+ "type": "object",
7
+ "additionalProperties": true,
8
+ "required": ["id", "reference", "createdDate", "type", "hasAgent"],
9
+ "properties": {
10
+ "id": {
11
+ "type": "string",
12
+ "description": "Internal Identifier UUID",
13
+ "example": "AAAAAAAA-1234-1234-1234-AAAAAAAAAAAA"
14
+ },
15
+ "reference": {
16
+ "type": "string",
17
+ "description": "External Identifier: CROWN/YYYY/XXXXXXX",
18
+ "example": "CROWN/2025/12345"
19
+ },
20
+ "createdDate": {
21
+ "type": "string",
22
+ "format": "date-time",
23
+ "description": "Date the case was created"
24
+ },
25
+ "updatedDate": {
26
+ "type": ["string", "null"],
27
+ "format": "date-time",
28
+ "description": "Date the case was updated"
29
+ },
30
+ "type": {
31
+ "type": "string",
32
+ "description": "Type of application. Name displayed to users",
33
+ "example": "Outline planning permission with some matters reserved",
34
+ "enum": [
35
+ "Planning permission",
36
+ "Outline planning permission with some matters reserved",
37
+ "Outline planning permission with all matters reserved",
38
+ "Approval of reserved matters following outline approval",
39
+ "Planning permission and listed building consent (LBC) for alterations, extension or demolition of a listed building"
40
+ ]
41
+ },
42
+ "subType": {
43
+ "type": ["string", "null"],
44
+ "description": "SubType applies to Planning permissions and LBC",
45
+ "example": "Listed building consent (LBC)",
46
+ "enum": ["Planning permission", "Listed building consent (LBC)"]
47
+ },
48
+ "linkedParentId": {
49
+ "type": ["string", "null"],
50
+ "description": "Self-referencial for parent to children relationship",
51
+ "example": "AAAAAAAA-1234-1234-1234-AAAAAAAAAAAA"
52
+ },
53
+ "description": {
54
+ "type": ["string", "null"],
55
+ "description": "Description of the project"
56
+ },
57
+ "primaryLPACode": {
58
+ "type": "string",
59
+ "description": "Primary Planning Body code",
60
+ "example": "Z0116"
61
+ },
62
+ "secondaryLPACode": {
63
+ "type": ["string", "null"],
64
+ "description": "Secondary LPAs when project overlaps authorities",
65
+ "example": "Z0116"
66
+ },
67
+ "hasAgent": {
68
+ "type": "boolean",
69
+ "description": "Is an agent assigned to the case on behalf of the applicant"
70
+ },
71
+ "organisations": {
72
+ "type": "array",
73
+ "description": "Applications can have one or more organisaitons associated with them.",
74
+ "items": {
75
+ "$ref": "#/$defs/organisation"
76
+ }
77
+ },
78
+ "siteAddress": {
79
+ "type": ["array", "null"],
80
+ "description": "Site Address details",
81
+ "items": {
82
+ "$ref": "#/$defs/address"
83
+ }
84
+ },
85
+ "siteEasting": {
86
+ "type": ["string", "null"],
87
+ "description": "Easting of the site, if known",
88
+ "example": "216600"
89
+ },
90
+ "siteNorthing": {
91
+ "type": ["string", "null"],
92
+ "description": "Northing of the site, if known",
93
+ "example": "771200"
94
+ },
95
+ "siteArea": {
96
+ "type": ["number", "null"],
97
+ "description": "Site area in hectares",
98
+ "example": 4.44
99
+ },
100
+ "expectedDateOfSubmission": {
101
+ "type": "string",
102
+ "format": "date-time",
103
+ "description": "Date case officer expects the application to be submitted (NB: cases are created before document submissions as applicants upload directly)"
104
+ },
105
+ "applicationStatus": {
106
+ "type": "string",
107
+ "description": "Current status of the case (enum)",
108
+ "enum": [
109
+ "New",
110
+ "Accepted",
111
+ "Invalid",
112
+ "Consultation period open",
113
+ "Hearing/Inquiry date set",
114
+ "Application on hold awaiting further information",
115
+ "Report awaited",
116
+ "Report sent to Decision Branch",
117
+ "Decision awaited",
118
+ "Decided",
119
+ "Withdrawn",
120
+ "Declined to determine",
121
+ "Closed - invalid",
122
+ "Closed - opened in error"
123
+ ]
124
+ },
125
+ "applicationStage": {
126
+ "type": ["string", "null"],
127
+ "description": "Current stage of the case (enum)",
128
+ "enum": [
129
+ "Accepted",
130
+ "Consultation",
131
+ "Procedure choice",
132
+ "Written representations",
133
+ "Inquiry",
134
+ "Hearing/Inquiry date set",
135
+ "Final decision"
136
+ ]
137
+ },
138
+ "nationallyImportant": {
139
+ "type": ["boolean", "null"],
140
+ "description": "Site is nationally important (Yes/No)"
141
+ },
142
+ "nationallyImportantConfirmationDate": {
143
+ "type": ["string", "null"],
144
+ "format": "date-time",
145
+ "description": "Date the application's national importance was confirmed"
146
+ },
147
+ "notNationallyImportantEmailSent": {
148
+ "type": ["boolean", "null"],
149
+ "description": "Flags if a notNationallyImportant email has been sent"
150
+ },
151
+ "containsDistressingContent": {
152
+ "type": ["boolean", "null"],
153
+ "description": "Highlights the cases as containing distressing content"
154
+ },
155
+ "lpaReference": {
156
+ "type": ["string", "null"],
157
+ "description": "LPA cross reference. Reference number for the case as known by the Local Planning Authority (LPA)"
158
+ },
159
+ "category": {
160
+ "type": ["string", "null"],
161
+ "description": "Application category (enum)",
162
+ "enum": [
163
+ "Major Development",
164
+ "Buildings over 1000 square metres",
165
+ "Development of a site above 1 hectare",
166
+ "Dwellings numbering 10 or more",
167
+ "Dwellings of 0.5 hectare or more",
168
+ "Minerals",
169
+ "Waste",
170
+ "Non-Major Development",
171
+ "Buildings less than 1000 square metres",
172
+ "Development of a site less than 1 hectare",
173
+ "Dwellings numbering between 1 and 9",
174
+ "Dwellings of less than 0.5 hectare",
175
+ "Change of use",
176
+ "Relevant demolition",
177
+ "Other",
178
+ "Listed building consent to alter/extend",
179
+ "Listed building consent to demolish"
180
+ ]
181
+ },
182
+ "isGreenBelt": {
183
+ "type": ["boolean", "null"],
184
+ "description": "Is the site in green belt land"
185
+ },
186
+ "healthAndSafetyIssue": {
187
+ "type": ["boolean", "null"],
188
+ "description": "Does the Site has H&S Issue"
189
+ },
190
+ "applicationReceivedDate": {
191
+ "type": ["string", "null"],
192
+ "format": "date-time",
193
+ "description": "Date the application was received"
194
+ },
195
+ "applicationReceivedDateEmailSent": {
196
+ "type": ["boolean", "null"],
197
+ "description": "Flags if an applicationReceived email has been sent"
198
+ },
199
+ "applicationAcceptedDate": {
200
+ "type": ["string", "null"],
201
+ "format": "date-time",
202
+ "description": "Date the application was accepted"
203
+ },
204
+ "lpaQuestionnaireSentDate": {
205
+ "type": ["string", "null"],
206
+ "format": "date-time",
207
+ "description": "Date the lpa questionnaire was sent"
208
+ },
209
+ "lpaQuestionnaireReceivedDate": {
210
+ "type": ["string", "null"],
211
+ "format": "date-time",
212
+ "description": "Date the lpa questionnaire was received"
213
+ },
214
+ "lpaQuestionnaireReceivedEmailSent": {
215
+ "type": ["boolean", "null"],
216
+ "description": "Flags if an lpaQuestionnaireReceived email has been sent"
217
+ },
218
+ "publishDate": {
219
+ "type": ["string", "null"],
220
+ "format": "date-time",
221
+ "description": "Date the application was published to the portal"
222
+ },
223
+ "pressNoticeDate": {
224
+ "type": ["string", "null"],
225
+ "format": "date-time",
226
+ "description": "Date the press notice was published"
227
+ },
228
+ "neighboursNotifiedByLpaDate": {
229
+ "type": ["string", "null"],
230
+ "format": "date-time",
231
+ "description": "Date the neighbours were notified by the LPA"
232
+ },
233
+ "siteNoticeByLpaDate": {
234
+ "type": ["string", "null"],
235
+ "format": "date-time",
236
+ "description": "Date the site notice was erected by the LPA"
237
+ },
238
+ "targetDecisionDate": {
239
+ "type": ["string", "null"],
240
+ "format": "date-time",
241
+ "description": "Date the application should be decided by"
242
+ },
243
+ "extendedTargetDecisionDate": {
244
+ "type": ["string", "null"],
245
+ "format": "date-time",
246
+ "description": "Extended date by which the application should be decided"
247
+ },
248
+ "recoveredDate": {
249
+ "type": ["string", "null"],
250
+ "format": "date-time",
251
+ "description": "Date the application was recovered by the Secretary of State"
252
+ },
253
+ "recoveredReportSentDate": {
254
+ "type": ["string", "null"],
255
+ "format": "date-time",
256
+ "description": "Date the Inspector's report was sent to the Secretary of State"
257
+ },
258
+ "withdrawnDate": {
259
+ "type": ["string", "null"],
260
+ "format": "date-time",
261
+ "description": "Date application was withdrawn"
262
+ },
263
+ "decisionDate": {
264
+ "type": ["string", "null"],
265
+ "format": "date-time",
266
+ "description": "Date the application was decided on"
267
+ },
268
+ "originalDecisionDate": {
269
+ "type": ["string", "null"],
270
+ "format": "date-time",
271
+ "description": "Date of the original decision if later quashed"
272
+ },
273
+ "decisionOutcome": {
274
+ "type": ["string", "null"],
275
+ "description": "As displayed to users",
276
+ "enum": ["Approved", "Approved with conditions", "Refused", "Withdrawn"]
277
+ },
278
+ "turnedAwayDate": {
279
+ "type": ["string", "null"],
280
+ "format": "date-time",
281
+ "description": "Date application was turned away"
282
+ },
283
+ "representationsPublishDate": {
284
+ "type": ["string", "null"],
285
+ "format": "date-time",
286
+ "description": "Date the representations was publish"
287
+ },
288
+ "representationsPeriodStartDate": {
289
+ "type": ["string", "null"],
290
+ "format": "date-time",
291
+ "description": "Start date of the representation period (starts at 00:00)"
292
+ },
293
+ "representationsPeriodEndDate": {
294
+ "type": ["string", "null"],
295
+ "format": "date-time",
296
+ "description": "End date of the representation period (ends at 23:59)"
297
+ },
298
+ "inspector1Id": {
299
+ "type": ["string", "null"],
300
+ "description": "EntraID for Inspector"
301
+ },
302
+ "inspector2Id": {
303
+ "type": ["string", "null"],
304
+ "description": "EntraID for Inspector"
305
+ },
306
+ "inspector3Id": {
307
+ "type": ["string", "null"],
308
+ "description": "EntraID for Inspector"
309
+ },
310
+ "assessorInspectorId": {
311
+ "type": ["string", "null"],
312
+ "description": "EntraID for Assessor"
313
+ },
314
+ "caseOfficerId": {
315
+ "type": ["string", "null"],
316
+ "description": "EntraID for Case Officer"
317
+ },
318
+ "planningOfficerId": {
319
+ "type": ["string", "null"],
320
+ "description": "EntraID for Planning Officer"
321
+ },
322
+ "eiaScreening": {
323
+ "type": ["boolean", "null"],
324
+ "description": "Does the application need an Environmental Impact Assessment"
325
+ },
326
+ "eiaScreeningOutcome": {
327
+ "type": ["string", "null"],
328
+ "description": "What was the outcome of the Environmental Impact Assessment",
329
+ "enum": ["required", "not required"]
330
+ },
331
+ "environmentalStatementReceivedDate": {
332
+ "type": ["string", "null"],
333
+ "format": "date-time",
334
+ "description": "Date the environmental statement was received"
335
+ },
336
+ "siteIsVisibleFromPublicLand": {
337
+ "type": ["boolean", "null"],
338
+ "description": "Site is visible from public land (Yes/No or TRUE/FALSE tbc)"
339
+ },
340
+ "procedure": {
341
+ "type": ["string", "null"],
342
+ "description": "Name displayed to users",
343
+ "enum": ["Written Representations", "Hearing", "Inquiry"]
344
+ },
345
+ "procedureNotificationDate": {
346
+ "type": ["string", "null"],
347
+ "format": "date-time"
348
+ },
349
+ "eventDate": {
350
+ "type": ["string", "null"],
351
+ "format": "date-time"
352
+ },
353
+ "eventPrepDuration": {
354
+ "type": ["number", "null"],
355
+ "example": 1234.56
356
+ },
357
+ "eventSittingDuration": {
358
+ "type": ["number", "null"],
359
+ "example": 1234.56
360
+ },
361
+ "eventReportingDuration": {
362
+ "type": ["number", "null"],
363
+ "example": 1234.56
364
+ },
365
+ "eventVenue": {
366
+ "type": ["string", "null"]
367
+ },
368
+ "eventNotificationDate": {
369
+ "type": ["string", "null"],
370
+ "format": "date-time"
371
+ },
372
+ "eventIssuesReportPublishedDate": {
373
+ "type": ["string", "null"],
374
+ "format": "date-time"
375
+ },
376
+ "eventStatementsDate": {
377
+ "type": ["string", "null"],
378
+ "format": "date-time"
379
+ },
380
+ "eventCaseManagementConferenceDate": {
381
+ "type": ["string", "null"],
382
+ "format": "date-time"
383
+ },
384
+ "eventPreMeetingDate": {
385
+ "type": ["string", "null"],
386
+ "format": "date-time"
387
+ },
388
+ "eventProofsOfEvidenceDate": {
389
+ "type": ["string", "null"],
390
+ "format": "date-time"
391
+ },
392
+ "hasApplicationFee": {
393
+ "type": ["boolean", "null"],
394
+ "description": "Application has associated Fee (Yes/No or TRUE/FALSE tbc)"
395
+ },
396
+ "applicationFee": {
397
+ "type": ["number", "null"],
398
+ "description": "The amount to be payed by the Applicant"
399
+ },
400
+ "applicationFeeReceivedDate": {
401
+ "type": ["string", "null"],
402
+ "format": "date-time",
403
+ "description": "Date the application fee was received"
404
+ },
405
+ "eligibleForFeeRefund": {
406
+ "type": ["boolean", "null"],
407
+ "description": "Is the applicant eligible for a refund on the fee"
408
+ },
409
+ "applicationFeeRefundAmount": {
410
+ "type": ["number", "null"],
411
+ "description": "The amount to be refunded to the Applicant"
412
+ },
413
+ "applicationFeeRefundDate": {
414
+ "type": ["string", "null"],
415
+ "format": "date-time",
416
+ "description": "Date the application fee was refunded"
417
+ },
418
+ "siteVisitDate": {
419
+ "type": ["string", "null"],
420
+ "format": "date-time",
421
+ "description": "Date the site was/is going to be visited by the inspector"
422
+ },
423
+ "cilLiable": {
424
+ "type": ["boolean", "null"],
425
+ "description": "Is the application liable for a community infrastructure levy"
426
+ },
427
+ "cilAmount": {
428
+ "type": ["number", "null"],
429
+ "description": "The amount for the community infrastructure levy"
430
+ },
431
+ "bngExempt": {
432
+ "type": ["boolean", "null"],
433
+ "description": "Is the site exempt from the Biodiversity Net Gain"
434
+ },
435
+ "hasCostsApplications": {
436
+ "type": ["boolean", "null"],
437
+ "description": "If a party is making a cost claim against another for unreasonable behaviour"
438
+ },
439
+ "costsApplicationsComment": {
440
+ "type": ["string", "null"],
441
+ "description": "Details about the cost application"
442
+ },
443
+ "environmentalImpactAssessment": {
444
+ "type": ["boolean", "null"],
445
+ "description": "Does the application have an Environmental Impact Assessment - used for context in emails to LPAs"
446
+ },
447
+ "developmentPlan": {
448
+ "type": ["boolean", "null"],
449
+ "description": "Is the application a standard development plan - used for context in emails to LPAs"
450
+ },
451
+ "rightOfWay": {
452
+ "type": ["boolean", "null"],
453
+ "description": "Does the application apply to rights of way - used for context in emails to LPAs"
454
+ }
455
+ },
456
+ "$defs": {
457
+ "organisation": {
458
+ "type": "object",
459
+ "additionalProperties": true,
460
+ "required": ["contactRoleType", "organisationId"],
461
+ "properties": {
462
+ "roleType": {
463
+ "type": "string",
464
+ "description": "Agent or Applicant details",
465
+ "example": "agent",
466
+ "enum": ["agent", "applicant"]
467
+ },
468
+ "organisationId": {
469
+ "type": "string",
470
+ "description": "Source PK for Organisation",
471
+ "example": "AAAAAAAA-1234-1234-1234-AAAAAAAAAAAA"
472
+ },
473
+ "organisationName": {
474
+ "type": ["string", "null"]
475
+ },
476
+ "organisationAddress": {
477
+ "type": ["array", "null"],
478
+ "items": {
479
+ "$ref": "#/$defs/address"
480
+ }
481
+ },
482
+ "contacts": {
483
+ "type": ["array", "null"],
484
+ "description": "An Organisation may be linked to one or more Contacts",
485
+ "items": {
486
+ "$ref": "#/$defs/contact"
487
+ }
488
+ }
489
+ }
490
+ },
491
+ "contact": {
492
+ "type": "object",
493
+ "additionalProperties": true,
494
+ "required": ["contactId"],
495
+ "properties": {
496
+ "contactId": {
497
+ "type": "string",
498
+ "description": "Source PK for Contact",
499
+ "example": "AAAAAAAA-1234-1234-1234-AAAAAAAAAAAA"
500
+ },
501
+ "contactPreference": {
502
+ "type": ["string", "null"],
503
+ "example": "email",
504
+ "enum": ["email", "post"]
505
+ },
506
+ "writtenRepOrgName": {
507
+ "type": ["string", "null"],
508
+ "description": "Organisation Name used for written-representation on behalf of an organisation"
509
+ },
510
+ "writtenRepJobTitleorRole": {
511
+ "type": ["string", "null"],
512
+ "description": "Job Title or Role used for written-representation on behalf of an organisation"
513
+ }
514
+ }
515
+ },
516
+ "address": {
517
+ "type": "object",
518
+ "additionalProperties": true,
519
+ "required": ["postcode"],
520
+ "properties": {
521
+ "line1": {
522
+ "type": ["string", "null"]
523
+ },
524
+ "line2": {
525
+ "type": ["string", "null"]
526
+ },
527
+ "townCity": {
528
+ "type": ["string", "null"]
529
+ },
530
+ "county": {
531
+ "type": ["string", "null"]
532
+ },
533
+ "postcode": {
534
+ "type": "string"
535
+ }
536
+ }
537
+ }
538
+ }
539
+ }
@@ -0,0 +1,118 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "applications-notify-email.schema.json",
4
+ "title": "Email Notification Record Schema",
5
+ "description": "Email Notifications for Casework Projects",
6
+ "type": "object",
7
+ "additionalProperties": true,
8
+ "required": ["id", "caseReference", "caseId", "caseType", "status", "lpaCode"],
9
+ "properties": {
10
+ "id": {
11
+ "type": "string",
12
+ "description": "Internal Identifier UUID",
13
+ "example": "AAAAAAAA-1234-1234-1234-AAAAAAAAAAAA"
14
+ },
15
+ "notifyId": {
16
+ "type": ["string", "null"],
17
+ "description": "Id used by Notify"
18
+ },
19
+ "reference": {
20
+ "type": "string",
21
+ "description": "Reference passed to notify (used to identify the case or representation it relates to)"
22
+ },
23
+ "caseReference": {
24
+ "type": "string",
25
+ "description": "Business Key for the related case",
26
+ "example": "CROWN/2025/12345"
27
+ },
28
+ "caseId": {
29
+ "type": "string",
30
+ "description": "The unique ID for the case this notification belongs to.",
31
+ "example": "AAAAAAAA-1234-1234-1234-AAAAAAAAAAAA"
32
+ },
33
+ "caseType": {
34
+ "type": "string",
35
+ "description": "The type of case this notification is for.",
36
+ "example": "Crown Development Application"
37
+ },
38
+ "createdDate": {
39
+ "type": ["string", "null"],
40
+ "format": "date-time",
41
+ "description": "Date the email was created"
42
+ },
43
+ "createdBy": {
44
+ "type": ["string", "null"],
45
+ "description": "Name of the person that triggered the email (only applies when done manually)"
46
+ },
47
+ "completedDate": {
48
+ "type": ["string", "null"],
49
+ "format": "date-time",
50
+ "description": "When the email completed (succeeded or failed)"
51
+ },
52
+ "email": {
53
+ "type": ["string", "null"],
54
+ "format": "email",
55
+ "description": "Email address sent to if unable to be linked to an LPA or Contact"
56
+ },
57
+ "contact": {
58
+ "type": ["array", "null"],
59
+ "description": "Contact(s) the email was sent to",
60
+ "items": {
61
+ "$ref": "#/$defs/Contact"
62
+ }
63
+ },
64
+ "lpaCode": {
65
+ "type": "string",
66
+ "description": "Planning Body code",
67
+ "example": "Z0116"
68
+ },
69
+ "emailStatus": {
70
+ "type": "string",
71
+ "description": "Outcome of the email (status)",
72
+ "enum": ["Sending", "Delivered", "Permanent failure", "Temporary failure", "Technical failure"],
73
+ "example": "Delivered"
74
+ },
75
+ "templateId": {
76
+ "type": ["string", "null"],
77
+ "description": "The id of the template sent in Notify"
78
+ },
79
+ "templateVersion": {
80
+ "type": ["integer", "null"],
81
+ "description": "The version of the template sent"
82
+ },
83
+ "body": {
84
+ "type": ["string", "null"],
85
+ "description": "The full HTML/plain text body of the email"
86
+ },
87
+ "subject": {
88
+ "type": ["string", "null"],
89
+ "description": "The full HTML/plain text subject of the email"
90
+ }
91
+ },
92
+ "$defs": {
93
+ "Contact": {
94
+ "type": "object",
95
+ "description": "Contact the email was sent to",
96
+ "required": ["contactId", "addressId"],
97
+ "properties": {
98
+ "contactId": {
99
+ "type": "string",
100
+ "description": "Source PK for Contact",
101
+ "example": "AAAAAAAA-1234-1234-1234-AAAAAAAAAAAA"
102
+ },
103
+ "contactPreference": {
104
+ "type": ["string", "null"],
105
+ "enum": ["email", "post"],
106
+ "description": "Preferred contact method",
107
+ "example": "email"
108
+ },
109
+ "writtenRepOrgName": {
110
+ "type": ["string", "null"]
111
+ },
112
+ "writtenRepJobTitleorRole": {
113
+ "type": ["string", "null"]
114
+ }
115
+ }
116
+ }
117
+ }
118
+ }