Добавлено сохранение 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

@@ -338,8 +338,14 @@ class Inventory(models.Model):
date = models.DateTimeField(auto_now_add=True, verbose_name="Дата инвентаризации")
status = models.CharField(max_length=20, choices=STATUS_CHOICES,
default='draft', verbose_name="Статус")
conducted_by = models.CharField(max_length=200, blank=True, null=True,
verbose_name="Провел инвентаризацию")
conducted_by = models.ForeignKey(
'user_roles.UserRole',
on_delete=models.SET_NULL,
blank=True,
null=True,
related_name='inventories',
verbose_name="Провел инвентаризацию"
)
notes = models.TextField(blank=True, null=True, verbose_name="Примечания")
class Meta:
@@ -375,6 +381,28 @@ class InventoryLine(models.Model):
editable=False)
processed = models.BooleanField(default=False,
verbose_name="Обработана (создана операция)")
# Snapshot-значения на момент завершения инвентаризации
snapshot_quantity_available = models.DecimalField(
max_digits=10, decimal_places=3, null=True, blank=True,
verbose_name="Всего на складе (snapshot)",
help_text="Всего на складе на момент завершения инвентаризации"
)
snapshot_quantity_reserved = models.DecimalField(
max_digits=10, decimal_places=3, null=True, blank=True,
verbose_name="В резервах (snapshot)",
help_text="В резервах на момент завершения инвентаризации"
)
snapshot_quantity_system = models.DecimalField(
max_digits=10, decimal_places=3, null=True, blank=True,
verbose_name="В системе свободно (snapshot)",
help_text="В системе свободно на момент завершения инвентаризации"
)
snapshot_difference = models.DecimalField(
max_digits=10, decimal_places=3, null=True, blank=True,
verbose_name="Итоговая разница (snapshot)",
help_text="Итоговая разница на момент завершения инвентаризации"
)
class Meta:
verbose_name = "Строка инвентаризации"