@blackcode_sa/metaestetics-api 1.12.61 → 1.12.62

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 +8 -8
  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 +1070 -1070
  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 +161 -161
  108. package/src/backoffice/validations/index.ts +1 -1
  109. package/src/backoffice/validations/schemas.ts +163 -163
  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 +2082 -2082
  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 +1682 -1682
  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 +453 -453
  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 +273 -273
  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 +216 -216
  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
@@ -4696,6 +4696,7 @@ var reviewSchema = import_zod8.z.object({
4696
4696
  clinicReview: clinicReviewSchema.optional(),
4697
4697
  practitionerReview: practitionerReviewSchema.optional(),
4698
4698
  procedureReview: procedureReviewSchema.optional(),
4699
+ extendedProcedureReviews: import_zod8.z.array(procedureReviewSchema).optional(),
4699
4700
  overallComment: import_zod8.z.string().min(1).max(2e3),
4700
4701
  overallRating: import_zod8.z.number().min(1).max(5)
4701
4702
  });
@@ -4704,13 +4705,14 @@ var createReviewSchema = import_zod8.z.object({
4704
4705
  clinicReview: createClinicReviewSchema.optional(),
4705
4706
  practitionerReview: createPractitionerReviewSchema.optional(),
4706
4707
  procedureReview: createProcedureReviewSchema.optional(),
4708
+ extendedProcedureReviews: import_zod8.z.array(createProcedureReviewSchema).optional(),
4707
4709
  overallComment: import_zod8.z.string().min(1).max(2e3)
4708
4710
  }).refine(
4709
4711
  (data) => {
4710
- return data.clinicReview || data.practitionerReview || data.procedureReview;
4712
+ return data.clinicReview || data.practitionerReview || data.procedureReview || data.extendedProcedureReviews && data.extendedProcedureReviews.length > 0;
4711
4713
  },
4712
4714
  {
4713
- message: "At least one review type (clinic, practitioner, or procedure) must be provided",
4715
+ message: "At least one review type (clinic, practitioner, procedure, or extended procedure) must be provided",
4714
4716
  path: ["reviewType"]
4715
4717
  }
4716
4718
  );
