Commit Graph

115 Commits

Author SHA1 Message Date
9fc0af2c2e Полный пересмотр логики поиска по email с стратегиями
Проблема: Поиск "team_x3m@" неправильно находит клиента "Наталья natulj@bk.ru"
Причина: Использовался простой icontains для всех случаев

Решение: Добавлена функция determine_search_strategy() которая определяет
стратегию поиска на основе содержимого query:

1. email_prefix: query заканчивается на @ (например "team_x3m@")
   → Используется istartswith вместо icontains
   → Найдёт только email, начинающиеся с "team_x3m@"
   → НЕ найдёт "natulj@bk.ru" ✓

2. email_domain: query начинается с @ (например "@bk")
   → Использует icontains для поиска по домену
   → Найдёт все *@bk.ru, *@bk.com и т.д.

3. email_full: query содержит обе части (например "test@bk.ru")
   → Поиск по полному email адресу

4. universal: query без @, 3+ символов (например "natul")
   → Поиск везде: по имени И по email
   → Это позволит найти "Наталья" и "natulj@bk.ru"

5. name_only: очень короткие запросы (1-2 символа)
   → Только поиск по имени (чтобы не было ложных срабатываний)

Добавлены 23 unit-теста для покрытия всех сценариев:
- email_prefix cases: team_x3m@, user_name@, test123@
- email_domain cases: @bk, @bk.ru, @mail.google.com
- email_full cases: test@bk.ru, test@bk, user.name@mail.example.com
- universal cases: natul, abc, наталь, Test123
- name_only cases: t, te, на
- edge cases: пустая строка, @, множественные @

Все 23 теста проходят успешно ✓

Примеры работы после изменения:
- team_x3m@ → ищет email^=team_x3m (НЕ найдёт natulj@bk.ru)
- @bk → ищет все *@bk.*
- natul → ищет везде (имя + email)
- te → ищет только по имени (2 символа мало для email)
- test@bk.ru → ищет test@bk.ru

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 00:49:43 +03:00
b44ea1677f Добавлена умная фильтрация при поиске по email
Теперь поиск по email работает с ограничениями:
- Если запрос содержит @, требуется минимум 2 символа после @
- Если в запросе нет @, требуется минимум 3 символа всего

Это предотвращает нежелательные результаты, такие как:
- Поиск по одному символу @ находит всех клиентов (все содержат @)
- Поиск по 1-2 буквам находит очень широкий результат

Примеры работы:
- team_x3m@ → не будет искать по email (только 0 символов после @)
- @bk → будет искать по email (2 символа после @)
- natul → будет искать по email (4 символа, нет @, достаточно)
- na → не будет искать по email (только 2 символа, нет @)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 00:36:59 +03:00
e90f6a48a3 Поиск по email теперь работает по части адреса
Изменено: email__iexact на email__icontains

Причина: Пользователь хочет искать по части email, например:
- Ввод 'NATUL' должен найти 'natulj@bk.ru'
- Ввод 'bk.ru' должен найти всех пользователей с этим доменом
- Ввод полного email найдет точный результат

Это соответствует логике поиска по имени и телефону - гибкий поиск по части.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 00:30:05 +03:00
ab840b2ff1 Исправлен поиск по email - используем точное совпадение вместо содержит
Проблема: При поиске по email использовался icontains (содержит), что приводило
к неправильным результатам. Например, поиск по 'test@example.com' находил всех
клиентов с 'example.com' в email.

Решение: Изменить на email__iexact (точное совпадение без учета регистра).
Теперь поиск по email работает корректно:
- Ввод несуществующего email не найдёт ничего и предложит создать нового клиента
- Ввод существующего email найдёт только клиента с точным совпадением email

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 00:27:15 +03:00
9b112dd1e5 Переместить определение openCreateCustomerModal в начало скрипта
Проблема: Функция openCreateCustomerModal была определена в конце скрипта,
что делало её недоступной при вызове из обработчика клика.

