@blackcode_sa/metaestetics-api 1.13.5 → 1.13.8

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 (295) hide show
  1. package/dist/admin/index.d.mts +20 -1
  2. package/dist/admin/index.d.ts +20 -1
  3. package/dist/admin/index.js +217 -1
  4. package/dist/admin/index.mjs +217 -1
  5. package/dist/index.d.mts +26 -3
  6. package/dist/index.d.ts +26 -3
  7. package/dist/index.js +168 -6
  8. package/dist/index.mjs +168 -6
  9. package/package.json +121 -121
  10. package/src/__mocks__/firstore.ts +10 -10
  11. package/src/admin/aggregation/README.md +79 -79
  12. package/src/admin/aggregation/appointment/README.md +128 -128
  13. package/src/admin/aggregation/appointment/appointment.aggregation.service.ts +1984 -1984
  14. package/src/admin/aggregation/appointment/index.ts +1 -1
  15. package/src/admin/aggregation/clinic/README.md +52 -52
  16. package/src/admin/aggregation/clinic/clinic.aggregation.service.ts +966 -703
  17. package/src/admin/aggregation/clinic/index.ts +1 -1
  18. package/src/admin/aggregation/forms/README.md +13 -13
  19. package/src/admin/aggregation/forms/filled-forms.aggregation.service.ts +322 -322
  20. package/src/admin/aggregation/forms/index.ts +1 -1
  21. package/src/admin/aggregation/index.ts +8 -8
  22. package/src/admin/aggregation/patient/README.md +27 -27
  23. package/src/admin/aggregation/patient/index.ts +1 -1
  24. package/src/admin/aggregation/patient/patient.aggregation.service.ts +141 -141
  25. package/src/admin/aggregation/practitioner/README.md +42 -42
  26. package/src/admin/aggregation/practitioner/index.ts +1 -1
  27. package/src/admin/aggregation/practitioner/practitioner.aggregation.service.ts +433 -433
  28. package/src/admin/aggregation/practitioner-invite/index.ts +1 -1
  29. package/src/admin/aggregation/practitioner-invite/practitioner-invite.aggregation.service.ts +961 -961
  30. package/src/admin/aggregation/procedure/README.md +43 -43
  31. package/src/admin/aggregation/procedure/index.ts +1 -1
  32. package/src/admin/aggregation/procedure/procedure.aggregation.service.ts +702 -702
  33. package/src/admin/aggregation/reviews/index.ts +1 -1
  34. package/src/admin/aggregation/reviews/reviews.aggregation.service.ts +689 -689
  35. package/src/admin/analytics/analytics.admin.service.ts +278 -278
  36. package/src/admin/analytics/index.ts +2 -2
  37. package/src/admin/booking/README.md +125 -125
  38. package/src/admin/booking/booking.admin.ts +1037 -1037
  39. package/src/admin/booking/booking.calculator.ts +712 -712
  40. package/src/admin/booking/booking.types.ts +59 -59
  41. package/src/admin/booking/index.ts +3 -3
  42. package/src/admin/booking/timezones-problem.md +185 -185
  43. package/src/admin/calendar/README.md +7 -7
  44. package/src/admin/calendar/calendar.admin.service.ts +345 -345
  45. package/src/admin/calendar/index.ts +1 -1
  46. package/src/admin/documentation-templates/document-manager.admin.ts +260 -260
  47. package/src/admin/documentation-templates/index.ts +1 -1
  48. package/src/admin/free-consultation/free-consultation-utils.admin.ts +148 -148
  49. package/src/admin/free-consultation/index.ts +1 -1
  50. package/src/admin/index.ts +81 -81
  51. package/src/admin/logger/index.ts +78 -78
  52. package/src/admin/mailing/README.md +95 -95
  53. package/src/admin/mailing/appointment/appointment.mailing.service.ts +732 -732
  54. package/src/admin/mailing/appointment/index.ts +1 -1
  55. package/src/admin/mailing/appointment/templates/patient/appointment-confirmed.html +40 -40
  56. package/src/admin/mailing/base.mailing.service.ts +208 -208
  57. package/src/admin/mailing/index.ts +3 -3
  58. package/src/admin/mailing/practitionerInvite/existing-practitioner-invite.mailing.ts +611 -611
  59. package/src/admin/mailing/practitionerInvite/index.ts +2 -2
  60. package/src/admin/mailing/practitionerInvite/practitionerInvite.mailing.ts +395 -395
  61. package/src/admin/mailing/practitionerInvite/templates/existing-practitioner-invitation.template.ts +155 -155
  62. package/src/admin/mailing/practitionerInvite/templates/invitation.template.ts +101 -101
  63. package/src/admin/mailing/practitionerInvite/templates/invite-accepted-notification.template.ts +228 -228
  64. package/src/admin/mailing/practitionerInvite/templates/invite-rejected-notification.template.ts +242 -242
  65. package/src/admin/notifications/index.ts +1 -1
  66. package/src/admin/notifications/notifications.admin.ts +710 -710
  67. package/src/admin/requirements/README.md +128 -128
  68. package/src/admin/requirements/index.ts +1 -1
  69. package/src/admin/requirements/patient-requirements.admin.service.ts +475 -475
  70. package/src/admin/users/index.ts +1 -1
  71. package/src/admin/users/user-profile.admin.ts +405 -405
  72. package/src/backoffice/constants/certification.constants.ts +13 -13
  73. package/src/backoffice/constants/index.ts +1 -1
  74. package/src/backoffice/errors/backoffice.errors.ts +181 -181
  75. package/src/backoffice/errors/index.ts +1 -1
  76. package/src/backoffice/expo-safe/README.md +26 -26
  77. package/src/backoffice/expo-safe/index.ts +41 -41
  78. package/src/backoffice/index.ts +5 -5
  79. package/src/backoffice/services/FIXES_README.md +102 -102
  80. package/src/backoffice/services/README.md +57 -57
  81. package/src/backoffice/services/analytics.service.proposal.md +863 -863
  82. package/src/backoffice/services/analytics.service.summary.md +143 -143
  83. package/src/backoffice/services/brand.service.ts +256 -256
  84. package/src/backoffice/services/category.service.ts +384 -384
  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 +461 -461
  92. package/src/backoffice/services/technology.service.ts +1151 -1151
  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 -67
  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 -168
  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 +211 -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/analytics/ARCHITECTURE.md +199 -199
  139. package/src/services/analytics/CLOUD_FUNCTIONS.md +225 -225
  140. package/src/services/analytics/GROUPED_ANALYTICS.md +501 -501
  141. package/src/services/analytics/QUICK_START.md +393 -393
  142. package/src/services/analytics/README.md +304 -304
  143. package/src/services/analytics/SUMMARY.md +141 -141
  144. package/src/services/analytics/TRENDS.md +380 -380
  145. package/src/services/analytics/USAGE_GUIDE.md +518 -518
  146. package/src/services/analytics/analytics-cloud.service.ts +222 -222
  147. package/src/services/analytics/analytics.service.ts +2142 -2142
  148. package/src/services/analytics/index.ts +4 -4
  149. package/src/services/analytics/review-analytics.service.ts +941 -941
  150. package/src/services/analytics/utils/appointment-filtering.utils.ts +138 -138
  151. package/src/services/analytics/utils/cost-calculation.utils.ts +182 -182
  152. package/src/services/analytics/utils/grouping.utils.ts +434 -434
  153. package/src/services/analytics/utils/stored-analytics.utils.ts +347 -347
  154. package/src/services/analytics/utils/time-calculation.utils.ts +186 -186
  155. package/src/services/analytics/utils/trend-calculation.utils.ts +200 -200
  156. package/src/services/appointment/README.md +17 -17
  157. package/src/services/appointment/appointment.service.ts +2558 -2558
  158. package/src/services/appointment/index.ts +1 -1
  159. package/src/services/appointment/utils/appointment.utils.ts +552 -552
  160. package/src/services/appointment/utils/extended-procedure.utils.ts +314 -314
  161. package/src/services/appointment/utils/form-initialization.utils.ts +225 -225
  162. package/src/services/appointment/utils/recommended-procedure.utils.ts +195 -195
  163. package/src/services/appointment/utils/zone-management.utils.ts +353 -353
  164. package/src/services/appointment/utils/zone-photo.utils.ts +152 -152
  165. package/src/services/auth/auth.service.ts +1043 -989
  166. package/src/services/auth/auth.v2.service.ts +961 -961
  167. package/src/services/auth/index.ts +7 -7
  168. package/src/services/auth/utils/error.utils.ts +90 -90
  169. package/src/services/auth/utils/firebase.utils.ts +49 -49
  170. package/src/services/auth/utils/index.ts +21 -21
  171. package/src/services/auth/utils/practitioner.utils.ts +125 -125
  172. package/src/services/base.service.ts +41 -41
  173. package/src/services/calendar/calendar.service.ts +1077 -1077
  174. package/src/services/calendar/calendar.v2.service.ts +1683 -1683
  175. package/src/services/calendar/calendar.v3.service.ts +313 -313
  176. package/src/services/calendar/externalCalendar.service.ts +178 -178
  177. package/src/services/calendar/index.ts +5 -5
  178. package/src/services/calendar/synced-calendars.service.ts +743 -743
  179. package/src/services/calendar/utils/appointment.utils.ts +265 -265
  180. package/src/services/calendar/utils/calendar-event.utils.ts +646 -646
  181. package/src/services/calendar/utils/clinic.utils.ts +237 -237
  182. package/src/services/calendar/utils/docs.utils.ts +157 -157
  183. package/src/services/calendar/utils/google-calendar.utils.ts +697 -697
  184. package/src/services/calendar/utils/index.ts +8 -8
  185. package/src/services/calendar/utils/patient.utils.ts +198 -198
  186. package/src/services/calendar/utils/practitioner.utils.ts +221 -221
  187. package/src/services/calendar/utils/synced-calendar.utils.ts +472 -472
  188. package/src/services/clinic/README.md +204 -204
  189. package/src/services/clinic/__tests__/clinic-admin.service.test.ts +287 -287
  190. package/src/services/clinic/__tests__/clinic-group.service.test.ts +352 -352
  191. package/src/services/clinic/__tests__/clinic.service.test.ts +354 -354
  192. package/src/services/clinic/billing-transactions.service.ts +217 -217
  193. package/src/services/clinic/clinic-admin.service.ts +202 -202
  194. package/src/services/clinic/clinic-group.service.ts +310 -310
  195. package/src/services/clinic/clinic.service.ts +708 -708
  196. package/src/services/clinic/index.ts +5 -5
  197. package/src/services/clinic/practitioner-invite.service.ts +519 -519
  198. package/src/services/clinic/utils/admin.utils.ts +551 -551
  199. package/src/services/clinic/utils/clinic-group.utils.ts +646 -646
  200. package/src/services/clinic/utils/clinic.utils.ts +949 -949
  201. package/src/services/clinic/utils/filter.utils.d.ts +23 -23
  202. package/src/services/clinic/utils/filter.utils.ts +446 -446
  203. package/src/services/clinic/utils/index.ts +11 -11
  204. package/src/services/clinic/utils/photos.utils.ts +188 -188
  205. package/src/services/clinic/utils/search.utils.ts +84 -84
  206. package/src/services/clinic/utils/tag.utils.ts +124 -124
  207. package/src/services/documentation-templates/documentation-template.service.ts +537 -537
  208. package/src/services/documentation-templates/filled-document.service.ts +587 -587
  209. package/src/services/documentation-templates/index.ts +2 -2
  210. package/src/services/index.ts +14 -14
  211. package/src/services/media/index.ts +1 -1
  212. package/src/services/media/media.service.ts +418 -418
  213. package/src/services/notifications/__tests__/notification.service.test.ts +242 -242
  214. package/src/services/notifications/index.ts +1 -1
  215. package/src/services/notifications/notification.service.ts +215 -215
  216. package/src/services/patient/README.md +48 -48
  217. package/src/services/patient/To-Do.md +43 -43
  218. package/src/services/patient/__tests__/patient.service.test.ts +294 -294
  219. package/src/services/patient/index.ts +2 -2
  220. package/src/services/patient/patient.service.ts +883 -883
  221. package/src/services/patient/patientRequirements.service.ts +285 -285
  222. package/src/services/patient/utils/aesthetic-analysis.utils.ts +176 -176
  223. package/src/services/patient/utils/clinic.utils.ts +80 -80
  224. package/src/services/patient/utils/docs.utils.ts +142 -142
  225. package/src/services/patient/utils/index.ts +9 -9
  226. package/src/services/patient/utils/location.utils.ts +126 -126
  227. package/src/services/patient/utils/medical-stuff.utils.ts +143 -143
  228. package/src/services/patient/utils/medical.utils.ts +458 -458
  229. package/src/services/patient/utils/practitioner.utils.ts +260 -260
  230. package/src/services/patient/utils/profile.utils.ts +510 -510
  231. package/src/services/patient/utils/sensitive.utils.ts +260 -260
  232. package/src/services/patient/utils/token.utils.ts +211 -211
  233. package/src/services/practitioner/README.md +145 -145
  234. package/src/services/practitioner/index.ts +1 -1
  235. package/src/services/practitioner/practitioner.service.ts +1799 -1742
  236. package/src/services/procedure/README.md +163 -163
  237. package/src/services/procedure/index.ts +1 -1
  238. package/src/services/procedure/procedure.service.ts +2307 -2200
  239. package/src/services/reviews/index.ts +1 -1
  240. package/src/services/reviews/reviews.service.ts +734 -734
  241. package/src/services/user/index.ts +1 -1
  242. package/src/services/user/user.service.ts +489 -489
  243. package/src/services/user/user.v2.service.ts +466 -466
  244. package/src/types/analytics/analytics.types.ts +597 -597
  245. package/src/types/analytics/grouped-analytics.types.ts +173 -173
  246. package/src/types/analytics/index.ts +4 -4
  247. package/src/types/analytics/stored-analytics.types.ts +137 -137
  248. package/src/types/appointment/index.ts +480 -480
  249. package/src/types/calendar/index.ts +258 -258
  250. package/src/types/calendar/synced-calendar.types.ts +66 -66
  251. package/src/types/clinic/index.ts +498 -498
  252. package/src/types/clinic/practitioner-invite.types.ts +91 -91
  253. package/src/types/clinic/preferences.types.ts +159 -159
  254. package/src/types/clinic/to-do +3 -3
  255. package/src/types/documentation-templates/index.ts +308 -308
  256. package/src/types/index.ts +47 -47
  257. package/src/types/notifications/README.md +77 -77
  258. package/src/types/notifications/index.ts +286 -286
  259. package/src/types/patient/aesthetic-analysis.types.ts +66 -66
  260. package/src/types/patient/allergies.ts +58 -58
  261. package/src/types/patient/index.ts +275 -275
  262. package/src/types/patient/medical-info.types.ts +152 -152
  263. package/src/types/patient/patient-requirements.ts +92 -92
  264. package/src/types/patient/token.types.ts +61 -61
  265. package/src/types/practitioner/index.ts +206 -206
  266. package/src/types/procedure/index.ts +181 -181
  267. package/src/types/profile/index.ts +39 -39
  268. package/src/types/reviews/index.ts +132 -132
  269. package/src/types/tz-lookup.d.ts +4 -4
  270. package/src/types/user/index.ts +38 -38
  271. package/src/utils/TIMESTAMPS.md +176 -176
  272. package/src/utils/TimestampUtils.ts +241 -241
  273. package/src/utils/index.ts +1 -1
  274. package/src/validations/appointment.schema.ts +574 -574
  275. package/src/validations/calendar.schema.ts +225 -225
  276. package/src/validations/clinic.schema.ts +494 -494
  277. package/src/validations/common.schema.ts +25 -25
  278. package/src/validations/documentation-templates/index.ts +1 -1
  279. package/src/validations/documentation-templates/template.schema.ts +220 -220
  280. package/src/validations/documentation-templates.schema.ts +10 -10
  281. package/src/validations/index.ts +20 -20
  282. package/src/validations/media.schema.ts +10 -10
  283. package/src/validations/notification.schema.ts +90 -90
  284. package/src/validations/patient/aesthetic-analysis.schema.ts +55 -55
  285. package/src/validations/patient/medical-info.schema.ts +125 -125
  286. package/src/validations/patient/patient-requirements.schema.ts +84 -84
  287. package/src/validations/patient/token.schema.ts +29 -29
  288. package/src/validations/patient.schema.ts +217 -217
  289. package/src/validations/practitioner.schema.ts +222 -222
  290. package/src/validations/procedure-product.schema.ts +41 -41
  291. package/src/validations/procedure.schema.ts +124 -124
  292. package/src/validations/profile-info.schema.ts +41 -41
  293. package/src/validations/reviews.schema.ts +195 -195
  294. package/src/validations/schemas.ts +104 -104
  295. package/src/validations/shared.schema.ts +78 -78
