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
@@ -0,0 +1,114 @@
1
+ import { CountryCode } from '../../country/enums/country-code.enum';
2
+ import { PartnerMembershipSubjectType } from '../enums/partner-membership-subject-type.enum';
3
+ /**
4
+ * One dependent carried on the subject's cover, BY REFERENCE.
5
+ *
6
+ * Deliberately carries no personal detail. This payload travels over Kafka,
7
+ * where it is retained for as long as the topic is and is readable by anything
8
+ * with consumer access - which is the wrong place for a child's date of birth.
9
+ * The receiving service resolves the person from clarion-authentication, the
10
+ * one service that owns people, at the moment it actually needs them.
11
+ */
12
+ export declare class SyncPartnerMembershipDependentDto {
13
+ /**
14
+ * Clarion's stable handle for this dependent - the billing beneficiary id.
15
+ *
16
+ * Idempotency turns on this: a dependent already sent to a partner is
17
+ * recognised by it on the next sync rather than added a second time, which
18
+ * on a seat-limited membership would otherwise consume the cover of somebody
19
+ * who has not been added yet.
20
+ */
21
+ dependentReference: string;
22
+ /** The platform user this dependent is, so their details can be resolved. */
23
+ userId?: number;
24
+ relationship?: string;
25
+ }
26
+ /**
27
+ * "Here is everything true about this person's cover right now - make the
28
+ * partner's records agree." The single internal contract for membership
29
+ * provisioning, and deliberately a STATE statement rather than a change
30
+ * notification.
31
+ *
32
+ * Carries IDENTIFIERS AND COMMERCIAL FACTS ONLY - never a person's details.
33
+ * The subject's name, phone, date of birth and identity document are resolved
34
+ * from clarion-authentication when they are needed, because this payload is
35
+ * published on a Kafka topic: whatever is put in it is retained for the topic's
36
+ * lifetime and readable by every consumer, present and future. A date of birth
37
+ * does not belong there, and once it is there it cannot be recalled.
38
+ *
39
+ * It is otherwise SELF-CONTAINED - clarion-partner-services never calls back
40
+ * into clarion-billing to finish the job, the same rule
41
+ * `RouteIncidentToPartnersDto` follows, because the service that owns
42
+ * emergencies must not acquire a synchronous dependency on the service that
43
+ * owns money.
44
+ *
45
+ * It carries NO partnership id. Which partners a subscriber should be
46
+ * registered with is decided from coverage rules inside
47
+ * clarion-partner-services, because that is where the partnerships live;
48
+ * clarion-billing states the FACTS (who, what they bought, what it covers) and
49
+ * makes no partner decisions at all.
50
+ */
51
+ export declare class SyncPartnerMembershipDto {
52
+ /**
53
+ * Monotonic upstream sequence, taken from clarion-billing's own outbox id.
54
+ *
55
+ * The ONLY defence against an unordered stream. Billing publishes each
56
+ * lifecycle change on its own topic and Kafka guarantees no ordering across
57
+ * topics, so `active: false` and `active: true` for one subscriber can and
58
+ * do arrive in either order. The consumer applies an event only when this
59
+ * exceeds what the row has already seen, which turns "whichever arrived
60
+ * last wins" into "whichever HAPPENED last wins".
61
+ */
62
+ sequence?: number;
63
+ /**
64
+ * Stable id of this event, stamped once by the producer and unchanged
65
+ * across every republish of the same outbox row. The consumer records it
66
+ * to collapse redeliveries.
67
+ */
68
+ eventId?: string;
69
+ organizationId: number;
70
+ subjectType: PartnerMembershipSubjectType;
71
+ /** The individual client id, or the corporate client member id. */
72
+ subjectId: number;
73
+ /** The platform user, when the subject has one. Absent for an un-linked corporate member. */
74
+ userId?: number;
75
+ subscriptionId?: number;
76
+ packageId?: number;
77
+ /** Quoted to the partner alongside the member id, so their operator sees the plan. */
78
+ packageName?: string;
79
+ countryCode?: CountryCode;
80
+ /**
81
+ * Months in one billing period - 1 for monthly, 12 for annual, null or
82
+ * absent for a one-off purchase. Provider-neutral on purpose: a partner's
83
+ * own billing vocabulary is the adapter's business, and clarion-billing's
84
+ * `BillingCycle` enum has no place in this contract.
85
+ */
86
+ billingIntervalMonths?: number;
87
+ /**
88
+ * Whether the cover is live. False ends the membership on this side; the
89
+ * member is NOT deleted at the partner, because cancelling somebody's
90
+ * ambulance cover is a decision for the partner to action, not a side
91
+ * effect of a Clarion row changing.
92
+ */
93
+ active: boolean;
94
+ /**
95
+ * Incident types the package covers. An EMPTY array means it covers
96
+ * everything - that is clarion-billing's existing semantics for
97
+ * `BillingPackage.incidentTypeIds`, and inverting it here would silently
98
+ * un-cover every package that has never named a type.
99
+ */
100
+ coveredIncidentTypeIds: number[];
101
+ /**
102
+ * The COMPLETE current set of dependents, not a delta.
103
+ *
104
+ * This is the whole reason the contract is one state event rather than
105
+ * several change events. Beneficiary changes and subscription changes are
106
+ * published on different topics with no ordering between them, so a
107
+ * dependent-added event routinely arrives before the subscription that owns
108
+ * it. Applying deltas from an unordered stream to a partner that will not
109
+ * let a dependent be withdrawn until the end of the term produces duplicate
110
+ * dependents and permanently burns seats. A full set, applied under the
111
+ * sequence fence, converges from any order of arrival.
112
+ */
113
+ dependents?: SyncPartnerMembershipDependentDto[];
114
+ }
@@ -0,0 +1,18 @@
1
+ import { PartnerMemberProfileDto } from './partner-member-profile.dto';
2
+ /**
3
+ * An operator completing or correcting the details behind one membership.
4
+ *
5
+ * The subject, the partnership and the subscription are NOT settable: a
6
+ * membership belongs to the person the platform decided it belongs to, and
7
+ * letting an edit re-point it at somebody else would silently transfer one
8
+ * person's ambulance cover to another.
9
+ */
10
+ export declare class UpdatePartnerMembershipDto {
11
+ profile?: PartnerMemberProfileDto;
12
+ /**
13
+ * Queue another provisioning attempt straight away, rather than waiting for
14
+ * the worker's next pass. What an operator wants after filling in the field
15
+ * that was blocking it.
16
+ */
17
+ retryNow?: boolean;
18
+ }
@@ -22,5 +22,11 @@ export declare enum PartnerAdapterOperation {
22
22
  * Used after a timeout, where the request might have landed but the reply
23
23
  * never arrived - the one case where re-sending could produce a duplicate.
24
24
  */
25
- LOOKUP = "LOOKUP"
25
+ LOOKUP = "LOOKUP",
26
+ /** Registering a person with the partner as a member, ahead of any emergency. */
27
+ PROVISION_MEMBERSHIP = "PROVISION_MEMBERSHIP",
28
+ /** Asking the partner whether it already knows this person as a member. */
29
+ LOOKUP_MEMBERSHIP = "LOOKUP_MEMBERSHIP",
30
+ /** Adding or correcting the dependents carried on an existing membership. */
31
+ SYNC_MEMBERSHIP_DEPENDENTS = "SYNC_MEMBERSHIP_DEPENDENTS"
26
32
  }
