Commit Graph

50 Commits

Author SHA1 Message Date
lokses 4e1d5f221e ui: заменить оставшиеся боковые панели на центрированные popup.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 13:12:21 +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 bc3f3e29c8 hr: в мастере найма сначала место, затем кандидат и доступы.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 22:27:07 +03:00
lokses 45d668a675 hr: форма найма в popup-мастере из трёх шагов.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 22:22:13 +03:00
lokses b4876c4efd it_manager: настраиваемое содержимое QR в шаблоне этикетки.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 17:24:05 +03:00
lokses 22085219c3 it_manager: автоинв. № EAN-13 и фиксация мм в печати шаблона.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 17:03:38 +03:00
lokses f381d692dd it_manager: одна кнопка печати этикетки по шаблону.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 16:57:59 +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 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 31bd4c8fa7 it_manager: справочник типовых работ в журнале WorkLog.
Категория/работа/required_details вместо свободного work_type; seed Directory, отчёт и тесты.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 13:38:07 +03:00
lokses 03019898b0 reports: КЕП-подпись PDF отчётов; задачи: загрузка вложений.
Добавлена офлайн/EndUser-подпись «ознакомлен и принял в работу» для документов отчётов и файловые вложения к задачам через Nextcloud.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-06 21:13:28 +03:00
lokses 0424e0273e documents: вкладка «Мой отдел» и drag-and-drop загрузка в список.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-06 18:02:04 +03:00
lokses a25e98413c documents: предпросмотр PDF/JPEG во всплывающем окне.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-06 17:43:10 +03:00
lokses c543ef6567 chat: разрешить отправку поста только с файлами, без текста
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-22 13:27:18 +03:00
lokses bc04162a31 chat: брать CSRF из hx-headers — HttpOnly cookie ломала POST /chat/api
Иначе Django отдавал 403 на /users/ids, posts, channels/direct и т.п.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-22 13:00:31 +03:00
lokses 4c2984a81e chat: same-origin /chat/api proxy вместо прямого CORS к Mattermost
Браузер больше не ходит на chat.* с portal.* — REST идёт через Django с PAT;
WS backoff без бесконечных 403; utilities.js ждёт DOMContentLoaded.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-22 12:53:04 +03:00
lokses fe463c11af chat: вызывать chatInit после HTMX-перехода
Без этого список каналов зависал на «Загрузка…» при открытии чата из меню.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-22 12:45:34 +03:00
lokses f46e0d90ba FIX PAGES AND ADD PASSWORD CHANGE 2026-09-11 14:51:55 +03:00
lokses b19dc8b129 Измение дизайна документов 2026-09-11 13:51:39 +03:00
lokses b730255654 Измение дизайна документов 2026-09-11 13:36:07 +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 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 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 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
lokses 97bf274c6b Чат: поиск сообщений по всем командам, а не только по текущей
Mattermost search per-team — опрашиваем все команды пользователя параллельно
и сливаем результаты с дедупликацией по id. ЛС/групповые попадают в выдачу
любой команды. Сбой одной команды не валит весь поиск.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 21:24:35 +03:00
lokses 7606592ed8 Чат: метка «бот» у сообщений от ботов
Захватываем is_bot при резолве пользователей (/users/ids), рядом с именем
отправителя показываем компактную подпись «бот». Также распознаём вебхуки
(props.from_bot / from_webhook). Свои сообщения и обычных юзеров не помечаем.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 21:15:29 +03:00
lokses 85bd89f762 Чат: сортировка по активности, непрочитанные, кнопка «Написати»
- Порядок каналов/ЛС — по реальному времени последнего поста (тянем per-channel,
  т.к. last_post_at из списка каналов ненадёжен), архивные (delete_at>0) — вниз
- Непрочитанные: счётчик по websocket, бейдж на строке + жирное имя, префикс
  «(N)» в тайтле, браузерное уведомление; сброс при открытии канала
- Кнопка «Написати в чат» на карточке сотрудника → /chat/?dm=<mm_id>,
  чат открывает/создаёт ЛС с этим человеком (идемпотентный /channels/direct)
