@blackcode_sa/metaestetics-api 1.12.65 → 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.
Files changed (269) hide show
  1. package/dist/admin/index.d.mts +2 -0
  2. package/dist/admin/index.d.ts +2 -0
  3. package/dist/admin/index.js +45 -4
  4. package/dist/admin/index.mjs +45 -4
  5. package/dist/index.d.mts +2 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.js +53 -11
  8. package/dist/index.mjs +53 -11
  9. package/package.json +119 -119
  10. package/src/__mocks__/firstore.ts +10 -10
  11. package/src/admin/aggregation/README.md +79 -79
  12. package/src/admin/aggregation/appointment/README.md +128 -128
  13. package/src/admin/aggregation/appointment/appointment.aggregation.service.ts +1844 -1844
  14. package/src/admin/aggregation/appointment/index.ts +1 -1
  15. package/src/admin/aggregation/clinic/README.md +52 -52
  16. package/src/admin/aggregation/clinic/clinic.aggregation.service.ts +703 -703
  17. package/src/admin/aggregation/clinic/index.ts +1 -1
  18. package/src/admin/aggregation/forms/README.md +13 -13
  19. package/src/admin/aggregation/forms/filled-forms.aggregation.service.ts +322 -322
  20. package/src/admin/aggregation/forms/index.ts +1 -1
  21. package/src/admin/aggregation/index.ts +8 -8
  22. package/src/admin/aggregation/patient/README.md +27 -27
  23. package/src/admin/aggregation/patient/index.ts +1 -1
  24. package/src/admin/aggregation/patient/patient.aggregation.service.ts +141 -141
  25. package/src/admin/aggregation/practitioner/README.md +42 -42
  26. package/src/admin/aggregation/practitioner/index.ts +1 -1
  27. package/src/admin/aggregation/practitioner/practitioner.aggregation.service.ts +433 -433
  28. package/src/admin/aggregation/practitioner-invite/index.ts +1 -1
  29. package/src/admin/aggregation/practitioner-invite/practitioner-invite.aggregation.service.ts +961 -961
  30. package/src/admin/aggregation/procedure/README.md +43 -43
  31. package/src/admin/aggregation/procedure/index.ts +1 -1
  32. package/src/admin/aggregation/procedure/procedure.aggregation.service.ts +702 -702
  33. package/src/admin/aggregation/reviews/index.ts +1 -1
  34. package/src/admin/aggregation/reviews/reviews.aggregation.service.ts +689 -641
  35. package/src/admin/booking/README.md +125 -125
  36. package/src/admin/booking/booking.admin.ts +1037 -1037
  37. package/src/admin/booking/booking.calculator.ts +712 -712
  38. package/src/admin/booking/booking.types.ts +59 -59
  39. package/src/admin/booking/index.ts +3 -3
  40. package/src/admin/booking/timezones-problem.md +185 -185
  41. package/src/admin/calendar/README.md +7 -7
  42. package/src/admin/calendar/calendar.admin.service.ts +345 -345
  43. package/src/admin/calendar/index.ts +1 -1
  44. package/src/admin/documentation-templates/document-manager.admin.ts +260 -260
  45. package/src/admin/documentation-templates/index.ts +1 -1
  46. package/src/admin/free-consultation/free-consultation-utils.admin.ts +148 -148
  47. package/src/admin/free-consultation/index.ts +1 -1
  48. package/src/admin/index.ts +75 -75
  49. package/src/admin/logger/index.ts +78 -78
  50. package/src/admin/mailing/README.md +95 -95
  51. package/src/admin/mailing/appointment/appointment.mailing.service.ts +732 -732
  52. package/src/admin/mailing/appointment/index.ts +1 -1
  53. package/src/admin/mailing/appointment/templates/patient/appointment-confirmed.html +40 -40
  54. package/src/admin/mailing/base.mailing.service.ts +208 -208
  55. package/src/admin/mailing/index.ts +3 -3
  56. package/src/admin/mailing/practitionerInvite/existing-practitioner-invite.mailing.ts +611 -611
  57. package/src/admin/mailing/practitionerInvite/index.ts +2 -2
  58. package/src/admin/mailing/practitionerInvite/practitionerInvite.mailing.ts +395 -395
  59. package/src/admin/mailing/practitionerInvite/templates/existing-practitioner-invitation.template.ts +155 -155
  60. package/src/admin/mailing/practitionerInvite/templates/invitation.template.ts +101 -101
  61. package/src/admin/mailing/practitionerInvite/templates/invite-accepted-notification.template.ts +228 -228
  62. package/src/admin/mailing/practitionerInvite/templates/invite-rejected-notification.template.ts +242 -242
  63. package/src/admin/notifications/index.ts +1 -1
  64. package/src/admin/notifications/notifications.admin.ts +710 -710
  65. package/src/admin/requirements/README.md +128 -128
  66. package/src/admin/requirements/index.ts +1 -1
  67. package/src/admin/requirements/patient-requirements.admin.service.ts +475 -475
  68. package/src/admin/users/index.ts +1 -1
  69. package/src/admin/users/user-profile.admin.ts +405 -405
  70. package/src/backoffice/constants/certification.constants.ts +13 -13
  71. package/src/backoffice/constants/index.ts +1 -1
  72. package/src/backoffice/errors/backoffice.errors.ts +181 -181
  73. package/src/backoffice/errors/index.ts +1 -1
  74. package/src/backoffice/expo-safe/README.md +26 -26
  75. package/src/backoffice/expo-safe/index.ts +41 -41
  76. package/src/backoffice/index.ts +5 -5
  77. package/src/backoffice/services/FIXES_README.md +102 -102
  78. package/src/backoffice/services/README.md +40 -40
  79. package/src/backoffice/services/brand.service.ts +256 -256
  80. package/src/backoffice/services/category.service.ts +318 -318
  81. package/src/backoffice/services/constants.service.ts +385 -385
  82. package/src/backoffice/services/documentation-template.service.ts +202 -202
  83. package/src/backoffice/services/index.ts +10 -10
  84. package/src/backoffice/services/migrate-products.ts +116 -116
  85. package/src/backoffice/services/product.service.ts +553 -553
  86. package/src/backoffice/services/requirement.service.ts +235 -235
  87. package/src/backoffice/services/subcategory.service.ts +395 -395
  88. package/src/backoffice/services/technology.service.ts +1083 -1083
  89. package/src/backoffice/types/README.md +12 -12
  90. package/src/backoffice/types/admin-constants.types.ts +69 -69
  91. package/src/backoffice/types/brand.types.ts +29 -29
  92. package/src/backoffice/types/category.types.ts +62 -62
  93. package/src/backoffice/types/documentation-templates.types.ts +28 -28
  94. package/src/backoffice/types/index.ts +10 -10
  95. package/src/backoffice/types/procedure-product.types.ts +38 -38
  96. package/src/backoffice/types/product.types.ts +240 -240
  97. package/src/backoffice/types/requirement.types.ts +63 -63
  98. package/src/backoffice/types/static/README.md +18 -18
  99. package/src/backoffice/types/static/blocking-condition.types.ts +21 -21
  100. package/src/backoffice/types/static/certification.types.ts +37 -37
  101. package/src/backoffice/types/static/contraindication.types.ts +19 -19
  102. package/src/backoffice/types/static/index.ts +6 -6
  103. package/src/backoffice/types/static/pricing.types.ts +16 -16
  104. package/src/backoffice/types/static/procedure-family.types.ts +14 -14
  105. package/src/backoffice/types/static/treatment-benefit.types.ts +22 -22
  106. package/src/backoffice/types/subcategory.types.ts +34 -34
  107. package/src/backoffice/types/technology.types.ts +163 -163
  108. package/src/backoffice/validations/index.ts +1 -1
  109. package/src/backoffice/validations/schemas.ts +164 -164
  110. package/src/config/__mocks__/firebase.ts +99 -99
  111. package/src/config/firebase.ts +78 -78
  112. package/src/config/index.ts +9 -9
  113. package/src/errors/auth.error.ts +6 -6
  114. package/src/errors/auth.errors.ts +200 -200
  115. package/src/errors/clinic.errors.ts +32 -32
  116. package/src/errors/firebase.errors.ts +47 -47
  117. package/src/errors/user.errors.ts +99 -99
  118. package/src/index.backup.ts +407 -407
  119. package/src/index.ts +6 -6
  120. package/src/locales/en.ts +31 -31
  121. package/src/recommender/admin/index.ts +1 -1
  122. package/src/recommender/admin/services/recommender.service.admin.ts +5 -5
  123. package/src/recommender/front/index.ts +1 -1
  124. package/src/recommender/front/services/onboarding.service.ts +5 -5
  125. package/src/recommender/front/services/recommender.service.ts +3 -3
  126. package/src/recommender/index.ts +1 -1
  127. package/src/services/PATIENTAUTH.MD +197 -197
  128. package/src/services/README.md +106 -106
  129. package/src/services/__tests__/auth/auth.mock.test.ts +17 -17
  130. package/src/services/__tests__/auth/auth.setup.ts +293 -293
  131. package/src/services/__tests__/auth.service.test.ts +346 -346
  132. package/src/services/__tests__/base.service.test.ts +77 -77
  133. package/src/services/__tests__/user.service.test.ts +528 -528
  134. package/src/services/appointment/README.md +17 -17
  135. package/src/services/appointment/appointment.service.ts +2505 -2505
  136. package/src/services/appointment/index.ts +1 -1
  137. package/src/services/appointment/utils/appointment.utils.ts +552 -552
  138. package/src/services/appointment/utils/extended-procedure.utils.ts +314 -314
  139. package/src/services/appointment/utils/form-initialization.utils.ts +225 -225
  140. package/src/services/appointment/utils/recommended-procedure.utils.ts +195 -195
  141. package/src/services/appointment/utils/zone-management.utils.ts +353 -353
  142. package/src/services/appointment/utils/zone-photo.utils.ts +152 -152
  143. package/src/services/auth/auth.service.ts +989 -989
  144. package/src/services/auth/auth.v2.service.ts +961 -961
  145. package/src/services/auth/index.ts +7 -7
  146. package/src/services/auth/utils/error.utils.ts +90 -90
  147. package/src/services/auth/utils/firebase.utils.ts +49 -49
  148. package/src/services/auth/utils/index.ts +21 -21
  149. package/src/services/auth/utils/practitioner.utils.ts +125 -125
  150. package/src/services/base.service.ts +41 -41
  151. package/src/services/calendar/calendar.service.ts +1077 -1077
  152. package/src/services/calendar/calendar.v2.service.ts +1683 -1683
  153. package/src/services/calendar/calendar.v3.service.ts +313 -313
  154. package/src/services/calendar/externalCalendar.service.ts +178 -178
  155. package/src/services/calendar/index.ts +5 -5
  156. package/src/services/calendar/synced-calendars.service.ts +743 -743
  157. package/src/services/calendar/utils/appointment.utils.ts +265 -265
  158. package/src/services/calendar/utils/calendar-event.utils.ts +646 -646
  159. package/src/services/calendar/utils/clinic.utils.ts +237 -237
  160. package/src/services/calendar/utils/docs.utils.ts +157 -157
  161. package/src/services/calendar/utils/google-calendar.utils.ts +697 -697
  162. package/src/services/calendar/utils/index.ts +8 -8
  163. package/src/services/calendar/utils/patient.utils.ts +198 -198
  164. package/src/services/calendar/utils/practitioner.utils.ts +221 -221
  165. package/src/services/calendar/utils/synced-calendar.utils.ts +472 -472
  166. package/src/services/clinic/README.md +204 -204
  167. package/src/services/clinic/__tests__/clinic-admin.service.test.ts +287 -287
  168. package/src/services/clinic/__tests__/clinic-group.service.test.ts +352 -352
  169. package/src/services/clinic/__tests__/clinic.service.test.ts +354 -354
  170. package/src/services/clinic/billing-transactions.service.ts +217 -217
  171. package/src/services/clinic/clinic-admin.service.ts +202 -202
  172. package/src/services/clinic/clinic-group.service.ts +310 -310
  173. package/src/services/clinic/clinic.service.ts +708 -708
  174. package/src/services/clinic/index.ts +5 -5
  175. package/src/services/clinic/practitioner-invite.service.ts +519 -519
  176. package/src/services/clinic/utils/admin.utils.ts +551 -551
  177. package/src/services/clinic/utils/clinic-group.utils.ts +646 -646
  178. package/src/services/clinic/utils/clinic.utils.ts +949 -949
  179. package/src/services/clinic/utils/filter.utils.d.ts +23 -23
  180. package/src/services/clinic/utils/filter.utils.ts +446 -446
  181. package/src/services/clinic/utils/index.ts +11 -11
  182. package/src/services/clinic/utils/photos.utils.ts +188 -188
  183. package/src/services/clinic/utils/search.utils.ts +84 -84
  184. package/src/services/clinic/utils/tag.utils.ts +124 -124
  185. package/src/services/documentation-templates/documentation-template.service.ts +537 -537
  186. package/src/services/documentation-templates/filled-document.service.ts +587 -587
  187. package/src/services/documentation-templates/index.ts +2 -2
  188. package/src/services/index.ts +13 -13
  189. package/src/services/media/index.ts +1 -1
  190. package/src/services/media/media.service.ts +418 -418
  191. package/src/services/notifications/__tests__/notification.service.test.ts +242 -242
  192. package/src/services/notifications/index.ts +1 -1
  193. package/src/services/notifications/notification.service.ts +215 -215
  194. package/src/services/patient/README.md +48 -48
  195. package/src/services/patient/To-Do.md +43 -43
  196. package/src/services/patient/__tests__/patient.service.test.ts +294 -294
  197. package/src/services/patient/index.ts +2 -2
  198. package/src/services/patient/patient.service.ts +883 -883
  199. package/src/services/patient/patientRequirements.service.ts +285 -285
  200. package/src/services/patient/utils/aesthetic-analysis.utils.ts +176 -176
  201. package/src/services/patient/utils/clinic.utils.ts +80 -80
  202. package/src/services/patient/utils/docs.utils.ts +142 -142
  203. package/src/services/patient/utils/index.ts +9 -9
  204. package/src/services/patient/utils/location.utils.ts +126 -126
  205. package/src/services/patient/utils/medical-stuff.utils.ts +143 -143
  206. package/src/services/patient/utils/medical.utils.ts +458 -458
  207. package/src/services/patient/utils/practitioner.utils.ts +260 -260
  208. package/src/services/patient/utils/profile.utils.ts +510 -510
  209. package/src/services/patient/utils/sensitive.utils.ts +260 -260
  210. package/src/services/patient/utils/token.utils.ts +211 -211
  211. package/src/services/practitioner/README.md +145 -145
  212. package/src/services/practitioner/index.ts +1 -1
  213. package/src/services/practitioner/practitioner.service.ts +1742 -1742
  214. package/src/services/procedure/README.md +163 -163
  215. package/src/services/procedure/index.ts +1 -1
  216. package/src/services/procedure/procedure.service.ts +1715 -1715
  217. package/src/services/reviews/index.ts +1 -1
  218. package/src/services/reviews/reviews.service.ts +683 -636
  219. package/src/services/user/index.ts +1 -1
  220. package/src/services/user/user.service.ts +489 -489
  221. package/src/services/user/user.v2.service.ts +466 -466
  222. package/src/types/appointment/index.ts +480 -480
  223. package/src/types/calendar/index.ts +258 -258
  224. package/src/types/calendar/synced-calendar.types.ts +66 -66
  225. package/src/types/clinic/index.ts +489 -489
  226. package/src/types/clinic/practitioner-invite.types.ts +91 -91
  227. package/src/types/clinic/preferences.types.ts +159 -159
  228. package/src/types/clinic/to-do +3 -3
  229. package/src/types/documentation-templates/index.ts +308 -308
  230. package/src/types/index.ts +44 -44
  231. package/src/types/notifications/README.md +77 -77
  232. package/src/types/notifications/index.ts +265 -265
  233. package/src/types/patient/aesthetic-analysis.types.ts +66 -66
  234. package/src/types/patient/allergies.ts +58 -58
  235. package/src/types/patient/index.ts +275 -275
  236. package/src/types/patient/medical-info.types.ts +152 -152
  237. package/src/types/patient/patient-requirements.ts +92 -92
  238. package/src/types/patient/token.types.ts +61 -61
  239. package/src/types/practitioner/index.ts +206 -206
  240. package/src/types/procedure/index.ts +181 -181
  241. package/src/types/profile/index.ts +39 -39
  242. package/src/types/reviews/index.ts +132 -130
  243. package/src/types/tz-lookup.d.ts +4 -4
  244. package/src/types/user/index.ts +38 -38
  245. package/src/utils/TIMESTAMPS.md +176 -176
  246. package/src/utils/TimestampUtils.ts +241 -241
  247. package/src/utils/index.ts +1 -1
  248. package/src/validations/appointment.schema.ts +574 -574
  249. package/src/validations/calendar.schema.ts +225 -225
  250. package/src/validations/clinic.schema.ts +493 -493
  251. package/src/validations/common.schema.ts +25 -25
  252. package/src/validations/documentation-templates/index.ts +1 -1
  253. package/src/validations/documentation-templates/template.schema.ts +220 -220
  254. package/src/validations/documentation-templates.schema.ts +10 -10
  255. package/src/validations/index.ts +20 -20
  256. package/src/validations/media.schema.ts +10 -10
  257. package/src/validations/notification.schema.ts +90 -90
  258. package/src/validations/patient/aesthetic-analysis.schema.ts +55 -55
  259. package/src/validations/patient/medical-info.schema.ts +125 -125
  260. package/src/validations/patient/patient-requirements.schema.ts +84 -84
  261. package/src/validations/patient/token.schema.ts +29 -29
  262. package/src/validations/patient.schema.ts +217 -217
  263. package/src/validations/practitioner.schema.ts +222 -222
  264. package/src/validations/procedure-product.schema.ts +41 -41
  265. package/src/validations/procedure.schema.ts +124 -124
  266. package/src/validations/profile-info.schema.ts +41 -41
  267. package/src/validations/reviews.schema.ts +195 -189
  268. package/src/validations/schemas.ts +104 -104
  269. package/src/validations/shared.schema.ts +78 -78
