Исправлена двойная обработка переплаты при изменении суммы заказа

Проблема:
- add_overpayment вызывался дважды:
  1. При оплате 300 руб (заказ 150) → +150 в кошелёк
  2. При изменении суммы до 100 → +200 в кошелёк
- Итого: 350 руб вместо правильных 200 руб

Причина:
- calculate_total() вызывал add_overpayment при любой переплате
- Не учитывалось, что переплата уже была обработана при оплате

Решение:
- Сохраняем old_total перед пересчётом
- Вызываем add_overpayment ТОЛЬКО если:
  - old_total > 0 (заказ уже существовал)
  - total_amount < old_total (сумма УМЕНЬШИЛАСЬ)
  - amount_paid > total_amount (есть переплата)
- Это предотвращает двойную обработку при первичной оплате

Теперь переплата обрабатывается корректно только при изменении суммы заказа
This commit is contained in:
2025-11-29 20:28:00 +03:00
parent a7ccbbec48
commit 575c5d0c2f

View File

@@ -323,13 +323,16 @@ class Order(models.Model):
# Пересчитываем стоимость доставки если она автоматическая
self.recalculate_delivery_cost()
# Сохраняем старую сумму для проверки изменений
old_total = self.total_amount
self.total_amount = items_total + self.delivery_cost
# Сохраняем изменения в БД
self.save(update_fields=['total_amount', 'delivery_cost', 'is_custom_delivery_cost'])
# Проверяем переплату после изменения суммы заказа
if self.amount_paid > self.total_amount:
# Проверяем переплату ТОЛЬКО если сумма заказа уменьшилась
# (чтобы избежать двойной обработки при первоначальной оплате)
if old_total > 0 and self.total_amount < old_total and self.amount_paid > self.total_amount:
from customers.services.wallet_service import WalletService
# Переносим переплату в кошелёк (пользователь - modified_by или None)
WalletService.add_overpayment(self, self.modified_by)