@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.
- package/dist/admin/index.d.mts +20 -1
- package/dist/admin/index.d.ts +20 -1
- package/dist/admin/index.js +217 -1
- package/dist/admin/index.mjs +217 -1
- package/dist/index.d.mts +26 -3
- package/dist/index.d.ts +26 -3
- package/dist/index.js +168 -6
- package/dist/index.mjs +168 -6
- package/package.json +121 -121
- package/src/__mocks__/firstore.ts +10 -10
- package/src/admin/aggregation/README.md +79 -79
- package/src/admin/aggregation/appointment/README.md +128 -128
- package/src/admin/aggregation/appointment/appointment.aggregation.service.ts +1984 -1984
- package/src/admin/aggregation/appointment/index.ts +1 -1
- package/src/admin/aggregation/clinic/README.md +52 -52
- package/src/admin/aggregation/clinic/clinic.aggregation.service.ts +966 -703
- package/src/admin/aggregation/clinic/index.ts +1 -1
- package/src/admin/aggregation/forms/README.md +13 -13
- package/src/admin/aggregation/forms/filled-forms.aggregation.service.ts +322 -322
- package/src/admin/aggregation/forms/index.ts +1 -1
- package/src/admin/aggregation/index.ts +8 -8
- package/src/admin/aggregation/patient/README.md +27 -27
- package/src/admin/aggregation/patient/index.ts +1 -1
- package/src/admin/aggregation/patient/patient.aggregation.service.ts +141 -141
- package/src/admin/aggregation/practitioner/README.md +42 -42
- package/src/admin/aggregation/practitioner/index.ts +1 -1
- package/src/admin/aggregation/practitioner/practitioner.aggregation.service.ts +433 -433
- package/src/admin/aggregation/practitioner-invite/index.ts +1 -1
- package/src/admin/aggregation/practitioner-invite/practitioner-invite.aggregation.service.ts +961 -961
- package/src/admin/aggregation/procedure/README.md +43 -43
- package/src/admin/aggregation/procedure/index.ts +1 -1
- package/src/admin/aggregation/procedure/procedure.aggregation.service.ts +702 -702
- package/src/admin/aggregation/reviews/index.ts +1 -1
- package/src/admin/aggregation/reviews/reviews.aggregation.service.ts +689 -689
- package/src/admin/analytics/analytics.admin.service.ts +278 -278
- package/src/admin/analytics/index.ts +2 -2
- package/src/admin/booking/README.md +125 -125
- package/src/admin/booking/booking.admin.ts +1037 -1037
- package/src/admin/booking/booking.calculator.ts +712 -712
- package/src/admin/booking/booking.types.ts +59 -59
- package/src/admin/booking/index.ts +3 -3
- package/src/admin/booking/timezones-problem.md +185 -185
- package/src/admin/calendar/README.md +7 -7
- package/src/admin/calendar/calendar.admin.service.ts +345 -345
- package/src/admin/calendar/index.ts +1 -1
- package/src/admin/documentation-templates/document-manager.admin.ts +260 -260
- package/src/admin/documentation-templates/index.ts +1 -1
- package/src/admin/free-consultation/free-consultation-utils.admin.ts +148 -148
- package/src/admin/free-consultation/index.ts +1 -1
- package/src/admin/index.ts +81 -81
- package/src/admin/logger/index.ts +78 -78
- package/src/admin/mailing/README.md +95 -95
- package/src/admin/mailing/appointment/appointment.mailing.service.ts +732 -732
- package/src/admin/mailing/appointment/index.ts +1 -1
- package/src/admin/mailing/appointment/templates/patient/appointment-confirmed.html +40 -40
- package/src/admin/mailing/base.mailing.service.ts +208 -208
- package/src/admin/mailing/index.ts +3 -3
- package/src/admin/mailing/practitionerInvite/existing-practitioner-invite.mailing.ts +611 -611
- package/src/admin/mailing/practitionerInvite/index.ts +2 -2
- package/src/admin/mailing/practitionerInvite/practitionerInvite.mailing.ts +395 -395
- package/src/admin/mailing/practitionerInvite/templates/existing-practitioner-invitation.template.ts +155 -155
- package/src/admin/mailing/practitionerInvite/templates/invitation.template.ts +101 -101
- package/src/admin/mailing/practitionerInvite/templates/invite-accepted-notification.template.ts +228 -228
- package/src/admin/mailing/practitionerInvite/templates/invite-rejected-notification.template.ts +242 -242
- package/src/admin/notifications/index.ts +1 -1
- package/src/admin/notifications/notifications.admin.ts +710 -710
- package/src/admin/requirements/README.md +128 -128
- package/src/admin/requirements/index.ts +1 -1
- package/src/admin/requirements/patient-requirements.admin.service.ts +475 -475
- package/src/admin/users/index.ts +1 -1
- package/src/admin/users/user-profile.admin.ts +405 -405
- package/src/backoffice/constants/certification.constants.ts +13 -13
- package/src/backoffice/constants/index.ts +1 -1
- package/src/backoffice/errors/backoffice.errors.ts +181 -181
- package/src/backoffice/errors/index.ts +1 -1
- package/src/backoffice/expo-safe/README.md +26 -26
- package/src/backoffice/expo-safe/index.ts +41 -41
- package/src/backoffice/index.ts +5 -5
- package/src/backoffice/services/FIXES_README.md +102 -102
- package/src/backoffice/services/README.md +57 -57
- package/src/backoffice/services/analytics.service.proposal.md +863 -863
- package/src/backoffice/services/analytics.service.summary.md +143 -143
- package/src/backoffice/services/brand.service.ts +256 -256
- package/src/backoffice/services/category.service.ts +384 -384
- package/src/backoffice/services/constants.service.ts +385 -385
- package/src/backoffice/services/documentation-template.service.ts +202 -202
- package/src/backoffice/services/index.ts +10 -10
- package/src/backoffice/services/migrate-products.ts +116 -116
- package/src/backoffice/services/product.service.ts +553 -553
- package/src/backoffice/services/requirement.service.ts +235 -235
- package/src/backoffice/services/subcategory.service.ts +461 -461
- package/src/backoffice/services/technology.service.ts +1151 -1151
- package/src/backoffice/types/README.md +12 -12
- package/src/backoffice/types/admin-constants.types.ts +69 -69
- package/src/backoffice/types/brand.types.ts +29 -29
- package/src/backoffice/types/category.types.ts +67 -67
- package/src/backoffice/types/documentation-templates.types.ts +28 -28
- package/src/backoffice/types/index.ts +10 -10
- package/src/backoffice/types/procedure-product.types.ts +38 -38
- package/src/backoffice/types/product.types.ts +240 -240
- package/src/backoffice/types/requirement.types.ts +63 -63
- package/src/backoffice/types/static/README.md +18 -18
- package/src/backoffice/types/static/blocking-condition.types.ts +21 -21
- package/src/backoffice/types/static/certification.types.ts +37 -37
- package/src/backoffice/types/static/contraindication.types.ts +19 -19
- package/src/backoffice/types/static/index.ts +6 -6
- package/src/backoffice/types/static/pricing.types.ts +16 -16
- package/src/backoffice/types/static/procedure-family.types.ts +14 -14
- package/src/backoffice/types/static/treatment-benefit.types.ts +22 -22
- package/src/backoffice/types/subcategory.types.ts +34 -34
- package/src/backoffice/types/technology.types.ts +168 -168
- package/src/backoffice/validations/index.ts +1 -1
- package/src/backoffice/validations/schemas.ts +164 -164
- package/src/config/__mocks__/firebase.ts +99 -99
- package/src/config/firebase.ts +78 -78
- package/src/config/index.ts +9 -9
- package/src/errors/auth.error.ts +6 -6
- package/src/errors/auth.errors.ts +211 -200
- package/src/errors/clinic.errors.ts +32 -32
- package/src/errors/firebase.errors.ts +47 -47
- package/src/errors/user.errors.ts +99 -99
- package/src/index.backup.ts +407 -407
- package/src/index.ts +6 -6
- package/src/locales/en.ts +31 -31
- package/src/recommender/admin/index.ts +1 -1
- package/src/recommender/admin/services/recommender.service.admin.ts +5 -5
- package/src/recommender/front/index.ts +1 -1
- package/src/recommender/front/services/onboarding.service.ts +5 -5
- package/src/recommender/front/services/recommender.service.ts +3 -3
- package/src/recommender/index.ts +1 -1
- package/src/services/PATIENTAUTH.MD +197 -197
- package/src/services/README.md +106 -106
- package/src/services/__tests__/auth/auth.mock.test.ts +17 -17
- package/src/services/__tests__/auth/auth.setup.ts +293 -293
- package/src/services/__tests__/auth.service.test.ts +346 -346
- package/src/services/__tests__/base.service.test.ts +77 -77
- package/src/services/__tests__/user.service.test.ts +528 -528
- package/src/services/analytics/ARCHITECTURE.md +199 -199
- package/src/services/analytics/CLOUD_FUNCTIONS.md +225 -225
- package/src/services/analytics/GROUPED_ANALYTICS.md +501 -501
- package/src/services/analytics/QUICK_START.md +393 -393
- package/src/services/analytics/README.md +304 -304
- package/src/services/analytics/SUMMARY.md +141 -141
- package/src/services/analytics/TRENDS.md +380 -380
- package/src/services/analytics/USAGE_GUIDE.md +518 -518
- package/src/services/analytics/analytics-cloud.service.ts +222 -222
- package/src/services/analytics/analytics.service.ts +2142 -2142
- package/src/services/analytics/index.ts +4 -4
- package/src/services/analytics/review-analytics.service.ts +941 -941
- package/src/services/analytics/utils/appointment-filtering.utils.ts +138 -138
- package/src/services/analytics/utils/cost-calculation.utils.ts +182 -182
- package/src/services/analytics/utils/grouping.utils.ts +434 -434
- package/src/services/analytics/utils/stored-analytics.utils.ts +347 -347
- package/src/services/analytics/utils/time-calculation.utils.ts +186 -186
- package/src/services/analytics/utils/trend-calculation.utils.ts +200 -200
- package/src/services/appointment/README.md +17 -17
- package/src/services/appointment/appointment.service.ts +2558 -2558
- package/src/services/appointment/index.ts +1 -1
- package/src/services/appointment/utils/appointment.utils.ts +552 -552
- package/src/services/appointment/utils/extended-procedure.utils.ts +314 -314
- package/src/services/appointment/utils/form-initialization.utils.ts +225 -225
- package/src/services/appointment/utils/recommended-procedure.utils.ts +195 -195
- package/src/services/appointment/utils/zone-management.utils.ts +353 -353
- package/src/services/appointment/utils/zone-photo.utils.ts +152 -152
- package/src/services/auth/auth.service.ts +1043 -989
- package/src/services/auth/auth.v2.service.ts +961 -961
- package/src/services/auth/index.ts +7 -7
- package/src/services/auth/utils/error.utils.ts +90 -90
- package/src/services/auth/utils/firebase.utils.ts +49 -49
- package/src/services/auth/utils/index.ts +21 -21
- package/src/services/auth/utils/practitioner.utils.ts +125 -125
- package/src/services/base.service.ts +41 -41
- package/src/services/calendar/calendar.service.ts +1077 -1077
- package/src/services/calendar/calendar.v2.service.ts +1683 -1683
- package/src/services/calendar/calendar.v3.service.ts +313 -313
- package/src/services/calendar/externalCalendar.service.ts +178 -178
- package/src/services/calendar/index.ts +5 -5
- package/src/services/calendar/synced-calendars.service.ts +743 -743
- package/src/services/calendar/utils/appointment.utils.ts +265 -265
- package/src/services/calendar/utils/calendar-event.utils.ts +646 -646
- package/src/services/calendar/utils/clinic.utils.ts +237 -237
- package/src/services/calendar/utils/docs.utils.ts +157 -157
- package/src/services/calendar/utils/google-calendar.utils.ts +697 -697
- package/src/services/calendar/utils/index.ts +8 -8
- package/src/services/calendar/utils/patient.utils.ts +198 -198
- package/src/services/calendar/utils/practitioner.utils.ts +221 -221
- package/src/services/calendar/utils/synced-calendar.utils.ts +472 -472
- package/src/services/clinic/README.md +204 -204
- package/src/services/clinic/__tests__/clinic-admin.service.test.ts +287 -287
- package/src/services/clinic/__tests__/clinic-group.service.test.ts +352 -352
- package/src/services/clinic/__tests__/clinic.service.test.ts +354 -354
- package/src/services/clinic/billing-transactions.service.ts +217 -217
- package/src/services/clinic/clinic-admin.service.ts +202 -202
- package/src/services/clinic/clinic-group.service.ts +310 -310
- package/src/services/clinic/clinic.service.ts +708 -708
- package/src/services/clinic/index.ts +5 -5
- package/src/services/clinic/practitioner-invite.service.ts +519 -519
- package/src/services/clinic/utils/admin.utils.ts +551 -551
- package/src/services/clinic/utils/clinic-group.utils.ts +646 -646
- package/src/services/clinic/utils/clinic.utils.ts +949 -949
- package/src/services/clinic/utils/filter.utils.d.ts +23 -23
- package/src/services/clinic/utils/filter.utils.ts +446 -446
- package/src/services/clinic/utils/index.ts +11 -11
- package/src/services/clinic/utils/photos.utils.ts +188 -188
- package/src/services/clinic/utils/search.utils.ts +84 -84
- package/src/services/clinic/utils/tag.utils.ts +124 -124
- package/src/services/documentation-templates/documentation-template.service.ts +537 -537
- package/src/services/documentation-templates/filled-document.service.ts +587 -587
- package/src/services/documentation-templates/index.ts +2 -2
- package/src/services/index.ts +14 -14
- package/src/services/media/index.ts +1 -1
- package/src/services/media/media.service.ts +418 -418
- package/src/services/notifications/__tests__/notification.service.test.ts +242 -242
- package/src/services/notifications/index.ts +1 -1
- package/src/services/notifications/notification.service.ts +215 -215
- package/src/services/patient/README.md +48 -48
- package/src/services/patient/To-Do.md +43 -43
- package/src/services/patient/__tests__/patient.service.test.ts +294 -294
- package/src/services/patient/index.ts +2 -2
- package/src/services/patient/patient.service.ts +883 -883
- package/src/services/patient/patientRequirements.service.ts +285 -285
- package/src/services/patient/utils/aesthetic-analysis.utils.ts +176 -176
- package/src/services/patient/utils/clinic.utils.ts +80 -80
- package/src/services/patient/utils/docs.utils.ts +142 -142
- package/src/services/patient/utils/index.ts +9 -9
- package/src/services/patient/utils/location.utils.ts +126 -126
- package/src/services/patient/utils/medical-stuff.utils.ts +143 -143
- package/src/services/patient/utils/medical.utils.ts +458 -458
- package/src/services/patient/utils/practitioner.utils.ts +260 -260
- package/src/services/patient/utils/profile.utils.ts +510 -510
- package/src/services/patient/utils/sensitive.utils.ts +260 -260
- package/src/services/patient/utils/token.utils.ts +211 -211
- package/src/services/practitioner/README.md +145 -145
- package/src/services/practitioner/index.ts +1 -1
- package/src/services/practitioner/practitioner.service.ts +1799 -1742
- package/src/services/procedure/README.md +163 -163
- package/src/services/procedure/index.ts +1 -1
- package/src/services/procedure/procedure.service.ts +2307 -2200
- package/src/services/reviews/index.ts +1 -1
- package/src/services/reviews/reviews.service.ts +734 -734
- package/src/services/user/index.ts +1 -1
- package/src/services/user/user.service.ts +489 -489
- package/src/services/user/user.v2.service.ts +466 -466
- package/src/types/analytics/analytics.types.ts +597 -597
- package/src/types/analytics/grouped-analytics.types.ts +173 -173
- package/src/types/analytics/index.ts +4 -4
- package/src/types/analytics/stored-analytics.types.ts +137 -137
- package/src/types/appointment/index.ts +480 -480
- package/src/types/calendar/index.ts +258 -258
- package/src/types/calendar/synced-calendar.types.ts +66 -66
- package/src/types/clinic/index.ts +498 -498
- package/src/types/clinic/practitioner-invite.types.ts +91 -91
- package/src/types/clinic/preferences.types.ts +159 -159
- package/src/types/clinic/to-do +3 -3
- package/src/types/documentation-templates/index.ts +308 -308
- package/src/types/index.ts +47 -47
- package/src/types/notifications/README.md +77 -77
- package/src/types/notifications/index.ts +286 -286
- package/src/types/patient/aesthetic-analysis.types.ts +66 -66
- package/src/types/patient/allergies.ts +58 -58
- package/src/types/patient/index.ts +275 -275
- package/src/types/patient/medical-info.types.ts +152 -152
- package/src/types/patient/patient-requirements.ts +92 -92
- package/src/types/patient/token.types.ts +61 -61
- package/src/types/practitioner/index.ts +206 -206
- package/src/types/procedure/index.ts +181 -181
- package/src/types/profile/index.ts +39 -39
- package/src/types/reviews/index.ts +132 -132
- package/src/types/tz-lookup.d.ts +4 -4
- package/src/types/user/index.ts +38 -38
- package/src/utils/TIMESTAMPS.md +176 -176
- package/src/utils/TimestampUtils.ts +241 -241
- package/src/utils/index.ts +1 -1
- package/src/validations/appointment.schema.ts +574 -574
- package/src/validations/calendar.schema.ts +225 -225
- package/src/validations/clinic.schema.ts +494 -494
- package/src/validations/common.schema.ts +25 -25
- package/src/validations/documentation-templates/index.ts +1 -1
- package/src/validations/documentation-templates/template.schema.ts +220 -220
- package/src/validations/documentation-templates.schema.ts +10 -10
- package/src/validations/index.ts +20 -20
- package/src/validations/media.schema.ts +10 -10
- package/src/validations/notification.schema.ts +90 -90
- package/src/validations/patient/aesthetic-analysis.schema.ts +55 -55
- package/src/validations/patient/medical-info.schema.ts +125 -125
- package/src/validations/patient/patient-requirements.schema.ts +84 -84
- package/src/validations/patient/token.schema.ts +29 -29
- package/src/validations/patient.schema.ts +217 -217
- package/src/validations/practitioner.schema.ts +222 -222
- package/src/validations/procedure-product.schema.ts +41 -41
- package/src/validations/procedure.schema.ts +124 -124
- package/src/validations/profile-info.schema.ts +41 -41
- package/src/validations/reviews.schema.ts +195 -195
- package/src/validations/schemas.ts +104 -104
- 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
|
-
|
|
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]
|
|
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
|
-
|
|
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
|
-
|
|
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]
|
|
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
|
-
|
|
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
|
-
|
|
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)) {
|