Co-authored-by: Cursor <cursoragent@cursor.com>
9.5 KiB
ACORE: описание проекта и связей
Этот документ можно передать как стартовую архитектурную справку для другого проекта. Он описывает текущую структуру ACORE и показывает, как организованы доменные связи.
1. Назначение проекта
ACORE — Django-проект для управления сетью аптек. Основные сценарии:
- учет сотрудников и их оргструктуры;
- учет аптек и геолокаций;
- справочники организаций, отделов, должностей, регионов;
- интеграции (Mattermost, Active Directory, почта, портал);
- отображение данных в админке и web-интерфейсе.
2. Технологический стек
- Python + Django
- Django ORM
- Django Admin (кастомизированный)
- Веб-портал: server-rendered HTML + HTMX (shell
templates/index.html, partials черезcore.utils.htmx.render_page) - Много приложений в папке apps
- SQLite в текущей локальной среде
Подробнее про выбор фронтенда и границы с PHMS / VisitManager Client:
docs/htmx-portal-architecture.md.
3. Модульная структура
- acore: конфигурация проекта, URL и настройки
- core: базовые модели, справочники, общие view и утилиты
- apps/employees: сотрудники, права, сериализация и админка
- apps/locations: локации и аптеки
- apps/visit_manager: расписания и посещаемость
- apps/mattermost_connector: интеграция Mattermost
- apps/ad_connector: интеграция Active Directory
- apps/mail_connector, apps/mailparser, apps/portal_connector: интеграционные модули
4. Ключевые доменные сущности
4.1 База
- BaseModel (core.models.base):
- uuid, created_at, updated_at
- используется как абстрактная база для большинства сущностей
4.2 Справочники
- DirectoryType (core.models.directories): тип справочника
- Directory (core.models.directories): универсальный элемент справочника (иерархический)
Типичные значения DirectoryType:
- organization
- department
- post
- region, district, city, city_district
Directory используется как единая точка для:
- организаций;
- отделов;
- должностей;
- региональной структуры;
- других классификаторов.
4.3 Локации и аптеки
- Location (apps.locations.models.base): базовая географическая сущность
- связь на Directory (location_region)
- тип локации: pharmacy, warehouse, office
- Pharmacy (apps.locations.models.pharmacies): наследник Location (multi-table inheritance)
- organization -> Directory (organization)
- head_pharmacist -> Employee (AUTH_USER_MODEL)
- уникальность: organization + pharmacy_number
- PharmacyPhone:
- pharmacy -> Pharmacy (1:N)
- PharmacyHistory:
- pharmacy -> Pharmacy (1:N)
- changed_by -> Employee (AUTH_USER_MODEL)
4.4 Сотрудники
- Employee (apps.employees.models.base): кастомный пользователь
- user_organization -> Directory (organization)
- user_pharmacy -> Pharmacy
- department -> Directory (department)
- post -> Directory (post)
- manager -> Employee (self FK, иерархия руководитель-подчиненный)
- PermissionGroup (apps.employees.models.permissions): профиль для auth.Group
- EmployeePermissionOverride:
- employee -> Employee
- permission -> auth.Permission
5. Связи между модулями
- core.Directory и core.DirectoryType являются центральным справочным слоем
- locations.Pharmacy использует Directory для организации и региона
- employees.Employee использует:
- Directory для организации, отдела и должности
- Pharmacy для привязки сотрудника к аптеке
- core.views строит страницы, агрегируя Employee, Pharmacy и Directory
- employees.admin и locations.admin подключают visit_manager для связанных inlines и мониторинга активности
6. Поток данных (упрощенно)
- Справочники (DirectoryType/Directory) формируют допустимые значения.
- Создаются Location и Pharmacy с привязкой к организации и региону.
- Создаются Employee с привязкой к организации/аптеке/отделу/должности.
- Интерфейс (core.views + templates) выводит агрегированные данные и фильтры.
- Интеграторы (Mattermost/AD/почта/портал) синхронизируют внешние системы.
7. Маршрутизация и портальный UI
Главные URL находятся в acore/urls.py:
- административный интерфейс;
- страницы dashboard, employees, pharmacies и другие;
- подключение маршрутов приложения employees;
- JSON API посещаемости (
apps.visit_manager.api) для edge-клиента.
Портал:
- полный ответ =
index.html+ вложенныйpages/...; - HTMX-запрос (
HX-Request: true) = только фрагментpages/...; - секции и права —
core.portal_sections/ матрица доступа портала.
7.1 Границы внешних систем
- ACORE — основной веб-портал и source of truth (сотрудники, аптеки, справочники, IT/HR UI, выдача прав).
- PVMS — сервер учёта рабочего времени (при SoT — источник посещаемости); в портале анализ через
/timetrack/(access_timetrack), тонкие праваcan_view_attendance/can_manage_schedulesсинхронизируются в PVMS. - VisitManager Client (отдельный репозиторий, Rust/egui) — kiosk/камера/сканер; не веб-фронт ACORE; регистрация визитов через API.
- PHMS (и родственные порталы) — внешний контур; связь через API/SSO/deep-link, без общего SPA и без HTML-скрейпинга.
- Сложный интерактив внутри ACORE (DnD, печать, canvas) — точечный JS рядом с partial, без обязательного React/Vue.
8. Что перенести в другой проект
Если создавать похожий проект, рекомендуется сохранить такой каркас:
- Единая модель справочников (DirectoryType + Directory) для всех классификаторов.
- Базовая абстрактная модель (BaseModel) с uuid и аудит-полями.
- Разделение на доменные приложения:
- people (сотрудники и права)
- locations (локации и объекты)
- integrations (внешние коннекторы)
- Наследование для локаций:
- общий Location
- специализированные типы (Pharmacy, Warehouse и т.д.).
- Явные внешние ключи на справочники вместо жестко зашитых enum-значений.
9. Краткий шаблон для нового проекта
Название проекта:
Цель:
- <Ключевая бизнес-цель>
Контексты:
- Справочники
- Локации/объекты
- Сотрудники
- Интеграции
Базовые модели:
- BaseModel
- DirectoryType
- Directory
Основные сущности:
- Location
- Employee
Ключевые связи:
- Employee -> Directory (organization/department/post)
- Employee ->
- -> Directory (region/organization)
Технические решения:
- Django apps по доменным контекстам
- Сервисный слой интеграций
- Единые правила валидации и аудита
- HTMX-портал (shell + partials), внешние клиенты — по API
10. Итог
Текущий ACORE построен вокруг четырех опор:
- универсальные справочники;
- доменные модели сотрудников и аптек;
- интеграционные коннекторы;
- HTMX как фронтенд основного портала (edge/PHMS — отдельные клиенты + API).
Такая структура хорошо переносится в другой проект с минимальными изменениями доменной модели.