227 Commits

Author SHA1 Message Date
36f756988b fix(requests): улучшены названия фильтров дат и исправлена логика фильтрации 2025-12-29 15:42:00 +03:00
8ebe241174 feat(requests): добавлены фильтры по сотруднику и периоду дат 2025-12-29 15:32:27 +03:00
0b959f33e0 refactor(requests): заменён фильтр 'Область' на nav-pills как в документах 2025-12-29 15:25:18 +03:00
f6a1315d76 feat(requests): текст темы в списке заявлений теперь ссылка на страницу деталей 2025-12-29 14:47:13 +03:00
0890d02efc refactor: переделать страницу деталей заявления с нуля со стилями из списка
- Полная переделка шаблона request_detail.html с единообразными стилями
- Новая структура: основная карточка (8 колонок) + боковая панель комментариев (4 колонки)
- Единообразные иконки типов заявлений (calendar-check, capsule, umbrella-fill и т.д.)
- Единообразные бейджи статуса и типа как в списке
- Информационные блоки для автора, описания, получателей, одобрившего
- Форма комментариев с правильным стилем message-field--compact
- Emoji picker с поддержкой dropdown-menu поверх контента
- AJAX обработка отправки и удаления комментариев
- Новый CSS файл request-detail.css с адаптивностью
- Добавлена функция _add_type_display() в views.py для отображения типа

Улучшения:
- Единство дизайна со страницей списка заявлений
- Правильное позиционирование emoji picker (fixed positioning)
- Sticky боковая панель с комментариями
- Форма комментария как в ленте (message-field--compact)
- Кнопки одобрения/отклонения с правильными иконками
2025-12-29 14:27:47 +03:00
dd219d4752 Исправлена view request_detail
- Добавлены comments в контекст
- Добавлен prefetch recipients и cc_users в DETAIL_REQUEST_QS
- Теперь все данные передаются правильно
2025-12-29 12:31:37 +03:00
be21b9ca4a Полностью переработана страница деталей заявления
Исправлено:
- Добавлена правильная структура card-header с аватаром 48x48px
- Добавлены все необходимые детали: получатели, копия, согласующий
- Исправлены стили для badge и card-body
- Добавлена корректная форма комментария с emoji picker и auto-expand
- Подключены правильные JavaScript компоненты
- Исправлен формат дат (d.m.Y H:i)
- Добавлена передача can_process в контексте view

Добавлено:
- Иконки для каждого раздела (получатели, копия, согласующий)
- Ссылки на карточки сотрудников
- Правильные Badge с subtle цветами
- Форма комментария с message-field компонентом
2025-12-29 12:25:42 +03:00
1349ebce35 fix(requests): временно отключена кнопка 'Отозвать'
URL request_cancel не подключен в urls_front.py
Закомментирована кнопка до добавления функционала
2025-12-29 12:00:52 +03:00
532098499b fix(requests): исправлен namespace для URL request_cancel
Изменено: requests:request_cancel → requests_app:request_cancel
Исправлена ошибка NoReverseMatch при открытии страницы заявления
2025-12-29 11:59:03 +03:00
087cff7901 fix: исключен approver из получателей уведомлений о решении
- Approver (тот кто принял решение) не получает уведомление о своем действии
- Исключены employee.id и approver_id из recipients при approve/reject
- Упрощен signal create_request_notifications (убран лишний запрос в БД)
- Теперь передается актуальный request_obj с установленным approver_id
2025-12-29 11:02:39 +03:00
3941b5c963 fix: уточнен селектор формы решения в request_process.html 2025-12-29 10:15:45 +03:00
849545b11c feat: AJAX обработка формы решения на странице заявления без перезагрузки 2025-12-29 10:01:32 +03:00
eb70384928 � Мобильная оптимизация и новый тип заявления 'Отгул'
MOBILE FIXES:
- request-list.css: переделан мобильный layout с flexbox вместо grid
- page-header.css: оптимизирован padding/margin для мобильных экранов
- requestListHandler.js:
  * Добавлен AbortController с таймаутом (10/15 сек для мобильных)
  * Обработка offline/online событий сети
  * Информативные сообщения об ошибках (отсутствие интернета, таймаут)
  * Адаптивный Intersection Observer (rootMargin 200px для мобильных)
  * Лучшая обработка network failures

