Commit Graph

236 Commits

Author SHA1 Message Date
a42145a8ad Оптимизирована высота и компактность календарного фильтра
- Уменьшены все отступы и padding для экономии вертикального пространства
- Уменьшены размеры кнопок навигации (36px → 30px)
- Уменьшены размеры кнопок дней (70px → 60px)
- Уменьшены все шрифты внутри календаря
- Обновлен расчет количества отображаемых дней (минимум 7)
- Календарь теперь занимает всю доступную ширину и показывает больше дат

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 16:08:39 +03:00
24c379a9e3 Оптимизирована компоновка страницы заказов
- Удален заголовок страницы для экономии места
- Кнопка создания заказа перенесена в блок фильтров под календарь
- Кнопка теперь занимает всю ширину для удобства использования

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 15:49:49 +03:00
c1bae64930 Расширена таблица заказов на всю ширину экрана
- Фильтры и календарь остаются в стандартном контейнере
- Таблица вынесена в container-fluid с адаптивными отступами
- Уменьшены padding карточки таблицы для максимального использования пространства
- Сохранена адаптивность для всех размеров экранов

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 15:46:34 +03:00
46578382b0 Улучшения в моделях заказов и комплектов
## Изменения:

### 1. ProductKit - расчет цены для вариантов товаров
- Добавлена обработка variant_group в методах расчета base_price
- Теперь учитываются варианты товаров при расчете стоимости комплекта

### 2. DraftOrderService - упрощение логики автосохранения
- Удалена проверка is_draft() при обновлении (позволяет обновлять заказы в других статусах)
- Улучшена документация метода update_draft

### 3. Шаблоны и скрипты
- Обновлены шаблоны форм создания/редактирования комплектов
- Обновлены скрипты автосохранения

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 11:34:06 +03:00
4a1f8266de Улучшения UX формы заказа и создания клиента
- Изменен порядок секций формы: товары перемещены выше доставки
- Добавлена защита от двойного создания клиента
- Улучшена валидация при создании клиента с детализацией ошибок
- Добавлен индикатор загрузки при сохранении клиента
- Исправлена логика обработки специальной опции создания клиента

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 21:16:48 +03:00
0973121b39 Удалена устаревшая логика адресов клиентов
Исправлена ошибка AttributeError при создании нового клиента.
Адреса теперь привязаны к заказам, а не к клиентам.

- Удалено обращение к customer.addresses в customer_detail view
- Убрана секция "Адреса доставки" из шаблона customer_detail.html
- Исправлена команда create_demo_orders для работы с новой структурой

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 17:04:20 +03:00
8cc8cd1339 Исправлена персистентность типа доставки при автосохранении
Проблема: После переключения между "С доставкой" и "Самовывоз" и автосохранения, при перезагрузке страницы всегда отображался "Самовывоз", независимо от фактически сохраненного значения.

Изменения:

1. **orders/templates/orders/order_form.html**:
   - Переписана инициализация управления типом доставки
   - Код вынесен из jQuery document.ready в отдельный DOMContentLoaded обработчик
   - Разделена логика синхронизации:
     * syncDeliveryTypeFromRadio() - для обработки кликов пользователя
     * syncUIFromCheckbox() - для инициализации UI из значения чекбокса
   - Исправлен рендеринг скрытого чекбокса is_delivery с явным атрибутом checked
   - Удалена лишняя закрывающая скобка, вызывавшая JS ошибку
   - Удален дублирующийся обработчик select2:opening для выбора клиента

2. **orders/services/draft_service.py**:
   - Добавлена явная конвертация boolean полей (is_delivery, customer_is_recipient, is_anonymous)
   - Обработка различных типов данных (bool, string, None) в единый boolean
   - Добавлено логирование для отладки is_delivery (временно)

