udp-schema 2.26.0 → 2.28.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,64 @@
1
1
  /**
2
2
  * Step 12 — Household & Economic Profile
3
3
  *
4
- * Fields: maritalStatus, familyMembers, numberOfDependents, housingType,
5
- * householdIncome, bplCard, digitalAccess, migrationStatus,
6
- * landOwnership, primaryIncomeSource
4
+ * Fields: maritalStatus, familyMembers, [14 link sub-step fields gated on
5
+ * familyMembers], numberOfDependents, housingType, householdIncome,
6
+ * bplCard, digitalAccess, migrationStatus, landOwnership, primaryIncomeSource
7
+ *
8
+ * Family member linking:
9
+ * After picking familyMembers (sub-step 2), up to 14 conditional sub-steps
10
+ * appear — one per family-member type the user selected. Each sub-step
11
+ * shows a search UI (by name / email / phone) and lets the user link an
12
+ * existing platform account. Single-instance relations (mother / father
13
+ * / step_*) save as a single link object; multi-instance relations
14
+ * (siblings / children / spouse / other) save as an array.
15
+ *
16
+ * The schema accepts these fields here so they can be validated at save
17
+ * time. The same data is also written to the User collection's
18
+ * `relations` sub-doc on save (indexed for graph traversal).
7
19
  *
8
20
  * @module udp-schema/step-12
9
21
  */
10
22
  import { z } from 'zod';
