Commit Graph

107 Commits

Author SHA1 Message Date
lokses 982c7e6203 mattermost: возможности бота галочками вместо одной роли
Бот больше не привязан к единственной role (unique). Вместо неё три флага-
галочки: can_provisioning / can_channels / can_tasks — можно совмещать.
get_active(role) ищет активного бота с соответствующей галочкой.

- модель: убран role, добавлены 3 boolean, get_active/caps по флагам;
- миграция 0006: перенос старой role в галочки, затем удаление role;
- админка: чекбоксы «Возможности бота»;
- команда create_mattermost_bot: --role включает нужную галочку (username-based upsert).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 20:27:09 +03:00
lokses e885e2924b core: команда авто-очистки (cleanup)
manage.py cleanup [--days N] [--dry-run] — удаляет устаревшие журналы
синхронизации (AD/Carbonio/Nextcloud/Mattermost), просроченные инвайты
паролей и истёкшие сессии. Бизнес-данные не трогает. Срок хранения —
settings.CLEANUP_LOG_RETENTION_DAYS (default 90, env-override). Запуск по cron.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 16:44:25 +03:00
lokses c54a3b316a mattermost: журнал синхронизации (как у AD/Carbonio/Nextcloud)
- модель MattermostSyncLog (employee/action/status/message) + read-only админка;
- запись при добавлении в команды/каналы (успех и ошибка) в sync_service;
- пункт «Журнал Mattermost» в меню рядом с прочими журналами.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 16:40:08 +03:00
lokses dd1a31b4dd admin: полное и упорядоченное меню сайдбара (UNFOLD)
Навигация покрывает все админки (55 пунктов в 11 группах): Сотрудники,
Найм, Структура компании, Учёт посещений, IT-отдел, Эксплуатация (РРО/
счётчики/энергоактивы), Отчёты, Лента и задачи, База знаний, Mattermost
(вкл. Боты), Интеграции и настройки. Все ссылки проверены на reverse.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 16:32:44 +03:00
lokses 704d5d9538 mattermost: синхронизация команд/каналов по типу локации
Добавлен фильтр по user_location_type (Аптека/Склад/Офис) в TeamSyncSettings
и ChannelSyncSettings — наряду с фильтром по отделам. При включении обоих
фильтров условия объединяются по AND.

- поля filter_by_location_type + location_types (ArrayField, чекбоксы в админке);
- логика add_user_to_teams/channels учитывает тип локации;
- django.contrib.postgres в INSTALLED_APPS (для ArrayField).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-16 16:17:16 +03:00
lokses 32ad359879 Publish IT monthly as editable Word; fix staff order and zones.
Form Word draft for OnlyOffice, publish the file to unlock the month; roster is head-first then by name with Employee responsibility zones.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-14 15:54:38 +03:00
lokses 598d26c52c Show employee login only to self and portal admins.
Managers and HR keep contact PII but no longer see usernames.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-14 15:25:02 +03:00
lokses bf5310e489 Hide peer logins on profiles and restrict view_all to published reports.
Login stays visible only to self/manager/HR; draft report docs stay department-head only.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-14 15:20:49 +03:00
lokses 555dbfb157 Add Word/Excel upload and draft/publish for department report docs.
Managers can upload files as drafts; members only see published documents.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-14 15:00:27 +03:00
lokses 31eecb5001 Count IT infra work as remote in monthly report stats.
Infra/leadership channel no longer looks like on-site visits; labels clarify remote-only infrastructure.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-14 14:17:08 +03:00
lokses f0a23caa7b fix permisions 2026-09-14 14:09:37 +03:00
lokses f46e0d90ba FIX PAGES AND ADD PASSWORD CHANGE 2026-09-11 14:51:55 +03:00
lokses f061c8f95b Email client fix 2026-09-11 14:27:39 +03:00
lokses 166a0bea71 Email client fix 2026-09-11 14:23:07 +03:00
lokses ea96c7a2ab mail: корректный парсинг UID из ответа FETCH
Извлекаем UID регуляркой `UID (\d+)` вместо хрупкого split — прежний код
давал нечисловой/пустой uid (`456 FLAGS (\Seen`), из-за чего открытие письма
падало (UID FETCH с битым аргументом). Записи без UID пропускаем.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-11 14:10:25 +03:00
lokses 6935ee2d59 mail: не падать 500 при битом uid / IMAP BAD
- fetch_message валидирует uid (только цифры) → иначе «Лист не знайдено»
  вместо malformed UID FETCH (сервер отвечал BAD zero-length content).
- _with_imap ловит imaplib.IMAP4.error/OSError → страница /email/ отдаёт
  connection_error, а не 500.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-11 14:06:17 +03:00