Решение: Переместить определение функции после initCustomerSelect2(),
но ДО её вызова. Это гарантирует доступность функции.

Результат: Модаль создания клиента теперь открывается корректно при клике!

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 00:26:40 +03:00
d5356387b7 Добавлено логирование для отладки функции создания клиента
Добавлены логи на разных стадиях:
- 9_open: когда dropdown открывается
- 9_search: когда resultsContainer найден
- 9_click: когда пользователь кликает
- 9_option: когда находится select2-results__option
- 9_create: когда находится customer-create-option
- 9_text: полный текст опции
- 9d: когда открывается модаль

Это поможет определить на каком этапе может быть проблема.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 00:17:51 +03:00
1dd47dfae9 Исправлена функция создания клиента при поиске - добавлен прямой обработчик клика
Проблема: Опция "Создать клиента" была не кликабельна.

Решение:
- Добавлен обработчик select2:opening для подключения обработчика клика
- Обработчик ждет пока dropdown откроется и добавляет слушатель на клик
- При клике на элемент с .customer-create-option извлекает поисковый текст
- Открывает модаль создания клиента с текстом поиска
- Закрывает dropdown после клика

Улучшения:
- CSS добавлен cursor: pointer и hover эффекты
- Более явная визуализация кликабельности опции

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 00:15:57 +03:00
5d5de1fe31 Рефакторинг: перенос логики создания временных комплектов в сервис
Изменения:
- Удалена функция create_temporary_kit из myproject/orders/views.py
- Перенесена в новый сервис myproject/products/services/kit_service.py
- Добавлен API endpoint products:api-temporary-kit-create для создания временных комплектов
- Обновлены URL-ы соответственно

Преимущества:
- Логика временных комплектов теперь находится в соответствующем приложении (products)
- Упрощена архитектура orders приложения
- Сервис может быть переиспользован в других контекстах
- Лучшее разделение ответственности между приложениями

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 23:44:05 +03:00
3c0ba70bc8 Исправлено отображение выбранного клиента при редактировании черновика
Проблема: При редактировании черновика заказа клиент не отображался на форме.
Решение:
- Не очищаем select если уже есть выбранный клиент (не вызываем empty())
- Оставляем option элемент в DOM, позволяя Select2 его видеть
- Просто устанавливаем значение через .val() после инициализации Select2
- Исправлена formatCustomerSelection чтобы обрабатывала option.text если option.name отсутствует

Ключевое изменение: Select2 AJAX mode корректно работает с pre-rendered option элементами,
если мы их не очищаем перед инициализацией.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 23:40:34 +03:00
7df5988222 Исправлено отображение выбранного клиента при редактировании черновика
Проблема:
- При редактировании черновика заказа клиент не отображался в форме
- Это произошло потому что Select2 инициализация очищала все опции

Решение:
- Сохраняем текущее значение перед очисткой опций
- После инициализации Select2 загружаем информацию о клиенте через AJAX
- Восстанавливаем выбранного клиента с полной информацией (имя и телефон)

Также исправлено:
- Используем нативное JavaScript событие dispatchEvent вместо jQuery trigger
- Это обеспечивает правильную работу с draft-creator.js

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 23:22:59 +03:00
97a5d13410 Исправлена функция поиска клиентов при создании заказа
Изменения:
- Удалена @login_required с API endpoints поиска и создания клиентов
- Переделана инициализация Select2 для поля customer с проверкой загрузки jQuery
- Упрощена конфигурация Select2 (убраны лишние проверки и костыли)
- Добавлены CSS стили для dropdown видимости и оформления
- Логи инициализации для отладки (шаги 1-10)

