grm-shared-library 1.1.205 → 1.1.207

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 (65) hide show
  1. package/README.md +75 -0
  2. package/dist/cjs/exceptions/filters/http-exceptions.filter.js +19 -2
  3. package/dist/cjs/exceptions/filters/http-exceptions.filter.js.map +1 -1
  4. package/dist/cjs/modules/common/decorators/calendar-date.decorator.js +59 -0
  5. package/dist/cjs/modules/common/decorators/calendar-date.decorator.js.map +1 -0
  6. package/dist/cjs/modules/common/index.js +2 -0
  7. package/dist/cjs/modules/common/index.js.map +1 -1
  8. package/dist/cjs/modules/common/utils/calendar-date.util.js +148 -0
  9. package/dist/cjs/modules/common/utils/calendar-date.util.js.map +1 -0
  10. package/dist/cjs/modules/partner/dtos/partner-member-profile.dto.js +2 -3
  11. package/dist/cjs/modules/partner/dtos/partner-member-profile.dto.js.map +1 -1
  12. package/dist/cjs/modules/partner/index.js +1 -0
  13. package/dist/cjs/modules/partner/index.js.map +1 -1
  14. package/dist/cjs/modules/partner/interfaces/partner-member-readiness.js +3 -0
  15. package/dist/cjs/modules/partner/interfaces/partner-member-readiness.js.map +1 -0
  16. package/dist/cjs/modules/partner/utils/partner-membership.util.js +23 -31
  17. package/dist/cjs/modules/partner/utils/partner-membership.util.js.map +1 -1
  18. package/dist/cjs/modules/partner/utils/partner-payload.util.js +25 -8
  19. package/dist/cjs/modules/partner/utils/partner-payload.util.js.map +1 -1
  20. package/dist/cjs/modules/role/constants/roles-by-scope.js +2 -1
  21. package/dist/cjs/modules/role/constants/roles-by-scope.js.map +1 -1
  22. package/dist/cjs/modules/role/data/roles.data.js +30 -0
  23. package/dist/cjs/modules/role/data/roles.data.js.map +1 -1
  24. package/dist/cjs/modules/role/enums/role.enum.js +1 -0
  25. package/dist/cjs/modules/role/enums/role.enum.js.map +1 -1
  26. package/dist/cjs/modules/user/dtos/create-user.dto.js +10 -0
  27. package/dist/cjs/modules/user/dtos/create-user.dto.js.map +1 -1
  28. package/dist/esm/exceptions/filters/http-exceptions.filter.js +19 -2
  29. package/dist/esm/exceptions/filters/http-exceptions.filter.js.map +1 -1
  30. package/dist/esm/modules/common/decorators/calendar-date.decorator.js +55 -0
  31. package/dist/esm/modules/common/decorators/calendar-date.decorator.js.map +1 -0
  32. package/dist/esm/modules/common/index.js +2 -0
  33. package/dist/esm/modules/common/index.js.map +1 -1
  34. package/dist/esm/modules/common/utils/calendar-date.util.js +140 -0
  35. package/dist/esm/modules/common/utils/calendar-date.util.js.map +1 -0
  36. package/dist/esm/modules/partner/dtos/partner-member-profile.dto.js +2 -3
  37. package/dist/esm/modules/partner/dtos/partner-member-profile.dto.js.map +1 -1
  38. package/dist/esm/modules/partner/index.js +1 -0
  39. package/dist/esm/modules/partner/index.js.map +1 -1
  40. package/dist/esm/modules/partner/interfaces/partner-member-readiness.js +2 -0
  41. package/dist/esm/modules/partner/interfaces/partner-member-readiness.js.map +1 -0
  42. package/dist/esm/modules/partner/utils/partner-membership.util.js +25 -28
  43. package/dist/esm/modules/partner/utils/partner-membership.util.js.map +1 -1
  44. package/dist/esm/modules/partner/utils/partner-payload.util.js +25 -9
  45. package/dist/esm/modules/partner/utils/partner-payload.util.js.map +1 -1
  46. package/dist/esm/modules/role/constants/roles-by-scope.js +2 -1
  47. package/dist/esm/modules/role/constants/roles-by-scope.js.map +1 -1
  48. package/dist/esm/modules/role/data/roles.data.js +30 -0
  49. package/dist/esm/modules/role/data/roles.data.js.map +1 -1
  50. package/dist/esm/modules/role/enums/role.enum.js +1 -0
  51. package/dist/esm/modules/role/enums/role.enum.js.map +1 -1
  52. package/dist/esm/modules/user/dtos/create-user.dto.js +10 -0
  53. package/dist/esm/modules/user/dtos/create-user.dto.js.map +1 -1
  54. package/dist/types/modules/common/decorators/calendar-date.decorator.d.ts +26 -0
  55. package/dist/types/modules/common/index.d.ts +2 -0
  56. package/dist/types/modules/common/utils/calendar-date.util.d.ts +80 -0
  57. package/dist/types/modules/partner/dtos/partner-member-profile.dto.d.ts +8 -1
  58. package/dist/types/modules/partner/index.d.ts +1 -0
  59. package/dist/types/modules/partner/interfaces/partner-member-readiness.d.ts +60 -0
  60. package/dist/types/modules/partner/utils/partner-membership.util.d.ts +17 -6
  61. package/dist/types/modules/partner/utils/partner-payload.util.d.ts +11 -10
  62. package/dist/types/modules/role/enums/role.enum.d.ts +1 -0
  63. package/dist/types/modules/user/dtos/create-user.dto.d.ts +1 -0
  64. package/dist/types/modules/user/interfaces/user.d.ts +10 -0
  65. package/package.json +1 -1
package/README.md CHANGED
@@ -3,6 +3,81 @@
3
3
  Common code for GRM — shared types, enums, interfaces, DTOs and constants for the
4
4
  Clarion / Upesy backend NestJS microservices.
5
5
 