@@ -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
  }
@@ -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
  }
@@ -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 reviewsQuery = await this.db.collection(REVIEWS_COLLECTION).where("procedureReview.procedureId", "==", procedureId).get();
6638
- if (isRemoval && reviewsQuery.size <= 1 || reviewsQuery.empty) {
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();
@@ -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 reviewsQuery = await this.db.collection(REVIEWS_COLLECTION).where("procedureReview.procedureId", "==", procedureId).get();
6576
- if (isRemoval && reviewsQuery.size <= 1 || reviewsQuery.empty) {
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
  );
@@ -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
- practitionerId: (_a = data.practitionerReview) == null ? void 0 : _a.practitionerId,
17992
- clinicId: (_b = data.clinicReview) == null ? void 0 : _b.clinicId,
17993
- procedureId: (_c = data.procedureReview) == null ? void 0 : _c.procedureId
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: (_d = review.practitionerReview) == null ? void 0 : _d.practitionerId,
18070
- clinicId: (_e = review.clinicReview) == null ? void 0 : _e.clinicId,
18071
- procedureId: (_f = review.procedureReview) == null ? void 0 : _f.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: !!(((_a = enhancedReview.clinicReview) == null ? void 0 : _a.clinicName) || ((_b = enhancedReview.practitionerReview) == null ? void 0 : _b.practitionerName) || ((_c = enhancedReview.procedureReview) == null ? void 0 : _c.procedureName) || enhancedReview.patientName)
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
  }
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
- practitionerId: (_a = data.practitionerReview) == null ? void 0 : _a.practitionerId,
18250
- clinicId: (_b = data.clinicReview) == null ? void 0 : _b.clinicId,
18251
- procedureId: (_c = data.procedureReview) == null ? void 0 : _c.procedureId
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: (_d = review.practitionerReview) == null ? void 0 : _d.practitionerId,
18328
- clinicId: (_e = review.clinicReview) == null ? void 0 : _e.clinicId,
18329
- procedureId: (_f = review.procedureReview) == null ? void 0 : _f.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: !!(((_a = enhancedReview.clinicReview) == null ? void 0 : _a.clinicName) || ((_b = enhancedReview.practitionerReview) == null ? void 0 : _b.practitionerName) || ((_c = enhancedReview.procedureReview) == null ? void 0 : _c.procedureName) || enhancedReview.patientName)
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
  }