Теперь при создании заказа можно:
- Искать клиентов по имени, телефону или email
- Выбирать существующего клиента из дропдауна
- Создавать нового клиента прямо из формы заказа

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 23:16:53 +03:00
e182839326 Переделана инициализация Select2 для поиска
- Уничтожаем существующий Select2 перед переинициализацией
- Упрощена конфигурация ajax
- Добавлено логирование select2 instance и контейнера
- Добавлена обработка input event на элементе поиска
- Увеличена задержка для отладки (500ms вместо 300ms)

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 22:33:53 +03:00
fa4f4efb66 Улучшено логирование для отладки Select2
- Добавлены дополнительные обработчики событий (closing, keyup, change)
- Добавлена проверка наличия search input элемента
- Отключено кэширование для AJAX запросов
- Добавлено форматирование параметров для debuggingтых
- Убрана функция matcher для упрощения логики

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 22:32:18 +03:00
95d5e52a97 Добавлено подробное логирование для отладки поиска клиента
Логирование покрывает:
- Инициализацию Select2
- AJAX запросы и ответы
- События Select2 (opening, open, searching, select)
- Форматирование опций
- Обработку выбора элемента

Используйте консоль браузера (F12) для отладки.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 22:30:14 +03:00
6600dfa51f Исправлена инициализация Select2 для поиска клиента
Проблема: Select2 не инициализировалась корректно, так как конфликтовал с общим инициализатором Select2

Решение:
- Удален класс select2 из поля customer в форме (orders/forms.py)
- Select2 для customer теперь инициализируется отдельно с AJAX поиском
- Используется стандартный Django ID для поля (id_customer)
- Правильно обработаны все ссылки на $customerSelect в JavaScript

Теперь поиск работает корректно:
- Поиск по имени, телефону (любой формат) и email
- Быстрое создание клиента без перезагрузки страницы
- Автоматическое заполнение формы при создании

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 22:28:15 +03:00
000b791702 Улучшен поиск клиента по телефону
Исправления:
- Поиск по телефону теперь работает независимо от формата ввода (иконки, пробелы, +/-)
- Добавлена поддержка поиска по цифрам телефона (например, введение '291234' найдет +375291234567)
- Оптимизирована задержка AJAX запроса (300ms вместо 250ms)
- Добавлена обработка ошибок AJAX с логированием
- Улучшена обработка пустых результатов

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 22:24:36 +03:00
74ece6dd66 Добавлен универсальный поиск клиента и быстрое создание нового клиента
Реализованы следующие функции:
- AJAX API endpoint для поиска клиента по имени, телефону или email одновременно
- AJAX API endpoint для создания нового клиента прямо при создании заказа
- Интерактивная форма поиска в поле "Клиент" с использованием Select2
- При отсутствии результатов поиска предлагается создать нового клиента с автоматическим заполнением формы введенными данными
- Модальное окно для создания клиента во всплывающем окне (не на отдельной странице)
- Автоматический выбор созданного клиента после сохранения