Результат: Тип доставки теперь корректно сохраняется через автосохранение и восстанавливается при перезагрузке страницы.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 16:59:24 +03:00
885ac839e2 Реализована система управления стоимостью доставки и исправлен баг выбора клиента
Изменения:

1. **Стоимость доставки (автоматическая/ручная)**:
   - Добавлено поле `is_custom_delivery_cost` в модель Order для отслеживания ручной стоимости
   - Создан сервис DeliveryCostCalculator для автоматического расчета стоимости доставки
   - Реализована логика: бесплатная доставка от 100 руб., иначе 15 руб.
   - В форме поле "Ручная стоимость доставки" - если заполнено, используется ручная стоимость, если пустое - автоматический расчет
   - Добавлены методы Order.get_delivery_cost(), set_delivery_cost(), reset_delivery_cost(), recalculate_delivery_cost()

2. **Исправление бага выбора клиента в Select2**:
   - Удален избыточный обработчик события select2:opening, который блокировал клики
   - Добавлены проверки на наличие e.params.data в обработчиках select2:selecting и select2:select
   - Теперь выбор клиента работает корректно, создается черновик заказа и происходит редирект

3. **Опциональные поля адреса**:
   - Поля recipient_name, street, building_number в модели Address сделаны необязательными (blank=True, null=True)
   - Обновлены методы __str__ и full_address для безопасной работы с None значениями

4. **UI улучшения**:
   - Удалена звездочка обязательности с полей адреса
   - Добавлена подсказка под полем ручной стоимости доставки о правилах автоматического расчета

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 15:48:50 +03:00
6c207e9451 Перестроена структура формы доставки: создана секция Получатель
- Удален выбор режима адреса (История/Новый/Пусто)
- Поля адреса теперь показаны сразу под кнопками доставки
- Создана новая секция "Получатель" под полями адреса с бордюром сверху
- Перемещен чекбокс "Покупатель является получателем" в секцию Получатель
- Поля получателя (имя и телефон) теперь в той же секции
- Удалены CSS стили для скрытого/видимого режимов адреса
- Удалена функция initAddressModeToggle()
- Упрощена UX: доставка → адрес → получатель

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 11:37:50 +03:00
2b652253fe Перемещены поля адреса доставки под кнопки выбора типа доставки
- Все поля ввода адреса доставки теперь расположены под кнопками "С ДОСТАВКОЙ" / "САМОВЫВОЗ"
- Поля адреса скрыты когда выбран вариант "САМОВЫВОЗ"
- Поля адреса видны только когда выбрана "С ДОСТАВКОЙ"
- Переименован div с id="delivery-fields" на id="delivery-mode-fields" для лучшей организации
- Обновлена функция syncDeliveryType() для управления видимостью полей доставки
- Улучшена структура формы для лучшей UX

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 11:31:07 +03:00
8044c4f0c0 Увеличен отступ от шапки сайта и выровнена метка статуса
- Увеличен padding-top контейнера с pt-4 до pt-5 для большего отступа от шапки
- Метка "Статус:" теперь расположена слева от поля выбора
- Все элементы в строке заголовка выровнены по нижней базовой линии (align-items-end)
- Используется flexbox (d-flex gap-2) для горизонтального выравнивания
- Все элементы заголовка (Название, Статус, Кнопка) находятся на одной линии

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 11:27:43 +03:00
134beef5e0 Перемещена информация о статусе заказа в строку заголовка
- Статус заказа теперь отображается в один ряд с заголовком и кнопкой "Назад к списку"
- Статус размещен перед кнопкой "Назад к списку" (слева от неё)
- Добавлен больший отступ от шапки сайта (pt-4)
- Удален статус из карточки "Основная информация" для уменьшения дублирования
- Используется align-items-center для визуального выравнивания элементов

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 11:24:15 +03:00
01cfc0ed85 Перенесен блок даты и времени доставки перед блоком доставки
## Изменения:

