@blackcode_sa/metaestetics-api 1.5.9 → 1.5.11

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.
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { Auth } from 'firebase/auth';
3
- import { Firestore, QueryDocumentSnapshot } from 'firebase/firestore';
3
+ import { Firestore, Timestamp, QueryDocumentSnapshot } from 'firebase/firestore';
4
4
  import { FirebaseApp } from 'firebase/app';
5
5
  import { FirebaseStorage } from 'firebase/storage';
6
6
 
@@ -500,12 +500,14 @@ interface TechnologyRequirements {
500
500
  }
501
501
  /**
502
502
  * Technology used in medical procedures
503
- * Technologies are the third level of hierarchy, belonging to a specific subcategory
504
- * and represent a specific method or approach to treatment
503
+ * Technologies are now a top-level collection that reference their full path in the hierarchy
504
+ * through family, category, and subcategory IDs
505
505
  *
506
506
  * @property id - Unique identifier of the technology
507
507
  * @property name - Name of the technology
508
508
  * @property description - Detailed description of the technology and its application
509
+ * @property family - The procedure family this technology belongs to (aesthetics/surgery)
510
+ * @property categoryId - ID of the category this technology belongs to
509
511
  * @property subcategoryId - ID of the subcategory this technology belongs to
510
512
  * @property technicalDetails - Technical specifications and details
511
513
  * @property requirements - List of pre and post procedure requirements
@@ -525,6 +527,10 @@ interface Technology {
525
527
  name: string;
526
528
  /** Detaljan opis tehnologije */
527
529
  description: string;
530
+ /** Familija procedura kojoj tehnologija pripada */
531
+ family: ProcedureFamily;
532
+ /** ID kategorije kojoj tehnologija pripada */
533
+ categoryId: string;
528
534
  /** ID potkategorije kojoj tehnologija pripada */
529
535
  subcategoryId: string;
530
536
  /** Tehnički detalji i specifikacije */
@@ -4528,22 +4534,115 @@ declare class SubcategoryService extends BaseService {
4528
4534
  getById(categoryId: string, subcategoryId: string): Promise<Subcategory | null>;
4529
4535
  }
4530
4536
 
