155 Commits

Author SHA1 Message Date
lokses fcaf8b85c8 nextcloud: публичные RO-ссылки на документы аптек; аптеки больше не на Group Folders.
Нужен внешний (без входа в ACORE) read-only доступ к документам аптеки —
для сторон вроде поставщиков/проверяющих. Для сотрудников внутренний доступ
уже был (access.can_access_pharmacy_docs через виджет портала), это отдельный,
внешний путь.

- NextcloudSharingService — клиент OCS Files Sharing API (публичные ссылки,
  идемпотентно: сначала проверяет существующую шару на путь, не плодит дубли).
- webdav_service.ensure_dir() — идемпотентный MKCOL (в отличие от mkdir(),
  который должен падать на дубликате — так и оставлен для UI).
- PharmacyPublicLink — аптека ↔ URL + share_id (для последующего отзыва/
  обновления).
- sync_service.sync_pharmacy(): больше не использует Group Folders (аптечные
  сотрудники учёток Nextcloud не имеют — ACL по AD-группам тут не нужен,
  это была подготовка под LDAP, которая пока не горит). Теперь — обычная
  WebDAV-папка под сервисным аккаунтом + публичная RO-ссылка. Попутно чинит
  сегодняшний блокер: --pharmacies-only больше не зависит от сломанного (404)
  Group Folders API — клиенты в NextcloudSyncService стали ленивыми.
- Отделы (sync_department) не тронуты — Group Folders/LDAP остаётся
  архитектурным заделом на будущее, не нужно прямо сейчас.

Тесты: SharingServiceTests, SyncPharmacyPublicLinkTests (идемпотентность,
обновление URL, обработка ошибок WebDAV, dry-run). 326 тестов в затронутых
приложениях — зелёные.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-11-02 23:13:58 +02:00
lokses 9fb33be6b2 security(api): rate limiting, constant-time токены, без утечки ошибок
По аудиту маршрутов (OWASP API):
- DRF throttling: глобально UserRateThrottle 120/min; attendance-register —
  ScopedRateThrottle 30/min, photo — UserRateThrottle. Анти-DoS/абьюз.
- Mattermost-вебхуки (slash + interactive): сверка токена через
  hmac.compare_digest (constant-time) вместо '!='
- /api/attendance/register: PvmsClientError больше не уходит клиентом —
  детали в лог, ответ общий ('Сервис учёта временно недоступен')
- /set-password/<token>: мягкий IP-троттл только на НЕвалидные токены
  (легитимный валидный токен не блокируется)

Тесты: throttle attendance → 429; вебхук отклоняет неверный/пустой токен;
set-password троттлит невалидные, пропускает валидный. 801 тест, 0 провалов.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-11-01 20:42:35 +02:00
lokses 2a350f7301 security: устранение двух Stored XSS (JSON в <script>) + харднинг
Аудит по OWASP: найдены и исправлены два Stored XSS класса «json.dumps|safe
в <script>» — вырыв из тега через </script> в пользовательских данных.

- OnlyOffice-редактор (documents-editor): имя файла (title) выводилось как
  var cfg = {{ editor_config|safe }} → перешли на |json_script
- РРО (rro.html): поля реестра (notes/model_name/...) в <script
  application/json> → |json_script; из view убран ручной json.dumps
- safe_filename: отсекает < > : " | ? * и управляющие символы (defense-in-depth)
- SECURE_CONTENT_TYPE_NOSNIFF = True

Тесты: XSS-пэйлоад </script> в имени файла и в поле РРО экранируется;
safe_filename отклоняет HTML-опасные символы. Прогон: 791 тест, 0 провалов.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-11-01 16:39:30 +02:00
lokses 59377b24ab it_manager/portal: импорт инвентаря аптек + складские POS-права
- it_manager: модуль импорта инвентаря аптек (inventory_import.py),
  management-команда import_pharmacy_inventory, тесты и фикстура
  pharmacy_inventory.json
- portal_connector: POS-права склада (builders, pos_permissions) + тесты
- core: seed-миграция 0027 — права WMS группе «Сотрудник склада»
- it_manager: фикстура aliases-bad.json для теста report-import

check чист; тесты инвентаря и portal_connector зелёные.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-11-01 16:04:04 +02:00
lokses 5fa9fede82 tests: актуализация под телефонию и форматирование телефона
- EmployeeAdminPasswordTests: форма требует internal_line_type (поле
  телефонии, у модели default=ANALOG) — добавлено в данные формы
- EmployeeDetailTests: в чужой карточке телефон отображается
  форматированным (format_ua_phone_display) — проверка обновлена

