@saasicat/core 1.0.0-rc.18 → 1.0.0-rc.19

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/index.d.cts CHANGED
@@ -488,10 +488,9 @@ interface PartyAddress {
488
488
  * What names a legal entity: the name it is registered under and the
489
489
  * identifiers its tax office gave it.
490
490
  *
491
- * For a subscriber these are the party a contract was concluded with. Under a
492
- * running contract they change only as a correction of that same entity,
493
- * recorded with the values it replaced and the reason; contact details change
494
- * freely.
491
+ * These are the party a contract was concluded with. Under a running contract
492
+ * they change only as a correction of that same entity, recorded with the
493
+ * values they replaced and the reason; contact details change freely.
495
494
  */
496
495
  interface LegalIdentity {
497
496
  /** The registered name, legal form included. */
@@ -502,100 +501,13 @@ interface LegalIdentity {
502
501
  taxNumber: string | null;
503
502
  }
504
503
  /** The fields of the legal identity, the ones a correction may change. */
505
- type SubscriberIdentityField = keyof LegalIdentity;
506
- /** How a subscriber is reached, which may change at any time. */
507
- interface SubscriberContact extends PartyAddress {
508
- /** Where invoices will be sent. */
509
- invoiceEmail: string | null;
510
- }
511
- /** A subscriber's master data, as it stands. */
512
- type SubscriberDetails = LegalIdentity & SubscriberContact;
513
- /**
514
- * What a subscriber is created with.
515
- *
516
- * Only the legal name is required. The address, the tax identifiers and the
517
- * invoice email stay optional until sign-up asks for them and invoicing
518
- * requires them; an absent or blank value is recorded as unknown.
519
- */
520
- type NewSubscriberDetails = Pick<SubscriberDetails, 'legalName'> & Partial<Omit<SubscriberDetails, 'legalName'>>;
521
- interface SubscriberRecord extends SubscriberDetails {
522
- id: string;
523
- /**
524
- * Assigned when the subscriber is created and never changed: the number,
525
- * counted per installation, behind the prefix configured at that moment.
526
- */
527
- customerNumber: string;
528
- /** The tenant this subscriber is live for, or `null` once it has none. */
529
- tenantId: string | null;
530
- /**
531
- * Created by the migration that gave every existing tenant its subscriber,
532
- * from the application's own tenant record rather than from what a customer
533
- * entered.
534
- */
535
- migrated: boolean;
536
- createdAt: Date;
537
- updatedAt: Date;
538
- }
539
- /** What a repository writes for a new subscriber, every detail already settled. */
540
- interface CreateSubscriberData extends SubscriberDetails {
541
- /** The tenant the subscriber is created for and live with. */
542
- tenantId: string;
543
- /** Put in front of the assigned number; empty for the number alone. */
544
- customerNumberPrefix: string;
545
- }
546
- /** Contact details to change; a member left out keeps its value. */
547
- type SubscriberContactChange = Partial<SubscriberContact>;
548
- /**
549
- * A change to a subscriber's legal identity, and what the operator declares it
550
- * to be.
551
- *
552
- * SaaSiCat cannot tell a misspelt name from another company taking over, so the
553
- * operator says which: `correction` for the same legal entity — a typo, a wrong
554
- * tax identifier, a change of name that entity went through — and `takeover`
555
- * for another one, which is a transfer rather than an edit and is refused.
556
- */
557
- interface SubscriberIdentityCorrection {
558
- kind: 'correction' | 'takeover';
559
- legalName?: string;
560
- vatId?: string | null;
561
- taxNumber?: string | null;
562
- /** Why the identity is corrected. Part of the record. */
563
- reason: string;
564
- /** Who corrects it, as an actor tag the audit log would write. */
565
- correctedBy: string;
566
- }
567
- /** Identity values by field, holding only the fields a correction changed. */
568
- type SubscriberIdentityValues = Partial<LegalIdentity>;
569
- /** What a correction replaces and what it writes, holding only the fields that move. */
570
- interface SubscriberIdentityDelta {
571
- previous: SubscriberIdentityValues;
572
- corrected: SubscriberIdentityValues;
573
- }
574
- /** What a repository writes for a correction the service has accepted. */
575
- interface SubscriberCorrectionData {
576
- /** The new values; a field equal to what is stored is not recorded. */
577
- corrected: SubscriberIdentityValues;
578
- reason: string;
579
- correctedBy: string;
580
- correctedAt: Date;
581
- }
582
- /** One correction of a subscriber's legal identity, as it was recorded. */
583
- interface SubscriberCorrectionRecord {
584
- id: string;
585
- subscriberId: string;
586
- /** The values the correction replaced. */
587
- previous: SubscriberIdentityValues;
588
- /** The values it wrote. */
589
- corrected: SubscriberIdentityValues;
590
- reason: string;
591
- correctedBy: string;
592
- correctedAt: Date;
593
- }
594
- /** The outcome of writing a correction: nothing is recorded when no value moved. */
595
- interface SubscriberCorrectionResult {
596
- subscriber: SubscriberRecord;
597
- correction: SubscriberCorrectionRecord | null;
598
- }
504
+ type LegalIdentityField = keyof LegalIdentity;
505
+ /** Those fields, in the order they are named and shown. */
506
+ declare const LEGAL_IDENTITY_FIELDS: readonly LegalIdentityField[];
507
+ /** Whether two identities name the same entity: every field, value for value. */
508
+ declare function sameLegalIdentity(before: LegalIdentity, after: LegalIdentity): boolean;
509
+ /** The fields whose value differs between two identities, in field order. */
510
+ declare function movedIdentityFields(before: LegalIdentity, after: LegalIdentity): LegalIdentityField[];
599
511
 
600
512
  /** The payment methods SaaSiCat takes, by the names `config/saas.yaml` uses. */
601
513
  type PaymentMethodType = 'card' | 'sepa_debit';
@@ -873,6 +785,23 @@ interface PlanCatalogIssuer {
873
785
  country?: string;
874
786
  vatId?: string;
875
787
  taxNumber?: string;
788
+ /** Declares a changed identity as a correction of the same legal entity. */
789
+ correctionOf?: PlanCatalogIssuerCorrection;
790
+ }
791
+ /**
792
+ * What a changed issuer identity replaces, and why.
793
+ *
794
+ * The identity is the counterparty a contract names, so it moves under a
795
+ * running contract only as a correction of that same entity. Each field names
796
+ * the value the installation recorded before the change, `null` where it
797
+ * recorded none; a field the change leaves alone need not be named.
798
+ */
799
+ interface PlanCatalogIssuerCorrection {
800
+ legalName?: string | null;
801
+ vatId?: string | null;
802
+ taxNumber?: string | null;
803
+ /** Why the same entity now reads differently. Kept in the settings record. */
804
+ reason: string;
876
805
  }
877
806
  /** How the parties contracts are concluded with are numbered. */
878
807
  interface PlanCatalogSubscribers {
@@ -3263,6 +3192,27 @@ interface SubscriptionContractFilter {
3263
3192
  status?: SubscriptionContractStatus;
3264
3193
  asOf?: Date;
3265
3194
  }
3195
+ /** One contract still running, and the issuer it was concluded under. */
3196
+ interface RunningContractIssuer {
3197
+ id: string;
3198
+ /** The tenant it was concluded for, kept as a trace. */
3199
+ tenantId: string;
3200
+ /**
3201
+ * The legal name on the issuer copy, or `null` where the contract names no
3202
+ * issuer — it was concluded while `config/saas.yaml` named none, or its
3203
+ * party copy was made by the migration that attached contracts concluded
3204
+ * before subscribers existed.
3205
+ */
3206
+ issuerLegalName: string | null;
3207
+ effectiveFrom: Date;
3208
+ }
3209
+ /** How many contracts are concluded and not yet over, and the first few of them. */
3210
+ interface RunningContractIssuers {
3211
+ /** All of them, whether or not the list below holds them all. */
3212
+ total: number;
3213
+ /** At most the limit the caller asked for, oldest first. */
3214
+ contracts: RunningContractIssuer[];
3215
+ }
3266
3216
  interface InvoiceLineItemSnapshot {
3267
3217
  sourceContractLineItemId: string;
3268
3218
  sourceKey: string;
@@ -3297,6 +3247,100 @@ interface SubscriptionContractInvoiceSnapshot {
3297
3247
  lineItems: InvoiceLineItemSnapshot[];
3298
3248
  }
3299
3249
 
3250
+ /** How a subscriber is reached, which may change at any time. */
3251
+ interface SubscriberContact extends PartyAddress {
3252
+ /** Where invoices will be sent. */
3253
+ invoiceEmail: string | null;
3254
+ }
3255
+ /** A subscriber's master data, as it stands. */
3256
+ type SubscriberDetails = LegalIdentity & SubscriberContact;
3257
+ /**
3258
+ * What a subscriber is created with.
3259
+ *
3260
+ * Only the legal name is required. The address, the tax identifiers and the
3261
+ * invoice email stay optional until sign-up asks for them and invoicing
3262
+ * requires them; an absent or blank value is recorded as unknown.
3263
+ */
3264
+ type NewSubscriberDetails = Pick<SubscriberDetails, 'legalName'> & Partial<Omit<SubscriberDetails, 'legalName'>>;
3265
+ interface SubscriberRecord extends SubscriberDetails {
3266
+ id: string;
3267
+ /**
3268
+ * Assigned when the subscriber is created and never changed: the number,
3269
+ * counted per installation, behind the prefix configured at that moment.
3270
+ */
3271
+ customerNumber: string;
3272
+ /** The tenant this subscriber is live for, or `null` once it has none. */
3273
+ tenantId: string | null;
3274
+ /**
3275
+ * Created by the migration that gave every existing tenant its subscriber,
3276
+ * from the application's own tenant record rather than from what a customer
3277
+ * entered.
3278
+ */
3279
+ migrated: boolean;
3280
+ createdAt: Date;
3281
+ updatedAt: Date;
3282
+ }
3283
+ /** What a repository writes for a new subscriber, every detail already settled. */
3284
+ interface CreateSubscriberData extends SubscriberDetails {
3285
+ /** The tenant the subscriber is created for and live with. */
3286
+ tenantId: string;
3287
+ /** Put in front of the assigned number; empty for the number alone. */
3288
+ customerNumberPrefix: string;
3289
+ }
3290
+ /** Contact details to change; a member left out keeps its value. */
3291
+ type SubscriberContactChange = Partial<SubscriberContact>;
3292
+ /**
3293
+ * A change to a subscriber's legal identity, and what the operator declares it
3294
+ * to be.
3295
+ *
3296
+ * SaaSiCat cannot tell a misspelt name from another company taking over, so the
3297
+ * operator says which: `correction` for the same legal entity — a typo, a wrong
3298
+ * tax identifier, a change of name that entity went through — and `takeover`
3299
+ * for another one, which is a transfer rather than an edit and is refused.
3300
+ */
3301
+ interface SubscriberIdentityCorrection {
3302
+ kind: 'correction' | 'takeover';
3303
+ legalName?: string;
3304
+ vatId?: string | null;
3305
+ taxNumber?: string | null;
3306
+ /** Why the identity is corrected. Part of the record. */
3307
+ reason: string;
3308
+ /** Who corrects it, as an actor tag the audit log would write. */
3309
+ correctedBy: string;
3310
+ }
3311
+ /** Identity values by field, holding only the fields a correction changed. */
3312
+ type SubscriberIdentityValues = Partial<LegalIdentity>;
3313
+ /** What a correction replaces and what it writes, holding only the fields that move. */
3314
+ interface SubscriberIdentityDelta {
3315
+ previous: SubscriberIdentityValues;
3316
+ corrected: SubscriberIdentityValues;
3317
+ }
3318
+ /** What a repository writes for a correction the service has accepted. */
3319
+ interface SubscriberCorrectionData {
3320
+ /** The new values; a field equal to what is stored is not recorded. */
3321
+ corrected: SubscriberIdentityValues;
3322
+ reason: string;
3323
+ correctedBy: string;
3324
+ correctedAt: Date;
3325
+ }
3326
+ /** One correction of a subscriber's legal identity, as it was recorded. */
3327
+ interface SubscriberCorrectionRecord {
3328
+ id: string;
3329
+ subscriberId: string;
3330
+ /** The values the correction replaced. */
3331
+ previous: SubscriberIdentityValues;
3332
+ /** The values it wrote. */
3333
+ corrected: SubscriberIdentityValues;
3334
+ reason: string;
3335
+ correctedBy: string;
3336
+ correctedAt: Date;
3337
+ }
3338
+ /** The outcome of writing a correction: nothing is recorded when no value moved. */
3339
+ interface SubscriberCorrectionResult {
3340
+ subscriber: SubscriberRecord;
3341
+ correction: SubscriberCorrectionRecord | null;
3342
+ }
3343
+
3300
3344
  /**
3301
3345
  * Snapshot form of a `Subscription` row for the EntitlementService
3302
3346
  * computation. The consumer maps its Prisma structure onto this form.
@@ -3473,6 +3517,43 @@ interface SubscriptionContractRepository {
3473
3517
  */
3474
3518
  findByOriginalOfferId(offerId: string, tx?: TransactionContext): Promise<SubscriptionContractRecord | null>;
3475
3519
  terminate(contractId: string, data: TerminateSubscriptionContractData): Promise<SubscriptionContractRecord>;
3520
+ /**
3521
+ * The contracts concluded and not yet over, with the issuer each was
3522
+ * concluded under: how many there are, and the first `limit` of them,
3523
+ * oldest first. `limit` caps the list and not the count, so a start refused
3524
+ * over a changed issuer identity says how many contracts it means before it
3525
+ * names any of them.
3526
+ *
3527
+ * Running means `active` or `scheduled` AND not ended at `asOf` — the same
3528
+ * window `findActiveByTenantId` uses on its upper end, and for the same
3529
+ * reason. Status alone is not enough: an ordinary cancellation lands at the
3530
+ * term end and writes only `effectiveUntil`, leaving the status where it
3531
+ * was, and nothing flips it when that day arrives. Counting by status would
3532
+ * therefore report every customer who ever left as still running — and
3533
+ * because the list is oldest first, the ones it names would be exactly the
3534
+ * expired ones.
3535
+ *
3536
+ * The window is open at the bottom on purpose: a contract that starts next
3537
+ * month is concluded, its party copy is fixed, and it will be invoiced under
3538
+ * the issuer it names.
3539
+ *
3540
+ * Platform-wide: unlike every other read here it is anchored by no tenant,
3541
+ * no contract and no offer, and a start makes it before anything is served.
3542
+ * An implementation on a tenant-scoped client must count RLS-exempt, as
3543
+ * `countActiveByPlanKey` must — the platform wraps the call in
3544
+ * `RlsBypassPort`, and one that answers with the caller's tenant scope
3545
+ * instead returns nothing at a boot, where there is no tenant. The
3546
+ * persistence contract runs with no policy forced, so it cannot catch that
3547
+ * for you.
3548
+ *
3549
+ * `limit` may be `0`, and a caller that wants only the count passes it:
3550
+ * `total` is exact whatever the limit, so nothing has to come back for it.
3551
+ * Zero means zero — an implementation that reads a falsy limit as "no limit"
3552
+ * returns every running contract to a caller asking for none, which is the
3553
+ * one shape of this method that gets slower the more an installation sells.
3554
+ * The executable contract asks for `0`.
3555
+ */
3556
+ listRunningIssuers(limit: number, asOf?: Date): Promise<RunningContractIssuers>;
3476
3557
  }
3477
3558
  /**
3478
3559
  * The parties contracts are concluded with, their link to the tenant they are
@@ -4041,11 +4122,18 @@ interface ManifestAccessPort {
4041
4122
  * Adapter for the RLS bypass context. Platform code calls `runWithBypass`,
4042
4123
  * the consumer implementation triggers the Postgres session variable
4043
4124
  * (`set_config('app.bypass_rls', 'true', true)`) or the equivalent in
4044
- * Django/other stacks. The execution context lives for exactly one
4045
- * request pipeline (AsyncLocalStorage / `contextvars` etc.).
4125
+ * Django/other stacks. The execution context lives for the call it wraps
4126
+ * (AsyncLocalStorage / `contextvars` etc.).
4046
4127
  *
4047
4128
  * SuperAdmin operations are platform-wide without tenant scope — without
4048
4129
  * bypass, all RLS-protected reads would come back empty.
4130
+ *
4131
+ * **Not only inside a request.** The platform's boot checks read platform-wide
4132
+ * before anything is served: an implementation that reaches for a
4133
+ * request-scoped connection, or that asserts a request context is open, fails
4134
+ * at start rather than where it is called. Wrap the call the way it is given —
4135
+ * `AsyncLocalStorage.run` is the shape both shipped adapters use, and it is as
4136
+ * good at boot as it is in a request.
4049
4137
  */
4050
4138
  interface RlsBypassPort {
4051
4139
  runWithBypass<T>(fn: () => Promise<T>): Promise<T>;
@@ -4596,7 +4684,18 @@ interface SubscriberPaymentMethodRepository {
4596
4684
  * the history rather than overwriting the row (`SC-PRIC-030`).
4597
4685
  */
4598
4686
  findByReference(gatewayAccount: string, paymentMethodRef: string, tx?: TransactionContext): Promise<SubscriberPaymentMethodRecord | null>;
4599
- /** Every account that holds a payment method in use, each once. */
4687
+ /**
4688
+ * Every account that holds a payment method in use, each once.
4689
+ *
4690
+ * Platform-wide: anchored by no subscriber and no tenant, and a start makes
4691
+ * it before anything is served, to refuse a configuration that no longer
4692
+ * names an account somebody's payment method is held at. An implementation
4693
+ * on a tenant-scoped client must read RLS-exempt — the platform wraps the
4694
+ * call in `RlsBypassPort`, and one that answers with the caller's tenant
4695
+ * scope instead returns an empty list at a boot, where there is no tenant,
4696
+ * so the check that exists to refuse passes. The persistence contract runs
4697
+ * with no policy forced, so it cannot catch that for you.
4698
+ */
4600
4699
  accountsInUse(): Promise<string[]>;
4601
4700
  /**
4602
4701
  * Records a change of payment method a tenant started, open until its
@@ -6304,8 +6403,103 @@ declare function toPlanRow(row: CanonicalPlanRow): PlanRow;
6304
6403
  */
6305
6404
  declare function toPlanVersionRow(row: CanonicalPlanVersionRow, planKey: string, fields: PlanVersionMappingFields): PlanVersionRow;
6306
6405
 
6307
- /** The fields a correction of the legal identity may change, in the order they are shown. */
6308
- declare const SUBSCRIBER_IDENTITY_FIELDS: readonly SubscriberIdentityField[];
6406
+ /**
6407
+ * The legal identity of the issuer a catalogue names, or none where it names no
6408
+ * issuer.
6409
+ *
6410
+ * Settled through the same reader as the recorded side, and that symmetry is
6411
+ * the point rather than tidiness: the record is a verbatim copy of the file, so
6412
+ * a value whose two sides were settled differently would differ from itself. A
6413
+ * legal name written with a trailing space would then refuse the SECOND start on
6414
+ * a file nobody touched, and no declaration could make it stop happening.
6415
+ */
6416
+ declare function issuerIdentityOf(issuer: PlanCatalogIssuer | undefined): LegalIdentity | null;
6417
+ /**
6418
+ * The issuer identity a recorded settings tree holds.
6419
+ *
6420
+ * Read defensively rather than cast: the record is JSON as some earlier version
6421
+ * of this platform wrote it, and a tree without an issuer, or with one whose
6422
+ * legal name is not a name, is read as "no identity was recorded" — which is
6423
+ * the first naming, not a change. The schema keeps a name of only whitespace out
6424
+ * of the file; this keeps one out of a record written before it did.
6425
+ */
6426
+ declare function recordedIssuerIdentity(settings: AppliedSettingsValues | null | undefined): LegalIdentity | null;
6427
+ /** Why `issuer.correctionOf` does not cover the change it is there to declare. */
6428
+ type IssuerCorrectionFault =
6429
+ /** There is no declaration at all. */
6430
+ {
6431
+ kind: 'absent';
6432
+ }
6433
+ /**
6434
+ * The file names no issuer for a declaration to be about — the block is
6435
+ * gone, or it is there with a name that reads as nothing. Never a
6436
+ * correction, whatever is declared: there is no entity on this side for the
6437
+ * recorded one to be the same as.
6438
+ */
6439
+ | {
6440
+ kind: 'names-no-issuer';
6441
+ }
6442
+ /**
6443
+ * It names a value the record does not hold. Either the declaration is
6444
+ * stale — it belongs to a correction already applied — or it is about
6445
+ * another entity than the one this installation recorded.
6446
+ */
6447
+ | {
6448
+ kind: 'names-another-value';
6449
+ field: LegalIdentityField;
6450
+ declared: string | null;
6451
+ recorded: string | null;
6452
+ }
6453
+ /** It says nothing about a field the change moves, so that field is undeclared. */
6454
+ | {
6455
+ kind: 'leaves-a-field-out';
6456
+ field: LegalIdentityField;
6457
+ recorded: string | null;
6458
+ };
6459
+ /** What a start finds when it compares the file's issuer with the recorded one. */
6460
+ type IssuerIdentityChange =
6461
+ /** Neither the record nor the file names an issuer. */
6462
+ {
6463
+ kind: 'none-named';
6464
+ }
6465
+ /** The same entity, whatever the address and the contact details did. */
6466
+ | {
6467
+ kind: 'unchanged';
6468
+ identity: LegalIdentity;
6469
+ }
6470
+ /**
6471
+ * The first issuer this installation names. No contract can have been
6472
+ * concluded under another one, so nothing is declared for it.
6473
+ */
6474
+ | {
6475
+ kind: 'first-naming';
6476
+ identity: LegalIdentity;
6477
+ }
6478
+ /** The same entity, corrected as the file declares. `current` is never absent. */
6479
+ | {
6480
+ kind: 'corrected';
6481
+ recorded: LegalIdentity;
6482
+ current: LegalIdentity;
6483
+ moved: readonly LegalIdentityField[];
6484
+ reason: string;
6485
+ }
6486
+ /** Another identity, with no declaration that covers it. Refused. */
6487
+ | {
6488
+ kind: 'undeclared';
6489
+ recorded: LegalIdentity;
6490
+ /** `null` where the file names no issuer that has a name — see `names-no-issuer`. */
6491
+ current: LegalIdentity | null;
6492
+ moved: readonly LegalIdentityField[];
6493
+ fault: IssuerCorrectionFault;
6494
+ };
6495
+ /**
6496
+ * What the issuer in the file is, against the identity the record holds.
6497
+ *
6498
+ * `recorded` is `null` on the very first start, and on an installation that
6499
+ * has never named an issuer.
6500
+ */
6501
+ declare function classifyIssuerChange(recorded: LegalIdentity | null, issuer: PlanCatalogIssuer | undefined): IssuerIdentityChange;
6502
+
6309
6503
  /** A `subscribers` row as either adapter reads it back. */
6310
6504
  interface CanonicalSubscriberRow {
6311
6505
  id: string;
@@ -6348,7 +6542,7 @@ declare function toSubscriberCorrectionRecord(row: CanonicalSubscriberCorrection
6348
6542
  * stored value differs, with the value it replaces. Both adapters decide this
6349
6543
  * the same way, under the lock they read `current` with.
6350
6544
  */
6351
- declare function identityCorrectionDelta(current: Pick<SubscriberRecord, SubscriberIdentityField>, corrected: SubscriberIdentityValues): SubscriberIdentityDelta;
6545
+ declare function identityCorrectionDelta(current: Pick<SubscriberRecord, LegalIdentityField>, corrected: SubscriberIdentityValues): SubscriberIdentityDelta;
6352
6546
  /**
6353
6547
  * Who a new contract is between: the subscriber as it stands, and the issuer as
6354
6548
  * the running configuration names it — or no issuer, where it names none.
@@ -6443,6 +6637,20 @@ interface CanonicalContractLineItemRow {
6443
6637
  }
6444
6638
  declare function toSubscriptionContractRecord(row: CanonicalContractRow, lineItems: CanonicalContractLineItemRow[]): SubscriptionContractRecord;
6445
6639
  declare function toContractLineItemRecord(row: CanonicalContractLineItemRow): ContractLineItemRecord;
6640
+ /**
6641
+ * The columns the issuer check reads off a running contract. A narrow row of
6642
+ * its own, because that query selects four columns rather than the whole
6643
+ * contract with its lines: it runs at every start, and an installation with
6644
+ * thousands of running contracts should not load them to count them.
6645
+ */
6646
+ interface CanonicalRunningContractRow {
6647
+ id: string;
6648
+ tenantId: string;
6649
+ issuerSnapshot: unknown;
6650
+ effectiveFrom: Date;
6651
+ }
6652
+ /** One running contract, and the legal name on its issuer copy where it has one. */
6653
+ declare function toRunningContractIssuer(row: CanonicalRunningContractRow): RunningContractIssuer;
6446
6654
 
6447
6655
  /** Why a version is editable (for UI badges + audit logs). */
6448
6656
  type VersionEditableReason = 'draft' | 'pre-active';
@@ -6525,4 +6733,4 @@ declare function resolveErrorMessage(body: ResolvableErrorBody, overrides?: Part
6525
6733
 
6526
6734
  declare const ERROR_MESSAGES_DE: Record<PlatformErrorCode, string>;
6527
6735
 
6528
- export { ACTIVE_SUBSCRIPTION_CONTRACT_STATUSES, AUTH_ERROR_CODES, type ActionKey, type ActivationOrchestrator, type ActivePlanVersionWhere, type ActivePlanVersionWhereWithEndsAt, type ActiveVersionWhere, type ActiveVersionWhereWithEndsAt, type ActorTag, type AdminActor, type AdminAuditListFilter, type AdminManifest, type AdminResourcesPort, type AdminSubscriptionListRow, type AdminTenantDetail, type AdminTenantListFilter, type AdminTenantListRow, type AdminTenantStateResult, type AdminUserListFilter, type AdminUserListRow, type AppliedSettingsPort, type AppliedSettingsRecord, type AppliedSettingsValues, type ApplyOnboardingSelectionInput, type ApplyOnboardingSelectionResult, type ApprovedCatalogKeys, type AuditActionDef, type AuditEntry, type AuditPort, type AuditQuery, type AuditQueryPort, type AuditStatsPort, type AuditStatsSnapshot, type AuthErrorCode, BILLING_ERROR_CODES, BUNDLE_PRICE_LOOKUP_LIMIT, type BillingCycle, type BillingErrorCode, type BundleAvailabilityState, type BundleCompatibility, type BundleFeatureShape, type BundleListFilter, type BundlePricingOverride, type BundleRepository, type BundleRow, type BundleVersionFields, type BundleVersionMutationResult, type BundleVersionRow, CATALOGUE_KEYS, CATALOG_ERROR_CODES, CONTRACT_ERROR_CODES, type CancelSubscriptionBundleData, type CancelSubscriptionInput, type CancelSubscriptionResult, type CancellationNoticePeriods, type CanonicalContractLineItemRow, type CanonicalContractRow, type CanonicalPlanRow, type CanonicalPlanVersionRow, type CanonicalSubscriberCorrectionRow, type CanonicalSubscriberPaymentMethodRow, type CanonicalSubscriberRow, type CapabilityCatalogEntryRow, type CapabilityCodeStatus, type CapabilityKey, type CapabilityKind, type CatalogEntryFilter, type CatalogEntryI18n, type CatalogEntryI18nFields, type CatalogEntryRepository, type CatalogErrorCode, type ChangeDirection, type CheckoutOfferFilter, type CheckoutOfferLineItem, type CheckoutOfferLineItemKind, type CheckoutOfferPriceBreakdown, type CheckoutOfferPromoCodeSnapshot, type CheckoutOfferPromotionSnapshot, type CheckoutOfferRepository, type CheckoutOfferRow, type CheckoutOfferSelection, type CheckoutOfferSelectionUpdate, type CheckoutOfferStatus, type CleanupResult, type CliUserRow, type ComponentKey, type ConfiguratorCatalog, type ConfiguratorMarketingProvider, type ConfiguratorModel, type ConfiguratorPlanMarketing, type ConfiguratorPlanVersionRow, type ConfiguratorPriceBreakdown, type ConfiguratorSourcesLookup, type ConfirmedPaymentMethod, type ContractErrorCode, type ContractIssuerParty, type ContractLineItemKind, type ContractLineItemRecord, type ContractSubscriberParty, type CreateBundleData, type CreateBundleVersionDraftData, type CreateCheckoutOfferData, type CreateMarketingProjectionData, type CreatePlanData, type CreatePlanVersionDraftData, type CreatePromoCodeData, type CreatePromoCodeRequest, type CreatePromotionData, type CreateSubscriberData, type CreateSubscriptionBundleData, type CreateSubscriptionContractData, type CreateSuperAdminCliInput, type CreateTenantInput, type DiffResult, type DiscoveredCapability, type DiscoveredFeature, type DiscoveredQuota, type DiscoveredQuotaPolicy, type DiscoveryCodeStatus, type DiscoverySnapshot, type DiscoveryStatus, ERROR_MESSAGES_DE, ERROR_MESSAGES_EN, type EffectiveLimitsSnapshot, type EmailPort, type ErrorMessageParams, FEATURE_NOT_LICENSED, type FeatureCatalogEntryRow, type FeatureDef, type FeatureKey, type FeatureNotLicensedBody, type FeatureRequiresIndex, type FeatureTier, type FeatureUiMeta, type FeatureUiRegistry, type FinalActivationResult, type FirstTimeCustomerCheck, type ImmediatePlanChangeInput, type InvoiceLineItemSnapshot, type KpiCardDef, type KpiDisplayHint, type LegalIdentity, MARKETING_PRIORITY_MAX, MARKETING_PRIORITY_MIN, type ManifestAccessPort, type ManifestContribution, type MarketingProjectionFilter, type MarketingProjectionRepository, type MarketingProjectionRow, type MarketingSettingsRepository, type MarketingSettingsRow, type MarketingTargetType, type MarketingTopFeature, type MaskedPaymentMethod, type MfaPort, type NewContractLineItemData, type NewSettingsChange, type NewSubscriberDetails, type NewSubscriptionContractData, OTP_RATE_LIMIT_MAX_SENDS, OTP_RATE_LIMIT_WINDOW_MINUTES, OTP_TTL_MINUTES, OTP_VERIFY_MAX_ATTEMPTS, type OnboardingPromoRedemption, type OnboardingSelectionRequest, type OnboardingSelectionResponse, PASSWORD_RESET_TTL_MINUTES, PAYMENT_ERROR_CODES, PAYMENT_METHOD_TYPES, PENDING_CHECKOUT_TTL_DAYS, PENDING_EMAIL_TTL_HOURS, PENDING_ONBOARDING_TTL_DAYS, PLATFORM_ERROR_CODES, PROMO_ERROR_CODES, type Paginated, type PartyAddress, type PasswordHasher, type PasswordResetCliResult, PaymentCallbackRejectedError, type PaymentErrorCode, type PaymentEventClaim, type PaymentEventLog, type PaymentGateway, type PaymentGatewayCallback, type PaymentGatewayEvent, type PaymentMethodHolder, type PaymentMethodSetupSession, type PaymentMethodSetupSubject, type PaymentMethodType, type PendingRegistration, type PendingRegistrationCreateInput, type PendingRegistrationRepository, type PendingRegistrationSnapshot, type PendingRegistrationUpdateInput, type PersistenceCapabilities, PersistenceCapabilityError, type PersistenceClassRef, type PersistenceInjectionToken, type PersistenceProvider, type PlanCatalog, type PlanCatalogApp, type PlanCatalogImportReport, type PlanCatalogImportSink, type PlanCatalogIssuer, type PlanCatalogLookup, type PlanCatalogMarketing, type PlanCatalogNotifications, type PlanCatalogPaymentAccount, type PlanCatalogPayments, type PlanCatalogReadSink, type PlanCatalogReadSnapshot, type PlanCatalogSettings, type PlanCatalogSubscribers, type PlanCatalogTenantBilling, type PlanDef, type PlanId, type PlanListFilter, type PlanRepository, type PlanRow, type PlanVersion, type PlanVersionFields, type PlanVersionMappingFields, type PlanVersionMutationResult, type PlanVersionRecord, type PlanVersionRepository, type PlanVersionRow, type PlatformErrorBody, type PlatformErrorCode, type PlatformRole, type PlatformUserDto, PlatformUserExistsError, type ProjectPageDef, type PromoCode, type PromoCodeDurationType, type PromoCodeFilter, type PromoCodeRecord, type PromoCodeRedemption, type PromoCodeRedemptionListItem, type PromoCodeRedemptionRecord, type PromoCodeRedemptionRepository, type PromoCodeRedemptionStatus, type PromoCodeRepository, type PromoCodeStatsPort, type PromoCodeStatsSnapshot, type PromoCodeStatus, type PromoCodeValidationLog, type PromoCodeValidationLogRepository, type PromoCodeValidationResult, type PromoCodeValueType, type PromoErrorCode, type PromoPreviewInvalidReason, type PromoPreviewRequest, type PromoPreviewResponse, type PromoPreviewValidResponse, type PromoRevenueDeductionAggregator, type PromoSubscriptionLookup, type PromotionBillingCycle, type PromotionI18n, type PromotionI18nFields, type PromotionRepository, type PromotionResult, type PromotionRow, type PromotionStatus, type PromotionTargetType, type PromotionType, type PromotionValue, type PublicBootResponse, type PublicComparisonRow, type PublicMarketingBundle, type PublicMarketingCatalogResponse, type PublicMarketingPlan, type PublicMarketingPromo, type PublicSignupPlan, type PublishBundleVersionData, type PublishBundleVersionMeta, type PublishPlanVersionData, type QuotaCatalogEntryRow, type QuotaEnforcementMode, type QuotaKey, type QuotaProvider, REGISTRATION_ERROR_CODES, REGISTRATION_RESUME_TTL_MINUTES, REGISTRATION_STEP_BY_STATUS, type ReassignTenantAdminCliResult, type RecommendablePlan, type RecordSubscriberPaymentMethodData, type RecordSubscriberPaymentMethodOutcome, type RecordSubscriberPaymentMethodResult, type RedeemPromoInTransactionCallback, type RegistrationActivation, type RegistrationAuditContext, type RegistrationAuditEvent, type RegistrationAuditEventType, type RegistrationAuditLogger, type RegistrationBillingDetails, type RegistrationConfigSelection, type RegistrationConfiguratorLookup, type RegistrationErrorCode, type RegistrationOtpDelivery, type RegistrationPromoPreview, type RegistrationResumeDelivery, type RegistrationResumeTokenSigner, type RegistrationStatus, type RegistrationStep, type RequiredCapabilities, type ResolvableErrorBody, type ResumeRegistrationInput, type ResumeRegistrationResult, type ReviewCatalogEntryData, type RlsBypassPort, SETTINGS_ERROR_CODES, SETUP_ERROR_CODES, SUBSCRIBER_ERROR_CODES, SUBSCRIBER_IDENTITY_FIELDS, type SaaSiCatPersistenceAdapter, type SaaSiCatPersistenceAdminResources, type SaaSiCatPersistenceCatalog, type SaaSiCatPersistenceCore, type SaaSiCatPersistenceEntitlement, type SaaSiCatPersistencePayments, type SaaSiCatPersistencePromo, type SaaSiCatPersistenceTenantBilling, type SaveRegistrationConfigInput, type SaveRegistrationConfigResult, type ScheduledPlanChangeInput, type SelectPlanInput, type SelectPlanResult, type SelectableBundleShape, type SelfServiceBlockedPlans, type SetCatalogEntryReviewData, type SettingsChangeFilter, type SettingsChangeRecord, type SettingsDifference, type SettingsErrorCode, type SetupConfirmMfaRequest, type SetupConfirmMfaResponse, type SetupErrorCode, type SetupRequest, type SetupResult, type SetupStatusResponse, type SlugAvailabilityCheck, type StandardPageDef, type StandardPageKey, type StartCheckoutInput, type StartCheckoutResult, type StartPaymentMethodSetupInput, type StartRegistrationInput, type StartRegistrationResult, type StoredBundleStem, type StrictModeWarning, type StrictModeWarningCode, type SubscriberContact, type SubscriberContactChange, type SubscriberCorrectionData, type SubscriberCorrectionRecord, type SubscriberCorrectionResult, type SubscriberDetails, type SubscriberErrorCode, type SubscriberIdentityCorrection, type SubscriberIdentityDelta, type SubscriberIdentityField, type SubscriberIdentityValues, type SubscriberPaymentMethodRecord, type SubscriberPaymentMethodRepository, type SubscriberPaymentMethodSetupData, type SubscriberPaymentMethodSetupMatch, type SubscriberPaymentMethodStatus, type SubscriberRecord, type SubscriberRepository, type Subscription, type SubscriptionBundleRecord, type SubscriptionBundleRepository, type SubscriptionBundleView, type SubscriptionContractFilter, type SubscriptionContractInvoiceSnapshot, type SubscriptionContractParties, type SubscriptionContractPriceSnapshot, type SubscriptionContractRecord, type SubscriptionContractRepository, type SubscriptionContractStatus, type SubscriptionRecord, type SubscriptionRepository, type SubscriptionStatsPort, type SubscriptionStatsSnapshot, type SubscriptionStatus, type SubscriptionUsagePort, type SubscriptionUsageRecord, type SuperAdminProvisioningPort, type SyncDiscoveryResult, type TenantActionDef, type TenantColumnDef, type TenantDto, type TenantListFilter, type TenantPort, type TenantSubscriptionWritePort, type TerminateSubscriptionContractData, type TopPromoCode, type TransactionContext, type TransactionRunner, type UpdateBundleData, type UpdateBundleVersionDraftData, type UpdateCatalogEntryBaseData, type UpdateCatalogEntryI18nData, type UpdateCheckoutOfferData, type UpdateMarketingProjectionData, type UpdateMarketingSettingsData, type UpdatePlanData, type UpdatePlanVersionDraftData, type UpdatePromoCodeData, type UpdatePromoCodeRequest, type UpdatePromotionData, type UpsellOffer, type UpsellOfferResolver, type UpsertCapabilityEntryData, type UpsertFeatureCatalogEntryInput, type UpsertFeatureEntryData, type UpsertPlanInput, type UpsertPlanVersionInput, type UpsertQuotaEntryData, type UpsertResult, type UsageSnapshotPort, type UserAccountLookup, type UserListFilter, type UserManagementPort, type UserPort, type VerifyRegistrationOtpResult, type VersionChange, type VersionChangeDirection, type VersionEditability, type VersionEditableReason, type VersionedEntityBase, applyPromo, assertPersistenceCapabilities, buildActivePlanVersionWhere, buildActiveVersionWhere, buildFeatureRequiresIndex, bundleDraftDefaults, bundleStemDefaults, canonicalJson, classifyBundleVersionDiff, classifyPlanDiff, collectUnsatisfiedRequires, contractPartiesOf, coverageExcludingSelf, definedFields, diffSettings, formatCustomerNumber, formatErrorMessage, identityCorrectionDelta, isBundleRedundant, isPaymentCallbackRejectedError, isPlatformUserExistsError, isVersionEditable, keepOneRecommended, missingRequiresFor, pickActivePromo, planCatalogSettingsOf, previousUtcDay, promoStatus, readQuotaRecord, readQuotaValue, resolveBundleAvailability, resolveErrorMessage, selectChargeableBundles, settingsSubtreeOf, startOfUtcDay, subscriberFromRegistration, subscriberPaymentMethodColumns, toBundleStemRow, toContractLineItemRecord, toPlanRow, toPlanVersionRow, toSubscriberCorrectionRecord, toSubscriberPaymentMethodRecord, toSubscriberRecord, toSubscriptionContractRecord };
6736
+ export { ACTIVE_SUBSCRIPTION_CONTRACT_STATUSES, AUTH_ERROR_CODES, type ActionKey, type ActivationOrchestrator, type ActivePlanVersionWhere, type ActivePlanVersionWhereWithEndsAt, type ActiveVersionWhere, type ActiveVersionWhereWithEndsAt, type ActorTag, type AdminActor, type AdminAuditListFilter, type AdminManifest, type AdminResourcesPort, type AdminSubscriptionListRow, type AdminTenantDetail, type AdminTenantListFilter, type AdminTenantListRow, type AdminTenantStateResult, type AdminUserListFilter, type AdminUserListRow, type AppliedSettingsPort, type AppliedSettingsRecord, type AppliedSettingsValues, type ApplyOnboardingSelectionInput, type ApplyOnboardingSelectionResult, type ApprovedCatalogKeys, type AuditActionDef, type AuditEntry, type AuditPort, type AuditQuery, type AuditQueryPort, type AuditStatsPort, type AuditStatsSnapshot, type AuthErrorCode, BILLING_ERROR_CODES, BUNDLE_PRICE_LOOKUP_LIMIT, type BillingCycle, type BillingErrorCode, type BundleAvailabilityState, type BundleCompatibility, type BundleFeatureShape, type BundleListFilter, type BundlePricingOverride, type BundleRepository, type BundleRow, type BundleVersionFields, type BundleVersionMutationResult, type BundleVersionRow, CATALOGUE_KEYS, CATALOG_ERROR_CODES, CONTRACT_ERROR_CODES, type CancelSubscriptionBundleData, type CancelSubscriptionInput, type CancelSubscriptionResult, type CancellationNoticePeriods, type CanonicalContractLineItemRow, type CanonicalContractRow, type CanonicalPlanRow, type CanonicalPlanVersionRow, type CanonicalRunningContractRow, type CanonicalSubscriberCorrectionRow, type CanonicalSubscriberPaymentMethodRow, type CanonicalSubscriberRow, type CapabilityCatalogEntryRow, type CapabilityCodeStatus, type CapabilityKey, type CapabilityKind, type CatalogEntryFilter, type CatalogEntryI18n, type CatalogEntryI18nFields, type CatalogEntryRepository, type CatalogErrorCode, type ChangeDirection, type CheckoutOfferFilter, type CheckoutOfferLineItem, type CheckoutOfferLineItemKind, type CheckoutOfferPriceBreakdown, type CheckoutOfferPromoCodeSnapshot, type CheckoutOfferPromotionSnapshot, type CheckoutOfferRepository, type CheckoutOfferRow, type CheckoutOfferSelection, type CheckoutOfferSelectionUpdate, type CheckoutOfferStatus, type CleanupResult, type CliUserRow, type ComponentKey, type ConfiguratorCatalog, type ConfiguratorMarketingProvider, type ConfiguratorModel, type ConfiguratorPlanMarketing, type ConfiguratorPlanVersionRow, type ConfiguratorPriceBreakdown, type ConfiguratorSourcesLookup, type ConfirmedPaymentMethod, type ContractErrorCode, type ContractIssuerParty, type ContractLineItemKind, type ContractLineItemRecord, type ContractSubscriberParty, type CreateBundleData, type CreateBundleVersionDraftData, type CreateCheckoutOfferData, type CreateMarketingProjectionData, type CreatePlanData, type CreatePlanVersionDraftData, type CreatePromoCodeData, type CreatePromoCodeRequest, type CreatePromotionData, type CreateSubscriberData, type CreateSubscriptionBundleData, type CreateSubscriptionContractData, type CreateSuperAdminCliInput, type CreateTenantInput, type DiffResult, type DiscoveredCapability, type DiscoveredFeature, type DiscoveredQuota, type DiscoveredQuotaPolicy, type DiscoveryCodeStatus, type DiscoverySnapshot, type DiscoveryStatus, ERROR_MESSAGES_DE, ERROR_MESSAGES_EN, type EffectiveLimitsSnapshot, type EmailPort, type ErrorMessageParams, FEATURE_NOT_LICENSED, type FeatureCatalogEntryRow, type FeatureDef, type FeatureKey, type FeatureNotLicensedBody, type FeatureRequiresIndex, type FeatureTier, type FeatureUiMeta, type FeatureUiRegistry, type FinalActivationResult, type FirstTimeCustomerCheck, type ImmediatePlanChangeInput, type InvoiceLineItemSnapshot, type IssuerCorrectionFault, type IssuerIdentityChange, type KpiCardDef, type KpiDisplayHint, LEGAL_IDENTITY_FIELDS, type LegalIdentity, type LegalIdentityField, MARKETING_PRIORITY_MAX, MARKETING_PRIORITY_MIN, type ManifestAccessPort, type ManifestContribution, type MarketingProjectionFilter, type MarketingProjectionRepository, type MarketingProjectionRow, type MarketingSettingsRepository, type MarketingSettingsRow, type MarketingTargetType, type MarketingTopFeature, type MaskedPaymentMethod, type MfaPort, type NewContractLineItemData, type NewSettingsChange, type NewSubscriberDetails, type NewSubscriptionContractData, OTP_RATE_LIMIT_MAX_SENDS, OTP_RATE_LIMIT_WINDOW_MINUTES, OTP_TTL_MINUTES, OTP_VERIFY_MAX_ATTEMPTS, type OnboardingPromoRedemption, type OnboardingSelectionRequest, type OnboardingSelectionResponse, PASSWORD_RESET_TTL_MINUTES, PAYMENT_ERROR_CODES, PAYMENT_METHOD_TYPES, PENDING_CHECKOUT_TTL_DAYS, PENDING_EMAIL_TTL_HOURS, PENDING_ONBOARDING_TTL_DAYS, PLATFORM_ERROR_CODES, PROMO_ERROR_CODES, type Paginated, type PartyAddress, type PasswordHasher, type PasswordResetCliResult, PaymentCallbackRejectedError, type PaymentErrorCode, type PaymentEventClaim, type PaymentEventLog, type PaymentGateway, type PaymentGatewayCallback, type PaymentGatewayEvent, type PaymentMethodHolder, type PaymentMethodSetupSession, type PaymentMethodSetupSubject, type PaymentMethodType, type PendingRegistration, type PendingRegistrationCreateInput, type PendingRegistrationRepository, type PendingRegistrationSnapshot, type PendingRegistrationUpdateInput, type PersistenceCapabilities, PersistenceCapabilityError, type PersistenceClassRef, type PersistenceInjectionToken, type PersistenceProvider, type PlanCatalog, type PlanCatalogApp, type PlanCatalogImportReport, type PlanCatalogImportSink, type PlanCatalogIssuer, type PlanCatalogIssuerCorrection, type PlanCatalogLookup, type PlanCatalogMarketing, type PlanCatalogNotifications, type PlanCatalogPaymentAccount, type PlanCatalogPayments, type PlanCatalogReadSink, type PlanCatalogReadSnapshot, type PlanCatalogSettings, type PlanCatalogSubscribers, type PlanCatalogTenantBilling, type PlanDef, type PlanId, type PlanListFilter, type PlanRepository, type PlanRow, type PlanVersion, type PlanVersionFields, type PlanVersionMappingFields, type PlanVersionMutationResult, type PlanVersionRecord, type PlanVersionRepository, type PlanVersionRow, type PlatformErrorBody, type PlatformErrorCode, type PlatformRole, type PlatformUserDto, PlatformUserExistsError, type ProjectPageDef, type PromoCode, type PromoCodeDurationType, type PromoCodeFilter, type PromoCodeRecord, type PromoCodeRedemption, type PromoCodeRedemptionListItem, type PromoCodeRedemptionRecord, type PromoCodeRedemptionRepository, type PromoCodeRedemptionStatus, type PromoCodeRepository, type PromoCodeStatsPort, type PromoCodeStatsSnapshot, type PromoCodeStatus, type PromoCodeValidationLog, type PromoCodeValidationLogRepository, type PromoCodeValidationResult, type PromoCodeValueType, type PromoErrorCode, type PromoPreviewInvalidReason, type PromoPreviewRequest, type PromoPreviewResponse, type PromoPreviewValidResponse, type PromoRevenueDeductionAggregator, type PromoSubscriptionLookup, type PromotionBillingCycle, type PromotionI18n, type PromotionI18nFields, type PromotionRepository, type PromotionResult, type PromotionRow, type PromotionStatus, type PromotionTargetType, type PromotionType, type PromotionValue, type PublicBootResponse, type PublicComparisonRow, type PublicMarketingBundle, type PublicMarketingCatalogResponse, type PublicMarketingPlan, type PublicMarketingPromo, type PublicSignupPlan, type PublishBundleVersionData, type PublishBundleVersionMeta, type PublishPlanVersionData, type QuotaCatalogEntryRow, type QuotaEnforcementMode, type QuotaKey, type QuotaProvider, REGISTRATION_ERROR_CODES, REGISTRATION_RESUME_TTL_MINUTES, REGISTRATION_STEP_BY_STATUS, type ReassignTenantAdminCliResult, type RecommendablePlan, type RecordSubscriberPaymentMethodData, type RecordSubscriberPaymentMethodOutcome, type RecordSubscriberPaymentMethodResult, type RedeemPromoInTransactionCallback, type RegistrationActivation, type RegistrationAuditContext, type RegistrationAuditEvent, type RegistrationAuditEventType, type RegistrationAuditLogger, type RegistrationBillingDetails, type RegistrationConfigSelection, type RegistrationConfiguratorLookup, type RegistrationErrorCode, type RegistrationOtpDelivery, type RegistrationPromoPreview, type RegistrationResumeDelivery, type RegistrationResumeTokenSigner, type RegistrationStatus, type RegistrationStep, type RequiredCapabilities, type ResolvableErrorBody, type ResumeRegistrationInput, type ResumeRegistrationResult, type ReviewCatalogEntryData, type RlsBypassPort, type RunningContractIssuer, type RunningContractIssuers, SETTINGS_ERROR_CODES, SETUP_ERROR_CODES, SUBSCRIBER_ERROR_CODES, type SaaSiCatPersistenceAdapter, type SaaSiCatPersistenceAdminResources, type SaaSiCatPersistenceCatalog, type SaaSiCatPersistenceCore, type SaaSiCatPersistenceEntitlement, type SaaSiCatPersistencePayments, type SaaSiCatPersistencePromo, type SaaSiCatPersistenceTenantBilling, type SaveRegistrationConfigInput, type SaveRegistrationConfigResult, type ScheduledPlanChangeInput, type SelectPlanInput, type SelectPlanResult, type SelectableBundleShape, type SelfServiceBlockedPlans, type SetCatalogEntryReviewData, type SettingsChangeFilter, type SettingsChangeRecord, type SettingsDifference, type SettingsErrorCode, type SetupConfirmMfaRequest, type SetupConfirmMfaResponse, type SetupErrorCode, type SetupRequest, type SetupResult, type SetupStatusResponse, type SlugAvailabilityCheck, type StandardPageDef, type StandardPageKey, type StartCheckoutInput, type StartCheckoutResult, type StartPaymentMethodSetupInput, type StartRegistrationInput, type StartRegistrationResult, type StoredBundleStem, type StrictModeWarning, type StrictModeWarningCode, type SubscriberContact, type SubscriberContactChange, type SubscriberCorrectionData, type SubscriberCorrectionRecord, type SubscriberCorrectionResult, type SubscriberDetails, type SubscriberErrorCode, type SubscriberIdentityCorrection, type SubscriberIdentityDelta, type SubscriberIdentityValues, type SubscriberPaymentMethodRecord, type SubscriberPaymentMethodRepository, type SubscriberPaymentMethodSetupData, type SubscriberPaymentMethodSetupMatch, type SubscriberPaymentMethodStatus, type SubscriberRecord, type SubscriberRepository, type Subscription, type SubscriptionBundleRecord, type SubscriptionBundleRepository, type SubscriptionBundleView, type SubscriptionContractFilter, type SubscriptionContractInvoiceSnapshot, type SubscriptionContractParties, type SubscriptionContractPriceSnapshot, type SubscriptionContractRecord, type SubscriptionContractRepository, type SubscriptionContractStatus, type SubscriptionRecord, type SubscriptionRepository, type SubscriptionStatsPort, type SubscriptionStatsSnapshot, type SubscriptionStatus, type SubscriptionUsagePort, type SubscriptionUsageRecord, type SuperAdminProvisioningPort, type SyncDiscoveryResult, type TenantActionDef, type TenantColumnDef, type TenantDto, type TenantListFilter, type TenantPort, type TenantSubscriptionWritePort, type TerminateSubscriptionContractData, type TopPromoCode, type TransactionContext, type TransactionRunner, type UpdateBundleData, type UpdateBundleVersionDraftData, type UpdateCatalogEntryBaseData, type UpdateCatalogEntryI18nData, type UpdateCheckoutOfferData, type UpdateMarketingProjectionData, type UpdateMarketingSettingsData, type UpdatePlanData, type UpdatePlanVersionDraftData, type UpdatePromoCodeData, type UpdatePromoCodeRequest, type UpdatePromotionData, type UpsellOffer, type UpsellOfferResolver, type UpsertCapabilityEntryData, type UpsertFeatureCatalogEntryInput, type UpsertFeatureEntryData, type UpsertPlanInput, type UpsertPlanVersionInput, type UpsertQuotaEntryData, type UpsertResult, type UsageSnapshotPort, type UserAccountLookup, type UserListFilter, type UserManagementPort, type UserPort, type VerifyRegistrationOtpResult, type VersionChange, type VersionChangeDirection, type VersionEditability, type VersionEditableReason, type VersionedEntityBase, applyPromo, assertPersistenceCapabilities, buildActivePlanVersionWhere, buildActiveVersionWhere, buildFeatureRequiresIndex, bundleDraftDefaults, bundleStemDefaults, canonicalJson, classifyBundleVersionDiff, classifyIssuerChange, classifyPlanDiff, collectUnsatisfiedRequires, contractPartiesOf, coverageExcludingSelf, definedFields, diffSettings, formatCustomerNumber, formatErrorMessage, identityCorrectionDelta, isBundleRedundant, isPaymentCallbackRejectedError, isPlatformUserExistsError, isVersionEditable, issuerIdentityOf, keepOneRecommended, missingRequiresFor, movedIdentityFields, pickActivePromo, planCatalogSettingsOf, previousUtcDay, promoStatus, readQuotaRecord, readQuotaValue, recordedIssuerIdentity, resolveBundleAvailability, resolveErrorMessage, sameLegalIdentity, selectChargeableBundles, settingsSubtreeOf, startOfUtcDay, subscriberFromRegistration, subscriberPaymentMethodColumns, toBundleStemRow, toContractLineItemRecord, toPlanRow, toPlanVersionRow, toRunningContractIssuer, toSubscriberCorrectionRecord, toSubscriberPaymentMethodRecord, toSubscriberRecord, toSubscriptionContractRecord };