UI/UX:
- Скрыт счётчик на экранах < 480px
- Контент теперь отображается на всех разрешениях
- Исчезновение спиннера при ошибке сети
- Визуальное различие между ошибками загрузки

NEW FEATURE:
- Добавлен новый тип заявления 'Отгул' (day_off)
- Обновлена миграция 0009_alter_request_type
- Добавлен во все формы создания/редактирования
- Добавлен в фильтры списка
2025-12-29 10:00:32 +03:00
4d03d027f4 fix: добавлена JavaScript обработка форм на странице заявления
- Форма добавления комментария теперь обрабатывается через AJAX
- Форма удаления комментария с подтверждением
- Форма изменения статуса с подтверждением
- После успешных операций страница перезагружается
- Отображение состояния загрузки (spinner) на кнопках
- Обработка ошибок с alert уведомлениями
2025-12-29 09:28:47 +03:00
434de5c344 fix: приведен шаблон request_detail к стилям проекта
- Использованы компоненты card-list и message-field
- Убраны inline стили, используются классы проекта
- Улучшена структура и читаемость
- Добавлен правильный layout с container-fluid
- Комментарии теперь используют card-list-item класс
- Форма комментариев использует message-field компонент
2025-12-29 09:24:30 +03:00
ee4184953b fix: заменены все request_obj.pk на request_obj.id
- API возвращает 'id', а не 'pk'
- Исправлены все 3 URL: request_cancel, request_comment_delete, request_comment_add
2025-12-29 09:20:53 +03:00
7ff425b707 fix: исправлен namespace в URL шаблона request_detail
- Заменено 'requests_app:' на 'requests:' во всех URL
- В urls_front.py app_name = 'requests', не 'requests_app'
- Исправлена ошибка NoReverseMatch
2025-12-29 09:19:14 +03:00
6621d933e1 fix: исправлен доступ к author в комментариях
- Заменено c.author_name на c.author.full_name|default:c.author.display_name
- Заменено c.author_id на c.author.id (вложенный объект)
- API возвращает вложенный объект author, а не плоские поля
2025-12-29 09:17:50 +03:00
7bd93d99c7 fix: исправлена ошибка доступа к полю username в шаблоне
- Заменено request_obj.employee.username на employee.display_name
- API возвращает full_name и display_name, но не username
- Исправлена ошибка VariableDoesNotExist при рендеринге шаблона
2025-12-29 09:16:48 +03:00
240f734c92 feat: requests detail view - stage 5: функциональность изменения статуса
- Добавлен обработчик для смены статуса заявления в JavaScript
- Интегрирована форма смены статуса в шаблон request_detail.html
- Форма видна только администраторам (can_process=True)
- Поддерживаются переходы: pending->approved/rejected, *->cancelled
- Добавлена валидация и подтверждение перед изменением статуса
- Используются API endpoints: /api/v1/requests/{id}/approve/, reject/, cancel/
- Автоматическое обновление содержимого модали после смены статуса
- Отображение статуса обновления (loading, success, error) в UI
2025-12-26 16:27:09 +03:00
48a96f495e feat: requests detail view - stage 4: функциональность комментариев
- Добавлена функция удаления комментариев в views_front.py
- Добавлена обработка удаления в URL routing
- Расширен JavaScript модуль для работы с добавлением/удалением комментариев
- Добавлена обработка формы добавления комментариев с JSON
- Улучшена обработка ошибок при добавлении комментария
- Добавлена инициализация emoji picker в модали
- Обновлен счетчик комментариев при добавлении/удалении
- Обновлены шаблоны для работы с данными из API
- Добавлена поддержка перезагрузки содержимого модали после каждого действия
2025-12-26 16:25:18 +03:00
003860f892 feat: requests detail view - stage 3: frontend разработка
Этап 3 разработки включает:

✅ Создан JavaScript модуль requestDetail.js:
  - Класс RequestDetailModal для управления модальным окном
  - Функция open(requestId) для открытия заявления
  - Функция loadData(requestId) для загрузки через AJAX
  - Обработка ошибок (404, 403)
  - Поддержка добавления комментариев в модали
  - initRequestDetailModal() для инициализации на странице список

