Commit Graph

34 Commits

Author SHA1 Message Date
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
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
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
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
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
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
fea650a35c Update delivery date filter: change label and move 'Today' button to left
- Changed label from "Дата доставки" to "Дата доставки/самовывоза"
- Moved "Сегодня" button from right to left side (next to label)
- Removed justify-content-between to keep button aligned with label

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 23:36:32 +03:00
efeb396204 Add 'Today' button next to date filter label 2025-11-07 20:37:17 +03:00
7a725f485a Улучшен календарный фильтр дат: динамическое количество дней, отображение месяца и сохранение позиции при выборе 2025-11-07 20:03:06 +03:00
a271bfa809 feat: Улучшен календарный фильтр заказов - расширен до 19 дней и обновлён дизайн
- Расширен календарь с 9 до 19 дней (±9 от центра)
- Календарь теперь занимает всю ширину страницы
- Исправлены метки "Вчера/Сегодня/Завтра" - теперь привязаны к реальным датам, а не к позициям в ленте
- Добавлена автоматическая отправка формы при выборе даты
- Обновлён дизайн:
  * Сегодняшний день выделен светло-голубым цветом (более мягкий оттенок)
  * Выбранная дата обведена красной рамкой (как на настенном календаре)
- Добавлен блок extra_css в base.html для подключения дополнительных стилей

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 18:55:50 +03:00
1f0821efbe feat: Реализована календарная лента из 9 дней для фильтрации заказов
Основные изменения:

**Компонент date_range_filter.html:**
- Заменены простые кнопки на горизонтальную ленту из 9 дней
- Добавлены стрелки навигации влево/вправо
- Скрытые поля дат для работы с django-filter

**Стили date_filter.css:**
- Дизайн календарной ленты с карточками дней
- Выделение сегодняшнего дня синим цветом
- Выделение выбранной даты зеленым цветом
- Hover-эффекты и анимации
- Адаптивность для мобильных устройств
- Стили для стрелок навигации

**Логика date_filter.js:**
- Класс DateCarousel для управления лентой
- Генерация 9 дней (±4 от центральной даты)
- Определение "Вчера/Сегодня/Завтра" для центральных 3 кнопок
- Отображение числа (01-31) и дня недели (ПН-ВС)
- Навигация стрелками (сдвиг на 1 день)
- Клик по дню устанавливает дату в оба поля фильтра
- Визуальная индикация выбранной даты

**Формат каждой кнопки:**
┌─────────┐
│ Сегодня │  ← Текст (если вчера/сегодня/завтра)
│   07    │  ← Число месяца
│   ЧТ    │  ← День недели
└─────────┘

**Поведение:**
- По умолчанию: сегодня в центре (5-я кнопка)
- Сегодняшний день выделен синим
- Клик по дню фильтрует заказы за эту конкретную дату
- Стрелки сдвигают весь диапазон на 1 день вперед/назад

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 18:33:48 +03:00
48021da856 refactor: Перемещены фильтры из боковой панели наверх страницы
Изменения:
- Фильтры теперь расположены горизонтально в одной строке над таблицей
- Кнопка "Создать заказ" перенесена в правый верхний угол рядом с заголовком
- Календарный фильтр дат вынесен во вторую строку для лучшей читаемости
- Убрана двухколоночная компоновка, таблица теперь занимает всю ширину
- Улучшена компактность интерфейса - больше места для таблицы данных

Преимущества новой компоновки:
- Таблица заказов использует всю ширину экрана
- Фильтры компактно организованы сверху
- Улучшена видимость данных

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 18:25:10 +03:00
d37a5df482 feat: Добавлена фильтрация заказов с django-filter и календарный компонент
Основные изменения:
- Установлен и настроен django-filter==24.3
- Создан OrderFilter с фильтрами по дате доставки, статусу, типу, оплате и поиску
- Реализован переиспользуемый компонент календарного фильтра date_range_filter.html
- Добавлены быстрые кнопки выбора дат (Сегодня, Завтра, Неделя)
- Создан templatetag param_replace для сохранения фильтров при пагинации
- Обновлен order_list view для использования django-filter
- Полностью переработан шаблон order_list.html с интеграцией фильтров
- Добавлены стили (date_filter.css) и логика (date_filter.js) для календаря

Структура новых файлов:
- orders/filters.py - FilterSet для заказов
- orders/templatetags/filter_tags.py - кастомные теги для фильтров
- orders/templates/orders/components/date_range_filter.html - компонент календаря
- orders/static/orders/css/date_filter.css - стили
- orders/static/orders/js/date_filter.js - JavaScript логика
- requirements.txt - зависимости проекта

Преимущества:
- Чистая архитектура фильтрации
- Автоматическое сохранение параметров при навигации
- Переиспользуемый календарный компонент
- Улучшенный UX с быстрыми фильтрами
- Готовность к масштабированию на другие модели

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 18:22:57 +03:00
ec0557c8cf feat: Добавлена функциональность управления заказами и улучшен поиск товаров
Заказы:
- Добавлены миграции для исторических записей с полями оплаты и получателя
- Расширен admin для заказов с инлайнами товаров/комплектов
- Реализованы представления списка, создания, редактирования и удаления заказов
- Добавлен шаблон подтверждения удаления заказа
- Настроены URL-маршруты для работы с заказами

Клиенты:
- Добавлена миграция с новыми полями адресов и подтверждений
- Обновлена модель клиентов с дополнительными полями
- Улучшен admin для работы с клиентами

Товары:
- Значительно улучшен API поиска товаров с поддержкой фильтрации
- Добавлен Select2 виджет для динамического поиска товаров
- Создан статический JS файл для интеграции Select2
- Оптимизирована обработка запросов и ответов API

Прочее:
- Добавлены новые настройки в settings.py
- Обновлена навигация в navbar.html
- Обновлены URL-маршруты проекта

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 16:10:19 +03:00
a1dfb6a257 refactor: Переработан макет страницы списка заказов - кнопка создания перенесена в боковую панель
Изменена структура страницы /orders/:
- Создана двухколоночная компоновка (фильтры слева, таблица справа)
- Кнопка "Создать заказ" перенесена из верхней части под фильтры в левую панель
- Фильтры преобразованы в вертикальный макет для лучшей организации

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 16:08:08 +03:00
2bf2afb56f feat: Добавлена возможность ручного изменения цены товаров/комплектов в заказе
- Добавлено поле is_custom_price в модель OrderItem для отслеживания ручных изменений
- Добавлены свойства original_price и price_difference для отображения оригинальной цены и разницы
- Поле цены теперь редактируемое (убран атрибут readonly)
- Добавлены визуальные индикаторы: бейдж "Изменена" и информация об оригинальной цене
- JavaScript автоматически отслеживает изменения цены и устанавливает флаг is_custom_price
- В детальном просмотре заказа показывается информация о кастомных ценах с разницей
- Цена товара в каталоге не изменяется - изменения только для конкретного заказа

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 10:44:46 +03:00