healthdatalayer 1.4.5__py3-none-any.whl → 1.5.0__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.
@@ -0,0 +1 @@
1
+ from .collaborator.schedule_collaborator import ScheduleCollaboratorDTO
File without changes
@@ -0,0 +1,13 @@
1
+ from pydantic import BaseModel, Field
2
+ from typing import List
3
+ from datetime import time
4
+
5
+ class ScheduleCollaboratorDTO(BaseModel):
6
+
7
+ available_schedules: List[str] = Field(default_factory=list)
8
+ busy_schedules: List[str] = Field(default_factory=list)
9
+
10
+ class Config:
11
+ json_encoders = {
12
+ time: lambda v: v.strftime('%H:%M')
13
+ }
@@ -1,9 +1,11 @@
1
+ from datetime import date
1
2
  from typing import Optional, List
2
3
  from uuid import UUID
3
- from sqlmodel import select, or_, join
4
+ from sqlmodel import select, or_, join, text
4
5
  from sqlalchemy.orm import selectinload,joinedload
5
6
  from healthdatalayer.models import Collaborator
6
7
  from healthdatalayer.models import Speciality, CollaboratorSpeciality
8
+ from healthdatalayer.dtos import ScheduleCollaboratorDTO
7
9
  from healthdatalayer.config.db import engines, get_session
8
10
 
9
11
  class CollaboratorRepository:
@@ -147,4 +149,48 @@ class CollaboratorRepository:
147
149
  session.commit()
148
150
  session.refresh(collab)
149
151
 
150
- return collab
152
+ return collab
153
+
154
+ def get_availability_schedules_command(self, visit_date: date, collaborator_id: str) -> ScheduleCollaboratorDTO:
155
+
156
+ with get_session(self.tenant) as session:
157
+
158
+ query = text("""
159
+ WITH horarios_generados AS (
160
+ SELECT horario::TIME as hora
161
+ FROM generate_series(
162
+ :fecha::DATE + TIME '08:00:00',
163
+ :fecha::DATE + TIME '17:00:00',
164
+ INTERVAL '30 minutes'
165
+ ) AS horario
166
+ ),
167
+ horarios_ocupados AS (
168
+ SELECT t.visit_date::TIME as hora
169
+ FROM medical_visit t
170
+ WHERE t.visit_date::DATE = :fecha
171
+ AND t.collaborator_id = :colab_id
172
+ )
173
+ SELECT
174
+ hg.hora,
175
+ CASE WHEN ho.hora IS NOT NULL THEN true ELSE false END as ocupado
176
+ FROM horarios_generados hg
177
+ LEFT JOIN horarios_ocupados ho ON hg.hora = ho.hora
178
+ ORDER BY hg.hora
179
+ """)
180
+
181
+ result = session.exec(query, {"fecha": visit_date, "colab_id": collaborator_id})
182
+
183
+ availables = []
184
+ busy = []
185
+
186
+ for row in result:
187
+ hour, is_busy = row[0], row[1]
188
+ if is_busy:
189
+ busy.append(hour)
190
+ else:
191
+ availables.append(hour)
192
+
193
+ return ScheduleCollaboratorDTO(
194
+ available_schedules=availables,
195
+ busy_schedules=busy
196
+ )
@@ -21,6 +21,36 @@ class MedicalDiagnosisRepository:
21
21
  def get_by_id_command(self, medical_diagnosis_id: UUID) -> Optional[MedicalDiagnosis]:
22
22
  with get_session(self.tenant) as session:
23
23
  return session.get(MedicalDiagnosis, medical_diagnosis_id)
