Исправлено: Sale теперь использует quantity_base вместо quantity

КРИТИЧНО: При создании Sale использовалось неправильное поле!

Проблема:

- При проведении заказа Sale создавался с reservation.quantity

- Это количество в ЕДИНИЦАХ ПРОДАЖИ, а не в базовых!

- Пример: 1 ветка списывала 1 банч вместо 0.05 банча

Решение:

- Строка 410: sale_quantity = reservation.quantity_base (для товаров)

- Строка 368: quantity=reservation.quantity_base (для комплектов)

- Fallback на .quantity для обратной совместимости

Теперь:

- Sale.quantity всегда в базовых единицах

- FIFO списание корректно

- StockBatch уменьшается на правильное количество
This commit is contained in:
2026-01-02 15:06:03 +03:00
parent 4ee7c0d23b
commit f55f358e8f

View File

@@ -365,7 +365,7 @@ def create_sale_on_order_completion(sender, instance, created, **kwargs):
sale = SaleProcessor.create_sale( sale = SaleProcessor.create_sale(
product=reservation.product, product=reservation.product,
warehouse=warehouse, warehouse=warehouse,
quantity=reservation.quantity, quantity=reservation.quantity_base or reservation.quantity, # Используем quantity_base!
sale_price=component_sale_price, sale_price=component_sale_price,
order=instance, order=instance,
document_number=instance.order_number document_number=instance.order_number
@@ -373,7 +373,7 @@ def create_sale_on_order_completion(sender, instance, created, **kwargs):
sales_created.append(sale) sales_created.append(sale)
logger.info( logger.info(
f"✓ Sale создан для компонента комплекта '{kit.name}': " f"✓ Sale создан для компонента комплекта '{kit.name}': "
f"{reservation.product.name} - {reservation.quantity} шт." f"{reservation.product.name} - {reservation.quantity_base or reservation.quantity} шт. (базовых единиц)"
) )
except ValueError as e: except ValueError as e:
logger.error( logger.error(
@@ -406,8 +406,8 @@ def create_sale_on_order_completion(sender, instance, created, **kwargs):
).exclude(status='converted_to_sale').first() ).exclude(status='converted_to_sale').first()
if item_reservation: if item_reservation:
# Используем quantity из резерва (уже в базовых единицах) # Используем quantity_base из резерва (всегда в базовых единицах)
sale_quantity = item_reservation.quantity sale_quantity = item_reservation.quantity_base or item_reservation.quantity
else: else:
# Fallback: используем quantity_in_base_units из OrderItem # Fallback: используем quantity_in_base_units из OrderItem
sale_quantity = item.quantity_in_base_units if item.quantity_in_base_units else Decimal(str(item.quantity)) sale_quantity = item.quantity_in_base_units if item.quantity_in_base_units else Decimal(str(item.quantity))