lokses b19dc8b129 Измение дизайна документов 2026-09-11 13:51:39 +03:00
lokses b730255654 Измение дизайна документов 2026-09-11 13:36:07 +03:00
lokses 2092f096a0 Измение дизайна документов 2026-09-11 13:29:18 +03:00
lokses 999cc0f5c5 nextcloud/onlyoffice: доработка редактора и браузера документов
- правки onlyoffice.py/views.py/webdav_service.py под callback/контент и ключи;
- blank_office перенесён в nextcloud_connector (генерация пустых Word/Excel);
- documents.js + обновление шаблонов браузера/редактора/карточки документов;
- тесты коннектора расширены.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-11 13:06:34 +03:00
lokses 6f299890d2 fix: таймзона Europe/Kiev → Europe/Kyiv
В свежей tzdata (Debian 13 / Python 3.13) старое имя Europe/Kiev удалено,
Django 6 отвергает его (ValueError: Incorrect timezone setting). Переименовано
во всех местах, включая дефолты Mattermost-таймзоны.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-10 17:11:14 +03:00
lokses 2781a6e2b8 reports: документы отдела с правкой через OnlyOffice
- ReportDocument (+ миграция 0005): файлы отдела в Nextcloud (06_Отчёты).
- blank_office.py: генерация пустых Word/Excel для новых документов.
- documents.py: доступ/путь/создание, права view/edit по отделу.
- редактор OnlyOffice учится открывать report_doc (view/edit).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-10 16:48:08 +03:00
lokses 83ebf8f12a deps: чистый requirements.txt + недостающие рантайм-зависимости
- pyotp, qrcode — были не указаны, но нужны для 2FA (twofa.py); на чистом
  проде без них 2FA бы не поднялась.
- defusedxml, fonttools, pyasn1, typing_extensions — транзитивные (fpdf2/ldap3).
- gunicorn сохранён.