24
+
25
+ def get_by_name_command(self, name:str, active_only: bool = True) -> Optional[MedicalDiagnosis]:
26
+ with get_session(self.tenant) as session:
27
+ statement = select(MedicalDiagnosis).where(MedicalDiagnosis.name == name)
28
+
29
+ if active_only:
30
+ statement = statement.where(MedicalDiagnosis.is_active == True)
31
+
32
+ medical_diagnosis = session.exec(statement).first()
33
+ return medical_diagnosis
34
+
35
+ def get_by_name_ilike_command(self, name:str, active_only: bool = True) -> List[MedicalDiagnosis]:
36
+ with get_session(self.tenant) as session:
37
+ statement = select(MedicalDiagnosis).where(MedicalDiagnosis.name.ilike(f"%{name}%"))
38
+
39
+ if active_only:
40
+ statement = statement.where(MedicalDiagnosis.is_active == True)
41
+
42
+ medical_diagnosis = session.exec(statement).all()
43
+ return medical_diagnosis
44
+
45
+ def get_by_code_command(self, code:str, active_only: bool = True) -> Optional[MedicalDiagnosis]:
46
+ with get_session(self.tenant) as session:
47
+ statement = select(MedicalDiagnosis).where(MedicalDiagnosis.cie_10_code == code)
48
+
49
+ if active_only:
50
+ statement = statement.where(MedicalDiagnosis.is_active == True)
51
+
52
+ medical_diagnosis = session.exec(statement).first()
53
+ return medical_diagnosis
24
54
 
25
55
  def list_all_command(self, active_only: bool = True) -> List[MedicalDiagnosis]:
26
56
  with get_session(self.tenant) as session:
@@ -33,10 +33,27 @@ class MedicalDiagnosisVisitRepository:
33
33
  else:
34
34
  return session.get(MedicalDiagnosisVisit, medical_diagnosis_visit_id)
35
35
 
36
- def get_by_medical_visit_id_command(self, medical_visit_id: UUID, load_relations: bool = False) ->Optional[MedicalDiagnosisVisit]:
36
+ def get_by_medical_visit_id_command(self, medical_visit_id: UUID, load_relations: bool = False) ->List[MedicalDiagnosisVisit]:
37
37
  with get_session(self.tenant) as session:
38
38
 
39
39
  statement = select(MedicalDiagnosisVisit).where(MedicalDiagnosisVisit.medical_visit_id == medical_visit_id)
40
+ if load_relations:
41
+ statement = statement.options(
42
+ joinedload(MedicalDiagnosisVisit.medical_visit),
43
+ joinedload(MedicalDiagnosisVisit.medical_diagnosis)
44
+ )
45
+ medical_diagnosis_visits = session.exec(statement).all()
46
+
47
+ return medical_diagnosis_visits
48
+
49
+ def get_by_medicalvisitid_and_diagnosisid_command(self, medical_visit_id: UUID, medical_diagnosis_id: UUID, load_relations: bool = False) ->Optional[MedicalDiagnosisVisit]:
50
+ with get_session(self.tenant) as session:
51
+
52
+ statement = select(MedicalDiagnosisVisit).where(
53
+ MedicalDiagnosisVisit.medical_visit_id == medical_visit_id,
54
+ MedicalDiagnosisVisit.medical_diagnosis_id == medical_diagnosis_id
55
+ )
56
+
40
57
  if load_relations:
