@blackcode_sa/metaestetics-api 1.12.64 → 1.12.66
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 +2 -0
- package/dist/admin/index.d.ts +2 -0
- package/dist/admin/index.js +45 -4
- package/dist/admin/index.mjs +45 -4
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +80 -11
- package/dist/index.mjs +80 -11
- package/package.json +119 -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 +1844 -1844
- 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 -641
- 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 +75 -75
- 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 +40 -40
- package/src/backoffice/services/brand.service.ts +256 -256
- package/src/backoffice/services/category.service.ts +318 -318
- 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 +395 -395
- package/src/backoffice/services/technology.service.ts +1083 -1083
- 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 +62 -62
- 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 +163 -163
- 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/appointment/README.md +17 -17
- package/src/services/appointment/appointment.service.ts +2505 -2505
- 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 +13 -13
- 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 +1715 -1682
- package/src/services/reviews/index.ts +1 -1
- package/src/services/reviews/reviews.service.ts +683 -636
- 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/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 +489 -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 +44 -44
- package/src/types/notifications/README.md +77 -77
- package/src/types/notifications/index.ts +265 -265
- 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 -130
- 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 +493 -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 -189
- package/src/validations/schemas.ts +104 -104
- package/src/validations/shared.schema.ts +78 -78
package/dist/admin/index.d.mts
CHANGED
|
@@ -70,6 +70,7 @@ interface PractitionerReview extends BaseReview {
|
|
|
70
70
|
/**
|
|
71
71
|
* Procedure review interface
|
|
72
72
|
* @description Full review for a medical procedure
|
|
73
|
+
* Used for both main and extended procedures
|
|
73
74
|
*/
|
|
74
75
|
interface ProcedureReview extends BaseReview {
|
|
75
76
|
procedureId: string;
|
|
@@ -138,6 +139,7 @@ interface Review {
|
|
|
138
139
|
clinicReview?: ClinicReview;
|
|
139
140
|
practitionerReview?: PractitionerReview;
|
|
140
141
|
procedureReview?: ProcedureReview;
|
|
142
|
+
extendedProcedureReviews?: ProcedureReview[];
|
|
141
143
|
overallComment: string;
|
|
142
144
|
overallRating: number;
|
|
143
145
|
}
|
package/dist/admin/index.d.ts
CHANGED
|
@@ -70,6 +70,7 @@ interface PractitionerReview extends BaseReview {
|
|
|
70
70
|
/**
|
|
71
71
|
* Procedure review interface
|
|
72
72
|
* @description Full review for a medical procedure
|
|
73
|
+
* Used for both main and extended procedures
|
|
73
74
|
*/
|
|
74
75
|
interface ProcedureReview extends BaseReview {
|
|
75
76
|
procedureId: string;
|
|
@@ -138,6 +139,7 @@ interface Review {
|
|
|
138
139
|
clinicReview?: ClinicReview;
|
|
139
140
|
practitionerReview?: PractitionerReview;
|
|
140
141
|
procedureReview?: ProcedureReview;
|
|
142
|
+
extendedProcedureReviews?: ProcedureReview[];
|
|
141
143
|
overallComment: string;
|
|
142
144
|
overallRating: number;
|
|
143
145
|
}
|
package/dist/admin/index.js
CHANGED
|
@@ -6375,6 +6375,16 @@ var ReviewsAggregationService = class {
|
|
|
6375
6375
|
this.updateProcedureReviewInfo(review.procedureReview.procedureId)
|
|
6376
6376
|
);
|
|
6377
6377
|
}
|
|
6378
|
+
if (review.extendedProcedureReviews && review.extendedProcedureReviews.length > 0) {
|
|
6379
|
+
console.log(
|
|
6380
|
+
`[ReviewsAggregationService] Processing ${review.extendedProcedureReviews.length} extended procedure reviews`
|
|
6381
|
+
);
|
|
6382
|
+
review.extendedProcedureReviews.forEach((extendedReview) => {
|
|
6383
|
+
updatePromises.push(
|
|
6384
|
+
this.updateProcedureReviewInfo(extendedReview.procedureId)
|
|
6385
|
+
);
|
|
6386
|
+
});
|
|
6387
|
+
}
|
|
6378
6388
|
await Promise.all(updatePromises);
|
|
6379
6389
|
console.log(
|
|
6380
6390
|
`[ReviewsAggregationService] Successfully processed review: ${review.id}`
|
|
@@ -6417,6 +6427,20 @@ var ReviewsAggregationService = class {
|
|
|
6417
6427
|
)
|
|
6418
6428
|
);
|
|
6419
6429
|
}
|
|
6430
|
+
if (review.extendedProcedureReviews && review.extendedProcedureReviews.length > 0) {
|
|
6431
|
+
console.log(
|
|
6432
|
+
`[ReviewsAggregationService] Processing deletion of ${review.extendedProcedureReviews.length} extended procedure reviews`
|
|
6433
|
+
);
|
|
6434
|
+
review.extendedProcedureReviews.forEach((extendedReview) => {
|
|
6435
|
+
updatePromises.push(
|
|
6436
|
+
this.updateProcedureReviewInfo(
|
|
6437
|
+
extendedReview.procedureId,
|
|
6438
|
+
extendedReview,
|
|
6439
|
+
true
|
|
6440
|
+
)
|
|
6441
|
+
);
|
|
6442
|
+
});
|
|
6443
|
+
}
|
|
6420
6444
|
await Promise.all(updatePromises);
|
|
6421
6445
|
console.log(
|
|
6422
6446
|
`[ReviewsAggregationService] Successfully processed deleted review: ${review.id}`
|
|
@@ -6634,8 +6658,21 @@ var ReviewsAggregationService = class {
|
|
|
6634
6658
|
valueForMoney: 0,
|
|
6635
6659
|
recommendationPercentage: 0
|
|
6636
6660
|
};
|
|
6637
|
-
const
|
|
6638
|
-
|
|
6661
|
+
const allReviewsQuery = await this.db.collection(REVIEWS_COLLECTION).get();
|
|
6662
|
+
const reviews = allReviewsQuery.docs.map((doc) => doc.data());
|
|
6663
|
+
const procedureReviews = [];
|
|
6664
|
+
reviews.forEach((review) => {
|
|
6665
|
+
if (review.procedureReview && review.procedureReview.procedureId === procedureId) {
|
|
6666
|
+
procedureReviews.push(review.procedureReview);
|
|
6667
|
+
}
|
|
6668
|
+
if (review.extendedProcedureReviews && review.extendedProcedureReviews.length > 0) {
|
|
6669
|
+
const matchingExtended = review.extendedProcedureReviews.filter(
|
|
6670
|
+
(extReview) => extReview.procedureId === procedureId
|
|
6671
|
+
);
|
|
6672
|
+
procedureReviews.push(...matchingExtended);
|
|
6673
|
+
}
|
|
6674
|
+
});
|
|
6675
|
+
if (procedureReviews.length === 0) {
|
|
6639
6676
|
const updatedReviewInfo2 = {
|
|
6640
6677
|
totalReviews: 0,
|
|
6641
6678
|
averageRating: 0,
|
|
@@ -6655,8 +6692,6 @@ var ReviewsAggregationService = class {
|
|
|
6655
6692
|
);
|
|
6656
6693
|
return updatedReviewInfo2;
|
|
6657
6694
|
}
|
|
6658
|
-
const reviews = reviewsQuery.docs.map((doc) => doc.data());
|
|
6659
|
-
const procedureReviews = reviews.map((review) => review.procedureReview).filter((review) => review !== void 0);
|
|
6660
6695
|
let totalRating = 0;
|
|
6661
6696
|
let totalEffectivenessOfTreatment = 0;
|
|
6662
6697
|
let totalOutcomeExplanation = 0;
|
|
@@ -6750,10 +6785,16 @@ var ReviewsAggregationService = class {
|
|
|
6750
6785
|
if (review.procedureReview) {
|
|
6751
6786
|
review.procedureReview.isVerified = true;
|
|
6752
6787
|
}
|
|
6788
|
+
if (review.extendedProcedureReviews && review.extendedProcedureReviews.length > 0) {
|
|
6789
|
+
review.extendedProcedureReviews.forEach((extReview) => {
|
|
6790
|
+
extReview.isVerified = true;
|
|
6791
|
+
});
|
|
6792
|
+
}
|
|
6753
6793
|
batch.update(reviewRef, {
|
|
6754
6794
|
clinicReview: review.clinicReview,
|
|
6755
6795
|
practitionerReview: review.practitionerReview,
|
|
6756
6796
|
procedureReview: review.procedureReview,
|
|
6797
|
+
extendedProcedureReviews: review.extendedProcedureReviews,
|
|
6757
6798
|
updatedAt: admin13.firestore.FieldValue.serverTimestamp()
|
|
6758
6799
|
});
|
|
6759
6800
|
await batch.commit();
|
package/dist/admin/index.mjs
CHANGED
|
@@ -6313,6 +6313,16 @@ var ReviewsAggregationService = class {
|
|
|
6313
6313
|
this.updateProcedureReviewInfo(review.procedureReview.procedureId)
|
|
6314
6314
|
);
|
|
6315
6315
|
}
|
|
6316
|
+
if (review.extendedProcedureReviews && review.extendedProcedureReviews.length > 0) {
|
|
6317
|
+
console.log(
|
|
6318
|
+
`[ReviewsAggregationService] Processing ${review.extendedProcedureReviews.length} extended procedure reviews`
|
|
6319
|
+
);
|
|
6320
|
+
review.extendedProcedureReviews.forEach((extendedReview) => {
|
|
6321
|
+
updatePromises.push(
|
|
6322
|
+
this.updateProcedureReviewInfo(extendedReview.procedureId)
|
|
6323
|
+
);
|
|
6324
|
+
});
|
|
6325
|
+
}
|
|
6316
6326
|
await Promise.all(updatePromises);
|
|
6317
6327
|
console.log(
|
|
6318
6328
|
`[ReviewsAggregationService] Successfully processed review: ${review.id}`
|
|
@@ -6355,6 +6365,20 @@ var ReviewsAggregationService = class {
|
|
|
6355
6365
|
)
|
|
6356
6366
|
);
|
|
6357
6367
|
}
|
|
6368
|
+
if (review.extendedProcedureReviews && review.extendedProcedureReviews.length > 0) {
|
|
6369
|
+
console.log(
|
|
6370
|
+
`[ReviewsAggregationService] Processing deletion of ${review.extendedProcedureReviews.length} extended procedure reviews`
|
|
6371
|
+
);
|
|
6372
|
+
review.extendedProcedureReviews.forEach((extendedReview) => {
|
|
6373
|
+
updatePromises.push(
|
|
6374
|
+
this.updateProcedureReviewInfo(
|
|
6375
|
+
extendedReview.procedureId,
|
|
6376
|
+
extendedReview,
|
|
6377
|
+
true
|
|
6378
|
+
)
|
|
6379
|
+
);
|
|
6380
|
+
});
|
|
6381
|
+
}
|
|
6358
6382
|
await Promise.all(updatePromises);
|
|
6359
6383
|
console.log(
|
|
6360
6384
|
`[ReviewsAggregationService] Successfully processed deleted review: ${review.id}`
|
|
@@ -6572,8 +6596,21 @@ var ReviewsAggregationService = class {
|
|
|
6572
6596
|
valueForMoney: 0,
|
|
6573
6597
|
recommendationPercentage: 0
|
|
6574
6598
|
};
|
|
6575
|
-
const
|
|
6576
|
-
|
|
6599
|
+
const allReviewsQuery = await this.db.collection(REVIEWS_COLLECTION).get();
|
|
6600
|
+
const reviews = allReviewsQuery.docs.map((doc) => doc.data());
|
|
6601
|
+
const procedureReviews = [];
|
|
6602
|
+
reviews.forEach((review) => {
|
|
6603
|
+
if (review.procedureReview && review.procedureReview.procedureId === procedureId) {
|
|
6604
|
+
procedureReviews.push(review.procedureReview);
|
|
6605
|
+
}
|
|
6606
|
+
if (review.extendedProcedureReviews && review.extendedProcedureReviews.length > 0) {
|
|
6607
|
+
const matchingExtended = review.extendedProcedureReviews.filter(
|
|
6608
|
+
(extReview) => extReview.procedureId === procedureId
|
|
6609
|
+
);
|
|
6610
|
+
procedureReviews.push(...matchingExtended);
|
|
6611
|
+
}
|
|
6612
|
+
});
|
|
6613
|
+
if (procedureReviews.length === 0) {
|
|
6577
6614
|
const updatedReviewInfo2 = {
|
|
6578
6615
|
totalReviews: 0,
|
|
6579
6616
|
averageRating: 0,
|
|
@@ -6593,8 +6630,6 @@ var ReviewsAggregationService = class {
|
|
|
6593
6630
|
);
|
|
6594
6631
|
return updatedReviewInfo2;
|
|
6595
6632
|
}
|
|
6596
|
-
const reviews = reviewsQuery.docs.map((doc) => doc.data());
|
|
6597
|
-
const procedureReviews = reviews.map((review) => review.procedureReview).filter((review) => review !== void 0);
|
|
6598
6633
|
let totalRating = 0;
|
|
6599
6634
|
let totalEffectivenessOfTreatment = 0;
|
|
6600
6635
|
let totalOutcomeExplanation = 0;
|
|
@@ -6688,10 +6723,16 @@ var ReviewsAggregationService = class {
|
|
|
6688
6723
|
if (review.procedureReview) {
|
|
6689
6724
|
review.procedureReview.isVerified = true;
|
|
6690
6725
|
}
|
|
6726
|
+
if (review.extendedProcedureReviews && review.extendedProcedureReviews.length > 0) {
|
|
6727
|
+
review.extendedProcedureReviews.forEach((extReview) => {
|
|
6728
|
+
extReview.isVerified = true;
|
|
6729
|
+
});
|
|
6730
|
+
}
|
|
6691
6731
|
batch.update(reviewRef, {
|
|
6692
6732
|
clinicReview: review.clinicReview,
|
|
6693
6733
|
practitionerReview: review.practitionerReview,
|
|
6694
6734
|
procedureReview: review.procedureReview,
|
|
6735
|
+
extendedProcedureReviews: review.extendedProcedureReviews,
|
|
6695
6736
|
updatedAt: admin13.firestore.FieldValue.serverTimestamp()
|
|
6696
6737
|
});
|
|
6697
6738
|
await batch.commit();
|
package/dist/index.d.mts
CHANGED
|
@@ -70,6 +70,7 @@ interface PractitionerReview extends BaseReview {
|
|
|
70
70
|
/**
|
|
71
71
|
* Procedure review interface
|
|
72
72
|
* @description Full review for a medical procedure
|
|
73
|
+
* Used for both main and extended procedures
|
|
73
74
|
*/
|
|
74
75
|
interface ProcedureReview extends BaseReview {
|
|
75
76
|
procedureId: string;
|
|
@@ -138,6 +139,7 @@ interface Review {
|
|
|
138
139
|
clinicReview?: ClinicReview;
|
|
139
140
|
practitionerReview?: PractitionerReview;
|
|
140
141
|
procedureReview?: ProcedureReview;
|
|
142
|
+
extendedProcedureReviews?: ProcedureReview[];
|
|
141
143
|
overallComment: string;
|
|
142
144
|
overallRating: number;
|
|
143
145
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -70,6 +70,7 @@ interface PractitionerReview extends BaseReview {
|
|
|
70
70
|
/**
|
|
71
71
|
* Procedure review interface
|
|
72
72
|
* @description Full review for a medical procedure
|
|
73
|
+
* Used for both main and extended procedures
|
|
73
74
|
*/
|
|
74
75
|
interface ProcedureReview extends BaseReview {
|
|
75
76
|
procedureId: string;
|
|
@@ -138,6 +139,7 @@ interface Review {
|
|
|
138
139
|
clinicReview?: ClinicReview;
|
|
139
140
|
practitionerReview?: PractitionerReview;
|
|
140
141
|
procedureReview?: ProcedureReview;
|
|
142
|
+
extendedProcedureReviews?: ProcedureReview[];
|
|
141
143
|
overallComment: string;
|
|
142
144
|
overallRating: number;
|
|
143
145
|
}
|
package/dist/index.js
CHANGED
|
@@ -4992,6 +4992,7 @@ var reviewSchema = import_zod8.z.object({
|
|
|
4992
4992
|
clinicReview: clinicReviewSchema.optional(),
|
|
4993
4993
|
practitionerReview: practitionerReviewSchema.optional(),
|
|
4994
4994
|
procedureReview: procedureReviewSchema.optional(),
|
|
4995
|
+
extendedProcedureReviews: import_zod8.z.array(procedureReviewSchema).optional(),
|
|
4995
4996
|
overallComment: import_zod8.z.string().min(1).max(2e3),
|
|
4996
4997
|
overallRating: import_zod8.z.number().min(1).max(5)
|
|
4997
4998
|
});
|
|
@@ -5000,13 +5001,14 @@ var createReviewSchema = import_zod8.z.object({
|
|
|
5000
5001
|
clinicReview: createClinicReviewSchema.optional(),
|
|
5001
5002
|
practitionerReview: createPractitionerReviewSchema.optional(),
|
|
5002
5003
|
procedureReview: createProcedureReviewSchema.optional(),
|
|
5004
|
+
extendedProcedureReviews: import_zod8.z.array(createProcedureReviewSchema).optional(),
|
|
5003
5005
|
overallComment: import_zod8.z.string().min(1).max(2e3)
|
|
5004
5006
|
}).refine(
|
|
5005
5007
|
(data) => {
|
|
5006
|
-
return data.clinicReview || data.practitionerReview || data.procedureReview;
|
|
5008
|
+
return data.clinicReview || data.practitionerReview || data.procedureReview || data.extendedProcedureReviews && data.extendedProcedureReviews.length > 0;
|
|
5007
5009
|
},
|
|
5008
5010
|
{
|
|
5009
|
-
message: "At least one review type (clinic, practitioner, or procedure) must be provided",
|
|
5011
|
+
message: "At least one review type (clinic, practitioner, procedure, or extended procedure) must be provided",
|
|
5010
5012
|
path: ["reviewType"]
|
|
5011
5013
|
}
|
|
5012
5014
|
);
|
|
@@ -16839,6 +16841,15 @@ var ProcedureService = class extends BaseService {
|
|
|
16839
16841
|
"procedure-photos"
|
|
16840
16842
|
);
|
|
16841
16843
|
}
|
|
16844
|
+
if (processedPhotos.length === 0 && technology.photoTemplate) {
|
|
16845
|
+
console.log(`[ProcedureService] Using technology photoTemplate as default photo: ${technology.photoTemplate}`);
|
|
16846
|
+
const photoTemplateUrl = await this.mediaService.getMediaDownloadUrl(technology.photoTemplate);
|
|
16847
|
+
if (photoTemplateUrl) {
|
|
16848
|
+
processedPhotos.push(photoTemplateUrl);
|
|
16849
|
+
} else {
|
|
16850
|
+
console.warn(`[ProcedureService] Could not fetch photoTemplate URL for media ID: ${technology.photoTemplate}`);
|
|
16851
|
+
}
|
|
16852
|
+
}
|
|
16842
16853
|
const transformedProductsMetadata = await this.transformProductsMetadata(
|
|
16843
16854
|
validatedData.productsMetadata,
|
|
16844
16855
|
validatedData.technologyId
|
|
@@ -16978,6 +16989,15 @@ var ProcedureService = class extends BaseService {
|
|
|
16978
16989
|
"procedure-photos-batch"
|
|
16979
16990
|
);
|
|
16980
16991
|
}
|
|
16992
|
+
if (processedPhotos.length === 0 && technology.photoTemplate) {
|
|
16993
|
+
console.log(`[ProcedureService] Using technology photoTemplate as default photo for bulk create: ${technology.photoTemplate}`);
|
|
16994
|
+
const photoTemplateUrl = await this.mediaService.getMediaDownloadUrl(technology.photoTemplate);
|
|
16995
|
+
if (photoTemplateUrl) {
|
|
16996
|
+
processedPhotos.push(photoTemplateUrl);
|
|
16997
|
+
} else {
|
|
16998
|
+
console.warn(`[ProcedureService] Could not fetch photoTemplate URL for media ID: ${technology.photoTemplate}`);
|
|
16999
|
+
}
|
|
17000
|
+
}
|
|
16981
17001
|
const transformedProductsMetadata = await this.transformProductsMetadata(
|
|
16982
17002
|
validatedData.productsMetadata,
|
|
16983
17003
|
validatedData.technologyId
|
|
@@ -17814,6 +17834,15 @@ var ProcedureService = class extends BaseService {
|
|
|
17814
17834
|
if (data.photos && data.photos.length > 0) {
|
|
17815
17835
|
processedPhotos = await this.processMediaArray(data.photos, procedureId, "procedure-photos");
|
|
17816
17836
|
}
|
|
17837
|
+
if (processedPhotos.length === 0 && technology.photoTemplate) {
|
|
17838
|
+
console.log(`[ProcedureService] Using technology photoTemplate as default photo for consultation: ${technology.photoTemplate}`);
|
|
17839
|
+
const photoTemplateUrl = await this.mediaService.getMediaDownloadUrl(technology.photoTemplate);
|
|
17840
|
+
if (photoTemplateUrl) {
|
|
17841
|
+
processedPhotos.push(photoTemplateUrl);
|
|
17842
|
+
} else {
|
|
17843
|
+
console.warn(`[ProcedureService] Could not fetch photoTemplate URL for media ID: ${technology.photoTemplate}`);
|
|
17844
|
+
}
|
|
17845
|
+
}
|
|
17817
17846
|
const transformedProductsMetadata = await this.transformProductsMetadata(
|
|
17818
17847
|
data.productsMetadata,
|
|
17819
17848
|
data.technologyId
|
|
@@ -17954,16 +17983,17 @@ var ReviewService = class extends BaseService {
|
|
|
17954
17983
|
* @returns The created review
|
|
17955
17984
|
*/
|
|
17956
17985
|
async createReview(data, appointmentId) {
|
|
17957
|
-
var _a, _b, _c, _d, _e, _f;
|
|
17986
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
17958
17987
|
try {
|
|
17959
17988
|
console.log("\u{1F50D} ReviewService.createReview - Input data:", {
|
|
17960
17989
|
appointmentId,
|
|
17961
17990
|
hasClinicReview: !!data.clinicReview,
|
|
17962
17991
|
hasPractitionerReview: !!data.practitionerReview,
|
|
17963
17992
|
hasProcedureReview: !!data.procedureReview,
|
|
17964
|
-
|
|
17965
|
-
|
|
17966
|
-
|
|
17993
|
+
extendedProcedureReviewsCount: ((_a = data.extendedProcedureReviews) == null ? void 0 : _a.length) || 0,
|
|
17994
|
+
practitionerId: (_b = data.practitionerReview) == null ? void 0 : _b.practitionerId,
|
|
17995
|
+
clinicId: (_c = data.clinicReview) == null ? void 0 : _c.clinicId,
|
|
17996
|
+
procedureId: (_d = data.procedureReview) == null ? void 0 : _d.procedureId
|
|
17967
17997
|
});
|
|
17968
17998
|
const validatedData = createReviewSchema.parse(data);
|
|
17969
17999
|
const ratings = [];
|
|
@@ -18003,6 +18033,20 @@ var ReviewService = class extends BaseService {
|
|
|
18003
18033
|
data.procedureReview.overallRating = procedureAverage;
|
|
18004
18034
|
ratings.push(procedureAverage);
|
|
18005
18035
|
}
|
|
18036
|
+
if (data.extendedProcedureReviews && data.extendedProcedureReviews.length > 0) {
|
|
18037
|
+
data.extendedProcedureReviews.forEach((extendedReview) => {
|
|
18038
|
+
const extendedRatings = [
|
|
18039
|
+
extendedReview.effectivenessOfTreatment,
|
|
18040
|
+
extendedReview.outcomeExplanation,
|
|
18041
|
+
extendedReview.painManagement,
|
|
18042
|
+
extendedReview.followUpCare,
|
|
18043
|
+
extendedReview.valueForMoney
|
|
18044
|
+
];
|
|
18045
|
+
const extendedAverage = this.calculateAverage(extendedRatings);
|
|
18046
|
+
extendedReview.overallRating = extendedAverage;
|
|
18047
|
+
ratings.push(extendedAverage);
|
|
18048
|
+
});
|
|
18049
|
+
}
|
|
18006
18050
|
const overallRating = this.calculateAverage(ratings);
|
|
18007
18051
|
const reviewId = this.generateId();
|
|
18008
18052
|
if (data.clinicReview) {
|
|
@@ -18018,6 +18062,14 @@ var ReviewService = class extends BaseService {
|
|
|
18018
18062
|
data.procedureReview.fullReviewId = reviewId;
|
|
18019
18063
|
}
|
|
18020
18064
|
const now = /* @__PURE__ */ new Date();
|
|
18065
|
+
if (data.extendedProcedureReviews && data.extendedProcedureReviews.length > 0) {
|
|
18066
|
+
data.extendedProcedureReviews.forEach((extendedReview) => {
|
|
18067
|
+
extendedReview.id = this.generateId();
|
|
18068
|
+
extendedReview.fullReviewId = reviewId;
|
|
18069
|
+
extendedReview.createdAt = now;
|
|
18070
|
+
extendedReview.updatedAt = now;
|
|
18071
|
+
});
|
|
18072
|
+
}
|
|
18021
18073
|
const review = {
|
|
18022
18074
|
id: reviewId,
|
|
18023
18075
|
appointmentId,
|
|
@@ -18025,6 +18077,7 @@ var ReviewService = class extends BaseService {
|
|
|
18025
18077
|
clinicReview: data.clinicReview,
|
|
18026
18078
|
practitionerReview: data.practitionerReview,
|
|
18027
18079
|
procedureReview: data.procedureReview,
|
|
18080
|
+
extendedProcedureReviews: data.extendedProcedureReviews,
|
|
18028
18081
|
overallComment: data.overallComment,
|
|
18029
18082
|
overallRating,
|
|
18030
18083
|
createdAt: now,
|
|
@@ -18039,9 +18092,10 @@ var ReviewService = class extends BaseService {
|
|
|
18039
18092
|
});
|
|
18040
18093
|
console.log("\u2705 ReviewService.createReview - Review saved to Firestore:", {
|
|
18041
18094
|
reviewId,
|
|
18042
|
-
practitionerId: (
|
|
18043
|
-
clinicId: (
|
|
18044
|
-
procedureId: (
|
|
18095
|
+
practitionerId: (_e = review.practitionerReview) == null ? void 0 : _e.practitionerId,
|
|
18096
|
+
clinicId: (_f = review.clinicReview) == null ? void 0 : _f.clinicId,
|
|
18097
|
+
procedureId: (_g = review.procedureReview) == null ? void 0 : _g.procedureId,
|
|
18098
|
+
extendedProcedureReviewsCount: ((_h = review.extendedProcedureReviews) == null ? void 0 : _h.length) || 0
|
|
18045
18099
|
});
|
|
18046
18100
|
return review;
|
|
18047
18101
|
} catch (error) {
|
|
@@ -18057,7 +18111,7 @@ var ReviewService = class extends BaseService {
|
|
|
18057
18111
|
* @returns The review with entity names if found, null otherwise
|
|
18058
18112
|
*/
|
|
18059
18113
|
async getReview(reviewId) {
|
|
18060
|
-
var _a, _b, _c;
|
|
18114
|
+
var _a, _b, _c, _d, _e;
|
|
18061
18115
|
console.log("\u{1F50D} ReviewService.getReview - Getting review:", reviewId);
|
|
18062
18116
|
const docRef = (0, import_firestore56.doc)(this.db, REVIEWS_COLLECTION, reviewId);
|
|
18063
18117
|
const docSnap = await (0, import_firestore56.getDoc)(docRef);
|
|
@@ -18091,12 +18145,27 @@ var ReviewService = class extends BaseService {
|
|
|
18091
18145
|
procedureName: appointment.procedureInfo.name
|
|
18092
18146
|
};
|
|
18093
18147
|
}
|
|
18148
|
+
if (enhancedReview.extendedProcedureReviews && enhancedReview.extendedProcedureReviews.length > 0) {
|
|
18149
|
+
const extendedProcedures = ((_a = appointment.metadata) == null ? void 0 : _a.extendedProcedures) || [];
|
|
18150
|
+
enhancedReview.extendedProcedureReviews = enhancedReview.extendedProcedureReviews.map((extendedReview) => {
|
|
18151
|
+
const procedureInfo = extendedProcedures.find(
|
|
18152
|
+
(ep) => ep.procedureId === extendedReview.procedureId
|
|
18153
|
+
);
|
|
18154
|
+
if (procedureInfo) {
|
|
18155
|
+
return {
|
|
18156
|
+
...extendedReview,
|
|
18157
|
+
procedureName: procedureInfo.procedureName
|
|
18158
|
+
};
|
|
18159
|
+
}
|
|
18160
|
+
return extendedReview;
|
|
18161
|
+
});
|
|
18162
|
+
}
|
|
18094
18163
|
if (appointment.patientInfo) {
|
|
18095
18164
|
enhancedReview.patientName = appointment.patientInfo.fullName;
|
|
18096
18165
|
}
|
|
18097
18166
|
console.log("\u2705 ReviewService.getReview - Enhanced review:", {
|
|
18098
18167
|
reviewId,
|
|
18099
|
-
hasEntityNames: !!(((
|
|
18168
|
+
hasEntityNames: !!(((_b = enhancedReview.clinicReview) == null ? void 0 : _b.clinicName) || ((_c = enhancedReview.practitionerReview) == null ? void 0 : _c.practitionerName) || ((_d = enhancedReview.procedureReview) == null ? void 0 : _d.procedureName) || enhancedReview.patientName || ((_e = enhancedReview.extendedProcedureReviews) == null ? void 0 : _e.some((epr) => epr.procedureName)))
|
|
18100
18169
|
});
|
|
18101
18170
|
return enhancedReview;
|
|
18102
18171
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -4965,6 +4965,7 @@ var reviewSchema = z8.object({
|
|
|
4965
4965
|
clinicReview: clinicReviewSchema.optional(),
|
|
4966
4966
|
practitionerReview: practitionerReviewSchema.optional(),
|
|
4967
4967
|
procedureReview: procedureReviewSchema.optional(),
|
|
4968
|
+
extendedProcedureReviews: z8.array(procedureReviewSchema).optional(),
|
|
4968
4969
|
overallComment: z8.string().min(1).max(2e3),
|
|
4969
4970
|
overallRating: z8.number().min(1).max(5)
|
|
4970
4971
|
});
|
|
@@ -4973,13 +4974,14 @@ var createReviewSchema = z8.object({
|
|
|
4973
4974
|
clinicReview: createClinicReviewSchema.optional(),
|
|
4974
4975
|
practitionerReview: createPractitionerReviewSchema.optional(),
|
|
4975
4976
|
procedureReview: createProcedureReviewSchema.optional(),
|
|
4977
|
+
extendedProcedureReviews: z8.array(createProcedureReviewSchema).optional(),
|
|
4976
4978
|
overallComment: z8.string().min(1).max(2e3)
|
|
4977
4979
|
}).refine(
|
|
4978
4980
|
(data) => {
|
|
4979
|
-
return data.clinicReview || data.practitionerReview || data.procedureReview;
|
|
4981
|
+
return data.clinicReview || data.practitionerReview || data.procedureReview || data.extendedProcedureReviews && data.extendedProcedureReviews.length > 0;
|
|
4980
4982
|
},
|
|
4981
4983
|
{
|
|
4982
|
-
message: "At least one review type (clinic, practitioner, or procedure) must be provided",
|
|
4984
|
+
message: "At least one review type (clinic, practitioner, procedure, or extended procedure) must be provided",
|
|
4983
4985
|
path: ["reviewType"]
|
|
4984
4986
|
}
|
|
4985
4987
|
);
|
|
@@ -17087,6 +17089,15 @@ var ProcedureService = class extends BaseService {
|
|
|
17087
17089
|
"procedure-photos"
|
|
17088
17090
|
);
|
|
17089
17091
|
}
|
|
17092
|
+
if (processedPhotos.length === 0 && technology.photoTemplate) {
|
|
17093
|
+
console.log(`[ProcedureService] Using technology photoTemplate as default photo: ${technology.photoTemplate}`);
|
|
17094
|
+
const photoTemplateUrl = await this.mediaService.getMediaDownloadUrl(technology.photoTemplate);
|
|
17095
|
+
if (photoTemplateUrl) {
|
|
17096
|
+
processedPhotos.push(photoTemplateUrl);
|
|
17097
|
+
} else {
|
|
17098
|
+
console.warn(`[ProcedureService] Could not fetch photoTemplate URL for media ID: ${technology.photoTemplate}`);
|
|
17099
|
+
}
|
|
17100
|
+
}
|
|
17090
17101
|
const transformedProductsMetadata = await this.transformProductsMetadata(
|
|
17091
17102
|
validatedData.productsMetadata,
|
|
17092
17103
|
validatedData.technologyId
|
|
@@ -17226,6 +17237,15 @@ var ProcedureService = class extends BaseService {
|
|
|
17226
17237
|
"procedure-photos-batch"
|
|
17227
17238
|
);
|
|
17228
17239
|
}
|
|
17240
|
+
if (processedPhotos.length === 0 && technology.photoTemplate) {
|
|
17241
|
+
console.log(`[ProcedureService] Using technology photoTemplate as default photo for bulk create: ${technology.photoTemplate}`);
|
|
17242
|
+
const photoTemplateUrl = await this.mediaService.getMediaDownloadUrl(technology.photoTemplate);
|
|
17243
|
+
if (photoTemplateUrl) {
|
|
17244
|
+
processedPhotos.push(photoTemplateUrl);
|
|
17245
|
+
} else {
|
|
17246
|
+
console.warn(`[ProcedureService] Could not fetch photoTemplate URL for media ID: ${technology.photoTemplate}`);
|
|
17247
|
+
}
|
|
17248
|
+
}
|
|
17229
17249
|
const transformedProductsMetadata = await this.transformProductsMetadata(
|
|
17230
17250
|
validatedData.productsMetadata,
|
|
17231
17251
|
validatedData.technologyId
|
|
@@ -18062,6 +18082,15 @@ var ProcedureService = class extends BaseService {
|
|
|
18062
18082
|
if (data.photos && data.photos.length > 0) {
|
|
18063
18083
|
processedPhotos = await this.processMediaArray(data.photos, procedureId, "procedure-photos");
|
|
18064
18084
|
}
|
|
18085
|
+
if (processedPhotos.length === 0 && technology.photoTemplate) {
|
|
18086
|
+
console.log(`[ProcedureService] Using technology photoTemplate as default photo for consultation: ${technology.photoTemplate}`);
|
|
18087
|
+
const photoTemplateUrl = await this.mediaService.getMediaDownloadUrl(technology.photoTemplate);
|
|
18088
|
+
if (photoTemplateUrl) {
|
|
18089
|
+
processedPhotos.push(photoTemplateUrl);
|
|
18090
|
+
} else {
|
|
18091
|
+
console.warn(`[ProcedureService] Could not fetch photoTemplate URL for media ID: ${technology.photoTemplate}`);
|
|
18092
|
+
}
|
|
18093
|
+
}
|
|
18065
18094
|
const transformedProductsMetadata = await this.transformProductsMetadata(
|
|
18066
18095
|
data.productsMetadata,
|
|
18067
18096
|
data.technologyId
|
|
@@ -18212,16 +18241,17 @@ var ReviewService = class extends BaseService {
|
|
|
18212
18241
|
* @returns The created review
|
|
18213
18242
|
*/
|
|
18214
18243
|
async createReview(data, appointmentId) {
|
|
18215
|
-
var _a, _b, _c, _d, _e, _f;
|
|
18244
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
18216
18245
|
try {
|
|
18217
18246
|
console.log("\u{1F50D} ReviewService.createReview - Input data:", {
|
|
18218
18247
|
appointmentId,
|
|
18219
18248
|
hasClinicReview: !!data.clinicReview,
|
|
18220
18249
|
hasPractitionerReview: !!data.practitionerReview,
|
|
18221
18250
|
hasProcedureReview: !!data.procedureReview,
|
|
18222
|
-
|
|
18223
|
-
|
|
18224
|
-
|
|
18251
|
+
extendedProcedureReviewsCount: ((_a = data.extendedProcedureReviews) == null ? void 0 : _a.length) || 0,
|
|
18252
|
+
practitionerId: (_b = data.practitionerReview) == null ? void 0 : _b.practitionerId,
|
|
18253
|
+
clinicId: (_c = data.clinicReview) == null ? void 0 : _c.clinicId,
|
|
18254
|
+
procedureId: (_d = data.procedureReview) == null ? void 0 : _d.procedureId
|
|
18225
18255
|
});
|
|
18226
18256
|
const validatedData = createReviewSchema.parse(data);
|
|
18227
18257
|
const ratings = [];
|
|
@@ -18261,6 +18291,20 @@ var ReviewService = class extends BaseService {
|
|
|
18261
18291
|
data.procedureReview.overallRating = procedureAverage;
|
|
18262
18292
|
ratings.push(procedureAverage);
|
|
18263
18293
|
}
|
|
18294
|
+
if (data.extendedProcedureReviews && data.extendedProcedureReviews.length > 0) {
|
|
18295
|
+
data.extendedProcedureReviews.forEach((extendedReview) => {
|
|
18296
|
+
const extendedRatings = [
|
|
18297
|
+
extendedReview.effectivenessOfTreatment,
|
|
18298
|
+
extendedReview.outcomeExplanation,
|
|
18299
|
+
extendedReview.painManagement,
|
|
18300
|
+
extendedReview.followUpCare,
|
|
18301
|
+
extendedReview.valueForMoney
|
|
18302
|
+
];
|
|
18303
|
+
const extendedAverage = this.calculateAverage(extendedRatings);
|
|
18304
|
+
extendedReview.overallRating = extendedAverage;
|
|
18305
|
+
ratings.push(extendedAverage);
|
|
18306
|
+
});
|
|
18307
|
+
}
|
|
18264
18308
|
const overallRating = this.calculateAverage(ratings);
|
|
18265
18309
|
const reviewId = this.generateId();
|
|
18266
18310
|
if (data.clinicReview) {
|
|
@@ -18276,6 +18320,14 @@ var ReviewService = class extends BaseService {
|
|
|
18276
18320
|
data.procedureReview.fullReviewId = reviewId;
|
|
18277
18321
|
}
|
|
18278
18322
|
const now = /* @__PURE__ */ new Date();
|
|
18323
|
+
if (data.extendedProcedureReviews && data.extendedProcedureReviews.length > 0) {
|
|
18324
|
+
data.extendedProcedureReviews.forEach((extendedReview) => {
|
|
18325
|
+
extendedReview.id = this.generateId();
|
|
18326
|
+
extendedReview.fullReviewId = reviewId;
|
|
18327
|
+
extendedReview.createdAt = now;
|
|
18328
|
+
extendedReview.updatedAt = now;
|
|
18329
|
+
});
|
|
18330
|
+
}
|
|
18279
18331
|
const review = {
|
|
18280
18332
|
id: reviewId,
|
|
18281
18333
|
appointmentId,
|
|
@@ -18283,6 +18335,7 @@ var ReviewService = class extends BaseService {
|
|
|
18283
18335
|
clinicReview: data.clinicReview,
|
|
18284
18336
|
practitionerReview: data.practitionerReview,
|
|
18285
18337
|
procedureReview: data.procedureReview,
|
|
18338
|
+
extendedProcedureReviews: data.extendedProcedureReviews,
|
|
18286
18339
|
overallComment: data.overallComment,
|
|
18287
18340
|
overallRating,
|
|
18288
18341
|
createdAt: now,
|
|
@@ -18297,9 +18350,10 @@ var ReviewService = class extends BaseService {
|
|
|
18297
18350
|
});
|
|
18298
18351
|
console.log("\u2705 ReviewService.createReview - Review saved to Firestore:", {
|
|
18299
18352
|
reviewId,
|
|
18300
|
-
practitionerId: (
|
|
18301
|
-
clinicId: (
|
|
18302
|
-
procedureId: (
|
|
18353
|
+
practitionerId: (_e = review.practitionerReview) == null ? void 0 : _e.practitionerId,
|
|
18354
|
+
clinicId: (_f = review.clinicReview) == null ? void 0 : _f.clinicId,
|
|
18355
|
+
procedureId: (_g = review.procedureReview) == null ? void 0 : _g.procedureId,
|
|
18356
|
+
extendedProcedureReviewsCount: ((_h = review.extendedProcedureReviews) == null ? void 0 : _h.length) || 0
|
|
18303
18357
|
});
|
|
18304
18358
|
return review;
|
|
18305
18359
|
} catch (error) {
|
|
@@ -18315,7 +18369,7 @@ var ReviewService = class extends BaseService {
|
|
|
18315
18369
|
* @returns The review with entity names if found, null otherwise
|
|
18316
18370
|
*/
|
|
18317
18371
|
async getReview(reviewId) {
|
|
18318
|
-
var _a, _b, _c;
|
|
18372
|
+
var _a, _b, _c, _d, _e;
|
|
18319
18373
|
console.log("\u{1F50D} ReviewService.getReview - Getting review:", reviewId);
|
|
18320
18374
|
const docRef = doc38(this.db, REVIEWS_COLLECTION, reviewId);
|
|
18321
18375
|
const docSnap = await getDoc39(docRef);
|
|
@@ -18349,12 +18403,27 @@ var ReviewService = class extends BaseService {
|
|
|
18349
18403
|
procedureName: appointment.procedureInfo.name
|
|
18350
18404
|
};
|
|
18351
18405
|
}
|
|
18406
|
+
if (enhancedReview.extendedProcedureReviews && enhancedReview.extendedProcedureReviews.length > 0) {
|
|
18407
|
+
const extendedProcedures = ((_a = appointment.metadata) == null ? void 0 : _a.extendedProcedures) || [];
|
|
18408
|
+
enhancedReview.extendedProcedureReviews = enhancedReview.extendedProcedureReviews.map((extendedReview) => {
|
|
18409
|
+
const procedureInfo = extendedProcedures.find(
|
|
18410
|
+
(ep) => ep.procedureId === extendedReview.procedureId
|
|
18411
|
+
);
|
|
18412
|
+
if (procedureInfo) {
|
|
18413
|
+
return {
|
|
18414
|
+
...extendedReview,
|
|
18415
|
+
procedureName: procedureInfo.procedureName
|
|
18416
|
+
};
|
|
18417
|
+
}
|
|
18418
|
+
return extendedReview;
|
|
18419
|
+
});
|
|
18420
|
+
}
|
|
18352
18421
|
if (appointment.patientInfo) {
|
|
18353
18422
|
enhancedReview.patientName = appointment.patientInfo.fullName;
|
|
18354
18423
|
}
|
|
18355
18424
|
console.log("\u2705 ReviewService.getReview - Enhanced review:", {
|
|
18356
18425
|
reviewId,
|
|
18357
|
-
hasEntityNames: !!(((
|
|
18426
|
+
hasEntityNames: !!(((_b = enhancedReview.clinicReview) == null ? void 0 : _b.clinicName) || ((_c = enhancedReview.practitionerReview) == null ? void 0 : _c.practitionerName) || ((_d = enhancedReview.procedureReview) == null ? void 0 : _d.procedureName) || enhancedReview.patientName || ((_e = enhancedReview.extendedProcedureReviews) == null ? void 0 : _e.some((epr) => epr.procedureName)))
|
|
18358
18427
|
});
|
|
18359
18428
|
return enhancedReview;
|
|
18360
18429
|
}
|