Мигрированы все 31 страница модуля inventory с устаревшего base_inventory.html (с sidebar) на новый base_inventory_minimal.html (без sidebar).
Изменения:
- Обновлены все extends на base_inventory_minimal.html
- Добавлены breadcrumb блоки для навигации на всех страницах
- Удалён устаревший base_inventory.html с боковой панелью
- Единообразный UI на всех страницах склада
Обновлённые разделы (31 файл):
- Allocation (1): распределение продаж
- Batch (2): партии товаров
- Incoming (4): приходы товара
- Incoming Batch (2): партии поступлений
- Inventory (3): инвентаризация
- Movements (1): журнал операций
- Reservation (3): резервирования
- Sale (4): продажи
- Stock (2): остатки
- Transfer (3): перемещения
- Warehouse (3): склады
- Writeoff (3): списания
Результат:
- Консистентный минималистичный дизайн на всех страницах
- Больше пространства для контента (100% ширины вместо 75%)
- Улучшенная навигация через breadcrumbs и dropdown меню
- Проще поддержка (один базовый шаблон вместо двух)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Переработан дизайн главной страницы и страницы инвентаризаций в сторону минимализма, компактности и простоты.
Основные изменения:
- Главная страница: заменены карточки на компактный список с монохромной схемой
- Страница инвентаризаций: убран sidebar, добавлены inline фильтры, компактная таблица
- Создан новый минималистичный базовый шаблон без боковой панели
- Добавлен template tag для получения списка складов
- Статусы отображаются точками вместо крупных badges
- Упрощена пагинация (только prev/next + счётчик)
- Монохромная цветовая палитра (серые оттенки)
- Сокращено вертикальное пространство на 70-75%
Файлы:
- inventory/templates/inventory/home.html - список вместо карточек
- inventory/templates/inventory/inventory/inventory_list.html - компактная таблица с фильтрами
- inventory/templates/inventory/base_inventory_minimal.html - новый базовый шаблон
- inventory/templatetags/inventory_tags.py - template tag для фильтров
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Features:
- Created OrderStatus model for managing statuses per tenant
- Added system-level statuses: draft, new, confirmed, in_assembly, in_delivery, completed, return, cancelled
- Implemented CRUD views for managing order statuses
- Created OrderStatusService with status transitions and business logic hooks
- Updated Order model to use ForeignKey to OrderStatus
- Added is_returned flag for tracking returned orders
- Updated filters to work with new OrderStatus model
- Created management command for status initialization
- Added HTML templates for status list, form, and confirmation
- Fixed views.py to use OrderStatus instead of removed STATUS_CHOICES
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
- Изменено поле 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>
- Add management command to recalculate quantity_reserved for all Stock records
- Add signals to automatically update Stock when Reservation changes
- Implement post_save signal for Reservation creation/updates
- Implement post_delete signal for Reservation deletion
- Both signals call Stock.refresh_from_batches() to recalculate quantities
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Исправлены 4 проблемы:
1. Расчёт цены первого товара - улучшена валидация в getProductPrice и calculateFinalPrice
2. Отображение actual_price в Select2 вместо обычной цены
3. Количество по умолчанию = 1 для новых форм компонентов
4. Auto-select текста при клике на поле количества для удобства редактирования
Изменённые файлы:
- products/forms.py: добавлен __init__ в KitItemForm для quantity.initial = 1
- products/templates/includes/select2-product-init.html: обновлена formatSelectResult
- products/templates/productkit_create.html: добавлен focus handler для auto-select
- products/templates/productkit_edit.html: добавлен focus handler для auto-select
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Проблема: товары отображались как "нет в наличии" несмотря на наличие остатков на складе.
Причина: сигналы на обновление Product.in_stock срабатывают только при изменении Stock через Django ORM.
Если Stock была создана напрямую (импорт, миграция и т.д.), сигналы не срабатывали.
Решение:
1. Исправлена логика сигналов (inventory/signals.py):
- Добавлен импорт post_delete для правильной обработки удаления Stock
- Изменён pre_delete на post_delete для более надёжной проверки остатков
- Сигналы теперь правильно срабатывают при любом изменении Stock
2. Добавлена миграция (products/migrations/0004_fix_product_in_stock.py):
- Пересчитывает in_stock для всех существующих товаров на основе Stock.quantity_available
- Товар считается в наличии если есть хотя бы один Stock с quantity_available > 0
- Обратима и безопасна (может быть отменена)
3. Добавлена команда управления (products/management/commands/update_product_in_stock.py):
- Позволяет вручную пересчитать in_stock если потребуется
- Поддерживает параметр --verbose для подробного логирования
- Может быть запущена по расписанию или вручную
После этого исправления:
- Все товары с остатками на складе автоматически обновляют статус in_stock
- Сигналы срабатывают при любом изменении Stock (создание, обновление, удаление)
- Отображение наличия товаров в UI будет корректным
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Добавлена система управления наличием товаров на трёх уровнях:
1. Product.in_stock (поле БД)
- Булево значение: есть/нет в наличии
- Автоматически обновляется при изменении Stock
- Используется для быстрого поиска и фильтрации товаров
2. Сигналы для синхронизации (inventory/signals.py)
- При изменении Stock → обновляется Product.in_stock
- Логика: товар в наличии если есть Stock с quantity_available > 0
3. ProductVariantGroup.in_stock (свойство)
- Вариант в наличии если хотя бы один из товаров в наличии
- Динамически рассчитывается по Product.in_stock товаров в группе
4. ProductVariantGroup.price (свойство)
- Цена по приоритету: берём цену товара с приоритетом 1, если он в наличии
- Если никто не в наличии: берём максимальную цену из всех товаров
- Возвращает Decimal или None если группа пуста
Файлы:
- myproject/products/models.py: добавлено поле in_stock и свойства в ProductVariantGroup
- myproject/inventory/signals.py: добавлены сигналы для синхронизации
- myproject/products/migrations/0003_add_product_in_stock.py: миграция для поля in_stock
- VARIANT_STOCK_IMPLEMENTATION.md: полная документация архитектуры
- QUICK_REFERENCE.md: быстрая справка по использованию
Особенности:
✓ Система простая и элегантная (без костылей)
✓ Обратная совместимость не требуется
✓ Высокая производительность (индексирование, минимум JOIN'ов)
✓ Актуальные данные (сигналы гарантируют синхронизацию)
✓ Легко расширяемая (свойства можно менять без миграций)
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Основные изменения:
- Создана модель IncomingBatch для группировки товаров по документам
- Каждое поступление (Incoming) связано с одной батчем поступления
- Автоматическое создание StockBatch для каждого товара в приходе
- Реализована система нумерации партий (IN-XXXX-XXXX) с поиском максимума в БД
- Обновлены все представления (views) для работы с новой архитектурой
- Добавлены детальные страницы просмотра партий поступлений
- Обновлены шаблоны для отображения информации о партиях и их товарах
- Исправлена логика сигналов для создания StockBatch при приходе товара
- Обновлены формы для работы с новой структурой IncomingBatch
Архитектура FIFO:
- IncomingBatch: одна партия поступления (номер IN-XXXX-XXXX)
- Incoming: товар в партии поступления
- StockBatch: одна партия товара на складе (создается для каждого товара)
Это позволяет системе правильно применять FIFO при продаже товаров.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Реализована полноценная система мультитенантности на базе django-tenants.
Каждый магазин получает изолированную схему БД и поддомен.
Основные компоненты:
Django-tenants интеграция:
- Модели Client (тенант) и Domain в приложении tenants/
- Разделение на SHARED_APPS и TENANT_APPS
- Public schema для общей админки
- Tenant schemas для изолированных данных магазинов
Система регистрации магазинов:
- Публичная форма регистрации на /register/
- Модель TenantRegistration для заявок со статусами (pending/approved/rejected)
- Валидация schema_name (латиница, 3-63 символа, уникальность)
- Проверка на зарезервированные имена (admin, api, www и т.д.)
- Админ-панель для модерации заявок с кнопками активации/отклонения
Система подписок:
- Модель Subscription с планами (триал 90 дней, месяц, квартал, год)
- Автоматическое создание триальной подписки при активации
- Методы is_expired() и days_left() для проверки статуса
- Цветовая индикация в админке (зеленый/оранжевый/красный)
Приложения:
- tenants/ - управление тенантами, регистрация, подписки
- shops/ - точки магазинов/самовывоза (tenant app)
- Обновлены миграции для всех приложений
Утилиты:
- switch_to_tenant.py - переключение между схемами тенантов
- Обновлены image_processor и image_service
Конфигурация:
- urls_public.py - роуты для public schema (админка + регистрация)
- urls.py - роуты для tenant schemas (магазины)
- requirements.txt - добавлены django-tenants, django-environ, phonenumber-field
Документация:
- DJANGO_TENANTS_SETUP.md - настройка мультитенантности
- TENANT_REGISTRATION_GUIDE.md - руководство по регистрации
- QUICK_START.md - быстрый старт
- START_HERE.md - общая документация
Использование:
1. Пользователь: http://localhost:8000/register/ → заполняет форму
2. Админ: http://localhost:8000/admin/ → активирует заявку
3. Результат: http://{schema_name}.localhost:8000/ - готовый магазин
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>