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,149 @@
|
|
|
1
|
+
import { CountryCode } from '../../country/enums/country-code.enum';
|
|
2
|
+
import { PartnerDispatchFailureReason } from '../enums/partner-dispatch-failure-reason.enum';
|
|
3
|
+
import { PartnerMemberState } from '../enums/partner-member-state.enum';
|
|
4
|
+
import { PartnerMembershipStatus } from '../enums/partner-membership-status.enum';
|
|
5
|
+
import { PartnerMembershipSubjectType } from '../enums/partner-membership-subject-type.enum';
|
|
6
|
+
import { PartnerProviderCode } from '../enums/partner-provider-code.enum';
|
|
7
|
+
import { PartnerMemberProfile } from './partner-member-profile';
|
|
8
|
+
import { UnsatisfiedMemberProfileField } from './partner-membership-descriptor';
|
|
9
|
+
/**
|
|
10
|
+
* One dependent's state at the partner.
|
|
11
|
+
*
|
|
12
|
+
* The important field is `partnerDependentId`: it records what the partner
|
|
13
|
+
* CONFIRMED, not what Clarion intended. Every diff runs against the confirmed
|
|
14
|
+
* set, because adding a dependent to a partner like Rescue.co is a one-way
|
|
15
|
+
* door - a duplicate cannot be withdrawn until the end of the term and
|
|
16
|
+
* permanently consumes one of the membership's seats, which the API only lets
|
|
17
|
+
* you increase. Reconciling against intent rather than confirmation is how a
|
|
18
|
+
* family's cover gets eaten by phantoms.
|
|
19
|
+
*/
|
|
20
|
+
export interface PartnerMembershipDependent {
|
|
21
|
+
/** Clarion's stable handle - a billing beneficiary id. Idempotency key for the sync. */
|
|
22
|
+
dependentReference: string;
|
|
23
|
+
/** The platform user this dependent is, when they have one. */
|
|
24
|
+
userId?: number | null;
|
|
25
|
+
/** The partner's own id, once it has issued one. Absent means NOT yet sent. */
|
|
26
|
+
partnerDependentId?: string | null;
|
|
27
|
+
/** The name as Clarion holds it. */
|
|
28
|
+
name: string;
|
|
29
|
+
/**
|
|
30
|
+
* The name the partner ACCEPTED, which many partners will not let change
|
|
31
|
+
* afterwards. Held separately so a later correction on our side is visible
|
|
32
|
+
* as a divergence rather than silently believed to have applied.
|
|
33
|
+
*/
|
|
34
|
+
partnerName?: string | null;
|
|
35
|
+
/** True once the partner has accepted this dependent. */
|
|
36
|
+
synced: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* True when Clarion has stopped covering them but the partner will only
|
|
39
|
+
* drop them at the end of the term. Recorded rather than acted on, because
|
|
40
|
+
* the divergence is real and somebody has to be able to see it.
|
|
41
|
+
*/
|
|
42
|
+
pendingRemovalAtTermEnd?: boolean;
|
|
43
|
+
/** Sanitized reason the last sync of THIS dependent failed. Never a credential. */
|
|
44
|
+
lastErrorMessage?: string | null;
|
|
45
|
+
syncedAt?: string | null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* One Clarion subject's registration with one partner.
|
|
49
|
+
*
|
|
50
|
+
* The row exists so that when an emergency is raised, "who is this person to
|
|
51
|
+
* Rescue.co?" is a local primary-key lookup rather than a call to a partner in
|
|
52
|
+
* the middle of an alert. It is a CACHE of the partner's truth with a
|
|
53
|
+
* lifecycle, not the truth itself - which is why a stale or failed one degrades
|
|
54
|
+
* to sending the emergency without a member id rather than blocking it.
|
|
55
|
+
*/
|
|
56
|
+
export interface PartnerMembership {
|
|
57
|
+
id: number;
|
|
58
|
+
organizationId: number;
|
|
59
|
+
integrationId: number;
|
|
60
|
+
/** Copied from the partnership so history survives it being reconfigured. */
|
|
61
|
+
providerCode: PartnerProviderCode;
|
|
62
|
+
subjectType: PartnerMembershipSubjectType;
|
|
63
|
+
/**
|
|
64
|
+
* Clarion's stable identity for the subject, e.g. `individual-client:12` or
|
|
65
|
+
* `corporate-member:45`. Unique per partnership - this is what stops two
|
|
66
|
+
* activations creating two memberships for one person.
|
|
67
|
+
*/
|
|
68
|
+
subjectReference: string;
|
|
69
|
+
/** The platform user, when the subject has one. The SOS-time lookup key. */
|
|
70
|
+
userId?: number | null;
|
|
71
|
+
subscriptionId?: number | null;
|
|
72
|
+
packageId?: number | null;
|
|
73
|
+
status: PartnerMembershipStatus;
|
|
74
|
+
/** The partner's member id (a UUID for Rescue.co). Present only when ACTIVE. */
|
|
75
|
+
partnerMemberId?: string | null;
|
|
76
|
+
/** The partner's own status word, passed through verbatim, e.g. `waitingPeriod`. */
|
|
77
|
+
partnerStatus?: string | null;
|
|
78
|
+
/**
|
|
79
|
+
* The partner's standing reduced to something every screen can rely on,
|
|
80
|
+
* without any of them learning a partner's vocabulary. The direct analogue
|
|
81
|
+
* of `engagementState` on a dispatch.
|
|
82
|
+
*/
|
|
83
|
+
memberState?: PartnerMemberState | null;
|
|
84
|
+
/**
|
|
85
|
+
* When the partner's cover actually begins.
|
|
86
|
+
*
|
|
87
|
+
* Rescue.co returns a new member as `waitingPeriod` with a `startDate`
|
|
88
|
+
* some way off. Without this the admin can only say "Active", and an
|
|
89
|
+
* organization will tell a subscriber they are covered on the day they
|
|
90
|
+
* paid - which is the single most damaging thing this feature could get
|
|
91
|
+
* wrong.
|
|
92
|
+
*/
|
|
93
|
+
coverageStartsAt?: string | null;
|
|
94
|
+
/** When the partner's cover ends. A membership past it is no longer quoted. */
|
|
95
|
+
coverageEndsAt?: string | null;
|
|
96
|
+
/** True when the partner has confirmed cover is in force right now. */
|
|
97
|
+
coverActive?: boolean;
|
|
98
|
+
/** Seats the partner CONFIRMED, which many partners will only let increase. */
|
|
99
|
+
partnerSeats?: number | null;
|
|
100
|
+
/** Short label quoted alongside the member id on an emergency, e.g. the package name. */
|
|
101
|
+
membershipLabel?: string | null;
|
|
102
|
+
/** The provider-neutral profile last sent, frozen for audit and drift detection. */
|
|
103
|
+
profile: PartnerMemberProfile;
|
|
104
|
+
/**
|
|
105
|
+
* What stops this profile being sent, and why - MISSING or MALFORMED.
|
|
106
|
+
*
|
|
107
|
+
* Empty unless the status is INCOMPLETE_PROFILE. This is what the admin
|
|
108
|
+
* renders as "collect a date of birth" or "this date of birth is not a
|
|
109
|
+
* date", rather than an operator reading a partner's 400.
|
|
110
|
+
*/
|
|
111
|
+
unsatisfiedFields: UnsatisfiedMemberProfileField[];
|
|
112
|
+
dependents: PartnerMembershipDependent[];
|
|
113
|
+
attemptCount: number;
|
|
114
|
+
maxAttempts: number;
|
|
115
|
+
nextAttemptAt?: string | null;
|
|
116
|
+
failureReason?: PartnerDispatchFailureReason | null;
|
|
117
|
+
lastErrorCode?: string | null;
|
|
118
|
+
/** Sanitized - never contains a credential, token or document number. */
|
|
119
|
+
lastErrorMessage?: string | null;
|
|
120
|
+
countryCode: CountryCode;
|
|
121
|
+
/**
|
|
122
|
+
* The highest upstream sequence applied to this row.
|
|
123
|
+
*
|
|
124
|
+
* The fence that makes an unordered event stream safe. Billing publishes
|
|
125
|
+
* each lifecycle change on its OWN topic, and Kafka guarantees no ordering
|
|
126
|
+
* whatsoever across topics - so an `expired` and an `activated` emitted
|
|
127
|
+
* three seconds apart can be applied in either order. Without this, a
|
|
128
|
+
* cancelled subscription can end up ACTIVE with a live member id, and the
|
|
129
|
+
* reconciliation sweep will not correct it because the row looks healthy.
|
|
130
|
+
*/
|
|
131
|
+
lastAppliedSequence?: number | null;
|
|
132
|
+
provisionedAt?: string | null;
|
|
133
|
+
lastSyncedAt?: string | null;
|
|
134
|
+
createdAt: string;
|
|
135
|
+
updatedAt: string;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* What a dispatch is told about the caller's membership, when they have one.
|
|
139
|
+
*
|
|
140
|
+
* Resolved from the membership row before the payload is built, and OMITTED
|
|
141
|
+
* entirely rather than half-filled: an adapter should never have to reason
|
|
142
|
+
* about a membership that is present but unusable.
|
|
143
|
+
*/
|
|
144
|
+
export interface PartnerDispatchMembership {
|
|
145
|
+
partnerMemberId: string;
|
|
146
|
+
label?: string | null;
|
|
147
|
+
/** The partner's own status at the time it was resolved, for the audit trail. */
|
|
148
|
+
partnerStatus?: string | null;
|
|
149
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { PartnerIntegrationEnvironment } from '../enums/partner-integration-environment.enum';
|
|
2
|
+
import type { PartnerMembershipDescriptor } from './partner-membership-descriptor';
|
|
2
3
|
import { PartnerProviderCode } from '../enums/partner-provider-code.enum';
|
|
3
4
|
import { PartnerServiceCapability } from '../enums/partner-service-capability.enum';
|
|
4
5
|
/** A credential a partnership must supply before it can dispatch. */
|
|
@@ -80,6 +81,21 @@ export interface PartnerProviderDescriptor {
|
|
|
80
81
|
* blind retry on a non-idempotent emergency API means two ambulances.
|
|
81
82
|
*/
|
|
82
83
|
supportsDuplicateDetection: boolean;
|
|
84
|
+
/**
|
|
85
|
+
* True when the partner registers people as MEMBERS ahead of an emergency,
|
|
86
|
+
* and the adapter implements that.
|
|
87
|
+
*
|
|
88
|
+
* Membership is an enrichment, never a precondition: a partner that has it
|
|
89
|
+
* still accepts an emergency for somebody unknown to it. The flag governs
|
|
90
|
+
* whether the platform provisions members in the background at all, not
|
|
91
|
+
* whether it will dispatch.
|
|
92
|
+
*/
|
|
93
|
+
supportsMembership: boolean;
|
|
94
|
+
/**
|
|
95
|
+
* What this partner needs to register a member, and what it does with one.
|
|
96
|
+
* Present exactly when {@link supportsMembership} is true.
|
|
97
|
+
*/
|
|
98
|
+
membership?: PartnerMembershipDescriptor;
|
|
83
99
|
/** False for reserved provider codes that have no working adapter yet. */
|
|
84
100
|
available: boolean;
|
|
85
101
|
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { PartnerMemberProfileField } from '../enums/partner-member-profile-field.enum';
|
|
2
|
+
import { PartnerMembershipStatus } from '../enums/partner-membership-status.enum';
|
|
3
|
+
import { PartnerMembershipSubjectType } from '../enums/partner-membership-subject-type.enum';
|
|
4
|
+
import { PartnerMembershipPackageScope } from '../enums/partner-membership-package-scope.enum';
|
|
5
|
+
import { PartnerMembershipDescriptor, UnsatisfiedMemberProfileField } from '../interfaces/partner-membership-descriptor';
|
|
6
|
+
import { PartnerMemberProfile } from '../interfaces/partner-member-profile';
|
|
7
|
+
/**
|
|
8
|
+
* A profile as it comes out of a database or off the wire: every field may be
|
|
9
|
+
* absent OR explicitly null.
|
|
10
|
+
*
|
|
11
|
+
* {@link PartnerMemberProfile} models a profile that has been ASSEMBLED, where
|
|
12
|
+
* a missing field is simply absent. Readiness is checked against what is
|
|
13
|
+
* actually stored, and a nullable column reads back as null - so checking
|
|
14
|
+
* against the assembled shape would reject the very data this exists to inspect.
|
|
15
|
+
*/
|
|
16
|
+
export type PartnerMemberProfileInput = {
|
|
17
|
+
[K in keyof PartnerMemberProfile]?: PartnerMemberProfile[K] | null;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Clarion's stable handle for a membership subject.
|
|
21
|
+
*
|
|
22
|
+
* Keyed on the PERSON wherever there is one, not on the subscription that paid
|
|
23
|
+
* for them. A partner registers a human being: an employee covered by their
|
|
24
|
+
* company who also buys personal cover is one member with one member id, and
|
|
25
|
+
* keying on the billing relationship would register them twice - two member ids
|
|
26
|
+
* for one person, two seats consumed, double-billed at the partner, and an
|
|
27
|
+
* emergency quoting whichever of the two the database happened to return first.
|
|
28
|
+
*
|
|
29
|
+
* Only a corporate member never linked to a platform login falls back to the
|
|
30
|
+
* relationship key, because for them there is no person key to use.
|
|
31
|
+
*
|
|
32
|
+
* Prefixed by kind so the two spaces can never collide on a bare numeric id.
|
|
33
|
+
* This is what the unique index on (integrationId, subjectReference) relies on
|
|
34
|
+
* to stop one person acquiring two memberships when an activation event is
|
|
35
|
+
* redelivered.
|
|
36
|
+
*/
|
|
37
|
+
export declare function buildMembershipSubjectReference(subject: {
|
|
38
|
+
subjectType: PartnerMembershipSubjectType;
|
|
39
|
+
subjectId: number;
|
|
40
|
+
userId?: number | null;
|
|
41
|
+
}): string;
|
|
42
|
+
/**
|
|
43
|
+
* Which of a partner's REQUIRED profile fields this profile cannot satisfy.
|
|
44
|
+
*
|
|
45
|
+
* Generic over the descriptor rather than per-partner, so a partner that starts
|
|
46
|
+
* insisting on a national id needs a one-line descriptor change and no new
|
|
47
|
+
* validation code. An empty result means the profile is ready to send.
|
|
48
|
+
*/
|
|
49
|
+
export declare function findMissingMemberProfileFields(profile: PartnerMemberProfileInput | null | undefined, descriptor: Pick<PartnerMembershipDescriptor, 'requiredProfileFields'>): PartnerMemberProfileField[];
|
|
50
|
+
/**
|
|
51
|
+
* What stops this profile being sent, and WHY.
|
|
52
|
+
*
|
|
53
|
+
* "Missing" and "malformed" are different problems with different remedies:
|
|
54
|
+
* one needs the fact collected, the other needs it corrected. Reporting a
|
|
55
|
+
* mistyped date of birth as missing leaves an operator staring at a field that
|
|
56
|
+
* is plainly filled in, with nothing to do - and reporting nothing at all
|
|
57
|
+
* leaves the membership in FAILED with an empty list.
|
|
58
|
+
*
|
|
59
|
+
* Also checks any partner-declared `profileFields` marked required, whose
|
|
60
|
+
* values live in `attributes` - so a partner asking for a policy number gets
|
|
61
|
+
* the same treatment as one asking for a date of birth.
|
|
62
|
+
*/
|
|
63
|
+
export declare function findUnsatisfiedMemberProfileFields(profile: PartnerMemberProfileInput | null | undefined, descriptor: Pick<PartnerMembershipDescriptor, 'requiredProfileFields'> & Partial<Pick<PartnerMembershipDescriptor, 'profileFields'>>): UnsatisfiedMemberProfileField[];
|
|
64
|
+
/**
|
|
65
|
+
* Whether a partnership should register the subscribers of one package.
|
|
66
|
+
*
|
|
67
|
+
* The single expression of membership eligibility, used by every trigger so
|
|
68
|
+
* they cannot disagree. Deliberately NOT derived from coverage rules: those
|
|
69
|
+
* answer "where does THIS EMERGENCY go", which is an incident-shaped question
|
|
70
|
+
* that a package cannot be asked - a partnership whose only rule matches on
|
|
71
|
+
* emergency type would evaluate as covering nobody, and one whose package names
|
|
72
|
+
* no incident types at all (which this platform reads as "covers everything")
|
|
73
|
+
* would buy a paid membership for every free subscriber.
|
|
74
|
+
*/
|
|
75
|
+
export declare function membershipRequired(integration: {
|
|
76
|
+
enabled?: boolean;
|
|
77
|
+
membershipEnabled?: boolean;
|
|
78
|
+
membershipPackageScope?: PartnerMembershipPackageScope;
|
|
79
|
+
membershipPackageIds?: number[] | null;
|
|
80
|
+
}, packageId: number | null | undefined): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Whether one profile field carries a usable value.
|
|
83
|
+
*
|
|
84
|
+
* A date of birth is checked for SHAPE as well as presence: an unparseable one
|
|
85
|
+
* is worse than an absent one, because it is sent, refused by the partner, and
|
|
86
|
+
* retried forever against a value that will never become valid.
|
|
87
|
+
*/
|
|
88
|
+
export declare function isMemberProfileFieldPresent(profile: PartnerMemberProfileInput, field: PartnerMemberProfileField): boolean;
|
|
89
|
+
/** A real `YYYY-MM-DD` date, not merely one shaped like it (rejects 2026-02-30). */
|
|
90
|
+
export declare function isCalendarDate(value: string): boolean;
|
|
91
|
+
/**
|
|
92
|
+
* A date of birth reduced to the calendar date partners want.
|
|
93
|
+
*
|
|
94
|
+
* Accepts what the platform actually stores - a `Date`, a timestamp string, a
|
|
95
|
+
* bare date - and returns UTC, never local. Reading a stored instant in the
|
|
96
|
+
* server's zone is how a birthday drifts a day when a pod moves region.
|
|
97
|
+
*/
|
|
98
|
+
export declare function toPartnerCalendarDate(value: Date | string | null | undefined): string | undefined;
|
|
99
|
+
/**
|
|
100
|
+
* Seats to buy for a member and their dependents.
|
|
101
|
+
*
|
|
102
|
+
* Always at least one - the member's own - and never more than the partner
|
|
103
|
+
* allows, so a subscription with more beneficiaries than a partner's ceiling
|
|
104
|
+
* buys the maximum rather than being refused outright.
|
|
105
|
+
*/
|
|
106
|
+
export declare function resolveMemberSeatCount(dependentCount: number, maxDependents: number | null | undefined): number;
|
|
107
|
+
/**
|
|
108
|
+
* A person's name as a partner should record it, from whatever parts exist.
|
|
109
|
+
*
|
|
110
|
+
* Returns undefined rather than an empty or half-formed name: a member called
|
|
111
|
+
* " " is worse than a membership that is honestly reported as incomplete.
|
|
112
|
+
*/
|
|
113
|
+
export declare function buildMemberFullName(parts: {
|
|
114
|
+
name?: string | null;
|
|
115
|
+
firstName?: string | null;
|
|
116
|
+
lastName?: string | null;
|
|
117
|
+
}): string | undefined;
|
|
118
|
+
/**
|
|
119
|
+
* Mask a document number for logs.
|
|
120
|
+
*
|
|
121
|
+
* A national id identifies a person as surely as their name and outlives any
|
|
122
|
+
* credential rotation, so it is treated more carefully than one: the last two
|
|
123
|
+
* characters are enough to match a support query against a record, and the mask
|
|
124
|
+
* is fixed width so the length of the original is not disclosed either.
|
|
125
|
+
*/
|
|
126
|
+
export declare function maskMemberDocumentNumber(value: string | null | undefined): string;
|
|
127
|
+
/**
|
|
128
|
+
* Whether a membership may be quoted on an emergency right now.
|
|
129
|
+
*
|
|
130
|
+
* Deliberately does NOT require the partner's cover to have started. A member
|
|
131
|
+
* inside a waiting period is still that person's real member id, and telling
|
|
132
|
+
* the partner who is calling is accurate and useful whatever their cover state.
|
|
133
|
+
* What is excluded is a membership the partner has finished with: quoting an
|
|
134
|
+
* id past its term risks an outright rejection of the SOS, which costs an
|
|
135
|
+
* ambulance to add a field that was optional anyway.
|
|
136
|
+
*/
|
|
137
|
+
export declare function isUsableMembership(membership: {
|
|
138
|
+
status: PartnerMembershipStatus;
|
|
139
|
+
partnerMemberId?: string | null;
|
|
140
|
+
coverageEndsAt?: string | Date | null;
|
|
141
|
+
}, now?: Date): boolean;
|
|
142
|
+
/**
|
|
143
|
+
* Whether the PARTNER's cover has actually begun.
|
|
144
|
+
*
|
|
145
|
+
* Separate from {@link isUsableMembership} because the two answer different
|
|
146
|
+
* questions and conflating them misleads a human. Rescue.co returns a new
|
|
147
|
+
* member as `waitingPeriod`: they exist, they are quotable, and they are not
|
|
148
|
+
* yet covered. An admin screen that renders a green "Active" chip the day
|
|
149
|
+
* somebody paid will have told them they are covered when they are not.
|
|
150
|
+
*/
|
|
151
|
+
export declare function isMembershipCoverActive(membership: {
|
|
152
|
+
status: PartnerMembershipStatus;
|
|
153
|
+
partnerMemberId?: string | null;
|
|
154
|
+
coverageStartsAt?: string | Date | null;
|
|
155
|
+
coverageEndsAt?: string | Date | null;
|
|
156
|
+
}, now?: Date): boolean;
|
|
@@ -49,6 +49,33 @@ export declare function sanitizePartnerPayload(value: unknown, depth?: number):
|
|
|
49
49
|
* case-insensitively.
|
|
50
50
|
*/
|
|
51
51
|
export declare const SECRET_KEY_FRAGMENTS: string[];
|
|
52
|
+
/**
|
|
53
|
+
* Key substrings that mark a value as a government identity document number.
|
|
54
|
+
*
|
|
55
|
+
* These are NOT credentials - they cannot be rotated, and unlike an API key,
|
|
56
|
+
* losing one harms the PERSON rather than the platform. That asymmetry is why
|
|
57
|
+
* they are masked rather than redacted: an operator investigating "the partner
|
|
58
|
+
* rejected this member" still needs to tell one document from another, and
|
|
59
|
+
* blanking the field entirely would make the audit trail useless while a full
|
|
60
|
+
* value would put a national id in a table many people can read.
|
|
61
|
+
*/
|
|
62
|
+
export declare const IDENTITY_DOCUMENT_KEY_FRAGMENTS: string[];
|
|
63
|
+
/**
|
|
64
|
+
* Key substrings that mark a value as a date of birth.
|
|
65
|
+
*
|
|
66
|
+
* A full date of birth beside a name is close to uniquely identifying, and an
|
|
67
|
+
* audit record is read by far more people than the member screen is. The year
|
|
68
|
+
* survives, because "the partner rejected a member born in 1988" is the kind of
|
|
69
|
+
* thing somebody actually has to debug.
|
|
70
|
+
*/
|
|
71
|
+
export declare const BIRTH_DATE_KEY_FRAGMENTS: string[];
|
|
72
|
+
/**
|
|
73
|
+
* Personal attributes that carry no diagnostic value at all in an audit record.
|
|
74
|
+
*
|
|
75
|
+
* Unlike a date of birth, knowing somebody's gender never helps explain why a
|
|
76
|
+
* partner refused a request, so there is nothing to trade against keeping it.
|
|
77
|
+
*/
|
|
78
|
+
export declare const REDACTED_PERSONAL_KEY_FRAGMENTS: string[];
|
|
52
79
|
/**
|
|
53
80
|
* A URL safe to store on an attempt record: origin and path only, with any
|
|
54
81
|
* query string replaced.
|
|
@@ -69,3 +69,12 @@ export declare function retryDelaySeconds(attemptNumber: number, baseSeconds?: n
|
|
|
69
69
|
* and failed is reported as PARTIALLY_ROUTED rather than rounded to either.
|
|
70
70
|
*/
|
|
71
71
|
export declare function summarizeIncidentRoutingStatus(statuses: PartnerDispatchStatus[]): IncidentPartnerRoutingStatus;
|
|
72
|
+
/**
|
|
73
|
+
* Parses an incident-list `partnerRoutingStatus` query value.
|
|
74
|
+
*
|
|
75
|
+
* Returns `undefined` rather than a default for anything unrecognised: unlike
|
|
76
|
+
* the entitlement and dispatch scopes, "no partner filter" is the correct
|
|
77
|
+
* reading of a junk value here - there is no all-encompassing member to fall
|
|
78
|
+
* back to, and silently picking one would hide incidents.
|
|
79
|
+
*/
|
|
80
|
+
export declare function parseIncidentPartnerRoutingStatus(value?: string | null): IncidentPartnerRoutingStatus | undefined;
|
|
@@ -12,6 +12,8 @@ export declare enum PermissionActions {
|
|
|
12
12
|
UPDATE_PARTNER_DISPATCH = "update:partner-dispatch",
|
|
13
13
|
CANCEL_PARTNER_DISPATCH = "cancel:partner-dispatch",
|
|
14
14
|
RESEND_PARTNER_DISPATCH = "resend:partner-dispatch",
|
|
15
|
+
READ_PARTNER_MEMBERSHIP = "read:partner-membership",
|
|
16
|
+
MANAGE_PARTNER_MEMBERSHIP = "manage:partner-membership",
|
|
15
17
|
CREATE_CONTROL_CENTRE = "create:control-centre",
|
|
16
18
|
READ_CONTROL_CENTRE = "read:control-centre",
|
|
17
19
|
UPDATE_CONTROL_CENTRE = "update:control-centre",
|