@@ -0,0 +1,12 @@
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 declare enum PartnerMemberDocumentType {
7
+ PASSPORT = "PASSPORT",
8
+ NATIONAL_ID = "NATIONAL_ID",
9
+ DRIVING_LICENCE = "DRIVING_LICENCE",
10
+ /** Any other government-issued identifier. */
11
+ OTHER = "OTHER"
12
+ }
@@ -0,0 +1,14 @@
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 declare enum PartnerMemberGender {
10
+ MALE = "MALE",
11
+ FEMALE = "FEMALE",
12
+ OTHER = "OTHER",
13
+ UNSPECIFIED = "UNSPECIFIED"
14
+ }
@@ -0,0 +1,18 @@
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 declare enum PartnerMemberProfileField {
10
+ FULL_NAME = "fullName",
11
+ PHONE_NUMBER = "phoneNumber",
12
+ EMAIL = "email",
13
+ DATE_OF_BIRTH = "dateOfBirth",
14
+ GENDER = "gender",
15
+ DOCUMENT_TYPE = "documentType",
16
+ DOCUMENT_NUMBER = "documentNumber",
17
+ DOCUMENT_COUNTRY_CODE = "documentCountryCode"
18
+ }
@@ -0,0 +1,39 @@
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 declare enum PartnerMemberState {
19
+ /** Registered, but the partner's cover has not started. */
20
+ PENDING_ACTIVATION = "PENDING_ACTIVATION",
21
+ /** Cover is in force. */
22
+ ACTIVE = "ACTIVE",
23
+ /** Temporarily not in force - non-payment, a partner-side hold. */
24
+ SUSPENDED = "SUSPENDED",
25
+ /** The term ended or the partner cancelled them. */
26
+ LAPSED = "LAPSED",
27
+ /** The partner said something this adapter does not recognise. */
28
+ UNKNOWN = "UNKNOWN"
29
+ }
30
+ /**
31
+ * States in which a member id is worth putting on an emergency.
32
+ *
33
+ * PENDING_ACTIVATION is included deliberately: naming the caller is accurate
34
+ * and useful whatever their cover state, and a partner's own operator is better
35
+ * off knowing who is calling. LAPSED is excluded because quoting a member id
36
+ * the partner has finished with risks an outright rejection of the SOS - which
37
+ * would cost an ambulance to add a field that was optional in the first place.
38
+ */
39
+ export declare const DEFAULT_QUOTABLE_MEMBER_STATES: readonly PartnerMemberState[];
@@ -0,0 +1,19 @@
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 declare enum PartnerMembershipPackageScope {
15
+ /** Every package the organization sells. The default once membership is on. */
16
+ ALL = "ALL",
17
+ /** Only the packages named in `membershipPackageIds`. */
18
+ SELECTED = "SELECTED"
19
+ }
@@ -0,0 +1,53 @@
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 declare enum PartnerMembershipStatus {
11
+ /** Decided that this subject needs a membership; not yet created at the partner. */
12
+ PENDING = "PENDING",
13
+ /**
14
+ * Blocked on personal details the partner requires and the platform does
15
+ * not hold - a date of birth, most often. `missingFields` names them, so an
16
+ * operator is told exactly what to collect rather than seeing a bare error.
17
+ */
18
+ INCOMPLETE_PROFILE = "INCOMPLETE_PROFILE",
19
+ /** A create call is in flight at the partner. */
20
+ PROVISIONING = "PROVISIONING",
21
+ /** The partner has issued a member id. */
22
+ ACTIVE = "ACTIVE",
23
+ /** Every attempt failed for a reason retrying cannot fix. */
24
+ FAILED = "FAILED",
25
+ /**
26
+ * A create was made and its outcome is UNKNOWN - the reply was lost, or the
27
+ * partner could not be asked afterwards whether it landed.
28
+ *
29
+ * Deliberately a dead end rather than another retry. A partner's member API
30
+ * is not idempotent, so retrying an attempt that may have succeeded is how
31
+ * one person acquires two memberships - and on a seat-limited plan the
32
+ * duplicate quietly consumes cover belonging to somebody else. A human
33
+ * checks with the partner and resolves it, exactly as an abandoned dispatch
34
+ * is handled.
35
+ */
36
+ NEEDS_REVIEW = "NEEDS_REVIEW",
37
+ /**
38
+ * The subscription behind the membership ended. The member is left in place
39
+ * at the partner - cancelling someone's ambulance cover is the partner's
40
+ * decision to action, not a side effect of a Clarion row changing - but the
41
+ * member id is no longer quoted on new emergencies.
42
+ */
43
+ CANCELLED = "CANCELLED"
44
+ }
45
+ /**
46
+ * Statuses from which the worker may make another attempt on its own.
47
+ *
48
+ * NEEDS_REVIEW and FAILED are deliberately absent: both need a human to decide,
49
+ * and an automatic retry past either is how a duplicate member gets created.
50
+ */
51
+ export declare const RETRYABLE_PARTNER_MEMBERSHIP_STATUSES: readonly PartnerMembershipStatus[];
52
+ /** Statuses that need an operator before anything else can happen. */
53
+ export declare const PARTNER_MEMBERSHIP_ATTENTION_STATUSES: readonly PartnerMembershipStatus[];
@@ -0,0 +1,13 @@
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 declare enum PartnerMembershipSubjectType {
9
+ /** The platform user who holds an individual subscription. */
10
+ INDIVIDUAL_SUBSCRIBER = "INDIVIDUAL_SUBSCRIBER",
11
+ /** One member of a corporate client, covered by that client's subscription. */
12
+ CORPORATE_MEMBER = "CORPORATE_MEMBER"
13
+ }
@@ -11,6 +11,13 @@ export * from './enums/partner-location-provider.enum';
11
11
  export * from './enums/partner-adapter-operation.enum';
