healthdatalayer 1.6.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. healthdatalayer/__init__.py +0 -0
  2. healthdatalayer/config/__init__.py +0 -0
  3. healthdatalayer/config/config.py +24 -0
  4. healthdatalayer/config/db.py +12 -0
  5. healthdatalayer/config/vault.py +20 -0
  6. healthdatalayer/dtos/__init__.py +2 -0
  7. healthdatalayer/dtos/collaborator/__init__.py +0 -0
  8. healthdatalayer/dtos/collaborator/schedule_collaborator.py +13 -0
  9. healthdatalayer/dtos/medical_visit/__init__.py +0 -0
  10. healthdatalayer/dtos/medical_visit/medical_certificate.py +62 -0
  11. healthdatalayer/models/__init__.py +75 -0
  12. healthdatalayer/models/bridge_area_floor_branch/__init__.py +0 -0
  13. healthdatalayer/models/bridge_area_floor_branch/area.py +8 -0
  14. healthdatalayer/models/bridge_area_floor_branch/branch.py +16 -0
  15. healthdatalayer/models/bridge_area_floor_branch/bridge_area_floor_branch.py +27 -0
  16. healthdatalayer/models/bridge_area_floor_branch/floor.py +8 -0
  17. healthdatalayer/models/bridge_area_floor_branch/room.py +8 -0
  18. healthdatalayer/models/bridge_area_floor_branch/system.py +8 -0
  19. healthdatalayer/models/client/__init__.py +0 -0
  20. healthdatalayer/models/client/address.py +13 -0
  21. healthdatalayer/models/client/city.py +11 -0
  22. healthdatalayer/models/client/client.py +25 -0
  23. healthdatalayer/models/client/client_type.py +9 -0
  24. healthdatalayer/models/client/education.py +9 -0
  25. healthdatalayer/models/client/emergency_contact.py +17 -0
  26. healthdatalayer/models/client/gender.py +9 -0
  27. healthdatalayer/models/client/marriage_status.py +9 -0
  28. healthdatalayer/models/client/nationality.py +10 -0
  29. healthdatalayer/models/client/pathological_history.py +29 -0
  30. healthdatalayer/models/client/pet.py +16 -0
  31. healthdatalayer/models/client/profession.py +9 -0
  32. healthdatalayer/models/client/px.py +35 -0
  33. healthdatalayer/models/client/state.py +9 -0
  34. healthdatalayer/models/collaborator/__init__.py +0 -0
  35. healthdatalayer/models/collaborator/collaborator.py +33 -0
  36. healthdatalayer/models/collaborator/collaborator_speciality.py +8 -0
  37. healthdatalayer/models/collaborator/collaborator_type.py +9 -0
  38. healthdatalayer/models/collaborator/speciality.py +23 -0
  39. healthdatalayer/models/lab/__init__.py +0 -0
  40. healthdatalayer/models/lab/client_lab.py +13 -0
  41. healthdatalayer/models/lab/measure_lab.py +11 -0
  42. healthdatalayer/models/lab/medical_lab.py +17 -0
  43. healthdatalayer/models/medical_visit/__init__.py +0 -0
  44. healthdatalayer/models/medical_visit/medical_diagnosis.py +12 -0
  45. healthdatalayer/models/medical_visit/medical_diagnosis_visit.py +25 -0
  46. healthdatalayer/models/medical_visit/medical_drug.py +27 -0
  47. healthdatalayer/models/medical_visit/medical_drug_recipe.py +19 -0
  48. healthdatalayer/models/medical_visit/medical_recipe_visit.py +28 -0
  49. healthdatalayer/models/medical_visit/medical_visit.py +53 -0
  50. healthdatalayer/models/medical_visit/organ_system_review.py +28 -0
  51. healthdatalayer/models/medical_visit/physical_exam.py +45 -0
  52. healthdatalayer/models/medical_visit/status_visit_enum.py +8 -0
  53. healthdatalayer/models/medical_visit/visit_triage.py +28 -0
  54. healthdatalayer/models/user/__init__.py +0 -0
  55. healthdatalayer/models/user/permission.py +27 -0
  56. healthdatalayer/models/user/permission_user.py +8 -0
  57. healthdatalayer/models/user/role.py +27 -0
  58. healthdatalayer/models/user/role_permission.py +8 -0
  59. healthdatalayer/models/user/role_user.py +8 -0
  60. healthdatalayer/models/user/user.py +30 -0
  61. healthdatalayer/repositories/__init__.py +40 -0
  62. healthdatalayer/repositories/client_repositories/__init__.py +0 -0
  63. healthdatalayer/repositories/client_repositories/address_repository.py +94 -0
  64. healthdatalayer/repositories/client_repositories/client_type_repository.py +69 -0
  65. healthdatalayer/repositories/client_repositories/education_repository.py +70 -0
  66. healthdatalayer/repositories/client_repositories/emergency_contact_repository.py +78 -0
  67. healthdatalayer/repositories/client_repositories/gender_repository.py +70 -0
  68. healthdatalayer/repositories/client_repositories/marriage_status_repository.py +70 -0
  69. healthdatalayer/repositories/client_repositories/nationality_repository.py +69 -0
  70. healthdatalayer/repositories/client_repositories/pathological_history_repository.py +73 -0
  71. healthdatalayer/repositories/client_repositories/pet_repository.py +126 -0
  72. healthdatalayer/repositories/client_repositories/profession_repository.py +70 -0
  73. healthdatalayer/repositories/client_repositories/px_repository.py +239 -0
  74. healthdatalayer/repositories/collaborator_repositories/__init__.py +0 -0
  75. healthdatalayer/repositories/collaborator_repositories/collaborator_repository.py +197 -0
  76. healthdatalayer/repositories/collaborator_repositories/collaborator_type_repository.py +69 -0
  77. healthdatalayer/repositories/collaborator_repositories/speciality_repository.py +75 -0
  78. healthdatalayer/repositories/infraestructure_repositories/__init__.py +0 -0
  79. healthdatalayer/repositories/infraestructure_repositories/area_repository.py +69 -0
  80. healthdatalayer/repositories/infraestructure_repositories/branch_repository.py +69 -0
  81. healthdatalayer/repositories/infraestructure_repositories/bridge_repository.py +82 -0
  82. healthdatalayer/repositories/infraestructure_repositories/floor_repository.py +69 -0
  83. healthdatalayer/repositories/infraestructure_repositories/room_repository.py +69 -0
  84. healthdatalayer/repositories/infraestructure_repositories/system_repository.py +69 -0
  85. healthdatalayer/repositories/lab_repositories/__init__.py +0 -0
  86. healthdatalayer/repositories/lab_repositories/measure_lab_repository.py +80 -0
  87. healthdatalayer/repositories/lab_repositories/medical_lab_repository.py +254 -0
  88. healthdatalayer/repositories/medical_visit_repositories/__init__.py +0 -0
  89. healthdatalayer/repositories/medical_visit_repositories/medical_diagnosis_repository.py +98 -0
  90. healthdatalayer/repositories/medical_visit_repositories/medical_diagnosis_visit_repository.py +109 -0
  91. healthdatalayer/repositories/medical_visit_repositories/medical_drug_recipe_repository.py +71 -0
  92. healthdatalayer/repositories/medical_visit_repositories/medical_drug_repository.py +78 -0
  93. healthdatalayer/repositories/medical_visit_repositories/medical_recipe_visit_repository.py +93 -0
  94. healthdatalayer/repositories/medical_visit_repositories/medical_visit_repository.py +509 -0
  95. healthdatalayer/repositories/medical_visit_repositories/organ_system_review_repository.py +89 -0
  96. healthdatalayer/repositories/medical_visit_repositories/physical_exam_repository.py +89 -0
  97. healthdatalayer/repositories/medical_visit_repositories/visit_triage_repository.py +95 -0
  98. healthdatalayer/repositories/user_repositories/__init__.py +0 -0
  99. healthdatalayer/repositories/user_repositories/permission_repository.py +238 -0
  100. healthdatalayer/repositories/user_repositories/role_repository.py +174 -0
  101. healthdatalayer/repositories/user_repositories/user_repository.py +251 -0
  102. healthdatalayer-1.6.6.dist-info/METADATA +30 -0
  103. healthdatalayer-1.6.6.dist-info/RECORD +105 -0
  104. healthdatalayer-1.6.6.dist-info/WHEEL +5 -0
  105. healthdatalayer-1.6.6.dist-info/top_level.txt +1 -0
