grm-shared-library 1.1.199 → 1.1.201

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 (142) hide show
  1. package/dist/cjs/kafka/billing-topics.js +83 -0
  2. package/dist/cjs/kafka/billing-topics.js.map +1 -0
  3. package/dist/cjs/kafka/index.js +1 -0
  4. package/dist/cjs/kafka/index.js.map +1 -1
  5. package/dist/cjs/modules/partner/constants/partner-defaults.const.js +4 -0
  6. package/dist/cjs/modules/partner/constants/partner-defaults.const.js.map +1 -1
  7. package/dist/cjs/modules/partner/constants/partner-kafka.const.js +18 -1
  8. package/dist/cjs/modules/partner/constants/partner-kafka.const.js.map +1 -1
  9. package/dist/cjs/modules/partner/dtos/create-partner-integration.dto.js +34 -0
  10. package/dist/cjs/modules/partner/dtos/create-partner-integration.dto.js.map +1 -1
  11. package/dist/cjs/modules/partner/dtos/partner-member-profile-lookup.dto.js +52 -0
  12. package/dist/cjs/modules/partner/dtos/partner-member-profile-lookup.dto.js.map +1 -0
  13. package/dist/cjs/modules/partner/dtos/partner-member-profile.dto.js +91 -0
  14. package/dist/cjs/modules/partner/dtos/partner-member-profile.dto.js.map +1 -0
  15. package/dist/cjs/modules/partner/dtos/partner-membership-query.dto.js +75 -0
  16. package/dist/cjs/modules/partner/dtos/partner-membership-query.dto.js.map +1 -0
  17. package/dist/cjs/modules/partner/dtos/sync-partner-membership.dto.js +149 -0
  18. package/dist/cjs/modules/partner/dtos/sync-partner-membership.dto.js.map +1 -0
  19. package/dist/cjs/modules/partner/dtos/update-partner-membership.dto.js +38 -0
  20. package/dist/cjs/modules/partner/dtos/update-partner-membership.dto.js.map +1 -0
  21. package/dist/cjs/modules/partner/enums/partner-adapter-operation.enum.js +6 -0
  22. package/dist/cjs/modules/partner/enums/partner-adapter-operation.enum.js.map +1 -1
  23. package/dist/cjs/modules/partner/enums/partner-member-document-type.enum.js +17 -0
  24. package/dist/cjs/modules/partner/enums/partner-member-document-type.enum.js.map +1 -0
  25. package/dist/cjs/modules/partner/enums/partner-member-gender.enum.js +19 -0
  26. package/dist/cjs/modules/partner/enums/partner-member-gender.enum.js.map +1 -0
  27. package/dist/cjs/modules/partner/enums/partner-member-profile-field.enum.js +23 -0
  28. package/dist/cjs/modules/partner/enums/partner-member-profile-field.enum.js.map +1 -0
  29. package/dist/cjs/modules/partner/enums/partner-member-state.enum.js +49 -0
  30. package/dist/cjs/modules/partner/enums/partner-member-state.enum.js.map +1 -0
  31. package/dist/cjs/modules/partner/enums/partner-membership-package-scope.enum.js +24 -0
  32. package/dist/cjs/modules/partner/enums/partner-membership-package-scope.enum.js.map +1 -0
  33. package/dist/cjs/modules/partner/enums/partner-membership-status.enum.js +65 -0
  34. package/dist/cjs/modules/partner/enums/partner-membership-status.enum.js.map +1 -0
  35. package/dist/cjs/modules/partner/enums/partner-membership-subject-type.enum.js +18 -0
  36. package/dist/cjs/modules/partner/enums/partner-membership-subject-type.enum.js.map +1 -0
  37. package/dist/cjs/modules/partner/index.js +16 -0
  38. package/dist/cjs/modules/partner/index.js.map +1 -1
  39. package/dist/cjs/modules/partner/interfaces/partner-member-profile.js +3 -0
  40. package/dist/cjs/modules/partner/interfaces/partner-member-profile.js.map +1 -0
  41. package/dist/cjs/modules/partner/interfaces/partner-membership-descriptor.js +3 -0
  42. package/dist/cjs/modules/partner/interfaces/partner-membership-descriptor.js.map +1 -0
  43. package/dist/cjs/modules/partner/interfaces/partner-membership.js +3 -0
  44. package/dist/cjs/modules/partner/interfaces/partner-membership.js.map +1 -0
  45. package/dist/cjs/modules/partner/utils/partner-membership.util.js +291 -0
  46. package/dist/cjs/modules/partner/utils/partner-membership.util.js.map +1 -0
  47. package/dist/cjs/modules/partner/utils/partner-payload.util.js +84 -2
  48. package/dist/cjs/modules/partner/utils/partner-payload.util.js.map +1 -1
  49. package/dist/cjs/modules/partner/utils/partner-routing.util.js +17 -0
  50. package/dist/cjs/modules/partner/utils/partner-routing.util.js.map +1 -1
  51. package/dist/cjs/modules/permission/data/permissions.data.js +3 -1
  52. package/dist/cjs/modules/permission/data/permissions.data.js.map +1 -1
  53. package/dist/cjs/modules/permission/enums/permission-actions.enum.js +7 -0
  54. package/dist/cjs/modules/permission/enums/permission-actions.enum.js.map +1 -1
  55. package/dist/cjs/modules/role/data/roles.data.js +8 -0
  56. package/dist/cjs/modules/role/data/roles.data.js.map +1 -1
  57. package/dist/esm/kafka/billing-topics.js +80 -0
  58. package/dist/esm/kafka/billing-topics.js.map +1 -0
  59. package/dist/esm/kafka/index.js +1 -0
  60. package/dist/esm/kafka/index.js.map +1 -1
  61. package/dist/esm/modules/partner/constants/partner-defaults.const.js +4 -0
  62. package/dist/esm/modules/partner/constants/partner-defaults.const.js.map +1 -1
  63. package/dist/esm/modules/partner/constants/partner-kafka.const.js +17 -0
  64. package/dist/esm/modules/partner/constants/partner-kafka.const.js.map +1 -1
  65. package/dist/esm/modules/partner/dtos/create-partner-integration.dto.js +34 -0
  66. package/dist/esm/modules/partner/dtos/create-partner-integration.dto.js.map +1 -1
  67. package/dist/esm/modules/partner/dtos/partner-member-profile-lookup.dto.js +48 -0
  68. package/dist/esm/modules/partner/dtos/partner-member-profile-lookup.dto.js.map +1 -0
  69. package/dist/esm/modules/partner/dtos/partner-member-profile.dto.js +87 -0
  70. package/dist/esm/modules/partner/dtos/partner-member-profile.dto.js.map +1 -0
  71. package/dist/esm/modules/partner/dtos/partner-membership-query.dto.js +71 -0
  72. package/dist/esm/modules/partner/dtos/partner-membership-query.dto.js.map +1 -0
  73. package/dist/esm/modules/partner/dtos/sync-partner-membership.dto.js +144 -0
  74. package/dist/esm/modules/partner/dtos/sync-partner-membership.dto.js.map +1 -0
  75. package/dist/esm/modules/partner/dtos/update-partner-membership.dto.js +34 -0
  76. package/dist/esm/modules/partner/dtos/update-partner-membership.dto.js.map +1 -0
  77. package/dist/esm/modules/partner/enums/partner-adapter-operation.enum.js +6 -0
  78. package/dist/esm/modules/partner/enums/partner-adapter-operation.enum.js.map +1 -1
  79. package/dist/esm/modules/partner/enums/partner-member-document-type.enum.js +14 -0
  80. package/dist/esm/modules/partner/enums/partner-member-document-type.enum.js.map +1 -0
  81. package/dist/esm/modules/partner/enums/partner-member-gender.enum.js +16 -0
  82. package/dist/esm/modules/partner/enums/partner-member-gender.enum.js.map +1 -0
  83. package/dist/esm/modules/partner/enums/partner-member-profile-field.enum.js +20 -0
  84. package/dist/esm/modules/partner/enums/partner-member-profile-field.enum.js.map +1 -0
  85. package/dist/esm/modules/partner/enums/partner-member-state.enum.js +46 -0
  86. package/dist/esm/modules/partner/enums/partner-member-state.enum.js.map +1 -0
  87. package/dist/esm/modules/partner/enums/partner-membership-package-scope.enum.js +21 -0
  88. package/dist/esm/modules/partner/enums/partner-membership-package-scope.enum.js.map +1 -0
  89. package/dist/esm/modules/partner/enums/partner-membership-status.enum.js +62 -0
  90. package/dist/esm/modules/partner/enums/partner-membership-status.enum.js.map +1 -0
  91. package/dist/esm/modules/partner/enums/partner-membership-subject-type.enum.js +15 -0
  92. package/dist/esm/modules/partner/enums/partner-membership-subject-type.enum.js.map +1 -0
  93. package/dist/esm/modules/partner/index.js +16 -0
  94. package/dist/esm/modules/partner/index.js.map +1 -1
  95. package/dist/esm/modules/partner/interfaces/partner-member-profile.js +2 -0
  96. package/dist/esm/modules/partner/interfaces/partner-member-profile.js.map +1 -0
  97. package/dist/esm/modules/partner/interfaces/partner-membership-descriptor.js +2 -0
  98. package/dist/esm/modules/partner/interfaces/partner-membership-descriptor.js.map +1 -0
  99. package/dist/esm/modules/partner/interfaces/partner-membership.js +2 -0
  100. package/dist/esm/modules/partner/interfaces/partner-membership.js.map +1 -0
  101. package/dist/esm/modules/partner/utils/partner-membership.util.js +277 -0
  102. package/dist/esm/modules/partner/utils/partner-membership.util.js.map +1 -0
  103. package/dist/esm/modules/partner/utils/partner-payload.util.js +83 -1
  104. package/dist/esm/modules/partner/utils/partner-payload.util.js.map +1 -1
  105. package/dist/esm/modules/partner/utils/partner-routing.util.js +16 -0
  106. package/dist/esm/modules/partner/utils/partner-routing.util.js.map +1 -1
  107. package/dist/esm/modules/permission/data/permissions.data.js +3 -1
  108. package/dist/esm/modules/permission/data/permissions.data.js.map +1 -1
  109. package/dist/esm/modules/permission/enums/permission-actions.enum.js +7 -0
  110. package/dist/esm/modules/permission/enums/permission-actions.enum.js.map +1 -1
  111. package/dist/esm/modules/role/data/roles.data.js +8 -0
  112. package/dist/esm/modules/role/data/roles.data.js.map +1 -1
  113. package/dist/types/interfaces/pagination.d.ts +9 -0
  114. package/dist/types/kafka/billing-topics.d.ts +77 -0
  115. package/dist/types/kafka/index.d.ts +1 -0
  116. package/dist/types/modules/partner/constants/partner-defaults.const.d.ts +4 -0
  117. package/dist/types/modules/partner/constants/partner-kafka.const.d.ts +17 -0
  118. package/dist/types/modules/partner/dtos/create-partner-integration.dto.d.ts +4 -0
  119. package/dist/types/modules/partner/dtos/partner-member-profile-lookup.dto.d.ts +45 -0
  120. package/dist/types/modules/partner/dtos/partner-member-profile.dto.d.ts +28 -0
  121. package/dist/types/modules/partner/dtos/partner-membership-query.dto.d.ts +19 -0
  122. package/dist/types/modules/partner/dtos/sync-partner-membership.dto.d.ts +114 -0
  123. package/dist/types/modules/partner/dtos/update-partner-membership.dto.d.ts +18 -0
  124. package/dist/types/modules/partner/enums/partner-adapter-operation.enum.d.ts +7 -1
  125. package/dist/types/modules/partner/enums/partner-member-document-type.enum.d.ts +12 -0
  126. package/dist/types/modules/partner/enums/partner-member-gender.enum.d.ts +14 -0
  127. package/dist/types/modules/partner/enums/partner-member-profile-field.enum.d.ts +18 -0
  128. package/dist/types/modules/partner/enums/partner-member-state.enum.d.ts +39 -0
  129. package/dist/types/modules/partner/enums/partner-membership-package-scope.enum.d.ts +19 -0
  130. package/dist/types/modules/partner/enums/partner-membership-status.enum.d.ts +53 -0
  131. package/dist/types/modules/partner/enums/partner-membership-subject-type.enum.d.ts +13 -0
  132. package/dist/types/modules/partner/index.d.ts +16 -0
  133. package/dist/types/modules/partner/interfaces/partner-integration.d.ts +22 -0
  134. package/dist/types/modules/partner/interfaces/partner-member-profile.d.ts +65 -0
  135. package/dist/types/modules/partner/interfaces/partner-membership-descriptor.d.ts +108 -0
  136. package/dist/types/modules/partner/interfaces/partner-membership.d.ts +149 -0
  137. package/dist/types/modules/partner/interfaces/partner-provider-descriptor.d.ts +16 -0
  138. package/dist/types/modules/partner/utils/partner-membership.util.d.ts +156 -0
  139. package/dist/types/modules/partner/utils/partner-payload.util.d.ts +27 -0
  140. package/dist/types/modules/partner/utils/partner-routing.util.d.ts +9 -0
  141. package/dist/types/modules/permission/enums/permission-actions.enum.d.ts +2 -0
  142. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"partner-adapter-operation.enum.js","sourceRoot":"","sources":["../../../../../src/modules/partner/enums/partner-adapter-operation.enum.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAN,IAAY,uBAoBX;AApBD,WAAY,uBAAuB;IAC/B,uEAAuE;IACvE,wDAA6B,CAAA;IAC7B,yCAAyC;IACzC,wDAA6B,CAAA;IAC7B,uCAAuC;IACvC,gDAAqB,CAAA;IACrB,kDAAkD;IAClD,wDAA6B,CAAA;IAC7B,oEAAoE;IACpE,gDAAqB,CAAA;IACrB,yEAAyE;IACzE,0CAAe,CAAA;IACf;;;;;OAKG;IACH,4CAAiB,CAAA;AACrB,CAAC,EApBW,uBAAuB,KAAvB,uBAAuB,QAoBlC"}
