/*
[referral-brief-v1] Service-fact contract for the referral landing v3 — the
numbers and ruleset anchors the page may cite (prices, service commitments,
qualifying period, AGB version). All values are derived upstream from PBP
entities (offerings, policies, publicDocuments); every field is optional so a
missing policy drops only its own claim — the copy layer must degrade
truthfully rather than invent digits (DNA-103).
- No PBP imports — this is the pure contract consumed by the copy module and produced by the site-side derivation.
- No display strings — amounts/durations stay numeric; formatting happens in copy.ts.
- warpgogol-m000193: created — single typed fact set replacing per-copy literal economics.
- REVIEW-CODE-2026-10-08-02: new optional facts downtimeHours,
priceFixMonths, cancellationDays, smallChangesPerMonth so every numeric claim
the copy cites resolves from a PBP policy — no digits invented at the copy
layer when a policy is absent.
- RFC-1258: capacity fact (month/free/total/updatedAt) from the PBP partner-program capacity block — the dated wave counter; absent → static range line.
*/
/** Canonical fact keys whose values link a landing row to a section anchor on
the site's AGB page. Site-authored per language — the platform declares
only the vocabulary. */
export const REFERRAL_AGB_ANCHOR_KEYS = [
"inquiryNonBinding",
"responseHours",
"launchWorkdays",
"availabilitySla",
"smallChangeHours",
"handoverHours",
"priorityReferral",
"partnerProgram",
"excludedServices",
"unsupportedProjects",
"smallBusiness",
"priceFix",
"cancellation",
"b2b",
"productScope",
"activationFee",
"reviewResult",
] as const;
export type ReferralAgbAnchorKey = (typeof REFERRAL_AGB_ANCHOR_KEYS)[number];
export type ReferralAgbAnchors = Partial>;
/** Landing v3 service facts — all derived from PBP entities. */
export interface ReferralServiceFacts {
/** Activation price (one-time, e.g. 200). */
readonly activationPrice?: number;
/** Monthly subscription (e.g. 70). */
readonly monthlyPrice?: number;
/** Yearly subscription (e.g. 700). */
readonly yearlyPrice?: number;
readonly priceCurrency?: string;
/** Launch window in working days (delivery-guarantee threshold). */
readonly launchWorkdays?: number;
/** Delay remedy type (delivery-guarantee remedy.type, e.g.
"continued-performance" — the copy maps known tokens to truthful
clauses; unknown tokens are omitted). */
readonly launchRemedy?: string;
/** Delay credit per day (delivery-guarantee terms.delayCreditPerDay). */
readonly delayCreditPerDay?: number;
/** Availability objective percent (availability-sla threshold). */
readonly availabilityPercent?: number;
/** Downtime threshold in hours — beyond it the next month is free
(availability-sla terms.downtimeThreshold). */
readonly downtimeHours?: number;
/** Price-fix period in months (price-changes priceFixPeriod). */
readonly priceFixMonths?: number;
/** Ordinary cancellation notice in days (cancellation ordinaryNotice.period). */
readonly cancellationDays?: number;
/** Included small changes per month (offering package.allowances.smallChanges). */
readonly smallChangesPerMonth?: number;
/** Small-changes window in hours (small-changes threshold). */
readonly smallChangeHours?: number;
/** Support response window in hours (support-response threshold). */
readonly responseHours?: number;
/** Exit handover window in hours (exit-package deliveryTarget). */
readonly handoverHours?: number;
/** Reward qualifying period in days (partner-program qualifyingPeriod). */
readonly qualifyingDays?: number;
/** Studio intake wave slots (digital-foundation availability.slotRange). */
readonly waveSlots?: { readonly min: number; readonly max: number };
/** RFC-1258: dated wave-capacity fact (partner-program capacity block) —
the "Nächste Welle: n von m Plätzen frei" line. Absent → the landing
degrades to the static waveSlots range line. */
readonly capacity?: {
readonly month: string;
readonly free: number;
readonly total: number;
readonly updatedAt: string;
};
/** AGB document version (documents/terms presentation.version). */
readonly termsVersion?: string;
/** AGB document effective date (documents/terms governance.effectiveFrom). */
readonly termsEffectiveFrom?: string;
}