@happyvertical/smrt-sales 0.39.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/AGENTS.md +87 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/__smrt-register__.d.ts +2 -0
  6. package/dist/__smrt-register__.d.ts.map +1 -0
  7. package/dist/chunks/__smrt-register__-kWdT7LOt.js +6 -0
  8. package/dist/chunks/__smrt-register__-kWdT7LOt.js.map +1 -0
  9. package/dist/chunks/commissions-BCxqOKVM.js +2181 -0
  10. package/dist/chunks/commissions-BCxqOKVM.js.map +1 -0
  11. package/dist/chunks/crm-DwEz7E2r.js +1428 -0
  12. package/dist/chunks/crm-DwEz7E2r.js.map +1 -0
  13. package/dist/chunks/referrals-BY47p70T.js +2880 -0
  14. package/dist/chunks/referrals-BY47p70T.js.map +1 -0
  15. package/dist/commissions/collections/CommissionAdjustmentCollection.d.ts +26 -0
  16. package/dist/commissions/collections/CommissionAdjustmentCollection.d.ts.map +1 -0
  17. package/dist/commissions/collections/CommissionCollection.d.ts +43 -0
  18. package/dist/commissions/collections/CommissionCollection.d.ts.map +1 -0
  19. package/dist/commissions/collections/CommissionPayoutCollection.d.ts +19 -0
  20. package/dist/commissions/collections/CommissionPayoutCollection.d.ts.map +1 -0
  21. package/dist/commissions/collections/CommissionPlanCollection.d.ts +46 -0
  22. package/dist/commissions/collections/CommissionPlanCollection.d.ts.map +1 -0
  23. package/dist/commissions/collections/EarnerCollection.d.ts +14 -0
  24. package/dist/commissions/collections/EarnerCollection.d.ts.map +1 -0
  25. package/dist/commissions/collections/EarningEventCollection.d.ts +27 -0
  26. package/dist/commissions/collections/EarningEventCollection.d.ts.map +1 -0
  27. package/dist/commissions/collections/index.d.ts +11 -0
  28. package/dist/commissions/collections/index.d.ts.map +1 -0
  29. package/dist/commissions/index.d.ts +20 -0
  30. package/dist/commissions/index.d.ts.map +1 -0
  31. package/dist/commissions/models/Commission.d.ts +150 -0
  32. package/dist/commissions/models/Commission.d.ts.map +1 -0
  33. package/dist/commissions/models/CommissionAdjustment.d.ts +62 -0
  34. package/dist/commissions/models/CommissionAdjustment.d.ts.map +1 -0
  35. package/dist/commissions/models/CommissionPayout.d.ts +119 -0
  36. package/dist/commissions/models/CommissionPayout.d.ts.map +1 -0
  37. package/dist/commissions/models/CommissionPlan.d.ts +117 -0
  38. package/dist/commissions/models/CommissionPlan.d.ts.map +1 -0
  39. package/dist/commissions/models/Earner.d.ts +49 -0
  40. package/dist/commissions/models/Earner.d.ts.map +1 -0
  41. package/dist/commissions/models/EarningEvent.d.ts +89 -0
  42. package/dist/commissions/models/EarningEvent.d.ts.map +1 -0
  43. package/dist/commissions/models/index.d.ts +11 -0
  44. package/dist/commissions/models/index.d.ts.map +1 -0
  45. package/dist/commissions/money.d.ts +42 -0
  46. package/dist/commissions/money.d.ts.map +1 -0
  47. package/dist/commissions/services/CommissionBalanceService.d.ts +14 -0
  48. package/dist/commissions/services/CommissionBalanceService.d.ts.map +1 -0
  49. package/dist/commissions/services/CommissionCalculationService.d.ts +142 -0
  50. package/dist/commissions/services/CommissionCalculationService.d.ts.map +1 -0
  51. package/dist/commissions/services/CommissionPayoutService.d.ts +134 -0
  52. package/dist/commissions/services/CommissionPayoutService.d.ts.map +1 -0
  53. package/dist/commissions/services/CommissionSettlementService.d.ts +42 -0
  54. package/dist/commissions/services/CommissionSettlementService.d.ts.map +1 -0
  55. package/dist/commissions/services/index.d.ts +9 -0
  56. package/dist/commissions/services/index.d.ts.map +1 -0
  57. package/dist/commissions/types.d.ts +243 -0
  58. package/dist/commissions/types.d.ts.map +1 -0
  59. package/dist/commissions.d.ts +2 -0
  60. package/dist/commissions.d.ts.map +1 -0
  61. package/dist/commissions.js +3 -0
  62. package/dist/crm/collections/LeadCollection.d.ts +79 -0
  63. package/dist/crm/collections/LeadCollection.d.ts.map +1 -0
  64. package/dist/crm/collections/OpportunityCollection.d.ts +42 -0
  65. package/dist/crm/collections/OpportunityCollection.d.ts.map +1 -0
  66. package/dist/crm/collections/OpportunityConversionCollection.d.ts +26 -0
  67. package/dist/crm/collections/OpportunityConversionCollection.d.ts.map +1 -0
  68. package/dist/crm/collections/PipelineDefinitionCollection.d.ts +46 -0
  69. package/dist/crm/collections/PipelineDefinitionCollection.d.ts.map +1 -0
  70. package/dist/crm/collections/PipelineStageCollection.d.ts +22 -0
  71. package/dist/crm/collections/PipelineStageCollection.d.ts.map +1 -0
  72. package/dist/crm/collections/SalesActivityCollection.d.ts +24 -0
  73. package/dist/crm/collections/SalesActivityCollection.d.ts.map +1 -0
  74. package/dist/crm/collections/SalesRepresentativeCollection.d.ts +19 -0
  75. package/dist/crm/collections/SalesRepresentativeCollection.d.ts.map +1 -0
  76. package/dist/crm/index.d.ts +27 -0
  77. package/dist/crm/index.d.ts.map +1 -0
  78. package/dist/crm/models/Lead.d.ts +135 -0
  79. package/dist/crm/models/Lead.d.ts.map +1 -0
  80. package/dist/crm/models/Opportunity.d.ts +111 -0
  81. package/dist/crm/models/Opportunity.d.ts.map +1 -0
  82. package/dist/crm/models/OpportunityConversion.d.ts +66 -0
  83. package/dist/crm/models/OpportunityConversion.d.ts.map +1 -0
  84. package/dist/crm/models/PipelineDefinition.d.ts +58 -0
  85. package/dist/crm/models/PipelineDefinition.d.ts.map +1 -0
  86. package/dist/crm/models/PipelineStage.d.ts +66 -0
  87. package/dist/crm/models/PipelineStage.d.ts.map +1 -0
  88. package/dist/crm/models/SalesActivity.d.ts +76 -0
  89. package/dist/crm/models/SalesActivity.d.ts.map +1 -0
  90. package/dist/crm/models/SalesRepresentative.d.ts +60 -0
  91. package/dist/crm/models/SalesRepresentative.d.ts.map +1 -0
  92. package/dist/crm/types.d.ts +228 -0
  93. package/dist/crm/types.d.ts.map +1 -0
  94. package/dist/crm.d.ts +2 -0
  95. package/dist/crm.d.ts.map +1 -0
  96. package/dist/crm.js +3 -0
  97. package/dist/index.d.ts +4 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +5 -0
  100. package/dist/manifest.json +9340 -0
  101. package/dist/referrals/collections/AttributionExceptionCollection.d.ts +17 -0
  102. package/dist/referrals/collections/AttributionExceptionCollection.d.ts.map +1 -0
  103. package/dist/referrals/collections/AttributionPolicyCollection.d.ts +50 -0
  104. package/dist/referrals/collections/AttributionPolicyCollection.d.ts.map +1 -0
  105. package/dist/referrals/collections/ReferralAgreementCollection.d.ts +48 -0
  106. package/dist/referrals/collections/ReferralAgreementCollection.d.ts.map +1 -0
  107. package/dist/referrals/collections/ReferralCollection.d.ts +25 -0
  108. package/dist/referrals/collections/ReferralCollection.d.ts.map +1 -0
  109. package/dist/referrals/collections/ReferralLinkCollection.d.ts +96 -0
  110. package/dist/referrals/collections/ReferralLinkCollection.d.ts.map +1 -0
  111. package/dist/referrals/collections/ReferralProgramCollection.d.ts +18 -0
  112. package/dist/referrals/collections/ReferralProgramCollection.d.ts.map +1 -0
  113. package/dist/referrals/collections/ReferralTermSnapshotCollection.d.ts +13 -0
  114. package/dist/referrals/collections/ReferralTermSnapshotCollection.d.ts.map +1 -0
  115. package/dist/referrals/collections/ReferralTouchCollection.d.ts +30 -0
  116. package/dist/referrals/collections/ReferralTouchCollection.d.ts.map +1 -0
  117. package/dist/referrals/collections/ReferrerCollection.d.ts +17 -0
  118. package/dist/referrals/collections/ReferrerCollection.d.ts.map +1 -0
  119. package/dist/referrals/index.d.ts +38 -0
  120. package/dist/referrals/index.d.ts.map +1 -0
  121. package/dist/referrals/models/AttributionException.d.ts +85 -0
  122. package/dist/referrals/models/AttributionException.d.ts.map +1 -0
  123. package/dist/referrals/models/AttributionPolicy.d.ts +128 -0
  124. package/dist/referrals/models/AttributionPolicy.d.ts.map +1 -0
  125. package/dist/referrals/models/Referral.d.ts +112 -0
  126. package/dist/referrals/models/Referral.d.ts.map +1 -0
  127. package/dist/referrals/models/ReferralAgreement.d.ts +125 -0
  128. package/dist/referrals/models/ReferralAgreement.d.ts.map +1 -0
  129. package/dist/referrals/models/ReferralLink.d.ts +71 -0
  130. package/dist/referrals/models/ReferralLink.d.ts.map +1 -0
  131. package/dist/referrals/models/ReferralProgram.d.ts +57 -0
  132. package/dist/referrals/models/ReferralProgram.d.ts.map +1 -0
  133. package/dist/referrals/models/ReferralTermSnapshot.d.ts +61 -0
  134. package/dist/referrals/models/ReferralTermSnapshot.d.ts.map +1 -0
  135. package/dist/referrals/models/ReferralTouch.d.ts +55 -0
  136. package/dist/referrals/models/ReferralTouch.d.ts.map +1 -0
  137. package/dist/referrals/models/Referrer.d.ts +69 -0
  138. package/dist/referrals/models/Referrer.d.ts.map +1 -0
  139. package/dist/referrals/services/AttributionService.d.ts +248 -0
  140. package/dist/referrals/services/AttributionService.d.ts.map +1 -0
  141. package/dist/referrals/services/ReferralCommissionService.d.ts +91 -0
  142. package/dist/referrals/services/ReferralCommissionService.d.ts.map +1 -0
  143. package/dist/referrals/services/ReferralQualificationService.d.ts +135 -0
  144. package/dist/referrals/services/ReferralQualificationService.d.ts.map +1 -0
  145. package/dist/referrals/types.d.ts +226 -0
  146. package/dist/referrals/types.d.ts.map +1 -0
  147. package/dist/referrals.d.ts +2 -0
  148. package/dist/referrals.d.ts.map +1 -0
  149. package/dist/referrals.js +3 -0
  150. package/dist/smrt-knowledge.json +5501 -0
  151. package/dist/svelte/__tests__/format.test.js +68 -0
  152. package/dist/svelte/__tests__/types.test.js +349 -0
  153. package/dist/svelte/components/AttributionConflictQueue.svelte +361 -0
  154. package/dist/svelte/components/AttributionConflictQueue.svelte.d.ts +15 -0
  155. package/dist/svelte/components/AttributionConflictQueue.svelte.d.ts.map +1 -0
  156. package/dist/svelte/components/CommissionBreakdown.svelte +251 -0
  157. package/dist/svelte/components/CommissionBreakdown.svelte.d.ts +11 -0
  158. package/dist/svelte/components/CommissionBreakdown.svelte.d.ts.map +1 -0
  159. package/dist/svelte/components/CommissionExpenseSummary.svelte +186 -0
  160. package/dist/svelte/components/CommissionExpenseSummary.svelte.d.ts +13 -0
  161. package/dist/svelte/components/CommissionExpenseSummary.svelte.d.ts.map +1 -0
  162. package/dist/svelte/components/ExecutedAgreementsList.svelte +136 -0
  163. package/dist/svelte/components/ExecutedAgreementsList.svelte.d.ts +11 -0
  164. package/dist/svelte/components/ExecutedAgreementsList.svelte.d.ts.map +1 -0
  165. package/dist/svelte/components/LeadList.svelte +224 -0
  166. package/dist/svelte/components/LeadList.svelte.d.ts +19 -0
  167. package/dist/svelte/components/LeadList.svelte.d.ts.map +1 -0
  168. package/dist/svelte/components/OpportunityBoard.svelte +230 -0
  169. package/dist/svelte/components/OpportunityBoard.svelte.d.ts +17 -0
  170. package/dist/svelte/components/OpportunityBoard.svelte.d.ts.map +1 -0
  171. package/dist/svelte/components/OpportunityDetail.svelte +472 -0
  172. package/dist/svelte/components/OpportunityDetail.svelte.d.ts +27 -0
  173. package/dist/svelte/components/OpportunityDetail.svelte.d.ts.map +1 -0
  174. package/dist/svelte/components/PayoutBatchReview.svelte +285 -0
  175. package/dist/svelte/components/PayoutBatchReview.svelte.d.ts +21 -0
  176. package/dist/svelte/components/PayoutBatchReview.svelte.d.ts.map +1 -0
  177. package/dist/svelte/components/PayoutHistoryList.svelte +245 -0
  178. package/dist/svelte/components/PayoutHistoryList.svelte.d.ts +11 -0
  179. package/dist/svelte/components/PayoutHistoryList.svelte.d.ts.map +1 -0
  180. package/dist/svelte/components/ReferralLinkManager.svelte +216 -0
  181. package/dist/svelte/components/ReferralLinkManager.svelte.d.ts +17 -0
  182. package/dist/svelte/components/ReferralLinkManager.svelte.d.ts.map +1 -0
  183. package/dist/svelte/components/ReferralStatusList.svelte +118 -0
  184. package/dist/svelte/components/ReferralStatusList.svelte.d.ts +11 -0
  185. package/dist/svelte/components/ReferralStatusList.svelte.d.ts.map +1 -0
  186. package/dist/svelte/components/ReferrerEarningsSummary.svelte +106 -0
  187. package/dist/svelte/components/ReferrerEarningsSummary.svelte.d.ts +11 -0
  188. package/dist/svelte/components/ReferrerEarningsSummary.svelte.d.ts.map +1 -0
  189. package/dist/svelte/components/SalesDashboard.svelte +192 -0
  190. package/dist/svelte/components/SalesDashboard.svelte.d.ts +29 -0
  191. package/dist/svelte/components/SalesDashboard.svelte.d.ts.map +1 -0
  192. package/dist/svelte/format.d.ts +46 -0
  193. package/dist/svelte/format.d.ts.map +1 -0
  194. package/dist/svelte/format.js +75 -0
  195. package/dist/svelte/index.d.ts +50 -0
  196. package/dist/svelte/index.d.ts.map +1 -0
  197. package/dist/svelte/index.js +37 -0
  198. package/dist/svelte/types.d.ts +422 -0
  199. package/dist/svelte/types.d.ts.map +1 -0
  200. package/dist/svelte/types.js +376 -0
  201. package/package.json +89 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttributionPolicy.d.ts","sourceRoot":"","sources":["../../../src/referrals/models/AttributionPolicy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAS,UAAU,EAAQ,MAAM,0BAA0B,CAAC;AAEnE,OAAO,EAGL,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC7B,MAAM,aAAa,CAAC;AAkCrB;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,iBAAiB,GACxB,IAAI,CAsCN;AAED,qBAca,iBAAkB,SAAQ,UAAU;IAC/C,yEAAyE;IAEzE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B,oEAAoE;IAEpE,SAAS,EAAE,MAAM,CAAM;IAEvB,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAK;IAEpB;;;;OAIG;IACH,MAAM,EAAE,uBAAuB,CAAW;IAE1C,wEAAwE;IACxE,aAAa,EAAE,IAAI,GAAG,IAAI,CAAQ;IAElC;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAM;IAExB,0CAA0C;IAC1C,UAAU,EAAE,qBAAqB,CAAiB;IAElD,wEAAwE;IACxE,gBAAgB,EAAE,2BAA2B,CAAU;IAEvD;;;;OAIG;IACH,iBAAiB,EAAE,OAAO,CAAS;IAEnC;;;;OAIG;IACH,oBAAoB,EAAE,OAAO,CAAS;IAEtC;;;;;OAKG;IACH,gBAAgB,EAAE,MAAM,CAAQ;IAEhC,wEAAwE;IACxE,iBAAiB,EAAE,MAAM,CAAQ;IAEjC,uEAAuE;IACvE,eAAe,EAAE,MAAM,CAAQ;IAE/B,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAQ;gBAEZ,OAAO,GAAE,wBAA6B;IAyBlD;;;;;OAKG;IACY,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAc1C,OAAO,IAAI,OAAO;IAIlB,QAAQ,IAAI,OAAO;IAMnB,0EAA0E;IAC1E,mBAAmB,IAAI,MAAM,EAAE;IAI/B,oDAAoD;IACpD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAI7C,2EAA2E;IAC3E,oBAAoB,IAAI,MAAM,EAAE;IAIhC,qDAAqD;IACrD,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAI/C,yEAAyE;IACzE,kBAAkB,IAAI,MAAM,EAAE;IAI9B,mDAAmD;IACnD,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAI3C,kEAAkE;IAClE,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYtC,4CAA4C;IAC5C,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAMhD;;;OAGG;IACH,QAAQ,IAAI,IAAI;IAUhB,oEAAoE;IACpE,SAAS,IAAI,IAAI;IASjB,wDAAwD;IACxD,MAAM,IAAI,IAAI;IAWd;;;;;;;;;;OAUG;IACY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBpC;;;;;;;OAOG;YACW,wBAAwB;IAiCtC;;;;OAIG;YACW,kBAAkB;IAgBhC,OAAO,CAAC,sBAAsB;IAe9B,OAAO,CAAC,6BAA6B;IAerC,OAAO,CAAC,uBAAuB;IAqB/B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAY/B,OAAO,CAAC,MAAM,CAAC,UAAU;CAS1B;AAED,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,112 @@
