@talkpilot/core-db 1.0.25 → 1.1.0
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 +3 -1
- package/dist/talkpilot/calls/calls.getters.d.ts +11 -1
- package/dist/talkpilot/calls/calls.getters.d.ts.map +1 -1
- package/dist/talkpilot/calls/calls.getters.js +50 -1
- package/dist/talkpilot/calls/calls.getters.js.map +1 -1
- package/dist/talkpilot/calls/calls.types.d.ts +8 -0
- package/dist/talkpilot/calls/calls.types.d.ts.map +1 -1
- package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts +15 -16
- package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts.map +1 -1
- package/dist/talkpilot/subscriptions/subscriptions.utils.d.ts +4 -0
- package/dist/talkpilot/subscriptions/subscriptions.utils.d.ts.map +1 -0
- package/dist/talkpilot/subscriptions/subscriptions.utils.js +20 -0
- package/dist/talkpilot/subscriptions/subscriptions.utils.js.map +1 -0
- package/package.json +1 -1
- package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -0
- package/src/talkpilot/calls/calls.getters.ts +58 -1
- package/src/talkpilot/calls/calls.types.ts +10 -0
- package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +35 -0
- package/src/talkpilot/clientsConfig/clientsConfig.types.ts +27 -17
package/README.md
CHANGED
|
@@ -147,5 +147,7 @@ MIT
|
|
|
147
147
|
|
|
148
148
|
- Added to Moked106Config this param: withNeedAttentionCalls
|
|
149
149
|
- withNeedAttentionCalls?: boolean
|
|
150
|
-
|
|
150
|
+
|
|
151
|
+
### 1.0.27
|
|
152
|
+
- Added an optional `language` field to `ClientConfig` (e.g. Hebrew/English/Russian/French/Spanish) and updated tests.
|
|
151
153
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Call, CallDoc, CallUpdateParams, CallQueryOptions } from '../index';
|
|
2
|
-
import type { CallsByHour } from './calls.types';
|
|
2
|
+
import type { CallsByHour, CountOpts, DateRange } from './calls.types';
|
|
3
3
|
import { ObjectId, Filter } from 'mongodb';
|
|
4
4
|
export declare const getCallsCollection: () => import("mongodb").Collection<Call>;
|
|
5
5
|
export declare const getCallByCallSid: (callSid: string) => Promise<import("mongodb").WithId<Call> | null>;
|
|
@@ -11,6 +11,16 @@ export declare const updateCallByCallSid: (callSid: string, updates: CallUpdateP
|
|
|
11
11
|
export declare const getCallsByClientAndDateRange: (clientId: string, startDate: Date, endDate: Date) => Promise<import("mongodb").WithId<Call>[]>;
|
|
12
12
|
export declare const findCallsByQuery: (query: Filter<Call>, options?: CallQueryOptions) => Promise<CallDoc[]>;
|
|
13
13
|
export declare const countCalls: (query: Filter<Call>) => Promise<number>;
|
|
14
|
+
export declare function countCallsByPhoneInRange(customerPhoneNumber: string, opts?: CountOpts, range?: DateRange): Promise<number>;
|
|
15
|
+
export declare const range: {
|
|
16
|
+
between: (since: Date, until: Date) => DateRange;
|
|
17
|
+
todayToNow: () => DateRange;
|
|
18
|
+
yesterday: () => DateRange;
|
|
19
|
+
todayFull: () => DateRange;
|
|
20
|
+
startOfDayToNow: (d: Date) => DateRange;
|
|
21
|
+
};
|
|
22
|
+
export declare function startOfDay(d?: Date): Date;
|
|
23
|
+
export declare function addDays(d: Date, days: number): Date;
|
|
14
24
|
/**
|
|
15
25
|
* Aggregate calls stats for a date range (createdAt in [startStr, endStr] in timezone).
|
|
16
26
|
* completed = agentHungUp=true or status='completed'.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calls.getters.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.getters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"calls.getters.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.getters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAI3C,eAAO,MAAM,kBAAkB,0CAE9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,mDAE/C,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,aAAa,MAAM,8CAExD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,8CAEhD,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,QAAQ,QAAQ,8CAE9C,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,MAAM,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,KAAK,CAAC,qDAOhF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,SAAS,MAAM,EACf,SAAS,gBAAgB,KACxB,OAAO,CAAC,OAAO,GAAG,IAAI,CAaxB,CAAC;AAIF,eAAO,MAAM,4BAA4B,GAAI,UAAU,MAAM,EAAE,WAAW,IAAI,EAAE,SAAS,IAAI,8CAU5F,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,EACnB,UAAU,gBAAgB,KACzB,OAAO,CAAC,OAAO,EAAE,CAGnB,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,OAAO,MAAM,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,MAAM,CAEpE,CAAC;AAEF,wBAAsB,wBAAwB,CAC5C,mBAAmB,EAAE,MAAM,EAC3B,IAAI,GAAE,SAAc,EACpB,KAAK,GAAE,SAAc,GACpB,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED,eAAO,MAAM,KAAK;qBACC,IAAI,SAAS,IAAI,KAAG,SAAS;sBAC9B,SAAS;qBACV,SAAS;qBAKT,SAAS;yBAKH,IAAI,KAAG,SAAS;CAItC,CAAC;AAEF,wBAAgB,UAAU,CAAC,CAAC,GAAE,IAAiB,GAAG,IAAI,CAIrD;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAInD;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAmCjE;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,EAAE,CAAC,CA4BxB"}
|
|
@@ -33,7 +33,10 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.countCalls = exports.findCallsByQuery = exports.getCallsByClientAndDateRange = exports.updateCallByCallSid = exports.createCallDoc = exports.getCallsByFlow = exports.getCallsByClient = exports.getCallsByPhoneNumber = exports.getCallByCallSid = exports.getCallsCollection = void 0;
|
|
36
|
+
exports.range = exports.countCalls = exports.findCallsByQuery = exports.getCallsByClientAndDateRange = exports.updateCallByCallSid = exports.createCallDoc = exports.getCallsByFlow = exports.getCallsByClient = exports.getCallsByPhoneNumber = exports.getCallByCallSid = exports.getCallsCollection = void 0;
|
|
37
|
+
exports.countCallsByPhoneInRange = countCallsByPhoneInRange;
|
|
38
|
+
exports.startOfDay = startOfDay;
|
|
39
|
+
exports.addDays = addDays;
|
|
37
40
|
exports.getCallsStatsForDateRange = getCallsStatsForDateRange;
|
|
38
41
|
exports.getCallsHourlyAggregation = getCallsHourlyAggregation;
|
|
39
42
|
const index_1 = require("../index");
|
|
@@ -101,6 +104,52 @@ const countCalls = async (query) => {
|
|
|
101
104
|
return (0, exports.getCallsCollection)().countDocuments(query);
|
|
102
105
|
};
|
|
103
106
|
exports.countCalls = countCalls;
|
|
107
|
+
async function countCallsByPhoneInRange(customerPhoneNumber, opts = {}, range = {}) {
|
|
108
|
+
const filter = {
|
|
109
|
+
customerPhoneNumber,
|
|
110
|
+
};
|
|
111
|
+
if (opts.isOutgoingCall !== undefined) {
|
|
112
|
+
filter.isOutgoingCall = opts.isOutgoingCall;
|
|
113
|
+
}
|
|
114
|
+
if (opts.isIncomingCall !== undefined) {
|
|
115
|
+
filter.isIncomingCall = opts.isIncomingCall;
|
|
116
|
+
}
|
|
117
|
+
if (range.since || range.until) {
|
|
118
|
+
filter.createdAt = {
|
|
119
|
+
...(range.since ? { $gte: range.since } : {}),
|
|
120
|
+
...(range.until ? { $lt: range.until } : {}),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return (0, exports.getCallsCollection)().countDocuments(filter);
|
|
124
|
+
}
|
|
125
|
+
exports.range = {
|
|
126
|
+
between: (since, until) => ({ since, until }),
|
|
127
|
+
todayToNow: () => ({ since: startOfDay(), until: new Date() }),
|
|
128
|
+
yesterday: () => {
|
|
129
|
+
const s = startOfDay(addDays(new Date(), -1));
|
|
130
|
+
const e = addDays(s, 1);
|
|
131
|
+
return { since: s, until: e };
|
|
132
|
+
},
|
|
133
|
+
todayFull: () => {
|
|
134
|
+
const s = startOfDay();
|
|
135
|
+
const e = addDays(s, 1);
|
|
136
|
+
return { since: s, until: e };
|
|
137
|
+
},
|
|
138
|
+
startOfDayToNow: (d) => ({
|
|
139
|
+
since: startOfDay(d),
|
|
140
|
+
until: new Date(),
|
|
141
|
+
}),
|
|
142
|
+
};
|
|
143
|
+
function startOfDay(d = new Date()) {
|
|
144
|
+
const x = new Date(d);
|
|
145
|
+
x.setHours(0, 0, 0, 0);
|
|
146
|
+
return x;
|
|
147
|
+
}
|
|
148
|
+
function addDays(d, days) {
|
|
149
|
+
const x = new Date(d);
|
|
150
|
+
x.setDate(x.getDate() + days);
|
|
151
|
+
return x;
|
|
152
|
+
}
|
|
104
153
|
/**
|
|
105
154
|
* Aggregate calls stats for a date range (createdAt in [startStr, endStr] in timezone).
|
|
106
155
|
* completed = agentHungUp=true or status='completed'.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calls.getters.js","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.getters.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"calls.getters.js","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.getters.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,4 +59,12 @@ export type CallsByHour = {
|
|
|
59
59
|
hour: string;
|
|
60
60
|
calls: number;
|
|
61
61
|
};
|
|
62
|
+
export type CountOpts = {
|
|
63
|
+
isOutgoingCall?: boolean;
|
|
64
|
+
isIncomingCall?: boolean;
|
|
65
|
+
};
|
|
66
|
+
export type DateRange = {
|
|
67
|
+
since?: Date;
|
|
68
|
+
until?: Date;
|
|
69
|
+
};
|
|
62
70
|
//# sourceMappingURL=calls.types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calls.types.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"calls.types.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/calls/calls.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
import { WithId } from 'mongodb';
|
|
2
|
-
/**
|
|
3
|
-
* Configuration for initiating a call for short SLA
|
|
4
|
-
*/
|
|
5
2
|
export type InitiateCallForShortSlaConfig = {
|
|
6
3
|
active: boolean;
|
|
7
4
|
max_hours: number;
|
|
@@ -11,18 +8,12 @@ export type InitiateCallForShortSlaConfig = {
|
|
|
11
8
|
}[];
|
|
12
9
|
flow_id?: string | string[];
|
|
13
10
|
};
|
|
14
|
-
/**
|
|
15
|
-
* Moked 106 configuration structure
|
|
16
|
-
*/
|
|
17
11
|
export type Moked106Config = {
|
|
18
12
|
initiate_call_for_short_sla?: InitiateCallForShortSlaConfig;
|
|
19
13
|
avoidSaveTickets?: boolean;
|
|
20
14
|
withUploadImagesSms?: boolean;
|
|
21
15
|
withNeedAttentionCalls?: boolean;
|
|
22
16
|
};
|
|
23
|
-
/**
|
|
24
|
-
* Municipal products structure
|
|
25
|
-
*/
|
|
26
17
|
export type MunicipalProduct = {
|
|
27
18
|
moked_106?: Moked106Config;
|
|
28
19
|
cityName: string;
|
|
@@ -34,22 +25,30 @@ export type MunicipalProduct = {
|
|
|
34
25
|
isProductionReady?: boolean;
|
|
35
26
|
municipalDisplayName?: string;
|
|
36
27
|
};
|
|
37
|
-
/**
|
|
38
|
-
* Products structure
|
|
39
|
-
*/
|
|
40
28
|
export type Products = {
|
|
41
29
|
municipal?: MunicipalProduct;
|
|
42
30
|
[key: string]: unknown;
|
|
43
31
|
};
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
32
|
+
export type ClientLanguageName = 'Hebrew' | 'English' | 'Russian' | 'French' | 'Spanish' | (string & {});
|
|
33
|
+
export type SendGridConfig = {
|
|
34
|
+
emailTo: string[];
|
|
35
|
+
templateId?: string;
|
|
36
|
+
senderId?: string;
|
|
37
|
+
};
|
|
38
|
+
export type SmsConfig = {};
|
|
39
|
+
export type WhatsappConfig = {};
|
|
40
|
+
export type CommunicationsConfig = {
|
|
41
|
+
sendGrid?: SendGridConfig;
|
|
42
|
+
sms: SmsConfig;
|
|
43
|
+
whatsapp: WhatsappConfig;
|
|
44
|
+
};
|
|
48
45
|
export type ClientConfig<P extends Products = Products> = {
|
|
49
46
|
clientId: string;
|
|
50
47
|
phoneNumber?: string;
|
|
48
|
+
language?: ClientLanguageName;
|
|
51
49
|
products: P;
|
|
52
50
|
timezone?: string;
|
|
51
|
+
communications?: CommunicationsConfig;
|
|
53
52
|
};
|
|
54
53
|
export type ClientConfigDoc<P extends Products = Products> = WithId<ClientConfig<P>>;
|
|
55
54
|
//# sourceMappingURL=clientsConfig.types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clientsConfig.types.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/clientsConfig/clientsConfig.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC
|
|
1
|
+
{"version":3,"file":"clientsConfig.types.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/clientsConfig/clientsConfig.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACnD,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,2BAA2B,CAAC,EAAE,6BAA6B,CAAC;IAC5D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,QAAQ,GACR,SAAS,GACT,SAAS,GACT,QAAQ,GACR,SAAS,GACT,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,EAAE,CAAC;AAE3B,MAAM,MAAM,cAAc,GAAG,EAAE,CAAC;AAEhC,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,GAAG,EAAE,SAAS,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,IAAI;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriptions.utils.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/subscriptions/subscriptions.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,MAAM,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAA6B,MAAM,UAAU,CAAC;AAE7F,eAAO,MAAM,gBAAgB,GAAI,QAAQ,wBAAwB,KAAG,MAAM,CAAC,YAAY,CAetF,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildSimpleQuery = void 0;
|
|
4
|
+
const mongodb_1 = require("mongodb");
|
|
5
|
+
const index_1 = require("../index");
|
|
6
|
+
const buildSimpleQuery = (filter) => {
|
|
7
|
+
const query = {};
|
|
8
|
+
if (filter._id) {
|
|
9
|
+
query._id = new mongodb_1.ObjectId(filter._id);
|
|
10
|
+
}
|
|
11
|
+
index_1.simpleFields.forEach((field) => {
|
|
12
|
+
const val = filter[field];
|
|
13
|
+
if (val !== undefined) {
|
|
14
|
+
query[field] = val;
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
return query;
|
|
18
|
+
};
|
|
19
|
+
exports.buildSimpleQuery = buildSimpleQuery;
|
|
20
|
+
//# sourceMappingURL=subscriptions.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriptions.utils.js","sourceRoot":"","sources":["../../../src/talkpilot/subscriptions/subscriptions.utils.ts"],"names":[],"mappings":";;;AAAA,qCAA2C;AAC3C,oCAA6F;AAEtF,MAAM,gBAAgB,GAAG,CAAC,MAAgC,EAAwB,EAAE;IACzF,MAAM,KAAK,GAAyB,EAAE,CAAC;IAEvC,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,KAAK,CAAC,GAAG,GAAG,IAAI,kBAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,oBAAY,CAAC,OAAO,CAAC,CAAC,KAAkB,EAAE,EAAE;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,KAAK,CAAC,KAAK,CAAC,GAAG,GAAU,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAfW,QAAA,gBAAgB,oBAe3B"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import {
|
|
2
|
+
addDays,
|
|
3
|
+
countCallsByPhoneInRange,
|
|
4
|
+
range,
|
|
5
|
+
startOfDay,
|
|
6
|
+
getCallsCollection,
|
|
7
|
+
} from '../calls.getters';
|
|
8
|
+
import { createIncomingCallDoc, createOutGoingCallDoc } from '../../../test-utils/factories';
|
|
9
|
+
|
|
10
|
+
describe('callStats.utils', () => {
|
|
11
|
+
describe('countCallsByPhoneInRange', () => {
|
|
12
|
+
it('counts outgoing calls for a phone within a date range', async () => {
|
|
13
|
+
const phone = '+972500000001';
|
|
14
|
+
const baseDate = new Date('2023-01-10T10:00:00Z');
|
|
15
|
+
|
|
16
|
+
const outgoingInside = createOutGoingCallDoc({
|
|
17
|
+
customerPhoneNumber: phone,
|
|
18
|
+
createdAt: addDays(baseDate, 0),
|
|
19
|
+
});
|
|
20
|
+
const outgoingOutsideBefore = createOutGoingCallDoc({
|
|
21
|
+
customerPhoneNumber: phone,
|
|
22
|
+
createdAt: addDays(baseDate, -2),
|
|
23
|
+
});
|
|
24
|
+
const outgoingOutsideAfter = createOutGoingCallDoc({
|
|
25
|
+
customerPhoneNumber: phone,
|
|
26
|
+
createdAt: addDays(baseDate, 2),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
await getCallsCollection().insertMany([
|
|
30
|
+
{ ...outgoingInside, updatedAt: outgoingInside.createdAt, env: 'test' },
|
|
31
|
+
{
|
|
32
|
+
...outgoingOutsideBefore,
|
|
33
|
+
updatedAt: outgoingOutsideBefore.createdAt,
|
|
34
|
+
env: 'test',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
...outgoingOutsideAfter,
|
|
38
|
+
updatedAt: outgoingOutsideAfter.createdAt,
|
|
39
|
+
env: 'test',
|
|
40
|
+
},
|
|
41
|
+
]);
|
|
42
|
+
|
|
43
|
+
const since = addDays(baseDate, -1);
|
|
44
|
+
const until = addDays(baseDate, 1);
|
|
45
|
+
|
|
46
|
+
const count = await countCallsByPhoneInRange(
|
|
47
|
+
phone,
|
|
48
|
+
{ isOutgoingCall: true },
|
|
49
|
+
{ since, until },
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
expect(count).toBe(1);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('filters by incoming/outgoing flags', async () => {
|
|
56
|
+
const phone = '+972500000002';
|
|
57
|
+
const createdAt = new Date('2023-02-01T12:00:00Z');
|
|
58
|
+
|
|
59
|
+
const outgoing = createOutGoingCallDoc({
|
|
60
|
+
customerPhoneNumber: phone,
|
|
61
|
+
createdAt,
|
|
62
|
+
});
|
|
63
|
+
const incoming = createIncomingCallDoc({
|
|
64
|
+
customerPhoneNumber: phone,
|
|
65
|
+
createdAt,
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
await getCallsCollection().insertMany([
|
|
69
|
+
{ ...outgoing, updatedAt: outgoing.createdAt, env: 'test' },
|
|
70
|
+
{ ...incoming, updatedAt: incoming.createdAt, env: 'test' },
|
|
71
|
+
]);
|
|
72
|
+
|
|
73
|
+
const outgoingCount = await countCallsByPhoneInRange(
|
|
74
|
+
phone,
|
|
75
|
+
{ isOutgoingCall: true },
|
|
76
|
+
range.between(addDays(createdAt, -1), addDays(createdAt, 1)),
|
|
77
|
+
);
|
|
78
|
+
const incomingCount = await countCallsByPhoneInRange(
|
|
79
|
+
phone,
|
|
80
|
+
{ isIncomingCall: true },
|
|
81
|
+
range.between(addDays(createdAt, -1), addDays(createdAt, 1)),
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
expect(outgoingCount).toBe(1);
|
|
85
|
+
expect(incomingCount).toBe(1);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
describe('date helpers', () => {
|
|
90
|
+
it('startOfDay normalizes to midnight', () => {
|
|
91
|
+
const d = new Date('2023-03-10T15:30:45.000Z');
|
|
92
|
+
const s = startOfDay(d);
|
|
93
|
+
expect(s.getUTCHours()).toBe(0);
|
|
94
|
+
expect(s.getUTCMinutes()).toBe(0);
|
|
95
|
+
expect(s.getUTCSeconds()).toBe(0);
|
|
96
|
+
expect(s.getUTCMilliseconds()).toBe(0);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('addDays shifts the date by given days', () => {
|
|
100
|
+
const d = new Date('2023-03-10T00:00:00.000Z');
|
|
101
|
+
expect(addDays(d, 1).getUTCDate()).toBe(11);
|
|
102
|
+
expect(addDays(d, -1).getUTCDate()).toBe(9);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('range helpers produce expected bounds', () => {
|
|
106
|
+
const base = new Date('2023-03-15T10:00:00.000Z');
|
|
107
|
+
|
|
108
|
+
const betweenRange = range.between(
|
|
109
|
+
addDays(base, -1),
|
|
110
|
+
addDays(base, 1),
|
|
111
|
+
);
|
|
112
|
+
expect(betweenRange.since).toEqual(addDays(base, -1));
|
|
113
|
+
expect(betweenRange.until).toEqual(addDays(base, 1));
|
|
114
|
+
|
|
115
|
+
const yesterdayRange = range.yesterday();
|
|
116
|
+
expect(yesterdayRange.since).toBeInstanceOf(Date);
|
|
117
|
+
expect(yesterdayRange.until).toBeInstanceOf(Date);
|
|
118
|
+
|
|
119
|
+
const todayFullRange = range.todayFull();
|
|
120
|
+
expect(todayFullRange.since).toBeInstanceOf(Date);
|
|
121
|
+
expect(todayFullRange.until).toBeInstanceOf(Date);
|
|
122
|
+
|
|
123
|
+
const startToNowRange = range.startOfDayToNow(base);
|
|
124
|
+
expect(startToNowRange.since).toEqual(startOfDay(base));
|
|
125
|
+
expect(startToNowRange.until).toBeInstanceOf(Date);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
})
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getDb, Call, CallDoc, CallUpdateParams, CallQueryOptions } from '../index';
|
|
2
|
-
import type { CallsByHour } from './calls.types';
|
|
2
|
+
import type { CallsByHour, CountOpts, DateRange } from './calls.types';
|
|
3
3
|
import { ObjectId, Filter } from 'mongodb';
|
|
4
4
|
import * as process from 'node:process';
|
|
5
5
|
import { applyQueryOptions } from '../utils/query.utils';
|
|
@@ -77,6 +77,63 @@ export const countCalls = async (query: Filter<Call>): Promise<number> => {
|
|
|
77
77
|
return getCallsCollection().countDocuments(query);
|
|
78
78
|
};
|
|
79
79
|
|
|
80
|
+
export async function countCallsByPhoneInRange(
|
|
81
|
+
customerPhoneNumber: string,
|
|
82
|
+
opts: CountOpts = {},
|
|
83
|
+
range: DateRange = {},
|
|
84
|
+
): Promise<number> {
|
|
85
|
+
const filter: Partial<Call> & { customerPhoneNumber: string } = {
|
|
86
|
+
customerPhoneNumber,
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
if (opts.isOutgoingCall !== undefined) {
|
|
90
|
+
filter.isOutgoingCall = opts.isOutgoingCall;
|
|
91
|
+
}
|
|
92
|
+
if (opts.isIncomingCall !== undefined) {
|
|
93
|
+
filter.isIncomingCall = opts.isIncomingCall;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (range.since || range.until) {
|
|
97
|
+
(filter as Filter<Call>).createdAt = {
|
|
98
|
+
...(range.since ? { $gte: range.since } : {}),
|
|
99
|
+
...(range.until ? { $lt: range.until } : {}),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return getCallsCollection().countDocuments(filter as Filter<Call>);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export const range = {
|
|
107
|
+
between: (since: Date, until: Date): DateRange => ({ since, until }),
|
|
108
|
+
todayToNow: (): DateRange => ({ since: startOfDay(), until: new Date() }),
|
|
109
|
+
yesterday: (): DateRange => {
|
|
110
|
+
const s = startOfDay(addDays(new Date(), -1));
|
|
111
|
+
const e = addDays(s, 1);
|
|
112
|
+
return { since: s, until: e };
|
|
113
|
+
},
|
|
114
|
+
todayFull: (): DateRange => {
|
|
115
|
+
const s = startOfDay();
|
|
116
|
+
const e = addDays(s, 1);
|
|
117
|
+
return { since: s, until: e };
|
|
118
|
+
},
|
|
119
|
+
startOfDayToNow: (d: Date): DateRange => ({
|
|
120
|
+
since: startOfDay(d),
|
|
121
|
+
until: new Date(),
|
|
122
|
+
}),
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
export function startOfDay(d: Date = new Date()): Date {
|
|
126
|
+
const x = new Date(d);
|
|
127
|
+
x.setHours(0, 0, 0, 0);
|
|
128
|
+
return x;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function addDays(d: Date, days: number): Date {
|
|
132
|
+
const x = new Date(d);
|
|
133
|
+
x.setDate(x.getDate() + days);
|
|
134
|
+
return x;
|
|
135
|
+
}
|
|
136
|
+
|
|
80
137
|
/**
|
|
81
138
|
* Aggregate calls stats for a date range (createdAt in [startStr, endStr] in timezone).
|
|
82
139
|
* completed = agentHungUp=true or status='completed'.
|
|
@@ -80,3 +80,13 @@ export type CallUpdateParams = Partial<Omit<Call, ImmutableCallFields>>;
|
|
|
80
80
|
export type CallDoc = WithId<Call>;
|
|
81
81
|
|
|
82
82
|
export type CallsByHour = { hour: string; calls: number };
|
|
83
|
+
|
|
84
|
+
export type CountOpts = {
|
|
85
|
+
isOutgoingCall?: boolean;
|
|
86
|
+
isIncomingCall?: boolean;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export type DateRange = {
|
|
90
|
+
since?: Date;
|
|
91
|
+
until?: Date;
|
|
92
|
+
};
|
|
@@ -7,6 +7,7 @@ describe('db.clientsConfig', () => {
|
|
|
7
7
|
const clientId = 'test-client-id';
|
|
8
8
|
const clientConfig = createClientConfig({
|
|
9
9
|
clientId,
|
|
10
|
+
language: 'Hebrew',
|
|
10
11
|
products: { feature1: true, feature2: false } as any,
|
|
11
12
|
});
|
|
12
13
|
|
|
@@ -16,6 +17,7 @@ describe('db.clientsConfig', () => {
|
|
|
16
17
|
|
|
17
18
|
expect(result).toMatchObject({
|
|
18
19
|
clientId,
|
|
20
|
+
language: 'Hebrew',
|
|
19
21
|
products: { feature1: true, feature2: false },
|
|
20
22
|
});
|
|
21
23
|
});
|
|
@@ -24,5 +26,38 @@ describe('db.clientsConfig', () => {
|
|
|
24
26
|
const result = await getClientConfig('non-existent-client');
|
|
25
27
|
expect(result).toBeNull();
|
|
26
28
|
});
|
|
29
|
+
|
|
30
|
+
it('should support communications config', async () => {
|
|
31
|
+
const clientId = 'communications-test';
|
|
32
|
+
const clientConfig = createClientConfig({
|
|
33
|
+
clientId,
|
|
34
|
+
communications: {
|
|
35
|
+
sendGrid: {
|
|
36
|
+
emailTo: ['test@example.com'],
|
|
37
|
+
templateId: 'temp-123',
|
|
38
|
+
senderId: 'sender-123',
|
|
39
|
+
},
|
|
40
|
+
sms: {},
|
|
41
|
+
whatsapp: {},
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
await createClientConfigDoc(clientConfig);
|
|
46
|
+
|
|
47
|
+
const result = await getClientConfig(clientId);
|
|
48
|
+
|
|
49
|
+
expect(result).toMatchObject({
|
|
50
|
+
clientId,
|
|
51
|
+
communications: {
|
|
52
|
+
sendGrid: {
|
|
53
|
+
emailTo: ['test@example.com'],
|
|
54
|
+
templateId: 'temp-123',
|
|
55
|
+
senderId: 'sender-123',
|
|
56
|
+
},
|
|
57
|
+
sms: {},
|
|
58
|
+
whatsapp: {},
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
});
|
|
27
62
|
});
|
|
28
63
|
});
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { WithId } from 'mongodb';
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* Configuration for initiating a call for short SLA
|
|
5
|
-
*/
|
|
6
3
|
export type InitiateCallForShortSlaConfig = {
|
|
7
4
|
active: boolean;
|
|
8
5
|
max_hours: number;
|
|
@@ -10,9 +7,6 @@ export type InitiateCallForShortSlaConfig = {
|
|
|
10
7
|
flow_id?: string | string[];
|
|
11
8
|
};
|
|
12
9
|
|
|
13
|
-
/**
|
|
14
|
-
* Moked 106 configuration structure
|
|
15
|
-
*/
|
|
16
10
|
export type Moked106Config = {
|
|
17
11
|
initiate_call_for_short_sla?: InitiateCallForShortSlaConfig;
|
|
18
12
|
avoidSaveTickets?: boolean;
|
|
@@ -20,9 +14,6 @@ export type Moked106Config = {
|
|
|
20
14
|
withNeedAttentionCalls?: boolean;
|
|
21
15
|
};
|
|
22
16
|
|
|
23
|
-
/**
|
|
24
|
-
* Municipal products structure
|
|
25
|
-
*/
|
|
26
17
|
export type MunicipalProduct = {
|
|
27
18
|
moked_106?: Moked106Config;
|
|
28
19
|
cityName: string;
|
|
@@ -35,23 +26,42 @@ export type MunicipalProduct = {
|
|
|
35
26
|
municipalDisplayName?: string;
|
|
36
27
|
};
|
|
37
28
|
|
|
38
|
-
/**
|
|
39
|
-
* Products structure
|
|
40
|
-
*/
|
|
41
29
|
export type Products = {
|
|
42
30
|
municipal?: MunicipalProduct;
|
|
43
|
-
[key: string]: unknown;
|
|
31
|
+
[key: string]: unknown;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export type ClientLanguageName =
|
|
35
|
+
| 'Hebrew'
|
|
36
|
+
| 'English'
|
|
37
|
+
| 'Russian'
|
|
38
|
+
| 'French'
|
|
39
|
+
| 'Spanish'
|
|
40
|
+
| (string & {});
|
|
41
|
+
|
|
42
|
+
export type SendGridConfig = {
|
|
43
|
+
emailTo: string[];
|
|
44
|
+
templateId?: string;
|
|
45
|
+
senderId?: string;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export type SmsConfig = {};
|
|
49
|
+
|
|
50
|
+
export type WhatsappConfig = {};
|
|
51
|
+
|
|
52
|
+
export type CommunicationsConfig = {
|
|
53
|
+
sendGrid?: SendGridConfig;
|
|
54
|
+
sms: SmsConfig;
|
|
55
|
+
whatsapp: WhatsappConfig;
|
|
44
56
|
};
|
|
45
57
|
|
|
46
|
-
/**
|
|
47
|
-
* Client configuration type
|
|
48
|
-
* @template P - Products type (defaults to Products for type safety)
|
|
49
|
-
*/
|
|
50
58
|
export type ClientConfig<P extends Products = Products> = {
|
|
51
59
|
clientId: string;
|
|
52
60
|
phoneNumber?: string;
|
|
61
|
+
language?: ClientLanguageName;
|
|
53
62
|
products: P;
|
|
54
63
|
timezone?: string;
|
|
64
|
+
communications?: CommunicationsConfig;
|
|
55
65
|
};
|
|
56
66
|
|
|
57
67
|
export type ClientConfigDoc<P extends Products = Products> = WithId<ClientConfig<P>>;
|