4537
+ /**
4538
+ * Osnovne informacije o zdravstvenom radniku
4539
+ */
4540
+ interface PractitionerBasicInfo {
4541
+ firstName: string;
4542
+ lastName: string;
4543
+ title: string;
4544
+ email: string;
4545
+ phoneNumber: string;
4546
+ dateOfBirth: Timestamp;
4547
+ gender: "male" | "female" | "other";
4548
+ profileImageUrl?: string;
4549
+ bio?: string;
4550
+ languages: string[];
4551
+ }
4552
+ /**
4553
+ * Sertifikacija zdravstvenog radnika
4554
+ */
4555
+ interface PractitionerCertification {
4556
+ level: CertificationLevel;
4557
+ specialties: CertificationSpecialty[];
4558
+ licenseNumber: string;
4559
+ issuingAuthority: string;
4560
+ issueDate: Timestamp;
4561
+ expiryDate?: Timestamp;
4562
+ verificationStatus: "pending" | "verified" | "rejected";
4563
+ }
4564
+ /**
4565
+ * Interfejs za radno vreme zdravstvenog radnika u klinici
4566
+ */
4567
+ interface PractitionerClinicWorkingHours {
4568
+ clinicId: string;
4569
+ workingHours: {
4570
+ monday: {
4571
+ start: string;
4572
+ end: string;
4573
+ } | null;
4574
+ tuesday: {
4575
+ start: string;
4576
+ end: string;
4577
+ } | null;
4578
+ wednesday: {
4579
+ start: string;
4580
+ end: string;
4581
+ } | null;
4582
+ thursday: {
4583
+ start: string;
4584
+ end: string;
4585
+ } | null;
4586
+ friday: {
4587
+ start: string;
4588
+ end: string;
4589
+ } | null;
4590
+ saturday: {
4591
+ start: string;
4592
+ end: string;
4593
+ } | null;
4594
+ sunday: {
4595
+ start: string;
4596
+ end: string;
4597
+ } | null;
4598
+ };
4599
+ isActive: boolean;
4600
+ createdAt: Timestamp;
4601
+ updatedAt: Timestamp;
4602
+ }
4603
+ /**
4604
+ * Status of practitioner profile
4605
+ */
4606
+ declare enum PractitionerStatus {
4607
+ DRAFT = "draft",
4608
+ ACTIVE = "active"
4609
+ }
4610
+ /**
4611
+ * Interfejs za zdravstvenog radnika
4612
+ */
4613
+ interface Practitioner {
4614
+ id: string;
4615
+ userRef: string;
4616
+ basicInfo: PractitionerBasicInfo;
4617
+ certification: PractitionerCertification;
4618
+ clinics: string[];
4619
+ clinicWorkingHours: PractitionerClinicWorkingHours[];
4620
+ isActive: boolean;
4621
+ isVerified: boolean;
4622
+ status: PractitionerStatus;
4623
+ createdAt: Timestamp;
4624
+ updatedAt: Timestamp;
4625
+ }
4626
+
4531
4627
  /**
4532
4628
  * Servis za upravljanje tehnologijama i njihovim zahtevima.
4533
- * Tehnologije su treći nivo organizacije i pripadaju određenoj podkategoriji.
4534
- * Svaka tehnologija može imati svoje specifične zahteve pre i posle procedure.
4629
+ * Tehnologije su sada top-level kolekcija koja referencira svoju putanju u hijerarhiji
4630
+ * kroz family, categoryId i subcategoryId.
4535
4631
  *
4536
4632
  * @example
4537
4633
  * const technologyService = new TechnologyService();
4538
4634
  *
4539
4635
  * // Kreiranje nove tehnologije
4540
- * const technology = await technologyService.create(categoryId, subcategoryId, {
4636
+ * const technology = await technologyService.create({
4541
4637
  * name: "Botulinum Toxin",
4542
- * description: "Neurotoxin injections for wrinkle reduction"
4638
+ * description: "Neurotoxin injections for wrinkle reduction",
4639
+ * family: ProcedureFamily.AESTHETICS,
4640
+ * categoryId: "category123",
4641
+ * subcategoryId: "subcategory456"
4543
4642
  * });
4544
4643
  *
4545
4644
  * // Dodavanje zahteva
4546
- * await technologyService.addRequirement(categoryId, subcategoryId, technology.id, {
4645
+ * await technologyService.addRequirement(technology.id, {
4547
4646
  * type: "pre",
4548
4647
  * name: "Stay Hydrated",
4549
4648
  * description: "Drink plenty of water"
@@ -4551,19 +4650,15 @@ declare class SubcategoryService extends BaseService {
4551
4650
  */