Изменения:
1. customers/views.py - добавлены endpoints api_search_customers и api_create_customer
2. customers/urls.py - добавлены URL маршруты для новых endpoints
3. orders/templates/orders/order_form.html - обновлена инициализация Select2 для поиска, добавлено модальное окно и стили

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 22:23:11 +03:00
c8923970ea Упрощена система номеров заказов: переход на числовые номера
- Изменено поле order_number с CharField на PositiveIntegerField
- Удален метод generate_order_number()
- Упрощен метод save() - автоинкремент на основе максимального значения
- Номера заказов теперь хранятся как числа (1, 2, 3, ...) без форматирования
- Удалены все миграции для чистого старта

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 20:44:42 +03:00
bfd4d1679a Исправлена ошибка при добавлении временного комплекта
- Убран дублирующий trigger('change') который вызывал ошибку
- Добавлена проверка наличия e.params в обработчике select2:select
- Теперь используется только trigger('select2:select') с явными параметрами

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 19:40:31 +03:00
62115bbe00 Исправлена обработка ошибок при создании временного комплекта
- Перемещена функция fillFormWithKit в начало обработчика для правильного hoisting
- Добавлена валидация данных комплекта перед заполнением формы
- Добавлены проверки наличия элементов формы

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 19:32:20 +03:00
e8601e6c8d Добавлен триггер select2:select для автосохранения временных комплектов
При добавлении временного комплекта теперь явно вызывается событие
select2:select, которое запускает автосохранение черновика заказа.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 19:14:38 +03:00
f54363d1ae Исправлено добавление временного комплекта в существующую пустую форму
Временный комплект теперь заполняет первую пустую форму товара вместо создания новой. Это позволяет корректно сохранять комплект при автосохранении.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 17:32:11 +03:00
8a87e89013 Упрощена логика автосоздания черновика
Черновик теперь создаётся ТОЛЬКО при выборе клиента, а не при добавлении товаров или изменении других полей. Это логично, так как:
- Без клиента черновик не может быть создан
- После переадресации на страницу редактирования работает полноценное автосохранение

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 15:10:30 +03:00
7b8ef2c45b Исправлен ID контейнера формсета в draft-creator.js
Изменен с order-items-formset на order-items-container для корректной работы отслеживания товаров при создании заказа.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 15:01:04 +03:00
58dd60b19a Добавлена поддержка автосохранения товаров в черновиках заказов
- Исправлен ID контейнера формсета (order-items-container)
- Добавлена поддержка событий Select2 для полей выбора товара
- Добавлен MutationObserver для отслеживания новых форм товаров
- Удалены отладочные console.log

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 13:32:21 +03:00
9530dd15eb Исправлено отображение даты и времени в форме заказа
Добавлен параметр format для виджетов DateInput и TimeInput, что позволяет корректно отображать сохраненные значения даты и времени в HTML5 полях формы.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 12:33:31 +03:00
f7305bae11 Добавлена конвертация даты и времени при автосохранении черновика
Добавлен парсинг строковых значений в объекты date и time для полей delivery_date, delivery_time_start и delivery_time_end, чтобы форма корректно отображала сохраненные значения.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 12:21:58 +03:00
af0c0189ba Исправлена обработка числовых полей при автосохранении черновика
Добавлена конвертация строковых значений в Decimal для полей delivery_cost и discount_amount, чтобы избежать ошибки типа при автосохранении.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 12:18:54 +03:00
95b7f44105 Исправлена обработка ForeignKey полей в DraftOrderService
Добавлена правильная обработка ForeignKey полей (customer, delivery_address, pickup_shop)
при обновлении черновика. Теперь ID конвертируются в объекты моделей перед присваиванием.

Исправляет ошибку: Cannot assign "1": "Order.customer" must be a "Customer" instance.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 00:21:39 +03:00
6770bc02d8 Исправлен селектор формы в autosave.js
Заменил form[action*="edit"] на #order-form для корректной работы.
Добавлено дополнительное логирование для отладки.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 00:17:20 +03:00
be79730ee3 Добавлена поддержка событий Select2 в draft-creator.js
Поля с Select2 не генерируют стандартные события 'change',
поэтому добавлено прослушивание событий 'select2:select'.
Также добавлено логирование для отладки.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 23:18:49 +03:00
1e97ec533e Исправлен селектор формы в draft-creator.js
Заменил form[action*="create"] на #order-form, т.к. у формы нет атрибута action.
Добавлены дополнительные проверки и логирование для отладки.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 23:14:42 +03:00
3ba4ceab3d Добавлено автоматическое создание черновика при создании заказа
При любом изменении формы создания заказа автоматически создается черновик
и пользователь перенаправляется на страницу редактирования, где работает
стандартное автосохранение.

Изменения:
- Добавлен AJAX endpoint create_draft_from_form в views.py
- Создан JavaScript модуль draft-creator.js для автосоздания черновика
- Обновлен order_form.html для подключения соответствующих скриптов
- Добавлен URL маршрут /orders/create-draft/

Работает с задержкой 2 секунды после первого изменения формы.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 23:08:28 +03:00
024edea9f1 Исправлено отображение шаблона пустой формы в formset
Проблема:
- Над секцией "Товары в заказе" отображался странный dropdown
- Шаблон формы использовал <div style="display: none;"> вместо <template>