41
58
  statement = statement.options(
42
59
  joinedload(MedicalDiagnosisVisit.medical_visit),
@@ -46,7 +63,7 @@ class MedicalDiagnosisVisitRepository:
46
63
 
47
64
  return medical_diagnosis_visit
48
65
 
49
- def get_all_command(self, active_only: bool = True,load_related: bool = False) -> List[MedicalDiagnosisVisit]:
66
+ def list_all_command(self, active_only: bool = True,load_related: bool = False) -> List[MedicalDiagnosisVisit]:
50
67
  with get_session(self.tenant) as session:
51
68
 
52
69
  statement = select(MedicalDiagnosisVisit)
@@ -1,6 +1,6 @@
1
1
  from typing import Optional, List
2
2
  from uuid import UUID
3
- from sqlmodel import select, or_
3
+ from sqlmodel import select
4
4
  from sqlalchemy.orm import selectinload,joinedload
5
5
  from healthdatalayer.models import VisitTriage
6
6
  from healthdatalayer.models import MedicalVisit
@@ -86,4 +86,10 @@ class VisitTriageRepository:
86
86
  else:
87
87
  session.delete(existing_visit_triage)
88
88
 
89
- session.commit()
89
+ session.commit()
90
+
91
+ def exists_by_medical_visit_id_command(self, medical_visit_id: UUID) -> bool:
92
+ with get_session(self.tenant) as session:
93
+ statement = select(VisitTriage).where(VisitTriage.medical_visit_id == medical_visit_id)
94
+ result = session.exec(statement).first()
95
+ return result is not None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: healthdatalayer
3
- Version: 1.4.5
3
+ Version: 1.5.0
4
4
  Summary: Health Datalayer to access data from different sources
5
5
  Author: Jesus Martinez
6
6
  Author-email: jesusmartinez@noosds.com
@@ -3,6 +3,9 @@ healthdatalayer/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
3
3
  healthdatalayer/config/config.py,sha256=vyqrlHDgCGpYX7V9fDn4g671lUU1RuWlSYCIazI-SqQ,689
4
4
  healthdatalayer/config/db.py,sha256=b_SWTINJSVUhR0uyD4h93jPLKUzRm6Ky0tmALWbjM18,342
5
5
  healthdatalayer/config/vault.py,sha256=9yUMXjaTYSnqr0npcQXDsg6Z7G3DityqpmHl1x42zS0,748
6
+ healthdatalayer/dtos/__init__.py,sha256=yNIWA7EF04esaVDpSymVyeuaotsHdOjLzqk3ygbh59o,71
7
+ healthdatalayer/dtos/collaborator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ healthdatalayer/dtos/collaborator/schedule_collaborator.py,sha256=liF-UDijHIVZdyzvGuniqcXbA6avns65ey1hfnLI0J4,367
6
9
  healthdatalayer/models/__init__.py,sha256=ZBY7CL172P68TWRWVTpzHO0_cnFzDRGz7aTy85Z8HPI,2056
7
10
  healthdatalayer/models/bridge_area_floor_branch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
11
  healthdatalayer/models/bridge_area_floor_branch/area.py,sha256=g_u6RoorLJ7XUx7qcqXLavrHxpflHGi0p77f-3RPbVU,201
@@ -67,7 +70,7 @@ healthdatalayer/repositories/client_repositories/pet_repository.py,sha256=aUjti4
67
70
  healthdatalayer/repositories/client_repositories/profession_repository.py,sha256=ALnx_y_z9Jfx9rBDvOdnK1P1_lkqKmFBeR1GVXj3m3Q,2620
68
71
  healthdatalayer/repositories/client_repositories/px_repository.py,sha256=cTXDfKolG5aLdlQzXV98_r4Y1Qm5jYW9cUtntdw7e0k,10116
69
72
  healthdatalayer/repositories/collaborator_repositories/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
- healthdatalayer/repositories/collaborator_repositories/collaborator_repository.py,sha256=aYew_0UMYRvng3DgP5vnKbSVmYe8ozYWUnLly6LxTcI,6467
73
+ healthdatalayer/repositories/collaborator_repositories/collaborator_repository.py,sha256=xDyLO0DqrbojaXzMBgweamKPDtPYFwURVEFoV0pgBIg,8228
71
74
  healthdatalayer/repositories/collaborator_repositories/collaborator_type_repository.py,sha256=7-bJqbxgsJtyRU7nV_YCZhKufYLlighWBWjglw70nUw,2858
72
75
  healthdatalayer/repositories/collaborator_repositories/speciality_repository.py,sha256=tcAjp2OzFAnHpRKNdmw2Zsqvs7XdsO51h7cIJHt105s,2940
73
76
  healthdatalayer/repositories/infraestructure_repositories/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -81,20 +84,20 @@ healthdatalayer/repositories/lab_repositories/__init__.py,sha256=47DEQpj8HBSa-_T
81
84
  healthdatalayer/repositories/lab_repositories/measure_lab_repository.py,sha256=AAwgGjaLWTqyH3YHTD_eisunn6I0E0GmYLEseuLgZ0Q,3174
82
85
  healthdatalayer/repositories/lab_repositories/medical_lab_repository.py,sha256=owZQe3cXKkXsRuGXpqPBXjZvA-DEb7yD1OKPMOCqF1o,10909
83
86
  healthdatalayer/repositories/medical_visit_repositories/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
- healthdatalayer/repositories/medical_visit_repositories/medical_diagnosis_repository.py,sha256=mRrNGt6Z4vsZBhvhlOSXlED289WelBJbTn5EetMmQJ8,2567
85
- healthdatalayer/repositories/medical_visit_repositories/medical_diagnosis_visit_repository.py,sha256=GKgjRvddcaw82WMXDO9R7S8HuaJPYTvRT0ev2trKaa8,4659
87
+ healthdatalayer/repositories/medical_visit_repositories/medical_diagnosis_repository.py,sha256=dnVW3hMUqrVGctBSNKVU2_j0ITH46aXN31XduELO8wg,4012
88
+ healthdatalayer/repositories/medical_visit_repositories/medical_diagnosis_visit_repository.py,sha256=BHhglV8CBw4xpcLsFjRJPglg2D0ASnYD2k4RmbP80tU,5499
86
89
  healthdatalayer/repositories/medical_visit_repositories/medical_drug_recipe_repository.py,sha256=6rubP_KtheyJSvLmpBJwYuPKNsjhSvKi-_HM2QoP1hM,3141
87
90
  healthdatalayer/repositories/medical_visit_repositories/medical_drug_repository.py,sha256=mJNN6_aAK3eY9IpFc16nT3IshObGcFE5fi27SK-Sjio,2401
88
91
  healthdatalayer/repositories/medical_visit_repositories/medical_recipe_visit_repository.py,sha256=j4cJ4zURKILN3lkqfpXya29MQYFIMiTmJukOADBj5_c,4551
89
92
  healthdatalayer/repositories/medical_visit_repositories/medical_visit_repository.py,sha256=BmPLxuB22QOPukAAduIKwWq5lQkhKdILF4AuCF7Bj-s,11693
90
93
  healthdatalayer/repositories/medical_visit_repositories/organ_system_review_repository.py,sha256=-BTfgzvt8VlE2FsBHX3snzRl2VDrRClqz-dJL3bLheE,4192
91
94
  healthdatalayer/repositories/medical_visit_repositories/physical_exam_repository.py,sha256=Q4R2-6fv57jqZrGUMFQw4YZgZGQbn8UmSRS3UhUSZQg,3877
92
- healthdatalayer/repositories/medical_visit_repositories/visit_triage_repository.py,sha256=0xVnhXV2CSNi2FcW2tG_BGsqlm_oA9jvXP5qz5Aqj_c,3821
95
+ healthdatalayer/repositories/medical_visit_repositories/visit_triage_repository.py,sha256=9Up5M7wWo5GnaYdl6QvTamYaIG4dG_ALM0Su66rlj44,4140
93
96
  healthdatalayer/repositories/user_repositories/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
97
  healthdatalayer/repositories/user_repositories/permission_repository.py,sha256=3L4y-zCkI2PIRo-L3FJRSk4g3nZnu6q35lEY4ACJyq4,9630
95
98
  healthdatalayer/repositories/user_repositories/role_repository.py,sha256=jIsbeAFFQQ_CZJqBMcOskuMXtT1Il6eiN0Y2BpVO1JE,6821
96
99
  healthdatalayer/repositories/user_repositories/user_repository.py,sha256=FUCNdRRGc12dq5XuwDT3btvDETt6HGXh_xQIPTLCAvk,9839
97
- healthdatalayer-1.4.5.dist-info/METADATA,sha256=8JRrMnan-t3mU9GK2JZ_dYAW2nUjvg3de0Mm04juGKY,827
98
- healthdatalayer-1.4.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
99
- healthdatalayer-1.4.5.dist-info/top_level.txt,sha256=6f1-gvpg533UEVuYsRJCDhdSDQUBwijyAHylyS4nG_4,16
100
- healthdatalayer-1.4.5.dist-info/RECORD,,
100
+ healthdatalayer-1.5.0.dist-info/METADATA,sha256=PSPVrGaysLeAPs1TvTjrEB8abDmrrCIoowfLdrJ0eYw,827
101
+ healthdatalayer-1.5.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
102
+ healthdatalayer-1.5.0.dist-info/top_level.txt,sha256=6f1-gvpg533UEVuYsRJCDhdSDQUBwijyAHylyS4nG_4,16
103
+ healthdatalayer-1.5.0.dist-info/RECORD,,