Список сверен с венвом проекта; системный мусор Fedora (pip freeze не того
интерпретатора) сюда не попадает.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-10 16:48:08 +03:00
lokses 03fe40cc26 Merge pull request 'Add configurable pharmacy card tab visibility matrix.' (#2) from cursor/pharmacy-card-visibility into main
Reviewed-on: #2
2026-09-10 16:19:26 +03:00
lokses f7f78f20fd reports: список отчётов со статусом публикации
report_list_rows() строит строки хаба /reports/ (отчёт, отдел, период,
статус: опубликован/черновик/нет публикаций) — обновлён шаблон и тесты.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-10 13:26:58 +03:00
lokses 3812098970 docs: мануал развёртывания в прод
Полная первичная установка на боевой сервер (LXC за Traefik, gunicorn,
nginx, PostgreSQL, Redis c requirepass, Celery worker+beat), настройка
интеграций (Mattermost/Nextcloud/OnlyOffice/почта/AD/PNMS-PVMS-MSorter),
бэкапы, обновление и типичные грабли. Дополняет перенос-на-прод.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-10 13:25:45 +03:00
lokses 3ce3536e37 core: миграция extra_config для конфига OnlyOffice-коннектора
Догенерённая миграция под правку поля ConnectorConfig.extra_config.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-10 13:19:48 +03:00
lokses 8db8f59d2f core: индивидуальные гранты отчётов в группах пользователей
Выдача/отзыв права на отчёты по всем отделам конкретному сотруднику
из портала управления группами.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-10 13:17:41 +03:00
lokses 4d4537deff reports: публикация отчётов и право управления
- Публикация отчёта (модель ReportPublication + миграция, сервис publication).
- Разделение прав: user_can_manage_it_monthly_report (правка) vs view;
  reports.view_all_departments в списке портальных прав.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-10 13:17:41 +03:00
lokses f41fefbaa7 nextcloud/onlyoffice: тип коннектора и UI редактора
- ConnectorConfig(onlyoffice) + миграция, подсказка по extra_config в админке.
- /documents/onlyoffice/ в whitelist 2FA — Document Server забирает файл
  без сессии портала (доступ по подписанному file-token + JWT DS).
- Страница редактора и кнопки «открыть в OnlyOffice» в браузере документов.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-10 13:17:41 +03:00
lokses 5f62662e12 nextcloud/onlyoffice: проверка JWT от Document Server, SSRF-guard, версионный ключ
- verified_ds_payload: HS256-проверка входящего JWT; status/url берём только
  из верифицированного payload (было — из сырого тела).
- is_allowed_ds_download_url + follow_redirects=False: сохранённый файл
  качаем только с хоста Document Server (SSRF-защита).
- document_key по size/modified (WebDAV stat) — DS больше не отдаёт
  устаревшую версию из кэша.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-10 13:16:27 +03:00
lokses 5c3c27e0af help + ad_connector + feed: база знаний и правки тестов
Раздел «Справка» (категории/статьи/предложка), правки ad_connector
и обновление тестов feed под обязательную 2FA.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-09 18:03:55 +03:00
lokses a35be94996 portal_connector: синхронизация PNMS/PVMS/MSorter
Клиенты и билдеры payload'ов, сервисы и Celery-задачи push identity/данных
во внешние порталы, HTTPS-guard в проде.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-09 18:03:55 +03:00
lokses 0a9fcce0cd mail_connector: IMAP/SMTP-клиент и почтовая аутентификация
Клиенты IMAP/SMTP, авторизация по почте, настройки и login-хуки,
страница почты.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-09 18:03:55 +03:00
lokses 16bf2cf1c7 эксплуатация: показания счётчиков, энергоактивы и РРО
Конфиг счётчиков и день/ночь-тарифы, учёт энергосистем (генераторы,
инверторы), доступ к разделу РРО/ПРРО.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-09 18:03:44 +03:00
lokses 3e969e29dc visit_manager: события календаря
Модель и сервис событий календаря, вью и страница календаря.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-09 18:03:44 +03:00
lokses 0da9c13192 it_manager+reports: иерархия договоров, биллинг и месячные отчёты
Иерархия рамочных/дочерних договоров и платежей, интернет-биллинг,
месячные IT-отчёты (импорт, DOCX/PDF, шаблоны выводов).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-09 18:03:44 +03:00
lokses 897ffc99c9 locations: право редактирования аптеки, формы и дислокация
Отдельное право на редактирование карточки аптеки, формы, пресеты колонок
дислокации и правки видимости карточки.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-09 18:03:32 +03:00
lokses ac0418083b hiring: вакансии и найм, HR-портал
Модель вакансий, флоу рекрутинга и панели HR-портала (заявки/вакансии).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-09 18:03:32 +03:00
lokses 3359a8db13 employees: HR-заявки, приглашения на пароль, профиль и 2FA
Модель/сервисы HR-заявок с заменами, приглашения на установку пароля
(инвайты), обновлённая страница профиля сотрудника и правки 2FA.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-09 18:03:32 +03:00
lokses ae54d93442 core: секции портала, контроль доступа и вью страниц
Section-based portal access, matrix прав по группам, аккаунтинг-портал,
управление группами пользователей, справочники, дашборд и общий каркас
навигации/стилей.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-09 18:03:20 +03:00
lokses 719d0b737b infra: надёжное обнаружение тестов, Redis-кэш и хардненинг прода
- AcoreDiscoverRunner собирает tests/tests_* всех локальных приложений
  (manage.py test находил 38 тестов из ~466 — теперь все).
- CACHES на Redis (отдельная DB от Celery) + обязательный requirepass
  в production, SECURE_HSTS_PRELOAD.
- Фикс stored-XSS в админке: format_html вместо mark_safe + f-string.
- Утилиты безопасности/тестов, шифрование полей.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-09 18:03:11 +03:00
lokses 70e5a77b04 Harden portal access and hiring, add RRO portal CRUD.
Remove the is_staff permission bridge, tighten intern credential handling with one-time PDFs and random seed passwords, and let staff manage cash registers from the portal.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-10 08:54:41 +03:00
lokses 56e2b1c8fe Add configurable pharmacy card tab visibility matrix.
Let admins set per-section access levels so operational data on pharmacy detail is no longer all-or-nothing for every logged-in user.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-09 20:43:33 +03:00
lokses ae5c1f1848 Add RRO, portal section perms, dislocation presets, and hiring intern flow.
Ship cash-register registry, section-based portal access, configurable dislocation columns, and trial-hire intern accounts with credentials PDF.
2026-08-09 14:58:17 +03:00
lokses 237275abd0 docs: перенос — AD ещё не подключён, из коннекторов реально настраивается только Mattermost
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 11:27:21 +03:00
lokses 891199f3c9 docs: мануал по переносу данных test → prod
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 22:07:13 +03:00
lokses 8de1ffaa34 i18n: перевод страницы чата (ru база, uk/en)
- Шаблон chat.html → русская база с {% trans %}/{% blocktrans %}
- JS-строки chat.js → gettext() + JavaScriptCatalog (/jsi18n/), подключён
  в index.html; защитный fallback если каталог не загрузился
- Переводы uk/en для обоих доменов (django + djangojs), скомпилированы
- makemessages заодно извлёк непереведённые строки прошлых фич (2FA,
  nextcloud, документы) — оставлены пустыми (рендерятся на базовом ru)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 22:00:35 +03:00
lokses 6a833413d2 Чат: закрытые ЛС прячем по настройкам Mattermost, а не по delete_at
ЛС/групповые в Mattermost не архивируются (delete_at=0) — «закрытие» это
пользовательская preference (direct_channel_show/group_channel_show = "false").
Тянем /users/me/preferences и скрываем именно закрытые пользователем разговоры
по умолчанию; галочка «Показувати закриті розмови» их показывает. Архивные
каналы (delete_at>0) по-прежнему учитываются.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 21:41:26 +03:00
lokses 5181c2f2ab Чат: поиск сверху, метка бота в списке ЛС, галочка закрытых разговоров
- Строка поиска перенесена наверх страницы (над всем чатом), результаты
  по-прежнему открываются в области сообщений
- В списке ЛС у собеседников-ботов рядом выводится метка «бот»
- Закрытые/архивные разговоры (delete_at>0) скрыты по умолчанию, показываются
  только по галочке «Показувати закриті розмови» (тянем include_deleted=true)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 21:36:18 +03:00