1
+ {"version":3,"file":"partner-adapter-operation.enum.js","sourceRoot":"","sources":["../../../../../src/modules/partner/enums/partner-adapter-operation.enum.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAN,IAAY,uBA0BX;AA1BD,WAAY,uBAAuB;IAC/B,uEAAuE;IACvE,wDAA6B,CAAA;IAC7B,yCAAyC;IACzC,wDAA6B,CAAA;IAC7B,uCAAuC;IACvC,gDAAqB,CAAA;IACrB,kDAAkD;IAClD,wDAA6B,CAAA;IAC7B,oEAAoE;IACpE,gDAAqB,CAAA;IACrB,yEAAyE;IACzE,0CAAe,CAAA;IACf;;;;;OAKG;IACH,4CAAiB,CAAA;IACjB,iFAAiF;IACjF,wEAA6C,CAAA;IAC7C,2EAA2E;IAC3E,kEAAuC,CAAA;IACvC,6EAA6E;IAC7E,oFAAyD,CAAA;AAC7D,CAAC,EA1BW,uBAAuB,KAAvB,uBAAuB,QA0BlC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The kind of identity document a partner membership records.
3
+ *
4
+ * Neutral values; each adapter maps them onto its own partner's spelling.
5
+ */
6
+ export var PartnerMemberDocumentType;
7
+ (function (PartnerMemberDocumentType) {
8
+ PartnerMemberDocumentType["PASSPORT"] = "PASSPORT";
9
+ PartnerMemberDocumentType["NATIONAL_ID"] = "NATIONAL_ID";
10
+ PartnerMemberDocumentType["DRIVING_LICENCE"] = "DRIVING_LICENCE";
11
+ /** Any other government-issued identifier. */
12
+ PartnerMemberDocumentType["OTHER"] = "OTHER";
13
+ })(PartnerMemberDocumentType || (PartnerMemberDocumentType = {}));
14
+ //# sourceMappingURL=partner-member-document-type.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partner-member-document-type.enum.js","sourceRoot":"","sources":["../../../../../src/modules/partner/enums/partner-member-document-type.enum.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAN,IAAY,yBAMX;AAND,WAAY,yBAAyB;IACjC,kDAAqB,CAAA;IACrB,wDAA2B,CAAA;IAC3B,gEAAmC,CAAA;IACnC,8CAA8C;IAC9C,4CAAe,CAAA;AACnB,CAAC,EANW,yBAAyB,KAAzB,yBAAyB,QAMpC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Gender, in the platform's own vocabulary.
3
+ *
4
+ * Values are NEUTRAL, not any one partner's wire literals. Rescue.co happens to
5
+ * spell these lowercase; the next partner will spell them differently, and a
6
+ * shared enum carrying the first partner's spelling makes every later adapter
7
+ * translate away from a standard that was never a standard.
8
+ */
9
+ export var PartnerMemberGender;
10
+ (function (PartnerMemberGender) {
11
+ PartnerMemberGender["MALE"] = "MALE";
12
+ PartnerMemberGender["FEMALE"] = "FEMALE";
13
+ PartnerMemberGender["OTHER"] = "OTHER";
14
+ PartnerMemberGender["UNSPECIFIED"] = "UNSPECIFIED";
15
+ })(PartnerMemberGender || (PartnerMemberGender = {}));
16
+ //# sourceMappingURL=partner-member-gender.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partner-member-gender.enum.js","sourceRoot":"","sources":["../../../../../src/modules/partner/enums/partner-member-gender.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAN,IAAY,mBAKX;AALD,WAAY,mBAAmB;IAC3B,oCAAa,CAAA;IACb,wCAAiB,CAAA;IACjB,sCAAe,CAAA;IACf,kDAA2B,CAAA;AAC/B,CAAC,EALW,mBAAmB,KAAnB,mBAAmB,QAK9B"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The provider-neutral facts about a person that a partner membership may need.
3
+ *
4
+ * The VALUES are the property names on {@link PartnerMemberProfile}, which is
5
+ * what lets "which of this partner's required fields are missing?" be a generic
6
+ * loop rather than a per-partner if-ladder - the same trick that lets one admin
7
+ * form serve every partner's `configFields`.
8
+ */
9
+ export var PartnerMemberProfileField;
10
+ (function (PartnerMemberProfileField) {
11
+ PartnerMemberProfileField["FULL_NAME"] = "fullName";
12
+ PartnerMemberProfileField["PHONE_NUMBER"] = "phoneNumber";
13
+ PartnerMemberProfileField["EMAIL"] = "email";
14
+ PartnerMemberProfileField["DATE_OF_BIRTH"] = "dateOfBirth";
15
+ PartnerMemberProfileField["GENDER"] = "gender";
16
+ PartnerMemberProfileField["DOCUMENT_TYPE"] = "documentType";
17
+ PartnerMemberProfileField["DOCUMENT_NUMBER"] = "documentNumber";
18
+ PartnerMemberProfileField["DOCUMENT_COUNTRY_CODE"] = "documentCountryCode";
19
+ })(PartnerMemberProfileField || (PartnerMemberProfileField = {}));
20
+ //# sourceMappingURL=partner-member-profile-field.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partner-member-profile-field.enum.js","sourceRoot":"","sources":["../../../../../src/modules/partner/enums/partner-member-profile-field.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAN,IAAY,yBASX;AATD,WAAY,yBAAyB;IACjC,mDAAsB,CAAA;IACtB,yDAA4B,CAAA;IAC5B,4CAAe,CAAA;IACf,0DAA6B,CAAA;IAC7B,8CAAiB,CAAA;IACjB,2DAA8B,CAAA;IAC9B,+DAAkC,CAAA;IAClC,0EAA6C,CAAA;AACjD,CAAC,EATW,yBAAyB,KAAzB,yBAAyB,QASpC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * A member's standing with a partner, reduced to something every screen and
3
+ * report can rely on without learning any partner's vocabulary.
4
+ *
5
+ * The direct analogue of {@link PartnerEngagementState} for dispatches, and it
6
+ * exists for the same reason: partners describe the same five situations with
7
+ * completely different words, and the alternative is every consumer growing a
8
+ * per-partner if-ladder. Rescue.co's own `status` is still persisted verbatim
9
+ * alongside it, because an operator ringing the partner needs the word THEY use.
10
+ *
11
+ * The distinction that matters most is PENDING_ACTIVATION vs ACTIVE. A member
12
+ * can exist, hold a real member id and be worth naming on an emergency, and
13
+ * still not be covered - Rescue.co returns a brand-new member as
14
+ * `waitingPeriod`. An admin screen that collapses the two tells a subscriber
15
+ * they are covered on the day they paid, which is the most damaging thing this
16
+ * feature could get wrong.
17
+ */
18
+ export var PartnerMemberState;
19
+ (function (PartnerMemberState) {
20
+ /** Registered, but the partner's cover has not started. */
21
+ PartnerMemberState["PENDING_ACTIVATION"] = "PENDING_ACTIVATION";
22
+ /** Cover is in force. */
23
+ PartnerMemberState["ACTIVE"] = "ACTIVE";
24
+ /** Temporarily not in force - non-payment, a partner-side hold. */
25
+ PartnerMemberState["SUSPENDED"] = "SUSPENDED";
26
+ /** The term ended or the partner cancelled them. */
27
+ PartnerMemberState["LAPSED"] = "LAPSED";
28
+ /** The partner said something this adapter does not recognise. */
29
+ PartnerMemberState["UNKNOWN"] = "UNKNOWN";
30
+ })(PartnerMemberState || (PartnerMemberState = {}));
31
+ /**
32
+ * States in which a member id is worth putting on an emergency.
33
+ *
34
+ * PENDING_ACTIVATION is included deliberately: naming the caller is accurate
35
+ * and useful whatever their cover state, and a partner's own operator is better
36
+ * off knowing who is calling. LAPSED is excluded because quoting a member id
37
+ * the partner has finished with risks an outright rejection of the SOS - which
38
+ * would cost an ambulance to add a field that was optional in the first place.
39
+ */
40
+ export const DEFAULT_QUOTABLE_MEMBER_STATES = [
41
+ PartnerMemberState.PENDING_ACTIVATION,
42
+ PartnerMemberState.ACTIVE,
43
+ PartnerMemberState.SUSPENDED,
44
+ PartnerMemberState.UNKNOWN,
45
+ ];
46
+ //# sourceMappingURL=partner-member-state.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partner-member-state.enum.js","sourceRoot":"","sources":["../../../../../src/modules/partner/enums/partner-member-state.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAN,IAAY,kBAWX;AAXD,WAAY,kBAAkB;IAC1B,2DAA2D;IAC3D,+DAAyC,CAAA;IACzC,yBAAyB;IACzB,uCAAiB,CAAA;IACjB,mEAAmE;IACnE,6CAAuB,CAAA;IACvB,oDAAoD;IACpD,uCAAiB,CAAA;IACjB,kEAAkE;IAClE,yCAAmB,CAAA;AACvB,CAAC,EAXW,kBAAkB,KAAlB,kBAAkB,QAW7B;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAkC;IACzE,kBAAkB,CAAC,kBAAkB;IACrC,kBAAkB,CAAC,MAAM;IACzB,kBAAkB,CAAC,SAAS;IAC5B,kBAAkB,CAAC,OAAO;CAC7B,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Which of an organization's packages have their subscribers registered as
3
+ * members with a partner.
4
+ *
5
+ * A separate axis from coverage rules, on purpose. Coverage rules answer "where
6
+ * does THIS EMERGENCY go", which is an incident-shaped question a package
7
+ * cannot be asked: a partnership whose only rule matches on emergency type
8
+ * would evaluate as covering nobody, and one whose package names no incident
9
+ * types at all - which this platform reads as "covers everything" - would buy a
10
+ * paid membership, and export a date of birth, for every free subscriber.
11
+ *
12
+ * So membership eligibility is stated, not inferred.
13
+ */
14
+ export var PartnerMembershipPackageScope;
15
+ (function (PartnerMembershipPackageScope) {
16
+ /** Every package the organization sells. The default once membership is on. */
17
+ PartnerMembershipPackageScope["ALL"] = "ALL";
18
+ /** Only the packages named in `membershipPackageIds`. */
19
+ PartnerMembershipPackageScope["SELECTED"] = "SELECTED";
20
+ })(PartnerMembershipPackageScope || (PartnerMembershipPackageScope = {}));
21
+ //# sourceMappingURL=partner-membership-package-scope.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partner-membership-package-scope.enum.js","sourceRoot":"","sources":["../../../../../src/modules/partner/enums/partner-membership-package-scope.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAN,IAAY,6BAKX;AALD,WAAY,6BAA6B;IACrC,+EAA+E;IAC/E,4CAAW,CAAA;IACX,yDAAyD;IACzD,sDAAqB,CAAA;AACzB,CAAC,EALW,6BAA6B,KAA7B,6BAA6B,QAKxC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Where one subject's membership with one partner has got to.
3
+ *
4
+ * A membership is an ENRICHMENT, never a gate. Nothing in this lifecycle can
5
+ * stop an emergency reaching a partner: a subject whose membership is
6
+ * INCOMPLETE_PROFILE or FAILED still has an SOS raised for them, just without a
7
+ * member id attached. That property is what makes it safe to provision
8
+ * memberships from a background worker rather than on the alert path.
9
+ */
10
+ export var PartnerMembershipStatus;
11
+ (function (PartnerMembershipStatus) {
12
+ /** Decided that this subject needs a membership; not yet created at the partner. */
13
+ PartnerMembershipStatus["PENDING"] = "PENDING";
14
+ /**
15
+ * Blocked on personal details the partner requires and the platform does
16
+ * not hold - a date of birth, most often. `missingFields` names them, so an
17
+ * operator is told exactly what to collect rather than seeing a bare error.
18
+ */
19
+ PartnerMembershipStatus["INCOMPLETE_PROFILE"] = "INCOMPLETE_PROFILE";
20
+ /** A create call is in flight at the partner. */
21
+ PartnerMembershipStatus["PROVISIONING"] = "PROVISIONING";
22
+ /** The partner has issued a member id. */
23
+ PartnerMembershipStatus["ACTIVE"] = "ACTIVE";
24
+ /** Every attempt failed for a reason retrying cannot fix. */
25
+ PartnerMembershipStatus["FAILED"] = "FAILED";
26
+ /**
27
+ * A create was made and its outcome is UNKNOWN - the reply was lost, or the
28
+ * partner could not be asked afterwards whether it landed.
29
+ *
30
+ * Deliberately a dead end rather than another retry. A partner's member API
31
+ * is not idempotent, so retrying an attempt that may have succeeded is how
32
+ * one person acquires two memberships - and on a seat-limited plan the
33
+ * duplicate quietly consumes cover belonging to somebody else. A human
34
+ * checks with the partner and resolves it, exactly as an abandoned dispatch
35
+ * is handled.
36
+ */
37
+ PartnerMembershipStatus["NEEDS_REVIEW"] = "NEEDS_REVIEW";
38
+ /**
39
+ * The subscription behind the membership ended. The member is left in place
40
+ * at the partner - cancelling someone's ambulance cover is the partner's
41
+ * decision to action, not a side effect of a Clarion row changing - but the
42
+ * member id is no longer quoted on new emergencies.
43
+ */
44
+ PartnerMembershipStatus["CANCELLED"] = "CANCELLED";
45
+ })(PartnerMembershipStatus || (PartnerMembershipStatus = {}));
46
+ /**
47
+ * Statuses from which the worker may make another attempt on its own.
48
+ *
49
+ * NEEDS_REVIEW and FAILED are deliberately absent: both need a human to decide,
50
+ * and an automatic retry past either is how a duplicate member gets created.
51
+ */
52
+ export const RETRYABLE_PARTNER_MEMBERSHIP_STATUSES = [
53
+ PartnerMembershipStatus.PENDING,
54
+ PartnerMembershipStatus.INCOMPLETE_PROFILE,
55
+ ];
56
+ /** Statuses that need an operator before anything else can happen. */
57
+ export const PARTNER_MEMBERSHIP_ATTENTION_STATUSES = [
58
+ PartnerMembershipStatus.INCOMPLETE_PROFILE,
59
+ PartnerMembershipStatus.NEEDS_REVIEW,
60
+ PartnerMembershipStatus.FAILED,
61
+ ];
62
+ //# sourceMappingURL=partner-membership-status.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partner-membership-status.enum.js","sourceRoot":"","sources":["../../../../../src/modules/partner/enums/partner-membership-status.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAN,IAAY,uBAkCX;AAlCD,WAAY,uBAAuB;IAC/B,oFAAoF;IACpF,8CAAmB,CAAA;IACnB;;;;OAIG;IACH,oEAAyC,CAAA;IACzC,iDAAiD;IACjD,wDAA6B,CAAA;IAC7B,0CAA0C;IAC1C,4CAAiB,CAAA;IACjB,6DAA6D;IAC7D,4CAAiB,CAAA;IACjB;;;;;;;;;;OAUG;IACH,wDAA6B,CAAA;IAC7B;;;;;OAKG;IACH,kDAAuB,CAAA;AAC3B,CAAC,EAlCW,uBAAuB,KAAvB,uBAAuB,QAkClC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAAuC;IACrF,uBAAuB,CAAC,OAAO;IAC/B,uBAAuB,CAAC,kBAAkB;CAC7C,CAAC;AAEF,sEAAsE;AACtE,MAAM,CAAC,MAAM,qCAAqC,GAAuC;IACrF,uBAAuB,CAAC,kBAAkB;IAC1C,uBAAuB,CAAC,YAAY;IACpC,uBAAuB,CAAC,MAAM;CACjC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Who a membership belongs to, in Clarion's own vocabulary.
3
+ *
4
+ * Deliberately NOT "user": a corporate member may have no platform login, and a
5
+ * dependent is never a membership of their own - they are carried on the
6
+ * primary member's, because that is how partners price and structure cover.
7
+ */
8
+ export var PartnerMembershipSubjectType;
9
+ (function (PartnerMembershipSubjectType) {
10
+ /** The platform user who holds an individual subscription. */
11
+ PartnerMembershipSubjectType["INDIVIDUAL_SUBSCRIBER"] = "INDIVIDUAL_SUBSCRIBER";
12
+ /** One member of a corporate client, covered by that client's subscription. */
13
+ PartnerMembershipSubjectType["CORPORATE_MEMBER"] = "CORPORATE_MEMBER";
14
+ })(PartnerMembershipSubjectType || (PartnerMembershipSubjectType = {}));
15
+ //# sourceMappingURL=partner-membership-subject-type.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partner-membership-subject-type.enum.js","sourceRoot":"","sources":["../../../../../src/modules/partner/enums/partner-membership-subject-type.enum.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAN,IAAY,4BAKX;AALD,WAAY,4BAA4B;IACpC,8DAA8D;IAC9D,+EAA+C,CAAA;IAC/C,+EAA+E;IAC/E,qEAAqC,CAAA;AACzC,CAAC,EALW,4BAA4B,KAA5B,4BAA4B,QAKvC"}
@@ -12,6 +12,13 @@ export * from './enums/partner-location-provider.enum';
12
12
  export * from './enums/partner-adapter-operation.enum';
13
13
  export * from './enums/incident-partner-routing-status.enum';
14
14
  export * from './enums/partner-dispatch-scope.enum';
15
+ export * from './enums/partner-membership-status.enum';
16
+ export * from './enums/partner-membership-package-scope.enum';
17
+ export * from './enums/partner-membership-subject-type.enum';
18
+ export * from './enums/partner-member-gender.enum';
19
+ export * from './enums/partner-member-document-type.enum';
20
+ export * from './enums/partner-member-profile-field.enum';
21
+ export * from './enums/partner-member-state.enum';
15
22
  // Interfaces
16
23
  export * from './interfaces/partner-provider-descriptor';
17
24
  export * from './interfaces/partner-integration';
@@ -24,6 +31,9 @@ export * from './interfaces/incident-partner-routing';
24
31
  export * from './interfaces/partner-routing-result';
25
32
  export * from './interfaces/partner-connection-test-result';
26
33
  export * from './interfaces/partner-dispatch-events';
34
+ export * from './interfaces/partner-member-profile';
35
+ export * from './interfaces/partner-membership-descriptor';
36
+ export * from './interfaces/partner-membership';
27
37
  // Constants
28
38
  export * from './constants/partner-defaults.const';
29
39
  export * from './constants/partner-kafka.const';
@@ -36,7 +46,13 @@ export * from './dtos/route-incident-to-partners.dto';
36
46
  export * from './dtos/partner-dispatch-decision.dto';
37
47
  export * from './dtos/amend-partner-dispatch.dto';
38
48
  export * from './dtos/update-incident-partner-routing.dto';
49
+ export * from './dtos/partner-member-profile.dto';
50
+ export * from './dtos/partner-member-profile-lookup.dto';
51
+ export * from './dtos/update-partner-membership.dto';
52
+ export * from './dtos/partner-membership-query.dto';
53
+ export * from './dtos/sync-partner-membership.dto';
39
54
  // Utilities
40
55
  export * from './utils/partner-routing.util';
41
56
  export * from './utils/partner-payload.util';
57
+ export * from './utils/partner-membership.util';
42
58
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/partner/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,mCAAmC,CAAC;AAClD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,qCAAqC,CAAC;AAEpD,aAAa;AACb,cAAc,0CAA0C,CAAC;AACzD,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,sCAAsC,CAAC;AAErD,YAAY;AACZ,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAEhD,OAAO;AACP,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC;AACxD,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAClD,cAAc,4CAA4C,CAAC;AAE3D,YAAY;AACZ,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/partner/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,mCAAmC,CAAC;AAClD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,oCAAoC,CAAC;AACnD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mCAAmC,CAAC;AAElD,aAAa;AACb,cAAc,0CAA0C,CAAC;AACzD,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC;AACpD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,iCAAiC,CAAC;AAEhD,YAAY;AACZ,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAEhD,OAAO;AACP,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC;AACxD,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAClD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,mCAAmC,CAAC;AAClD,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC;AACpD,cAAc,oCAAoC,CAAC;AAEnD,YAAY;AACZ,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=partner-member-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partner-member-profile.js","sourceRoot":"","sources":["../../../../../src/modules/partner/interfaces/partner-member-profile.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=partner-membership-descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partner-membership-descriptor.js","sourceRoot":"","sources":["../../../../../src/modules/partner/interfaces/partner-membership-descriptor.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=partner-membership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partner-membership.js","sourceRoot":"","sources":["../../../../../src/modules/partner/interfaces/partner-membership.ts"],"names":[],"mappings":""}
@@ -0,0 +1,277 @@
1
+ import { PARTNER_FIELD_LIMITS } from '../constants/partner-defaults.const';
2
+ import { PartnerMemberProfileField } from '../enums/partner-member-profile-field.enum';
3
+ import { PartnerMembershipStatus } from '../enums/partner-membership-status.enum';
4
+ import { PartnerMembershipSubjectType } from '../enums/partner-membership-subject-type.enum';
5
+ import { PartnerMembershipPackageScope } from '../enums/partner-membership-package-scope.enum';
6
+ /** `YYYY-MM-DD`, with a plausible month and day. Calendar validity is checked separately. */
7
+ const ISO_DATE_PATTERN = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/;
8
+ /**
9
+ * Clarion's stable handle for a membership subject.
10
+ *
11
+ * Keyed on the PERSON wherever there is one, not on the subscription that paid
12
+ * for them. A partner registers a human being: an employee covered by their
13
+ * company who also buys personal cover is one member with one member id, and
14
+ * keying on the billing relationship would register them twice - two member ids
15
+ * for one person, two seats consumed, double-billed at the partner, and an
16
+ * emergency quoting whichever of the two the database happened to return first.
17
+ *
18
+ * Only a corporate member never linked to a platform login falls back to the
19
+ * relationship key, because for them there is no person key to use.
20
+ *
21
+ * Prefixed by kind so the two spaces can never collide on a bare numeric id.
22
+ * This is what the unique index on (integrationId, subjectReference) relies on
23
+ * to stop one person acquiring two memberships when an activation event is
24
+ * redelivered.
25
+ */
26
+ export function buildMembershipSubjectReference(subject) {
27
+ if (subject.userId)
28
+ return `user:${subject.userId}`;
29
+ // Exhaustive on purpose. An `else` here would silently file a future
30
+ // subject type (a household, say) under 'individual-client', where it would
31
+ // collide with a real person on the unique index and overwrite their
32
+ // membership - with no compile error to warn anyone.
33
+ switch (subject.subjectType) {
34
+ case PartnerMembershipSubjectType.CORPORATE_MEMBER:
35
+ return `corporate-member:${subject.subjectId}`;
36
+ case PartnerMembershipSubjectType.INDIVIDUAL_SUBSCRIBER:
37
+ return `individual-client:${subject.subjectId}`;
38
+ default: {
39
+ const unreachable = subject.subjectType;
40
+ throw new Error(`Unsupported partner membership subject type: ${String(unreachable)}`);
41
+ }
42
+ }
43
+ }
44
+ /**
45
+ * Which of a partner's REQUIRED profile fields this profile cannot satisfy.
46
+ *
47
+ * Generic over the descriptor rather than per-partner, so a partner that starts
48
+ * insisting on a national id needs a one-line descriptor change and no new
49
+ * validation code. An empty result means the profile is ready to send.
50
+ */
51
+ export function findMissingMemberProfileFields(profile, descriptor) {
52
+ return findUnsatisfiedMemberProfileFields(profile, descriptor).map((entry) => entry.field);
53
+ }
54
+ /**
55
+ * What stops this profile being sent, and WHY.
56
+ *
57
+ * "Missing" and "malformed" are different problems with different remedies:
58
+ * one needs the fact collected, the other needs it corrected. Reporting a
59
+ * mistyped date of birth as missing leaves an operator staring at a field that
60
+ * is plainly filled in, with nothing to do - and reporting nothing at all
61
+ * leaves the membership in FAILED with an empty list.
62
+ *
63
+ * Also checks any partner-declared `profileFields` marked required, whose
64
+ * values live in `attributes` - so a partner asking for a policy number gets
65
+ * the same treatment as one asking for a date of birth.
66
+ */
67
+ export function findUnsatisfiedMemberProfileFields(profile, descriptor) {
68
+ var _a, _b;
69
+ const source = profile !== null && profile !== void 0 ? profile : {};
70
+ const results = [];
71
+ for (const field of descriptor.requiredProfileFields) {
72
+ const raw = source[field];
73
+ const present = raw !== null && raw !== undefined && String(raw).trim() !== '';
74
+ if (!present) {
75
+ results.push({ field, reason: 'MISSING' });
76
+ continue;
77
+ }
78
+ if (!isMemberProfileFieldPresent(source, field)) {
79
+ results.push({
80
+ field,
81
+ reason: 'MALFORMED',
82
+ detail: field === PartnerMemberProfileField.DATE_OF_BIRTH
83
+ ? 'Not a calendar date in YYYY-MM-DD form.'
84
+ : undefined,
85
+ });
86
+ }
87
+ }
88
+ const attributes = (_a = source.attributes) !== null && _a !== void 0 ? _a : {};
89
+ const wellKnown = new Set(Object.values(PartnerMemberProfileField));
90
+ for (const declared of (_b = descriptor.profileFields) !== null && _b !== void 0 ? _b : []) {
91
+ if (!declared.required || wellKnown.has(declared.key))
92
+ continue;
93
+ const value = attributes[declared.key];
94
+ if (value === undefined || value === null || String(value).trim() === '') {
95
+ results.push({ field: declared.key, reason: 'MISSING' });
96
+ continue;
97
+ }
98
+ if (declared.pattern && !new RegExp(declared.pattern).test(String(value))) {
99
+ results.push({
100
+ field: declared.key,
101
+ reason: 'MALFORMED',
102
+ detail: `Does not match the format ${declared.label} requires.`,
103
+ });
104
+ }
105
+ }
106
+ return results;
107
+ }
108
+ /**
109
+ * Whether a partnership should register the subscribers of one package.
110
+ *
111
+ * The single expression of membership eligibility, used by every trigger so
112
+ * they cannot disagree. Deliberately NOT derived from coverage rules: those
113
+ * answer "where does THIS EMERGENCY go", which is an incident-shaped question
114
+ * that a package cannot be asked - a partnership whose only rule matches on
115
+ * emergency type would evaluate as covering nobody, and one whose package names
116
+ * no incident types at all (which this platform reads as "covers everything")
117
+ * would buy a paid membership for every free subscriber.
118
+ */
119
+ export function membershipRequired(integration, packageId) {
120
+ var _a, _b;
121
+ if (integration.enabled === false)
122
+ return false;
123
+ if (!integration.membershipEnabled)
124
+ return false;
125
+ const scope = (_a = integration.membershipPackageScope) !== null && _a !== void 0 ? _a : PartnerMembershipPackageScope.ALL;
126
+ if (scope === PartnerMembershipPackageScope.ALL)
127
+ return true;
128
+ if (packageId === null || packageId === undefined)
129
+ return false;
130
+ return ((_b = integration.membershipPackageIds) !== null && _b !== void 0 ? _b : []).includes(packageId);
131
+ }
132
+ /**
133
+ * Whether one profile field carries a usable value.
134
+ *
135
+ * A date of birth is checked for SHAPE as well as presence: an unparseable one
136
+ * is worse than an absent one, because it is sent, refused by the partner, and
137
+ * retried forever against a value that will never become valid.
138
+ */
139
+ export function isMemberProfileFieldPresent(profile, field) {
140
+ const value = profile[field];
141
+ if (value === null || value === undefined)
142
+ return false;
143
+ if (typeof value !== 'string')
144
+ return true;
145
+ const trimmed = value.trim();
146
+ if (trimmed === '')
147
+ return false;
148
+ if (field === PartnerMemberProfileField.DATE_OF_BIRTH) {
149
+ return isCalendarDate(trimmed);
150
+ }
151
+ return true;
152
+ }
153
+ /** A real `YYYY-MM-DD` date, not merely one shaped like it (rejects 2026-02-30). */
154
+ export function isCalendarDate(value) {
155
+ if (!ISO_DATE_PATTERN.test(value))
156
+ return false;
157
+ const parsed = new Date(`${value}T00:00:00.000Z`);
158
+ if (Number.isNaN(parsed.getTime()))
159
+ return false;
160
+ return parsed.toISOString().slice(0, 10) === value;
161
+ }
162
+ /**
163
+ * A date of birth reduced to the calendar date partners want.
164
+ *
165
+ * Accepts what the platform actually stores - a `Date`, a timestamp string, a
166
+ * bare date - and returns UTC, never local. Reading a stored instant in the
167
+ * server's zone is how a birthday drifts a day when a pod moves region.
168
+ */
169
+ export function toPartnerCalendarDate(value) {
170
+ if (value === null || value === undefined)
171
+ return undefined;
172
+ if (value instanceof Date) {
173
+ return Number.isNaN(value.getTime()) ? undefined : value.toISOString().slice(0, 10);
174
+ }
175
+ const trimmed = String(value).trim();
176
+ if (trimmed === '')
177
+ return undefined;
178
+ if (ISO_DATE_PATTERN.test(trimmed))
179
+ return isCalendarDate(trimmed) ? trimmed : undefined;
180
+ const parsed = new Date(trimmed);
181
+ return Number.isNaN(parsed.getTime()) ? undefined : parsed.toISOString().slice(0, 10);
182
+ }
183
+ /**
184
+ * Seats to buy for a member and their dependents.
185
+ *
186
+ * Always at least one - the member's own - and never more than the partner
187
+ * allows, so a subscription with more beneficiaries than a partner's ceiling
188
+ * buys the maximum rather than being refused outright.
189
+ */
190
+ export function resolveMemberSeatCount(dependentCount, maxDependents) {
191
+ const dependents = Number.isFinite(dependentCount) ? Math.max(0, Math.trunc(dependentCount)) : 0;
192
+ const capped = maxDependents === null || maxDependents === undefined
193
+ ? dependents
194
+ : Math.min(dependents, Math.max(0, maxDependents));
195
+ return capped + 1;
196
+ }
197
+ /**
198
+ * A person's name as a partner should record it, from whatever parts exist.
199
+ *
200
+ * Returns undefined rather than an empty or half-formed name: a member called
201
+ * " " is worse than a membership that is honestly reported as incomplete.
202
+ */
203
+ export function buildMemberFullName(parts) {
204
+ var _a;
205
+ const direct = (_a = parts.name) === null || _a === void 0 ? void 0 : _a.trim();
206
+ if (direct)
207
+ return clampName(direct);
208
+ const joined = [parts.firstName, parts.lastName]
209
+ .map((part) => part === null || part === void 0 ? void 0 : part.trim())
210
+ .filter((part) => !!part)
211
+ .join(' ');
212
+ return joined ? clampName(joined) : undefined;
213
+ }
214
+ function clampName(value) {
215
+ return value.length > PARTNER_FIELD_LIMITS.MEMBER_NAME_MAX_LENGTH
216
+ ? value.slice(0, PARTNER_FIELD_LIMITS.MEMBER_NAME_MAX_LENGTH).trimEnd()
217
+ : value;
218
+ }
219
+ /**
220
+ * Mask a document number for logs.
221
+ *
222
+ * A national id identifies a person as surely as their name and outlives any
223
+ * credential rotation, so it is treated more carefully than one: the last two
224
+ * characters are enough to match a support query against a record, and the mask
225
+ * is fixed width so the length of the original is not disclosed either.
226
+ */
227
+ export function maskMemberDocumentNumber(value) {
228
+ if (!value)
229
+ return '';
230
+ const trimmed = value.trim();
231
+ if (trimmed.length <= 2)
232
+ return '***';
233
+ // Fixed width: a variable-length mask leaks how many digits the number has,
234
+ // which for a national id narrows it considerably.
235
+ return `***${trimmed.slice(-2)}`;
236
+ }
237
+ /**
238
+ * Whether a membership may be quoted on an emergency right now.
239
+ *
240
+ * Deliberately does NOT require the partner's cover to have started. A member
241
+ * inside a waiting period is still that person's real member id, and telling
242
+ * the partner who is calling is accurate and useful whatever their cover state.
243
+ * What is excluded is a membership the partner has finished with: quoting an
244
+ * id past its term risks an outright rejection of the SOS, which costs an
245
+ * ambulance to add a field that was optional anyway.
246
+ */
247
+ export function isUsableMembership(membership, now = new Date()) {
248
+ var _a;
249
+ if (membership.status !== PartnerMembershipStatus.ACTIVE)
250
+ return false;
251
+ if (!((_a = membership.partnerMemberId) === null || _a === void 0 ? void 0 : _a.trim()))
252
+ return false;
253
+ const endsAt = toDate(membership.coverageEndsAt);
254
+ return !endsAt || endsAt.getTime() > now.getTime();
255
+ }
256
+ /**
257
+ * Whether the PARTNER's cover has actually begun.
258
+ *
259
+ * Separate from {@link isUsableMembership} because the two answer different
260
+ * questions and conflating them misleads a human. Rescue.co returns a new
261
+ * member as `waitingPeriod`: they exist, they are quotable, and they are not
262
+ * yet covered. An admin screen that renders a green "Active" chip the day
263
+ * somebody paid will have told them they are covered when they are not.
264
+ */
265
+ export function isMembershipCoverActive(membership, now = new Date()) {
266
+ if (!isUsableMembership(membership, now))
267
+ return false;
268
+ const startsAt = toDate(membership.coverageStartsAt);
269
+ return !startsAt || startsAt.getTime() <= now.getTime();
270
+ }
271
+ function toDate(value) {
272
+ if (!value)
273
+ return null;
274
+ const parsed = value instanceof Date ? value : new Date(value);
275
+ return Number.isNaN(parsed.getTime()) ? null : parsed;
276
+ }
277
+ //# sourceMappingURL=partner-membership.util.js.map
@@ -0,0 +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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"}