@@ -0,0 +1,17 @@
1
+ import uuid
2
+ from typing import Optional,List,TYPE_CHECKING
3
+ from sqlmodel import SQLModel, Field, Relationship
4
+ from .measure_lab import MeasureLab
5
+ if TYPE_CHECKING:
6
+ from .client_lab import ClientLab
7
+
8
+ class MedicalLab(SQLModel, table=True):
9
+ __tablename__ = "medical_lab"
10
+
11
+ medical_lab_id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
12
+ parameter: str
13
+ measure_lab_id: Optional[uuid.UUID] = Field(default=None, foreign_key="measure_lab.measure_lab_id")
14
+ is_active: bool = Field(default=True)
15
+
16
+ MedicalLab.measure_lab = Relationship(back_populates="medical_labs")
17
+ MedicalLab.pxs = Relationship(back_populates="medical_labs", link_model="ClientLab")
File without changes
@@ -0,0 +1,12 @@
1
+ import uuid
2
+ from sqlmodel import SQLModel, Field
3
+
4
+ class MedicalDiagnosis(SQLModel, table=True):
5
+ __tablename__ = "medical_diagnosis"
6
+
7
+ medical_diagnosis_id:uuid.UUID=Field(default_factory=uuid.uuid4,primary_key=True)
8
+
9
+ name:str
10
+ cie_10_code: str = Field(index=True, max_length=10)
11
+
12
+ is_active: bool = Field(default=True)
@@ -0,0 +1,25 @@
1
+ import uuid
2
+ from datetime import datetime
3
+ from typing import Optional, TYPE_CHECKING
4
+ from sqlmodel import SQLModel, Field, Relationship
5
+ from healthdatalayer.models import MedicalDiagnosis
6
+
7
+ if TYPE_CHECKING:
8
+ from healthdatalayer.models import MedicalVisit
9
+
10
+ class MedicalDiagnosisVisit(SQLModel, table=True):
11
+ __tablename__ = "medical_diagnosis_visit"
12
+
13
+ medical_diagnosis_visit_id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
14
+ diagnosis_date: Optional[datetime] = Field(default=None)
15
+ comments: str
16
+
17
+ medical_diagnosis_id: Optional[uuid.UUID] = Field(default=None, foreign_key="medical_diagnosis.medical_diagnosis_id")
18
+ medical_diagnosis: Optional[MedicalDiagnosis] = Relationship()
19
+
20
+ medical_visit_id: Optional[uuid.UUID] = Field(default=None, foreign_key="medical_visit.medical_visit_id")
21
+ medical_visit: Optional["MedicalVisit"] = Relationship(back_populates="medical_diagnosis_visits")
22
+
23
+ type_diagnosis: str
24
+
25
+ is_active: bool = Field(default=True)
@@ -0,0 +1,27 @@
1
+ import uuid
2
+ from datetime import datetime
3
+ from typing import Optional, List, TYPE_CHECKING
4
+ from sqlmodel import SQLModel, Field, Relationship
5
+
6
+ from healthdatalayer.models.medical_visit.medical_drug_recipe import MedicalDrugRecipe
7
+
8
+ if TYPE_CHECKING:
9
+ from healthdatalayer.models.medical_visit.medical_recipe_visit import MedicalRecipeVisit
10
+
11
+ class MedicalDrug(SQLModel, table=True):
12
+ __tablename__ = "medical_drug"
13
+
14
+ medical_drug_id:uuid.UUID=Field(default_factory=uuid.uuid4,primary_key=True)
15
+
16
+ drug_name:str
17
+ stock:int
18
+ drug_code:str
19
+ supply_date: Optional[datetime] = Field(default=None)
20
+ public_price:float
21
+
22
+ is_active: bool = Field(default=True)
23
+
24
+ medical_recipe_visits: List["MedicalRecipeVisit"] = Relationship(
25
+ back_populates="medical_drugs",
26
+ link_model=MedicalDrugRecipe
27
+ )
@@ -0,0 +1,19 @@
1
+ import uuid
2
+ from datetime import datetime
3
+ from typing import Optional
4
+ from sqlmodel import SQLModel, Field
5
+
6
+ class MedicalDrugRecipe(SQLModel, table=True):
7
+ __tablename__ = "medical_drug_recipe"
8
+
9
+ medical_drug_recipe_id:uuid.UUID=Field(default_factory=uuid.uuid4,primary_key=True)
10
+
11
+ medical_drug_id: uuid.UUID = Field(foreign_key="medical_drug.medical_drug_id", primary_key=True)
12
+ medical_recipe_visit_id: uuid.UUID = Field(foreign_key="medical_recipe_visit.medical_recipe_visit_id", primary_key=True)
13
+
14
+ quantity:int
15
+ suplied:bool
16
+ comment:Optional[str] = Field(default=None)
17
+ suplied_date: Optional[datetime] = Field(default=None)
18
+
19
+ is_active: bool = Field(default=True)
@@ -0,0 +1,28 @@
1
+ import uuid
2
+ from datetime import datetime
3
+ from typing import Optional, List, TYPE_CHECKING
4
+ from sqlmodel import SQLModel, Field, Relationship
5
+
6
+
7
+ from healthdatalayer.models import MedicalDrugRecipe
8
+
9
+ if TYPE_CHECKING:
10
+ from healthdatalayer.models.medical_visit.medical_drug import MedicalDrug
11
+ from healthdatalayer.models import MedicalVisit
12
+
13
+ class MedicalRecipeVisit(SQLModel, table=True):
14
+ __tablename__ = "medical_recipe_visit"
15
+
16
+ medical_recipe_visit_id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
17
+ completed_supplied: bool
18
+ completed_supplied_date: Optional[datetime] = Field(default=None)
19
+
20
+ medical_visit_id: Optional[uuid.UUID] = Field(default=None, foreign_key="medical_visit.medical_visit_id")
21
+ medical_visit: Optional["MedicalVisit"] = Relationship(back_populates="medical_recipe_visits")
22
+
23
+ is_active: bool = Field(default=True)
24
+
25
+ medical_drugs: List["MedicalDrug"] = Relationship(
26
+ back_populates="medical_recipe_visits",
27
+ link_model=MedicalDrugRecipe
28
+ )
@@ -0,0 +1,53 @@
1
+ import uuid
2
+ from datetime import datetime
3
+ from typing import Optional, List, TYPE_CHECKING
4
+ from sqlmodel import SQLModel, Field, Relationship
5
+ from sqlalchemy import Column, Enum as SqlEnum
6
+
7
+ from healthdatalayer.models import Collaborator
8
+ from healthdatalayer.models.medical_visit.status_visit_enum import StatusVisitEnum
9
+ from healthdatalayer.models import Speciality
10
+ from healthdatalayer.models import BridgeAreaFloorBranch
11
+ if TYPE_CHECKING:
12
+ from healthdatalayer.models import Px
13
+ from healthdatalayer.models import MedicalDiagnosisVisit
14
+ from healthdatalayer.models import MedicalRecipeVisit
15
+ from healthdatalayer.models import OrganSystemReview
16
+ from healthdatalayer.models import PhysicalExam
17
+ class MedicalVisit(SQLModel, table=True):
18
+ __tablename__ = "medical_visit"
19
+
20
+ medical_visit_id:uuid.UUID=Field(default_factory=uuid.uuid4,primary_key=True)
21
+ visit_date: Optional[datetime] = Field(default=None)
22
+
23
+ collaborator_id:Optional[uuid.UUID]=Field(default=None,foreign_key="collaborator.collaborator_id")
24
+ collaborator: Optional[Collaborator] = Relationship()
25
+
26
+ client_id:Optional[uuid.UUID]=Field(default=None,foreign_key="px.client_id")
27
+ client: Optional["Px"] = Relationship()
28
+
29
+ speciality_id:Optional[uuid.UUID]=Field(default=None,foreign_key="speciality.speciality_id")
30
+ speciality: Optional[Speciality] = Relationship()
31
+
32
+ status_visit: StatusVisitEnum = Field(sa_column=Column(SqlEnum(StatusVisitEnum, native_enum=False), nullable=False))
33
+
34
+ next_followup_visit_id:Optional[uuid.UUID]=Field(default=None,foreign_key="medical_visit.medical_visit_id")
35
+
36
+ overall_diagnosis:Optional[str]=Field(default=None)
37
+
38
+ bridge_area_floor_branch_id:Optional[uuid.UUID]=Field(default=None,foreign_key="bridge_area_floor_branch.bridge_area_floor_branch_id")
39
+ bridge_area_floor_branch: Optional[BridgeAreaFloorBranch] = Relationship()
40
+
41
+ reason_visit:Optional[str]=Field(default=None)
42
+ current_illness: Optional[str]=Field(default=None)
43
+ rest: Optional[bool] = Field(default=None)
44
+ rest_hours: Optional[int] = Field(default=None)
45
+ rest_date_start: Optional[datetime] = Field(default=None)
46
+ rest_date_end: Optional[datetime] = Field(default=None)
47
+
48
+ is_active: bool = Field(default=True)
49
+
50
+ medical_diagnosis_visits: List["MedicalDiagnosisVisit"] = Relationship(back_populates="medical_visit")
51
+ medical_recipe_visits: List["MedicalRecipeVisit"] = Relationship(back_populates="medical_visit")
52
+ organ_system_reviews: List["OrganSystemReview"] = Relationship(back_populates="medical_visit")
53
+ physical_exams: List["PhysicalExam"] = Relationship(back_populates="medical_visit")
@@ -0,0 +1,28 @@
1
+ import uuid
2
+ from typing import Optional,TYPE_CHECKING
3
+ from sqlmodel import SQLModel, Field, Relationship
4
+ if TYPE_CHECKING:
5
+ from healthdatalayer.models import MedicalVisit
6
+
7
+ class OrganSystemReview(SQLModel, table=True):
8
+ __tablename__ = "organ_system_review"
9
+
10
+ organ_system_review_id:uuid.UUID=Field(default_factory=uuid.uuid4,primary_key=True)
11
+
12
+ medical_visit_id: Optional[uuid.UUID] = Field(default=None, foreign_key="medical_visit.medical_visit_id")
13
+ medical_visit: Optional["MedicalVisit"] = Relationship(back_populates="organ_system_reviews")
14
+
15
+ comment:str
16
+
17
+ skin_attachment: Optional[bool] = Field(default=None)
18
+ sense_organs: Optional[bool] = Field(default=None)
19
+ breathing: Optional[bool] = Field(default=None)
20
+ cardiovascular: Optional[bool] = Field(default=None)
21
+ digestive: Optional[bool] = Field(default=None)
22
+ genitourinary: Optional[bool] = Field(default=None)
23
+ skeletal_muscle: Optional[bool] = Field(default=None)
24
+ endocrine: Optional[bool] = Field(default=None)
25
+ heme_lifatic: Optional[bool] = Field(default=None)
26
+ nervous: Optional[bool] = Field(default=None)
27
+
28
+ is_active: bool = Field(default=True)
@@ -0,0 +1,45 @@
1
+ import uuid
2
+ from typing import Optional,TYPE_CHECKING
3
+ from sqlmodel import SQLModel, Field, Relationship
4
+
5
+ if TYPE_CHECKING:
6
+ from healthdatalayer.models import MedicalVisit
7
+
8
+ class PhysicalExam(SQLModel, table=True):
9
+ __tablename__ = "physical_exam"
10
+
11
+ physical_exam_id:uuid.UUID=Field(default_factory=uuid.uuid4,primary_key=True)
12
+
13
+ medical_visit_id: Optional[uuid.UUID] = Field(default=None, foreign_key="medical_visit.medical_visit_id")
14
+ medical_visit: Optional["MedicalVisit"] = Relationship(back_populates="physical_exams")
15
+
16
+ comments: Optional[str] = Field(default=None)
17
+
18
+ r1: Optional[bool] = Field(default=None)
19
+ r2: Optional[bool] = Field(default=None)
20
+ r3: Optional[bool] = Field(default=None)
21
+ r4: Optional[bool] = Field(default=None)
22
+ r5: Optional[bool] = Field(default=None)
23
+ r6: Optional[bool] = Field(default=None)
24
+ r7: Optional[bool] = Field(default=None)
25
+ r8: Optional[bool] = Field(default=None)
26
+ r9: Optional[bool] = Field(default=None)
27
+ r10: Optional[bool] = Field(default=None)
28
+ r11: Optional[bool] = Field(default=None)
29
+ r12: Optional[bool] = Field(default=None)
30
+ r13: Optional[bool] = Field(default=None)
31
+ r14: Optional[bool] = Field(default=None)
32
+ r15: Optional[bool] = Field(default=None)
33
+
34
+ s1: Optional[bool] = Field(default=None)
35
+ s2: Optional[bool] = Field(default=None)
36
+ s3: Optional[bool] = Field(default=None)
37
+ s4: Optional[bool] = Field(default=None)
38
+ s5: Optional[bool] = Field(default=None)
39
+ s6: Optional[bool] = Field(default=None)
40
+ s7: Optional[bool] = Field(default=None)
41
+ s8: Optional[bool] = Field(default=None)
42
+ s9: Optional[bool] = Field(default=None)
43
+ s10: Optional[bool] = Field(default=None)
44
+
45
+ is_active: bool = Field(default=True)
@@ -0,0 +1,8 @@
1
+ from enum import Enum
2
+
3
+ class StatusVisitEnum(str, Enum):
4
+ AGENDADO = "AGENDADO"
5
+ REAGENDADO = "REAGENDADO"
6
+ CANCELADO = "CANCELADO"
7
+ ATENDIDO = "ATENDIDO"
8
+ NO_ATENDIDO = "NO_ATENDIDO"
@@ -0,0 +1,28 @@
1
+ import uuid
2
+ from typing import Optional,TYPE_CHECKING
3
+ from sqlmodel import SQLModel, Field, Relationship
4
+ from decimal import Decimal
5
+
6
+ if TYPE_CHECKING:
7
+ from healthdatalayer.models.medical_visit.medical_visit import MedicalVisit
8
+
9
+ class VisitTriage(SQLModel, table=True):
10
+ __tablename__ = "visit_triage"
11
+
12
+ visit_triage_id:uuid.UUID=Field(default_factory=uuid.uuid4,primary_key=True)
13
+
14
+ weight:Optional[Decimal]=Field(default=None)
15
+ height:Optional[Decimal]=Field(default=None)
16
+ heart_rate:Optional[int]=Field(default=None)
17
+ blood_pressure:Optional[str]=Field(default=None)
18
+ temperature:Optional[Decimal]=Field(default=None)
19
+
20
+ imc:Optional[Decimal]=Field(default=None)
21
+ abdominal_perimeter:Optional[Decimal]=Field(default=None)
22
+ capillary_hemoglobin:Optional[Decimal]=Field(default=None)
23
+ pulse_oximetry:Optional[Decimal]=Field(default=None)
24
+
25
+ medical_visit_id:Optional[uuid.UUID]=Field(default=None,foreign_key="medical_visit.medical_visit_id")
26
+ medical_visit: Optional["MedicalVisit"] = Relationship()
27
+
28
+ is_active: bool = Field(default=True)
File without changes
@@ -0,0 +1,27 @@
1
+ import uuid
2
+ from sqlmodel import SQLModel, Field, Relationship
3
+ from typing import List, TYPE_CHECKING
4
+
5
+ from healthdatalayer.models.user.role_permission import RolePermission
6
+ from healthdatalayer.models.user.permission_user import PermissionUser
7
+
8
+ if TYPE_CHECKING:
9
+ from healthdatalayer.models.user.user import User
10
+ from healthdatalayer.models.user.role import Role
11
+
12
+ class Permission(SQLModel, table=True):
13
+ __tablename__ = "permission"
14
+
15
+ permission_id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
16
+ name: str
17
+ is_active: bool
18
+
19
+ roles: List["Role"] = Relationship(
20
+ back_populates="permissions",
21
+ link_model=RolePermission
22
+ )
23
+
24
+ users: List["User"] = Relationship(
25
+ back_populates="permissions",
26
+ link_model=PermissionUser
27
+ )
@@ -0,0 +1,8 @@
1
+ import uuid
2
+ from sqlmodel import SQLModel,Field
3
+
4
+ class PermissionUser(SQLModel,table=True):
5
+ __tablename__ = "permission_user"
6
+
7
+ permission_id: uuid.UUID = Field(foreign_key="permission.permission_id", primary_key=True)
8
+ user_id: uuid.UUID = Field(foreign_key="user.user_id", primary_key=True)
@@ -0,0 +1,27 @@
1
+ import uuid
2
+ from sqlmodel import SQLModel, Field, Relationship
3
+ from typing import List, TYPE_CHECKING
4
+
5
+ from healthdatalayer.models.user.role_user import RoleUser
6
+ from healthdatalayer.models.user.role_permission import RolePermission
7
+
8
+ if TYPE_CHECKING:
9
+ from healthdatalayer.models.user.user import User
10
+ from healthdatalayer.models.user.permission import Permission
11
+
12
+ class Role(SQLModel, table=True):
13
+ __tablename__ = "role"
14
+
15
+ role_id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
16
+ name: str
17
+ is_active: bool
18
+
19
+ users: List["User"] = Relationship(
20
+ back_populates="roles",
21
+ link_model=RoleUser
22
+ )
23
+
24
+ permissions: List["Permission"] = Relationship(
25
+ back_populates="roles",
26
+ link_model=RolePermission
27
+ )
@@ -0,0 +1,8 @@
1
+ import uuid
2
+ from sqlmodel import SQLModel,Field
3
+
4
+ class RolePermission(SQLModel,table=True):
5
+ __tablename__ = "role_permission"
6
+
7
+ role_id: uuid.UUID = Field(foreign_key="role.role_id", primary_key=True)
8
+ permission_id: uuid.UUID = Field(foreign_key="permission.permission_id", primary_key=True)
@@ -0,0 +1,8 @@
1
+ import uuid
2
+ from sqlmodel import SQLModel,Field
3
+
4
+ class RoleUser(SQLModel,table=True):
5
+ __tablename__ = "role_user"
6
+
7
+ role_id: uuid.UUID = Field(foreign_key="role.role_id", primary_key=True)
8
+ user_id: uuid.UUID = Field(foreign_key="user.user_id", primary_key=True)
@@ -0,0 +1,30 @@
1
+ import uuid
2
+ from sqlmodel import SQLModel,Field, Relationship
3
+ from datetime import datetime
4
+ from typing import Optional, List, TYPE_CHECKING
5
+
6
+ from healthdatalayer.models.user.role_user import RoleUser
7
+ from healthdatalayer.models.user.permission_user import PermissionUser
8
+
9
+ from healthdatalayer.models.user.role import Role
10
+ from healthdatalayer.models.user.permission import Permission
11
+
12
+ class User(SQLModel,table=True):
13
+ __tablename__ = "user"
14
+
15
+ user_id:uuid.UUID=Field(default_factory=uuid.uuid4,primary_key=True)
16
+ username: str = Field(index=True, nullable=False, unique=True)
17
+ password: str = Field(nullable=False)
18
+ last_access: Optional[datetime] = Field(default=None)
19
+ email: Optional[str] = None
20
+ is_active: bool
21
+
22
+ roles: List["Role"] = Relationship(
23
+ back_populates="users",
24
+ link_model=RoleUser
25
+ )
26
+
27
+ permissions: List["Permission"] = Relationship(
28
+ back_populates="users",
29
+ link_model=PermissionUser
30
+ )
@@ -0,0 +1,40 @@
1
+ from .client_repositories.address_repository import AddressRepository
2
+ from .client_repositories.client_type_repository import ClientTypeRepository
3
+ from .client_repositories.education_repository import EducationRepository
4
+ from .client_repositories.gender_repository import GenderRepository
5
+ from .client_repositories.marriage_status_repository import MarriageStatusRepository
6
+ from .client_repositories.pet_repository import PetRepository
7
+ from .client_repositories.profession_repository import ProfessionRepository
8
+ from .client_repositories.px_repository import PxRepository
9
+ from .client_repositories.emergency_contact_repository import EmergencyContactRepository
10
+ from .client_repositories.nationality_repository import NationalityRepository
11
+ from .client_repositories.pathological_history_repository import PathologicalHistoryRepository
12
+
13
+ from .collaborator_repositories.collaborator_repository import CollaboratorRepository
14
+ from .collaborator_repositories.collaborator_type_repository import CollaboratorTypeRepository
15
+ from .collaborator_repositories.speciality_repository import SpecialityRepository
16
+
17
+ from .infraestructure_repositories.area_repository import AreaRepository
18
+ from .infraestructure_repositories.branch_repository import BranchRepository
19
+ from .infraestructure_repositories.bridge_repository import BridgeAreaFloorBranchRepository
20
+ from .infraestructure_repositories.floor_repository import FloorRepository
21
+ from .infraestructure_repositories.room_repository import RoomRepository
22
+ from .infraestructure_repositories.system_repository import SystemRepository
23
+
24
+ from .lab_repositories.measure_lab_repository import MeasureLabRepository
25
+ from .lab_repositories.medical_lab_repository import MedicalLabRepository
26
+
27
+ from .medical_visit_repositories.medical_diagnosis_repository import MedicalDiagnosisRepository
28
+ from .medical_visit_repositories.medical_diagnosis_visit_repository import MedicalDiagnosisVisitRepository
29
+ from .medical_visit_repositories.medical_drug_recipe_repository import MedicalDrugRecipeRepository
30
+ from .medical_visit_repositories.medical_drug_repository import MedicalDrugRepository
31
+ from .medical_visit_repositories.medical_recipe_visit_repository import MedicalRecipeVisitRepository
32
+ from .medical_visit_repositories.medical_visit_repository import MedicalVisitRepository
33
+ from .medical_visit_repositories.organ_system_review_repository import OrganSystemReviewRepository
34
+ from .medical_visit_repositories.physical_exam_repository import PhysicalExamRepository
35
+ from .medical_visit_repositories.visit_triage_repository import VisitTriageRepository
36
+
37
+ from .user_repositories.permission_repository import PermissionRepository
38
+ from .user_repositories.role_repository import RoleRepository
39
+ from .user_repositories.user_repository import UserRepository
40
+
@@ -0,0 +1,94 @@
1
+ from typing import Optional, List
2
+ from uuid import UUID
3
+ from sqlmodel import select
4
+
5
+ from healthdatalayer.models import Address, City, State
6
+ from healthdatalayer.config.db import engines, get_session
7
+
8
+ class AddressRepository:
9
+
10
+ def __init__(self, tenant: str):
11
+ self.tenant = tenant
12
+ if tenant not in engines:
13
+ raise ValueError(f"Tenant {tenant} is not configured")
14
+
15
+ def create_command(self, address: Address) -> Address:
16
+ with get_session(self.tenant) as session:
17
+ session.add(address)
18
+ session.commit()
19
+ session.refresh(address)
20
+ return address
21
+
22
+ def get_by_id_command(self, address_id: UUID) -> Optional[Address]:
23
+ with get_session(self.tenant) as session:
24
+ return session.get(Address, address_id)
25
+
26
+ def list_all_command(self, active_only: bool = True) -> List[Address]:
27
+ with get_session(self.tenant) as session:
28
+ statement = select(Address)
29
+
30
+ if active_only:
31
+ statement = statement.where(Address.is_active == True)
32
+
33
+ results = session.exec(statement)
34
+ return results.all()
35
+
36
+ def update_command(self, address_id: UUID, **kwargs) -> Optional[Address]:
37
+ with get_session(self.tenant) as session:
38
+ db_address = session.get(Address, address_id)
39
+ if not db_address:
40
+ return None
41
+
42
+ for key, value in kwargs.items():
43
+ if hasattr(db_address, key):
44
+ setattr(db_address, key, value)
45
+
46
+ session.add(db_address)
47
+ session.commit()
48
+ session.refresh(db_address)
49
+ return db_address
50
+
51
+ def delete_command(self, address_id: UUID, soft_delete: bool = True) -> bool:
52
+ with get_session(self.tenant) as session:
53
+ db_address = session.get(Address, address_id)
54
+ if not db_address:
55
+ return False
56
+
57
+ if soft_delete:
58
+ db_address.is_active = False
59
+ session.add(db_address)
60
+ else:
61
+ session.delete(db_address)
62
+
63
+ session.commit()
64
+ return True
65
+
66
+ def list_all_state_command(self, active_only: bool = True) -> List[Address]:
67
+ with get_session(self.tenant) as session:
68
+ statement = select(State)
69
+
70
+ if active_only:
71
+ statement = statement.where(State.is_active == True)
72
+
73
+ results = session.exec(statement)
74
+ return results.all()
75
+
76
+ def list_all_city_command(self, active_only: bool = True) -> List[Address]:
77
+ with get_session(self.tenant) as session:
78
+ statement = select(City)
79
+
80
+ if active_only:
81
+ statement = statement.where(City.is_active == True)
82
+
83
+ results = session.exec(statement)
84
+ return results.all()
85
+
86
+ def list_city_by_state_id_command(self,state_id: UUID, active_only: bool = True) -> List[Address]:
87
+ with get_session(self.tenant) as session:
88
+ statement = select(City).where(City.state_id == state_id)
89
+
90
+ if active_only:
91
+ statement = statement.where(State.is_active == True)
92
+
93
+ results = session.exec(statement)
94
+ return results.all()
@@ -0,0 +1,69 @@
1
+ from typing import Optional, List
2
+ from uuid import UUID
3
+ from sqlmodel import select
4
+
5
+ from healthdatalayer.models import ClientType
6
+ from healthdatalayer.config.db import engines, get_session
7
+
8
+ class ClientTypeRepository:
9
+ def __init__(self, tenant: str):
10
+ self.tenant = tenant
11
+ if tenant not in engines:
12
+ raise ValueError(f"Tenant {tenant} is not configured")
13
+
14
+ def create_command(self, client_type: ClientType) -> ClientType:
15
+ with get_session(self.tenant) as session:
16
+ session.add(client_type)
17
+ session.commit()
18
+ session.refresh(client_type)
19
+ return client_type
20
+
21
+ def get_by_id_command(self, client_type_id: UUID) -> Optional[ClientType]:
22
+ with get_session(self.tenant) as session:
23
+ return session.get(ClientType, client_type_id)
24
+
25
+ def get_by_name_command(self, name: str) -> Optional[ClientType]:
26
+ with get_session(self.tenant) as session:
27
+ statement = select(ClientType).where(ClientType.name == name)
28
+ result = session.exec(statement).first()
29
+ return result
30
+
31
+ def list_all_command(self, active_only: bool = True) -> List[ClientType]:
32
+ with get_session(self.tenant) as session:
33
+ statement = select(ClientType)
34
+
35
+ if active_only:
36
+ statement = statement.where(ClientType.is_active == True)
37
+
38
+ results = session.exec(statement)
39
+ return results.all()
40
+
41
+ def update_command(self, client_type_id: UUID, **kwargs) -> Optional[ClientType]:
42
+ with get_session(self.tenant) as session:
43
+ db_client_type = session.get(ClientType, client_type_id)
44
+ if not db_client_type:
45
+ return None
46
+
47
+ for key, value in kwargs.items():
48
+ if hasattr(db_client_type, key):
49
+ setattr(db_client_type, key, value)
50
+
51
+ session.add(db_client_type)
52
+ session.commit()
53
+ session.refresh(db_client_type)
54
+ return db_client_type
55
+
56
+ def delete_command(self, client_type_id: UUID, soft_delete: bool = True) -> bool:
57
+ with get_session(self.tenant) as session:
58
+ db_client_type = session.get(ClientType, client_type_id)
59
+ if not db_client_type:
60
+ return False
61
+
62
+ if soft_delete:
63
+ db_client_type.is_active = False
64
+ session.add(db_client_type)
65
+ else:
66
+ session.delete(db_client_type)
67
+
68
+ session.commit()
69
+ return True