@pdtf/schemas 2.0.0-3 → 2.0.0-31

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.
package/index.js CHANGED
@@ -45,25 +45,28 @@ const validator = ajv.compile(transactionSchema);
45
45
 
46
46
  // v2, via accessor functions and overlays
47
47
  const combinedSchema = require("./src/schemas/v2/combined.json");
48
- const coreSchema = require("./src/schemas/v2/core.json");
48
+ const v2CoreSchema = require("./src/schemas/v2/pdtf-transaction.json");
49
49
 
50
50
  const baspiOverlay = require("./src/schemas/v2/overlays/baspi.json");
51
- // const ta6Overlay = require("./src/schemas/v2/overlays/ta6.json");
52
- // const ta7Overlay = require("./src/schemas/v2/overlays/ta7.json");
53
- // const lpe1Overlay = require("./src/schemas/v2/overlays/lpe1.json");
54
- // const fme1Overlay = require("./src/schemas/v2/overlays/fme1.json");
55
- // const llc1Overlay = require("./src/schemas/v2/overlays/llc1.json");
56
- // const con29ROverlay = require("./src/schemas/v2/overlays/con29R.json");
57
- // const con29DWOverlay = require("./src/schemas/v2/overlays/con29DW.json");
58
- // const rdsOverlay = require("./src/schemas/v2/overlays/rds.json");
59
- // const oc1Overlay = require("./src/schemas/v2/overlays/oc1.json");
60
-
61
- const overlays = { baspiV4: baspiOverlay };
51
+ const ta6Overlay = require("./src/schemas/v2/overlays/ta6.json");
52
+ const ta7Overlay = require("./src/schemas/v2/overlays/ta7.json");
53
+ const ta10Overlay = require("./src/schemas/v2/overlays/ta10.json");
54
+ const lpe1Overlay = require("./src/schemas/v2/overlays/lpe1.json");
55
+ const fme1Overlay = require("./src/schemas/v2/overlays/fme1.json");
56
+ const llc1Overlay = require("./src/schemas/v2/overlays/llc1.json");
57
+ const ntsOverlay = require("./src/schemas/v2/overlays/nts.json");
58
+ const con29ROverlay = require("./src/schemas/v2/overlays/con29R.json");
59
+ const con29DWOverlay = require("./src/schemas/v2/overlays/con29DW.json");
60
+ const rdsOverlay = require("./src/schemas/v2/overlays/rds.json");
61
+ const oc1Overlay = require("./src/schemas/v2/overlays/oc1.json");
62
+
63
+ const overlaysMap = { baspiV4: baspiOverlay, ta6ed4: ta6Overlay, null: {} };
62
64
 
63
65
  const transactionSchemas = {
64
66
  "https://trust.propdata.org.uk/schemas/v1/pdtf-transaction.json":
65
67
  transactionSchema,
66
- "https://trust.propdata.org.uk/schemas/v2/pdtf-transaction.json": coreSchema,
68
+ "https://trust.propdata.org.uk/schemas/v2/pdtf-transaction.json":
69
+ v2CoreSchema,
67
70
  };
68
71
 
