Исправлено: агрегация резервов теперь использует quantity_base
КРИТИЧНО: Все агрегации Reservation.quantity заменены на quantity_base Проблемы и решения: 🔴 КРИТИЧНО - BatchManager.write_off_by_fifo(): - Проблема: суммировал quantity вместо quantity_base - Влияние: FIFO расчет свободного товара был некорректен - Решение: aggregate(Sum('quantity_base')) в строках 118, 125 🟡 СРЕДНЯЯ ВАЖНОСТЬ - ShowcaseManager: - reserve_showcase_item(): обновление quantity и quantity_base (строка 403) - release_showcase_reservation(): обновление обоих полей (строка 481) - Теперь витринные резервы полностью консистентны 🟡 СРЕДНЯЯ ВАЖНОСТЬ - TransformationService: - confirm(): проверка доступности через quantity_base (строка 254) - Корректная валидация при трансформации товаров 🟢 НИЗКАЯ ВАЖНОСТЬ - WriteOffDocumentService: - update_item(): синхронизация quantity и quantity_base (строка 175) - Полнота данных в резервах документов списания 🟢 НИЗКАЯ ВАЖНОСТЬ - Сигналы (signals.py): - update_order_item_reservation(): обновление обоих полей для товаров - Для обычных товаров: quantity_base = quantity_in_base_units (строка 1081) - Для комплектов: quantity_base = quantity (компоненты в базовых) (строка 1107) - Добавлено обновление sales_unit при изменении OrderItem Архитектура: - Принцип: quantity_base ВСЕГДА содержит количество в базовых единицах - Все агрегации резервов используют quantity_base для корректных расчетов - quantity сохраняется для совместимости и отображения - sales_unit хранит ссылку на единицу продажи для аудита
This commit is contained in:
@@ -1078,11 +1078,16 @@ def update_reservation_on_item_change(sender, instance, created, **kwargs):
|
||||
# Обычный товар - один резерв, обновляем количество напрямую
|
||||
reservation = reservations.first()
|
||||
old_quantity = reservation.quantity
|
||||
|
||||
# Обновляем quantity и quantity_base
|
||||
reservation.quantity = Decimal(str(instance.quantity))
|
||||
reservation.save(update_fields=['quantity'])
|
||||
reservation.quantity_base = instance.quantity_in_base_units or Decimal(str(instance.quantity))
|
||||
reservation.sales_unit = instance.sales_unit
|
||||
reservation.save(update_fields=['quantity', 'quantity_base', 'sales_unit'])
|
||||
|
||||
logger.info(
|
||||
f"✓ Резерв #{reservation.id} обновлён: quantity {old_quantity} → {reservation.quantity} "
|
||||
f"✓ Резерв #{reservation.id} обновлён: quantity {old_quantity} → {reservation.quantity}, "
|
||||
f"quantity_base → {reservation.quantity_base} "
|
||||
f"(статус: {reservation.status}, OrderItem #{instance.id}, заказ {instance.order.order_number})"
|
||||
)
|
||||
|
||||
@@ -1104,8 +1109,10 @@ def update_reservation_on_item_change(sender, instance, created, **kwargs):
|
||||
expected_qty = product_quantities.get(reservation.product_id, Decimal('0'))
|
||||
if expected_qty > 0:
|
||||
old_quantity = reservation.quantity
|
||||
# Компоненты комплекта всегда в базовых единицах
|
||||
reservation.quantity = expected_qty
|
||||
reservation.save(update_fields=['quantity'])
|
||||
reservation.quantity_base = expected_qty
|
||||
reservation.save(update_fields=['quantity', 'quantity_base'])
|
||||
|
||||
logger.info(
|
||||
f"✓ Резерв #{reservation.id} ({reservation.product.name}) обновлён: "
|
||||
|
||||
Reference in New Issue
Block a user