Добавлено сохранение snapshot-значений для проведенных инвентаризаций

- Добавлены поля snapshot_* в модель InventoryLine для фиксации значений на момент завершения
- Обновлен InventoryProcessor для сохранения snapshot перед обработкой
- Обновлен InventoryDetailView для отображения snapshot-значений в проведенных инвентаризациях
- Добавлена миграция 0018 для новых полей
- Теперь в проведенных инвентаризациях отображаются оригинальные значения и правильная разница, а не текущие скорректированные остатки
This commit is contained in:
2025-12-22 13:43:35 +03:00
parent 9b430c7eb0
commit c476eafd4a
4 changed files with 234 additions and 22 deletions

View File

@@ -46,12 +46,47 @@ class InventoryProcessor:
}
"""
inventory = Inventory.objects.get(id=inventory_id)
lines = InventoryLine.objects.filter(inventory=inventory, processed=False)
# Получаем все строки инвентаризации для сохранения snapshot
all_lines = InventoryLine.objects.filter(inventory=inventory)
# Получаем только необработанные строки для обработки
lines = all_lines.filter(processed=False)
errors = []
writeoff_document = None
incoming_document = None
# Сохраняем snapshot-значения для ВСЕХ строк ПЕРЕД обработкой
# Это нужно чтобы зафиксировать состояние на момент подсчета
from inventory.models import Stock
for line in all_lines:
try:
stock, _ = Stock.objects.get_or_create(
product=line.product,
warehouse=inventory.warehouse
)
stock.refresh_from_batches()
# Пересчитываем разницу перед сохранением snapshot
# чтобы убедиться что она актуальна
current_difference = (line.quantity_fact + stock.quantity_reserved) - stock.quantity_available
# Сохраняем snapshot-значения на момент завершения
line.snapshot_quantity_available = stock.quantity_available
line.snapshot_quantity_reserved = stock.quantity_reserved
line.snapshot_quantity_system = stock.quantity_free
line.snapshot_difference = current_difference
line.save(update_fields=[
'snapshot_quantity_available',
'snapshot_quantity_reserved',
'snapshot_quantity_system',
'snapshot_difference'
])
except Exception as e:
errors.append({
'line': line,
'error': f'Ошибка сохранения snapshot: {str(e)}'
})
# Собираем недостачи и излишки
deficit_lines = []
surplus_lines = []