@opencrvs/toolkit 1.8.1-rc.e32d7b8 → 1.8.1-rc.e59d03c

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 (32) hide show
  1. package/dist/commons/api/router.d.ts +433 -796
  2. package/dist/commons/conditionals/validate.d.ts +11 -2
  3. package/dist/commons/events/ActionConfig.d.ts +2004 -366
  4. package/dist/commons/events/ActionDocument.d.ts +1302 -1389
  5. package/dist/commons/events/ActionInput.d.ts +658 -1136
  6. package/dist/commons/events/AdvancedSearchConfig.d.ts +83 -65
  7. package/dist/commons/events/CompositeFieldValue.d.ts +6 -6
  8. package/dist/commons/events/CountryConfigQueryInput.d.ts +88 -88
  9. package/dist/commons/events/Draft.d.ts +48 -92
  10. package/dist/commons/events/EventConfig.d.ts +695 -168
  11. package/dist/commons/events/EventDocument.d.ts +475 -846
  12. package/dist/commons/events/EventIndex.d.ts +184 -62
  13. package/dist/commons/events/EventMetadata.d.ts +9 -9
  14. package/dist/commons/events/FieldConfig.d.ts +254 -43
  15. package/dist/commons/events/FieldTypeMapping.d.ts +16 -16
  16. package/dist/commons/events/FieldValue.d.ts +12 -12
  17. package/dist/commons/events/FormConfig.d.ts +1032 -246
  18. package/dist/commons/events/PageConfig.d.ts +264 -46
  19. package/dist/commons/events/WorkqueueConfig.d.ts +288 -164
  20. package/dist/commons/events/defineConfig.d.ts +129 -30
  21. package/dist/commons/events/event.d.ts +68 -6
  22. package/dist/commons/events/field.d.ts +14 -0
  23. package/dist/commons/events/test.utils.d.ts +17 -13
  24. package/dist/commons/events/utils.d.ts +236 -64
  25. package/dist/conditionals/index.js +3 -2
  26. package/dist/events/index.js +265 -102
  27. package/package.json +1 -1
  28. package/tsconfig.json +1 -1
  29. package/dist/commons/conditionals/conditionals.test.d.ts +0 -2
  30. package/dist/commons/conditionals/validate-address.test.d.ts +0 -2
  31. package/dist/commons/conditionals/validate.test.d.ts +0 -2
  32. package/dist/commons/events/utils.test.d.ts +0 -2