69
72
  const combineMerge = (target, source, options) => {
@@ -82,22 +85,25 @@ const combineMerge = (target, source, options) => {
82
85
 
83
86
  const getTransactionSchema = (
84
87
  schemaId = "https://trust.propdata.org.uk/schemas/v2/pdtf-transaction.json",
85
- overlay = "baspiV4"
88
+ overlays = ["baspiV4"]
86
89
  ) => {
87
90
  const sourceSchema = transactionSchemas[schemaId];
88
- const overlaySchema = overlays[overlay];
89
- if (!overlaySchema) return sourceSchema;
90
- const mergedSchema = merge(overlaySchema, sourceSchema, {
91
- arrayMerge: combineMerge,
91
+ if (!overlays || overlays.length < 1) return sourceSchema;
92
+ let mergedSchema = sourceSchema;
93
+ overlays.forEach((overlay) => {
94
+ const overlaySchema = overlaysMap[overlay] || {};
95
+ mergedSchema = merge(overlaySchema, mergedSchema, {
96
+ arrayMerge: combineMerge,
97
+ });
92
98
  });
93
99
  // console.log("mergedSchema", mergedSchema);
94
100
  return mergedSchema;
95
101
  };
96
102
 
97
- const getValidator = (schemaId, overlay = "baspiV4") => {
103
+ const getValidator = (schemaId, overlays) => {
98
104
  let validator = ajv.getSchema(schemaId);
99
105
  if (!validator) {
100
- const schema = getTransactionSchema(schemaId, overlay);
106
+ const schema = getTransactionSchema(schemaId, overlays);
101
107
  ajv.addSchema(schema, schemaId);
102
108
  validator = ajv.getSchema(schemaId);
103
109
  }
@@ -105,8 +111,8 @@ const getValidator = (schemaId, overlay = "baspiV4") => {
105
111
  };
106
112
 
107
113
  // common functions for v1 and v2
108
- const getSubschema = (path, schemaId, overlay) => {
109
- const sourceSchema = getTransactionSchema(schemaId, overlay);
114
+ const getSubschema = (path, schemaId, overlays) => {
115
+ const sourceSchema = getTransactionSchema(schemaId, overlays);
110
116
  const pathArray = path.split("/").slice(1);
111
117
  if (pathArray.length < 1) return sourceSchema;
112
118
  return pathArray.reduce((schema, pathElement) => {
@@ -128,19 +134,19 @@ const getSubschema = (path, schemaId, overlay) => {
128
134
  }, sourceSchema);
129
135
  };
130
136
 
131
- const isPathValid = (path, schemaId, overlay) => {
132
- const schema = getTransactionSchema(schemaId, overlay);
137
+ const isPathValid = (path, schemaId, overlays) => {
133
138
  try {
134
- return getSubschema(path, schemaId, overlay) !== undefined;
139
+ return getSubschema(path, schemaId, overlays) !== undefined;
135
140
  } catch (err) {
136
141
  return false;
137
142
  }
138
143
  };
139
144
 
140
- const getSubschemaValidator = (path, schemaId, overlay) => {
141
- const subSchema = getSubschema(path, schemaId, overlay);
142
- // see if we can retrieve the schema by path
143
- const cacheKey = `${path}-${schemaId}`;
145
+ const getSubschemaValidator = (path, schemaId, overlays = ["baspiV4"]) => {
146
+ const subSchema = getSubschema(path, schemaId, overlays);
147
+ const overlayKey = (overlays || []).join(".");
148
+ // see if we can retrieve the schema by path, schemaId and overlays
149
+ const cacheKey = `${path}-${schemaId}-${overlayKey}`;
144
150
  let validator = ajv.getSchema(cacheKey);
145
151
  // retrieve whole schema by $id if available
146
152
  if (!validator && subSchema.$id) validator = ajv.getSchema(cacheKey);
@@ -195,7 +201,7 @@ const getTitleAtPath = (schema, path, rootPath = path) => {
195
201
  }
196
202
  };
197
203
 
198
- const validateVerifiedClaims = (verifiedClaims) => {
204
+ const validateVerifiedClaims = (verifiedClaims, schemaId, overlays) => {
199
205
  const validatorVClaims = ajv.compile(verifiedClaimsSchema);
200
206
 
201
207
  const validationErrorsArr = [];
@@ -213,11 +219,10 @@ const validateVerifiedClaims = (verifiedClaims) => {
213
219
 
214
220
  verifiedClaimsArray.forEach((claim) => {
215
221
  const paths = Object.keys(claim.claims);
216
-
217
222
  for (const path of paths) {
218
- const validPath = isPathValid(path);
223
+ const validPath = isPathValid(path, schemaId, overlays);
219
224
  if (validPath) {
220
- const subValidator = getSubschemaValidator(path);
225
+ const subValidator = getSubschemaValidator(path, schemaId, overlays);
221
226
  const isValid = subValidator(claim.claims[path]);
222
227
  if (!isValid) {
223
228
  validationErrorsArr.push(...subValidator.errors);
@@ -245,4 +250,16 @@ module.exports = {
245
250
  getTitleAtPath,
246
251
  verifiedClaimsSchema,
247
252
  validateVerifiedClaims,
253
+ baspiOverlay,
254
+ ta6Overlay,
255
+ ta7Overlay,
256
+ ta10Overlay,
257
+ lpe1Overlay,
258
+ fme1Overlay,
259
+ llc1Overlay,
260
+ ntsOverlay,
261
+ con29ROverlay,
262
+ con29DWOverlay,
263
+ rdsOverlay,
264
+ oc1Overlay,
248
265
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pdtf/schemas",
3
- "version": "2.0.0-3",
3
+ "version": "2.0.0-31",
4
4
  "description": "Property Data Trust Framework Schemas and Utilities",
5
5
  "main": "index.js",
6
6
  "directories": {
@@ -26,6 +26,7 @@
26
26
  "homepage": "https://github.com/Property-Data-Trust-Framework/schemas#readme",
27
27
  "dependencies": {
28
28
  "@jdw/jst": "^2.0.0-beta.15",
29
+ "@pdtf/schemas": "^2.0.0-30",
29
30
  "ajv": "^8.12.0",
30
31
  "ajv-formats": "^2.1.1",
31
32
  "deepmerge": "^4.3.1",
@@ -12,7 +12,21 @@
12
12
  "phone": "07777 222333",
13
13
  "email": "peter@theseller.com",
14
14
  "address": { "line1": "47 Park Road", "postcode": "AL3 5AF" },
15
- "role": "Seller"
15
+ "role": "Seller",
16
+ "externalIds": { "MoveReady": "123434" }
17
+ },
18
+ {
19
+ "role": "Seller's Conveyancer",
20
+ "name": { "firstName": "Johnny", "lastName": "Law" },
21
+ "address": {
22
+ "line1": "123 Sweet St",
23
+ "line2": "Test building",
24
+ "town": "London",
25
+ "postcode": "SW1A 1AA"
26
+ },
27
+ "email": "johnny@suemme.co.uk",
28
+ "organisation": "Suemme and Profitt",
29
+ "organisationReference": "123456"
16
30
  }
17
31
  ],
18
32
  "propertyPack": {
@@ -34,23 +48,37 @@
34
48
  "titleNumber": "HD221222",
35
49
  "ownershipType": "Leasehold",
36
50
  "leaseholdInformation": {
51
+ "typeOfLeasehold": {
52
+ "leaseholdType": "Shared ownership",
53
+ "sharedOwnershipPercentage": 50,
54
+ "sharedOwnershipRent": 200,
55
+ "sharedOwnershipRentFrequency": "Monthly"
56
+ },
57
+ "leaseTerm": {
58
+ "startYearOfLease": 1900,
59
+ "lengthOfLeaseInYears": 999
60
+ },
37
61
  "contactDetails": {
38
62
  "contacts": {
39
63
  "landlord": {
40
- "nameOrOrganisation": "Fleesum Properties",
41
- "address": {
42
- "line1": "47 Park Road",
43
- "postcode": "AL3 5AF"
44
- },
45
- "emailAddress": "james@fleesum.com"
64
+ "contact": {
65
+ "nameOrOrganisation": "Fleesum Properties",
66
+ "address": {
67
+ "line1": "47 Park Road",
68
+ "postcode": "AL3 5AF"
69
+ },
70
+ "emailAddress": "james@fleesum.com"
71
+ }
46
72
  },
47
73
  "managingAgent": {
48
- "nameOrOrganisation": "Pricee Living",
49
- "address": {
50
- "line1": "Pricee House",
51
- "postcode": "AL3 5KK"
52
- },
53
- "emailAddress": "marcel@pricee.co.uk"
74
+ "contact": {
75
+ "nameOrOrganisation": "Pricee Living",
76
+ "address": {
77
+ "line1": "Pricee House",
78
+ "postcode": "AL3 5KK"
79
+ },
80
+ "emailAddress": "marcel@pricee.co.uk"
81
+ }
54
82
  }
55
83
  }
56
84
  },
@@ -77,20 +105,6 @@
77
105
  "details": "There is sinking fund."
78
106
  }
79
107
  },
80
- "general": {
81
- "typeOfLeasehold": {
82
- "leaseholdType": "Shared ownership",
83
- "sharedOwnershipPercentage": 50,
84
- "sharedOwnershipRent": 200,
85
- "sharedOwnershipRentFrequency": "Monthly"
86
- },
87
- "leaseTerm": {
88
- "startYearOfLease": 1900,
89
- "lengthOfLeaseInYears": 999
90
- }
91
- },
92
-
93
- "largeAdditionalExpense": { "yesNo": "No" },
94
108
  "additionalFeesOnSale": 0
95
109
  }
96
110
  }
@@ -106,13 +120,18 @@
106
120
  },
107
121
  "listingAndConservation": {
108
122
  "isListed": {
109
- "yesNo": "No"
123
+ "yesNo": "Yes",
124
+ "details": "Grade II listed",
125
+ "attachments": "To follow"
110
126
  },
111
127
  "isConservationArea": {
112
- "yesNo": "No"
128
+ "yesNo": "Yes",
129
+ "details": "Harpenden Conservation Area",
130
+ "attachments": "To follow"
113
131
  },
114
132
  "hasTreePreservationOrder": {
115
- "yesNo": "No"
133
+ "yesNo": "Yes",
134
+ "workCarriedOut": { "yesNo": "Yes", "consentsObtained": "Yes" }
116
135
  }
117
136
  },
118
137
  "typeOfConstruction": {
@@ -125,9 +144,15 @@
125
144
  }
126
145
  },
127
146
  "energyEfficiency": {
147
+ "certificateIsSupplied": "Attached",
128
148
  "certificate": {
129
149
  "certificateNumber": "12345",
130
150
  "currentEnergyRating": "A"
151
+ },
152
+ "greenDealLoan": {
153
+ "hasGreenDealLoan": {
154
+ "yesNo": "No"
155
+ }
131
156
  }
132
157
  },
133
158
  "councilTax": {
@@ -138,7 +163,12 @@
138
163
  },
139
164
  "disputesAndComplaints": {
140
165
  "hasDisputesAndComplaints": {
141
- "yesNo": "No"
166
+ "yesNo": "Yes",
167
+ "details": "Neighbour's very annoying"
168
+ },
169
+ "leadingToDisputesAndComplaints": {
170
+ "yesNo": "Yes",
171
+ "details": "Neighbour's dog barking"
142
172
  }
143
173
  },
144
174
  "alterationsAndChanges": {
@@ -148,8 +178,8 @@
148
178
  "attachments": "Attached"
149
179
  },
150
180
  "planningPermission": {
151
- "yesNo": "Yes",
152
- "attachments": "Attached"
181
+ "yesNo": "Not required",
182
+ "details": "Permitted development rights applied"
153
183
  },
154
184
  "listedBuildingConsent": {
155
185
  "yesNo": "Not required",
@@ -159,9 +189,6 @@
159
189
  "yesNo": "Not required",
160
190
  "details": "No restriction"
161
191
  },
162
- "unfinished": {
163
- "yesNo": "No"
164
- },
165
192
  "yesNo": "Yes",
166
193
  "details": "Bedroom and ensuite shower room extension 2005"
167
194
  },
@@ -185,9 +212,6 @@
185
212
  "yesNo": "Not required",
186
213
  "details": "No restriction"
187
214
  },
188
- "unfinished": {
189
- "yesNo": "No"
190
- },
191
215
  "yesNo": "Yes",
192
216
  "details": "New front door added 2016",
193
217
  "yearCompleted": 2016
@@ -209,13 +233,13 @@
209
233
  "yesNo": "No",
210
234
  "details": "Added as part of initial build and deeds"
211
235
  },
212
- "unfinished": {
213
- "yesNo": "No"
214
- },
215
236
  "yesNo": "Yes",
216
237
  "details": "Conservatory added during house build in 1990 and exterior quality door separates the conservatory from the kitchen/dining room",
217
238
  "yearCompleted": 1990
218
239
  },
240
+ "worksUnfinished": {
241
+ "yesNo": "No"
242
+ },
219
243
  "planningPermissionBreaches": {
220
244
  "yesNo": "No"
221
245
  },
@@ -240,7 +264,9 @@
240
264
  "yesNo": "No"
241
265
  },
242
266
  "partyWallAct": {
243
- "yesNo": "No"
267
+ "yesNo": "Yes",
268
+ "details": "Party wall agreement in place",
269
+ "attachments": "Attached"
244
270
  },
245
271
  "otherNotices": {
246
272
  "yesNo": "No"
@@ -272,53 +298,48 @@
272
298
  }
273
299
  },
274
300
  "waterAndDrainage": {
275
- "mainsWater": {
276
- "maintenanceAgreements": {
277
- "yesNo": "No"
278
- },
279
- "yesNo": "To be connected",
280
- "dateToBeConnected": "2022-12-15",
281
- "supplier": "Northumbria Water"
301
+ "water": {
302
+ "mainsWater": {
303
+ "yesNo": "To be connected",
304
+ "dateToBeConnected": "2022-12-15",
305
+ "supplier": "Northumbria Water"
306
+ }
282
307
  },
283
- "mainsSurfaceWaterDrainage": {
284
- "maintenanceAgreements": {
285
- "yesNo": "No"
308
+ "drainage": {
309
+ "mainsSurfaceWaterDrainage": {
310
+ "yesNo": "Yes"
286
311
  },
287
- "yesNo": "Yes"
288
- },
289
- "mainsFoulDrainage": {
290
- "yesNo": "No",
291
- "sustainableDrainageSystem": { "yesNo": "No" },
292
- "septicTank": {
293
- "yesNo": "Yes",
294
- "details": "Last emptied on 1 Jan 2022",
295
- "dateReplaced": "2022-01-01",
296
- "dateLastEmptied": "2022-01-01"
297
- },
298
- "cesspit": { "yesNo": "No" },
299
- "sewerageTreatmentPlant": { "yesNo": "No" },
300
- "otherConnectedProperties": { "yesNo": "No" },
301
- "yearSystemInstalled": 1980,
302
- "plantOnOtherLand": { "yesNo": "No" },
303
- "plantRegistered": { "yesNo": "No" },
304
- "plantDrainsIntoWaterway": {
305
- "yesNo": "Yes",
306
- "dischargeCompliesWithGBR": "Yes"
312
+ "mainsFoulDrainage": {
313
+ "yesNo": "No",
314
+ "sustainableDrainageSystem": { "yesNo": "No" },
315
+ "septicTank": {
316
+ "yesNo": "Yes",
317
+ "details": "Last emptied on 1 Jan 2022",
318
+ "dateReplaced": "2022-01-01",
319
+ "dateLastEmptied": "2022-01-01"
320
+ },
321
+ "cesspit": { "yesNo": "No" },
322
+ "sewerageTreatmentPlant": { "yesNo": "No" },
323
+ "otherConnectedProperties": { "yesNo": "No" },
324
+ "yearSystemInstalled": 1980,
325
+ "plantOnOtherLand": { "yesNo": "No" },
326
+ "plantRegistered": { "yesNo": "No" },
327
+ "plantDrainsIntoWaterway": {
328
+ "yesNo": "Yes",
329
+ "dischargeCompliesWithGBR": "Yes"
330
+ }
307
331
  }
332
+ },
333
+ "maintenanceAgreements": {
334
+ "yesNo": "No"
308
335
  }
309
336
  },
310
- "utilities": {
311
- "electricity": {
312
- "maintenanceAgreements": {
313
- "yesNo": "No"
314
- },
337
+ "connectedUtilities": {
338
+ "mainsElectricity": {
315
339
  "yesNo": "Yes",
316
340
  "supplier": "Octopus Energy"
317
341
  },
318
- "gas": {
319
- "maintenanceAgreements": {
320
- "yesNo": "No"
321
- },
342
+ "mainsGas": {
322
343
  "yesNo": "Yes",
323
344
  "supplier": "Octopus Energy"
324
345
  },
@@ -329,23 +350,14 @@
329
350
  "yesNo": "No"
330
351
  },
331
352
  "telephone": {
332
- "maintenanceAgreements": {
333
- "yesNo": "No"
334
- },
335
353
  "yesNo": "Yes",
336
354
  "supplier": "EE"
337
355
  },
338
356
  "cableSatelliteTV": {
339
- "maintenanceAgreements": {
340
- "yesNo": "No"
341
- },
342
357
  "yesNo": "Yes",
343
358
  "supplier": "Sky"
344
359
  },
345
360
  "broadband": {
346
- "maintenanceAgreements": {
347
- "yesNo": "No"
348
- },
349
361
  "yesNo": "Yes",
350
362
  "supplier": "EE"
351
363
  },
@@ -354,10 +366,8 @@
354
366
  },
355
367
  "otherServices": {
356
368
  "yesNo": "No"
357
- }
358
- },
359
- "greenDealLoan": {
360
- "hasGreenDealLoan": {
369
+ },
370
+ "maintenanceAgreements": {
361
371
  "yesNo": "No"
362
372
  }
363
373
  },
@@ -372,15 +382,25 @@
372
382
  "heatingInGoodWorkingOrder": {
373
383
  "yesNo": "Yes"
374
384
  },
375
- "centralHeatingFuel": { "centralHeatingFuelType": "Gas" },
385
+ "centralHeatingFuel": {
386
+ "centralHeatingFuelType": "Other",
387
+ "otherCentralHeatingFuelType": "Ground-source Heat Pump"
388
+ },
376
389
  "centralHeatingInstalled": "2016-04-20",
377
- "heatingLastServiced": "2021-03-26"
390
+ "heatingLastServicedDate": "2021-03-26",
391
+ "heatingLastServicedReport": "To follow"
378
392
  }
379
393
  },
380
394
  "insurance": {
381
395
  "isInsured": "Yes",
382
396
  "difficultiesObtainingInsurance": {
383
- "yesNo": "No"
397
+ "abnormalRiseInPremiums": {
398
+ "yesNo": "Yes",
399
+ "details": "Very history"
400
+ },
401
+ "subjectToHighExcesses": { "yesNo": "No" },
402
+ "subjectToUnusualConditions": { "yesNo": "No" },
403
+ "refused": { "yesNo": "Yes", "details": "Much refuse" }
384
404
  },
385
405
  "insuranceClaims": {
386
406
  "yesNo": "No"
@@ -414,7 +434,10 @@
414
434
  "publicRightOfWay": {
415
435
  "yesNo": "No"
416
436
  },
417
- "rightsOfLightOrSupport": {
437
+ "rightsOfLight": {
438
+ "yesNo": "No"
439
+ },
440
+ "rightsOfSupport": {
418
441
  "yesNo": "No"
419
442
  },
420
443
  "rightsCreatedThroughCustom": {
@@ -426,6 +449,10 @@
426
449
  "churchChancel": {
427
450
  "yesNo": "No"
428
451
  },
452
+ "rightsToTakeFromLand": {
453
+ "yesNo": "Yes",
454
+ "details": "Annual gold mining festival"
455
+ },
429
456
  "otherRights": {
430
457
  "yesNo": "No"
431
458
  }
@@ -437,21 +464,11 @@
437
464
  "hasBeenFlooded": "Yes",
438
465
  "details": "Minor basement flood",
439
466
  "typeOfFlooding": {
440
- "groundWater": {
441
- "yesNo": "No"
442
- },
443
- "sewer": {
444
- "yesNo": "Yes"
445
- },
446
- "surfaceWater": {
447
- "yesNo": "No"
448
- },
449
- "coastal": {
450
- "yesNo": "No"
451
- },
452
- "river": {
453
- "yesNo": "No"
454
- },
467
+ "groundWater": "No",
468
+ "sewer": "Yes",
469
+ "surfaceWater": "No",
470
+ "coastal": "No",
471
+ "river": "No",
455
472
  "other": {
456
473
  "yesNo": "No"
457
474
  }
@@ -485,6 +502,9 @@
485
502
  },
486
503
  "otherMaterialIssue": {
487
504
  "yesNo": "No"
505
+ },
506
+ "otherCharges": {
507
+ "yesNo": "No"
488
508
  }
489
509
  },
490
510
  "consumerProtectionRegulationsDeclaration": {
@@ -511,14 +531,19 @@
511
531
  "legalBoundaries": {
512
532
  "ownership": {
513
533
  "areBoundariesUniform": "Yes",
514
- "left": "Seller",
515
- "right": "Seller",
516
- "rear": "Next-door neighbour",
517
- "front": "Next-door neighbour"
534
+ "uniformBoundaries": {
535
+ "left": "Neighbour",
536
+ "right": "Seller",
537
+ "rear": "Neighbour",
538
+ "front": "Not known"
539
+ }
518
540
  },
519
- "haveBoundaryFeaturesMoved": { "yesNo": "No" },
520
- "adjacentLandIncluded": { "yesNo": "No" },
521
- "flyingFreehold": { "yesNo": "No" }
541
+ "haveBoundaryFeaturesMoved": {
542
+ "yesNo": "Yes",
543
+ "details": "Moved a bit to the lefts"
544
+ },
545
+ "adjacentLandIncluded": { "yesNo": "Yes", "details": "Some movements" },
546
+ "flyingFreehold": { "yesNo": "Yes", "details": "Some flying stuff" }
522
547
  },
523
548
  "servicesCrossing": {
524
549
  "pipesWiresCablesDrainsToProperty": { "yesNo": "No" },
@@ -528,10 +553,15 @@
528
553
  "energyAndMeters": {
529
554
  "testedByQualifiedElectrician": {
530
555
  "yesNo": "Yes",
531
- "details": "2015",
556
+ "yearTested": 2015,
557
+ "attachments": "To follow"
558
+ },
559
+ "electricalWorkSince2005": {
560
+ "yesNo": "Yes",
561
+ "yearWorkCarriedOut": 2016,
562
+ "details": "New fuse box",
532
563
  "attachments": "To follow"
533
564
  },
534
- "electricalWorkSince2005": { "yesNo": "No" },
535
565
  "solarPanels": { "hasSolarPanels": "No" }
536
566
  },
537
567
  "smartHomeSystems": { "hasSmartHomeSystems": "No" },
@@ -552,19 +582,25 @@
552
582
  }
553
583
  },
554
584
  "completionAndMoving": {
555
- "willRemoveAllRubbish": true,
585
+ "sellerWillEnsure": {
586
+ "removeRubbish": true,
587
+ "replaceLightFittings": true,
588
+ "takeReasonableCare": true,
589
+ "leaveKeys": true
590
+ },
556
591
  "otherPropertyInChain": { "yesNo": "No" },
557
- "moveRestrictionDates": { "yesNo": "No" },
558
- "digitalPropertyLogbook": { "yesNo": "No" }
592
+ "moveRestrictionDates": {
593
+ "yesNo": "Yes",
594
+ "details": "On holiday 1-15 Aug 23"
595
+ },
596
+ "digitalPropertyLogbook": { "yesNo": "No" },
597
+ "sufficientToRepayAllMortgages": { "yesNo": "Yes" }
559
598
  },
560
599
  "confirmationOfAccuracyByOwners": {
561
600
  "confirmWillProvideAdditionalDocumentation": true,
562
601
  "confirmInformationIsAccurate": true
563
602
  }
564
603
  },
565
- "energyPerformanceCertificate": {
566
- "certificate": { "currentEnergyRating": "B" }
567
- },
568
604
  "titlesToBeSold": [
569
605
  {
570
606
  "titleNumber": "HD221222",