6
+ ## Calendar dates
7
+
8
+ One definition of what a date is, because there used to be four and they had
9
+ drifted apart.
10
+
11
+ ```ts
12
+ import {
13
+ ISO_CALENDAR_DATE_PATTERN, // the one regex - never write another
14
+ isCalendarDate, // a real YYYY-MM-DD day; rejects 2026-02-30
15
+ toCalendarDate, // Date | string -> YYYY-MM-DD | undefined
16
+ isPlausibleBirthDate, // not future, within 120 years, NO minimum age
17
+ calculateAge, isMinor, // whole years, UTC throughout
18
+ AGE_OF_MAJORITY_YEARS, // 18 - for COPY ONLY, never a validator
19
+ IsCalendarDate, IsBirthDate // class-validator decorators over the above
20
+ } from 'grm-shared-library';
21
+ ```
22
+
23
+ ### Why it refuses things
24
+
25
+ A calendar date has no time, no zone and no offset: somebody born on 17 April
26
+ 1990 was born on that day in Nairobi, in Kampala and in London alike. Every bug
27
+ this module exists to prevent comes from treating it as a moment.
28
+
29
+ The old conversion did `new Date(freeText)` and then `.toISOString()`. Under the
30
+ production pods` own `TZ=Africa/Nairobi`:
31
+
32
+ | input | old result | |
33
+ |---|---|---|
34
+ | `04/17/1990` | `1990-04-16` | a day early |
35
+ | `new Date(1990,3,17)` | `1990-04-16` | a day early - and this is what a date picker hands you |
36
+ | `17/04/1990` | `undefined` | the East African spelling, refused |
37
+ | `1990-04-17` | `1990-04-17` | correct |
38
+
39
+ `toCalendarDate` now accepts exactly three things and refuses everything else:
40
+
41
+ 1. `YYYY-MM-DD`
42
+ 2. a full ISO-8601 instant in **UTC** (`1990-04-17T00:00:00.000Z`)
43
+ 3. a `Date`, read in UTC - so build one with `Date.UTC`, never `new Date(y,m,d)`
44
+
45
+ An **offset** timestamp is refused too: `1990-04-17T00:00:00+03:00` is 16 April
46
+ in UTC, and only the sender knows which day they meant.
47
+
48
+ Free text is refused rather than guessed at. `04/17/1990` and `17/04/1990` are
49
+ the same eight characters in two orders, this platform serves Kenya, Uganda and
50
+ Tanzania where the second is the common spelling, and there is no reading of
51
+ that string that is safe to infer. A refused date surfaces as a field somebody
52
+ is asked to collect; a drifted one is a permanently wrong birthday at a partner
53
+ that cannot delete a member, on the record a paramedic uses to size a drug dose.
54
+
55
+ ### No minimum age
56
+
57
+ `isPlausibleBirthDate` refuses a future date and one beyond a human lifespan,
58
+ and imposes no lower bound. Dependants on a family emergency-cover plan are
59
+ children by design - that is the whole point of registering them with a
60
+ responder - so a minimum-age rule would refuse exactly the people the feature
61
+ exists for. `AGE_OF_MAJORITY_YEARS` is there for wording, not for gating.
62
+
63
+ ### A decorator alone guarantees nothing
64
+
65
+ `@IsCalendarDate` / `@IsBirthDate` are real validators, but on this platform
66
+ they are not enforcement on their own: clarion-authentication registers **no**
67
+ global `ValidationPipe`, the spreadsheet importer builds plain objects a pipe
68
+ never sees, and internal service-to-service calls bypass HTTP entirely. Any
69
+ service that OWNS a date must re-check it in the service layer, the way
70
+ `UserService.updateCountry` re-checks `isSupportedCountryCode`.
71
+
72
+ ### Postgres round trip
73
+
74
+ A `type: date` column returns a **string** through this stack, not a `Date`:
75
+ `pg` parses OID 1082 into a local-midnight `Date` and TypeORM reads it back with
76
+ local components, so the two cancel out. It is correct, but correct by
77
+ cancellation - never pass a value from a date column into `new Date()`.
78
+
79
+ ---
80
+
6
81
  ## Country & Currency (multi-country foundation)
7
82
 
8
83
  Platform-level primitives for country-aware emergency response, newsfeed,
@@ -25,9 +25,26 @@ let HttpExceptionFilter = class HttpExceptionFilter {
25
25
  status = exception.getStatus();
26
26
  errorResponse = exception.getResponse();
27
27
  }
28
- (0, error_logger_1.logError)(exception, errorResponse.context || {}); // Log to Sentry
28
+ // Sentry gets the full context; the CALLER never does.
29
+ //
30
+ // `context.payload` is the handler argument that produced the error -
31
+ // a DTO, or in several services the whole Express request with its
32
+ // x-user-context headers. Spreading errorResponse into the response
33
+ // body shipped all of that back to whoever made the failing call, so a
34
+ // rejected date of birth was echoed to the client that sent it and a
35
+ // rejected login was echoed with its credentials.
36
+ // Guarded: `getResponse()` returns a bare STRING for `new
37
+ // HttpException('msg', 404)`, and spreading a string yields
38
+ // {0:'m',1:'s',...} - which would turn every such error into
39
+ // character-indexed nonsense.
40
+ const isObject = typeof errorResponse === 'object' && errorResponse !== null;
41
+ const { context, ...rest } = isObject
42
+ ? errorResponse
43
+ : { context: undefined };
44
+ const clientSafeError = isObject ? rest : { message: errorResponse, code: error_codes_enum_1.ErrorCodes.UNKNOWN_ERROR };
45
+ (0, error_logger_1.logError)(exception, context || {});
29
46
  response.status(status).json({
30
- ...errorResponse,
47
+ ...clientSafeError,
31
48
  path: request.url,
32
49
  timestamp: new Date().toISOString()
33
50
  });
