@blackcode_sa/metaestetics-api 1.13.0 → 1.13.1
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/dist/admin/index.d.mts +106 -1
- package/dist/admin/index.d.ts +106 -1
- package/dist/admin/index.js +1303 -130
- package/dist/admin/index.mjs +1303 -130
- package/dist/index.d.mts +326 -2
- package/dist/index.d.ts +326 -2
- package/dist/index.js +3188 -1888
- package/dist/index.mjs +2909 -1610
- package/package.json +1 -1
- package/src/services/analytics/README.md +17 -0
- package/src/services/analytics/TRENDS.md +380 -0
- package/src/services/analytics/analytics.service.ts +540 -30
- package/src/services/analytics/index.ts +1 -0
- package/src/services/analytics/review-analytics.service.ts +941 -0
- package/src/services/analytics/utils/cost-calculation.utils.ts +32 -4
- package/src/services/analytics/utils/grouping.utils.ts +40 -0
- package/src/services/analytics/utils/trend-calculation.utils.ts +200 -0
- package/src/services/appointment/appointment.service.ts +9 -0
- package/src/services/procedure/procedure.service.ts +117 -4
- package/src/services/reviews/reviews.service.ts +58 -7
- package/src/types/analytics/analytics.types.ts +98 -1
- package/src/types/analytics/grouped-analytics.types.ts +25 -0
|
@@ -32,6 +32,11 @@ export interface AnalyticsFilters {
|
|
|
32
32
|
*/
|
|
33
33
|
export type GroupingPeriod = 'day' | 'week' | 'month';
|
|
34
34
|
|
|
35
|
+
/**
|
|
36
|
+
* Trend period type (only predefined periods, no custom)
|
|
37
|
+
*/
|
|
38
|
+
export type TrendPeriod = 'week' | 'month' | 'quarter' | 'year';
|
|
39
|
+
|
|
35
40
|
/**
|
|
36
41
|
* Entity type for grouping analytics
|
|
37
42
|
*/
|
|
@@ -143,6 +148,9 @@ export interface CancellationMetrics {
|
|
|
143
148
|
count: number;
|
|
144
149
|
percentage: number;
|
|
145
150
|
}>;
|
|
151
|
+
// Practitioner info when grouping by procedure
|
|
152
|
+
practitionerId?: string;
|
|
153
|
+
practitionerName?: string;
|
|
146
154
|
}
|
|
147
155
|
|
|
148
156
|
/**
|
|
@@ -156,6 +164,9 @@ export interface NoShowMetrics {
|
|
|
156
164
|
totalAppointments: number;
|
|
157
165
|
noShowAppointments: number;
|
|
158
166
|
noShowRate: number; // percentage
|
|
167
|
+
// Practitioner info when grouping by procedure
|
|
168
|
+
practitionerId?: string;
|
|
169
|
+
practitionerName?: string;
|
|
159
170
|
}
|
|
160
171
|
|
|
161
172
|
/**
|
|
@@ -181,12 +192,20 @@ export interface RevenueMetrics {
|
|
|
181
192
|
* Revenue data over time
|
|
182
193
|
*/
|
|
183
194
|
export interface RevenueTrend {
|
|
184
|
-
period: string; // e.g., "2024-
|
|
195
|
+
period: string; // e.g., "2024-W01", "2024-01", "2024-Q1", "2024"
|
|
185
196
|
startDate: Date;
|
|
186
197
|
endDate: Date;
|
|
187
198
|
revenue: number;
|
|
188
199
|
appointmentCount: number;
|
|
189
200
|
averageRevenue: number;
|
|
201
|
+
currency?: string;
|
|
202
|
+
// Trend comparison (compared to previous period)
|
|
203
|
+
previousPeriod?: {
|
|
204
|
+
revenue: number;
|
|
205
|
+
appointmentCount: number;
|
|
206
|
+
percentageChange: number;
|
|
207
|
+
direction: 'up' | 'down' | 'stable';
|
|
208
|
+
};
|
|
190
209
|
}
|
|
191
210
|
|
|
192
211
|
/**
|
|
@@ -201,6 +220,84 @@ export interface DurationTrend {
|
|
|
201
220
|
averageActualDuration: number; // minutes
|
|
202
221
|
averageEfficiency: number; // percentage
|
|
203
222
|
appointmentCount: number;
|
|
223
|
+
// Trend comparison (compared to previous period)
|
|
224
|
+
previousPeriod?: {
|
|
225
|
+
averageBookedDuration: number;
|
|
226
|
+
averageActualDuration: number;
|
|
227
|
+
averageEfficiency: number;
|
|
228
|
+
efficiencyPercentageChange: number;
|
|
229
|
+
direction: 'up' | 'down' | 'stable';
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Appointment Count Trend
|
|
235
|
+
* Appointment count trends over time
|
|
236
|
+
*/
|
|
237
|
+
export interface AppointmentTrend {
|
|
238
|
+
period: string;
|
|
239
|
+
startDate: Date;
|
|
240
|
+
endDate: Date;
|
|
241
|
+
totalAppointments: number;
|
|
242
|
+
completedAppointments: number;
|
|
243
|
+
canceledAppointments: number;
|
|
244
|
+
noShowAppointments: number;
|
|
245
|
+
pendingAppointments: number;
|
|
246
|
+
confirmedAppointments: number;
|
|
247
|
+
// Trend comparison (compared to previous period)
|
|
248
|
+
previousPeriod?: {
|
|
249
|
+
totalAppointments: number;
|
|
250
|
+
completedAppointments: number;
|
|
251
|
+
percentageChange: number;
|
|
252
|
+
direction: 'up' | 'down' | 'stable';
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Cancellation Rate Trend
|
|
258
|
+
* Cancellation and no-show rate trends over time
|
|
259
|
+
*/
|
|
260
|
+
export interface CancellationRateTrend {
|
|
261
|
+
period: string;
|
|
262
|
+
startDate: Date;
|
|
263
|
+
endDate: Date;
|
|
264
|
+
cancellationRate: number; // percentage
|
|
265
|
+
noShowRate: number; // percentage
|
|
266
|
+
totalAppointments: number;
|
|
267
|
+
canceledAppointments: number;
|
|
268
|
+
noShowAppointments: number;
|
|
269
|
+
// Trend comparison (compared to previous period)
|
|
270
|
+
previousPeriod?: {
|
|
271
|
+
cancellationRate: number;
|
|
272
|
+
noShowRate: number;
|
|
273
|
+
cancellationRateChange: number;
|
|
274
|
+
noShowRateChange: number;
|
|
275
|
+
direction: 'up' | 'down' | 'stable';
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Review Trend
|
|
281
|
+
* Review rating and recommendation trends over time
|
|
282
|
+
*/
|
|
283
|
+
export interface ReviewTrend {
|
|
284
|
+
period: string; // e.g., "2024-W01", "2024-01", "2024-Q1", "2024"
|
|
285
|
+
startDate: Date;
|
|
286
|
+
endDate: Date;
|
|
287
|
+
averageRating: number; // weighted average rating (0-5)
|
|
288
|
+
recommendationRate: number; // percentage
|
|
289
|
+
totalReviews: number;
|
|
290
|
+
practitionerAverage?: number; // if tracking practitioner reviews
|
|
291
|
+
procedureAverage?: number; // if tracking procedure reviews
|
|
292
|
+
// Trend comparison (compared to previous period)
|
|
293
|
+
previousPeriod?: {
|
|
294
|
+
averageRating: number;
|
|
295
|
+
recommendationRate: number;
|
|
296
|
+
percentageChange: number; // for average rating
|
|
297
|
+
direction: 'up' | 'down' | 'stable';
|
|
298
|
+
};
|
|
299
|
+
entityId?: string; // if grouped by entity
|
|
300
|
+
entityName?: string;
|
|
204
301
|
}
|
|
205
302
|
|
|
206
303
|
/**
|
|
@@ -10,6 +10,20 @@ export interface GroupedAnalyticsBase {
|
|
|
10
10
|
entityType: EntityType;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Review metrics for grouped analytics
|
|
15
|
+
* Note: This is a simplified version for grouped analytics.
|
|
16
|
+
* For full review analytics, see ReviewAnalyticsService.ReviewMetrics
|
|
17
|
+
*/
|
|
18
|
+
export interface ReviewMetrics {
|
|
19
|
+
totalReviews: number;
|
|
20
|
+
averageRating: number;
|
|
21
|
+
recommendationRate: number; // % that would recommend
|
|
22
|
+
// Comparison to overall average
|
|
23
|
+
ratingDifference?: number; // Positive = above average, negative = below
|
|
24
|
+
recommendationDifference?: number; // % difference
|
|
25
|
+
}
|
|
26
|
+
|
|
13
27
|
/**
|
|
14
28
|
* Grouped Revenue Metrics
|
|
15
29
|
* Revenue analytics grouped by clinic, practitioner, procedure, or patient
|
|
@@ -24,6 +38,11 @@ export interface GroupedRevenueMetrics extends GroupedAnalyticsBase {
|
|
|
24
38
|
refundedRevenue: number;
|
|
25
39
|
totalTax: number;
|
|
26
40
|
totalSubtotal: number;
|
|
41
|
+
// Practitioner info when grouping by procedure
|
|
42
|
+
practitionerId?: string;
|
|
43
|
+
practitionerName?: string;
|
|
44
|
+
// Review metrics (optional)
|
|
45
|
+
reviewMetrics?: ReviewMetrics;
|
|
27
46
|
}
|
|
28
47
|
|
|
29
48
|
/**
|
|
@@ -44,6 +63,9 @@ export interface GroupedProductUsageMetrics extends GroupedAnalyticsBase {
|
|
|
44
63
|
totalRevenue: number;
|
|
45
64
|
usageCount: number;
|
|
46
65
|
}>;
|
|
66
|
+
// Practitioner info when grouping by procedure
|
|
67
|
+
practitionerId?: string;
|
|
68
|
+
practitionerName?: string;
|
|
47
69
|
}
|
|
48
70
|
|
|
49
71
|
/**
|
|
@@ -77,6 +99,9 @@ export interface GroupedTimeEfficiencyMetrics extends GroupedAnalyticsBase {
|
|
|
77
99
|
totalUnderutilization: number; // minutes
|
|
78
100
|
averageOverrun: number; // minutes
|
|
79
101
|
averageUnderutilization: number; // minutes
|
|
102
|
+
// Practitioner info when grouping by procedure
|
|
103
|
+
practitionerId?: string;
|
|
104
|
+
practitionerName?: string;
|
|
80
105
|
}
|
|
81
106
|
|
|
82
107
|
/**
|