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.
- package/dist/cjs/kafka/billing-topics.js +83 -0
- package/dist/cjs/kafka/billing-topics.js.map +1 -0
- package/dist/cjs/kafka/index.js +1 -0
- package/dist/cjs/kafka/index.js.map +1 -1
- package/dist/cjs/modules/partner/constants/partner-defaults.const.js +4 -0
- package/dist/cjs/modules/partner/constants/partner-defaults.const.js.map +1 -1
- package/dist/cjs/modules/partner/constants/partner-kafka.const.js +18 -1
- package/dist/cjs/modules/partner/constants/partner-kafka.const.js.map +1 -1
- package/dist/cjs/modules/partner/dtos/create-partner-integration.dto.js +34 -0
- package/dist/cjs/modules/partner/dtos/create-partner-integration.dto.js.map +1 -1
- package/dist/cjs/modules/partner/dtos/partner-member-profile-lookup.dto.js +52 -0
- package/dist/cjs/modules/partner/dtos/partner-member-profile-lookup.dto.js.map +1 -0
- package/dist/cjs/modules/partner/dtos/partner-member-profile.dto.js +91 -0
- package/dist/cjs/modules/partner/dtos/partner-member-profile.dto.js.map +1 -0
- package/dist/cjs/modules/partner/dtos/partner-membership-query.dto.js +75 -0
- package/dist/cjs/modules/partner/dtos/partner-membership-query.dto.js.map +1 -0
- package/dist/cjs/modules/partner/dtos/sync-partner-membership.dto.js +149 -0
- package/dist/cjs/modules/partner/dtos/sync-partner-membership.dto.js.map +1 -0
- package/dist/cjs/modules/partner/dtos/update-partner-membership.dto.js +38 -0
- package/dist/cjs/modules/partner/dtos/update-partner-membership.dto.js.map +1 -0
- package/dist/cjs/modules/partner/enums/partner-adapter-operation.enum.js +6 -0
- package/dist/cjs/modules/partner/enums/partner-adapter-operation.enum.js.map +1 -1
- package/dist/cjs/modules/partner/enums/partner-member-document-type.enum.js +17 -0
- package/dist/cjs/modules/partner/enums/partner-member-document-type.enum.js.map +1 -0
- package/dist/cjs/modules/partner/enums/partner-member-gender.enum.js +19 -0
- package/dist/cjs/modules/partner/enums/partner-member-gender.enum.js.map +1 -0
- package/dist/cjs/modules/partner/enums/partner-member-profile-field.enum.js +23 -0
- package/dist/cjs/modules/partner/enums/partner-member-profile-field.enum.js.map +1 -0
- package/dist/cjs/modules/partner/enums/partner-member-state.enum.js +49 -0
- package/dist/cjs/modules/partner/enums/partner-member-state.enum.js.map +1 -0
- package/dist/cjs/modules/partner/enums/partner-membership-package-scope.enum.js +24 -0
- package/dist/cjs/modules/partner/enums/partner-membership-package-scope.enum.js.map +1 -0
- package/dist/cjs/modules/partner/enums/partner-membership-status.enum.js +65 -0
- package/dist/cjs/modules/partner/enums/partner-membership-status.enum.js.map +1 -0
- package/dist/cjs/modules/partner/enums/partner-membership-subject-type.enum.js +18 -0
- package/dist/cjs/modules/partner/enums/partner-membership-subject-type.enum.js.map +1 -0
- package/dist/cjs/modules/partner/index.js +16 -0
- package/dist/cjs/modules/partner/index.js.map +1 -1
- package/dist/cjs/modules/partner/interfaces/partner-member-profile.js +3 -0
- package/dist/cjs/modules/partner/interfaces/partner-member-profile.js.map +1 -0
- package/dist/cjs/modules/partner/interfaces/partner-membership-descriptor.js +3 -0
- package/dist/cjs/modules/partner/interfaces/partner-membership-descriptor.js.map +1 -0
- package/dist/cjs/modules/partner/interfaces/partner-membership.js +3 -0
- package/dist/cjs/modules/partner/interfaces/partner-membership.js.map +1 -0
- package/dist/cjs/modules/partner/utils/partner-membership.util.js +291 -0
- package/dist/cjs/modules/partner/utils/partner-membership.util.js.map +1 -0
- package/dist/cjs/modules/partner/utils/partner-payload.util.js +84 -2
- package/dist/cjs/modules/partner/utils/partner-payload.util.js.map +1 -1
- package/dist/cjs/modules/partner/utils/partner-routing.util.js +17 -0
- package/dist/cjs/modules/partner/utils/partner-routing.util.js.map +1 -1
- package/dist/cjs/modules/permission/data/permissions.data.js +3 -1
- package/dist/cjs/modules/permission/data/permissions.data.js.map +1 -1
- package/dist/cjs/modules/permission/enums/permission-actions.enum.js +7 -0
- package/dist/cjs/modules/permission/enums/permission-actions.enum.js.map +1 -1
- package/dist/cjs/modules/role/data/roles.data.js +8 -0
- package/dist/cjs/modules/role/data/roles.data.js.map +1 -1
- package/dist/esm/kafka/billing-topics.js +80 -0
- package/dist/esm/kafka/billing-topics.js.map +1 -0
- package/dist/esm/kafka/index.js +1 -0
- package/dist/esm/kafka/index.js.map +1 -1
- package/dist/esm/modules/partner/constants/partner-defaults.const.js +4 -0
- package/dist/esm/modules/partner/constants/partner-defaults.const.js.map +1 -1
- package/dist/esm/modules/partner/constants/partner-kafka.const.js +17 -0
- package/dist/esm/modules/partner/constants/partner-kafka.const.js.map +1 -1
- package/dist/esm/modules/partner/dtos/create-partner-integration.dto.js +34 -0
- package/dist/esm/modules/partner/dtos/create-partner-integration.dto.js.map +1 -1
- package/dist/esm/modules/partner/dtos/partner-member-profile-lookup.dto.js +48 -0
- package/dist/esm/modules/partner/dtos/partner-member-profile-lookup.dto.js.map +1 -0
- package/dist/esm/modules/partner/dtos/partner-member-profile.dto.js +87 -0
- package/dist/esm/modules/partner/dtos/partner-member-profile.dto.js.map +1 -0
- package/dist/esm/modules/partner/dtos/partner-membership-query.dto.js +71 -0
- package/dist/esm/modules/partner/dtos/partner-membership-query.dto.js.map +1 -0
- package/dist/esm/modules/partner/dtos/sync-partner-membership.dto.js +144 -0
- package/dist/esm/modules/partner/dtos/sync-partner-membership.dto.js.map +1 -0
- package/dist/esm/modules/partner/dtos/update-partner-membership.dto.js +34 -0
- package/dist/esm/modules/partner/dtos/update-partner-membership.dto.js.map +1 -0
- package/dist/esm/modules/partner/enums/partner-adapter-operation.enum.js +6 -0
- package/dist/esm/modules/partner/enums/partner-adapter-operation.enum.js.map +1 -1
- package/dist/esm/modules/partner/enums/partner-member-document-type.enum.js +14 -0
- package/dist/esm/modules/partner/enums/partner-member-document-type.enum.js.map +1 -0
- package/dist/esm/modules/partner/enums/partner-member-gender.enum.js +16 -0
- package/dist/esm/modules/partner/enums/partner-member-gender.enum.js.map +1 -0
- package/dist/esm/modules/partner/enums/partner-member-profile-field.enum.js +20 -0
- package/dist/esm/modules/partner/enums/partner-member-profile-field.enum.js.map +1 -0
- package/dist/esm/modules/partner/enums/partner-member-state.enum.js +46 -0
- package/dist/esm/modules/partner/enums/partner-member-state.enum.js.map +1 -0
- package/dist/esm/modules/partner/enums/partner-membership-package-scope.enum.js +21 -0
- package/dist/esm/modules/partner/enums/partner-membership-package-scope.enum.js.map +1 -0
- package/dist/esm/modules/partner/enums/partner-membership-status.enum.js +62 -0
- package/dist/esm/modules/partner/enums/partner-membership-status.enum.js.map +1 -0
- package/dist/esm/modules/partner/enums/partner-membership-subject-type.enum.js +15 -0
- package/dist/esm/modules/partner/enums/partner-membership-subject-type.enum.js.map +1 -0
- package/dist/esm/modules/partner/index.js +16 -0
- package/dist/esm/modules/partner/index.js.map +1 -1
- package/dist/esm/modules/partner/interfaces/partner-member-profile.js +2 -0
- package/dist/esm/modules/partner/interfaces/partner-member-profile.js.map +1 -0
- package/dist/esm/modules/partner/interfaces/partner-membership-descriptor.js +2 -0
- package/dist/esm/modules/partner/interfaces/partner-membership-descriptor.js.map +1 -0
- package/dist/esm/modules/partner/interfaces/partner-membership.js +2 -0
- package/dist/esm/modules/partner/interfaces/partner-membership.js.map +1 -0
- package/dist/esm/modules/partner/utils/partner-membership.util.js +277 -0
- package/dist/esm/modules/partner/utils/partner-membership.util.js.map +1 -0
- package/dist/esm/modules/partner/utils/partner-payload.util.js +83 -1
- package/dist/esm/modules/partner/utils/partner-payload.util.js.map +1 -1
- package/dist/esm/modules/partner/utils/partner-routing.util.js +16 -0
- package/dist/esm/modules/partner/utils/partner-routing.util.js.map +1 -1
- package/dist/esm/modules/permission/data/permissions.data.js +3 -1
- package/dist/esm/modules/permission/data/permissions.data.js.map +1 -1
- package/dist/esm/modules/permission/enums/permission-actions.enum.js +7 -0
- package/dist/esm/modules/permission/enums/permission-actions.enum.js.map +1 -1
- package/dist/esm/modules/role/data/roles.data.js +8 -0
- package/dist/esm/modules/role/data/roles.data.js.map +1 -1
- package/dist/types/interfaces/pagination.d.ts +9 -0
- package/dist/types/kafka/billing-topics.d.ts +77 -0
- package/dist/types/kafka/index.d.ts +1 -0
- package/dist/types/modules/partner/constants/partner-defaults.const.d.ts +4 -0
- package/dist/types/modules/partner/constants/partner-kafka.const.d.ts +17 -0
- package/dist/types/modules/partner/dtos/create-partner-integration.dto.d.ts +4 -0
- package/dist/types/modules/partner/dtos/partner-member-profile-lookup.dto.d.ts +45 -0
- package/dist/types/modules/partner/dtos/partner-member-profile.dto.d.ts +28 -0
- package/dist/types/modules/partner/dtos/partner-membership-query.dto.d.ts +19 -0
- package/dist/types/modules/partner/dtos/sync-partner-membership.dto.d.ts +114 -0
- package/dist/types/modules/partner/dtos/update-partner-membership.dto.d.ts +18 -0
- package/dist/types/modules/partner/enums/partner-adapter-operation.enum.d.ts +7 -1
- package/dist/types/modules/partner/enums/partner-member-document-type.enum.d.ts +12 -0
- package/dist/types/modules/partner/enums/partner-member-gender.enum.d.ts +14 -0
- package/dist/types/modules/partner/enums/partner-member-profile-field.enum.d.ts +18 -0
- package/dist/types/modules/partner/enums/partner-member-state.enum.d.ts +39 -0
- package/dist/types/modules/partner/enums/partner-membership-package-scope.enum.d.ts +19 -0
- package/dist/types/modules/partner/enums/partner-membership-status.enum.d.ts +53 -0
- package/dist/types/modules/partner/enums/partner-membership-subject-type.enum.d.ts +13 -0
- package/dist/types/modules/partner/index.d.ts +16 -0
- package/dist/types/modules/partner/interfaces/partner-integration.d.ts +22 -0
- package/dist/types/modules/partner/interfaces/partner-member-profile.d.ts +65 -0
- package/dist/types/modules/partner/interfaces/partner-membership-descriptor.d.ts +108 -0
- package/dist/types/modules/partner/interfaces/partner-membership.d.ts +149 -0
- package/dist/types/modules/partner/interfaces/partner-provider-descriptor.d.ts +16 -0
- package/dist/types/modules/partner/utils/partner-membership.util.d.ts +156 -0
- package/dist/types/modules/partner/utils/partner-payload.util.d.ts +27 -0
- package/dist/types/modules/partner/utils/partner-routing.util.d.ts +9 -0
- package/dist/types/modules/permission/enums/permission-actions.enum.d.ts +2 -0
- 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
|
+
}
|