✅ Добавлено модальное окно в request_list_full.html:
  - HTML структура модального окна requestDetailModal
  - ID контейнера для содержимого: requestDetailContent
  - Bootstrap 5 modal с размером modal-lg
  - Scrollable модаль для больших содержимо

✅ Обновлена инициализация скриптов:
  - Подключение модуля requestDetail.js
  - Инициализация RequestDetailModal при загрузке страницы
  - Сохранение экземпляра для использования на странице

✅ Интеграция с кликами:
  - Подготовка к интеграции с существующей логикой списка
  - Возможность открытия заявления из списка или по прямой ссылке

Готово для следующего этапа 4: Функциональность комментариев
2025-12-26 16:03:25 +03:00
f19862ec6b feat: requests detail view - stage 2: backend разработка
Этап 2 разработки включает:

✅ Создан RequestDetailView класс в views_front.py:
  - Наследуется от LoginRequiredMixin, TemplateView
  - Загружает данные о заявлении через API (/api/v1/requests/{pk}/)
  - Загружает комментарии к заявлению
  - Проверяет права доступа (обрабатывает 404, 403)
  - Форматирует даты для отображения

✅ Обновлены URLs (urls_front.py):
  - Добавлен маршрут: path('<int:pk>/', RequestDetailView.as_view(), name='request_detail')
  - Импортирован RequestDetailView

✅ Обновлен шаблон request_detail.html:
  - Раскомментированы комментарии (были закрыты)
  - Добавлена обработка ошибок (404, 403)
  - Оформлено отображение заявления и комментариев
  - Включен функционал добавления комментариев

� URLs в notification_signals.py уже правильные (проверено)

Готово для следующего этапа 3: Frontend разработка
2025-12-26 15:59:16 +03:00
28feac732e feat(avatar): change crop ratio to 3:4 portrait and improve overlay sync
Changed avatar cropper aspect ratio from 1:1 to 3:4 (portrait) for better FaceID recognition.
Improved human silhouette overlay synchronization with crop box during all interactions.

Key changes:

Aspect ratio:
- Changed from 1:1 (square) to 3:4 (portrait)
- Output size: 600x800px (instead of 800x800px)
- Better suited for full body positioning (head, shoulders, torso)

SVG overlay improvements:
- Updated viewBox from 400x400 to 300x400 (3:4 proportions)
- Redesigned human silhouette for portrait format
- Added torso outline up to waist level
- Additional guide line for shoulders
- Better proportions for face/head/shoulders alignment

Synchronization enhancements:
- Added cropstart, cropmove, cropend event handlers
- Overlay now follows crop box during all interactions:
  ✓ Moving the crop box
  ✓ Resizing the crop box
  ✓ Zooming the image
  ✓ Initial positioning
- Real-time position updates using getCropBoxData()

UI/UX updates:
- Updated instructions: 'Совместите тело с зелёным контуром'
- Face should occupy upper third of frame
- Portrait format 3:4 mentioned in requirements
- Changed label from 'Плечи' to 'Пояс' (waist)
- Templates updated with new size requirements (600x800px)

Technical details:
- minCropBoxHeight: 266px (200 * 4/3 for aspect ratio)
- preserveAspectRatio: none (for proper stretching)
- Event handlers ensure overlay follows crop box smoothly
- No performance impact from additional event listeners

Benefits:
✓ Better for FaceID (full body context)
✓ Standard portrait photo format
✓ More professional appearance
✓ Consistent with ID photo standards
✓ Improved overlay visibility and accuracy
2025-12-18 10:15:00 +03:00
53f1eb8096 feat(avatar): implement avatar cropper with FaceID requirements
Implemented avatar cropping component for FaceID system integration.

Features:
- Image cropper using Cropper.js library
- FaceID requirements validation (70-80% face coverage, 600x600px min)
- Square crop area (1:1 aspect ratio)
- Output: 800x800px JPEG at 92% quality
- Real-time size indicator
- Integrated in 2 places: registration + profile editor

Components:
- avatarCropperHandler.js: Main cropper module with AvatarCropper class
- Modal UI with Bootstrap 5
- FaceID instructions and guidelines
- File validation (size, format, dimensions)