@@ -39,8 +39,8 @@ __export(events_exports, {
39
39
  ActionConfig: () => ActionConfig,
40
40
  ActionConfigBase: () => ActionConfigBase,
41
41
  ActionCreationMetadata: () => ActionCreationMetadata,
42
- ActionDetails: () => ActionDetails,
43
42
  ActionDocument: () => ActionDocument,
43
+ ActionFlag: () => ActionFlag,
44
44
  ActionFormConfig: () => ActionFormConfig,
45
45
  ActionInput: () => ActionInput,
46
46
  ActionStatus: () => ActionStatus,
@@ -96,6 +96,7 @@ __export(events_exports, {
96
96
  EventDocument: () => EventDocument,
97
97
  EventFieldConfigSchema: () => EventFieldConfigSchema,
98
98
  EventFieldId: () => EventFieldId,
99
+ EventFieldIdInput: () => EventFieldIdInput,
99
100
  EventIndex: () => EventIndex,
100
101
  EventInput: () => EventInput,
101
102
  EventMetadata: () => EventMetadata,
@@ -130,8 +131,10 @@ __export(events_exports, {
130
131
  InherentFlags: () => InherentFlags,
131
132
  LanguageConfig: () => LanguageConfig,
132
133
  LegalStatuses: () => LegalStatuses,
134
+ METADATA_FIELD_PREFIX: () => METADATA_FIELD_PREFIX,
133
135
  MarkedAsDuplicateActionInput: () => MarkedAsDuplicateActionInput,
134
136
  MimeType: () => MimeType,
137
+ NameConfig: () => NameConfig,
135
138
  NameFieldUpdateValue: () => NameFieldUpdateValue,
136
139
  NameFieldValue: () => NameFieldValue,
137
140
  NonEmptyTextValue: () => NonEmptyTextValue,
@@ -140,6 +143,7 @@ __export(events_exports, {
140
143
  PageConfig: () => PageConfig,
141
144
  PageTypes: () => PageTypes,
142
145
  PrintCertificateActionInput: () => PrintCertificateActionInput,
146
+ PrintContent: () => PrintContent,
143
147
  QueryExpression: () => QueryExpression,
144
148
  QueryInput: () => QueryInput,
145
149
  QueryType: () => QueryType,
@@ -168,6 +172,7 @@ __export(events_exports, {
168
172
  TENNIS_CLUB_MEMBERSHIP: () => TENNIS_CLUB_MEMBERSHIP,
169
173
  TEST_SYSTEM_IANA_TIMEZONE: () => TEST_SYSTEM_IANA_TIMEZONE,
170
174
  TestUserRole: () => TestUserRole,
175
+ TextField: () => TextField,
171
176
  TextValue: () => TextValue,
172
177
  TimeValue: () => TimeValue,
173
178
  TranslationConfig: () => TranslationConfig,
@@ -179,7 +184,6 @@ __export(events_exports, {
179
184
  ValidationConfig: () => ValidationConfig,
180
185
  VerificationActionConfig: () => VerificationActionConfig,
181
186
  VerificationPageConfig: () => VerificationPageConfig,
182
- VisibleStatus: () => VisibleStatus,
183
187
  WRITE_ACTION_SCOPES: () => WRITE_ACTION_SCOPES,
184
188
  Within: () => Within,
185
189
  WorkqueueActionsWithDefault: () => WorkqueueActionsWithDefault,
@@ -198,6 +202,7 @@ __export(events_exports, {
198
202
  annotationActions: () => annotationActions,
199
203
  applyDeclarationToEventIndex: () => applyDeclarationToEventIndex,
200
204
  applyDraftsToEventIndex: () => applyDraftsToEventIndex,
205
+ areCertificateConditionsMet: () => areCertificateConditionsMet,
201
206
  areConditionsMet: () => areConditionsMet,
202
207
  compositeFieldTypes: () => compositeFieldTypes,
203
208
  createEmptyDraft: () => createEmptyDraft,
@@ -321,6 +326,7 @@ __export(events_exports, {
321
326
  or: () => or,
322
327
  resolveDateOfEvent: () => resolveDateOfEvent,
323
328
  runFieldValidations: () => runFieldValidations,
329
+ runStructuralValidations: () => runStructuralValidations,
324
330
  timePeriodToDateRange: () => timePeriodToDateRange,
325
331
  user: () => user,
326
332
  validate: () => validate,
@@ -555,7 +561,7 @@ var import_zod6 = require("zod");
555
561
  var import_zod4 = require("zod");
556
562
  var import_zod_openapi3 = require("zod-openapi");
557
563
  (0, import_zod_openapi3.extendZodWithOpenApi)(import_zod4.z);
558
- var FullDocumentURL = import_zod4.z.string().brand("FullDocumentURL").describe(
564
+ var FullDocumentUrl = import_zod4.z.string().brand("FullDocumentUrl").describe(
559
565
  "A full url with protocol, host, bucket name, starting from the root of the S3 server, https://minio/bucket-name/document-id.jpg"
560
566
  );
561
567
  var FullDocumentPath = import_zod4.z.string().transform((val) => val.startsWith("/") ? val : `/${val}`).openapi({ effectType: "input", type: "string" }).describe(
@@ -612,8 +618,8 @@ var NameFieldValue = import_zod5.z.object({
612
618
  middlename: import_zod5.z.string().optional()
613
619
  });
614
620
  var NameFieldUpdateValue = import_zod5.z.object({
615
- firstname: import_zod5.z.string().nullish(),
616
- surname: import_zod5.z.string().nullish(),
621
+ firstname: import_zod5.z.string(),
622
+ surname: import_zod5.z.string(),
617
623
  middlename: import_zod5.z.string().nullish()
618
624
  }).or(import_zod5.z.null()).or(import_zod5.z.undefined());
619
625
  var RuralAddressUpdateValue = AdminStructure.extend({
@@ -910,18 +916,32 @@ var SelectDateRangeField = BaseField.extend({
910
916
  defaultValue: SelectDateRangeValue.optional(),
911
917
  options: import_zod7.z.array(SelectDateRangeOption).describe("A list of options")
912
918
  }).describe("Select input with date range options");
919
+ var NameConfig = import_zod7.z.object({
920
+ firstname: import_zod7.z.object({ required: import_zod7.z.boolean() }).optional(),
921
+ middlename: import_zod7.z.object({ required: import_zod7.z.boolean() }).optional(),
922
+ surname: import_zod7.z.object({ required: import_zod7.z.boolean() }).optional()
923
+ });
913
924
  var NameField = BaseField.extend({
914
925
  type: import_zod7.z.literal(FieldType.NAME),
915
926
  defaultValue: import_zod7.z.object({
916
- firstname: NonEmptyTextValue,
917
- surname: NonEmptyTextValue
927
+ firstname: NonEmptyTextValue.optional(),
928
+ middlename: NonEmptyTextValue.optional(),
929
+ surname: NonEmptyTextValue.optional()
918
930
  }).optional(),
919
931
  configuration: import_zod7.z.object({
932
+ name: NameConfig.default({
933
+ firstname: { required: true },
934
+ surname: { required: true }
935
+ }).optional(),
920
936
  maxLength: import_zod7.z.number().optional().describe("Maximum length of the text"),
921
937
  prefix: TranslationConfig.optional(),
922
938
  postfix: TranslationConfig.optional(),
923
- includeMiddlename: import_zod7.z.boolean().default(false).optional().describe("To make middle name visible in Name form field"),
924
939
  searchMode: import_zod7.z.boolean().optional()
940
+ }).default({
941
+ name: {
942
+ firstname: { required: true },
943
+ surname: { required: true }
944
+ }
925
945
  }).optional()
926
946
  }).describe("Name input field");
927
947
  var PhoneField = BaseField.extend({
@@ -1223,7 +1243,8 @@ var CertificateConfig = import_zod11.z.object({
1223
1243
  delayed: import_zod11.z.number()
1224
1244
  }),
1225
1245
  svgUrl: import_zod11.z.string(),
1226
- fonts: import_zod11.z.record(FontFamily).optional()
1246
+ fonts: import_zod11.z.record(FontFamily).optional(),
1247
+ conditionals: import_zod11.z.array(ShowConditional).optional()
1227
1248
  });
1228
1249
  var CertificateTemplateConfig = CertificateConfig.extend({
1229
1250
  hash: import_zod11.z.string().optional(),
@@ -1341,7 +1362,7 @@ var SummaryConfig = import_zod14.z.object({
1341
1362
 
1342
1363
  // ../commons/src/events/AdvancedSearchConfig.ts
1343
1364
  var import_zod15 = require("zod");
1344
- var MatchType = import_zod15.z.enum(["fuzzy", "exact", "range"]);
1365
+ var MatchType = import_zod15.z.enum(["fuzzy", "exact", "range", "within"]);
1345
1366
  var BaseField3 = import_zod15.z.object({
1346
1367
  config: import_zod15.z.object({
1347
1368
  type: MatchType.describe("Determines the type of field")
@@ -1395,22 +1416,30 @@ var FieldConfigSchema = BaseField3.extend({
1395
1416
  fieldType: import_zod15.z.literal("field"),
1396
1417
  alternateFieldIds: import_zod15.z.array(import_zod15.z.string()).optional().describe(
1397
1418
  `Sometimes there might be need to search a value against multiple field of same FormField type. For example
1398
- search Country, Province, District against child.address.private and child.address.other. In such case, we
1419
+ search Country, Province, District against child.address.private and child.address.other. In such case, we
1399
1420
  add a one field as fieldId, and accomodate others in alternateFieldIds`
1400
1421
  ),
1401
- excludeInSearchQuery: import_zod15.z.boolean().default(false).optional().describe(`Sometimes there will be search fields which are used to
1402
- conditionally display another search field, but its not needed in search query. For example, child.placeOfBirth
1422
+ excludeInSearchQuery: import_zod15.z.boolean().default(false).optional().describe(`Sometimes there will be search fields which are used to
1423
+ conditionally display another search field, but its not needed in search query. For example, child.placeOfBirth
1403
1424
  is select field, which has 3 options, FACILITY, PRIVATE_HOME, OTHER. Upon selecting any of the option, pops up another field
1404
1425
  related to the selected option, whose value is required in the search query. But child.placeOfBirth itself is not needed in the query.
1405
1426
  In such case, populate this field (excludeInSearchQuery) with boolean true`)
1406
1427
  });
1407
- var EventFieldId = import_zod15.z.enum([
1428
+ var EventFieldIdInput = import_zod15.z.enum([
1408
1429
  "trackingId",
1409
1430
  "status",
1410
1431
  "legalStatuses.REGISTERED.acceptedAt",
1411
1432
  "legalStatuses.REGISTERED.createdAtLocation",
1412
1433
  "updatedAt"
1413
1434
  ]);
1435
+ var METADATA_FIELD_PREFIX = "event.";
1436
+ var EventFieldId = import_zod15.z.enum([
1437
+ `${METADATA_FIELD_PREFIX}trackingId`,
1438
+ `${METADATA_FIELD_PREFIX}status`,
1439
+ `${METADATA_FIELD_PREFIX}legalStatuses.REGISTERED.acceptedAt`,
1440
+ `${METADATA_FIELD_PREFIX}legalStatuses.REGISTERED.createdAtLocation`,
1441
+ `${METADATA_FIELD_PREFIX}updatedAt`
1442
+ ]);
1414
1443
  var EventFieldConfigSchema = BaseField3.extend({
1415
1444
  fieldId: EventFieldId,
1416
1445
  fieldType: import_zod15.z.literal("event")
@@ -1883,10 +1912,6 @@ var ActionStatus = {
1883
1912
  Accepted: "Accepted",
1884
1913
  Rejected: "Rejected"
1885
1914
  };
1886
- var ActionDetails = import_zod19.z.object({
1887
- templateId: import_zod19.z.string().optional(),
1888
- isImmediateCorrection: import_zod19.z.boolean().optional()
1889
- });
1890
1915
  var ActionBase = import_zod19.z.object({
1891
1916
  id: UUID,
1892
1917
  transactionId: import_zod19.z.string(),
@@ -1898,7 +1923,6 @@ var ActionBase = import_zod19.z.object({
1898
1923
  createdAtLocation: CreatedAtLocation,
1899
1924
  declaration: ActionUpdate,
1900
1925
  annotation: ActionUpdate.optional().nullable(),
1901
- actionDetails: ActionDetails.optional().nullable(),
1902
1926
  status: import_zod19.z.enum([
1903
1927
  ActionStatus.Requested,
1904
1928
  ActionStatus.Accepted,
@@ -1908,11 +1932,15 @@ var ActionBase = import_zod19.z.object({
1908
1932
  originalActionId: UUID.optional().nullable().describe(
1909
1933
  "Reference to the original action that was asynchronously rejected or accepted by 3rd party integration."
1910
1934
  )
1935
+ // 'content' field reserved for additional data
1936
+ // Each action can define its own content specifc to the action
1937
+ // See PrintCertificateAction
1911
1938
  });
1912
1939
  var AssignedAction = ActionBase.merge(
1913
1940
  import_zod19.z.object({
1914
1941
  type: import_zod19.z.literal(ActionType.ASSIGN),
1915
1942
  assignedTo: import_zod19.z.string()
1943
+ // TODO move into 'content' property
1916
1944
  })
1917
1945
  );
1918
1946
  var UnassignedAction = ActionBase.merge(
@@ -1924,6 +1952,7 @@ var RegisterAction = ActionBase.merge(
1924
1952
  import_zod19.z.object({
1925
1953
  type: import_zod19.z.literal(ActionType.REGISTER),
1926
1954
  registrationNumber: import_zod19.z.string().optional()
1955
+ // TODO move into 'content' property
1927
1956
  })
1928
1957
  );
1929
1958
  var DeclareAction = ActionBase.merge(
@@ -1944,6 +1973,7 @@ var RejectAction = ActionBase.merge(
1944
1973
  import_zod19.z.object({
1945
1974
  type: import_zod19.z.literal(ActionType.REJECT),
1946
1975
  reason: RejectionReason
1976
+ // TODO move into 'content' property
1947
1977
  })
1948
1978
  );
1949
1979
  var MarkAsDuplicateAction = ActionBase.merge(
@@ -1955,6 +1985,7 @@ var ArchiveAction = ActionBase.merge(
1955
1985
  import_zod19.z.object({
1956
1986
  type: import_zod19.z.literal(ActionType.ARCHIVE),
1957
1987
  reason: RejectionReason
1988
+ // TODO move into 'content' property
1958
1989
  })
1959
1990
  );
1960
1991
  var CreatedAction = ActionBase.merge(
@@ -1967,9 +1998,13 @@ var NotifiedAction = ActionBase.merge(
1967
1998
  type: import_zod19.z.literal(ActionType.NOTIFY)
1968
1999
  })
1969
2000
  );
2001
+ var PrintContent = import_zod19.z.object({
2002
+ templateId: import_zod19.z.string().optional()
2003
+ });
1970
2004
  var PrintCertificateAction = ActionBase.merge(
1971
2005
  import_zod19.z.object({
1972
- type: import_zod19.z.literal(ActionType.PRINT_CERTIFICATE)
2006
+ type: import_zod19.z.literal(ActionType.PRINT_CERTIFICATE),
2007
+ content: PrintContent.optional().nullable()
1973
2008
  })
1974
2009
  );
1975
2010
  var RequestedCorrectionAction = ActionBase.merge(
@@ -1981,12 +2016,15 @@ var ApprovedCorrectionAction = ActionBase.merge(
1981
2016
  import_zod19.z.object({
1982
2017
  type: import_zod19.z.literal(ActionType.APPROVE_CORRECTION),
1983
2018
  requestId: import_zod19.z.string()
2019
+ // TODO move into 'content' property
1984
2020
  })
1985
2021
  );
1986
2022
  var RejectedCorrectionAction = ActionBase.merge(
1987
2023
  import_zod19.z.object({
1988
2024
  type: import_zod19.z.literal(ActionType.REJECT_CORRECTION),
1989
- requestId: import_zod19.z.string()
2025
+ requestId: import_zod19.z.string(),
2026
+ // TODO move into 'content' property
2027
+ reason: RejectionReason
1990
2028
  })
1991
2029
  );
1992
2030
  var ReadAction = ActionBase.merge(
@@ -2036,7 +2074,7 @@ var ResolvedUser = import_zod19.z.object({
2036
2074
  });
2037
2075
 
2038
2076
  // ../commons/src/conditionals/validate.ts
2039
- var import_ajv = __toESM(require("ajv"));
2077
+ var import__ = __toESM(require("ajv/dist/2019"));
2040
2078
  var import_ajv_formats = __toESM(require("ajv-formats"));
2041
2079
  var import_date_fns = require("date-fns");
2042
2080
 
@@ -2250,9 +2288,11 @@ var isNonInteractiveFieldType = (field2) => {
2250
2288
  };
2251
2289
 
2252
2290
  // ../commons/src/conditionals/validate.ts
2253
- var ajv = new import_ajv.default({
2291
+ var ajv = new import__.default({
2254
2292
  $data: true,
2255
- allowUnionTypes: true
2293
+ allowUnionTypes: true,
2294
+ strict: false
2295
+ // Allow minContains and other newer features
2256
2296
  });
2257
2297
  (0, import_ajv_formats.default)(ajv);
2258
2298
  ajv.addKeyword({
@@ -2425,6 +2465,23 @@ function validateFieldInput({
2425
2465
  const rawError = zodType.safeParse(value, { errorMap: zodToIntlErrorMap });
2426
2466
  return rawError.error?.issues.map((issue) => issue.message) ?? [];
2427
2467
  }
2468
+ function runStructuralValidations({
2469
+ field: field2,
2470
+ values
2471
+ }) {
2472
+ if (!isFieldVisible(field2, values) || isFieldEmptyAndNotRequired(field2, values)) {
2473
+ return {
2474
+ errors: []
2475
+ };
2476
+ }
2477
+ const fieldValidationResult = validateFieldInput({
2478
+ field: field2,
2479
+ value: values[field2.id]
2480
+ });
2481
+ return {
2482
+ errors: fieldValidationResult
2483
+ };
2484
+ }
2428
2485
  function runFieldValidations({
2429
2486
  field: field2,
2430
2487
  values
@@ -2490,6 +2547,11 @@ function getValidatorsForField(fieldId, validations) {
2490
2547
  };
2491
2548
  }).filter((x) => x !== null);
2492
2549
  }
2550
+ function areCertificateConditionsMet(conditions, values) {
2551
+ return conditions.every((condition) => {
2552
+ return ajv.validate(condition.conditional, values);
2553
+ });
2554
+ }
2493
2555
 
2494
2556
  // ../commons/src/utils.ts
2495
2557
  function getOrThrow(x, message) {
@@ -2710,16 +2772,16 @@ function timePeriodToDateRange(value) {
2710
2772
  let startDate;
2711
2773
  switch (value) {
2712
2774
  case "last7Days":
2713
- startDate = (0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), 6);
2775
+ startDate = (0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), 7);
2714
2776
  break;
2715
2777
  case "last30Days":
2716
- startDate = (0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), 29);
2778
+ startDate = (0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), 30);
2717
2779
  break;
2718
2780
  case "last90Days":
2719
- startDate = (0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), 89);
2781
+ startDate = (0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), 90);
2720
2782
  break;
2721
2783
  case "last365Days":
2722
- startDate = (0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), 364);
2784
+ startDate = (0, import_date_fns2.subDays)(/* @__PURE__ */ new Date(), 365);
2723
2785
  break;
2724
2786
  }
2725
2787
  return {
@@ -3086,8 +3148,9 @@ function createFieldConditionals(fieldId) {
3086
3148
  properties: {
3087
3149
  [fieldId]: {
3088
3150
  type: "string",
3089
- pattern: "^[\\p{Script=Latin}0-9'._-]*(\\([\\p{Script=Latin}0-9'._-]+\\))?[\\p{Script=Latin}0-9'._-]*( [\\p{Script=Latin}0-9'._-]*(\\([\\p{Script=Latin}0-9'._-]+\\))?[\\p{Script=Latin}0-9'._-]*)*$",
3090
- description: "Name must contain only letters, numbers, and allowed special characters ('._-). No double spaces."
3151
+ minLength: 1,
3152
+ pattern: "^[\\p{Script=Latin}0-9'.-]*(\\([\\p{Script=Latin}0-9'.-]+\\))?[\\p{Script=Latin}0-9'.-]*( [\\p{Script=Latin}0-9'.-]*(\\([\\p{Script=Latin}0-9'.-]+\\))?[\\p{Script=Latin}0-9'.-]*)*$",
3153
+ description: "Name must contain only letters, numbers, and allowed special characters ('.-). No double spaces."
3091
3154
  }
3092
3155
  }
3093
3156
  }),
@@ -3180,6 +3243,19 @@ function createSearchConfig(baseField) {
3180
3243
  fuzzy: () => ({
3181
3244
  ...baseField,
3182
3245
  config: { type: "fuzzy" }
3246
+ }),
3247
+ /**
3248
+ * Creates a configuration for matching locations and the child locations
3249
+ * @returns An object containing the field ID and a configuration object with a type of 'within'.
3250
+ * @example field('createdAtLocation').within()
3251
+ * // {
3252
+ * // ...
3253
+ * // config: { type: 'within' }
3254
+ * // }
3255
+ */
3256
+ within: () => ({
3257
+ ...baseField,
3258
+ config: { type: "within" }
3183
3259
  })
3184
3260
  };
3185
3261
  }
@@ -3187,7 +3263,7 @@ function createSearchConfig(baseField) {
3187
3263
  // ../commons/src/event-config/event-configuration.ts
3188
3264
  function createEventFieldConfig(fieldId) {
3189
3265
  const baseField = {
3190
- fieldId,
3266
+ fieldId: `${METADATA_FIELD_PREFIX}${fieldId}`,
3191
3267
  fieldType: "event"
3192
3268
  };
3193
3269
  return createSearchConfig(baseField);
@@ -3200,32 +3276,107 @@ function eventFn(fieldId) {
3200
3276
  var event = Object.assign(eventFn, {
3201
3277
  /**
3202
3278
  * Checks if the event contains a specific action type.
3279
+ * Can be used directly as a conditional or chained with additional methods.
3203
3280
  * @param action - The action type to check for.
3204
3281
  */
3205
- hasAction: (action) => defineConditional({
3206
- type: "object",
3207
- properties: {
3208
- $event: {
3282
+ hasAction: (action) => {
3283
+ const basicConditional = defineConditional({
3284
+ type: "object",
3285
+ properties: {
3286
+ $event: {
3287
+ type: "object",
3288
+ properties: {
3289
+ actions: {
3290
+ type: "array",
3291
+ contains: {
3292
+ type: "object",
3293
+ properties: {
3294
+ type: {
3295
+ const: action
3296
+ }
3297
+ },
3298
+ required: ["type"]
3299
+ }
3300
+ }
3301
+ },
3302
+ required: ["actions"]
3303
+ }
3304
+ },
3305
+ required: ["$event"]
3306
+ });
3307
+ const buildActionConstraints = (additionalFields) => {
3308
+ const actionProperties = {
3309
+ type: { const: action }
3310
+ };
3311
+ const requiredFields = ["type"];
3312
+ if (additionalFields) {
3313
+ Object.entries(additionalFields).forEach(([key, value]) => {
3314
+ actionProperties[key] = { const: value };
3315
+ requiredFields.push(key);
3316
+ });
3317
+ }
3318
+ return { actionProperties, requiredFields };
3319
+ };
3320
+ const createCountConditional = (countType, count, additionalFields) => {
3321
+ const { actionProperties, requiredFields } = buildActionConstraints(additionalFields);
3322
+ return defineConditional({
3209
3323
  type: "object",
3210
3324
  properties: {
3211
- actions: {
3212
- type: "array",
3213
- contains: {
3214
- type: "object",
3215
- properties: {
3216
- type: {
3217
- const: action
3218
- }
3219
- },
3220
- required: ["type"]
3221
- }
3325
+ $event: {
3326
+ type: "object",
3327
+ properties: {
3328
+ actions: {
3329
+ type: "array",
3330
+ contains: {
3331
+ type: "object",
3332
+ properties: actionProperties,
3333
+ required: requiredFields
3334
+ },
3335
+ [countType]: count
3336
+ }
3337
+ },
3338
+ required: ["actions"]
3222
3339
  }
3223
3340
  },
3224
- required: ["actions"]
3225
- }
3226
- },
3227
- required: ["$event"]
3228
- }),
3341
+ required: ["$event"]
3342
+ });
3343
+ };
3344
+ const withMinMax = (additionalFields) => {
3345
+ return {
3346
+ /**
3347
+ * Creates a conditional that checks if the event contains a specific action type
3348
+ * with a minimum count of occurrences.
3349
+ *
3350
+ * @param minCount - The minimum number of actions required.
3351
+ */
3352
+ minCount: (minCount) => createCountConditional("minContains", minCount, additionalFields),
3353
+ /**
3354
+ * Builds a conditional that sets a maximum count for the number of actions.
3355
+ * This is useful for limiting the number of actions of a specific type in a single event.
3356
+ */
3357
+ maxCount: (maxCount) => createCountConditional("maxContains", maxCount, additionalFields)
3358
+ };
3359
+ };
3360
+ const chainableMethods = {
3361
+ /**
3362
+ * Adds additional field constraints to the action matching.
3363
+ *
3364
+ * @param fields - Object containing additional fields to match on the action.
3365
+ */
3366
+ withFields: (fields) => withMinMax(fields),
3367
+ /**
3368
+ * Adds template ID constraint to the action matching.
3369
+ * This is a convenience method that adds content.templateId to the fields.
3370
+ *
3371
+ * @param id - The template ID to match against.
3372
+ */
3373
+ withTemplate: (id) => withMinMax({
3374
+ content: { templateId: id }
3375
+ }),
3376
+ ...withMinMax()
3377
+ };
3378
+ return { ...basicConditional, ...chainableMethods };
3379
+ },
3229
3380
  field(field2) {
3230
3381
  return {
3231
3382
  $event: field2
@@ -3244,24 +3395,23 @@ var EventStatus = import_zod23.z.enum([
3244
3395
  "DECLARED",
3245
3396
  "VALIDATED",
3246
3397
  "REGISTERED",
3247
- "CERTIFIED",
3248
3398
  "ARCHIVED"
3249
3399
  ]);
3250
- var VisibleStatus = import_zod23.z.enum([...EventStatus.options, "REJECTED"]);
3251
3400
  var InherentFlags = {
3252
- PRINTED: "printed",
3401
+ PENDING_CERTIFICATION: "pending-certification",
3253
3402
  INCOMPLETE: "incomplete",
3254
3403
  REJECTED: "rejected",
3255
3404
  CORRECTION_REQUESTED: "correction-requested"
3256
3405
  };
3257
- var Flag = import_zod23.z.string().regex(
3406
+ var ActionFlag = import_zod23.z.string().regex(
3258
3407
  new RegExp(
3259
3408
  `^(${Object.values(ActionType).join("|").toLowerCase()}):(${Object.values(
3260
3409
  ActionStatus
3261
3410
  ).join("|").toLowerCase()})$`
3262
3411
  ),
3263
3412
  "Flag must be in the format ActionType:ActionStatus (lowerCase)"
3264
- ).or(import_zod23.z.nativeEnum(InherentFlags));
3413
+ );
3414
+ var Flag = ActionFlag.or(import_zod23.z.nativeEnum(InherentFlags));
3265
3415
  var ZodDate = import_zod23.z.string().date();
3266
3416
  var ActionCreationMetadata = import_zod23.z.object({
3267
3417
  createdAt: import_zod23.z.string().datetime().describe("The timestamp when the action request was created."),
@@ -3529,6 +3679,9 @@ var QueryExpression = import_zod25.z.object({
3529
3679
  createdAt: import_zod25.z.optional(DateCondition),
3530
3680
  updatedAt: import_zod25.z.optional(DateCondition),
3531
3681
  "legalStatuses.REGISTERED.acceptedAt": import_zod25.z.optional(DateCondition),
3682
+ "legalStatuses.DECLARED.createdAtLocation": import_zod25.z.optional(
3683
+ import_zod25.z.union([Within, Exact])
3684
+ ),
3532
3685
  "legalStatuses.REGISTERED.createdAtLocation": import_zod25.z.optional(
3533
3686
  import_zod25.z.union([Within, Exact])
3534
3687
  ),
@@ -3774,7 +3927,8 @@ var WorkqueueConfig = import_zod28.z.object({
3774
3927
  })
3775
3928
  ),
3776
3929
  columns: import_zod28.z.array(WorkqueueColumn).default(mandatoryColumns),
3777
- icon: AvailableIcons
3930
+ icon: AvailableIcons,
3931
+ emptyMessage: TranslationConfig.optional()
3778
3932
  }).describe("Configuration for workqueue.");
3779
3933
  var WorkqueueConfigWithoutQuery = WorkqueueConfig.omit({
3780
3934
  query: true,
@@ -3793,7 +3947,8 @@ var WorkqueueConfigInput = import_zod28.z.object({
3793
3947
  })
3794
3948
  ),
3795
3949
  columns: import_zod28.z.array(WorkqueueColumn).default(mandatoryColumns),
3796
- icon: AvailableIcons
3950
+ icon: AvailableIcons,
3951
+ emptyMessage: TranslationConfig.optional()
3797
3952
  });
3798
3953
  function defineWorkqueue(workqueueInput) {
3799
3954
  const queryInput = workqueueInput.query;
@@ -3840,7 +3995,6 @@ var BaseActionInput = import_zod29.z.object({
3840
3995
  transactionId: import_zod29.z.string(),
3841
3996
  declaration: ActionUpdate.default({}),
3842
3997
  annotation: ActionUpdate.optional(),
3843
- actionDetails: ActionDetails.optional(),
3844
3998
  originalActionId: UUID.optional(),
3845
3999
  // should not be part of base action.
3846
4000
  keepAssignment: import_zod29.z.boolean().optional()
@@ -3883,7 +4037,8 @@ var DeclareActionInput = BaseActionInput.merge(
3883
4037
  );
3884
4038
  var PrintCertificateActionInput = BaseActionInput.merge(
3885
4039
  import_zod29.z.object({
3886
- type: import_zod29.z.literal(ActionType.PRINT_CERTIFICATE).default(ActionType.PRINT_CERTIFICATE)
4040
+ type: import_zod29.z.literal(ActionType.PRINT_CERTIFICATE).default(ActionType.PRINT_CERTIFICATE),
4041
+ content: PrintContent.optional()
3887
4042
  })
3888
4043
  );
3889
4044
  var RejectDeclarationActionInput = BaseActionInput.merge(
@@ -3923,7 +4078,8 @@ var RequestCorrectionActionInput = BaseActionInput.merge(
3923
4078
  var RejectCorrectionActionInput = BaseActionInput.merge(
3924
4079
  import_zod29.z.object({
3925
4080
  requestId: import_zod29.z.string(),
3926
- type: import_zod29.z.literal(ActionType.REJECT_CORRECTION).default(ActionType.REJECT_CORRECTION)
4081
+ type: import_zod29.z.literal(ActionType.REJECT_CORRECTION).default(ActionType.REJECT_CORRECTION),
4082
+ reason: RejectionReason
3927
4083
  })
3928
4084
  );
3929
4085
  var ApproveCorrectionActionInput = BaseActionInput.merge(
@@ -4094,16 +4250,19 @@ function getLegalStatuses(actions) {
4094
4250
  }
4095
4251
 
4096
4252
  // ../commons/src/events/state/flags.ts
4097
- function isCertificatePrinted(actions) {
4253
+ function isPendingCertification(actions) {
4254
+ if (getStatusFromActions(actions) !== EventStatus.enum.REGISTERED) {
4255
+ return false;
4256
+ }
4098
4257
  return actions.reduce((prev, { type }) => {
4099
4258
  if (type === ActionType.PRINT_CERTIFICATE) {
4100
- return true;
4259
+ return false;
4101
4260
  }
4102
4261
  if (type === ActionType.APPROVE_CORRECTION) {
4103
- return false;
4262
+ return true;
4104
4263
  }
4105
4264
  return prev;
4106
- }, false);
4265
+ }, true);
4107
4266
  }
4108
4267
  function isCorrectionRequested(actions) {
4109
4268
  return actions.reduce((prev, { type }) => {
@@ -4138,8 +4297,8 @@ function getFlagsFromActions(actions) {
4138
4297
  const flag = joinValues([type, status], ":").toLowerCase();
4139
4298
  return flag;
4140
4299
  });
4141
- if (isCertificatePrinted(sortedActions)) {
4142
- flags.push(InherentFlags.PRINTED);
4300
+ if (isPendingCertification(sortedActions)) {
4301
+ flags.push(InherentFlags.PENDING_CERTIFICATION);
4143
4302
  }
4144
4303
  if (isCorrectionRequested(sortedActions)) {
4145
4304
  flags.push(InherentFlags.CORRECTION_REQUESTED);
@@ -4170,7 +4329,6 @@ function getStatusFromActions(actions) {
4170
4329
  case ActionType.NOTIFY:
4171
4330
  return EventStatus.enum.NOTIFIED;
4172
4331
  case ActionType.PRINT_CERTIFICATE:
4173
- return EventStatus.enum.CERTIFIED;
4174
4332
  case ActionType.ASSIGN:
4175
4333
  case ActionType.UNASSIGN:
4176
4334
  case ActionType.REJECT:
@@ -5135,7 +5293,27 @@ var TENNIS_CLUB_DECLARATION_FORM = defineDeclarationForm({
5135
5293
  defaultMessage: "Applicant's name",
5136
5294
  description: "This is the label for the field",
5137
5295
  id: "v2.event.tennis-club-membership.action.declare.form.section.who.field.firstname.label"
5138
- }
5296
+ },
5297
+ configuration: {
5298
+ name: {
5299
+ firstname: { required: true },
5300
+ middlename: { required: false },
5301
+ surname: { required: true }
5302
+ }
5303
+ },
5304
+ validation: [
5305
+ {
5306
+ validator: field("applicant.name").object({
5307
+ firstname: field("firstname").isValidEnglishName(),
5308
+ surname: field("surname").isValidEnglishName()
5309
+ }),
5310
+ message: {
5311
+ defaultMessage: "Input contains invalid characters. Please use only letters (a-z, A-Z), numbers (0-9), hyphens (-), apostrophes(') and underscores (_)",
5312
+ description: "This is the error message for invalid name",
5313
+ id: "v2.error.invalidName"
5314
+ }
5315
+ }
5316
+ ]
5139
5317
  },
5140
5318
  {
5141
5319
  id: "applicant.email",
@@ -5357,22 +5535,6 @@ var statusOptions = [
5357
5535
  id: "v2.advancedSearch.form.recordStatusRegistered"
5358
5536
  }
5359
5537
  },
5360
- {
5361
- value: EventStatus.enum.CERTIFIED,
5362
- label: {
5363
- defaultMessage: "Certified",
5364
- description: "Option for form field: status of record",
5365
- id: "v2.advancedSearch.form.recordStatusCertified"
5366
- }
5367
- },
5368
- {
5369
- value: VisibleStatus.enum.REJECTED,
5370
- label: {
5371
- defaultMessage: "Rejected",
5372
- description: "Option for form field: status of record",
5373
- id: "v2.advancedSearch.form.recordStatusRejected"
5374
- }
5375
- },
5376
5538
  {
5377
5539
  value: EventStatus.enum.ARCHIVED,
5378
5540
  label: {
@@ -6762,7 +6924,7 @@ function eventPayloadGenerator(rng) {
6762
6924
  requestId,
6763
6925
  keepAssignment: input.keepAssignment
6764
6926
  }),
6765
- reject: (eventId, requestId, input = {}) => ({
6927
+ reject: (eventId, requestId, input) => ({
6766
6928
  type: ActionType.REJECT_CORRECTION,
6767
6929
  transactionId: input.transactionId ?? getUUID(),
6768
6930
  declaration: {},
@@ -6773,7 +6935,8 @@ function eventPayloadGenerator(rng) {
6773
6935
  ),
6774
6936
  eventId,
6775
6937
  requestId,
6776
- keepAssignment: input.keepAssignment
6938
+ keepAssignment: input.keepAssignment,
6939
+ reason: input.reason ?? { message: "" }
6777
6940
  })
6778
6941
  }
6779
6942
  }
@@ -6823,7 +6986,11 @@ function generateActionDocument({
6823
6986
  case ActionType.NOTIFY:
6824
6987
  return { ...actionBase, type: action };
6825
6988
  case ActionType.PRINT_CERTIFICATE:
6826
- return { ...actionBase, type: action };
6989
+ return {
6990
+ ...actionBase,
6991
+ type: action,
6992
+ content: defaults.content
6993
+ };
6827
6994
  case ActionType.REQUEST_CORRECTION:
6828
6995
  return { ...actionBase, type: action };
6829
6996
  case ActionType.APPROVE_CORRECTION:
@@ -6832,7 +6999,8 @@ function generateActionDocument({
6832
6999
  return {
6833
7000
  ...actionBase,
6834
7001
  requestId: getUUID(),
6835
- type: action
7002
+ type: action,
7003
+ reason: { message: "Correction rejection" }
6836
7004
  };
6837
7005
  case ActionType.REGISTER:
6838
7006
  return {
@@ -7222,14 +7390,6 @@ var AVAILABLE_ACTIONS_BY_EVENT_STATUS = {
7222
7390
  ActionType.REJECT_CORRECTION,
7223
7391
  ExclusiveActions.REVIEW_CORRECTION_REQUEST
7224
7392
  ],
7225
- [EventStatus.enum.CERTIFIED]: [
7226
- ActionType.READ,
7227
- ActionType.PRINT_CERTIFICATE,
7228
- ActionType.REQUEST_CORRECTION,
7229
- ActionType.APPROVE_CORRECTION,
7230
- ActionType.REJECT_CORRECTION,
7231
- ExclusiveActions.REVIEW_CORRECTION_REQUEST
7232
- ],
7233
7393
  [EventStatus.enum.ARCHIVED]: [
7234
7394
  ActionType.READ,
7235
7395
  ActionType.ASSIGN,
@@ -7237,9 +7397,12 @@ var AVAILABLE_ACTIONS_BY_EVENT_STATUS = {
7237
7397
  ]
7238
7398
  };
7239
7399
  var getAvailableActionsForEvent = (event2) => {
7240
- return event2.flags.includes(InherentFlags.REJECTED) ? [
7241
- ActionType.READ,
7242
- event2.status === EventStatus.Enum.VALIDATED ? ActionType.VALIDATE : ActionType.DECLARE,
7243
- ActionType.ARCHIVE
7244
- ] : AVAILABLE_ACTIONS_BY_EVENT_STATUS[event2.status];
7400
+ if (event2.flags.includes(InherentFlags.REJECTED)) {
7401
+ return [
7402
+ ActionType.READ,
7403
+ event2.status === EventStatus.Enum.VALIDATED ? ActionType.VALIDATE : ActionType.DECLARE,
7404
+ ActionType.ARCHIVE
7405
+ ];
7406
+ }
7407
+ return AVAILABLE_ACTIONS_BY_EVENT_STATUS[event2.status];
7245
7408
  };