Commit Graph

44 Commits

Author SHA1 Message Date
7d7038e67b Улучшение календаря фильтра дат: выбранные даты теперь всегда видны на экране 2025-12-27 02:42:26 +03:00
1654962ba2 feat(inventory): add validation for item availability in released reservations
- Implement `check_released_reservations_available` function to verify if items from released reservations are still available for re-sale when attempting to change a returned order's status
- Update `create_sale_on_order_completion` signal to use this check, allowing transitions to positive statuses only if items are available, otherwise blocking with ValidationError
- Wrap Order.save() in transaction.atomic() to ensure ValidationError in signals rolls back the save operation
- Add comprehensive tests for scenarios where items are available or used in other orders
- Update date carousel in order to always center on today's date and remove unnecessary saving logic
- Add test flag to Django Debug Toolbar settings

Closes #123 (assuming related issue)
2025-12-27 02:31:43 +03:00
61ce3f550d Улучшен интерфейс ввода даты и времени доставки
- Исправлены имена полей времени (time_from/time_to вместо delivery_time_start/end)
- Поля времени сделаны необязательными (дата остается обязательной)
- Добавлен улучшенный UI с быстрыми кнопками для даты и времени
- Поля ввода расположены в один ряд, кнопки быстрого выбора ниже
- Добавлены CSS и JS файлы для улучшенного интерфейса
- Обновлена валидация: время необязательно, но если указано одно - должно быть и другое
2025-12-24 18:25:20 +03:00
d29c736252 refactor(orders): clean up order form structure and improve script loading 2025-12-23 21:12:53 +03:00
b1d5ebb6df refactor(orders): extract unified transaction form to reusable module
Moved payment/refund form logic from order_form.html to a dedicated
unified_transaction_form.js module for better code organization.

Changes:
- Created unified_transaction_form.js with initUnifiedTransactionForm() (~233 lines)
  - Dual mode: payment and refund switching
  - Dynamic form action and field names
  - Payment method selection with validation
  - Wallet balance limits for account_balance method
  - Amount constraints based on mode
  - Real-time UI updates and validation

- Updated order_form.html:
  - Added unified_transaction_form.js include
  - Added initialization call with Django template data
  - Removed inline transaction form code (~175 lines)
  - Passes URLs and amounts via options

Benefits:
- Cleaner template (175 lines removed)
- Reusable transaction form logic
- Easier to test and maintain
- Configurable via options or data-attributes
- No duplication between payment/refund modes

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-23 16:36:41 +03:00
5de1ae9bb9 refactor(orders): extract form cleanup to reusable module
Moved empty order items cleanup logic from order_form.html to a dedicated
order_form_cleanup.js module for better code organization.

Changes:
- Created order_form_cleanup.js with initOrderFormCleanup() function (~136 lines)
  - Automatically removes empty order item forms before submit
  - Handles both new and saved forms differently
  - Updates TOTAL_FORMS and reindexes remaining forms
  - Compatible with Django formsets

- Updated order_form.html:
  - Added order_form_cleanup.js include
  - Added initialization call for #order-form
  - Removed inline cleanup code (~111 lines)

Benefits:
- Cleaner template (111 lines removed)
- Reusable across other formset-based forms
- Easier to test and maintain
- Consistent with other extracted modules

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-23 16:10:57 +03:00
fb4f14f475 refactor(orders): extract Customer Select2 to separate module
Extracted customer selection and creation functionality from order_form.html
to a reusable customer_select2.js module for better maintainability.

Changes:
- Created customer_select2.js (~450 lines) with IIFE pattern
  - AJAX customer search with Select2 integration
  - Smart parsing of email/phone/name from search input
  - Modal-based customer creation with validation
  - Toast notifications system
  - Auto-initialization via data-attributes
  - Global function exports for backward compatibility

- Updated order_form.html:
  - Added CSRF meta-tag for token access
  - Added data-attributes to customer select element
  - Included customer_select2.js script
  - Removed ~370 lines of inline JavaScript