12
12
  export * from './enums/incident-partner-routing-status.enum';
13
13
  export * from './enums/partner-dispatch-scope.enum';
14
+ export * from './enums/partner-membership-status.enum';
15
+ export * from './enums/partner-membership-package-scope.enum';
16
+ export * from './enums/partner-membership-subject-type.enum';
17
+ export * from './enums/partner-member-gender.enum';
18
+ export * from './enums/partner-member-document-type.enum';
19
+ export * from './enums/partner-member-profile-field.enum';
20
+ export * from './enums/partner-member-state.enum';
14
21
  export * from './interfaces/partner-provider-descriptor';
15
22
  export * from './interfaces/partner-integration';
16
23
  export * from './interfaces/partner-coverage-rule';
@@ -22,6 +29,9 @@ export * from './interfaces/incident-partner-routing';
22
29
  export * from './interfaces/partner-routing-result';
23
30
  export * from './interfaces/partner-connection-test-result';
24
31
  export * from './interfaces/partner-dispatch-events';
32
+ export * from './interfaces/partner-member-profile';
33
+ export * from './interfaces/partner-membership-descriptor';
34
+ export * from './interfaces/partner-membership';
25
35
  export * from './constants/partner-defaults.const';
26
36
  export * from './constants/partner-kafka.const';
