diff --git a/myproject/inventory/signals.py b/myproject/inventory/signals.py index 1e1b94a..ab006a9 100644 --- a/myproject/inventory/signals.py +++ b/myproject/inventory/signals.py @@ -360,42 +360,24 @@ def rollback_sale_on_status_change(sender, instance, created, **kwargs): reservations_count = reservations.count() if reservations_count > 0: - # Используем update() вместо save() для массового обновления - # Это предотвращает повторный вызов сигнала update_stock_on_reservation_change - # и двойное обновление Stock - update_fields = {'status': reservation_target_status} - - if reservation_target_status == 'released': - update_fields['released_at'] = timezone.now() - # converted_at оставляем (для истории) - - reservations.update(**update_fields) + # Обновляем резервы через .save() чтобы сработал сигнал обновления Stock + # Сигнал update_stock_on_reservation_change автоматически обновит Stock + for reservation in reservations: + reservation.status = reservation_target_status + if reservation_target_status == 'released': + reservation.released_at = timezone.now() + # converted_at оставляем (для истории) + + # Используем save() с указанием измененных полей + update_fields = ['status'] + if reservation_target_status == 'released': + update_fields.append('released_at') + reservation.save(update_fields=update_fields) logger.info( f"✓ Обновлено {reservations_count} резервов: " f"converted_to_sale → {reservation_target_status}" ) - - # Обновляем Stock вручную, т.к. update() не вызывает сигналы - # Группируем по product + warehouse для эффективности - reservation_groups = reservations.values_list('product_id', 'warehouse_id').distinct() - - for product_id, warehouse_id in reservation_groups: - try: - stock = Stock.objects.get( - product_id=product_id, - warehouse_id=warehouse_id - ) - stock.refresh_from_batches() - - logger.debug( - f" Stock обновлен после изменения резервов: " - f"product_id={product_id}, warehouse_id={warehouse_id}" - ) - except Stock.DoesNotExist: - logger.warning( - f" Stock не найден для product_id={product_id}, warehouse_id={warehouse_id}" - ) else: logger.warning( f"⚠ Для заказа {instance.order_number} нет резервов в статусе 'converted_to_sale'"