Benefits:
- Improved code organization and readability
- Reusable across other pages requiring customer selection
- Better browser caching for static JS
- Consistent with existing select2-product-search.js pattern

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-23 15:18:02 +03:00
456ae0b742 фикс 2025-12-04 13:59:10 +03:00
4de89fca43 UX: Автоматическое выделение суммы для быстрой замены
При выборе способа оплаты сумма теперь автоматически выделяется,
позволяя пользователю сразу начать вводить новое значение без
необходимости вручную выделять текст.

Улучшение скорости ввода для оператора POS.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 00:12:33 +03:00
0bbc0f6633 FEATURE: Новый построчный UI для смешанной оплаты в POS
Полностью переработан интерфейс смешанной оплаты:

НОВЫЙ UI:
- Построчное добавление платежей с галочкой подтверждения
- Каждая строка: [Способ ▼] [Сумма] [✓] [🗑️]
- Зафиксированные платежи показываются отдельно с зеленой галочкой
- Кнопка "+ Добавить еще часть платежа" (скрывается при остатке = 0)
- Индикатор "Осталось оплатить" / "Оплачено полностью"

ФУНКЦИОНАЛЬНОСТЬ:
 Автоподстановка остаточной суммы при выборе способа оплаты
 Автофокус на поле суммы после выбора способа
 Inline валидация с красными подсказками под полем
 Проверка превышения остатка и баланса кошелька
 Удаление любого платежа (зафиксированного или нет)
 Автодобавление пустой строки при удалении всех платежей

ИЗМЕНЕНИЯ В КОДЕ:
+ Новые методы: addPaymentRow(), renderPaymentRows(), attachPaymentRowEvents()
+ Новые методы: confirmPaymentRow(), removePaymentRow(), updateRemainingHint()
~ Обновлены: render(), getTotalPayments(), validate(), submit(), attachEvents()
~ getTotalPayments() теперь учитывает только зафиксированные платежи (fixed: true)
- Удалены старые методы: addPayment(), removePayment(), updatePaymentsList(), renderPaymentsList()

SINGLE MODE остался без изменений.

Проблема решена: больше невозможно "забыть" добавить последний платеж,
так как каждый платеж фиксируется галочкой явно.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 23:30:12 +03:00
8e6394fb71 UX: Удалено поле "Примечание" из виджета оплаты в POS
Убрано лишнее поле "Примечание" из PaymentWidget:
- Удалено HTML-поле для ввода примечания
- Убраны все обращения к notesInput в коде
- Примечания теперь передаются как пустая строка

Для POS-терминала это поле избыточно и только замедляет процесс оплаты.
Интерфейс стал проще и быстрее.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 21:36:19 +03:00
12282a8ce4 FIX: Исправлена автоподстановка суммы при смешанной оплате + убраны версии JS
1. Убран параметр версии ?v=4 из подключения terminal.js (для разработки не нужен)

2. Исправлена логика автоподстановки суммы в PaymentWidget:
   - Теперь при выборе способа оплаты подставляется ОСТАТОЧНАЯ сумма
   - Остаток = amount_due - уже добавленные платежи
   - Добавлена подсказка "Осталось оплатить: X руб."

Пример:
- Заказ на 30 руб.
- Добавили платеж 10 руб. наличными
- Выбираем картой → автоматически подставится 20 руб. (а не 30!)

Это предотвращает ошибки и переплаты при смешанной оплате.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 21:31:45 +03:00
0ed60954c4 UX: Удалена лишняя кнопка "Оплатить" из виджета оплаты
Убрана кнопка "Оплатить" внутри PaymentWidget, чтобы избежать путаницы.
Теперь есть только одна кнопка "Подтвердить продажу" внизу модального окна.

При смешанной оплате:
- Кнопка "Добавить платеж" для добавления способов оплаты
- Кнопка "Подтвердить продажу" для завершения (внизу модалки)

Это удобнее и безопаснее - пользователи не будут случайно нажимать
не ту кнопку при добавлении нескольких платежей.