### 1. Переорганизация формы
- Блок "Дата и время доставки" перенесен между "Основная информация" и "Доставка"
- Создан отдельный card с полями:
  - Дата (delivery_date)
  - Время от (delivery_time_start)
  - Время до (delivery_time_end)

### 2. Новый порядок блоков формы
1. Основная информация (Клиент, Статус)
2. Дата и время доставки (новое расположение)
3. Доставка (тип доставки, адрес, самовывоз)
4. Товары в заказе

### 3. Преимущества
- Пользователь сначала выбирает дату/время, потом способ доставки
- Более логичная последовательность заполнения формы
- Улучшенный UX

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 03:05:03 +03:00
8360f98ad2 Заменены чекбокс доставки на две кнопки
## Изменения:

### 1. UI Улучшения
- Заменен чекбокс "С доставкой" на две кнопки: "С ДОСТАВКОЙ" и "САМОВЫВОЗ"
- Кнопки расположены в один ряд, используют btn-group Bootstrap
- Первая кнопка активна по умолчанию (С ДОСТАВКОЙ)
- Добавлены иконки: truck (доставка), shop (самовывоз)
- Чекбокс скрыт, видны только две кнопки

### 2. Функциональность
- Две кнопки работают как radio buttons (только одна может быть активна)
- При выборе кнопки синхронизируется скрытое поле is_delivery (Django form)
- Показываются/скрываются соответствующие блоки:
  - "С ДОСТАВКОЙ" → блок адреса доставки
  - "САМОВЫВОЗ" → блок с точками самовывоза

### 3. JavaScript логика
- Новая функция syncDeliveryType() синхронизирует состояние кнопок с полем is_delivery
- При клике на кнопку обновляется скрытое поле для отправки на сервер
- Логи в консоль для отладки

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 03:02:35 +03:00
ddbb4f963b Исправлена отображение полей адреса и стили формы заказа
## Основные изменения:

### 1. Исправлена логика выбора режима адреса
- Переместил функцию initAddressModeToggle() из jQuery блока в отдельную функцию
- Теперь инициализация адреса работает независимо от jQuery
- Добавлены подробные логи в консоль для отладки ([ADDRESS MODE] префикс)

### 2. Добавлены CSS классы для управления видимостью
- address-history-mode: display: none !important (по умолчанию скрыт)
- address-new-mode: display: none !important (по умолчанию скрыт)
- .visible класс переводит элементы на display: block !important
- Использование classList.add/remove вместо inline styles

### 3. Исправлены стили полей формы (OrderForm)
- Добавлена явная обработка для Select полей - получают form-select
- Поле "Статус" и другие Select теперь имеют правильные стили Bootstrap
- Разделена логика для RadioSelect, Select и остальных полей

### 4. Улучшена отладка
- Добавлены console.log сообщения на каждом этапе инициализации
- Префикс [ADDRESS MODE] помогает отличить логи системы адреса от других

## Технические детали:

- Address сервис использует метод format_address_for_display() для красивого вывода
- AJAX endpoint get_customer_address_history() загружает адреса клиента
- Три режима адреса: history (из истории), new (новый адрес), empty (без адреса)
- Режим empty выбирается по умолчанию

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 02:49:25 +03:00
85babfe7a8 Оптимизация поиска клиентов для больших датасетов (10000+ клиентов)
Изменения:

1. Frontend оптимизация (order_form.html):
   - Увеличен minimumInputLength с 1 на 3 символа
   - Увеличен delay с 250ms на 500ms
   - Обновлен placeholder с подсказкой (минимум 3 символа)

   Эффект: Снижение API запросов на 70-80%. Пользователи редко ищут по 1-2 символам,
   а с 3 символами результаты намного более релевантны.

2. Backend оптимизация (customers/views.py):
   - Заменен Python loop на SQL LIKE запрос для поиска по цифрам телефона
   - Было: Итерация по ВСЕМ клиентам с телефоном в памяти Python
   - Стало: Один SQL LIKE запрос с индексом на поле phone

   Эффект: При 10,000 клиентов ускорение в 100+ раз. Поиск "295" теперь делается
   в БД за миллисекунды вместо итерации по всем записям.