4552
4651
  declare class TechnologyService extends BaseService {
4553
4652
  /**
4554
- * Vraća referencu na Firestore kolekciju tehnologija za određenu podkategoriju
4555
- * @param categoryId - ID kategorije
4556
- * @param subcategoryId - ID podkategorije
4653
+ * Vraća referencu na Firestore kolekciju tehnologija
4557
4654
  */
4558
4655
  private getTechnologiesRef;
4559
4656
  /**
4560
- * Kreira novu tehnologiju u okviru podkategorije
4561
- * @param categoryId - ID kategorije
4562
- * @param subcategoryId - ID podkategorije
4657
+ * Kreira novu tehnologiju
4563
4658
  * @param technology - Podaci za novu tehnologiju
4564
4659
  * @returns Kreirana tehnologija sa generisanim ID-em
4565
4660
  */
4566
- create(categoryId: string, subcategoryId: string, technology: Omit<Technology, "id" | "createdAt" | "updatedAt">): Promise<{
4661
+ create(technology: Omit<Technology, "id" | "createdAt" | "updatedAt">): Promise<{
4567
4662
  description: string;
4568
4663
  isActive: boolean;
4569
4664
  createdAt: Date;
@@ -4580,171 +4675,202 @@ declare class TechnologyService extends BaseService {
4580
4675
  documentationTemplates?: DocumentTemplate[] | undefined;
4581
4676
  benefits: TreatmentBenefit[];
4582
4677
  certificationRequirement: CertificationRequirement;
4678
+ family: ProcedureFamily;
4679
+ categoryId: string;
4583
4680
  id: string;
4584
4681
  }>;
4585
4682
  /**
4586
- * Vraća sve aktivne tehnologije za određenu podkategoriju
4683
+ * Vraća sve aktivne tehnologije
4684
+ * @returns Lista aktivnih tehnologija
4685
+ */
4686
+ getAll(): Promise<Technology[]>;
4687
+ /**
4688
+ * Vraća sve aktivne tehnologije za određenu familiju
4689
+ * @param family - Familija procedura
4690
+ * @returns Lista aktivnih tehnologija
4691
+ */
4692
+ getAllByFamily(family: ProcedureFamily): Promise<Technology[]>;
4693
+ /**
4694
+ * Vraća sve aktivne tehnologije za određenu kategoriju
4587
4695
  * @param categoryId - ID kategorije
4696
+ * @returns Lista aktivnih tehnologija
4697
+ */
4698
+ getAllByCategoryId(categoryId: string): Promise<Technology[]>;
4699
+ /**
4700
+ * Vraća sve aktivne tehnologije za određenu podkategoriju
4588
4701
  * @param subcategoryId - ID podkategorije
4589
4702
  * @returns Lista aktivnih tehnologija
4590
4703
  */
4591
- getAllBySubcategoryId(categoryId: string, subcategoryId: string): Promise<Technology[]>;
4704
+ getAllBySubcategoryId(subcategoryId: string): Promise<Technology[]>;
4592
4705
  /**
4593
4706
  * Ažurira postojeću tehnologiju
4594
- * @param categoryId - ID kategorije
4595
- * @param subcategoryId - ID podkategorije
4596
4707
  * @param technologyId - ID tehnologije
4597
4708
  * @param technology - Novi podaci za tehnologiju
4598
4709
  * @returns Ažurirana tehnologija
4599
4710
  */
4600
- update(categoryId: string, subcategoryId: string, technologyId: string, technology: Partial<Omit<Technology, "id" | "createdAt" | "subcategoryId">>): Promise<Technology | null>;
4711
+ update(technologyId: string, technology: Partial<Omit<Technology, "id" | "createdAt" | "family" | "categoryId" | "subcategoryId">>): Promise<Technology | null>;
4601
4712
  /**
4602
4713
  * Soft delete tehnologije (postavlja isActive na false)
4603
- * @param categoryId - ID kategorije
4604
- * @param subcategoryId - ID podkategorije
4605
4714
  * @param technologyId - ID tehnologije koja se briše
4606
4715
  */
4607
- delete(categoryId: string, subcategoryId: string, technologyId: string): Promise<void>;
4716
+ delete(technologyId: string): Promise<void>;
4608
4717
  /**
4609
4718
  * Vraća tehnologiju po ID-u
4610
- * @param categoryId - ID kategorije
4611
- * @param subcategoryId - ID podkategorije
4612
4719
  * @param technologyId - ID tražene tehnologije
4613
4720
  * @returns Tehnologija ili null ako ne postoji
4614
4721
  */
4615
- getById(categoryId: string, subcategoryId: string, technologyId: string): Promise<Technology | null>;
4722
+ getById(technologyId: string): Promise<Technology | null>;
4616
4723
  /**
4617
4724
  * Dodaje novi zahtev tehnologiji
4618
- * @param categoryId - ID kategorije
4619
- * @param subcategoryId - ID podkategorije
4620
4725
  * @param technologyId - ID tehnologije
4621
4726
  * @param requirement - Zahtev koji se dodaje
4622
4727
  * @returns Ažurirana tehnologija sa novim zahtevom
4623
4728
  */
4624
- addRequirement(categoryId: string, subcategoryId: string, technologyId: string, requirement: Requirement): Promise<Technology | null>;
4729
+ addRequirement(technologyId: string, requirement: Requirement): Promise<Technology | null>;
4625
4730
  /**
4626
4731
  * Uklanja zahtev iz tehnologije
4627
- * @param categoryId - ID kategorije
4628
- * @param subcategoryId - ID podkategorije
4629
4732
  * @param technologyId - ID tehnologije
4630
4733
  * @param requirement - Zahtev koji se uklanja
4631
4734
  * @returns Ažurirana tehnologija bez uklonjenog zahteva
4632
4735
  */
4633
- removeRequirement(categoryId: string, subcategoryId: string, technologyId: string, requirement: Requirement): Promise<Technology | null>;
4736
+ removeRequirement(technologyId: string, requirement: Requirement): Promise<Technology | null>;
4634
4737
  /**
4635
4738
  * Vraća sve zahteve za tehnologiju
4636
- * @param categoryId - ID kategorije
4637
- * @param subcategoryId - ID podkategorije
4638
4739
  * @param technologyId - ID tehnologije
4639
4740
  * @param type - Opcioni filter za tip zahteva (pre/post)
4640
4741
  * @returns Lista zahteva
4641
4742
  */
4642
- getRequirements(categoryId: string, subcategoryId: string, technologyId: string, type?: RequirementType): Promise<Requirement[]>;
4743
+ getRequirements(technologyId: string, type?: RequirementType): Promise<Requirement[]>;
4643
4744
  /**
4644
4745
  * Ažurira postojeći zahtev
4645
- * @param categoryId - ID kategorije
4646
- * @param subcategoryId - ID podkategorije
4647
4746
  * @param technologyId - ID tehnologije
4648
4747
  * @param oldRequirement - Stari zahtev koji se menja
4649
4748
  * @param newRequirement - Novi zahtev koji zamenjuje stari
4650
4749
  * @returns Ažurirana tehnologija
4651
4750
  */
4652
- updateRequirement(categoryId: string, subcategoryId: string, technologyId: string, oldRequirement: Requirement, newRequirement: Requirement): Promise<Technology | null>;
4751
+ updateRequirement(technologyId: string, oldRequirement: Requirement, newRequirement: Requirement): Promise<Technology | null>;
4653
4752
  /**
4654
4753
  * Dodaje blokirajući uslov tehnologiji
4655
- * @param categoryId - ID kategorije
4656
- * @param subcategoryId - ID podkategorije
4657
4754
  * @param technologyId - ID tehnologije
4658
4755
  * @param condition - Blokirajući uslov koji se dodaje
4659
4756
  * @returns Ažurirana tehnologija
4660
4757
  */
4661
- addBlockingCondition(categoryId: string, subcategoryId: string, technologyId: string, condition: BlockingCondition): Promise<Technology | null>;
4758
+ addBlockingCondition(technologyId: string, condition: BlockingCondition): Promise<Technology | null>;
4662
4759
  /**
4663
4760
  * Uklanja blokirajući uslov iz tehnologije
4664
- * @param categoryId - ID kategorije
4665
- * @param subcategoryId - ID podkategorije
4666
4761
  * @param technologyId - ID tehnologije
4667
4762
  * @param condition - Blokirajući uslov koji se uklanja
4668
4763
  * @returns Ažurirana tehnologija
4669
4764
  */
4670
- removeBlockingCondition(categoryId: string, subcategoryId: string, technologyId: string, condition: BlockingCondition): Promise<Technology | null>;
4765
+ removeBlockingCondition(technologyId: string, condition: BlockingCondition): Promise<Technology | null>;
4671
4766
  /**
4672
4767
  * Dodaje kontraindikaciju tehnologiji
4673
- * @param categoryId - ID kategorije
4674
- * @param subcategoryId - ID podkategorije
4675
4768
  * @param technologyId - ID tehnologije
4676
4769
  * @param contraindication - Kontraindikacija koja se dodaje
4677
4770
  * @returns Ažurirana tehnologija
4678
4771
  */
4679
- addContraindication(categoryId: string, subcategoryId: string, technologyId: string, contraindication: Contraindication): Promise<Technology | null>;
4772
+ addContraindication(technologyId: string, contraindication: Contraindication): Promise<Technology | null>;
4680
4773
  /**
4681
4774
  * Uklanja kontraindikaciju iz tehnologije
4682
- * @param categoryId - ID kategorije
4683
- * @param subcategoryId - ID podkategorije
4684
4775
  * @param technologyId - ID tehnologije
4685
4776
  * @param contraindication - Kontraindikacija koja se uklanja
4686
4777
  * @returns Ažurirana tehnologija
4687
4778
  */
4688
- removeContraindication(categoryId: string, subcategoryId: string, technologyId: string, contraindication: Contraindication): Promise<Technology | null>;
4779
+ removeContraindication(technologyId: string, contraindication: Contraindication): Promise<Technology | null>;
4689
4780
  /**
4690
4781
  * Dodaje benefit tehnologiji
4691
- * @param categoryId - ID kategorije
4692
- * @param subcategoryId - ID podkategorije
4693
4782
  * @param technologyId - ID tehnologije
4694
4783
  * @param benefit - Benefit koji se dodaje
4695
4784
  * @returns Ažurirana tehnologija
4696
4785
  */
4697
- addBenefit(categoryId: string, subcategoryId: string, technologyId: string, benefit: TreatmentBenefit): Promise<Technology | null>;
4786
+ addBenefit(technologyId: string, benefit: TreatmentBenefit): Promise<Technology | null>;
4698
4787
  /**
4699
4788
  * Uklanja benefit iz tehnologije
4700
- * @param categoryId - ID kategorije
4701
- * @param subcategoryId - ID podkategorije
4702
4789
  * @param technologyId - ID tehnologije
4703
4790
  * @param benefit - Benefit koji se uklanja
4704
4791
  * @returns Ažurirana tehnologija
4705
4792
  */
4706
- removeBenefit(categoryId: string, subcategoryId: string, technologyId: string, benefit: TreatmentBenefit): Promise<Technology | null>;
4793
+ removeBenefit(technologyId: string, benefit: TreatmentBenefit): Promise<Technology | null>;
4707
4794
  /**
4708
4795
  * Vraća sve blokirajuće uslove za tehnologiju
4709
- * @param categoryId - ID kategorije
4710
- * @param subcategoryId - ID podkategorije
4711
4796
  * @param technologyId - ID tehnologije
4712
4797
  * @returns Lista blokirajućih uslova
4713
4798
  */
4714
- getBlockingConditions(categoryId: string, subcategoryId: string, technologyId: string): Promise<BlockingCondition[]>;
4799
+ getBlockingConditions(technologyId: string): Promise<BlockingCondition[]>;
4715
4800
  /**
4716
4801
  * Vraća sve kontraindikacije za tehnologiju
4717
- * @param categoryId - ID kategorije
4718
- * @param subcategoryId - ID podkategorije
4719
4802
  * @param technologyId - ID tehnologije
4720
4803
  * @returns Lista kontraindikacija
4721
4804
  */
4722
- getContraindications(categoryId: string, subcategoryId: string, technologyId: string): Promise<Contraindication[]>;
4805
+ getContraindications(technologyId: string): Promise<Contraindication[]>;
4723
4806
  /**
4724
4807
  * Vraća sve benefite za tehnologiju
4725
- * @param categoryId - ID kategorije
4726
- * @param subcategoryId - ID podkategorije
4727
4808
  * @param technologyId - ID tehnologije
4728
4809
  * @returns Lista benefita
4729
4810
  */
4730
- getBenefits(categoryId: string, subcategoryId: string, technologyId: string): Promise<TreatmentBenefit[]>;
4811
+ getBenefits(technologyId: string): Promise<TreatmentBenefit[]>;
4731
4812
  /**
4732
4813
  * Ažurira zahteve sertifikacije za tehnologiju
4733
- * @param categoryId - ID kategorije
4734
- * @param subcategoryId - ID podkategorije
4735
4814
  * @param technologyId - ID tehnologije
4736
4815
  * @param certificationRequirement - Novi zahtevi sertifikacije
4737
4816
  * @returns Ažurirana tehnologija
4738
4817
  */
4739
- updateCertificationRequirement(categoryId: string, subcategoryId: string, technologyId: string, certificationRequirement: CertificationRequirement): Promise<Technology | null>;
4818
+ updateCertificationRequirement(technologyId: string, certificationRequirement: CertificationRequirement): Promise<Technology | null>;
4740
4819
  /**
4741
4820
  * Vraća zahteve sertifikacije za tehnologiju
4742
- * @param categoryId - ID kategorije
4743
- * @param subcategoryId - ID podkategorije
4744
4821
  * @param technologyId - ID tehnologije
4745
4822
  * @returns Zahtevi sertifikacije ili null ako tehnologija ne postoji
4746
4823
  */
4747
- getCertificationRequirement(categoryId: string, subcategoryId: string, technologyId: string): Promise<CertificationRequirement | null>;
4824
+ getCertificationRequirement(technologyId: string): Promise<CertificationRequirement | null>;
4825
+ /**
4826
+ * Proverava da li doktor ima odgovarajuću sertifikaciju za izvođenje tehnologije
4827
+ *
4828
+ * @param requiredCertification - Zahtevana sertifikacija za tehnologiju
4829
+ * @param practitionerCertification - Sertifikacija zdravstvenog radnika
4830
+ * @returns true ako zdravstveni radnik ima odgovarajuću sertifikaciju, false ako nema
4831
+ *
4832
+ * @example
4833
+ * const isValid = technologyService.validateCertification(
4834
+ * {
4835
+ * minimumLevel: CertificationLevel.DOCTOR,
4836
+ * requiredSpecialties: [CertificationSpecialty.INJECTABLES]
4837
+ * },
4838
+ * {
4839
+ * level: CertificationLevel.SPECIALIST,
4840
+ * specialties: [CertificationSpecialty.INJECTABLES, CertificationSpecialty.LASER]
4841
+ * }
4842
+ * );
4843
+ */
4844
+ validateCertification(requiredCertification: CertificationRequirement, practitionerCertification: PractitionerCertification): boolean;
4845
+ /**
4846
+ * Vraća sve tehnologije koje je zdravstveni radnik sertifikovan da izvodi
4847
+ * zajedno sa listama dozvoljenih familija, kategorija i podkategorija
4848
+ *
4849
+ * @param practitioner - Profil zdravstvenog radnika
4850
+ * @returns Objekat koji sadrži:
4851
+ * - technologies: Lista tehnologija koje zdravstveni radnik može da izvodi
4852
+ * - families: Lista familija procedura koje zdravstveni radnik može da izvodi
4853
+ * - categories: Lista ID-eva kategorija koje zdravstveni radnik može da izvodi
4854
+ * - subcategories: Lista ID-eva podkategorija koje zdravstveni radnik može da izvodi
4855
+ *
4856
+ * @example
4857
+ * const practitioner = {
4858
+ * certification: {
4859
+ * level: CertificationLevel.DOCTOR,
4860
+ * specialties: [CertificationSpecialty.INJECTABLES]
4861
+ * }
4862
+ * };
4863
+ * const allowedTechnologies = await technologyService.getAllowedTechnologies(practitioner);
4864
+ * console.log(allowedTechnologies.families); // [ProcedureFamily.AESTHETICS]
4865
+ * console.log(allowedTechnologies.categories); // ["category1", "category2"]
4866
+ * console.log(allowedTechnologies.subcategories); // ["subcategory1", "subcategory2"]
4867
+ */
4868
+ getAllowedTechnologies(practitioner: Practitioner): Promise<{
4869
+ technologies: Technology[];
4870
+ families: ProcedureFamily[];
4871
+ categories: string[];
4872
+ subcategories: string[];
4873
+ }>;
4748
4874
  }
4749
4875
 
4750
4876
  /**