@blackcode_sa/metaestetics-api 1.5.34 → 1.5.36

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
@@ -30,9 +30,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
+ APPOINTMENTS_COLLECTION: () => APPOINTMENTS_COLLECTION,
33
34
  AUTH_ERRORS: () => AUTH_ERRORS,
34
35
  AdminTokenStatus: () => AdminTokenStatus,
35
36
  AllergyType: () => AllergyType,
37
+ AppointmentService: () => AppointmentService,
38
+ AppointmentStatus: () => AppointmentStatus,
36
39
  AuthService: () => AuthService,
37
40
  BlockingCondition: () => BlockingCondition,
38
41
  BrandService: () => BrandService,
@@ -82,6 +85,7 @@ __export(index_exports, {
82
85
  PRACTITIONERS_COLLECTION: () => PRACTITIONERS_COLLECTION,
83
86
  PROCEDURES_COLLECTION: () => PROCEDURES_COLLECTION,
84
87
  PatientService: () => PatientService,
88
+ PaymentStatus: () => PaymentStatus,
85
89
  PracticeType: () => PracticeType,
86
90
  PractitionerService: () => PractitionerService,
87
91
  PractitionerStatus: () => PractitionerStatus,
@@ -196,6 +200,7 @@ __export(index_exports, {
196
200
  procedureSummaryInfoSchema: () => procedureSummaryInfoSchema,
197
201
  requesterInfoSchema: () => requesterInfoSchema,
198
202
  reviewSchema: () => reviewSchema,
203
+ searchAppointmentsSchema: () => searchAppointmentsSchema,
199
204
  searchPatientsSchema: () => searchPatientsSchema,
200
205
  syncedCalendarEventSchema: () => syncedCalendarEventSchema,
201
206
  timeSlotSchema: () => timeSlotSchema2,
@@ -220,6 +225,109 @@ __export(index_exports, {
220
225
  });
221
226
  module.exports = __toCommonJS(index_exports);
222
227
 
228
+ // src/validations/appointment.schema.ts
229
+ var import_zod = require("zod");
230
+
231
+ // src/types/appointment/index.ts
232
+ var AppointmentStatus = /* @__PURE__ */ ((AppointmentStatus2) => {
233
+ AppointmentStatus2["SCHEDULED"] = "scheduled";
234
+ AppointmentStatus2["CONFIRMED"] = "confirmed";
235
+ AppointmentStatus2["CHECKED_IN"] = "checked_in";
236
+ AppointmentStatus2["IN_PROGRESS"] = "in_progress";
237
+ AppointmentStatus2["COMPLETED"] = "completed";
238
+ AppointmentStatus2["CANCELED_PATIENT"] = "canceled_patient";
239
+ AppointmentStatus2["CANCELED_CLINIC"] = "canceled_clinic";
240
+ AppointmentStatus2["NO_SHOW"] = "no_show";
241
+ AppointmentStatus2["RESCHEDULED"] = "rescheduled";
242
+ return AppointmentStatus2;
243
+ })(AppointmentStatus || {});
244
+ var PaymentStatus = /* @__PURE__ */ ((PaymentStatus3) => {
245
+ PaymentStatus3["UNPAID"] = "unpaid";
246
+ PaymentStatus3["PAID"] = "paid";
247
+ PaymentStatus3["PARTIALLY_PAID"] = "partially_paid";
248
+ PaymentStatus3["REFUNDED"] = "refunded";
249
+ PaymentStatus3["NOT_APPLICABLE"] = "not_applicable";
250
+ return PaymentStatus3;
251
+ })(PaymentStatus || {});
252
+ var APPOINTMENTS_COLLECTION = "appointments";
253
+
254
+ // src/validations/appointment.schema.ts
255
+ var createAppointmentSchema = import_zod.z.object({
256
+ calendarEventId: import_zod.z.string().min(1, "Calendar event ID is required"),
257
+ clinicBranchId: import_zod.z.string().min(1, "Clinic branch ID is required"),
258
+ practitionerId: import_zod.z.string().min(1, "Practitioner ID is required"),
259
+ patientId: import_zod.z.string().min(1, "Patient ID is required"),
260
+ procedureId: import_zod.z.string().min(1, "Procedure ID is required"),
261
+ appointmentStartTime: import_zod.z.any().refine(
262
+ (val) => val instanceof Date || (val == null ? void 0 : val._seconds) !== void 0,
263
+ "Appointment start time must be a valid timestamp"
264
+ ),
265
+ appointmentEndTime: import_zod.z.any().refine(
266
+ (val) => val instanceof Date || (val == null ? void 0 : val._seconds) !== void 0,
267
+ "Appointment end time must be a valid timestamp"
268
+ ),
269
+ cost: import_zod.z.number().min(0, "Cost must be a non-negative number"),
270
+ currency: import_zod.z.string().min(1, "Currency is required"),
271
+ patientNotes: import_zod.z.string().nullable().optional(),
272
+ initialStatus: import_zod.z.nativeEnum(AppointmentStatus, {
273
+ errorMap: () => ({ message: "Invalid appointment status" })
274
+ }),
275
+ initialPaymentStatus: import_zod.z.nativeEnum(PaymentStatus, {
276
+ errorMap: () => ({ message: "Invalid payment status" })
277
+ }).optional().default("unpaid" /* UNPAID */)
278
+ });
279
+ var updateAppointmentSchema = import_zod.z.object({
280
+ status: import_zod.z.nativeEnum(AppointmentStatus, {
281
+ errorMap: () => ({ message: "Invalid appointment status" })
282
+ }).optional(),
283
+ confirmationTime: import_zod.z.any().refine(
284
+ (val) => val === null || val === void 0 || val instanceof Date || (val == null ? void 0 : val._seconds) !== void 0,
285
+ "Confirmation time must be a valid timestamp or null"
286
+ ).optional(),
287
+ actualDurationMinutes: import_zod.z.number().positive("Duration must be positive").optional(),
288
+ cancellationReason: import_zod.z.string().nullable().optional(),
289
+ canceledBy: import_zod.z.enum(["patient", "clinic", "practitioner", "system"]).optional(),
290
+ internalNotes: import_zod.z.string().nullable().optional(),
291
+ paymentStatus: import_zod.z.nativeEnum(PaymentStatus, {
292
+ errorMap: () => ({ message: "Invalid payment status" })
293
+ }).optional(),
294
+ paymentTransactionId: import_zod.z.string().nullable().optional(),
295
+ completedPreRequirements: import_zod.z.array(import_zod.z.string()).optional(),
296
+ completedPostRequirements: import_zod.z.array(import_zod.z.string()).optional()
297
+ }).refine(
298
+ (data) => {
299
+ if (data.status === "canceled_clinic" /* CANCELED_CLINIC */ || data.status === "canceled_patient" /* CANCELED_PATIENT */) {
300
+ return !!data.cancellationReason && !!data.canceledBy;
301
+ }
302
+ return true;
303
+ },
304
+ {
305
+ message: "Cancellation reason and canceled by must be provided when canceling an appointment",
306
+ path: ["status"]
307
+ }
308
+ );
309
+ var searchAppointmentsSchema = import_zod.z.object({
310
+ patientId: import_zod.z.string().optional(),
311
+ practitionerId: import_zod.z.string().optional(),
312
+ clinicBranchId: import_zod.z.string().optional(),
313
+ startDate: import_zod.z.date().optional(),
314
+ endDate: import_zod.z.date().optional(),
315
+ status: import_zod.z.union([
316
+ import_zod.z.nativeEnum(AppointmentStatus),
317
+ import_zod.z.array(import_zod.z.nativeEnum(AppointmentStatus))
318
+ ]).optional(),
319
+ limit: import_zod.z.number().positive().optional(),
320
+ startAfter: import_zod.z.any().optional()
321
+ }).refine(
322
+ (data) => {
323
+ return !!(data.patientId || data.practitionerId || data.clinicBranchId);
324
+ },
325
+ {
326
+ message: "At least one of patientId, practitionerId, or clinicBranchId must be provided",
327
+ path: ["searchCriteria"]
328
+ }
329
+ );
330
+
223
331
  // src/config/firebase.ts
224
332
  var import_app = require("firebase/app");
225
333
  var import_firestore = require("firebase/firestore");
@@ -355,86 +463,86 @@ var UserRole = /* @__PURE__ */ ((UserRole2) => {
355
463
  var USERS_COLLECTION = "users";
356
464
 
357
465
  // src/services/auth.service.ts
358
- var import_zod17 = require("zod");
466
+ var import_zod18 = require("zod");
359
467
 
360
468
  // src/validations/schemas.ts
361
- var import_zod2 = require("zod");
469
+ var import_zod3 = require("zod");
362
470
 
363
471
  // src/validations/documentation-templates/template.schema.ts
364
- var import_zod = require("zod");
365
- var baseElementSchema = import_zod.z.object({
366
- id: import_zod.z.string().optional(),
472
+ var import_zod2 = require("zod");
473
+ var baseElementSchema = import_zod2.z.object({
474
+ id: import_zod2.z.string().optional(),
367
475
  // Make id optional so we can omit it later
368
- type: import_zod.z.nativeEnum(DocumentElementType),
369
- required: import_zod.z.boolean().optional()
476
+ type: import_zod2.z.nativeEnum(DocumentElementType),
477
+ required: import_zod2.z.boolean().optional()
370
478
  });
371
479
  var headingElementSchema = baseElementSchema.extend({
372
- type: import_zod.z.literal("heading" /* HEADING */),
373
- text: import_zod.z.string().min(1).max(200),
374
- level: import_zod.z.nativeEnum(HeadingLevel)
480
+ type: import_zod2.z.literal("heading" /* HEADING */),
481
+ text: import_zod2.z.string().min(1).max(200),
482
+ level: import_zod2.z.nativeEnum(HeadingLevel)
375
483
  });
376
484
  var paragraphElementSchema = baseElementSchema.extend({
377
- type: import_zod.z.literal("paragraph" /* PARAGRAPH */),
378
- text: import_zod.z.string().min(1).max(5e3)
485
+ type: import_zod2.z.literal("paragraph" /* PARAGRAPH */),
486
+ text: import_zod2.z.string().min(1).max(5e3)
379
487
  });
380
488
  var listElementSchema = baseElementSchema.extend({
381
- type: import_zod.z.literal("list" /* LIST */),
382
- items: import_zod.z.array(import_zod.z.string().min(1).max(500)).min(1).max(100),
383
- listType: import_zod.z.nativeEnum(ListType)
489
+ type: import_zod2.z.literal("list" /* LIST */),
490
+ items: import_zod2.z.array(import_zod2.z.string().min(1).max(500)).min(1).max(100),
491
+ listType: import_zod2.z.nativeEnum(ListType)
384
492
  });
385
493
  var dynamicTextElementSchema = baseElementSchema.extend({
386
- type: import_zod.z.literal("dynamic_text" /* DYNAMIC_TEXT */),
387
- text: import_zod.z.string().min(1).max(5e3)
494
+ type: import_zod2.z.literal("dynamic_text" /* DYNAMIC_TEXT */),
495
+ text: import_zod2.z.string().min(1).max(5e3)
388
496
  });
389
497
  var binaryChoiceElementSchema = baseElementSchema.extend({
390
- type: import_zod.z.literal("binary_choice" /* BINARY_CHOICE */),
391
- question: import_zod.z.string().min(1).max(500),
392
- defaultValue: import_zod.z.boolean().optional()
498
+ type: import_zod2.z.literal("binary_choice" /* BINARY_CHOICE */),
499
+ question: import_zod2.z.string().min(1).max(500),
500
+ defaultValue: import_zod2.z.boolean().optional()
393
501
  });
394
502
  var multipleChoiceElementSchema = baseElementSchema.extend({
395
- type: import_zod.z.literal("multiple_choice" /* MULTIPLE_CHOICE */),
396
- question: import_zod.z.string().min(1).max(500),
397
- options: import_zod.z.array(import_zod.z.string().min(1).max(200)).min(2).max(50),
398
- defaultValues: import_zod.z.array(import_zod.z.string()).optional()
503
+ type: import_zod2.z.literal("multiple_choice" /* MULTIPLE_CHOICE */),
504
+ question: import_zod2.z.string().min(1).max(500),
505
+ options: import_zod2.z.array(import_zod2.z.string().min(1).max(200)).min(2).max(50),
506
+ defaultValues: import_zod2.z.array(import_zod2.z.string()).optional()
399
507
  });
400
508
  var singleChoiceElementSchema = baseElementSchema.extend({
401
- type: import_zod.z.literal("single_choice" /* SINGLE_CHOICE */),
402
- question: import_zod.z.string().min(1).max(500),
403
- options: import_zod.z.array(import_zod.z.string().min(1).max(200)).min(2).max(50),
404
- defaultValue: import_zod.z.string().optional()
509
+ type: import_zod2.z.literal("single_choice" /* SINGLE_CHOICE */),
510
+ question: import_zod2.z.string().min(1).max(500),
511
+ options: import_zod2.z.array(import_zod2.z.string().min(1).max(200)).min(2).max(50),
512
+ defaultValue: import_zod2.z.string().optional()
405
513
  });
406
514
  var ratingScaleElementSchema = baseElementSchema.extend({
407
- type: import_zod.z.literal("rating_scale" /* RATING_SCALE */),
408
- question: import_zod.z.string().min(1).max(500),
409
- min: import_zod.z.number().int().min(0).max(10),
410
- max: import_zod.z.number().int().min(1).max(10),
411
- labels: import_zod.z.record(import_zod.z.string()).optional(),
412
- defaultValue: import_zod.z.number().int().optional()
515
+ type: import_zod2.z.literal("rating_scale" /* RATING_SCALE */),
516
+ question: import_zod2.z.string().min(1).max(500),
517
+ min: import_zod2.z.number().int().min(0).max(10),
518
+ max: import_zod2.z.number().int().min(1).max(10),
519
+ labels: import_zod2.z.record(import_zod2.z.string()).optional(),
520
+ defaultValue: import_zod2.z.number().int().optional()
413
521
  });
414
522
  var textInputElementSchema = baseElementSchema.extend({
415
- type: import_zod.z.literal("text_input" /* TEXT_INPUT */),
416
- label: import_zod.z.string().min(1).max(200),
417
- placeholder: import_zod.z.string().max(200).optional(),
418
- multiline: import_zod.z.boolean().optional(),
419
- defaultValue: import_zod.z.string().optional()
523
+ type: import_zod2.z.literal("text_input" /* TEXT_INPUT */),
524
+ label: import_zod2.z.string().min(1).max(200),
525
+ placeholder: import_zod2.z.string().max(200).optional(),
526
+ multiline: import_zod2.z.boolean().optional(),
527
+ defaultValue: import_zod2.z.string().optional()
420
528
  });
421
529
  var datePickerElementSchema = baseElementSchema.extend({
422
- type: import_zod.z.literal("date_picker" /* DATE_PICKER */),
423
- label: import_zod.z.string().min(1).max(200),
424
- defaultValue: import_zod.z.string().optional()
530
+ type: import_zod2.z.literal("date_picker" /* DATE_PICKER */),
531
+ label: import_zod2.z.string().min(1).max(200),
532
+ defaultValue: import_zod2.z.string().optional()
425
533
  // ISO date string
426
534
  });
427
535
  var signatureElementSchema = baseElementSchema.extend({
428
- type: import_zod.z.literal("signature" /* SIGNATURE */),
429
- label: import_zod.z.string().min(1).max(200)
536
+ type: import_zod2.z.literal("signature" /* SIGNATURE */),
537
+ label: import_zod2.z.string().min(1).max(200)
430
538
  });
431
539
  var fileUploadElementSchema = baseElementSchema.extend({
432
- type: import_zod.z.literal("file_upload" /* FILE_UPLOAD */),
433
- label: import_zod.z.string().min(1).max(200),
434
- allowedFileTypes: import_zod.z.array(import_zod.z.string()).optional(),
435
- maxFileSizeMB: import_zod.z.number().positive().optional()
540
+ type: import_zod2.z.literal("file_upload" /* FILE_UPLOAD */),
541
+ label: import_zod2.z.string().min(1).max(200),
542
+ allowedFileTypes: import_zod2.z.array(import_zod2.z.string()).optional(),
543
+ maxFileSizeMB: import_zod2.z.number().positive().optional()
436
544
  });
437
- var documentElementSchema = import_zod.z.discriminatedUnion("type", [
545
+ var documentElementSchema = import_zod2.z.discriminatedUnion("type", [
438
546
  headingElementSchema,
439
547
  paragraphElementSchema,
440
548
  listElementSchema,
@@ -448,7 +556,7 @@ var documentElementSchema = import_zod.z.discriminatedUnion("type", [
448
556
  signatureElementSchema,
449
557
  fileUploadElementSchema
450
558
  ]);
451
- var documentElementWithoutIdSchema = import_zod.z.discriminatedUnion("type", [
559
+ var documentElementWithoutIdSchema = import_zod2.z.discriminatedUnion("type", [
452
560
  headingElementSchema.omit({ id: true }),
453
561
  paragraphElementSchema.omit({ id: true }),
454
562
  listElementSchema.omit({ id: true }),
@@ -462,50 +570,50 @@ var documentElementWithoutIdSchema = import_zod.z.discriminatedUnion("type", [
462
570
  signatureElementSchema.omit({ id: true }),
463
571
  fileUploadElementSchema.omit({ id: true })
464
572
  ]);
465
- var createDocumentTemplateSchema = import_zod.z.object({
466
- title: import_zod.z.string().min(1).max(200),
467
- description: import_zod.z.string().max(1e3).optional(),
468
- elements: import_zod.z.array(documentElementWithoutIdSchema).min(1).max(100),
469
- tags: import_zod.z.array(import_zod.z.string().min(1).max(50)).max(20).optional()
573
+ var createDocumentTemplateSchema = import_zod2.z.object({
574
+ title: import_zod2.z.string().min(1).max(200),
575
+ description: import_zod2.z.string().max(1e3).optional(),
576
+ elements: import_zod2.z.array(documentElementWithoutIdSchema).min(1).max(100),
577
+ tags: import_zod2.z.array(import_zod2.z.string().min(1).max(50)).max(20).optional()
470
578
  });
471
- var updateDocumentTemplateSchema = import_zod.z.object({
472
- title: import_zod.z.string().min(1).max(200).optional(),
473
- description: import_zod.z.string().max(1e3).optional(),
474
- elements: import_zod.z.array(documentElementWithoutIdSchema).min(1).max(100).optional(),
475
- tags: import_zod.z.array(import_zod.z.string().min(1).max(50)).max(20).optional(),
476
- isActive: import_zod.z.boolean().optional()
579
+ var updateDocumentTemplateSchema = import_zod2.z.object({
580
+ title: import_zod2.z.string().min(1).max(200).optional(),
581
+ description: import_zod2.z.string().max(1e3).optional(),
582
+ elements: import_zod2.z.array(documentElementWithoutIdSchema).min(1).max(100).optional(),
583
+ tags: import_zod2.z.array(import_zod2.z.string().min(1).max(50)).max(20).optional(),
584
+ isActive: import_zod2.z.boolean().optional()
477
585
  });
478
- var documentTemplateSchema = import_zod.z.object({
479
- id: import_zod.z.string(),
480
- title: import_zod.z.string().min(1).max(200),
481
- description: import_zod.z.string().max(1e3).optional(),
482
- createdAt: import_zod.z.number(),
483
- updatedAt: import_zod.z.number(),
484
- createdBy: import_zod.z.string(),
485
- elements: import_zod.z.array(documentElementSchema),
486
- tags: import_zod.z.array(import_zod.z.string().min(1).max(50)).max(20).optional(),
487
- version: import_zod.z.number().int().positive(),
488
- isActive: import_zod.z.boolean()
586
+ var documentTemplateSchema = import_zod2.z.object({
587
+ id: import_zod2.z.string(),
588
+ title: import_zod2.z.string().min(1).max(200),
589
+ description: import_zod2.z.string().max(1e3).optional(),
590
+ createdAt: import_zod2.z.number(),
591
+ updatedAt: import_zod2.z.number(),
592
+ createdBy: import_zod2.z.string(),
593
+ elements: import_zod2.z.array(documentElementSchema),
594
+ tags: import_zod2.z.array(import_zod2.z.string().min(1).max(50)).max(20).optional(),
595
+ version: import_zod2.z.number().int().positive(),
596
+ isActive: import_zod2.z.boolean()
489
597
  });
490
598
 
491
599
  // src/validations/schemas.ts
492
- var emailSchema = import_zod2.z.string().email("Invalid email format").min(5, "Email must be at least 5 characters").max(255, "Email must be less than 255 characters");
493
- var passwordSchema = import_zod2.z.string().min(8, "Password must be at least 8 characters").max(100, "Password must be less than 100 characters").regex(
600
+ var emailSchema = import_zod3.z.string().email("Invalid email format").min(5, "Email must be at least 5 characters").max(255, "Email must be less than 255 characters");
601
+ var passwordSchema = import_zod3.z.string().min(8, "Password must be at least 8 characters").max(100, "Password must be less than 100 characters").regex(
494
602
  /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d\w\W]{8,}$/,
495
603
  "Password must contain at least one uppercase letter, one lowercase letter, and one number"
496
604
  );
497
- var userRoleSchema = import_zod2.z.nativeEnum(UserRole);
498
- var userRolesSchema = import_zod2.z.array(userRoleSchema).min(1, "User must have at least one role").max(3, "User cannot have more than 3 roles");
499
- var timestampSchema = import_zod2.z.custom((data) => {
605
+ var userRoleSchema = import_zod3.z.nativeEnum(UserRole);
606
+ var userRolesSchema = import_zod3.z.array(userRoleSchema).min(1, "User must have at least one role").max(3, "User cannot have more than 3 roles");
607
+ var timestampSchema = import_zod3.z.custom((data) => {
500
608
  if (data && typeof data === "object" && "isEqual" in data) {
501
609
  return true;
502
610
  }
503
611
  return data && typeof data === "object" && "toDate" in data && "seconds" in data && "nanoseconds" in data;
504
612
  }, "Must be a Timestamp object or serverTimestamp");
505
- var clinicAdminOptionsSchema = import_zod2.z.object({
506
- isGroupOwner: import_zod2.z.boolean(),
507
- groupToken: import_zod2.z.string().optional(),
508
- groupId: import_zod2.z.string().optional()
613
+ var clinicAdminOptionsSchema = import_zod3.z.object({
614
+ isGroupOwner: import_zod3.z.boolean(),
615
+ groupToken: import_zod3.z.string().optional(),
616
+ groupId: import_zod3.z.string().optional()
509
617
  }).refine(
510
618
  (data) => {
511
619
  if (!data.isGroupOwner && (!data.groupToken || !data.groupId)) {
@@ -520,20 +628,20 @@ var clinicAdminOptionsSchema = import_zod2.z.object({
520
628
  message: "Invalid clinic admin options configuration"
521
629
  }
522
630
  );
523
- var createUserOptionsSchema = import_zod2.z.object({
631
+ var createUserOptionsSchema = import_zod3.z.object({
524
632
  clinicAdminData: clinicAdminOptionsSchema.optional()
525
633
  });
526
- var userSchema = import_zod2.z.object({
527
- uid: import_zod2.z.string(),
528
- email: import_zod2.z.string().email().nullable(),
529
- roles: import_zod2.z.array(userRoleSchema),
530
- isAnonymous: import_zod2.z.boolean(),
634
+ var userSchema = import_zod3.z.object({
635
+ uid: import_zod3.z.string(),
636
+ email: import_zod3.z.string().email().nullable(),
637
+ roles: import_zod3.z.array(userRoleSchema),
638
+ isAnonymous: import_zod3.z.boolean(),
531
639
  createdAt: timestampSchema,
532
640
  updatedAt: timestampSchema,
533
641
  lastLoginAt: timestampSchema,
534
- patientProfile: import_zod2.z.string().optional(),
535
- practitionerProfile: import_zod2.z.string().optional(),
536
- adminProfile: import_zod2.z.string().optional()
642
+ patientProfile: import_zod3.z.string().optional(),
643
+ practitionerProfile: import_zod3.z.string().optional(),
644
+ adminProfile: import_zod3.z.string().optional()
537
645
  });
538
646
 
539
647
  // src/errors/auth.errors.ts
@@ -880,7 +988,7 @@ var USER_ERRORS = {
880
988
  };
881
989
 
882
990
  // src/services/user.service.ts
883
- var import_zod13 = require("zod");
991
+ var import_zod14 = require("zod");
884
992
 
885
993
  // src/services/patient/patient.service.ts
886
994
  var import_firestore9 = require("firebase/firestore");
@@ -888,7 +996,7 @@ var import_firestore9 = require("firebase/firestore");
888
996
  // src/services/patient/utils/profile.utils.ts
889
997
  var import_firestore6 = require("firebase/firestore");
890
998
  var import_storage2 = require("firebase/storage");
891
- var import_zod7 = require("zod");
999
+ var import_zod8 = require("zod");
892
1000
 
893
1001
  // src/types/patient/medical-info.types.ts
894
1002
  var PATIENT_MEDICAL_INFO_COLLECTION = "medical_info";
@@ -917,11 +1025,11 @@ var Gender = /* @__PURE__ */ ((Gender2) => {
917
1025
  })(Gender || {});
918
1026
 
919
1027
  // src/validations/patient.schema.ts
920
- var import_zod5 = require("zod");
1028
+ var import_zod6 = require("zod");
921
1029
  var import_firestore2 = require("firebase/firestore");
922
1030
 
923
1031
  // src/validations/patient/medical-info.schema.ts
924
- var import_zod4 = require("zod");
1032
+ var import_zod5 = require("zod");
925
1033
 
926
1034
  // src/types/patient/allergies.ts
927
1035
  var AllergyType = /* @__PURE__ */ ((AllergyType2) => {
@@ -1010,71 +1118,71 @@ var Contraindication = /* @__PURE__ */ ((Contraindication2) => {
1010
1118
  })(Contraindication || {});
1011
1119
 
1012
1120
  // src/validations/common.schema.ts
1013
- var import_zod3 = require("zod");
1014
- var timestampSchema2 = import_zod3.z.object({
1015
- seconds: import_zod3.z.number(),
1016
- nanoseconds: import_zod3.z.number()
1121
+ var import_zod4 = require("zod");
1122
+ var timestampSchema2 = import_zod4.z.object({
1123
+ seconds: import_zod4.z.number(),
1124
+ nanoseconds: import_zod4.z.number()
1017
1125
  });
1018
1126
 
1019
1127
  // src/validations/patient/medical-info.schema.ts
1020
- var allergySubtypeSchema = import_zod4.z.union([
1021
- import_zod4.z.nativeEnum(MedicationAllergySubtype),
1022
- import_zod4.z.nativeEnum(FoodAllergySubtype),
1023
- import_zod4.z.nativeEnum(EnvironmentalAllergySubtype),
1024
- import_zod4.z.nativeEnum(CosmeticAllergySubtype),
1025
- import_zod4.z.literal("other")
1128
+ var allergySubtypeSchema = import_zod5.z.union([
1129
+ import_zod5.z.nativeEnum(MedicationAllergySubtype),
1130
+ import_zod5.z.nativeEnum(FoodAllergySubtype),
1131
+ import_zod5.z.nativeEnum(EnvironmentalAllergySubtype),
1132
+ import_zod5.z.nativeEnum(CosmeticAllergySubtype),
1133
+ import_zod5.z.literal("other")
1026
1134
  ]);
1027
- var allergySchema = import_zod4.z.object({
1028
- type: import_zod4.z.nativeEnum(AllergyType),
1135
+ var allergySchema = import_zod5.z.object({
1136
+ type: import_zod5.z.nativeEnum(AllergyType),
1029
1137
  subtype: allergySubtypeSchema,
1030
- name: import_zod4.z.string().optional(),
1031
- severity: import_zod4.z.enum(["mild", "moderate", "severe"]).optional(),
1032
- reaction: import_zod4.z.string().optional(),
1138
+ name: import_zod5.z.string().optional(),
1139
+ severity: import_zod5.z.enum(["mild", "moderate", "severe"]).optional(),
1140
+ reaction: import_zod5.z.string().optional(),
1033
1141
  diagnosed: timestampSchema2.optional(),
1034
- notes: import_zod4.z.string().optional()
1142
+ notes: import_zod5.z.string().optional()
1035
1143
  });
1036
- var vitalStatsSchema = import_zod4.z.object({
1037
- height: import_zod4.z.number().positive().optional(),
1038
- weight: import_zod4.z.number().positive().optional(),
1039
- bloodType: import_zod4.z.enum(["A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-"]).optional(),
1040
- bloodPressure: import_zod4.z.object({
1041
- systolic: import_zod4.z.number().min(70).max(200),
1042
- diastolic: import_zod4.z.number().min(40).max(130),
1144
+ var vitalStatsSchema = import_zod5.z.object({
1145
+ height: import_zod5.z.number().positive().optional(),
1146
+ weight: import_zod5.z.number().positive().optional(),
1147
+ bloodType: import_zod5.z.enum(["A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-"]).optional(),
1148
+ bloodPressure: import_zod5.z.object({
1149
+ systolic: import_zod5.z.number().min(70).max(200),
1150
+ diastolic: import_zod5.z.number().min(40).max(130),
1043
1151
  lastMeasured: timestampSchema2
1044
1152
  }).optional()
1045
1153
  });
1046
- var blockingConditionSchema = import_zod4.z.object({
1047
- condition: import_zod4.z.nativeEnum(BlockingCondition),
1154
+ var blockingConditionSchema = import_zod5.z.object({
1155
+ condition: import_zod5.z.nativeEnum(BlockingCondition),
1048
1156
  diagnosedAt: timestampSchema2,
1049
- notes: import_zod4.z.string().optional(),
1050
- isActive: import_zod4.z.boolean()
1157
+ notes: import_zod5.z.string().optional(),
1158
+ isActive: import_zod5.z.boolean()
1051
1159
  });
1052
- var contraindicationSchema = import_zod4.z.object({
1053
- condition: import_zod4.z.nativeEnum(Contraindication),
1160
+ var contraindicationSchema = import_zod5.z.object({
1161
+ condition: import_zod5.z.nativeEnum(Contraindication),
1054
1162
  lastOccurrence: timestampSchema2,
1055
- frequency: import_zod4.z.enum(["rare", "occasional", "frequent"]),
1056
- notes: import_zod4.z.string().optional(),
1057
- isActive: import_zod4.z.boolean()
1163
+ frequency: import_zod5.z.enum(["rare", "occasional", "frequent"]),
1164
+ notes: import_zod5.z.string().optional(),
1165
+ isActive: import_zod5.z.boolean()
1058
1166
  });
1059
- var medicationSchema = import_zod4.z.object({
1060
- name: import_zod4.z.string().min(1),
1061
- dosage: import_zod4.z.string().min(1),
1062
- frequency: import_zod4.z.string().min(1),
1167
+ var medicationSchema = import_zod5.z.object({
1168
+ name: import_zod5.z.string().min(1),
1169
+ dosage: import_zod5.z.string().min(1),
1170
+ frequency: import_zod5.z.string().min(1),
1063
1171
  startDate: timestampSchema2,
1064
1172
  endDate: timestampSchema2.optional(),
1065
- prescribedBy: import_zod4.z.string().optional()
1173
+ prescribedBy: import_zod5.z.string().optional()
1066
1174
  });
1067
- var patientMedicalInfoSchema = import_zod4.z.object({
1068
- patientId: import_zod4.z.string(),
1175
+ var patientMedicalInfoSchema = import_zod5.z.object({
1176
+ patientId: import_zod5.z.string(),
1069
1177
  vitalStats: vitalStatsSchema,
1070
- blockingConditions: import_zod4.z.array(blockingConditionSchema),
1071
- contraindications: import_zod4.z.array(contraindicationSchema),
1072
- allergies: import_zod4.z.array(allergySchema),
1073
- currentMedications: import_zod4.z.array(medicationSchema),
1074
- emergencyNotes: import_zod4.z.string().optional(),
1178
+ blockingConditions: import_zod5.z.array(blockingConditionSchema),
1179
+ contraindications: import_zod5.z.array(contraindicationSchema),
1180
+ allergies: import_zod5.z.array(allergySchema),
1181
+ currentMedications: import_zod5.z.array(medicationSchema),
1182
+ emergencyNotes: import_zod5.z.string().optional(),
1075
1183
  lastUpdated: timestampSchema2,
1076
- updatedBy: import_zod4.z.string(),
1077
- verifiedBy: import_zod4.z.string().optional(),
1184
+ updatedBy: import_zod5.z.string(),
1185
+ verifiedBy: import_zod5.z.string().optional(),
1078
1186
  verifiedAt: timestampSchema2.optional()
1079
1187
  });
1080
1188
  var createPatientMedicalInfoSchema = patientMedicalInfoSchema.omit({
@@ -1088,141 +1196,141 @@ var updatePatientMedicalInfoSchema = createPatientMedicalInfoSchema.partial();
1088
1196
  var updateVitalStatsSchema = vitalStatsSchema;
1089
1197
  var addAllergySchema = allergySchema;
1090
1198
  var updateAllergySchema = allergySchema.partial().extend({
1091
- allergyIndex: import_zod4.z.number().min(0)
1199
+ allergyIndex: import_zod5.z.number().min(0)
1092
1200
  });
1093
1201
  var addBlockingConditionSchema = blockingConditionSchema;
1094
1202
  var updateBlockingConditionSchema = blockingConditionSchema.partial().extend({
1095
- conditionIndex: import_zod4.z.number().min(0)
1203
+ conditionIndex: import_zod5.z.number().min(0)
1096
1204
  });
1097
1205
  var addContraindicationSchema = contraindicationSchema;
1098
1206
  var updateContraindicationSchema = contraindicationSchema.partial().extend({
1099
- contraindicationIndex: import_zod4.z.number().min(0)
1207
+ contraindicationIndex: import_zod5.z.number().min(0)
1100
1208
  });
1101
1209
  var addMedicationSchema = medicationSchema;
1102
1210
  var updateMedicationSchema = medicationSchema.partial().extend({
1103
- medicationIndex: import_zod4.z.number().min(0)
1211
+ medicationIndex: import_zod5.z.number().min(0)
1104
1212
  });
1105
1213
 
1106
1214
  // src/validations/patient.schema.ts
1107
- var locationDataSchema = import_zod5.z.object({
1108
- latitude: import_zod5.z.number().min(-90).max(90),
1109
- longitude: import_zod5.z.number().min(-180).max(180),
1110
- geohash: import_zod5.z.string().optional()
1215
+ var locationDataSchema = import_zod6.z.object({
1216
+ latitude: import_zod6.z.number().min(-90).max(90),
1217
+ longitude: import_zod6.z.number().min(-180).max(180),
1218
+ geohash: import_zod6.z.string().optional()
1111
1219
  });
1112
- var addressDataSchema = import_zod5.z.object({
1113
- address: import_zod5.z.string(),
1114
- city: import_zod5.z.string(),
1115
- country: import_zod5.z.string(),
1116
- postalCode: import_zod5.z.string()
1220
+ var addressDataSchema = import_zod6.z.object({
1221
+ address: import_zod6.z.string(),
1222
+ city: import_zod6.z.string(),
1223
+ country: import_zod6.z.string(),
1224
+ postalCode: import_zod6.z.string()
1117
1225
  });
1118
- var emergencyContactSchema = import_zod5.z.object({
1119
- name: import_zod5.z.string(),
1120
- relationship: import_zod5.z.string(),
1121
- phoneNumber: import_zod5.z.string(),
1122
- isNotifiable: import_zod5.z.boolean()
1226
+ var emergencyContactSchema = import_zod6.z.object({
1227
+ name: import_zod6.z.string(),
1228
+ relationship: import_zod6.z.string(),
1229
+ phoneNumber: import_zod6.z.string(),
1230
+ isNotifiable: import_zod6.z.boolean()
1123
1231
  });
1124
- var gamificationSchema = import_zod5.z.object({
1125
- level: import_zod5.z.number(),
1126
- points: import_zod5.z.number()
1232
+ var gamificationSchema = import_zod6.z.object({
1233
+ level: import_zod6.z.number(),
1234
+ points: import_zod6.z.number()
1127
1235
  });
1128
- var patientLocationInfoSchema = import_zod5.z.object({
1129
- patientId: import_zod5.z.string(),
1130
- userRef: import_zod5.z.string(),
1236
+ var patientLocationInfoSchema = import_zod6.z.object({
1237
+ patientId: import_zod6.z.string(),
1238
+ userRef: import_zod6.z.string(),
1131
1239
  locationData: locationDataSchema,
1132
- createdAt: import_zod5.z.instanceof(import_firestore2.Timestamp),
1133
- updatedAt: import_zod5.z.instanceof(import_firestore2.Timestamp)
1240
+ createdAt: import_zod6.z.instanceof(import_firestore2.Timestamp),
1241
+ updatedAt: import_zod6.z.instanceof(import_firestore2.Timestamp)
1134
1242
  });
1135
- var createPatientLocationInfoSchema = import_zod5.z.object({
1136
- patientId: import_zod5.z.string(),
1137
- userRef: import_zod5.z.string(),
1243
+ var createPatientLocationInfoSchema = import_zod6.z.object({
1244
+ patientId: import_zod6.z.string(),
1245
+ userRef: import_zod6.z.string(),
1138
1246
  locationData: locationDataSchema
1139
1247
  });
1140
- var patientSensitiveInfoSchema = import_zod5.z.object({
1141
- patientId: import_zod5.z.string(),
1142
- userRef: import_zod5.z.string(),
1143
- photoUrl: import_zod5.z.string().optional(),
1144
- firstName: import_zod5.z.string().min(2),
1145
- lastName: import_zod5.z.string().min(2),
1146
- dateOfBirth: import_zod5.z.instanceof(import_firestore2.Timestamp).nullable(),
1147
- gender: import_zod5.z.nativeEnum(Gender),
1148
- email: import_zod5.z.string().email().optional(),
1149
- phoneNumber: import_zod5.z.string().optional(),
1150
- alternativePhoneNumber: import_zod5.z.string().optional(),
1248
+ var patientSensitiveInfoSchema = import_zod6.z.object({
1249
+ patientId: import_zod6.z.string(),
1250
+ userRef: import_zod6.z.string(),
1251
+ photoUrl: import_zod6.z.string().optional(),
1252
+ firstName: import_zod6.z.string().min(2),
1253
+ lastName: import_zod6.z.string().min(2),
1254
+ dateOfBirth: import_zod6.z.instanceof(import_firestore2.Timestamp).nullable(),
1255
+ gender: import_zod6.z.nativeEnum(Gender),
1256
+ email: import_zod6.z.string().email().optional(),
1257
+ phoneNumber: import_zod6.z.string().optional(),
1258
+ alternativePhoneNumber: import_zod6.z.string().optional(),
1151
1259
  addressData: addressDataSchema.optional(),
1152
- emergencyContacts: import_zod5.z.array(emergencyContactSchema).optional(),
1153
- createdAt: import_zod5.z.instanceof(import_firestore2.Timestamp),
1154
- updatedAt: import_zod5.z.instanceof(import_firestore2.Timestamp)
1260
+ emergencyContacts: import_zod6.z.array(emergencyContactSchema).optional(),
1261
+ createdAt: import_zod6.z.instanceof(import_firestore2.Timestamp),
1262
+ updatedAt: import_zod6.z.instanceof(import_firestore2.Timestamp)
1155
1263
  });
1156
- var patientDoctorSchema = import_zod5.z.object({
1157
- userRef: import_zod5.z.string(),
1158
- assignedAt: import_zod5.z.instanceof(import_firestore2.Timestamp),
1159
- assignedBy: import_zod5.z.string().optional(),
1160
- isActive: import_zod5.z.boolean(),
1161
- notes: import_zod5.z.string().optional()
1264
+ var patientDoctorSchema = import_zod6.z.object({
1265
+ userRef: import_zod6.z.string(),
1266
+ assignedAt: import_zod6.z.instanceof(import_firestore2.Timestamp),
1267
+ assignedBy: import_zod6.z.string().optional(),
1268
+ isActive: import_zod6.z.boolean(),
1269
+ notes: import_zod6.z.string().optional()
1162
1270
  });
1163
- var patientClinicSchema = import_zod5.z.object({
1164
- clinicId: import_zod5.z.string(),
1165
- assignedAt: import_zod5.z.instanceof(import_firestore2.Timestamp),
1166
- assignedBy: import_zod5.z.string().optional(),
1167
- isActive: import_zod5.z.boolean(),
1168
- notes: import_zod5.z.string().optional()
1271
+ var patientClinicSchema = import_zod6.z.object({
1272
+ clinicId: import_zod6.z.string(),
1273
+ assignedAt: import_zod6.z.instanceof(import_firestore2.Timestamp),
1274
+ assignedBy: import_zod6.z.string().optional(),
1275
+ isActive: import_zod6.z.boolean(),
1276
+ notes: import_zod6.z.string().optional()
1169
1277
  });
1170
- var patientProfileSchema = import_zod5.z.object({
1171
- id: import_zod5.z.string(),
1172
- userRef: import_zod5.z.string(),
1173
- displayName: import_zod5.z.string(),
1174
- profilePhoto: import_zod5.z.string().url().nullable(),
1278
+ var patientProfileSchema = import_zod6.z.object({
1279
+ id: import_zod6.z.string(),
1280
+ userRef: import_zod6.z.string(),
1281
+ displayName: import_zod6.z.string(),
1282
+ profilePhoto: import_zod6.z.string().url().nullable(),
1175
1283
  gamification: gamificationSchema,
1176
- expoTokens: import_zod5.z.array(import_zod5.z.string()),
1177
- isActive: import_zod5.z.boolean(),
1178
- isVerified: import_zod5.z.boolean(),
1179
- doctors: import_zod5.z.array(patientDoctorSchema),
1180
- clinics: import_zod5.z.array(patientClinicSchema),
1181
- doctorIds: import_zod5.z.array(import_zod5.z.string()),
1182
- clinicIds: import_zod5.z.array(import_zod5.z.string()),
1183
- createdAt: import_zod5.z.instanceof(import_firestore2.Timestamp),
1184
- updatedAt: import_zod5.z.instanceof(import_firestore2.Timestamp)
1284
+ expoTokens: import_zod6.z.array(import_zod6.z.string()),
1285
+ isActive: import_zod6.z.boolean(),
1286
+ isVerified: import_zod6.z.boolean(),
1287
+ doctors: import_zod6.z.array(patientDoctorSchema),
1288
+ clinics: import_zod6.z.array(patientClinicSchema),
1289
+ doctorIds: import_zod6.z.array(import_zod6.z.string()),
1290
+ clinicIds: import_zod6.z.array(import_zod6.z.string()),
1291
+ createdAt: import_zod6.z.instanceof(import_firestore2.Timestamp),
1292
+ updatedAt: import_zod6.z.instanceof(import_firestore2.Timestamp)
1185
1293
  });
1186
- var createPatientProfileSchema = import_zod5.z.object({
1187
- userRef: import_zod5.z.string(),
1188
- displayName: import_zod5.z.string(),
1189
- profilePhoto: import_zod5.z.string().url().nullable().optional(),
1190
- expoTokens: import_zod5.z.array(import_zod5.z.string()),
1294
+ var createPatientProfileSchema = import_zod6.z.object({
1295
+ userRef: import_zod6.z.string(),
1296
+ displayName: import_zod6.z.string(),
1297
+ profilePhoto: import_zod6.z.string().url().nullable().optional(),
1298
+ expoTokens: import_zod6.z.array(import_zod6.z.string()),
1191
1299
  gamification: gamificationSchema.optional(),
1192
- isActive: import_zod5.z.boolean(),
1193
- isVerified: import_zod5.z.boolean(),
1194
- doctors: import_zod5.z.array(patientDoctorSchema).optional(),
1195
- clinics: import_zod5.z.array(patientClinicSchema).optional(),
1196
- doctorIds: import_zod5.z.array(import_zod5.z.string()).optional(),
1197
- clinicIds: import_zod5.z.array(import_zod5.z.string()).optional()
1300
+ isActive: import_zod6.z.boolean(),
1301
+ isVerified: import_zod6.z.boolean(),
1302
+ doctors: import_zod6.z.array(patientDoctorSchema).optional(),
1303
+ clinics: import_zod6.z.array(patientClinicSchema).optional(),
1304
+ doctorIds: import_zod6.z.array(import_zod6.z.string()).optional(),
1305
+ clinicIds: import_zod6.z.array(import_zod6.z.string()).optional()
1198
1306
  });
1199
- var createPatientSensitiveInfoSchema = import_zod5.z.object({
1200
- patientId: import_zod5.z.string(),
1201
- userRef: import_zod5.z.string(),
1202
- photoUrl: import_zod5.z.string().optional(),
1203
- firstName: import_zod5.z.string().min(2),
1204
- lastName: import_zod5.z.string().min(2),
1205
- dateOfBirth: import_zod5.z.instanceof(import_firestore2.Timestamp).nullable(),
1206
- gender: import_zod5.z.nativeEnum(Gender),
1207
- email: import_zod5.z.string().email().optional(),
1208
- phoneNumber: import_zod5.z.string().optional(),
1209
- alternativePhoneNumber: import_zod5.z.string().optional(),
1307
+ var createPatientSensitiveInfoSchema = import_zod6.z.object({
1308
+ patientId: import_zod6.z.string(),
1309
+ userRef: import_zod6.z.string(),
1310
+ photoUrl: import_zod6.z.string().optional(),
1311
+ firstName: import_zod6.z.string().min(2),
1312
+ lastName: import_zod6.z.string().min(2),
1313
+ dateOfBirth: import_zod6.z.instanceof(import_firestore2.Timestamp).nullable(),
1314
+ gender: import_zod6.z.nativeEnum(Gender),
1315
+ email: import_zod6.z.string().email().optional(),
1316
+ phoneNumber: import_zod6.z.string().optional(),
1317
+ alternativePhoneNumber: import_zod6.z.string().optional(),
1210
1318
  addressData: addressDataSchema.optional(),
1211
- emergencyContacts: import_zod5.z.array(emergencyContactSchema).optional()
1319
+ emergencyContacts: import_zod6.z.array(emergencyContactSchema).optional()
1212
1320
  });
1213
- var searchPatientsSchema = import_zod5.z.object({
1214
- clinicId: import_zod5.z.string().optional(),
1215
- practitionerId: import_zod5.z.string().optional()
1321
+ var searchPatientsSchema = import_zod6.z.object({
1322
+ clinicId: import_zod6.z.string().optional(),
1323
+ practitionerId: import_zod6.z.string().optional()
1216
1324
  }).refine((data) => data.clinicId || data.practitionerId, {
1217
1325
  message: "At least one of clinicId or practitionerId must be provided",
1218
1326
  path: []
1219
1327
  // Optional: specify a path like ['clinicId'] or ['practitionerId']
1220
1328
  });
1221
- var requesterInfoSchema = import_zod5.z.object({
1222
- id: import_zod5.z.string(),
1223
- role: import_zod5.z.enum(["clinic_admin", "practitioner"]),
1224
- associatedClinicId: import_zod5.z.string().optional(),
1225
- associatedPractitionerId: import_zod5.z.string().optional()
1329
+ var requesterInfoSchema = import_zod6.z.object({
1330
+ id: import_zod6.z.string(),
1331
+ role: import_zod6.z.enum(["clinic_admin", "practitioner"]),
1332
+ associatedClinicId: import_zod6.z.string().optional(),
1333
+ associatedPractitionerId: import_zod6.z.string().optional()
1226
1334
  }).refine(
1227
1335
  (data) => {
1228
1336
  if (data.role === "clinic_admin") {
@@ -1243,7 +1351,7 @@ var import_firestore4 = require("firebase/firestore");
1243
1351
 
1244
1352
  // src/services/patient/utils/sensitive.utils.ts
1245
1353
  var import_firestore3 = require("firebase/firestore");
1246
- var import_zod6 = require("zod");
1354
+ var import_zod7 = require("zod");
1247
1355
  var createSensitiveInfoUtil = async (db, data, requesterUserId) => {
1248
1356
  try {
1249
1357
  if (data.userRef !== requesterUserId) {
@@ -1268,7 +1376,7 @@ var createSensitiveInfoUtil = async (db, data, requesterUserId) => {
1268
1376
  }
1269
1377
  return createdDoc.data();
1270
1378
  } catch (error) {
1271
- if (error instanceof import_zod6.z.ZodError) {
1379
+ if (error instanceof import_zod7.z.ZodError) {
1272
1380
  throw new Error("Invalid sensitive info data: " + error.message);
1273
1381
  }
1274
1382
  throw error;
@@ -1501,9 +1609,9 @@ var addAllergyUtil = async (db, patientId, data, userRef) => {
1501
1609
  var updateAllergyUtil = async (db, patientId, data, userRef) => {
1502
1610
  const validatedData = updateAllergySchema.parse(data);
1503
1611
  const { allergyIndex, ...updateData } = validatedData;
1504
- const doc29 = await (0, import_firestore5.getDoc)(getMedicalInfoDocRef(db, patientId));
1505
- if (!doc29.exists()) throw new Error("Medical info not found");
1506
- const medicalInfo = doc29.data();
1612
+ const doc30 = await (0, import_firestore5.getDoc)(getMedicalInfoDocRef(db, patientId));
1613
+ if (!doc30.exists()) throw new Error("Medical info not found");
1614
+ const medicalInfo = doc30.data();
1507
1615
  if (allergyIndex >= medicalInfo.allergies.length) {
1508
1616
  throw new Error("Invalid allergy index");
1509
1617
  }
@@ -1519,9 +1627,9 @@ var updateAllergyUtil = async (db, patientId, data, userRef) => {
1519
1627
  });
1520
1628
  };
1521
1629
  var removeAllergyUtil = async (db, patientId, allergyIndex, userRef) => {
1522
- const doc29 = await (0, import_firestore5.getDoc)(getMedicalInfoDocRef(db, patientId));
1523
- if (!doc29.exists()) throw new Error("Medical info not found");
1524
- const medicalInfo = doc29.data();
1630
+ const doc30 = await (0, import_firestore5.getDoc)(getMedicalInfoDocRef(db, patientId));
1631
+ if (!doc30.exists()) throw new Error("Medical info not found");
1632
+ const medicalInfo = doc30.data();
1525
1633
  if (allergyIndex >= medicalInfo.allergies.length) {
1526
1634
  throw new Error("Invalid allergy index");
1527
1635
  }
@@ -1546,9 +1654,9 @@ var addBlockingConditionUtil = async (db, patientId, data, userRef) => {
1546
1654
  var updateBlockingConditionUtil = async (db, patientId, data, userRef) => {
1547
1655
  const validatedData = updateBlockingConditionSchema.parse(data);
1548
1656
  const { conditionIndex, ...updateData } = validatedData;
1549
- const doc29 = await (0, import_firestore5.getDoc)(getMedicalInfoDocRef(db, patientId));
1550
- if (!doc29.exists()) throw new Error("Medical info not found");
1551
- const medicalInfo = doc29.data();
1657
+ const doc30 = await (0, import_firestore5.getDoc)(getMedicalInfoDocRef(db, patientId));
1658
+ if (!doc30.exists()) throw new Error("Medical info not found");
1659
+ const medicalInfo = doc30.data();
1552
1660
  if (conditionIndex >= medicalInfo.blockingConditions.length) {
1553
1661
  throw new Error("Invalid blocking condition index");
1554
1662
  }
@@ -1564,9 +1672,9 @@ var updateBlockingConditionUtil = async (db, patientId, data, userRef) => {
1564
1672
  });
1565
1673
  };
1566
1674
  var removeBlockingConditionUtil = async (db, patientId, conditionIndex, userRef) => {
1567
- const doc29 = await (0, import_firestore5.getDoc)(getMedicalInfoDocRef(db, patientId));
1568
- if (!doc29.exists()) throw new Error("Medical info not found");
1569
- const medicalInfo = doc29.data();
1675
+ const doc30 = await (0, import_firestore5.getDoc)(getMedicalInfoDocRef(db, patientId));
1676
+ if (!doc30.exists()) throw new Error("Medical info not found");
1677
+ const medicalInfo = doc30.data();
1570
1678
  if (conditionIndex >= medicalInfo.blockingConditions.length) {
1571
1679
  throw new Error("Invalid blocking condition index");
1572
1680
  }
@@ -1591,9 +1699,9 @@ var addContraindicationUtil = async (db, patientId, data, userRef) => {
1591
1699
  var updateContraindicationUtil = async (db, patientId, data, userRef) => {
1592
1700
  const validatedData = updateContraindicationSchema.parse(data);
1593
1701
  const { contraindicationIndex, ...updateData } = validatedData;
1594
- const doc29 = await (0, import_firestore5.getDoc)(getMedicalInfoDocRef(db, patientId));
1595
- if (!doc29.exists()) throw new Error("Medical info not found");
1596
- const medicalInfo = doc29.data();
1702
+ const doc30 = await (0, import_firestore5.getDoc)(getMedicalInfoDocRef(db, patientId));
1703
+ if (!doc30.exists()) throw new Error("Medical info not found");
1704
+ const medicalInfo = doc30.data();
1597
1705
  if (contraindicationIndex >= medicalInfo.contraindications.length) {
1598
1706
  throw new Error("Invalid contraindication index");
1599
1707
  }
@@ -1609,9 +1717,9 @@ var updateContraindicationUtil = async (db, patientId, data, userRef) => {
1609
1717
  });
1610
1718
  };
1611
1719
  var removeContraindicationUtil = async (db, patientId, contraindicationIndex, userRef) => {
1612
- const doc29 = await (0, import_firestore5.getDoc)(getMedicalInfoDocRef(db, patientId));
1613
- if (!doc29.exists()) throw new Error("Medical info not found");
1614
- const medicalInfo = doc29.data();
1720
+ const doc30 = await (0, import_firestore5.getDoc)(getMedicalInfoDocRef(db, patientId));
1721
+ if (!doc30.exists()) throw new Error("Medical info not found");
1722
+ const medicalInfo = doc30.data();
1615
1723
  if (contraindicationIndex >= medicalInfo.contraindications.length) {
1616
1724
  throw new Error("Invalid contraindication index");
1617
1725
  }
@@ -1636,9 +1744,9 @@ var addMedicationUtil = async (db, patientId, data, userRef) => {
1636
1744
  var updateMedicationUtil = async (db, patientId, data, userRef) => {
1637
1745
  const validatedData = updateMedicationSchema.parse(data);
1638
1746
  const { medicationIndex, ...updateData } = validatedData;
1639
- const doc29 = await (0, import_firestore5.getDoc)(getMedicalInfoDocRef(db, patientId));
1640
- if (!doc29.exists()) throw new Error("Medical info not found");
1641
- const medicalInfo = doc29.data();
1747
+ const doc30 = await (0, import_firestore5.getDoc)(getMedicalInfoDocRef(db, patientId));
1748
+ if (!doc30.exists()) throw new Error("Medical info not found");
1749
+ const medicalInfo = doc30.data();
1642
1750
  if (medicationIndex >= medicalInfo.currentMedications.length) {
1643
1751
  throw new Error("Invalid medication index");
1644
1752
  }
@@ -1654,9 +1762,9 @@ var updateMedicationUtil = async (db, patientId, data, userRef) => {
1654
1762
  });
1655
1763
  };
1656
1764
  var removeMedicationUtil = async (db, patientId, medicationIndex, userRef) => {
1657
- const doc29 = await (0, import_firestore5.getDoc)(getMedicalInfoDocRef(db, patientId));
1658
- if (!doc29.exists()) throw new Error("Medical info not found");
1659
- const medicalInfo = doc29.data();
1765
+ const doc30 = await (0, import_firestore5.getDoc)(getMedicalInfoDocRef(db, patientId));
1766
+ if (!doc30.exists()) throw new Error("Medical info not found");
1767
+ const medicalInfo = doc30.data();
1660
1768
  if (medicationIndex >= medicalInfo.currentMedications.length) {
1661
1769
  throw new Error("Invalid medication index");
1662
1770
  }
@@ -1746,7 +1854,7 @@ var createPatientProfileUtil = async (db, data, generateId2) => {
1746
1854
  return patientDoc.data();
1747
1855
  } catch (error) {
1748
1856
  console.error(`[createPatientProfileUtil] Error in patient profile creation:`, error);
1749
- if (error instanceof import_zod7.z.ZodError) {
1857
+ if (error instanceof import_zod8.z.ZodError) {
1750
1858
  throw new Error("Invalid patient data: " + error.message);
1751
1859
  }
1752
1860
  throw error;
@@ -1934,7 +2042,7 @@ var searchPatientsUtil = async (db, params, requester) => {
1934
2042
  try {
1935
2043
  const finalQuery = (0, import_firestore6.query)(patientsCollectionRef, ...constraints);
1936
2044
  const querySnapshot = await (0, import_firestore6.getDocs)(finalQuery);
1937
- const patients = querySnapshot.docs.map((doc29) => doc29.data());
2045
+ const patients = querySnapshot.docs.map((doc30) => doc30.data());
1938
2046
  console.log(`[searchPatientsUtil] Found ${patients.length} patients matching criteria.`);
1939
2047
  return patients;
1940
2048
  } catch (error) {
@@ -1958,8 +2066,8 @@ var getAllPatientsUtil = async (db, options) => {
1958
2066
  }
1959
2067
  const patientsSnapshot = await (0, import_firestore6.getDocs)(q);
1960
2068
  const patients = [];
1961
- patientsSnapshot.forEach((doc29) => {
1962
- patients.push(doc29.data());
2069
+ patientsSnapshot.forEach((doc30) => {
2070
+ patients.push(doc30.data());
1963
2071
  });
1964
2072
  console.log(`[getAllPatientsUtil] Found ${patients.length} patients`);
1965
2073
  return patients;
@@ -1973,7 +2081,7 @@ var getAllPatientsUtil = async (db, options) => {
1973
2081
 
1974
2082
  // src/services/patient/utils/location.utils.ts
1975
2083
  var import_firestore7 = require("firebase/firestore");
1976
- var import_zod8 = require("zod");
2084
+ var import_zod9 = require("zod");
1977
2085
  var import_geofire_common = require("geofire-common");
1978
2086
  var updatePatientLocationUtil = async (db, patientId, latitude, longitude) => {
1979
2087
  const locationData = {
@@ -2012,7 +2120,7 @@ var createLocationInfoUtil = async (db, data, requesterId) => {
2012
2120
  }
2013
2121
  return locationDoc.data();
2014
2122
  } catch (error) {
2015
- if (error instanceof import_zod8.z.ZodError) {
2123
+ if (error instanceof import_zod9.z.ZodError) {
2016
2124
  throw new Error("Invalid location data: " + error.message);
2017
2125
  }
2018
2126
  throw error;
@@ -2506,11 +2614,11 @@ var SubscriptionModel = /* @__PURE__ */ ((SubscriptionModel2) => {
2506
2614
  })(SubscriptionModel || {});
2507
2615
 
2508
2616
  // src/validations/clinic.schema.ts
2509
- var import_zod11 = require("zod");
2617
+ var import_zod12 = require("zod");
2510
2618
  var import_firestore11 = require("firebase/firestore");
2511
2619
 
2512
2620
  // src/validations/practitioner.schema.ts
2513
- var import_zod10 = require("zod");
2621
+ var import_zod11 = require("zod");
2514
2622
  var import_firestore10 = require("firebase/firestore");
2515
2623
 
2516
2624
  // src/backoffice/types/static/certification.types.ts
@@ -2554,128 +2662,128 @@ var PractitionerTokenStatus = /* @__PURE__ */ ((PractitionerTokenStatus2) => {
2554
2662
  })(PractitionerTokenStatus || {});
2555
2663
 
2556
2664
  // src/validations/reviews.schema.ts
2557
- var import_zod9 = require("zod");
2558
- var baseReviewSchema = import_zod9.z.object({
2559
- id: import_zod9.z.string().min(1),
2560
- patientId: import_zod9.z.string().min(1),
2561
- fullReviewId: import_zod9.z.string().min(1),
2562
- createdAt: import_zod9.z.date(),
2563
- updatedAt: import_zod9.z.date(),
2564
- comment: import_zod9.z.string().min(1).max(2e3),
2565
- isVerified: import_zod9.z.boolean(),
2566
- isPublished: import_zod9.z.boolean()
2665
+ var import_zod10 = require("zod");
2666
+ var baseReviewSchema = import_zod10.z.object({
2667
+ id: import_zod10.z.string().min(1),
2668
+ patientId: import_zod10.z.string().min(1),
2669
+ fullReviewId: import_zod10.z.string().min(1),
2670
+ createdAt: import_zod10.z.date(),
2671
+ updatedAt: import_zod10.z.date(),
2672
+ comment: import_zod10.z.string().min(1).max(2e3),
2673
+ isVerified: import_zod10.z.boolean(),
2674
+ isPublished: import_zod10.z.boolean()
2567
2675
  });
2568
- var baseReviewCreateSchema = import_zod9.z.object({
2569
- patientId: import_zod9.z.string().min(1),
2570
- comment: import_zod9.z.string().min(1).max(2e3),
2571
- isVerified: import_zod9.z.boolean().default(false),
2572
- isPublished: import_zod9.z.boolean().default(true)
2676
+ var baseReviewCreateSchema = import_zod10.z.object({
2677
+ patientId: import_zod10.z.string().min(1),
2678
+ comment: import_zod10.z.string().min(1).max(2e3),
2679
+ isVerified: import_zod10.z.boolean().default(false),
2680
+ isPublished: import_zod10.z.boolean().default(true)
2573
2681
  });
2574
2682
  var clinicReviewSchema = baseReviewSchema.extend({
2575
- clinicId: import_zod9.z.string().min(1),
2576
- cleanliness: import_zod9.z.number().min(1).max(5),
2577
- facilities: import_zod9.z.number().min(1).max(5),
2578
- staffFriendliness: import_zod9.z.number().min(1).max(5),
2579
- waitingTime: import_zod9.z.number().min(1).max(5),
2580
- accessibility: import_zod9.z.number().min(1).max(5),
2581
- overallRating: import_zod9.z.number().min(1).max(5),
2582
- wouldRecommend: import_zod9.z.boolean()
2683
+ clinicId: import_zod10.z.string().min(1),
2684
+ cleanliness: import_zod10.z.number().min(1).max(5),
2685
+ facilities: import_zod10.z.number().min(1).max(5),
2686
+ staffFriendliness: import_zod10.z.number().min(1).max(5),
2687
+ waitingTime: import_zod10.z.number().min(1).max(5),
2688
+ accessibility: import_zod10.z.number().min(1).max(5),
2689
+ overallRating: import_zod10.z.number().min(1).max(5),
2690
+ wouldRecommend: import_zod10.z.boolean()
2583
2691
  });
2584
2692
  var createClinicReviewSchema = baseReviewCreateSchema.extend({
2585
- clinicId: import_zod9.z.string().min(1),
2586
- cleanliness: import_zod9.z.number().min(1).max(5),
2587
- facilities: import_zod9.z.number().min(1).max(5),
2588
- staffFriendliness: import_zod9.z.number().min(1).max(5),
2589
- waitingTime: import_zod9.z.number().min(1).max(5),
2590
- accessibility: import_zod9.z.number().min(1).max(5),
2591
- wouldRecommend: import_zod9.z.boolean()
2693
+ clinicId: import_zod10.z.string().min(1),
2694
+ cleanliness: import_zod10.z.number().min(1).max(5),
2695
+ facilities: import_zod10.z.number().min(1).max(5),
2696
+ staffFriendliness: import_zod10.z.number().min(1).max(5),
2697
+ waitingTime: import_zod10.z.number().min(1).max(5),
2698
+ accessibility: import_zod10.z.number().min(1).max(5),
2699
+ wouldRecommend: import_zod10.z.boolean()
2592
2700
  });
2593
2701
  var practitionerReviewSchema = baseReviewSchema.extend({
2594
- practitionerId: import_zod9.z.string().min(1),
2595
- knowledgeAndExpertise: import_zod9.z.number().min(1).max(5),
2596
- communicationSkills: import_zod9.z.number().min(1).max(5),
2597
- bedSideManner: import_zod9.z.number().min(1).max(5),
2598
- thoroughness: import_zod9.z.number().min(1).max(5),
2599
- trustworthiness: import_zod9.z.number().min(1).max(5),
2600
- overallRating: import_zod9.z.number().min(1).max(5),
2601
- wouldRecommend: import_zod9.z.boolean()
2702
+ practitionerId: import_zod10.z.string().min(1),
2703
+ knowledgeAndExpertise: import_zod10.z.number().min(1).max(5),
2704
+ communicationSkills: import_zod10.z.number().min(1).max(5),
2705
+ bedSideManner: import_zod10.z.number().min(1).max(5),
2706
+ thoroughness: import_zod10.z.number().min(1).max(5),
2707
+ trustworthiness: import_zod10.z.number().min(1).max(5),
2708
+ overallRating: import_zod10.z.number().min(1).max(5),
2709
+ wouldRecommend: import_zod10.z.boolean()
2602
2710
  });
2603
2711
  var createPractitionerReviewSchema = baseReviewCreateSchema.extend({
2604
- practitionerId: import_zod9.z.string().min(1),
2605
- knowledgeAndExpertise: import_zod9.z.number().min(1).max(5),
2606
- communicationSkills: import_zod9.z.number().min(1).max(5),
2607
- bedSideManner: import_zod9.z.number().min(1).max(5),
2608
- thoroughness: import_zod9.z.number().min(1).max(5),
2609
- trustworthiness: import_zod9.z.number().min(1).max(5),
2610
- wouldRecommend: import_zod9.z.boolean()
2712
+ practitionerId: import_zod10.z.string().min(1),
2713
+ knowledgeAndExpertise: import_zod10.z.number().min(1).max(5),
2714
+ communicationSkills: import_zod10.z.number().min(1).max(5),
2715
+ bedSideManner: import_zod10.z.number().min(1).max(5),
2716
+ thoroughness: import_zod10.z.number().min(1).max(5),
2717
+ trustworthiness: import_zod10.z.number().min(1).max(5),
2718
+ wouldRecommend: import_zod10.z.boolean()
2611
2719
  });
2612
2720
  var procedureReviewSchema = baseReviewSchema.extend({
2613
- procedureId: import_zod9.z.string().min(1),
2614
- effectivenessOfTreatment: import_zod9.z.number().min(1).max(5),
2615
- outcomeExplanation: import_zod9.z.number().min(1).max(5),
2616
- painManagement: import_zod9.z.number().min(1).max(5),
2617
- followUpCare: import_zod9.z.number().min(1).max(5),
2618
- valueForMoney: import_zod9.z.number().min(1).max(5),
2619
- overallRating: import_zod9.z.number().min(1).max(5),
2620
- wouldRecommend: import_zod9.z.boolean()
2721
+ procedureId: import_zod10.z.string().min(1),
2722
+ effectivenessOfTreatment: import_zod10.z.number().min(1).max(5),
2723
+ outcomeExplanation: import_zod10.z.number().min(1).max(5),
2724
+ painManagement: import_zod10.z.number().min(1).max(5),
2725
+ followUpCare: import_zod10.z.number().min(1).max(5),
2726
+ valueForMoney: import_zod10.z.number().min(1).max(5),
2727
+ overallRating: import_zod10.z.number().min(1).max(5),
2728
+ wouldRecommend: import_zod10.z.boolean()
2621
2729
  });
2622
2730
  var createProcedureReviewSchema = baseReviewCreateSchema.extend({
2623
- procedureId: import_zod9.z.string().min(1),
2624
- effectivenessOfTreatment: import_zod9.z.number().min(1).max(5),
2625
- outcomeExplanation: import_zod9.z.number().min(1).max(5),
2626
- painManagement: import_zod9.z.number().min(1).max(5),
2627
- followUpCare: import_zod9.z.number().min(1).max(5),
2628
- valueForMoney: import_zod9.z.number().min(1).max(5),
2629
- wouldRecommend: import_zod9.z.boolean()
2731
+ procedureId: import_zod10.z.string().min(1),
2732
+ effectivenessOfTreatment: import_zod10.z.number().min(1).max(5),
2733
+ outcomeExplanation: import_zod10.z.number().min(1).max(5),
2734
+ painManagement: import_zod10.z.number().min(1).max(5),
2735
+ followUpCare: import_zod10.z.number().min(1).max(5),
2736
+ valueForMoney: import_zod10.z.number().min(1).max(5),
2737
+ wouldRecommend: import_zod10.z.boolean()
2630
2738
  });
2631
- var clinicReviewInfoSchema = import_zod9.z.object({
2632
- totalReviews: import_zod9.z.number().min(0),
2633
- averageRating: import_zod9.z.number().min(0).max(5),
2634
- cleanliness: import_zod9.z.number().min(0).max(5),
2635
- facilities: import_zod9.z.number().min(0).max(5),
2636
- staffFriendliness: import_zod9.z.number().min(0).max(5),
2637
- waitingTime: import_zod9.z.number().min(0).max(5),
2638
- accessibility: import_zod9.z.number().min(0).max(5),
2639
- recommendationPercentage: import_zod9.z.number().min(0).max(100)
2739
+ var clinicReviewInfoSchema = import_zod10.z.object({
2740
+ totalReviews: import_zod10.z.number().min(0),
2741
+ averageRating: import_zod10.z.number().min(0).max(5),
2742
+ cleanliness: import_zod10.z.number().min(0).max(5),
2743
+ facilities: import_zod10.z.number().min(0).max(5),
2744
+ staffFriendliness: import_zod10.z.number().min(0).max(5),
2745
+ waitingTime: import_zod10.z.number().min(0).max(5),
2746
+ accessibility: import_zod10.z.number().min(0).max(5),
2747
+ recommendationPercentage: import_zod10.z.number().min(0).max(100)
2640
2748
  });
2641
- var practitionerReviewInfoSchema = import_zod9.z.object({
2642
- totalReviews: import_zod9.z.number().min(0),
2643
- averageRating: import_zod9.z.number().min(0).max(5),
2644
- knowledgeAndExpertise: import_zod9.z.number().min(0).max(5),
2645
- communicationSkills: import_zod9.z.number().min(0).max(5),
2646
- bedSideManner: import_zod9.z.number().min(0).max(5),
2647
- thoroughness: import_zod9.z.number().min(0).max(5),
2648
- trustworthiness: import_zod9.z.number().min(0).max(5),
2649
- recommendationPercentage: import_zod9.z.number().min(0).max(100)
2749
+ var practitionerReviewInfoSchema = import_zod10.z.object({
2750
+ totalReviews: import_zod10.z.number().min(0),
2751
+ averageRating: import_zod10.z.number().min(0).max(5),
2752
+ knowledgeAndExpertise: import_zod10.z.number().min(0).max(5),
2753
+ communicationSkills: import_zod10.z.number().min(0).max(5),
2754
+ bedSideManner: import_zod10.z.number().min(0).max(5),
2755
+ thoroughness: import_zod10.z.number().min(0).max(5),
2756
+ trustworthiness: import_zod10.z.number().min(0).max(5),
2757
+ recommendationPercentage: import_zod10.z.number().min(0).max(100)
2650
2758
  });
2651
- var procedureReviewInfoSchema = import_zod9.z.object({
2652
- totalReviews: import_zod9.z.number().min(0),
2653
- averageRating: import_zod9.z.number().min(0).max(5),
2654
- effectivenessOfTreatment: import_zod9.z.number().min(0).max(5),
2655
- outcomeExplanation: import_zod9.z.number().min(0).max(5),
2656
- painManagement: import_zod9.z.number().min(0).max(5),
2657
- followUpCare: import_zod9.z.number().min(0).max(5),
2658
- valueForMoney: import_zod9.z.number().min(0).max(5),
2659
- recommendationPercentage: import_zod9.z.number().min(0).max(100)
2759
+ var procedureReviewInfoSchema = import_zod10.z.object({
2760
+ totalReviews: import_zod10.z.number().min(0),
2761
+ averageRating: import_zod10.z.number().min(0).max(5),
2762
+ effectivenessOfTreatment: import_zod10.z.number().min(0).max(5),
2763
+ outcomeExplanation: import_zod10.z.number().min(0).max(5),
2764
+ painManagement: import_zod10.z.number().min(0).max(5),
2765
+ followUpCare: import_zod10.z.number().min(0).max(5),
2766
+ valueForMoney: import_zod10.z.number().min(0).max(5),
2767
+ recommendationPercentage: import_zod10.z.number().min(0).max(100)
2660
2768
  });
2661
- var reviewSchema = import_zod9.z.object({
2662
- id: import_zod9.z.string().min(1),
2663
- appointmentId: import_zod9.z.string().min(1),
2664
- patientId: import_zod9.z.string().min(1),
2665
- createdAt: import_zod9.z.date(),
2666
- updatedAt: import_zod9.z.date(),
2769
+ var reviewSchema = import_zod10.z.object({
2770
+ id: import_zod10.z.string().min(1),
2771
+ appointmentId: import_zod10.z.string().min(1),
2772
+ patientId: import_zod10.z.string().min(1),
2773
+ createdAt: import_zod10.z.date(),
2774
+ updatedAt: import_zod10.z.date(),
2667
2775
  clinicReview: clinicReviewSchema.optional(),
2668
2776
  practitionerReview: practitionerReviewSchema.optional(),
2669
2777
  procedureReview: procedureReviewSchema.optional(),
2670
- overallComment: import_zod9.z.string().min(1).max(2e3),
2671
- overallRating: import_zod9.z.number().min(1).max(5)
2778
+ overallComment: import_zod10.z.string().min(1).max(2e3),
2779
+ overallRating: import_zod10.z.number().min(1).max(5)
2672
2780
  });
2673
- var createReviewSchema = import_zod9.z.object({
2674
- patientId: import_zod9.z.string().min(1),
2781
+ var createReviewSchema = import_zod10.z.object({
2782
+ patientId: import_zod10.z.string().min(1),
2675
2783
  clinicReview: createClinicReviewSchema.optional(),
2676
2784
  practitionerReview: createPractitionerReviewSchema.optional(),
2677
2785
  procedureReview: createProcedureReviewSchema.optional(),
2678
- overallComment: import_zod9.z.string().min(1).max(2e3)
2786
+ overallComment: import_zod10.z.string().min(1).max(2e3)
2679
2787
  }).refine(
2680
2788
  (data) => {
2681
2789
  return data.clinicReview || data.practitionerReview || data.procedureReview;
@@ -2713,34 +2821,34 @@ var Currency = /* @__PURE__ */ ((Currency2) => {
2713
2821
  })(Currency || {});
2714
2822
 
2715
2823
  // src/validations/practitioner.schema.ts
2716
- var practitionerBasicInfoSchema = import_zod10.z.object({
2717
- firstName: import_zod10.z.string().min(2).max(50),
2718
- lastName: import_zod10.z.string().min(2).max(50),
2719
- title: import_zod10.z.string().min(2).max(100),
2720
- email: import_zod10.z.string().email(),
2721
- phoneNumber: import_zod10.z.string().regex(/^\+?[1-9]\d{1,14}$/, "Invalid phone number"),
2722
- dateOfBirth: import_zod10.z.instanceof(import_firestore10.Timestamp).or(import_zod10.z.date()),
2723
- gender: import_zod10.z.enum(["male", "female", "other"]),
2724
- profileImageUrl: import_zod10.z.string().url().optional(),
2725
- bio: import_zod10.z.string().max(1e3).optional(),
2726
- languages: import_zod10.z.array(import_zod10.z.string()).min(1)
2824
+ var practitionerBasicInfoSchema = import_zod11.z.object({
2825
+ firstName: import_zod11.z.string().min(2).max(50),
2826
+ lastName: import_zod11.z.string().min(2).max(50),
2827
+ title: import_zod11.z.string().min(2).max(100),
2828
+ email: import_zod11.z.string().email(),
2829
+ phoneNumber: import_zod11.z.string().regex(/^\+?[1-9]\d{1,14}$/, "Invalid phone number"),
2830
+ dateOfBirth: import_zod11.z.instanceof(import_firestore10.Timestamp).or(import_zod11.z.date()),
2831
+ gender: import_zod11.z.enum(["male", "female", "other"]),
2832
+ profileImageUrl: import_zod11.z.string().url().optional(),
2833
+ bio: import_zod11.z.string().max(1e3).optional(),
2834
+ languages: import_zod11.z.array(import_zod11.z.string()).min(1)
2727
2835
  });
2728
- var practitionerCertificationSchema = import_zod10.z.object({
2729
- level: import_zod10.z.nativeEnum(CertificationLevel),
2730
- specialties: import_zod10.z.array(import_zod10.z.nativeEnum(CertificationSpecialty)),
2731
- licenseNumber: import_zod10.z.string().min(3).max(50),
2732
- issuingAuthority: import_zod10.z.string().min(2).max(100),
2733
- issueDate: import_zod10.z.instanceof(import_firestore10.Timestamp).or(import_zod10.z.date()),
2734
- expiryDate: import_zod10.z.instanceof(import_firestore10.Timestamp).or(import_zod10.z.date()).optional(),
2735
- verificationStatus: import_zod10.z.enum(["pending", "verified", "rejected"])
2836
+ var practitionerCertificationSchema = import_zod11.z.object({
2837
+ level: import_zod11.z.nativeEnum(CertificationLevel),
2838
+ specialties: import_zod11.z.array(import_zod11.z.nativeEnum(CertificationSpecialty)),
2839
+ licenseNumber: import_zod11.z.string().min(3).max(50),
2840
+ issuingAuthority: import_zod11.z.string().min(2).max(100),
2841
+ issueDate: import_zod11.z.instanceof(import_firestore10.Timestamp).or(import_zod11.z.date()),
2842
+ expiryDate: import_zod11.z.instanceof(import_firestore10.Timestamp).or(import_zod11.z.date()).optional(),
2843
+ verificationStatus: import_zod11.z.enum(["pending", "verified", "rejected"])
2736
2844
  });
2737
- var timeSlotSchema = import_zod10.z.object({
2738
- start: import_zod10.z.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/, "Invalid time format"),
2739
- end: import_zod10.z.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/, "Invalid time format")
2845
+ var timeSlotSchema = import_zod11.z.object({
2846
+ start: import_zod11.z.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/, "Invalid time format"),
2847
+ end: import_zod11.z.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/, "Invalid time format")
2740
2848
  }).nullable();
2741
- var practitionerWorkingHoursSchema = import_zod10.z.object({
2742
- practitionerId: import_zod10.z.string().min(1),
2743
- clinicId: import_zod10.z.string().min(1),
2849
+ var practitionerWorkingHoursSchema = import_zod11.z.object({
2850
+ practitionerId: import_zod11.z.string().min(1),
2851
+ clinicId: import_zod11.z.string().min(1),
2744
2852
  monday: timeSlotSchema,
2745
2853
  tuesday: timeSlotSchema,
2746
2854
  wednesday: timeSlotSchema,
@@ -2748,12 +2856,12 @@ var practitionerWorkingHoursSchema = import_zod10.z.object({
2748
2856
  friday: timeSlotSchema,
2749
2857
  saturday: timeSlotSchema,
2750
2858
  sunday: timeSlotSchema,
2751
- createdAt: import_zod10.z.instanceof(import_firestore10.Timestamp).or(import_zod10.z.date()),
2752
- updatedAt: import_zod10.z.instanceof(import_firestore10.Timestamp).or(import_zod10.z.date())
2859
+ createdAt: import_zod11.z.instanceof(import_firestore10.Timestamp).or(import_zod11.z.date()),
2860
+ updatedAt: import_zod11.z.instanceof(import_firestore10.Timestamp).or(import_zod11.z.date())
2753
2861
  });
2754
- var practitionerClinicWorkingHoursSchema = import_zod10.z.object({
2755
- clinicId: import_zod10.z.string().min(1),
2756
- workingHours: import_zod10.z.object({
2862
+ var practitionerClinicWorkingHoursSchema = import_zod11.z.object({
2863
+ clinicId: import_zod11.z.string().min(1),
2864
+ workingHours: import_zod11.z.object({
2757
2865
  monday: timeSlotSchema,
2758
2866
  tuesday: timeSlotSchema,
2759
2867
  wednesday: timeSlotSchema,
@@ -2762,114 +2870,114 @@ var practitionerClinicWorkingHoursSchema = import_zod10.z.object({
2762
2870
  saturday: timeSlotSchema,
2763
2871
  sunday: timeSlotSchema
2764
2872
  }),
2765
- isActive: import_zod10.z.boolean(),
2766
- createdAt: import_zod10.z.instanceof(import_firestore10.Timestamp).or(import_zod10.z.date()),
2767
- updatedAt: import_zod10.z.instanceof(import_firestore10.Timestamp).or(import_zod10.z.date())
2873
+ isActive: import_zod11.z.boolean(),
2874
+ createdAt: import_zod11.z.instanceof(import_firestore10.Timestamp).or(import_zod11.z.date()),
2875
+ updatedAt: import_zod11.z.instanceof(import_firestore10.Timestamp).or(import_zod11.z.date())
2768
2876
  });
2769
- var procedureSummaryInfoSchema = import_zod10.z.object({
2770
- id: import_zod10.z.string().min(1),
2771
- name: import_zod10.z.string().min(1),
2772
- description: import_zod10.z.string().optional(),
2773
- photo: import_zod10.z.string().optional(),
2774
- family: import_zod10.z.nativeEnum(ProcedureFamily),
2775
- categoryName: import_zod10.z.string(),
2776
- subcategoryName: import_zod10.z.string(),
2777
- technologyName: import_zod10.z.string(),
2778
- price: import_zod10.z.number().nonnegative(),
2779
- pricingMeasure: import_zod10.z.nativeEnum(PricingMeasure),
2780
- currency: import_zod10.z.nativeEnum(Currency),
2781
- duration: import_zod10.z.number().int().positive(),
2782
- clinicId: import_zod10.z.string().min(1),
2783
- clinicName: import_zod10.z.string().min(1),
2784
- practitionerId: import_zod10.z.string().min(1),
2785
- practitionerName: import_zod10.z.string().min(1)
2877
+ var procedureSummaryInfoSchema = import_zod11.z.object({
2878
+ id: import_zod11.z.string().min(1),
2879
+ name: import_zod11.z.string().min(1),
2880
+ description: import_zod11.z.string().optional(),
2881
+ photo: import_zod11.z.string().optional(),
2882
+ family: import_zod11.z.nativeEnum(ProcedureFamily),
2883
+ categoryName: import_zod11.z.string(),
2884
+ subcategoryName: import_zod11.z.string(),
2885
+ technologyName: import_zod11.z.string(),
2886
+ price: import_zod11.z.number().nonnegative(),
2887
+ pricingMeasure: import_zod11.z.nativeEnum(PricingMeasure),
2888
+ currency: import_zod11.z.nativeEnum(Currency),
2889
+ duration: import_zod11.z.number().int().positive(),
2890
+ clinicId: import_zod11.z.string().min(1),
2891
+ clinicName: import_zod11.z.string().min(1),
2892
+ practitionerId: import_zod11.z.string().min(1),
2893
+ practitionerName: import_zod11.z.string().min(1)
2786
2894
  });
2787
- var practitionerSchema = import_zod10.z.object({
2788
- id: import_zod10.z.string().min(1),
2789
- userRef: import_zod10.z.string().min(1),
2895
+ var practitionerSchema = import_zod11.z.object({
2896
+ id: import_zod11.z.string().min(1),
2897
+ userRef: import_zod11.z.string().min(1),
2790
2898
  basicInfo: practitionerBasicInfoSchema,
2791
2899
  certification: practitionerCertificationSchema,
2792
- clinics: import_zod10.z.array(import_zod10.z.string()),
2793
- clinicWorkingHours: import_zod10.z.array(practitionerClinicWorkingHoursSchema),
2794
- clinicsInfo: import_zod10.z.array(clinicInfoSchema),
2795
- procedures: import_zod10.z.array(import_zod10.z.string()),
2796
- proceduresInfo: import_zod10.z.array(procedureSummaryInfoSchema),
2900
+ clinics: import_zod11.z.array(import_zod11.z.string()),
2901
+ clinicWorkingHours: import_zod11.z.array(practitionerClinicWorkingHoursSchema),
2902
+ clinicsInfo: import_zod11.z.array(clinicInfoSchema),
2903
+ procedures: import_zod11.z.array(import_zod11.z.string()),
2904
+ proceduresInfo: import_zod11.z.array(procedureSummaryInfoSchema),
2797
2905
  reviewInfo: practitionerReviewInfoSchema,
2798
- isActive: import_zod10.z.boolean(),
2799
- isVerified: import_zod10.z.boolean(),
2800
- status: import_zod10.z.nativeEnum(PractitionerStatus),
2801
- createdAt: import_zod10.z.instanceof(import_firestore10.Timestamp).or(import_zod10.z.date()),
2802
- updatedAt: import_zod10.z.instanceof(import_firestore10.Timestamp).or(import_zod10.z.date())
2906
+ isActive: import_zod11.z.boolean(),
2907
+ isVerified: import_zod11.z.boolean(),
2908
+ status: import_zod11.z.nativeEnum(PractitionerStatus),
2909
+ createdAt: import_zod11.z.instanceof(import_firestore10.Timestamp).or(import_zod11.z.date()),
2910
+ updatedAt: import_zod11.z.instanceof(import_firestore10.Timestamp).or(import_zod11.z.date())
2803
2911
  });
2804
- var createPractitionerSchema = import_zod10.z.object({
2805
- userRef: import_zod10.z.string().min(1),
2912
+ var createPractitionerSchema = import_zod11.z.object({
2913
+ userRef: import_zod11.z.string().min(1),
2806
2914
  basicInfo: practitionerBasicInfoSchema,
2807
2915
  certification: practitionerCertificationSchema,
2808
- clinics: import_zod10.z.array(import_zod10.z.string()).optional(),
2809
- clinicWorkingHours: import_zod10.z.array(practitionerClinicWorkingHoursSchema).optional(),
2810
- clinicsInfo: import_zod10.z.array(clinicInfoSchema).optional(),
2811
- proceduresInfo: import_zod10.z.array(procedureSummaryInfoSchema).optional(),
2812
- isActive: import_zod10.z.boolean(),
2813
- isVerified: import_zod10.z.boolean(),
2814
- status: import_zod10.z.nativeEnum(PractitionerStatus).optional()
2916
+ clinics: import_zod11.z.array(import_zod11.z.string()).optional(),
2917
+ clinicWorkingHours: import_zod11.z.array(practitionerClinicWorkingHoursSchema).optional(),
2918
+ clinicsInfo: import_zod11.z.array(clinicInfoSchema).optional(),
2919
+ proceduresInfo: import_zod11.z.array(procedureSummaryInfoSchema).optional(),
2920
+ isActive: import_zod11.z.boolean(),
2921
+ isVerified: import_zod11.z.boolean(),
2922
+ status: import_zod11.z.nativeEnum(PractitionerStatus).optional()
2815
2923
  });
2816
- var createDraftPractitionerSchema = import_zod10.z.object({
2924
+ var createDraftPractitionerSchema = import_zod11.z.object({
2817
2925
  basicInfo: practitionerBasicInfoSchema,
2818
2926
  certification: practitionerCertificationSchema,
2819
- clinics: import_zod10.z.array(import_zod10.z.string()).optional(),
2820
- clinicWorkingHours: import_zod10.z.array(practitionerClinicWorkingHoursSchema).optional(),
2821
- clinicsInfo: import_zod10.z.array(clinicInfoSchema).optional(),
2822
- proceduresInfo: import_zod10.z.array(procedureSummaryInfoSchema).optional(),
2823
- isActive: import_zod10.z.boolean().optional().default(false),
2824
- isVerified: import_zod10.z.boolean().optional().default(false)
2927
+ clinics: import_zod11.z.array(import_zod11.z.string()).optional(),
2928
+ clinicWorkingHours: import_zod11.z.array(practitionerClinicWorkingHoursSchema).optional(),
2929
+ clinicsInfo: import_zod11.z.array(clinicInfoSchema).optional(),
2930
+ proceduresInfo: import_zod11.z.array(procedureSummaryInfoSchema).optional(),
2931
+ isActive: import_zod11.z.boolean().optional().default(false),
2932
+ isVerified: import_zod11.z.boolean().optional().default(false)
2825
2933
  });
2826
- var practitionerTokenSchema = import_zod10.z.object({
2827
- id: import_zod10.z.string().min(1),
2828
- token: import_zod10.z.string().min(6),
2829
- practitionerId: import_zod10.z.string().min(1),
2830
- email: import_zod10.z.string().email(),
2831
- clinicId: import_zod10.z.string().min(1),
2832
- status: import_zod10.z.nativeEnum(PractitionerTokenStatus),
2833
- createdBy: import_zod10.z.string().min(1),
2834
- createdAt: import_zod10.z.instanceof(import_firestore10.Timestamp).or(import_zod10.z.date()),
2835
- expiresAt: import_zod10.z.instanceof(import_firestore10.Timestamp).or(import_zod10.z.date()),
2836
- usedBy: import_zod10.z.string().optional(),
2837
- usedAt: import_zod10.z.instanceof(import_firestore10.Timestamp).or(import_zod10.z.date()).optional()
2934
+ var practitionerTokenSchema = import_zod11.z.object({
2935
+ id: import_zod11.z.string().min(1),
2936
+ token: import_zod11.z.string().min(6),
2937
+ practitionerId: import_zod11.z.string().min(1),
2938
+ email: import_zod11.z.string().email(),
2939
+ clinicId: import_zod11.z.string().min(1),
2940
+ status: import_zod11.z.nativeEnum(PractitionerTokenStatus),
2941
+ createdBy: import_zod11.z.string().min(1),
2942
+ createdAt: import_zod11.z.instanceof(import_firestore10.Timestamp).or(import_zod11.z.date()),
2943
+ expiresAt: import_zod11.z.instanceof(import_firestore10.Timestamp).or(import_zod11.z.date()),
2944
+ usedBy: import_zod11.z.string().optional(),
2945
+ usedAt: import_zod11.z.instanceof(import_firestore10.Timestamp).or(import_zod11.z.date()).optional()
2838
2946
  });
2839
- var createPractitionerTokenSchema = import_zod10.z.object({
2840
- practitionerId: import_zod10.z.string().min(1),
2841
- email: import_zod10.z.string().email(),
2842
- clinicId: import_zod10.z.string().min(1),
2843
- expiresAt: import_zod10.z.date().optional()
2947
+ var createPractitionerTokenSchema = import_zod11.z.object({
2948
+ practitionerId: import_zod11.z.string().min(1),
2949
+ email: import_zod11.z.string().email(),
2950
+ clinicId: import_zod11.z.string().min(1),
2951
+ expiresAt: import_zod11.z.date().optional()
2844
2952
  });
2845
2953
 
2846
2954
  // src/validations/clinic.schema.ts
2847
- var clinicContactInfoSchema = import_zod11.z.object({
2848
- email: import_zod11.z.string().email(),
2849
- phoneNumber: import_zod11.z.string(),
2850
- alternativePhoneNumber: import_zod11.z.string().nullable().optional(),
2851
- website: import_zod11.z.string().nullable().optional()
2955
+ var clinicContactInfoSchema = import_zod12.z.object({
2956
+ email: import_zod12.z.string().email(),
2957
+ phoneNumber: import_zod12.z.string(),
2958
+ alternativePhoneNumber: import_zod12.z.string().nullable().optional(),
2959
+ website: import_zod12.z.string().nullable().optional()
2852
2960
  });
2853
- var clinicLocationSchema = import_zod11.z.object({
2854
- address: import_zod11.z.string(),
2855
- city: import_zod11.z.string(),
2856
- country: import_zod11.z.string(),
2857
- postalCode: import_zod11.z.string(),
2858
- latitude: import_zod11.z.number().min(-90).max(90),
2859
- longitude: import_zod11.z.number().min(-180).max(180),
2860
- geohash: import_zod11.z.string().nullable().optional()
2961
+ var clinicLocationSchema = import_zod12.z.object({
2962
+ address: import_zod12.z.string(),
2963
+ city: import_zod12.z.string(),
2964
+ country: import_zod12.z.string(),
2965
+ postalCode: import_zod12.z.string(),
2966
+ latitude: import_zod12.z.number().min(-90).max(90),
2967
+ longitude: import_zod12.z.number().min(-180).max(180),
2968
+ geohash: import_zod12.z.string().nullable().optional()
2861
2969
  });
2862
- var workingHoursTimeSchema = import_zod11.z.object({
2863
- open: import_zod11.z.string(),
2864
- close: import_zod11.z.string(),
2865
- breaks: import_zod11.z.array(
2866
- import_zod11.z.object({
2867
- start: import_zod11.z.string(),
2868
- end: import_zod11.z.string()
2970
+ var workingHoursTimeSchema = import_zod12.z.object({
2971
+ open: import_zod12.z.string(),
2972
+ close: import_zod12.z.string(),
2973
+ breaks: import_zod12.z.array(
2974
+ import_zod12.z.object({
2975
+ start: import_zod12.z.string(),
2976
+ end: import_zod12.z.string()
2869
2977
  })
2870
2978
  ).optional()
2871
2979
  });
2872
- var workingHoursSchema = import_zod11.z.object({
2980
+ var workingHoursSchema = import_zod12.z.object({
2873
2981
  monday: workingHoursTimeSchema.nullable(),
2874
2982
  tuesday: workingHoursTimeSchema.nullable(),
2875
2983
  wednesday: workingHoursTimeSchema.nullable(),
@@ -2878,235 +2986,235 @@ var workingHoursSchema = import_zod11.z.object({
2878
2986
  saturday: workingHoursTimeSchema.nullable(),
2879
2987
  sunday: workingHoursTimeSchema.nullable()
2880
2988
  });
2881
- var clinicTagsSchema = import_zod11.z.object({
2882
- tags: import_zod11.z.array(import_zod11.z.nativeEnum(ClinicTag))
2989
+ var clinicTagsSchema = import_zod12.z.object({
2990
+ tags: import_zod12.z.array(import_zod12.z.nativeEnum(ClinicTag))
2883
2991
  });
2884
- var contactPersonSchema = import_zod11.z.object({
2885
- firstName: import_zod11.z.string(),
2886
- lastName: import_zod11.z.string(),
2887
- title: import_zod11.z.string().nullable().optional(),
2888
- email: import_zod11.z.string().email(),
2889
- phoneNumber: import_zod11.z.string().nullable().optional()
2992
+ var contactPersonSchema = import_zod12.z.object({
2993
+ firstName: import_zod12.z.string(),
2994
+ lastName: import_zod12.z.string(),
2995
+ title: import_zod12.z.string().nullable().optional(),
2996
+ email: import_zod12.z.string().email(),
2997
+ phoneNumber: import_zod12.z.string().nullable().optional()
2890
2998
  });
2891
- var adminInfoSchema = import_zod11.z.object({
2892
- id: import_zod11.z.string(),
2893
- name: import_zod11.z.string(),
2894
- email: import_zod11.z.string().email()
2999
+ var adminInfoSchema = import_zod12.z.object({
3000
+ id: import_zod12.z.string(),
3001
+ name: import_zod12.z.string(),
3002
+ email: import_zod12.z.string().email()
2895
3003
  });
2896
- var clinicInfoSchema = import_zod11.z.object({
2897
- id: import_zod11.z.string(),
2898
- featuredPhoto: import_zod11.z.string(),
2899
- name: import_zod11.z.string(),
2900
- description: import_zod11.z.string().nullable().optional(),
3004
+ var clinicInfoSchema = import_zod12.z.object({
3005
+ id: import_zod12.z.string(),
3006
+ featuredPhoto: import_zod12.z.string(),
3007
+ name: import_zod12.z.string(),
3008
+ description: import_zod12.z.string().nullable().optional(),
2901
3009
  location: clinicLocationSchema,
2902
3010
  contactInfo: clinicContactInfoSchema
2903
3011
  });
2904
- var doctorInfoSchema = import_zod11.z.object({
2905
- id: import_zod11.z.string(),
2906
- name: import_zod11.z.string(),
2907
- description: import_zod11.z.string().nullable().optional(),
2908
- photo: import_zod11.z.string(),
2909
- rating: import_zod11.z.number().min(0).max(5),
2910
- services: import_zod11.z.array(import_zod11.z.string())
3012
+ var doctorInfoSchema = import_zod12.z.object({
3013
+ id: import_zod12.z.string(),
3014
+ name: import_zod12.z.string(),
3015
+ description: import_zod12.z.string().nullable().optional(),
3016
+ photo: import_zod12.z.string(),
3017
+ rating: import_zod12.z.number().min(0).max(5),
3018
+ services: import_zod12.z.array(import_zod12.z.string())
2911
3019
  // List of procedure IDs practitioner offers
2912
3020
  });
2913
- var clinicAdminSchema = import_zod11.z.object({
2914
- id: import_zod11.z.string(),
2915
- userRef: import_zod11.z.string(),
2916
- clinicGroupId: import_zod11.z.string(),
2917
- isGroupOwner: import_zod11.z.boolean(),
2918
- clinicsManaged: import_zod11.z.array(import_zod11.z.string()),
2919
- clinicsManagedInfo: import_zod11.z.array(clinicInfoSchema),
3021
+ var clinicAdminSchema = import_zod12.z.object({
3022
+ id: import_zod12.z.string(),
3023
+ userRef: import_zod12.z.string(),
3024
+ clinicGroupId: import_zod12.z.string(),
3025
+ isGroupOwner: import_zod12.z.boolean(),
3026
+ clinicsManaged: import_zod12.z.array(import_zod12.z.string()),
3027
+ clinicsManagedInfo: import_zod12.z.array(clinicInfoSchema),
2920
3028
  contactInfo: contactPersonSchema,
2921
- roleTitle: import_zod11.z.string(),
2922
- createdAt: import_zod11.z.instanceof(Date).or(import_zod11.z.instanceof(import_firestore11.Timestamp)),
2923
- updatedAt: import_zod11.z.instanceof(Date).or(import_zod11.z.instanceof(import_firestore11.Timestamp)),
2924
- isActive: import_zod11.z.boolean()
3029
+ roleTitle: import_zod12.z.string(),
3030
+ createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore11.Timestamp)),
3031
+ updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore11.Timestamp)),
3032
+ isActive: import_zod12.z.boolean()
2925
3033
  });
2926
- var adminTokenSchema = import_zod11.z.object({
2927
- id: import_zod11.z.string(),
2928
- token: import_zod11.z.string(),
2929
- email: import_zod11.z.string().email().optional().nullable(),
2930
- status: import_zod11.z.nativeEnum(AdminTokenStatus),
2931
- usedByUserRef: import_zod11.z.string().optional(),
2932
- createdAt: import_zod11.z.instanceof(Date).or(import_zod11.z.instanceof(import_firestore11.Timestamp)),
3034
+ var adminTokenSchema = import_zod12.z.object({
3035
+ id: import_zod12.z.string(),
3036
+ token: import_zod12.z.string(),
3037
+ email: import_zod12.z.string().email().optional().nullable(),
3038
+ status: import_zod12.z.nativeEnum(AdminTokenStatus),
3039
+ usedByUserRef: import_zod12.z.string().optional(),
3040
+ createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore11.Timestamp)),
2933
3041
  // Timestamp
2934
- expiresAt: import_zod11.z.instanceof(Date).or(import_zod11.z.instanceof(import_firestore11.Timestamp))
3042
+ expiresAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore11.Timestamp))
2935
3043
  // Timestamp
2936
3044
  });
2937
- var createAdminTokenSchema = import_zod11.z.object({
2938
- expiresInDays: import_zod11.z.number().min(1).max(30).optional(),
2939
- email: import_zod11.z.string().email().optional().nullable()
3045
+ var createAdminTokenSchema = import_zod12.z.object({
3046
+ expiresInDays: import_zod12.z.number().min(1).max(30).optional(),
3047
+ email: import_zod12.z.string().email().optional().nullable()
2940
3048
  });
2941
- var clinicGroupSchema = import_zod11.z.object({
2942
- id: import_zod11.z.string(),
2943
- name: import_zod11.z.string(),
2944
- description: import_zod11.z.string().nullable().optional(),
3049
+ var clinicGroupSchema = import_zod12.z.object({
3050
+ id: import_zod12.z.string(),
3051
+ name: import_zod12.z.string(),
3052
+ description: import_zod12.z.string().nullable().optional(),
2945
3053
  hqLocation: clinicLocationSchema,
2946
3054
  contactInfo: clinicContactInfoSchema,
2947
3055
  contactPerson: contactPersonSchema,
2948
- clinics: import_zod11.z.array(import_zod11.z.string()),
2949
- clinicsInfo: import_zod11.z.array(clinicInfoSchema),
2950
- admins: import_zod11.z.array(import_zod11.z.string()),
2951
- adminsInfo: import_zod11.z.array(adminInfoSchema),
2952
- adminTokens: import_zod11.z.array(adminTokenSchema),
2953
- ownerId: import_zod11.z.string().nullable(),
2954
- createdAt: import_zod11.z.instanceof(Date).or(import_zod11.z.instanceof(import_firestore11.Timestamp)),
3056
+ clinics: import_zod12.z.array(import_zod12.z.string()),
3057
+ clinicsInfo: import_zod12.z.array(clinicInfoSchema),
3058
+ admins: import_zod12.z.array(import_zod12.z.string()),
3059
+ adminsInfo: import_zod12.z.array(adminInfoSchema),
3060
+ adminTokens: import_zod12.z.array(adminTokenSchema),
3061
+ ownerId: import_zod12.z.string().nullable(),
3062
+ createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore11.Timestamp)),
2955
3063
  // Timestamp
2956
- updatedAt: import_zod11.z.instanceof(Date).or(import_zod11.z.instanceof(import_firestore11.Timestamp)),
3064
+ updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore11.Timestamp)),
2957
3065
  // Timestamp
2958
- isActive: import_zod11.z.boolean(),
2959
- logo: import_zod11.z.string().optional().nullable(),
2960
- practiceType: import_zod11.z.nativeEnum(PracticeType).optional(),
2961
- languages: import_zod11.z.array(import_zod11.z.nativeEnum(Language)).optional(),
2962
- subscriptionModel: import_zod11.z.nativeEnum(SubscriptionModel),
2963
- calendarSyncEnabled: import_zod11.z.boolean().optional(),
2964
- autoConfirmAppointments: import_zod11.z.boolean().optional(),
2965
- businessIdentificationNumber: import_zod11.z.string().optional().nullable()
3066
+ isActive: import_zod12.z.boolean(),
3067
+ logo: import_zod12.z.string().optional().nullable(),
3068
+ practiceType: import_zod12.z.nativeEnum(PracticeType).optional(),
3069
+ languages: import_zod12.z.array(import_zod12.z.nativeEnum(Language)).optional(),
3070
+ subscriptionModel: import_zod12.z.nativeEnum(SubscriptionModel),
3071
+ calendarSyncEnabled: import_zod12.z.boolean().optional(),
3072
+ autoConfirmAppointments: import_zod12.z.boolean().optional(),
3073
+ businessIdentificationNumber: import_zod12.z.string().optional().nullable()
2966
3074
  });
2967
- var clinicSchema = import_zod11.z.object({
2968
- id: import_zod11.z.string(),
2969
- clinicGroupId: import_zod11.z.string(),
2970
- name: import_zod11.z.string(),
2971
- description: import_zod11.z.string().nullable().optional(),
3075
+ var clinicSchema = import_zod12.z.object({
3076
+ id: import_zod12.z.string(),
3077
+ clinicGroupId: import_zod12.z.string(),
3078
+ name: import_zod12.z.string(),
3079
+ description: import_zod12.z.string().nullable().optional(),
2972
3080
  location: clinicLocationSchema,
2973
3081
  contactInfo: clinicContactInfoSchema,
2974
3082
  workingHours: workingHoursSchema,
2975
- tags: import_zod11.z.array(import_zod11.z.nativeEnum(ClinicTag)),
2976
- featuredPhotos: import_zod11.z.array(import_zod11.z.string()),
2977
- coverPhoto: import_zod11.z.string().nullable(),
2978
- photosWithTags: import_zod11.z.array(
2979
- import_zod11.z.object({
2980
- url: import_zod11.z.string(),
2981
- tag: import_zod11.z.string()
3083
+ tags: import_zod12.z.array(import_zod12.z.nativeEnum(ClinicTag)),
3084
+ featuredPhotos: import_zod12.z.array(import_zod12.z.string()),
3085
+ coverPhoto: import_zod12.z.string().nullable(),
3086
+ photosWithTags: import_zod12.z.array(
3087
+ import_zod12.z.object({
3088
+ url: import_zod12.z.string(),
3089
+ tag: import_zod12.z.string()
2982
3090
  })
2983
3091
  ).optional(),
2984
- doctors: import_zod11.z.array(import_zod11.z.string()),
3092
+ doctors: import_zod12.z.array(import_zod12.z.string()),
2985
3093
  // List of practitioner IDs
2986
- doctorsInfo: import_zod11.z.array(doctorInfoSchema),
3094
+ doctorsInfo: import_zod12.z.array(doctorInfoSchema),
2987
3095
  // Aggregated doctor info
2988
- procedures: import_zod11.z.array(import_zod11.z.string()),
3096
+ procedures: import_zod12.z.array(import_zod12.z.string()),
2989
3097
  // List of procedure IDs offered by clinic
2990
- proceduresInfo: import_zod11.z.array(procedureSummaryInfoSchema),
3098
+ proceduresInfo: import_zod12.z.array(procedureSummaryInfoSchema),
2991
3099
  // Use the correct schema for aggregated procedure info
2992
3100
  // services: z.array(z.string()), // Likely deprecated, procedures covers this
2993
3101
  // servicesInfo: z.array(serviceInfoSchema), // Deprecated, use proceduresInfo
2994
3102
  reviewInfo: clinicReviewInfoSchema,
2995
- admins: import_zod11.z.array(import_zod11.z.string()),
2996
- createdAt: import_zod11.z.instanceof(Date).or(import_zod11.z.instanceof(import_firestore11.Timestamp)),
3103
+ admins: import_zod12.z.array(import_zod12.z.string()),
3104
+ createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore11.Timestamp)),
2997
3105
  // Timestamp
2998
- updatedAt: import_zod11.z.instanceof(Date).or(import_zod11.z.instanceof(import_firestore11.Timestamp)),
3106
+ updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore11.Timestamp)),
2999
3107
  // Timestamp
3000
- isActive: import_zod11.z.boolean(),
3001
- isVerified: import_zod11.z.boolean(),
3002
- logo: import_zod11.z.string().optional()
3108
+ isActive: import_zod12.z.boolean(),
3109
+ isVerified: import_zod12.z.boolean(),
3110
+ logo: import_zod12.z.string().optional()
3003
3111
  });
3004
- var createClinicAdminSchema = import_zod11.z.object({
3005
- userRef: import_zod11.z.string(),
3006
- clinicGroupId: import_zod11.z.string().optional(),
3007
- isGroupOwner: import_zod11.z.boolean(),
3008
- clinicsManaged: import_zod11.z.array(import_zod11.z.string()),
3112
+ var createClinicAdminSchema = import_zod12.z.object({
3113
+ userRef: import_zod12.z.string(),
3114
+ clinicGroupId: import_zod12.z.string().optional(),
3115
+ isGroupOwner: import_zod12.z.boolean(),
3116
+ clinicsManaged: import_zod12.z.array(import_zod12.z.string()),
3009
3117
  contactInfo: contactPersonSchema,
3010
- roleTitle: import_zod11.z.string(),
3011
- isActive: import_zod11.z.boolean()
3118
+ roleTitle: import_zod12.z.string(),
3119
+ isActive: import_zod12.z.boolean()
3012
3120
  // clinicsManagedInfo is aggregated, not provided on creation
3013
3121
  });
3014
- var createClinicGroupSchema = import_zod11.z.object({
3015
- name: import_zod11.z.string(),
3016
- description: import_zod11.z.string().optional(),
3122
+ var createClinicGroupSchema = import_zod12.z.object({
3123
+ name: import_zod12.z.string(),
3124
+ description: import_zod12.z.string().optional(),
3017
3125
  hqLocation: clinicLocationSchema,
3018
3126
  contactInfo: clinicContactInfoSchema,
3019
3127
  contactPerson: contactPersonSchema,
3020
- ownerId: import_zod11.z.string().nullable(),
3021
- isActive: import_zod11.z.boolean(),
3022
- logo: import_zod11.z.string().optional().nullable(),
3023
- practiceType: import_zod11.z.nativeEnum(PracticeType).optional(),
3024
- languages: import_zod11.z.array(import_zod11.z.nativeEnum(Language)).optional(),
3025
- subscriptionModel: import_zod11.z.nativeEnum(SubscriptionModel).optional().default("no_subscription" /* NO_SUBSCRIPTION */),
3026
- calendarSyncEnabled: import_zod11.z.boolean().optional(),
3027
- autoConfirmAppointments: import_zod11.z.boolean().optional(),
3028
- businessIdentificationNumber: import_zod11.z.string().optional().nullable()
3128
+ ownerId: import_zod12.z.string().nullable(),
3129
+ isActive: import_zod12.z.boolean(),
3130
+ logo: import_zod12.z.string().optional().nullable(),
3131
+ practiceType: import_zod12.z.nativeEnum(PracticeType).optional(),
3132
+ languages: import_zod12.z.array(import_zod12.z.nativeEnum(Language)).optional(),
3133
+ subscriptionModel: import_zod12.z.nativeEnum(SubscriptionModel).optional().default("no_subscription" /* NO_SUBSCRIPTION */),
3134
+ calendarSyncEnabled: import_zod12.z.boolean().optional(),
3135
+ autoConfirmAppointments: import_zod12.z.boolean().optional(),
3136
+ businessIdentificationNumber: import_zod12.z.string().optional().nullable()
3029
3137
  // clinics, clinicsInfo, admins, adminsInfo, adminTokens are managed internally
3030
3138
  });
3031
- var createClinicSchema = import_zod11.z.object({
3032
- clinicGroupId: import_zod11.z.string(),
3033
- name: import_zod11.z.string(),
3034
- description: import_zod11.z.string().optional(),
3139
+ var createClinicSchema = import_zod12.z.object({
3140
+ clinicGroupId: import_zod12.z.string(),
3141
+ name: import_zod12.z.string(),
3142
+ description: import_zod12.z.string().optional(),
3035
3143
  location: clinicLocationSchema,
3036
3144
  contactInfo: clinicContactInfoSchema,
3037
3145
  workingHours: workingHoursSchema,
3038
- tags: import_zod11.z.array(import_zod11.z.nativeEnum(ClinicTag)),
3039
- coverPhoto: import_zod11.z.string().nullable(),
3040
- photosWithTags: import_zod11.z.array(
3041
- import_zod11.z.object({
3042
- url: import_zod11.z.string(),
3043
- tag: import_zod11.z.string()
3146
+ tags: import_zod12.z.array(import_zod12.z.nativeEnum(ClinicTag)),
3147
+ coverPhoto: import_zod12.z.string().nullable(),
3148
+ photosWithTags: import_zod12.z.array(
3149
+ import_zod12.z.object({
3150
+ url: import_zod12.z.string(),
3151
+ tag: import_zod12.z.string()
3044
3152
  })
3045
3153
  ).optional(),
3046
3154
  // doctors, doctorsInfo, procedures, proceduresInfo are managed internally/aggregated
3047
3155
  // doctors: z.array(z.string()),
3048
3156
  // services: z.array(z.string()), // Deprecated
3049
- admins: import_zod11.z.array(import_zod11.z.string()),
3157
+ admins: import_zod12.z.array(import_zod12.z.string()),
3050
3158
  // Should likely just be creator ID initially
3051
- isActive: import_zod11.z.boolean(),
3052
- isVerified: import_zod11.z.boolean(),
3053
- logo: import_zod11.z.string().optional(),
3054
- featuredPhotos: import_zod11.z.array(import_zod11.z.string()).optional()
3159
+ isActive: import_zod12.z.boolean(),
3160
+ isVerified: import_zod12.z.boolean(),
3161
+ logo: import_zod12.z.string().optional(),
3162
+ featuredPhotos: import_zod12.z.array(import_zod12.z.string()).optional()
3055
3163
  });
3056
- var createDefaultClinicGroupSchema = import_zod11.z.object({
3057
- name: import_zod11.z.string(),
3058
- ownerId: import_zod11.z.string().nullable(),
3164
+ var createDefaultClinicGroupSchema = import_zod12.z.object({
3165
+ name: import_zod12.z.string(),
3166
+ ownerId: import_zod12.z.string().nullable(),
3059
3167
  contactPerson: contactPersonSchema,
3060
3168
  contactInfo: clinicContactInfoSchema,
3061
3169
  hqLocation: clinicLocationSchema,
3062
- isActive: import_zod11.z.boolean(),
3063
- logo: import_zod11.z.string().optional().nullable(),
3064
- practiceType: import_zod11.z.nativeEnum(PracticeType).optional(),
3065
- languages: import_zod11.z.array(import_zod11.z.nativeEnum(Language)).optional(),
3066
- subscriptionModel: import_zod11.z.nativeEnum(SubscriptionModel).optional().default("no_subscription" /* NO_SUBSCRIPTION */)
3170
+ isActive: import_zod12.z.boolean(),
3171
+ logo: import_zod12.z.string().optional().nullable(),
3172
+ practiceType: import_zod12.z.nativeEnum(PracticeType).optional(),
3173
+ languages: import_zod12.z.array(import_zod12.z.nativeEnum(Language)).optional(),
3174
+ subscriptionModel: import_zod12.z.nativeEnum(SubscriptionModel).optional().default("no_subscription" /* NO_SUBSCRIPTION */)
3067
3175
  });
3068
- var clinicAdminSignupSchema = import_zod11.z.object({
3069
- email: import_zod11.z.string().email(),
3070
- password: import_zod11.z.string().min(8),
3071
- firstName: import_zod11.z.string(),
3072
- lastName: import_zod11.z.string(),
3073
- title: import_zod11.z.string(),
3074
- phoneNumber: import_zod11.z.string(),
3075
- isCreatingNewGroup: import_zod11.z.boolean(),
3076
- inviteToken: import_zod11.z.string().optional(),
3077
- clinicGroupData: import_zod11.z.object({
3078
- name: import_zod11.z.string(),
3176
+ var clinicAdminSignupSchema = import_zod12.z.object({
3177
+ email: import_zod12.z.string().email(),
3178
+ password: import_zod12.z.string().min(8),
3179
+ firstName: import_zod12.z.string(),
3180
+ lastName: import_zod12.z.string(),
3181
+ title: import_zod12.z.string(),
3182
+ phoneNumber: import_zod12.z.string(),
3183
+ isCreatingNewGroup: import_zod12.z.boolean(),
3184
+ inviteToken: import_zod12.z.string().optional(),
3185
+ clinicGroupData: import_zod12.z.object({
3186
+ name: import_zod12.z.string(),
3079
3187
  hqLocation: clinicLocationSchema,
3080
- logo: import_zod11.z.string().optional(),
3188
+ logo: import_zod12.z.string().optional(),
3081
3189
  contactInfo: clinicContactInfoSchema,
3082
- subscriptionModel: import_zod11.z.nativeEnum(SubscriptionModel).optional().default("no_subscription" /* NO_SUBSCRIPTION */)
3190
+ subscriptionModel: import_zod12.z.nativeEnum(SubscriptionModel).optional().default("no_subscription" /* NO_SUBSCRIPTION */)
3083
3191
  }).optional()
3084
3192
  });
3085
- var clinicGroupSetupSchema = import_zod11.z.object({
3086
- languages: import_zod11.z.array(import_zod11.z.nativeEnum(Language)),
3087
- practiceType: import_zod11.z.nativeEnum(PracticeType),
3088
- description: import_zod11.z.string(),
3089
- logo: import_zod11.z.string(),
3090
- calendarSyncEnabled: import_zod11.z.boolean(),
3091
- autoConfirmAppointments: import_zod11.z.boolean(),
3092
- businessIdentificationNumber: import_zod11.z.string().optional().nullable()
3193
+ var clinicGroupSetupSchema = import_zod12.z.object({
3194
+ languages: import_zod12.z.array(import_zod12.z.nativeEnum(Language)),
3195
+ practiceType: import_zod12.z.nativeEnum(PracticeType),
3196
+ description: import_zod12.z.string(),
3197
+ logo: import_zod12.z.string(),
3198
+ calendarSyncEnabled: import_zod12.z.boolean(),
3199
+ autoConfirmAppointments: import_zod12.z.boolean(),
3200
+ businessIdentificationNumber: import_zod12.z.string().optional().nullable()
3093
3201
  });
3094
- var clinicBranchSetupSchema = import_zod11.z.object({
3095
- name: import_zod11.z.string(),
3202
+ var clinicBranchSetupSchema = import_zod12.z.object({
3203
+ name: import_zod12.z.string(),
3096
3204
  location: clinicLocationSchema,
3097
- description: import_zod11.z.string().optional(),
3205
+ description: import_zod12.z.string().optional(),
3098
3206
  contactInfo: clinicContactInfoSchema,
3099
3207
  workingHours: workingHoursSchema,
3100
- tags: import_zod11.z.array(import_zod11.z.nativeEnum(ClinicTag)),
3101
- logo: import_zod11.z.string().optional(),
3102
- coverPhoto: import_zod11.z.string().nullable(),
3103
- photosWithTags: import_zod11.z.array(
3104
- import_zod11.z.object({
3105
- url: import_zod11.z.string(),
3106
- tag: import_zod11.z.string()
3208
+ tags: import_zod12.z.array(import_zod12.z.nativeEnum(ClinicTag)),
3209
+ logo: import_zod12.z.string().optional(),
3210
+ coverPhoto: import_zod12.z.string().nullable(),
3211
+ photosWithTags: import_zod12.z.array(
3212
+ import_zod12.z.object({
3213
+ url: import_zod12.z.string(),
3214
+ tag: import_zod12.z.string()
3107
3215
  })
3108
3216
  ).optional(),
3109
- featuredPhotos: import_zod11.z.array(import_zod11.z.string()).optional()
3217
+ featuredPhotos: import_zod12.z.array(import_zod12.z.string()).optional()
3110
3218
  });
3111
3219
  var updateClinicAdminSchema = createClinicAdminSchema.partial();
3112
3220
  var updateClinicGroupSchema = createClinicGroupSchema.partial();
@@ -3293,7 +3401,7 @@ async function getClinicAdminsByGroup(db, clinicGroupId) {
3293
3401
  (0, import_firestore12.where)("clinicGroupId", "==", clinicGroupId)
3294
3402
  );
3295
3403
  const querySnapshot = await (0, import_firestore12.getDocs)(q);
3296
- return querySnapshot.docs.map((doc29) => doc29.data());
3404
+ return querySnapshot.docs.map((doc30) => doc30.data());
3297
3405
  }
3298
3406
  async function updateClinicAdmin(db, adminId, data) {
3299
3407
  const admin = await getClinicAdmin(db, adminId);
@@ -3558,7 +3666,7 @@ var ClinicAdminService = class extends BaseService {
3558
3666
 
3559
3667
  // src/services/practitioner/practitioner.service.ts
3560
3668
  var import_firestore13 = require("firebase/firestore");
3561
- var import_zod12 = require("zod");
3669
+ var import_zod13 = require("zod");
3562
3670
  var import_geofire_common2 = require("geofire-common");
3563
3671
  var PractitionerService = class extends BaseService {
3564
3672
  constructor(db, auth, app, clinicService) {
@@ -3627,7 +3735,7 @@ var PractitionerService = class extends BaseService {
3627
3735
  }
3628
3736
  return createdPractitioner;
3629
3737
  } catch (error) {
3630
- if (error instanceof import_zod12.z.ZodError) {
3738
+ if (error instanceof import_zod13.z.ZodError) {
3631
3739
  throw new Error(`Invalid practitioner data: ${error.message}`);
3632
3740
  }
3633
3741
  console.error("Error creating practitioner:", error);
@@ -3723,7 +3831,7 @@ var PractitionerService = class extends BaseService {
3723
3831
  await (0, import_firestore13.setDoc)((0, import_firestore13.doc)(this.db, tokenPath), token);
3724
3832
  return { practitioner: savedPractitioner, token };
3725
3833
  } catch (error) {
3726
- if (error instanceof import_zod12.z.ZodError) {
3834
+ if (error instanceof import_zod13.z.ZodError) {
3727
3835
  throw new Error("Invalid practitioner data: " + error.message);
3728
3836
  }
3729
3837
  throw error;
@@ -3776,7 +3884,7 @@ var PractitionerService = class extends BaseService {
3776
3884
  await (0, import_firestore13.setDoc)((0, import_firestore13.doc)(this.db, tokenPath), token);
3777
3885
  return token;
3778
3886
  } catch (error) {
3779
- if (error instanceof import_zod12.z.ZodError) {
3887
+ if (error instanceof import_zod13.z.ZodError) {
3780
3888
  throw new Error("Invalid token data: " + error.message);
3781
3889
  }
3782
3890
  throw error;
@@ -3798,7 +3906,7 @@ var PractitionerService = class extends BaseService {
3798
3906
  (0, import_firestore13.where)("expiresAt", ">", import_firestore13.Timestamp.now())
3799
3907
  );
3800
3908
  const querySnapshot = await (0, import_firestore13.getDocs)(q);
3801
- return querySnapshot.docs.map((doc29) => doc29.data());
3909
+ return querySnapshot.docs.map((doc30) => doc30.data());
3802
3910
  }
3803
3911
  /**
3804
3912
  * Gets a token by its string value and validates it
@@ -3881,7 +3989,7 @@ var PractitionerService = class extends BaseService {
3881
3989
  (0, import_firestore13.where)("status", "==", "active" /* ACTIVE */)
3882
3990
  );
3883
3991
  const querySnapshot = await (0, import_firestore13.getDocs)(q);
3884
- return querySnapshot.docs.map((doc29) => doc29.data());
3992
+ return querySnapshot.docs.map((doc30) => doc30.data());
3885
3993
  }
3886
3994
  /**
3887
3995
  * Dohvata sve zdravstvene radnike za određenu kliniku
@@ -3893,7 +4001,7 @@ var PractitionerService = class extends BaseService {
3893
4001
  (0, import_firestore13.where)("isActive", "==", true)
3894
4002
  );
3895
4003
  const querySnapshot = await (0, import_firestore13.getDocs)(q);
3896
- return querySnapshot.docs.map((doc29) => doc29.data());
4004
+ return querySnapshot.docs.map((doc30) => doc30.data());
3897
4005
  }
3898
4006
  /**
3899
4007
  * Dohvata sve draft zdravstvene radnike za određenu kliniku sa statusom DRAFT
@@ -3905,7 +4013,7 @@ var PractitionerService = class extends BaseService {
3905
4013
  (0, import_firestore13.where)("status", "==", "draft" /* DRAFT */)
3906
4014
  );
3907
4015
  const querySnapshot = await (0, import_firestore13.getDocs)(q);
3908
- return querySnapshot.docs.map((doc29) => doc29.data());
4016
+ return querySnapshot.docs.map((doc30) => doc30.data());
3909
4017
  }
3910
4018
  /**
3911
4019
  * Updates a practitioner
@@ -3936,7 +4044,7 @@ var PractitionerService = class extends BaseService {
3936
4044
  }
3937
4045
  return updatedPractitioner;
3938
4046
  } catch (error) {
3939
- if (error instanceof import_zod12.z.ZodError) {
4047
+ if (error instanceof import_zod13.z.ZodError) {
3940
4048
  throw new Error(`Invalid practitioner update data: ${error.message}`);
3941
4049
  }
3942
4050
  console.error(`Error updating practitioner ${practitionerId}:`, error);
@@ -4087,7 +4195,7 @@ var PractitionerService = class extends BaseService {
4087
4195
  );
4088
4196
  const querySnapshot = await (0, import_firestore13.getDocs)(q);
4089
4197
  const practitioners = querySnapshot.docs.map(
4090
- (doc29) => doc29.data()
4198
+ (doc30) => doc30.data()
4091
4199
  );
4092
4200
  const lastDoc = querySnapshot.docs.length > 0 ? querySnapshot.docs[querySnapshot.docs.length - 1] : null;
4093
4201
  return {
@@ -4158,8 +4266,8 @@ var PractitionerService = class extends BaseService {
4158
4266
  console.log(
4159
4267
  `[PRACTITIONER_SERVICE] Found ${querySnapshot.docs.length} practitioners with base query`
4160
4268
  );
4161
- let practitioners = querySnapshot.docs.map((doc29) => {
4162
- return { ...doc29.data(), id: doc29.id };
4269
+ let practitioners = querySnapshot.docs.map((doc30) => {
4270
+ return { ...doc30.data(), id: doc30.id };
4163
4271
  });
4164
4272
  const lastDoc = querySnapshot.docs.length > 0 ? querySnapshot.docs[querySnapshot.docs.length - 1] : null;
4165
4273
  if (filters.nameSearch && filters.nameSearch.trim() !== "") {
@@ -4413,7 +4521,7 @@ var UserService = class extends BaseService {
4413
4521
  ];
4414
4522
  const q = (0, import_firestore14.query)((0, import_firestore14.collection)(this.db, USERS_COLLECTION), ...constraints);
4415
4523
  const querySnapshot = await (0, import_firestore14.getDocs)(q);
4416
- const users = querySnapshot.docs.map((doc29) => doc29.data());
4524
+ const users = querySnapshot.docs.map((doc30) => doc30.data());
4417
4525
  return Promise.all(users.map((userData) => userSchema.parse(userData)));
4418
4526
  }
4419
4527
  /**
@@ -4464,7 +4572,7 @@ var UserService = class extends BaseService {
4464
4572
  });
4465
4573
  return this.getUserById(uid);
4466
4574
  } catch (error) {
4467
- if (error instanceof import_zod13.z.ZodError) {
4575
+ if (error instanceof import_zod14.z.ZodError) {
4468
4576
  throw USER_ERRORS.VALIDATION_ERROR;
4469
4577
  }
4470
4578
  throw error;
@@ -4551,7 +4659,7 @@ var UserService = class extends BaseService {
4551
4659
  // src/services/clinic/utils/clinic-group.utils.ts
4552
4660
  var import_firestore15 = require("firebase/firestore");
4553
4661
  var import_geofire_common3 = require("geofire-common");
4554
- var import_zod14 = require("zod");
4662
+ var import_zod15 = require("zod");
4555
4663
 
4556
4664
  // src/services/clinic/utils/photos.utils.ts
4557
4665
  var import_storage3 = require("firebase/storage");
@@ -4749,7 +4857,7 @@ async function createClinicGroup(db, data, ownerId, isDefault = false, clinicAdm
4749
4857
  });
4750
4858
  return groupData;
4751
4859
  } catch (error) {
4752
- if (error instanceof import_zod14.z.ZodError) {
4860
+ if (error instanceof import_zod15.z.ZodError) {
4753
4861
  console.error(
4754
4862
  "[CLINIC_GROUP] Zod validation error:",
4755
4863
  JSON.stringify(error.errors, null, 2)
@@ -4777,7 +4885,7 @@ async function getAllActiveGroups(db) {
4777
4885
  (0, import_firestore15.where)("isActive", "==", true)
4778
4886
  );
4779
4887
  const querySnapshot = await (0, import_firestore15.getDocs)(q);
4780
- return querySnapshot.docs.map((doc29) => doc29.data());
4888
+ return querySnapshot.docs.map((doc30) => doc30.data());
4781
4889
  }
4782
4890
  async function updateClinicGroup(db, groupId, data, app) {
4783
4891
  console.log("[CLINIC_GROUP] Updating clinic group", { groupId });
@@ -5154,12 +5262,12 @@ var ClinicGroupService = class extends BaseService {
5154
5262
  // src/services/clinic/clinic.service.ts
5155
5263
  var import_firestore19 = require("firebase/firestore");
5156
5264
  var import_geofire_common7 = require("geofire-common");
5157
- var import_zod16 = require("zod");
5265
+ var import_zod17 = require("zod");
5158
5266
 
5159
5267
  // src/services/clinic/utils/clinic.utils.ts
5160
5268
  var import_firestore16 = require("firebase/firestore");
5161
5269
  var import_geofire_common4 = require("geofire-common");
5162
- var import_zod15 = require("zod");
5270
+ var import_zod16 = require("zod");
5163
5271
  async function getClinic(db, clinicId) {
5164
5272
  const docRef = (0, import_firestore16.doc)(db, CLINICS_COLLECTION, clinicId);
5165
5273
  const docSnap = await (0, import_firestore16.getDoc)(docRef);
@@ -5175,7 +5283,7 @@ async function getClinicsByGroup(db, groupId) {
5175
5283
  (0, import_firestore16.where)("isActive", "==", true)
5176
5284
  );
5177
5285
  const querySnapshot = await (0, import_firestore16.getDocs)(q);
5178
- return querySnapshot.docs.map((doc29) => doc29.data());
5286
+ return querySnapshot.docs.map((doc30) => doc30.data());
5179
5287
  }
5180
5288
  async function updateClinic(db, clinicId, data, adminId, clinicAdminService, app) {
5181
5289
  console.log("[CLINIC] Starting clinic update", { clinicId, adminId });
@@ -5369,7 +5477,7 @@ async function getClinicsByAdmin(db, adminId, options = {}, clinicAdminService,
5369
5477
  }
5370
5478
  const q = (0, import_firestore16.query)((0, import_firestore16.collection)(db, CLINICS_COLLECTION), ...constraints);
5371
5479
  const querySnapshot = await (0, import_firestore16.getDocs)(q);
5372
- return querySnapshot.docs.map((doc29) => doc29.data());
5480
+ return querySnapshot.docs.map((doc30) => doc30.data());
5373
5481
  }
5374
5482
  async function getActiveClinicsByAdmin(db, adminId, clinicAdminService, clinicGroupService) {
5375
5483
  return getClinicsByAdmin(
@@ -5414,11 +5522,11 @@ async function getAllClinics(db, pagination, lastDoc) {
5414
5522
  }
5415
5523
  const clinicsSnapshot = await (0, import_firestore16.getDocs)(clinicsQuery);
5416
5524
  const lastVisible = clinicsSnapshot.docs[clinicsSnapshot.docs.length - 1];
5417
- const clinics = clinicsSnapshot.docs.map((doc29) => {
5418
- const data = doc29.data();
5525
+ const clinics = clinicsSnapshot.docs.map((doc30) => {
5526
+ const data = doc30.data();
5419
5527
  return {
5420
5528
  ...data,
5421
- id: doc29.id
5529
+ id: doc30.id
5422
5530
  };
5423
5531
  });
5424
5532
  return {
@@ -5445,8 +5553,8 @@ async function getAllClinicsInRange(db, center, rangeInKm, pagination, lastDoc)
5445
5553
  ];
5446
5554
  const q = (0, import_firestore16.query)((0, import_firestore16.collection)(db, CLINICS_COLLECTION), ...constraints);
5447
5555
  const querySnapshot = await (0, import_firestore16.getDocs)(q);
5448
- for (const doc29 of querySnapshot.docs) {
5449
- const clinic = doc29.data();
5556
+ for (const doc30 of querySnapshot.docs) {
5557
+ const clinic = doc30.data();
5450
5558
  const distance = (0, import_geofire_common4.distanceBetween)(
5451
5559
  [center.latitude, center.longitude],
5452
5560
  [clinic.location.latitude, clinic.location.longitude]
@@ -5563,8 +5671,8 @@ async function findClinicsInRadius(db, center, radiusInKm, filters) {
5563
5671
  }
5564
5672
  const q = (0, import_firestore17.query)((0, import_firestore17.collection)(db, CLINICS_COLLECTION), ...constraints);
5565
5673
  const querySnapshot = await (0, import_firestore17.getDocs)(q);
5566
- for (const doc29 of querySnapshot.docs) {
5567
- const clinic = doc29.data();
5674
+ for (const doc30 of querySnapshot.docs) {
5675
+ const clinic = doc30.data();
5568
5676
  const distance = (0, import_geofire_common5.distanceBetween)(
5569
5677
  [center.latitude, center.longitude],
5570
5678
  [clinic.location.latitude, clinic.location.longitude]
@@ -5652,8 +5760,8 @@ async function getClinicsByFilters(db, filters) {
5652
5760
  console.log(
5653
5761
  `[FILTER_UTILS] Found ${querySnapshot.docs.length} clinics in geo bound`
5654
5762
  );
5655
- for (const doc29 of querySnapshot.docs) {
5656
- const clinic = { ...doc29.data(), id: doc29.id };
5763
+ for (const doc30 of querySnapshot.docs) {
5764
+ const clinic = { ...doc30.data(), id: doc30.id };
5657
5765
  const distance = (0, import_geofire_common6.distanceBetween)(
5658
5766
  [center.latitude, center.longitude],
5659
5767
  [clinic.location.latitude, clinic.location.longitude]
@@ -5709,8 +5817,8 @@ async function getClinicsByFilters(db, filters) {
5709
5817
  console.log(
5710
5818
  `[FILTER_UTILS] Found ${querySnapshot.docs.length} clinics with regular query`
5711
5819
  );
5712
- const clinics = querySnapshot.docs.map((doc29) => {
5713
- return { ...doc29.data(), id: doc29.id };
5820
+ const clinics = querySnapshot.docs.map((doc30) => {
5821
+ return { ...doc30.data(), id: doc30.id };
5714
5822
  });
5715
5823
  let filteredClinics = clinics;
5716
5824
  if (filters.center) {
@@ -5831,7 +5939,7 @@ var ClinicService = class extends BaseService {
5831
5939
  if (!savedClinic) throw new Error("Failed to retrieve created clinic");
5832
5940
  return savedClinic;
5833
5941
  } catch (error) {
5834
- if (error instanceof import_zod16.z.ZodError) {
5942
+ if (error instanceof import_zod17.z.ZodError) {
5835
5943
  throw new Error("Invalid clinic data: " + error.message);
5836
5944
  }
5837
5945
  console.error("Error creating clinic:", error);
@@ -5879,7 +5987,7 @@ var ClinicService = class extends BaseService {
5879
5987
  if (!updatedClinic) throw new Error("Failed to retrieve updated clinic");
5880
5988
  return updatedClinic;
5881
5989
  } catch (error) {
5882
- if (error instanceof import_zod16.z.ZodError) {
5990
+ if (error instanceof import_zod17.z.ZodError) {
5883
5991
  throw new Error(
5884
5992
  "Invalid clinic update data: " + error.errors.map((e) => `${e.path.join(".")} - ${e.message}`).join(", ")
5885
5993
  );
@@ -6338,7 +6446,7 @@ var AuthService = class extends BaseService {
6338
6446
  clinicAdmin: adminProfile
6339
6447
  };
6340
6448
  } catch (error) {
6341
- if (error instanceof import_zod17.z.ZodError) {
6449
+ if (error instanceof import_zod18.z.ZodError) {
6342
6450
  console.error(
6343
6451
  "[AUTH] Zod validation error in signUpClinicAdmin:",
6344
6452
  JSON.stringify(error.errors, null, 2)
@@ -6511,7 +6619,7 @@ var AuthService = class extends BaseService {
6511
6619
  email
6512
6620
  );
6513
6621
  } catch (error) {
6514
- if (error instanceof import_zod17.z.ZodError) {
6622
+ if (error instanceof import_zod18.z.ZodError) {
6515
6623
  throw AUTH_ERRORS.VALIDATION_ERROR;
6516
6624
  }
6517
6625
  const firebaseError = error;
@@ -6634,7 +6742,7 @@ var AuthService = class extends BaseService {
6634
6742
  await emailSchema.parseAsync(email);
6635
6743
  await (0, import_auth5.sendPasswordResetEmail)(this.auth, email);
6636
6744
  } catch (error) {
6637
- if (error instanceof import_zod17.z.ZodError) {
6745
+ if (error instanceof import_zod18.z.ZodError) {
6638
6746
  throw AUTH_ERRORS.VALIDATION_ERROR;
6639
6747
  }
6640
6748
  const firebaseError = error;
@@ -6673,7 +6781,7 @@ var AuthService = class extends BaseService {
6673
6781
  await passwordSchema.parseAsync(newPassword);
6674
6782
  await (0, import_auth5.confirmPasswordReset)(this.auth, oobCode, newPassword);
6675
6783
  } catch (error) {
6676
- if (error instanceof import_zod17.z.ZodError) {
6784
+ if (error instanceof import_zod18.z.ZodError) {
6677
6785
  throw AUTH_ERRORS.VALIDATION_ERROR;
6678
6786
  }
6679
6787
  const firebaseError = error;
@@ -6760,9 +6868,9 @@ var NotificationService = class extends BaseService {
6760
6868
  (0, import_firestore21.orderBy)("notificationTime", "desc")
6761
6869
  );
6762
6870
  const querySnapshot = await (0, import_firestore21.getDocs)(q);
6763
- return querySnapshot.docs.map((doc29) => ({
6764
- id: doc29.id,
6765
- ...doc29.data()
6871
+ return querySnapshot.docs.map((doc30) => ({
6872
+ id: doc30.id,
6873
+ ...doc30.data()
6766
6874
  }));
6767
6875
  }
6768
6876
  /**
@@ -6776,9 +6884,9 @@ var NotificationService = class extends BaseService {
6776
6884
  (0, import_firestore21.orderBy)("notificationTime", "desc")
6777
6885
  );
6778
6886
  const querySnapshot = await (0, import_firestore21.getDocs)(q);
6779
- return querySnapshot.docs.map((doc29) => ({
6780
- id: doc29.id,
6781
- ...doc29.data()
6887
+ return querySnapshot.docs.map((doc30) => ({
6888
+ id: doc30.id,
6889
+ ...doc30.data()
6782
6890
  }));
6783
6891
  }
6784
6892
  /**
@@ -6850,9 +6958,9 @@ var NotificationService = class extends BaseService {
6850
6958
  (0, import_firestore21.orderBy)("notificationTime", "desc")
6851
6959
  );
6852
6960
  const querySnapshot = await (0, import_firestore21.getDocs)(q);
6853
- return querySnapshot.docs.map((doc29) => ({
6854
- id: doc29.id,
6855
- ...doc29.data()
6961
+ return querySnapshot.docs.map((doc30) => ({
6962
+ id: doc30.id,
6963
+ ...doc30.data()
6856
6964
  }));
6857
6965
  }
6858
6966
  /**
@@ -6865,9 +6973,9 @@ var NotificationService = class extends BaseService {
6865
6973
  (0, import_firestore21.orderBy)("notificationTime", "desc")
6866
6974
  );
6867
6975
  const querySnapshot = await (0, import_firestore21.getDocs)(q);
6868
- return querySnapshot.docs.map((doc29) => ({
6869
- id: doc29.id,
6870
- ...doc29.data()
6976
+ return querySnapshot.docs.map((doc30) => ({
6977
+ id: doc30.id,
6978
+ ...doc30.data()
6871
6979
  }));
6872
6980
  }
6873
6981
  };
@@ -6879,59 +6987,59 @@ var import_firestore22 = require("firebase/firestore");
6879
6987
  var PROCEDURES_COLLECTION = "procedures";
6880
6988
 
6881
6989
  // src/validations/procedure.schema.ts
6882
- var import_zod18 = require("zod");
6883
- var createProcedureSchema = import_zod18.z.object({
6884
- name: import_zod18.z.string().min(1).max(200),
6885
- description: import_zod18.z.string().min(1).max(2e3),
6886
- family: import_zod18.z.nativeEnum(ProcedureFamily),
6887
- categoryId: import_zod18.z.string().min(1),
6888
- subcategoryId: import_zod18.z.string().min(1),
6889
- technologyId: import_zod18.z.string().min(1),
6890
- productId: import_zod18.z.string().min(1),
6891
- price: import_zod18.z.number().min(0),
6892
- currency: import_zod18.z.nativeEnum(Currency),
6893
- pricingMeasure: import_zod18.z.nativeEnum(PricingMeasure),
6894
- duration: import_zod18.z.number().min(1).max(480),
6990
+ var import_zod19 = require("zod");
6991
+ var createProcedureSchema = import_zod19.z.object({
6992
+ name: import_zod19.z.string().min(1).max(200),
6993
+ description: import_zod19.z.string().min(1).max(2e3),
6994
+ family: import_zod19.z.nativeEnum(ProcedureFamily),
6995
+ categoryId: import_zod19.z.string().min(1),
6996
+ subcategoryId: import_zod19.z.string().min(1),
6997
+ technologyId: import_zod19.z.string().min(1),
6998
+ productId: import_zod19.z.string().min(1),
6999
+ price: import_zod19.z.number().min(0),
7000
+ currency: import_zod19.z.nativeEnum(Currency),
7001
+ pricingMeasure: import_zod19.z.nativeEnum(PricingMeasure),
7002
+ duration: import_zod19.z.number().min(1).max(480),
6895
7003
  // Max 8 hours
6896
- practitionerId: import_zod18.z.string().min(1),
6897
- clinicBranchId: import_zod18.z.string().min(1)
7004
+ practitionerId: import_zod19.z.string().min(1),
7005
+ clinicBranchId: import_zod19.z.string().min(1)
6898
7006
  });
6899
- var updateProcedureSchema = import_zod18.z.object({
6900
- name: import_zod18.z.string().min(3).max(100).optional(),
6901
- description: import_zod18.z.string().min(3).max(1e3).optional(),
6902
- price: import_zod18.z.number().min(0).optional(),
6903
- currency: import_zod18.z.nativeEnum(Currency).optional(),
6904
- pricingMeasure: import_zod18.z.nativeEnum(PricingMeasure).optional(),
6905
- duration: import_zod18.z.number().min(0).optional(),
6906
- isActive: import_zod18.z.boolean().optional(),
6907
- practitionerId: import_zod18.z.string().optional(),
6908
- categoryId: import_zod18.z.string().optional(),
6909
- subcategoryId: import_zod18.z.string().optional(),
6910
- technologyId: import_zod18.z.string().optional(),
6911
- productId: import_zod18.z.string().optional(),
6912
- clinicBranchId: import_zod18.z.string().optional()
7007
+ var updateProcedureSchema = import_zod19.z.object({
7008
+ name: import_zod19.z.string().min(3).max(100).optional(),
7009
+ description: import_zod19.z.string().min(3).max(1e3).optional(),
7010
+ price: import_zod19.z.number().min(0).optional(),
7011
+ currency: import_zod19.z.nativeEnum(Currency).optional(),
7012
+ pricingMeasure: import_zod19.z.nativeEnum(PricingMeasure).optional(),
7013
+ duration: import_zod19.z.number().min(0).optional(),
7014
+ isActive: import_zod19.z.boolean().optional(),
7015
+ practitionerId: import_zod19.z.string().optional(),
7016
+ categoryId: import_zod19.z.string().optional(),
7017
+ subcategoryId: import_zod19.z.string().optional(),
7018
+ technologyId: import_zod19.z.string().optional(),
7019
+ productId: import_zod19.z.string().optional(),
7020
+ clinicBranchId: import_zod19.z.string().optional()
6913
7021
  });
6914
7022
  var procedureSchema = createProcedureSchema.extend({
6915
- id: import_zod18.z.string().min(1),
6916
- category: import_zod18.z.any(),
7023
+ id: import_zod19.z.string().min(1),
7024
+ category: import_zod19.z.any(),
6917
7025
  // We'll validate the full category object separately
6918
- subcategory: import_zod18.z.any(),
7026
+ subcategory: import_zod19.z.any(),
6919
7027
  // We'll validate the full subcategory object separately
6920
- technology: import_zod18.z.any(),
7028
+ technology: import_zod19.z.any(),
6921
7029
  // We'll validate the full technology object separately
6922
- product: import_zod18.z.any(),
7030
+ product: import_zod19.z.any(),
6923
7031
  // We'll validate the full product object separately
6924
- blockingConditions: import_zod18.z.array(import_zod18.z.any()),
7032
+ blockingConditions: import_zod19.z.array(import_zod19.z.any()),
6925
7033
  // We'll validate blocking conditions separately
6926
- treatmentBenefits: import_zod18.z.array(import_zod18.z.any()),
7034
+ treatmentBenefits: import_zod19.z.array(import_zod19.z.any()),
6927
7035
  // We'll validate treatment benefits separately
6928
- preRequirements: import_zod18.z.array(import_zod18.z.any()),
7036
+ preRequirements: import_zod19.z.array(import_zod19.z.any()),
6929
7037
  // We'll validate requirements separately
6930
- postRequirements: import_zod18.z.array(import_zod18.z.any()),
7038
+ postRequirements: import_zod19.z.array(import_zod19.z.any()),
6931
7039
  // We'll validate requirements separately
6932
- certificationRequirement: import_zod18.z.any(),
7040
+ certificationRequirement: import_zod19.z.any(),
6933
7041
  // We'll validate certification requirement separately
6934
- documentationTemplates: import_zod18.z.array(import_zod18.z.any()),
7042
+ documentationTemplates: import_zod19.z.array(import_zod19.z.any()),
6935
7043
  // We'll validate documentation templates separately
6936
7044
  clinicInfo: clinicInfoSchema,
6937
7045
  // Clinic info validation
@@ -6939,9 +7047,9 @@ var procedureSchema = createProcedureSchema.extend({
6939
7047
  // Doctor info validation
6940
7048
  reviewInfo: procedureReviewInfoSchema,
6941
7049
  // Procedure review info validation
6942
- isActive: import_zod18.z.boolean(),
6943
- createdAt: import_zod18.z.date(),
6944
- updatedAt: import_zod18.z.date()
7050
+ isActive: import_zod19.z.boolean(),
7051
+ createdAt: import_zod19.z.date(),
7052
+ updatedAt: import_zod19.z.date()
6945
7053
  });
6946
7054
 
6947
7055
  // src/services/procedure/procedure.service.ts
@@ -7084,7 +7192,7 @@ var ProcedureService = class extends BaseService {
7084
7192
  (0, import_firestore22.where)("isActive", "==", true)
7085
7193
  );
7086
7194
  const snapshot = await (0, import_firestore22.getDocs)(q);
7087
- return snapshot.docs.map((doc29) => doc29.data());
7195
+ return snapshot.docs.map((doc30) => doc30.data());
7088
7196
  }
7089
7197
  /**
7090
7198
  * Gets all procedures for a practitioner
@@ -7098,7 +7206,7 @@ var ProcedureService = class extends BaseService {
7098
7206
  (0, import_firestore22.where)("isActive", "==", true)
7099
7207
  );
7100
7208
  const snapshot = await (0, import_firestore22.getDocs)(q);
7101
- return snapshot.docs.map((doc29) => doc29.data());
7209
+ return snapshot.docs.map((doc30) => doc30.data());
7102
7210
  }
7103
7211
  /**
7104
7212
  * Updates a procedure
@@ -7281,20 +7389,20 @@ var ProcedureService = class extends BaseService {
7281
7389
  const proceduresCollection = (0, import_firestore22.collection)(this.db, PROCEDURES_COLLECTION);
7282
7390
  let proceduresQuery = (0, import_firestore22.query)(proceduresCollection);
7283
7391
  if (pagination && pagination > 0) {
7284
- const { limit: limit8, startAfter: startAfter8 } = await import("firebase/firestore");
7392
+ const { limit: limit9, startAfter: startAfter9 } = await import("firebase/firestore");
7285
7393
  if (lastDoc) {
7286
7394
  proceduresQuery = (0, import_firestore22.query)(
7287
7395
  proceduresCollection,
7288
7396
  (0, import_firestore22.orderBy)("name"),
7289
7397
  // Use imported orderBy
7290
- startAfter8(lastDoc),
7291
- limit8(pagination)
7398
+ startAfter9(lastDoc),
7399
+ limit9(pagination)
7292
7400
  );
7293
7401
  } else {
7294
7402
  proceduresQuery = (0, import_firestore22.query)(
7295
7403
  proceduresCollection,
7296
7404
  (0, import_firestore22.orderBy)("name"),
7297
- limit8(pagination)
7405
+ limit9(pagination)
7298
7406
  );
7299
7407
  }
7300
7408
  } else {
@@ -7302,11 +7410,11 @@ var ProcedureService = class extends BaseService {
7302
7410
  }
7303
7411
  const proceduresSnapshot = await (0, import_firestore22.getDocs)(proceduresQuery);
7304
7412
  const lastVisible = proceduresSnapshot.docs[proceduresSnapshot.docs.length - 1];
7305
- const procedures = proceduresSnapshot.docs.map((doc29) => {
7306
- const data = doc29.data();
7413
+ const procedures = proceduresSnapshot.docs.map((doc30) => {
7414
+ const data = doc30.data();
7307
7415
  return {
7308
7416
  ...data,
7309
- id: doc29.id
7417
+ id: doc30.id
7310
7418
  // Ensure ID is present
7311
7419
  };
7312
7420
  });
@@ -7388,8 +7496,8 @@ var ProcedureService = class extends BaseService {
7388
7496
  console.log(
7389
7497
  `[PROCEDURE_SERVICE] Found ${querySnapshot.docs.length} procedures in geo bound`
7390
7498
  );
7391
- for (const doc29 of querySnapshot.docs) {
7392
- const procedure = { ...doc29.data(), id: doc29.id };
7499
+ for (const doc30 of querySnapshot.docs) {
7500
+ const procedure = { ...doc30.data(), id: doc30.id };
7393
7501
  const distance = (0, import_geofire_common8.distanceBetween)(
7394
7502
  [center.latitude, center.longitude],
7395
7503
  [
@@ -7440,8 +7548,8 @@ var ProcedureService = class extends BaseService {
7440
7548
  console.log(
7441
7549
  `[PROCEDURE_SERVICE] Found ${querySnapshot.docs.length} procedures with regular query`
7442
7550
  );
7443
- const procedures = querySnapshot.docs.map((doc29) => {
7444
- return { ...doc29.data(), id: doc29.id };
7551
+ const procedures = querySnapshot.docs.map((doc30) => {
7552
+ return { ...doc30.data(), id: doc30.id };
7445
7553
  });
7446
7554
  if (filters.location) {
7447
7555
  const center = filters.location;
@@ -7659,9 +7767,9 @@ var DocumentationTemplateService = class extends BaseService {
7659
7767
  const querySnapshot = await (0, import_firestore23.getDocs)(q);
7660
7768
  const templates = [];
7661
7769
  let lastVisible = null;
7662
- querySnapshot.forEach((doc29) => {
7663
- templates.push(doc29.data());
7664
- lastVisible = doc29;
7770
+ querySnapshot.forEach((doc30) => {
7771
+ templates.push(doc30.data());
7772
+ lastVisible = doc30;
7665
7773
  });
7666
7774
  return {
7667
7775
  templates,
@@ -7689,9 +7797,9 @@ var DocumentationTemplateService = class extends BaseService {
7689
7797
  const querySnapshot = await (0, import_firestore23.getDocs)(q);
7690
7798
  const templates = [];
7691
7799
  let lastVisible = null;
7692
- querySnapshot.forEach((doc29) => {
7693
- templates.push(doc29.data());
7694
- lastVisible = doc29;
7800
+ querySnapshot.forEach((doc30) => {
7801
+ templates.push(doc30.data());
7802
+ lastVisible = doc30;
7695
7803
  });
7696
7804
  return {
7697
7805
  templates,
@@ -7718,9 +7826,9 @@ var DocumentationTemplateService = class extends BaseService {
7718
7826
  const querySnapshot = await (0, import_firestore23.getDocs)(q);
7719
7827
  const templates = [];
7720
7828
  let lastVisible = null;
7721
- querySnapshot.forEach((doc29) => {
7722
- templates.push(doc29.data());
7723
- lastVisible = doc29;
7829
+ querySnapshot.forEach((doc30) => {
7830
+ templates.push(doc30.data());
7831
+ lastVisible = doc30;
7724
7832
  });
7725
7833
  return {
7726
7834
  templates,
@@ -7833,9 +7941,9 @@ var FilledDocumentService = class extends BaseService {
7833
7941
  const querySnapshot = await (0, import_firestore24.getDocs)(q);
7834
7942
  const documents = [];
7835
7943
  let lastVisible = null;
7836
- querySnapshot.forEach((doc29) => {
7837
- documents.push(doc29.data());
7838
- lastVisible = doc29;
7944
+ querySnapshot.forEach((doc30) => {
7945
+ documents.push(doc30.data());
7946
+ lastVisible = doc30;
7839
7947
  });
7840
7948
  return {
7841
7949
  documents,
@@ -7862,9 +7970,9 @@ var FilledDocumentService = class extends BaseService {
7862
7970
  const querySnapshot = await (0, import_firestore24.getDocs)(q);
7863
7971
  const documents = [];
7864
7972
  let lastVisible = null;
7865
- querySnapshot.forEach((doc29) => {
7866
- documents.push(doc29.data());
7867
- lastVisible = doc29;
7973
+ querySnapshot.forEach((doc30) => {
7974
+ documents.push(doc30.data());
7975
+ lastVisible = doc30;
7868
7976
  });
7869
7977
  return {
7870
7978
  documents,
@@ -7891,9 +7999,9 @@ var FilledDocumentService = class extends BaseService {
7891
7999
  const querySnapshot = await (0, import_firestore24.getDocs)(q);
7892
8000
  const documents = [];
7893
8001
  let lastVisible = null;
7894
- querySnapshot.forEach((doc29) => {
7895
- documents.push(doc29.data());
7896
- lastVisible = doc29;
8002
+ querySnapshot.forEach((doc30) => {
8003
+ documents.push(doc30.data());
8004
+ lastVisible = doc30;
7897
8005
  });
7898
8006
  return {
7899
8007
  documents,
@@ -7920,9 +8028,9 @@ var FilledDocumentService = class extends BaseService {
7920
8028
  const querySnapshot = await (0, import_firestore24.getDocs)(q);
7921
8029
  const documents = [];
7922
8030
  let lastVisible = null;
7923
- querySnapshot.forEach((doc29) => {
7924
- documents.push(doc29.data());
7925
- lastVisible = doc29;
8031
+ querySnapshot.forEach((doc30) => {
8032
+ documents.push(doc30.data());
8033
+ lastVisible = doc30;
7926
8034
  });
7927
8035
  return {
7928
8036
  documents,
@@ -7949,9 +8057,9 @@ var FilledDocumentService = class extends BaseService {
7949
8057
  const querySnapshot = await (0, import_firestore24.getDocs)(q);
7950
8058
  const documents = [];
7951
8059
  let lastVisible = null;
7952
- querySnapshot.forEach((doc29) => {
7953
- documents.push(doc29.data());
7954
- lastVisible = doc29;
8060
+ querySnapshot.forEach((doc30) => {
8061
+ documents.push(doc30.data());
8062
+ lastVisible = doc30;
7955
8063
  });
7956
8064
  return {
7957
8065
  documents,
@@ -7976,42 +8084,42 @@ var SYNCED_CALENDARS_COLLECTION = "syncedCalendars";
7976
8084
  var import_firestore35 = require("firebase/firestore");
7977
8085
 
7978
8086
  // src/validations/calendar.schema.ts
7979
- var import_zod20 = require("zod");
8087
+ var import_zod21 = require("zod");
7980
8088
  var import_firestore26 = require("firebase/firestore");
7981
8089
 
7982
8090
  // src/validations/profile-info.schema.ts
7983
- var import_zod19 = require("zod");
8091
+ var import_zod20 = require("zod");
7984
8092
  var import_firestore25 = require("firebase/firestore");
7985
- var clinicInfoSchema2 = import_zod19.z.object({
7986
- id: import_zod19.z.string(),
7987
- featuredPhoto: import_zod19.z.string(),
7988
- name: import_zod19.z.string(),
7989
- description: import_zod19.z.string(),
8093
+ var clinicInfoSchema2 = import_zod20.z.object({
8094
+ id: import_zod20.z.string(),
8095
+ featuredPhoto: import_zod20.z.string(),
8096
+ name: import_zod20.z.string(),
8097
+ description: import_zod20.z.string(),
7990
8098
  location: clinicLocationSchema,
7991
8099
  contactInfo: clinicContactInfoSchema
7992
8100
  });
7993
- var practitionerProfileInfoSchema = import_zod19.z.object({
7994
- id: import_zod19.z.string(),
7995
- practitionerPhoto: import_zod19.z.string().nullable(),
7996
- name: import_zod19.z.string(),
7997
- email: import_zod19.z.string().email(),
7998
- phone: import_zod19.z.string().nullable(),
8101
+ var practitionerProfileInfoSchema = import_zod20.z.object({
8102
+ id: import_zod20.z.string(),
8103
+ practitionerPhoto: import_zod20.z.string().nullable(),
8104
+ name: import_zod20.z.string(),
8105
+ email: import_zod20.z.string().email(),
8106
+ phone: import_zod20.z.string().nullable(),
7999
8107
  certification: practitionerCertificationSchema
8000
8108
  });
8001
- var patientProfileInfoSchema = import_zod19.z.object({
8002
- id: import_zod19.z.string(),
8003
- fullName: import_zod19.z.string(),
8004
- email: import_zod19.z.string().email(),
8005
- phone: import_zod19.z.string().nullable(),
8006
- dateOfBirth: import_zod19.z.instanceof(import_firestore25.Timestamp),
8007
- gender: import_zod19.z.nativeEnum(Gender)
8109
+ var patientProfileInfoSchema = import_zod20.z.object({
8110
+ id: import_zod20.z.string(),
8111
+ fullName: import_zod20.z.string(),
8112
+ email: import_zod20.z.string().email(),
8113
+ phone: import_zod20.z.string().nullable(),
8114
+ dateOfBirth: import_zod20.z.instanceof(import_firestore25.Timestamp),
8115
+ gender: import_zod20.z.nativeEnum(Gender)
8008
8116
  });
8009
8117
 
8010
8118
  // src/validations/calendar.schema.ts
8011
8119
  var MIN_APPOINTMENT_DURATION = 15;
8012
- var calendarEventTimeSchema = import_zod20.z.object({
8013
- start: import_zod20.z.instanceof(Date).or(import_zod20.z.instanceof(import_firestore26.Timestamp)),
8014
- end: import_zod20.z.instanceof(Date).or(import_zod20.z.instanceof(import_firestore26.Timestamp))
8120
+ var calendarEventTimeSchema = import_zod21.z.object({
8121
+ start: import_zod21.z.instanceof(Date).or(import_zod21.z.instanceof(import_firestore26.Timestamp)),
8122
+ end: import_zod21.z.instanceof(Date).or(import_zod21.z.instanceof(import_firestore26.Timestamp))
8015
8123
  }).refine(
8016
8124
  (data) => {
8017
8125
  const startDate = data.start instanceof import_firestore26.Timestamp ? data.start.toDate() : data.start;
@@ -8032,46 +8140,46 @@ var calendarEventTimeSchema = import_zod20.z.object({
8032
8140
  path: ["start"]
8033
8141
  }
8034
8142
  );
8035
- var timeSlotSchema2 = import_zod20.z.object({
8036
- start: import_zod20.z.date(),
8037
- end: import_zod20.z.date(),
8038
- isAvailable: import_zod20.z.boolean()
8143
+ var timeSlotSchema2 = import_zod21.z.object({
8144
+ start: import_zod21.z.date(),
8145
+ end: import_zod21.z.date(),
8146
+ isAvailable: import_zod21.z.boolean()
8039
8147
  }).refine((data) => data.start < data.end, {
8040
8148
  message: "End time must be after start time",
8041
8149
  path: ["end"]
8042
8150
  });
8043
- var syncedCalendarEventSchema = import_zod20.z.object({
8044
- eventId: import_zod20.z.string(),
8045
- syncedCalendarProvider: import_zod20.z.nativeEnum(SyncedCalendarProvider),
8046
- syncedAt: import_zod20.z.instanceof(Date).or(import_zod20.z.instanceof(import_firestore26.Timestamp))
8151
+ var syncedCalendarEventSchema = import_zod21.z.object({
8152
+ eventId: import_zod21.z.string(),
8153
+ syncedCalendarProvider: import_zod21.z.nativeEnum(SyncedCalendarProvider),
8154
+ syncedAt: import_zod21.z.instanceof(Date).or(import_zod21.z.instanceof(import_firestore26.Timestamp))
8047
8155
  });
8048
- var procedureInfoSchema = import_zod20.z.object({
8049
- name: import_zod20.z.string(),
8050
- description: import_zod20.z.string(),
8051
- duration: import_zod20.z.number().min(MIN_APPOINTMENT_DURATION),
8052
- price: import_zod20.z.number().min(0),
8053
- currency: import_zod20.z.nativeEnum(Currency)
8156
+ var procedureInfoSchema = import_zod21.z.object({
8157
+ name: import_zod21.z.string(),
8158
+ description: import_zod21.z.string(),
8159
+ duration: import_zod21.z.number().min(MIN_APPOINTMENT_DURATION),
8160
+ price: import_zod21.z.number().min(0),
8161
+ currency: import_zod21.z.nativeEnum(Currency)
8054
8162
  });
8055
- var procedureCategorizationSchema = import_zod20.z.object({
8056
- procedureFamily: import_zod20.z.string(),
8163
+ var procedureCategorizationSchema = import_zod21.z.object({
8164
+ procedureFamily: import_zod21.z.string(),
8057
8165
  // Replace with proper enum when available
8058
- procedureCategory: import_zod20.z.string(),
8166
+ procedureCategory: import_zod21.z.string(),
8059
8167
  // Replace with proper enum when available
8060
- procedureSubcategory: import_zod20.z.string(),
8168
+ procedureSubcategory: import_zod21.z.string(),
8061
8169
  // Replace with proper enum when available
8062
- procedureTechnology: import_zod20.z.string(),
8170
+ procedureTechnology: import_zod21.z.string(),
8063
8171
  // Replace with proper enum when available
8064
- procedureProduct: import_zod20.z.string()
8172
+ procedureProduct: import_zod21.z.string()
8065
8173
  // Replace with proper enum when available
8066
8174
  });
8067
- var createAppointmentSchema = import_zod20.z.object({
8068
- clinicId: import_zod20.z.string().min(1, "Clinic ID is required"),
8069
- doctorId: import_zod20.z.string().min(1, "Doctor ID is required"),
8070
- patientId: import_zod20.z.string().min(1, "Patient ID is required"),
8071
- procedureId: import_zod20.z.string().min(1, "Procedure ID is required"),
8175
+ var createAppointmentSchema2 = import_zod21.z.object({
8176
+ clinicId: import_zod21.z.string().min(1, "Clinic ID is required"),
8177
+ doctorId: import_zod21.z.string().min(1, "Doctor ID is required"),
8178
+ patientId: import_zod21.z.string().min(1, "Patient ID is required"),
8179
+ procedureId: import_zod21.z.string().min(1, "Procedure ID is required"),
8072
8180
  eventLocation: clinicLocationSchema,
8073
8181
  eventTime: calendarEventTimeSchema,
8074
- description: import_zod20.z.string().optional()
8182
+ description: import_zod21.z.string().optional()
8075
8183
  }).refine(
8076
8184
  (data) => {
8077
8185
  return true;
@@ -8080,73 +8188,73 @@ var createAppointmentSchema = import_zod20.z.object({
8080
8188
  message: "Invalid appointment parameters"
8081
8189
  }
8082
8190
  );
8083
- var updateAppointmentSchema = import_zod20.z.object({
8084
- appointmentId: import_zod20.z.string().min(1, "Appointment ID is required"),
8085
- clinicId: import_zod20.z.string().min(1, "Clinic ID is required"),
8086
- doctorId: import_zod20.z.string().min(1, "Doctor ID is required"),
8087
- patientId: import_zod20.z.string().min(1, "Patient ID is required"),
8191
+ var updateAppointmentSchema2 = import_zod21.z.object({
8192
+ appointmentId: import_zod21.z.string().min(1, "Appointment ID is required"),
8193
+ clinicId: import_zod21.z.string().min(1, "Clinic ID is required"),
8194
+ doctorId: import_zod21.z.string().min(1, "Doctor ID is required"),
8195
+ patientId: import_zod21.z.string().min(1, "Patient ID is required"),
8088
8196
  eventTime: calendarEventTimeSchema.optional(),
8089
- description: import_zod20.z.string().optional(),
8090
- status: import_zod20.z.nativeEnum(CalendarEventStatus).optional()
8197
+ description: import_zod21.z.string().optional(),
8198
+ status: import_zod21.z.nativeEnum(CalendarEventStatus).optional()
8091
8199
  });
8092
- var createCalendarEventSchema = import_zod20.z.object({
8093
- id: import_zod20.z.string(),
8094
- clinicBranchId: import_zod20.z.string().nullable().optional(),
8095
- clinicBranchInfo: import_zod20.z.any().nullable().optional(),
8096
- practitionerProfileId: import_zod20.z.string().nullable().optional(),
8200
+ var createCalendarEventSchema = import_zod21.z.object({
8201
+ id: import_zod21.z.string(),
8202
+ clinicBranchId: import_zod21.z.string().nullable().optional(),
8203
+ clinicBranchInfo: import_zod21.z.any().nullable().optional(),
8204
+ practitionerProfileId: import_zod21.z.string().nullable().optional(),
8097
8205
  practitionerProfileInfo: practitionerProfileInfoSchema.nullable().optional(),
8098
- patientProfileId: import_zod20.z.string().nullable().optional(),
8206
+ patientProfileId: import_zod21.z.string().nullable().optional(),
8099
8207
  patientProfileInfo: patientProfileInfoSchema.nullable().optional(),
8100
- procedureId: import_zod20.z.string().nullable().optional(),
8101
- appointmentId: import_zod20.z.string().nullable().optional(),
8102
- syncedCalendarEventId: import_zod20.z.array(syncedCalendarEventSchema).nullable().optional(),
8103
- eventName: import_zod20.z.string().min(1, "Event name is required"),
8208
+ procedureId: import_zod21.z.string().nullable().optional(),
8209
+ appointmentId: import_zod21.z.string().nullable().optional(),
8210
+ syncedCalendarEventId: import_zod21.z.array(syncedCalendarEventSchema).nullable().optional(),
8211
+ eventName: import_zod21.z.string().min(1, "Event name is required"),
8104
8212
  eventLocation: clinicLocationSchema.optional(),
8105
8213
  eventTime: calendarEventTimeSchema,
8106
- description: import_zod20.z.string().optional(),
8107
- status: import_zod20.z.nativeEnum(CalendarEventStatus),
8108
- syncStatus: import_zod20.z.nativeEnum(CalendarSyncStatus),
8109
- eventType: import_zod20.z.nativeEnum(CalendarEventType),
8110
- createdAt: import_zod20.z.any(),
8214
+ description: import_zod21.z.string().optional(),
8215
+ status: import_zod21.z.nativeEnum(CalendarEventStatus),
8216
+ syncStatus: import_zod21.z.nativeEnum(CalendarSyncStatus),
8217
+ eventType: import_zod21.z.nativeEnum(CalendarEventType),
8218
+ createdAt: import_zod21.z.any(),
8111
8219
  // FieldValue for server timestamp
8112
- updatedAt: import_zod20.z.any()
8220
+ updatedAt: import_zod21.z.any()
8113
8221
  // FieldValue for server timestamp
8114
8222
  });
8115
- var updateCalendarEventSchema = import_zod20.z.object({
8116
- syncedCalendarEventId: import_zod20.z.array(syncedCalendarEventSchema).nullable().optional(),
8117
- appointmentId: import_zod20.z.string().nullable().optional(),
8118
- eventName: import_zod20.z.string().optional(),
8223
+ var updateCalendarEventSchema = import_zod21.z.object({
8224
+ syncedCalendarEventId: import_zod21.z.array(syncedCalendarEventSchema).nullable().optional(),
8225
+ appointmentId: import_zod21.z.string().nullable().optional(),
8226
+ eventName: import_zod21.z.string().optional(),
8119
8227
  eventTime: calendarEventTimeSchema.optional(),
8120
- description: import_zod20.z.string().optional(),
8121
- status: import_zod20.z.nativeEnum(CalendarEventStatus).optional(),
8122
- syncStatus: import_zod20.z.nativeEnum(CalendarSyncStatus).optional(),
8123
- eventType: import_zod20.z.nativeEnum(CalendarEventType).optional(),
8124
- updatedAt: import_zod20.z.any()
8228
+ description: import_zod21.z.string().optional(),
8229
+ status: import_zod21.z.nativeEnum(CalendarEventStatus).optional(),
8230
+ syncStatus: import_zod21.z.nativeEnum(CalendarSyncStatus).optional(),
8231
+ eventType: import_zod21.z.nativeEnum(CalendarEventType).optional(),
8232
+ updatedAt: import_zod21.z.any()
8125
8233
  // FieldValue for server timestamp
8126
8234
  });
8127
- var calendarEventSchema = import_zod20.z.object({
8128
- id: import_zod20.z.string(),
8129
- clinicBranchId: import_zod20.z.string().nullable().optional(),
8130
- clinicBranchInfo: import_zod20.z.any().nullable().optional(),
8235
+ var calendarEventSchema = import_zod21.z.object({
8236
+ id: import_zod21.z.string(),
8237
+ clinicBranchId: import_zod21.z.string().nullable().optional(),
8238
+ clinicBranchInfo: import_zod21.z.any().nullable().optional(),
8131
8239
  // Will be replaced with proper clinic info schema
8132
- practitionerProfileId: import_zod20.z.string().nullable().optional(),
8240
+ practitionerProfileId: import_zod21.z.string().nullable().optional(),
8133
8241
  practitionerProfileInfo: practitionerProfileInfoSchema.nullable().optional(),
8134
- patientProfileId: import_zod20.z.string().nullable().optional(),
8242
+ patientProfileId: import_zod21.z.string().nullable().optional(),
8135
8243
  patientProfileInfo: patientProfileInfoSchema.nullable().optional(),
8136
- procedureId: import_zod20.z.string().nullable().optional(),
8244
+ procedureId: import_zod21.z.string().nullable().optional(),
8137
8245
  procedureInfo: procedureInfoSchema.nullable().optional(),
8138
8246
  procedureCategorization: procedureCategorizationSchema.nullable().optional(),
8139
- appointmentId: import_zod20.z.string().nullable().optional(),
8140
- syncedCalendarEventId: import_zod20.z.array(syncedCalendarEventSchema).nullable().optional(),
8141
- eventName: import_zod20.z.string(),
8247
+ appointmentId: import_zod21.z.string().nullable().optional(),
8248
+ syncedCalendarEventId: import_zod21.z.array(syncedCalendarEventSchema).nullable().optional(),
8249
+ eventName: import_zod21.z.string(),
8142
8250
  eventLocation: clinicLocationSchema.optional(),
8143
8251
  eventTime: calendarEventTimeSchema,
8144
- description: import_zod20.z.string().optional(),
8145
- status: import_zod20.z.nativeEnum(CalendarEventStatus),
8146
- syncStatus: import_zod20.z.nativeEnum(CalendarSyncStatus),
8147
- eventType: import_zod20.z.nativeEnum(CalendarEventType),
8148
- createdAt: import_zod20.z.instanceof(Date).or(import_zod20.z.instanceof(import_firestore26.Timestamp)),
8149
- updatedAt: import_zod20.z.instanceof(Date).or(import_zod20.z.instanceof(import_firestore26.Timestamp))
8252
+ description: import_zod21.z.string().optional(),
8253
+ status: import_zod21.z.nativeEnum(CalendarEventStatus),
8254
+ syncStatus: import_zod21.z.nativeEnum(CalendarSyncStatus),
8255
+ eventType: import_zod21.z.nativeEnum(CalendarEventType),
8256
+ createdAt: import_zod21.z.instanceof(Date).or(import_zod21.z.instanceof(import_firestore26.Timestamp)),
8257
+ updatedAt: import_zod21.z.instanceof(Date).or(import_zod21.z.instanceof(import_firestore26.Timestamp))
8150
8258
  });
8151
8259
 
8152
8260
  // src/services/calendar/utils/clinic.utils.ts
@@ -8448,7 +8556,7 @@ async function searchCalendarEventsUtil(db, params) {
8448
8556
  const finalQuery = (0, import_firestore31.query)(collectionRef, ...constraints);
8449
8557
  const querySnapshot = await (0, import_firestore31.getDocs)(finalQuery);
8450
8558
  const events = querySnapshot.docs.map(
8451
- (doc29) => ({ id: doc29.id, ...doc29.data() })
8559
+ (doc30) => ({ id: doc30.id, ...doc30.data() })
8452
8560
  );
8453
8561
  return events;
8454
8562
  } catch (error) {
@@ -8530,7 +8638,7 @@ async function getPractitionerSyncedCalendarsUtil(db, practitionerId) {
8530
8638
  );
8531
8639
  const q = (0, import_firestore32.query)(calendarsRef, (0, import_firestore32.orderBy)("createdAt", "desc"));
8532
8640
  const querySnapshot = await (0, import_firestore32.getDocs)(q);
8533
- return querySnapshot.docs.map((doc29) => doc29.data());
8641
+ return querySnapshot.docs.map((doc30) => doc30.data());
8534
8642
  }
8535
8643
  async function getPatientSyncedCalendarUtil(db, patientId, calendarId) {
8536
8644
  const calendarRef = getPatientSyncedCalendarDocRef(db, patientId, calendarId);
@@ -8547,7 +8655,7 @@ async function getPatientSyncedCalendarsUtil(db, patientId) {
8547
8655
  );
8548
8656
  const q = (0, import_firestore32.query)(calendarsRef, (0, import_firestore32.orderBy)("createdAt", "desc"));
8549
8657
  const querySnapshot = await (0, import_firestore32.getDocs)(q);
8550
- return querySnapshot.docs.map((doc29) => doc29.data());
8658
+ return querySnapshot.docs.map((doc30) => doc30.data());
8551
8659
  }
8552
8660
  async function getClinicSyncedCalendarUtil(db, clinicId, calendarId) {
8553
8661
  const calendarRef = getClinicSyncedCalendarDocRef(db, clinicId, calendarId);
@@ -8564,7 +8672,7 @@ async function getClinicSyncedCalendarsUtil(db, clinicId) {
8564
8672
  );
8565
8673
  const q = (0, import_firestore32.query)(calendarsRef, (0, import_firestore32.orderBy)("createdAt", "desc"));
8566
8674
  const querySnapshot = await (0, import_firestore32.getDocs)(q);
8567
- return querySnapshot.docs.map((doc29) => doc29.data());
8675
+ return querySnapshot.docs.map((doc30) => doc30.data());
8568
8676
  }
8569
8677
  async function updatePractitionerSyncedCalendarUtil(db, practitionerId, calendarId, updateData) {
8570
8678
  const calendarRef = getPractitionerSyncedCalendarDocRef(
@@ -9919,9 +10027,9 @@ var CalendarServiceV2 = class extends BaseService {
9919
10027
  (0, import_firestore35.where)("eventTime.start", "<=", import_firestore34.Timestamp.fromDate(endDate))
9920
10028
  );
9921
10029
  const eventsSnapshot = await (0, import_firestore35.getDocs)(q);
9922
- const events = eventsSnapshot.docs.map((doc29) => ({
9923
- id: doc29.id,
9924
- ...doc29.data()
10030
+ const events = eventsSnapshot.docs.map((doc30) => ({
10031
+ id: doc30.id,
10032
+ ...doc30.data()
9925
10033
  }));
9926
10034
  const calendars = await this.syncedCalendarsService.getPractitionerSyncedCalendars(
9927
10035
  doctorId
@@ -10188,7 +10296,7 @@ var CalendarServiceV2 = class extends BaseService {
10188
10296
  * @throws Error if validation fails
10189
10297
  */
10190
10298
  async validateAppointmentParams(params) {
10191
- await createAppointmentSchema.parseAsync(params);
10299
+ await createAppointmentSchema2.parseAsync(params);
10192
10300
  }
10193
10301
  /**
10194
10302
  * Validates if the event time falls within clinic working hours
@@ -10470,7 +10578,7 @@ var CalendarServiceV2 = class extends BaseService {
10470
10578
  * @param params - Update parameters to validate
10471
10579
  */
10472
10580
  async validateUpdatePermissions(params) {
10473
- await updateAppointmentSchema.parseAsync(params);
10581
+ await updateAppointmentSchema2.parseAsync(params);
10474
10582
  }
10475
10583
  /**
10476
10584
  * Gets clinic working hours for a specific date
@@ -10553,7 +10661,7 @@ var CalendarServiceV2 = class extends BaseService {
10553
10661
  ])
10554
10662
  );
10555
10663
  const querySnapshot = await (0, import_firestore35.getDocs)(q);
10556
- return querySnapshot.docs.map((doc29) => doc29.data());
10664
+ return querySnapshot.docs.map((doc30) => doc30.data());
10557
10665
  }
10558
10666
  /**
10559
10667
  * Calculates available time slots based on working hours, schedule and existing appointments
@@ -10684,7 +10792,7 @@ var import_firestore36 = require("firebase/firestore");
10684
10792
  var REVIEWS_COLLECTION = "reviews";
10685
10793
 
10686
10794
  // src/services/reviews/reviews.service.ts
10687
- var import_zod21 = require("zod");
10795
+ var import_zod22 = require("zod");
10688
10796
  var ReviewService = class extends BaseService {
10689
10797
  constructor(db, auth, app) {
10690
10798
  super(db, auth, app);
@@ -10790,7 +10898,7 @@ var ReviewService = class extends BaseService {
10790
10898
  await Promise.all(updatePromises);
10791
10899
  return review;
10792
10900
  } catch (error) {
10793
- if (error instanceof import_zod21.z.ZodError) {
10901
+ if (error instanceof import_zod22.z.ZodError) {
10794
10902
  throw new Error(`Invalid review data: ${error.message}`);
10795
10903
  }
10796
10904
  throw error;
@@ -10820,7 +10928,7 @@ var ReviewService = class extends BaseService {
10820
10928
  (0, import_firestore36.where)("patientId", "==", patientId)
10821
10929
  );
10822
10930
  const snapshot = await (0, import_firestore36.getDocs)(q);
10823
- return snapshot.docs.map((doc29) => doc29.data());
10931
+ return snapshot.docs.map((doc30) => doc30.data());
10824
10932
  }
10825
10933
  /**
10826
10934
  * Gets all reviews for a specific clinic
@@ -10833,7 +10941,7 @@ var ReviewService = class extends BaseService {
10833
10941
  (0, import_firestore36.where)("clinicReview.clinicId", "==", clinicId)
10834
10942
  );
10835
10943
  const snapshot = await (0, import_firestore36.getDocs)(q);
10836
- return snapshot.docs.map((doc29) => doc29.data());
10944
+ return snapshot.docs.map((doc30) => doc30.data());
10837
10945
  }
10838
10946
  /**
10839
10947
  * Gets all reviews for a specific practitioner
@@ -10846,7 +10954,7 @@ var ReviewService = class extends BaseService {
10846
10954
  (0, import_firestore36.where)("practitionerReview.practitionerId", "==", practitionerId)
10847
10955
  );
10848
10956
  const snapshot = await (0, import_firestore36.getDocs)(q);
10849
- return snapshot.docs.map((doc29) => doc29.data());
10957
+ return snapshot.docs.map((doc30) => doc30.data());
10850
10958
  }
10851
10959
  /**
10852
10960
  * Gets all reviews for a specific procedure
@@ -10859,7 +10967,7 @@ var ReviewService = class extends BaseService {
10859
10967
  (0, import_firestore36.where)("procedureReview.procedureId", "==", procedureId)
10860
10968
  );
10861
10969
  const snapshot = await (0, import_firestore36.getDocs)(q);
10862
- return snapshot.docs.map((doc29) => doc29.data());
10970
+ return snapshot.docs.map((doc30) => doc30.data());
10863
10971
  }
10864
10972
  /**
10865
10973
  * Gets all reviews for a specific appointment
@@ -11286,94 +11394,917 @@ var ReviewService = class extends BaseService {
11286
11394
  }
11287
11395
  };
11288
11396
 
11289
- // src/backoffice/services/brand.service.ts
11397
+ // src/services/appointment/appointment.service.ts
11398
+ var import_firestore38 = require("firebase/firestore");
11399
+ var import_functions = require("firebase/functions");
11400
+
11401
+ // src/services/appointment/utils/appointment.utils.ts
11290
11402
  var import_firestore37 = require("firebase/firestore");
11291
11403
 
11292
- // src/backoffice/types/brand.types.ts
11293
- var BRANDS_COLLECTION = "brands";
11404
+ // src/backoffice/types/technology.types.ts
11405
+ var TECHNOLOGIES_COLLECTION = "technologies";
11294
11406
 
11295
- // src/backoffice/services/brand.service.ts
11296
- var BrandService = class extends BaseService {
11297
- /**
11298
- * Gets reference to brands collection
11299
- */
11300
- getBrandsRef() {
11301
- return (0, import_firestore37.collection)(this.db, BRANDS_COLLECTION);
11302
- }
11303
- /**
11304
- * Creates a new brand
11305
- */
11306
- async create(brand) {
11307
- const now = /* @__PURE__ */ new Date();
11308
- const newBrand = {
11309
- ...brand,
11310
- createdAt: now,
11311
- updatedAt: now,
11312
- isActive: true
11407
+ // src/services/appointment/utils/appointment.utils.ts
11408
+ async function fetchAggregatedInfoUtil(db, clinicId, practitionerId, patientId, procedureId) {
11409
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
11410
+ try {
11411
+ const [clinicDoc, practitionerDoc, patientDoc, procedureDoc] = await Promise.all([
11412
+ (0, import_firestore37.getDoc)((0, import_firestore37.doc)(db, CLINICS_COLLECTION, clinicId)),
11413
+ (0, import_firestore37.getDoc)((0, import_firestore37.doc)(db, PRACTITIONERS_COLLECTION, practitionerId)),
11414
+ (0, import_firestore37.getDoc)((0, import_firestore37.doc)(db, PATIENTS_COLLECTION, patientId)),
11415
+ (0, import_firestore37.getDoc)((0, import_firestore37.doc)(db, PROCEDURES_COLLECTION, procedureId))
11416
+ ]);
11417
+ if (!clinicDoc.exists()) {
11418
+ throw new Error(`Clinic with ID ${clinicId} not found`);
11419
+ }
11420
+ if (!practitionerDoc.exists()) {
11421
+ throw new Error(`Practitioner with ID ${practitionerId} not found`);
11422
+ }
11423
+ if (!patientDoc.exists()) {
11424
+ throw new Error(`Patient with ID ${patientId} not found`);
11425
+ }
11426
+ if (!procedureDoc.exists()) {
11427
+ throw new Error(`Procedure with ID ${procedureId} not found`);
11428
+ }
11429
+ const clinicData = clinicDoc.data();
11430
+ const practitionerData = practitionerDoc.data();
11431
+ const patientData = patientDoc.data();
11432
+ const procedureData = procedureDoc.data();
11433
+ const clinicInfo = {
11434
+ id: clinicId,
11435
+ featuredPhoto: ((_a = clinicData.featuredPhotos) == null ? void 0 : _a[0]) || "",
11436
+ name: clinicData.name,
11437
+ description: clinicData.description || null,
11438
+ location: clinicData.location,
11439
+ contactInfo: clinicData.contactInfo
11313
11440
  };
11314
- const docRef = await (0, import_firestore37.addDoc)(this.getBrandsRef(), newBrand);
11315
- return { id: docRef.id, ...newBrand };
11316
- }
11317
- /**
11318
- * Gets all active brands
11319
- */
11320
- async getAll() {
11321
- const q = (0, import_firestore37.query)(this.getBrandsRef(), (0, import_firestore37.where)("isActive", "==", true));
11322
- const snapshot = await (0, import_firestore37.getDocs)(q);
11323
- return snapshot.docs.map(
11324
- (doc29) => ({
11325
- id: doc29.id,
11326
- ...doc29.data()
11327
- })
11328
- );
11329
- }
11330
- /**
11331
- * Updates a brand
11332
- */
11333
- async update(brandId, brand) {
11334
- const updateData = {
11335
- ...brand,
11336
- updatedAt: /* @__PURE__ */ new Date()
11441
+ const practitionerInfo = {
11442
+ id: practitionerId,
11443
+ practitionerPhoto: ((_b = practitionerData.basicInfo) == null ? void 0 : _b.profileImageUrl) || null,
11444
+ name: `${((_c = practitionerData.basicInfo) == null ? void 0 : _c.firstName) || ""} ${((_d = practitionerData.basicInfo) == null ? void 0 : _d.lastName) || ""}`.trim(),
11445
+ email: ((_e = practitionerData.basicInfo) == null ? void 0 : _e.email) || "",
11446
+ phone: ((_f = practitionerData.basicInfo) == null ? void 0 : _f.phoneNumber) || null,
11447
+ certification: practitionerData.certification
11337
11448
  };
11338
- const docRef = (0, import_firestore37.doc)(this.getBrandsRef(), brandId);
11339
- await (0, import_firestore37.updateDoc)(docRef, updateData);
11340
- return this.getById(brandId);
11449
+ const patientInfo = {
11450
+ id: patientId,
11451
+ fullName: patientData.displayName || "",
11452
+ email: patientData.email || "",
11453
+ phone: patientData.phoneNumber || null,
11454
+ dateOfBirth: patientData.dateOfBirth || import_firestore37.Timestamp.now(),
11455
+ gender: patientData.gender || "other"
11456
+ };
11457
+ const procedureInfo = {
11458
+ id: procedureId,
11459
+ name: procedureData.name,
11460
+ description: procedureData.description,
11461
+ photo: procedureData.photo || "",
11462
+ family: procedureData.family,
11463
+ categoryName: ((_g = procedureData.category) == null ? void 0 : _g.name) || "",
11464
+ subcategoryName: ((_h = procedureData.subcategory) == null ? void 0 : _h.name) || "",
11465
+ technologyName: ((_i = procedureData.technology) == null ? void 0 : _i.name) || "",
11466
+ brandName: ((_j = procedureData.product) == null ? void 0 : _j.brand) || "",
11467
+ productName: ((_k = procedureData.product) == null ? void 0 : _k.name) || "",
11468
+ price: procedureData.price || 0,
11469
+ pricingMeasure: procedureData.pricingMeasure,
11470
+ currency: procedureData.currency,
11471
+ duration: procedureData.duration || 0,
11472
+ clinicId,
11473
+ clinicName: clinicInfo.name,
11474
+ practitionerId,
11475
+ practitionerName: practitionerInfo.name
11476
+ };
11477
+ let technologyId = "";
11478
+ if ((_l = procedureData.technology) == null ? void 0 : _l.id) {
11479
+ technologyId = procedureData.technology.id;
11480
+ }
11481
+ let blockingConditions = [];
11482
+ let contraindications = [];
11483
+ let preProcedureRequirements = [];
11484
+ let postProcedureRequirements = [];
11485
+ if (technologyId) {
11486
+ const technologyDoc = await (0, import_firestore37.getDoc)(
11487
+ (0, import_firestore37.doc)(db, TECHNOLOGIES_COLLECTION, technologyId)
11488
+ );
11489
+ if (technologyDoc.exists()) {
11490
+ const technologyData = technologyDoc.data();
11491
+ blockingConditions = technologyData.blockingConditions || [];
11492
+ contraindications = technologyData.contraindications || [];
11493
+ preProcedureRequirements = ((_m = technologyData.requirements) == null ? void 0 : _m.pre) || [];
11494
+ postProcedureRequirements = ((_n = technologyData.requirements) == null ? void 0 : _n.post) || [];
11495
+ }
11496
+ } else {
11497
+ blockingConditions = procedureData.blockingConditions || [];
11498
+ contraindications = procedureData.contraindications || [];
11499
+ preProcedureRequirements = procedureData.preRequirements || [];
11500
+ postProcedureRequirements = procedureData.postRequirements || [];
11501
+ }
11502
+ return {
11503
+ clinicInfo,
11504
+ practitionerInfo,
11505
+ patientInfo,
11506
+ procedureInfo,
11507
+ blockingConditions,
11508
+ contraindications,
11509
+ preProcedureRequirements,
11510
+ postProcedureRequirements
11511
+ };
11512
+ } catch (error) {
11513
+ console.error("Error fetching aggregated info:", error);
11514
+ throw error;
11341
11515
  }
11342
- /**
11343
- * Soft deletes a brand
11344
- */
11345
- async delete(brandId) {
11346
- await this.update(brandId, {
11347
- isActive: false
11516
+ }
11517
+ async function createAppointmentUtil2(db, data, aggregatedInfo, generateId2) {
11518
+ try {
11519
+ const appointmentId = generateId2();
11520
+ const appointment = {
11521
+ id: appointmentId,
11522
+ calendarEventId: data.calendarEventId,
11523
+ clinicBranchId: data.clinicBranchId,
11524
+ clinicInfo: aggregatedInfo.clinicInfo,
11525
+ practitionerId: data.practitionerId,
11526
+ practitionerInfo: aggregatedInfo.practitionerInfo,
11527
+ patientId: data.patientId,
11528
+ patientInfo: aggregatedInfo.patientInfo,
11529
+ procedureId: data.procedureId,
11530
+ procedureInfo: aggregatedInfo.procedureInfo,
11531
+ status: data.initialStatus,
11532
+ bookingTime: import_firestore37.Timestamp.now(),
11533
+ appointmentStartTime: data.appointmentStartTime,
11534
+ appointmentEndTime: data.appointmentEndTime,
11535
+ patientNotes: data.patientNotes || null,
11536
+ cost: data.cost,
11537
+ currency: data.currency,
11538
+ paymentStatus: data.initialPaymentStatus || "unpaid" /* UNPAID */,
11539
+ blockingConditions: aggregatedInfo.blockingConditions,
11540
+ contraindications: aggregatedInfo.contraindications,
11541
+ preProcedureRequirements: aggregatedInfo.preProcedureRequirements,
11542
+ postProcedureRequirements: aggregatedInfo.postProcedureRequirements,
11543
+ completedPreRequirements: [],
11544
+ completedPostRequirements: [],
11545
+ createdAt: (0, import_firestore37.serverTimestamp)(),
11546
+ updatedAt: (0, import_firestore37.serverTimestamp)()
11547
+ };
11548
+ if (data.initialStatus === "confirmed" /* CONFIRMED */) {
11549
+ appointment.confirmationTime = import_firestore37.Timestamp.now();
11550
+ }
11551
+ await (0, import_firestore37.setDoc)((0, import_firestore37.doc)(db, APPOINTMENTS_COLLECTION, appointmentId), appointment);
11552
+ const calendarEventRef = (0, import_firestore37.doc)(db, CALENDAR_COLLECTION, data.calendarEventId);
11553
+ await (0, import_firestore37.updateDoc)(calendarEventRef, {
11554
+ appointmentId,
11555
+ updatedAt: (0, import_firestore37.serverTimestamp)()
11348
11556
  });
11349
- }
11350
- /**
11351
- * Gets a brand by ID
11352
- */
11353
- async getById(brandId) {
11354
- const docRef = (0, import_firestore37.doc)(this.getBrandsRef(), brandId);
11355
- const docSnap = await (0, import_firestore37.getDoc)(docRef);
11356
- if (!docSnap.exists()) return null;
11557
+ const now = import_firestore37.Timestamp.now();
11357
11558
  return {
11358
- id: docSnap.id,
11359
- ...docSnap.data()
11559
+ ...appointment,
11560
+ createdAt: now,
11561
+ updatedAt: now
11360
11562
  };
11563
+ } catch (error) {
11564
+ console.error("Error creating appointment:", error);
11565
+ throw error;
11566
+ }
11567
+ }
11568
+ async function updateAppointmentUtil2(db, appointmentId, data) {
11569
+ try {
11570
+ const appointmentRef = (0, import_firestore37.doc)(db, APPOINTMENTS_COLLECTION, appointmentId);
11571
+ const appointmentDoc = await (0, import_firestore37.getDoc)(appointmentRef);
11572
+ if (!appointmentDoc.exists()) {
11573
+ throw new Error(`Appointment with ID ${appointmentId} not found`);
11574
+ }
11575
+ const currentAppointment = appointmentDoc.data();
11576
+ let completedPreRequirements = currentAppointment.completedPreRequirements || [];
11577
+ let completedPostRequirements = currentAppointment.completedPostRequirements || [];
11578
+ if (data.completedPreRequirements) {
11579
+ const validPreReqIds = currentAppointment.preProcedureRequirements.map(
11580
+ (req) => req.id
11581
+ );
11582
+ const invalidPreReqIds = data.completedPreRequirements.filter(
11583
+ (id) => !validPreReqIds.includes(id)
11584
+ );
11585
+ if (invalidPreReqIds.length > 0) {
11586
+ throw new Error(
11587
+ `Invalid pre-requirement IDs: ${invalidPreReqIds.join(", ")}`
11588
+ );
11589
+ }
11590
+ completedPreRequirements = [
11591
+ .../* @__PURE__ */ new Set([
11592
+ ...completedPreRequirements,
11593
+ ...data.completedPreRequirements
11594
+ ])
11595
+ ];
11596
+ }
11597
+ if (data.completedPostRequirements) {
11598
+ const validPostReqIds = currentAppointment.postProcedureRequirements.map(
11599
+ (req) => req.id
11600
+ );
11601
+ const invalidPostReqIds = data.completedPostRequirements.filter(
11602
+ (id) => !validPostReqIds.includes(id)
11603
+ );
11604
+ if (invalidPostReqIds.length > 0) {
11605
+ throw new Error(
11606
+ `Invalid post-requirement IDs: ${invalidPostReqIds.join(", ")}`
11607
+ );
11608
+ }
11609
+ completedPostRequirements = [
11610
+ .../* @__PURE__ */ new Set([
11611
+ ...completedPostRequirements,
11612
+ ...data.completedPostRequirements
11613
+ ])
11614
+ ];
11615
+ }
11616
+ const updateData = {
11617
+ ...data,
11618
+ completedPreRequirements,
11619
+ completedPostRequirements,
11620
+ updatedAt: (0, import_firestore37.serverTimestamp)()
11621
+ };
11622
+ Object.keys(updateData).forEach((key) => {
11623
+ if (updateData[key] === void 0) {
11624
+ delete updateData[key];
11625
+ }
11626
+ });
11627
+ if (data.status && data.status !== currentAppointment.status) {
11628
+ if (data.status === "confirmed" /* CONFIRMED */ && !updateData.confirmationTime) {
11629
+ updateData.confirmationTime = import_firestore37.Timestamp.now();
11630
+ }
11631
+ if (currentAppointment.calendarEventId) {
11632
+ await updateCalendarEventStatus(
11633
+ db,
11634
+ currentAppointment.calendarEventId,
11635
+ data.status
11636
+ );
11637
+ }
11638
+ }
11639
+ await (0, import_firestore37.updateDoc)(appointmentRef, updateData);
11640
+ const updatedAppointmentDoc = await (0, import_firestore37.getDoc)(appointmentRef);
11641
+ if (!updatedAppointmentDoc.exists()) {
11642
+ throw new Error(
11643
+ `Failed to retrieve updated appointment ${appointmentId}`
11644
+ );
11645
+ }
11646
+ return updatedAppointmentDoc.data();
11647
+ } catch (error) {
11648
+ console.error(`Error updating appointment ${appointmentId}:`, error);
11649
+ throw error;
11650
+ }
11651
+ }
11652
+ async function updateCalendarEventStatus(db, calendarEventId, appointmentStatus) {
11653
+ try {
11654
+ const calendarEventRef = (0, import_firestore37.doc)(db, CALENDAR_COLLECTION, calendarEventId);
11655
+ const calendarEventDoc = await (0, import_firestore37.getDoc)(calendarEventRef);
11656
+ if (!calendarEventDoc.exists()) {
11657
+ console.warn(`Calendar event with ID ${calendarEventId} not found`);
11658
+ return;
11659
+ }
11660
+ let calendarStatus;
11661
+ switch (appointmentStatus) {
11662
+ case "confirmed" /* CONFIRMED */:
11663
+ calendarStatus = "confirmed";
11664
+ break;
11665
+ case "canceled_patient" /* CANCELED_PATIENT */:
11666
+ case "canceled_clinic" /* CANCELED_CLINIC */:
11667
+ calendarStatus = "canceled";
11668
+ break;
11669
+ case "rescheduled" /* RESCHEDULED */:
11670
+ calendarStatus = "rescheduled";
11671
+ break;
11672
+ case "completed" /* COMPLETED */:
11673
+ calendarStatus = "completed";
11674
+ break;
11675
+ default:
11676
+ return;
11677
+ }
11678
+ await (0, import_firestore37.updateDoc)(calendarEventRef, {
11679
+ status: calendarStatus,
11680
+ updatedAt: (0, import_firestore37.serverTimestamp)()
11681
+ });
11682
+ } catch (error) {
11683
+ console.error(`Error updating calendar event ${calendarEventId}:`, error);
11684
+ }
11685
+ }
11686
+ async function getAppointmentByIdUtil(db, appointmentId) {
11687
+ try {
11688
+ const appointmentDoc = await (0, import_firestore37.getDoc)(
11689
+ (0, import_firestore37.doc)(db, APPOINTMENTS_COLLECTION, appointmentId)
11690
+ );
11691
+ if (!appointmentDoc.exists()) {
11692
+ return null;
11693
+ }
11694
+ return appointmentDoc.data();
11695
+ } catch (error) {
11696
+ console.error(`Error getting appointment ${appointmentId}:`, error);
11697
+ throw error;
11698
+ }
11699
+ }
11700
+ async function searchAppointmentsUtil(db, params) {
11701
+ try {
11702
+ const constraints = [];
11703
+ if (params.patientId) {
11704
+ constraints.push((0, import_firestore37.where)("patientId", "==", params.patientId));
11705
+ }
11706
+ if (params.practitionerId) {
11707
+ constraints.push((0, import_firestore37.where)("practitionerId", "==", params.practitionerId));
11708
+ }
11709
+ if (params.clinicBranchId) {
11710
+ constraints.push((0, import_firestore37.where)("clinicBranchId", "==", params.clinicBranchId));
11711
+ }
11712
+ if (params.startDate) {
11713
+ constraints.push(
11714
+ (0, import_firestore37.where)(
11715
+ "appointmentStartTime",
11716
+ ">=",
11717
+ import_firestore37.Timestamp.fromDate(params.startDate)
11718
+ )
11719
+ );
11720
+ }
11721
+ if (params.endDate) {
11722
+ constraints.push(
11723
+ (0, import_firestore37.where)("appointmentStartTime", "<=", import_firestore37.Timestamp.fromDate(params.endDate))
11724
+ );
11725
+ }
11726
+ if (params.status) {
11727
+ if (Array.isArray(params.status)) {
11728
+ constraints.push((0, import_firestore37.where)("status", "in", params.status));
11729
+ } else {
11730
+ constraints.push((0, import_firestore37.where)("status", "==", params.status));
11731
+ }
11732
+ }
11733
+ constraints.push((0, import_firestore37.orderBy)("appointmentStartTime", "asc"));
11734
+ if (params.limit) {
11735
+ constraints.push((0, import_firestore37.limit)(params.limit));
11736
+ }
11737
+ if (params.startAfter) {
11738
+ constraints.push((0, import_firestore37.startAfter)(params.startAfter));
11739
+ }
11740
+ const q = (0, import_firestore37.query)((0, import_firestore37.collection)(db, APPOINTMENTS_COLLECTION), ...constraints);
11741
+ const querySnapshot = await (0, import_firestore37.getDocs)(q);
11742
+ const appointments = querySnapshot.docs.map(
11743
+ (doc30) => doc30.data()
11744
+ );
11745
+ const lastDoc = querySnapshot.docs.length > 0 ? querySnapshot.docs[querySnapshot.docs.length - 1] : null;
11746
+ return { appointments, lastDoc };
11747
+ } catch (error) {
11748
+ console.error("Error searching appointments:", error);
11749
+ throw error;
11750
+ }
11751
+ }
11752
+
11753
+ // src/services/appointment/appointment.service.ts
11754
+ var AppointmentService = class extends BaseService {
11755
+ /**
11756
+ * Creates a new AppointmentService instance.
11757
+ *
11758
+ * @param db Firestore instance
11759
+ * @param auth Firebase Auth instance
11760
+ * @param app Firebase App instance
11761
+ * @param calendarService Calendar service instance
11762
+ * @param patientService Patient service instance
11763
+ * @param practitionerService Practitioner service instance
11764
+ * @param clinicService Clinic service instance
11765
+ */
11766
+ constructor(db, auth, app, calendarService, patientService, practitionerService, clinicService) {
11767
+ super(db, auth, app);
11768
+ this.calendarService = calendarService;
11769
+ this.patientService = patientService;
11770
+ this.practitionerService = practitionerService;
11771
+ this.clinicService = clinicService;
11772
+ this.functions = (0, import_functions.getFunctions)(app, "europe-west6");
11773
+ }
11774
+ /**
11775
+ * Gets available booking slots for a specific clinic, practitioner, and procedure.
11776
+ *
11777
+ * @param clinicId ID of the clinic
11778
+ * @param practitionerId ID of the practitioner
11779
+ * @param procedureId ID of the procedure
11780
+ * @param startDate Start date of the time range to check
11781
+ * @param endDate End date of the time range to check
11782
+ * @returns Array of available booking slots
11783
+ */
11784
+ async getAvailableBookingSlots(clinicId, practitionerId, procedureId, startDate, endDate) {
11785
+ try {
11786
+ console.log(
11787
+ `[APPOINTMENT_SERVICE] Getting available booking slots for clinic: ${clinicId}, practitioner: ${practitionerId}, procedure: ${procedureId}`
11788
+ );
11789
+ if (!clinicId || !practitionerId || !procedureId || !startDate || !endDate) {
11790
+ throw new Error(
11791
+ "Missing required parameters for booking slots calculation"
11792
+ );
11793
+ }
11794
+ if (endDate <= startDate) {
11795
+ throw new Error("End date must be after start date");
11796
+ }
11797
+ const getAvailableBookingSlotsFunction = (0, import_functions.httpsCallable)(
11798
+ this.functions,
11799
+ "getAvailableBookingSlots"
11800
+ );
11801
+ const result = await getAvailableBookingSlotsFunction({
11802
+ clinicId,
11803
+ practitionerId,
11804
+ procedureId,
11805
+ timeframe: {
11806
+ start: startDate.getTime(),
11807
+ // Convert to timestamp
11808
+ end: endDate.getTime()
11809
+ }
11810
+ });
11811
+ const response = result.data;
11812
+ if (!response.success) {
11813
+ throw new Error(
11814
+ response.error || "Failed to get available booking slots"
11815
+ );
11816
+ }
11817
+ const slots = response.availableSlots.map((slot) => ({
11818
+ start: new Date(slot.start)
11819
+ }));
11820
+ console.log(
11821
+ `[APPOINTMENT_SERVICE] Found ${slots.length} available booking slots`
11822
+ );
11823
+ return slots;
11824
+ } catch (error) {
11825
+ console.error(
11826
+ "[APPOINTMENT_SERVICE] Error getting available booking slots:",
11827
+ error
11828
+ );
11829
+ throw error;
11830
+ }
11831
+ }
11832
+ /**
11833
+ * Creates a new appointment.
11834
+ *
11835
+ * @param data Data needed to create the appointment
11836
+ * @returns The created appointment
11837
+ */
11838
+ async createAppointment(data) {
11839
+ try {
11840
+ console.log("[APPOINTMENT_SERVICE] Creating appointment");
11841
+ const validatedData = await createAppointmentSchema.parseAsync(data);
11842
+ const aggregatedInfo = await fetchAggregatedInfoUtil(
11843
+ this.db,
11844
+ validatedData.clinicBranchId,
11845
+ validatedData.practitionerId,
11846
+ validatedData.patientId,
11847
+ validatedData.procedureId
11848
+ );
11849
+ const appointment = await createAppointmentUtil2(
11850
+ this.db,
11851
+ validatedData,
11852
+ aggregatedInfo,
11853
+ this.generateId.bind(this)
11854
+ );
11855
+ console.log(
11856
+ `[APPOINTMENT_SERVICE] Appointment created with ID: ${appointment.id}`
11857
+ );
11858
+ return appointment;
11859
+ } catch (error) {
11860
+ console.error("[APPOINTMENT_SERVICE] Error creating appointment:", error);
11861
+ throw error;
11862
+ }
11863
+ }
11864
+ /**
11865
+ * Gets an appointment by ID.
11866
+ *
11867
+ * @param appointmentId ID of the appointment to retrieve
11868
+ * @returns The appointment or null if not found
11869
+ */
11870
+ async getAppointmentById(appointmentId) {
11871
+ try {
11872
+ console.log(
11873
+ `[APPOINTMENT_SERVICE] Getting appointment with ID: ${appointmentId}`
11874
+ );
11875
+ const appointment = await getAppointmentByIdUtil(this.db, appointmentId);
11876
+ console.log(
11877
+ `[APPOINTMENT_SERVICE] Appointment ${appointmentId} ${appointment ? "found" : "not found"}`
11878
+ );
11879
+ return appointment;
11880
+ } catch (error) {
11881
+ console.error(
11882
+ `[APPOINTMENT_SERVICE] Error getting appointment ${appointmentId}:`,
11883
+ error
11884
+ );
11885
+ throw error;
11886
+ }
11887
+ }
11888
+ /**
11889
+ * Updates an existing appointment.
11890
+ *
11891
+ * @param appointmentId ID of the appointment to update
11892
+ * @param data Update data for the appointment
11893
+ * @returns The updated appointment
11894
+ */
11895
+ async updateAppointment(appointmentId, data) {
11896
+ try {
11897
+ console.log(
11898
+ `[APPOINTMENT_SERVICE] Updating appointment with ID: ${appointmentId}`
11899
+ );
11900
+ const validatedData = await updateAppointmentSchema.parseAsync(data);
11901
+ const updatedAppointment = await updateAppointmentUtil2(
11902
+ this.db,
11903
+ appointmentId,
11904
+ validatedData
11905
+ );
11906
+ console.log(
11907
+ `[APPOINTMENT_SERVICE] Appointment ${appointmentId} updated successfully`
11908
+ );
11909
+ return updatedAppointment;
11910
+ } catch (error) {
11911
+ console.error(
11912
+ `[APPOINTMENT_SERVICE] Error updating appointment ${appointmentId}:`,
11913
+ error
11914
+ );
11915
+ throw error;
11916
+ }
11917
+ }
11918
+ /**
11919
+ * Searches for appointments based on various criteria.
11920
+ *
11921
+ * @param params Search parameters
11922
+ * @returns Found appointments and the last document for pagination
11923
+ */
11924
+ async searchAppointments(params) {
11925
+ try {
11926
+ console.log(
11927
+ "[APPOINTMENT_SERVICE] Searching appointments with params:",
11928
+ params
11929
+ );
11930
+ await searchAppointmentsSchema.parseAsync(params);
11931
+ const result = await searchAppointmentsUtil(this.db, params);
11932
+ console.log(
11933
+ `[APPOINTMENT_SERVICE] Found ${result.appointments.length} appointments`
11934
+ );
11935
+ return result;
11936
+ } catch (error) {
11937
+ console.error(
11938
+ "[APPOINTMENT_SERVICE] Error searching appointments:",
11939
+ error
11940
+ );
11941
+ throw error;
11942
+ }
11943
+ }
11944
+ /**
11945
+ * Gets appointments for a specific patient.
11946
+ *
11947
+ * @param patientId ID of the patient
11948
+ * @param options Optional parameters for filtering and pagination
11949
+ * @returns Found appointments and the last document for pagination
11950
+ */
11951
+ async getPatientAppointments(patientId, options) {
11952
+ console.log(
11953
+ `[APPOINTMENT_SERVICE] Getting appointments for patient: ${patientId}`
11954
+ );
11955
+ const searchParams = {
11956
+ patientId,
11957
+ startDate: options == null ? void 0 : options.startDate,
11958
+ endDate: options == null ? void 0 : options.endDate,
11959
+ status: options == null ? void 0 : options.status,
11960
+ limit: options == null ? void 0 : options.limit,
11961
+ startAfter: options == null ? void 0 : options.startAfter
11962
+ };
11963
+ return this.searchAppointments(searchParams);
11964
+ }
11965
+ /**
11966
+ * Gets appointments for a specific practitioner.
11967
+ *
11968
+ * @param practitionerId ID of the practitioner
11969
+ * @param options Optional parameters for filtering and pagination
11970
+ * @returns Found appointments and the last document for pagination
11971
+ */
11972
+ async getPractitionerAppointments(practitionerId, options) {
11973
+ console.log(
11974
+ `[APPOINTMENT_SERVICE] Getting appointments for practitioner: ${practitionerId}`
11975
+ );
11976
+ const searchParams = {
11977
+ practitionerId,
11978
+ startDate: options == null ? void 0 : options.startDate,
11979
+ endDate: options == null ? void 0 : options.endDate,
11980
+ status: options == null ? void 0 : options.status,
11981
+ limit: options == null ? void 0 : options.limit,
11982
+ startAfter: options == null ? void 0 : options.startAfter
11983
+ };
11984
+ return this.searchAppointments(searchParams);
11361
11985
  }
11362
- };
11363
-
11364
- // src/backoffice/services/category.service.ts
11365
- var import_firestore38 = require("firebase/firestore");
11366
-
11367
- // src/backoffice/types/category.types.ts
11368
- var CATEGORIES_COLLECTION = "backoffice_categories";
11369
-
11370
- // src/backoffice/services/category.service.ts
11371
- var CategoryService = class extends BaseService {
11986
+ /**
11987
+ * Gets appointments for a specific clinic.
11988
+ *
11989
+ * @param clinicBranchId ID of the clinic branch
11990
+ * @param options Optional parameters for filtering and pagination
11991
+ * @returns Found appointments and the last document for pagination
11992
+ */
11993
+ async getClinicAppointments(clinicBranchId, options) {
11994
+ console.log(
11995
+ `[APPOINTMENT_SERVICE] Getting appointments for clinic: ${clinicBranchId}`
11996
+ );
11997
+ const searchParams = {
11998
+ clinicBranchId,
11999
+ practitionerId: options == null ? void 0 : options.practitionerId,
12000
+ startDate: options == null ? void 0 : options.startDate,
12001
+ endDate: options == null ? void 0 : options.endDate,
12002
+ status: options == null ? void 0 : options.status,
12003
+ limit: options == null ? void 0 : options.limit,
12004
+ startAfter: options == null ? void 0 : options.startAfter
12005
+ };
12006
+ return this.searchAppointments(searchParams);
12007
+ }
12008
+ /**
12009
+ * Updates the status of an appointment.
12010
+ *
12011
+ * @param appointmentId ID of the appointment
12012
+ * @param newStatus New status to set
12013
+ * @param cancellationReason Required if canceling the appointment
12014
+ * @param canceledBy Required if canceling the appointment
12015
+ * @returns The updated appointment
12016
+ */
12017
+ async updateAppointmentStatus(appointmentId, newStatus, cancellationReason, canceledBy) {
12018
+ console.log(
12019
+ `[APPOINTMENT_SERVICE] Updating status of appointment ${appointmentId} to ${newStatus}`
12020
+ );
12021
+ const updateData = { status: newStatus };
12022
+ if (newStatus === "canceled_clinic" /* CANCELED_CLINIC */ || newStatus === "canceled_patient" /* CANCELED_PATIENT */) {
12023
+ if (!cancellationReason) {
12024
+ throw new Error(
12025
+ "Cancellation reason is required when canceling an appointment"
12026
+ );
12027
+ }
12028
+ if (!canceledBy) {
12029
+ throw new Error(
12030
+ "Canceled by is required when canceling an appointment"
12031
+ );
12032
+ }
12033
+ updateData.cancellationReason = cancellationReason;
12034
+ updateData.canceledBy = canceledBy;
12035
+ }
12036
+ if (newStatus === "confirmed" /* CONFIRMED */) {
12037
+ updateData.confirmationTime = import_firestore38.Timestamp.now();
12038
+ }
12039
+ return this.updateAppointment(appointmentId, updateData);
12040
+ }
12041
+ /**
12042
+ * Confirms an appointment.
12043
+ *
12044
+ * @param appointmentId ID of the appointment to confirm
12045
+ * @returns The confirmed appointment
12046
+ */
12047
+ async confirmAppointment(appointmentId) {
12048
+ console.log(
12049
+ `[APPOINTMENT_SERVICE] Confirming appointment: ${appointmentId}`
12050
+ );
12051
+ return this.updateAppointmentStatus(
12052
+ appointmentId,
12053
+ "confirmed" /* CONFIRMED */
12054
+ );
12055
+ }
12056
+ /**
12057
+ * Cancels an appointment from the clinic side.
12058
+ *
12059
+ * @param appointmentId ID of the appointment to cancel
12060
+ * @param reason Reason for cancellation
12061
+ * @returns The canceled appointment
12062
+ */
12063
+ async cancelAppointmentByClinic(appointmentId, reason) {
12064
+ console.log(
12065
+ `[APPOINTMENT_SERVICE] Canceling appointment by clinic: ${appointmentId}`
12066
+ );
12067
+ return this.updateAppointmentStatus(
12068
+ appointmentId,
12069
+ "canceled_clinic" /* CANCELED_CLINIC */,
12070
+ reason,
12071
+ "clinic"
12072
+ );
12073
+ }
12074
+ /**
12075
+ * Cancels an appointment from the patient side.
12076
+ *
12077
+ * @param appointmentId ID of the appointment to cancel
12078
+ * @param reason Reason for cancellation
12079
+ * @returns The canceled appointment
12080
+ */
12081
+ async cancelAppointmentByPatient(appointmentId, reason) {
12082
+ console.log(
12083
+ `[APPOINTMENT_SERVICE] Canceling appointment by patient: ${appointmentId}`
12084
+ );
12085
+ return this.updateAppointmentStatus(
12086
+ appointmentId,
12087
+ "canceled_patient" /* CANCELED_PATIENT */,
12088
+ reason,
12089
+ "patient"
12090
+ );
12091
+ }
12092
+ /**
12093
+ * Marks an appointment as checked in.
12094
+ *
12095
+ * @param appointmentId ID of the appointment
12096
+ * @returns The updated appointment
12097
+ */
12098
+ async checkInAppointment(appointmentId) {
12099
+ console.log(
12100
+ `[APPOINTMENT_SERVICE] Checking in appointment: ${appointmentId}`
12101
+ );
12102
+ return this.updateAppointmentStatus(
12103
+ appointmentId,
12104
+ "checked_in" /* CHECKED_IN */
12105
+ );
12106
+ }
12107
+ /**
12108
+ * Marks an appointment as in progress.
12109
+ *
12110
+ * @param appointmentId ID of the appointment
12111
+ * @returns The updated appointment
12112
+ */
12113
+ async startAppointment(appointmentId) {
12114
+ console.log(`[APPOINTMENT_SERVICE] Starting appointment: ${appointmentId}`);
12115
+ return this.updateAppointmentStatus(
12116
+ appointmentId,
12117
+ "in_progress" /* IN_PROGRESS */
12118
+ );
12119
+ }
12120
+ /**
12121
+ * Marks an appointment as completed.
12122
+ *
12123
+ * @param appointmentId ID of the appointment
12124
+ * @param actualDurationMinutes Actual duration of the appointment in minutes
12125
+ * @returns The updated appointment
12126
+ */
12127
+ async completeAppointment(appointmentId, actualDurationMinutes) {
12128
+ console.log(
12129
+ `[APPOINTMENT_SERVICE] Completing appointment: ${appointmentId}`
12130
+ );
12131
+ const updateData = {
12132
+ status: "completed" /* COMPLETED */,
12133
+ actualDurationMinutes
12134
+ };
12135
+ return this.updateAppointment(appointmentId, updateData);
12136
+ }
12137
+ /**
12138
+ * Marks an appointment as no-show.
12139
+ *
12140
+ * @param appointmentId ID of the appointment
12141
+ * @returns The updated appointment
12142
+ */
12143
+ async markNoShow(appointmentId) {
12144
+ console.log(
12145
+ `[APPOINTMENT_SERVICE] Marking appointment as no-show: ${appointmentId}`
12146
+ );
12147
+ return this.updateAppointmentStatus(
12148
+ appointmentId,
12149
+ "no_show" /* NO_SHOW */
12150
+ );
12151
+ }
12152
+ /**
12153
+ * Updates the payment status of an appointment.
12154
+ *
12155
+ * @param appointmentId ID of the appointment
12156
+ * @param paymentStatus New payment status
12157
+ * @param paymentTransactionId Optional transaction ID for the payment
12158
+ * @returns The updated appointment
12159
+ */
12160
+ async updatePaymentStatus(appointmentId, paymentStatus, paymentTransactionId) {
12161
+ console.log(
12162
+ `[APPOINTMENT_SERVICE] Updating payment status of appointment ${appointmentId} to ${paymentStatus}`
12163
+ );
12164
+ const updateData = {
12165
+ paymentStatus,
12166
+ paymentTransactionId: paymentTransactionId || null
12167
+ };
12168
+ return this.updateAppointment(appointmentId, updateData);
12169
+ }
12170
+ /**
12171
+ * Marks pre-procedure requirements as completed.
12172
+ *
12173
+ * @param appointmentId ID of the appointment
12174
+ * @param requirementIds IDs of the requirements to mark as completed
12175
+ * @returns The updated appointment
12176
+ */
12177
+ async completePreRequirements(appointmentId, requirementIds) {
12178
+ console.log(
12179
+ `[APPOINTMENT_SERVICE] Marking pre-requirements as completed for appointment: ${appointmentId}`
12180
+ );
12181
+ const updateData = {
12182
+ completedPreRequirements: requirementIds
12183
+ };
12184
+ return this.updateAppointment(appointmentId, updateData);
12185
+ }
12186
+ /**
12187
+ * Marks post-procedure requirements as completed.
12188
+ *
12189
+ * @param appointmentId ID of the appointment
12190
+ * @param requirementIds IDs of the requirements to mark as completed
12191
+ * @returns The updated appointment
12192
+ */
12193
+ async completePostRequirements(appointmentId, requirementIds) {
12194
+ console.log(
12195
+ `[APPOINTMENT_SERVICE] Marking post-requirements as completed for appointment: ${appointmentId}`
12196
+ );
12197
+ const updateData = {
12198
+ completedPostRequirements: requirementIds
12199
+ };
12200
+ return this.updateAppointment(appointmentId, updateData);
12201
+ }
12202
+ /**
12203
+ * Updates the internal notes of an appointment.
12204
+ *
12205
+ * @param appointmentId ID of the appointment
12206
+ * @param notes Updated internal notes
12207
+ * @returns The updated appointment
12208
+ */
12209
+ async updateInternalNotes(appointmentId, notes) {
12210
+ console.log(
12211
+ `[APPOINTMENT_SERVICE] Updating internal notes for appointment: ${appointmentId}`
12212
+ );
12213
+ const updateData = {
12214
+ internalNotes: notes
12215
+ };
12216
+ return this.updateAppointment(appointmentId, updateData);
12217
+ }
12218
+ };
12219
+
12220
+ // src/backoffice/services/brand.service.ts
12221
+ var import_firestore39 = require("firebase/firestore");
12222
+
12223
+ // src/backoffice/types/brand.types.ts
12224
+ var BRANDS_COLLECTION = "brands";
12225
+
12226
+ // src/backoffice/services/brand.service.ts
12227
+ var BrandService = class extends BaseService {
12228
+ /**
12229
+ * Gets reference to brands collection
12230
+ */
12231
+ getBrandsRef() {
12232
+ return (0, import_firestore39.collection)(this.db, BRANDS_COLLECTION);
12233
+ }
12234
+ /**
12235
+ * Creates a new brand
12236
+ */
12237
+ async create(brand) {
12238
+ const now = /* @__PURE__ */ new Date();
12239
+ const newBrand = {
12240
+ ...brand,
12241
+ createdAt: now,
12242
+ updatedAt: now,
12243
+ isActive: true
12244
+ };
12245
+ const docRef = await (0, import_firestore39.addDoc)(this.getBrandsRef(), newBrand);
12246
+ return { id: docRef.id, ...newBrand };
12247
+ }
12248
+ /**
12249
+ * Gets all active brands
12250
+ */
12251
+ async getAll() {
12252
+ const q = (0, import_firestore39.query)(this.getBrandsRef(), (0, import_firestore39.where)("isActive", "==", true));
12253
+ const snapshot = await (0, import_firestore39.getDocs)(q);
12254
+ return snapshot.docs.map(
12255
+ (doc30) => ({
12256
+ id: doc30.id,
12257
+ ...doc30.data()
12258
+ })
12259
+ );
12260
+ }
12261
+ /**
12262
+ * Updates a brand
12263
+ */
12264
+ async update(brandId, brand) {
12265
+ const updateData = {
12266
+ ...brand,
12267
+ updatedAt: /* @__PURE__ */ new Date()
12268
+ };
12269
+ const docRef = (0, import_firestore39.doc)(this.getBrandsRef(), brandId);
12270
+ await (0, import_firestore39.updateDoc)(docRef, updateData);
12271
+ return this.getById(brandId);
12272
+ }
12273
+ /**
12274
+ * Soft deletes a brand
12275
+ */
12276
+ async delete(brandId) {
12277
+ await this.update(brandId, {
12278
+ isActive: false
12279
+ });
12280
+ }
12281
+ /**
12282
+ * Gets a brand by ID
12283
+ */
12284
+ async getById(brandId) {
12285
+ const docRef = (0, import_firestore39.doc)(this.getBrandsRef(), brandId);
12286
+ const docSnap = await (0, import_firestore39.getDoc)(docRef);
12287
+ if (!docSnap.exists()) return null;
12288
+ return {
12289
+ id: docSnap.id,
12290
+ ...docSnap.data()
12291
+ };
12292
+ }
12293
+ };
12294
+
12295
+ // src/backoffice/services/category.service.ts
12296
+ var import_firestore40 = require("firebase/firestore");
12297
+
12298
+ // src/backoffice/types/category.types.ts
12299
+ var CATEGORIES_COLLECTION = "backoffice_categories";
12300
+
12301
+ // src/backoffice/services/category.service.ts
12302
+ var CategoryService = class extends BaseService {
11372
12303
  /**
11373
12304
  * Referenca na Firestore kolekciju kategorija
11374
12305
  */
11375
12306
  get categoriesRef() {
11376
- return (0, import_firestore38.collection)(this.db, CATEGORIES_COLLECTION);
12307
+ return (0, import_firestore40.collection)(this.db, CATEGORIES_COLLECTION);
11377
12308
  }
11378
12309
  /**
11379
12310
  * Kreira novu kategoriju u sistemu
@@ -11388,7 +12319,7 @@ var CategoryService = class extends BaseService {
11388
12319
  updatedAt: now,
11389
12320
  isActive: true
11390
12321
  };
11391
- const docRef = await (0, import_firestore38.addDoc)(this.categoriesRef, newCategory);
12322
+ const docRef = await (0, import_firestore40.addDoc)(this.categoriesRef, newCategory);
11392
12323
  return { id: docRef.id, ...newCategory };
11393
12324
  }
11394
12325
  /**
@@ -11396,12 +12327,12 @@ var CategoryService = class extends BaseService {
11396
12327
  * @returns Lista aktivnih kategorija
11397
12328
  */
11398
12329
  async getAll() {
11399
- const q = (0, import_firestore38.query)(this.categoriesRef, (0, import_firestore38.where)("isActive", "==", true));
11400
- const snapshot = await (0, import_firestore38.getDocs)(q);
12330
+ const q = (0, import_firestore40.query)(this.categoriesRef, (0, import_firestore40.where)("isActive", "==", true));
12331
+ const snapshot = await (0, import_firestore40.getDocs)(q);
11401
12332
  return snapshot.docs.map(
11402
- (doc29) => ({
11403
- id: doc29.id,
11404
- ...doc29.data()
12333
+ (doc30) => ({
12334
+ id: doc30.id,
12335
+ ...doc30.data()
11405
12336
  })
11406
12337
  );
11407
12338
  }
@@ -11411,16 +12342,16 @@ var CategoryService = class extends BaseService {
11411
12342
  * @returns Lista kategorija koje pripadaju traženoj familiji
11412
12343
  */
11413
12344
  async getAllByFamily(family) {
11414
- const q = (0, import_firestore38.query)(
12345
+ const q = (0, import_firestore40.query)(
11415
12346
  this.categoriesRef,
11416
- (0, import_firestore38.where)("family", "==", family),
11417
- (0, import_firestore38.where)("isActive", "==", true)
12347
+ (0, import_firestore40.where)("family", "==", family),
12348
+ (0, import_firestore40.where)("isActive", "==", true)
11418
12349
  );
11419
- const snapshot = await (0, import_firestore38.getDocs)(q);
12350
+ const snapshot = await (0, import_firestore40.getDocs)(q);
11420
12351
  return snapshot.docs.map(
11421
- (doc29) => ({
11422
- id: doc29.id,
11423
- ...doc29.data()
12352
+ (doc30) => ({
12353
+ id: doc30.id,
12354
+ ...doc30.data()
11424
12355
  })
11425
12356
  );
11426
12357
  }
@@ -11435,8 +12366,8 @@ var CategoryService = class extends BaseService {
11435
12366
  ...category,
11436
12367
  updatedAt: /* @__PURE__ */ new Date()
11437
12368
  };
11438
- const docRef = (0, import_firestore38.doc)(this.categoriesRef, id);
11439
- await (0, import_firestore38.updateDoc)(docRef, updateData);
12369
+ const docRef = (0, import_firestore40.doc)(this.categoriesRef, id);
12370
+ await (0, import_firestore40.updateDoc)(docRef, updateData);
11440
12371
  return this.getById(id);
11441
12372
  }
11442
12373
  /**
@@ -11452,8 +12383,8 @@ var CategoryService = class extends BaseService {
11452
12383
  * @returns Kategorija ili null ako ne postoji
11453
12384
  */
11454
12385
  async getById(id) {
11455
- const docRef = (0, import_firestore38.doc)(this.categoriesRef, id);
11456
- const docSnap = await (0, import_firestore38.getDoc)(docRef);
12386
+ const docRef = (0, import_firestore40.doc)(this.categoriesRef, id);
12387
+ const docSnap = await (0, import_firestore40.getDoc)(docRef);
11457
12388
  if (!docSnap.exists()) return null;
11458
12389
  return {
11459
12390
  id: docSnap.id,
@@ -11463,7 +12394,7 @@ var CategoryService = class extends BaseService {
11463
12394
  };
11464
12395
 
11465
12396
  // src/backoffice/services/subcategory.service.ts
11466
- var import_firestore39 = require("firebase/firestore");
12397
+ var import_firestore41 = require("firebase/firestore");
11467
12398
 
11468
12399
  // src/backoffice/types/subcategory.types.ts
11469
12400
  var SUBCATEGORIES_COLLECTION = "subcategories";
@@ -11475,7 +12406,7 @@ var SubcategoryService = class extends BaseService {
11475
12406
  * @param categoryId - ID roditeljske kategorije
11476
12407
  */
11477
12408
  getSubcategoriesRef(categoryId) {
11478
- return (0, import_firestore39.collection)(
12409
+ return (0, import_firestore41.collection)(
11479
12410
  this.db,
11480
12411
  CATEGORIES_COLLECTION,
11481
12412
  categoryId,
@@ -11497,7 +12428,7 @@ var SubcategoryService = class extends BaseService {
11497
12428
  updatedAt: now,
11498
12429
  isActive: true
11499
12430
  };
11500
- const docRef = await (0, import_firestore39.addDoc)(
12431
+ const docRef = await (0, import_firestore41.addDoc)(
11501
12432
  this.getSubcategoriesRef(categoryId),
11502
12433
  newSubcategory
11503
12434
  );
@@ -11509,15 +12440,15 @@ var SubcategoryService = class extends BaseService {
11509
12440
  * @returns Lista aktivnih podkategorija
11510
12441
  */
11511
12442
  async getAllByCategoryId(categoryId) {
11512
- const q = (0, import_firestore39.query)(
12443
+ const q = (0, import_firestore41.query)(
11513
12444
  this.getSubcategoriesRef(categoryId),
11514
- (0, import_firestore39.where)("isActive", "==", true)
12445
+ (0, import_firestore41.where)("isActive", "==", true)
11515
12446
  );
11516
- const snapshot = await (0, import_firestore39.getDocs)(q);
12447
+ const snapshot = await (0, import_firestore41.getDocs)(q);
11517
12448
  return snapshot.docs.map(
11518
- (doc29) => ({
11519
- id: doc29.id,
11520
- ...doc29.data()
12449
+ (doc30) => ({
12450
+ id: doc30.id,
12451
+ ...doc30.data()
11521
12452
  })
11522
12453
  );
11523
12454
  }
@@ -11533,8 +12464,8 @@ var SubcategoryService = class extends BaseService {
11533
12464
  ...subcategory,
11534
12465
  updatedAt: /* @__PURE__ */ new Date()
11535
12466
  };
11536
- const docRef = (0, import_firestore39.doc)(this.getSubcategoriesRef(categoryId), subcategoryId);
11537
- await (0, import_firestore39.updateDoc)(docRef, updateData);
12467
+ const docRef = (0, import_firestore41.doc)(this.getSubcategoriesRef(categoryId), subcategoryId);
12468
+ await (0, import_firestore41.updateDoc)(docRef, updateData);
11538
12469
  return this.getById(categoryId, subcategoryId);
11539
12470
  }
11540
12471
  /**
@@ -11552,8 +12483,8 @@ var SubcategoryService = class extends BaseService {
11552
12483
  * @returns Podkategorija ili null ako ne postoji
11553
12484
  */
11554
12485
  async getById(categoryId, subcategoryId) {
11555
- const docRef = (0, import_firestore39.doc)(this.getSubcategoriesRef(categoryId), subcategoryId);
11556
- const docSnap = await (0, import_firestore39.getDoc)(docRef);
12486
+ const docRef = (0, import_firestore41.doc)(this.getSubcategoriesRef(categoryId), subcategoryId);
12487
+ const docSnap = await (0, import_firestore41.getDoc)(docRef);
11557
12488
  if (!docSnap.exists()) return null;
11558
12489
  return {
11559
12490
  id: docSnap.id,
@@ -11563,12 +12494,7 @@ var SubcategoryService = class extends BaseService {
11563
12494
  };
11564
12495
 
11565
12496
  // src/backoffice/services/technology.service.ts
11566
- var import_firestore40 = require("firebase/firestore");
11567
-
11568
- // src/backoffice/types/technology.types.ts
11569
- var TECHNOLOGIES_COLLECTION = "technologies";
11570
-
11571
- // src/backoffice/services/technology.service.ts
12497
+ var import_firestore42 = require("firebase/firestore");
11572
12498
  var DEFAULT_CERTIFICATION_REQUIREMENT = {
11573
12499
  minimumLevel: "aesthetician" /* AESTHETICIAN */,
11574
12500
  requiredSpecialties: []
@@ -11578,7 +12504,7 @@ var TechnologyService = class extends BaseService {
11578
12504
  * Vraća referencu na Firestore kolekciju tehnologija
11579
12505
  */
11580
12506
  getTechnologiesRef() {
11581
- return (0, import_firestore40.collection)(this.db, TECHNOLOGIES_COLLECTION);
12507
+ return (0, import_firestore42.collection)(this.db, TECHNOLOGIES_COLLECTION);
11582
12508
  }
11583
12509
  /**
11584
12510
  * Kreira novu tehnologiju
@@ -11601,7 +12527,7 @@ var TechnologyService = class extends BaseService {
11601
12527
  benefits: technology.benefits || [],
11602
12528
  certificationRequirement: technology.certificationRequirement || DEFAULT_CERTIFICATION_REQUIREMENT
11603
12529
  };
11604
- const docRef = await (0, import_firestore40.addDoc)(this.getTechnologiesRef(), newTechnology);
12530
+ const docRef = await (0, import_firestore42.addDoc)(this.getTechnologiesRef(), newTechnology);
11605
12531
  return { id: docRef.id, ...newTechnology };
11606
12532
  }
11607
12533
  /**
@@ -11609,12 +12535,12 @@ var TechnologyService = class extends BaseService {
11609
12535
  * @returns Lista aktivnih tehnologija
11610
12536
  */
11611
12537
  async getAll() {
11612
- const q = (0, import_firestore40.query)(this.getTechnologiesRef(), (0, import_firestore40.where)("isActive", "==", true));
11613
- const snapshot = await (0, import_firestore40.getDocs)(q);
12538
+ const q = (0, import_firestore42.query)(this.getTechnologiesRef(), (0, import_firestore42.where)("isActive", "==", true));
12539
+ const snapshot = await (0, import_firestore42.getDocs)(q);
11614
12540
  return snapshot.docs.map(
11615
- (doc29) => ({
11616
- id: doc29.id,
11617
- ...doc29.data()
12541
+ (doc30) => ({
12542
+ id: doc30.id,
12543
+ ...doc30.data()
11618
12544
  })
11619
12545
  );
11620
12546
  }
@@ -11624,16 +12550,16 @@ var TechnologyService = class extends BaseService {
11624
12550
  * @returns Lista aktivnih tehnologija
11625
12551
  */
11626
12552
  async getAllByFamily(family) {
11627
- const q = (0, import_firestore40.query)(
12553
+ const q = (0, import_firestore42.query)(
11628
12554
  this.getTechnologiesRef(),
11629
- (0, import_firestore40.where)("isActive", "==", true),
11630
- (0, import_firestore40.where)("family", "==", family)
12555
+ (0, import_firestore42.where)("isActive", "==", true),
12556
+ (0, import_firestore42.where)("family", "==", family)
11631
12557
  );
11632
- const snapshot = await (0, import_firestore40.getDocs)(q);
12558
+ const snapshot = await (0, import_firestore42.getDocs)(q);
11633
12559
  return snapshot.docs.map(
11634
- (doc29) => ({
11635
- id: doc29.id,
11636
- ...doc29.data()
12560
+ (doc30) => ({
12561
+ id: doc30.id,
12562
+ ...doc30.data()
11637
12563
  })
11638
12564
  );
11639
12565
  }
@@ -11643,16 +12569,16 @@ var TechnologyService = class extends BaseService {
11643
12569
  * @returns Lista aktivnih tehnologija
11644
12570
  */
11645
12571
  async getAllByCategoryId(categoryId) {
11646
- const q = (0, import_firestore40.query)(
12572
+ const q = (0, import_firestore42.query)(
11647
12573
  this.getTechnologiesRef(),
11648
- (0, import_firestore40.where)("isActive", "==", true),
11649
- (0, import_firestore40.where)("categoryId", "==", categoryId)
12574
+ (0, import_firestore42.where)("isActive", "==", true),
12575
+ (0, import_firestore42.where)("categoryId", "==", categoryId)
11650
12576
  );
11651
- const snapshot = await (0, import_firestore40.getDocs)(q);
12577
+ const snapshot = await (0, import_firestore42.getDocs)(q);
11652
12578
  return snapshot.docs.map(
11653
- (doc29) => ({
11654
- id: doc29.id,
11655
- ...doc29.data()
12579
+ (doc30) => ({
12580
+ id: doc30.id,
12581
+ ...doc30.data()
11656
12582
  })
11657
12583
  );
11658
12584
  }
@@ -11662,16 +12588,16 @@ var TechnologyService = class extends BaseService {
11662
12588
  * @returns Lista aktivnih tehnologija
11663
12589
  */
11664
12590
  async getAllBySubcategoryId(subcategoryId) {
11665
- const q = (0, import_firestore40.query)(
12591
+ const q = (0, import_firestore42.query)(
11666
12592
  this.getTechnologiesRef(),
11667
- (0, import_firestore40.where)("isActive", "==", true),
11668
- (0, import_firestore40.where)("subcategoryId", "==", subcategoryId)
12593
+ (0, import_firestore42.where)("isActive", "==", true),
12594
+ (0, import_firestore42.where)("subcategoryId", "==", subcategoryId)
11669
12595
  );
11670
- const snapshot = await (0, import_firestore40.getDocs)(q);
12596
+ const snapshot = await (0, import_firestore42.getDocs)(q);
11671
12597
  return snapshot.docs.map(
11672
- (doc29) => ({
11673
- id: doc29.id,
11674
- ...doc29.data()
12598
+ (doc30) => ({
12599
+ id: doc30.id,
12600
+ ...doc30.data()
11675
12601
  })
11676
12602
  );
11677
12603
  }
@@ -11686,8 +12612,8 @@ var TechnologyService = class extends BaseService {
11686
12612
  ...technology,
11687
12613
  updatedAt: /* @__PURE__ */ new Date()
11688
12614
  };
11689
- const docRef = (0, import_firestore40.doc)(this.getTechnologiesRef(), technologyId);
11690
- await (0, import_firestore40.updateDoc)(docRef, updateData);
12615
+ const docRef = (0, import_firestore42.doc)(this.getTechnologiesRef(), technologyId);
12616
+ await (0, import_firestore42.updateDoc)(docRef, updateData);
11691
12617
  return this.getById(technologyId);
11692
12618
  }
11693
12619
  /**
@@ -11705,8 +12631,8 @@ var TechnologyService = class extends BaseService {
11705
12631
  * @returns Tehnologija ili null ako ne postoji
11706
12632
  */
11707
12633
  async getById(technologyId) {
11708
- const docRef = (0, import_firestore40.doc)(this.getTechnologiesRef(), technologyId);
11709
- const docSnap = await (0, import_firestore40.getDoc)(docRef);
12634
+ const docRef = (0, import_firestore42.doc)(this.getTechnologiesRef(), technologyId);
12635
+ const docSnap = await (0, import_firestore42.getDoc)(docRef);
11710
12636
  if (!docSnap.exists()) return null;
11711
12637
  return {
11712
12638
  id: docSnap.id,
@@ -11720,10 +12646,10 @@ var TechnologyService = class extends BaseService {
11720
12646
  * @returns Ažurirana tehnologija sa novim zahtevom
11721
12647
  */
11722
12648
  async addRequirement(technologyId, requirement) {
11723
- const docRef = (0, import_firestore40.doc)(this.getTechnologiesRef(), technologyId);
12649
+ const docRef = (0, import_firestore42.doc)(this.getTechnologiesRef(), technologyId);
11724
12650
  const requirementType = requirement.type === "pre" ? "requirements.pre" : "requirements.post";
11725
- await (0, import_firestore40.updateDoc)(docRef, {
11726
- [requirementType]: (0, import_firestore40.arrayUnion)(requirement),
12651
+ await (0, import_firestore42.updateDoc)(docRef, {
12652
+ [requirementType]: (0, import_firestore42.arrayUnion)(requirement),
11727
12653
  updatedAt: /* @__PURE__ */ new Date()
11728
12654
  });
11729
12655
  return this.getById(technologyId);
@@ -11735,10 +12661,10 @@ var TechnologyService = class extends BaseService {
11735
12661
  * @returns Ažurirana tehnologija bez uklonjenog zahteva
11736
12662
  */
11737
12663
  async removeRequirement(technologyId, requirement) {
11738
- const docRef = (0, import_firestore40.doc)(this.getTechnologiesRef(), technologyId);
12664
+ const docRef = (0, import_firestore42.doc)(this.getTechnologiesRef(), technologyId);
11739
12665
  const requirementType = requirement.type === "pre" ? "requirements.pre" : "requirements.post";
11740
- await (0, import_firestore40.updateDoc)(docRef, {
11741
- [requirementType]: (0, import_firestore40.arrayRemove)(requirement),
12666
+ await (0, import_firestore42.updateDoc)(docRef, {
12667
+ [requirementType]: (0, import_firestore42.arrayRemove)(requirement),
11742
12668
  updatedAt: /* @__PURE__ */ new Date()
11743
12669
  });
11744
12670
  return this.getById(technologyId);
@@ -11775,9 +12701,9 @@ var TechnologyService = class extends BaseService {
11775
12701
  * @returns Ažurirana tehnologija
11776
12702
  */
11777
12703
  async addBlockingCondition(technologyId, condition) {
11778
- const docRef = (0, import_firestore40.doc)(this.getTechnologiesRef(), technologyId);
11779
- await (0, import_firestore40.updateDoc)(docRef, {
11780
- blockingConditions: (0, import_firestore40.arrayUnion)(condition),
12704
+ const docRef = (0, import_firestore42.doc)(this.getTechnologiesRef(), technologyId);
12705
+ await (0, import_firestore42.updateDoc)(docRef, {
12706
+ blockingConditions: (0, import_firestore42.arrayUnion)(condition),
11781
12707
  updatedAt: /* @__PURE__ */ new Date()
11782
12708
  });
11783
12709
  return this.getById(technologyId);
@@ -11789,9 +12715,9 @@ var TechnologyService = class extends BaseService {
11789
12715
  * @returns Ažurirana tehnologija
11790
12716
  */
11791
12717
  async removeBlockingCondition(technologyId, condition) {
11792
- const docRef = (0, import_firestore40.doc)(this.getTechnologiesRef(), technologyId);
11793
- await (0, import_firestore40.updateDoc)(docRef, {
11794
- blockingConditions: (0, import_firestore40.arrayRemove)(condition),
12718
+ const docRef = (0, import_firestore42.doc)(this.getTechnologiesRef(), technologyId);
12719
+ await (0, import_firestore42.updateDoc)(docRef, {
12720
+ blockingConditions: (0, import_firestore42.arrayRemove)(condition),
11795
12721
  updatedAt: /* @__PURE__ */ new Date()
11796
12722
  });
11797
12723
  return this.getById(technologyId);
@@ -11803,9 +12729,9 @@ var TechnologyService = class extends BaseService {
11803
12729
  * @returns Ažurirana tehnologija
11804
12730
  */
11805
12731
  async addContraindication(technologyId, contraindication) {
11806
- const docRef = (0, import_firestore40.doc)(this.getTechnologiesRef(), technologyId);
11807
- await (0, import_firestore40.updateDoc)(docRef, {
11808
- contraindications: (0, import_firestore40.arrayUnion)(contraindication),
12732
+ const docRef = (0, import_firestore42.doc)(this.getTechnologiesRef(), technologyId);
12733
+ await (0, import_firestore42.updateDoc)(docRef, {
12734
+ contraindications: (0, import_firestore42.arrayUnion)(contraindication),
11809
12735
  updatedAt: /* @__PURE__ */ new Date()
11810
12736
  });
11811
12737
  return this.getById(technologyId);
@@ -11817,9 +12743,9 @@ var TechnologyService = class extends BaseService {
11817
12743
  * @returns Ažurirana tehnologija
11818
12744
  */
11819
12745
  async removeContraindication(technologyId, contraindication) {
11820
- const docRef = (0, import_firestore40.doc)(this.getTechnologiesRef(), technologyId);
11821
- await (0, import_firestore40.updateDoc)(docRef, {
11822
- contraindications: (0, import_firestore40.arrayRemove)(contraindication),
12746
+ const docRef = (0, import_firestore42.doc)(this.getTechnologiesRef(), technologyId);
12747
+ await (0, import_firestore42.updateDoc)(docRef, {
12748
+ contraindications: (0, import_firestore42.arrayRemove)(contraindication),
11823
12749
  updatedAt: /* @__PURE__ */ new Date()
11824
12750
  });
11825
12751
  return this.getById(technologyId);
@@ -11831,9 +12757,9 @@ var TechnologyService = class extends BaseService {
11831
12757
  * @returns Ažurirana tehnologija
11832
12758
  */
11833
12759
  async addBenefit(technologyId, benefit) {
11834
- const docRef = (0, import_firestore40.doc)(this.getTechnologiesRef(), technologyId);
11835
- await (0, import_firestore40.updateDoc)(docRef, {
11836
- benefits: (0, import_firestore40.arrayUnion)(benefit),
12760
+ const docRef = (0, import_firestore42.doc)(this.getTechnologiesRef(), technologyId);
12761
+ await (0, import_firestore42.updateDoc)(docRef, {
12762
+ benefits: (0, import_firestore42.arrayUnion)(benefit),
11837
12763
  updatedAt: /* @__PURE__ */ new Date()
11838
12764
  });
11839
12765
  return this.getById(technologyId);
@@ -11845,9 +12771,9 @@ var TechnologyService = class extends BaseService {
11845
12771
  * @returns Ažurirana tehnologija
11846
12772
  */
11847
12773
  async removeBenefit(technologyId, benefit) {
11848
- const docRef = (0, import_firestore40.doc)(this.getTechnologiesRef(), technologyId);
11849
- await (0, import_firestore40.updateDoc)(docRef, {
11850
- benefits: (0, import_firestore40.arrayRemove)(benefit),
12774
+ const docRef = (0, import_firestore42.doc)(this.getTechnologiesRef(), technologyId);
12775
+ await (0, import_firestore42.updateDoc)(docRef, {
12776
+ benefits: (0, import_firestore42.arrayRemove)(benefit),
11851
12777
  updatedAt: /* @__PURE__ */ new Date()
11852
12778
  });
11853
12779
  return this.getById(technologyId);
@@ -11886,8 +12812,8 @@ var TechnologyService = class extends BaseService {
11886
12812
  * @returns Ažurirana tehnologija
11887
12813
  */
11888
12814
  async updateCertificationRequirement(technologyId, certificationRequirement) {
11889
- const docRef = (0, import_firestore40.doc)(this.getTechnologiesRef(), technologyId);
11890
- await (0, import_firestore40.updateDoc)(docRef, {
12815
+ const docRef = (0, import_firestore42.doc)(this.getTechnologiesRef(), technologyId);
12816
+ await (0, import_firestore42.updateDoc)(docRef, {
11891
12817
  certificationRequirement,
11892
12818
  updatedAt: /* @__PURE__ */ new Date()
11893
12819
  });
@@ -11987,7 +12913,7 @@ var TechnologyService = class extends BaseService {
11987
12913
  };
11988
12914
 
11989
12915
  // src/backoffice/services/product.service.ts
11990
- var import_firestore41 = require("firebase/firestore");
12916
+ var import_firestore43 = require("firebase/firestore");
11991
12917
 
11992
12918
  // src/backoffice/types/product.types.ts
11993
12919
  var PRODUCTS_COLLECTION = "products";
@@ -12000,7 +12926,7 @@ var ProductService = class extends BaseService {
12000
12926
  * @returns Firestore collection reference
12001
12927
  */
12002
12928
  getProductsRef(technologyId) {
12003
- return (0, import_firestore41.collection)(
12929
+ return (0, import_firestore43.collection)(
12004
12930
  this.db,
12005
12931
  TECHNOLOGIES_COLLECTION,
12006
12932
  technologyId,
@@ -12020,7 +12946,7 @@ var ProductService = class extends BaseService {
12020
12946
  updatedAt: now,
12021
12947
  isActive: true
12022
12948
  };
12023
- const productRef = await (0, import_firestore41.addDoc)(
12949
+ const productRef = await (0, import_firestore43.addDoc)(
12024
12950
  this.getProductsRef(technologyId),
12025
12951
  newProduct
12026
12952
  );
@@ -12030,15 +12956,15 @@ var ProductService = class extends BaseService {
12030
12956
  * Gets all products for a technology
12031
12957
  */
12032
12958
  async getAllByTechnology(technologyId) {
12033
- const q = (0, import_firestore41.query)(
12959
+ const q = (0, import_firestore43.query)(
12034
12960
  this.getProductsRef(technologyId),
12035
- (0, import_firestore41.where)("isActive", "==", true)
12961
+ (0, import_firestore43.where)("isActive", "==", true)
12036
12962
  );
12037
- const snapshot = await (0, import_firestore41.getDocs)(q);
12963
+ const snapshot = await (0, import_firestore43.getDocs)(q);
12038
12964
  return snapshot.docs.map(
12039
- (doc29) => ({
12040
- id: doc29.id,
12041
- ...doc29.data()
12965
+ (doc30) => ({
12966
+ id: doc30.id,
12967
+ ...doc30.data()
12042
12968
  })
12043
12969
  );
12044
12970
  }
@@ -12046,21 +12972,21 @@ var ProductService = class extends BaseService {
12046
12972
  * Gets all products for a brand by filtering through all technologies
12047
12973
  */
12048
12974
  async getAllByBrand(brandId) {
12049
- const allTechnologiesRef = (0, import_firestore41.collection)(this.db, TECHNOLOGIES_COLLECTION);
12050
- const technologiesSnapshot = await (0, import_firestore41.getDocs)(allTechnologiesRef);
12975
+ const allTechnologiesRef = (0, import_firestore43.collection)(this.db, TECHNOLOGIES_COLLECTION);
12976
+ const technologiesSnapshot = await (0, import_firestore43.getDocs)(allTechnologiesRef);
12051
12977
  const products = [];
12052
12978
  for (const techDoc of technologiesSnapshot.docs) {
12053
- const q = (0, import_firestore41.query)(
12979
+ const q = (0, import_firestore43.query)(
12054
12980
  this.getProductsRef(techDoc.id),
12055
- (0, import_firestore41.where)("brandId", "==", brandId),
12056
- (0, import_firestore41.where)("isActive", "==", true)
12981
+ (0, import_firestore43.where)("brandId", "==", brandId),
12982
+ (0, import_firestore43.where)("isActive", "==", true)
12057
12983
  );
12058
- const snapshot = await (0, import_firestore41.getDocs)(q);
12984
+ const snapshot = await (0, import_firestore43.getDocs)(q);
12059
12985
  products.push(
12060
12986
  ...snapshot.docs.map(
12061
- (doc29) => ({
12062
- id: doc29.id,
12063
- ...doc29.data()
12987
+ (doc30) => ({
12988
+ id: doc30.id,
12989
+ ...doc30.data()
12064
12990
  })
12065
12991
  )
12066
12992
  );
@@ -12075,8 +13001,8 @@ var ProductService = class extends BaseService {
12075
13001
  ...product,
12076
13002
  updatedAt: /* @__PURE__ */ new Date()
12077
13003
  };
12078
- const docRef = (0, import_firestore41.doc)(this.getProductsRef(technologyId), productId);
12079
- await (0, import_firestore41.updateDoc)(docRef, updateData);
13004
+ const docRef = (0, import_firestore43.doc)(this.getProductsRef(technologyId), productId);
13005
+ await (0, import_firestore43.updateDoc)(docRef, updateData);
12080
13006
  return this.getById(technologyId, productId);
12081
13007
  }
12082
13008
  /**
@@ -12091,8 +13017,8 @@ var ProductService = class extends BaseService {
12091
13017
  * Gets a product by ID
12092
13018
  */
12093
13019
  async getById(technologyId, productId) {
12094
- const docRef = (0, import_firestore41.doc)(this.getProductsRef(technologyId), productId);
12095
- const docSnap = await (0, import_firestore41.getDoc)(docRef);
13020
+ const docRef = (0, import_firestore43.doc)(this.getProductsRef(technologyId), productId);
13021
+ const docSnap = await (0, import_firestore43.getDoc)(docRef);
12096
13022
  if (!docSnap.exists()) return null;
12097
13023
  return {
12098
13024
  id: docSnap.id,
@@ -12102,54 +13028,54 @@ var ProductService = class extends BaseService {
12102
13028
  };
12103
13029
 
12104
13030
  // src/validations/notification.schema.ts
12105
- var import_zod22 = require("zod");
12106
- var baseNotificationSchema = import_zod22.z.object({
12107
- id: import_zod22.z.string().optional(),
12108
- userId: import_zod22.z.string(),
12109
- notificationTime: import_zod22.z.any(),
13031
+ var import_zod23 = require("zod");
13032
+ var baseNotificationSchema = import_zod23.z.object({
13033
+ id: import_zod23.z.string().optional(),
13034
+ userId: import_zod23.z.string(),
13035
+ notificationTime: import_zod23.z.any(),
12110
13036
  // Timestamp
12111
- notificationType: import_zod22.z.nativeEnum(NotificationType),
12112
- notificationTokens: import_zod22.z.array(import_zod22.z.string()),
12113
- status: import_zod22.z.nativeEnum(NotificationStatus),
12114
- createdAt: import_zod22.z.any().optional(),
13037
+ notificationType: import_zod23.z.nativeEnum(NotificationType),
13038
+ notificationTokens: import_zod23.z.array(import_zod23.z.string()),
13039
+ status: import_zod23.z.nativeEnum(NotificationStatus),
13040
+ createdAt: import_zod23.z.any().optional(),
12115
13041
  // Timestamp
12116
- updatedAt: import_zod22.z.any().optional(),
13042
+ updatedAt: import_zod23.z.any().optional(),
12117
13043
  // Timestamp
12118
- title: import_zod22.z.string(),
12119
- body: import_zod22.z.string(),
12120
- isRead: import_zod22.z.boolean(),
12121
- userRole: import_zod22.z.nativeEnum(UserRole)
13044
+ title: import_zod23.z.string(),
13045
+ body: import_zod23.z.string(),
13046
+ isRead: import_zod23.z.boolean(),
13047
+ userRole: import_zod23.z.nativeEnum(UserRole)
12122
13048
  });
12123
13049
  var preRequirementNotificationSchema = baseNotificationSchema.extend({
12124
- notificationType: import_zod22.z.literal("preRequirement" /* PRE_REQUIREMENT */),
12125
- treatmentId: import_zod22.z.string(),
12126
- requirements: import_zod22.z.array(import_zod22.z.string()),
12127
- deadline: import_zod22.z.any()
13050
+ notificationType: import_zod23.z.literal("preRequirement" /* PRE_REQUIREMENT */),
13051
+ treatmentId: import_zod23.z.string(),
13052
+ requirements: import_zod23.z.array(import_zod23.z.string()),
13053
+ deadline: import_zod23.z.any()
12128
13054
  // Timestamp
12129
13055
  });
12130
13056
  var postRequirementNotificationSchema = baseNotificationSchema.extend({
12131
- notificationType: import_zod22.z.literal("postRequirement" /* POST_REQUIREMENT */),
12132
- treatmentId: import_zod22.z.string(),
12133
- requirements: import_zod22.z.array(import_zod22.z.string()),
12134
- deadline: import_zod22.z.any()
13057
+ notificationType: import_zod23.z.literal("postRequirement" /* POST_REQUIREMENT */),
13058
+ treatmentId: import_zod23.z.string(),
13059
+ requirements: import_zod23.z.array(import_zod23.z.string()),
13060
+ deadline: import_zod23.z.any()
12135
13061
  // Timestamp
12136
13062
  });
12137
13063
  var appointmentReminderNotificationSchema = baseNotificationSchema.extend({
12138
- notificationType: import_zod22.z.literal("appointmentReminder" /* APPOINTMENT_REMINDER */),
12139
- appointmentId: import_zod22.z.string(),
12140
- appointmentTime: import_zod22.z.any(),
13064
+ notificationType: import_zod23.z.literal("appointmentReminder" /* APPOINTMENT_REMINDER */),
13065
+ appointmentId: import_zod23.z.string(),
13066
+ appointmentTime: import_zod23.z.any(),
12141
13067
  // Timestamp
12142
- treatmentType: import_zod22.z.string(),
12143
- doctorName: import_zod22.z.string()
13068
+ treatmentType: import_zod23.z.string(),
13069
+ doctorName: import_zod23.z.string()
12144
13070
  });
12145
13071
  var appointmentNotificationSchema = baseNotificationSchema.extend({
12146
- notificationType: import_zod22.z.literal("appointmentNotification" /* APPOINTMENT_NOTIFICATION */),
12147
- appointmentId: import_zod22.z.string(),
12148
- appointmentStatus: import_zod22.z.string(),
12149
- previousStatus: import_zod22.z.string(),
12150
- reason: import_zod22.z.string().optional()
13072
+ notificationType: import_zod23.z.literal("appointmentNotification" /* APPOINTMENT_NOTIFICATION */),
13073
+ appointmentId: import_zod23.z.string(),
13074
+ appointmentStatus: import_zod23.z.string(),
13075
+ previousStatus: import_zod23.z.string(),
13076
+ reason: import_zod23.z.string().optional()
12151
13077
  });
12152
- var notificationSchema = import_zod22.z.discriminatedUnion("notificationType", [
13078
+ var notificationSchema = import_zod23.z.discriminatedUnion("notificationType", [
12153
13079
  preRequirementNotificationSchema,
12154
13080
  postRequirementNotificationSchema,
12155
13081
  appointmentReminderNotificationSchema,
@@ -12189,9 +13115,12 @@ var RequirementType = /* @__PURE__ */ ((RequirementType2) => {
12189
13115
  })(RequirementType || {});
12190
13116
  // Annotate the CommonJS export names for ESM import in node:
12191
13117
  0 && (module.exports = {
13118
+ APPOINTMENTS_COLLECTION,
12192
13119
  AUTH_ERRORS,
12193
13120
  AdminTokenStatus,
12194
13121
  AllergyType,
13122
+ AppointmentService,
13123
+ AppointmentStatus,
12195
13124
  AuthService,
12196
13125
  BlockingCondition,
12197
13126
  BrandService,
@@ -12241,6 +13170,7 @@ var RequirementType = /* @__PURE__ */ ((RequirementType2) => {
12241
13170
  PRACTITIONERS_COLLECTION,
12242
13171
  PROCEDURES_COLLECTION,
12243
13172
  PatientService,
13173
+ PaymentStatus,
12244
13174
  PracticeType,
12245
13175
  PractitionerService,
12246
13176
  PractitionerStatus,
@@ -12355,6 +13285,7 @@ var RequirementType = /* @__PURE__ */ ((RequirementType2) => {
12355
13285
  procedureSummaryInfoSchema,
12356
13286
  requesterInfoSchema,
12357
13287
  reviewSchema,
13288
+ searchAppointmentsSchema,
12358
13289
  searchPatientsSchema,
12359
13290
  syncedCalendarEventSchema,
12360
13291
  timeSlotSchema,