diff --git a/src/apps/users/v1/router.py b/src/apps/users/v1/router.py index 0c0d91b..e79af46 100644 --- a/src/apps/users/v1/router.py +++ b/src/apps/users/v1/router.py @@ -1,7 +1,7 @@ from datetime import datetime from json import dumps from logging import getLogger -from typing import Annotated, Any +from typing import Annotated from fastapi import APIRouter, Body, Depends, status @@ -23,11 +23,30 @@ router = APIRouter( @router.get('/getProfile', response_model=s.ProfileModel) async def get_profile(): + """ + Get profile of user by id. + """ return await c.vitacore_api.getProfile( 'b62e9f22-a871-4c52-96d6-559c707a716d' ) +@router.get('/getDepartments', response_model=list[s.DepartmentModel]) +async def get_departments(): + """ + Get list of departments. + """ + return await c.vitacore_api.getDepartments() + + +@router.get('/getWorkers', response_model=s.WorkersModel) +async def get_workers(departmentId: str): + """ + Get list of workers by department id. + """ + return await c.vitacore_api.getWorkers(departmentId) + + @router.get('/getSpecs') async def get_specs(): return mock.specs @@ -92,12 +111,6 @@ async def queue(user: Annotated[bool, Depends(login)]): } -@router.get('/getDepartments') -async def get_departments(): - data: dict[Any, Any] = {} - return data - - @router.get('/findPat') async def find_pat(user: Annotated[str, Depends(login)]): return mock.findpat[0] diff --git a/src/clients/vitacore/api.py b/src/clients/vitacore/api.py index e37320c..08e4502 100644 --- a/src/clients/vitacore/api.py +++ b/src/clients/vitacore/api.py @@ -26,3 +26,27 @@ class VITACORE_API(AsyncClient): case _: self.logger.error(req.json()) raise e.UnknownException + + async def getDepartments(self): + req = await self.get('/getDepartments') + + match req.status_code: + case st.HTTP_200_OK: + return [ + s.DepartmentModel.model_validate(i) for i in req.json() + ] + case _: + self.logger.error(req.json()) + raise e.UnknownException + + async def getWorkers(self, departmentId: str): + req = await self.get( + '/getWorkers', params={'departmentId': departmentId} + ) + + match req.status_code: + case st.HTTP_200_OK: + return s.WorkersModel.model_validate(req.json()) + case _: + self.logger.error(req.json()) + raise e.UnknownException diff --git a/src/clients/vitacore/schema.py b/src/clients/vitacore/schema.py index eb62a47..a397108 100644 --- a/src/clients/vitacore/schema.py +++ b/src/clients/vitacore/schema.py @@ -1,3 +1,5 @@ +from datetime import datetime + from pydantic import BaseModel, Field @@ -62,3 +64,113 @@ class ProfileModel(BaseModel): trustedPersons: list[TrustedPersonModel] = Field( title='Информация о представителе', ) + + +class DepartmentAddressModel(BaseModel): + type: str = Field( + title='для МО: «Юридический», для филиалов «Фактический»', + examples=['«Юридический»'], + ) + display: str = Field( + title='Адрес строкой', + examples=['420097, г.Казань, ул.Заслонова, д.5'], + ) + latitude: float | None = Field( + title='Широта, при наличии', examples=[55.789], default=None + ) + longitude: float | None = Field( + title='Долгота, при наличии', examples=[37.789], default=None + ) + + +class DepartmentModel(BaseModel): + id: str = Field( + title='Идентификатор МО/Филиала', + examples=['a3677271-3385-4f27-a65d-c3430b7c61c2'], + ) + OID: str = Field( + title='OID МО / Филиала', examples=['1.2.643.5.1.13.13.12.2.16.1084'] + ) + parentId: str | None = Field( + title='Идентификатор вышестоящего подразделения', + examples=['a3677271-3385-4f27-a65d-c3430b7c61c2'], + ) + code: str = Field( + title='Региональный код или код ТФОМС', + examples=['0000000000'], + ) + fullname: str = Field( + title='Полное наименование', + examples=['ГБУЗС "Тестовая медицинская организация"'], + ) + shortname: str = Field( + title='Краткое наименование', + examples=['ГБУЗС "Тестовая медицинская организация"'], + ) + type: str = Field( + title='Тип подразделения (для МО: «Юридический»' + ', для филиалов: Стационар / Поликлиника / ФАП / Амбулатория)', + examples=['Юридическое лицо'], + ) + inn: str = Field(title='ИНН', examples=['0000000000']) + kpp: str = Field(title='КПП', examples=['0000000000']) + ogrn: str = Field(title='ОГРН', examples=['1149204047816']) + address: list[DepartmentAddressModel] + + +class WorkersPositionModel(BaseModel): + id: str = Field( + title='Идентификатор сотрудника в связке с должностью', + examples=['41019'], + ) + dateBegin: datetime = Field( + title='Дата приёма на работу', examples=['01.08.2022'] + ) + departmentId: str = Field( + title='ID ФИЛИАЛА', + examples=['10ea04ca-339a-4867-aab4-d9a83b7e9098'], + ) + departmentName: str = Field( + title='Краткое наименование филиала', + examples=['Поликлиника'], + ) + positionName: str = Field( + title='Тип должности.Наименование (POST_TYPE)', + examples=['Врач-онколог'], + ) + positionFedCode: str = Field( + title='Тип должности.Код (POST_TYPE)', + examples=['3037'], + ) + positionRegName: str | None = Field( + title='ФРМР. Должности медицинского персонала', + examples=['врач-онколог'], + ) + positionSpecialityCode: str = Field( + title='Код специальности по V021', + examples=['41'], + ) + positionSpecialityName: str = Field( + title='Наименование специальности по V021', + examples=['Онкология'], + ) + rate: float = Field( + title='Ставка', + examples=[0.5], + ) + + +class WorkersModel(BaseModel): + id: str = Field( + title='Идентификатор сотрудника', + examples=['dc911302-5044-46f4-b935-c6ffd85eb68f'], + ) + SNILS: str = Field( + title='СНИЛС', + examples=['059-486-659 26'], + ) + firstName: str = Field(title='Имя', examples=['Владимир']) + lastName: str = Field(title='Фамилия', examples=['Камашев']) + middleName: str = Field(title='Отчество', examples=['Михайлович']) + birthDate: datetime = Field(title='Дата рождения', examples=['30.05.1961']) + positions: list[WorkersPositionModel]