From 575c5d0c2fd832ce4f1bdae515989a6f1ab34452 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Sat, 29 Nov 2025 20:28:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B4=D0=B2=D0=BE=D0=B9=D0=BD=D0=B0=D1=8F?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BF=D0=BB=D0=B0=D1=82=D1=8B=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B8=20=D1=81=D1=83=D0=BC=D0=BC=D1=8B=20=D0=B7=D0=B0=D0=BA?= =?UTF-8?q?=D0=B0=D0=B7=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проблема: - 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 (есть переплата) - Это предотвращает двойную обработку при первичной оплате Теперь переплата обрабатывается корректно только при изменении суммы заказа --- myproject/orders/models/order.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/myproject/orders/models/order.py b/myproject/orders/models/order.py index 5bfadfe..4f1eb70 100644 --- a/myproject/orders/models/order.py +++ b/myproject/orders/models/order.py @@ -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)