@@ -1 +1 @@
1
- {"version":3,"file":"http-exceptions.filter.js","sourceRoot":"","sources":["../../../../src/exceptions/filters/http-exceptions.filter.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAkG;AAClG,gEAAuD;AACvD,+DAAwD;AAGjD,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAE5B,KAAK,CAAC,SAAkB,EAAE,IAAmB;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;QAEjC,IAAI,MAAM,GAAG,mBAAU,CAAC,qBAAqB,CAAC;QAC9C,IAAI,aAAa,GAAQ;YACrB,OAAO,EAAE,uBAAuB;YAChC,IAAI,EAAE,6BAAU,CAAC,aAAa;YAC9B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QAEF,IAAI,SAAS,YAAY,sBAAa,EAAE,CAAC;YACrC,MAAM,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;YAC/B,aAAa,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAC5C,CAAC;QAED,IAAA,uBAAQ,EAAC,SAAkB,EAAE,aAAa,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,gBAAgB;QAE3E,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;YACzB,GAAG,aAAa;YAChB,IAAI,EAAE,OAAO,CAAC,GAAG;YACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC,CAAC;IACP,CAAC;CACJ,CAAA;AA3BY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,cAAK,GAAE;GACK,mBAAmB,CA2B/B"}
1
+ {"version":3,"file":"http-exceptions.filter.js","sourceRoot":"","sources":["../../../../src/exceptions/filters/http-exceptions.filter.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAkG;AAClG,gEAAuD;AACvD,+DAAwD;AAGjD,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAE5B,KAAK,CAAC,SAAkB,EAAE,IAAmB;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;QAEjC,IAAI,MAAM,GAAG,mBAAU,CAAC,qBAAqB,CAAC;QAC9C,IAAI,aAAa,GAAQ;YACrB,OAAO,EAAE,uBAAuB;YAChC,IAAI,EAAE,6BAAU,CAAC,aAAa;YAC9B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QAEF,IAAI,SAAS,YAAY,sBAAa,EAAE,CAAC;YACrC,MAAM,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;YAC/B,aAAa,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAC5C,CAAC;QAED,uDAAuD;QACvD,EAAE;QACF,sEAAsE;QACtE,mEAAmE;QACnE,oEAAoE;QACpE,uEAAuE;QACvE,qEAAqE;QACrE,kDAAkD;QAClD,0DAA0D;QAC1D,4DAA4D;QAC5D,6DAA6D;QAC7D,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,IAAI,CAAC;QAC7E,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ;YACjC,CAAC,CAAE,aAAyC;YAC5C,CAAC,CAAE,EAAE,OAAO,EAAE,SAAS,EAA8B,CAAC;QAC1D,MAAM,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,6BAAU,CAAC,aAAa,EAAE,CAAC;QACrG,IAAA,uBAAQ,EAAC,SAAkB,EAAG,OAAmC,IAAI,EAAE,CAAC,CAAC;QAEzE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;YACzB,GAAG,eAAe;YAClB,IAAI,EAAE,OAAO,CAAC,GAAG;YACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC,CAAC;IACP,CAAC;CACJ,CAAA;AA5CY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,cAAK,GAAE;GACK,mBAAmB,CA4C/B"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IsCalendarDate = IsCalendarDate;
4
+ exports.IsBirthDate = IsBirthDate;
5
+ const class_validator_1 = require("class-validator");
6
+ const calendar_date_util_1 = require("../utils/calendar-date.util");
7
+ /**
8
+ * Validates a `YYYY-MM-DD` calendar date on a DTO.
9
+ *
10
+ * Exists so the rule has ONE definition. Before this decorator the same regex
11
+ * was written out by hand in three DTOs and one utility, and they had already
12
+ * drifted apart - a `@Matches` regex accepts `2026-02-30`, which Postgres then
13
+ * quietly rolls forward to 1 March.
14
+ *
15
+ * A decorator alone guarantees nothing on this platform, and that is not a
16
+ * theoretical caveat: clarion-authentication registers no global ValidationPipe
17
+ * at all, the spreadsheet importer builds plain objects the pipe never sees,
18
+ * and internal service-to-service calls bypass HTTP entirely. Any service that
19
+ * OWNS a date of birth must re-check it in the service layer with
20
+ * `isCalendarDate` / `isPlausibleBirthDate`, the way `UserService.updateCountry`
21
+ * re-checks `isSupportedCountryCode`.
22
+ */
23
+ function IsCalendarDate(validationOptions) {
24
+ return function (object, propertyName) {
25
+ (0, class_validator_1.registerDecorator)({
26
+ name: 'isCalendarDate',
27
+ target: object.constructor,
28
+ propertyName,
29
+ options: validationOptions,
30
+ validator: {
31
+ validate: (value) => (0, calendar_date_util_1.isCalendarDate)(value),
32
+ defaultMessage: () => `${propertyName} must be a real calendar date in YYYY-MM-DD format`,
33
+ },
34
+ });
35
+ };
36
+ }
37
+ /**
38
+ * A calendar date that could belong to a living person.
39
+ *
40
+ * Refuses a future date and one older than any human lifespan, and imposes NO
41
+ * minimum age - dependents on a family membership are children by design, so a
42
+ * minimum would refuse exactly the people the feature exists to cover.
43
+ */
44
+ function IsBirthDate(validationOptions) {
45
+ return function (object, propertyName) {
46
+ (0, class_validator_1.registerDecorator)({
47
+ name: 'isBirthDate',
48
+ target: object.constructor,
49
+ propertyName,
50
+ options: validationOptions,
51
+ validator: {
52
+ validate: (value) => (0, calendar_date_util_1.isPlausibleBirthDate)(value),
53
+ defaultMessage: () => `${propertyName} must be a real date of birth in YYYY-MM-DD format, ` +
54
+ 'not in the future and within a human lifespan',
55
+ },
56
+ });
57
+ };
58
+ }
59
+ //# sourceMappingURL=calendar-date.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-date.decorator.js","sourceRoot":"","sources":["../../../../../src/modules/common/decorators/calendar-date.decorator.ts"],"names":[],"mappings":";;AAoBA,wCAcC;AASD,kCAeC;AA1DD,qDAAuE;AAEvE,oEAAmF;AAEnF;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,cAAc,CAAC,iBAAqC;IAChE,OAAO,UAAU,MAAc,EAAE,YAAoB;QACjD,IAAA,mCAAiB,EAAC;YACd,IAAI,EAAE,gBAAgB;YACtB,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,YAAY;YACZ,OAAO,EAAE,iBAAiB;YAC1B,SAAS,EAAE;gBACP,QAAQ,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,IAAA,mCAAc,EAAC,KAAK,CAAC;gBACnD,cAAc,EAAE,GAAG,EAAE,CACjB,GAAG,YAAY,oDAAoD;aAC1E;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,WAAW,CAAC,iBAAqC;IAC7D,OAAO,UAAU,MAAc,EAAE,YAAoB;QACjD,IAAA,mCAAiB,EAAC;YACd,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,YAAY;YACZ,OAAO,EAAE,iBAAiB;YAC1B,SAAS,EAAE;gBACP,QAAQ,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,IAAA,yCAAoB,EAAC,KAAK,CAAC;gBACzD,cAAc,EAAE,GAAG,EAAE,CACjB,GAAG,YAAY,sDAAsD;oBACrE,+CAA+C;aACtD;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;AACN,CAAC"}
@@ -27,4 +27,6 @@ __exportStar(require("./constants/service.const"), exports);
27
27
  __exportStar(require("./services"), exports);
28
28
  __exportStar(require("./enums/secrets-fetch-strategy.enum"), exports);
29
29
  __exportStar(require("./enums/entity-name.enum"), exports);
30
+ __exportStar(require("./utils/calendar-date.util"), exports);
31
+ __exportStar(require("./decorators/calendar-date.decorator"), exports);
30
32
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/common/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAwC;AACxC,yDAAuC;AACvC,4DAA0C;AAC1C,8DAA4C;AAC5C,4DAA0C;AAC1C,4DAA0C;AAC1C,2DAAyC;AACzC,8DAA4C;AAC5C,2EAAyD;AACzD,4DAA0C;AAC1C,6CAA2B;AAC3B,sEAAoD;AACpD,2DAAyC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/common/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAwC;AACxC,yDAAuC;AACvC,4DAA0C;AAC1C,8DAA4C;AAC5C,4DAA0C;AAC1C,4DAA0C;AAC1C,2DAAyC;AACzC,8DAA4C;AAC5C,2EAAyD;AACzD,4DAA0C;AAC1C,6CAA2B;AAC3B,sEAAoD;AACpD,2DAAyC;AACzC,6DAA2C;AAC3C,uEAAqD"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ /**
3
+ * The platform's one definition of a calendar date.
4
+ *
5
+ * A date of birth is a CALENDAR DATE, not an instant. It has no time, no zone
6
+ * and no offset: somebody born on 17 April 1990 was born on that day in Nairobi,
7
+ * in Kampala and in London alike. Every bug this module exists to prevent comes
8
+ * from the same mistake - treating that date as a moment, reading it back in a
9
+ * different zone, and landing a day earlier.
10
+ *
11
+ * That mistake had already been made. Before this module the platform carried
12
+ * four independent copies of the `YYYY-MM-DD` regex and a conversion that did
13
+ * `new Date(freeText)` and then `.toISOString()`. Under `TZ=Africa/Nairobi`,
14
+ * which is what the production pods run:
15
+ *
16
+ * '04/17/1990' -> '1990-04-16' (a day early)
17
+ * new Date(1990,3,17) -> '1990-04-16' (a day early - and this is exactly
18
+ * what a date picker hands you)
19
+ * '17/04/1990' -> undefined (the East African spelling, refused)
20
+ *
21
+ * A birth date that is wrong by a day is worse than one that is missing.
22
+ * Rescue.co cannot delete a member once registered, so a drifted date is
23
+ * permanent, and it is the field a paramedic uses to size a drug dose. So the
24
+ * rule here is deliberately narrow: parse what is unambiguous, refuse
25
+ * everything else, and never guess.
26
+ */
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.AGE_OF_MAJORITY_YEARS = exports.MAX_HUMAN_AGE_YEARS = exports.ISO_CALENDAR_DATE_PATTERN = void 0;
29
+ exports.isCalendarDate = isCalendarDate;
30
+ exports.toCalendarDate = toCalendarDate;
31
+ exports.isPlausibleBirthDate = isPlausibleBirthDate;
32
+ exports.calculateAge = calculateAge;
33
+ exports.isMinor = isMinor;
34
+ /** `YYYY-MM-DD`. The single definition - do not re-declare this anywhere. */
35
+ exports.ISO_CALENDAR_DATE_PATTERN = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/;
36
+ /** Nobody lives longer than this, so anything older is a typo or a placeholder. */
37
+ exports.MAX_HUMAN_AGE_YEARS = 120;
38
+ /**
39
+ * The age at which a person is treated as an adult, for COPY ONLY.
40
+ *
41
+ * Never a validator. Dependents on a family membership are children by design -
42
+ * that is the entire point of registering them with an emergency responder -
43
+ * so a minimum age would refuse exactly the people the feature exists for.
44
+ */
45
+ exports.AGE_OF_MAJORITY_YEARS = 18;
46
+ /**
47
+ * A real `YYYY-MM-DD` day, not merely a string shaped like one.
48
+ *
49
+ * Rejects `2026-02-30` and `2026-13-01`: the shape is right and the day does
50
+ * not exist. Parsed at UTC midnight so the check cannot depend on where it runs.
51
+ */
52
+ function isCalendarDate(value) {
53
+ if (typeof value !== 'string')
54
+ return false;
55
+ if (!exports.ISO_CALENDAR_DATE_PATTERN.test(value))
56
+ return false;
57
+ const parsed = new Date(`${value}T00:00:00.000Z`);
58
+ if (Number.isNaN(parsed.getTime()))
59
+ return false;
60
+ // Postgres would accept '2026-02-30' and quietly roll it to 1 March.
61
+ return parsed.toISOString().slice(0, 10) === value;
62
+ }
63
+ /**
64
+ * Reduce a stored or submitted value to a calendar date, or refuse it.
65
+ *
66
+ * Accepts exactly three things, and nothing else:
67
+ *
68
+ * 1. `YYYY-MM-DD` - the wire format every client must send
69
+ * 2. a full ISO-8601 instant in UTC - `1990-04-17T00:00:00.000Z`, which is
70
+ * what the spreadsheet importer produces
71
+ * 3. a `Date` - read in UTC, so callers must build it
72
+ * with `Date.UTC`, never `new Date(y,m,d)`
73
+ *
74
+ * Free text is REFUSED rather than guessed at. `'04/17/1990'` and `'17/04/1990'`
75
+ * are the same eight characters in different orders and the platform serves
76
+ * Kenya, Uganda and Tanzania, where the second spelling is the common one.
77
+ * There is no reading of that string that is safe to infer, so the honest
78
+ * answer is `undefined` - which surfaces as a field the operator is asked to
79
+ * collect, instead of a wrong birthday nobody ever notices.
80
+ */
81
+ function toCalendarDate(value) {
82
+ if (value === null || value === undefined)
83
+ return undefined;
84
+ if (value instanceof Date) {
85
+ if (Number.isNaN(value.getTime()))
86
+ return undefined;
87
+ return value.toISOString().slice(0, 10);
88
+ }
89
+ if (typeof value !== 'string')
90
+ return undefined;
91
+ const trimmed = value.trim();
92
+ if (trimmed === '')
93
+ return undefined;
94
+ if (exports.ISO_CALENDAR_DATE_PATTERN.test(trimmed)) {
95
+ return isCalendarDate(trimmed) ? trimmed : undefined;
96
+ }
97
+ // A full UTC instant is unambiguous, so its date part can be taken. A local
98
+ // or offset timestamp is not: '1990-04-17T00:00:00+03:00' is 16 April in
99
+ // UTC, and only the sender knows which day they meant.
100
+ const utcInstant = /^(\d{4}-\d{2}-\d{2})T\d{2}:\d{2}(:\d{2}(\.\d{1,6})?)?Z$/.exec(trimmed);
101
+ if (utcInstant) {
102
+ return isCalendarDate(utcInstant[1]) ? utcInstant[1] : undefined;
103
+ }
104
+ return undefined;
105
+ }
106
+ /**
107
+ * A date that could belong to a living person.
108
+ *
109
+ * Deliberately NOT an age gate. There is no minimum: a dependent on a family
110
+ * membership may be a newborn. What it refuses is a date that cannot be a birth
111
+ * date at all - one in the future, or one further back than any human lifespan -
112
+ * because those are data-entry accidents (a 2026 default on a picker, a
113
+ * mis-keyed century) rather than facts about a person.
114
+ *
115
+ * `now` is injectable so the rule is deterministic under test, matching
116
+ * `isUsableMembership` and `isMembershipCoverActive`.
117
+ */
118
+ function isPlausibleBirthDate(value, now = new Date()) {
119
+ if (!isCalendarDate(value))
120
+ return false;
121
+ const born = new Date(`${value}T00:00:00.000Z`);
122
+ const today = new Date(`${now.toISOString().slice(0, 10)}T00:00:00.000Z`);
123
+ if (born.getTime() > today.getTime())
124
+ return false;
125
+ const oldest = new Date(today.getTime());
126
+ oldest.setUTCFullYear(oldest.getUTCFullYear() - exports.MAX_HUMAN_AGE_YEARS);
127
+ return born.getTime() >= oldest.getTime();
128
+ }
129
+ /** Whole years, UTC throughout. Returns undefined when the date is unusable. */
130
+ function calculateAge(value, now = new Date()) {
131
+ if (!isCalendarDate(value))
132
+ return undefined;
133
+ const born = new Date(`${value}T00:00:00.000Z`);
134
+ const today = new Date(`${now.toISOString().slice(0, 10)}T00:00:00.000Z`);
135
+ if (born.getTime() > today.getTime())
136
+ return undefined;
137
+ let age = today.getUTCFullYear() - born.getUTCFullYear();
138
+ const monthDelta = today.getUTCMonth() - born.getUTCMonth();
139
+ if (monthDelta < 0 || (monthDelta === 0 && today.getUTCDate() < born.getUTCDate()))
140
+ age -= 1;
141
+ return age;
142
+ }
143
+ /** True when the person is below the age of majority - for COPY, never a gate. */
144
+ function isMinor(value, now = new Date()) {
145
+ const age = calculateAge(value, now);
146
+ return age !== undefined && age < exports.AGE_OF_MAJORITY_YEARS;
147
+ }
148
+ //# sourceMappingURL=calendar-date.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-date.util.js","sourceRoot":"","sources":["../../../../../src/modules/common/utils/calendar-date.util.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.PartnerMemberProfileDto = void 0;
13
13
  const class_validator_1 = require("class-validator");
14
14
  const class_transformer_1 = require("class-transformer");
15
+ const calendar_date_decorator_1 = require("../../common/decorators/calendar-date.decorator");
15
16
  const partner_member_document_type_enum_1 = require("../enums/partner-member-document-type.enum");
16
17
  const partner_member_gender_enum_1 = require("../enums/partner-member-gender.enum");
17
18
  /** Blank strings mean "not supplied", not "supplied and empty". */
@@ -55,9 +56,7 @@ __decorate([
55
56
  (0, class_validator_1.IsOptional)(),
56
57
  (0, class_validator_1.IsString)(),
57
58
  (0, class_transformer_1.Transform)(blankToUndefined),
58
- (0, class_validator_1.Matches)(/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/, {
59
- message: 'dateOfBirth must be a calendar date in YYYY-MM-DD form',
60
- }),
59
+ (0, calendar_date_decorator_1.IsBirthDate)(),
61
60
  __metadata("design:type", String)
62
61
  ], PartnerMemberProfileDto.prototype, "dateOfBirth", void 0);
63
62
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"partner-member-profile.dto.js","sourceRoot":"","sources":["../../../../../src/modules/partner/dtos/partner-member-profile.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAsH;AACtH,yDAA8C;AAC9C,kGAAuF;AACvF,oFAA0E;AAE1E,mEAAmE;AACnE,MAAM,gBAAgB,GAAG,CAAC,EAAE,KAAK,EAAsB,EAAE,EAAE,CACvD,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAEzE;;;;;;;;;GASG;AACH,MAAa,uBAAuB;CAiDnC;AAjDD,0DAiDC;AA9CG;IAFC,IAAA,4BAAU,GAAE;IAAE,IAAA,0BAAQ,GAAE;IAAE,IAAA,2BAAS,EAAC,GAAG,CAAC;IACxC,IAAA,6BAAS,EAAC,gBAAgB,CAAC;;yDACV;AAWlB;IALC,IAAA,4BAAU,GAAE;IAAE,IAAA,0BAAQ,GAAE;IACxB,IAAA,6BAAS,EAAC,gBAAgB,CAAC;IAC3B,IAAA,yBAAO,EAAC,mBAAmB,EAAE;QAC1B,OAAO,EAAE,iEAAiE;KAC7E,CAAC;;4DACmB;AAIrB;IAFC,IAAA,4BAAU,GAAE;IAAE,IAAA,yBAAO,GAAE;IACvB,IAAA,6BAAS,EAAC,gBAAgB,CAAC;;sDACb;AAQf;IALC,IAAA,4BAAU,GAAE;IAAE,IAAA,0BAAQ,GAAE;IACxB,IAAA,6BAAS,EAAC,gBAAgB,CAAC;IAC3B,IAAA,yBAAO,EAAC,+CAA+C,EAAE;QACtD,OAAO,EAAE,wDAAwD;KACpE,CAAC;;4DACmB;AAIrB;IAFC,IAAA,4BAAU,GAAE;IAAE,IAAA,wBAAM,EAAC,gDAAmB,CAAC;IACzC,IAAA,6BAAS,EAAC,gBAAgB,CAAC;;uDACC;AAI7B;IAFC,IAAA,4BAAU,GAAE;IAAE,IAAA,wBAAM,EAAC,6DAAyB,CAAC;IAC/C,IAAA,6BAAS,EAAC,gBAAgB,CAAC;;6DACa;AAOzC;IALC,IAAA,4BAAU,GAAE;IAAE,IAAA,0BAAQ,GAAE;IAAE,IAAA,wBAAM,EAAC,CAAC,EAAE,EAAE,CAAC;IACvC,IAAA,6BAAS,EAAC,gBAAgB,CAAC;IAC3B,IAAA,yBAAO,EAAC,gBAAgB,EAAE;QACvB,OAAO,EAAE,qCAAqC;KACjD,CAAC;;+DACsB;AAOxB;IAJC,IAAA,4BAAU,GAAE;IAAE,IAAA,kCAAgB,GAAE;IAChC,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACrB,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAC5F;;oEAC4B"}
1
+ {"version":3,"file":"partner-member-profile.dto.js","sourceRoot":"","sources":["../../../../../src/modules/partner/dtos/partner-member-profile.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAsH;AACtH,yDAA8C;AAC9C,6FAA8E;AAC9E,kGAAuF;AACvF,oFAA0E;AAE1E,mEAAmE;AACnE,MAAM,gBAAgB,GAAG,CAAC,EAAE,KAAK,EAAsB,EAAE,EAAE,CACvD,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAEzE;;;;;;;;;GASG;AACH,MAAa,uBAAuB;CAsDnC;AAtDD,0DAsDC;AAnDG;IAFC,IAAA,4BAAU,GAAE;IAAE,IAAA,0BAAQ,GAAE;IAAE,IAAA,2BAAS,EAAC,GAAG,CAAC;IACxC,IAAA,6BAAS,EAAC,gBAAgB,CAAC;;yDACV;AAWlB;IALC,IAAA,4BAAU,GAAE;IAAE,IAAA,0BAAQ,GAAE;IACxB,IAAA,6BAAS,EAAC,gBAAgB,CAAC;IAC3B,IAAA,yBAAO,EAAC,mBAAmB,EAAE;QAC1B,OAAO,EAAE,iEAAiE;KAC7E,CAAC;;4DACmB;AAIrB;IAFC,IAAA,4BAAU,GAAE;IAAE,IAAA,yBAAO,GAAE;IACvB,IAAA,6BAAS,EAAC,gBAAgB,CAAC;;sDACb;AAaf;IAHC,IAAA,4BAAU,GAAE;IAAE,IAAA,0BAAQ,GAAE;IACxB,IAAA,6BAAS,EAAC,gBAAgB,CAAC;IAC3B,IAAA,qCAAW,GAAE;;4DACO;AAIrB;IAFC,IAAA,4BAAU,GAAE;IAAE,IAAA,wBAAM,EAAC,gDAAmB,CAAC;IACzC,IAAA,6BAAS,EAAC,gBAAgB,CAAC;;uDACC;AAI7B;IAFC,IAAA,4BAAU,GAAE;IAAE,IAAA,wBAAM,EAAC,6DAAyB,CAAC;IAC/C,IAAA,6BAAS,EAAC,gBAAgB,CAAC;;6DACa;AAOzC;IALC,IAAA,4BAAU,GAAE;IAAE,IAAA,0BAAQ,GAAE;IAAE,IAAA,wBAAM,EAAC,CAAC,EAAE,EAAE,CAAC;IACvC,IAAA,6BAAS,EAAC,gBAAgB,CAAC;IAC3B,IAAA,yBAAO,EAAC,gBAAgB,EAAE;QACvB,OAAO,EAAE,qCAAqC;KACjD,CAAC;;+DACsB;AAOxB;IAJC,IAAA,4BAAU,GAAE;IAAE,IAAA,kCAAgB,GAAE;IAChC,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACrB,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAC5F;;oEAC4B"}
@@ -49,6 +49,7 @@ __exportStar(require("./interfaces/partner-connection-test-result"), exports);
49
49
  __exportStar(require("./interfaces/partner-dispatch-events"), exports);
50
50
  __exportStar(require("./interfaces/partner-member-profile"), exports);
51
51
  __exportStar(require("./interfaces/partner-membership-descriptor"), exports);
52
+ __exportStar(require("./interfaces/partner-member-readiness"), exports);
52
53
  __exportStar(require("./interfaces/partner-membership"), exports);
53
54
  // Constants
54
55
  __exportStar(require("./constants/partner-defaults.const"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/partner/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,QAAQ;AACR,qEAAmD;AACnD,0EAAwD;AACxD,oEAAkD;AAClD,+EAA6D;AAC7D,0EAAwD;AACxD,2EAAyD;AACzD,uEAAqD;AACrD,wEAAsD;AACtD,+EAA6D;AAC7D,yEAAuD;AACvD,yEAAuD;AACvD,+EAA6D;AAC7D,sEAAoD;AACpD,yEAAuD;AACvD,gFAA8D;AAC9D,+EAA6D;AAC7D,qEAAmD;AACnD,4EAA0D;AAC1D,4EAA0D;AAC1D,oEAAkD;AAElD,aAAa;AACb,2EAAyD;AACzD,mEAAiD;AACjD,qEAAmD;AACnD,yEAAuD;AACvD,yEAAuD;AACvD,yEAAuD;AACvD,gEAA8C;AAC9C,wEAAsD;AACtD,sEAAoD;AACpD,8EAA4D;AAC5D,uEAAqD;AACrD,sEAAoD;AACpD,6EAA2D;AAC3D,kEAAgD;AAEhD,YAAY;AACZ,qEAAmD;AACnD,kEAAgD;AAEhD,OAAO;AACP,wEAAsD;AACtD,wEAAsD;AACtD,0EAAwD;AACxD,0EAAwD;AACxD,wEAAsD;AACtD,uEAAqD;AACrD,oEAAkD;AAClD,6EAA2D;AAC3D,oEAAkD;AAClD,2EAAyD;AACzD,uEAAqD;AACrD,sEAAoD;AACpD,qEAAmD;AAEnD,YAAY;AACZ,+DAA6C;AAC7C,+DAA6C;AAC7C,kEAAgD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/partner/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,QAAQ;AACR,qEAAmD;AACnD,0EAAwD;AACxD,oEAAkD;AAClD,+EAA6D;AAC7D,0EAAwD;AACxD,2EAAyD;AACzD,uEAAqD;AACrD,wEAAsD;AACtD,+EAA6D;AAC7D,yEAAuD;AACvD,yEAAuD;AACvD,+EAA6D;AAC7D,sEAAoD;AACpD,yEAAuD;AACvD,gFAA8D;AAC9D,+EAA6D;AAC7D,qEAAmD;AACnD,4EAA0D;AAC1D,4EAA0D;AAC1D,oEAAkD;AAElD,aAAa;AACb,2EAAyD;AACzD,mEAAiD;AACjD,qEAAmD;AACnD,yEAAuD;AACvD,yEAAuD;AACvD,yEAAuD;AACvD,gEAA8C;AAC9C,wEAAsD;AACtD,sEAAoD;AACpD,8EAA4D;AAC5D,uEAAqD;AACrD,sEAAoD;AACpD,6EAA2D;AAC3D,wEAAsD;AACtD,kEAAgD;AAEhD,YAAY;AACZ,qEAAmD;AACnD,kEAAgD;AAEhD,OAAO;AACP,wEAAsD;AACtD,wEAAsD;AACtD,0EAAwD;AACxD,0EAAwD;AACxD,wEAAsD;AACtD,uEAAqD;AACrD,oEAAkD;AAClD,6EAA2D;AAC3D,oEAAkD;AAClD,2EAAyD;AACzD,uEAAqD;AACrD,sEAAoD;AACpD,qEAAmD;AAEnD,YAAY;AACZ,+DAA6C;AAC7C,+DAA6C;AAC7C,kEAAgD"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=partner-member-readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partner-member-readiness.js","sourceRoot":"","sources":["../../../../../src/modules/partner/interfaces/partner-member-readiness.ts"],"names":[],"mappings":""}
@@ -1,24 +1,31 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toPartnerCalendarDate = exports.isCalendarDate = void 0;
3
4
  exports.buildMembershipSubjectReference = buildMembershipSubjectReference;
4
5
  exports.findMissingMemberProfileFields = findMissingMemberProfileFields;
5
6
  exports.findUnsatisfiedMemberProfileFields = findUnsatisfiedMemberProfileFields;
6
7
  exports.membershipRequired = membershipRequired;
7
8
  exports.isMemberProfileFieldPresent = isMemberProfileFieldPresent;
8
- exports.isCalendarDate = isCalendarDate;
9
- exports.toPartnerCalendarDate = toPartnerCalendarDate;
10
9
  exports.resolveMemberSeatCount = resolveMemberSeatCount;
11
10
  exports.buildMemberFullName = buildMemberFullName;
12
11
  exports.maskMemberDocumentNumber = maskMemberDocumentNumber;
13
12
  exports.isUsableMembership = isUsableMembership;
14
13
  exports.isMembershipCoverActive = isMembershipCoverActive;
14
+ const calendar_date_util_1 = require("../../common/utils/calendar-date.util");
15
+ Object.defineProperty(exports, "isCalendarDate", { enumerable: true, get: function () { return calendar_date_util_1.isCalendarDate; } });
15
16
  const partner_defaults_const_1 = require("../constants/partner-defaults.const");
16
17
  const partner_member_profile_field_enum_1 = require("../enums/partner-member-profile-field.enum");
17
18
  const partner_membership_status_enum_1 = require("../enums/partner-membership-status.enum");
18
19
  const partner_membership_subject_type_enum_1 = require("../enums/partner-membership-subject-type.enum");
19
20
  const partner_membership_package_scope_enum_1 = require("../enums/partner-membership-package-scope.enum");
20
- /** `YYYY-MM-DD`, with a plausible month and day. Calendar validity is checked separately. */
21
- const ISO_DATE_PATTERN = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/;
21
+ /**
22
+ * The platform pattern, not a fourth copy of it.
23
+ *
24
+ * This file used to declare its own and so did two DTOs, which is how they
25
+ * drifted apart: a bare @Matches regex accepts 2026-02-30, and Postgres rolls
26
+ * that forward to 1 March without complaining.
27
+ */
28
+ const ISO_DATE_PATTERN = calendar_date_util_1.ISO_CALENDAR_DATE_PATTERN;
22
29
  /**
23
30
  * Clarion's stable handle for a membership subject.
24
31
  *
@@ -160,40 +167,25 @@ function isMemberProfileFieldPresent(profile, field) {
160
167
  if (trimmed === '')
161
168
  return false;
162
169
  if (field === partner_member_profile_field_enum_1.PartnerMemberProfileField.DATE_OF_BIRTH) {
163
- return isCalendarDate(trimmed);
170
+ return (0, calendar_date_util_1.isCalendarDate)(trimmed);
164
171
  }
165
172
  return true;
166
173
  }
167
- /** A real `YYYY-MM-DD` date, not merely one shaped like it (rejects 2026-02-30). */
168
- function isCalendarDate(value) {
169
- if (!ISO_DATE_PATTERN.test(value))
170
- return false;
171
- const parsed = new Date(`${value}T00:00:00.000Z`);
172
- if (Number.isNaN(parsed.getTime()))
173
- return false;
174
- return parsed.toISOString().slice(0, 10) === value;
175
- }
176
174
  /**
177
175
  * A date of birth reduced to the calendar date partners want.
178
176
  *
179
- * Accepts what the platform actually stores - a `Date`, a timestamp string, a
180
- * bare date - and returns UTC, never local. Reading a stored instant in the
181
- * server's zone is how a birthday drifts a day when a pod moves region.
177
+ * Now a thin alias over the platform contract, and NARROWER than it used to be.
178
+ * The old body did `new Date(trimmed)` on anything that was not already
179
+ * `YYYY-MM-DD` and then read the result back in UTC, which under the pods' own
180
+ * `TZ=Africa/Nairobi` turned '04/17/1990' into '1990-04-16' and refused
181
+ * '17/04/1990' - the spelling most of East Africa actually writes.
182
+ *
183
+ * Ambiguous text is now refused outright. A refused date surfaces as a field an
184
+ * operator is asked to collect; a drifted one is a permanent wrong birthday at
185
+ * a partner that cannot delete a member, on the record a paramedic uses to size
186
+ * a drug dose.
182
187
  */
183
- function toPartnerCalendarDate(value) {
184
- if (value === null || value === undefined)
185
- return undefined;
186
- if (value instanceof Date) {
187
- return Number.isNaN(value.getTime()) ? undefined : value.toISOString().slice(0, 10);
188
- }
189
- const trimmed = String(value).trim();
190
- if (trimmed === '')
191
- return undefined;
192
- if (ISO_DATE_PATTERN.test(trimmed))
193
- return isCalendarDate(trimmed) ? trimmed : undefined;
194
- const parsed = new Date(trimmed);
195
- return Number.isNaN(parsed.getTime()) ? undefined : parsed.toISOString().slice(0, 10);
196
- }
188
+ exports.toPartnerCalendarDate = calendar_date_util_1.toCalendarDate;
197
189
  /**
198
190
  * Seats to buy for a member and their dependents.
199
191
  *
@@ -1 +1 @@
1
- {"version":3,"file":"partner-membership.util.js","sourceRoot":"","sources":["../../../../../src/modules/partner/utils/partner-membership.util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"partner-membership.util.js","sourceRoot":"","sources":["../../../../../src/modules/partner/utils/partner-membership.util.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ exports.truncateForPartner = truncateForPartner;
5
5
  exports.buildPartnerIssueText = buildPartnerIssueText;
6
6
  exports.maskPartnerIdentifier = maskPartnerIdentifier;
7
7
  exports.sanitizePartnerPayload = sanitizePartnerPayload;
8
+ exports.maskBirthDate = maskBirthDate;
8
9
  exports.maskPartnerUrl = maskPartnerUrl;
9
10
  const partner_defaults_const_1 = require("../constants/partner-defaults.const");
10
11
  /**
@@ -134,18 +135,25 @@ function isSecretKey(key) {
134
135
  * blanking the field entirely would make the audit trail useless while a full
135
136
  * value would put a national id in a table many people can read.
136
137
  */
138
+ /**
139
+ * Strips every separator before matching, so one fragment covers `dateOfBirth`,
140
+ * `date_of_birth`, `date-of-birth` and `DATE OF BIRTH` alike.
141
+ *
142
+ * Matching raw keys is what let `birth_date` through: it is not a substring of
143
+ * `dateofbirth`, `date_of_birth` or `birthdate`, so a payload spelled that way
144
+ * was archived with the birth date in the clear.
145
+ */
146
+ function normalizeKeyForMatching(key) {
147
+ return key.toLowerCase().replace(/[^a-z0-9]/g, '');
148
+ }
137
149
  exports.IDENTITY_DOCUMENT_KEY_FRAGMENTS = [
138
150
  'documentnumber',
139
- 'document_number',
140
151
  'nationalid',
141
- 'national_id',
142
152
  'idnumber',
143
- 'id_number',
144
153
  'passportnumber',
145
- 'passport_number',
146
154
  ];
147
155
  function isIdentityDocumentKey(key) {
148
- const normalized = key.toLowerCase();
156
+ const normalized = normalizeKeyForMatching(key);
149
157
  return exports.IDENTITY_DOCUMENT_KEY_FRAGMENTS.some((fragment) => normalized.includes(fragment));
150
158
  }
151
159
  /**
@@ -170,9 +178,18 @@ function maskIdentityDocument(value) {
170
178
  * survives, because "the partner rejected a member born in 1988" is the kind of
171
179
  * thing somebody actually has to debug.
172
180
  */
173
- exports.BIRTH_DATE_KEY_FRAGMENTS = ['dateofbirth', 'date_of_birth', 'birthdate', 'dob'];
181
+ /**
182
+ * Matched against a key with every separator stripped, so one fragment covers
183
+ * every spelling a producer might use.
184
+ *
185
+ * The previous list matched raw keys and therefore missed `birth_date` and
186
+ * `date-of-birth` entirely - close enough to the ones it did match that the
187
+ * gap was invisible, and wide enough that an audit payload using either
188
+ * spelling was stored with the birth date in the clear.
189
+ */
190
+ exports.BIRTH_DATE_KEY_FRAGMENTS = ['dateofbirth', 'birthdate', 'birthday', 'dob'];
174
191
  function isBirthDateKey(key) {
175
- const normalized = key.toLowerCase();
192
+ const normalized = normalizeKeyForMatching(key);
176
193
  return exports.BIRTH_DATE_KEY_FRAGMENTS.some((fragment) => normalized.includes(fragment));
177
194
  }
178
195
  /** `1988-04-12` becomes `1988-**-**`; anything unrecognised is blanked. */
@@ -189,7 +206,7 @@ function maskBirthDate(value) {
189
206
  */
190
207
  exports.REDACTED_PERSONAL_KEY_FRAGMENTS = ['gender'];
191
208
  function isRedactedPersonalKey(key) {
192
- const normalized = key.toLowerCase();
209
+ const normalized = normalizeKeyForMatching(key);
193
210
  return exports.REDACTED_PERSONAL_KEY_FRAGMENTS.some((fragment) => normalized.includes(fragment));
194
211
  }
195
212
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"partner-payload.util.js","sourceRoot":"","sources":["../../../../../src/modules/partner/utils/partner-payload.util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"partner-payload.util.js","sourceRoot":"","sources":["../../../../../src/modules/partner/utils/partner-payload.util.ts"],"names":[],"mappings":";;;AASA,gDAKC;AASD,sDAeC;AAUD,sDAMC;AAYD,wDAoBC;AAyGD,sCAIC;AAsBD,wCAKC;AA9ND,gFAA2E;AAE3E;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,KAAgC,EAAE,SAAiB;IAClF,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACrC,OAAO,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,qBAAqB,CAAC,KAKrC;;IACG,MAAM,SAAS,GAAG,MAAA,KAAK,CAAC,SAAS,mCAAI,6CAAoB,CAAC,gBAAgB,CAAC;IAC3E,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC;SAChD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;SAC/C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;SACvB,IAAI,CAAC,KAAK,CAAC,CAAC;IACjB,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;IAEtF,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7E,OAAO,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,qBAAqB,CAAC,KAAgC;IAClE,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACjC,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;IACpD,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACnD,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,sBAAsB,CAAC,KAAc,EAAE,KAAK,GAAG,CAAC;IAC5D,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9F,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5C,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QAC1E,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;QAC/B,CAAC;aAAM,IAAI,qBAAqB,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACjE,MAAM,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC1D,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;aAAM,IAAI,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;QAC/B,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;;;;GAQG;AACU,QAAA,oBAAoB,GAAG;IAChC,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,OAAO;IACP,eAAe;IACf,MAAM;IACN,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,aAAa;IACb,KAAK;CACR,CAAC;AAEF,SAAS,WAAW,CAAC,GAAW;IAC5B,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO,4BAAoB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AAClF,CAAC;AAED;;;;;;;;;GASG;AACH;;;;;;;GAOG;AACH,SAAS,uBAAuB,CAAC,GAAW;IACxC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AACvD,CAAC;AAEY,QAAA,+BAA+B,GAAG;IAC3C,gBAAgB;IAChB,YAAY;IACZ,UAAU;IACV,gBAAgB;CACnB,CAAC;AAEF,SAAS,qBAAqB,CAAC,GAAW;IACtC,MAAM,UAAU,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAChD,OAAO,uCAA+B,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,KAAa;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,OAAO,CAAC;IACnC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;;GAOG;AACH;;;;;;;;GAQG;AACU,QAAA,wBAAwB,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;AAExF,SAAS,cAAc,CAAC,GAAW;IAC/B,MAAM,UAAU,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAChD,OAAO,gCAAwB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,2EAA2E;AAC3E,SAAgB,aAAa,CAAC,KAAa;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC;AACtD,CAAC;AAED;;;;;GAKG;AACU,QAAA,+BAA+B,GAAG,CAAC,QAAQ,CAAC,CAAC;AAE1D,SAAS,qBAAqB,CAAC,GAAW;IACtC,MAAM,UAAU,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAChD,OAAO,uCAA+B,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,GAA8B;IACzD,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC;AAC9E,CAAC"}