Версия JS: v4

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 20:42:48 +03:00
1cda9086d0 Реализована полноценная система оплаты для POS-терминала
Добавлена интеграция оплаты в POS с поддержкой одиночной и смешанной оплаты,
работой с кошельком клиента и автоматическим созданием заказов.

Backend изменения:
- TransactionService: добавлены методы get_available_payment_methods() и create_multiple_payments()
  для фильтрации способов оплаты и атомарного создания нескольких платежей
- POS API: новый endpoint pos_checkout() для создания заказов со статусом "Выполнен"
  с обработкой платежей, освобождением блокировок и очисткой корзины
- Template tags: payment_tags.py для получения способов оплаты в шаблонах

Frontend изменения:
- PaymentWidget: переиспользуемый ES6 класс с поддержкой single/mixed режимов,
  автоматической валидацией и интеграцией с кошельком клиента
- terminal.html: компактное модальное окно (70vw) с оптимизированной компоновкой,
  удален функционал скидок, добавлен показ баланса кошелька
- terminal.js: динамическая загрузка PaymentWidget, интеграция с backend API,
  обработка успешной оплаты и ошибок

Поддерживаемые способы оплаты: наличные, карта, онлайн, баланс счёта.
Смешанная оплата позволяет комбинировать несколько способов в одной транзакции.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 15:38:35 +03:00
9a44c98e6e Simplify order creation and editing - remove autosave
- Removed autosave.js (665 lines) and draft-creator.js (441 lines)
- Removed draft_service.py (~500 lines) and DraftOrderService
- Removed AJAX endpoints: autosave and create-draft
- Updated order_create() to add is_create_page flag
- Updated order_update() to finalize drafts without DraftOrderService
- Added get_new_status() method to OrderStatusService
- Updated order_form.html:
  - Removed old JS includes
  - Added beforeunload warning for unsaved data
  - Updated buttons: separate buttons for create/draft/finalize
- Total code reduction: ~1600 lines (92% removed)

New workflow:
- /orders/create/ - user fills form, chooses button
- /orders/<id>/edit/ - simple editing without autosave
- beforeunload warning when leaving page (except on submit)
2025-11-28 23:29:19 +03:00
f911a57640 Before simplifying order creation and editing 2025-11-28 23:11:34 +03:00
0653ec0545 Рефакторинг моделей заказов и добавление методов оплаты 2025-11-26 13:38:02 +03:00
3b4785e2ad Fix: Implement proper deletion of order items with confirmation dialog
Fixes deletion functionality for order items across frontend and backend:
- Remove restriction preventing deletion of last item
- Add confirmation dialog before deletion
- Properly track and send deleted item IDs to backend via autosave
- Update backend to handle item deletion by ID instead of index
- Fix visual feedback: deleted items are hidden immediately
- Auto-recalculate total sum after deletion

Technical changes:
- order_form.html: Add confirmation dialog, trigger autosave on delete
- autosave.js: Collect deleted item IDs, send to backend
- draft_service.py: Process deleted_item_ids, update items by ID

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-26 06:27:27 +03:00
a3f5ac4c08 Fix: Enable autosave for delivery address fields with partial data
Исправлена проблема с автосохранением полей адреса доставки. Теперь адрес
сохраняется при заполнении любого поля, а не только при наличии улицы и
номера дома.

Изменения в Backend (address_service.py):
- Изменена логика валидации в process_address_from_form()
- Теперь адрес сохраняется если заполнено хотя бы одно поле
- Удалено жёсткое требование заполнения street и building_number
- Проверяем наличие данных во всех полях адреса

Изменения в Frontend (autosave.js):
- Переработана логика сбора данных адреса
- address_mode='new' устанавливается при заполнении любого поля адреса
- Все непустые поля адреса отправляются на сервер
- Используется более элегантный подход с Object.values() и .some()

