@blackcode_sa/metaestetics-api 1.13.3 → 1.13.5
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 +15 -28
- package/dist/admin/index.d.ts +15 -28
- package/dist/index.d.mts +18 -30
- package/dist/index.d.ts +18 -30
- package/dist/index.js +11 -3
- package/dist/index.mjs +11 -3
- package/package.json +121 -119
- package/src/__mocks__/firstore.ts +10 -10
- package/src/admin/aggregation/README.md +79 -79
- package/src/admin/aggregation/appointment/README.md +128 -128
- package/src/admin/aggregation/appointment/appointment.aggregation.service.ts +1984 -1984
- package/src/admin/aggregation/appointment/index.ts +1 -1
- package/src/admin/aggregation/clinic/README.md +52 -52
- package/src/admin/aggregation/clinic/clinic.aggregation.service.ts +703 -703
- package/src/admin/aggregation/clinic/index.ts +1 -1
- package/src/admin/aggregation/forms/README.md +13 -13
- package/src/admin/aggregation/forms/filled-forms.aggregation.service.ts +322 -322
- package/src/admin/aggregation/forms/index.ts +1 -1
- package/src/admin/aggregation/index.ts +8 -8
- package/src/admin/aggregation/patient/README.md +27 -27
- package/src/admin/aggregation/patient/index.ts +1 -1
- package/src/admin/aggregation/patient/patient.aggregation.service.ts +141 -141
- package/src/admin/aggregation/practitioner/README.md +42 -42
- package/src/admin/aggregation/practitioner/index.ts +1 -1
- package/src/admin/aggregation/practitioner/practitioner.aggregation.service.ts +433 -433
- package/src/admin/aggregation/practitioner-invite/index.ts +1 -1
- package/src/admin/aggregation/practitioner-invite/practitioner-invite.aggregation.service.ts +961 -961
- package/src/admin/aggregation/procedure/README.md +43 -43
- package/src/admin/aggregation/procedure/index.ts +1 -1
- package/src/admin/aggregation/procedure/procedure.aggregation.service.ts +702 -702
- package/src/admin/aggregation/reviews/index.ts +1 -1
- package/src/admin/aggregation/reviews/reviews.aggregation.service.ts +689 -689
- package/src/admin/analytics/analytics.admin.service.ts +278 -278
- package/src/admin/analytics/index.ts +2 -2
- package/src/admin/booking/README.md +125 -125
- package/src/admin/booking/booking.admin.ts +1037 -1037
- package/src/admin/booking/booking.calculator.ts +712 -712
- package/src/admin/booking/booking.types.ts +59 -59
- package/src/admin/booking/index.ts +3 -3
- package/src/admin/booking/timezones-problem.md +185 -185
- package/src/admin/calendar/README.md +7 -7
- package/src/admin/calendar/calendar.admin.service.ts +345 -345
- package/src/admin/calendar/index.ts +1 -1
- package/src/admin/documentation-templates/document-manager.admin.ts +260 -260
- package/src/admin/documentation-templates/index.ts +1 -1
- package/src/admin/free-consultation/free-consultation-utils.admin.ts +148 -148
- package/src/admin/free-consultation/index.ts +1 -1
- package/src/admin/index.ts +81 -81
- package/src/admin/logger/index.ts +78 -78
- package/src/admin/mailing/README.md +95 -95
- package/src/admin/mailing/appointment/appointment.mailing.service.ts +732 -732
- package/src/admin/mailing/appointment/index.ts +1 -1
- package/src/admin/mailing/appointment/templates/patient/appointment-confirmed.html +40 -40
- package/src/admin/mailing/base.mailing.service.ts +208 -208
- package/src/admin/mailing/index.ts +3 -3
- package/src/admin/mailing/practitionerInvite/existing-practitioner-invite.mailing.ts +611 -611
- package/src/admin/mailing/practitionerInvite/index.ts +2 -2
- package/src/admin/mailing/practitionerInvite/practitionerInvite.mailing.ts +395 -395
- package/src/admin/mailing/practitionerInvite/templates/existing-practitioner-invitation.template.ts +155 -155
- package/src/admin/mailing/practitionerInvite/templates/invitation.template.ts +101 -101
- package/src/admin/mailing/practitionerInvite/templates/invite-accepted-notification.template.ts +228 -228
- package/src/admin/mailing/practitionerInvite/templates/invite-rejected-notification.template.ts +242 -242
- package/src/admin/notifications/index.ts +1 -1
- package/src/admin/notifications/notifications.admin.ts +710 -710
- package/src/admin/requirements/README.md +128 -128
- package/src/admin/requirements/index.ts +1 -1
- package/src/admin/requirements/patient-requirements.admin.service.ts +475 -475
- package/src/admin/users/index.ts +1 -1
- package/src/admin/users/user-profile.admin.ts +405 -405
- package/src/backoffice/constants/certification.constants.ts +13 -13
- package/src/backoffice/constants/index.ts +1 -1
- package/src/backoffice/errors/backoffice.errors.ts +181 -181
- package/src/backoffice/errors/index.ts +1 -1
- package/src/backoffice/expo-safe/README.md +26 -26
- package/src/backoffice/expo-safe/index.ts +41 -41
- package/src/backoffice/index.ts +5 -5
- package/src/backoffice/services/FIXES_README.md +102 -102
- package/src/backoffice/services/README.md +57 -57
- package/src/backoffice/services/analytics.service.proposal.md +863 -863
- package/src/backoffice/services/analytics.service.summary.md +143 -143
- package/src/backoffice/services/brand.service.ts +256 -256
- package/src/backoffice/services/category.service.ts +384 -384
- package/src/backoffice/services/constants.service.ts +385 -385
- package/src/backoffice/services/documentation-template.service.ts +202 -202
- package/src/backoffice/services/index.ts +10 -10
- package/src/backoffice/services/migrate-products.ts +116 -116
- package/src/backoffice/services/product.service.ts +553 -553
- package/src/backoffice/services/requirement.service.ts +235 -235
- package/src/backoffice/services/subcategory.service.ts +461 -461
- package/src/backoffice/services/technology.service.ts +1151 -1151
- package/src/backoffice/types/README.md +12 -12
- package/src/backoffice/types/admin-constants.types.ts +69 -69
- package/src/backoffice/types/brand.types.ts +29 -29
- package/src/backoffice/types/category.types.ts +67 -67
- package/src/backoffice/types/documentation-templates.types.ts +28 -28
- package/src/backoffice/types/index.ts +10 -10
- package/src/backoffice/types/procedure-product.types.ts +38 -38
- package/src/backoffice/types/product.types.ts +240 -240
- package/src/backoffice/types/requirement.types.ts +63 -63
- package/src/backoffice/types/static/README.md +18 -18
- package/src/backoffice/types/static/blocking-condition.types.ts +21 -21
- package/src/backoffice/types/static/certification.types.ts +37 -37
- package/src/backoffice/types/static/contraindication.types.ts +19 -19
- package/src/backoffice/types/static/index.ts +6 -6
- package/src/backoffice/types/static/pricing.types.ts +16 -16
- package/src/backoffice/types/static/procedure-family.types.ts +14 -14
- package/src/backoffice/types/static/treatment-benefit.types.ts +22 -22
- package/src/backoffice/types/subcategory.types.ts +34 -34
- package/src/backoffice/types/technology.types.ts +168 -168
- package/src/backoffice/validations/index.ts +1 -1
- package/src/backoffice/validations/schemas.ts +164 -164
- package/src/config/__mocks__/firebase.ts +99 -99
- package/src/config/firebase.ts +78 -78
- package/src/config/index.ts +9 -9
- package/src/errors/auth.error.ts +6 -6
- package/src/errors/auth.errors.ts +200 -200
- package/src/errors/clinic.errors.ts +32 -32
- package/src/errors/firebase.errors.ts +47 -47
- package/src/errors/user.errors.ts +99 -99
- package/src/index.backup.ts +407 -407
- package/src/index.ts +6 -6
- package/src/locales/en.ts +31 -31
- package/src/recommender/admin/index.ts +1 -1
- package/src/recommender/admin/services/recommender.service.admin.ts +5 -5
- package/src/recommender/front/index.ts +1 -1
- package/src/recommender/front/services/onboarding.service.ts +5 -5
- package/src/recommender/front/services/recommender.service.ts +3 -3
- package/src/recommender/index.ts +1 -1
- package/src/services/PATIENTAUTH.MD +197 -197
- package/src/services/README.md +106 -106
- package/src/services/__tests__/auth/auth.mock.test.ts +17 -17
- package/src/services/__tests__/auth/auth.setup.ts +293 -293
- package/src/services/__tests__/auth.service.test.ts +346 -346
- package/src/services/__tests__/base.service.test.ts +77 -77
- package/src/services/__tests__/user.service.test.ts +528 -528
- package/src/services/analytics/ARCHITECTURE.md +199 -199
- package/src/services/analytics/CLOUD_FUNCTIONS.md +225 -225
- package/src/services/analytics/GROUPED_ANALYTICS.md +501 -501
- package/src/services/analytics/QUICK_START.md +393 -393
- package/src/services/analytics/README.md +304 -304
- package/src/services/analytics/SUMMARY.md +141 -141
- package/src/services/analytics/TRENDS.md +380 -380
- package/src/services/analytics/USAGE_GUIDE.md +518 -518
- package/src/services/analytics/analytics-cloud.service.ts +222 -222
- package/src/services/analytics/analytics.service.ts +2142 -2142
- package/src/services/analytics/index.ts +4 -4
- package/src/services/analytics/review-analytics.service.ts +941 -941
- package/src/services/analytics/utils/appointment-filtering.utils.ts +138 -138
- package/src/services/analytics/utils/cost-calculation.utils.ts +182 -182
- package/src/services/analytics/utils/grouping.utils.ts +434 -434
- package/src/services/analytics/utils/stored-analytics.utils.ts +347 -347
- package/src/services/analytics/utils/time-calculation.utils.ts +186 -186
- package/src/services/analytics/utils/trend-calculation.utils.ts +200 -200
- package/src/services/appointment/README.md +17 -17
- package/src/services/appointment/appointment.service.ts +2558 -2558
- package/src/services/appointment/index.ts +1 -1
- package/src/services/appointment/utils/appointment.utils.ts +552 -552
- package/src/services/appointment/utils/extended-procedure.utils.ts +314 -314
- package/src/services/appointment/utils/form-initialization.utils.ts +225 -225
- package/src/services/appointment/utils/recommended-procedure.utils.ts +195 -195
- package/src/services/appointment/utils/zone-management.utils.ts +353 -353
- package/src/services/appointment/utils/zone-photo.utils.ts +152 -152
- package/src/services/auth/auth.service.ts +989 -989
- package/src/services/auth/auth.v2.service.ts +961 -961
- package/src/services/auth/index.ts +7 -7
- package/src/services/auth/utils/error.utils.ts +90 -90
- package/src/services/auth/utils/firebase.utils.ts +49 -49
- package/src/services/auth/utils/index.ts +21 -21
- package/src/services/auth/utils/practitioner.utils.ts +125 -125
- package/src/services/base.service.ts +41 -41
- package/src/services/calendar/calendar.service.ts +1077 -1077
- package/src/services/calendar/calendar.v2.service.ts +1683 -1683
- package/src/services/calendar/calendar.v3.service.ts +313 -313
- package/src/services/calendar/externalCalendar.service.ts +178 -178
- package/src/services/calendar/index.ts +5 -5
- package/src/services/calendar/synced-calendars.service.ts +743 -743
- package/src/services/calendar/utils/appointment.utils.ts +265 -265
- package/src/services/calendar/utils/calendar-event.utils.ts +646 -646
- package/src/services/calendar/utils/clinic.utils.ts +237 -237
- package/src/services/calendar/utils/docs.utils.ts +157 -157
- package/src/services/calendar/utils/google-calendar.utils.ts +697 -697
- package/src/services/calendar/utils/index.ts +8 -8
- package/src/services/calendar/utils/patient.utils.ts +198 -198
- package/src/services/calendar/utils/practitioner.utils.ts +221 -221
- package/src/services/calendar/utils/synced-calendar.utils.ts +472 -472
- package/src/services/clinic/README.md +204 -204
- package/src/services/clinic/__tests__/clinic-admin.service.test.ts +287 -287
- package/src/services/clinic/__tests__/clinic-group.service.test.ts +352 -352
- package/src/services/clinic/__tests__/clinic.service.test.ts +354 -354
- package/src/services/clinic/billing-transactions.service.ts +217 -217
- package/src/services/clinic/clinic-admin.service.ts +202 -202
- package/src/services/clinic/clinic-group.service.ts +310 -310
- package/src/services/clinic/clinic.service.ts +708 -708
- package/src/services/clinic/index.ts +5 -5
- package/src/services/clinic/practitioner-invite.service.ts +519 -519
- package/src/services/clinic/utils/admin.utils.ts +551 -551
- package/src/services/clinic/utils/clinic-group.utils.ts +646 -646
- package/src/services/clinic/utils/clinic.utils.ts +949 -949
- package/src/services/clinic/utils/filter.utils.d.ts +23 -23
- package/src/services/clinic/utils/filter.utils.ts +446 -446
- package/src/services/clinic/utils/index.ts +11 -11
- package/src/services/clinic/utils/photos.utils.ts +188 -188
- package/src/services/clinic/utils/search.utils.ts +84 -84
- package/src/services/clinic/utils/tag.utils.ts +124 -124
- package/src/services/documentation-templates/documentation-template.service.ts +537 -537
- package/src/services/documentation-templates/filled-document.service.ts +587 -587
- package/src/services/documentation-templates/index.ts +2 -2
- package/src/services/index.ts +14 -14
- package/src/services/media/index.ts +1 -1
- package/src/services/media/media.service.ts +418 -418
- package/src/services/notifications/__tests__/notification.service.test.ts +242 -242
- package/src/services/notifications/index.ts +1 -1
- package/src/services/notifications/notification.service.ts +215 -215
- package/src/services/patient/README.md +48 -48
- package/src/services/patient/To-Do.md +43 -43
- package/src/services/patient/__tests__/patient.service.test.ts +294 -294
- package/src/services/patient/index.ts +2 -2
- package/src/services/patient/patient.service.ts +883 -883
- package/src/services/patient/patientRequirements.service.ts +285 -285
- package/src/services/patient/utils/aesthetic-analysis.utils.ts +176 -176
- package/src/services/patient/utils/clinic.utils.ts +80 -80
- package/src/services/patient/utils/docs.utils.ts +142 -142
- package/src/services/patient/utils/index.ts +9 -9
- package/src/services/patient/utils/location.utils.ts +126 -126
- package/src/services/patient/utils/medical-stuff.utils.ts +143 -143
- package/src/services/patient/utils/medical.utils.ts +458 -458
- package/src/services/patient/utils/practitioner.utils.ts +260 -260
- package/src/services/patient/utils/profile.utils.ts +510 -510
- package/src/services/patient/utils/sensitive.utils.ts +260 -260
- package/src/services/patient/utils/token.utils.ts +211 -211
- package/src/services/practitioner/README.md +145 -145
- package/src/services/practitioner/index.ts +1 -1
- package/src/services/practitioner/practitioner.service.ts +1742 -1742
- package/src/services/procedure/README.md +163 -163
- package/src/services/procedure/index.ts +1 -1
- package/src/services/procedure/procedure.service.ts +2200 -2191
- package/src/services/reviews/index.ts +1 -1
- package/src/services/reviews/reviews.service.ts +734 -734
- package/src/services/user/index.ts +1 -1
- package/src/services/user/user.service.ts +489 -489
- package/src/services/user/user.v2.service.ts +466 -466
- package/src/types/analytics/analytics.types.ts +597 -597
- package/src/types/analytics/grouped-analytics.types.ts +173 -173
- package/src/types/analytics/index.ts +4 -4
- package/src/types/analytics/stored-analytics.types.ts +137 -137
- package/src/types/appointment/index.ts +480 -480
- package/src/types/calendar/index.ts +258 -258
- package/src/types/calendar/synced-calendar.types.ts +66 -66
- package/src/types/clinic/index.ts +498 -489
- package/src/types/clinic/practitioner-invite.types.ts +91 -91
- package/src/types/clinic/preferences.types.ts +159 -159
- package/src/types/clinic/to-do +3 -3
- package/src/types/documentation-templates/index.ts +308 -308
- package/src/types/index.ts +47 -47
- package/src/types/notifications/README.md +77 -77
- package/src/types/notifications/index.ts +286 -286
- package/src/types/patient/aesthetic-analysis.types.ts +66 -66
- package/src/types/patient/allergies.ts +58 -58
- package/src/types/patient/index.ts +275 -275
- package/src/types/patient/medical-info.types.ts +152 -152
- package/src/types/patient/patient-requirements.ts +92 -92
- package/src/types/patient/token.types.ts +61 -61
- package/src/types/practitioner/index.ts +206 -206
- package/src/types/procedure/index.ts +181 -181
- package/src/types/profile/index.ts +39 -39
- package/src/types/reviews/index.ts +132 -132
- package/src/types/tz-lookup.d.ts +4 -4
- package/src/types/user/index.ts +38 -38
- package/src/utils/TIMESTAMPS.md +176 -176
- package/src/utils/TimestampUtils.ts +241 -241
- package/src/utils/index.ts +1 -1
- package/src/validations/appointment.schema.ts +574 -574
- package/src/validations/calendar.schema.ts +225 -225
- package/src/validations/clinic.schema.ts +494 -493
- package/src/validations/common.schema.ts +25 -25
- package/src/validations/documentation-templates/index.ts +1 -1
- package/src/validations/documentation-templates/template.schema.ts +220 -220
- package/src/validations/documentation-templates.schema.ts +10 -10
- package/src/validations/index.ts +20 -20
- package/src/validations/media.schema.ts +10 -10
- package/src/validations/notification.schema.ts +90 -90
- package/src/validations/patient/aesthetic-analysis.schema.ts +55 -55
- package/src/validations/patient/medical-info.schema.ts +125 -125
- package/src/validations/patient/patient-requirements.schema.ts +84 -84
- package/src/validations/patient/token.schema.ts +29 -29
- package/src/validations/patient.schema.ts +217 -217
- package/src/validations/practitioner.schema.ts +222 -222
- package/src/validations/procedure-product.schema.ts +41 -41
- package/src/validations/procedure.schema.ts +124 -124
- package/src/validations/profile-info.schema.ts +41 -41
- package/src/validations/reviews.schema.ts +195 -195
- package/src/validations/schemas.ts +104 -104
- package/src/validations/shared.schema.ts +78 -78
|
@@ -1,173 +1,173 @@
|
|
|
1
|
-
import { EntityType } from './analytics.types';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Base interface for grouped analytics results
|
|
5
|
-
* All grouped analytics share common entity identification
|
|
6
|
-
*/
|
|
7
|
-
export interface GroupedAnalyticsBase {
|
|
8
|
-
entityId: string;
|
|
9
|
-
entityName: string;
|
|
10
|
-
entityType: EntityType;
|
|
11
|
-
}
|
|
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
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Grouped Revenue Metrics
|
|
29
|
-
* Revenue analytics grouped by clinic, practitioner, procedure, or patient
|
|
30
|
-
*/
|
|
31
|
-
export interface GroupedRevenueMetrics extends GroupedAnalyticsBase {
|
|
32
|
-
totalRevenue: number;
|
|
33
|
-
averageRevenuePerAppointment: number;
|
|
34
|
-
totalAppointments: number;
|
|
35
|
-
completedAppointments: number;
|
|
36
|
-
currency: string;
|
|
37
|
-
unpaidRevenue: number;
|
|
38
|
-
refundedRevenue: number;
|
|
39
|
-
totalTax: number;
|
|
40
|
-
totalSubtotal: number;
|
|
41
|
-
// Practitioner info when grouping by procedure
|
|
42
|
-
practitionerId?: string;
|
|
43
|
-
practitionerName?: string;
|
|
44
|
-
// Review metrics (optional)
|
|
45
|
-
reviewMetrics?: ReviewMetrics;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Grouped Product Usage Metrics
|
|
50
|
-
* Product usage analytics grouped by clinic, practitioner, procedure, or patient
|
|
51
|
-
*/
|
|
52
|
-
export interface GroupedProductUsageMetrics extends GroupedAnalyticsBase {
|
|
53
|
-
totalProductsUsed: number;
|
|
54
|
-
uniqueProducts: number;
|
|
55
|
-
totalProductRevenue: number;
|
|
56
|
-
totalProductQuantity: number;
|
|
57
|
-
averageProductsPerAppointment: number;
|
|
58
|
-
topProducts: Array<{
|
|
59
|
-
productId: string;
|
|
60
|
-
productName: string;
|
|
61
|
-
brandName: string;
|
|
62
|
-
totalQuantity: number;
|
|
63
|
-
totalRevenue: number;
|
|
64
|
-
usageCount: number;
|
|
65
|
-
}>;
|
|
66
|
-
// Practitioner info when grouping by procedure
|
|
67
|
-
practitionerId?: string;
|
|
68
|
-
practitionerName?: string;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Grouped Patient Retention Metrics
|
|
73
|
-
* Patient retention analytics grouped by clinic, practitioner, or procedure
|
|
74
|
-
*/
|
|
75
|
-
export interface GroupedPatientRetentionMetrics extends GroupedAnalyticsBase {
|
|
76
|
-
totalPatients: number;
|
|
77
|
-
newPatients: number;
|
|
78
|
-
returningPatients: number;
|
|
79
|
-
retentionRate: number; // percentage
|
|
80
|
-
averageAppointmentsPerPatient: number;
|
|
81
|
-
patientsByAppointmentCount: Array<{
|
|
82
|
-
appointmentCount: number;
|
|
83
|
-
patientCount: number;
|
|
84
|
-
percentage: number;
|
|
85
|
-
}>;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Grouped Time Efficiency Metrics
|
|
90
|
-
* Time efficiency analytics grouped by clinic, practitioner, procedure, or patient
|
|
91
|
-
*/
|
|
92
|
-
export interface GroupedTimeEfficiencyMetrics extends GroupedAnalyticsBase {
|
|
93
|
-
totalAppointments: number;
|
|
94
|
-
appointmentsWithActualTime: number;
|
|
95
|
-
averageBookedDuration: number; // minutes
|
|
96
|
-
averageActualDuration: number; // minutes
|
|
97
|
-
averageEfficiency: number; // percentage
|
|
98
|
-
totalOverrun: number; // minutes
|
|
99
|
-
totalUnderutilization: number; // minutes
|
|
100
|
-
averageOverrun: number; // minutes
|
|
101
|
-
averageUnderutilization: number; // minutes
|
|
102
|
-
// Practitioner info when grouping by procedure
|
|
103
|
-
practitionerId?: string;
|
|
104
|
-
practitionerName?: string;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Grouped Patient Behavior Metrics
|
|
109
|
-
* Patient behavior (no-show, cancellation) grouped by clinic, practitioner, or procedure
|
|
110
|
-
*/
|
|
111
|
-
export interface GroupedPatientBehaviorMetrics extends GroupedAnalyticsBase {
|
|
112
|
-
totalPatients: number;
|
|
113
|
-
patientsWithNoShows: number;
|
|
114
|
-
patientsWithCancellations: number;
|
|
115
|
-
averageNoShowRate: number; // percentage (average across patients)
|
|
116
|
-
averageCancellationRate: number; // percentage (average across patients)
|
|
117
|
-
topNoShowPatients: Array<{
|
|
118
|
-
patientId: string;
|
|
119
|
-
patientName: string;
|
|
120
|
-
noShowCount: number;
|
|
121
|
-
totalAppointments: number;
|
|
122
|
-
noShowRate: number;
|
|
123
|
-
}>;
|
|
124
|
-
topCancellationPatients: Array<{
|
|
125
|
-
patientId: string;
|
|
126
|
-
patientName: string;
|
|
127
|
-
cancellationCount: number;
|
|
128
|
-
totalAppointments: number;
|
|
129
|
-
cancellationRate: number;
|
|
130
|
-
}>;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Grouped Procedure Performance Metrics
|
|
135
|
-
* Procedure performance grouped by clinic or practitioner
|
|
136
|
-
*/
|
|
137
|
-
export interface GroupedProcedurePerformanceMetrics extends GroupedAnalyticsBase {
|
|
138
|
-
totalProcedures: number;
|
|
139
|
-
totalAppointments: number;
|
|
140
|
-
completedAppointments: number;
|
|
141
|
-
totalRevenue: number;
|
|
142
|
-
averageRevenuePerProcedure: number;
|
|
143
|
-
topProcedures: Array<{
|
|
144
|
-
procedureId: string;
|
|
145
|
-
procedureName: string;
|
|
146
|
-
appointmentCount: number;
|
|
147
|
-
revenue: number;
|
|
148
|
-
cancellationRate: number;
|
|
149
|
-
noShowRate: number;
|
|
150
|
-
}>;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Grouped Practitioner Performance Metrics
|
|
155
|
-
* Practitioner performance grouped by clinic
|
|
156
|
-
*/
|
|
157
|
-
export interface GroupedPractitionerPerformanceMetrics extends GroupedAnalyticsBase {
|
|
158
|
-
totalPractitioners: number;
|
|
159
|
-
totalAppointments: number;
|
|
160
|
-
completedAppointments: number;
|
|
161
|
-
totalRevenue: number;
|
|
162
|
-
averageRevenuePerPractitioner: number;
|
|
163
|
-
topPractitioners: Array<{
|
|
164
|
-
practitionerId: string;
|
|
165
|
-
practitionerName: string;
|
|
166
|
-
appointmentCount: number;
|
|
167
|
-
revenue: number;
|
|
168
|
-
cancellationRate: number;
|
|
169
|
-
noShowRate: number;
|
|
170
|
-
timeEfficiency: number;
|
|
171
|
-
}>;
|
|
172
|
-
}
|
|
173
|
-
|
|
1
|
+
import { EntityType } from './analytics.types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Base interface for grouped analytics results
|
|
5
|
+
* All grouped analytics share common entity identification
|
|
6
|
+
*/
|
|
7
|
+
export interface GroupedAnalyticsBase {
|
|
8
|
+
entityId: string;
|
|
9
|
+
entityName: string;
|
|
10
|
+
entityType: EntityType;
|
|
11
|
+
}
|
|
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
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Grouped Revenue Metrics
|
|
29
|
+
* Revenue analytics grouped by clinic, practitioner, procedure, or patient
|
|
30
|
+
*/
|
|
31
|
+
export interface GroupedRevenueMetrics extends GroupedAnalyticsBase {
|
|
32
|
+
totalRevenue: number;
|
|
33
|
+
averageRevenuePerAppointment: number;
|
|
34
|
+
totalAppointments: number;
|
|
35
|
+
completedAppointments: number;
|
|
36
|
+
currency: string;
|
|
37
|
+
unpaidRevenue: number;
|
|
38
|
+
refundedRevenue: number;
|
|
39
|
+
totalTax: number;
|
|
40
|
+
totalSubtotal: number;
|
|
41
|
+
// Practitioner info when grouping by procedure
|
|
42
|
+
practitionerId?: string;
|
|
43
|
+
practitionerName?: string;
|
|
44
|
+
// Review metrics (optional)
|
|
45
|
+
reviewMetrics?: ReviewMetrics;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Grouped Product Usage Metrics
|
|
50
|
+
* Product usage analytics grouped by clinic, practitioner, procedure, or patient
|
|
51
|
+
*/
|
|
52
|
+
export interface GroupedProductUsageMetrics extends GroupedAnalyticsBase {
|
|
53
|
+
totalProductsUsed: number;
|
|
54
|
+
uniqueProducts: number;
|
|
55
|
+
totalProductRevenue: number;
|
|
56
|
+
totalProductQuantity: number;
|
|
57
|
+
averageProductsPerAppointment: number;
|
|
58
|
+
topProducts: Array<{
|
|
59
|
+
productId: string;
|
|
60
|
+
productName: string;
|
|
61
|
+
brandName: string;
|
|
62
|
+
totalQuantity: number;
|
|
63
|
+
totalRevenue: number;
|
|
64
|
+
usageCount: number;
|
|
65
|
+
}>;
|
|
66
|
+
// Practitioner info when grouping by procedure
|
|
67
|
+
practitionerId?: string;
|
|
68
|
+
practitionerName?: string;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Grouped Patient Retention Metrics
|
|
73
|
+
* Patient retention analytics grouped by clinic, practitioner, or procedure
|
|
74
|
+
*/
|
|
75
|
+
export interface GroupedPatientRetentionMetrics extends GroupedAnalyticsBase {
|
|
76
|
+
totalPatients: number;
|
|
77
|
+
newPatients: number;
|
|
78
|
+
returningPatients: number;
|
|
79
|
+
retentionRate: number; // percentage
|
|
80
|
+
averageAppointmentsPerPatient: number;
|
|
81
|
+
patientsByAppointmentCount: Array<{
|
|
82
|
+
appointmentCount: number;
|
|
83
|
+
patientCount: number;
|
|
84
|
+
percentage: number;
|
|
85
|
+
}>;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Grouped Time Efficiency Metrics
|
|
90
|
+
* Time efficiency analytics grouped by clinic, practitioner, procedure, or patient
|
|
91
|
+
*/
|
|
92
|
+
export interface GroupedTimeEfficiencyMetrics extends GroupedAnalyticsBase {
|
|
93
|
+
totalAppointments: number;
|
|
94
|
+
appointmentsWithActualTime: number;
|
|
95
|
+
averageBookedDuration: number; // minutes
|
|
96
|
+
averageActualDuration: number; // minutes
|
|
97
|
+
averageEfficiency: number; // percentage
|
|
98
|
+
totalOverrun: number; // minutes
|
|
99
|
+
totalUnderutilization: number; // minutes
|
|
100
|
+
averageOverrun: number; // minutes
|
|
101
|
+
averageUnderutilization: number; // minutes
|
|
102
|
+
// Practitioner info when grouping by procedure
|
|
103
|
+
practitionerId?: string;
|
|
104
|
+
practitionerName?: string;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Grouped Patient Behavior Metrics
|
|
109
|
+
* Patient behavior (no-show, cancellation) grouped by clinic, practitioner, or procedure
|
|
110
|
+
*/
|
|
111
|
+
export interface GroupedPatientBehaviorMetrics extends GroupedAnalyticsBase {
|
|
112
|
+
totalPatients: number;
|
|
113
|
+
patientsWithNoShows: number;
|
|
114
|
+
patientsWithCancellations: number;
|
|
115
|
+
averageNoShowRate: number; // percentage (average across patients)
|
|
116
|
+
averageCancellationRate: number; // percentage (average across patients)
|
|
117
|
+
topNoShowPatients: Array<{
|
|
118
|
+
patientId: string;
|
|
119
|
+
patientName: string;
|
|
120
|
+
noShowCount: number;
|
|
121
|
+
totalAppointments: number;
|
|
122
|
+
noShowRate: number;
|
|
123
|
+
}>;
|
|
124
|
+
topCancellationPatients: Array<{
|
|
125
|
+
patientId: string;
|
|
126
|
+
patientName: string;
|
|
127
|
+
cancellationCount: number;
|
|
128
|
+
totalAppointments: number;
|
|
129
|
+
cancellationRate: number;
|
|
130
|
+
}>;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Grouped Procedure Performance Metrics
|
|
135
|
+
* Procedure performance grouped by clinic or practitioner
|
|
136
|
+
*/
|
|
137
|
+
export interface GroupedProcedurePerformanceMetrics extends GroupedAnalyticsBase {
|
|
138
|
+
totalProcedures: number;
|
|
139
|
+
totalAppointments: number;
|
|
140
|
+
completedAppointments: number;
|
|
141
|
+
totalRevenue: number;
|
|
142
|
+
averageRevenuePerProcedure: number;
|
|
143
|
+
topProcedures: Array<{
|
|
144
|
+
procedureId: string;
|
|
145
|
+
procedureName: string;
|
|
146
|
+
appointmentCount: number;
|
|
147
|
+
revenue: number;
|
|
148
|
+
cancellationRate: number;
|
|
149
|
+
noShowRate: number;
|
|
150
|
+
}>;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Grouped Practitioner Performance Metrics
|
|
155
|
+
* Practitioner performance grouped by clinic
|
|
156
|
+
*/
|
|
157
|
+
export interface GroupedPractitionerPerformanceMetrics extends GroupedAnalyticsBase {
|
|
158
|
+
totalPractitioners: number;
|
|
159
|
+
totalAppointments: number;
|
|
160
|
+
completedAppointments: number;
|
|
161
|
+
totalRevenue: number;
|
|
162
|
+
averageRevenuePerPractitioner: number;
|
|
163
|
+
topPractitioners: Array<{
|
|
164
|
+
practitionerId: string;
|
|
165
|
+
practitionerName: string;
|
|
166
|
+
appointmentCount: number;
|
|
167
|
+
revenue: number;
|
|
168
|
+
cancellationRate: number;
|
|
169
|
+
noShowRate: number;
|
|
170
|
+
timeEfficiency: number;
|
|
171
|
+
}>;
|
|
172
|
+
}
|
|
173
|
+
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from './analytics.types';
|
|
2
|
-
export * from './stored-analytics.types';
|
|
3
|
-
export * from './grouped-analytics.types';
|
|
4
|
-
|
|
1
|
+
export * from './analytics.types';
|
|
2
|
+
export * from './stored-analytics.types';
|
|
3
|
+
export * from './grouped-analytics.types';
|
|
4
|
+
|
|
@@ -1,137 +1,137 @@
|
|
|
1
|
-
import { Timestamp } from 'firebase/firestore';
|
|
2
|
-
import {
|
|
3
|
-
PractitionerAnalytics,
|
|
4
|
-
ProcedureAnalytics,
|
|
5
|
-
TimeEfficiencyMetrics,
|
|
6
|
-
CancellationMetrics,
|
|
7
|
-
NoShowMetrics,
|
|
8
|
-
RevenueMetrics,
|
|
9
|
-
DashboardAnalytics,
|
|
10
|
-
ClinicAnalytics,
|
|
11
|
-
AnalyticsDateRange,
|
|
12
|
-
} from './analytics.types';
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Period type for analytics snapshots
|
|
16
|
-
*/
|
|
17
|
-
export type AnalyticsPeriod = 'daily' | 'weekly' | 'monthly' | 'yearly' | 'all_time';
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Analytics document metadata
|
|
21
|
-
*/
|
|
22
|
-
export interface AnalyticsMetadata {
|
|
23
|
-
clinicBranchId: string;
|
|
24
|
-
period: AnalyticsPeriod;
|
|
25
|
-
periodStart: Date;
|
|
26
|
-
periodEnd: Date;
|
|
27
|
-
computedAt: Timestamp;
|
|
28
|
-
computedBy: 'cloud_function' | 'manual';
|
|
29
|
-
version: string; // Schema version for future migrations
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Stored Practitioner Analytics
|
|
34
|
-
* Stored in: clinics/{clinicBranchId}/analytics/practitioners/{practitionerId}/{period}
|
|
35
|
-
*/
|
|
36
|
-
export interface StoredPractitionerAnalytics extends PractitionerAnalytics {
|
|
37
|
-
metadata: AnalyticsMetadata;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Stored Procedure Analytics
|
|
42
|
-
* Stored in: clinics/{clinicBranchId}/analytics/procedures/{procedureId}/{period}
|
|
43
|
-
*/
|
|
44
|
-
export interface StoredProcedureAnalytics extends ProcedureAnalytics {
|
|
45
|
-
metadata: AnalyticsMetadata;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Stored Clinic Analytics
|
|
50
|
-
* Stored in: clinics/{clinicBranchId}/analytics/clinic/{period}
|
|
51
|
-
*/
|
|
52
|
-
export interface StoredClinicAnalytics extends ClinicAnalytics {
|
|
53
|
-
metadata: AnalyticsMetadata;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Stored Dashboard Analytics
|
|
58
|
-
* Stored in: clinics/{clinicBranchId}/analytics/dashboard/{period}
|
|
59
|
-
*/
|
|
60
|
-
export interface StoredDashboardAnalytics extends DashboardAnalytics {
|
|
61
|
-
metadata: AnalyticsMetadata;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Stored Time Efficiency Metrics
|
|
66
|
-
* Stored in: clinics/{clinicBranchId}/analytics/time_efficiency/{period}
|
|
67
|
-
*/
|
|
68
|
-
export interface StoredTimeEfficiencyMetrics extends TimeEfficiencyMetrics {
|
|
69
|
-
metadata: AnalyticsMetadata;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Stored Cancellation Metrics
|
|
74
|
-
* Stored in: clinics/{clinicBranchId}/analytics/cancellations/{entityType}/{period}
|
|
75
|
-
*/
|
|
76
|
-
export interface StoredCancellationMetrics extends CancellationMetrics {
|
|
77
|
-
metadata: AnalyticsMetadata;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Stored No-Show Metrics
|
|
82
|
-
* Stored in: clinics/{clinicBranchId}/analytics/no_shows/{entityType}/{period}
|
|
83
|
-
*/
|
|
84
|
-
export interface StoredNoShowMetrics extends NoShowMetrics {
|
|
85
|
-
metadata: AnalyticsMetadata;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Stored Revenue Metrics
|
|
90
|
-
* Stored in: clinics/{clinicBranchId}/analytics/revenue/{period}
|
|
91
|
-
*/
|
|
92
|
-
export interface StoredRevenueMetrics extends RevenueMetrics {
|
|
93
|
-
metadata: AnalyticsMetadata;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Collection names for stored analytics
|
|
98
|
-
*/
|
|
99
|
-
export const ANALYTICS_COLLECTION = 'analytics';
|
|
100
|
-
export const PRACTITIONER_ANALYTICS_SUBCOLLECTION = 'practitioners';
|
|
101
|
-
export const PROCEDURE_ANALYTICS_SUBCOLLECTION = 'procedures';
|
|
102
|
-
export const CLINIC_ANALYTICS_SUBCOLLECTION = 'clinic';
|
|
103
|
-
export const DASHBOARD_ANALYTICS_SUBCOLLECTION = 'dashboard';
|
|
104
|
-
export const TIME_EFFICIENCY_ANALYTICS_SUBCOLLECTION = 'time_efficiency';
|
|
105
|
-
export const CANCELLATION_ANALYTICS_SUBCOLLECTION = 'cancellations';
|
|
106
|
-
export const NO_SHOW_ANALYTICS_SUBCOLLECTION = 'no_shows';
|
|
107
|
-
export const REVENUE_ANALYTICS_SUBCOLLECTION = 'revenue';
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Options for reading stored analytics
|
|
111
|
-
*/
|
|
112
|
-
export interface ReadStoredAnalyticsOptions {
|
|
113
|
-
/**
|
|
114
|
-
* Whether to use cached/pre-computed data
|
|
115
|
-
* @default true
|
|
116
|
-
*/
|
|
117
|
-
useCache?: boolean;
|
|
118
|
-
/**
|
|
119
|
-
* Maximum age of cached data in hours before recalculating
|
|
120
|
-
* @default 12
|
|
121
|
-
*/
|
|
122
|
-
maxCacheAgeHours?: number;
|
|
123
|
-
/**
|
|
124
|
-
* Period to read
|
|
125
|
-
* @default 'all_time'
|
|
126
|
-
*/
|
|
127
|
-
period?: AnalyticsPeriod;
|
|
128
|
-
/**
|
|
129
|
-
* Date range for the period (calculated if not provided)
|
|
130
|
-
*/
|
|
131
|
-
dateRange?: AnalyticsDateRange;
|
|
132
|
-
/**
|
|
133
|
-
* Clinic branch ID (required for reading stored analytics)
|
|
134
|
-
*/
|
|
135
|
-
clinicBranchId?: string;
|
|
136
|
-
}
|
|
137
|
-
|
|
1
|
+
import { Timestamp } from 'firebase/firestore';
|
|
2
|
+
import {
|
|
3
|
+
PractitionerAnalytics,
|
|
4
|
+
ProcedureAnalytics,
|
|
5
|
+
TimeEfficiencyMetrics,
|
|
6
|
+
CancellationMetrics,
|
|
7
|
+
NoShowMetrics,
|
|
8
|
+
RevenueMetrics,
|
|
9
|
+
DashboardAnalytics,
|
|
10
|
+
ClinicAnalytics,
|
|
11
|
+
AnalyticsDateRange,
|
|
12
|
+
} from './analytics.types';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Period type for analytics snapshots
|
|
16
|
+
*/
|
|
17
|
+
export type AnalyticsPeriod = 'daily' | 'weekly' | 'monthly' | 'yearly' | 'all_time';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Analytics document metadata
|
|
21
|
+
*/
|
|
22
|
+
export interface AnalyticsMetadata {
|
|
23
|
+
clinicBranchId: string;
|
|
24
|
+
period: AnalyticsPeriod;
|
|
25
|
+
periodStart: Date;
|
|
26
|
+
periodEnd: Date;
|
|
27
|
+
computedAt: Timestamp;
|
|
28
|
+
computedBy: 'cloud_function' | 'manual';
|
|
29
|
+
version: string; // Schema version for future migrations
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Stored Practitioner Analytics
|
|
34
|
+
* Stored in: clinics/{clinicBranchId}/analytics/practitioners/{practitionerId}/{period}
|
|
35
|
+
*/
|
|
36
|
+
export interface StoredPractitionerAnalytics extends PractitionerAnalytics {
|
|
37
|
+
metadata: AnalyticsMetadata;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Stored Procedure Analytics
|
|
42
|
+
* Stored in: clinics/{clinicBranchId}/analytics/procedures/{procedureId}/{period}
|
|
43
|
+
*/
|
|
44
|
+
export interface StoredProcedureAnalytics extends ProcedureAnalytics {
|
|
45
|
+
metadata: AnalyticsMetadata;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Stored Clinic Analytics
|
|
50
|
+
* Stored in: clinics/{clinicBranchId}/analytics/clinic/{period}
|
|
51
|
+
*/
|
|
52
|
+
export interface StoredClinicAnalytics extends ClinicAnalytics {
|
|
53
|
+
metadata: AnalyticsMetadata;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Stored Dashboard Analytics
|
|
58
|
+
* Stored in: clinics/{clinicBranchId}/analytics/dashboard/{period}
|
|
59
|
+
*/
|
|
60
|
+
export interface StoredDashboardAnalytics extends DashboardAnalytics {
|
|
61
|
+
metadata: AnalyticsMetadata;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Stored Time Efficiency Metrics
|
|
66
|
+
* Stored in: clinics/{clinicBranchId}/analytics/time_efficiency/{period}
|
|
67
|
+
*/
|
|
68
|
+
export interface StoredTimeEfficiencyMetrics extends TimeEfficiencyMetrics {
|
|
69
|
+
metadata: AnalyticsMetadata;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Stored Cancellation Metrics
|
|
74
|
+
* Stored in: clinics/{clinicBranchId}/analytics/cancellations/{entityType}/{period}
|
|
75
|
+
*/
|
|
76
|
+
export interface StoredCancellationMetrics extends CancellationMetrics {
|
|
77
|
+
metadata: AnalyticsMetadata;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Stored No-Show Metrics
|
|
82
|
+
* Stored in: clinics/{clinicBranchId}/analytics/no_shows/{entityType}/{period}
|
|
83
|
+
*/
|
|
84
|
+
export interface StoredNoShowMetrics extends NoShowMetrics {
|
|
85
|
+
metadata: AnalyticsMetadata;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Stored Revenue Metrics
|
|
90
|
+
* Stored in: clinics/{clinicBranchId}/analytics/revenue/{period}
|
|
91
|
+
*/
|
|
92
|
+
export interface StoredRevenueMetrics extends RevenueMetrics {
|
|
93
|
+
metadata: AnalyticsMetadata;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Collection names for stored analytics
|
|
98
|
+
*/
|
|
99
|
+
export const ANALYTICS_COLLECTION = 'analytics';
|
|
100
|
+
export const PRACTITIONER_ANALYTICS_SUBCOLLECTION = 'practitioners';
|
|
101
|
+
export const PROCEDURE_ANALYTICS_SUBCOLLECTION = 'procedures';
|
|
102
|
+
export const CLINIC_ANALYTICS_SUBCOLLECTION = 'clinic';
|
|
103
|
+
export const DASHBOARD_ANALYTICS_SUBCOLLECTION = 'dashboard';
|
|
104
|
+
export const TIME_EFFICIENCY_ANALYTICS_SUBCOLLECTION = 'time_efficiency';
|
|
105
|
+
export const CANCELLATION_ANALYTICS_SUBCOLLECTION = 'cancellations';
|
|
106
|
+
export const NO_SHOW_ANALYTICS_SUBCOLLECTION = 'no_shows';
|
|
107
|
+
export const REVENUE_ANALYTICS_SUBCOLLECTION = 'revenue';
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Options for reading stored analytics
|
|
111
|
+
*/
|
|
112
|
+
export interface ReadStoredAnalyticsOptions {
|
|
113
|
+
/**
|
|
114
|
+
* Whether to use cached/pre-computed data
|
|
115
|
+
* @default true
|
|
116
|
+
*/
|
|
117
|
+
useCache?: boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Maximum age of cached data in hours before recalculating
|
|
120
|
+
* @default 12
|
|
121
|
+
*/
|
|
122
|
+
maxCacheAgeHours?: number;
|
|
123
|
+
/**
|
|
124
|
+
* Period to read
|
|
125
|
+
* @default 'all_time'
|
|
126
|
+
*/
|
|
127
|
+
period?: AnalyticsPeriod;
|
|
128
|
+
/**
|
|
129
|
+
* Date range for the period (calculated if not provided)
|
|
130
|
+
*/
|
|
131
|
+
dateRange?: AnalyticsDateRange;
|
|
132
|
+
/**
|
|
133
|
+
* Clinic branch ID (required for reading stored analytics)
|
|
134
|
+
*/
|
|
135
|
+
clinicBranchId?: string;
|
|
136
|
+
}
|
|
137
|
+
|