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