Integration:
- auth/register.html: Registration form with cropper
- employees/employee_form_personal.html: Profile editor with cropper
- employees/employee_form_scripts.html: Scripts updated

Technical details:
- CDN: Cropper.js v1.6.1
- Min input size: 600x600px
- Max file size: 10 MB
- Formats: JPG, PNG, GIF
- Output format: JPEG (optimized for face recognition)

Validation:
✓ File format validation
✓ File size validation (10 MB max)
✓ Image dimensions validation (600x600px min)
✓ Real-time crop size indicator
✓ Error handling with user-friendly messages

UI/UX:
- Modal window with instructions
- Live preview of cropped image
- Size indicator (green/red based on requirements)
- Clear FaceID guidelines for users
- Responsive layout
2025-12-18 09:56:50 +03:00
9d47fc0c5c feat: add employee dismissal UI and filter inactive employees
- Added dismissal form on employee profile page with permissions
- Shows warning when dismissing (LDAP deactivation notice)
- Inactive employees filtered by default in employee list (active=true)
- Team wheel now shows only active employees
- Auto-submit filter form on status change
- Added redirect to set active=true by default on first visit
2025-12-17 09:14:34 +03:00
070dbc267e style: unify table styles in equipment_detail
- Replaced Bootstrap table with proc-table-header/proc-request-item
- Now maintenance history and transfer logs match request items style
- Added responsive behavior with d-lg-none labels
- Better visual consistency across procurement module
2025-12-15 10:12:42 +03:00
c7bc99398f refactor: switch equipment_detail from CSR to SSR
- Updated equipment_detail view to load data from DB (SSR)
- Added select_related and prefetch_related for optimization
- Implemented can_manage permission check in view
- Removed loadEquipmentDetail() JavaScript API call
- Added breadcrumb navigation
- Kept action handlers (maintenance, transfer, write-off)
- Added department loading for transfer modal
- Now consistent with request_detail SSR approach
2025-12-15 09:54:31 +03:00
04e46d98d4 - 2025-12-15 09:49:41 +03:00
aeab6a1127 fix: display total_cost instead of estimated_cost in request list
- Changed from estimated_cost (single field) to total_cost (calculated sum)
- Now correctly shows sum of all items in the request
2025-12-10 17:08:09 +03:00
2e92c4d7a0 fix: исправлена загрузка отделов и обработка пагинированного ответа
- API departments возвращает объект с пагинацией {results: [...]}, а не массив
- Добавлена универсальная обработка как массива, так и объекта с results
- Добавлены проверки существования DOM элементов перед обращением
- Исправлена ошибка при редактировании заявки
2025-12-10 16:53:09 +03:00
be9d02bc43 fix: улучшена обработка ошибок загрузки отделов
- Добавлено детальное логирование всех этапов загрузки
- Добавлена проверка существования элемента select
- Улучшена обработка ошибок с понятными сообщениями
- Добавлены alert'ы для уведомления пользователя об ошибках
2025-12-10 16:51:23 +03:00
065a8851a1 feat: реализована полная функциональность создания и редактирования заявок
- Добавлены модальные окна для всех действий на странице деталей
  * Добавление позиции (#addItemModal)
  * Одобрение заявки (#approveModal)
  * Отклонение заявки (#rejectModal)
- Реализованы JavaScript обработчики для всех кнопок
  * deleteItem() - удаление позиции
  * saveItemBtn - сохранение новой позиции
  * confirmApproveBtn - одобрение с комментарием
  * confirmRejectBtn - отклонение с обязательным комментарием
- Исправлены API endpoints (items вместо request-items)
- Доработана форма создания/редактирования заявки
  * Удалены несуществующие поля (desired_date, estimated_cost)
  * Добавлен выбор отдела из API
  * Реализована AJAX отправка формы
  * Поддержка создания черновика и отправки на согласование
  * Поддержка редактирования существующих заявок (PATCH)
- Добавлен URL и view для редактирования заявок
- Кнопка "Редактировать" теперь ведёт на страницу редактирования
2025-12-10 16:46:47 +03:00
b787df45f6 refactor: синхронизированы статусные бейджи во всех шаблонах закупок
- Обновлены иконки статусов в dashboard.html и request_list.html
- Все статусы теперь используют одинаковые иконки и стили
- Добавлены функции getStatusBadgeHTML() для динамического рендеринга
- Исправлена синтаксическая ошибка в loadRequests()
- Статусы: draft, pending, approved, rejected, in_progress, completed, cancelled
2025-12-10 16:37:14 +03:00
427f5ed22f feat(procurement): frontend templates + API-based rendering; update models, serializers, views and tests 2025-12-10 14:09:49 +03:00
ccbc8c5452 feat(procurement): полный жизненный цикл заявок
Добавлены endpoints:
- start_work: APPROVED → IN_PROGRESS
- complete: IN_PROGRESS → COMPLETED
- cancel: отмена заявки с любого статуса кроме завершённых
- create_equipment: создание оборудования из позиции завершённой заявки

Frontend:
- Модальные окна approve/reject/cancel
- POST handler для создания заявок
- Django формы для заявок

Тесты: 19 новых тестов lifecycle, всего 136 тестов procurement passed
2025-12-09 16:46:21 +03:00
8b8974e3ef feat: refactor equipment API permissions
- Add DeptPerm.MANAGE_EQUIPMENT scoped permission constant
- Create migration 0035 for new DepartmentPermission
- Refactor CanManageEquipment permission class with:
  * Admin/staff/superuser → full access
  * Model permissions → full access (add/change/delete_equipment)
  * Department head → own department, can choose responsible
  * Scoped permission → own department, responsible forced to head
  * Regular members → no access
- Update EquipmentListSerializer with:
  * Permission level detection (full/dept_head/scoped/None)
  * Auto-fill department and responsible based on permission level
  * Validation that responsible is in same department
- Add create_options endpoint returning:
  * allowed_departments, can_choose_department, can_choose_responsible
  * default_responsible, permission_level
- Add bulk equipment creation support with auto-generated inventory numbers
- Implement 45 comprehensive permission tests (all passing)
- Fix is_active=True in test make_user() fixture

Tests: 45/45 passing ✅
2025-12-09 16:14:30 +03:00
3d1a415bee fix: исправление загрузки категорий в модале управления
- Исправлена обработка ответа API (поддержка как массива, так и объекта с results)
- API возвращает объект с пагинацией, а не просто массив
- Теперь корректно извлекается массив категорий из data.results
- Исправлена ошибка 'categories.forEach is not a function'
2025-12-09 13:26:36 +03:00
4a7dbf7ce2 feat: добавление UI для управления категориями оборудования
- Добавлена кнопка 'Управление категориями' на странице оборудования
- Создан модал с двумя секциями: добавление и список категорий
- Форма создания категории: название, иконка Bootstrap Icons, описание
- Список существующих категорий с возможностью удаления
- JavaScript функции для работы с API категорий
- Автоматическое обновление списка после создания/удаления
- Защита от удаления категорий с привязанным оборудованием
- Доступно только для staff пользователей (can_manage)
2025-12-09 13:24:55 +03:00
272b02377f feat: добавление позиций при создании заявки и исправление списка отделов
- Добавлен список departments в контекст request_list view
- Реализовано динамическое добавление позиций (items) прямо в модале создания заявки
- Кнопка 'Добавить позицию' для добавления товаров/услуг
- Каждая позиция содержит: название, описание, количество, ед.изм., цену
- Позиции можно удалять кнопкой X
- JavaScript собирает все позиции и отправляет в API вместе с заявкой
- Поддержка как создания с позициями, так и без них
- Реализовано на обеих страницах: dashboard и request_list
- Все 72 теста проходят успешно
2025-12-09 13:21:14 +03:00
41eda0e7ac fix: исправление создания заявок - добавлено обязательное поле department
- Сделано поле 'items' необязательным в ProcurementRequestCreateSerializer
- Добавлено поле 'department' в форму создания заявки (dashboard и request_list)
- Обновлен JavaScript для передачи department в API
- Добавлен список departments в контекст dashboard view
- Теперь можно создать заявку без позиций (items), добавить их потом
- Все 72 теста проходят успешно
2025-12-09 13:11:28 +03:00
c94de51c31 feat: добавление управления оборудованием через UI
- Добавлена кнопка 'Добавить оборудование' на странице списка
- Создан модал для добавления нового оборудования
- Создан модал для редактирования существующего оборудования
- Добавлена кнопка редактирования в dropdown меню каждой карточки
- Реализованы JavaScript обработчики для создания/редактирования через API
- Добавлен импорт User в views_frontend.py для передачи списка пользователей
- Все поля модели Equipment доступны для редактирования (включая статус, отдел)
2025-12-09 13:04:56 +03:00
805d536a47 fix: улучшение кнопки создания заявки и исправление модала
- Изменен текст кнопки на 'Создать заявку' на всех страницах
- Добавлен параметр create_as_card=True на странице списка заявок
- Перемещен модал внутрь блока content в dashboard.html (исправление ошибки Bootstrap)
2025-12-09 12:59:09 +03:00
64af0d273e fix: improve procurement request creation UX
- Change dashboard create button to use modal instead of URL redirect
- Add create_as_card and create_modal parameters to page_header
- Replace form POST submission with AJAX API calls
- Add proper form validation and error handling
- Redirect to request detail page after successful creation
- Remove unused create_url from dashboard context
2025-12-09 12:45:47 +03:00
53a8f0e6b4 feat: add procurement frontend templates and styles
Stage 6 - Frontend Implementation:
- Add procurement.css with iOS-style components
- Add dashboard, request_list, request_detail, request_form templates
- Add equipment_list, equipment_detail templates
- Add status badges and filters partials
- Add JS handlers for dashboard, requests and equipment
- Add procurement link to sidebar navigation
- Configure separate URL namespaces (procurement for API, procurement_frontend for views)

All 66 tests passing.
2025-12-09 12:03:58 +03:00
5ad51550c0 fix: add permission checks for create buttons in employee module templates
Changes:
1. employees_list.html - 'Create Profile' button now only visible to staff/superuser
   API requires staff/superuser for POST /employees/ (explicit check in create method)

2. department_list.html - Simplified permission check for 'Create Department' button
   Changed from: can_create_departments OR perms.employees.add_department OR is_staff
   To: is_staff OR is_superuser OR perms.employees.add_department
   API uses AdminOrActionOrModelPerms which checks employees.add_department

3. skill_list.html - 'Add Skill' button now requires authentication
   API allows any authenticated user to create skills (IsAuthenticated only)

Before:
- Department creation check was redundant with can_create_departments variable
- Skill creation had no check

After:
- All create buttons properly check permissions matching API requirements
- Consistent with feed and documents modules permission patterns
2025-12-08 14:24:40 +03:00
7388f596a6 fix: correct permission check in feed_list.html template
Changed from non-existent permissions:
  - perms.feed.publish_company_post
  - perms.feed.publish_department_post

To actual Django model permission:
  - perms.feed.add_post

User diagnosis confirmed:
- User has Position 'СММ специалист'
- Position linked to Group 'Дизайн СММ Реклама'
- Group has permissions: add_post, change_post, delete_post, view_post
- PositionRoleBackend correctly grants these permissions

The 'Create Post' button will now appear for users with feed.add_post permission through their position groups.
2025-12-08 14:14:58 +03:00
a1bd72979d feat: show create document button only for authorized users
Previously: 'Create Document' button visible to everyone
Now: Button visible only for:
- Staff users (is_staff), OR
- Users with documents.add_document permission

This prevents regular users from seeing a button they can't use,
improving UX by showing only available actions.
2025-12-08 13:09:55 +03:00
f05f00b8f8 feat: show create post button for users with publish permissions
Previously: Only staff users could see 'Create Post' button
Now: Button visible for:
- Staff users (is_staff), OR
- Users with feed.publish_company_post permission, OR
- Users with feed.publish_department_post permission

This allows department managers and content creators to publish
posts without needing full staff status.
2025-12-08 13:05:12 +03:00
1f811fde2a feat: add avatar zoom modal on click
- Added Bootstrap modal for enlarged avatar view
- Made avatar image clickable with cursor pointer
- Added modal trigger to both static and dynamically loaded avatars
- Modal displays full-size avatar centered with dark backdrop
- Close button positioned in top-right corner
2025-12-08 11:07:45 +03:00