27
37
  export * from './dtos/create-partner-integration.dto';
@@ -32,5 +42,11 @@ export * from './dtos/route-incident-to-partners.dto';
32
42
  export * from './dtos/partner-dispatch-decision.dto';
33
43
  export * from './dtos/amend-partner-dispatch.dto';
34
44
  export * from './dtos/update-incident-partner-routing.dto';
45
+ export * from './dtos/partner-member-profile.dto';
46
+ export * from './dtos/partner-member-profile-lookup.dto';
47
+ export * from './dtos/update-partner-membership.dto';
48
+ export * from './dtos/partner-membership-query.dto';
49
+ export * from './dtos/sync-partner-membership.dto';
35
50
  export * from './utils/partner-routing.util';
36
51
  export * from './utils/partner-payload.util';
52
+ export * from './utils/partner-membership.util';
@@ -1,6 +1,7 @@
1
1
  import { CountryCode } from '../../country/enums/country-code.enum';
2
2
  import { PartnerIntegrationEnvironment } from '../enums/partner-integration-environment.enum';
3
3
  import { PartnerIntegrationStatus } from '../enums/partner-integration-status.enum';
4
+ import { PartnerMembershipPackageScope } from '../enums/partner-membership-package-scope.enum';
4
5
  import { PartnerProviderCode } from '../enums/partner-provider-code.enum';
5
6
  import { PartnerRoutingMode } from '../enums/partner-routing-mode.enum';
6
7
  import { PartnerServiceCapability } from '../enums/partner-service-capability.enum';