Исправление:
- Заменен <div id="empty-form-template" style="display: none;"> на <template>
- Добавлен id для select в шаблоне
- Обновлен JavaScript для работы с HTML5 <template> element
- Используется template.content для правильного клонирования

Теперь шаблон полностью невидим и не влияет на layout

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 22:53:41 +03:00
809d5a127a Исправлена работа с formset товаров в форме заказа
Проблемы:
- Отображались лишние пустые формы (extra=1)
- Новые формы не инициализировали Select2 корректно
- Неудобное удаление через checkbox

Исправления:
1. forms.py:
   - Изменен OrderItemFormSet: extra=0, min_num=0
   - Формы добавляются только через JavaScript

2. order_form.html:
   - Добавлен шаблон пустой формы (#empty-form-template)
   - Заменен checkbox "Удалить" на кнопку с иконкой
   - Полностью переписана логика добавления/удаления форм
   - Добавлена валидация: нельзя удалить единственную позицию
   - Скрытые формы (DELETE=true) визуально помечаются
   - Автодобавление первой формы при пустом formset
   - Валидация перед отправкой: минимум 1 товар

Результат:
- При создании заказа отображается только 1 пустая форма
- Кнопка "Добавить товар" корректно создает новые формы
- Select2 работает в каждой новой форме
- Кнопка "Удалить" работает корректно
- Единственную позицию удалить нельзя

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 22:49:26 +03:00
1edeaeb552 Добавлена поддержка черновиков заказов (Этап 3/3): JavaScript, UI и cleanup
JavaScript:
- Создан autosave.js: модуль автосохранения черновиков
- Debouncing с задержкой 3 секунды
- Визуальный индикатор статуса сохранения
- Автоматическое отслеживание изменений в полях формы и formset

UI обновления:
- order_form.html: добавлен data-атрибут is-draft и подключение autosave.js
- order_list.html: добавлен badge "Черновик" для черновиков в списке заказов

Management команда:
- cleanup_draft_orders: очистка старых черновиков (по умолчанию 30 дней)
- Поддержка --dry-run для предпросмотра
- Автоматическое удаление связанных временных комплектов

Использование:
- python manage.py cleanup_draft_orders --days=30
- python manage.py cleanup_draft_orders --days=7 --dry-run

Система черновиков полностью готова к использованию!

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 22:38:10 +03:00
961a5d52da Добавлена поддержка черновиков заказов (Этап 2/3): AJAX endpoints и views
Добавлены AJAX endpoints:
- autosave_draft_order: endpoint для автосохранения черновиков

Модифицированы views:
- order_create: поддержка создания черновиков через кнопку 'save_as_draft'
- order_update: поддержка обновления и финализации черновиков через DraftOrderService

Добавлены URL:
- /orders/<pk>/autosave/ для автосохранения черновиков

Следующий этап: JavaScript модуль автосохранения и UI

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 21:20:29 +03:00
dc8604732f Добавлена поддержка черновиков заказов (Этап 1/3)
Реализован базовый функционал для работы с черновиками заказов.
Это первый этап из трех для полной реализации автосохранения.

Изменения:

1. Модель Order (orders/models.py):
   - Добавлен статус 'draft' в STATUS_CHOICES
   - Добавлено поле last_autosave_at для отслеживания автосохранения
   - Добавлен метод is_draft() для проверки статуса черновика

2. Миграция (0005_add_draft_support.py):
   - Добавление поля last_autosave_at в Order
   - Добавление статуса 'draft' в choices

3. Service Layer (orders/services/draft_service.py):
   - Класс DraftOrderService с методами:
     * create_draft() - создание нового черновика
     * update_draft() - обновление существующего черновика
     * add_item_to_draft() - добавление товара в черновик
     * remove_item_from_draft() - удаление товара из черновика
     * finalize_draft() - завершение черновика (draft → new)
     * get_user_drafts() - получение черновиков пользователя
     * delete_old_drafts() - очистка старых черновиков
   - Вся бизнес-логика инкапсулирована в сервисный слой

Архитектурные решения:
- Использование service layer pattern для изоляции бизнес-логики
- Транзакционность всех операций с черновиками
- Автоматический пересчет итоговой суммы при изменении товаров
- Связь временных комплектов с черновиками через FK

Следующие этапы (в следующих коммитах):
- Этап 2: AJAX endpoints и модификация views
- Этап 3: JavaScript автосохранение и UI

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 18:26:24 +03:00
848b6b1574 Удалены все ссылки на несуществующее поле 'notes' в KitItem
Проблема:
- Поле 'notes' было удалено из модели KitItem миграцией 0005
- Админка и другие части кода продолжали ссылаться на это поле
- Это вызывало FieldError при попытке редактирования ProductKit в админке

Решение:
Удалены все 6 упоминаний поля 'notes' из кода:

1. admin.py (2 места):
   - KitItemInline: удалено 'notes' из fields
   - KitItemAdmin: удалено 'notes' из fields

2. productkit_detail.html (2 места):
   - Удален заголовок колонки "Примечание"
   - Удален блок отображения item.notes

3. demo_variants.py (2 места):
   - Удалено 'notes' из defaults для премиум букета
   - Удалено 'notes' из defaults для эконом букета

Результат:
- Админка ProductKit теперь работает корректно
- Шаблоны не обращаются к несуществующим полям
- Демо-команды создания вариантов работают без ошибок

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 16:50:16 +03:00
2deaf6361a Исправлено отображение временного комплекта в форме заказа
Проблема:
- После создания временного комплекта он не отображался корректно в Select2
- Опция добавлялась в select после инициализации Select2

Решение:
- Добавлена задержка (setTimeout) для корректной инициализации формы
- Используется Select2 API (.append().trigger('change')) для добавления опции
- Это обеспечивает правильное отображение названия комплекта в выпадающем списке

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 16:33:18 +03:00
f82f4f25dd Исправлен ID кнопки добавления позиции в заказ
Проблема:
- Код пытался найти кнопку с ID 'add-order-item-btn'
- Реальный ID кнопки в шаблоне: 'add-item-btn'
- Это приводило к ошибке: Cannot read properties of null (reading 'click')

Решение:
- Исправлен ID кнопки с 'add-order-item-btn' на 'add-item-btn'

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 16:27:38 +03:00
72a0397a4f Исправлена ошибка создания временного комплекта из модального окна
Проблема:
- JavaScript вызывал несуществующую функцию addOrderItem()
- Это приводило к ошибке и комплект не добавлялся в заказ

Решение:
- Заменен вызов addOrderItem() на программный клик по кнопке добавления формы
- После добавления формы заполняем её данными созданного комплекта
- Добавлена очистка формы модального окна после успешного создания
- Улучшена обработка ошибок с детальным логированием

Изменения:
- Добавлено логирование статуса ответа и данных для отладки
- Добавлена проверка HTTP статуса перед парсингом JSON
- Реализовано корректное добавление комплекта в список позиций заказа
- Добавлена очистка полей модального окна после создания

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 16:23:32 +03:00
df3a951beb Добавлен UI для создания временных комплектов в форме заказа
Шаблон order_form.html:
- Кнопка "Создать и добавить комплект" рядом с "Добавить товар"
- Модальное окно с формой создания временного комплекта:
  * Поле названия комплекта
  * Поле описания (опционально)
  * Динамическое добавление/удаление товаров с Select2
  * Поле количества для каждого товара

JavaScript функциональность:
- addTempKitComponent() - добавление товара в комплект
- Select2 с AJAX поиском только товаров (type='product')
- Валидация (название обязательно, минимум 1 товар)
- AJAX запрос к /orders/temporary-kits/create/
- Автоматическое добавление созданного комплекта в форму заказа
- Закрытие модального окна после успешного создания

Теперь флорист может:
1. Нажать "Создать и добавить комплект"
2. Ввести название (например "Букет для Анны")
3. Добавить товары с количествами через Select2
4. Нажать "Создать и добавить в заказ"
5. Комплект создается и автоматически добавляется в заказ

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 15:45:23 +03:00
deb138f037 Исправлен импорт ProductKitMakePermanentView
Добавлен ProductKitMakePermanentView в:
- products/views/__init__.py импорты
- __all__ экспорт

Теперь view доступен через products.views и сервер запускается без ошибок.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 15:29:25 +03:00
a1df188b2a Реализовано преобразование временных комплектов в постоянные
Views (products/views/productkit_views.py):
- ProductKitMakePermanentView: view для преобразования временного комплекта
  * Доступен только для временных комплектов (is_temporary=True)
  * Позволяет отредактировать название, описание, категории, теги, цену
  * Вызывает метод make_permanent() модели
  * Перенаправляет на детальную страницу комплекта после успеха

URLs (products/urls.py):
- /products/kits/<pk>/make-permanent/ - страница преобразования

Templates:
- productkit_make_permanent.html: форма преобразования с составом и ценой
- order_detail.html: добавлена кнопка "Сделать постоянным" для временных комплектов

Теперь флорист может:
1. Увидеть временный комплект в заказе с badge "Временный"
2. Нажать "Сделать постоянным"
3. Отредактировать название, добавить категории
4. Сохранить - комплект появится в каталоге

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 15:19:56 +03:00
0e220ed169 Добавлено отображение временных комплектов в деталях заказа
В order_detail.html:
- Добавлен badge "Временный" для временных комплектов
- Добавлена подсказка "Создан специально для этого заказа"

Теперь флорист видит какие комплекты в заказе являются временными.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 15:16:01 +03:00
17b2d706f7 Добавлен backend для создания временных комплектов в заказах
Forms (orders/forms.py):
- TemporaryKitForm: упрощенная форма для временного комплекта (название + описание)
- TemporaryKitItemForm: форма для компонента временного комплекта
- TemporaryKitItemFormSet: formset для управления компонентами

Views (orders/views.py):
- create_temporary_kit: AJAX endpoint для создания временного комплекта
  * Принимает JSON с названием, описанием и списком компонентов
  * Создает комплект с is_temporary=True
  * Связывает с заказом если указан order_id
  * Автоматически пересчитывает цену
  * Возвращает JSON с данными созданного комплекта

URLs (orders/urls.py):
- /orders/temporary-kits/create/ - endpoint для создания

Теперь можно создавать временные комплекты через AJAX запрос.
Следующий шаг - UI в форме заказа.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 15:09:12 +03:00
ea4bb5a43b Скрыты временные комплекты из каталога и поиска
Views:
- ProductKitListView: фильтр is_temporary=False
- CombinedProductListView: фильтр is_temporary=False для комплектов
- API search: фильтр is_temporary=False в поиске и популярных

Admin:
- Добавлен фильтр по is_temporary
- Добавлено отображение статуса временного комплекта в списке
- Добавлена ссылка на заказ для временных комплектов
- Добавлен раздел "Временный комплект" в fieldsets

Теперь временные комплекты не показываются в общем каталоге,
но доступны в админке и по прямой ссылке (для заказов).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 15:00:25 +03:00
7b78ad2a6e Добавлена поддержка временных комплектов в модель ProductKit
- Добавлено поле is_temporary для пометки временных комплектов
- Добавлено поле order для связи с заказом
- Добавлены индексы для производительности
- Добавлен метод make_permanent() для преобразования в постоянный комплект

Временные комплекты создаются для конкретных заказов и не показываются
в общем каталоге, но хранятся в БД для истории и анализа.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 14:59:09 +03:00
d8fec8b893 Add utility scripts for stock reservation management
- Add check_stock.py: script to view Stock records with reservations
- Add refresh_stock_reservations.py: standalone script to recalculate quantity_reserved for all Stock records
- Both scripts work with 'grach' tenant schema

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 11:08:23 +03:00