1
+ import { SmrtObject } from '@happyvertical/smrt-core';
2
+ import { ReferralOptions, ReferralStatus } from '../types.js';
3
+ export declare class Referral extends SmrtObject {
4
+ /** Tenant ID for multi-tenant isolation (nullable → global referrals). */
5
+ tenantId: string | null;
6
+ /** The Referrer credited with the introduction. Required. */
7
+ referrerId: string;
8
+ /** The ReferralProgram the referral belongs to. Required. */
9
+ programId: string;
10
+ /** AttributionPolicy key resolved at attribution ('' until attributed). */
11
+ policyKey: string;
12
+ /** AttributionPolicy version resolved at attribution (0 until attributed). */
13
+ policyVersion: number;
14
+ /**
15
+ * Lifecycle status — see the module transition map. Mutate via the
16
+ * transition methods; the save-time guard rejects illegal edges.
17
+ */
18
+ status: ReferralStatus;
19
+ /**
20
+ * Generic qualifying target: what the introduction became/points at —
21
+ * `('lead', <id>)`, `('opportunity', <id>)`, `('client', <id>)`,
22
+ * `('subscription', <id>)`, … This module attaches no semantics to it.
23
+ */
24
+ targetKind: string;
25
+ /** Identifier within the {@link targetKind} namespace. */
26
+ targetId: string;
27
+ /**
28
+ * Credit share (0–1) this referral carries. `1.0` for sole attribution;
29
+ * split attribution creates sibling Referrals whose fractions sum to 1.0
30
+ * sharing one {@link splitGroupId}. Flows into Commission
31
+ * `shareFraction` at earning time.
32
+ */
33
+ creditFraction: number;
34
+ /** Groups the sibling referrals of one split. Empty for unsplit rows. */
35
+ splitGroupId: string;
36
+ /** The winning ReferralTouch behind the attribution ('' for touchless awards). */
37
+ primaryTouchId: string;
38
+ /** When the referral was attributed. */
39
+ attributedAt: Date | null;
40
+ /** When the referral was qualified. */
41
+ qualifiedAt: Date | null;
42
+ /**
43
+ * When an attributed-but-unqualified referral lapses. Stamped at
44
+ * attribution (`attributedAt + policy.windowDays`); enforced by
45
+ * `ReferralCollection.sweepExpired()`.
46
+ */
47
+ expiresAt: Date | null;
48
+ /**
49
+ * The ReferralTermSnapshot frozen at qualification ('' until qualified).
50
+ * Requalification repoints this at a NEW snapshot; old snapshots remain
51
+ * as history.
52
+ *
53
+ * Deliberately a PLAIN string reference (not `@foreignKey`): the
54
+ * snapshot's own `referralId` FK carries the relationship, and declaring
55
+ * both directions would put a cycle in the model graph (breaking the
56
+ * registry's topological initialization order). Services fetch the
57
+ * snapshot by id explicitly.
58
+ */
59
+ snapshotId: string;
60
+ /**
61
+ * Free-form JSON object stored as a string. Use
62
+ * {@link getMetadata}/{@link setMetadata} instead of parsing manually.
63
+ */
64
+ metadata: string;
65
+ constructor(options?: ReferralOptions);
66
+ /**
67
+ * Re-coerce date fields after the framework reapplies raw option values
68
+ * and record the loaded status for the save-time transition guard.
69
+ */
70
+ initialize(): Promise<this>;
71
+ isAttributed(): boolean;
72
+ isQualified(): boolean;
73
+ /** Whether the referral sits in a terminal status. */
74
+ isTerminal(): boolean;
75
+ /** Parse {@link metadata}; returns `{}` on malformed content. */
76
+ getMetadata(): Record<string, unknown>;
77
+ /** Serialize and store {@link metadata}. */
78
+ setMetadata(data: Record<string, unknown>): void;
79
+ /** Transition `pending → under_review` (conflict parked for humans). */
80
+ markUnderReview(): void;
81
+ /**
82
+ * Transition `pending | under_review → attributed` and stamp
83
+ * {@link attributedAt}.
84
+ */
85
+ markAttributed(at?: Date): void;
86
+ /** Transition `attributed → qualified` and stamp {@link qualifiedAt}. */
87
+ markQualified(at?: Date): void;
88
+ /**
89
+ * Transition to `disqualified` (terminal). Legal from every non-terminal
90
+ * status — including `qualified` (the rare clawback path).
91
+ */
92
+ disqualify(): void;
93
+ /** Transition `pending | attributed → expired` (terminal). */
94
+ markExpired(): void;
95
+ /**
96
+ * Validate the status transition before persisting, then save. A forged
97
+ * `status` (e.g. un-expiring a referral or skipping straight to
98
+ * qualified) is rejected regardless of how the instance was constructed.
99
+ */
100
+ save(): Promise<this>;
101
+ /**
102
+ * Resolve the AUTHORITATIVE prior status from the database; fall back to
103
+ * the loaded-status WeakMap only when the DB is unavailable (commerce
104
+ * pattern — an upsert via `create({ id, _skipLoad: true })` can't
105
+ * sidestep the guard).
106
+ */
107
+ private resolvePriorStatus;
108
+ private assertStatusTransition;
109
+ private static coerceDate;
110
+ }
111
+ export default Referral;
112
+ //# sourceMappingURL=Referral.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Referral.d.ts","sourceRoot":"","sources":["../../../src/referrals/models/Referral.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAc,UAAU,EAAQ,MAAM,0BAA0B,CAAC;AAExE,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAuBnE,qBAQa,QAAS,SAAQ,UAAU;IACtC,0EAA0E;IAE1E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B,6DAA6D;IAE7D,UAAU,EAAE,MAAM,CAAM;IAExB,6DAA6D;IAE7D,SAAS,EAAE,MAAM,CAAM;IAEvB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAM;IAEvB,8EAA8E;IAC9E,aAAa,EAAE,MAAM,CAAK;IAE1B;;;OAGG;IACH,MAAM,EAAE,cAAc,CAAa;IAEnC;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAM;IAExB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAM;IAEtB;;;;;OAKG;IACH,cAAc,EAAE,MAAM,CAAO;IAE7B,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAM;IAE1B,kFAAkF;IAElF,cAAc,EAAE,MAAM,CAAM;IAE5B,wCAAwC;IACxC,YAAY,EAAE,IAAI,GAAG,IAAI,CAAQ;IAEjC,uCAAuC;IACvC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAQ;IAEhC;;;;OAIG;IACH,SAAS,EAAE,IAAI,GAAG,IAAI,CAAQ;IAE9B;;;;;;;;;;OAUG;IACH,UAAU,EAAE,MAAM,CAAM;IAExB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAQ;gBAEZ,OAAO,GAAE,eAAoB;IA2BzC;;;OAGG;IACY,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAa1C,YAAY,IAAI,OAAO;IAIvB,WAAW,IAAI,OAAO;IAItB,sDAAsD;IACtD,UAAU,IAAI,OAAO;IAMrB,iEAAiE;IACjE,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYtC,4CAA4C;IAC5C,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAMhD,wEAAwE;IACxE,eAAe,IAAI,IAAI;IASvB;;;OAGG;IACH,cAAc,CAAC,EAAE,GAAE,IAAiB,GAAG,IAAI;IAU3C,yEAAyE;IACzE,aAAa,CAAC,EAAE,GAAE,IAAiB,GAAG,IAAI;IAU1C;;;OAGG;IACH,UAAU,IAAI,IAAI;IASlB,8DAA8D;IAC9D,WAAW,IAAI,IAAI;IAWnB;;;;OAIG;IACY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQpC;;;;;OAKG;YACW,kBAAkB;IAchC,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,MAAM,CAAC,UAAU;CAS1B;AAED,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,125 @@
1
+ import { SmrtObject } from '@happyvertical/smrt-core';
2
+ import { ReferralAgreementApprovalMode, ReferralAgreementOptions, ReferralAgreementStatus } from '../types.js';
3
+ export declare class ReferralAgreement extends SmrtObject {
4
+ /** Tenant ID for multi-tenant isolation (nullable → global agreements). */
5
+ tenantId: string | null;
6
+ /** The Referrer bound by this agreement. Required. */
7
+ referrerId: string;
8
+ /** The ReferralProgram the agreement applies to. Required. */
9
+ programId: string;
10
+ /** Monotonic version within `(referrerId, programId)`. */
11
+ version: number;
12
+ /**
13
+ * Lifecycle status — see the module transition map. Mutate via
14
+ * {@link activate} / {@link supersede} / {@link terminate}.
15
+ */
16
+ status: ReferralAgreementStatus;
17
+ /** Start of the effective window (`null` = effective immediately). */
18
+ effectiveFrom: Date | null;
19
+ /**
20
+ * End of the effective window (`null` = open-ended). Deliberately NOT
21
+ * frozen: end-dating an active agreement is a legitimate operation.
22
+ */
23
+ effectiveTo: Date | null;
24
+ /**
25
+ * The commissions-module CommissionPlan key these terms bind. Required to
26
+ * activate.
27
+ */
28
+ commissionPlanKey: string;
29
+ /**
30
+ * Pinned plan version. `0` (default) means "resolve the latest ACTIVE
31
+ * version at qualification time and pin it in the ReferralTermSnapshot";
32
+ * `> 0` pins a specific version now.
33
+ */
34
+ commissionPlanVersion: number;
35
+ /**
36
+ * Clearing window in days applied to commissions earned under these
37
+ * terms (refund/chargeback holdback). Frozen into every snapshot.
38
+ */
39
+ clearingDays: number;
40
+ /** How earned commissions are approved downstream. */
41
+ approvalMode: ReferralAgreementApprovalMode;
42
+ /**
43
+ * Optional cross-package string reference to a smrt-commerce Contract
44
+ * representing the executed legal agreement.
45
+ */
46
+ contractRef: string;
47
+ /** URL of the executed agreement artifact (e-signature PDF, …). */
48
+ executedArtifactUrl: string;
49
+ /** Content hash of the executed artifact for tamper evidence. */
50
+ executedArtifactHash: string;
51
+ /**
52
+ * Acceptance evidence as a JSON object string (click-through record, IP,
53
+ * timestamp, signer, …). Use
54
+ * {@link getAcceptanceEvidence}/{@link setAcceptanceEvidence}.
55
+ */
56
+ acceptanceEvidence: string;
57
+ /**
58
+ * Free-form JSON object stored as a string. Use
59
+ * {@link getMetadata}/{@link setMetadata} instead of parsing manually.
60
+ */
61
+ metadata: string;
62
+ constructor(options?: ReferralAgreementOptions);
63
+ /**
64
+ * Re-coerce date fields after the framework reapplies raw option values,
65
+ * record the loaded status for the transition guard, and capture the
66
+ * frozen terms snapshot when the row arrived already non-draft
67
+ * (superseded / terminated history can't be rewritten either).
68
+ */
69
+ initialize(): Promise<this>;
70
+ isDraft(): boolean;
71
+ isActive(): boolean;
72
+ /**
73
+ * Whether the effective window contains `at` (`effectiveFrom` null =
74
+ * always started; `effectiveTo` null = open-ended). Status is NOT part of
75
+ * this check — combine with {@link isActive}.
76
+ */
77
+ isEffectiveAt(at: Date): boolean;
78
+ /** Parse {@link acceptanceEvidence}; returns `{}` on malformed content. */
79
+ getAcceptanceEvidence(): Record<string, unknown>;
80
+ /** Serialize and store {@link acceptanceEvidence}. */
81
+ setAcceptanceEvidence(evidence: Record<string, unknown>): void;
82
+ /** Parse {@link metadata}; returns `{}` on malformed content. */
83
+ getMetadata(): Record<string, unknown>;
84
+ /** Serialize and store {@link metadata}. */
85
+ setMetadata(data: Record<string, unknown>): void;
86
+ /**
87
+ * Transition `draft → active`. Requires a non-empty
88
+ * {@link commissionPlanKey} — an agreement without bound terms cannot
89
+ * govern qualification.
90
+ */
91
+ activate(): void;
92
+ /** Transition `active → superseded` (a newer version took over). */
93
+ supersede(): void;
94
+ /** Transition `draft | active → terminated` (terminal). */
95
+ terminate(): void;
96
+ /**
97
+ * Save with two guards (CommissionPlan pattern):
98
+ *
99
+ * 1. **Status transition** — the about-to-be-written status must be a
100
+ * legal edge from the authoritative prior persisted status.
101
+ * 2. **Frozen terms** — once the row has been saved non-draft, the terms
102
+ * fields must match the captured snapshot. Amend by inserting a new
103
+ * version instead.
104
+ *
105
+ * Activating saves also re-require {@link commissionPlanKey}.
106
+ */
107
+ save(): Promise<this>;
108
+ /**
109
+ * Refuse a save whose `(referrerId, programId, version)` natural key
110
+ * already belongs to a DIFFERENT row — the frozen-terms guard is
111
+ * instance-local, so a fresh instance would otherwise upsert over the
112
+ * persisted agreement (replacing legally frozen referral terms without
113
+ * an amendment, and rotating the row id). Edit drafts by hydrating
114
+ * them; change terms with
115
+ * `ReferralAgreementCollection.createAmendment()`.
116
+ */
117
+ private assertNaturalKeyNotTaken;
118
+ private resolvePriorStatus;
119
+ private assertStatusTransition;
120
+ private assertFrozenTermsUnchanged;
121
+ private serializeFrozenTerms;
122
+ private static coerceDate;
123
+ }
124
+ export default ReferralAgreement;
125
+ //# sourceMappingURL=ReferralAgreement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReferralAgreement.d.ts","sourceRoot":"","sources":["../../../src/referrals/models/ReferralAgreement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAGL,UAAU,EAEX,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EACV,6BAA6B,EAC7B,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,aAAa,CAAC;AA0BrB,qBAWa,iBAAkB,SAAQ,UAAU;IAC/C,2EAA2E;IAE3E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B,sDAAsD;IAEtD,UAAU,EAAE,MAAM,CAAM;IAExB,8DAA8D;IAE9D,SAAS,EAAE,MAAM,CAAM;IAEvB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAK;IAEpB;;;OAGG;IACH,MAAM,EAAE,uBAAuB,CAAW;IAE1C,sEAAsE;IACtE,aAAa,EAAE,IAAI,GAAG,IAAI,CAAQ;IAElC;;;OAGG;IACH,WAAW,EAAE,IAAI,GAAG,IAAI,CAAQ;IAEhC;;;OAGG;IACH,iBAAiB,EAAE,MAAM,CAAM;IAE/B;;;;OAIG;IACH,qBAAqB,EAAE,MAAM,CAAK;IAElC;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAK;IAEzB,sDAAsD;IACtD,YAAY,EAAE,6BAA6B,CAAY;IAEvD;;;OAGG;IAEH,WAAW,EAAE,MAAM,CAAM;IAEzB,mEAAmE;IACnE,mBAAmB,EAAE,MAAM,CAAM;IAEjC,iEAAiE;IACjE,oBAAoB,EAAE,MAAM,CAAM;IAElC;;;;OAIG;IACH,kBAAkB,EAAE,MAAM,CAAQ;IAElC;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAQ;gBAEZ,OAAO,GAAE,wBAA6B;IA8BlD;;;;;OAKG;IACY,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAe1C,OAAO,IAAI,OAAO;IAIlB,QAAQ,IAAI,OAAO;IAInB;;;;OAIG;IACH,aAAa,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO;IAYhC,2EAA2E;IAC3E,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYhD,sDAAsD;IACtD,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI9D,iEAAiE;IACjE,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYtC,4CAA4C;IAC5C,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAMhD;;;;OAIG;IACH,QAAQ,IAAI,IAAI;IAchB,oEAAoE;IACpE,SAAS,IAAI,IAAI;IASjB,2DAA2D;IAC3D,SAAS,IAAI,IAAI;IAWjB;;;;;;;;;;OAUG;IACY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBpC;;;;;;;;OAQG;YACW,wBAAwB;YA8BxB,kBAAkB;IAgBhC,OAAO,CAAC,sBAAsB;IAe9B,OAAO,CAAC,0BAA0B;IAclC,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,MAAM,CAAC,UAAU;CAS1B;AAED,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { SmrtObject } from '@happyvertical/smrt-core';
2
+ import { ReferralLinkOptions, ReferralLinkStatus } from '../types.js';
3
+ /**
4
+ * Assert that a target URL is an absolute http/https URL. Exported for the
5
+ * collection's create path; the model also enforces it at save time so no
6
+ * write path can persist a malformed target.
7
+ */
8
+ export declare function assertHttpTargetUrl(targetUrl: string): void;
9
+ /**
10
+ * A ReferralLink is the shareable artifact a Referrer distributes: a
11
+ * globally unique `code` (natural key `['code']` — codes resolve without
12
+ * knowing the tenant/program) plus an optional destination `targetUrl`.
13
+ *
14
+ * Codes are minted by `ReferralLinkCollection.createWithUniqueCode()` —
15
+ * crypto-random, 10 lowercase-alphanumeric characters, collision-checked
16
+ * with a capped retry loop. Click traffic lands through
17
+ * `ReferralLinkCollection.recordClick()`, which increments {@link clickCount}
18
+ * and writes an immutable `ReferralTouch` evidence row; disabled links
19
+ * refuse clicks.
20
+ */
21
+ export declare class ReferralLink extends SmrtObject {
22
+ /** Tenant ID for multi-tenant isolation (nullable → global links). */
23
+ tenantId: string | null;
24
+ /** The Referrer this link credits. Required. */
25
+ referrerId: string;
26
+ /** The ReferralProgram this link belongs to. Required. */
27
+ programId: string;
28
+ /**
29
+ * Globally unique share code (10 lowercase-alphanumeric characters when
30
+ * minted by `createWithUniqueCode`). Natural key.
31
+ */
32
+ code: string;
33
+ /**
34
+ * Optional destination URL the shared link forwards to. Must be an
35
+ * absolute http/https URL when non-empty (validated at save time).
36
+ */
37
+ targetUrl: string;
38
+ /** Human-readable label for the referrer's own bookkeeping. */
39
+ label: string;
40
+ /** `active` (default) accepts clicks; `disabled` refuses them. */
41
+ status: ReferralLinkStatus;
42
+ /** Number of recorded clicks (incremented by `recordClick`). */
43
+ clickCount: number;
44
+ /**
45
+ * Free-form JSON object stored as a string. Use
46
+ * {@link getMetadata}/{@link setMetadata} instead of parsing manually.
47
+ */
48
+ metadata: string;
49
+ constructor(options?: ReferralLinkOptions);
50
+ /** Whether the link currently accepts clicks. */
51
+ isActive(): boolean;
52
+ /** Parse the metadata JSON string; returns `{}` on malformed content. */
53
+ getMetadata(): Record<string, unknown>;
54
+ /** Serialize and store the metadata object. */
55
+ setMetadata(metadata: Record<string, unknown>): void;
56
+ /**
57
+ * Save with two guards:
58
+ *
59
+ * - a non-empty {@link targetUrl} must be an absolute http/https URL
60
+ * regardless of which write path set it;
61
+ * - the {@link code} must not belong to a DIFFERENT persisted link. Codes
62
+ * are the upsert natural key and they are public — without this check a
63
+ * generated-surface `create` carrying an existing code would silently
64
+ * UPSERT over that link (rewriting its referrer/program/target: a
65
+ * referral-code hijack). Mint codes through
66
+ * `ReferralLinkCollection.createWithUniqueCode()`.
67
+ */
68
+ save(): Promise<this>;
69
+ }
70
+ export default ReferralLink;
71
+ //# sourceMappingURL=ReferralLink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReferralLink.d.ts","sourceRoot":"","sources":["../../../src/referrals/models/ReferralLink.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAqB,UAAU,EAAQ,MAAM,0BAA0B,CAAC;AAE/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE3E;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAc3D;AAED;;;;;;;;;;;GAWG;AACH,qBASa,YAAa,SAAQ,UAAU;IAC1C,sEAAsE;IAEtE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B,gDAAgD;IAEhD,UAAU,EAAE,MAAM,CAAM;IAExB,0DAA0D;IAE1D,SAAS,EAAE,MAAM,CAAM;IAEvB;;;OAGG;IAEH,IAAI,EAAE,MAAM,CAAM;IAElB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAM;IAEvB,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAM;IAEnB,kEAAkE;IAClE,MAAM,EAAE,kBAAkB,CAAY;IAEtC,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAK;IAEvB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAQ;gBAEZ,OAAO,GAAE,mBAAwB;IAa7C,iDAAiD;IACjD,QAAQ,IAAI,OAAO;IAInB,yEAAyE;IACzE,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYtC,+CAA+C;IAC/C,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIpD;;;;;;;;;;;OAWG;IACY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA2BrC;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { SmrtObject } from '@happyvertical/smrt-core';
2
+ import { ReferralProgramOptions, ReferralProgramStatus } from '../types.js';
3
+ /**
4
+ * A ReferralProgram anchors links, touches, referrals, agreements, and
5
+ * exceptions, and carries the program-level DEFAULTS:
6
+ *
7
+ * - `defaultAttributionPolicyKey` — which versioned AttributionPolicy
8
+ * `AttributionService.resolve()` loads when the caller doesn't override.
9
+ * - `defaultCommissionPlanKey` — the suggested commissions plan for new
10
+ * ReferralAgreements (the agreement's own `commissionPlanKey` is what
11
+ * actually binds terms).
12
+ *
13
+ * Both defaults are KEYS, not pinned versions: the active version is
14
+ * resolved at attribution/qualification time and pinned on the Referral /
15
+ * ReferralTermSnapshot, so program rows stay stable across policy and plan
16
+ * amendments.
17
+ *
18
+ * Natural key `(tenant_id, key)` — each tenant names its programs once.
19
+ */
20
+ export declare class ReferralProgram extends SmrtObject {
21
+ /** Tenant ID for multi-tenant isolation (nullable → global programs). */
22
+ tenantId: string | null;
23
+ /** Stable program key within the tenant (natural-key component). */
24
+ key: string;
25
+ /** Human-readable program name. */
26
+ name: string;
27
+ /**
28
+ * Program lifecycle: `draft` (default) → `active` → `paused` /
29
+ * `archived`. Applications gate intake on `active`; this module records
30
+ * the status without enforcing transition edges.
31
+ */
32
+ status: ReferralProgramStatus;
33
+ /**
34
+ * Default commissions-plan key suggested to new ReferralAgreements.
35
+ * Empty means the program has no default — agreements must name a plan.
36
+ */
37
+ defaultCommissionPlanKey: string;
38
+ /**
39
+ * Default AttributionPolicy key `AttributionService.resolve()` uses when
40
+ * the caller passes no `policyKey` override.
41
+ */
42
+ defaultAttributionPolicyKey: string;
43
+ /**
44
+ * Free-form JSON object stored as a string. Use
45
+ * {@link getMetadata}/{@link setMetadata} instead of parsing manually.
46
+ */
47
+ metadata: string;
48
+ constructor(options?: ReferralProgramOptions);
49
+ /** Whether the program is accepting new referral activity. */
50
+ isActive(): boolean;
51
+ /** Parse the metadata JSON string; returns `{}` on malformed content. */
52
+ getMetadata(): Record<string, unknown>;
53
+ /** Serialize and store the metadata object. */
54
+ setMetadata(metadata: Record<string, unknown>): void;
55
+ }
56
+ export default ReferralProgram;
57
+ //# sourceMappingURL=ReferralProgram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReferralProgram.d.ts","sourceRoot":"","sources":["../../../src/referrals/models/ReferralProgram.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAS,UAAU,EAAQ,MAAM,0BAA0B,CAAC;AAEnE,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;;;GAgBG;AACH,qBAOa,eAAgB,SAAQ,UAAU;IAC7C,yEAAyE;IAEzE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B,oEAAoE;IAEpE,GAAG,EAAE,MAAM,CAAM;IAEjB,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAM;IAElB;;;;OAIG;IACH,MAAM,EAAE,qBAAqB,CAAW;IAExC;;;OAGG;IACH,wBAAwB,EAAE,MAAM,CAAM;IAEtC;;;OAGG;IACH,2BAA2B,EAAE,MAAM,CAAM;IAEzC;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAQ;gBAEZ,OAAO,GAAE,sBAA2B;IAahD,8DAA8D;IAC9D,QAAQ,IAAI,OAAO;IAInB,yEAAyE;IACzE,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYtC,+CAA+C;IAC/C,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAGrD;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { SmrtObject } from '@happyvertical/smrt-core';
2
+ import { CommissionPlanComponent } from '../../commissions/index.js';
3
+ import { ReferralAgreementApprovalMode, ReferralTermSnapshotOptions } from '../types.js';
4
+ export declare class ReferralTermSnapshot extends SmrtObject {
5
+ /** Tenant ID for multi-tenant isolation (nullable → global rows). */
6
+ tenantId: string | null;
7
+ /** The Referral this snapshot governs. Required. */
8
+ referralId: string;
9
+ /** Id of the ReferralAgreement the terms came from. */
10
+ agreementId: string;
11
+ /** Version of the agreement at qualification time. */
12
+ agreementVersion: number;
13
+ /** CommissionPlan key the components were copied from. */
14
+ planKey: string;
15
+ /**
16
+ * CommissionPlan version PINNED at qualification — when the agreement
17
+ * left the version unpinned (`0`), this records the latest-active version
18
+ * that was resolved.
19
+ */
20
+ planVersion: number;
21
+ /** AttributionPolicy key stamped on the referral at attribution. */
22
+ policyKey: string;
23
+ /** AttributionPolicy version stamped on the referral at attribution. */
24
+ policyVersion: number;
25
+ /**
26
+ * FROZEN copy of the plan's components JSON — THE calculation inputs.
27
+ * Use {@link getComponents} for the typed array.
28
+ */
29
+ components: string;
30
+ /** ISO 4217 currency the frozen terms are denominated in. */
31
+ currency: string;
32
+ /** Clearing window (days) copied from the agreement. */
33
+ clearingDays: number;
34
+ /** Approval mode copied from the agreement. */
35
+ approvalMode: ReferralAgreementApprovalMode;
36
+ /** Additional metadata as a JSON string (immutable like every field). */
37
+ metadata: string;
38
+ constructor(options?: ReferralTermSnapshotOptions);
39
+ /** Capture the persisted state so the save guard can reject mutations. */
40
+ initialize(): Promise<this>;
41
+ /**
42
+ * Parse {@link components} into the typed plan-component array the
43
+ * calculation service consumes; returns `[]` on empty/invalid JSON.
44
+ */
45
+ getComponents(): CommissionPlanComponent[];
46
+ /** Parse {@link metadata}; returns `{}` on malformed content. */
47
+ getMetadata(): Record<string, unknown>;
48
+ /**
49
+ * Save with the full-immutability guard:
50
+ *
51
+ * - A hydrated persisted row must serialize IDENTICALLY to its captured
52
+ * state — any field change throws (no-op re-saves pass).
53
+ * - An instance carrying an existing row's id WITHOUT having hydrated it
54
+ * (e.g. `create({ id, _skipLoad: true })`) is rejected outright — blind
55
+ * overwrites can't sidestep the comparison.
56
+ */
57
+ save(): Promise<this>;
58
+ private serializeState;
59
+ }
60
+ export default ReferralTermSnapshot;
61
+ //# sourceMappingURL=ReferralTermSnapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReferralTermSnapshot.d.ts","sourceRoot":"","sources":["../../../src/referrals/models/ReferralTermSnapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAc,UAAU,EAAQ,MAAM,0BAA0B,CAAC;AAExE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,KAAK,EACV,6BAA6B,EAC7B,2BAA2B,EAC5B,MAAM,aAAa,CAAC;AAUrB,qBAQa,oBAAqB,SAAQ,UAAU;IAClD,qEAAqE;IAErE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B,oDAAoD;IAEpD,UAAU,EAAE,MAAM,CAAM;IAExB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAM;IAEzB,sDAAsD;IACtD,gBAAgB,EAAE,MAAM,CAAK;IAE7B,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAM;IAErB;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAK;IAExB,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAM;IAEvB,wEAAwE;IACxE,aAAa,EAAE,MAAM,CAAK;IAE1B;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAQ;IAE1B,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAS;IAEzB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAK;IAEzB,+CAA+C;IAC/C,YAAY,EAAE,6BAA6B,CAAY;IAEvD,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAQ;gBAEZ,OAAO,GAAE,2BAAgC;IAuBrD,0EAA0E;IAC3D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ1C;;;OAGG;IACH,aAAa,IAAI,uBAAuB,EAAE;IAU1C,iEAAiE;IACjE,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYtC;;;;;;;;OAQG;IACY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBpC,OAAO,CAAC,cAAc;CAkBvB;AAED,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { SmrtObject } from '@happyvertical/smrt-core';
2
+ import { ReferralTouchKind, ReferralTouchOptions } from '../types.js';
3
+ export declare class ReferralTouch extends SmrtObject {
4
+ /** Tenant ID for multi-tenant isolation (nullable → global touches). */
5
+ tenantId: string | null;
6
+ /** The ReferralLink that produced this touch (empty for touchpoints
7
+ * without a link, e.g. manual assignments). */
8
+ linkId: string;
9
+ /** The share code involved, when the touch came through a code/link. */
10
+ code: string;
11
+ /** The Referrer this touch credits. Required. */
12
+ referrerId: string;
13
+ /** The ReferralProgram the touch belongs to. */
14
+ programId: string;
15
+ /** What kind of interaction this evidence records. */
16
+ kind: ReferralTouchKind;
17
+ /**
18
+ * Prospect identity when known — a generic `(subjectKind, subjectId)`
19
+ * pair (e.g. `('lead', <id>)`, `('email', 'a@b.test')`). Attribution
20
+ * matches touches to a resolution's subject and/or target through these.
21
+ */
22
+ subjectKind: string;
23
+ /** Identifier within the {@link subjectKind} namespace. */
24
+ subjectId: string;
25
+ /** When the interaction occurred (not when it was ingested). */
26
+ occurredAt: Date;
27
+ /**
28
+ * Evidence payload as a JSON object string (the code/link/url for clicks,
29
+ * actor + reason for manual assignments, …). Use
30
+ * {@link getEvidence}/{@link setEvidence}.
31
+ */
32
+ evidence: string;
33
+ /**
34
+ * Free-form JSON object stored as a string. Use
35
+ * {@link getMetadata}/{@link setMetadata} instead of parsing manually.
36
+ */
37
+ metadata: string;
38
+ constructor(options?: ReferralTouchOptions);
39
+ /**
40
+ * Re-coerce {@link occurredAt} after the framework reapplies raw option /
41
+ * hydrated row values (SQLite hands back ISO strings).
42
+ */
43
+ initialize(): Promise<this>;
44
+ /** Parse {@link evidence}; returns `{}` on empty/invalid JSON. */
45
+ getEvidence(): Record<string, unknown>;
46
+ /** Serialize and store {@link evidence}. */
47
+ setEvidence(evidence: Record<string, unknown>): void;
48
+ /** Parse {@link metadata}; returns `{}` on malformed content. */
49
+ getMetadata(): Record<string, unknown>;
50
+ /** Serialize and store {@link metadata}. */
51
+ setMetadata(data: Record<string, unknown>): void;
52
+ private static coerceDate;
53
+ }
54
+ export default ReferralTouch;
55
+ //# sourceMappingURL=ReferralTouch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReferralTouch.d.ts","sourceRoot":"","sources":["../../../src/referrals/models/ReferralTouch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAc,UAAU,EAAQ,MAAM,0BAA0B,CAAC;AAExE,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE3E,qBASa,aAAc,SAAQ,UAAU;IAC3C,wEAAwE;IAExE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B;mDAC+C;IAE/C,MAAM,EAAE,MAAM,CAAM;IAEpB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAM;IAElB,iDAAiD;IAEjD,UAAU,EAAE,MAAM,CAAM;IAExB,gDAAgD;IAEhD,SAAS,EAAE,MAAM,CAAM;IAEvB,sDAAsD;IACtD,IAAI,EAAE,iBAAiB,CAAW;IAElC;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAM;IAEzB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAM;IAEvB,gEAAgE;IAChE,UAAU,EAAE,IAAI,CAAc;IAE9B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAQ;IAExB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAQ;gBAEZ,OAAO,GAAE,oBAAyB;IAkB9C;;;OAGG;IACY,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAM1C,kEAAkE;IAClE,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYtC,4CAA4C;IAC5C,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIpD,iEAAiE;IACjE,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYtC,4CAA4C;IAC5C,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIhD,OAAO,CAAC,MAAM,CAAC,UAAU;CAS1B;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { SmrtObject } from '@happyvertical/smrt-core';
2
+ import { ReferrerOptions, ReferrerStatus } from '../types.js';
3
+ /**
4
+ * Referrer is a ROLE model: it links an identity (smrt-profiles Profile) to
5
+ * referral activity (ReferralLinks, ReferralTouches, and Referrals reference
6
+ * `referrerId`).
7
+ *
8
+ * Roles and money stay separate (see `packages/sales/AGENTS.md` "Roles vs.
9
+ * money"): a referrer connects to payouts only through the optional
10
+ * `earnerId` pointing at the commissions module's neutral `Earner`. A
11
+ * referral cannot produce Commissions until its referrer carries an
12
+ * `earnerId` — `ReferralCommissionService` skips such referrals with reason
13
+ * `'referrer_missing_earner'`.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const referrers = await ReferrerCollection.create({ db });
18
+ * const referrer = await referrers.create({
19
+ * profileId: 'profile-uuid',
20
+ * displayName: 'Jordan Partner',
21
+ * status: 'active',
22
+ * });
23
+ * const active = await referrers.findActive();
24
+ * ```
25
+ */
26
+ export declare class Referrer extends SmrtObject {
27
+ /**
28
+ * Tenant ID for multi-tenant isolation. Nullable to support both
29
+ * tenant-scoped and global (operator-level) referrers.
30
+ */
31
+ tenantId: string | null;
32
+ /**
33
+ * Identity of the person/organization acting as a referrer —
34
+ * cross-package string reference to a smrt-profiles Profile.
35
+ */
36
+ profileId: string;
37
+ /**
38
+ * Optional link to the commissions module's `Earner` (the neutral payout
39
+ * identity). String-form same-package FK: the Earner class lives in
40
+ * `src/commissions` and is intentionally NOT imported here — the string
41
+ * form registers the relationship without a module dependency, keeping the
42
+ * `referrals → commissions` boundary reference-only at the model layer.
43
+ * Empty when the referrer is not commission-compensated (yet).
44
+ */
45
+ earnerId: string;
46
+ /** Human-readable display name for portals and operator views. */
47
+ displayName: string;
48
+ /**
49
+ * Role lifecycle: `pending` (default, awaiting approval) → `active` /
50
+ * `suspended`. Only active referrers should receive new links/agreements.
51
+ */
52
+ status: ReferrerStatus;
53
+ /**
54
+ * Free-form JSON object stored as a string. Use
55
+ * {@link getMetadata}/{@link setMetadata} instead of parsing manually.
56
+ */
57
+ metadata: string;
58
+ constructor(options?: ReferrerOptions);
59
+ /** Whether the referrer may receive new links/agreements. */
60
+ isActive(): boolean;
61
+ isPending(): boolean;
62
+ isSuspended(): boolean;
63
+ /** Parse the metadata JSON string; returns `{}` on malformed content. */
64
+ getMetadata(): Record<string, unknown>;
65
+ /** Serialize and store the metadata object. */
66
+ setMetadata(metadata: Record<string, unknown>): void;
67
+ }
68
+ export default Referrer;
69
+ //# sourceMappingURL=Referrer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Referrer.d.ts","sourceRoot":"","sources":["../../../src/referrals/models/Referrer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGL,UAAU,EAEX,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAMa,QAAS,SAAQ,UAAU;IACtC;;;OAGG;IAEH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B;;;OAGG;IAEH,SAAS,EAAE,MAAM,CAAM;IAEvB;;;;;;;OAOG;IAEH,QAAQ,EAAE,MAAM,CAAM;IAEtB,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAM;IAEzB;;;OAGG;IACH,MAAM,EAAE,cAAc,CAAa;IAEnC;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAQ;gBAEZ,OAAO,GAAE,eAAoB;IAWzC,6DAA6D;IAC7D,QAAQ,IAAI,OAAO;IAInB,SAAS,IAAI,OAAO;IAIpB,WAAW,IAAI,OAAO;IAItB,yEAAyE;IACzE,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYtC,+CAA+C;IAC/C,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAGrD;AAED,eAAe,QAAQ,CAAC"}