- Тесты кнопки чата в EmployeeDetailTests

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 16:08:53 +03:00
lokses ea2cc9daca Чат: аккуратный сайдбар списков ЛС и каналов
- Единый скролл вместо жёсткого max-height:35% на ЛС и flex:1 на каналах
  (убран пустой провал под каналами)
- Секции-заголовки — компактные uppercase-подписи в стиле портала
- Строки ЛС и каналов выровнены по единому левому краю (0.75rem)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 15:55:26 +03:00
lokses caa728158b Чат: автооткрытие свежего диалога и поиск сообщений
- Списки каналов и ЛС сортируются по last_post_at (свежие сверху)
- При открытии чата автоматически выбирается самая свежая розмова — сразу
  видны последние сообщения, а не пустой экран
- Поиск сообщений через Mattermost /teams/{id}/posts/search: строка поиска
  над лентой, результаты списком (кто/канал/время/текст), клик открывает канал
- Выход из поиска при открытии канала и смене команды

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 15:48:28 +03:00
lokses a17e982d8c HR: «Посада» у формі найму залежить від типу локації
Активовано закладений механізм Directory.location_types (використовується в
Employee.clean(), але справочник був порожній):

- Міграція core 0005: сид довідника «Тип локации» (office/pharmacy/warehouse) —
  тепер посадам можна призначати типи локацій в адмінці (M2M location_types)
- _hr_portal_context віддає карту hr_post_location_types {post_id: [коди]}
- Форма найму: селект «Посада» фільтрується за обраним типом локації
  (hrHiringFilterPosts). Порожній список типів у посади = доступна скрізь
  (та сама семантика, що в clean()); невідповідну обрану посаду скидає

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 18:20:31 +03:00
lokses 8a4577f165 Чат: аватар собеседника в списке ЛС + переключатель комнат
- Аватар співрозмовника напроти особистого повідомлення (лівий список):
  chatBuildChannelRow отримав опцію avatar; id співрозмовника ЛС резолвиться
  в chatResolveDmLabel і підвантажує фото (chatApplyAvatar). Групові ЛС —
  без фото, з ініціалами.
- Верхній перемикач «кімнат» — команди Mattermost (Офіс / Аптеки / Склад):
  chatRenderTeamSwitcher/chatSelectTeam; chatRenderChannelList фільтрує канали
  за обраною командою; за замовчуванням — перша команда. ЛС показуються завжди.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 18:03:42 +03:00
lokses 479fe3e0d7 Чат: аватары-фото сотрудников и ботов
- chatApplyAvatar(el, userId): подгружает фото из Mattermost
  /users/{id}/image (работает и для сотрудников, и для ботов) и накладывает
  на кружок-аватар; до загрузки/при ошибке остаются инициалы. Кэш по userId.
- Применено в сообщениях (chatBuildMessageEl) и в пикере коллег
  (chatRenderDmPickerList)
- Переиспользует существующий chatApiFetchBlob (Bearer-токен)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 17:10:09 +03:00
lokses 78475b58e9 Инфраструктура: Celery, общие утилиты, виджеты, шелл портала
- acore: Celery-приложение (брокер из env, eager без брокера), настройки
  CELERY_*, регистрация всех новых приложений в INSTALLED_APPS, маршруты
- core/utils: render_page (HTMX-фрагмент/полный layout), is_owner/
  is_owner_or_staff; templatetags common_tags (initials, clean_excerpt,
  is_it_staff); UpdateLastSeenMiddleware
- static: people-picker (дерево отделов с аватарками), searchable-select
  (одиночный выбор с поиском), directory-quick-add, it-manager, pagination;
  тема Tailwind v4 пересобрана, лого
- templates: новый шелл index.html (мобильный сайдбар, темы, фон,
  user-dropdown) и login с брендингом

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 17:31:01 +03:00
lokses 131cb27d16 Initial commit — ACORE pharmacy network management system
Django project: employees, locations, visit_manager, it_manager,
mattermost_connector and stub connectors (ad, mail, portal).
2026-05-31 14:21:47 +03:00