Информационная система для автоматизации процессов ветеринарной клиники: регистратура, приемы, лаборатория, склад, финансы, CRM, отчеты и аудит.
- 1. Назначение и текущее покрытие
- 2. Быстрый старт (Docker)
- 3. Первый вход и базовая настройка
- 4. Роли и права доступа
- 5. Полное руководство пользователя (Web UI)
- 6. Сквозные рабочие сценарии
- 7. Полное руководство по API
- 8. Автоматизация и фоновые процессы
- 9. Администрирование и эксплуатация
- 10. Локальный запуск без Docker
- 11. Тесты и контроль качества
- 12. Основные бизнес-сущности
- 13. Диагностика проблем (Troubleshooting)
- 14. Архитектура проекта
- 15. Дальнейшее развитие
- Полноценный backend с RBAC, аудитом и workflow-переходами.
- Рабочий Web UI (server-rendered) для ежедневных задач:
- вход в систему;
- дашборд;
- владельцы и питомцы;
- табло записей/очереди;
- карточка визита (осмотр, диагнозы, назначения, процедуры, события);
- лабораторное табло (статусы заказов/образцов, утверждение результатов).
- Полный API-контур для всех доменов (включая clinical, inventory, billing, reports).
- Расширенный контур CRM-коммуникаций (массовые/сложные сценарии dispatch).
- Операции склада закупок (детальный операционный интерфейс по партиям и движениям).
- Отчеты расширенного уровня (экспортные и аналитические срезы).
- Python
3.12 - Django
5.x+ Django REST Framework - PostgreSQL
16 - Redis
7 - Celery (
worker,beat, Flower) - Gunicorn + WhiteNoise
- Docker Compose (Nginx профиль для prod)
- Ruff + Django test suite (59 автотестов)
Django + DRF: основной backend, бизнес-логика, Web UI, API, RBAC, валидации, workflow.PostgreSQL: основная транзакционная БД (владельцы, питомцы, визиты, лаборатория, склад, финансы, аудит).Redis:- кэш Django (
REDIS_URL, обычноredis://redis:6379/0); - кэш отчетов и версионирование ключей отчетности;
- брокер Celery (
CELERY_BROKER_URL, обычноredis://redis:6379/1); - backend результатов Celery (
CELERY_RESULT_BACKEND, обычноredis://redis:6379/2).
- кэш Django (
Celery worker: выполнение фоновых задач (уведомления, SLA, dispatch, прогрев отчетов).Celery beat: запуск периодических задач по расписанию.Flower: мониторинг очередей и задач Celery (http://localhost:5555/).Gunicorn: WSGI-сервер приложения в контейнереweb.WhiteNoise: отдача статических файлов Django без отдельного static-сервера в dev-сценарии.Nginx(profileprod): reverse proxy и отдача static/media в production-профиле.Docker Compose: оркестрация сервисов и зависимостей проекта.
# Проверка PostgreSQL
docker compose exec postgres pg_isready -U pettrace -d pettrace
# Проверка Redis
docker compose exec redis redis-cli ping
# Проверка Celery worker
docker compose exec celery_worker celery -A config inspect ping
# Открыть Flower UI
open http://localhost:5555/- Docker Desktop (или Docker Engine + Compose).
- Свободные порты:
8000,5432,6379,5555.
- Создайте
.envиз примера:- Linux/macOS:
cp .env.example .env - PowerShell:
Copy-Item .env.example .env
- Linux/macOS:
- Запустите стек:
docker compose up --build
- Откройте сервисы:
- Web console:
http://localhost:8000/ - API root:
http://localhost:8000/api/ - Admin:
http://localhost:8000/admin/ - Health:
http://localhost:8000/health/ - OpenAPI schema:
http://localhost:8000/api/schema/ - Swagger UI:
http://localhost:8000/api/docs/swagger/ - ReDoc:
http://localhost:8000/api/docs/redoc/ - Flower:
http://localhost:5555/
- Web console:
Интерфейс пользователя и Django Admin русифицированы (подписи, статусы, справочники).
python manage.py migrate --noinputpython manage.py bootstrap_rbacpython manage.py bootstrap_facilitiespython manage.py create_initial_superuserpython manage.py collectstatic --noinput
Статика Web UI отдается через WhiteNoise.
Логин и пароль берутся из .env:
SUPERUSER_EMAILSUPERUSER_PASSWORD
Для текущей dev-конфигурации из примера:
- email:
admin@pettrace.local - password:
admin123
- Проверьте группы и права (
/admin/auth/group/). - Создайте сотрудников в
/admin/users/user/. - Назначьте пользователей в нужные группы:
registrar,veterinarian,assistant,lab_technician,inventory_manager,cashier.
- Заполните базовые справочники:
- филиалы и кабинеты;
- типы оборудования и оборудование;
- требования услуг (если используете ресурсное планирование по кабинетам/оборудованию).
- При необходимости настройте персональный доступ сотрудника:
/admin/users/useraccessprofile/- или
POST /api/user-access-profiles/.
Группы по умолчанию:
administratorregistrarveterinarianassistantlab_technicianinventory_managercashier
Ресинхронизация RBAC:
python src/manage.py bootstrap_rbacРазвернуть базовую структуру филиалов/кабинетов:
python src/manage.py bootstrap_facilitiesКлючевые доменные разрешения:
visits.close_visitlabs.approve_lab_resultinventory.write_off_stockclinical.apply_clinical_protocolcrm.dispatch_communication
Если пользователю не хватает прав, Web UI и API возвращают 403 Forbidden.
| Роль | Основные UI-кабинеты | Ключевые действия | Что ограничено |
|---|---|---|---|
administrator |
Все разделы: дашборд, приемы, лаборатория, документы, стационар, MAR, финансы | Полный контроль данных, ролей, справочников, workflow и аудита | Ограничений нет (кроме бизнес-валидаций). |
registrar |
Дашборд, приемы/очередь, документы, стационар (операционные действия), финансы (просмотр) | Регистрация владельцев/животных, запись на прием, check-in, оформление документов, координация госпитализации | Нет клинического закрытия визита и утверждения лабораторных результатов. |
veterinarian |
Дашборд, приемы, лаборатория, документы, стационар, MAR, финансы | Полное ведение приема, назначения/процедуры, госпитализация (bed/vitals/plans), контроль MAR, работа с документами | Не выполняет админ-настройки пользователей/глобальных прав. |
assistant |
Дашборд, приемы, лаборатория, документы, стационар, MAR | Исполнение процедур и заборов, переходы лабораторных статусов, фиксация vitals и MAR | Нет прав закрытия визита close_visit, ограниченные финансовые операции. |
lab_technician |
Дашборд, лаборатория, документы | Прием/обработка образцов, внесение и утверждение результатов, лабораторные документы | Нет управления приемами/финансами/клиническим закрытием визита. |
inventory_manager |
Дашборд, MAR | Контроль списаний и остатков по факту выполнения, учет движений/партий через API/Admin | Нет клинических и финансовых действий в визите. |
cashier |
Дашборд, документы, финансы | Создание/ведение счетов, позиции, оплаты, скидки, корректировки платежей | Нет клинических изменений приема и лабораторных workflow-действий. |
Примечание: фактическая доступность модулей зависит от группы пользователя и от персонального UserAccessProfile (филиалы/кабинеты/assigned scope).
Система применяет ограничения в 2 слоя:
- Базовый ролевой скоуп (по группе пользователя) на типы кабинетов.
- Персональный скоуп через
UserAccessProfile:home_branchallowed_branchesallowed_cabinetslimit_to_assigned_cabinets
Ограничения применяются в API и Web UI для расписания, визитов, лаборатории, задач, финансов и справочников кабинетов.
Ниже приведен практический разбор роли в терминах ежедневных действий, а не только permission-кодов.
- Полный доступ ко всем разделам Web UI, Admin и API.
- Управление пользователями, группами, правами, ролью и скоупами (
UserAccessProfile). - Настройка справочников: филиалы, кабинеты, койки, оборудование, требования услуг.
- Контроль и коррекция данных в любом домене:
- CRM/пациенты;
- приемы/визиты/стационар;
- лаборатория;
- склад;
- финансы;
- документы;
- отчеты и аудит.
- Эксплуатационные функции: bootstrap, сидинг, миграции, контроль фоновых задач, диагностика.
- Регистрация и ведение клиентской базы:
- создание/редактирование владельцев;
- создание/редактирование карточек животных;
- согласия на обработку данных;
- теги клиентов, напоминания и коммуникации.
- Полный фронт-офис записи:
- создание записи на прием;
- check-in;
- перевод записи по рабочим статусам в рамках разрешенных переходов;
- координация маршрута пациента между кабинетом, врачом и лабораторией.
- Визитный контур (операционно):
- просмотр визита;
- создание/редактирование визита без клинического закрытия.
- Документы:
- создание/загрузка клинических вложений;
- работа с шаблонами документов и просмотр сгенерированных форм.
- Что ограничено:
- нет права
visits.close_visit; - нет права утверждения лабораторных результатов
labs.approve_lab_result; - нет полноценного кассового контура (инвойсы/оплаты только на чтение в UI).
- нет права
- Полный клинический цикл по приему:
- ведение осмотра и анамнеза;
- постановка диагнозов;
- назначения, процедуры, наблюдения;
- перевод визита по статусам вплоть до закрытия (
close_visit).
- Лаборатория:
- создание и ведение заказов/тестов/образцов;
- внесение результатов;
- работа с повторными заборами.
- Клинический движок:
- применение протоколов лечения (
clinical.apply_clinical_protocol); - работа с противопоказаниями, алертами, чек-листами.
- применение протоколов лечения (
- Стационар и MAR:
- госпитализация, койко-места, vitals, план процедур;
- контроль введений препаратов и статусов MAR.
- Документы и задачи:
- формирование клинических документов;
- работа с задачами и уведомлениями.
- Что ограничено:
- администрирование пользователей и глобальной RBAC-конфигурации.
- Исполнение процедурного контура:
- сопровождение записи/приема в части исполнения;
- изменение визита в рамках операционной работы без права закрытия.
- Лаборатория:
- забор и обработка образцов;
- перевод статусов заказа/образцов;
- подготовка контейнеров, связка с пробирками.
- Стационар:
- создание/ведение госпитализации;
- заполнение vitals;
- ведение госпитального плана процедур.
- MAR:
- ведение введений (
GIVEN,SKIPPED,CANCELED); - фиксация фактических параметров и отклонений;
- списание препаратов/материалов по факту.
- ведение введений (
- Документы и задачи:
- создание клинических вложений;
- постановка и ведение задач.
- Что ограничено:
- нет
visits.close_visit; - нет кассового закрытия и подтверждения лабораторных результатов.
- нет
- Полный лабораторный pipeline:
- обработка
LabOrder/LabTest/Specimen; - перевод статусов на этапах обработки;
- работа с событиями образца и маркировкой.
- обработка
- Ведение результатов:
- внесение
LabResultValue; - утверждение результатов (
approve_lab_result).
- внесение
- Работа с лабораторными документами:
- загрузка и обновление вложений;
- использование шаблонов документов и просмотр генераций.
- Что ограничено:
- нет кассового, складского и клинического закрытия визита;
- не ведет фронт-офисную часть регистратора.
- Складской контур:
- номенклатура (
InventoryItem); - партии (
Batch); - движения (
StockMovement); - корректировка связки пробирок и материалов;
- право
write_off_stock.
- номенклатура (
- Ресурсный контур клиники:
- оборудование и типы оборудования;
- контроль обеспеченности услуг ресурсами.
- Что ограничено:
- не ведет клинический визит;
- не выполняет лабораторное утверждение;
- не ведет кассовые операции.
- Примечание:
- значимая часть глубоких операций склада доступна через API/Admin (в UI в основном оперативный контроль через MAR/дашборд).
- Финансовый контур приема:
- создание/редактирование инвойсов;
- добавление/изменение позиций инвойса;
- проведение и контроль статусов счета.
- Платежи:
- регистрация оплат;
- учет корректировок (refund/correction);
- проверка полноты оплаты.
- Скидки и прайс:
- работа с прайс-позициями;
- правила скидок и промо-механики.
- Документный контур:
- просмотр сгенерированных документов для закрытия расчетов.
- Что ограничено:
- нет клинических прав на изменение медицинской части визита;
- нет управления лабораторным workflow.
- Клиническое решение и закрытие визита:
veterinarian(илиadministrator). - Утверждение лабораторного результата:
lab_technician(илиadministrator). - Складское списание как отдельное полномочие:
inventory_managerчерезwrite_off_stock. - Финансовые корректировки и закрытие расчетов:
cashier(илиadministrator). - Фронт-офис и запись:
registrar. - Исполнительный медицинский контур:
assistant.
- Войти под админом и открыть
GET /home/administrator/. - Проверить
GET /dashboard/: визиты в работе, критические лабораторные результаты, неоплаченные счета. - Проверить пользователей и роли в
/admin/users/user/и/admin/auth/group/. - Проверить персональные скоупы в
/admin/users/useraccessprofile/. - При изменениях модели доступа выполнить
python src/manage.py bootstrap_rbac. - Проверить эксплуатационные задачи: Celery/Beat/Flower, отчеты, аудит.
- Перед окончанием смены убедиться, что нет незакрытых инцидентов в задачах и уведомлениях.
- Открыть
GET /home/registrar/и проверить очередь на сегодня. - В
GET /owners/new/создать владельца или найти существующего вGET /owners/. - В
GET /pets/new/создать питомца или выбрать существующего вGET /pets/. - В
GET /appointments/new/оформить запись: врач, кабинет, время, длительность. - При прибытии клиента сделать
Check-inвGET /appointments/. - Передать пациента врачу, отслеживать статус записи и визита до завершения маршрута.
- При необходимости оформить документы/вложения в
GET /documents/.
- Открыть
GET /home/veterinarian/и перейти к приему изGET /appointments/. - В карточке
GET /visits/{id}/заполнить жалобы, анамнез, осмотр. - Добавить диагнозы, наблюдения, назначения и процедуры.
- При необходимости создать/обновить лабораторный заказ и клинические документы.
- При госпитализации перевести пациента в
GET /hospitalization/, назначить койку и план. - Контролировать исполнение назначений через
GET /mar/. - Завершить/закрыть визит с учетом клинических и финансовых правил.
- Открыть
GET /home/assistant/и список активных задач. - В
GET /appointments/иGET /visits/{id}/взять в работу назначения врача. - Выполнить заборы и процедурные действия, обновить статусы выполнения.
- В
GET /labs/перевести образцы по этапам обработки. - В
GET /hospitalization/зафиксировать vitals и обновить план госпитальных процедур. - В
GET /mar/отметить факт введения препаратов (GIVEN/SKIPPED/CANCELED). - Проверить, что задачи закрыты или переданы на следующий этап без пропусков.
- Открыть
GET /home/lab_technician/и лабораторное таблоGET /labs/. - Принять заказ и образцы, перевести статусы
LabOrderиSpecimenпо pipeline. - Проверить корректность маркировки/контейнеров и связки с пробирками.
- Внести результаты анализов по тестам.
- Для валидных результатов выполнить утверждение (
approve), включая критические. - При проблемах инициировать повторный забор и уведомить врача через задачи/нотификации.
- Завершить заказ до статуса
DONEи убедиться, что SLA зафиксирован корректно.
- Проверить остатки и движения через API/Admin (
/api/items/,/api/batches/,/api/movements/). - Обновить партии, сроки годности и минимальные остатки.
- Проверить списания по лаборатории и MAR, сверить причины и источники операций.
- Выполнить необходимые корректировки движений/партий.
- Проверить связки расходников с лабораторными пробирками.
- Подготовить оперативный отчет по дефицитам и рискам обеспечения услуг.
- Открыть
GET /home/cashier/и модульGET /finance/. - Найти визит, убедиться, что счет создан, иначе создать новый.
- Проверить и скорректировать позиции счета, применить скидку/правило при необходимости.
- Сформировать и провести счет (
FORMED/POSTED). - Зарегистрировать оплату (полную или частичную).
- При возврате/исправлении провести корректировку платежа.
- Убедиться, что итоговый статус счета и связанного визита корректен.
Точки входа Web UI:
GET /login/GET /home/,GET /home/{role}/GET /dashboard/GET /owners/,GET /owners/new/GET /pets/,GET /pets/new/GET /appointments/,GET /appointments/new/GET /visits/{id}/GET /labs/GET /cabinets/,GET /cabinets/{role}/GET /documents/GET /hospitalization/GET /mar/GET /finance/
- Откройте
http://localhost:8000/login/. - Введите email и пароль сотрудника.
- После входа откроется домашний ролевой экран.
Что дает:
- отдельную стартовую страницу под каждую роль;
- role-specific KPI и списки задач;
- быстрые действия только по доступным разделам;
- переключение между ролями, если пользователь состоит в нескольких группах.
Показывает оперативные метрики:
- приемы за сегодня;
- живая очередь;
- визиты в работе;
- активные лабораторные заказы;
- просроченные задачи;
- последние визиты и лабораторные события.
Что можно делать:
- искать владельцев по имени, телефону, email;
- видеть статус black-list, скидку, предпочитаемый филиал;
- создавать владельца (
/owners/new/).
Поля владельца:
- имя, фамилия, телефон, email;
- скидка;
- black-list;
- адрес и заметки;
- предпочитаемый филиал.
Что можно делать:
- искать по кличке, владельцу,
microchip_id; - создавать карточку животного (
/pets/new/).
Поля животного:
- владелец;
- кличка, вид, порода, пол;
- дата рождения, вес;
- аллергии, вакцинации;
microchip_id(15 цифр, если задан);- страховой номер, статус.
- Укажите владельца и питомца.
- Выберите врача, услугу, филиал, кабинет.
- Укажите время начала и длительность.
- Сохраните запись.
Система автоматически:
- проверяет конфликт по кабинету;
- учитывает требования услуги к типу кабинета и оборудованию;
- выставляет
end_at; - подставляет комнату из кабинета.
Для каждой записи доступны действия (зависит от прав и статуса):
Check-inНачать визитЗавершитьСменить статус(только допустимые переходы)
Стандартные статусы записи:
BOOKEDCHECKED_ININ_ROOMCOMPLETEDCANCELEDNO_SHOW
Доступно:
- изменение клинической части визита:
- жалобы;
- анамнез;
- осмотр;
- summary диагноза;
- рекомендации;
- перевод статусов визита;
- добавление диагнозов;
- добавление назначений;
- добавление процедур;
- просмотр истории событий визита;
- просмотр связанных лабораторных заказов;
- просмотр клинических предупреждений (если есть право).
Стандартные статусы визита:
SCHEDULEDWAITINGIN_PROGRESSCOMPLETEDCLOSEDCANCELED
Функции:
- фильтрация заказов по статусу;
- перевод статусов
LabOrder; - перевод статусов
Specimen; - просмотр неутвержденных результатов;
- утверждение результата (при праве
approve_lab_result).
Типовой pipeline:
LabOrder:PLANNED -> COLLECTED -> IN_TRANSPORT -> RECEIVED -> IN_PROCESS -> DONESpecimen:PLANNED -> COLLECTED -> IN_TRANSPORT -> RECEIVED -> IN_PROCESS -> DONE
- Экран агрегирует доступные рабочие зоны по ролям пользователя.
- Для каждой роли отображаются доступные модули на основе текущих permissions.
- В карточке роли есть отдельная страница с функциональным описанием и быстрыми переходами.
Функции:
- загрузка вложений на уровень визита/пациента/лабораторного заказа;
- типизация (
XRAY,ULTRASOUND,PHOTO,PDF_RESULT, ...); - версионирование документа (замена файла с аудитом);
- генерация PDF по шаблонам (
DocumentTemplate) с JSON payload.
Функции:
- создание госпитализации из визита;
- назначение/перемещение/освобождение койко-места (bed management);
- перевод статусов госпитализации;
- заполнение витальных показателей (vitals);
- планирование и обновление статусов госпитальных процедур.
Функции:
- создание плановых записей медикаментозного введения;
- отметка
GIVEN,SKIPPED,CANCELED; - фиксация фактической дозы/пути введения/отклонений;
- списание со склада по факту введения (при наличии связанного
InventoryItem).
Функции:
- создание счета по визиту;
- добавление и сторнирование позиций;
- формирование/проведение счета;
- применение скидок (правила/промокод);
- регистрация оплат и корректировок (refund/correction);
- автообновление статуса счета и авто-закрытие визита после полной оплаты (по настройке).
- сложные CRM-сценарии массовых коммуникаций;
- расширенный складской контур закупок/поставок;
- специализированные отчеты и экспортные формы.
Ниже перечислены все ключевые блоки системы и что в них можно делать.
- аутентификация сотрудников (session auth);
- ролевой доступ через группы;
- персональный скоуп по филиалам/кабинетам (
UserAccessProfile); - MFA-профили и централизованное администрирование доступа;
- проверка прав на уровне API и Web UI.
- филиалы, кабинеты, койки стационара;
- оборудование и типы оборудования;
- привязка требований к услугам (кабинет/оборудование);
- контроль доступности ресурсов при записи.
- картотека владельцев и животных;
- согласия на обработку персональных данных;
- контактные и клинически значимые атрибуты пациента;
- теги клиентской базы, назначения тегов;
- коммуникации и напоминания (включая отложенный dispatch).
- запись на прием;
- очередь и операционные статусы записи;
- запуск визита из записи;
- ведение клинической карточки визита;
- диагнозы, наблюдения, назначения, процедуры;
- журнал событий визита (
VisitEvent); - контроль допустимых переходов статусов с валидациями.
- справочники диагнозов и симптомов;
- клинические протоколы лечения;
- шаблоны медикаментов и процедур внутри протоколов;
- правила противопоказаний;
- клинические алерты;
- чек-листы процедур и выполнение чек-листов.
- лабораторные заказы и тесты;
- образцы и их жизненный цикл;
- пробирки, маркировка, контейнерные метки;
- события обработки образца;
- результаты анализов с флагами (
NORMAL/HIGH/CRITICAL); - утверждение результатов;
- сценарии повторного забора;
- контроль SLA.
- номенклатура и партии;
- входящие и расходные движения;
- списания по FEFO;
- связка расходных материалов лаборатории с учетом остатков;
- аудит причин списаний и ссылок на источник операции.
- прайс-лист услуг/пакетов;
- инвойсы по визиту;
- строки счета (включая void/storno);
- скидки (правила, промо, owner-scope);
- оплаты разными методами;
- корректировки платежей: возвраты/исправления;
- расчет итогов счета и обновление финансовых статусов.
- клинические вложения и версии файлов;
- политики хранения документов;
- шаблоны документов;
- генерация документов из шаблона с payload;
- контроль доступа к документам по скоупу визита/пациента.
- постановка операционных задач;
- приоритеты, дедлайны, жизненный цикл задач;
- связанные задачи по визиту/лаборатории;
- уведомления пользователям (in-app);
- автоматические триггеры уведомлений из workflow.
- операционные отчеты по приемам;
- лабораторная аналитика по turnaround;
- аналитика расхода и использования материалов;
- финансовая аналитика;
- CSV-экспорт и кеширование отчетов;
- прогрев кеша и планировщик обновления.
- журнал ключевых изменений и операций;
- фиксация API-мутаций и статусных переходов;
- трассировка actor/entity/action для контроля и разбора инцидентов.
- Создать пользователя в Admin или через
/api/users/. - Назначить группу(ы) роли.
- Настроить
UserAccessProfile(филиалы/кабинеты/лимиты). - Проверить вход пользователя в
GET /login/и доступ кGET /home/{role}/.
- Создать филиалы и кабинеты.
- Добавить койки, типы оборудования и оборудование.
- Настроить требования услуг к ресурсам.
- Проверить создание записи на прием без конфликтов ресурса.
- Создать владельца с контактами и согласием.
- Создать карточку животного с клинически значимыми полями.
- Назначить теги клиента.
- Запланировать коммуникацию/напоминание и проверить dispatch.
- Создать запись на прием.
- Выполнить
check-in, затемstart-visit. - Вести визит: диагнозы, наблюдения, назначения, процедуры.
- Переводить статусы только по допустимому workflow.
- Завершить визит и передать его в финансовое закрытие.
- Заполнить справочники диагнозов/симптомов.
- Создать клинический протокол и шаблоны медикаментов/процедур.
- Добавить правила противопоказаний.
- Применить протокол к визиту и проверить алерты/чек-листы.
- Создать
LabOrderпо визиту. - Перевести
SpecimenиLabOrderпо стадиям обработки. - Внести
LabResultValueпо параметрам. - Утвердить результат, проверить авто-нотификации для критических флагов.
- Закрыть заказ в
DONE.
- Создать госпитализацию из визита.
- Назначить койку и фиксировать перемещения.
- Заполнять vitals по графику.
- Вести план госпитальных процедур и статусы выполнения.
- При выписке перевести госпитализацию в финальный статус.
- Создать план медикаментозных введений.
- Фиксировать факт (
GIVEN) и отклонения (SKIPPED/CANCELED). - Указывать дозы, путь введения и комментарии.
- Проверять списания со склада, связанные с фактическим введением.
- Создать номенклатуру и партии с количеством/сроками.
- Проводить входящие и расходные движения.
- Выполнять списания по факту лабораторных/клинических операций.
- Контролировать min stock и формировать заявки на пополнение.
- Создать прайс-позиции.
- Сформировать инвойс по визиту и добавить линии.
- Применить скидку или правило, пересчитать итоги.
- Провести счет и зарегистрировать платеж.
- При необходимости оформить возврат/корректировку.
- Создать шаблоны документов.
- Загрузить клинические вложения к визиту/пациенту/заказу.
- Сгенерировать документ из шаблона и payload.
- Проверить версионность и доступность документа по скоупу.
- Создать задачу, указать приоритет, дедлайн и исполнителя.
- Связать задачу с визитом или лабораторным заказом.
- Контролировать статусы
TODO/IN_PROGRESS/DONE. - Проверить доставку уведомлений и обработку просроченных задач.
- Выбрать отчет (
labs,inventory,appointments,finance). - Указать период
date_from/date_to. - Для актуализации использовать
refresh=true. - Для выгрузки включить
export=csv. - При включенном кеше проверить прогрев через
warm_reports_cache.
- Выполнить тестовую бизнес-операцию (например статусный переход).
- Открыть журнал аудита.
- Проверить поля actor/entity/action и время события.
- Использовать лог для разбора инцидентов и регуляторной отчетности.
- Создать владельца.
- Создать карточку животного.
- Создать запись на прием.
- На стойке регистрации выполнить
Check-in. - Передать пациента врачу/ассистенту.
- Открыть визит из табло приемов.
- Заполнить жалобы/анамнез/осмотр.
- Добавить диагнозы.
- Добавить назначения и процедуры.
- Завершить медицинскую часть и перевести статус визита.
- Открыть лабораторное табло.
- Переводить статусы заказа и образцов по этапам.
- Вносить/проверять результаты.
- Утверждать результаты (при наличии права).
Рабочий путь:
- Открыть
/finance/. - Создать счет по визиту (если еще не создан).
- Добавить позиции и применить скидку при необходимости.
- Сформировать/провести счет.
- Зарегистрировать оплату и, при необходимости, корректировку платежа.
- При полной оплате визит автоматически закрывается (
COMPLETED -> CLOSED, если включена политика).
Основной операционный контур сейчас через API/Admin:
- номенклатура;
- партии;
- движения;
- списания;
- контроль остатков.
Эндпоинты:
POST /api/auth/login/POST /api/auth/logout/GET /api/auth/me/
Пример логина:
curl -X POST http://localhost:8000/api/auth/login/ \
-H "Content-Type: application/json" \
-d '{"email":"admin@pettrace.local","password":"admin123"}'В ответе login возвращается csrf_token.
Для mutating-запросов в session-режиме передавайте CSRF-токен и cookie сессии.
Пользователи и доступ:
/api/users//api/groups//api/user-access-profiles//api/auth/*
Ресурсы клиники:
/api/branches//api/cabinets//api/equipment-types//api/equipment//api/service-requirements//api/service-requirement-equipment/
CRM и пациенты:
/api/owners//api/consents//api/pets//api/attachments//api/crm/tags//api/crm/tag-assignments//api/crm/communications//api/crm/reminders/
Приемы и визиты:
/api/appointments//api/encounters//api/visit-events//api/hospitalizations//api/diagnoses//api/observations//api/prescriptions//api/procedures/
Лаборатория:
/api/orders//api/tests//api/specimens//api/tubes//api/specimen-tubes//api/labels//api/events//api/results/
Клинические протоколы:
/api/clinical/protocols//api/clinical/protocol-medications//api/clinical/protocol-procedures//api/clinical/contraindications//api/clinical/alerts//api/clinical/checklists/
Склад:
/api/items//api/batches//api/movements/
Финансы:
/api/price-items//api/invoices//api/invoice-lines//api/payments/
Задачи и уведомления:
/api/tasks//api/notifications/
Аудит и отчеты:
/api/logs//api/reports/*
Приемы:
POST /api/appointments/{id}/check-in/POST /api/appointments/{id}/start-visit/POST /api/appointments/{id}/complete/POST /api/appointments/{id}/transition/
Визиты:
POST /api/encounters/{id}/transition/POST /api/hospitalizations/{id}/transition/
Лаборатория:
POST /api/orders/{id}/transition/POST /api/specimens/{id}/transition/POST /api/specimens/{id}/mark-collected/POST /api/results/{id}/approve/
Клинический контур:
POST /api/clinical/protocols/{id}/apply/POST /api/clinical/dose-calc/POST /api/clinical/checklists/create-from-template/POST /api/clinical/checklists/{id}/complete-item/
CRM:
POST /api/crm/communications/{id}/dispatch/POST /api/crm/communications/dispatch-due/
Отчеты:
GET /api/reports/labs/turnaround/GET /api/reports/inventory/tube-usage/GET /api/reports/appointments/operations/GET /api/reports/finance/summary/
Параметры отчетов:
date_from=YYYY-MM-DDdate_to=YYYY-MM-DDexport=csvrefresh=true
- При создании
LabOrderавтоматически создается задачаCOLLECT_SPECIMEN. - При переводе
Specimen -> COLLECTEDавтоматически:- создается событие
SpecimenEvent; - закрываются задачи забора при готовности;
- создается задача
LAB_RECEIVE; - выполняется списание пробирок со склада по FEFO через
Tube.inventory_item.
- создается событие
- При
LabResultValue.flag=CRITICALавтоматически создается уведомление врачу. - Противопоказания формируют
ClinicalAlert.
- При полной оплате инвойса визит закрывается автоматически (если это допустимо по статусам).
- SLA лаборатории;
- обработка просроченных задач;
- отправка pending notifications;
- dispatch отложенных CRM-коммуникаций;
- прогрев кеша отчетов (если включен).
Полезные команды Makefile:
make docker-upmake docker-downmake docker-logsmake migratemake makemigrationsmake bootstrap-rbacmake seed-demomake seed-demo-resetmake warm-reports-cache
Скрипт do.py (команды как в демо-ноутбуке):
# показать все команды
python do.py --help
# полный сценарий подготовки демо
python do.py all
# отдельно этапы
python do.py up
python do.py bootstrap
python do.py seed-demo --bulk-cases 240 --days 120
python do.py demo-users
python do.py metrics
python do.py qa
python do.py downСкрипт release.sh (финальный pre-release/prod прогон):
# показать параметры
./release.sh --help
# полный прогон перед отгрузкой (prod-профиль, build, миграции, проверки, smoke)
./release.sh
# прогон с демо-наполнением БД
./release.sh --with-demo-seed --bulk-cases 240 --days 120
# быстрый прогон без тестов/линта
./release.sh --skip-tests --skip-lintКрупное демо-заполнение для презентации:
docker compose run --rm web python manage.py bootstrap_rbac
docker compose run --rm web python manage.py seed_demo_data --reset --bulk-cases 240 --days 120Данные при развертке на сервере:
- Демо-данные не создаются автоматически, если явно не запускать
seed_demo_data. - Данные сохраняются между рестартами контейнеров благодаря named volume
postgres_data. - Данные будут потеряны только при удалении volume (например
docker compose down -v) или очистке БД.
Демо-учетки после сидинга (seed_demo_data):
- Пароль для всех:
pettrace123 registrar@pettrace.localvet@pettrace.localassistant@pettrace.locallab@pettrace.localinventory@pettrace.localcashier@pettrace.local
Команда:
docker compose run --rm web python manage.py seed_demo_data --reset --bulk-cases 240 --days 120Что создается:
- учетные записи сотрудников всех операционных ролей;
- владельцы и карточки животных;
- записи на прием, визиты и история событий;
- диагнозы, наблюдения, назначения, процедуры;
- госпитальные и MAR-данные;
- лабораторные заказы, тесты, образцы, результаты;
- складские остатки, партии, движения и списания;
- прайс-позиции, счета, позиции, оплаты, корректировки;
- задачи и уведомления;
- документный контур для демонстрации вложений и генерации.
Типовая картина данных после сидинга --bulk-cases 240:
- есть завершенные/закрытые и активные приемы одновременно;
- есть частично и полностью оплаченные визиты;
- есть лабораторные заказы в разных статусах, включая
DONE; - есть критические/аномальные результаты для сценариев мониторинга;
- есть складские движения с расходом материалов;
- есть задачи
TODOиDONEдля операционной аналитики.
Пример контрольных метрик, полученных на тестовом прогоне:
owners:241pets:241visits_total:241visits_closed:96visits_completed:48visits_in_progress:49appointments_completed:144lab_done:48invoices_paid:145payments_total:193tasks_total:241
Эти данные достаточно насыщены для демонстрации:
- работы ролевых кабинетов;
- end-to-end сценариев от регистрации до оплаты;
- отчетности и аналитических срезов;
- отказоустойчивости workflow (ошибки/запреты по ролям, статусы, валидации).
- Установите зависимости:
pip install -r requirements/dev.txt- Настройте минимум:
DATABASE_URLREDIS_URLCELERY_BROKER_URLCELERY_RESULT_BACKEND
- Опциональные env-параметры отчетов и CRM dispatch:
REPORTS_CACHE_TTLREPORTS_WARMUP_ENABLEDREPORTS_WARMUP_DAYSREPORTS_WARMUP_INTERVAL_SECONDSCRM_DISPATCH_INTERVAL_SECONDS
- Выполните:
python src/manage.py migrate
python src/manage.py bootstrap_rbac
python src/manage.py bootstrap_facilities
python src/manage.py runserverТесты:
docker compose run --rm web python manage.py test --noinputЛинтер:
docker compose run --rm web ruff check .System checks:
docker compose run --rm web python manage.py checkCI (GitHub Actions):
- workflow:
.github/workflows/ci.yml - запускается на
pushиpull_request - выполняет
ruff check src - выполняет
python src/manage.py test apps --noinput
- CRM:
Owner,Pet,ConsentDocument - Ресурсы клиники:
Branch,Cabinet,EquipmentType,Equipment,ServiceRequirement - CRM-операции:
OwnerTag,OwnerTagAssignment,CommunicationLog,Reminder - Прием:
Visit,Diagnosis,Observation,Prescription,ProcedureOrder - Стационар:
Hospitalization - Клинический движок:
ClinicalProtocol,ProtocolMedicationTemplate,ProtocolProcedureTemplate,ContraindicationRule,ClinicalAlert,ProcedureChecklist* - Лаборатория:
LabOrder,LabTest,Specimen,Tube,ContainerLabel,SpecimenEvent,LabResultValue - Склад:
InventoryItem,Batch,StockMovement - Финансы:
PriceItem,Invoice,InvoiceLine,Payment - Оркестрация:
Task,Notification - Запись/очередь:
Appointment - Аудит:
AuditLog
- Выполните полный билд:
docker compose build
- Поднимите сервис:
docker compose up -d web
- Проверьте статику:
http://localhost:8000/static/frontend/style.cssдолжен вернуть200
- В браузере выполните hard refresh (
Ctrl+F5).
- Проверьте группу пользователя в Admin.
- Проверьте наличие нужного permission в группе.
- Проверьте
UserAccessProfile(филиалы/кабинеты/режимlimit_to_assigned_cabinets). - При необходимости выполните
bootstrap_rbac.
- Проверьте
docker compose logs web. - Убедитесь, что
postgresиredisв статусеhealthy.
Если test DB осталась после аварийного запуска:
- удалите контейнеры/volume тестовой БД или перезапустите
postgres; - затем повторите
python manage.py test --noinput.
PetTrace/
src/
config/
settings/ (base/local/production/test)
urls.py
celery.py
apps/
common/ # базовые абстракции, health check, demo seed
users/ # custom user, RBAC bootstrap, role scope/access profile
frontend/ # server-rendered web UI (dashboard, CRM, visits, labs)
facilities/ # филиалы, кабинеты, оборудование, требования к услугам
owners/ # владельцы, согласия
pets/ # питомцы, microchip_id, qr_token
crm/ # теги клиентов, коммуникации, напоминания
visits/ # Encounter, диагнозы, назначения, процедуры
clinical/ # протоколы лечения, противопоказания, предупреждения и чек-листы
labs/ # LabOrder, Specimen, Tube, events, results
inventory/ # номенклатура, партии, движения остатков
billing/ # прайс, счета, оплаты
tasks/ # внутренние задачи и уведомления
audit/ # аудит действий и middleware
reports/ # операционные и финансовые отчеты (KPI)
docker/
scripts/entrypoint.sh
nginx/default.conf
requirements/
docker-compose.yml
Dockerfile
- Углубленный UI для склада/закупок и CRM-коммуникаций.
- Интеграции анализаторов (CSV/HL7/вендорные адаптеры).
- Печатные формы и PDF-шаблоны.
- SLA/KPI дашборды для операционного управления.
- Многофилиальность с объектной изоляцией данных.