@xapp/stentor-service-promio 1.71.29 → 1.72.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.
- package/README.md +521 -2
- package/lib/PromioService.d.ts +48 -0
- package/lib/PromioService.js +51 -1
- package/lib/PromioService.js.map +1 -1
- package/lib/util.d.ts +2 -1
- package/lib/util.js +11 -14
- package/lib/util.js.map +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -1,3 +1,522 @@
|
|
|
1
|
-
|
|
1
|
+
# @xapp/stentor-service-promio
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Service to interface with the Promio CRM system (formerly Surefire CRM).
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @xapp/stentor-service-promio
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Basic Usage
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { PromioService } from "@xapp/stentor-service-promio";
|
|
15
|
+
import { ExternalLead } from "stentor-models";
|
|
16
|
+
|
|
17
|
+
const service = new PromioService({
|
|
18
|
+
appId: "your-app-id",
|
|
19
|
+
authToken: "your-auth-token",
|
|
20
|
+
endPoint: "https://api.promio.com/endpoint",
|
|
21
|
+
dataMap: "YourDataMap"
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const lead: ExternalLead = {
|
|
25
|
+
source: "widget",
|
|
26
|
+
transcript: [
|
|
27
|
+
{ message: "Hello", createdTime: "" },
|
|
28
|
+
{ message: "How can I help you?", createdTime: "", from: { id: "bot" } }
|
|
29
|
+
],
|
|
30
|
+
fields: [
|
|
31
|
+
{ name: "FULL_NAME", value: "John Doe" },
|
|
32
|
+
{ name: "EMAIL", value: "john@example.com" },
|
|
33
|
+
{ name: "PHONE", value: "555-1234" },
|
|
34
|
+
{ name: "MESSAGE", value: "I need help with my garage door" }
|
|
35
|
+
]
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const response = await service.send(lead);
|
|
39
|
+
console.log(response.status); // "Success" or "Failure"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Configuration
|
|
43
|
+
|
|
44
|
+
### Environment Variables
|
|
45
|
+
|
|
46
|
+
If `authToken`, `endPoint`, or `dataMap` are not provided in the constructor, they can be set via environment variables:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# App-specific token (preferred)
|
|
50
|
+
PROMIO_TOKEN_your_app_id=your-auth-token
|
|
51
|
+
|
|
52
|
+
# Fallback token
|
|
53
|
+
PROMIO_TOKEN=your-auth-token
|
|
54
|
+
|
|
55
|
+
# Endpoint and data map
|
|
56
|
+
PROMIO_ENDPOINT=https://api.promio.com/endpoint
|
|
57
|
+
PROMIO_DATAMAP=YourDataMap
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Constructor Options
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
interface PromioServiceProps {
|
|
64
|
+
appId: string; // Required: Your app ID
|
|
65
|
+
authToken?: string; // Optional: Auth token (or use env var)
|
|
66
|
+
endPoint?: string; // Optional: API endpoint (or use env var)
|
|
67
|
+
dataMap?: string; // Optional: Data map (or use env var)
|
|
68
|
+
fieldTransformations?: FieldTransformation[]; // Optional: Field transformations
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Field Transformations (Multi-Tenant)
|
|
73
|
+
|
|
74
|
+
Field transformations allow you to prepend or append text to specific field values before sending them to Promio. **Designed for multi-tenant environments** where different organizations need different formatting.
|
|
75
|
+
|
|
76
|
+
### Configuration
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
interface FieldTransformation {
|
|
80
|
+
field: string; // Field name to transform (case-insensitive)
|
|
81
|
+
prefix?: string; // Text to prepend to the field value
|
|
82
|
+
suffix?: string; // Text to append to the field value
|
|
83
|
+
organizationIds?: string[]; // Only apply for these organizationIds (optional)
|
|
84
|
+
delimiter?: string; // Custom delimiter for field concatenation (optional)
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### How It Works
|
|
89
|
+
|
|
90
|
+
1. **Configure transformations** in the service constructor with optional `organizationIds`
|
|
91
|
+
2. **Set organizationId** in the service constructor props
|
|
92
|
+
3. **Transformations are applied** based on organizationId matching:
|
|
93
|
+
- If `organizationIds` is specified: Only applies if the organizationId from props matches (case-insensitive)
|
|
94
|
+
- If `organizationIds` is not specified or empty: Applies to ALL organizations
|
|
95
|
+
|
|
96
|
+
### Examples
|
|
97
|
+
|
|
98
|
+
#### Example 1: Organization-Specific Transformations
|
|
99
|
+
|
|
100
|
+
Perfect for multi-tenant SaaS where certain organizations need specific formatting:
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
// Create service for premiergarage organization
|
|
104
|
+
const premiergarageService = new PromioService({
|
|
105
|
+
appId: "your-app",
|
|
106
|
+
authToken: "your-token",
|
|
107
|
+
endPoint: "https://api.promio.com/endpoint",
|
|
108
|
+
dataMap: "YourDataMap",
|
|
109
|
+
organizationId: "premiergarage",
|
|
110
|
+
fieldTransformations: [
|
|
111
|
+
{
|
|
112
|
+
field: "MESSAGE",
|
|
113
|
+
prefix: "Request Details: ",
|
|
114
|
+
organizationIds: ["premiergarage", "the-tailored-closet"]
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
field: "HELP_TYPE",
|
|
118
|
+
prefix: "Request Type: ",
|
|
119
|
+
organizationIds: ["premiergarage", "the-tailored-closet"]
|
|
120
|
+
}
|
|
121
|
+
]
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// For premiergarage - transformations ARE applied
|
|
125
|
+
await premiergarageService.send(lead);
|
|
126
|
+
// MESSAGE = "Need garage door repair" → "Request Details: Need garage door repair"
|
|
127
|
+
|
|
128
|
+
// Create service for different organization
|
|
129
|
+
const otherOrgService = new PromioService({
|
|
130
|
+
appId: "your-app",
|
|
131
|
+
authToken: "your-token",
|
|
132
|
+
endPoint: "https://api.promio.com/endpoint",
|
|
133
|
+
dataMap: "YourDataMap",
|
|
134
|
+
organizationId: "other-org",
|
|
135
|
+
fieldTransformations: [
|
|
136
|
+
{
|
|
137
|
+
field: "MESSAGE",
|
|
138
|
+
prefix: "Request Details: ",
|
|
139
|
+
organizationIds: ["premiergarage", "the-tailored-closet"]
|
|
140
|
+
}
|
|
141
|
+
]
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
// For different org - transformations are NOT applied
|
|
145
|
+
await otherOrgService.send(lead);
|
|
146
|
+
// MESSAGE stays as "Need garage door repair"
|
|
147
|
+
|
|
148
|
+
// Without organizationId - transformations are NOT applied
|
|
149
|
+
const genericService = new PromioService({
|
|
150
|
+
appId: "your-app",
|
|
151
|
+
authToken: "your-token",
|
|
152
|
+
endPoint: "https://api.promio.com/endpoint",
|
|
153
|
+
dataMap: "YourDataMap",
|
|
154
|
+
fieldTransformations: [
|
|
155
|
+
{
|
|
156
|
+
field: "MESSAGE",
|
|
157
|
+
prefix: "Request Details: ",
|
|
158
|
+
organizationIds: ["premiergarage", "the-tailored-closet"]
|
|
159
|
+
}
|
|
160
|
+
]
|
|
161
|
+
});
|
|
162
|
+
await genericService.send(lead);
|
|
163
|
+
// MESSAGE stays as "Need garage door repair"
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
#### Example 2: Global Transformations (All Organizations)
|
|
167
|
+
|
|
168
|
+
Apply transformations to all organizations by omitting `organizationIds`:
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
const service = new PromioService({
|
|
172
|
+
appId: "your-app",
|
|
173
|
+
authToken: "your-token",
|
|
174
|
+
endPoint: "https://api.promio.com/endpoint",
|
|
175
|
+
dataMap: "YourDataMap",
|
|
176
|
+
organizationId: "any-org", // Can be any organizationId or omitted
|
|
177
|
+
fieldTransformations: [
|
|
178
|
+
{
|
|
179
|
+
field: "MESSAGE",
|
|
180
|
+
suffix: " (via chatbot)" // No organizationIds - applies to ALL
|
|
181
|
+
}
|
|
182
|
+
]
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
// Works for any organization
|
|
186
|
+
await service.send(lead);
|
|
187
|
+
// MESSAGE = "I need help" → "I need help (via chatbot)"
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
#### Example 3: Mixed Transformations
|
|
191
|
+
|
|
192
|
+
Combine organization-specific and global transformations:
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
// For premium-org: Both transformations apply
|
|
196
|
+
const premiumService = new PromioService({
|
|
197
|
+
appId: "your-app",
|
|
198
|
+
authToken: "your-token",
|
|
199
|
+
endPoint: "https://api.promio.com/endpoint",
|
|
200
|
+
dataMap: "YourDataMap",
|
|
201
|
+
organizationId: "premium-org",
|
|
202
|
+
fieldTransformations: [
|
|
203
|
+
// Organization-specific
|
|
204
|
+
{
|
|
205
|
+
field: "MESSAGE",
|
|
206
|
+
prefix: "VIP Customer: ",
|
|
207
|
+
organizationIds: ["premium-org"]
|
|
208
|
+
},
|
|
209
|
+
// Global - applies to all
|
|
210
|
+
{
|
|
211
|
+
field: "EMAIL",
|
|
212
|
+
suffix: " (verified)"
|
|
213
|
+
}
|
|
214
|
+
]
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
await premiumService.send(lead);
|
|
218
|
+
// MESSAGE: "VIP Customer: Need help"
|
|
219
|
+
// EMAIL: "john@example.com (verified)"
|
|
220
|
+
|
|
221
|
+
// For other orgs: Only global transformation applies
|
|
222
|
+
const regularService = new PromioService({
|
|
223
|
+
appId: "your-app",
|
|
224
|
+
authToken: "your-token",
|
|
225
|
+
endPoint: "https://api.promio.com/endpoint",
|
|
226
|
+
dataMap: "YourDataMap",
|
|
227
|
+
organizationId: "regular-org",
|
|
228
|
+
fieldTransformations: [
|
|
229
|
+
{
|
|
230
|
+
field: "MESSAGE",
|
|
231
|
+
prefix: "VIP Customer: ",
|
|
232
|
+
organizationIds: ["premium-org"]
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
field: "EMAIL",
|
|
236
|
+
suffix: " (verified)"
|
|
237
|
+
}
|
|
238
|
+
]
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
await regularService.send(lead);
|
|
242
|
+
// MESSAGE: "Need help" (unchanged)
|
|
243
|
+
// EMAIL: "john@example.com (verified)"
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
#### Example 4: Multiple Organizations
|
|
247
|
+
|
|
248
|
+
One transformation can apply to multiple organizations:
|
|
249
|
+
|
|
250
|
+
```typescript
|
|
251
|
+
// Any of these organizationIds will get the same transformation
|
|
252
|
+
const service = new PromioService({
|
|
253
|
+
appId: "your-app",
|
|
254
|
+
authToken: "your-token",
|
|
255
|
+
endPoint: "https://api.promio.com/endpoint",
|
|
256
|
+
dataMap: "YourDataMap",
|
|
257
|
+
organizationId: "org-a", // or "org-b", "org-c", "org-d"
|
|
258
|
+
fieldTransformations: [
|
|
259
|
+
{
|
|
260
|
+
field: "MESSAGE",
|
|
261
|
+
prefix: "Franchise Request: ",
|
|
262
|
+
organizationIds: ["org-a", "org-b", "org-c", "org-d"]
|
|
263
|
+
}
|
|
264
|
+
]
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
await service.send(lead);
|
|
268
|
+
// MESSAGE = "Need help" → "Franchise Request: Need help"
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
#### Example 5: Custom Delimiters for Field Concatenation
|
|
272
|
+
|
|
273
|
+
Control how unsupported fields (like `HELP_TYPE`) are concatenated to `MESSAGE` for specific organizations:
|
|
274
|
+
|
|
275
|
+
```typescript
|
|
276
|
+
// Input lead with HELP_TYPE field
|
|
277
|
+
const lead: ExternalLead = {
|
|
278
|
+
source: "widget",
|
|
279
|
+
transcript: [],
|
|
280
|
+
fields: [
|
|
281
|
+
{ name: "MESSAGE", value: "I need help with my garage door" },
|
|
282
|
+
{ name: "HELP_TYPE", value: "[schedule_visit]" }
|
|
283
|
+
]
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
// For premiergarage - uses custom | delimiter
|
|
287
|
+
const premiergarageService = new PromioService({
|
|
288
|
+
appId: "your-app",
|
|
289
|
+
authToken: "your-token",
|
|
290
|
+
endPoint: "https://api.promio.com/endpoint",
|
|
291
|
+
dataMap: "YourDataMap",
|
|
292
|
+
organizationId: "premiergarage",
|
|
293
|
+
fieldTransformations: [
|
|
294
|
+
{
|
|
295
|
+
field: "MESSAGE",
|
|
296
|
+
prefix: "Request Details: ",
|
|
297
|
+
organizationIds: ["premiergarage", "the-tailored-closet"],
|
|
298
|
+
delimiter: "|" // Use pipe instead of default \n\n
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
field: "HELP_TYPE",
|
|
302
|
+
prefix: "Request Type: ",
|
|
303
|
+
organizationIds: ["premiergarage", "the-tailored-closet"]
|
|
304
|
+
}
|
|
305
|
+
]
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
await premiergarageService.send(lead);
|
|
309
|
+
// Result: MESSAGE = "Request Details: I need help with my garage door|[schedule_visit]"
|
|
310
|
+
// Note: HELP_TYPE field is removed (not in expected fields list)
|
|
311
|
+
|
|
312
|
+
// For different org - uses default \n\n delimiter
|
|
313
|
+
const otherOrgService = new PromioService({
|
|
314
|
+
appId: "your-app",
|
|
315
|
+
authToken: "your-token",
|
|
316
|
+
endPoint: "https://api.promio.com/endpoint",
|
|
317
|
+
dataMap: "YourDataMap",
|
|
318
|
+
organizationId: "other-org",
|
|
319
|
+
fieldTransformations: [
|
|
320
|
+
{
|
|
321
|
+
field: "MESSAGE",
|
|
322
|
+
prefix: "Request Details: ",
|
|
323
|
+
organizationIds: ["premiergarage", "the-tailored-closet"],
|
|
324
|
+
delimiter: "|"
|
|
325
|
+
}
|
|
326
|
+
]
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
await otherOrgService.send(lead);
|
|
330
|
+
// Result: MESSAGE = "I need help with my garage door\n\n[schedule_visit]"
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
**How delimiters work:**
|
|
334
|
+
- By default, unsupported fields like `HELP_TYPE` are concatenated to `MESSAGE` with `\n\n` delimiter
|
|
335
|
+
- Setting `delimiter` on a transformation applies to organizations matching `organizationIds`
|
|
336
|
+
- Only ONE transformation with a `delimiter` should match per organizationId (first match wins)
|
|
337
|
+
- The delimiter is applied BEFORE prefix/suffix transformations
|
|
338
|
+
- Useful for organizations that need compact formatting or specific separators
|
|
339
|
+
|
|
340
|
+
### Organization-Specific Configuration Patterns
|
|
341
|
+
|
|
342
|
+
#### Pattern 1: Configuration Map
|
|
343
|
+
|
|
344
|
+
Store transformations in a configuration object:
|
|
345
|
+
|
|
346
|
+
```typescript
|
|
347
|
+
// config/promio-transformations.ts
|
|
348
|
+
import { FieldTransformation } from "@xapp/stentor-service-promio";
|
|
349
|
+
|
|
350
|
+
export const PROMIO_TRANSFORMATIONS: FieldTransformation[] = [
|
|
351
|
+
{
|
|
352
|
+
field: "MESSAGE",
|
|
353
|
+
prefix: "Request Details: ",
|
|
354
|
+
organizationIds: ["premiergarage", "the-tailored-closet"]
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
field: "HELP_TYPE",
|
|
358
|
+
prefix: "Request Type: ",
|
|
359
|
+
organizationIds: ["premiergarage", "the-tailored-closet"]
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
field: "MESSAGE",
|
|
363
|
+
prefix: "VIP: ",
|
|
364
|
+
organizationIds: ["premium-org"]
|
|
365
|
+
}
|
|
366
|
+
];
|
|
367
|
+
|
|
368
|
+
// Usage: Create service instances per organization
|
|
369
|
+
import { PROMIO_TRANSFORMATIONS } from "./config/promio-transformations";
|
|
370
|
+
|
|
371
|
+
const createServiceForOrg = (organizationId: string) => {
|
|
372
|
+
return new PromioService({
|
|
373
|
+
appId: "your-app",
|
|
374
|
+
authToken: "your-token",
|
|
375
|
+
endPoint: "https://api.promio.com/endpoint",
|
|
376
|
+
dataMap: "YourDataMap",
|
|
377
|
+
organizationId,
|
|
378
|
+
fieldTransformations: PROMIO_TRANSFORMATIONS
|
|
379
|
+
});
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
const premierService = createServiceForOrg("premiergarage");
|
|
383
|
+
const closetService = createServiceForOrg("the-tailored-closet");
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
#### Pattern 2: Database-Driven Configuration
|
|
387
|
+
|
|
388
|
+
Load transformations dynamically from a database:
|
|
389
|
+
|
|
390
|
+
```typescript
|
|
391
|
+
// Load from database based on organizationId
|
|
392
|
+
const loadServiceForOrg = async (organizationId: string) => {
|
|
393
|
+
const transformations = await db.query(`
|
|
394
|
+
SELECT field, prefix, suffix, organization_ids
|
|
395
|
+
FROM field_transformations
|
|
396
|
+
WHERE app_id = ?
|
|
397
|
+
`, [appId]);
|
|
398
|
+
|
|
399
|
+
return new PromioService({
|
|
400
|
+
appId: "your-app",
|
|
401
|
+
authToken: "your-token",
|
|
402
|
+
endPoint: "https://api.promio.com/endpoint",
|
|
403
|
+
dataMap: "YourDataMap",
|
|
404
|
+
organizationId,
|
|
405
|
+
fieldTransformations: transformations.map(row => ({
|
|
406
|
+
field: row.field,
|
|
407
|
+
prefix: row.prefix,
|
|
408
|
+
suffix: row.suffix,
|
|
409
|
+
organizationIds: row.organization_ids.split(',')
|
|
410
|
+
}))
|
|
411
|
+
});
|
|
412
|
+
};
|
|
413
|
+
|
|
414
|
+
const service = await loadServiceForOrg("premiergarage");
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
#### Pattern 3: Environment Variables
|
|
418
|
+
|
|
419
|
+
```typescript
|
|
420
|
+
// From environment variables
|
|
421
|
+
const transformations: FieldTransformation[] = process.env.PROMIO_FIELD_TRANSFORMATIONS
|
|
422
|
+
? JSON.parse(process.env.PROMIO_FIELD_TRANSFORMATIONS)
|
|
423
|
+
: [];
|
|
424
|
+
|
|
425
|
+
const createServiceForOrg = (organizationId: string) => {
|
|
426
|
+
return new PromioService({
|
|
427
|
+
appId: "your-app",
|
|
428
|
+
authToken: "your-token",
|
|
429
|
+
endPoint: "https://api.promio.com/endpoint",
|
|
430
|
+
dataMap: "YourDataMap",
|
|
431
|
+
organizationId,
|
|
432
|
+
fieldTransformations: transformations
|
|
433
|
+
});
|
|
434
|
+
};
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
## Field Processing Order
|
|
438
|
+
|
|
439
|
+
The service processes lead fields in the following order:
|
|
440
|
+
|
|
441
|
+
1. **Built-in Transformation** (via `transformFields` utility):
|
|
442
|
+
- Splits `FULL_NAME` into `FIRST_NAME` and `LAST_NAME`
|
|
443
|
+
- Converts `DATETIME` to `BOOKING_DATE`
|
|
444
|
+
- Converts `PREFERRED_TIME` to `BOOKING_PREFERRED_TIME`
|
|
445
|
+
- Appends `HELP_TYPE`, `DATETIME`, and `PREFERRED_TIME` to `MESSAGE` field using delimiter (default: `\n\n`)
|
|
446
|
+
- Custom delimiter can be specified via `fieldTransformations.delimiter` for specific `organizationIds`
|
|
447
|
+
- Filters fields to only include expected fields
|
|
448
|
+
|
|
449
|
+
2. **Custom Transformations** (via `fieldTransformations` config):
|
|
450
|
+
- Checks organizationId from service props
|
|
451
|
+
- Applies prefix/suffix transformations to matching fields
|
|
452
|
+
- Case-insensitive field and organizationId matching
|
|
453
|
+
|
|
454
|
+
### Expected Fields
|
|
455
|
+
|
|
456
|
+
Only the following fields are sent to Promio:
|
|
457
|
+
- `FIRST_NAME`
|
|
458
|
+
- `LAST_NAME`
|
|
459
|
+
- `PHONE`
|
|
460
|
+
- `EMAIL`
|
|
461
|
+
- `MESSAGE`
|
|
462
|
+
- `ADDRESS`
|
|
463
|
+
- `CITY`
|
|
464
|
+
- `STATE`
|
|
465
|
+
- `COUNTRY`
|
|
466
|
+
- `ZIP`
|
|
467
|
+
- `BOOKING_PREFERRED_TIME`
|
|
468
|
+
- `BOOKING_DATE`
|
|
469
|
+
- `BOOKING_DATETIME`
|
|
470
|
+
|
|
471
|
+
## Data Map Selection
|
|
472
|
+
|
|
473
|
+
The service automatically selects the appropriate DataMap based on the lead source:
|
|
474
|
+
|
|
475
|
+
```typescript
|
|
476
|
+
// For chat widget leads
|
|
477
|
+
{ source: "widget" } → DataMap = "XAPPChatLead"
|
|
478
|
+
|
|
479
|
+
// For form widget leads
|
|
480
|
+
{ source: "form-widget" } → DataMap = "PromioExternalLead"
|
|
481
|
+
|
|
482
|
+
// For Reserve with Google leads
|
|
483
|
+
{ rwg_token: "..." } → DataMap = "GoogleReserve"
|
|
484
|
+
|
|
485
|
+
// Otherwise, uses the configured dataMap
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
## API Response
|
|
489
|
+
|
|
490
|
+
The service returns a `CrmResponse` object:
|
|
491
|
+
|
|
492
|
+
```typescript
|
|
493
|
+
interface CrmResponse {
|
|
494
|
+
status: "Success" | "Failure";
|
|
495
|
+
message?: string;
|
|
496
|
+
}
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
## Testing
|
|
500
|
+
|
|
501
|
+
The service includes comprehensive unit tests that mock network calls using Sinon:
|
|
502
|
+
|
|
503
|
+
```bash
|
|
504
|
+
npm test
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
Tests cover:
|
|
508
|
+
- Organization-specific transformations
|
|
509
|
+
- Global transformations
|
|
510
|
+
- Custom delimiter for field concatenation
|
|
511
|
+
- Case-insensitive matching
|
|
512
|
+
- Multiple organizations per transformation
|
|
513
|
+
- DataMap selection
|
|
514
|
+
- Error handling
|
|
515
|
+
|
|
516
|
+
## License
|
|
517
|
+
|
|
518
|
+
Apache-2.0
|
|
519
|
+
|
|
520
|
+
## Support
|
|
521
|
+
|
|
522
|
+
For issues and questions, please file an issue on the GitHub repository.
|
package/lib/PromioService.d.ts
CHANGED
|
@@ -2,8 +2,43 @@
|
|
|
2
2
|
import { BaseService, CrmResponse, CrmService, CrmServiceAvailability, CrmServiceAvailabilityOptions, CrmServiceJobType, DateTimeRange, ExternalLead } from "stentor-models";
|
|
3
3
|
import { FetchService } from "stentor-service-fetch";
|
|
4
4
|
import "isomorphic-fetch";
|
|
5
|
+
/**
|
|
6
|
+
* Configuration for transforming field values
|
|
7
|
+
*/
|
|
8
|
+
export interface FieldTransformation {
|
|
9
|
+
/**
|
|
10
|
+
* The field name to transform (case-insensitive)
|
|
11
|
+
*/
|
|
12
|
+
field: string;
|
|
13
|
+
/**
|
|
14
|
+
* Text to prepend to the field value
|
|
15
|
+
*/
|
|
16
|
+
prefix?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Text to append to the field value
|
|
19
|
+
*/
|
|
20
|
+
suffix?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Optional: Only apply this transformation if the organizationId matches one in this array.
|
|
23
|
+
* If not specified or empty, the transformation applies to all organizations.
|
|
24
|
+
*/
|
|
25
|
+
organizationIds?: string[];
|
|
26
|
+
/**
|
|
27
|
+
* Optional: Delimiter to use when concatenating fields in transformFields (e.g., HELP_TYPE to MESSAGE).
|
|
28
|
+
* If not specified, uses the default "\n\n" delimiter.
|
|
29
|
+
* Only applies when this transformation's organizationIds match.
|
|
30
|
+
*/
|
|
31
|
+
delimiter?: string;
|
|
32
|
+
}
|
|
5
33
|
export interface PromioServiceProps extends BaseService {
|
|
34
|
+
/**
|
|
35
|
+
* The app ID within Studio
|
|
36
|
+
*/
|
|
6
37
|
appId: string;
|
|
38
|
+
/**
|
|
39
|
+
* Optional organization ID to apply organization-specific field transformations
|
|
40
|
+
*/
|
|
41
|
+
organizationId?: string;
|
|
7
42
|
/**
|
|
8
43
|
* Provided by Surefire
|
|
9
44
|
*/
|
|
@@ -16,6 +51,19 @@ export interface PromioServiceProps extends BaseService {
|
|
|
16
51
|
* Provided by Surefire
|
|
17
52
|
*/
|
|
18
53
|
dataMap?: string;
|
|
54
|
+
/**
|
|
55
|
+
* Optional field transformations to apply to lead fields before sending.
|
|
56
|
+
* Allows prepending or appending text to specific field values.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* fieldTransformations: [
|
|
61
|
+
* { field: "MESSAGE", prefix: "Request Details: " },
|
|
62
|
+
* { field: "HELP_TYPE", prefix: "Request Type: " }
|
|
63
|
+
* ]
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
fieldTransformations?: FieldTransformation[];
|
|
19
67
|
}
|
|
20
68
|
export interface PromioExternalLeadExtras {
|
|
21
69
|
/**
|
package/lib/PromioService.js
CHANGED
|
@@ -62,7 +62,20 @@ class PromioService extends stentor_service_fetch_1.FetchService {
|
|
|
62
62
|
throw new Error("Promio: endpoint is not set");
|
|
63
63
|
}
|
|
64
64
|
const transcript = (0, util_1.transformTranscript)(externalLead.transcript, extras === null || extras === void 0 ? void 0 : extras.botId);
|
|
65
|
-
|
|
65
|
+
// Determine the delimiter to use based on fieldTransformations and organizationId
|
|
66
|
+
let delimiter = "\n\n"; // default
|
|
67
|
+
if (this.props.fieldTransformations && this.props.organizationId) {
|
|
68
|
+
const matchingTransformation = this.props.fieldTransformations.find((t) => {
|
|
69
|
+
if (t.delimiter && t.organizationIds && t.organizationIds.length > 0) {
|
|
70
|
+
return t.organizationIds.some(orgId => orgId.toLowerCase() === this.props.organizationId.toLowerCase());
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
});
|
|
74
|
+
if (matchingTransformation && matchingTransformation.delimiter) {
|
|
75
|
+
delimiter = matchingTransformation.delimiter;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const fields = (0, util_1.transformFields)(externalLead.fields, delimiter);
|
|
66
79
|
// Add a couple of items to the external lead
|
|
67
80
|
const lead = {
|
|
68
81
|
transcript,
|
|
@@ -73,6 +86,43 @@ class PromioService extends stentor_service_fetch_1.FetchService {
|
|
|
73
86
|
externalId: extras === null || extras === void 0 ? void 0 : extras.externalId,
|
|
74
87
|
fields
|
|
75
88
|
};
|
|
89
|
+
// Apply field transformations if configured
|
|
90
|
+
if (this.props.fieldTransformations && this.props.fieldTransformations.length > 0) {
|
|
91
|
+
const organizationId = this.props.organizationId;
|
|
92
|
+
lead.fields = lead.fields.map((field) => {
|
|
93
|
+
var _a;
|
|
94
|
+
const transformation = (_a = this.props.fieldTransformations) === null || _a === void 0 ? void 0 : _a.find((t) => {
|
|
95
|
+
// Check if field name matches
|
|
96
|
+
if (t.field.toLowerCase() !== field.name.toLowerCase()) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
// If organizationIds is specified, check if current organizationId matches
|
|
100
|
+
if (t.organizationIds && t.organizationIds.length > 0) {
|
|
101
|
+
if (!organizationId) {
|
|
102
|
+
return false; // Transformation requires org ID but none provided
|
|
103
|
+
}
|
|
104
|
+
// Case-insensitive match
|
|
105
|
+
return t.organizationIds.some(orgId => orgId.toLowerCase() === organizationId.toLowerCase());
|
|
106
|
+
}
|
|
107
|
+
// No organizationIds restriction, applies to all
|
|
108
|
+
return true;
|
|
109
|
+
});
|
|
110
|
+
if (transformation) {
|
|
111
|
+
let value = field.value;
|
|
112
|
+
if (transformation.prefix) {
|
|
113
|
+
value = `${transformation.prefix}${value}`;
|
|
114
|
+
}
|
|
115
|
+
if (transformation.suffix) {
|
|
116
|
+
value = `${value}${transformation.suffix}`;
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
name: field.name,
|
|
120
|
+
value
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return field;
|
|
124
|
+
});
|
|
125
|
+
}
|
|
76
126
|
let DataMap = this.props.dataMap;
|
|
77
127
|
// look in the extras for rwg_token
|
|
78
128
|
const isReserveWithGoogle = !!(extras === null || extras === void 0 ? void 0 : extras.rwg_token);
|
package/lib/PromioService.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PromioService.js","sourceRoot":"","sources":["../src/PromioService.ts"],"names":[],"mappings":";;;;;;;;;;;;AAWA,iEAAqD;AACrD,mDAAqC;AACrC,4BAA0B;AAC1B,iCAA8D;AAE9D,MAAM,UAAU,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"PromioService.js","sourceRoot":"","sources":["../src/PromioService.ts"],"names":[],"mappings":"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"}
|
package/lib/util.d.ts
CHANGED
|
@@ -18,8 +18,9 @@ export declare function transformTranscript(transcript: Message[], botId?: strin
|
|
|
18
18
|
* - If FULL_NAME is present and FIRST_NAME and LAST_NAME are not, split it into FIRST_NAME and LAST_NAME
|
|
19
19
|
* - Appends additional fields to the message.
|
|
20
20
|
* @param fields
|
|
21
|
+
* @param delimiter Optional delimiter to use when concatenating fields to MESSAGE (default: "\n\n")
|
|
21
22
|
*/
|
|
22
|
-
export declare function transformFields(fields: LeadFormField[]): {
|
|
23
|
+
export declare function transformFields(fields: LeadFormField[], delimiter?: string): {
|
|
23
24
|
name: string;
|
|
24
25
|
value: string;
|
|
25
26
|
}[];
|
package/lib/util.js
CHANGED
|
@@ -60,8 +60,9 @@ function transformTranscript(transcript, botId) {
|
|
|
60
60
|
* - If FULL_NAME is present and FIRST_NAME and LAST_NAME are not, split it into FIRST_NAME and LAST_NAME
|
|
61
61
|
* - Appends additional fields to the message.
|
|
62
62
|
* @param fields
|
|
63
|
+
* @param delimiter Optional delimiter to use when concatenating fields to MESSAGE (default: "\n\n")
|
|
63
64
|
*/
|
|
64
|
-
function transformFields(fields) {
|
|
65
|
+
function transformFields(fields, delimiter = "\n\n") {
|
|
65
66
|
// Remove any fields that are empty or null
|
|
66
67
|
const cleanedFields = fields.filter((field) => field.value && field.value.length > 0);
|
|
67
68
|
const firstNameIndex = cleanedFields.findIndex((field) => field.name.toLowerCase() === "first_name");
|
|
@@ -108,35 +109,31 @@ function transformFields(fields) {
|
|
|
108
109
|
cleanedFields.splice(preferredTimeIndex, 1);
|
|
109
110
|
}
|
|
110
111
|
// now remove the fields that are not expected fields
|
|
111
|
-
cleanedFields.
|
|
112
|
-
if (!constants_1.EXPECTED_FIELDS.includes(field.name)) {
|
|
113
|
-
cleanedFields.splice(index, 1);
|
|
114
|
-
}
|
|
115
|
-
});
|
|
112
|
+
const filteredFields = cleanedFields.filter((field) => constants_1.EXPECTED_FIELDS.includes(field.name));
|
|
116
113
|
// find the message field
|
|
117
|
-
const messageIndex =
|
|
114
|
+
const messageIndex = filteredFields.findIndex((field) => field.name.toLowerCase() === "message");
|
|
118
115
|
if (messageIndex > -1) {
|
|
119
116
|
// append data to the message field
|
|
120
117
|
// find HELP_TYPE
|
|
121
118
|
const helpTypeIndex = fields.findIndex((field) => field.name.toLowerCase() === "help_type");
|
|
122
119
|
if (helpTypeIndex > -1) {
|
|
123
|
-
|
|
124
|
-
//
|
|
120
|
+
filteredFields[messageIndex].value += `${delimiter}${fields[helpTypeIndex].value}`;
|
|
121
|
+
// filteredFields.splice(helpTypeIndex, 1);
|
|
125
122
|
}
|
|
126
123
|
const dateTimeIndex = fields.findIndex((field) => field.name.toLowerCase() === "datetime");
|
|
127
124
|
if (dateTimeIndex > -1) {
|
|
128
125
|
const date = new Date(fields[dateTimeIndex].value);
|
|
129
126
|
// we just want the date without time, like 2022-01-01
|
|
130
127
|
const dateString = date.toLocaleDateString();
|
|
131
|
-
|
|
132
|
-
//
|
|
128
|
+
filteredFields[messageIndex].value += `\nPreferred Date: ${dateString}`;
|
|
129
|
+
// filteredFields.splice(dateTimeIndex, 1);
|
|
133
130
|
}
|
|
134
131
|
const preferredTimeIndex = fields.findIndex((field) => field.name.toLowerCase() === "preferred_time");
|
|
135
132
|
if (preferredTimeIndex > -1) {
|
|
136
|
-
|
|
137
|
-
//
|
|
133
|
+
filteredFields[messageIndex].value += `\nPreferred Time: ${fields[preferredTimeIndex].value}`;
|
|
134
|
+
// filteredFields.splice(preferredTimeIndex, 1);
|
|
138
135
|
}
|
|
139
136
|
}
|
|
140
|
-
return
|
|
137
|
+
return filteredFields;
|
|
141
138
|
}
|
|
142
139
|
//# sourceMappingURL=util.js.map
|
package/lib/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;AAYA,kDA6CC;
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
|
-
"version": "1.
|
|
7
|
+
"version": "1.72.2",
|
|
8
8
|
"description": "Service to interface the Promio CRM service",
|
|
9
9
|
"types": "lib/index",
|
|
10
10
|
"main": "lib/index",
|
|
@@ -17,10 +17,12 @@
|
|
|
17
17
|
"devDependencies": {
|
|
18
18
|
"@types/chai": "5.2.3",
|
|
19
19
|
"@types/lodash": "4.17.20",
|
|
20
|
+
"@types/sinon": "4.3.3",
|
|
20
21
|
"@xapp/config": "0.2.3",
|
|
21
22
|
"chai": "4.5.0",
|
|
22
23
|
"dotenv": "17.2.3",
|
|
23
24
|
"mocha": "11.7.4",
|
|
25
|
+
"sinon": "21.0.0",
|
|
24
26
|
"stentor-logger": "1.66.30",
|
|
25
27
|
"stentor-models": "1.66.30",
|
|
26
28
|
"stentor-service-fetch": "1.66.30",
|
|
@@ -42,5 +44,5 @@
|
|
|
42
44
|
"test": "mocha --recursive -r ts-node/register \"./src/**/*.test.ts\"",
|
|
43
45
|
"test:f": "mocha --recursive -r ts-node/register \"./src/**/*.ftest.ts\""
|
|
44
46
|
},
|
|
45
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "1184c2fff325079d6b700c865cd79925be4be8a5"
|
|
46
48
|
}
|