Теперь автосохранение работает корректно:
- Заполнение поля "Улица" → автосохранение срабатывает
- Заполнение "Номер дома" → автосохранение срабатывает
- Заполнение любого другого поля адреса → автосохранение срабатывает
- После перезагрузки страницы все данные восстанавливаются

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 19:49:58 +03:00
4a4bd437b9 refactor: Заменить сущность Магазин (Shop) на Склад (Warehouse)
Упрощена логика системы путём замены отдельной сущности "Магазин"
на универсальную сущность "Склад", которая может использоваться
как точка самовывоза.

Изменения:
- Расширена модель Warehouse: добавлены адрес, контакты, флаг is_pickup_point
- Модель Order: поле pickup_shop заменено на pickup_warehouse
- Обновлены все формы, сервисы, views, admin для работы со складами
- Обновлены шаблоны HTML и JavaScript код
- Удалено приложение shops полностью
- Пересозданы миграции БД
- Обновлён навбар (удалена ссылка на магазины)

Преимущества:
- Упрощена архитектура системы
- Единая точка управления складами и точками самовывоза
- Интеграция с системой инвентаризации

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 23:50:30 +03:00
d3ac875a0e fix: Исправлена работа черновиков заказов и добавлено автосохранение статуса
Проблема 1: Ошибка 500 при создании черновика заказа
- Поле status в модели Order является ForeignKey на OrderStatus
- В коде использовались строковые значения 'draft' и 'new' вместо объектов
- Это приводило к TypeError при создании/обновлении заказов

Решение:
- В DraftOrderService.create_draft: добавлен get_or_create для статуса 'draft'
- В DraftOrderService.finalize_draft: добавлен get_or_create для статуса 'new'
- В DraftOrderService.get_user_drafts: заменен фильтр status='draft' на status__code='draft'
- В DraftOrderService.delete_old_drafts: заменен фильтр status='draft' на status__code='draft'
- В cleanup_draft_orders.py: исправлен фильтр в режиме dry-run

Проблема 2: Отсутствие автосохранения при изменении статуса
- Поле status не отслеживалось в autosave.js
- При смене статуса заказ не сохранялся автоматически

Решение:
- Добавлено поле 'select[name="status"]' в список отслеживаемых полей
- Добавлен сбор значения статуса в функции collectFormData
- Добавлено 'status': 'orders.OrderStatus' в fk_fields для обработки на сервере

Дополнительно:
- Добавлено автосохранение полей адреса доставки (улица, дом, квартира и т.д.)
- Добавлено автосохранение полей получателя (имя, телефон)
- Добавлена автоматическая установка address_mode='new' при наличии адреса

Файлы:
- orders/services/draft_service.py
- orders/management/commands/cleanup_draft_orders.py
- orders/static/orders/js/autosave.js

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 23:00:24 +03:00
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
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
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
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
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
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
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
6bbd615a77 Refactor: remove unused code from date carousel
- Removed unused calculateDateOffset() method (19 lines)
- Removed unused loadSelectedDate() method that only logged
- Removed unused isCenter property from day objects
- Simplified localStorage save/load (removed offset parameter)
- Removed complex JSON parsing logic, now stores date string directly
- Code is cleaner and easier to maintain

Total: removed 82 lines of unused code

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 22:19:42 +03:00
5198502fa3 Fix date carousel position persistence to keep selected date in place
- Selected date now stays at its clicked position instead of jumping to center
- Fixed timezone issue in localStorage causing dates to shift by one day
- Carousel position is preserved across page reloads
- Simplified date selection logic by removing complex offset calculations
- Added updateSelectedState() method to update selection without re-rendering

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 21:59:13 +03:00
2a431e32b1 Fix button selector to properly find 'Today' button in the filter container 2025-11-07 21:00:10 +03:00
8e1b6fc157 Fix 'Today' button functionality to properly set date filters and submit form 2025-11-07 20:54:04 +03:00
efeb396204 Add 'Today' button next to date filter label 2025-11-07 20:37:17 +03:00
ed2647e45c Fix date selection position preservation in calendar carousel 2025-11-07 20:31:19 +03:00
b9665e8761 Исправлена проблема с центрированием выбранной даты: теперь выбранная дата остается в центре при клике, включая даты за пределами видимой области 2025-11-07 20:06:21 +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
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