package/dist/index.d.ts CHANGED
@@ -6693,7 +6693,15 @@ declare class ProcedureService extends BaseService {
6693
6693
  private technologyService;
6694
6694
  private productService;
6695
6695
  private mediaService;
6696
+ private practitionerService?;
6696
6697
  constructor(db: Firestore, auth: Auth, app: FirebaseApp, categoryService: CategoryService, subcategoryService: SubcategoryService, technologyService: TechnologyService, productService: ProductService, mediaService: MediaService);
6698
+ setPractitionerService(practitionerService: PractitionerService): void;
6699
+ /**
6700
+ * Filters out procedures from draft practitioners
6701
+ * @param procedures - Array of procedures to filter
6702
+ * @returns Filtered array of procedures (excluding those from draft practitioners)
6703
+ */
6704
+ private filterDraftPractitionerProcedures;
6697
6705
  /**
6698
6706
  * Process media resource (string URL or File object)
6699
6707
  * @param media String URL or File object
@@ -6782,9 +6790,10 @@ declare class ProcedureService extends BaseService {
6782
6790
  * Gets all procedures for a practitioner
6783
6791
  * @param practitionerId - The ID of the practitioner
6784
6792
  * @param clinicBranchId - Optional clinic branch ID to filter by
6793
+ * @param excludeDraftPractitioners - Whether to exclude procedures if the practitioner is in DRAFT status
6785
6794
  * @returns List of procedures
6786
6795
  */
6787
- getProceduresByPractitioner(practitionerId: string, clinicBranchId?: string): Promise<Procedure[]>;
6796
+ getProceduresByPractitioner(practitionerId: string, clinicBranchId?: string, excludeDraftPractitioners?: boolean): Promise<Procedure[]>;
6788
6797
  /**
6789
6798
  * Gets all inactive procedures for a practitioner
6790
6799
  * @param practitionerId - The ID of the practitioner
@@ -6825,9 +6834,10 @@ declare class ProcedureService extends BaseService {
6825
6834
  *
6826
6835
  * @param pagination - Optional number of procedures per page (0 or undefined returns all)
6827
6836
  * @param lastDoc - Optional last document for pagination (if continuing from a previous page)
6837
+ * @param excludeDraftPractitioners - Whether to exclude procedures from draft practitioners (default: true)
6828
6838
  * @returns Object containing procedures array and the last document for pagination
6829
6839
  */
6830
- getAllProcedures(pagination?: number, lastDoc?: any): Promise<{
6840
+ getAllProcedures(pagination?: number, lastDoc?: any, excludeDraftPractitioners?: boolean): Promise<{
6831
6841
  procedures: Procedure[];
6832
6842
  lastDoc: any;
6833
6843
  }>;
@@ -6924,7 +6934,7 @@ declare class PractitionerService extends BaseService {
6924
6934
  private mediaService;
6925
6935
  private procedureService?;
6926
6936
  constructor(db: Firestore, auth: Auth, app: FirebaseApp, clinicService?: ClinicService, procedureService?: ProcedureService);
6927
- private getClinicService;
6937
+ getClinicService(): ClinicService;
6928
6938
  private getProcedureService;
6929
6939
  setClinicService(clinicService: ClinicService): void;
6930
6940
  setProcedureService(procedureService: ProcedureService): void;
@@ -6992,6 +7002,19 @@ declare class PractitionerService extends BaseService {
6992
7002
  * Dohvata zdravstvenog radnika po User ID-u
6993
7003
  */
6994
7004
  getPractitionerByUserRef(userRef: string): Promise<Practitioner | null>;
7005
+ /**
7006
+ * Finds a draft practitioner profile by email address
7007
+ * Used to detect if a draft profile exists when a doctor registers without a token
7008
+ *
7009
+ * @param email - Email address to search for
7010
+ * @returns Draft practitioner profile if found, null otherwise
7011
+ *
7012
+ * @remarks
7013
+ * Requires Firestore composite index on:
7014
+ * - Collection: practitioners
7015
+ * - Fields: basicInfo.email (Ascending), status (Ascending), userRef (Ascending)
7016
+ */
7017
+ findDraftPractitionerByEmail(email: string): Promise<Practitioner | null>;
6995
7018
  /**
6996
7019
  * Dohvata sve zdravstvene radnike za određenu kliniku sa statusom ACTIVE
6997
7020
  */
package/dist/index.js CHANGED
@@ -7319,11 +7319,12 @@ var userSchema = import_zod4.z.object({
7319
7319
 
7320
7320
  // src/errors/auth.errors.ts
7321
7321
  var AuthError = class extends Error {
7322
- constructor(message, code, status = 400) {
7322
+ constructor(message, code, status = 400, metadata) {
7323
7323
  super(message);
7324
7324
  this.code = code;
7325
7325
  this.status = status;
7326
7326
  this.name = "AuthError";
7327
+ this.metadata = metadata;
7327
7328
  }
7328
7329
  };
7329
7330
  var AUTH_ERRORS = {
@@ -7502,6 +7503,12 @@ var AUTH_ERRORS = {
7502
7503
  "Lozinka je previ\u0161e slaba. Molimo koristite ja\u010Du lozinku.",
7503
7504
  "AUTH/WEAK_PASSWORD",
7504
7505
  400
7506
+ ),
7507
+ // Draft profile exists error
7508
+ DRAFT_PROFILE_EXISTS: new AuthError(
7509
+ "A draft practitioner profile exists for this email. Please use your invitation code to claim it, or contact support if you don't have one.",
7510
+ "AUTH/DRAFT_PROFILE_EXISTS",
7511
+ 409
7505
7512
  )
7506
7513
  };
7507
7514
 
@@ -11546,6 +11553,52 @@ var PractitionerService = class extends BaseService {
11546
11553
  }
11547
11554
  return querySnapshot.docs[0].data();
11548
11555
  }
11556
+ /**
11557
+ * Finds a draft practitioner profile by email address
11558
+ * Used to detect if a draft profile exists when a doctor registers without a token
11559
+ *
11560
+ * @param email - Email address to search for
11561
+ * @returns Draft practitioner profile if found, null otherwise
11562
+ *
11563
+ * @remarks
11564
+ * Requires Firestore composite index on:
11565
+ * - Collection: practitioners
11566
+ * - Fields: basicInfo.email (Ascending), status (Ascending), userRef (Ascending)
11567
+ */
11568
+ async findDraftPractitionerByEmail(email) {
11569
+ try {
11570
+ const normalizedEmail = email.toLowerCase().trim();
11571
+ console.log("[PRACTITIONER] Searching for draft practitioner by email", {
11572
+ email: normalizedEmail
11573
+ });
11574
+ const q = (0, import_firestore32.query)(
11575
+ (0, import_firestore32.collection)(this.db, PRACTITIONERS_COLLECTION),
11576
+ (0, import_firestore32.where)("basicInfo.email", "==", normalizedEmail),
11577
+ (0, import_firestore32.where)("status", "==", "draft" /* DRAFT */),
11578
+ (0, import_firestore32.where)("userRef", "==", ""),
11579
+ (0, import_firestore32.limit)(1)
11580
+ );
11581
+ const querySnapshot = await (0, import_firestore32.getDocs)(q);
11582
+ if (querySnapshot.empty) {
11583
+ console.log("[PRACTITIONER] No draft practitioner found for email", {
11584
+ email: normalizedEmail
11585
+ });
11586
+ return null;
11587
+ }
11588
+ const draftPractitioner = querySnapshot.docs[0].data();
11589
+ console.log("[PRACTITIONER] Draft practitioner found", {
11590
+ email: normalizedEmail,
11591
+ practitionerId: draftPractitioner.id
11592
+ });
11593
+ return draftPractitioner;
11594
+ } catch (error) {
11595
+ console.error(
11596
+ "[PRACTITIONER] Error finding draft practitioner by email:",
11597
+ error
11598
+ );
11599
+ return null;
11600
+ }
11601
+ }
11549
11602
  /**
11550
11603
  * Dohvata sve zdravstvene radnike za određenu kliniku sa statusom ACTIVE
11551
11604
  */
@@ -15290,7 +15343,49 @@ var AuthService = class extends BaseService {
15290
15343
  }
15291
15344
  practitioner = claimedPractitioner;
15292
15345
  } else {
15293
- console.log("[AUTH] Creating new practitioner profile");
15346
+ console.log("[AUTH] Checking for existing draft practitioner profile", {
15347
+ email: data.email
15348
+ });
15349
+ const draftPractitioner = await practitionerService.findDraftPractitionerByEmail(
15350
+ data.email
15351
+ );
15352
+ if (draftPractitioner) {
15353
+ console.log("[AUTH] Draft practitioner profile found", {
15354
+ practitionerId: draftPractitioner.id,
15355
+ email: data.email,
15356
+ clinics: draftPractitioner.clinics
15357
+ });
15358
+ let clinicNames = [];
15359
+ if (draftPractitioner.clinicsInfo && draftPractitioner.clinicsInfo.length > 0) {
15360
+ clinicNames = draftPractitioner.clinicsInfo.map((clinic) => clinic.name).filter((name) => !!name);
15361
+ } else if (draftPractitioner.clinics && draftPractitioner.clinics.length > 0) {
15362
+ console.log("[AUTH] clinicsInfo missing, fetching clinic names from clinic IDs");
15363
+ const clinicService = practitionerService.getClinicService();
15364
+ const clinicNamePromises = draftPractitioner.clinics.map(async (clinicId) => {
15365
+ try {
15366
+ const clinic = await clinicService.getClinic(clinicId);
15367
+ return (clinic == null ? void 0 : clinic.name) || null;
15368
+ } catch (error) {
15369
+ console.error(`[AUTH] Error fetching clinic ${clinicId}:`, error);
15370
+ return null;
15371
+ }
15372
+ });
15373
+ const names = await Promise.all(clinicNamePromises);
15374
+ clinicNames = names.filter((name) => !!name);
15375
+ }
15376
+ await cleanupFirebaseUser(firebaseUser);
15377
+ throw new AuthError(
15378
+ AUTH_ERRORS.DRAFT_PROFILE_EXISTS.message,
15379
+ AUTH_ERRORS.DRAFT_PROFILE_EXISTS.code,
15380
+ AUTH_ERRORS.DRAFT_PROFILE_EXISTS.status,
15381
+ {
15382
+ clinicNames,
15383
+ clinics: draftPractitioner.clinics,
15384
+ clinicsInfo: draftPractitioner.clinicsInfo
15385
+ }
15386
+ );
15387
+ }
15388
+ console.log("[AUTH] No draft profile found, creating new practitioner profile");
15294
15389
  const practitionerData = buildPractitionerData(data, firebaseUser.uid);
15295
15390
  practitioner = await practitionerService.createPractitioner(practitionerData);
15296
15391
  }
@@ -19923,6 +20018,53 @@ var ProcedureService = class extends BaseService {
19923
20018
  this.productService = productService;
19924
20019
  this.mediaService = mediaService;
19925
20020
  }
20021
+ setPractitionerService(practitionerService) {
20022
+ this.practitionerService = practitionerService;
20023
+ }
20024
+ /**
20025
+ * Filters out procedures from draft practitioners
20026
+ * @param procedures - Array of procedures to filter
20027
+ * @returns Filtered array of procedures (excluding those from draft practitioners)
20028
+ */
20029
+ async filterDraftPractitionerProcedures(procedures) {
20030
+ if (!this.practitionerService || procedures.length === 0) {
20031
+ return procedures;
20032
+ }
20033
+ try {
20034
+ const practitionerIds = Array.from(
20035
+ new Set(procedures.map((p) => p.practitionerId).filter(Boolean))
20036
+ );
20037
+ if (practitionerIds.length === 0) {
20038
+ return procedures;
20039
+ }
20040
+ const practitionerPromises = practitionerIds.map(
20041
+ (id) => this.practitionerService.getPractitioner(id).catch(() => null)
20042
+ );
20043
+ const practitioners = await Promise.all(practitionerPromises);
20044
+ const practitionerStatusMap = /* @__PURE__ */ new Map();
20045
+ practitioners.forEach((practitioner, index) => {
20046
+ if (practitioner) {
20047
+ practitionerStatusMap.set(practitionerIds[index], practitioner.status);
20048
+ }
20049
+ });
20050
+ const filteredProcedures = procedures.filter((procedure) => {
20051
+ const practitionerStatus = practitionerStatusMap.get(procedure.practitionerId);
20052
+ return practitionerStatus !== "draft" /* DRAFT */;
20053
+ });
20054
+ if (filteredProcedures.length !== procedures.length) {
20055
+ console.log(
20056
+ `[ProcedureService] Filtered out ${procedures.length - filteredProcedures.length} procedures from draft practitioners`
20057
+ );
20058
+ }
20059
+ return filteredProcedures;
20060
+ } catch (error) {
20061
+ console.error(
20062
+ "[ProcedureService] Error filtering draft practitioner procedures:",
20063
+ error
20064
+ );
20065
+ return procedures;
20066
+ }
20067
+ }
19926
20068
  /**
19927
20069
  * Process media resource (string URL or File object)
19928
20070
  * @param media String URL or File object
@@ -20633,9 +20775,10 @@ var ProcedureService = class extends BaseService {
20633
20775
  * Gets all procedures for a practitioner
20634
20776
  * @param practitionerId - The ID of the practitioner
20635
20777
  * @param clinicBranchId - Optional clinic branch ID to filter by
20778
+ * @param excludeDraftPractitioners - Whether to exclude procedures if the practitioner is in DRAFT status
20636
20779
  * @returns List of procedures
20637
20780
  */
20638
- async getProceduresByPractitioner(practitionerId, clinicBranchId) {
20781
+ async getProceduresByPractitioner(practitionerId, clinicBranchId, excludeDraftPractitioners = true) {
20639
20782
  const constraints = [
20640
20783
  (0, import_firestore58.where)("practitionerId", "==", practitionerId),
20641
20784
  (0, import_firestore58.where)("isActive", "==", true)
@@ -20648,7 +20791,19 @@ var ProcedureService = class extends BaseService {
20648
20791
  ...constraints
20649
20792
  );
20650
20793
  const snapshot = await (0, import_firestore58.getDocs)(q);
20651
- return snapshot.docs.map((doc47) => doc47.data());
20794
+ const procedures = snapshot.docs.map((doc47) => doc47.data());
20795
+ if (excludeDraftPractitioners && this.practitionerService) {
20796
+ try {
20797
+ const practitioner = await this.practitionerService.getPractitioner(practitionerId);
20798
+ if (practitioner && practitioner.status === "draft" /* DRAFT */) {
20799
+ console.log(`[ProcedureService] Excluding procedures for draft practitioner ${practitionerId}`);
20800
+ return [];
20801
+ }
20802
+ } catch (error) {
20803
+ console.error(`[ProcedureService] Error checking practitioner status for ${practitionerId}:`, error);
20804
+ }
20805
+ }
20806
+ return procedures;
20652
20807
  }
20653
20808
  /**
20654
20809
  * Gets all inactive procedures for a practitioner
@@ -20857,9 +21012,10 @@ var ProcedureService = class extends BaseService {
20857
21012
  *
20858
21013
  * @param pagination - Optional number of procedures per page (0 or undefined returns all)
20859
21014
  * @param lastDoc - Optional last document for pagination (if continuing from a previous page)
21015
+ * @param excludeDraftPractitioners - Whether to exclude procedures from draft practitioners (default: true)
20860
21016
  * @returns Object containing procedures array and the last document for pagination
20861
21017
  */
20862
- async getAllProcedures(pagination, lastDoc) {
21018
+ async getAllProcedures(pagination, lastDoc, excludeDraftPractitioners = true) {
20863
21019
  try {
20864
21020
  const proceduresCollection = (0, import_firestore58.collection)(this.db, PROCEDURES_COLLECTION);
20865
21021
  let proceduresQuery = (0, import_firestore58.query)(proceduresCollection);
@@ -20881,7 +21037,7 @@ var ProcedureService = class extends BaseService {
20881
21037
  }
20882
21038
  const proceduresSnapshot = await (0, import_firestore58.getDocs)(proceduresQuery);
20883
21039
  const lastVisible = proceduresSnapshot.docs[proceduresSnapshot.docs.length - 1];
20884
- const procedures = proceduresSnapshot.docs.map((doc47) => {
21040
+ let procedures = proceduresSnapshot.docs.map((doc47) => {
20885
21041
  const data = doc47.data();
20886
21042
  return {
20887
21043
  ...data,
@@ -20889,6 +21045,9 @@ var ProcedureService = class extends BaseService {
20889
21045
  // Ensure ID is present
20890
21046
  };
20891
21047
  });
21048
+ if (excludeDraftPractitioners) {
21049
+ procedures = await this.filterDraftPractitionerProcedures(procedures);
21050
+ }
20892
21051
  return {
20893
21052
  procedures,
20894
21053
  lastDoc: lastVisible
@@ -21053,6 +21212,7 @@ var ProcedureService = class extends BaseService {
21053
21212
  if (hasNestedFilters) {
21054
21213
  procedures = this.applyInMemoryFilters(procedures, filters);
21055
21214
  }
21215
+ procedures = await this.filterDraftPractitionerProcedures(procedures);
21056
21216
  const lastDoc = querySnapshot.docs.length > 0 ? querySnapshot.docs[querySnapshot.docs.length - 1] : null;
21057
21217
  console.log(`[PROCEDURE_SERVICE] Strategy 2 success: ${procedures.length} procedures`);
21058
21218
  if (procedures.length < (filters.pagination || 10)) {
@@ -21133,6 +21293,7 @@ var ProcedureService = class extends BaseService {
21133
21293
  }
21134
21294
  });
21135
21295
  procedures = this.applyInMemoryFilters(procedures, filters);
21296
+ procedures = await this.filterDraftPractitionerProcedures(procedures);
21136
21297
  console.log("[PROCEDURE_SERVICE] After applyInMemoryFilters (Strategy 3):", {
21137
21298
  procedureCount: procedures.length
21138
21299
  });
@@ -21164,6 +21325,7 @@ var ProcedureService = class extends BaseService {
21164
21325
  (doc47) => ({ ...doc47.data(), id: doc47.id })
21165
21326
  );
21166
21327
  procedures = this.applyInMemoryFilters(procedures, filters);
21328
+ procedures = await this.filterDraftPractitionerProcedures(procedures);
21167
21329
  const lastDoc = querySnapshot.docs.length > 0 ? querySnapshot.docs[querySnapshot.docs.length - 1] : null;
21168
21330
  console.log(`[PROCEDURE_SERVICE] Strategy 4 success: ${procedures.length} procedures`);
21169
21331
  if (procedures.length < (filters.pagination || 10)) {
package/dist/index.mjs CHANGED
@@ -7225,11 +7225,12 @@ var userSchema = z4.object({
7225
7225
 
7226
7226
  // src/errors/auth.errors.ts
7227
7227
  var AuthError = class extends Error {
7228
- constructor(message, code, status = 400) {
7228
+ constructor(message, code, status = 400, metadata) {
7229
7229
  super(message);
7230
7230
  this.code = code;
7231
7231
  this.status = status;
7232
7232
  this.name = "AuthError";
7233
+ this.metadata = metadata;
7233
7234
  }
7234
7235
  };
7235
7236
  var AUTH_ERRORS = {
@@ -7408,6 +7409,12 @@ var AUTH_ERRORS = {
7408
7409
  "Lozinka je previ\u0161e slaba. Molimo koristite ja\u010Du lozinku.",
7409
7410
  "AUTH/WEAK_PASSWORD",
7410
7411
  400
7412
+ ),
7413
+ // Draft profile exists error
7414
+ DRAFT_PROFILE_EXISTS: new AuthError(
7415
+ "A draft practitioner profile exists for this email. Please use your invitation code to claim it, or contact support if you don't have one.",
7416
+ "AUTH/DRAFT_PROFILE_EXISTS",
7417
+ 409
7411
7418
  )
7412
7419
  };
7413
7420
 
@@ -11569,6 +11576,52 @@ var PractitionerService = class extends BaseService {
11569
11576
  }
11570
11577
  return querySnapshot.docs[0].data();
11571
11578
  }
11579
+ /**
11580
+ * Finds a draft practitioner profile by email address
11581
+ * Used to detect if a draft profile exists when a doctor registers without a token
11582
+ *
11583
+ * @param email - Email address to search for
11584
+ * @returns Draft practitioner profile if found, null otherwise
11585
+ *
11586
+ * @remarks
11587
+ * Requires Firestore composite index on:
11588
+ * - Collection: practitioners
11589
+ * - Fields: basicInfo.email (Ascending), status (Ascending), userRef (Ascending)
11590
+ */
11591
+ async findDraftPractitionerByEmail(email) {
11592
+ try {
11593
+ const normalizedEmail = email.toLowerCase().trim();
11594
+ console.log("[PRACTITIONER] Searching for draft practitioner by email", {
11595
+ email: normalizedEmail
11596
+ });
11597
+ const q = query13(
11598
+ collection13(this.db, PRACTITIONERS_COLLECTION),
11599
+ where13("basicInfo.email", "==", normalizedEmail),
11600
+ where13("status", "==", "draft" /* DRAFT */),
11601
+ where13("userRef", "==", ""),
11602
+ limit7(1)
11603
+ );
11604
+ const querySnapshot = await getDocs13(q);
11605
+ if (querySnapshot.empty) {
11606
+ console.log("[PRACTITIONER] No draft practitioner found for email", {
11607
+ email: normalizedEmail
11608
+ });
11609
+ return null;
11610
+ }
11611
+ const draftPractitioner = querySnapshot.docs[0].data();
11612
+ console.log("[PRACTITIONER] Draft practitioner found", {
11613
+ email: normalizedEmail,
11614
+ practitionerId: draftPractitioner.id
11615
+ });
11616
+ return draftPractitioner;
11617
+ } catch (error) {
11618
+ console.error(
11619
+ "[PRACTITIONER] Error finding draft practitioner by email:",
11620
+ error
11621
+ );
11622
+ return null;
11623
+ }
11624
+ }
11572
11625
  /**
11573
11626
  * Dohvata sve zdravstvene radnike za određenu kliniku sa statusom ACTIVE
11574
11627
  */
@@ -15377,7 +15430,49 @@ var AuthService = class extends BaseService {
15377
15430
  }
15378
15431
  practitioner = claimedPractitioner;
15379
15432
  } else {
15380
- console.log("[AUTH] Creating new practitioner profile");
15433
+ console.log("[AUTH] Checking for existing draft practitioner profile", {
15434
+ email: data.email
15435
+ });
15436
+ const draftPractitioner = await practitionerService.findDraftPractitionerByEmail(
15437
+ data.email
15438
+ );
15439
+ if (draftPractitioner) {
15440
+ console.log("[AUTH] Draft practitioner profile found", {
15441
+ practitionerId: draftPractitioner.id,
15442
+ email: data.email,
15443
+ clinics: draftPractitioner.clinics
15444
+ });
15445
+ let clinicNames = [];
15446
+ if (draftPractitioner.clinicsInfo && draftPractitioner.clinicsInfo.length > 0) {
15447
+ clinicNames = draftPractitioner.clinicsInfo.map((clinic) => clinic.name).filter((name) => !!name);
15448
+ } else if (draftPractitioner.clinics && draftPractitioner.clinics.length > 0) {
15449
+ console.log("[AUTH] clinicsInfo missing, fetching clinic names from clinic IDs");
15450
+ const clinicService = practitionerService.getClinicService();
15451
+ const clinicNamePromises = draftPractitioner.clinics.map(async (clinicId) => {
15452
+ try {
15453
+ const clinic = await clinicService.getClinic(clinicId);
15454
+ return (clinic == null ? void 0 : clinic.name) || null;
15455
+ } catch (error) {
15456
+ console.error(`[AUTH] Error fetching clinic ${clinicId}:`, error);
15457
+ return null;
15458
+ }
15459
+ });
15460
+ const names = await Promise.all(clinicNamePromises);
15461
+ clinicNames = names.filter((name) => !!name);
15462
+ }
15463
+ await cleanupFirebaseUser(firebaseUser);
15464
+ throw new AuthError(
15465
+ AUTH_ERRORS.DRAFT_PROFILE_EXISTS.message,
15466
+ AUTH_ERRORS.DRAFT_PROFILE_EXISTS.code,
15467
+ AUTH_ERRORS.DRAFT_PROFILE_EXISTS.status,
15468
+ {
15469
+ clinicNames,
15470
+ clinics: draftPractitioner.clinics,
15471
+ clinicsInfo: draftPractitioner.clinicsInfo
15472
+ }
15473
+ );
15474
+ }
15475
+ console.log("[AUTH] No draft profile found, creating new practitioner profile");
15381
15476
  const practitionerData = buildPractitionerData(data, firebaseUser.uid);
15382
15477
  practitioner = await practitionerService.createPractitioner(practitionerData);
15383
15478
  }
@@ -20159,6 +20254,53 @@ var ProcedureService = class extends BaseService {
20159
20254
  this.productService = productService;
20160
20255
  this.mediaService = mediaService;
20161
20256
  }
20257
+ setPractitionerService(practitionerService) {
20258
+ this.practitionerService = practitionerService;
20259
+ }
20260
+ /**
20261
+ * Filters out procedures from draft practitioners
20262
+ * @param procedures - Array of procedures to filter
20263
+ * @returns Filtered array of procedures (excluding those from draft practitioners)
20264
+ */
20265
+ async filterDraftPractitionerProcedures(procedures) {
20266
+ if (!this.practitionerService || procedures.length === 0) {
20267
+ return procedures;
20268
+ }
20269
+ try {
20270
+ const practitionerIds = Array.from(
20271
+ new Set(procedures.map((p) => p.practitionerId).filter(Boolean))
20272
+ );
20273
+ if (practitionerIds.length === 0) {
20274
+ return procedures;
20275
+ }
20276
+ const practitionerPromises = practitionerIds.map(
20277
+ (id) => this.practitionerService.getPractitioner(id).catch(() => null)
20278
+ );
20279
+ const practitioners = await Promise.all(practitionerPromises);
20280
+ const practitionerStatusMap = /* @__PURE__ */ new Map();
20281
+ practitioners.forEach((practitioner, index) => {
20282
+ if (practitioner) {
20283
+ practitionerStatusMap.set(practitionerIds[index], practitioner.status);
20284
+ }
20285
+ });
20286
+ const filteredProcedures = procedures.filter((procedure) => {
20287
+ const practitionerStatus = practitionerStatusMap.get(procedure.practitionerId);
20288
+ return practitionerStatus !== "draft" /* DRAFT */;
20289
+ });
20290
+ if (filteredProcedures.length !== procedures.length) {
20291
+ console.log(
20292
+ `[ProcedureService] Filtered out ${procedures.length - filteredProcedures.length} procedures from draft practitioners`
20293
+ );
20294
+ }
20295
+ return filteredProcedures;
20296
+ } catch (error) {
20297
+ console.error(
20298
+ "[ProcedureService] Error filtering draft practitioner procedures:",
20299
+ error
20300
+ );
20301
+ return procedures;
20302
+ }
20303
+ }
20162
20304
  /**
20163
20305
  * Process media resource (string URL or File object)
20164
20306
  * @param media String URL or File object
@@ -20869,9 +21011,10 @@ var ProcedureService = class extends BaseService {
20869
21011
  * Gets all procedures for a practitioner
20870
21012
  * @param practitionerId - The ID of the practitioner
20871
21013
  * @param clinicBranchId - Optional clinic branch ID to filter by
21014
+ * @param excludeDraftPractitioners - Whether to exclude procedures if the practitioner is in DRAFT status
20872
21015
  * @returns List of procedures
20873
21016
  */
20874
- async getProceduresByPractitioner(practitionerId, clinicBranchId) {
21017
+ async getProceduresByPractitioner(practitionerId, clinicBranchId, excludeDraftPractitioners = true) {
20875
21018
  const constraints = [
20876
21019
  where33("practitionerId", "==", practitionerId),
20877
21020
  where33("isActive", "==", true)
@@ -20884,7 +21027,19 @@ var ProcedureService = class extends BaseService {
20884
21027
  ...constraints
20885
21028
  );
20886
21029
  const snapshot = await getDocs33(q);
20887
- return snapshot.docs.map((doc47) => doc47.data());
21030
+ const procedures = snapshot.docs.map((doc47) => doc47.data());
21031
+ if (excludeDraftPractitioners && this.practitionerService) {
21032
+ try {
21033
+ const practitioner = await this.practitionerService.getPractitioner(practitionerId);
21034
+ if (practitioner && practitioner.status === "draft" /* DRAFT */) {
21035
+ console.log(`[ProcedureService] Excluding procedures for draft practitioner ${practitionerId}`);
21036
+ return [];
21037
+ }
21038
+ } catch (error) {
21039
+ console.error(`[ProcedureService] Error checking practitioner status for ${practitionerId}:`, error);
21040
+ }
21041
+ }
21042
+ return procedures;
20888
21043
  }
20889
21044
  /**
20890
21045
  * Gets all inactive procedures for a practitioner
@@ -21093,9 +21248,10 @@ var ProcedureService = class extends BaseService {
21093
21248
  *
21094
21249
  * @param pagination - Optional number of procedures per page (0 or undefined returns all)
21095
21250
  * @param lastDoc - Optional last document for pagination (if continuing from a previous page)
21251
+ * @param excludeDraftPractitioners - Whether to exclude procedures from draft practitioners (default: true)
21096
21252
  * @returns Object containing procedures array and the last document for pagination
21097
21253
  */
21098
- async getAllProcedures(pagination, lastDoc) {
21254
+ async getAllProcedures(pagination, lastDoc, excludeDraftPractitioners = true) {
21099
21255
  try {
21100
21256
  const proceduresCollection = collection33(this.db, PROCEDURES_COLLECTION);
21101
21257
  let proceduresQuery = query33(proceduresCollection);
@@ -21117,7 +21273,7 @@ var ProcedureService = class extends BaseService {
21117
21273
  }
21118
21274
  const proceduresSnapshot = await getDocs33(proceduresQuery);
21119
21275
  const lastVisible = proceduresSnapshot.docs[proceduresSnapshot.docs.length - 1];
21120
- const procedures = proceduresSnapshot.docs.map((doc47) => {
21276
+ let procedures = proceduresSnapshot.docs.map((doc47) => {
21121
21277
  const data = doc47.data();
21122
21278
  return {
21123
21279
  ...data,
@@ -21125,6 +21281,9 @@ var ProcedureService = class extends BaseService {
21125
21281
  // Ensure ID is present
21126
21282
  };
21127
21283
  });
21284
+ if (excludeDraftPractitioners) {
21285
+ procedures = await this.filterDraftPractitionerProcedures(procedures);
21286
+ }
21128
21287
  return {
21129
21288
  procedures,
21130
21289
  lastDoc: lastVisible
@@ -21289,6 +21448,7 @@ var ProcedureService = class extends BaseService {
21289
21448
  if (hasNestedFilters) {
21290
21449
  procedures = this.applyInMemoryFilters(procedures, filters);
21291
21450
  }
21451
+ procedures = await this.filterDraftPractitionerProcedures(procedures);
21292
21452
  const lastDoc = querySnapshot.docs.length > 0 ? querySnapshot.docs[querySnapshot.docs.length - 1] : null;
21293
21453
  console.log(`[PROCEDURE_SERVICE] Strategy 2 success: ${procedures.length} procedures`);
21294
21454
  if (procedures.length < (filters.pagination || 10)) {
@@ -21369,6 +21529,7 @@ var ProcedureService = class extends BaseService {
21369
21529
  }
21370
21530
  });
21371
21531
  procedures = this.applyInMemoryFilters(procedures, filters);
21532
+ procedures = await this.filterDraftPractitionerProcedures(procedures);
21372
21533
  console.log("[PROCEDURE_SERVICE] After applyInMemoryFilters (Strategy 3):", {
21373
21534
  procedureCount: procedures.length
21374
21535
  });
@@ -21400,6 +21561,7 @@ var ProcedureService = class extends BaseService {
21400
21561
  (doc47) => ({ ...doc47.data(), id: doc47.id })
21401
21562
  );
21402
21563
  procedures = this.applyInMemoryFilters(procedures, filters);
21564
+ procedures = await this.filterDraftPractitionerProcedures(procedures);
21403
21565
  const lastDoc = querySnapshot.docs.length > 0 ? querySnapshot.docs[querySnapshot.docs.length - 1] : null;
21404
21566
  console.log(`[PROCEDURE_SERVICE] Strategy 4 success: ${procedures.length} procedures`);
21405
21567
  if (procedures.length < (filters.pagination || 10)) {