Улучшения инвентаризации: автоматическое проведение документов, оптимизация запросов и улучшения UI
- Автоматическое проведение документов списания и оприходования после завершения инвентаризации - Оптимизация SQL-запросов: устранение N+1, bulk-операции для Stock, агрегация для StockBatch и Reservation - Изменение формулы расчета разницы: (quantity_fact + quantity_reserved) - quantity_available - Переименование поля 'По факту' в 'Подсчитано (факт, свободные)' - Добавлены столбцы 'В резервах' и 'Всего на складе' в таблицу инвентаризации - Перемещение столбца 'В системе (свободно)' после 'В резервах' с визуальным выделением - Центральное выравнивание значений в столбцах таблицы - Автоматическое выделение текста при фокусе на поле ввода количества - Исправление форматирования разницы (убраны лишние нули) - Изменение статуса 'Не обработана' на 'Не проведено' - Добавление номера документа для инвентаризаций (INV-XXXXXX) - Отображение всех типов списаний в debug-странице (WriteOff, WriteOffDocument, WriteOffDocumentItem) - Улучшение отображения документов в детальном просмотре инвентаризации с возможностью перехода к ним
This commit is contained in:
@@ -16,7 +16,7 @@ from orders.models import Order, OrderItem
|
||||
from inventory.models import Reservation, Warehouse, Incoming, StockBatch, Sale, SaleBatchAllocation, Inventory, WriteOff, Stock, WriteOffDocumentItem
|
||||
from inventory.services import SaleProcessor
|
||||
from inventory.services.batch_manager import StockBatchManager
|
||||
from inventory.services.inventory_processor import InventoryProcessor
|
||||
# InventoryProcessor больше не используется в сигналах - обработка вызывается явно через view
|
||||
|
||||
|
||||
def update_is_returned_flag(order):
|
||||
@@ -1234,41 +1234,9 @@ def update_order_on_sale_delete(sender, instance, **kwargs):
|
||||
)
|
||||
|
||||
|
||||
@receiver(post_save, sender=Inventory)
|
||||
def process_inventory_reconciliation(sender, instance, created, **kwargs):
|
||||
"""
|
||||
Сигнал: При завершении инвентаризации (status='completed')
|
||||
автоматически обрабатываются расхождения.
|
||||
|
||||
Процесс:
|
||||
1. Проверяем, изменился ли статус на 'completed'
|
||||
2. Вызываем InventoryProcessor для обработки дефицитов/излишков
|
||||
3. Создаются WriteOff для недостач и Incoming для излишков
|
||||
"""
|
||||
if created:
|
||||
return # Только для обновлений
|
||||
|
||||
# Проверяем, изменился ли статус на 'completed'
|
||||
if instance.status != 'completed':
|
||||
return
|
||||
|
||||
try:
|
||||
# Обрабатываем инвентаризацию
|
||||
result = InventoryProcessor.process_inventory(instance.id)
|
||||
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.info(
|
||||
f"Inventory {instance.id} processed: "
|
||||
f"lines={result['processed_lines']}, "
|
||||
f"writeoffs={result['writeoffs_created']}, "
|
||||
f"incomings={result['incomings_created']}"
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.error(f"Ошибка при обработке Inventory {instance.id}: {str(e)}", exc_info=True)
|
||||
# Сигнал process_inventory_reconciliation удален
|
||||
# Теперь обработка инвентаризации вызывается явно через InventoryCompleteView
|
||||
# Это позволяет пользователю контролировать момент создания документов
|
||||
|
||||
|
||||
@receiver(post_save, sender=WriteOff)
|
||||
|
||||
Reference in New Issue
Block a user