@reachy/audience-module 1.0.16 → 1.0.18

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/CODEOWNERS ADDED
@@ -0,0 +1 @@
1
+ * @kenisson_melo @vitor @arthur
@@ -0,0 +1,44 @@
1
+ export type RfmThresholdRowLike = {
2
+ kind: 'r' | 'f' | string;
3
+ score: number;
4
+ min_value: number;
5
+ max_value: number;
6
+ };
7
+ export type RfmRecencyDefinition = {
8
+ within_days: number;
9
+ exclude_within_days?: number | null;
10
+ };
11
+ export type RfmFrequencyDefinition = {
12
+ op: string;
13
+ value: number;
14
+ value2?: number | null;
15
+ };
16
+ export type RfmSegmentDefinition = {
17
+ segment_key: string;
18
+ segment_name: string;
19
+ window_days: number;
20
+ recency: RfmRecencyDefinition;
21
+ frequency: RfmFrequencyDefinition;
22
+ criteria: any;
23
+ };
24
+ type ScoreRange = {
25
+ minScore: number;
26
+ maxScore: number;
27
+ };
28
+ export declare class RfmSegmentBuilder {
29
+ static getSegmentScoreRanges(segmentKey: string): {
30
+ r: ScoreRange;
31
+ f: ScoreRange;
32
+ } | null;
33
+ static getSegmentName(segmentKey: string): string;
34
+ static clampInt(n: number, min: number, max: number): number;
35
+ static buildDefinition(params: {
36
+ rfEventName: string;
37
+ windowDays: number;
38
+ segmentKey: string;
39
+ thresholds: RfmThresholdRowLike[];
40
+ filterCriteria?: any | null;
41
+ }): RfmSegmentDefinition;
42
+ }
43
+ export {};
44
+ //# sourceMappingURL=RfmSegmentBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RfmSegmentBuilder.d.ts","sourceRoot":"","sources":["../../src/builders/RfmSegmentBuilder.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,CAAA;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,oBAAoB,CAAA;IAC7B,SAAS,EAAE,sBAAsB,CAAA;IACjC,QAAQ,EAAE,GAAG,CAAA;CACd,CAAA;AAED,KAAK,UAAU,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAExD,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,UAAU,CAAC;QAAC,CAAC,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI;IA4BzF,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAgBjD,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAK5D,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE;QAC7B,WAAW,EAAE,MAAM,CAAA;QACnB,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,mBAAmB,EAAE,CAAA;QACjC,cAAc,CAAC,EAAE,GAAG,GAAG,IAAI,CAAA;KAC5B,GAAG,oBAAoB;CAgMzB"}
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RfmSegmentBuilder = void 0;
4
+ class RfmSegmentBuilder {
5
+ static getSegmentScoreRanges(segmentKey) {
6
+ const k = String(segmentKey || '').trim();
7
+ switch (k) {
8
+ case 'champions':
9
+ return { r: { minScore: 4, maxScore: 5 }, f: { minScore: 4, maxScore: 5 } };
10
+ case 'loyal_users':
11
+ return { r: { minScore: 3, maxScore: 3 }, f: { minScore: 4, maxScore: 5 } };
12
+ case 'potential_loyalists':
13
+ return { r: { minScore: 4, maxScore: 5 }, f: { minScore: 2, maxScore: 3 } };
14
+ case 'new_users':
15
+ return { r: { minScore: 5, maxScore: 5 }, f: { minScore: 1, maxScore: 1 } };
16
+ case 'promising':
17
+ return { r: { minScore: 4, maxScore: 4 }, f: { minScore: 1, maxScore: 1 } };
18
+ case 'needing_attention':
19
+ return { r: { minScore: 3, maxScore: 3 }, f: { minScore: 3, maxScore: 3 } };
20
+ case 'about_to_sleep':
21
+ return { r: { minScore: 3, maxScore: 3 }, f: { minScore: 1, maxScore: 2 } };
22
+ case 'cannot_lose_them':
23
+ return { r: { minScore: 1, maxScore: 2 }, f: { minScore: 5, maxScore: 5 } };
24
+ case 'at_risk':
25
+ return { r: { minScore: 1, maxScore: 2 }, f: { minScore: 3, maxScore: 4 } };
26
+ case 'hibernating':
27
+ return { r: { minScore: 1, maxScore: 2 }, f: { minScore: 1, maxScore: 2 } };
28
+ default:
29
+ return null;
30
+ }
31
+ }
32
+ static getSegmentName(segmentKey) {
33
+ const map = {
34
+ champions: 'Champions',
35
+ loyal_users: 'Loyal Users',
36
+ potential_loyalists: 'Potential Loyalists',
37
+ new_users: 'New Users',
38
+ promising: 'Promising',
39
+ needing_attention: 'Needing Attention',
40
+ about_to_sleep: 'About to Sleep',
41
+ at_risk: 'At Risk',
42
+ cannot_lose_them: 'Cannot Lose Them',
43
+ hibernating: 'Hibernating',
44
+ };
45
+ return map[String(segmentKey || '').trim()] || String(segmentKey || '').trim() || 'Segment';
46
+ }
47
+ static clampInt(n, min, max) {
48
+ const x = Number.isFinite(n) ? Math.trunc(n) : min;
49
+ return Math.max(min, Math.min(max, x));
50
+ }
51
+ static buildDefinition(params) {
52
+ const { rfEventName, windowDays, segmentKey, thresholds, filterCriteria } = params;
53
+ const ranges = this.getSegmentScoreRanges(segmentKey);
54
+ if (!ranges)
55
+ throw new Error('segment_key inválido');
56
+ const rMaxDays = new Map();
57
+ const fMinCount = new Map();
58
+ const fMaxCount = new Map();
59
+ for (const row of thresholds || []) {
60
+ const score = Number(row.score);
61
+ if (!Number.isFinite(score))
62
+ continue;
63
+ if (row.kind === 'r') {
64
+ const maxV = Number(row.max_value);
65
+ if (Number.isFinite(maxV))
66
+ rMaxDays.set(score, Math.max(0, Math.trunc(maxV)));
67
+ }
68
+ else if (row.kind === 'f') {
69
+ const minV = Number(row.min_value);
70
+ const maxV = Number(row.max_value);
71
+ if (Number.isFinite(minV))
72
+ fMinCount.set(score, Math.max(0, Math.trunc(minV)));
73
+ if (Number.isFinite(maxV))
74
+ fMaxCount.set(score, Math.max(0, Math.trunc(maxV)));
75
+ }
76
+ }
77
+ const rMin = ranges.r.minScore;
78
+ const rMax = ranges.r.maxScore;
79
+ const recencyUpperRaw = (() => {
80
+ if (rMin <= 1)
81
+ return windowDays;
82
+ for (let s = rMin; s <= rMax; s++) {
83
+ const v = rMaxDays.get(s);
84
+ if (v != null)
85
+ return v;
86
+ }
87
+ throw new Error(`Sem thresholds para recency score ${rMin}..${rMax}`);
88
+ })();
89
+ const recencyUpper = this.clampInt(recencyUpperRaw, 1, Math.max(1, windowDays));
90
+ const recencyLowerRaw = (() => {
91
+ if (rMax >= 5)
92
+ return null;
93
+ for (let s = rMax + 1; s <= 5; s++) {
94
+ const v = rMaxDays.get(s);
95
+ if (v != null)
96
+ return v;
97
+ }
98
+ return null;
99
+ })();
100
+ const recencyLower = recencyLowerRaw == null ? null : this.clampInt(recencyLowerRaw, 1, Math.max(1, windowDays));
101
+ const fMin = ranges.f.minScore;
102
+ const fMax = ranges.f.maxScore;
103
+ let hasAnyFreqThreshold = false;
104
+ for (let s = fMin; s <= fMax; s++) {
105
+ if (fMinCount.has(s) || fMaxCount.has(s)) {
106
+ hasAnyFreqThreshold = true;
107
+ break;
108
+ }
109
+ }
110
+ if (!hasAnyFreqThreshold) {
111
+ throw new Error(`Sem thresholds para frequency score ${fMin}..${fMax}`);
112
+ }
113
+ const collectMin = () => {
114
+ let min = Number.POSITIVE_INFINITY;
115
+ for (let s = fMin; s <= fMax; s++) {
116
+ const v = fMinCount.get(s) ?? fMaxCount.get(s);
117
+ if (v == null)
118
+ continue;
119
+ if (v < min)
120
+ min = v;
121
+ }
122
+ if (!Number.isFinite(min)) {
123
+ throw new Error(`Sem thresholds mínimos para frequency score ${fMin}..${fMax}`);
124
+ }
125
+ return min;
126
+ };
127
+ const collectMax = () => {
128
+ let max = 0;
129
+ for (let s = fMin; s <= fMax; s++) {
130
+ const v = fMaxCount.get(s) ?? fMinCount.get(s);
131
+ if (v == null)
132
+ continue;
133
+ if (v > max)
134
+ max = v;
135
+ }
136
+ if (!(max > 0)) {
137
+ throw new Error(`Sem thresholds máximos para frequency score ${fMin}..${fMax}`);
138
+ }
139
+ return max;
140
+ };
141
+ const minCount = Math.max(1, Math.trunc(collectMin()));
142
+ const maxCount = Math.max(minCount, Math.trunc(collectMax()));
143
+ const frequency = (() => {
144
+ if (fMax === 5 && fMin >= 4)
145
+ return { op: '>=', value: minCount, value2: null };
146
+ if (fMin === 5 && fMax === 5)
147
+ return { op: '>=', value: minCount, value2: null };
148
+ if (fMin === 1 && fMax <= 2)
149
+ return { op: '<=', value: maxCount, value2: null };
150
+ if (fMin === 1 && fMax === 1)
151
+ return { op: '<=', value: maxCount, value2: null };
152
+ return { op: 'between', value: minCount, value2: maxCount };
153
+ })();
154
+ const rfmGroup = {
155
+ operator: 'AND',
156
+ rules: [
157
+ {
158
+ kind: 'event',
159
+ eventName: rfEventName,
160
+ time: { unit: 'days', value: windowDays },
161
+ frequency: {
162
+ type: 'count',
163
+ op: frequency.op,
164
+ value: frequency.value,
165
+ ...(frequency.op === 'between' ? { value2: frequency.value2 } : {}),
166
+ },
167
+ },
168
+ {
169
+ kind: 'event',
170
+ eventName: rfEventName,
171
+ time: { unit: 'days', value: recencyUpper },
172
+ },
173
+ ...(recencyLower
174
+ ? [
175
+ {
176
+ kind: 'event',
177
+ eventName: rfEventName,
178
+ time: { unit: 'days', value: recencyLower },
179
+ negate: true,
180
+ },
181
+ ]
182
+ : []),
183
+ ],
184
+ };
185
+ const filterGroupsRaw = filterCriteria &&
186
+ typeof filterCriteria === 'object' &&
187
+ Array.isArray(filterCriteria.groups)
188
+ ? filterCriteria.groups
189
+ : [];
190
+ const mergedGroups = (() => {
191
+ const base = Array.isArray(filterGroupsRaw) ? [...filterGroupsRaw] : [];
192
+ if (base.length === 0)
193
+ return [rfmGroup];
194
+ return [...base, { ...rfmGroup, combineOperator: 'AND' }];
195
+ })();
196
+ const baseConfig = filterCriteria &&
197
+ typeof filterCriteria === 'object' &&
198
+ filterCriteria.config &&
199
+ typeof filterCriteria.config === 'object'
200
+ ? filterCriteria.config
201
+ : {};
202
+ const criteria = {
203
+ type: 'past-behavior',
204
+ groups: mergedGroups,
205
+ config: {
206
+ ...baseConfig,
207
+ rfm: {
208
+ segment_key: segmentKey,
209
+ rf_event_name: rfEventName,
210
+ window_days: windowDays,
211
+ recency: { within_days: recencyUpper, exclude_within_days: recencyLower },
212
+ frequency: { ...frequency },
213
+ },
214
+ },
215
+ ...(filterCriteria &&
216
+ typeof filterCriteria === 'object' &&
217
+ filterCriteria.live_options
218
+ ? { live_options: filterCriteria.live_options }
219
+ : {}),
220
+ };
221
+ return {
222
+ segment_key: segmentKey,
223
+ segment_name: this.getSegmentName(segmentKey),
224
+ window_days: windowDays,
225
+ recency: { within_days: recencyUpper, exclude_within_days: recencyLower },
226
+ frequency: { op: frequency.op, value: frequency.value, value2: frequency.value2 ?? null },
227
+ criteria,
228
+ };
229
+ }
230
+ }
231
+ exports.RfmSegmentBuilder = RfmSegmentBuilder;
232
+ //# sourceMappingURL=RfmSegmentBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RfmSegmentBuilder.js","sourceRoot":"","sources":["../../src/builders/RfmSegmentBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ export type RfmEventRow = {
2
+ contact_id?: string | null;
3
+ reachy_id?: string | null;
4
+ event_name?: string | null;
5
+ event_timestamp: string | Date;
6
+ event_data?: any;
7
+ };
8
+ export type RfmContactRow = {
9
+ id: string;
10
+ reachy_id?: string | null;
11
+ email?: string | null;
12
+ phone?: string | null;
13
+ is_subscribed?: boolean | null;
14
+ communication_preferences?: any;
15
+ };
16
+ export type RfmAggregateRow = {
17
+ contact_id: string;
18
+ last_ts: Date;
19
+ event_count: number;
20
+ };
21
+ export type RfmScoredContact = RfmAggregateRow & {
22
+ recency_days: number;
23
+ r_score: 1 | 2 | 3 | 4 | 5;
24
+ f_score: 1 | 2 | 3 | 4 | 5;
25
+ segment_key: string;
26
+ email_ok: 0 | 1;
27
+ sms_ok: 0 | 1;
28
+ };
29
+ export type RfmPreviewSegment = {
30
+ segment_key: string;
31
+ segment_name: string;
32
+ users: number;
33
+ percent: number;
34
+ avm: number;
35
+ email_reachability: number;
36
+ sms_reachability: number;
37
+ };
38
+ export type RfmThresholdRow = {
39
+ kind: 'r' | 'f';
40
+ score: 1 | 2 | 3 | 4 | 5;
41
+ min_value: number;
42
+ max_value: number;
43
+ };
44
+ export type RfmComputeOptions = {
45
+ from: string | Date;
46
+ to: string | Date;
47
+ rfEventName: string;
48
+ filterContactIds?: Set<string> | string[] | null;
49
+ };
50
+ type PercentileCuts = [number, number, number, number];
51
+ export declare class RfmEngine {
52
+ static aggregateFromEvents(contacts: RfmContactRow[], events: RfmEventRow[], opts: RfmComputeOptions): RfmAggregateRow[];
53
+ static scoreAggregates(contacts: RfmContactRow[], aggregates: RfmAggregateRow[], opts: Pick<RfmComputeOptions, 'to'>): {
54
+ scored: RfmScoredContact[];
55
+ r_days_cuts: PercentileCuts;
56
+ f_count_cuts: PercentileCuts;
57
+ };
58
+ static thresholdsFromScored(scored: RfmScoredContact[]): RfmThresholdRow[];
59
+ static previewFromScored(scored: RfmScoredContact[]): RfmPreviewSegment[];
60
+ static computeFromEvents(contacts: RfmContactRow[], events: RfmEventRow[], opts: RfmComputeOptions): {
61
+ segments: RfmPreviewSegment[];
62
+ thresholds: RfmThresholdRow[];
63
+ scored: RfmScoredContact[];
64
+ };
65
+ }
66
+ export {};
67
+ //# sourceMappingURL=RfmEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RfmEngine.d.ts","sourceRoot":"","sources":["../../src/engine/RfmEngine.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,UAAU,CAAC,EAAE,GAAG,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,aAAa,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IAC9B,yBAAyB,CAAC,EAAE,GAAG,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,IAAI,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,eAAe,GAAG;IAC/C,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC1B,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAA;IACf,MAAM,EAAE,CAAC,GAAG,CAAC,CAAA;CACd,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,GAAG,GAAG,GAAG,CAAA;IACf,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CAAA;CACjD,CAAA;AAED,KAAK,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAyItD,qBAAa,SAAS;IAOpB,MAAM,CAAC,mBAAmB,CACxB,QAAQ,EAAE,aAAa,EAAE,EACzB,MAAM,EAAE,WAAW,EAAE,EACrB,IAAI,EAAE,iBAAiB,GACtB,eAAe,EAAE;IA4DpB,MAAM,CAAC,eAAe,CACpB,QAAQ,EAAE,aAAa,EAAE,EACzB,UAAU,EAAE,eAAe,EAAE,EAC7B,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,GAClC;QAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;QAAC,WAAW,EAAE,cAAc,CAAC;QAAC,YAAY,EAAE,cAAc,CAAA;KAAE;IA+C5F,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,eAAe,EAAE;IAqD1E,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,iBAAiB,EAAE;IAmCzE,MAAM,CAAC,iBAAiB,CACtB,QAAQ,EAAE,aAAa,EAAE,EACzB,MAAM,EAAE,WAAW,EAAE,EACrB,IAAI,EAAE,iBAAiB,GACtB;QAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;QAAC,UAAU,EAAE,eAAe,EAAE,CAAC;QAAC,MAAM,EAAE,gBAAgB,EAAE,CAAA;KAAE;CAOhG"}