Полный прогон (.venv): 788 тестов, 0 провалов.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-11-01 15:47:09 +02:00
lokses 1215655569 projects: полное редактирование проекта и форма добавления шага по кнопке.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-23 17:58:03 +03:00
lokses 827140b5a5 projects: редактирование шаблонов, блочное добавление шагов и смена порядка.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-23 17:48:03 +03:00
lokses 5b16d6edd4 projects: убрать отдел шага по умолчанию — отдел только у задач.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-23 17:29:40 +03:00
lokses 18cabe0e63 projects: деревовидный выбор отделов вместо плоского списка.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-23 17:18:37 +03:00
lokses 7da277b9ab projects: popup создания и шаблоны с блоками шагов на странице.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-23 17:09:52 +03:00
lokses 18cb33dc1d projects: отдел на уровне задачи внутри шага.
В одном шаге можно назначать задачи разным отделам (админка и «Отдел | задача»).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-23 16:59:33 +03:00
lokses 030bbc98fd projects: модуль проектов с шагами по отделам и Task.
Шаблоны/ручное создание, access_projects, сид «Открытие аптеки». Плюс SILO/S3 для Django media.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-23 16:26:45 +03:00
lokses 69ae14f65e documents: права view/edit_all_documents для группы и сотрудника.
Чтобы на портале можно было выдать доступ ко всем документам так же, как к отчётам всех отделов.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-23 14:04:51 +03:00
lokses 50825ce505 telephony: скрыть книгу и пропущенные, пока модуль не готов.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-15 13:41:53 +03:00
lokses 81a93bfb38 telephony: телефонная книга и история пропущенных через AMI.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 16:48:02 +03:00
lokses 6a9fbdf6a7 telephony: Originate и статус линии под диалплан MikoPBX.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 15:58:03 +03:00
lokses 8b6924ffd1 telephony: Originate через Local и запасной набор 380 при отсутствии 050.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 15:46:52 +03:00
lokses 9117140d6d telephony: показывать ошибку звонка в тосте, а не глухой 400.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 15:40:36 +03:00
lokses 68752231d6 telephony: клик по мобильному и статус трубки через AMI.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 15:29:11 +03:00
lokses 5f3660ff15 telephony: принимать AMI Pong и не путать ping с событиями.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 15:16:57 +03:00
lokses 839eb9aad0 telephony: ping AMI не падает 500 при таймауте и plaintext на 5038.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 15:11:32 +03:00
lokses 5d06d4d3ce telephony: автоформат +380, тип линии SIP/АТС и звонок через Asterisk AMI.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 14:52:09 +03:00
lokses cc62324b69 docs: не дублировать папки своего отдела в «Дополнительно доступно».
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 13:34:08 +03:00
lokses 87bb98d097 it: не дублировать списки аптек и сотрудников в каждом ряду оборудования.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 13:23:47 +03:00
lokses 4e1d5f221e ui: заменить оставшиеся боковые панели на центрированные popup.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 13:12:21 +03:00
lokses 31dd3b4ffc fix: ссылки в админку ведут на /acore-a-panel/, а не на /admin/.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 11:57:23 +03:00
lokses 24f9e54283 hr: различать штат и договор ЦПХ у сотрудника и в заявке на найм.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 11:46:17 +03:00
lokses a3356cdd90 it: каталог моделей в popup и возврат к добавлению экземпляров.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 11:41:22 +03:00
lokses f2e9129a77 it: формы добавления оборудования и выполненной работы в popup.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 11:32:32 +03:00
lokses 07b4c69d14 pharmacies: вкладки в popup редактирования и точка на карте для координат.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 11:16:11 +03:00
lokses 045171275e pharmacies: popup редактирования со списка и выгрузка аптек в Excel.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 11:00:10 +03:00
lokses c0b9cf12f7 tasks: форма создания задачи в popup вместо раскрывающегося блока.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 22:35:52 +03:00
lokses 45d668a675 hr: форма найма в popup-мастере из трёх шагов.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 22:22:13 +03:00
lokses 7b04ca7477 hiring: спрашивать ИНН в заявке на найм для фоторегистратора.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 17:29:31 +03:00
lokses e3154f8118 ad: DnD дерева OU, очередь сопоставления переименованных учёток и simple bind без NTLM/MD4.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 17:04:50 +03:00
lokses 456af4a836 ad/mattermost: сопоставление и OU в админке, доступы к командам и каналам по отделам и группам.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 13:58:36 +03:00
lokses b4876c4efd it_manager: настраиваемое содержимое QR в шаблоне этикетки.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 17:24:05 +03:00
lokses 620f4016da it_manager: показывать текст на этикетке даже если в шаблоне только QR/EAN.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 17:09:07 +03:00
lokses 22085219c3 it_manager: автоинв. № EAN-13 и фиксация мм в печати шаблона.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 17:03:38 +03:00
lokses c87911ee55 it_manager: исправить загрузку layout и drag в редакторе этикеток.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 16:51:16 +03:00
lokses d54f6fbe42 it_manager/locations: редактор шаблона этикеток, раздельная печать QR/EAN и карточка поставщика.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 16:40:48 +03:00
lokses 82ad90c661 it_manager/locations: этикетки QR/EAN-13 и вкладка сервисов в дислокации.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 16:18:41 +03:00
lokses f4737155c5 locations: тип «Сервис / поставщик» для Вайтер Юг и аналогов.
Выбор в журнале работ и код объекта в it_monthly; сид Вайтер Юг.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 15:56:19 +03:00
lokses c78c1de2a1 it_manager: показывать закрытые аптеки в селектах локаций.
В журнале работ нужны закрытые объекты; в подписи — пометка [Закрыта].

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 15:43:31 +03:00
lokses 777de2adea it_manager: сортировка локаций по коду и полный список в селекте.
Аптеки А1…А70/П… вместо сортировки по адресу; убрать лимит 50 в searchable-select.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 15:39:56 +03:00
lokses a85747f13d it_manager: смена типовой работы и удаление в журнале.
Руководитель может менять catalog_work в таблице и удалять записи.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 15:14:40 +03:00
lokses f3dcf35bf8 it_manager: поправить алиасы картриджей и доставки.
Убрать ошибочную привязку логистики к «Подготовка ПК для нового сотрудника».

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 15:09:12 +03:00
lokses 1e9d036a10 it_manager: не слушать чужие select в фильтрах оборудования.
change from:select перехватывал фильтр сотрудника и форму работ — сброс на вкладку оборудования.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 15:03:38 +03:00
lokses cbca9372c3 reports: убрать дубль типовой работы в systems it_monthly.
Показывать только имя системы и описание, как в report-tool.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 14:56:26 +03:00
lokses 6c2bc1734c reports: сворачивать ежедневные работы в it_monthly.
Одинаковая типовая работа на объекте ≥15 дней уходит из таблицы в блок systems.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 14:53:18 +03:00