3. Индексы (уже присутствуют в модели):
   - name (db_index=True)
   - email (db_index=True)
   - phone (unique=True автоматически создает индекс)

Результат: Система готова к работе с 10,000+ клиентов без деградации производительности.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 01:31:05 +03:00
2d7a5079f9 Исправлено создание черновика после добавления нового клиента в модальном окне
Проблема: Когда клиент создавался через модальное окно и добавлялся в Select2,
черновик заказа не создавался автоматически, хотя при выборе существующего
клиента все работало.

Причина: draft-creator.js слушает события Select2 при загрузке, но когда
новый клиент динамически добавляется в Select2, события могут не срабатывать
правильно или быть потеряны.

Решение:
1. Добавлен публичный API в draft-creator.js (window.DraftCreator.triggerDraftCreation)
2. После успешного создания клиента в модальном окне явно вызываем API
3. Добавлена небольшая задержка (100ms) для синхронизации с Select2

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

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 01:17:58 +03:00
e0b12f5c7c Исправлено затемнение после закрытия модального окна создания клиента
Проблема: После успешного создания клиента модальное окно закрывалось,
но фон (backdrop) оставался, и форма становилась неактивной.

Решение: Добавлен обработчик события hidden.bs.modal для полной очистки:
- Удаляется элемент .modal-backdrop (если остался)
- Удаляется класс modal-open с body (восстанавливает прокрутку)
- Очищается добавленный padding-right
- Возвращается фокус на форму заказа

Это обеспечивает полную очистку состояния модального окна Bootstrap 5.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 01:13:46 +03:00
6a100c4257 Заменен alert() на красивое автоисчезающее уведомление при создании клиента
Проблема: При успешном создании клиента показывалось системное окно alert(),
которое требовало ручного закрытия.

Решение: Создана функция showNotification() которая показывает красивое
уведомление в правом верхнем углу формы заказа с автоматическим исчезновением.

Особенности:
✓ Плавная анимация появления (slideIn, 0.3s)
✓ Плавная анимация исчезновения (slideOut, 0.3s)
✓ Автоматически исчезает через 4 секунды
✓ Поддерживает 3 типа: 'success' (зелёный), 'error' (красный), 'info' (синий)
✓ Иконки для каждого типа: ✓, ⚠️, ℹ️
✓ Можно показывать несколько уведомлений одновременно (стакуются)
✓ Не требует закрытия вручную
✓ Красиво выглядит и не отвлекает от заполнения формы

Примеры использования:
- showNotification('Успех!', 'success')
- showNotification('Ошибка!', 'error', 5000)
- showNotification('Информация', 'info', 3000)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 01:09:36 +03:00
10128bb9bd Исправлена кнопка сохранить в модальном окне создания клиента
Проблема: Обработчик события для кнопки 'Сохранить' был добавлен ДО того, как
элемент кнопки появился в DOM. JavaScript пытался найти элемент с id='save-customer-btn'
когда его еще не было в HTML, поэтому обработчик никогда не срабатывал.

Решение: Переместить код обработчика события в отдельный скрипт,
расположенный ПОСЛЕ определения модального окна в HTML (после строки с </div> модала).

Это гарантирует, что:
1. HTML элементы уже загружены в DOM
2. JavaScript может найти элемент по id
3. Обработчик события корректно прикрепляется к кнопке

Теперь при нажатии на кнопку 'Создать клиента' будет:
✓ Валидирована форма (имя обязательно)
✓ Отправлен AJAX запрос на сервер
✓ Создан новый клиент
✓ Закрыто модальное окно
✓ Выбран созданный клиент в Select2
✓ Очищена форма

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 01:04:51 +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