@blackcode_sa/metaestetics-api 1.12.62 → 1.12.64

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 +4 -2
  2. package/dist/admin/index.d.ts +4 -2
  3. package/dist/admin/index.js +4 -45
  4. package/dist/admin/index.mjs +4 -45
  5. package/dist/backoffice/index.d.mts +86 -1
  6. package/dist/backoffice/index.d.ts +86 -1
  7. package/dist/backoffice/index.js +308 -0
  8. package/dist/backoffice/index.mjs +306 -0
  9. package/dist/index.d.mts +99 -3
  10. package/dist/index.d.ts +99 -3
  11. package/dist/index.js +545 -281
  12. package/dist/index.mjs +867 -603
  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 +641 -689
  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 +318 -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 +11 -8
  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 +395 -395
  92. package/src/backoffice/services/technology.service.ts +1083 -1070
  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 +62 -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 +163 -161
  112. package/src/backoffice/validations/index.ts +1 -1
  113. package/src/backoffice/validations/schemas.ts +164 -163
  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 -2082
  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 +1682 -1682
  221. package/src/services/reviews/index.ts +1 -1
  222. package/src/services/reviews/reviews.service.ts +636 -683
  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 +481 -453
  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 -273
  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 +130 -132
  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 -216
  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 +189 -195
  272. package/src/validations/schemas.ts +104 -104
  273. package/src/validations/shared.schema.ts +78 -78
@@ -70,7 +70,6 @@ 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
74
73
  */
