From 42eddc0fd121a64921caf1749b6306ed87cd9494 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Sat, 29 Nov 2025 20:34:20 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BF=D1=80=D0=BE=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B0=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BF=D0=BB=D0=B0=D1=82=D1=8B=20-=20=D1=83=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B0=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0=20=D0=B8=D0=B7=20calculate=5Ftotal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проблема: - calculate_total() пытался автоматически обрабатывать переплату - Это приводило к дублированию логики и сложной отладке - Нарушался принцип единственной ответственности Решение: - Удалена автоматическая обработка переплаты из Order.calculate_total() - Теперь calculate_total() ТОЛЬКО считает сумму - всё - Переплата обрабатывается ТОЛЬКО в TransactionService при создании платежей/возвратов - Добавлено предупреждение в UI о переплате с инструкцией Как работает теперь: 1. При оплате - TransactionService автоматически вызывает add_overpayment() 2. При изменении товаров - calculate_total() только пересчитывает сумму 3. Если появилась переплата - оператор видит предупреждение 4. Оператор вручную создаёт возврат в кошелёк через форму Преимущества: - Одно место ответственности за переплаты - Прозрачность для оператора - Нет скрытых автоматизмов - Легко обслуживать и отлаживать - Стандартный подход для e-commerce --- myproject/orders/models/order.py | 9 --------- .../orders/templates/orders/order_form.html | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/myproject/orders/models/order.py b/myproject/orders/models/order.py index 4f1eb70..c11a2cc 100644 --- a/myproject/orders/models/order.py +++ b/myproject/orders/models/order.py @@ -323,20 +323,11 @@ 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 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) - return self.total_amount def recalculate_amount_paid(self): diff --git a/myproject/orders/templates/orders/order_form.html b/myproject/orders/templates/orders/order_form.html index b98e282..4a27da6 100644 --- a/myproject/orders/templates/orders/order_form.html +++ b/myproject/orders/templates/orders/order_form.html @@ -609,6 +609,22 @@ {% if order.pk %} + + + {% if order.amount_paid > order.total_amount %} + {% with overpayment=order.amount_paid|add:"-"|add:order.total_amount %} +
+ Обнаружена переплата!
+ + Оплачено {{ order.amount_paid|floatformat:2 }} руб., + сумма заказа {{ order.total_amount|floatformat:2 }} руб.
+ Переплата: {{ overpayment|floatformat:2 }} руб.
+ Создайте возврат в кошелёк клиента во вкладке «Создать возврат» ниже. +
+
+ {% endwith %} + {% endif %} +