@blackcode_sa/metaestetics-api 1.13.5 → 1.13.8
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/dist/index.d.mts +26 -3
- package/dist/index.d.ts +26 -3
- package/dist/index.js +168 -6
- package/dist/index.mjs +168 -6
- 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 +211 -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 +1043 -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 +1799 -1742
- package/src/services/procedure/README.md +163 -163
- package/src/services/procedure/index.ts +1 -1
- package/src/services/procedure/procedure.service.ts +2307 -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 +1 @@
|
|
|
1
|
-
export * from "./calendar.admin.service";
|
|
1
|
+
export * from "./calendar.admin.service";
|
|
@@ -1,260 +1,260 @@
|
|
|
1
|
-
import * as admin from "firebase-admin";
|
|
2
|
-
import {
|
|
3
|
-
DocumentTemplate,
|
|
4
|
-
FilledDocument,
|
|
5
|
-
FilledDocumentStatus,
|
|
6
|
-
USER_FORMS_SUBCOLLECTION,
|
|
7
|
-
DOCTOR_FORMS_SUBCOLLECTION,
|
|
8
|
-
DOCUMENTATION_TEMPLATES_COLLECTION,
|
|
9
|
-
} from "../../types/documentation-templates";
|
|
10
|
-
import {
|
|
11
|
-
APPOINTMENTS_COLLECTION,
|
|
12
|
-
LinkedFormInfo,
|
|
13
|
-
} from "../../types/appointment";
|
|
14
|
-
import { TechnologyDocumentationTemplate } from "../../backoffice/types/technology.types";
|
|
15
|
-
|
|
16
|
-
export interface InitializeAppointmentFormsResult {
|
|
17
|
-
initializedFormsInfo: LinkedFormInfo[];
|
|
18
|
-
pendingUserFormsIds: string[];
|
|
19
|
-
allLinkedTemplateIds: string[];
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export class DocumentManagerAdminService {
|
|
23
|
-
private db: admin.firestore.Firestore;
|
|
24
|
-
|
|
25
|
-
constructor(firestore: admin.firestore.Firestore) {
|
|
26
|
-
this.db = firestore;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Adds operations to a Firestore batch to initialize all linked forms for a new appointment
|
|
31
|
-
* and returns an array of LinkedFormInfo objects, pendingUserFormsIds, and allLinkedTemplateIds.
|
|
32
|
-
*
|
|
33
|
-
* @param dbBatch - The Firestore batch to add operations to.
|
|
34
|
-
* @param appointmentId - The ID of the newly created appointment.
|
|
35
|
-
* @param procedureIdForForms - The ID of the procedure associated with this appointment.
|
|
36
|
-
* @param procedureTemplates - Array of document templates linked to the procedure.
|
|
37
|
-
* @param patientId - ID of the patient.
|
|
38
|
-
* @param practitionerId - ID of the practitioner associated with the procedure.
|
|
39
|
-
* @param clinicId - ID of the clinic where the procedure is performed.
|
|
40
|
-
* @param nowMillis - Current timestamp in milliseconds for createdAt/updatedAt.
|
|
41
|
-
* @returns An object containing initializedFormsInfo, pendingUserFormsIds, and allLinkedTemplateIds.
|
|
42
|
-
*/
|
|
43
|
-
batchInitializeAppointmentForms(
|
|
44
|
-
dbBatch: admin.firestore.WriteBatch,
|
|
45
|
-
appointmentId: string,
|
|
46
|
-
procedureIdForForms: string,
|
|
47
|
-
procedureTemplates: DocumentTemplate[],
|
|
48
|
-
patientId: string,
|
|
49
|
-
practitionerId: string,
|
|
50
|
-
clinicId: string,
|
|
51
|
-
nowMillis: number
|
|
52
|
-
): InitializeAppointmentFormsResult {
|
|
53
|
-
const initializedFormsInfo: LinkedFormInfo[] = [];
|
|
54
|
-
const pendingUserFormsIds: string[] = [];
|
|
55
|
-
const allLinkedTemplateIds: string[] = [];
|
|
56
|
-
|
|
57
|
-
if (!procedureTemplates || procedureTemplates.length === 0) {
|
|
58
|
-
console.log(
|
|
59
|
-
`[DocManagerAdmin] No document templates to initialize for appointment ${appointmentId}.`
|
|
60
|
-
);
|
|
61
|
-
return {
|
|
62
|
-
initializedFormsInfo,
|
|
63
|
-
pendingUserFormsIds,
|
|
64
|
-
allLinkedTemplateIds,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
for (const template of procedureTemplates) {
|
|
69
|
-
const isUserForm = template.isUserForm || false;
|
|
70
|
-
|
|
71
|
-
const formSubcollectionPath = isUserForm
|
|
72
|
-
? USER_FORMS_SUBCOLLECTION
|
|
73
|
-
: DOCTOR_FORMS_SUBCOLLECTION;
|
|
74
|
-
|
|
75
|
-
const filledDocumentId = this.db
|
|
76
|
-
.collection(APPOINTMENTS_COLLECTION)
|
|
77
|
-
.doc(appointmentId)
|
|
78
|
-
.collection(formSubcollectionPath)
|
|
79
|
-
.doc().id;
|
|
80
|
-
|
|
81
|
-
if (isUserForm && (template.isRequired || false)) {
|
|
82
|
-
pendingUserFormsIds.push(filledDocumentId);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
allLinkedTemplateIds.push(filledDocumentId);
|
|
86
|
-
// Always initialize with PENDING status regardless of whether the form is required
|
|
87
|
-
// PENDING is the starting state, DRAFT is when a form is saved but not submitted
|
|
88
|
-
const initialStatus = FilledDocumentStatus.PENDING;
|
|
89
|
-
|
|
90
|
-
const filledDocumentData: FilledDocument = {
|
|
91
|
-
id: filledDocumentId,
|
|
92
|
-
templateId: template.id,
|
|
93
|
-
templateVersion: template.version,
|
|
94
|
-
isUserForm: isUserForm,
|
|
95
|
-
isRequired: template.isRequired || false,
|
|
96
|
-
appointmentId: appointmentId,
|
|
97
|
-
procedureId: procedureIdForForms,
|
|
98
|
-
patientId: patientId,
|
|
99
|
-
practitionerId: practitionerId,
|
|
100
|
-
clinicId: clinicId,
|
|
101
|
-
createdAt: nowMillis,
|
|
102
|
-
updatedAt: nowMillis,
|
|
103
|
-
values: {},
|
|
104
|
-
status: initialStatus,
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
const docRef = this.db
|
|
108
|
-
.collection(APPOINTMENTS_COLLECTION)
|
|
109
|
-
.doc(appointmentId)
|
|
110
|
-
.collection(formSubcollectionPath)
|
|
111
|
-
.doc(filledDocumentId);
|
|
112
|
-
|
|
113
|
-
dbBatch.set(docRef, filledDocumentData);
|
|
114
|
-
|
|
115
|
-
const linkedForm: LinkedFormInfo = {
|
|
116
|
-
formId: filledDocumentData.id,
|
|
117
|
-
templateId: template.id,
|
|
118
|
-
templateVersion: template.version,
|
|
119
|
-
title: template.title,
|
|
120
|
-
isUserForm: filledDocumentData.isUserForm,
|
|
121
|
-
isRequired: filledDocumentData.isRequired,
|
|
122
|
-
status: filledDocumentData.status,
|
|
123
|
-
path: docRef.path,
|
|
124
|
-
};
|
|
125
|
-
initializedFormsInfo.push(linkedForm);
|
|
126
|
-
|
|
127
|
-
console.log(
|
|
128
|
-
`[DocManagerAdmin] Added FilledDocument ${filledDocumentId} (template: ${template.id}) and its LinkedFormInfo to batch for appointment ${appointmentId}.`
|
|
129
|
-
);
|
|
130
|
-
}
|
|
131
|
-
return { initializedFormsInfo, pendingUserFormsIds, allLinkedTemplateIds };
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Adds operations to a Firestore batch to initialize all linked forms for a new appointment
|
|
136
|
-
* using the TechnologyDocumentationTemplate references.
|
|
137
|
-
*
|
|
138
|
-
* @param dbBatch - The Firestore batch to add operations to.
|
|
139
|
-
* @param appointmentId - The ID of the newly created appointment.
|
|
140
|
-
* @param procedureIdForForms - The ID of the procedure associated with this appointment.
|
|
141
|
-
* @param technologyTemplates - Array of technology documentation template references.
|
|
142
|
-
* @param patientId - ID of the patient.
|
|
143
|
-
* @param practitionerId - ID of the practitioner associated with the procedure.
|
|
144
|
-
* @param clinicId - ID of the clinic where the procedure is performed.
|
|
145
|
-
* @param nowMillis - Current timestamp in milliseconds for createdAt/updatedAt.
|
|
146
|
-
* @returns An object containing initializedFormsInfo, pendingUserFormsIds, and allLinkedTemplateIds.
|
|
147
|
-
*/
|
|
148
|
-
async batchInitializeAppointmentFormsFromTechnologyTemplates(
|
|
149
|
-
dbBatch: admin.firestore.WriteBatch,
|
|
150
|
-
appointmentId: string,
|
|
151
|
-
procedureIdForForms: string,
|
|
152
|
-
technologyTemplates: TechnologyDocumentationTemplate[],
|
|
153
|
-
patientId: string,
|
|
154
|
-
practitionerId: string,
|
|
155
|
-
clinicId: string,
|
|
156
|
-
nowMillis: number
|
|
157
|
-
): Promise<InitializeAppointmentFormsResult> {
|
|
158
|
-
const initializedFormsInfo: LinkedFormInfo[] = [];
|
|
159
|
-
const pendingUserFormsIds: string[] = [];
|
|
160
|
-
const allLinkedTemplateIds: string[] = [];
|
|
161
|
-
|
|
162
|
-
if (!technologyTemplates || technologyTemplates.length === 0) {
|
|
163
|
-
console.log(
|
|
164
|
-
`[DocManagerAdmin] No document templates to initialize for appointment ${appointmentId}.`
|
|
165
|
-
);
|
|
166
|
-
return {
|
|
167
|
-
initializedFormsInfo,
|
|
168
|
-
pendingUserFormsIds,
|
|
169
|
-
allLinkedTemplateIds,
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Fetch all template documents in one batch
|
|
174
|
-
const templateIds = technologyTemplates.map((t) => t.templateId);
|
|
175
|
-
const templatesSnapshot = await this.db
|
|
176
|
-
.collection(DOCUMENTATION_TEMPLATES_COLLECTION)
|
|
177
|
-
.where(admin.firestore.FieldPath.documentId(), "in", templateIds)
|
|
178
|
-
.get();
|
|
179
|
-
|
|
180
|
-
const templatesMap = new Map<string, DocumentTemplate>();
|
|
181
|
-
templatesSnapshot.forEach((doc) => {
|
|
182
|
-
templatesMap.set(doc.id, doc.data() as DocumentTemplate);
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
for (const templateRef of technologyTemplates) {
|
|
186
|
-
const template = templatesMap.get(templateRef.templateId);
|
|
187
|
-
if (!template) {
|
|
188
|
-
console.warn(
|
|
189
|
-
`[DocManagerAdmin] Template ${templateRef.templateId} not found in Firestore.`
|
|
190
|
-
);
|
|
191
|
-
continue;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
const isUserForm = templateRef.isUserForm;
|
|
195
|
-
const isRequired = templateRef.isRequired;
|
|
196
|
-
|
|
197
|
-
const formSubcollectionPath = isUserForm
|
|
198
|
-
? USER_FORMS_SUBCOLLECTION
|
|
199
|
-
: DOCTOR_FORMS_SUBCOLLECTION;
|
|
200
|
-
|
|
201
|
-
const filledDocumentId = this.db
|
|
202
|
-
.collection(APPOINTMENTS_COLLECTION)
|
|
203
|
-
.doc(appointmentId)
|
|
204
|
-
.collection(formSubcollectionPath)
|
|
205
|
-
.doc().id;
|
|
206
|
-
|
|
207
|
-
if (isUserForm && isRequired) {
|
|
208
|
-
pendingUserFormsIds.push(filledDocumentId);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
allLinkedTemplateIds.push(filledDocumentId);
|
|
212
|
-
// Always initialize with PENDING status regardless of whether the form is required
|
|
213
|
-
// PENDING is the starting state, DRAFT is when a form is saved but not submitted
|
|
214
|
-
const initialStatus = FilledDocumentStatus.PENDING;
|
|
215
|
-
|
|
216
|
-
const filledDocumentData: FilledDocument = {
|
|
217
|
-
id: filledDocumentId,
|
|
218
|
-
templateId: templateRef.templateId,
|
|
219
|
-
templateVersion: template.version,
|
|
220
|
-
isUserForm: isUserForm,
|
|
221
|
-
isRequired: isRequired,
|
|
222
|
-
appointmentId: appointmentId,
|
|
223
|
-
procedureId: procedureIdForForms,
|
|
224
|
-
patientId: patientId,
|
|
225
|
-
practitionerId: practitionerId,
|
|
226
|
-
clinicId: clinicId,
|
|
227
|
-
createdAt: nowMillis,
|
|
228
|
-
updatedAt: nowMillis,
|
|
229
|
-
values: {},
|
|
230
|
-
status: initialStatus,
|
|
231
|
-
};
|
|
232
|
-
|
|
233
|
-
const docRef = this.db
|
|
234
|
-
.collection(APPOINTMENTS_COLLECTION)
|
|
235
|
-
.doc(appointmentId)
|
|
236
|
-
.collection(formSubcollectionPath)
|
|
237
|
-
.doc(filledDocumentId);
|
|
238
|
-
|
|
239
|
-
dbBatch.set(docRef, filledDocumentData);
|
|
240
|
-
|
|
241
|
-
const linkedForm: LinkedFormInfo = {
|
|
242
|
-
formId: filledDocumentData.id,
|
|
243
|
-
templateId: template.id,
|
|
244
|
-
templateVersion: template.version,
|
|
245
|
-
title: template.title,
|
|
246
|
-
isUserForm: filledDocumentData.isUserForm,
|
|
247
|
-
isRequired: filledDocumentData.isRequired,
|
|
248
|
-
sortingOrder: templateRef.sortingOrder,
|
|
249
|
-
status: filledDocumentData.status,
|
|
250
|
-
path: docRef.path,
|
|
251
|
-
};
|
|
252
|
-
initializedFormsInfo.push(linkedForm);
|
|
253
|
-
|
|
254
|
-
console.log(
|
|
255
|
-
`[DocManagerAdmin] Added FilledDocument ${filledDocumentId} (template: ${template.id}) and its LinkedFormInfo to batch for appointment ${appointmentId}.`
|
|
256
|
-
);
|
|
257
|
-
}
|
|
258
|
-
return { initializedFormsInfo, pendingUserFormsIds, allLinkedTemplateIds };
|
|
259
|
-
}
|
|
260
|
-
}
|
|
1
|
+
import * as admin from "firebase-admin";
|
|
2
|
+
import {
|
|
3
|
+
DocumentTemplate,
|
|
4
|
+
FilledDocument,
|
|
5
|
+
FilledDocumentStatus,
|
|
6
|
+
USER_FORMS_SUBCOLLECTION,
|
|
7
|
+
DOCTOR_FORMS_SUBCOLLECTION,
|
|
8
|
+
DOCUMENTATION_TEMPLATES_COLLECTION,
|
|
9
|
+
} from "../../types/documentation-templates";
|
|
10
|
+
import {
|
|
11
|
+
APPOINTMENTS_COLLECTION,
|
|
12
|
+
LinkedFormInfo,
|
|
13
|
+
} from "../../types/appointment";
|
|
14
|
+
import { TechnologyDocumentationTemplate } from "../../backoffice/types/technology.types";
|
|
15
|
+
|
|
16
|
+
export interface InitializeAppointmentFormsResult {
|
|
17
|
+
initializedFormsInfo: LinkedFormInfo[];
|
|
18
|
+
pendingUserFormsIds: string[];
|
|
19
|
+
allLinkedTemplateIds: string[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export class DocumentManagerAdminService {
|
|
23
|
+
private db: admin.firestore.Firestore;
|
|
24
|
+
|
|
25
|
+
constructor(firestore: admin.firestore.Firestore) {
|
|
26
|
+
this.db = firestore;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Adds operations to a Firestore batch to initialize all linked forms for a new appointment
|
|
31
|
+
* and returns an array of LinkedFormInfo objects, pendingUserFormsIds, and allLinkedTemplateIds.
|
|
32
|
+
*
|
|
33
|
+
* @param dbBatch - The Firestore batch to add operations to.
|
|
34
|
+
* @param appointmentId - The ID of the newly created appointment.
|
|
35
|
+
* @param procedureIdForForms - The ID of the procedure associated with this appointment.
|
|
36
|
+
* @param procedureTemplates - Array of document templates linked to the procedure.
|
|
37
|
+
* @param patientId - ID of the patient.
|
|
38
|
+
* @param practitionerId - ID of the practitioner associated with the procedure.
|
|
39
|
+
* @param clinicId - ID of the clinic where the procedure is performed.
|
|
40
|
+
* @param nowMillis - Current timestamp in milliseconds for createdAt/updatedAt.
|
|
41
|
+
* @returns An object containing initializedFormsInfo, pendingUserFormsIds, and allLinkedTemplateIds.
|
|
42
|
+
*/
|
|
43
|
+
batchInitializeAppointmentForms(
|
|
44
|
+
dbBatch: admin.firestore.WriteBatch,
|
|
45
|
+
appointmentId: string,
|
|
46
|
+
procedureIdForForms: string,
|
|
47
|
+
procedureTemplates: DocumentTemplate[],
|
|
48
|
+
patientId: string,
|
|
49
|
+
practitionerId: string,
|
|
50
|
+
clinicId: string,
|
|
51
|
+
nowMillis: number
|
|
52
|
+
): InitializeAppointmentFormsResult {
|
|
53
|
+
const initializedFormsInfo: LinkedFormInfo[] = [];
|
|
54
|
+
const pendingUserFormsIds: string[] = [];
|
|
55
|
+
const allLinkedTemplateIds: string[] = [];
|
|
56
|
+
|
|
57
|
+
if (!procedureTemplates || procedureTemplates.length === 0) {
|
|
58
|
+
console.log(
|
|
59
|
+
`[DocManagerAdmin] No document templates to initialize for appointment ${appointmentId}.`
|
|
60
|
+
);
|
|
61
|
+
return {
|
|
62
|
+
initializedFormsInfo,
|
|
63
|
+
pendingUserFormsIds,
|
|
64
|
+
allLinkedTemplateIds,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
for (const template of procedureTemplates) {
|
|
69
|
+
const isUserForm = template.isUserForm || false;
|
|
70
|
+
|
|
71
|
+
const formSubcollectionPath = isUserForm
|
|
72
|
+
? USER_FORMS_SUBCOLLECTION
|
|
73
|
+
: DOCTOR_FORMS_SUBCOLLECTION;
|
|
74
|
+
|
|
75
|
+
const filledDocumentId = this.db
|
|
76
|
+
.collection(APPOINTMENTS_COLLECTION)
|
|
77
|
+
.doc(appointmentId)
|
|
78
|
+
.collection(formSubcollectionPath)
|
|
79
|
+
.doc().id;
|
|
80
|
+
|
|
81
|
+
if (isUserForm && (template.isRequired || false)) {
|
|
82
|
+
pendingUserFormsIds.push(filledDocumentId);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
allLinkedTemplateIds.push(filledDocumentId);
|
|
86
|
+
// Always initialize with PENDING status regardless of whether the form is required
|
|
87
|
+
// PENDING is the starting state, DRAFT is when a form is saved but not submitted
|
|
88
|
+
const initialStatus = FilledDocumentStatus.PENDING;
|
|
89
|
+
|
|
90
|
+
const filledDocumentData: FilledDocument = {
|
|
91
|
+
id: filledDocumentId,
|
|
92
|
+
templateId: template.id,
|
|
93
|
+
templateVersion: template.version,
|
|
94
|
+
isUserForm: isUserForm,
|
|
95
|
+
isRequired: template.isRequired || false,
|
|
96
|
+
appointmentId: appointmentId,
|
|
97
|
+
procedureId: procedureIdForForms,
|
|
98
|
+
patientId: patientId,
|
|
99
|
+
practitionerId: practitionerId,
|
|
100
|
+
clinicId: clinicId,
|
|
101
|
+
createdAt: nowMillis,
|
|
102
|
+
updatedAt: nowMillis,
|
|
103
|
+
values: {},
|
|
104
|
+
status: initialStatus,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const docRef = this.db
|
|
108
|
+
.collection(APPOINTMENTS_COLLECTION)
|
|
109
|
+
.doc(appointmentId)
|
|
110
|
+
.collection(formSubcollectionPath)
|
|
111
|
+
.doc(filledDocumentId);
|
|
112
|
+
|
|
113
|
+
dbBatch.set(docRef, filledDocumentData);
|
|
114
|
+
|
|
115
|
+
const linkedForm: LinkedFormInfo = {
|
|
116
|
+
formId: filledDocumentData.id,
|
|
117
|
+
templateId: template.id,
|
|
118
|
+
templateVersion: template.version,
|
|
119
|
+
title: template.title,
|
|
120
|
+
isUserForm: filledDocumentData.isUserForm,
|
|
121
|
+
isRequired: filledDocumentData.isRequired,
|
|
122
|
+
status: filledDocumentData.status,
|
|
123
|
+
path: docRef.path,
|
|
124
|
+
};
|
|
125
|
+
initializedFormsInfo.push(linkedForm);
|
|
126
|
+
|
|
127
|
+
console.log(
|
|
128
|
+
`[DocManagerAdmin] Added FilledDocument ${filledDocumentId} (template: ${template.id}) and its LinkedFormInfo to batch for appointment ${appointmentId}.`
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
return { initializedFormsInfo, pendingUserFormsIds, allLinkedTemplateIds };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Adds operations to a Firestore batch to initialize all linked forms for a new appointment
|
|
136
|
+
* using the TechnologyDocumentationTemplate references.
|
|
137
|
+
*
|
|
138
|
+
* @param dbBatch - The Firestore batch to add operations to.
|
|
139
|
+
* @param appointmentId - The ID of the newly created appointment.
|
|
140
|
+
* @param procedureIdForForms - The ID of the procedure associated with this appointment.
|
|
141
|
+
* @param technologyTemplates - Array of technology documentation template references.
|
|
142
|
+
* @param patientId - ID of the patient.
|
|
143
|
+
* @param practitionerId - ID of the practitioner associated with the procedure.
|
|
144
|
+
* @param clinicId - ID of the clinic where the procedure is performed.
|
|
145
|
+
* @param nowMillis - Current timestamp in milliseconds for createdAt/updatedAt.
|
|
146
|
+
* @returns An object containing initializedFormsInfo, pendingUserFormsIds, and allLinkedTemplateIds.
|
|
147
|
+
*/
|
|
148
|
+
async batchInitializeAppointmentFormsFromTechnologyTemplates(
|
|
149
|
+
dbBatch: admin.firestore.WriteBatch,
|
|
150
|
+
appointmentId: string,
|
|
151
|
+
procedureIdForForms: string,
|
|
152
|
+
technologyTemplates: TechnologyDocumentationTemplate[],
|
|
153
|
+
patientId: string,
|
|
154
|
+
practitionerId: string,
|
|
155
|
+
clinicId: string,
|
|
156
|
+
nowMillis: number
|
|
157
|
+
): Promise<InitializeAppointmentFormsResult> {
|
|
158
|
+
const initializedFormsInfo: LinkedFormInfo[] = [];
|
|
159
|
+
const pendingUserFormsIds: string[] = [];
|
|
160
|
+
const allLinkedTemplateIds: string[] = [];
|
|
161
|
+
|
|
162
|
+
if (!technologyTemplates || technologyTemplates.length === 0) {
|
|
163
|
+
console.log(
|
|
164
|
+
`[DocManagerAdmin] No document templates to initialize for appointment ${appointmentId}.`
|
|
165
|
+
);
|
|
166
|
+
return {
|
|
167
|
+
initializedFormsInfo,
|
|
168
|
+
pendingUserFormsIds,
|
|
169
|
+
allLinkedTemplateIds,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Fetch all template documents in one batch
|
|
174
|
+
const templateIds = technologyTemplates.map((t) => t.templateId);
|
|
175
|
+
const templatesSnapshot = await this.db
|
|
176
|
+
.collection(DOCUMENTATION_TEMPLATES_COLLECTION)
|
|
177
|
+
.where(admin.firestore.FieldPath.documentId(), "in", templateIds)
|
|
178
|
+
.get();
|
|
179
|
+
|
|
180
|
+
const templatesMap = new Map<string, DocumentTemplate>();
|
|
181
|
+
templatesSnapshot.forEach((doc) => {
|
|
182
|
+
templatesMap.set(doc.id, doc.data() as DocumentTemplate);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
for (const templateRef of technologyTemplates) {
|
|
186
|
+
const template = templatesMap.get(templateRef.templateId);
|
|
187
|
+
if (!template) {
|
|
188
|
+
console.warn(
|
|
189
|
+
`[DocManagerAdmin] Template ${templateRef.templateId} not found in Firestore.`
|
|
190
|
+
);
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const isUserForm = templateRef.isUserForm;
|
|
195
|
+
const isRequired = templateRef.isRequired;
|
|
196
|
+
|
|
197
|
+
const formSubcollectionPath = isUserForm
|
|
198
|
+
? USER_FORMS_SUBCOLLECTION
|
|
199
|
+
: DOCTOR_FORMS_SUBCOLLECTION;
|
|
200
|
+
|
|
201
|
+
const filledDocumentId = this.db
|
|
202
|
+
.collection(APPOINTMENTS_COLLECTION)
|
|
203
|
+
.doc(appointmentId)
|
|
204
|
+
.collection(formSubcollectionPath)
|
|
205
|
+
.doc().id;
|
|
206
|
+
|
|
207
|
+
if (isUserForm && isRequired) {
|
|
208
|
+
pendingUserFormsIds.push(filledDocumentId);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
allLinkedTemplateIds.push(filledDocumentId);
|
|
212
|
+
// Always initialize with PENDING status regardless of whether the form is required
|
|
213
|
+
// PENDING is the starting state, DRAFT is when a form is saved but not submitted
|
|
214
|
+
const initialStatus = FilledDocumentStatus.PENDING;
|
|
215
|
+
|
|
216
|
+
const filledDocumentData: FilledDocument = {
|
|
217
|
+
id: filledDocumentId,
|
|
218
|
+
templateId: templateRef.templateId,
|
|
219
|
+
templateVersion: template.version,
|
|
220
|
+
isUserForm: isUserForm,
|
|
221
|
+
isRequired: isRequired,
|
|
222
|
+
appointmentId: appointmentId,
|
|
223
|
+
procedureId: procedureIdForForms,
|
|
224
|
+
patientId: patientId,
|
|
225
|
+
practitionerId: practitionerId,
|
|
226
|
+
clinicId: clinicId,
|
|
227
|
+
createdAt: nowMillis,
|
|
228
|
+
updatedAt: nowMillis,
|
|
229
|
+
values: {},
|
|
230
|
+
status: initialStatus,
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
const docRef = this.db
|
|
234
|
+
.collection(APPOINTMENTS_COLLECTION)
|
|
235
|
+
.doc(appointmentId)
|
|
236
|
+
.collection(formSubcollectionPath)
|
|
237
|
+
.doc(filledDocumentId);
|
|
238
|
+
|
|
239
|
+
dbBatch.set(docRef, filledDocumentData);
|
|
240
|
+
|
|
241
|
+
const linkedForm: LinkedFormInfo = {
|
|
242
|
+
formId: filledDocumentData.id,
|
|
243
|
+
templateId: template.id,
|
|
244
|
+
templateVersion: template.version,
|
|
245
|
+
title: template.title,
|
|
246
|
+
isUserForm: filledDocumentData.isUserForm,
|
|
247
|
+
isRequired: filledDocumentData.isRequired,
|
|
248
|
+
sortingOrder: templateRef.sortingOrder,
|
|
249
|
+
status: filledDocumentData.status,
|
|
250
|
+
path: docRef.path,
|
|
251
|
+
};
|
|
252
|
+
initializedFormsInfo.push(linkedForm);
|
|
253
|
+
|
|
254
|
+
console.log(
|
|
255
|
+
`[DocManagerAdmin] Added FilledDocument ${filledDocumentId} (template: ${template.id}) and its LinkedFormInfo to batch for appointment ${appointmentId}.`
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
return { initializedFormsInfo, pendingUserFormsIds, allLinkedTemplateIds };
|
|
259
|
+
}
|
|
260
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from "./document-manager.admin";
|
|
1
|
+
export * from "./document-manager.admin";
|