@@ -42,9 +43,30 @@ export interface PartnerIntegration {
42
43
  enabled: boolean;
43
44
  /** Order in which partnerships are considered when several cover one incident. */
44
45
  priority: number;
46
+ /**
47
+ * Whether subscribers are registered with this partner as members ahead of
48
+ * any emergency.
49
+ *
50
+ * Off by default, and deliberately so: registering a person with a third
51
+ * party sends their name, telephone number and date of birth outside the
52
+ * platform, which is a decision an organization makes on purpose and not
53
+ * one that follows from saving a form.
54
+ */
55
+ membershipEnabled: boolean;
56
+ /** Which packages' subscribers are registered. Ignored when membership is off. */
57
+ membershipPackageScope: PartnerMembershipPackageScope;
58
+ /** Packages to register, when the scope is SELECTED. */
59
+ membershipPackageIds: number[];
45
60
  /** ISO 3166-1 alpha-2 country the partnership operates in. */
46
61
  countryCode: CountryCode;
47
62
  status: PartnerIntegrationStatus;
63
+ /**
64
+ * True when the registered adapter can create members for this provider at
65
+ * all. Served from the adapter descriptor, not stored - so a partnership
66
+ * configured before a partner gained memberships starts reporting it the
67
+ * moment the adapter does.
68
+ */
69
+ membershipSupported?: boolean;
48
70
  partnerContactName?: string | null;
49
71
  partnerContactPhone?: string | null;
50
72
  partnerContactEmail?: string | null;
@@ -0,0 +1,65 @@
1
+ import { PartnerMemberDocumentType } from '../enums/partner-member-document-type.enum';
2
+ import { PartnerMemberGender } from '../enums/partner-member-gender.enum';
3
+ /**
4
+ * A person, as a partner membership records them - provider-neutral.
5
+ *
6
+ * This is deliberately NOT a Clarion user, a billing client or a beneficiary.
7
+ * Those are three different rows in three different services, and a partner
8
+ * cares about none of that distinction: it wants a name, a number and enough
9
+ * identity to tell two people apart. Assembling one of these is the ONLY place
10
+ * that has to know where each fact lives, so adding a partner never means
11
+ * re-learning Clarion's data model.
12
+ *
13
+ * Every field except the name is optional here, because what a partner
14
+ * REQUIRES is the partner's business and is declared in its
15
+ * {@link PartnerMembershipDescriptor}. A profile that satisfies one partner may
16
+ * be short for another, and the platform reports exactly which fields are
17
+ * short rather than failing opaquely.
18
+ */
19
+ export interface PartnerMemberProfile {
20
+ /** Full name as the partner should record it. */
21
+ fullName: string;
22
+ /** E.164, e.g. `+254712345678`. Normalized before it ever reaches here. */
23
+ phoneNumber?: string | null;
24
+ email?: string | null;
25
+ /**
26
+ * ISO-8601 CALENDAR DATE, `YYYY-MM-DD` - never a timestamp.
27
+ *
28
+ * A date of birth has no time and no zone, and sending one that does is how
29
+ * a member silently acquires a birthday a day either side of their real one
30
+ * depending on where the server happens to be.
31
+ */
32
+ dateOfBirth?: string | null;
33
+ gender?: PartnerMemberGender | null;
34
+ documentType?: PartnerMemberDocumentType | null;
35
+ /** Alphanumeric, as issued. Treated as personal data: masked in every log. */
36
+ documentNumber?: string | null;
37
+ /** ISO 3166-1 alpha-2, uppercase, e.g. `KE`. */
38
+ documentCountryCode?: string | null;
39
+ /**
40
+ * Partner-declared extras, keyed by the `key` of an
41
+ * `extraProfileFields` entry in that partner's membership descriptor.
42
+ *
43
+ * The typed fields above are the facts EVERY partner asks for, and they are
44
+ * resolved centrally from the platform's own records. This is for the ones
45
+ * only one partner wants - a policy number, a plan tier, a medical-aid
46
+ * number - which the admin renders a form for from the descriptor, exactly
47
+ * as it already does for a partnership's `configFields`. Without it, the
48
+ * cost of a partner needing one unanticipated field is a shared-library
49
+ * publish and a migration in three services.
50
+ */
51
+ attributes?: Record<string, string> | null;
52
+ }
53
+ /**
54
+ * A dependent carried on somebody else's membership - a spouse or child covered
55
+ * by the same subscription.
56
+ *
57
+ * `dependentReference` is Clarion's own stable handle for them (a billing
58
+ * beneficiary id), and it is what makes syncing idempotent: a dependent already
59
+ * sent is recognised on the next sync rather than added a second time.
60
+ */
61
+ export interface PartnerMemberDependentProfile extends PartnerMemberProfile {
62
+ dependentReference: string;
63
+ /** e.g. `Spouse`. Free text; partners do not share a relationship vocabulary. */
64
+ relationship?: string | null;
65
+ }
@@ -0,0 +1,108 @@
1
+ import { PartnerMemberProfileField } from '../enums/partner-member-profile-field.enum';
2
+ import { PartnerMemberState } from '../enums/partner-member-state.enum';
3
+ /**
4
+ * One thing a partner needs to know about a person before it will register
5
+ * them, described the same way a partnership's `configFields` are.
6
+ *
7
+ * Deliberately NOT an enum. The enum below covers the facts every partner asks
8
+ * for, and those are resolved centrally from the platform's own records; this
9
+ * covers the ones only one partner wants - a policy number, a plan tier, a
10
+ * medical-aid number - which the admin renders a form for straight from the
11
+ * descriptor. Without it, a partner needing one unanticipated field costs a
12
+ * shared-library publish, a migration and a version bump in three services.
13
+ */
14
+ export interface PartnerMemberProfileFieldDescriptor {
15
+ /**
16
+ * A {@link PartnerMemberProfileField} value for a well-known fact, or any
17
+ * other key for a partner-specific one. A well-known key is populated from
18
+ * the platform's records; anything else is collected by an operator and
19
+ * stored in `PartnerMemberProfile.attributes`.
20
+ */
21
+ key: string;
22
+ label: string;
23
+ description?: string;
24
+ required: boolean;
25
+ type: 'string' | 'number' | 'boolean' | 'enum' | 'date';
26
+ allowedValues?: string[];
27
+ /** Rejected before it is sent, so a malformed value never becomes a partner 400. */
28
+ pattern?: string;
29
+ maxLength?: number;
30
+ /** Where an operator is likely to find this, shown as help text. */
31
+ sourceHint?: string;
32
+ }
33
+ /**
34
+ * Why a partner cannot yet be told about somebody.
35
+ *
36
+ * MISSING and MALFORMED are not the same problem and do not have the same
37
+ * remedy: one needs the fact collected, the other needs the fact corrected.
38
+ * Reporting both as "missing" leaves an operator staring at a field that is
39
+ * plainly filled in, with nothing to do.
40
+ */
41
+ export interface UnsatisfiedMemberProfileField {
42
+ field: string;
43
+ reason: 'MISSING' | 'MALFORMED';
44
+ /** One line an operator can act on. */
45
+ detail?: string;
46
+ }
47
+ /**
48
+ * What one partner needs before it will register a person as a member, and what
49
+ * it does with them afterwards.
50
+ *
51
+ * Published as part of the provider descriptor for exactly the same reason
52
+ * `configFields` is: the admin UI builds its "what is missing for this member"
53
+ * view from this, and the platform computes readiness from it generically, so a
54
+ * partner's requirements can never drift from the adapter that enforces them.
55
+ */
56
+ export interface PartnerMembershipDescriptor {
57
+ /**
58
+ * Every fact this partner wants, well-known or partner-specific, in the
59
+ * order an operator should be asked for them.
60
+ */
61
+ profileFields: PartnerMemberProfileFieldDescriptor[];
62
+ /**
63
+ * The well-known facts this partner REFUSES a member without.
64
+ *
65
+ * Redundant with the `required` flags above and kept because it is what
66
+ * the platform's central resolution actually reads - it says which of the
67
+ * facts the PLATFORM holds must be present, without the caller having to
68
+ * filter a descriptor list by key membership.
69
+ */
70
+ requiredProfileFields: PartnerMemberProfileField[];
71
+ /** Well-known facts the partner accepts and uses, but does not insist on. */
72
+ optionalProfileFields: PartnerMemberProfileField[];
73
+ /** True when the partner carries dependents on a member's cover. */
74
+ supportsDependents: boolean;
75
+ /** Ceiling the partner imposes on dependents per member. Null means none stated. */
76
+ maxDependents: number | null;
77
+ /**
78
+ * True when the partner accepts a member id on an EMERGENCY.
79
+ *
80
+ * This is what makes provisioning worth doing at all. A partner that has
81
+ * memberships but never reads one on a dispatch gains an emergency nothing,
82
+ * and the platform will not spend an alert-path millisecond looking one up.
83
+ */
84
+ quotesMemberOnDispatch: boolean;
85
+ /**
86
+ * Member states whose id is worth putting on an emergency for THIS partner.
87
+ *
88
+ * Defaults to {@link DEFAULT_QUOTABLE_MEMBER_STATES}. A partner that
89
+ * rejects a request naming a suspended member says so here rather than
90
+ * having every caller learn its rules.
91
+ */
92
+ quotableStates?: PartnerMemberState[];
93
+ /**
94
+ * True when the partner will register a member with no government identity
95
+ * document at all.
96
+ *
97
+ * Governs whether the platform even OFFERS to collect one. An identity
98
+ * document number cannot be rotated and outlives any credential; it is
99
+ * collected only where a partner genuinely refuses to work without it.
100
+ */
101
+ identityDocumentOptional: boolean;
102
+ /**
103
+ * Human-readable note shown beside the membership settings in the admin -
104
+ * e.g. that newly created members serve a waiting period before cover
105
+ * begins. Operators need to know that; it is not inferable from the API.
106
+ */
107
+ notes?: string;
108
+ }