@blackcode_sa/metaestetics-api 1.13.4 → 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 +16 -29
- package/dist/index.d.ts +16 -29
- package/dist/index.js +1 -0
- package/dist/index.mjs +1 -0
- 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 -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 -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,225 +1,225 @@
|
|
|
1
|
-
# Analytics Cloud Functions Guide
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
The Analytics Service supports **on-demand calculation via Cloud Functions**, allowing you to trigger fresh analytics calculations server-side and optionally cache the results.
|
|
6
|
-
|
|
7
|
-
## Available Cloud Functions
|
|
8
|
-
|
|
9
|
-
### 1. `calculateAnalyticsOnDemand` (Callable)
|
|
10
|
-
|
|
11
|
-
A callable Cloud Function that calculates analytics on-demand and optionally stores results in cache.
|
|
12
|
-
|
|
13
|
-
**Location**: `Cloud/functions/src/analytics/calculateAnalyticsOnDemand.ts`
|
|
14
|
-
|
|
15
|
-
## Usage
|
|
16
|
-
|
|
17
|
-
### Using the Client Service Helper
|
|
18
|
-
|
|
19
|
-
```typescript
|
|
20
|
-
import { AnalyticsCloudService } from '@blackcode_sa/metaestetics-api';
|
|
21
|
-
import { getApp } from 'firebase/app';
|
|
22
|
-
|
|
23
|
-
const app = getApp();
|
|
24
|
-
const cloudService = new AnalyticsCloudService(app);
|
|
25
|
-
|
|
26
|
-
// Calculate dashboard analytics on-demand
|
|
27
|
-
const dashboard = await cloudService.calculateDashboard(
|
|
28
|
-
{ clinicBranchId: 'clinic-123' },
|
|
29
|
-
{ start: new Date('2024-01-01'), end: new Date('2024-12-31') },
|
|
30
|
-
{ storeInCache: true } // Store result for future use
|
|
31
|
-
);
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
### Direct Callable Function Usage
|
|
35
|
-
|
|
36
|
-
```typescript
|
|
37
|
-
import { getFunctions, httpsCallable } from 'firebase/functions';
|
|
38
|
-
import { getApp } from 'firebase/app';
|
|
39
|
-
|
|
40
|
-
const functions = getFunctions(getApp(), 'europe-west6');
|
|
41
|
-
const calculateAnalytics = httpsCallable(functions, 'calculateAnalyticsOnDemand');
|
|
42
|
-
|
|
43
|
-
// Calculate revenue metrics grouped by practitioner
|
|
44
|
-
const result = await calculateAnalytics({
|
|
45
|
-
analyticsType: 'revenueByEntity',
|
|
46
|
-
groupBy: 'practitioner',
|
|
47
|
-
filters: { clinicBranchId: 'clinic-123' },
|
|
48
|
-
dateRange: {
|
|
49
|
-
start: '2024-01-01T00:00:00Z',
|
|
50
|
-
end: '2024-12-31T23:59:59Z',
|
|
51
|
-
},
|
|
52
|
-
options: {
|
|
53
|
-
storeInCache: true, // Store in cache after calculation
|
|
54
|
-
useCache: false, // Force fresh calculation
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
const revenueByPractitioner = result.data.data;
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## Supported Analytics Types
|
|
62
|
-
|
|
63
|
-
### Top-Level Analytics
|
|
64
|
-
|
|
65
|
-
- `dashboard` - Complete dashboard analytics
|
|
66
|
-
- `practitioner` - Individual practitioner analytics (requires `entityId`)
|
|
67
|
-
- `procedure` - Individual procedure analytics (requires `entityId`)
|
|
68
|
-
- `clinic` - Clinic-level analytics
|
|
69
|
-
- `timeEfficiency` - Time efficiency metrics
|
|
70
|
-
- `revenue` - Revenue metrics
|
|
71
|
-
- `productUsage` - Product usage metrics
|
|
72
|
-
- `patient` - Patient analytics (optional `entityId`)
|
|
73
|
-
|
|
74
|
-
### Grouped Analytics
|
|
75
|
-
|
|
76
|
-
- `revenueByEntity` - Revenue grouped by clinic/practitioner/procedure/patient/technology (requires `groupBy`)
|
|
77
|
-
- `productUsageByEntity` - Product usage grouped by entity (requires `groupBy`)
|
|
78
|
-
- `timeEfficiencyByEntity` - Time efficiency grouped by entity (requires `groupBy`)
|
|
79
|
-
- `patientBehaviorByEntity` - Patient behavior grouped by entity (requires `groupBy`)
|
|
80
|
-
- `cancellation` - Cancellation metrics grouped by entity (requires `groupBy`)
|
|
81
|
-
- `noShow` - No-show metrics grouped by entity (requires `groupBy`)
|
|
82
|
-
|
|
83
|
-
## Request Parameters
|
|
84
|
-
|
|
85
|
-
```typescript
|
|
86
|
-
interface CalculateAnalyticsRequest {
|
|
87
|
-
analyticsType: string; // Required: Type of analytics to calculate
|
|
88
|
-
filters?: AnalyticsFilters; // Optional: Filters (clinicBranchId, etc.)
|
|
89
|
-
dateRange?: { // Optional: Date range
|
|
90
|
-
start: string; // ISO date string
|
|
91
|
-
end: string; // ISO date string
|
|
92
|
-
};
|
|
93
|
-
entityId?: string; // Required for practitioner/procedure/patient
|
|
94
|
-
groupBy?: EntityType; // Required for grouped analytics
|
|
95
|
-
options?: {
|
|
96
|
-
storeInCache?: boolean; // Default: true - Store result in cache
|
|
97
|
-
useCache?: boolean; // Default: false - Use cache if available
|
|
98
|
-
maxCacheAgeHours?: number; // Default: 12 - Max cache age
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Response Format
|
|
104
|
-
|
|
105
|
-
```typescript
|
|
106
|
-
interface CalculateAnalyticsResponse {
|
|
107
|
-
success: boolean;
|
|
108
|
-
data: any; // The calculated analytics data
|
|
109
|
-
computedAt: string; // ISO timestamp of when it was computed
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
## Examples
|
|
114
|
-
|
|
115
|
-
### Example 1: Calculate Dashboard Analytics
|
|
116
|
-
|
|
117
|
-
```typescript
|
|
118
|
-
const dashboard = await cloudService.calculateDashboard(
|
|
119
|
-
{ clinicBranchId: 'clinic-123' },
|
|
120
|
-
{ start: new Date('2024-01-01'), end: new Date('2024-12-31') },
|
|
121
|
-
{ storeInCache: true }
|
|
122
|
-
);
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### Example 2: Calculate Revenue by Technology
|
|
126
|
-
|
|
127
|
-
```typescript
|
|
128
|
-
const revenueByTechnology = await cloudService.calculateRevenueByEntity(
|
|
129
|
-
'technology',
|
|
130
|
-
{ start: new Date('2024-01-01'), end: new Date('2024-12-31') },
|
|
131
|
-
{ clinicBranchId: 'clinic-123' },
|
|
132
|
-
{ storeInCache: true }
|
|
133
|
-
);
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
### Example 3: Force Fresh Calculation (Bypass Cache)
|
|
137
|
-
|
|
138
|
-
```typescript
|
|
139
|
-
const result = await calculateAnalytics({
|
|
140
|
-
analyticsType: 'dashboard',
|
|
141
|
-
filters: { clinicBranchId: 'clinic-123' },
|
|
142
|
-
dateRange: {
|
|
143
|
-
start: '2024-01-01T00:00:00Z',
|
|
144
|
-
end: '2024-12-31T23:59:59Z',
|
|
145
|
-
},
|
|
146
|
-
options: {
|
|
147
|
-
useCache: false, // Don't use cache
|
|
148
|
-
storeInCache: true, // But store the result
|
|
149
|
-
},
|
|
150
|
-
});
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### Example 4: Calculate Practitioner Analytics
|
|
154
|
-
|
|
155
|
-
```typescript
|
|
156
|
-
const practitionerMetrics = await cloudService.calculatePractitioner(
|
|
157
|
-
'practitioner-123',
|
|
158
|
-
{ start: new Date('2024-01-01'), end: new Date('2024-12-31') },
|
|
159
|
-
{
|
|
160
|
-
storeInCache: true,
|
|
161
|
-
clinicBranchId: 'clinic-123',
|
|
162
|
-
}
|
|
163
|
-
);
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
## Benefits
|
|
167
|
-
|
|
168
|
-
### Performance
|
|
169
|
-
- **Server-side computation**: Faster than client-side for large datasets
|
|
170
|
-
- **Parallel processing**: Cloud Functions can handle multiple requests simultaneously
|
|
171
|
-
- **No client resource usage**: Computation happens in the cloud
|
|
172
|
-
|
|
173
|
-
### Caching
|
|
174
|
-
- **Automatic caching**: Results can be stored automatically
|
|
175
|
-
- **Future reads**: Cached results can be read instantly by `AnalyticsService`
|
|
176
|
-
- **Configurable**: Control whether to use/store cache
|
|
177
|
-
|
|
178
|
-
### Cost Optimization
|
|
179
|
-
- **Efficient**: Server-side computation is optimized
|
|
180
|
-
- **Scalable**: Handles large datasets without client limitations
|
|
181
|
-
- **Predictable**: Fixed cost per calculation
|
|
182
|
-
|
|
183
|
-
## When to Use
|
|
184
|
-
|
|
185
|
-
### Use Cloud Function When:
|
|
186
|
-
- ✅ Cache is stale and you need fresh data immediately
|
|
187
|
-
- ✅ Calculating analytics for large date ranges
|
|
188
|
-
- ✅ Need to calculate multiple analytics types
|
|
189
|
-
- ✅ Want to store results for future use
|
|
190
|
-
- ✅ Client device has limited resources
|
|
191
|
-
|
|
192
|
-
### Use Client Service When:
|
|
193
|
-
- ✅ Cache is fresh (< 12 hours old)
|
|
194
|
-
- ✅ Small date ranges
|
|
195
|
-
- ✅ Quick reads from cache
|
|
196
|
-
- ✅ Offline-first scenarios
|
|
197
|
-
|
|
198
|
-
## Error Handling
|
|
199
|
-
|
|
200
|
-
```typescript
|
|
201
|
-
try {
|
|
202
|
-
const result = await cloudService.calculateDashboard(...);
|
|
203
|
-
} catch (error) {
|
|
204
|
-
if (error.code === 'invalid-argument') {
|
|
205
|
-
// Invalid parameters provided
|
|
206
|
-
} else if (error.code === 'internal') {
|
|
207
|
-
// Server error during calculation
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
## Integration with AnalyticsService
|
|
213
|
-
|
|
214
|
-
The Cloud Function works seamlessly with `AnalyticsService`:
|
|
215
|
-
|
|
216
|
-
1. **Client checks cache first** (via `AnalyticsService`)
|
|
217
|
-
2. **If cache is stale/missing**, call Cloud Function
|
|
218
|
-
3. **Cloud Function calculates** and optionally stores result
|
|
219
|
-
4. **Future reads** use the cached data
|
|
220
|
-
|
|
221
|
-
This creates a **hybrid approach**:
|
|
222
|
-
- Fast reads from cache (default)
|
|
223
|
-
- On-demand fresh calculations when needed
|
|
224
|
-
- Automatic caching for future use
|
|
225
|
-
|
|
1
|
+
# Analytics Cloud Functions Guide
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The Analytics Service supports **on-demand calculation via Cloud Functions**, allowing you to trigger fresh analytics calculations server-side and optionally cache the results.
|
|
6
|
+
|
|
7
|
+
## Available Cloud Functions
|
|
8
|
+
|
|
9
|
+
### 1. `calculateAnalyticsOnDemand` (Callable)
|
|
10
|
+
|
|
11
|
+
A callable Cloud Function that calculates analytics on-demand and optionally stores results in cache.
|
|
12
|
+
|
|
13
|
+
**Location**: `Cloud/functions/src/analytics/calculateAnalyticsOnDemand.ts`
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
### Using the Client Service Helper
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { AnalyticsCloudService } from '@blackcode_sa/metaestetics-api';
|
|
21
|
+
import { getApp } from 'firebase/app';
|
|
22
|
+
|
|
23
|
+
const app = getApp();
|
|
24
|
+
const cloudService = new AnalyticsCloudService(app);
|
|
25
|
+
|
|
26
|
+
// Calculate dashboard analytics on-demand
|
|
27
|
+
const dashboard = await cloudService.calculateDashboard(
|
|
28
|
+
{ clinicBranchId: 'clinic-123' },
|
|
29
|
+
{ start: new Date('2024-01-01'), end: new Date('2024-12-31') },
|
|
30
|
+
{ storeInCache: true } // Store result for future use
|
|
31
|
+
);
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Direct Callable Function Usage
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { getFunctions, httpsCallable } from 'firebase/functions';
|
|
38
|
+
import { getApp } from 'firebase/app';
|
|
39
|
+
|
|
40
|
+
const functions = getFunctions(getApp(), 'europe-west6');
|
|
41
|
+
const calculateAnalytics = httpsCallable(functions, 'calculateAnalyticsOnDemand');
|
|
42
|
+
|
|
43
|
+
// Calculate revenue metrics grouped by practitioner
|
|
44
|
+
const result = await calculateAnalytics({
|
|
45
|
+
analyticsType: 'revenueByEntity',
|
|
46
|
+
groupBy: 'practitioner',
|
|
47
|
+
filters: { clinicBranchId: 'clinic-123' },
|
|
48
|
+
dateRange: {
|
|
49
|
+
start: '2024-01-01T00:00:00Z',
|
|
50
|
+
end: '2024-12-31T23:59:59Z',
|
|
51
|
+
},
|
|
52
|
+
options: {
|
|
53
|
+
storeInCache: true, // Store in cache after calculation
|
|
54
|
+
useCache: false, // Force fresh calculation
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const revenueByPractitioner = result.data.data;
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Supported Analytics Types
|
|
62
|
+
|
|
63
|
+
### Top-Level Analytics
|
|
64
|
+
|
|
65
|
+
- `dashboard` - Complete dashboard analytics
|
|
66
|
+
- `practitioner` - Individual practitioner analytics (requires `entityId`)
|
|
67
|
+
- `procedure` - Individual procedure analytics (requires `entityId`)
|
|
68
|
+
- `clinic` - Clinic-level analytics
|
|
69
|
+
- `timeEfficiency` - Time efficiency metrics
|
|
70
|
+
- `revenue` - Revenue metrics
|
|
71
|
+
- `productUsage` - Product usage metrics
|
|
72
|
+
- `patient` - Patient analytics (optional `entityId`)
|
|
73
|
+
|
|
74
|
+
### Grouped Analytics
|
|
75
|
+
|
|
76
|
+
- `revenueByEntity` - Revenue grouped by clinic/practitioner/procedure/patient/technology (requires `groupBy`)
|
|
77
|
+
- `productUsageByEntity` - Product usage grouped by entity (requires `groupBy`)
|
|
78
|
+
- `timeEfficiencyByEntity` - Time efficiency grouped by entity (requires `groupBy`)
|
|
79
|
+
- `patientBehaviorByEntity` - Patient behavior grouped by entity (requires `groupBy`)
|
|
80
|
+
- `cancellation` - Cancellation metrics grouped by entity (requires `groupBy`)
|
|
81
|
+
- `noShow` - No-show metrics grouped by entity (requires `groupBy`)
|
|
82
|
+
|
|
83
|
+
## Request Parameters
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
interface CalculateAnalyticsRequest {
|
|
87
|
+
analyticsType: string; // Required: Type of analytics to calculate
|
|
88
|
+
filters?: AnalyticsFilters; // Optional: Filters (clinicBranchId, etc.)
|
|
89
|
+
dateRange?: { // Optional: Date range
|
|
90
|
+
start: string; // ISO date string
|
|
91
|
+
end: string; // ISO date string
|
|
92
|
+
};
|
|
93
|
+
entityId?: string; // Required for practitioner/procedure/patient
|
|
94
|
+
groupBy?: EntityType; // Required for grouped analytics
|
|
95
|
+
options?: {
|
|
96
|
+
storeInCache?: boolean; // Default: true - Store result in cache
|
|
97
|
+
useCache?: boolean; // Default: false - Use cache if available
|
|
98
|
+
maxCacheAgeHours?: number; // Default: 12 - Max cache age
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Response Format
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
interface CalculateAnalyticsResponse {
|
|
107
|
+
success: boolean;
|
|
108
|
+
data: any; // The calculated analytics data
|
|
109
|
+
computedAt: string; // ISO timestamp of when it was computed
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Examples
|
|
114
|
+
|
|
115
|
+
### Example 1: Calculate Dashboard Analytics
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
const dashboard = await cloudService.calculateDashboard(
|
|
119
|
+
{ clinicBranchId: 'clinic-123' },
|
|
120
|
+
{ start: new Date('2024-01-01'), end: new Date('2024-12-31') },
|
|
121
|
+
{ storeInCache: true }
|
|
122
|
+
);
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Example 2: Calculate Revenue by Technology
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
const revenueByTechnology = await cloudService.calculateRevenueByEntity(
|
|
129
|
+
'technology',
|
|
130
|
+
{ start: new Date('2024-01-01'), end: new Date('2024-12-31') },
|
|
131
|
+
{ clinicBranchId: 'clinic-123' },
|
|
132
|
+
{ storeInCache: true }
|
|
133
|
+
);
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Example 3: Force Fresh Calculation (Bypass Cache)
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
const result = await calculateAnalytics({
|
|
140
|
+
analyticsType: 'dashboard',
|
|
141
|
+
filters: { clinicBranchId: 'clinic-123' },
|
|
142
|
+
dateRange: {
|
|
143
|
+
start: '2024-01-01T00:00:00Z',
|
|
144
|
+
end: '2024-12-31T23:59:59Z',
|
|
145
|
+
},
|
|
146
|
+
options: {
|
|
147
|
+
useCache: false, // Don't use cache
|
|
148
|
+
storeInCache: true, // But store the result
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Example 4: Calculate Practitioner Analytics
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
const practitionerMetrics = await cloudService.calculatePractitioner(
|
|
157
|
+
'practitioner-123',
|
|
158
|
+
{ start: new Date('2024-01-01'), end: new Date('2024-12-31') },
|
|
159
|
+
{
|
|
160
|
+
storeInCache: true,
|
|
161
|
+
clinicBranchId: 'clinic-123',
|
|
162
|
+
}
|
|
163
|
+
);
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Benefits
|
|
167
|
+
|
|
168
|
+
### Performance
|
|
169
|
+
- **Server-side computation**: Faster than client-side for large datasets
|
|
170
|
+
- **Parallel processing**: Cloud Functions can handle multiple requests simultaneously
|
|
171
|
+
- **No client resource usage**: Computation happens in the cloud
|
|
172
|
+
|
|
173
|
+
### Caching
|
|
174
|
+
- **Automatic caching**: Results can be stored automatically
|
|
175
|
+
- **Future reads**: Cached results can be read instantly by `AnalyticsService`
|
|
176
|
+
- **Configurable**: Control whether to use/store cache
|
|
177
|
+
|
|
178
|
+
### Cost Optimization
|
|
179
|
+
- **Efficient**: Server-side computation is optimized
|
|
180
|
+
- **Scalable**: Handles large datasets without client limitations
|
|
181
|
+
- **Predictable**: Fixed cost per calculation
|
|
182
|
+
|
|
183
|
+
## When to Use
|
|
184
|
+
|
|
185
|
+
### Use Cloud Function When:
|
|
186
|
+
- ✅ Cache is stale and you need fresh data immediately
|
|
187
|
+
- ✅ Calculating analytics for large date ranges
|
|
188
|
+
- ✅ Need to calculate multiple analytics types
|
|
189
|
+
- ✅ Want to store results for future use
|
|
190
|
+
- ✅ Client device has limited resources
|
|
191
|
+
|
|
192
|
+
### Use Client Service When:
|
|
193
|
+
- ✅ Cache is fresh (< 12 hours old)
|
|
194
|
+
- ✅ Small date ranges
|
|
195
|
+
- ✅ Quick reads from cache
|
|
196
|
+
- ✅ Offline-first scenarios
|
|
197
|
+
|
|
198
|
+
## Error Handling
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
try {
|
|
202
|
+
const result = await cloudService.calculateDashboard(...);
|
|
203
|
+
} catch (error) {
|
|
204
|
+
if (error.code === 'invalid-argument') {
|
|
205
|
+
// Invalid parameters provided
|
|
206
|
+
} else if (error.code === 'internal') {
|
|
207
|
+
// Server error during calculation
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Integration with AnalyticsService
|
|
213
|
+
|
|
214
|
+
The Cloud Function works seamlessly with `AnalyticsService`:
|
|
215
|
+
|
|
216
|
+
1. **Client checks cache first** (via `AnalyticsService`)
|
|
217
|
+
2. **If cache is stale/missing**, call Cloud Function
|
|
218
|
+
3. **Cloud Function calculates** and optionally stores result
|
|
219
|
+
4. **Future reads** use the cached data
|
|
220
|
+
|
|
221
|
+
This creates a **hybrid approach**:
|
|
222
|
+
- Fast reads from cache (default)
|
|
223
|
+
- On-demand fresh calculations when needed
|
|
224
|
+
- Automatic caching for future use
|
|
225
|
+
|