23
+ /**
24
+ * One family-link entry. `_id` is server-assigned on insert. Both `linkedUserId`
25
+ * and `cachedName` are written together (per the "save id + name" decision —
26
+ * id for joins / graph traversal, name for display without an extra lookup).
27
+ *
28
+ * `mutuallyConfirmed` flips to true when the *other* user adds a reciprocal
29
+ * relation pointing back at this user (computed server-side on save).
30
+ *
31
+ * `verified` / `verifiedAt` / `verifiedBy` are populated when the initiating
32
+ * volunteer marks the family-relations field group as verified per the
33
+ * member's official ID (Phase 4 of the rollout).
34
+ */
35
+ declare const familyLinkSchema: z.ZodObject<{
36
+ _id: z.ZodOptional<z.ZodString>;
37
+ relation: z.ZodEnum<{
38
+ other: "other";
39
+ father: "father";
40
+ mother: "mother";
41
+ step_father: "step_father";
42
+ step_mother: "step_mother";
43
+ wife_husband: "wife_husband";
44
+ blood_brother: "blood_brother";
45
+ blood_sister: "blood_sister";
46
+ half_brother: "half_brother";
47
+ half_sister: "half_sister";
48
+ step_brother: "step_brother";
49
+ step_sister: "step_sister";
50
+ son: "son";
51
+ daughter: "daughter";
52
+ }>;
53
+ linkedUserId: z.ZodString;
54
+ cachedName: z.ZodString;
55
+ cachedAvatarUrl: z.ZodOptional<z.ZodString>;
56
+ mutuallyConfirmed: z.ZodDefault<z.ZodBoolean>;
57
+ verified: z.ZodDefault<z.ZodBoolean>;
58
+ verifiedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
59
+ verifiedBy: z.ZodOptional<z.ZodString>;
60
+ createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
61
+ }, z.core.$strip>;
11
62
  export declare const step12HouseholdSchema: z.ZodObject<{
12
63
  maritalStatus: z.ZodOptional<z.ZodEnum<{
13
64
  prefer_not_to_say: "prefer_not_to_say";
@@ -18,6 +69,384 @@ export declare const step12HouseholdSchema: z.ZodObject<{
18
69
  separated: "separated";
19
70
  }>>;
20
71
  familyMembers: z.ZodOptional<z.ZodArray<z.ZodString>>;
72
+ linkedMother: z.ZodOptional<z.ZodObject<{
73
+ _id: z.ZodOptional<z.ZodString>;
74
+ relation: z.ZodEnum<{
75
+ other: "other";
76
+ father: "father";
77
+ mother: "mother";
78
+ step_father: "step_father";
79
+ step_mother: "step_mother";
80
+ wife_husband: "wife_husband";
81
+ blood_brother: "blood_brother";
82
+ blood_sister: "blood_sister";
83
+ half_brother: "half_brother";
84
+ half_sister: "half_sister";
85
+ step_brother: "step_brother";
86
+ step_sister: "step_sister";
87
+ son: "son";
88
+ daughter: "daughter";
89
+ }>;
90
+ linkedUserId: z.ZodString;
91
+ cachedName: z.ZodString;
92
+ cachedAvatarUrl: z.ZodOptional<z.ZodString>;
93
+ mutuallyConfirmed: z.ZodDefault<z.ZodBoolean>;
94
+ verified: z.ZodDefault<z.ZodBoolean>;
95
+ verifiedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
96
+ verifiedBy: z.ZodOptional<z.ZodString>;
97
+ createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
98
+ }, z.core.$strip>>;
99
+ linkedStepMother: z.ZodOptional<z.ZodObject<{
100
+ _id: z.ZodOptional<z.ZodString>;
101
+ relation: z.ZodEnum<{
102
+ other: "other";
103
+ father: "father";
104
+ mother: "mother";
105
+ step_father: "step_father";
106
+ step_mother: "step_mother";
107
+ wife_husband: "wife_husband";
108
+ blood_brother: "blood_brother";
109
+ blood_sister: "blood_sister";
110
+ half_brother: "half_brother";
111
+ half_sister: "half_sister";
112
+ step_brother: "step_brother";
113
+ step_sister: "step_sister";
114
+ son: "son";
115
+ daughter: "daughter";
116
+ }>;
117
+ linkedUserId: z.ZodString;
118
+ cachedName: z.ZodString;
119
+ cachedAvatarUrl: z.ZodOptional<z.ZodString>;
120
+ mutuallyConfirmed: z.ZodDefault<z.ZodBoolean>;
121
+ verified: z.ZodDefault<z.ZodBoolean>;
122
+ verifiedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
123
+ verifiedBy: z.ZodOptional<z.ZodString>;
124
+ createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
125
+ }, z.core.$strip>>;
126
+ linkedFather: z.ZodOptional<z.ZodObject<{
127
+ _id: z.ZodOptional<z.ZodString>;
128
+ relation: z.ZodEnum<{
129
+ other: "other";
130
+ father: "father";
131
+ mother: "mother";
132
+ step_father: "step_father";
133
+ step_mother: "step_mother";
134
+ wife_husband: "wife_husband";
135
+ blood_brother: "blood_brother";
136
+ blood_sister: "blood_sister";
137
+ half_brother: "half_brother";
138
+ half_sister: "half_sister";
139
+ step_brother: "step_brother";
140
+ step_sister: "step_sister";
141
+ son: "son";
142
+ daughter: "daughter";
143
+ }>;
144
+ linkedUserId: z.ZodString;
145
+ cachedName: z.ZodString;
146
+ cachedAvatarUrl: z.ZodOptional<z.ZodString>;
147
+ mutuallyConfirmed: z.ZodDefault<z.ZodBoolean>;
148
+ verified: z.ZodDefault<z.ZodBoolean>;
149
+ verifiedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
150
+ verifiedBy: z.ZodOptional<z.ZodString>;
151
+ createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
152
+ }, z.core.$strip>>;
153
+ linkedStepFather: z.ZodOptional<z.ZodObject<{
154
+ _id: z.ZodOptional<z.ZodString>;
155
+ relation: z.ZodEnum<{
156
+ other: "other";
157
+ father: "father";
158
+ mother: "mother";
159
+ step_father: "step_father";
160
+ step_mother: "step_mother";
161
+ wife_husband: "wife_husband";
162
+ blood_brother: "blood_brother";
163
+ blood_sister: "blood_sister";
164
+ half_brother: "half_brother";
165
+ half_sister: "half_sister";
166
+ step_brother: "step_brother";
167
+ step_sister: "step_sister";
168
+ son: "son";
169
+ daughter: "daughter";
170
+ }>;
171
+ linkedUserId: z.ZodString;
172
+ cachedName: z.ZodString;
173
+ cachedAvatarUrl: z.ZodOptional<z.ZodString>;
174
+ mutuallyConfirmed: z.ZodDefault<z.ZodBoolean>;
175
+ verified: z.ZodDefault<z.ZodBoolean>;
176
+ verifiedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
177
+ verifiedBy: z.ZodOptional<z.ZodString>;
178
+ createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
179
+ }, z.core.$strip>>;
180
+ linkedSpouses: z.ZodOptional<z.ZodArray<z.ZodObject<{
181
+ _id: z.ZodOptional<z.ZodString>;
182
+ relation: z.ZodEnum<{
183
+ other: "other";
184
+ father: "father";
185
+ mother: "mother";
186
+ step_father: "step_father";
187
+ step_mother: "step_mother";
188
+ wife_husband: "wife_husband";
189
+ blood_brother: "blood_brother";
190
+ blood_sister: "blood_sister";
191
+ half_brother: "half_brother";
192
+ half_sister: "half_sister";
193
+ step_brother: "step_brother";
194
+ step_sister: "step_sister";
195
+ son: "son";
196
+ daughter: "daughter";
197
+ }>;
198
+ linkedUserId: z.ZodString;
199
+ cachedName: z.ZodString;
200
+ cachedAvatarUrl: z.ZodOptional<z.ZodString>;
201
+ mutuallyConfirmed: z.ZodDefault<z.ZodBoolean>;
202
+ verified: z.ZodDefault<z.ZodBoolean>;
203
+ verifiedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
204
+ verifiedBy: z.ZodOptional<z.ZodString>;
205
+ createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
206
+ }, z.core.$strip>>>;
207
+ linkedBloodSisters: z.ZodOptional<z.ZodArray<z.ZodObject<{
208
+ _id: z.ZodOptional<z.ZodString>;
209
+ relation: z.ZodEnum<{
210
+ other: "other";
211
+ father: "father";
212
+ mother: "mother";
213
+ step_father: "step_father";
214
+ step_mother: "step_mother";
215
+ wife_husband: "wife_husband";
216
+ blood_brother: "blood_brother";
217
+ blood_sister: "blood_sister";
218
+ half_brother: "half_brother";
219
+ half_sister: "half_sister";
220
+ step_brother: "step_brother";
221
+ step_sister: "step_sister";
222
+ son: "son";
223
+ daughter: "daughter";
224
+ }>;
225
+ linkedUserId: z.ZodString;
226
+ cachedName: z.ZodString;
227
+ cachedAvatarUrl: z.ZodOptional<z.ZodString>;
228
+ mutuallyConfirmed: z.ZodDefault<z.ZodBoolean>;
229
+ verified: z.ZodDefault<z.ZodBoolean>;
230
+ verifiedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
231
+ verifiedBy: z.ZodOptional<z.ZodString>;
232
+ createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
233
+ }, z.core.$strip>>>;
234
+ linkedHalfSisters: z.ZodOptional<z.ZodArray<z.ZodObject<{
235
+ _id: z.ZodOptional<z.ZodString>;
236
+ relation: z.ZodEnum<{
237
+ other: "other";
238
+ father: "father";
239
+ mother: "mother";
240
+ step_father: "step_father";
241
+ step_mother: "step_mother";
242
+ wife_husband: "wife_husband";
243
+ blood_brother: "blood_brother";
244
+ blood_sister: "blood_sister";
245
+ half_brother: "half_brother";
246
+ half_sister: "half_sister";
247
+ step_brother: "step_brother";
248
+ step_sister: "step_sister";
249
+ son: "son";
250
+ daughter: "daughter";
251
+ }>;
252
+ linkedUserId: z.ZodString;
253
+ cachedName: z.ZodString;
254
+ cachedAvatarUrl: z.ZodOptional<z.ZodString>;
255
+ mutuallyConfirmed: z.ZodDefault<z.ZodBoolean>;
256
+ verified: z.ZodDefault<z.ZodBoolean>;
257
+ verifiedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
258
+ verifiedBy: z.ZodOptional<z.ZodString>;
259
+ createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
260
+ }, z.core.$strip>>>;
261
+ linkedStepSisters: z.ZodOptional<z.ZodArray<z.ZodObject<{
262
+ _id: z.ZodOptional<z.ZodString>;
263
+ relation: z.ZodEnum<{
264
+ other: "other";
265
+ father: "father";
266
+ mother: "mother";
267
+ step_father: "step_father";
268
+ step_mother: "step_mother";
269
+ wife_husband: "wife_husband";
270
+ blood_brother: "blood_brother";
271
+ blood_sister: "blood_sister";
272
+ half_brother: "half_brother";
273
+ half_sister: "half_sister";
274
+ step_brother: "step_brother";
275
+ step_sister: "step_sister";
276
+ son: "son";
277
+ daughter: "daughter";
278
+ }>;
279
+ linkedUserId: z.ZodString;
280
+ cachedName: z.ZodString;
281
+ cachedAvatarUrl: z.ZodOptional<z.ZodString>;
282
+ mutuallyConfirmed: z.ZodDefault<z.ZodBoolean>;
283
+ verified: z.ZodDefault<z.ZodBoolean>;
284
+ verifiedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
285
+ verifiedBy: z.ZodOptional<z.ZodString>;
286
+ createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
287
+ }, z.core.$strip>>>;
288
+ linkedBloodBrothers: z.ZodOptional<z.ZodArray<z.ZodObject<{
289
+ _id: z.ZodOptional<z.ZodString>;
290
+ relation: z.ZodEnum<{
291
+ other: "other";
292
+ father: "father";
293
+ mother: "mother";
294
+ step_father: "step_father";
295
+ step_mother: "step_mother";
296
+ wife_husband: "wife_husband";
297
+ blood_brother: "blood_brother";
298
+ blood_sister: "blood_sister";
299
+ half_brother: "half_brother";
300
+ half_sister: "half_sister";
301
+ step_brother: "step_brother";
302
+ step_sister: "step_sister";
303
+ son: "son";
304
+ daughter: "daughter";
305
+ }>;
306
+ linkedUserId: z.ZodString;
307
+ cachedName: z.ZodString;
308
+ cachedAvatarUrl: z.ZodOptional<z.ZodString>;
309
+ mutuallyConfirmed: z.ZodDefault<z.ZodBoolean>;
310
+ verified: z.ZodDefault<z.ZodBoolean>;
311
+ verifiedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
312
+ verifiedBy: z.ZodOptional<z.ZodString>;
313
+ createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
314
+ }, z.core.$strip>>>;
315
+ linkedHalfBrothers: z.ZodOptional<z.ZodArray<z.ZodObject<{
316
+ _id: z.ZodOptional<z.ZodString>;
317
+ relation: z.ZodEnum<{
318
+ other: "other";
319
+ father: "father";
320
+ mother: "mother";
321
+ step_father: "step_father";
322
+ step_mother: "step_mother";
323
+ wife_husband: "wife_husband";
324
+ blood_brother: "blood_brother";
325
+ blood_sister: "blood_sister";
326
+ half_brother: "half_brother";
327
+ half_sister: "half_sister";
328
+ step_brother: "step_brother";
329
+ step_sister: "step_sister";
330
+ son: "son";
331
+ daughter: "daughter";
332
+ }>;
333
+ linkedUserId: z.ZodString;
334
+ cachedName: z.ZodString;
335
+ cachedAvatarUrl: z.ZodOptional<z.ZodString>;
336
+ mutuallyConfirmed: z.ZodDefault<z.ZodBoolean>;
337
+ verified: z.ZodDefault<z.ZodBoolean>;
338
+ verifiedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
339
+ verifiedBy: z.ZodOptional<z.ZodString>;
340
+ createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
341
+ }, z.core.$strip>>>;
342
+ linkedStepBrothers: z.ZodOptional<z.ZodArray<z.ZodObject<{
343
+ _id: z.ZodOptional<z.ZodString>;
344
+ relation: z.ZodEnum<{
345
+ other: "other";
346
+ father: "father";
347
+ mother: "mother";
348
+ step_father: "step_father";
349
+ step_mother: "step_mother";
350
+ wife_husband: "wife_husband";
351
+ blood_brother: "blood_brother";
352
+ blood_sister: "blood_sister";
353
+ half_brother: "half_brother";
354
+ half_sister: "half_sister";
355
+ step_brother: "step_brother";
356
+ step_sister: "step_sister";
357
+ son: "son";
358
+ daughter: "daughter";
359
+ }>;
360
+ linkedUserId: z.ZodString;
361
+ cachedName: z.ZodString;
362
+ cachedAvatarUrl: z.ZodOptional<z.ZodString>;
363
+ mutuallyConfirmed: z.ZodDefault<z.ZodBoolean>;
364
+ verified: z.ZodDefault<z.ZodBoolean>;
365
+ verifiedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
366
+ verifiedBy: z.ZodOptional<z.ZodString>;
367
+ createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
368
+ }, z.core.$strip>>>;
369
+ linkedDaughters: z.ZodOptional<z.ZodArray<z.ZodObject<{
370
+ _id: z.ZodOptional<z.ZodString>;
371
+ relation: z.ZodEnum<{
372
+ other: "other";
373
+ father: "father";
374
+ mother: "mother";
375
+ step_father: "step_father";
376
+ step_mother: "step_mother";
377
+ wife_husband: "wife_husband";
378
+ blood_brother: "blood_brother";
379
+ blood_sister: "blood_sister";
380
+ half_brother: "half_brother";
381
+ half_sister: "half_sister";
382
+ step_brother: "step_brother";
383
+ step_sister: "step_sister";
384
+ son: "son";
385
+ daughter: "daughter";
386
+ }>;
387
+ linkedUserId: z.ZodString;
388
+ cachedName: z.ZodString;
389
+ cachedAvatarUrl: z.ZodOptional<z.ZodString>;
390
+ mutuallyConfirmed: z.ZodDefault<z.ZodBoolean>;
391
+ verified: z.ZodDefault<z.ZodBoolean>;
392
+ verifiedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
393
+ verifiedBy: z.ZodOptional<z.ZodString>;
394
+ createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
395
+ }, z.core.$strip>>>;
396
+ linkedSons: z.ZodOptional<z.ZodArray<z.ZodObject<{
397
+ _id: z.ZodOptional<z.ZodString>;
398
+ relation: z.ZodEnum<{
399
+ other: "other";
400
+ father: "father";
401
+ mother: "mother";
402
+ step_father: "step_father";
403
+ step_mother: "step_mother";
404
+ wife_husband: "wife_husband";
405
+ blood_brother: "blood_brother";
406
+ blood_sister: "blood_sister";
407
+ half_brother: "half_brother";
408
+ half_sister: "half_sister";
409
+ step_brother: "step_brother";
410
+ step_sister: "step_sister";
411
+ son: "son";
412
+ daughter: "daughter";
413
+ }>;
414
+ linkedUserId: z.ZodString;
415
+ cachedName: z.ZodString;
416
+ cachedAvatarUrl: z.ZodOptional<z.ZodString>;
417
+ mutuallyConfirmed: z.ZodDefault<z.ZodBoolean>;
418
+ verified: z.ZodDefault<z.ZodBoolean>;
419
+ verifiedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
420
+ verifiedBy: z.ZodOptional<z.ZodString>;
421
+ createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
422
+ }, z.core.$strip>>>;
423
+ linkedOthers: z.ZodOptional<z.ZodArray<z.ZodObject<{
424
+ _id: z.ZodOptional<z.ZodString>;
425
+ relation: z.ZodEnum<{
426
+ other: "other";
427
+ father: "father";
428
+ mother: "mother";
429
+ step_father: "step_father";
430
+ step_mother: "step_mother";
431
+ wife_husband: "wife_husband";
432
+ blood_brother: "blood_brother";
433
+ blood_sister: "blood_sister";
434
+ half_brother: "half_brother";
435
+ half_sister: "half_sister";
436
+ step_brother: "step_brother";
437
+ step_sister: "step_sister";
438
+ son: "son";
439
+ daughter: "daughter";
440
+ }>;
441
+ linkedUserId: z.ZodString;
442
+ cachedName: z.ZodString;
443
+ cachedAvatarUrl: z.ZodOptional<z.ZodString>;
444
+ mutuallyConfirmed: z.ZodDefault<z.ZodBoolean>;
445
+ verified: z.ZodDefault<z.ZodBoolean>;
446
+ verifiedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
447
+ verifiedBy: z.ZodOptional<z.ZodString>;
448
+ createdAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
449
+ }, z.core.$strip>>>;
21
450
  numberOfDependents: z.ZodOptional<z.ZodNumber>;
22
451
  housingType: z.ZodOptional<z.ZodEnum<{
23
452
  other: "other";
@@ -63,4 +492,6 @@ export declare const step12HouseholdSchema: z.ZodObject<{
63
492
  }>>;
64
493
  }, z.core.$strip>;
65
494
  export type Step12HouseholdInput = z.infer<typeof step12HouseholdSchema>;
495
+ export type FamilyLink = z.infer<typeof familyLinkSchema>;
496
+ export {};
66
497
  //# sourceMappingURL=step-12.schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"step-12.schema.d.ts","sourceRoot":"","sources":["../src/step-12.schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyDhC,CAAC;AAIH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
1
+ {"version":3,"file":"step-12.schema.d.ts","sourceRoot":"","sources":["../src/step-12.schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0BpB,CAAC;AAIH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4EhC,CAAC;AAIH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACzE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -1,13 +1,65 @@
1
1
  /**
2
2
  * Step 12 — Household & Economic Profile
3
3
  *
4
- * Fields: maritalStatus, familyMembers, numberOfDependents, housingType,
5
- * householdIncome, bplCard, digitalAccess, migrationStatus,
6
- * landOwnership, primaryIncomeSource
4
+ * Fields: maritalStatus, familyMembers, [14 link sub-step fields gated on
5
+ * familyMembers], numberOfDependents, housingType, householdIncome,
6
+ * bplCard, digitalAccess, migrationStatus, landOwnership, primaryIncomeSource
7
+ *
8
+ * Family member linking:
9
+ * After picking familyMembers (sub-step 2), up to 14 conditional sub-steps
10
+ * appear — one per family-member type the user selected. Each sub-step
11
+ * shows a search UI (by name / email / phone) and lets the user link an
12
+ * existing platform account. Single-instance relations (mother / father
13
+ * / step_*) save as a single link object; multi-instance relations
14
+ * (siblings / children / spouse / other) save as an array.
15
+ *
16
+ * The schema accepts these fields here so they can be validated at save
17
+ * time. The same data is also written to the User collection's
18
+ * `relations` sub-doc on save (indexed for graph traversal).
7
19
  *
8
20
  * @module udp-schema/step-12
9
21
  */
10
22
  import { z } from 'zod';
23
+ // ─── Family-link sub-schema ─────────────────────────────────────────────────
24
+ /**
25
+ * One family-link entry. `_id` is server-assigned on insert. Both `linkedUserId`
26
+ * and `cachedName` are written together (per the "save id + name" decision —
27
+ * id for joins / graph traversal, name for display without an extra lookup).
28
+ *
29
+ * `mutuallyConfirmed` flips to true when the *other* user adds a reciprocal
30
+ * relation pointing back at this user (computed server-side on save).
31
+ *
32
+ * `verified` / `verifiedAt` / `verifiedBy` are populated when the initiating
33
+ * volunteer marks the family-relations field group as verified per the
34
+ * member's official ID (Phase 4 of the rollout).
35
+ */
36
+ const familyLinkSchema = z.object({
37
+ _id: z.string().optional(),
38
+ relation: z.enum([
39
+ 'mother',
40
+ 'step_mother',
41
+ 'father',
42
+ 'step_father',
43
+ 'wife_husband',
44
+ 'blood_sister',
45
+ 'half_sister',
46
+ 'step_sister',
47
+ 'blood_brother',
48
+ 'half_brother',
49
+ 'step_brother',
50
+ 'daughter',
51
+ 'son',
52
+ 'other',
53
+ ]),
54
+ linkedUserId: z.string(),
55
+ cachedName: z.string(),
56
+ cachedAvatarUrl: z.string().optional(),
57
+ mutuallyConfirmed: z.boolean().default(false),
58
+ verified: z.boolean().default(false),
59
+ verifiedAt: z.coerce.date().optional(),
60
+ verifiedBy: z.string().optional(),
61
+ createdAt: z.coerce.date().optional(),
62
+ });
11
63
  // ─── Main Step 12 Schema ────────────────────────────────────────────────────
12
64
  export const step12HouseholdSchema = z.object({
13
65
  /** Marital status */
@@ -16,6 +68,23 @@ export const step12HouseholdSchema = z.object({
16
68
  .optional(),
17
69
  /** Family members present (multi-select string array) */
18
70
  familyMembers: z.array(z.string().trim()).optional(),
71
+ // ── Family-link fields (gated on familyMembers via includesAny) ──
72
+ // Single-instance relations: at most one link
73
+ linkedMother: familyLinkSchema.optional(),
74
+ linkedStepMother: familyLinkSchema.optional(),
75
+ linkedFather: familyLinkSchema.optional(),
76
+ linkedStepFather: familyLinkSchema.optional(),
77
+ // Multi-instance relations: arrays
78
+ linkedSpouses: z.array(familyLinkSchema).optional(),
79
+ linkedBloodSisters: z.array(familyLinkSchema).optional(),
80
+ linkedHalfSisters: z.array(familyLinkSchema).optional(),
81
+ linkedStepSisters: z.array(familyLinkSchema).optional(),
82
+ linkedBloodBrothers: z.array(familyLinkSchema).optional(),
83
+ linkedHalfBrothers: z.array(familyLinkSchema).optional(),
84
+ linkedStepBrothers: z.array(familyLinkSchema).optional(),
85
+ linkedDaughters: z.array(familyLinkSchema).optional(),
86
+ linkedSons: z.array(familyLinkSchema).optional(),
87
+ linkedOthers: z.array(familyLinkSchema).optional(),
19
88
  /** Number of financial dependents */
20
89
  numberOfDependents: z.number().int().min(0).max(50).optional(),
21
90
  /** Housing type */
@@ -1 +1 @@
1
- {"version":3,"file":"step-12.schema.js","sourceRoot":"","sources":["../src/step-12.schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,qBAAqB;IACrB,aAAa,EAAE,CAAC;SACb,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC;SACpF,QAAQ,EAAE;IAEb,yDAAyD;IACzD,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE;IAEpD,qCAAqC;IACrC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IAE9D,mBAAmB;IACnB,WAAW,EAAE,CAAC;SACX,IAAI,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,qBAAqB,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;SACnF,QAAQ,EAAE;IAEb,uCAAuC;IACvC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IAE7C,8BAA8B;IAC9B,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE;IAEjE,iDAAiD;IACjD,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE;IAEpD,uBAAuB;IACvB,eAAe,EAAE,CAAC;SACf,IAAI,CAAC,CAAC,QAAQ,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;SACnF,QAAQ,EAAE;IAEb,qBAAqB;IACrB,aAAa,EAAE,CAAC;SACb,IAAI,CAAC;QACJ,kBAAkB;QAClB,iBAAiB;QACjB,qBAAqB;QACrB,SAAS;QACT,QAAQ;QACR,OAAO;KACR,CAAC;SACD,QAAQ,EAAE;IAEb,4BAA4B;IAC5B,mBAAmB,EAAE,CAAC;SACnB,IAAI,CAAC;QACJ,aAAa;QACb,gBAAgB;QAChB,aAAa;QACb,UAAU;QACV,YAAY;QACZ,SAAS;QACT,YAAY;QACZ,iBAAiB;QACjB,OAAO;KACR,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC","sourcesContent":["/**\n * Step 12 — Household & Economic Profile\n *\n * Fields: maritalStatus, familyMembers, numberOfDependents, housingType,\n * householdIncome, bplCard, digitalAccess, migrationStatus,\n * landOwnership, primaryIncomeSource\n *\n * @module udp-schema/step-12\n */\n\nimport { z } from 'zod';\n\n// ─── Main Step 12 Schema ────────────────────────────────────────────────────\n\nexport const step12HouseholdSchema = z.object({\n /** Marital status */\n maritalStatus: z\n .enum(['single', 'married', 'divorced', 'widowed', 'separated', 'prefer_not_to_say'])\n .optional(),\n\n /** Family members present (multi-select string array) */\n familyMembers: z.array(z.string().trim()).optional(),\n\n /** Number of financial dependents */\n numberOfDependents: z.number().int().min(0).max(50).optional(),\n\n /** Housing type */\n housingType: z\n .enum(['own_house', 'rented', 'government_quarters', 'shared', 'homeless', 'other'])\n .optional(),\n\n /** Household income range (monthly) */\n householdIncome: z.string().trim().optional(),\n\n /** Below Poverty Line card */\n bplCard: z.enum(['yes', 'no', 'applied', 'dont_know']).optional(),\n\n /** Digital access (multi-select string array) */\n digitalAccess: z.array(z.string().trim()).optional(),\n\n /** Migration status */\n migrationStatus: z\n .enum(['native', 'within_district', 'within_state', 'inter_state', 'international'])\n .optional(),\n\n /** Land ownership */\n landOwnership: z\n .enum([\n 'own_agricultural',\n 'own_residential',\n 'government_allotted',\n 'no_land',\n 'leased',\n 'other',\n ])\n .optional(),\n\n /** Primary income source */\n primaryIncomeSource: z\n .enum([\n 'agriculture',\n 'government_job',\n 'private_job',\n 'business',\n 'daily_wage',\n 'pension',\n 'remittance',\n 'no_fixed_income',\n 'other',\n ])\n .optional(),\n});\n\n// ─── Inferred types ─────────────────────────────────────────────────────────\n\nexport type Step12HouseholdInput = z.infer<typeof step12HouseholdSchema>;\n"]}
1
+ {"version":3,"file":"step-12.schema.js","sourceRoot":"","sources":["../src/step-12.schema.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Step 12 — Household & Economic Profile\n *\n * Fields: maritalStatus, familyMembers, [14 link sub-step fields gated on\n * familyMembers], numberOfDependents, housingType, householdIncome,\n * bplCard, digitalAccess, migrationStatus, landOwnership, primaryIncomeSource\n *\n * Family member linking:\n * After picking familyMembers (sub-step 2), up to 14 conditional sub-steps\n * appear — one per family-member type the user selected. Each sub-step\n * shows a search UI (by name / email / phone) and lets the user link an\n * existing platform account. Single-instance relations (mother / father\n * / step_*) save as a single link object; multi-instance relations\n * (siblings / children / spouse / other) save as an array.\n *\n * The schema accepts these fields here so they can be validated at save\n * time. The same data is also written to the User collection's\n * `relations` sub-doc on save (indexed for graph traversal).\n *\n * @module udp-schema/step-12\n */\n\nimport { z } from 'zod';\n\n// ─── Family-link sub-schema ─────────────────────────────────────────────────\n\n/**\n * One family-link entry. `_id` is server-assigned on insert. Both `linkedUserId`\n * and `cachedName` are written together (per the \"save id + name\" decision —\n * id for joins / graph traversal, name for display without an extra lookup).\n *\n * `mutuallyConfirmed` flips to true when the *other* user adds a reciprocal\n * relation pointing back at this user (computed server-side on save).\n *\n * `verified` / `verifiedAt` / `verifiedBy` are populated when the initiating\n * volunteer marks the family-relations field group as verified per the\n * member's official ID (Phase 4 of the rollout).\n */\nconst familyLinkSchema = z.object({\n _id: z.string().optional(),\n relation: z.enum([\n 'mother',\n 'step_mother',\n 'father',\n 'step_father',\n 'wife_husband',\n 'blood_sister',\n 'half_sister',\n 'step_sister',\n 'blood_brother',\n 'half_brother',\n 'step_brother',\n 'daughter',\n 'son',\n 'other',\n ]),\n linkedUserId: z.string(),\n cachedName: z.string(),\n cachedAvatarUrl: z.string().optional(),\n mutuallyConfirmed: z.boolean().default(false),\n verified: z.boolean().default(false),\n verifiedAt: z.coerce.date().optional(),\n verifiedBy: z.string().optional(),\n createdAt: z.coerce.date().optional(),\n});\n\n// ─── Main Step 12 Schema ────────────────────────────────────────────────────\n\nexport const step12HouseholdSchema = z.object({\n /** Marital status */\n maritalStatus: z\n .enum(['single', 'married', 'divorced', 'widowed', 'separated', 'prefer_not_to_say'])\n .optional(),\n\n /** Family members present (multi-select string array) */\n familyMembers: z.array(z.string().trim()).optional(),\n\n // ── Family-link fields (gated on familyMembers via includesAny) ──\n // Single-instance relations: at most one link\n linkedMother: familyLinkSchema.optional(),\n linkedStepMother: familyLinkSchema.optional(),\n linkedFather: familyLinkSchema.optional(),\n linkedStepFather: familyLinkSchema.optional(),\n\n // Multi-instance relations: arrays\n linkedSpouses: z.array(familyLinkSchema).optional(),\n linkedBloodSisters: z.array(familyLinkSchema).optional(),\n linkedHalfSisters: z.array(familyLinkSchema).optional(),\n linkedStepSisters: z.array(familyLinkSchema).optional(),\n linkedBloodBrothers: z.array(familyLinkSchema).optional(),\n linkedHalfBrothers: z.array(familyLinkSchema).optional(),\n linkedStepBrothers: z.array(familyLinkSchema).optional(),\n linkedDaughters: z.array(familyLinkSchema).optional(),\n linkedSons: z.array(familyLinkSchema).optional(),\n linkedOthers: z.array(familyLinkSchema).optional(),\n\n /** Number of financial dependents */\n numberOfDependents: z.number().int().min(0).max(50).optional(),\n\n /** Housing type */\n housingType: z\n .enum(['own_house', 'rented', 'government_quarters', 'shared', 'homeless', 'other'])\n .optional(),\n\n /** Household income range (monthly) */\n householdIncome: z.string().trim().optional(),\n\n /** Below Poverty Line card */\n bplCard: z.enum(['yes', 'no', 'applied', 'dont_know']).optional(),\n\n /** Digital access (multi-select string array) */\n digitalAccess: z.array(z.string().trim()).optional(),\n\n /** Migration status */\n migrationStatus: z\n .enum(['native', 'within_district', 'within_state', 'inter_state', 'international'])\n .optional(),\n\n /** Land ownership */\n landOwnership: z\n .enum([\n 'own_agricultural',\n 'own_residential',\n 'government_allotted',\n 'no_land',\n 'leased',\n 'other',\n ])\n .optional(),\n\n /** Primary income source */\n primaryIncomeSource: z\n .enum([\n 'agriculture',\n 'government_job',\n 'private_job',\n 'business',\n 'daily_wage',\n 'pension',\n 'remittance',\n 'no_fixed_income',\n 'other',\n ])\n .optional(),\n});\n\n// ─── Inferred types ─────────────────────────────────────────────────────────\n\nexport type Step12HouseholdInput = z.infer<typeof step12HouseholdSchema>;\nexport type FamilyLink = z.infer<typeof familyLinkSchema>;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "udp-schema",
3
- "version": "2.26.0",
3
+ "version": "2.28.0",
4
4
  "description": "Shared Zod schemas for User Detailed Profile (frontend + backend).",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",