75
74
  interface ProcedureReview extends BaseReview {
76
75
  procedureId: string;
@@ -139,7 +138,6 @@ interface Review {
139
138
  clinicReview?: ClinicReview;
140
139
  practitionerReview?: PractitionerReview;
141
140
  procedureReview?: ProcedureReview;
142
- extendedProcedureReviews?: ProcedureReview[];
143
141
  overallComment: string;
144
142
  overallRating: number;
145
143
  }
@@ -689,6 +687,8 @@ interface Technology {
689
687
  benefits: TreatmentBenefitDynamic[];
690
688
  certificationRequirement: CertificationRequirement;
691
689
  documentationTemplates?: TechnologyDocumentationTemplate[];
690
+ /** Media ID of the default photo template image for this technology */
691
+ photoTemplate?: string;
692
692
  isActive: boolean;
693
693
  createdAt: Date;
694
694
  updatedAt: Date;
@@ -1517,6 +1517,8 @@ interface PatientProfile {
1517
1517
  clinics: PatientClinic[];
1518
1518
  doctorIds: string[];
1519
1519
  clinicIds: string[];
1520
+ /** IDs of dismissed next steps recommendations (format: appointmentId:recommendationIndex) */
1521
+ dismissedNextStepsRecommendations?: string[];
1520
1522
  createdAt: Timestamp;
1521
1523
  updatedAt: Timestamp;
1522
1524
  }
@@ -70,7 +70,6 @@ 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
74
73
  */
75
74
  interface ProcedureReview extends BaseReview {
76
75
  procedureId: string;
@@ -139,7 +138,6 @@ interface Review {
139
138
  clinicReview?: ClinicReview;
140
139
  practitionerReview?: PractitionerReview;
141
140
  procedureReview?: ProcedureReview;
142
- extendedProcedureReviews?: ProcedureReview[];
143
141
  overallComment: string;
144
142
  overallRating: number;
145
143
  }
@@ -689,6 +687,8 @@ interface Technology {
689
687
  benefits: TreatmentBenefitDynamic[];
690
688
  certificationRequirement: CertificationRequirement;
691
689
  documentationTemplates?: TechnologyDocumentationTemplate[];
690
+ /** Media ID of the default photo template image for this technology */
691
+ photoTemplate?: string;
692
692
  isActive: boolean;
693
693
  createdAt: Date;
694
694
  updatedAt: Date;
@@ -1517,6 +1517,8 @@ interface PatientProfile {
1517
1517
  clinics: PatientClinic[];
1518
1518
  doctorIds: string[];
1519
1519
  clinicIds: string[];
1520
+ /** IDs of dismissed next steps recommendations (format: appointmentId:recommendationIndex) */
1521
+ dismissedNextStepsRecommendations?: string[];
1520
1522
  createdAt: Timestamp;
1521
1523
  updatedAt: Timestamp;
1522
1524
  }
@@ -6375,16 +6375,6 @@ 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
- }
6388
6378
  await Promise.all(updatePromises);
6389
6379
  console.log(
6390
6380
  `[ReviewsAggregationService] Successfully processed review: ${review.id}`
@@ -6427,20 +6417,6 @@ var ReviewsAggregationService = class {
6427
6417
  )
6428
6418
  );
6429
6419
  }
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
- }
6444
6420
  await Promise.all(updatePromises);
6445
6421
  console.log(
6446
6422
  `[ReviewsAggregationService] Successfully processed deleted review: ${review.id}`
@@ -6658,21 +6634,8 @@ var ReviewsAggregationService = class {
6658
6634
  valueForMoney: 0,
6659
6635
  recommendationPercentage: 0
6660
6636
  };
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) {
6637
+ const reviewsQuery = await this.db.collection(REVIEWS_COLLECTION).where("procedureReview.procedureId", "==", procedureId).get();
6638
+ if (isRemoval && reviewsQuery.size <= 1 || reviewsQuery.empty) {
6676
6639
  const updatedReviewInfo2 = {
6677
6640
  totalReviews: 0,
6678
6641
  averageRating: 0,
@@ -6692,6 +6655,8 @@ var ReviewsAggregationService = class {
6692
6655
  );
6693
6656
  return updatedReviewInfo2;
6694
6657
  }
6658
+ const reviews = reviewsQuery.docs.map((doc) => doc.data());
6659
+ const procedureReviews = reviews.map((review) => review.procedureReview).filter((review) => review !== void 0);
6695
6660
  let totalRating = 0;
6696
6661
  let totalEffectivenessOfTreatment = 0;
6697
6662
  let totalOutcomeExplanation = 0;
@@ -6785,16 +6750,10 @@ var ReviewsAggregationService = class {
6785
6750
  if (review.procedureReview) {
6786
6751
  review.procedureReview.isVerified = true;
6787
6752
  }
6788
- if (review.extendedProcedureReviews && review.extendedProcedureReviews.length > 0) {
6789
- review.extendedProcedureReviews.forEach((extReview) => {
6790
- extReview.isVerified = true;
6791
- });
6792
- }
6793
6753
  batch.update(reviewRef, {
6794
6754
  clinicReview: review.clinicReview,
6795
6755
  practitionerReview: review.practitionerReview,
6796
6756
  procedureReview: review.procedureReview,
6797
- extendedProcedureReviews: review.extendedProcedureReviews,
6798
6757
  updatedAt: admin13.firestore.FieldValue.serverTimestamp()
6799
6758
  });
6800
6759
  await batch.commit();
@@ -6313,16 +6313,6 @@ 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
- }
6326
6316
  await Promise.all(updatePromises);
6327
6317
  console.log(
6328
6318
  `[ReviewsAggregationService] Successfully processed review: ${review.id}`
@@ -6365,20 +6355,6 @@ var ReviewsAggregationService = class {
6365
6355
  )
6366
6356
  );
6367
6357
  }
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
- }
6382
6358
  await Promise.all(updatePromises);
6383
6359
  console.log(
6384
6360
  `[ReviewsAggregationService] Successfully processed deleted review: ${review.id}`
@@ -6596,21 +6572,8 @@ var ReviewsAggregationService = class {
6596
6572
  valueForMoney: 0,
6597
6573
  recommendationPercentage: 0
6598
6574
  };
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) {
6575
+ const reviewsQuery = await this.db.collection(REVIEWS_COLLECTION).where("procedureReview.procedureId", "==", procedureId).get();
6576
+ if (isRemoval && reviewsQuery.size <= 1 || reviewsQuery.empty) {
6614
6577
  const updatedReviewInfo2 = {
6615
6578
  totalReviews: 0,
6616
6579
  averageRating: 0,
@@ -6630,6 +6593,8 @@ var ReviewsAggregationService = class {
6630
6593
  );
6631
6594
  return updatedReviewInfo2;
6632
6595
  }
6596
+ const reviews = reviewsQuery.docs.map((doc) => doc.data());
6597
+ const procedureReviews = reviews.map((review) => review.procedureReview).filter((review) => review !== void 0);
6633
6598
  let totalRating = 0;
6634
6599
  let totalEffectivenessOfTreatment = 0;
6635
6600
  let totalOutcomeExplanation = 0;
@@ -6723,16 +6688,10 @@ var ReviewsAggregationService = class {
6723
6688
  if (review.procedureReview) {
6724
6689
  review.procedureReview.isVerified = true;
6725
6690
  }
6726
- if (review.extendedProcedureReviews && review.extendedProcedureReviews.length > 0) {
6727
- review.extendedProcedureReviews.forEach((extReview) => {
6728
- extReview.isVerified = true;
6729
- });
6730
- }
6731
6691
  batch.update(reviewRef, {
6732
6692
  clinicReview: review.clinicReview,
6733
6693
  practitionerReview: review.practitionerReview,
6734
6694
  procedureReview: review.procedureReview,
6735
- extendedProcedureReviews: review.extendedProcedureReviews,
6736
6695
  updatedAt: admin13.firestore.FieldValue.serverTimestamp()
6737
6696
  });
6738
6697
  await batch.commit();
@@ -1005,6 +1005,8 @@ interface Technology {
1005
1005
  benefits: TreatmentBenefitDynamic[];
1006
1006
  certificationRequirement: CertificationRequirement;
1007
1007
  documentationTemplates?: TechnologyDocumentationTemplate[];
1008
+ /** Media ID of the default photo template image for this technology */
1009
+ photoTemplate?: string;
1008
1010
  isActive: boolean;
1009
1011
  createdAt: Date;
1010
1012
  updatedAt: Date;
@@ -1168,10 +1170,86 @@ interface ProcedureProduct {
1168
1170
  isDefault?: boolean;
1169
1171
  }
1170
1172
 
1173
+ /**
1174
+ * Enum for media access levels
1175
+ */
1176
+ declare enum MediaAccessLevel {
1177
+ PUBLIC = "public",
1178
+ PRIVATE = "private",
1179
+ CONFIDENTIAL = "confidential"
1180
+ }
1171
1181
  /**
1172
1182
  * Type that allows a field to be either a URL string or a File object
1173
1183
  */
1174
1184
  type MediaResource = string | File | Blob;
1185
+ /**
1186
+ * Media file metadata interface
1187
+ */
1188
+ interface MediaMetadata {
1189
+ id: string;
1190
+ name: string;
1191
+ url: string;
1192
+ contentType: string;
1193
+ size: number;
1194
+ createdAt: Timestamp;
1195
+ accessLevel: MediaAccessLevel;
1196
+ ownerId: string;
1197
+ collectionName: string;
1198
+ path: string;
1199
+ updatedAt?: Timestamp;
1200
+ }
1201
+ declare class MediaService extends BaseService {
1202
+ constructor(...args: ConstructorParameters<typeof BaseService>);
1203
+ /**
1204
+ * Upload a media file, store its metadata, and return the metadata including the URL.
1205
+ * @param file - The file to upload.
1206
+ * @param ownerId - ID of the owner (user, patient, clinic, etc.).
1207
+ * @param accessLevel - Access level (public, private, confidential).
1208
+ * @param collectionName - The logical collection name this media belongs to (e.g., 'patient_profile_pictures', 'clinic_logos').
1209
+ * @param originalFileName - Optional: the original name of the file, if not using file.name.
1210
+ * @returns Promise with the media metadata.
1211
+ */
1212
+ uploadMedia(file: File | Blob, ownerId: string, accessLevel: MediaAccessLevel, collectionName: string, originalFileName?: string): Promise<MediaMetadata>;
1213
+ /**
1214
+ * Get media metadata from Firestore by its ID.
1215
+ * @param mediaId - ID of the media.
1216
+ * @returns Promise with the media metadata or null if not found.
1217
+ */
1218
+ getMediaMetadata(mediaId: string): Promise<MediaMetadata | null>;
1219
+ /**
1220
+ * Get media metadata from Firestore by its public URL.
1221
+ * @param url - The public URL of the media file.
1222
+ * @returns Promise with the media metadata or null if not found.
1223
+ */
1224
+ getMediaMetadataByUrl(url: string): Promise<MediaMetadata | null>;
1225
+ /**
1226
+ * Delete media from storage and remove metadata from Firestore.
1227
+ * @param mediaId - ID of the media to delete.
1228
+ */
1229
+ deleteMedia(mediaId: string): Promise<void>;
1230
+ /**
1231
+ * Update media access level. This involves moving the file in Firebase Storage
1232
+ * to a new path reflecting the new access level, and updating its metadata.
1233
+ * @param mediaId - ID of the media to update.
1234
+ * @param newAccessLevel - New access level.
1235
+ * @returns Promise with the updated media metadata, or null if metadata not found.
1236
+ */
1237
+ updateMediaAccessLevel(mediaId: string, newAccessLevel: MediaAccessLevel): Promise<MediaMetadata | null>;
1238
+ /**
1239
+ * List all media for an owner, optionally filtered by collection and access level.
1240
+ * @param ownerId - ID of the owner.
1241
+ * @param collectionName - Optional: Filter by collection name.
1242
+ * @param accessLevel - Optional: Filter by access level.
1243
+ * @param count - Optional: Number of items to fetch.
1244
+ * @param startAfterId - Optional: ID of the document to start after (for pagination).
1245
+ */
1246
+ listMedia(ownerId: string, collectionName?: string, accessLevel?: MediaAccessLevel, count?: number, startAfterId?: string): Promise<MediaMetadata[]>;
1247
+ /**
1248
+ * Get download URL for media. (Convenience, as URL is in metadata)
1249
+ * @param mediaId - ID of the media.
1250
+ */
1251
+ getMediaDownloadUrl(mediaId: string): Promise<string | null>;
1252
+ }
1175
1253
 
1176
1254
  /**
1177
1255
  * Aggregated summary information for a procedure.
@@ -1944,6 +2022,7 @@ declare class TechnologyService extends BaseService implements ITechnologyServic
1944
2022
  benefits: TreatmentBenefitDynamic[];
1945
2023
  certificationRequirement: CertificationRequirement;
1946
2024
  documentationTemplates?: TechnologyDocumentationTemplate[] | undefined;
2025
+ photoTemplate?: string | undefined;
1947
2026
  id: string;
1948
2027
  }>;
1949
2028
  /**
@@ -5077,6 +5156,7 @@ declare const technologySchema: z.ZodObject<{
5077
5156
  minimumLevel: CertificationLevel;
5078
5157
  requiredSpecialties?: CertificationSpecialty[] | undefined;
5079
5158
  }>;
5159
+ photoTemplate: z.ZodOptional<z.ZodString>;
5080
5160
  isActive: z.ZodDefault<z.ZodBoolean>;
5081
5161
  }, "strip", z.ZodTypeAny, {
5082
5162
  name: string;
@@ -5224,6 +5304,7 @@ declare const technologySchema: z.ZodObject<{
5224
5304
  }[];
5225
5305
  description?: string | undefined;
5226
5306
  technicalDetails?: string | undefined;
5307
+ photoTemplate?: string | undefined;
5227
5308
  }, {
5228
5309
  name: string;
5229
5310
  family: ProcedureFamily;
@@ -5370,6 +5451,7 @@ declare const technologySchema: z.ZodObject<{
5370
5451
  isActive?: boolean | undefined;
5371
5452
  }[];
5372
5453
  } | undefined;
5454
+ photoTemplate?: string | undefined;
5373
5455
  }>;
5374
5456
  /**
5375
5457
  * Category validation schema
@@ -6090,6 +6172,7 @@ declare const technologyUpdateSchema: z.ZodObject<{
6090
6172
  minimumLevel: CertificationLevel;
6091
6173
  requiredSpecialties?: CertificationSpecialty[] | undefined;
6092
6174
  }>>;
6175
+ photoTemplate: z.ZodOptional<z.ZodOptional<z.ZodString>>;
6093
6176
  isActive: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
6094
6177
  }, "strip", z.ZodTypeAny, {
6095
6178
  name?: string | undefined;
@@ -6237,6 +6320,7 @@ declare const technologyUpdateSchema: z.ZodObject<{
6237
6320
  description?: string | undefined;
6238
6321
  tags?: string[] | undefined;
6239
6322
  }[] | undefined;
6323
+ photoTemplate?: string | undefined;
6240
6324
  }, {
6241
6325
  name?: string | undefined;
6242
6326
  isActive?: boolean | undefined;
@@ -6383,6 +6467,7 @@ declare const technologyUpdateSchema: z.ZodObject<{
6383
6467
  isRequired?: boolean | undefined;
6384
6468
  sortingOrder?: number | undefined;
6385
6469
  }[] | undefined;
6470
+ photoTemplate?: string | undefined;
6386
6471
  }>;
6387
6472
  declare const requirementUpdateSchema: z.ZodObject<{
6388
6473
  name: z.ZodOptional<z.ZodString>;
@@ -6521,4 +6606,4 @@ declare class InvalidTreatmentBenefitError extends TreatmentBenefitError {
6521
6606
  constructor(benefit: string);
6522
6607
  }
6523
6608
 
6524
- export { BRANDS_COLLECTION, BackofficeError, BlockingCondition, BlockingConditionError, type Brand, BrandService, CATEGORIES_COLLECTION, type Category, CategoryError, CategoryNotFoundError, CategoryService, CertificationLevel, type CertificationRequirement, CertificationSpecialty, CircularReferenceError, ConstantsService, Contraindication, type ContraindicationDynamic, ContraindicationError, type ContraindicationsDocument, type CreateDocumentTemplateData, Currency, DEFAULT_CERTIFICATION_REQUIREMENT, DOCUMENTATION_TEMPLATES_COLLECTION, type DocumentElement, DocumentElementType, type DocumentTemplate, DocumentationTemplateServiceBackoffice, DynamicVariable, FILLED_DOCUMENTS_COLLECTION, HeadingLevel, type ICategoryService, type IProductService, type ITechnologyService, InvalidBlockingConditionError, InvalidCategoryDataError, InvalidContraindicationError, InvalidHierarchyError, InvalidRequirementDataError, InvalidSubcategoryDataError, InvalidTechnologyDataError, InvalidTimeframeError, InvalidTreatmentBenefitError, ListType, PRODUCTS_COLLECTION, PricingMeasure, ProcedureFamily, type ProcedureProduct, type Product, ProductService, REQUIREMENTS_COLLECTION, RelationshipError, type Requirement, RequirementError, type RequirementImportance, RequirementNotFoundError, RequirementService, RequirementType, SUBCATEGORIES_COLLECTION, type Subcategory, SubcategoryError, SubcategoryNotFoundError, SubcategoryService, TECHNOLOGIES_COLLECTION, type Technology, type TechnologyDocumentationTemplate, TechnologyError, TechnologyNotFoundError, type TechnologyRequirements, TechnologyService, type TimeFrame, TimeUnit, TreatmentBenefit, type TreatmentBenefitDynamic, TreatmentBenefitError, type TreatmentBenefitsDocument, type UpdateDocumentTemplateData, blockingConditionSchemaBackoffice, categorySchema, categoryUpdateSchema, certificationLevelSchema, certificationRequirementSchema, certificationSpecialtySchema, contraindicationDynamicSchema, contraindicationSchemaBackoffice, createDocumentTemplateSchema, documentElementSchema, documentElementWithoutIdSchema, documentTemplateSchema, procedureFamilySchemaBackoffice, requirementSchema, requirementTypeSchema, requirementUpdateSchema, subcategorySchema, subcategoryUpdateSchema, technologyRequirementsSchema, technologySchema, technologyUpdateSchema, timeUnitSchemaBackoffice, timeframeSchema, treatmentBenefitDynamicSchema, treatmentBenefitSchemaBackoffice, updateDocumentTemplateSchema };
6609
+ export { BRANDS_COLLECTION, BackofficeError, BlockingCondition, BlockingConditionError, type Brand, BrandService, CATEGORIES_COLLECTION, type Category, CategoryError, CategoryNotFoundError, CategoryService, CertificationLevel, type CertificationRequirement, CertificationSpecialty, CircularReferenceError, ConstantsService, Contraindication, type ContraindicationDynamic, ContraindicationError, type ContraindicationsDocument, type CreateDocumentTemplateData, Currency, DEFAULT_CERTIFICATION_REQUIREMENT, DOCUMENTATION_TEMPLATES_COLLECTION, type DocumentElement, DocumentElementType, type DocumentTemplate, DocumentationTemplateServiceBackoffice, DynamicVariable, FILLED_DOCUMENTS_COLLECTION, HeadingLevel, type ICategoryService, type IProductService, type ITechnologyService, InvalidBlockingConditionError, InvalidCategoryDataError, InvalidContraindicationError, InvalidHierarchyError, InvalidRequirementDataError, InvalidSubcategoryDataError, InvalidTechnologyDataError, InvalidTimeframeError, InvalidTreatmentBenefitError, ListType, MediaAccessLevel, type MediaMetadata, type MediaResource, MediaService, PRODUCTS_COLLECTION, PricingMeasure, ProcedureFamily, type ProcedureProduct, type Product, ProductService, REQUIREMENTS_COLLECTION, RelationshipError, type Requirement, RequirementError, type RequirementImportance, RequirementNotFoundError, RequirementService, RequirementType, SUBCATEGORIES_COLLECTION, type Subcategory, SubcategoryError, SubcategoryNotFoundError, SubcategoryService, TECHNOLOGIES_COLLECTION, type Technology, type TechnologyDocumentationTemplate, TechnologyError, TechnologyNotFoundError, type TechnologyRequirements, TechnologyService, type TimeFrame, TimeUnit, TreatmentBenefit, type TreatmentBenefitDynamic, TreatmentBenefitError, type TreatmentBenefitsDocument, type UpdateDocumentTemplateData, blockingConditionSchemaBackoffice, categorySchema, categoryUpdateSchema, certificationLevelSchema, certificationRequirementSchema, certificationSpecialtySchema, contraindicationDynamicSchema, contraindicationSchemaBackoffice, createDocumentTemplateSchema, documentElementSchema, documentElementWithoutIdSchema, documentTemplateSchema, procedureFamilySchemaBackoffice, requirementSchema, requirementTypeSchema, requirementUpdateSchema, subcategorySchema, subcategoryUpdateSchema, technologyRequirementsSchema, technologySchema, technologyUpdateSchema, timeUnitSchemaBackoffice, timeframeSchema, treatmentBenefitDynamicSchema, treatmentBenefitSchemaBackoffice, updateDocumentTemplateSchema };
@@ -1005,6 +1005,8 @@ interface Technology {
1005
1005
  benefits: TreatmentBenefitDynamic[];
1006
1006
  certificationRequirement: CertificationRequirement;
1007
1007
  documentationTemplates?: TechnologyDocumentationTemplate[];
1008
+ /** Media ID of the default photo template image for this technology */
1009
+ photoTemplate?: string;
1008
1010
  isActive: boolean;
1009
1011
  createdAt: Date;
1010
1012
  updatedAt: Date;
@@ -1168,10 +1170,86 @@ interface ProcedureProduct {
1168
1170
  isDefault?: boolean;
1169
1171
  }
1170
1172
 
1173
+ /**
1174
+ * Enum for media access levels
1175
+ */
1176
+ declare enum MediaAccessLevel {
1177
+ PUBLIC = "public",
1178
+ PRIVATE = "private",
1179
+ CONFIDENTIAL = "confidential"
1180
+ }
1171
1181
  /**
1172
1182
  * Type that allows a field to be either a URL string or a File object
1173
1183
  */
1174
1184
  type MediaResource = string | File | Blob;
1185
+ /**
1186
+ * Media file metadata interface
1187
+ */
1188
+ interface MediaMetadata {
1189
+ id: string;
1190
+ name: string;
1191
+ url: string;
1192
+ contentType: string;
1193
+ size: number;
1194
+ createdAt: Timestamp;
1195
+ accessLevel: MediaAccessLevel;
1196
+ ownerId: string;
1197
+ collectionName: string;
1198
+ path: string;
1199
+ updatedAt?: Timestamp;
1200
+ }
1201
+ declare class MediaService extends BaseService {
1202
+ constructor(...args: ConstructorParameters<typeof BaseService>);
1203
+ /**
1204
+ * Upload a media file, store its metadata, and return the metadata including the URL.
1205
+ * @param file - The file to upload.
1206
+ * @param ownerId - ID of the owner (user, patient, clinic, etc.).
1207
+ * @param accessLevel - Access level (public, private, confidential).
1208
+ * @param collectionName - The logical collection name this media belongs to (e.g., 'patient_profile_pictures', 'clinic_logos').
1209
+ * @param originalFileName - Optional: the original name of the file, if not using file.name.
1210
+ * @returns Promise with the media metadata.
1211
+ */
1212
+ uploadMedia(file: File | Blob, ownerId: string, accessLevel: MediaAccessLevel, collectionName: string, originalFileName?: string): Promise<MediaMetadata>;
1213
+ /**
1214
+ * Get media metadata from Firestore by its ID.
1215
+ * @param mediaId - ID of the media.
1216
+ * @returns Promise with the media metadata or null if not found.
1217
+ */
1218
+ getMediaMetadata(mediaId: string): Promise<MediaMetadata | null>;
1219
+ /**
1220
+ * Get media metadata from Firestore by its public URL.
1221
+ * @param url - The public URL of the media file.
1222
+ * @returns Promise with the media metadata or null if not found.
1223
+ */
1224
+ getMediaMetadataByUrl(url: string): Promise<MediaMetadata | null>;
1225
+ /**
1226
+ * Delete media from storage and remove metadata from Firestore.
1227
+ * @param mediaId - ID of the media to delete.
1228
+ */
1229
+ deleteMedia(mediaId: string): Promise<void>;
1230
+ /**
1231
+ * Update media access level. This involves moving the file in Firebase Storage
1232
+ * to a new path reflecting the new access level, and updating its metadata.
1233
+ * @param mediaId - ID of the media to update.
1234
+ * @param newAccessLevel - New access level.
1235
+ * @returns Promise with the updated media metadata, or null if metadata not found.
1236
+ */
1237
+ updateMediaAccessLevel(mediaId: string, newAccessLevel: MediaAccessLevel): Promise<MediaMetadata | null>;
1238
+ /**
1239
+ * List all media for an owner, optionally filtered by collection and access level.
1240
+ * @param ownerId - ID of the owner.
1241
+ * @param collectionName - Optional: Filter by collection name.
1242
+ * @param accessLevel - Optional: Filter by access level.
1243
+ * @param count - Optional: Number of items to fetch.
1244
+ * @param startAfterId - Optional: ID of the document to start after (for pagination).
1245
+ */
1246
+ listMedia(ownerId: string, collectionName?: string, accessLevel?: MediaAccessLevel, count?: number, startAfterId?: string): Promise<MediaMetadata[]>;
1247
+ /**
1248
+ * Get download URL for media. (Convenience, as URL is in metadata)
1249
+ * @param mediaId - ID of the media.
1250
+ */
1251
+ getMediaDownloadUrl(mediaId: string): Promise<string | null>;
1252
+ }
1175
1253
 
1176
1254
  /**
1177
1255
  * Aggregated summary information for a procedure.
@@ -1944,6 +2022,7 @@ declare class TechnologyService extends BaseService implements ITechnologyServic
1944
2022
  benefits: TreatmentBenefitDynamic[];
1945
2023
  certificationRequirement: CertificationRequirement;
1946
2024
  documentationTemplates?: TechnologyDocumentationTemplate[] | undefined;
2025
+ photoTemplate?: string | undefined;
1947
2026
  id: string;
1948
2027
  }>;
1949
2028
  /**
@@ -5077,6 +5156,7 @@ declare const technologySchema: z.ZodObject<{
5077
5156
  minimumLevel: CertificationLevel;
5078
5157
  requiredSpecialties?: CertificationSpecialty[] | undefined;
5079
5158
  }>;
5159
+ photoTemplate: z.ZodOptional<z.ZodString>;
5080
5160
  isActive: z.ZodDefault<z.ZodBoolean>;
5081
5161
  }, "strip", z.ZodTypeAny, {
5082
5162
  name: string;
@@ -5224,6 +5304,7 @@ declare const technologySchema: z.ZodObject<{
5224
5304
  }[];
5225
5305
  description?: string | undefined;
5226
5306
  technicalDetails?: string | undefined;
5307
+ photoTemplate?: string | undefined;
5227
5308
  }, {
5228
5309
  name: string;
5229
5310
  family: ProcedureFamily;
@@ -5370,6 +5451,7 @@ declare const technologySchema: z.ZodObject<{
5370
5451
  isActive?: boolean | undefined;
5371
5452
  }[];
5372
5453
  } | undefined;
5454
+ photoTemplate?: string | undefined;
5373
5455
  }>;
5374
5456
  /**
5375
5457
  * Category validation schema
@@ -6090,6 +6172,7 @@ declare const technologyUpdateSchema: z.ZodObject<{
6090
6172
  minimumLevel: CertificationLevel;
6091
6173
  requiredSpecialties?: CertificationSpecialty[] | undefined;
6092
6174
  }>>;
6175
+ photoTemplate: z.ZodOptional<z.ZodOptional<z.ZodString>>;
6093
6176
  isActive: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
6094
6177
  }, "strip", z.ZodTypeAny, {
6095
6178
  name?: string | undefined;
@@ -6237,6 +6320,7 @@ declare const technologyUpdateSchema: z.ZodObject<{
6237
6320
  description?: string | undefined;
6238
6321
  tags?: string[] | undefined;
6239
6322
  }[] | undefined;
6323
+ photoTemplate?: string | undefined;
6240
6324
  }, {
6241
6325
  name?: string | undefined;
6242
6326
  isActive?: boolean | undefined;
@@ -6383,6 +6467,7 @@ declare const technologyUpdateSchema: z.ZodObject<{
6383
6467
  isRequired?: boolean | undefined;
6384
6468
  sortingOrder?: number | undefined;
6385
6469
  }[] | undefined;
6470
+ photoTemplate?: string | undefined;
6386
6471
  }>;
6387
6472
  declare const requirementUpdateSchema: z.ZodObject<{
6388
6473
  name: z.ZodOptional<z.ZodString>;
@@ -6521,4 +6606,4 @@ declare class InvalidTreatmentBenefitError extends TreatmentBenefitError {
6521
6606
  constructor(benefit: string);
6522
6607
  }
6523
6608
 
6524
- export { BRANDS_COLLECTION, BackofficeError, BlockingCondition, BlockingConditionError, type Brand, BrandService, CATEGORIES_COLLECTION, type Category, CategoryError, CategoryNotFoundError, CategoryService, CertificationLevel, type CertificationRequirement, CertificationSpecialty, CircularReferenceError, ConstantsService, Contraindication, type ContraindicationDynamic, ContraindicationError, type ContraindicationsDocument, type CreateDocumentTemplateData, Currency, DEFAULT_CERTIFICATION_REQUIREMENT, DOCUMENTATION_TEMPLATES_COLLECTION, type DocumentElement, DocumentElementType, type DocumentTemplate, DocumentationTemplateServiceBackoffice, DynamicVariable, FILLED_DOCUMENTS_COLLECTION, HeadingLevel, type ICategoryService, type IProductService, type ITechnologyService, InvalidBlockingConditionError, InvalidCategoryDataError, InvalidContraindicationError, InvalidHierarchyError, InvalidRequirementDataError, InvalidSubcategoryDataError, InvalidTechnologyDataError, InvalidTimeframeError, InvalidTreatmentBenefitError, ListType, PRODUCTS_COLLECTION, PricingMeasure, ProcedureFamily, type ProcedureProduct, type Product, ProductService, REQUIREMENTS_COLLECTION, RelationshipError, type Requirement, RequirementError, type RequirementImportance, RequirementNotFoundError, RequirementService, RequirementType, SUBCATEGORIES_COLLECTION, type Subcategory, SubcategoryError, SubcategoryNotFoundError, SubcategoryService, TECHNOLOGIES_COLLECTION, type Technology, type TechnologyDocumentationTemplate, TechnologyError, TechnologyNotFoundError, type TechnologyRequirements, TechnologyService, type TimeFrame, TimeUnit, TreatmentBenefit, type TreatmentBenefitDynamic, TreatmentBenefitError, type TreatmentBenefitsDocument, type UpdateDocumentTemplateData, blockingConditionSchemaBackoffice, categorySchema, categoryUpdateSchema, certificationLevelSchema, certificationRequirementSchema, certificationSpecialtySchema, contraindicationDynamicSchema, contraindicationSchemaBackoffice, createDocumentTemplateSchema, documentElementSchema, documentElementWithoutIdSchema, documentTemplateSchema, procedureFamilySchemaBackoffice, requirementSchema, requirementTypeSchema, requirementUpdateSchema, subcategorySchema, subcategoryUpdateSchema, technologyRequirementsSchema, technologySchema, technologyUpdateSchema, timeUnitSchemaBackoffice, timeframeSchema, treatmentBenefitDynamicSchema, treatmentBenefitSchemaBackoffice, updateDocumentTemplateSchema };
6609
+ export { BRANDS_COLLECTION, BackofficeError, BlockingCondition, BlockingConditionError, type Brand, BrandService, CATEGORIES_COLLECTION, type Category, CategoryError, CategoryNotFoundError, CategoryService, CertificationLevel, type CertificationRequirement, CertificationSpecialty, CircularReferenceError, ConstantsService, Contraindication, type ContraindicationDynamic, ContraindicationError, type ContraindicationsDocument, type CreateDocumentTemplateData, Currency, DEFAULT_CERTIFICATION_REQUIREMENT, DOCUMENTATION_TEMPLATES_COLLECTION, type DocumentElement, DocumentElementType, type DocumentTemplate, DocumentationTemplateServiceBackoffice, DynamicVariable, FILLED_DOCUMENTS_COLLECTION, HeadingLevel, type ICategoryService, type IProductService, type ITechnologyService, InvalidBlockingConditionError, InvalidCategoryDataError, InvalidContraindicationError, InvalidHierarchyError, InvalidRequirementDataError, InvalidSubcategoryDataError, InvalidTechnologyDataError, InvalidTimeframeError, InvalidTreatmentBenefitError, ListType, MediaAccessLevel, type MediaMetadata, type MediaResource, MediaService, PRODUCTS_COLLECTION, PricingMeasure, ProcedureFamily, type ProcedureProduct, type Product, ProductService, REQUIREMENTS_COLLECTION, RelationshipError, type Requirement, RequirementError, type RequirementImportance, RequirementNotFoundError, RequirementService, RequirementType, SUBCATEGORIES_COLLECTION, type Subcategory, SubcategoryError, SubcategoryNotFoundError, SubcategoryService, TECHNOLOGIES_COLLECTION, type Technology, type TechnologyDocumentationTemplate, TechnologyError, TechnologyNotFoundError, type TechnologyRequirements, TechnologyService, type TimeFrame, TimeUnit, TreatmentBenefit, type TreatmentBenefitDynamic, TreatmentBenefitError, type TreatmentBenefitsDocument, type UpdateDocumentTemplateData, blockingConditionSchemaBackoffice, categorySchema, categoryUpdateSchema, certificationLevelSchema, certificationRequirementSchema, certificationSpecialtySchema, contraindicationDynamicSchema, contraindicationSchemaBackoffice, createDocumentTemplateSchema, documentElementSchema, documentElementWithoutIdSchema, documentTemplateSchema, procedureFamilySchemaBackoffice, requirementSchema, requirementTypeSchema, requirementUpdateSchema, subcategorySchema, subcategoryUpdateSchema, technologyRequirementsSchema, technologySchema, technologyUpdateSchema, timeUnitSchemaBackoffice, timeframeSchema, treatmentBenefitDynamicSchema, treatmentBenefitSchemaBackoffice, updateDocumentTemplateSchema };