@blackcode_sa/metaestetics-api 1.7.11 → 1.7.12

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/index.js CHANGED
@@ -796,7 +796,7 @@ var UserRole = /* @__PURE__ */ ((UserRole2) => {
796
796
  var USERS_COLLECTION = "users";
797
797
 
798
798
  // src/services/auth.service.ts
799
- var import_zod19 = require("zod");
799
+ var import_zod20 = require("zod");
800
800
 
801
801
  // src/validations/schemas.ts
802
802
  var import_zod3 = require("zod");
@@ -1191,7 +1191,7 @@ var USER_ERRORS = {
1191
1191
  };
1192
1192
 
1193
1193
  // src/services/user.service.ts
1194
- var import_zod15 = require("zod");
1194
+ var import_zod16 = require("zod");
1195
1195
 
1196
1196
  // src/services/patient/patient.service.ts
1197
1197
  var import_firestore12 = require("firebase/firestore");
@@ -3102,7 +3102,7 @@ var SubscriptionModel = /* @__PURE__ */ ((SubscriptionModel2) => {
3102
3102
  })(SubscriptionModel || {});
3103
3103
 
3104
3104
  // src/validations/clinic.schema.ts
3105
- var import_zod12 = require("zod");
3105
+ var import_zod13 = require("zod");
3106
3106
  var import_firestore13 = require("firebase/firestore");
3107
3107
 
3108
3108
  // src/validations/reviews.schema.ts
@@ -3319,38 +3319,41 @@ var doctorInfoSchema = import_zod11.z.object({
3319
3319
  // List of procedure IDs practitioner offers
3320
3320
  });
3321
3321
 
3322
- // src/validations/clinic.schema.ts
3322
+ // src/validations/media.schema.ts
3323
+ var import_zod12 = require("zod");
3323
3324
  var mediaResourceSchema = import_zod12.z.union([
3324
3325
  import_zod12.z.string(),
3325
3326
  import_zod12.z.instanceof(File),
3326
3327
  import_zod12.z.instanceof(Blob)
3327
3328
  ]);
3328
- var clinicContactInfoSchema = import_zod12.z.object({
3329
- email: import_zod12.z.string().email(),
3330
- phoneNumber: import_zod12.z.string(),
3331
- alternativePhoneNumber: import_zod12.z.string().nullable().optional(),
3332
- website: import_zod12.z.string().nullable().optional()
3329
+
3330
+ // src/validations/clinic.schema.ts
3331
+ var clinicContactInfoSchema = import_zod13.z.object({
3332
+ email: import_zod13.z.string().email(),
3333
+ phoneNumber: import_zod13.z.string(),
3334
+ alternativePhoneNumber: import_zod13.z.string().nullable().optional(),
3335
+ website: import_zod13.z.string().nullable().optional()
3333
3336
  });
3334
- var clinicLocationSchema = import_zod12.z.object({
3335
- address: import_zod12.z.string(),
3336
- city: import_zod12.z.string(),
3337
- country: import_zod12.z.string(),
3338
- postalCode: import_zod12.z.string(),
3339
- latitude: import_zod12.z.number().min(-90).max(90),
3340
- longitude: import_zod12.z.number().min(-180).max(180),
3341
- geohash: import_zod12.z.string().nullable().optional()
3337
+ var clinicLocationSchema = import_zod13.z.object({
3338
+ address: import_zod13.z.string(),
3339
+ city: import_zod13.z.string(),
3340
+ country: import_zod13.z.string(),
3341
+ postalCode: import_zod13.z.string(),
3342
+ latitude: import_zod13.z.number().min(-90).max(90),
3343
+ longitude: import_zod13.z.number().min(-180).max(180),
3344
+ geohash: import_zod13.z.string().nullable().optional()
3342
3345
  });
3343
- var workingHoursTimeSchema = import_zod12.z.object({
3344
- open: import_zod12.z.string(),
3345
- close: import_zod12.z.string(),
3346
- breaks: import_zod12.z.array(
3347
- import_zod12.z.object({
3348
- start: import_zod12.z.string(),
3349
- end: import_zod12.z.string()
3346
+ var workingHoursTimeSchema = import_zod13.z.object({
3347
+ open: import_zod13.z.string(),
3348
+ close: import_zod13.z.string(),
3349
+ breaks: import_zod13.z.array(
3350
+ import_zod13.z.object({
3351
+ start: import_zod13.z.string(),
3352
+ end: import_zod13.z.string()
3350
3353
  })
3351
3354
  ).optional()
3352
3355
  });
3353
- var workingHoursSchema = import_zod12.z.object({
3356
+ var workingHoursSchema = import_zod13.z.object({
3354
3357
  monday: workingHoursTimeSchema.nullable(),
3355
3358
  tuesday: workingHoursTimeSchema.nullable(),
3356
3359
  wednesday: workingHoursTimeSchema.nullable(),
@@ -3359,239 +3362,255 @@ var workingHoursSchema = import_zod12.z.object({
3359
3362
  saturday: workingHoursTimeSchema.nullable(),
3360
3363
  sunday: workingHoursTimeSchema.nullable()
3361
3364
  });
3362
- var clinicTagsSchema = import_zod12.z.object({
3363
- tags: import_zod12.z.array(import_zod12.z.nativeEnum(ClinicTag))
3365
+ var clinicTagsSchema = import_zod13.z.object({
3366
+ tags: import_zod13.z.array(import_zod13.z.nativeEnum(ClinicTag))
3364
3367
  });
3365
- var contactPersonSchema = import_zod12.z.object({
3366
- firstName: import_zod12.z.string(),
3367
- lastName: import_zod12.z.string(),
3368
- title: import_zod12.z.string().nullable().optional(),
3369
- email: import_zod12.z.string().email(),
3370
- phoneNumber: import_zod12.z.string().nullable().optional()
3368
+ var contactPersonSchema = import_zod13.z.object({
3369
+ firstName: import_zod13.z.string(),
3370
+ lastName: import_zod13.z.string(),
3371
+ title: import_zod13.z.string().nullable().optional(),
3372
+ email: import_zod13.z.string().email(),
3373
+ phoneNumber: import_zod13.z.string().nullable().optional()
3371
3374
  });
3372
- var adminInfoSchema = import_zod12.z.object({
3373
- id: import_zod12.z.string(),
3374
- name: import_zod12.z.string(),
3375
- email: import_zod12.z.string().email()
3375
+ var adminInfoSchema = import_zod13.z.object({
3376
+ id: import_zod13.z.string(),
3377
+ name: import_zod13.z.string(),
3378
+ email: import_zod13.z.string().email()
3376
3379
  });
3377
- var clinicAdminSchema = import_zod12.z.object({
3378
- id: import_zod12.z.string(),
3379
- userRef: import_zod12.z.string(),
3380
- clinicGroupId: import_zod12.z.string(),
3381
- isGroupOwner: import_zod12.z.boolean(),
3382
- clinicsManaged: import_zod12.z.array(import_zod12.z.string()),
3383
- clinicsManagedInfo: import_zod12.z.array(clinicInfoSchema),
3380
+ var clinicAdminSchema = import_zod13.z.object({
3381
+ id: import_zod13.z.string(),
3382
+ userRef: import_zod13.z.string(),
3383
+ clinicGroupId: import_zod13.z.string(),
3384
+ isGroupOwner: import_zod13.z.boolean(),
3385
+ clinicsManaged: import_zod13.z.array(import_zod13.z.string()),
3386
+ clinicsManagedInfo: import_zod13.z.array(clinicInfoSchema),
3384
3387
  contactInfo: contactPersonSchema,
3385
- roleTitle: import_zod12.z.string(),
3386
- createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore13.Timestamp)),
3387
- updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore13.Timestamp)),
3388
- isActive: import_zod12.z.boolean()
3388
+ roleTitle: import_zod13.z.string(),
3389
+ createdAt: import_zod13.z.instanceof(Date).or(import_zod13.z.instanceof(import_firestore13.Timestamp)),
3390
+ updatedAt: import_zod13.z.instanceof(Date).or(import_zod13.z.instanceof(import_firestore13.Timestamp)),
3391
+ isActive: import_zod13.z.boolean()
3389
3392
  });
3390
- var adminTokenSchema = import_zod12.z.object({
3391
- id: import_zod12.z.string(),
3392
- token: import_zod12.z.string(),
3393
- email: import_zod12.z.string().email().optional().nullable(),
3394
- status: import_zod12.z.nativeEnum(AdminTokenStatus),
3395
- usedByUserRef: import_zod12.z.string().optional(),
3396
- createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore13.Timestamp)),
3393
+ var adminTokenSchema = import_zod13.z.object({
3394
+ id: import_zod13.z.string(),
3395
+ token: import_zod13.z.string(),
3396
+ email: import_zod13.z.string().email().optional().nullable(),
3397
+ status: import_zod13.z.nativeEnum(AdminTokenStatus),
3398
+ usedByUserRef: import_zod13.z.string().optional(),
3399
+ createdAt: import_zod13.z.instanceof(Date).or(import_zod13.z.instanceof(import_firestore13.Timestamp)),
3397
3400
  // Timestamp
3398
- expiresAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore13.Timestamp))
3401
+ expiresAt: import_zod13.z.instanceof(Date).or(import_zod13.z.instanceof(import_firestore13.Timestamp))
3399
3402
  // Timestamp
3400
3403
  });
3401
- var createAdminTokenSchema = import_zod12.z.object({
3402
- expiresInDays: import_zod12.z.number().min(1).max(30).optional(),
3403
- email: import_zod12.z.string().email().optional().nullable()
3404
+ var createAdminTokenSchema = import_zod13.z.object({
3405
+ expiresInDays: import_zod13.z.number().min(1).max(30).optional(),
3406
+ email: import_zod13.z.string().email().optional().nullable()
3404
3407
  });
3405
- var clinicGroupSchema = import_zod12.z.object({
3406
- id: import_zod12.z.string(),
3407
- name: import_zod12.z.string(),
3408
- description: import_zod12.z.string().nullable().optional(),
3408
+ var clinicGroupSchema = import_zod13.z.object({
3409
+ id: import_zod13.z.string(),
3410
+ name: import_zod13.z.string(),
3411
+ description: import_zod13.z.string().nullable().optional(),
3409
3412
  hqLocation: clinicLocationSchema,
3410
3413
  contactInfo: clinicContactInfoSchema,
3411
3414
  contactPerson: contactPersonSchema,
3412
- clinics: import_zod12.z.array(import_zod12.z.string()),
3413
- clinicsInfo: import_zod12.z.array(clinicInfoSchema),
3414
- admins: import_zod12.z.array(import_zod12.z.string()),
3415
- adminsInfo: import_zod12.z.array(adminInfoSchema),
3416
- adminTokens: import_zod12.z.array(adminTokenSchema),
3417
- ownerId: import_zod12.z.string().nullable(),
3418
- createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore13.Timestamp)),
3415
+ clinics: import_zod13.z.array(import_zod13.z.string()),
3416
+ clinicsInfo: import_zod13.z.array(clinicInfoSchema),
3417
+ admins: import_zod13.z.array(import_zod13.z.string()),
3418
+ adminsInfo: import_zod13.z.array(adminInfoSchema),
3419
+ adminTokens: import_zod13.z.array(adminTokenSchema),
3420
+ ownerId: import_zod13.z.string().nullable(),
3421
+ createdAt: import_zod13.z.instanceof(Date).or(import_zod13.z.instanceof(import_firestore13.Timestamp)),
3419
3422
  // Timestamp
3420
- updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore13.Timestamp)),
3423
+ updatedAt: import_zod13.z.instanceof(Date).or(import_zod13.z.instanceof(import_firestore13.Timestamp)),
3421
3424
  // Timestamp
3422
- isActive: import_zod12.z.boolean(),
3425
+ isActive: import_zod13.z.boolean(),
3423
3426
  logo: mediaResourceSchema.optional().nullable(),
3424
- practiceType: import_zod12.z.nativeEnum(PracticeType).optional(),
3425
- languages: import_zod12.z.array(import_zod12.z.nativeEnum(Language)).optional(),
3426
- subscriptionModel: import_zod12.z.nativeEnum(SubscriptionModel),
3427
- calendarSyncEnabled: import_zod12.z.boolean().optional(),
3428
- autoConfirmAppointments: import_zod12.z.boolean().optional(),
3429
- businessIdentificationNumber: import_zod12.z.string().optional().nullable()
3427
+ practiceType: import_zod13.z.nativeEnum(PracticeType).optional(),
3428
+ languages: import_zod13.z.array(import_zod13.z.nativeEnum(Language)).optional(),
3429
+ subscriptionModel: import_zod13.z.nativeEnum(SubscriptionModel),
3430
+ calendarSyncEnabled: import_zod13.z.boolean().optional(),
3431
+ autoConfirmAppointments: import_zod13.z.boolean().optional(),
3432
+ businessIdentificationNumber: import_zod13.z.string().optional().nullable(),
3433
+ onboarding: import_zod13.z.object({
3434
+ completed: import_zod13.z.boolean().optional().default(false),
3435
+ step: import_zod13.z.number().optional().default(1)
3436
+ }).optional()
3430
3437
  });
3431
- var clinicSchema = import_zod12.z.object({
3432
- id: import_zod12.z.string(),
3433
- clinicGroupId: import_zod12.z.string(),
3434
- name: import_zod12.z.string(),
3435
- description: import_zod12.z.string().nullable().optional(),
3438
+ var clinicSchema = import_zod13.z.object({
3439
+ id: import_zod13.z.string(),
3440
+ clinicGroupId: import_zod13.z.string(),
3441
+ name: import_zod13.z.string(),
3442
+ description: import_zod13.z.string().nullable().optional(),
3436
3443
  location: clinicLocationSchema,
3437
3444
  contactInfo: clinicContactInfoSchema,
3438
3445
  workingHours: workingHoursSchema,
3439
- tags: import_zod12.z.array(import_zod12.z.nativeEnum(ClinicTag)),
3440
- featuredPhotos: import_zod12.z.array(mediaResourceSchema),
3446
+ tags: import_zod13.z.array(import_zod13.z.nativeEnum(ClinicTag)),
3447
+ featuredPhotos: import_zod13.z.array(mediaResourceSchema),
3441
3448
  coverPhoto: mediaResourceSchema.nullable(),
3442
- photosWithTags: import_zod12.z.array(
3443
- import_zod12.z.object({
3449
+ photosWithTags: import_zod13.z.array(
3450
+ import_zod13.z.object({
3444
3451
  url: mediaResourceSchema,
3445
- tag: import_zod12.z.string()
3452
+ tag: import_zod13.z.string()
3446
3453
  })
3447
3454
  ).optional(),
3448
- doctors: import_zod12.z.array(import_zod12.z.string()),
3455
+ doctors: import_zod13.z.array(import_zod13.z.string()),
3449
3456
  // List of practitioner IDs
3450
- doctorsInfo: import_zod12.z.array(doctorInfoSchema),
3457
+ doctorsInfo: import_zod13.z.array(doctorInfoSchema),
3451
3458
  // Aggregated doctor info
3452
- procedures: import_zod12.z.array(import_zod12.z.string()),
3459
+ procedures: import_zod13.z.array(import_zod13.z.string()),
3453
3460
  // List of procedure IDs offered by clinic
3454
- proceduresInfo: import_zod12.z.array(procedureSummaryInfoSchema),
3461
+ proceduresInfo: import_zod13.z.array(procedureSummaryInfoSchema),
3455
3462
  // Use the correct schema for aggregated procedure info
3456
3463
  reviewInfo: clinicReviewInfoSchema,
3457
- admins: import_zod12.z.array(import_zod12.z.string()),
3458
- createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore13.Timestamp)),
3464
+ admins: import_zod13.z.array(import_zod13.z.string()),
3465
+ createdAt: import_zod13.z.instanceof(Date).or(import_zod13.z.instanceof(import_firestore13.Timestamp)),
3459
3466
  // Timestamp
3460
- updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore13.Timestamp)),
3467
+ updatedAt: import_zod13.z.instanceof(Date).or(import_zod13.z.instanceof(import_firestore13.Timestamp)),
3461
3468
  // Timestamp
3462
- isActive: import_zod12.z.boolean(),
3463
- isVerified: import_zod12.z.boolean(),
3469
+ isActive: import_zod13.z.boolean(),
3470
+ isVerified: import_zod13.z.boolean(),
3464
3471
  logo: mediaResourceSchema.optional().nullable()
3465
3472
  });
3466
- var createClinicAdminSchema = import_zod12.z.object({
3467
- userRef: import_zod12.z.string(),
3468
- clinicGroupId: import_zod12.z.string().optional(),
3469
- isGroupOwner: import_zod12.z.boolean(),
3470
- clinicsManaged: import_zod12.z.array(import_zod12.z.string()),
3473
+ var createClinicAdminSchema = import_zod13.z.object({
3474
+ userRef: import_zod13.z.string(),
3475
+ clinicGroupId: import_zod13.z.string().optional(),
3476
+ isGroupOwner: import_zod13.z.boolean(),
3477
+ clinicsManaged: import_zod13.z.array(import_zod13.z.string()),
3471
3478
  contactInfo: contactPersonSchema,
3472
- roleTitle: import_zod12.z.string(),
3473
- isActive: import_zod12.z.boolean()
3479
+ roleTitle: import_zod13.z.string(),
3480
+ isActive: import_zod13.z.boolean()
3474
3481
  // clinicsManagedInfo is aggregated, not provided on creation
3475
3482
  });
3476
- var createClinicGroupSchema = import_zod12.z.object({
3477
- name: import_zod12.z.string(),
3478
- description: import_zod12.z.string().optional(),
3483
+ var createClinicGroupSchema = import_zod13.z.object({
3484
+ name: import_zod13.z.string(),
3485
+ description: import_zod13.z.string().optional(),
3479
3486
  hqLocation: clinicLocationSchema,
3480
3487
  contactInfo: clinicContactInfoSchema,
3481
3488
  contactPerson: contactPersonSchema,
3482
- ownerId: import_zod12.z.string().nullable(),
3483
- isActive: import_zod12.z.boolean(),
3489
+ ownerId: import_zod13.z.string().nullable(),
3490
+ isActive: import_zod13.z.boolean(),
3484
3491
  logo: mediaResourceSchema.optional().nullable(),
3485
- practiceType: import_zod12.z.nativeEnum(PracticeType).optional(),
3486
- languages: import_zod12.z.array(import_zod12.z.nativeEnum(Language)).optional(),
3487
- subscriptionModel: import_zod12.z.nativeEnum(SubscriptionModel).optional().default("no_subscription" /* NO_SUBSCRIPTION */),
3488
- calendarSyncEnabled: import_zod12.z.boolean().optional(),
3489
- autoConfirmAppointments: import_zod12.z.boolean().optional(),
3490
- businessIdentificationNumber: import_zod12.z.string().optional().nullable()
3492
+ practiceType: import_zod13.z.nativeEnum(PracticeType).optional(),
3493
+ languages: import_zod13.z.array(import_zod13.z.nativeEnum(Language)).optional(),
3494
+ subscriptionModel: import_zod13.z.nativeEnum(SubscriptionModel).optional().default("no_subscription" /* NO_SUBSCRIPTION */),
3495
+ calendarSyncEnabled: import_zod13.z.boolean().optional(),
3496
+ autoConfirmAppointments: import_zod13.z.boolean().optional(),
3497
+ businessIdentificationNumber: import_zod13.z.string().optional().nullable(),
3498
+ onboarding: import_zod13.z.object({
3499
+ completed: import_zod13.z.boolean().optional().default(false),
3500
+ step: import_zod13.z.number().optional().default(1)
3501
+ }).optional()
3491
3502
  // clinics, clinicsInfo, admins, adminsInfo, adminTokens are managed internally
3492
3503
  });
3493
- var createClinicSchema = import_zod12.z.object({
3494
- clinicGroupId: import_zod12.z.string(),
3495
- name: import_zod12.z.string(),
3496
- description: import_zod12.z.string().optional(),
3504
+ var createClinicSchema = import_zod13.z.object({
3505
+ clinicGroupId: import_zod13.z.string(),
3506
+ name: import_zod13.z.string(),
3507
+ description: import_zod13.z.string().optional(),
3497
3508
  location: clinicLocationSchema,
3498
3509
  contactInfo: clinicContactInfoSchema,
3499
3510
  workingHours: workingHoursSchema,
3500
- tags: import_zod12.z.array(import_zod12.z.nativeEnum(ClinicTag)),
3511
+ tags: import_zod13.z.array(import_zod13.z.nativeEnum(ClinicTag)),
3501
3512
  coverPhoto: mediaResourceSchema.nullable().optional(),
3502
- photosWithTags: import_zod12.z.array(
3503
- import_zod12.z.object({
3513
+ photosWithTags: import_zod13.z.array(
3514
+ import_zod13.z.object({
3504
3515
  url: mediaResourceSchema,
3505
- tag: import_zod12.z.string()
3516
+ tag: import_zod13.z.string()
3506
3517
  })
3507
3518
  ).optional(),
3508
- doctors: import_zod12.z.array(import_zod12.z.string()).optional().default([]),
3509
- procedures: import_zod12.z.array(import_zod12.z.string()).optional().default([]),
3510
- proceduresInfo: import_zod12.z.array(procedureSummaryInfoSchema).optional(),
3511
- admins: import_zod12.z.array(import_zod12.z.string()),
3512
- isActive: import_zod12.z.boolean().optional().default(true),
3513
- isVerified: import_zod12.z.boolean().optional().default(false),
3519
+ doctors: import_zod13.z.array(import_zod13.z.string()).optional().default([]),
3520
+ procedures: import_zod13.z.array(import_zod13.z.string()).optional().default([]),
3521
+ proceduresInfo: import_zod13.z.array(procedureSummaryInfoSchema).optional(),
3522
+ admins: import_zod13.z.array(import_zod13.z.string()),
3523
+ isActive: import_zod13.z.boolean().optional().default(true),
3524
+ isVerified: import_zod13.z.boolean().optional().default(false),
3514
3525
  logo: mediaResourceSchema.optional().nullable(),
3515
- featuredPhotos: import_zod12.z.array(mediaResourceSchema).optional().default([])
3526
+ featuredPhotos: import_zod13.z.array(mediaResourceSchema).optional().default([])
3516
3527
  });
3517
- var createDefaultClinicGroupSchema = import_zod12.z.object({
3518
- name: import_zod12.z.string(),
3519
- ownerId: import_zod12.z.string().nullable(),
3528
+ var createDefaultClinicGroupSchema = import_zod13.z.object({
3529
+ name: import_zod13.z.string(),
3530
+ ownerId: import_zod13.z.string().nullable(),
3520
3531
  contactPerson: contactPersonSchema,
3521
3532
  contactInfo: clinicContactInfoSchema,
3522
3533
  hqLocation: clinicLocationSchema,
3523
- isActive: import_zod12.z.boolean(),
3534
+ isActive: import_zod13.z.boolean(),
3524
3535
  logo: mediaResourceSchema.optional().nullable(),
3525
- practiceType: import_zod12.z.nativeEnum(PracticeType).optional(),
3526
- languages: import_zod12.z.array(import_zod12.z.nativeEnum(Language)).optional(),
3527
- subscriptionModel: import_zod12.z.nativeEnum(SubscriptionModel).optional().default("no_subscription" /* NO_SUBSCRIPTION */)
3536
+ practiceType: import_zod13.z.nativeEnum(PracticeType).optional(),
3537
+ languages: import_zod13.z.array(import_zod13.z.nativeEnum(Language)).optional(),
3538
+ subscriptionModel: import_zod13.z.nativeEnum(SubscriptionModel).optional().default("no_subscription" /* NO_SUBSCRIPTION */),
3539
+ onboarding: import_zod13.z.object({
3540
+ completed: import_zod13.z.boolean().optional().default(false),
3541
+ step: import_zod13.z.number().optional().default(1)
3542
+ }).optional()
3528
3543
  });
3529
- var clinicAdminSignupSchema = import_zod12.z.object({
3530
- email: import_zod12.z.string().email(),
3531
- password: import_zod12.z.string().min(8),
3532
- firstName: import_zod12.z.string(),
3533
- lastName: import_zod12.z.string(),
3534
- title: import_zod12.z.string(),
3535
- phoneNumber: import_zod12.z.string(),
3536
- isCreatingNewGroup: import_zod12.z.boolean(),
3537
- inviteToken: import_zod12.z.string().optional(),
3538
- clinicGroupData: import_zod12.z.object({
3539
- name: import_zod12.z.string(),
3544
+ var clinicAdminSignupSchema = import_zod13.z.object({
3545
+ email: import_zod13.z.string().email(),
3546
+ password: import_zod13.z.string().min(8),
3547
+ firstName: import_zod13.z.string(),
3548
+ lastName: import_zod13.z.string(),
3549
+ title: import_zod13.z.string(),
3550
+ phoneNumber: import_zod13.z.string(),
3551
+ isCreatingNewGroup: import_zod13.z.boolean(),
3552
+ inviteToken: import_zod13.z.string().optional(),
3553
+ clinicGroupData: import_zod13.z.object({
3554
+ name: import_zod13.z.string(),
3540
3555
  hqLocation: clinicLocationSchema,
3541
3556
  logo: mediaResourceSchema.optional(),
3542
3557
  contactInfo: clinicContactInfoSchema,
3543
- subscriptionModel: import_zod12.z.nativeEnum(SubscriptionModel).optional().default("no_subscription" /* NO_SUBSCRIPTION */)
3558
+ subscriptionModel: import_zod13.z.nativeEnum(SubscriptionModel).optional().default("no_subscription" /* NO_SUBSCRIPTION */)
3544
3559
  }).optional()
3545
3560
  });
3546
- var clinicGroupSetupSchema = import_zod12.z.object({
3547
- languages: import_zod12.z.array(import_zod12.z.nativeEnum(Language)),
3548
- practiceType: import_zod12.z.nativeEnum(PracticeType),
3549
- description: import_zod12.z.string(),
3561
+ var clinicGroupSetupSchema = import_zod13.z.object({
3562
+ languages: import_zod13.z.array(import_zod13.z.nativeEnum(Language)),
3563
+ practiceType: import_zod13.z.nativeEnum(PracticeType),
3564
+ description: import_zod13.z.string(),
3550
3565
  logo: mediaResourceSchema,
3551
- calendarSyncEnabled: import_zod12.z.boolean(),
3552
- autoConfirmAppointments: import_zod12.z.boolean(),
3553
- businessIdentificationNumber: import_zod12.z.string().optional().nullable()
3566
+ calendarSyncEnabled: import_zod13.z.boolean(),
3567
+ autoConfirmAppointments: import_zod13.z.boolean(),
3568
+ businessIdentificationNumber: import_zod13.z.string().optional().nullable(),
3569
+ onboarding: import_zod13.z.object({
3570
+ completed: import_zod13.z.boolean().optional().default(false),
3571
+ step: import_zod13.z.number().optional().default(1)
3572
+ }).optional()
3554
3573
  });
3555
- var clinicBranchSetupSchema = import_zod12.z.object({
3556
- name: import_zod12.z.string(),
3574
+ var clinicBranchSetupSchema = import_zod13.z.object({
3575
+ name: import_zod13.z.string(),
3557
3576
  location: clinicLocationSchema,
3558
- description: import_zod12.z.string().optional(),
3577
+ description: import_zod13.z.string().optional(),
3559
3578
  contactInfo: clinicContactInfoSchema,
3560
3579
  workingHours: workingHoursSchema,
3561
- tags: import_zod12.z.array(import_zod12.z.nativeEnum(ClinicTag)),
3580
+ tags: import_zod13.z.array(import_zod13.z.nativeEnum(ClinicTag)),
3562
3581
  logo: mediaResourceSchema.optional(),
3563
3582
  coverPhoto: mediaResourceSchema.nullable().optional(),
3564
- photosWithTags: import_zod12.z.array(
3565
- import_zod12.z.object({
3583
+ photosWithTags: import_zod13.z.array(
3584
+ import_zod13.z.object({
3566
3585
  url: mediaResourceSchema,
3567
- tag: import_zod12.z.string()
3586
+ tag: import_zod13.z.string()
3568
3587
  })
3569
3588
  ).optional(),
3570
- featuredPhotos: import_zod12.z.array(mediaResourceSchema).optional()
3589
+ featuredPhotos: import_zod13.z.array(mediaResourceSchema).optional()
3571
3590
  });
3572
3591
  var updateClinicAdminSchema = createClinicAdminSchema.partial();
3573
3592
  var updateClinicGroupSchema = createClinicGroupSchema.partial();
3574
- var updateClinicSchema = import_zod12.z.object({
3575
- name: import_zod12.z.string().optional(),
3576
- description: import_zod12.z.string().optional(),
3593
+ var updateClinicSchema = import_zod13.z.object({
3594
+ name: import_zod13.z.string().optional(),
3595
+ description: import_zod13.z.string().optional(),
3577
3596
  location: clinicLocationSchema.optional(),
3578
3597
  contactInfo: clinicContactInfoSchema.optional(),
3579
3598
  workingHours: workingHoursSchema.optional(),
3580
- tags: import_zod12.z.array(import_zod12.z.nativeEnum(ClinicTag)).optional(),
3599
+ tags: import_zod13.z.array(import_zod13.z.nativeEnum(ClinicTag)).optional(),
3581
3600
  coverPhoto: mediaResourceSchema.nullable().optional(),
3582
- photosWithTags: import_zod12.z.array(
3583
- import_zod12.z.object({
3601
+ photosWithTags: import_zod13.z.array(
3602
+ import_zod13.z.object({
3584
3603
  url: mediaResourceSchema,
3585
- tag: import_zod12.z.string()
3604
+ tag: import_zod13.z.string()
3586
3605
  })
3587
3606
  ).optional(),
3588
- doctors: import_zod12.z.array(import_zod12.z.string()).optional(),
3589
- procedures: import_zod12.z.array(import_zod12.z.string()).optional(),
3590
- proceduresInfo: import_zod12.z.array(procedureSummaryInfoSchema).optional(),
3591
- isActive: import_zod12.z.boolean().optional(),
3592
- isVerified: import_zod12.z.boolean().optional(),
3607
+ doctors: import_zod13.z.array(import_zod13.z.string()).optional(),
3608
+ procedures: import_zod13.z.array(import_zod13.z.string()).optional(),
3609
+ proceduresInfo: import_zod13.z.array(procedureSummaryInfoSchema).optional(),
3610
+ isActive: import_zod13.z.boolean().optional(),
3611
+ isVerified: import_zod13.z.boolean().optional(),
3593
3612
  logo: mediaResourceSchema.optional().nullable(),
3594
- featuredPhotos: import_zod12.z.array(mediaResourceSchema).optional()
3613
+ featuredPhotos: import_zod13.z.array(mediaResourceSchema).optional()
3595
3614
  });
3596
3615
 
3597
3616
  // src/services/clinic/utils/admin.utils.ts
@@ -4044,7 +4063,7 @@ var ClinicAdminService = class extends BaseService {
4044
4063
  var import_firestore16 = require("firebase/firestore");
4045
4064
 
4046
4065
  // src/validations/practitioner.schema.ts
4047
- var import_zod13 = require("zod");
4066
+ var import_zod14 = require("zod");
4048
4067
  var import_firestore15 = require("firebase/firestore");
4049
4068
 
4050
4069
  // src/backoffice/types/static/certification.types.ts
@@ -4072,34 +4091,34 @@ var CertificationSpecialty = /* @__PURE__ */ ((CertificationSpecialty3) => {
4072
4091
  })(CertificationSpecialty || {});
4073
4092
 
4074
4093
  // src/validations/practitioner.schema.ts
4075
- var practitionerBasicInfoSchema = import_zod13.z.object({
4076
- firstName: import_zod13.z.string().min(2).max(50),
4077
- lastName: import_zod13.z.string().min(2).max(50),
4078
- title: import_zod13.z.string().min(2).max(100),
4079
- email: import_zod13.z.string().email(),
4080
- phoneNumber: import_zod13.z.string().regex(/^\+?[1-9]\d{1,14}$/, "Invalid phone number"),
4081
- dateOfBirth: import_zod13.z.instanceof(import_firestore15.Timestamp).or(import_zod13.z.date()),
4082
- gender: import_zod13.z.enum(["male", "female", "other"]),
4083
- profileImageUrl: import_zod13.z.string().url().optional(),
4084
- bio: import_zod13.z.string().max(1e3).optional(),
4085
- languages: import_zod13.z.array(import_zod13.z.string()).min(1)
4094
+ var practitionerBasicInfoSchema = import_zod14.z.object({
4095
+ firstName: import_zod14.z.string().min(2).max(50),
4096
+ lastName: import_zod14.z.string().min(2).max(50),
4097
+ title: import_zod14.z.string().min(2).max(100),
4098
+ email: import_zod14.z.string().email(),
4099
+ phoneNumber: import_zod14.z.string().regex(/^\+?[1-9]\d{1,14}$/, "Invalid phone number"),
4100
+ dateOfBirth: import_zod14.z.instanceof(import_firestore15.Timestamp).or(import_zod14.z.date()),
4101
+ gender: import_zod14.z.enum(["male", "female", "other"]),
4102
+ profileImageUrl: import_zod14.z.string().url().optional(),
4103
+ bio: import_zod14.z.string().max(1e3).optional(),
4104
+ languages: import_zod14.z.array(import_zod14.z.string()).min(1)
4086
4105
  });
4087
- var practitionerCertificationSchema = import_zod13.z.object({
4088
- level: import_zod13.z.nativeEnum(CertificationLevel),
4089
- specialties: import_zod13.z.array(import_zod13.z.nativeEnum(CertificationSpecialty)),
4090
- licenseNumber: import_zod13.z.string().min(3).max(50),
4091
- issuingAuthority: import_zod13.z.string().min(2).max(100),
4092
- issueDate: import_zod13.z.instanceof(import_firestore15.Timestamp).or(import_zod13.z.date()),
4093
- expiryDate: import_zod13.z.instanceof(import_firestore15.Timestamp).or(import_zod13.z.date()).optional(),
4094
- verificationStatus: import_zod13.z.enum(["pending", "verified", "rejected"])
4106
+ var practitionerCertificationSchema = import_zod14.z.object({
4107
+ level: import_zod14.z.nativeEnum(CertificationLevel),
4108
+ specialties: import_zod14.z.array(import_zod14.z.nativeEnum(CertificationSpecialty)),
4109
+ licenseNumber: import_zod14.z.string().min(3).max(50),
4110
+ issuingAuthority: import_zod14.z.string().min(2).max(100),
4111
+ issueDate: import_zod14.z.instanceof(import_firestore15.Timestamp).or(import_zod14.z.date()),
4112
+ expiryDate: import_zod14.z.instanceof(import_firestore15.Timestamp).or(import_zod14.z.date()).optional(),
4113
+ verificationStatus: import_zod14.z.enum(["pending", "verified", "rejected"])
4095
4114
  });
4096
- var timeSlotSchema = import_zod13.z.object({
4097
- start: import_zod13.z.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/, "Invalid time format"),
4098
- end: import_zod13.z.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/, "Invalid time format")
4115
+ var timeSlotSchema = import_zod14.z.object({
4116
+ start: import_zod14.z.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/, "Invalid time format"),
4117
+ end: import_zod14.z.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/, "Invalid time format")
4099
4118
  }).nullable();
4100
- var practitionerWorkingHoursSchema = import_zod13.z.object({
4101
- practitionerId: import_zod13.z.string().min(1),
4102
- clinicId: import_zod13.z.string().min(1),
4119
+ var practitionerWorkingHoursSchema = import_zod14.z.object({
4120
+ practitionerId: import_zod14.z.string().min(1),
4121
+ clinicId: import_zod14.z.string().min(1),
4103
4122
  monday: timeSlotSchema,
4104
4123
  tuesday: timeSlotSchema,
4105
4124
  wednesday: timeSlotSchema,
@@ -4107,12 +4126,12 @@ var practitionerWorkingHoursSchema = import_zod13.z.object({
4107
4126
  friday: timeSlotSchema,
4108
4127
  saturday: timeSlotSchema,
4109
4128
  sunday: timeSlotSchema,
4110
- createdAt: import_zod13.z.instanceof(import_firestore15.Timestamp).or(import_zod13.z.date()),
4111
- updatedAt: import_zod13.z.instanceof(import_firestore15.Timestamp).or(import_zod13.z.date())
4129
+ createdAt: import_zod14.z.instanceof(import_firestore15.Timestamp).or(import_zod14.z.date()),
4130
+ updatedAt: import_zod14.z.instanceof(import_firestore15.Timestamp).or(import_zod14.z.date())
4112
4131
  });
4113
- var practitionerClinicWorkingHoursSchema = import_zod13.z.object({
4114
- clinicId: import_zod13.z.string().min(1),
4115
- workingHours: import_zod13.z.object({
4132
+ var practitionerClinicWorkingHoursSchema = import_zod14.z.object({
4133
+ clinicId: import_zod14.z.string().min(1),
4134
+ workingHours: import_zod14.z.object({
4116
4135
  monday: timeSlotSchema,
4117
4136
  tuesday: timeSlotSchema,
4118
4137
  wednesday: timeSlotSchema,
@@ -4121,87 +4140,87 @@ var practitionerClinicWorkingHoursSchema = import_zod13.z.object({
4121
4140
  saturday: timeSlotSchema,
4122
4141
  sunday: timeSlotSchema
4123
4142
  }),
4124
- isActive: import_zod13.z.boolean(),
4125
- createdAt: import_zod13.z.instanceof(import_firestore15.Timestamp).or(import_zod13.z.date()),
4126
- updatedAt: import_zod13.z.instanceof(import_firestore15.Timestamp).or(import_zod13.z.date())
4143
+ isActive: import_zod14.z.boolean(),
4144
+ createdAt: import_zod14.z.instanceof(import_firestore15.Timestamp).or(import_zod14.z.date()),
4145
+ updatedAt: import_zod14.z.instanceof(import_firestore15.Timestamp).or(import_zod14.z.date())
4127
4146
  });
4128
- var practitionerSchema = import_zod13.z.object({
4129
- id: import_zod13.z.string().min(1),
4130
- userRef: import_zod13.z.string().min(1),
4147
+ var practitionerSchema = import_zod14.z.object({
4148
+ id: import_zod14.z.string().min(1),
4149
+ userRef: import_zod14.z.string().min(1),
4131
4150
  basicInfo: practitionerBasicInfoSchema,
4132
4151
  certification: practitionerCertificationSchema,
4133
- clinics: import_zod13.z.array(import_zod13.z.string()),
4134
- clinicWorkingHours: import_zod13.z.array(practitionerClinicWorkingHoursSchema),
4135
- clinicsInfo: import_zod13.z.array(clinicInfoSchema),
4136
- procedures: import_zod13.z.array(import_zod13.z.string()),
4137
- proceduresInfo: import_zod13.z.array(procedureSummaryInfoSchema),
4152
+ clinics: import_zod14.z.array(import_zod14.z.string()),
4153
+ clinicWorkingHours: import_zod14.z.array(practitionerClinicWorkingHoursSchema),
4154
+ clinicsInfo: import_zod14.z.array(clinicInfoSchema),
4155
+ procedures: import_zod14.z.array(import_zod14.z.string()),
4156
+ proceduresInfo: import_zod14.z.array(procedureSummaryInfoSchema),
4138
4157
  reviewInfo: practitionerReviewInfoSchema,
4139
- isActive: import_zod13.z.boolean(),
4140
- isVerified: import_zod13.z.boolean(),
4141
- status: import_zod13.z.nativeEnum(PractitionerStatus),
4142
- createdAt: import_zod13.z.instanceof(import_firestore15.Timestamp).or(import_zod13.z.date()),
4143
- updatedAt: import_zod13.z.instanceof(import_firestore15.Timestamp).or(import_zod13.z.date())
4158
+ isActive: import_zod14.z.boolean(),
4159
+ isVerified: import_zod14.z.boolean(),
4160
+ status: import_zod14.z.nativeEnum(PractitionerStatus),
4161
+ createdAt: import_zod14.z.instanceof(import_firestore15.Timestamp).or(import_zod14.z.date()),
4162
+ updatedAt: import_zod14.z.instanceof(import_firestore15.Timestamp).or(import_zod14.z.date())
4144
4163
  });
4145
- var createPractitionerSchema = import_zod13.z.object({
4146
- userRef: import_zod13.z.string().min(1),
4164
+ var createPractitionerSchema = import_zod14.z.object({
4165
+ userRef: import_zod14.z.string().min(1),
4147
4166
  basicInfo: practitionerBasicInfoSchema,
4148
4167
  certification: practitionerCertificationSchema,
4149
- clinics: import_zod13.z.array(import_zod13.z.string()).optional(),
4150
- clinicWorkingHours: import_zod13.z.array(practitionerClinicWorkingHoursSchema).optional(),
4151
- clinicsInfo: import_zod13.z.array(clinicInfoSchema).optional(),
4152
- proceduresInfo: import_zod13.z.array(procedureSummaryInfoSchema).optional(),
4153
- isActive: import_zod13.z.boolean(),
4154
- isVerified: import_zod13.z.boolean(),
4155
- status: import_zod13.z.nativeEnum(PractitionerStatus).optional()
4168
+ clinics: import_zod14.z.array(import_zod14.z.string()).optional(),
4169
+ clinicWorkingHours: import_zod14.z.array(practitionerClinicWorkingHoursSchema).optional(),
4170
+ clinicsInfo: import_zod14.z.array(clinicInfoSchema).optional(),
4171
+ proceduresInfo: import_zod14.z.array(procedureSummaryInfoSchema).optional(),
4172
+ isActive: import_zod14.z.boolean(),
4173
+ isVerified: import_zod14.z.boolean(),
4174
+ status: import_zod14.z.nativeEnum(PractitionerStatus).optional()
4156
4175
  });
4157
- var createDraftPractitionerSchema = import_zod13.z.object({
4176
+ var createDraftPractitionerSchema = import_zod14.z.object({
4158
4177
  basicInfo: practitionerBasicInfoSchema,
4159
4178
  certification: practitionerCertificationSchema,
4160
- clinics: import_zod13.z.array(import_zod13.z.string()).optional(),
4161
- clinicWorkingHours: import_zod13.z.array(practitionerClinicWorkingHoursSchema).optional(),
4162
- clinicsInfo: import_zod13.z.array(clinicInfoSchema).optional(),
4163
- proceduresInfo: import_zod13.z.array(procedureSummaryInfoSchema).optional(),
4164
- isActive: import_zod13.z.boolean().optional().default(false),
4165
- isVerified: import_zod13.z.boolean().optional().default(false)
4179
+ clinics: import_zod14.z.array(import_zod14.z.string()).optional(),
4180
+ clinicWorkingHours: import_zod14.z.array(practitionerClinicWorkingHoursSchema).optional(),
4181
+ clinicsInfo: import_zod14.z.array(clinicInfoSchema).optional(),
4182
+ proceduresInfo: import_zod14.z.array(procedureSummaryInfoSchema).optional(),
4183
+ isActive: import_zod14.z.boolean().optional().default(false),
4184
+ isVerified: import_zod14.z.boolean().optional().default(false)
4166
4185
  });
4167
- var practitionerTokenSchema = import_zod13.z.object({
4168
- id: import_zod13.z.string().min(1),
4169
- token: import_zod13.z.string().min(6),
4170
- practitionerId: import_zod13.z.string().min(1),
4171
- email: import_zod13.z.string().email(),
4172
- clinicId: import_zod13.z.string().min(1),
4173
- status: import_zod13.z.nativeEnum(PractitionerTokenStatus),
4174
- createdBy: import_zod13.z.string().min(1),
4175
- createdAt: import_zod13.z.instanceof(import_firestore15.Timestamp).or(import_zod13.z.date()),
4176
- expiresAt: import_zod13.z.instanceof(import_firestore15.Timestamp).or(import_zod13.z.date()),
4177
- usedBy: import_zod13.z.string().optional(),
4178
- usedAt: import_zod13.z.instanceof(import_firestore15.Timestamp).or(import_zod13.z.date()).optional()
4186
+ var practitionerTokenSchema = import_zod14.z.object({
4187
+ id: import_zod14.z.string().min(1),
4188
+ token: import_zod14.z.string().min(6),
4189
+ practitionerId: import_zod14.z.string().min(1),
4190
+ email: import_zod14.z.string().email(),
4191
+ clinicId: import_zod14.z.string().min(1),
4192
+ status: import_zod14.z.nativeEnum(PractitionerTokenStatus),
4193
+ createdBy: import_zod14.z.string().min(1),
4194
+ createdAt: import_zod14.z.instanceof(import_firestore15.Timestamp).or(import_zod14.z.date()),
4195
+ expiresAt: import_zod14.z.instanceof(import_firestore15.Timestamp).or(import_zod14.z.date()),
4196
+ usedBy: import_zod14.z.string().optional(),
4197
+ usedAt: import_zod14.z.instanceof(import_firestore15.Timestamp).or(import_zod14.z.date()).optional()
4179
4198
  });
4180
- var createPractitionerTokenSchema = import_zod13.z.object({
4181
- practitionerId: import_zod13.z.string().min(1),
4182
- email: import_zod13.z.string().email(),
4183
- clinicId: import_zod13.z.string().min(1),
4184
- expiresAt: import_zod13.z.date().optional()
4199
+ var createPractitionerTokenSchema = import_zod14.z.object({
4200
+ practitionerId: import_zod14.z.string().min(1),
4201
+ email: import_zod14.z.string().email(),
4202
+ clinicId: import_zod14.z.string().min(1),
4203
+ expiresAt: import_zod14.z.date().optional()
4185
4204
  });
4186
- var practitionerSignupSchema = import_zod13.z.object({
4187
- email: import_zod13.z.string().email(),
4188
- password: import_zod13.z.string().min(8),
4189
- firstName: import_zod13.z.string().min(2).max(50).optional(),
4190
- lastName: import_zod13.z.string().min(2).max(50).optional(),
4191
- token: import_zod13.z.string().optional(),
4192
- profileData: import_zod13.z.object({
4193
- basicInfo: import_zod13.z.object({
4194
- phoneNumber: import_zod13.z.string().optional(),
4195
- profileImageUrl: import_zod13.z.string().optional(),
4196
- gender: import_zod13.z.enum(["male", "female", "other"]).optional(),
4197
- bio: import_zod13.z.string().optional()
4205
+ var practitionerSignupSchema = import_zod14.z.object({
4206
+ email: import_zod14.z.string().email(),
4207
+ password: import_zod14.z.string().min(8),
4208
+ firstName: import_zod14.z.string().min(2).max(50).optional(),
4209
+ lastName: import_zod14.z.string().min(2).max(50).optional(),
4210
+ token: import_zod14.z.string().optional(),
4211
+ profileData: import_zod14.z.object({
4212
+ basicInfo: import_zod14.z.object({
4213
+ phoneNumber: import_zod14.z.string().optional(),
4214
+ profileImageUrl: import_zod14.z.string().optional(),
4215
+ gender: import_zod14.z.enum(["male", "female", "other"]).optional(),
4216
+ bio: import_zod14.z.string().optional()
4198
4217
  }).optional(),
4199
- certification: import_zod13.z.any().optional()
4218
+ certification: import_zod14.z.any().optional()
4200
4219
  }).optional()
4201
4220
  });
4202
4221
 
4203
4222
  // src/services/practitioner/practitioner.service.ts
4204
- var import_zod14 = require("zod");
4223
+ var import_zod15 = require("zod");
4205
4224
  var import_geofire_common2 = require("geofire-common");
4206
4225
  var PractitionerService = class extends BaseService {
4207
4226
  constructor(db, auth, app, clinicService) {
@@ -4270,7 +4289,7 @@ var PractitionerService = class extends BaseService {
4270
4289
  }
4271
4290
  return createdPractitioner;
4272
4291
  } catch (error) {
4273
- if (error instanceof import_zod14.z.ZodError) {
4292
+ if (error instanceof import_zod15.z.ZodError) {
4274
4293
  throw new Error(`Invalid practitioner data: ${error.message}`);
4275
4294
  }
4276
4295
  console.error("Error creating practitioner:", error);
@@ -4383,7 +4402,7 @@ var PractitionerService = class extends BaseService {
4383
4402
  await (0, import_firestore16.setDoc)((0, import_firestore16.doc)(this.db, tokenPath), token);
4384
4403
  return { practitioner: savedPractitioner, token };
4385
4404
  } catch (error) {
4386
- if (error instanceof import_zod14.z.ZodError) {
4405
+ if (error instanceof import_zod15.z.ZodError) {
4387
4406
  throw new Error("Invalid practitioner data: " + error.message);
4388
4407
  }
4389
4408
  throw error;
@@ -4436,7 +4455,7 @@ var PractitionerService = class extends BaseService {
4436
4455
  await (0, import_firestore16.setDoc)((0, import_firestore16.doc)(this.db, tokenPath), token);
4437
4456
  return token;
4438
4457
  } catch (error) {
4439
- if (error instanceof import_zod14.z.ZodError) {
4458
+ if (error instanceof import_zod15.z.ZodError) {
4440
4459
  throw new Error("Invalid token data: " + error.message);
4441
4460
  }
4442
4461
  throw error;
@@ -4623,7 +4642,7 @@ var PractitionerService = class extends BaseService {
4623
4642
  }
4624
4643
  return updatedPractitioner;
4625
4644
  } catch (error) {
4626
- if (error instanceof import_zod14.z.ZodError) {
4645
+ if (error instanceof import_zod15.z.ZodError) {
4627
4646
  throw new Error(`Invalid practitioner update data: ${error.message}`);
4628
4647
  }
4629
4648
  console.error(`Error updating practitioner ${practitionerId}:`, error);
@@ -5179,7 +5198,7 @@ var UserService = class extends BaseService {
5179
5198
  });
5180
5199
  return this.getUserById(uid);
5181
5200
  } catch (error) {
5182
- if (error instanceof import_zod15.z.ZodError) {
5201
+ if (error instanceof import_zod16.z.ZodError) {
5183
5202
  throw USER_ERRORS.VALIDATION_ERROR;
5184
5203
  }
5185
5204
  throw error;
@@ -5266,7 +5285,7 @@ var UserService = class extends BaseService {
5266
5285
  // src/services/clinic/utils/clinic-group.utils.ts
5267
5286
  var import_firestore18 = require("firebase/firestore");
5268
5287
  var import_geofire_common3 = require("geofire-common");
5269
- var import_zod16 = require("zod");
5288
+ var import_zod17 = require("zod");
5270
5289
 
5271
5290
  // src/services/clinic/utils/photos.utils.ts
5272
5291
  var import_storage4 = require("firebase/storage");
@@ -5464,7 +5483,7 @@ async function createClinicGroup(db, data, ownerId, isDefault = false, clinicAdm
5464
5483
  });
5465
5484
  return groupData;
5466
5485
  } catch (error) {
5467
- if (error instanceof import_zod16.z.ZodError) {
5486
+ if (error instanceof import_zod17.z.ZodError) {
5468
5487
  console.error(
5469
5488
  "[CLINIC_GROUP] Zod validation error:",
5470
5489
  JSON.stringify(error.errors, null, 2)
@@ -5869,17 +5888,54 @@ var ClinicGroupService = class extends BaseService {
5869
5888
  // but to add them to a subcollection called adminTokens that belongs to a specific clinicGroup document
5870
5889
  // TODO: Add granular control over admin permissions, e.g. only allow admins to manage certain clinics to tokens directly
5871
5890
  // TODO: Generally refactor admin tokens and invites, also create cloud function to send invites and send updates when sombody uses the token
5891
+ /**
5892
+ * Updates the onboarding status for a clinic group
5893
+ *
5894
+ * @param groupId - The ID of the clinic group to update
5895
+ * @param onboardingData - The onboarding data to update
5896
+ * @returns The updated clinic group
5897
+ */
5898
+ async setOnboarding(groupId, onboardingData) {
5899
+ console.log("[CLINIC_GROUP] Updating onboarding status", {
5900
+ groupId,
5901
+ onboardingData
5902
+ });
5903
+ return this.updateClinicGroup(groupId, {
5904
+ onboarding: onboardingData
5905
+ });
5906
+ }
5907
+ /**
5908
+ * Sets the current onboarding step for a clinic group
5909
+ *
5910
+ * @param groupId - The ID of the clinic group to update
5911
+ * @param step - The current onboarding step number
5912
+ * @returns The updated clinic group
5913
+ */
5914
+ async setOnboardingStep(groupId, step) {
5915
+ console.log("[CLINIC_GROUP] Setting onboarding step", { groupId, step });
5916
+ return this.setOnboarding(groupId, { step, completed: false });
5917
+ }
5918
+ /**
5919
+ * Marks the onboarding process as completed for a clinic group
5920
+ *
5921
+ * @param groupId - The ID of the clinic group to update
5922
+ * @returns The updated clinic group
5923
+ */
5924
+ async completeOnboarding(groupId) {
5925
+ console.log("[CLINIC_GROUP] Completing onboarding", { groupId });
5926
+ return this.setOnboarding(groupId, { completed: true });
5927
+ }
5872
5928
  };
5873
5929
 
5874
5930
  // src/services/clinic/clinic.service.ts
5875
5931
  var import_firestore24 = require("firebase/firestore");
5876
5932
  var import_geofire_common7 = require("geofire-common");
5877
- var import_zod18 = require("zod");
5933
+ var import_zod19 = require("zod");
5878
5934
 
5879
5935
  // src/services/clinic/utils/clinic.utils.ts
5880
5936
  var import_firestore19 = require("firebase/firestore");
5881
5937
  var import_geofire_common4 = require("geofire-common");
5882
- var import_zod17 = require("zod");
5938
+ var import_zod18 = require("zod");
5883
5939
  async function getClinic(db, clinicId) {
5884
5940
  const docRef = (0, import_firestore19.doc)(db, CLINICS_COLLECTION, clinicId);
5885
5941
  const docSnap = await (0, import_firestore19.getDoc)(docRef);
@@ -6941,7 +6997,7 @@ var ClinicService = class extends BaseService {
6941
6997
  if (!savedClinic) throw new Error("Failed to retrieve created clinic");
6942
6998
  return savedClinic;
6943
6999
  } catch (error) {
6944
- if (error instanceof import_zod18.z.ZodError) {
7000
+ if (error instanceof import_zod19.z.ZodError) {
6945
7001
  throw new Error("Invalid clinic data: " + error.message);
6946
7002
  }
6947
7003
  console.error("Error creating clinic:", error);
@@ -7021,7 +7077,7 @@ var ClinicService = class extends BaseService {
7021
7077
  if (!updatedClinic) throw new Error("Failed to retrieve updated clinic");
7022
7078
  return updatedClinic;
7023
7079
  } catch (error) {
7024
- if (error instanceof import_zod18.z.ZodError) {
7080
+ if (error instanceof import_zod19.z.ZodError) {
7025
7081
  throw new Error("Invalid clinic update data: " + error.message);
7026
7082
  }
7027
7083
  console.error(`Error updating clinic ${clinicId}:`, error);
@@ -7038,6 +7094,16 @@ var ClinicService = class extends BaseService {
7038
7094
  updatedAt: (0, import_firestore24.serverTimestamp)()
7039
7095
  });
7040
7096
  }
7097
+ /**
7098
+ * Activates a clinic.
7099
+ */
7100
+ async activateClinic(clinicId, adminId) {
7101
+ const clinicRef = (0, import_firestore24.doc)(this.db, CLINICS_COLLECTION, clinicId);
7102
+ await (0, import_firestore24.updateDoc)(clinicRef, {
7103
+ isActive: true,
7104
+ updatedAt: (0, import_firestore24.serverTimestamp)()
7105
+ });
7106
+ }
7041
7107
  /**
7042
7108
  * Dohvata kliniku po ID-u
7043
7109
  */
@@ -7343,7 +7409,11 @@ var AuthService = class extends BaseService {
7343
7409
  // Use admin profile ID, not user UID
7344
7410
  isActive: true,
7345
7411
  logo: data.clinicGroupData.logo || null,
7346
- subscriptionModel: data.clinicGroupData.subscriptionModel || "no_subscription" /* NO_SUBSCRIPTION */
7412
+ subscriptionModel: data.clinicGroupData.subscriptionModel || "no_subscription" /* NO_SUBSCRIPTION */,
7413
+ onboarding: {
7414
+ completed: false,
7415
+ step: 1
7416
+ }
7347
7417
  };
7348
7418
  console.log("[AUTH] Clinic group data prepared", {
7349
7419
  groupName: createClinicGroupData.name
@@ -7483,7 +7553,7 @@ var AuthService = class extends BaseService {
7483
7553
  clinicAdmin: adminProfile
7484
7554
  };
7485
7555
  } catch (error) {
7486
- if (error instanceof import_zod19.z.ZodError) {
7556
+ if (error instanceof import_zod20.z.ZodError) {
7487
7557
  console.error(
7488
7558
  "[AUTH] Zod validation error in signUpClinicAdmin:",
7489
7559
  JSON.stringify(error.errors, null, 2)
@@ -7658,7 +7728,7 @@ var AuthService = class extends BaseService {
7658
7728
  email
7659
7729
  );
7660
7730
  } catch (error) {
7661
- if (error instanceof import_zod19.z.ZodError) {
7731
+ if (error instanceof import_zod20.z.ZodError) {
7662
7732
  throw AUTH_ERRORS.VALIDATION_ERROR;
7663
7733
  }
7664
7734
  const firebaseError = error;
@@ -7781,7 +7851,7 @@ var AuthService = class extends BaseService {
7781
7851
  await emailSchema.parseAsync(email);
7782
7852
  await (0, import_auth5.sendPasswordResetEmail)(this.auth, email);
7783
7853
  } catch (error) {
7784
- if (error instanceof import_zod19.z.ZodError) {
7854
+ if (error instanceof import_zod20.z.ZodError) {
7785
7855
  throw AUTH_ERRORS.VALIDATION_ERROR;
7786
7856
  }
7787
7857
  const firebaseError = error;
@@ -7820,7 +7890,7 @@ var AuthService = class extends BaseService {
7820
7890
  await passwordSchema.parseAsync(newPassword);
7821
7891
  await (0, import_auth5.confirmPasswordReset)(this.auth, oobCode, newPassword);
7822
7892
  } catch (error) {
7823
- if (error instanceof import_zod19.z.ZodError) {
7893
+ if (error instanceof import_zod20.z.ZodError) {
7824
7894
  throw AUTH_ERRORS.VALIDATION_ERROR;
7825
7895
  }
7826
7896
  const firebaseError = error;
@@ -7989,7 +8059,7 @@ var AuthService = class extends BaseService {
7989
8059
  practitioner
7990
8060
  };
7991
8061
  } catch (error) {
7992
- if (error instanceof import_zod19.z.ZodError) {
8062
+ if (error instanceof import_zod20.z.ZodError) {
7993
8063
  console.error(
7994
8064
  "[AUTH] Zod validation error in signUpPractitioner:",
7995
8065
  JSON.stringify(error.errors, null, 2)
@@ -8267,63 +8337,63 @@ var import_firestore27 = require("firebase/firestore");
8267
8337
  var PROCEDURES_COLLECTION = "procedures";
8268
8338
 
8269
8339
  // src/validations/procedure.schema.ts
8270
- var import_zod20 = require("zod");
8271
- var createProcedureSchema = import_zod20.z.object({
8272
- name: import_zod20.z.string().min(1).max(200),
8273
- description: import_zod20.z.string().min(1).max(2e3),
8274
- family: import_zod20.z.nativeEnum(ProcedureFamily),
8275
- categoryId: import_zod20.z.string().min(1),
8276
- subcategoryId: import_zod20.z.string().min(1),
8277
- technologyId: import_zod20.z.string().min(1),
8278
- productId: import_zod20.z.string().min(1),
8279
- price: import_zod20.z.number().min(0),
8280
- currency: import_zod20.z.nativeEnum(Currency),
8281
- pricingMeasure: import_zod20.z.nativeEnum(PricingMeasure),
8282
- duration: import_zod20.z.number().min(1).max(480),
8340
+ var import_zod21 = require("zod");
8341
+ var createProcedureSchema = import_zod21.z.object({
8342
+ name: import_zod21.z.string().min(1).max(200),
8343
+ description: import_zod21.z.string().min(1).max(2e3),
8344
+ family: import_zod21.z.nativeEnum(ProcedureFamily),
8345
+ categoryId: import_zod21.z.string().min(1),
8346
+ subcategoryId: import_zod21.z.string().min(1),
8347
+ technologyId: import_zod21.z.string().min(1),
8348
+ productId: import_zod21.z.string().min(1),
8349
+ price: import_zod21.z.number().min(0),
8350
+ currency: import_zod21.z.nativeEnum(Currency),
8351
+ pricingMeasure: import_zod21.z.nativeEnum(PricingMeasure),
8352
+ duration: import_zod21.z.number().min(1).max(480),
8283
8353
  // Max 8 hours
8284
- practitionerId: import_zod20.z.string().min(1),
8285
- clinicBranchId: import_zod20.z.string().min(1),
8286
- photos: import_zod20.z.array(import_zod20.z.string()).optional()
8354
+ practitionerId: import_zod21.z.string().min(1),
8355
+ clinicBranchId: import_zod21.z.string().min(1),
8356
+ photos: import_zod21.z.array(import_zod21.z.string()).optional()
8287
8357
  });
8288
- var updateProcedureSchema = import_zod20.z.object({
8289
- name: import_zod20.z.string().min(3).max(100).optional(),
8290
- description: import_zod20.z.string().min(3).max(1e3).optional(),
8291
- price: import_zod20.z.number().min(0).optional(),
8292
- currency: import_zod20.z.nativeEnum(Currency).optional(),
8293
- pricingMeasure: import_zod20.z.nativeEnum(PricingMeasure).optional(),
8294
- duration: import_zod20.z.number().min(0).optional(),
8295
- isActive: import_zod20.z.boolean().optional(),
8296
- practitionerId: import_zod20.z.string().optional(),
8297
- categoryId: import_zod20.z.string().optional(),
8298
- subcategoryId: import_zod20.z.string().optional(),
8299
- technologyId: import_zod20.z.string().optional(),
8300
- productId: import_zod20.z.string().optional(),
8301
- clinicBranchId: import_zod20.z.string().optional(),
8302
- photos: import_zod20.z.array(import_zod20.z.string()).optional()
8358
+ var updateProcedureSchema = import_zod21.z.object({
8359
+ name: import_zod21.z.string().min(3).max(100).optional(),
8360
+ description: import_zod21.z.string().min(3).max(1e3).optional(),
8361
+ price: import_zod21.z.number().min(0).optional(),
8362
+ currency: import_zod21.z.nativeEnum(Currency).optional(),
8363
+ pricingMeasure: import_zod21.z.nativeEnum(PricingMeasure).optional(),
8364
+ duration: import_zod21.z.number().min(0).optional(),
8365
+ isActive: import_zod21.z.boolean().optional(),
8366
+ practitionerId: import_zod21.z.string().optional(),
8367
+ categoryId: import_zod21.z.string().optional(),
8368
+ subcategoryId: import_zod21.z.string().optional(),
8369
+ technologyId: import_zod21.z.string().optional(),
8370
+ productId: import_zod21.z.string().optional(),
8371
+ clinicBranchId: import_zod21.z.string().optional(),
8372
+ photos: import_zod21.z.array(import_zod21.z.string()).optional()
8303
8373
  });
8304
8374
  var procedureSchema = createProcedureSchema.extend({
8305
- id: import_zod20.z.string().min(1),
8306
- category: import_zod20.z.any(),
8375
+ id: import_zod21.z.string().min(1),
8376
+ category: import_zod21.z.any(),
8307
8377
  // We'll validate the full category object separately
8308
- subcategory: import_zod20.z.any(),
8378
+ subcategory: import_zod21.z.any(),
8309
8379
  // We'll validate the full subcategory object separately
8310
- technology: import_zod20.z.any(),
8380
+ technology: import_zod21.z.any(),
8311
8381
  // We'll validate the full technology object separately
8312
- product: import_zod20.z.any(),
8382
+ product: import_zod21.z.any(),
8313
8383
  // We'll validate the full product object separately
8314
- blockingConditions: import_zod20.z.array(import_zod20.z.any()),
8384
+ blockingConditions: import_zod21.z.array(import_zod21.z.any()),
8315
8385
  // We'll validate blocking conditions separately
8316
- contraindications: import_zod20.z.array(import_zod20.z.any()),
8386
+ contraindications: import_zod21.z.array(import_zod21.z.any()),
8317
8387
  // We'll validate contraindications separately
8318
- treatmentBenefits: import_zod20.z.array(import_zod20.z.any()),
8388
+ treatmentBenefits: import_zod21.z.array(import_zod21.z.any()),
8319
8389
  // We'll validate treatment benefits separately
8320
- preRequirements: import_zod20.z.array(import_zod20.z.any()),
8390
+ preRequirements: import_zod21.z.array(import_zod21.z.any()),
8321
8391
  // We'll validate requirements separately
8322
- postRequirements: import_zod20.z.array(import_zod20.z.any()),
8392
+ postRequirements: import_zod21.z.array(import_zod21.z.any()),
8323
8393
  // We'll validate requirements separately
8324
- certificationRequirement: import_zod20.z.any(),
8394
+ certificationRequirement: import_zod21.z.any(),
8325
8395
  // We'll validate certification requirement separately
8326
- documentationTemplates: import_zod20.z.array(import_zod20.z.any()),
8396
+ documentationTemplates: import_zod21.z.array(import_zod21.z.any()),
8327
8397
  // We'll validate documentation templates separately
8328
8398
  clinicInfo: clinicInfoSchema,
8329
8399
  // Clinic info validation
@@ -8331,9 +8401,9 @@ var procedureSchema = createProcedureSchema.extend({
8331
8401
  // Doctor info validation
8332
8402
  reviewInfo: procedureReviewInfoSchema,
8333
8403
  // Procedure review info validation
8334
- isActive: import_zod20.z.boolean(),
8335
- createdAt: import_zod20.z.date(),
8336
- updatedAt: import_zod20.z.date()
8404
+ isActive: import_zod21.z.boolean(),
8405
+ createdAt: import_zod21.z.date(),
8406
+ updatedAt: import_zod21.z.date()
8337
8407
  });
8338
8408
 
8339
8409
  // src/services/procedure/procedure.service.ts
@@ -9508,42 +9578,42 @@ var SYNCED_CALENDARS_COLLECTION = "syncedCalendars";
9508
9578
  var import_firestore40 = require("firebase/firestore");
9509
9579
 
9510
9580
  // src/validations/calendar.schema.ts
9511
- var import_zod22 = require("zod");
9581
+ var import_zod23 = require("zod");
9512
9582
  var import_firestore31 = require("firebase/firestore");
9513
9583
 
9514
9584
  // src/validations/profile-info.schema.ts
9515
- var import_zod21 = require("zod");
9585
+ var import_zod22 = require("zod");
9516
9586
  var import_firestore30 = require("firebase/firestore");
9517
- var clinicInfoSchema2 = import_zod21.z.object({
9518
- id: import_zod21.z.string(),
9519
- featuredPhoto: import_zod21.z.string(),
9520
- name: import_zod21.z.string(),
9521
- description: import_zod21.z.string(),
9587
+ var clinicInfoSchema2 = import_zod22.z.object({
9588
+ id: import_zod22.z.string(),
9589
+ featuredPhoto: import_zod22.z.string(),
9590
+ name: import_zod22.z.string(),
9591
+ description: import_zod22.z.string(),
9522
9592
  location: clinicLocationSchema,
9523
9593
  contactInfo: clinicContactInfoSchema
9524
9594
  });
9525
- var practitionerProfileInfoSchema = import_zod21.z.object({
9526
- id: import_zod21.z.string(),
9527
- practitionerPhoto: import_zod21.z.string().nullable(),
9528
- name: import_zod21.z.string(),
9529
- email: import_zod21.z.string().email(),
9530
- phone: import_zod21.z.string().nullable(),
9595
+ var practitionerProfileInfoSchema = import_zod22.z.object({
9596
+ id: import_zod22.z.string(),
9597
+ practitionerPhoto: import_zod22.z.string().nullable(),
9598
+ name: import_zod22.z.string(),
9599
+ email: import_zod22.z.string().email(),
9600
+ phone: import_zod22.z.string().nullable(),
9531
9601
  certification: practitionerCertificationSchema
9532
9602
  });
9533
- var patientProfileInfoSchema = import_zod21.z.object({
9534
- id: import_zod21.z.string(),
9535
- fullName: import_zod21.z.string(),
9536
- email: import_zod21.z.string().email(),
9537
- phone: import_zod21.z.string().nullable(),
9538
- dateOfBirth: import_zod21.z.instanceof(import_firestore30.Timestamp),
9539
- gender: import_zod21.z.nativeEnum(Gender)
9603
+ var patientProfileInfoSchema = import_zod22.z.object({
9604
+ id: import_zod22.z.string(),
9605
+ fullName: import_zod22.z.string(),
9606
+ email: import_zod22.z.string().email(),
9607
+ phone: import_zod22.z.string().nullable(),
9608
+ dateOfBirth: import_zod22.z.instanceof(import_firestore30.Timestamp),
9609
+ gender: import_zod22.z.nativeEnum(Gender)
9540
9610
  });
9541
9611
 
9542
9612
  // src/validations/calendar.schema.ts
9543
9613
  var MIN_APPOINTMENT_DURATION = 15;
9544
- var calendarEventTimeSchema = import_zod22.z.object({
9545
- start: import_zod22.z.instanceof(Date).or(import_zod22.z.instanceof(import_firestore31.Timestamp)),
9546
- end: import_zod22.z.instanceof(Date).or(import_zod22.z.instanceof(import_firestore31.Timestamp))
9614
+ var calendarEventTimeSchema = import_zod23.z.object({
9615
+ start: import_zod23.z.instanceof(Date).or(import_zod23.z.instanceof(import_firestore31.Timestamp)),
9616
+ end: import_zod23.z.instanceof(Date).or(import_zod23.z.instanceof(import_firestore31.Timestamp))
9547
9617
  }).refine(
9548
9618
  (data) => {
9549
9619
  const startDate = data.start instanceof import_firestore31.Timestamp ? data.start.toDate() : data.start;
@@ -9564,46 +9634,46 @@ var calendarEventTimeSchema = import_zod22.z.object({
9564
9634
  path: ["start"]
9565
9635
  }
9566
9636
  );
9567
- var timeSlotSchema2 = import_zod22.z.object({
9568
- start: import_zod22.z.date(),
9569
- end: import_zod22.z.date(),
9570
- isAvailable: import_zod22.z.boolean()
9637
+ var timeSlotSchema2 = import_zod23.z.object({
9638
+ start: import_zod23.z.date(),
9639
+ end: import_zod23.z.date(),
9640
+ isAvailable: import_zod23.z.boolean()
9571
9641
  }).refine((data) => data.start < data.end, {
9572
9642
  message: "End time must be after start time",
9573
9643
  path: ["end"]
9574
9644
  });
9575
- var syncedCalendarEventSchema = import_zod22.z.object({
9576
- eventId: import_zod22.z.string(),
9577
- syncedCalendarProvider: import_zod22.z.nativeEnum(SyncedCalendarProvider),
9578
- syncedAt: import_zod22.z.instanceof(Date).or(import_zod22.z.instanceof(import_firestore31.Timestamp))
9645
+ var syncedCalendarEventSchema = import_zod23.z.object({
9646
+ eventId: import_zod23.z.string(),
9647
+ syncedCalendarProvider: import_zod23.z.nativeEnum(SyncedCalendarProvider),
9648
+ syncedAt: import_zod23.z.instanceof(Date).or(import_zod23.z.instanceof(import_firestore31.Timestamp))
9579
9649
  });
9580
- var procedureInfoSchema = import_zod22.z.object({
9581
- name: import_zod22.z.string(),
9582
- description: import_zod22.z.string(),
9583
- duration: import_zod22.z.number().min(MIN_APPOINTMENT_DURATION),
9584
- price: import_zod22.z.number().min(0),
9585
- currency: import_zod22.z.nativeEnum(Currency)
9650
+ var procedureInfoSchema = import_zod23.z.object({
9651
+ name: import_zod23.z.string(),
9652
+ description: import_zod23.z.string(),
9653
+ duration: import_zod23.z.number().min(MIN_APPOINTMENT_DURATION),
9654
+ price: import_zod23.z.number().min(0),
9655
+ currency: import_zod23.z.nativeEnum(Currency)
9586
9656
  });
9587
- var procedureCategorizationSchema = import_zod22.z.object({
9588
- procedureFamily: import_zod22.z.string(),
9657
+ var procedureCategorizationSchema = import_zod23.z.object({
9658
+ procedureFamily: import_zod23.z.string(),
9589
9659
  // Replace with proper enum when available
9590
- procedureCategory: import_zod22.z.string(),
9660
+ procedureCategory: import_zod23.z.string(),
9591
9661
  // Replace with proper enum when available
9592
- procedureSubcategory: import_zod22.z.string(),
9662
+ procedureSubcategory: import_zod23.z.string(),
9593
9663
  // Replace with proper enum when available
9594
- procedureTechnology: import_zod22.z.string(),
9664
+ procedureTechnology: import_zod23.z.string(),
9595
9665
  // Replace with proper enum when available
9596
- procedureProduct: import_zod22.z.string()
9666
+ procedureProduct: import_zod23.z.string()
9597
9667
  // Replace with proper enum when available
9598
9668
  });
9599
- var createAppointmentSchema2 = import_zod22.z.object({
9600
- clinicId: import_zod22.z.string().min(1, "Clinic ID is required"),
9601
- doctorId: import_zod22.z.string().min(1, "Doctor ID is required"),
9602
- patientId: import_zod22.z.string().min(1, "Patient ID is required"),
9603
- procedureId: import_zod22.z.string().min(1, "Procedure ID is required"),
9669
+ var createAppointmentSchema2 = import_zod23.z.object({
9670
+ clinicId: import_zod23.z.string().min(1, "Clinic ID is required"),
9671
+ doctorId: import_zod23.z.string().min(1, "Doctor ID is required"),
9672
+ patientId: import_zod23.z.string().min(1, "Patient ID is required"),
9673
+ procedureId: import_zod23.z.string().min(1, "Procedure ID is required"),
9604
9674
  eventLocation: clinicLocationSchema,
9605
9675
  eventTime: calendarEventTimeSchema,
9606
- description: import_zod22.z.string().optional()
9676
+ description: import_zod23.z.string().optional()
9607
9677
  }).refine(
9608
9678
  (data) => {
9609
9679
  return true;
@@ -9612,73 +9682,73 @@ var createAppointmentSchema2 = import_zod22.z.object({
9612
9682
  message: "Invalid appointment parameters"
9613
9683
  }
9614
9684
  );
9615
- var updateAppointmentSchema2 = import_zod22.z.object({
9616
- appointmentId: import_zod22.z.string().min(1, "Appointment ID is required"),
9617
- clinicId: import_zod22.z.string().min(1, "Clinic ID is required"),
9618
- doctorId: import_zod22.z.string().min(1, "Doctor ID is required"),
9619
- patientId: import_zod22.z.string().min(1, "Patient ID is required"),
9685
+ var updateAppointmentSchema2 = import_zod23.z.object({
9686
+ appointmentId: import_zod23.z.string().min(1, "Appointment ID is required"),
9687
+ clinicId: import_zod23.z.string().min(1, "Clinic ID is required"),
9688
+ doctorId: import_zod23.z.string().min(1, "Doctor ID is required"),
9689
+ patientId: import_zod23.z.string().min(1, "Patient ID is required"),
9620
9690
  eventTime: calendarEventTimeSchema.optional(),
9621
- description: import_zod22.z.string().optional(),
9622
- status: import_zod22.z.nativeEnum(CalendarEventStatus).optional()
9691
+ description: import_zod23.z.string().optional(),
9692
+ status: import_zod23.z.nativeEnum(CalendarEventStatus).optional()
9623
9693
  });
9624
- var createCalendarEventSchema = import_zod22.z.object({
9625
- id: import_zod22.z.string(),
9626
- clinicBranchId: import_zod22.z.string().nullable().optional(),
9627
- clinicBranchInfo: import_zod22.z.any().nullable().optional(),
9628
- practitionerProfileId: import_zod22.z.string().nullable().optional(),
9694
+ var createCalendarEventSchema = import_zod23.z.object({
9695
+ id: import_zod23.z.string(),
9696
+ clinicBranchId: import_zod23.z.string().nullable().optional(),
9697
+ clinicBranchInfo: import_zod23.z.any().nullable().optional(),
9698
+ practitionerProfileId: import_zod23.z.string().nullable().optional(),
9629
9699
  practitionerProfileInfo: practitionerProfileInfoSchema.nullable().optional(),
9630
- patientProfileId: import_zod22.z.string().nullable().optional(),
9700
+ patientProfileId: import_zod23.z.string().nullable().optional(),
9631
9701
  patientProfileInfo: patientProfileInfoSchema.nullable().optional(),
9632
- procedureId: import_zod22.z.string().nullable().optional(),
9633
- appointmentId: import_zod22.z.string().nullable().optional(),
9634
- syncedCalendarEventId: import_zod22.z.array(syncedCalendarEventSchema).nullable().optional(),
9635
- eventName: import_zod22.z.string().min(1, "Event name is required"),
9702
+ procedureId: import_zod23.z.string().nullable().optional(),
9703
+ appointmentId: import_zod23.z.string().nullable().optional(),
9704
+ syncedCalendarEventId: import_zod23.z.array(syncedCalendarEventSchema).nullable().optional(),
9705
+ eventName: import_zod23.z.string().min(1, "Event name is required"),
9636
9706
  eventLocation: clinicLocationSchema.optional(),
9637
9707
  eventTime: calendarEventTimeSchema,
9638
- description: import_zod22.z.string().optional(),
9639
- status: import_zod22.z.nativeEnum(CalendarEventStatus),
9640
- syncStatus: import_zod22.z.nativeEnum(CalendarSyncStatus),
9641
- eventType: import_zod22.z.nativeEnum(CalendarEventType),
9642
- createdAt: import_zod22.z.any(),
9708
+ description: import_zod23.z.string().optional(),
9709
+ status: import_zod23.z.nativeEnum(CalendarEventStatus),
9710
+ syncStatus: import_zod23.z.nativeEnum(CalendarSyncStatus),
9711
+ eventType: import_zod23.z.nativeEnum(CalendarEventType),
9712
+ createdAt: import_zod23.z.any(),
9643
9713
  // FieldValue for server timestamp
9644
- updatedAt: import_zod22.z.any()
9714
+ updatedAt: import_zod23.z.any()
9645
9715
  // FieldValue for server timestamp
9646
9716
  });
9647
- var updateCalendarEventSchema = import_zod22.z.object({
9648
- syncedCalendarEventId: import_zod22.z.array(syncedCalendarEventSchema).nullable().optional(),
9649
- appointmentId: import_zod22.z.string().nullable().optional(),
9650
- eventName: import_zod22.z.string().optional(),
9717
+ var updateCalendarEventSchema = import_zod23.z.object({
9718
+ syncedCalendarEventId: import_zod23.z.array(syncedCalendarEventSchema).nullable().optional(),
9719
+ appointmentId: import_zod23.z.string().nullable().optional(),
9720
+ eventName: import_zod23.z.string().optional(),
9651
9721
  eventTime: calendarEventTimeSchema.optional(),
9652
- description: import_zod22.z.string().optional(),
9653
- status: import_zod22.z.nativeEnum(CalendarEventStatus).optional(),
9654
- syncStatus: import_zod22.z.nativeEnum(CalendarSyncStatus).optional(),
9655
- eventType: import_zod22.z.nativeEnum(CalendarEventType).optional(),
9656
- updatedAt: import_zod22.z.any()
9722
+ description: import_zod23.z.string().optional(),
9723
+ status: import_zod23.z.nativeEnum(CalendarEventStatus).optional(),
9724
+ syncStatus: import_zod23.z.nativeEnum(CalendarSyncStatus).optional(),
9725
+ eventType: import_zod23.z.nativeEnum(CalendarEventType).optional(),
9726
+ updatedAt: import_zod23.z.any()
9657
9727
  // FieldValue for server timestamp
9658
9728
  });
9659
- var calendarEventSchema = import_zod22.z.object({
9660
- id: import_zod22.z.string(),
9661
- clinicBranchId: import_zod22.z.string().nullable().optional(),
9662
- clinicBranchInfo: import_zod22.z.any().nullable().optional(),
9729
+ var calendarEventSchema = import_zod23.z.object({
9730
+ id: import_zod23.z.string(),
9731
+ clinicBranchId: import_zod23.z.string().nullable().optional(),
9732
+ clinicBranchInfo: import_zod23.z.any().nullable().optional(),
9663
9733
  // Will be replaced with proper clinic info schema
9664
- practitionerProfileId: import_zod22.z.string().nullable().optional(),
9734
+ practitionerProfileId: import_zod23.z.string().nullable().optional(),
9665
9735
  practitionerProfileInfo: practitionerProfileInfoSchema.nullable().optional(),
9666
- patientProfileId: import_zod22.z.string().nullable().optional(),
9736
+ patientProfileId: import_zod23.z.string().nullable().optional(),
9667
9737
  patientProfileInfo: patientProfileInfoSchema.nullable().optional(),
9668
- procedureId: import_zod22.z.string().nullable().optional(),
9738
+ procedureId: import_zod23.z.string().nullable().optional(),
9669
9739
  procedureInfo: procedureInfoSchema.nullable().optional(),
9670
9740
  procedureCategorization: procedureCategorizationSchema.nullable().optional(),
9671
- appointmentId: import_zod22.z.string().nullable().optional(),
9672
- syncedCalendarEventId: import_zod22.z.array(syncedCalendarEventSchema).nullable().optional(),
9673
- eventName: import_zod22.z.string(),
9741
+ appointmentId: import_zod23.z.string().nullable().optional(),
9742
+ syncedCalendarEventId: import_zod23.z.array(syncedCalendarEventSchema).nullable().optional(),
9743
+ eventName: import_zod23.z.string(),
9674
9744
  eventLocation: clinicLocationSchema.optional(),
9675
9745
  eventTime: calendarEventTimeSchema,
9676
- description: import_zod22.z.string().optional(),
9677
- status: import_zod22.z.nativeEnum(CalendarEventStatus),
9678
- syncStatus: import_zod22.z.nativeEnum(CalendarSyncStatus),
9679
- eventType: import_zod22.z.nativeEnum(CalendarEventType),
9680
- createdAt: import_zod22.z.instanceof(Date).or(import_zod22.z.instanceof(import_firestore31.Timestamp)),
9681
- updatedAt: import_zod22.z.instanceof(Date).or(import_zod22.z.instanceof(import_firestore31.Timestamp))
9746
+ description: import_zod23.z.string().optional(),
9747
+ status: import_zod23.z.nativeEnum(CalendarEventStatus),
9748
+ syncStatus: import_zod23.z.nativeEnum(CalendarSyncStatus),
9749
+ eventType: import_zod23.z.nativeEnum(CalendarEventType),
9750
+ createdAt: import_zod23.z.instanceof(Date).or(import_zod23.z.instanceof(import_firestore31.Timestamp)),
9751
+ updatedAt: import_zod23.z.instanceof(Date).or(import_zod23.z.instanceof(import_firestore31.Timestamp))
9682
9752
  });
9683
9753
 
9684
9754
  // src/services/calendar/utils/clinic.utils.ts
@@ -12218,13 +12288,13 @@ var import_firestore41 = require("firebase/firestore");
12218
12288
  var REVIEWS_COLLECTION = "reviews";
12219
12289
 
12220
12290
  // src/services/reviews/reviews.service.ts
12221
- var import_zod23 = require("zod");
12291
+ var import_zod24 = require("zod");
12222
12292
  var ReviewService = class extends BaseService {
12223
12293
  constructor(db, auth, app) {
12224
12294
  super(db, auth, app);
12225
12295
  }
12226
12296
  /**
12227
- * Creates a new review and updates related entities
12297
+ * Creates a new review
12228
12298
  * @param data - The review data to create
12229
12299
  * @param appointmentId - ID of the completed appointment
12230
12300
  * @returns The created review
@@ -12303,28 +12373,9 @@ var ReviewService = class extends BaseService {
12303
12373
  createdAt: (0, import_firestore41.serverTimestamp)(),
12304
12374
  updatedAt: (0, import_firestore41.serverTimestamp)()
12305
12375
  });
12306
- const updatePromises = [];
12307
- if (data.clinicReview) {
12308
- updatePromises.push(
12309
- this.updateClinicReviewInfo(data.clinicReview.clinicId)
12310
- );
12311
- }
12312
- if (data.practitionerReview) {
12313
- updatePromises.push(
12314
- this.updatePractitionerReviewInfo(
12315
- data.practitionerReview.practitionerId
12316
- )
12317
- );
12318
- }
12319
- if (data.procedureReview) {
12320
- updatePromises.push(
12321
- this.updateProcedureReviewInfo(data.procedureReview.procedureId)
12322
- );
12323
- }
12324
- await Promise.all(updatePromises);
12325
12376
  return review;
12326
12377
  } catch (error) {
12327
- if (error instanceof import_zod23.z.ZodError) {
12378
+ if (error instanceof import_zod24.z.ZodError) {
12328
12379
  throw new Error(`Invalid review data: ${error.message}`);
12329
12380
  }
12330
12381
  throw error;
@@ -12412,7 +12463,7 @@ var ReviewService = class extends BaseService {
12412
12463
  return snapshot.docs[0].data();
12413
12464
  }
12414
12465
  /**
12415
- * Deletes a review and updates related entities
12466
+ * Deletes a review
12416
12467
  * @param reviewId The ID of the review to delete
12417
12468
  */
12418
12469
  async deleteReview(reviewId) {
@@ -12421,389 +12472,6 @@ var ReviewService = class extends BaseService {
12421
12472
  throw new Error(`Review with ID ${reviewId} not found`);
12422
12473
  }
12423
12474
  await (0, import_firestore41.deleteDoc)((0, import_firestore41.doc)(this.db, REVIEWS_COLLECTION, reviewId));
12424
- const updatePromises = [];
12425
- if (review.clinicReview) {
12426
- updatePromises.push(
12427
- this.updateClinicReviewInfo(
12428
- review.clinicReview.clinicId,
12429
- review.clinicReview,
12430
- true
12431
- )
12432
- );
12433
- }
12434
- if (review.practitionerReview) {
12435
- updatePromises.push(
12436
- this.updatePractitionerReviewInfo(
12437
- review.practitionerReview.practitionerId,
12438
- review.practitionerReview,
12439
- true
12440
- )
12441
- );
12442
- }
12443
- if (review.procedureReview) {
12444
- updatePromises.push(
12445
- this.updateProcedureReviewInfo(
12446
- review.procedureReview.procedureId,
12447
- review.procedureReview,
12448
- true
12449
- )
12450
- );
12451
- }
12452
- await Promise.all(updatePromises);
12453
- }
12454
- /**
12455
- * Updates the review info for a clinic
12456
- * @param clinicId The ID of the clinic to update
12457
- * @param newReview Optional new review being added or removed
12458
- * @param isRemoval Whether this update is for a review removal
12459
- * @returns The updated clinic review info
12460
- */
12461
- async updateClinicReviewInfo(clinicId, newReview, isRemoval = false) {
12462
- const clinicDoc = await (0, import_firestore41.getDoc)((0, import_firestore41.doc)(this.db, CLINICS_COLLECTION, clinicId));
12463
- if (!clinicDoc.exists()) {
12464
- throw new Error(`Clinic with ID ${clinicId} not found`);
12465
- }
12466
- const clinicData = clinicDoc.data();
12467
- const currentReviewInfo = clinicData.reviewInfo || {
12468
- totalReviews: 0,
12469
- averageRating: 0,
12470
- cleanliness: 0,
12471
- facilities: 0,
12472
- staffFriendliness: 0,
12473
- waitingTime: 0,
12474
- accessibility: 0,
12475
- recommendationPercentage: 0
12476
- };
12477
- if (currentReviewInfo.totalReviews === 0 && !newReview) {
12478
- await (0, import_firestore41.updateDoc)((0, import_firestore41.doc)(this.db, CLINICS_COLLECTION, clinicId), {
12479
- reviewInfo: currentReviewInfo,
12480
- updatedAt: (0, import_firestore41.serverTimestamp)()
12481
- });
12482
- return currentReviewInfo;
12483
- }
12484
- let updatedReviewInfo;
12485
- if (newReview) {
12486
- const oldTotal = currentReviewInfo.totalReviews;
12487
- const newTotal = isRemoval ? oldTotal - 1 : oldTotal + 1;
12488
- if (newTotal === 0) {
12489
- updatedReviewInfo = {
12490
- totalReviews: 0,
12491
- averageRating: 0,
12492
- cleanliness: 0,
12493
- facilities: 0,
12494
- staffFriendliness: 0,
12495
- waitingTime: 0,
12496
- accessibility: 0,
12497
- recommendationPercentage: 0
12498
- };
12499
- } else {
12500
- const updateAverage = (currentAvg, newValue) => {
12501
- const currentSum = currentAvg * oldTotal;
12502
- const newSum = isRemoval ? currentSum - newValue : currentSum + newValue;
12503
- const newAvg = newSum / newTotal;
12504
- return Math.round(newAvg * 10) / 10;
12505
- };
12506
- const currentRecommendations = currentReviewInfo.recommendationPercentage / 100 * oldTotal;
12507
- const newRecommendations = isRemoval ? newReview.wouldRecommend ? currentRecommendations - 1 : currentRecommendations : newReview.wouldRecommend ? currentRecommendations + 1 : currentRecommendations;
12508
- const newRecommendationPercentage = newRecommendations / newTotal * 100;
12509
- updatedReviewInfo = {
12510
- totalReviews: newTotal,
12511
- averageRating: updateAverage(
12512
- currentReviewInfo.averageRating,
12513
- newReview.overallRating
12514
- ),
12515
- cleanliness: updateAverage(
12516
- currentReviewInfo.cleanliness,
12517
- newReview.cleanliness
12518
- ),
12519
- facilities: updateAverage(
12520
- currentReviewInfo.facilities,
12521
- newReview.facilities
12522
- ),
12523
- staffFriendliness: updateAverage(
12524
- currentReviewInfo.staffFriendliness,
12525
- newReview.staffFriendliness
12526
- ),
12527
- waitingTime: updateAverage(
12528
- currentReviewInfo.waitingTime,
12529
- newReview.waitingTime
12530
- ),
12531
- accessibility: updateAverage(
12532
- currentReviewInfo.accessibility,
12533
- newReview.accessibility
12534
- ),
12535
- recommendationPercentage: Math.round(newRecommendationPercentage * 10) / 10
12536
- };
12537
- }
12538
- } else {
12539
- updatedReviewInfo = { ...currentReviewInfo };
12540
- }
12541
- await (0, import_firestore41.updateDoc)((0, import_firestore41.doc)(this.db, CLINICS_COLLECTION, clinicId), {
12542
- reviewInfo: updatedReviewInfo,
12543
- updatedAt: (0, import_firestore41.serverTimestamp)()
12544
- });
12545
- return updatedReviewInfo;
12546
- }
12547
- /**
12548
- * Updates the review info for a practitioner
12549
- * @param practitionerId The ID of the practitioner to update
12550
- * @param newReview Optional new review being added or removed
12551
- * @param isRemoval Whether this update is for a review removal
12552
- * @returns The updated practitioner review info
12553
- */
12554
- async updatePractitionerReviewInfo(practitionerId, newReview, isRemoval = false) {
12555
- const practitionerDoc = await (0, import_firestore41.getDoc)(
12556
- (0, import_firestore41.doc)(this.db, PRACTITIONERS_COLLECTION, practitionerId)
12557
- );
12558
- if (!practitionerDoc.exists()) {
12559
- throw new Error(`Practitioner with ID ${practitionerId} not found`);
12560
- }
12561
- const practitionerData = practitionerDoc.data();
12562
- const currentReviewInfo = practitionerData.reviewInfo || {
12563
- totalReviews: 0,
12564
- averageRating: 0,
12565
- knowledgeAndExpertise: 0,
12566
- communicationSkills: 0,
12567
- bedSideManner: 0,
12568
- thoroughness: 0,
12569
- trustworthiness: 0,
12570
- recommendationPercentage: 0
12571
- };
12572
- if (currentReviewInfo.totalReviews === 0 && !newReview) {
12573
- await (0, import_firestore41.updateDoc)((0, import_firestore41.doc)(this.db, PRACTITIONERS_COLLECTION, practitionerId), {
12574
- reviewInfo: currentReviewInfo,
12575
- updatedAt: (0, import_firestore41.serverTimestamp)()
12576
- });
12577
- return currentReviewInfo;
12578
- }
12579
- let updatedReviewInfo;
12580
- if (newReview) {
12581
- const oldTotal = currentReviewInfo.totalReviews;
12582
- const newTotal = isRemoval ? oldTotal - 1 : oldTotal + 1;
12583
- if (newTotal === 0) {
12584
- updatedReviewInfo = {
12585
- totalReviews: 0,
12586
- averageRating: 0,
12587
- knowledgeAndExpertise: 0,
12588
- communicationSkills: 0,
12589
- bedSideManner: 0,
12590
- thoroughness: 0,
12591
- trustworthiness: 0,
12592
- recommendationPercentage: 0
12593
- };
12594
- } else {
12595
- const updateAverage = (currentAvg, newValue) => {
12596
- const currentSum = currentAvg * oldTotal;
12597
- const newSum = isRemoval ? currentSum - newValue : currentSum + newValue;
12598
- const newAvg = newSum / newTotal;
12599
- return Math.round(newAvg * 10) / 10;
12600
- };
12601
- const currentRecommendations = currentReviewInfo.recommendationPercentage / 100 * oldTotal;
12602
- const newRecommendations = isRemoval ? newReview.wouldRecommend ? currentRecommendations - 1 : currentRecommendations : newReview.wouldRecommend ? currentRecommendations + 1 : currentRecommendations;
12603
- const newRecommendationPercentage = newRecommendations / newTotal * 100;
12604
- updatedReviewInfo = {
12605
- totalReviews: newTotal,
12606
- averageRating: updateAverage(
12607
- currentReviewInfo.averageRating,
12608
- newReview.overallRating
12609
- ),
12610
- knowledgeAndExpertise: updateAverage(
12611
- currentReviewInfo.knowledgeAndExpertise,
12612
- newReview.knowledgeAndExpertise
12613
- ),
12614
- communicationSkills: updateAverage(
12615
- currentReviewInfo.communicationSkills,
12616
- newReview.communicationSkills
12617
- ),
12618
- bedSideManner: updateAverage(
12619
- currentReviewInfo.bedSideManner,
12620
- newReview.bedSideManner
12621
- ),
12622
- thoroughness: updateAverage(
12623
- currentReviewInfo.thoroughness,
12624
- newReview.thoroughness
12625
- ),
12626
- trustworthiness: updateAverage(
12627
- currentReviewInfo.trustworthiness,
12628
- newReview.trustworthiness
12629
- ),
12630
- recommendationPercentage: Math.round(newRecommendationPercentage * 10) / 10
12631
- };
12632
- }
12633
- } else {
12634
- updatedReviewInfo = { ...currentReviewInfo };
12635
- }
12636
- await (0, import_firestore41.updateDoc)((0, import_firestore41.doc)(this.db, PRACTITIONERS_COLLECTION, practitionerId), {
12637
- reviewInfo: updatedReviewInfo,
12638
- updatedAt: (0, import_firestore41.serverTimestamp)()
12639
- });
12640
- await this.updateDoctorInfoInProcedures(
12641
- practitionerId,
12642
- updatedReviewInfo.averageRating
12643
- );
12644
- return updatedReviewInfo;
12645
- }
12646
- /**
12647
- * Updates the review info for a procedure
12648
- * @param procedureId The ID of the procedure to update
12649
- * @param newReview Optional new review being added or removed
12650
- * @param isRemoval Whether this update is for a review removal
12651
- * @returns The updated procedure review info
12652
- */
12653
- async updateProcedureReviewInfo(procedureId, newReview, isRemoval = false) {
12654
- const procedureDoc = await (0, import_firestore41.getDoc)(
12655
- (0, import_firestore41.doc)(this.db, PROCEDURES_COLLECTION, procedureId)
12656
- );
12657
- if (!procedureDoc.exists()) {
12658
- throw new Error(`Procedure with ID ${procedureId} not found`);
12659
- }
12660
- const procedureData = procedureDoc.data();
12661
- const currentReviewInfo = procedureData.reviewInfo || {
12662
- totalReviews: 0,
12663
- averageRating: 0,
12664
- effectivenessOfTreatment: 0,
12665
- outcomeExplanation: 0,
12666
- painManagement: 0,
12667
- followUpCare: 0,
12668
- valueForMoney: 0,
12669
- recommendationPercentage: 0
12670
- };
12671
- if (currentReviewInfo.totalReviews === 0 && !newReview) {
12672
- await (0, import_firestore41.updateDoc)((0, import_firestore41.doc)(this.db, PROCEDURES_COLLECTION, procedureId), {
12673
- reviewInfo: currentReviewInfo,
12674
- updatedAt: (0, import_firestore41.serverTimestamp)()
12675
- });
12676
- return currentReviewInfo;
12677
- }
12678
- let updatedReviewInfo;
12679
- if (newReview) {
12680
- const oldTotal = currentReviewInfo.totalReviews;
12681
- const newTotal = isRemoval ? oldTotal - 1 : oldTotal + 1;
12682
- if (newTotal === 0) {
12683
- updatedReviewInfo = {
12684
- totalReviews: 0,
12685
- averageRating: 0,
12686
- effectivenessOfTreatment: 0,
12687
- outcomeExplanation: 0,
12688
- painManagement: 0,
12689
- followUpCare: 0,
12690
- valueForMoney: 0,
12691
- recommendationPercentage: 0
12692
- };
12693
- } else {
12694
- const updateAverage = (currentAvg, newValue) => {
12695
- const currentSum = currentAvg * oldTotal;
12696
- const newSum = isRemoval ? currentSum - newValue : currentSum + newValue;
12697
- const newAvg = newSum / newTotal;
12698
- return Math.round(newAvg * 10) / 10;
12699
- };
12700
- const currentRecommendations = currentReviewInfo.recommendationPercentage / 100 * oldTotal;
12701
- const newRecommendations = isRemoval ? newReview.wouldRecommend ? currentRecommendations - 1 : currentRecommendations : newReview.wouldRecommend ? currentRecommendations + 1 : currentRecommendations;
12702
- const newRecommendationPercentage = newRecommendations / newTotal * 100;
12703
- updatedReviewInfo = {
12704
- totalReviews: newTotal,
12705
- averageRating: updateAverage(
12706
- currentReviewInfo.averageRating,
12707
- newReview.overallRating
12708
- ),
12709
- effectivenessOfTreatment: updateAverage(
12710
- currentReviewInfo.effectivenessOfTreatment,
12711
- newReview.effectivenessOfTreatment
12712
- ),
12713
- outcomeExplanation: updateAverage(
12714
- currentReviewInfo.outcomeExplanation,
12715
- newReview.outcomeExplanation
12716
- ),
12717
- painManagement: updateAverage(
12718
- currentReviewInfo.painManagement,
12719
- newReview.painManagement
12720
- ),
12721
- followUpCare: updateAverage(
12722
- currentReviewInfo.followUpCare,
12723
- newReview.followUpCare
12724
- ),
12725
- valueForMoney: updateAverage(
12726
- currentReviewInfo.valueForMoney,
12727
- newReview.valueForMoney
12728
- ),
12729
- recommendationPercentage: Math.round(newRecommendationPercentage * 10) / 10
12730
- };
12731
- }
12732
- } else {
12733
- updatedReviewInfo = { ...currentReviewInfo };
12734
- }
12735
- await (0, import_firestore41.updateDoc)((0, import_firestore41.doc)(this.db, PROCEDURES_COLLECTION, procedureId), {
12736
- reviewInfo: updatedReviewInfo,
12737
- updatedAt: (0, import_firestore41.serverTimestamp)()
12738
- });
12739
- return updatedReviewInfo;
12740
- }
12741
- /**
12742
- * Updates doctorInfo rating in all procedures for a practitioner
12743
- * @param practitionerId The ID of the practitioner
12744
- * @param rating The new rating to set
12745
- */
12746
- async updateDoctorInfoInProcedures(practitionerId, rating) {
12747
- const q = (0, import_firestore41.query)(
12748
- (0, import_firestore41.collection)(this.db, PROCEDURES_COLLECTION),
12749
- (0, import_firestore41.where)("practitionerId", "==", practitionerId)
12750
- );
12751
- const snapshot = await (0, import_firestore41.getDocs)(q);
12752
- if (snapshot.empty) {
12753
- return;
12754
- }
12755
- const batch = (0, import_firestore41.writeBatch)(this.db);
12756
- snapshot.docs.forEach((docSnapshot) => {
12757
- const procedureRef = (0, import_firestore41.doc)(this.db, PROCEDURES_COLLECTION, docSnapshot.id);
12758
- batch.update(procedureRef, {
12759
- "doctorInfo.rating": rating,
12760
- updatedAt: (0, import_firestore41.serverTimestamp)()
12761
- });
12762
- });
12763
- await batch.commit();
12764
- }
12765
- /**
12766
- * Verifies a review as checked by admin/staff
12767
- * @param reviewId The ID of the review to verify
12768
- */
12769
- async verifyReview(reviewId) {
12770
- const review = await this.getReview(reviewId);
12771
- if (!review) {
12772
- throw new Error(`Review with ID ${reviewId} not found`);
12773
- }
12774
- const batch = (0, import_firestore41.writeBatch)(this.db);
12775
- batch.update((0, import_firestore41.doc)(this.db, REVIEWS_COLLECTION, reviewId), {
12776
- updatedAt: (0, import_firestore41.serverTimestamp)()
12777
- });
12778
- if (review.clinicReview) {
12779
- review.clinicReview.isVerified = true;
12780
- }
12781
- if (review.practitionerReview) {
12782
- review.practitionerReview.isVerified = true;
12783
- }
12784
- if (review.procedureReview) {
12785
- review.procedureReview.isVerified = true;
12786
- }
12787
- await batch.commit();
12788
- const updatePromises = [];
12789
- if (review.clinicReview) {
12790
- updatePromises.push(
12791
- this.updateClinicReviewInfo(review.clinicReview.clinicId)
12792
- );
12793
- }
12794
- if (review.practitionerReview) {
12795
- updatePromises.push(
12796
- this.updatePractitionerReviewInfo(
12797
- review.practitionerReview.practitionerId
12798
- )
12799
- );
12800
- }
12801
- if (review.procedureReview) {
12802
- updatePromises.push(
12803
- this.updateProcedureReviewInfo(review.procedureReview.procedureId)
12804
- );
12805
- }
12806
- await Promise.all(updatePromises);
12807
12475
  }
12808
12476
  /**
12809
12477
  * Calculates the average of an array of numbers
@@ -14867,63 +14535,63 @@ var ProductService = class extends BaseService {
14867
14535
  };
14868
14536
 
14869
14537
  // src/validations/notification.schema.ts
14870
- var import_zod24 = require("zod");
14871
- var baseNotificationSchema = import_zod24.z.object({
14872
- id: import_zod24.z.string().optional(),
14873
- userId: import_zod24.z.string(),
14874
- notificationTime: import_zod24.z.any(),
14538
+ var import_zod25 = require("zod");
14539
+ var baseNotificationSchema = import_zod25.z.object({
14540
+ id: import_zod25.z.string().optional(),
14541
+ userId: import_zod25.z.string(),
14542
+ notificationTime: import_zod25.z.any(),
14875
14543
  // Timestamp
14876
- notificationType: import_zod24.z.nativeEnum(NotificationType),
14877
- notificationTokens: import_zod24.z.array(import_zod24.z.string()),
14878
- status: import_zod24.z.nativeEnum(NotificationStatus),
14879
- createdAt: import_zod24.z.any().optional(),
14544
+ notificationType: import_zod25.z.nativeEnum(NotificationType),
14545
+ notificationTokens: import_zod25.z.array(import_zod25.z.string()),
14546
+ status: import_zod25.z.nativeEnum(NotificationStatus),
14547
+ createdAt: import_zod25.z.any().optional(),
14880
14548
  // Timestamp
14881
- updatedAt: import_zod24.z.any().optional(),
14549
+ updatedAt: import_zod25.z.any().optional(),
14882
14550
  // Timestamp
14883
- title: import_zod24.z.string(),
14884
- body: import_zod24.z.string(),
14885
- isRead: import_zod24.z.boolean(),
14886
- userRole: import_zod24.z.nativeEnum(UserRole)
14551
+ title: import_zod25.z.string(),
14552
+ body: import_zod25.z.string(),
14553
+ isRead: import_zod25.z.boolean(),
14554
+ userRole: import_zod25.z.nativeEnum(UserRole)
14887
14555
  });
14888
14556
  var preRequirementNotificationSchema = baseNotificationSchema.extend({
14889
- notificationType: import_zod24.z.literal("preRequirementInstructionDue" /* PRE_REQUIREMENT_INSTRUCTION_DUE */),
14890
- treatmentId: import_zod24.z.string(),
14891
- requirements: import_zod24.z.array(import_zod24.z.string()),
14892
- deadline: import_zod24.z.any()
14557
+ notificationType: import_zod25.z.literal("preRequirementInstructionDue" /* PRE_REQUIREMENT_INSTRUCTION_DUE */),
14558
+ treatmentId: import_zod25.z.string(),
14559
+ requirements: import_zod25.z.array(import_zod25.z.string()),
14560
+ deadline: import_zod25.z.any()
14893
14561
  // Timestamp
14894
14562
  });
14895
14563
  var postRequirementNotificationSchema = baseNotificationSchema.extend({
14896
- notificationType: import_zod24.z.literal(
14564
+ notificationType: import_zod25.z.literal(
14897
14565
  "postRequirementInstructionDue" /* POST_REQUIREMENT_INSTRUCTION_DUE */
14898
14566
  ),
14899
- treatmentId: import_zod24.z.string(),
14900
- requirements: import_zod24.z.array(import_zod24.z.string()),
14901
- deadline: import_zod24.z.any()
14567
+ treatmentId: import_zod25.z.string(),
14568
+ requirements: import_zod25.z.array(import_zod25.z.string()),
14569
+ deadline: import_zod25.z.any()
14902
14570
  // Timestamp
14903
14571
  });
14904
14572
  var requirementInstructionDueNotificationSchema = baseNotificationSchema.extend({
14905
- notificationType: import_zod24.z.literal("requirementInstructionDue" /* REQUIREMENT_INSTRUCTION_DUE */),
14906
- appointmentId: import_zod24.z.string(),
14907
- patientRequirementInstanceId: import_zod24.z.string(),
14908
- instructionId: import_zod24.z.string(),
14909
- originalRequirementId: import_zod24.z.string().optional()
14573
+ notificationType: import_zod25.z.literal("requirementInstructionDue" /* REQUIREMENT_INSTRUCTION_DUE */),
14574
+ appointmentId: import_zod25.z.string(),
14575
+ patientRequirementInstanceId: import_zod25.z.string(),
14576
+ instructionId: import_zod25.z.string(),
14577
+ originalRequirementId: import_zod25.z.string().optional()
14910
14578
  });
14911
14579
  var appointmentReminderNotificationSchema = baseNotificationSchema.extend({
14912
- notificationType: import_zod24.z.literal("appointmentReminder" /* APPOINTMENT_REMINDER */),
14913
- appointmentId: import_zod24.z.string(),
14914
- appointmentTime: import_zod24.z.any(),
14580
+ notificationType: import_zod25.z.literal("appointmentReminder" /* APPOINTMENT_REMINDER */),
14581
+ appointmentId: import_zod25.z.string(),
14582
+ appointmentTime: import_zod25.z.any(),
14915
14583
  // Timestamp
14916
- treatmentType: import_zod24.z.string(),
14917
- doctorName: import_zod24.z.string()
14584
+ treatmentType: import_zod25.z.string(),
14585
+ doctorName: import_zod25.z.string()
14918
14586
  });
14919
14587
  var appointmentNotificationSchema = baseNotificationSchema.extend({
14920
- notificationType: import_zod24.z.literal("appointmentStatusChange" /* APPOINTMENT_STATUS_CHANGE */),
14921
- appointmentId: import_zod24.z.string(),
14922
- appointmentStatus: import_zod24.z.string(),
14923
- previousStatus: import_zod24.z.string(),
14924
- reason: import_zod24.z.string().optional()
14588
+ notificationType: import_zod25.z.literal("appointmentStatusChange" /* APPOINTMENT_STATUS_CHANGE */),
14589
+ appointmentId: import_zod25.z.string(),
14590
+ appointmentStatus: import_zod25.z.string(),
14591
+ previousStatus: import_zod25.z.string(),
14592
+ reason: import_zod25.z.string().optional()
14925
14593
  });
14926
- var notificationSchema = import_zod24.z.discriminatedUnion("notificationType", [
14594
+ var notificationSchema = import_zod25.z.discriminatedUnion("notificationType", [
14927
14595
  preRequirementNotificationSchema,
14928
14596
  postRequirementNotificationSchema,
14929
14597
  requirementInstructionDueNotificationSchema,