@blackcode_sa/metaestetics-api 1.13.5 → 1.13.6
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 +20 -1
- package/dist/admin/index.d.ts +20 -1
- package/dist/admin/index.js +217 -1
- package/dist/admin/index.mjs +217 -1
- package/package.json +121 -121
- 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 +966 -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 -2200
- 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 -498
- 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 -494
- 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,380 +1,380 @@
|
|
|
1
|
-
# Trend Analysis - Complete Guide
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
Trend analysis provides time-series insights into key metrics, showing how values change over time and comparing current periods to previous periods. Trends help identify patterns, growth, and areas for improvement.
|
|
6
|
-
|
|
7
|
-
## Key Features
|
|
8
|
-
|
|
9
|
-
- **Period-based grouping**: Week, Month, Quarter, or Year
|
|
10
|
-
- **Percentage change calculations**: Compare current period to previous period
|
|
11
|
-
- **Direction indicators**: Up, down, or stable trends
|
|
12
|
-
- **Grouped trends**: Analyze trends by clinic, practitioner, procedure, technology, or patient
|
|
13
|
-
- **Visualization ready**: Data structured for easy chart rendering
|
|
14
|
-
|
|
15
|
-
## Available Trend Methods
|
|
16
|
-
|
|
17
|
-
### 1. **Revenue Trends** 💰
|
|
18
|
-
|
|
19
|
-
Analyze revenue changes over time with period-over-period comparisons.
|
|
20
|
-
|
|
21
|
-
```typescript
|
|
22
|
-
const revenueTrends = await analyticsService.getRevenueTrends(
|
|
23
|
-
dateRange,
|
|
24
|
-
'month', // Period: 'week' | 'month' | 'quarter' | 'year'
|
|
25
|
-
{ clinicBranchId: 'clinic-123' }, // Optional filters
|
|
26
|
-
'practitioner' // Optional: group by entity
|
|
27
|
-
);
|
|
28
|
-
|
|
29
|
-
// Returns: RevenueTrend[]
|
|
30
|
-
// [
|
|
31
|
-
// {
|
|
32
|
-
// period: '2024-01',
|
|
33
|
-
// startDate: Date,
|
|
34
|
-
// endDate: Date,
|
|
35
|
-
// revenue: 50000,
|
|
36
|
-
// appointmentCount: 100,
|
|
37
|
-
// averageRevenue: 500,
|
|
38
|
-
// currency: 'CHF',
|
|
39
|
-
// previousPeriod: {
|
|
40
|
-
// revenue: 45000,
|
|
41
|
-
// appointmentCount: 90,
|
|
42
|
-
// percentageChange: 11.1, // 11.1% increase
|
|
43
|
-
// direction: 'up'
|
|
44
|
-
// }
|
|
45
|
-
// },
|
|
46
|
-
// ...
|
|
47
|
-
// ]
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
**Use Cases:**
|
|
51
|
-
- Track revenue growth month-over-month
|
|
52
|
-
- Compare revenue by practitioner over quarters
|
|
53
|
-
- Analyze seasonal patterns
|
|
54
|
-
- Identify revenue trends by technology
|
|
55
|
-
|
|
56
|
-
### 2. **Duration/Efficiency Trends** ⏱️
|
|
57
|
-
|
|
58
|
-
Monitor time efficiency trends to optimize scheduling and resource allocation.
|
|
59
|
-
|
|
60
|
-
```typescript
|
|
61
|
-
const durationTrends = await analyticsService.getDurationTrends(
|
|
62
|
-
dateRange,
|
|
63
|
-
'month',
|
|
64
|
-
{ clinicBranchId: 'clinic-123' },
|
|
65
|
-
'procedure' // Optional: group by entity
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
// Returns: DurationTrend[]
|
|
69
|
-
// [
|
|
70
|
-
// {
|
|
71
|
-
// period: '2024-01',
|
|
72
|
-
// startDate: Date,
|
|
73
|
-
// endDate: Date,
|
|
74
|
-
// averageBookedDuration: 60, // minutes
|
|
75
|
-
// averageActualDuration: 55, // minutes
|
|
76
|
-
// averageEfficiency: 91.7, // percentage
|
|
77
|
-
// appointmentCount: 100,
|
|
78
|
-
// previousPeriod: {
|
|
79
|
-
// averageBookedDuration: 60,
|
|
80
|
-
// averageActualDuration: 58,
|
|
81
|
-
// averageEfficiency: 96.7,
|
|
82
|
-
// efficiencyPercentageChange: 5.0, // 5% decrease in efficiency
|
|
83
|
-
// direction: 'down'
|
|
84
|
-
// }
|
|
85
|
-
// },
|
|
86
|
-
// ...
|
|
87
|
-
// ]
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
**Use Cases:**
|
|
91
|
-
- Track efficiency improvements over time
|
|
92
|
-
- Identify scheduling optimization opportunities
|
|
93
|
-
- Compare efficiency across practitioners
|
|
94
|
-
- Monitor time management trends
|
|
95
|
-
|
|
96
|
-
### 3. **Appointment Trends** 📅
|
|
97
|
-
|
|
98
|
-
Analyze appointment volume and status distribution over time.
|
|
99
|
-
|
|
100
|
-
```typescript
|
|
101
|
-
const appointmentTrends = await analyticsService.getAppointmentTrends(
|
|
102
|
-
dateRange,
|
|
103
|
-
'week',
|
|
104
|
-
{ clinicBranchId: 'clinic-123' }
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
// Returns: AppointmentTrend[]
|
|
108
|
-
// [
|
|
109
|
-
// {
|
|
110
|
-
// period: '2024-W01',
|
|
111
|
-
// startDate: Date,
|
|
112
|
-
// endDate: Date,
|
|
113
|
-
// totalAppointments: 50,
|
|
114
|
-
// completedAppointments: 45,
|
|
115
|
-
// canceledAppointments: 3,
|
|
116
|
-
// noShowAppointments: 2,
|
|
117
|
-
// pendingAppointments: 0,
|
|
118
|
-
// confirmedAppointments: 0,
|
|
119
|
-
// previousPeriod: {
|
|
120
|
-
// totalAppointments: 48,
|
|
121
|
-
// completedAppointments: 43,
|
|
122
|
-
// percentageChange: 4.2, // 4.2% increase
|
|
123
|
-
// direction: 'up'
|
|
124
|
-
// }
|
|
125
|
-
// },
|
|
126
|
-
// ...
|
|
127
|
-
// ]
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
**Use Cases:**
|
|
131
|
-
- Track appointment volume growth
|
|
132
|
-
- Monitor completion rates over time
|
|
133
|
-
- Analyze cancellation patterns
|
|
134
|
-
- Compare appointment trends across clinics
|
|
135
|
-
|
|
136
|
-
### 4. **Cancellation Rate Trends** ❌
|
|
137
|
-
|
|
138
|
-
Track cancellation and no-show rates to identify patterns and improve patient retention.
|
|
139
|
-
|
|
140
|
-
```typescript
|
|
141
|
-
const cancellationTrends = await analyticsService.getCancellationRateTrends(
|
|
142
|
-
dateRange,
|
|
143
|
-
'month',
|
|
144
|
-
{ clinicBranchId: 'clinic-123' },
|
|
145
|
-
'practitioner' // Optional: group by entity
|
|
146
|
-
);
|
|
147
|
-
|
|
148
|
-
// Returns: CancellationRateTrend[]
|
|
149
|
-
// [
|
|
150
|
-
// {
|
|
151
|
-
// period: '2024-01',
|
|
152
|
-
// startDate: Date,
|
|
153
|
-
// endDate: Date,
|
|
154
|
-
// cancellationRate: 5.0, // percentage
|
|
155
|
-
// noShowRate: 2.0, // percentage
|
|
156
|
-
// totalAppointments: 100,
|
|
157
|
-
// canceledAppointments: 5,
|
|
158
|
-
// noShowAppointments: 2,
|
|
159
|
-
// previousPeriod: {
|
|
160
|
-
// cancellationRate: 6.0,
|
|
161
|
-
// noShowRate: 2.5,
|
|
162
|
-
// cancellationRateChange: 1.0, // 1% decrease (improvement)
|
|
163
|
-
// noShowRateChange: 0.5, // 0.5% decrease (improvement)
|
|
164
|
-
// direction: 'down' // Lower is better for cancellations
|
|
165
|
-
// }
|
|
166
|
-
// },
|
|
167
|
-
// ...
|
|
168
|
-
// ]
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
**Use Cases:**
|
|
172
|
-
- Monitor cancellation rate improvements
|
|
173
|
-
- Compare cancellation rates across practitioners
|
|
174
|
-
- Identify problematic time periods
|
|
175
|
-
- Track effectiveness of retention strategies
|
|
176
|
-
|
|
177
|
-
## Period Types
|
|
178
|
-
|
|
179
|
-
Trends support four period types:
|
|
180
|
-
|
|
181
|
-
### Week (`'week'`)
|
|
182
|
-
- Groups data by ISO week (Monday to Sunday)
|
|
183
|
-
- Period format: `"2024-W01"` (Year-WeekNumber)
|
|
184
|
-
- Best for: Short-term analysis, weekly patterns
|
|
185
|
-
|
|
186
|
-
### Month (`'month'`)
|
|
187
|
-
- Groups data by calendar month
|
|
188
|
-
- Period format: `"2024-01"` (Year-Month)
|
|
189
|
-
- Best for: Monthly reporting, seasonal analysis
|
|
190
|
-
|
|
191
|
-
### Quarter (`'quarter'`)
|
|
192
|
-
- Groups data by calendar quarter (3 months)
|
|
193
|
-
- Period format: `"2024-Q1"` (Year-Quarter)
|
|
194
|
-
- Best for: Quarterly business reviews, long-term trends
|
|
195
|
-
|
|
196
|
-
### Year (`'year'`)
|
|
197
|
-
- Groups data by calendar year
|
|
198
|
-
- Period format: `"2024"` (Year)
|
|
199
|
-
- Best for: Annual comparisons, long-term growth
|
|
200
|
-
|
|
201
|
-
## Percentage Change Calculation
|
|
202
|
-
|
|
203
|
-
All trends include `previousPeriod` comparison data:
|
|
204
|
-
|
|
205
|
-
```typescript
|
|
206
|
-
previousPeriod: {
|
|
207
|
-
// Previous period value
|
|
208
|
-
value: number,
|
|
209
|
-
|
|
210
|
-
// Percentage change (absolute value)
|
|
211
|
-
percentageChange: number, // e.g., 11.1 means 11.1% change
|
|
212
|
-
|
|
213
|
-
// Direction: 'up' | 'down' | 'stable'
|
|
214
|
-
direction: 'up' // Indicates if trend is increasing, decreasing, or stable
|
|
215
|
-
}
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
**Calculation Formula:**
|
|
219
|
-
```typescript
|
|
220
|
-
percentageChange = ((current - previous) / previous) * 100
|
|
221
|
-
direction = percentageChange > 0.01 ? 'up' : percentageChange < -0.01 ? 'down' : 'stable'
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
**Note:** For cancellation/no-show rates, lower values are better, so the direction may be inverted in UI (e.g., a decrease in cancellation rate shows as 'up' trend).
|
|
225
|
-
|
|
226
|
-
## Grouped Trends
|
|
227
|
-
|
|
228
|
-
All trend methods support optional grouping by entity:
|
|
229
|
-
|
|
230
|
-
```typescript
|
|
231
|
-
// Overall trends (no grouping)
|
|
232
|
-
const overallTrends = await analyticsService.getRevenueTrends(
|
|
233
|
-
dateRange,
|
|
234
|
-
'month',
|
|
235
|
-
{ clinicBranchId: 'clinic-123' }
|
|
236
|
-
);
|
|
237
|
-
|
|
238
|
-
// Trends grouped by practitioner
|
|
239
|
-
const practitionerTrends = await analyticsService.getRevenueTrends(
|
|
240
|
-
dateRange,
|
|
241
|
-
'month',
|
|
242
|
-
{ clinicBranchId: 'clinic-123' },
|
|
243
|
-
'practitioner' // Groups trends by practitioner
|
|
244
|
-
);
|
|
245
|
-
|
|
246
|
-
// Trends grouped by technology
|
|
247
|
-
const technologyTrends = await analyticsService.getRevenueTrends(
|
|
248
|
-
dateRange,
|
|
249
|
-
'quarter',
|
|
250
|
-
{ clinicBranchId: 'clinic-123' },
|
|
251
|
-
'technology' // Aggregates all procedures using same technology
|
|
252
|
-
);
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
**Supported Grouping:**
|
|
256
|
-
- `'clinic'` - Trends by clinic
|
|
257
|
-
- `'practitioner'` - Trends by doctor
|
|
258
|
-
- `'procedure'` - Trends by procedure (includes practitioner association)
|
|
259
|
-
- `'technology'` - Trends by technology (aggregates procedures)
|
|
260
|
-
- `'patient'` - Trends by patient
|
|
261
|
-
|
|
262
|
-
## Frontend Integration
|
|
263
|
-
|
|
264
|
-
### Trend Indicators
|
|
265
|
-
|
|
266
|
-
Display percentage changes with visual indicators:
|
|
267
|
-
|
|
268
|
-
```typescript
|
|
269
|
-
import { TrendIndicator } from '@/pages/Analytics/components/TrendIndicator';
|
|
270
|
-
|
|
271
|
-
<TrendIndicator
|
|
272
|
-
percentageChange={11.1}
|
|
273
|
-
direction="up"
|
|
274
|
-
size="small"
|
|
275
|
-
/>
|
|
276
|
-
// Displays: ↑ 11.1%
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
### Trend Charts
|
|
280
|
-
|
|
281
|
-
Visualize trends over time using line charts:
|
|
282
|
-
|
|
283
|
-
```typescript
|
|
284
|
-
import { TrendChart } from '@/pages/Analytics/components/TrendChart';
|
|
285
|
-
|
|
286
|
-
<TrendChart
|
|
287
|
-
data={trendData.map(t => ({ period: t.period, value: t.revenue }))}
|
|
288
|
-
dataKey="value"
|
|
289
|
-
name="Revenue"
|
|
290
|
-
color="#3b82f6"
|
|
291
|
-
height={300}
|
|
292
|
-
formatValue={(value) => `CHF ${value.toLocaleString()}`}
|
|
293
|
-
/>
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
### Period Selector
|
|
297
|
-
|
|
298
|
-
Allow users to switch between period types:
|
|
299
|
-
|
|
300
|
-
```typescript
|
|
301
|
-
import { PeriodSelector } from '@/pages/Analytics/components/PeriodSelector';
|
|
302
|
-
|
|
303
|
-
<PeriodSelector
|
|
304
|
-
value={trendPeriod}
|
|
305
|
-
onChange={setTrendPeriod}
|
|
306
|
-
/>
|
|
307
|
-
```
|
|
308
|
-
|
|
309
|
-
## Complete Example
|
|
310
|
-
|
|
311
|
-
```typescript
|
|
312
|
-
import { AnalyticsService } from '@blackcode_sa/metaestetics-api';
|
|
313
|
-
|
|
314
|
-
const analyticsService = new AnalyticsService(db, auth, app, appointmentService);
|
|
315
|
-
|
|
316
|
-
// Define date range
|
|
317
|
-
const dateRange = {
|
|
318
|
-
start: new Date('2024-01-01'),
|
|
319
|
-
end: new Date('2024-12-31')
|
|
320
|
-
};
|
|
321
|
-
|
|
322
|
-
// Get revenue trends by month
|
|
323
|
-
const revenueTrends = await analyticsService.getRevenueTrends(
|
|
324
|
-
dateRange,
|
|
325
|
-
'month',
|
|
326
|
-
{ clinicBranchId: 'clinic-123' }
|
|
327
|
-
);
|
|
328
|
-
|
|
329
|
-
// Process trends
|
|
330
|
-
revenueTrends.forEach(trend => {
|
|
331
|
-
console.log(`Period: ${trend.period}`);
|
|
332
|
-
console.log(`Revenue: ${trend.currency} ${trend.revenue.toLocaleString()}`);
|
|
333
|
-
console.log(`Appointments: ${trend.appointmentCount}`);
|
|
334
|
-
|
|
335
|
-
if (trend.previousPeriod) {
|
|
336
|
-
const change = trend.previousPeriod.percentageChange;
|
|
337
|
-
const direction = trend.previousPeriod.direction;
|
|
338
|
-
console.log(`Change: ${direction === 'up' ? '+' : '-'}${change.toFixed(1)}%`);
|
|
339
|
-
}
|
|
340
|
-
});
|
|
341
|
-
|
|
342
|
-
// Get efficiency trends grouped by practitioner
|
|
343
|
-
const efficiencyTrends = await analyticsService.getDurationTrends(
|
|
344
|
-
dateRange,
|
|
345
|
-
'quarter',
|
|
346
|
-
{ clinicBranchId: 'clinic-123' },
|
|
347
|
-
'practitioner'
|
|
348
|
-
);
|
|
349
|
-
|
|
350
|
-
// Analyze efficiency improvements
|
|
351
|
-
efficiencyTrends.forEach(trend => {
|
|
352
|
-
if (trend.previousPeriod && trend.previousPeriod.direction === 'up') {
|
|
353
|
-
console.log(`Efficiency improved by ${trend.previousPeriod.efficiencyPercentageChange}%`);
|
|
354
|
-
}
|
|
355
|
-
});
|
|
356
|
-
```
|
|
357
|
-
|
|
358
|
-
## Best Practices
|
|
359
|
-
|
|
360
|
-
1. **Choose appropriate period**: Use weeks for short-term analysis, quarters/years for strategic planning
|
|
361
|
-
2. **Compare periods**: Always check `previousPeriod` data to understand context
|
|
362
|
-
3. **Group when needed**: Use entity grouping to drill down into specific areas
|
|
363
|
-
4. **Visualize trends**: Use charts to make trends easier to understand
|
|
364
|
-
5. **Consider seasonality**: Account for seasonal patterns when analyzing trends
|
|
365
|
-
6. **Monitor direction**: Pay attention to trend direction (up/down/stable) for quick insights
|
|
366
|
-
|
|
367
|
-
## Limitations
|
|
368
|
-
|
|
369
|
-
- **No custom periods**: Trends only support week, month, quarter, and year periods
|
|
370
|
-
- **No trailing periods**: Trends require predefined periods (not "last 7 days" style)
|
|
371
|
-
- **Period alignment**: Date ranges should align with period boundaries for best results
|
|
372
|
-
- **In-memory calculation**: Trends are calculated on-demand (consider caching for large datasets)
|
|
373
|
-
|
|
374
|
-
## Related Documentation
|
|
375
|
-
|
|
376
|
-
- [Analytics Service README](./README.md)
|
|
377
|
-
- [Grouped Analytics Guide](./GROUPED_ANALYTICS.md)
|
|
378
|
-
- [Analytics Types](../../types/analytics/analytics.types.ts)
|
|
379
|
-
- [Trend Calculation Utils](./utils/trend-calculation.utils.ts)
|
|
380
|
-
|
|
1
|
+
# Trend Analysis - Complete Guide
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Trend analysis provides time-series insights into key metrics, showing how values change over time and comparing current periods to previous periods. Trends help identify patterns, growth, and areas for improvement.
|
|
6
|
+
|
|
7
|
+
## Key Features
|
|
8
|
+
|
|
9
|
+
- **Period-based grouping**: Week, Month, Quarter, or Year
|
|
10
|
+
- **Percentage change calculations**: Compare current period to previous period
|
|
11
|
+
- **Direction indicators**: Up, down, or stable trends
|
|
12
|
+
- **Grouped trends**: Analyze trends by clinic, practitioner, procedure, technology, or patient
|
|
13
|
+
- **Visualization ready**: Data structured for easy chart rendering
|
|
14
|
+
|
|
15
|
+
## Available Trend Methods
|
|
16
|
+
|
|
17
|
+
### 1. **Revenue Trends** 💰
|
|
18
|
+
|
|
19
|
+
Analyze revenue changes over time with period-over-period comparisons.
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
const revenueTrends = await analyticsService.getRevenueTrends(
|
|
23
|
+
dateRange,
|
|
24
|
+
'month', // Period: 'week' | 'month' | 'quarter' | 'year'
|
|
25
|
+
{ clinicBranchId: 'clinic-123' }, // Optional filters
|
|
26
|
+
'practitioner' // Optional: group by entity
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
// Returns: RevenueTrend[]
|
|
30
|
+
// [
|
|
31
|
+
// {
|
|
32
|
+
// period: '2024-01',
|
|
33
|
+
// startDate: Date,
|
|
34
|
+
// endDate: Date,
|
|
35
|
+
// revenue: 50000,
|
|
36
|
+
// appointmentCount: 100,
|
|
37
|
+
// averageRevenue: 500,
|
|
38
|
+
// currency: 'CHF',
|
|
39
|
+
// previousPeriod: {
|
|
40
|
+
// revenue: 45000,
|
|
41
|
+
// appointmentCount: 90,
|
|
42
|
+
// percentageChange: 11.1, // 11.1% increase
|
|
43
|
+
// direction: 'up'
|
|
44
|
+
// }
|
|
45
|
+
// },
|
|
46
|
+
// ...
|
|
47
|
+
// ]
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Use Cases:**
|
|
51
|
+
- Track revenue growth month-over-month
|
|
52
|
+
- Compare revenue by practitioner over quarters
|
|
53
|
+
- Analyze seasonal patterns
|
|
54
|
+
- Identify revenue trends by technology
|
|
55
|
+
|
|
56
|
+
### 2. **Duration/Efficiency Trends** ⏱️
|
|
57
|
+
|
|
58
|
+
Monitor time efficiency trends to optimize scheduling and resource allocation.
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
const durationTrends = await analyticsService.getDurationTrends(
|
|
62
|
+
dateRange,
|
|
63
|
+
'month',
|
|
64
|
+
{ clinicBranchId: 'clinic-123' },
|
|
65
|
+
'procedure' // Optional: group by entity
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
// Returns: DurationTrend[]
|
|
69
|
+
// [
|
|
70
|
+
// {
|
|
71
|
+
// period: '2024-01',
|
|
72
|
+
// startDate: Date,
|
|
73
|
+
// endDate: Date,
|
|
74
|
+
// averageBookedDuration: 60, // minutes
|
|
75
|
+
// averageActualDuration: 55, // minutes
|
|
76
|
+
// averageEfficiency: 91.7, // percentage
|
|
77
|
+
// appointmentCount: 100,
|
|
78
|
+
// previousPeriod: {
|
|
79
|
+
// averageBookedDuration: 60,
|
|
80
|
+
// averageActualDuration: 58,
|
|
81
|
+
// averageEfficiency: 96.7,
|
|
82
|
+
// efficiencyPercentageChange: 5.0, // 5% decrease in efficiency
|
|
83
|
+
// direction: 'down'
|
|
84
|
+
// }
|
|
85
|
+
// },
|
|
86
|
+
// ...
|
|
87
|
+
// ]
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Use Cases:**
|
|
91
|
+
- Track efficiency improvements over time
|
|
92
|
+
- Identify scheduling optimization opportunities
|
|
93
|
+
- Compare efficiency across practitioners
|
|
94
|
+
- Monitor time management trends
|
|
95
|
+
|
|
96
|
+
### 3. **Appointment Trends** 📅
|
|
97
|
+
|
|
98
|
+
Analyze appointment volume and status distribution over time.
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
const appointmentTrends = await analyticsService.getAppointmentTrends(
|
|
102
|
+
dateRange,
|
|
103
|
+
'week',
|
|
104
|
+
{ clinicBranchId: 'clinic-123' }
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
// Returns: AppointmentTrend[]
|
|
108
|
+
// [
|
|
109
|
+
// {
|
|
110
|
+
// period: '2024-W01',
|
|
111
|
+
// startDate: Date,
|
|
112
|
+
// endDate: Date,
|
|
113
|
+
// totalAppointments: 50,
|
|
114
|
+
// completedAppointments: 45,
|
|
115
|
+
// canceledAppointments: 3,
|
|
116
|
+
// noShowAppointments: 2,
|
|
117
|
+
// pendingAppointments: 0,
|
|
118
|
+
// confirmedAppointments: 0,
|
|
119
|
+
// previousPeriod: {
|
|
120
|
+
// totalAppointments: 48,
|
|
121
|
+
// completedAppointments: 43,
|
|
122
|
+
// percentageChange: 4.2, // 4.2% increase
|
|
123
|
+
// direction: 'up'
|
|
124
|
+
// }
|
|
125
|
+
// },
|
|
126
|
+
// ...
|
|
127
|
+
// ]
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Use Cases:**
|
|
131
|
+
- Track appointment volume growth
|
|
132
|
+
- Monitor completion rates over time
|
|
133
|
+
- Analyze cancellation patterns
|
|
134
|
+
- Compare appointment trends across clinics
|
|
135
|
+
|
|
136
|
+
### 4. **Cancellation Rate Trends** ❌
|
|
137
|
+
|
|
138
|
+
Track cancellation and no-show rates to identify patterns and improve patient retention.
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
const cancellationTrends = await analyticsService.getCancellationRateTrends(
|
|
142
|
+
dateRange,
|
|
143
|
+
'month',
|
|
144
|
+
{ clinicBranchId: 'clinic-123' },
|
|
145
|
+
'practitioner' // Optional: group by entity
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
// Returns: CancellationRateTrend[]
|
|
149
|
+
// [
|
|
150
|
+
// {
|
|
151
|
+
// period: '2024-01',
|
|
152
|
+
// startDate: Date,
|
|
153
|
+
// endDate: Date,
|
|
154
|
+
// cancellationRate: 5.0, // percentage
|
|
155
|
+
// noShowRate: 2.0, // percentage
|
|
156
|
+
// totalAppointments: 100,
|
|
157
|
+
// canceledAppointments: 5,
|
|
158
|
+
// noShowAppointments: 2,
|
|
159
|
+
// previousPeriod: {
|
|
160
|
+
// cancellationRate: 6.0,
|
|
161
|
+
// noShowRate: 2.5,
|
|
162
|
+
// cancellationRateChange: 1.0, // 1% decrease (improvement)
|
|
163
|
+
// noShowRateChange: 0.5, // 0.5% decrease (improvement)
|
|
164
|
+
// direction: 'down' // Lower is better for cancellations
|
|
165
|
+
// }
|
|
166
|
+
// },
|
|
167
|
+
// ...
|
|
168
|
+
// ]
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**Use Cases:**
|
|
172
|
+
- Monitor cancellation rate improvements
|
|
173
|
+
- Compare cancellation rates across practitioners
|
|
174
|
+
- Identify problematic time periods
|
|
175
|
+
- Track effectiveness of retention strategies
|
|
176
|
+
|
|
177
|
+
## Period Types
|
|
178
|
+
|
|
179
|
+
Trends support four period types:
|
|
180
|
+
|
|
181
|
+
### Week (`'week'`)
|
|
182
|
+
- Groups data by ISO week (Monday to Sunday)
|
|
183
|
+
- Period format: `"2024-W01"` (Year-WeekNumber)
|
|
184
|
+
- Best for: Short-term analysis, weekly patterns
|
|
185
|
+
|
|
186
|
+
### Month (`'month'`)
|
|
187
|
+
- Groups data by calendar month
|
|
188
|
+
- Period format: `"2024-01"` (Year-Month)
|
|
189
|
+
- Best for: Monthly reporting, seasonal analysis
|
|
190
|
+
|
|
191
|
+
### Quarter (`'quarter'`)
|
|
192
|
+
- Groups data by calendar quarter (3 months)
|
|
193
|
+
- Period format: `"2024-Q1"` (Year-Quarter)
|
|
194
|
+
- Best for: Quarterly business reviews, long-term trends
|
|
195
|
+
|
|
196
|
+
### Year (`'year'`)
|
|
197
|
+
- Groups data by calendar year
|
|
198
|
+
- Period format: `"2024"` (Year)
|
|
199
|
+
- Best for: Annual comparisons, long-term growth
|
|
200
|
+
|
|
201
|
+
## Percentage Change Calculation
|
|
202
|
+
|
|
203
|
+
All trends include `previousPeriod` comparison data:
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
previousPeriod: {
|
|
207
|
+
// Previous period value
|
|
208
|
+
value: number,
|
|
209
|
+
|
|
210
|
+
// Percentage change (absolute value)
|
|
211
|
+
percentageChange: number, // e.g., 11.1 means 11.1% change
|
|
212
|
+
|
|
213
|
+
// Direction: 'up' | 'down' | 'stable'
|
|
214
|
+
direction: 'up' // Indicates if trend is increasing, decreasing, or stable
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**Calculation Formula:**
|
|
219
|
+
```typescript
|
|
220
|
+
percentageChange = ((current - previous) / previous) * 100
|
|
221
|
+
direction = percentageChange > 0.01 ? 'up' : percentageChange < -0.01 ? 'down' : 'stable'
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**Note:** For cancellation/no-show rates, lower values are better, so the direction may be inverted in UI (e.g., a decrease in cancellation rate shows as 'up' trend).
|
|
225
|
+
|
|
226
|
+
## Grouped Trends
|
|
227
|
+
|
|
228
|
+
All trend methods support optional grouping by entity:
|
|
229
|
+
|
|
230
|
+
```typescript
|
|
231
|
+
// Overall trends (no grouping)
|
|
232
|
+
const overallTrends = await analyticsService.getRevenueTrends(
|
|
233
|
+
dateRange,
|
|
234
|
+
'month',
|
|
235
|
+
{ clinicBranchId: 'clinic-123' }
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
// Trends grouped by practitioner
|
|
239
|
+
const practitionerTrends = await analyticsService.getRevenueTrends(
|
|
240
|
+
dateRange,
|
|
241
|
+
'month',
|
|
242
|
+
{ clinicBranchId: 'clinic-123' },
|
|
243
|
+
'practitioner' // Groups trends by practitioner
|
|
244
|
+
);
|
|
245
|
+
|
|
246
|
+
// Trends grouped by technology
|
|
247
|
+
const technologyTrends = await analyticsService.getRevenueTrends(
|
|
248
|
+
dateRange,
|
|
249
|
+
'quarter',
|
|
250
|
+
{ clinicBranchId: 'clinic-123' },
|
|
251
|
+
'technology' // Aggregates all procedures using same technology
|
|
252
|
+
);
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
**Supported Grouping:**
|
|
256
|
+
- `'clinic'` - Trends by clinic
|
|
257
|
+
- `'practitioner'` - Trends by doctor
|
|
258
|
+
- `'procedure'` - Trends by procedure (includes practitioner association)
|
|
259
|
+
- `'technology'` - Trends by technology (aggregates procedures)
|
|
260
|
+
- `'patient'` - Trends by patient
|
|
261
|
+
|
|
262
|
+
## Frontend Integration
|
|
263
|
+
|
|
264
|
+
### Trend Indicators
|
|
265
|
+
|
|
266
|
+
Display percentage changes with visual indicators:
|
|
267
|
+
|
|
268
|
+
```typescript
|
|
269
|
+
import { TrendIndicator } from '@/pages/Analytics/components/TrendIndicator';
|
|
270
|
+
|
|
271
|
+
<TrendIndicator
|
|
272
|
+
percentageChange={11.1}
|
|
273
|
+
direction="up"
|
|
274
|
+
size="small"
|
|
275
|
+
/>
|
|
276
|
+
// Displays: ↑ 11.1%
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Trend Charts
|
|
280
|
+
|
|
281
|
+
Visualize trends over time using line charts:
|
|
282
|
+
|
|
283
|
+
```typescript
|
|
284
|
+
import { TrendChart } from '@/pages/Analytics/components/TrendChart';
|
|
285
|
+
|
|
286
|
+
<TrendChart
|
|
287
|
+
data={trendData.map(t => ({ period: t.period, value: t.revenue }))}
|
|
288
|
+
dataKey="value"
|
|
289
|
+
name="Revenue"
|
|
290
|
+
color="#3b82f6"
|
|
291
|
+
height={300}
|
|
292
|
+
formatValue={(value) => `CHF ${value.toLocaleString()}`}
|
|
293
|
+
/>
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Period Selector
|
|
297
|
+
|
|
298
|
+
Allow users to switch between period types:
|
|
299
|
+
|
|
300
|
+
```typescript
|
|
301
|
+
import { PeriodSelector } from '@/pages/Analytics/components/PeriodSelector';
|
|
302
|
+
|
|
303
|
+
<PeriodSelector
|
|
304
|
+
value={trendPeriod}
|
|
305
|
+
onChange={setTrendPeriod}
|
|
306
|
+
/>
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
## Complete Example
|
|
310
|
+
|
|
311
|
+
```typescript
|
|
312
|
+
import { AnalyticsService } from '@blackcode_sa/metaestetics-api';
|
|
313
|
+
|
|
314
|
+
const analyticsService = new AnalyticsService(db, auth, app, appointmentService);
|
|
315
|
+
|
|
316
|
+
// Define date range
|
|
317
|
+
const dateRange = {
|
|
318
|
+
start: new Date('2024-01-01'),
|
|
319
|
+
end: new Date('2024-12-31')
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
// Get revenue trends by month
|
|
323
|
+
const revenueTrends = await analyticsService.getRevenueTrends(
|
|
324
|
+
dateRange,
|
|
325
|
+
'month',
|
|
326
|
+
{ clinicBranchId: 'clinic-123' }
|
|
327
|
+
);
|
|
328
|
+
|
|
329
|
+
// Process trends
|
|
330
|
+
revenueTrends.forEach(trend => {
|
|
331
|
+
console.log(`Period: ${trend.period}`);
|
|
332
|
+
console.log(`Revenue: ${trend.currency} ${trend.revenue.toLocaleString()}`);
|
|
333
|
+
console.log(`Appointments: ${trend.appointmentCount}`);
|
|
334
|
+
|
|
335
|
+
if (trend.previousPeriod) {
|
|
336
|
+
const change = trend.previousPeriod.percentageChange;
|
|
337
|
+
const direction = trend.previousPeriod.direction;
|
|
338
|
+
console.log(`Change: ${direction === 'up' ? '+' : '-'}${change.toFixed(1)}%`);
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
// Get efficiency trends grouped by practitioner
|
|
343
|
+
const efficiencyTrends = await analyticsService.getDurationTrends(
|
|
344
|
+
dateRange,
|
|
345
|
+
'quarter',
|
|
346
|
+
{ clinicBranchId: 'clinic-123' },
|
|
347
|
+
'practitioner'
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
// Analyze efficiency improvements
|
|
351
|
+
efficiencyTrends.forEach(trend => {
|
|
352
|
+
if (trend.previousPeriod && trend.previousPeriod.direction === 'up') {
|
|
353
|
+
console.log(`Efficiency improved by ${trend.previousPeriod.efficiencyPercentageChange}%`);
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
## Best Practices
|
|
359
|
+
|
|
360
|
+
1. **Choose appropriate period**: Use weeks for short-term analysis, quarters/years for strategic planning
|
|
361
|
+
2. **Compare periods**: Always check `previousPeriod` data to understand context
|
|
362
|
+
3. **Group when needed**: Use entity grouping to drill down into specific areas
|
|
363
|
+
4. **Visualize trends**: Use charts to make trends easier to understand
|
|
364
|
+
5. **Consider seasonality**: Account for seasonal patterns when analyzing trends
|
|
365
|
+
6. **Monitor direction**: Pay attention to trend direction (up/down/stable) for quick insights
|
|
366
|
+
|
|
367
|
+
## Limitations
|
|
368
|
+
|
|
369
|
+
- **No custom periods**: Trends only support week, month, quarter, and year periods
|
|
370
|
+
- **No trailing periods**: Trends require predefined periods (not "last 7 days" style)
|
|
371
|
+
- **Period alignment**: Date ranges should align with period boundaries for best results
|
|
372
|
+
- **In-memory calculation**: Trends are calculated on-demand (consider caching for large datasets)
|
|
373
|
+
|
|
374
|
+
## Related Documentation
|
|
375
|
+
|
|
376
|
+
- [Analytics Service README](./README.md)
|
|
377
|
+
- [Grouped Analytics Guide](./GROUPED_ANALYTICS.md)
|
|
378
|
+
- [Analytics Types](../../types/analytics/analytics.types.ts)
|
|
379
|
+
- [Trend Calculation Utils](./utils/trend-calculation.utils.ts)
|
|
380
|
+
|