@blackcode_sa/metaestetics-api 1.12.65 → 1.12.67
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/backoffice/index.d.mts +33 -0
- package/dist/backoffice/index.d.ts +33 -0
- package/dist/backoffice/index.js +63 -0
- package/dist/backoffice/index.mjs +63 -0
- package/dist/index.d.mts +35 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +116 -11
- package/dist/index.mjs +116 -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 +341 -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 +417 -395
- package/src/backoffice/services/technology.service.ts +1104 -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 +67 -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 +168 -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 -1715
- 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/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
|
);
|
|
@@ -17981,16 +17983,17 @@ var ReviewService = class extends BaseService {
|
|
|
17981
17983
|
* @returns The created review
|
|
17982
17984
|
*/
|
|
17983
17985
|
async createReview(data, appointmentId) {
|
|
17984
|
-
var _a, _b, _c, _d, _e, _f;
|
|
17986
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
17985
17987
|
try {
|
|
17986
17988
|
console.log("\u{1F50D} ReviewService.createReview - Input data:", {
|
|
17987
17989
|
appointmentId,
|
|
17988
17990
|
hasClinicReview: !!data.clinicReview,
|
|
17989
17991
|
hasPractitionerReview: !!data.practitionerReview,
|
|
17990
17992
|
hasProcedureReview: !!data.procedureReview,
|
|
17991
|
-
|
|
17992
|
-
|
|
17993
|
-
|
|
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
|
|
17994
17997
|
});
|
|
17995
17998
|
const validatedData = createReviewSchema.parse(data);
|
|
17996
17999
|
const ratings = [];
|
|
@@ -18030,6 +18033,20 @@ var ReviewService = class extends BaseService {
|
|
|
18030
18033
|
data.procedureReview.overallRating = procedureAverage;
|
|
18031
18034
|
ratings.push(procedureAverage);
|
|
18032
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
|
+
}
|
|
18033
18050
|
const overallRating = this.calculateAverage(ratings);
|
|
18034
18051
|
const reviewId = this.generateId();
|
|
18035
18052
|
if (data.clinicReview) {
|
|
@@ -18045,6 +18062,14 @@ var ReviewService = class extends BaseService {
|
|
|
18045
18062
|
data.procedureReview.fullReviewId = reviewId;
|
|
18046
18063
|
}
|
|
18047
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
|
+
}
|
|
18048
18073
|
const review = {
|
|
18049
18074
|
id: reviewId,
|
|
18050
18075
|
appointmentId,
|
|
@@ -18052,6 +18077,7 @@ var ReviewService = class extends BaseService {
|
|
|
18052
18077
|
clinicReview: data.clinicReview,
|
|
18053
18078
|
practitionerReview: data.practitionerReview,
|
|
18054
18079
|
procedureReview: data.procedureReview,
|
|
18080
|
+
extendedProcedureReviews: data.extendedProcedureReviews,
|
|
18055
18081
|
overallComment: data.overallComment,
|
|
18056
18082
|
overallRating,
|
|
18057
18083
|
createdAt: now,
|
|
@@ -18066,9 +18092,10 @@ var ReviewService = class extends BaseService {
|
|
|
18066
18092
|
});
|
|
18067
18093
|
console.log("\u2705 ReviewService.createReview - Review saved to Firestore:", {
|
|
18068
18094
|
reviewId,
|
|
18069
|
-
practitionerId: (
|
|
18070
|
-
clinicId: (
|
|
18071
|
-
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
|
|
18072
18099
|
});
|
|
18073
18100
|
return review;
|
|
18074
18101
|
} catch (error) {
|
|
@@ -18084,7 +18111,7 @@ var ReviewService = class extends BaseService {
|
|
|
18084
18111
|
* @returns The review with entity names if found, null otherwise
|
|
18085
18112
|
*/
|
|
18086
18113
|
async getReview(reviewId) {
|
|
18087
|
-
var _a, _b, _c;
|
|
18114
|
+
var _a, _b, _c, _d, _e;
|
|
18088
18115
|
console.log("\u{1F50D} ReviewService.getReview - Getting review:", reviewId);
|
|
18089
18116
|
const docRef = (0, import_firestore56.doc)(this.db, REVIEWS_COLLECTION, reviewId);
|
|
18090
18117
|
const docSnap = await (0, import_firestore56.getDoc)(docRef);
|
|
@@ -18118,12 +18145,27 @@ var ReviewService = class extends BaseService {
|
|
|
18118
18145
|
procedureName: appointment.procedureInfo.name
|
|
18119
18146
|
};
|
|
18120
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
|
+
}
|
|
18121
18163
|
if (appointment.patientInfo) {
|
|
18122
18164
|
enhancedReview.patientName = appointment.patientInfo.fullName;
|
|
18123
18165
|
}
|
|
18124
18166
|
console.log("\u2705 ReviewService.getReview - Enhanced review:", {
|
|
18125
18167
|
reviewId,
|
|
18126
|
-
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)))
|
|
18127
18169
|
});
|
|
18128
18170
|
return enhancedReview;
|
|
18129
18171
|
}
|
|
@@ -18877,6 +18919,28 @@ var CategoryService = class extends BaseService {
|
|
|
18877
18919
|
...docSnap.data()
|
|
18878
18920
|
};
|
|
18879
18921
|
}
|
|
18922
|
+
/**
|
|
18923
|
+
* Finds a category by exact name match within a specific family.
|
|
18924
|
+
* Used for CSV import matching.
|
|
18925
|
+
* @param name - Exact name of the category to find
|
|
18926
|
+
* @param family - Procedure family to search within
|
|
18927
|
+
* @returns Category if found, null otherwise
|
|
18928
|
+
*/
|
|
18929
|
+
async findByNameAndFamily(name, family) {
|
|
18930
|
+
const q = (0, import_firestore59.query)(
|
|
18931
|
+
this.categoriesRef,
|
|
18932
|
+
(0, import_firestore59.where)("name", "==", name),
|
|
18933
|
+
(0, import_firestore59.where)("family", "==", family),
|
|
18934
|
+
(0, import_firestore59.where)("isActive", "==", true)
|
|
18935
|
+
);
|
|
18936
|
+
const snapshot = await (0, import_firestore59.getDocs)(q);
|
|
18937
|
+
if (snapshot.empty) return null;
|
|
18938
|
+
const doc45 = snapshot.docs[0];
|
|
18939
|
+
return {
|
|
18940
|
+
id: doc45.id,
|
|
18941
|
+
...doc45.data()
|
|
18942
|
+
};
|
|
18943
|
+
}
|
|
18880
18944
|
/**
|
|
18881
18945
|
* Exports categories to CSV string, suitable for Excel/Sheets.
|
|
18882
18946
|
* Includes headers and optional UTF-8 BOM.
|
|
@@ -19169,6 +19233,27 @@ var SubcategoryService = class extends BaseService {
|
|
|
19169
19233
|
...docSnap.data()
|
|
19170
19234
|
};
|
|
19171
19235
|
}
|
|
19236
|
+
/**
|
|
19237
|
+
* Finds a subcategory by exact name match within a specific category.
|
|
19238
|
+
* Used for CSV import matching.
|
|
19239
|
+
* @param name - Exact name of the subcategory to find
|
|
19240
|
+
* @param categoryId - ID of the category to search within
|
|
19241
|
+
* @returns Subcategory if found, null otherwise
|
|
19242
|
+
*/
|
|
19243
|
+
async findByNameAndCategory(name, categoryId) {
|
|
19244
|
+
const q = (0, import_firestore60.query)(
|
|
19245
|
+
this.getSubcategoriesRef(categoryId),
|
|
19246
|
+
(0, import_firestore60.where)("name", "==", name),
|
|
19247
|
+
(0, import_firestore60.where)("isActive", "==", true)
|
|
19248
|
+
);
|
|
19249
|
+
const querySnapshot = await (0, import_firestore60.getDocs)(q);
|
|
19250
|
+
if (querySnapshot.empty) return null;
|
|
19251
|
+
const doc45 = querySnapshot.docs[0];
|
|
19252
|
+
return {
|
|
19253
|
+
id: doc45.id,
|
|
19254
|
+
...doc45.data()
|
|
19255
|
+
};
|
|
19256
|
+
}
|
|
19172
19257
|
/**
|
|
19173
19258
|
* Exports subcategories to CSV string, suitable for Excel/Sheets.
|
|
19174
19259
|
* Includes headers and optional UTF-8 BOM.
|
|
@@ -19459,6 +19544,26 @@ var TechnologyService = class extends BaseService {
|
|
|
19459
19544
|
...docSnap.data()
|
|
19460
19545
|
};
|
|
19461
19546
|
}
|
|
19547
|
+
/**
|
|
19548
|
+
* Finds a technology by exact name match.
|
|
19549
|
+
* Used for CSV import duplicate detection.
|
|
19550
|
+
* @param name - Exact name of the technology to find
|
|
19551
|
+
* @returns Technology if found, null otherwise
|
|
19552
|
+
*/
|
|
19553
|
+
async findByName(name) {
|
|
19554
|
+
const q = (0, import_firestore61.query)(
|
|
19555
|
+
this.technologiesRef,
|
|
19556
|
+
(0, import_firestore61.where)("name", "==", name),
|
|
19557
|
+
(0, import_firestore61.where)("isActive", "==", true)
|
|
19558
|
+
);
|
|
19559
|
+
const snapshot = await (0, import_firestore61.getDocs)(q);
|
|
19560
|
+
if (snapshot.empty) return null;
|
|
19561
|
+
const doc45 = snapshot.docs[0];
|
|
19562
|
+
return {
|
|
19563
|
+
id: doc45.id,
|
|
19564
|
+
...doc45.data()
|
|
19565
|
+
};
|
|
19566
|
+
}
|
|
19462
19567
|
/**
|
|
19463
19568
|
* Dodaje novi zahtev tehnologiji
|
|
19464
19569
|
* @param technologyId - ID tehnologije
|
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
|
);
|
|
@@ -18239,16 +18241,17 @@ var ReviewService = class extends BaseService {
|
|
|
18239
18241
|
* @returns The created review
|
|
18240
18242
|
*/
|
|
18241
18243
|
async createReview(data, appointmentId) {
|
|
18242
|
-
var _a, _b, _c, _d, _e, _f;
|
|
18244
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
18243
18245
|
try {
|
|
18244
18246
|
console.log("\u{1F50D} ReviewService.createReview - Input data:", {
|
|
18245
18247
|
appointmentId,
|
|
18246
18248
|
hasClinicReview: !!data.clinicReview,
|
|
18247
18249
|
hasPractitionerReview: !!data.practitionerReview,
|
|
18248
18250
|
hasProcedureReview: !!data.procedureReview,
|
|
18249
|
-
|
|
18250
|
-
|
|
18251
|
-
|
|
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
|
|
18252
18255
|
});
|
|
18253
18256
|
const validatedData = createReviewSchema.parse(data);
|
|
18254
18257
|
const ratings = [];
|
|
@@ -18288,6 +18291,20 @@ var ReviewService = class extends BaseService {
|
|
|
18288
18291
|
data.procedureReview.overallRating = procedureAverage;
|
|
18289
18292
|
ratings.push(procedureAverage);
|
|
18290
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
|
+
}
|
|
18291
18308
|
const overallRating = this.calculateAverage(ratings);
|
|
18292
18309
|
const reviewId = this.generateId();
|
|
18293
18310
|
if (data.clinicReview) {
|
|
@@ -18303,6 +18320,14 @@ var ReviewService = class extends BaseService {
|
|
|
18303
18320
|
data.procedureReview.fullReviewId = reviewId;
|
|
18304
18321
|
}
|
|
18305
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
|
+
}
|
|
18306
18331
|
const review = {
|
|
18307
18332
|
id: reviewId,
|
|
18308
18333
|
appointmentId,
|
|
@@ -18310,6 +18335,7 @@ var ReviewService = class extends BaseService {
|
|
|
18310
18335
|
clinicReview: data.clinicReview,
|
|
18311
18336
|
practitionerReview: data.practitionerReview,
|
|
18312
18337
|
procedureReview: data.procedureReview,
|
|
18338
|
+
extendedProcedureReviews: data.extendedProcedureReviews,
|
|
18313
18339
|
overallComment: data.overallComment,
|
|
18314
18340
|
overallRating,
|
|
18315
18341
|
createdAt: now,
|
|
@@ -18324,9 +18350,10 @@ var ReviewService = class extends BaseService {
|
|
|
18324
18350
|
});
|
|
18325
18351
|
console.log("\u2705 ReviewService.createReview - Review saved to Firestore:", {
|
|
18326
18352
|
reviewId,
|
|
18327
|
-
practitionerId: (
|
|
18328
|
-
clinicId: (
|
|
18329
|
-
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
|
|
18330
18357
|
});
|
|
18331
18358
|
return review;
|
|
18332
18359
|
} catch (error) {
|
|
@@ -18342,7 +18369,7 @@ var ReviewService = class extends BaseService {
|
|
|
18342
18369
|
* @returns The review with entity names if found, null otherwise
|
|
18343
18370
|
*/
|
|
18344
18371
|
async getReview(reviewId) {
|
|
18345
|
-
var _a, _b, _c;
|
|
18372
|
+
var _a, _b, _c, _d, _e;
|
|
18346
18373
|
console.log("\u{1F50D} ReviewService.getReview - Getting review:", reviewId);
|
|
18347
18374
|
const docRef = doc38(this.db, REVIEWS_COLLECTION, reviewId);
|
|
18348
18375
|
const docSnap = await getDoc39(docRef);
|
|
@@ -18376,12 +18403,27 @@ var ReviewService = class extends BaseService {
|
|
|
18376
18403
|
procedureName: appointment.procedureInfo.name
|
|
18377
18404
|
};
|
|
18378
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
|
+
}
|
|
18379
18421
|
if (appointment.patientInfo) {
|
|
18380
18422
|
enhancedReview.patientName = appointment.patientInfo.fullName;
|
|
18381
18423
|
}
|
|
18382
18424
|
console.log("\u2705 ReviewService.getReview - Enhanced review:", {
|
|
18383
18425
|
reviewId,
|
|
18384
|
-
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)))
|
|
18385
18427
|
});
|
|
18386
18428
|
return enhancedReview;
|
|
18387
18429
|
}
|
|
@@ -19161,6 +19203,28 @@ var CategoryService = class extends BaseService {
|
|
|
19161
19203
|
...docSnap.data()
|
|
19162
19204
|
};
|
|
19163
19205
|
}
|
|
19206
|
+
/**
|
|
19207
|
+
* Finds a category by exact name match within a specific family.
|
|
19208
|
+
* Used for CSV import matching.
|
|
19209
|
+
* @param name - Exact name of the category to find
|
|
19210
|
+
* @param family - Procedure family to search within
|
|
19211
|
+
* @returns Category if found, null otherwise
|
|
19212
|
+
*/
|
|
19213
|
+
async findByNameAndFamily(name, family) {
|
|
19214
|
+
const q = query34(
|
|
19215
|
+
this.categoriesRef,
|
|
19216
|
+
where34("name", "==", name),
|
|
19217
|
+
where34("family", "==", family),
|
|
19218
|
+
where34("isActive", "==", true)
|
|
19219
|
+
);
|
|
19220
|
+
const snapshot = await getDocs34(q);
|
|
19221
|
+
if (snapshot.empty) return null;
|
|
19222
|
+
const doc45 = snapshot.docs[0];
|
|
19223
|
+
return {
|
|
19224
|
+
id: doc45.id,
|
|
19225
|
+
...doc45.data()
|
|
19226
|
+
};
|
|
19227
|
+
}
|
|
19164
19228
|
/**
|
|
19165
19229
|
* Exports categories to CSV string, suitable for Excel/Sheets.
|
|
19166
19230
|
* Includes headers and optional UTF-8 BOM.
|
|
@@ -19469,6 +19533,27 @@ var SubcategoryService = class extends BaseService {
|
|
|
19469
19533
|
...docSnap.data()
|
|
19470
19534
|
};
|
|
19471
19535
|
}
|
|
19536
|
+
/**
|
|
19537
|
+
* Finds a subcategory by exact name match within a specific category.
|
|
19538
|
+
* Used for CSV import matching.
|
|
19539
|
+
* @param name - Exact name of the subcategory to find
|
|
19540
|
+
* @param categoryId - ID of the category to search within
|
|
19541
|
+
* @returns Subcategory if found, null otherwise
|
|
19542
|
+
*/
|
|
19543
|
+
async findByNameAndCategory(name, categoryId) {
|
|
19544
|
+
const q = query35(
|
|
19545
|
+
this.getSubcategoriesRef(categoryId),
|
|
19546
|
+
where35("name", "==", name),
|
|
19547
|
+
where35("isActive", "==", true)
|
|
19548
|
+
);
|
|
19549
|
+
const querySnapshot = await getDocs35(q);
|
|
19550
|
+
if (querySnapshot.empty) return null;
|
|
19551
|
+
const doc45 = querySnapshot.docs[0];
|
|
19552
|
+
return {
|
|
19553
|
+
id: doc45.id,
|
|
19554
|
+
...doc45.data()
|
|
19555
|
+
};
|
|
19556
|
+
}
|
|
19472
19557
|
/**
|
|
19473
19558
|
* Exports subcategories to CSV string, suitable for Excel/Sheets.
|
|
19474
19559
|
* Includes headers and optional UTF-8 BOM.
|
|
@@ -19774,6 +19859,26 @@ var TechnologyService = class extends BaseService {
|
|
|
19774
19859
|
...docSnap.data()
|
|
19775
19860
|
};
|
|
19776
19861
|
}
|
|
19862
|
+
/**
|
|
19863
|
+
* Finds a technology by exact name match.
|
|
19864
|
+
* Used for CSV import duplicate detection.
|
|
19865
|
+
* @param name - Exact name of the technology to find
|
|
19866
|
+
* @returns Technology if found, null otherwise
|
|
19867
|
+
*/
|
|
19868
|
+
async findByName(name) {
|
|
19869
|
+
const q = query36(
|
|
19870
|
+
this.technologiesRef,
|
|
19871
|
+
where36("name", "==", name),
|
|
19872
|
+
where36("isActive", "==", true)
|
|
19873
|
+
);
|
|
19874
|
+
const snapshot = await getDocs36(q);
|
|
19875
|
+
if (snapshot.empty) return null;
|
|
19876
|
+
const doc45 = snapshot.docs[0];
|
|
19877
|
+
return {
|
|
19878
|
+
id: doc45.id,
|
|
19879
|
+
...doc45.data()
|
|
19880
|
+
};
|
|
19881
|
+
}
|
|
19777
19882
|
/**
|
|
19778
19883
|
* Dodaje novi zahtev tehnologiji
|
|
19779
19884
|
* @param technologyId - ID tehnologije
|