Исправлены 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>
4.9 KiB
4.9 KiB
Тестирование системы инвентаризации
Статус: ✅ ВСЕ ТЕСТЫ ПРОЙДЕНЫ
1. FIFO Логика ✅
Тест: Создание 3 приходов с разными ценами и списание через FIFO
Результат:
- ✅ StockBatches создаются автоматически при Incoming (сигнал)
- ✅ Продажа автоматически применяет FIFO (сигнал)
- ✅ Распределение по партиям корректно: старые партии списываются первыми
- ✅ SaleBatchAllocation корректно отслеживают распределение
Примеры:
Приход 1: 10 шт @ 100
Приход 2: 15 шт @ 120
Приход 3: 20 шт @ 150
Продажа 1: 18 шт @ 250
→ Allocation: 10 (от batch1) + 8 (от batch2)
Продажа 2: 20 шт @ 250
→ Allocation: 7 (от batch2) + 13 (от batch3)
2. Сигналы на заказы ✅
Тест: Создание заказа, изменение статуса на "in_delivery"
Результат:
- ✅ Заказ создан и содержит товар
- ✅ При смене статуса на "in_delivery" автоматически создается Sale
- ✅ Sale автоматически обрабатывается с FIFO
- ✅ SaleBatchAllocation создаются автоматически
3. Инвентаризация (Reconciliation) ✅
Тест: Физический подсчёт с дефицитом
Результат:
- ✅ Inventory создаётся и принимает InventoryLines
- ✅ При завершении Inventory (status='completed') автоматически обрабатывается (сигнал)
- ✅ Дефицит (разница < 0) автоматически создает WriteOff по FIFO
- ✅ Stock коррегируется для совпадения с физическим подсчётом
Пример:
Система имела: 7 шт
Физический подсчёт: 5 шт
Разница: -2 шт
Результат:
→ WriteOff создан на 2 шт
→ Stock уменьшен до 5 шт
4. Django Admin ✅
Проверено:
- ✅ StockBatchAdmin показывает quantity с цветовой кодировкой:
- Красный (≤0)
- Оранжевый (<10)
- Зелёный (≥10)
- ✅ SaleAdmin показывает inline SaleBatchAllocations
- ✅ Статус обработки Sale отображается с визуальным индикатором
- ✅ WriteOffAdmin показывает причины списания
Архитектура
Модели
- StockBatch: Партия товара с FIFO датой создания
- Incoming: Приход → автоматически создает StockBatch (сигнал)
- Sale: Продажа → автоматически применяет FIFO (сигнал)
- SaleBatchAllocation: Отслеживание какие батчи использованы в продаже
- Inventory/InventoryLine: Физический подсчёт
- WriteOff: Списание при дефиците (автоматическое по FIFO)
- Reservation: Резервирование при создании заказа
Сигналы (Автоматизация)
- create_stock_batch_on_incoming: Создает StockBatch при Incoming
- process_sale_fifo: Применяет FIFO при создании Sale
- create_sale_on_order_shipment: Создает Sale при смене статуса заказа на "in_delivery"
- reserve_stock_on_order_create: Резервирует товар при создании заказа
- process_inventory_reconciliation: Обрабатывает инвентаризацию при завершении
Исправленные ошибки
- Двойной вызов сигнала на Sale: Использован
update()вместоsave()чтобы избежать повторного срабатывания - WriteOff не создавался при инвентаризации: Добавлен сигнал на Inventory
- StockBatch не создавались при Incoming: Добавлен сигнал на Incoming
Готовность к продакшену
✅ FIFO логика работает корректно ✅ Все основные операции автоматизированы через сигналы ✅ Admin интерфейс полностью функционален ✅ Данные консистентны между таблицами ✅ Система многотенантная (работает в рамках каждого тенанта)
Дата тестирования: 2025-10-27