@@ -17658,16 +17660,17 @@ var ReviewService = class extends BaseService {
17658
17660
  * @returns The created review
17659
17661
  */
17660
17662
  async createReview(data, appointmentId) {
17661
- var _a, _b, _c, _d, _e, _f;
17663
+ var _a, _b, _c, _d, _e, _f, _g, _h;
17662
17664
  try {
17663
17665
  console.log("\u{1F50D} ReviewService.createReview - Input data:", {
17664
17666
  appointmentId,
17665
17667
  hasClinicReview: !!data.clinicReview,
17666
17668
  hasPractitionerReview: !!data.practitionerReview,
17667
17669
  hasProcedureReview: !!data.procedureReview,
17668
- practitionerId: (_a = data.practitionerReview) == null ? void 0 : _a.practitionerId,
17669
- clinicId: (_b = data.clinicReview) == null ? void 0 : _b.clinicId,
17670
- procedureId: (_c = data.procedureReview) == null ? void 0 : _c.procedureId
17670
+ extendedProcedureReviewsCount: ((_a = data.extendedProcedureReviews) == null ? void 0 : _a.length) || 0,
17671
+ practitionerId: (_b = data.practitionerReview) == null ? void 0 : _b.practitionerId,
17672
+ clinicId: (_c = data.clinicReview) == null ? void 0 : _c.clinicId,
17673
+ procedureId: (_d = data.procedureReview) == null ? void 0 : _d.procedureId
17671
17674
  });
17672
17675
  const validatedData = createReviewSchema.parse(data);
17673
17676
  const ratings = [];
@@ -17707,6 +17710,20 @@ var ReviewService = class extends BaseService {
17707
17710
  data.procedureReview.overallRating = procedureAverage;
17708
17711
  ratings.push(procedureAverage);
17709
17712
  }
17713
+ if (data.extendedProcedureReviews && data.extendedProcedureReviews.length > 0) {
17714
+ data.extendedProcedureReviews.forEach((extendedReview) => {
17715
+ const extendedRatings = [
17716
+ extendedReview.effectivenessOfTreatment,
17717
+ extendedReview.outcomeExplanation,
17718
+ extendedReview.painManagement,
17719
+ extendedReview.followUpCare,
17720
+ extendedReview.valueForMoney
17721
+ ];
17722
+ const extendedAverage = this.calculateAverage(extendedRatings);
17723
+ extendedReview.overallRating = extendedAverage;
17724
+ ratings.push(extendedAverage);
17725
+ });
17726
+ }
17710
17727
  const overallRating = this.calculateAverage(ratings);
17711
17728
  const reviewId = this.generateId();
17712
17729
  if (data.clinicReview) {
@@ -17722,6 +17739,14 @@ var ReviewService = class extends BaseService {
17722
17739
  data.procedureReview.fullReviewId = reviewId;
17723
17740
  }
17724
17741
  const now = /* @__PURE__ */ new Date();
17742
+ if (data.extendedProcedureReviews && data.extendedProcedureReviews.length > 0) {
17743
+ data.extendedProcedureReviews.forEach((extendedReview) => {
17744
+ extendedReview.id = this.generateId();
17745
+ extendedReview.fullReviewId = reviewId;
17746
+ extendedReview.createdAt = now;
17747
+ extendedReview.updatedAt = now;
17748
+ });
17749
+ }
17725
17750
  const review = {
17726
17751
  id: reviewId,
17727
17752
  appointmentId,
@@ -17729,6 +17754,7 @@ var ReviewService = class extends BaseService {
17729
17754
  clinicReview: data.clinicReview,
17730
17755
  practitionerReview: data.practitionerReview,
17731
17756
  procedureReview: data.procedureReview,
17757
+ extendedProcedureReviews: data.extendedProcedureReviews,
17732
17758
  overallComment: data.overallComment,
17733
17759
  overallRating,
17734
17760
  createdAt: now,
@@ -17743,9 +17769,10 @@ var ReviewService = class extends BaseService {
17743
17769
  });
17744
17770
  console.log("\u2705 ReviewService.createReview - Review saved to Firestore:", {
17745
17771
  reviewId,
17746
- practitionerId: (_d = review.practitionerReview) == null ? void 0 : _d.practitionerId,
17747
- clinicId: (_e = review.clinicReview) == null ? void 0 : _e.clinicId,
17748
- procedureId: (_f = review.procedureReview) == null ? void 0 : _f.procedureId
17772
+ practitionerId: (_e = review.practitionerReview) == null ? void 0 : _e.practitionerId,
17773
+ clinicId: (_f = review.clinicReview) == null ? void 0 : _f.clinicId,
17774
+ procedureId: (_g = review.procedureReview) == null ? void 0 : _g.procedureId,
17775
+ extendedProcedureReviewsCount: ((_h = review.extendedProcedureReviews) == null ? void 0 : _h.length) || 0
17749
17776
  });
17750
17777
  return review;
17751
17778
  } catch (error) {
@@ -17761,7 +17788,7 @@ var ReviewService = class extends BaseService {
17761
17788
  * @returns The review with entity names if found, null otherwise
17762
17789
  */
17763
17790
  async getReview(reviewId) {
17764
- var _a, _b, _c;
17791
+ var _a, _b, _c, _d, _e;
17765
17792
  console.log("\u{1F50D} ReviewService.getReview - Getting review:", reviewId);
17766
17793
  const docRef = (0, import_firestore56.doc)(this.db, REVIEWS_COLLECTION, reviewId);
17767
17794
  const docSnap = await (0, import_firestore56.getDoc)(docRef);
@@ -17795,12 +17822,27 @@ var ReviewService = class extends BaseService {
17795
17822
  procedureName: appointment.procedureInfo.name
17796
17823
  };
17797
17824
  }
17825
+ if (enhancedReview.extendedProcedureReviews && enhancedReview.extendedProcedureReviews.length > 0) {
17826
+ const extendedProcedures = ((_a = appointment.metadata) == null ? void 0 : _a.extendedProcedures) || [];
17827
+ enhancedReview.extendedProcedureReviews = enhancedReview.extendedProcedureReviews.map((extendedReview) => {
17828
+ const procedureInfo = extendedProcedures.find(
17829
+ (ep) => ep.procedureId === extendedReview.procedureId
17830
+ );
17831
+ if (procedureInfo) {
17832
+ return {
17833
+ ...extendedReview,
17834
+ procedureName: procedureInfo.procedureName
17835
+ };
17836
+ }
17837
+ return extendedReview;
17838
+ });
17839
+ }
17798
17840
  if (appointment.patientInfo) {
17799
17841
  enhancedReview.patientName = appointment.patientInfo.fullName;
17800
17842
  }
17801
17843
  console.log("\u2705 ReviewService.getReview - Enhanced review:", {
17802
17844
  reviewId,
17803
- 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)
17845
+ 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)))
17804
17846
  });
17805
17847
  return enhancedReview;
17806
17848
  }
package/dist/index.mjs CHANGED
@@ -4669,6 +4669,7 @@ var reviewSchema = z8.object({
4669
4669
  clinicReview: clinicReviewSchema.optional(),
4670
4670
  practitionerReview: practitionerReviewSchema.optional(),
4671
4671
  procedureReview: procedureReviewSchema.optional(),
4672
+ extendedProcedureReviews: z8.array(procedureReviewSchema).optional(),
4672
4673
  overallComment: z8.string().min(1).max(2e3),
4673
4674
  overallRating: z8.number().min(1).max(5)
4674
4675
  });
@@ -4677,13 +4678,14 @@ var createReviewSchema = z8.object({
4677
4678
  clinicReview: createClinicReviewSchema.optional(),
4678
4679
  practitionerReview: createPractitionerReviewSchema.optional(),
4679
4680
  procedureReview: createProcedureReviewSchema.optional(),
4681
+ extendedProcedureReviews: z8.array(createProcedureReviewSchema).optional(),
4680
4682
  overallComment: z8.string().min(1).max(2e3)
4681
4683
  }).refine(
4682
4684
  (data) => {
4683
- return data.clinicReview || data.practitionerReview || data.procedureReview;
4685
+ return data.clinicReview || data.practitionerReview || data.procedureReview || data.extendedProcedureReviews && data.extendedProcedureReviews.length > 0;
4684
4686
  },
4685
4687
  {
4686
- message: "At least one review type (clinic, practitioner, or procedure) must be provided",
4688
+ message: "At least one review type (clinic, practitioner, procedure, or extended procedure) must be provided",
4687
4689
  path: ["reviewType"]
4688
4690
  }
4689
4691
  );
@@ -17916,16 +17918,17 @@ var ReviewService = class extends BaseService {
17916
17918
  * @returns The created review
17917
17919
  */
17918
17920
  async createReview(data, appointmentId) {
17919
- var _a, _b, _c, _d, _e, _f;
17921
+ var _a, _b, _c, _d, _e, _f, _g, _h;
17920
17922
  try {
17921
17923
  console.log("\u{1F50D} ReviewService.createReview - Input data:", {
17922
17924
  appointmentId,
17923
17925
  hasClinicReview: !!data.clinicReview,
17924
17926
  hasPractitionerReview: !!data.practitionerReview,
17925
17927
  hasProcedureReview: !!data.procedureReview,
17926
- practitionerId: (_a = data.practitionerReview) == null ? void 0 : _a.practitionerId,
17927
- clinicId: (_b = data.clinicReview) == null ? void 0 : _b.clinicId,
17928
- procedureId: (_c = data.procedureReview) == null ? void 0 : _c.procedureId
17928
+ extendedProcedureReviewsCount: ((_a = data.extendedProcedureReviews) == null ? void 0 : _a.length) || 0,
17929
+ practitionerId: (_b = data.practitionerReview) == null ? void 0 : _b.practitionerId,
17930
+ clinicId: (_c = data.clinicReview) == null ? void 0 : _c.clinicId,
17931
+ procedureId: (_d = data.procedureReview) == null ? void 0 : _d.procedureId
17929
17932
  });
17930
17933
  const validatedData = createReviewSchema.parse(data);
17931
17934
  const ratings = [];
@@ -17965,6 +17968,20 @@ var ReviewService = class extends BaseService {
17965
17968
  data.procedureReview.overallRating = procedureAverage;
17966
17969
  ratings.push(procedureAverage);
17967
17970
  }
17971
+ if (data.extendedProcedureReviews && data.extendedProcedureReviews.length > 0) {
17972
+ data.extendedProcedureReviews.forEach((extendedReview) => {
17973
+ const extendedRatings = [
17974
+ extendedReview.effectivenessOfTreatment,
17975
+ extendedReview.outcomeExplanation,
17976
+ extendedReview.painManagement,
17977
+ extendedReview.followUpCare,
17978
+ extendedReview.valueForMoney
17979
+ ];
17980
+ const extendedAverage = this.calculateAverage(extendedRatings);
17981
+ extendedReview.overallRating = extendedAverage;
17982
+ ratings.push(extendedAverage);
17983
+ });
17984
+ }
17968
17985
  const overallRating = this.calculateAverage(ratings);
17969
17986
  const reviewId = this.generateId();
17970
17987
  if (data.clinicReview) {
@@ -17980,6 +17997,14 @@ var ReviewService = class extends BaseService {
17980
17997
  data.procedureReview.fullReviewId = reviewId;
17981
17998
  }
17982
17999
  const now = /* @__PURE__ */ new Date();
18000
+ if (data.extendedProcedureReviews && data.extendedProcedureReviews.length > 0) {
18001
+ data.extendedProcedureReviews.forEach((extendedReview) => {
18002
+ extendedReview.id = this.generateId();
18003
+ extendedReview.fullReviewId = reviewId;
18004
+ extendedReview.createdAt = now;
18005
+ extendedReview.updatedAt = now;
18006
+ });
18007
+ }
17983
18008
  const review = {
17984
18009
  id: reviewId,
17985
18010
  appointmentId,
@@ -17987,6 +18012,7 @@ var ReviewService = class extends BaseService {
17987
18012
  clinicReview: data.clinicReview,
17988
18013
  practitionerReview: data.practitionerReview,
17989
18014
  procedureReview: data.procedureReview,
18015
+ extendedProcedureReviews: data.extendedProcedureReviews,
17990
18016
  overallComment: data.overallComment,
17991
18017
  overallRating,
17992
18018
  createdAt: now,
@@ -18001,9 +18027,10 @@ var ReviewService = class extends BaseService {
18001
18027
  });
18002
18028
  console.log("\u2705 ReviewService.createReview - Review saved to Firestore:", {
18003
18029
  reviewId,
18004
- practitionerId: (_d = review.practitionerReview) == null ? void 0 : _d.practitionerId,
18005
- clinicId: (_e = review.clinicReview) == null ? void 0 : _e.clinicId,
18006
- procedureId: (_f = review.procedureReview) == null ? void 0 : _f.procedureId
18030
+ practitionerId: (_e = review.practitionerReview) == null ? void 0 : _e.practitionerId,
18031
+ clinicId: (_f = review.clinicReview) == null ? void 0 : _f.clinicId,
18032
+ procedureId: (_g = review.procedureReview) == null ? void 0 : _g.procedureId,
18033
+ extendedProcedureReviewsCount: ((_h = review.extendedProcedureReviews) == null ? void 0 : _h.length) || 0
18007
18034
  });
18008
18035
  return review;
18009
18036
  } catch (error) {
@@ -18019,7 +18046,7 @@ var ReviewService = class extends BaseService {
18019
18046
  * @returns The review with entity names if found, null otherwise
18020
18047
  */
18021
18048
  async getReview(reviewId) {
18022
- var _a, _b, _c;
18049
+ var _a, _b, _c, _d, _e;
18023
18050
  console.log("\u{1F50D} ReviewService.getReview - Getting review:", reviewId);
18024
18051
  const docRef = doc37(this.db, REVIEWS_COLLECTION, reviewId);
18025
18052
  const docSnap = await getDoc38(docRef);
@@ -18053,12 +18080,27 @@ var ReviewService = class extends BaseService {
18053
18080
  procedureName: appointment.procedureInfo.name
18054
18081
  };
18055
18082
  }
18083
+ if (enhancedReview.extendedProcedureReviews && enhancedReview.extendedProcedureReviews.length > 0) {
18084
+ const extendedProcedures = ((_a = appointment.metadata) == null ? void 0 : _a.extendedProcedures) || [];
18085
+ enhancedReview.extendedProcedureReviews = enhancedReview.extendedProcedureReviews.map((extendedReview) => {
18086
+ const procedureInfo = extendedProcedures.find(
18087
+ (ep) => ep.procedureId === extendedReview.procedureId
18088
+ );
18089
+ if (procedureInfo) {
18090
+ return {
18091
+ ...extendedReview,
18092
+ procedureName: procedureInfo.procedureName
18093
+ };
18094
+ }
18095
+ return extendedReview;
18096
+ });
18097
+ }
18056
18098
  if (appointment.patientInfo) {
18057
18099
  enhancedReview.patientName = appointment.patientInfo.fullName;
18058
18100
  }
18059
18101
  console.log("\u2705 ReviewService.getReview - Enhanced review:", {
18060
18102
  reviewId,
18061
- 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)
18103
+ 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)))
18062
18104
  });
18063
18105
  return enhancedReview;
18064
18106
  }