Реализация системы кошелька клиента для переплат
- Добавлено поле wallet_balance в модель Customer - Создана модель WalletTransaction для истории операций - Реализован сервис WalletService с методами: * add_overpayment - автоматическое зачисление переплаты * pay_with_wallet - оплата заказа из кошелька * adjust_balance - ручная корректировка баланса - Интеграция с Payment.save() для автоматической обработки переплат - UI для оплаты из кошелька в деталях заказа - Отображение баланса и долга на странице клиента - Админка с inline транзакций и запретом ручного создания - Добавлен способ оплаты account_balance - Миграция 0004 для customers приложения
This commit is contained in:
@@ -7,6 +7,7 @@ from django.views.decorators.http import require_http_methods
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.db import models
|
||||
from decimal import Decimal
|
||||
from .models import Order, OrderItem, Address, OrderStatus
|
||||
from .forms import OrderForm, OrderItemFormSet, OrderStatusForm, PaymentFormSet
|
||||
from .filters import OrderFilter
|
||||
@@ -604,3 +605,47 @@ def order_status_delete(request, pk):
|
||||
# === ВРЕМЕННЫЕ КОМПЛЕКТЫ ===
|
||||
# УДАЛЕНО: Логика создания временных комплектов перенесена в products.services.kit_service
|
||||
# Используйте API endpoint: products:api-temporary-kit-create
|
||||
|
||||
|
||||
# === КОШЕЛЁК КЛИЕНТА ===
|
||||
|
||||
@login_required
|
||||
def apply_wallet_payment(request, pk):
|
||||
"""
|
||||
Применение оплаты из кошелька клиента к заказу.
|
||||
Вызывается через POST-запрос с суммой для списания.
|
||||
"""
|
||||
if request.method != 'POST':
|
||||
return redirect('orders:order-detail', pk=pk)
|
||||
|
||||
order = get_object_or_404(Order, pk=pk)
|
||||
|
||||
# Получаем запрашиваемую сумму из формы
|
||||
try:
|
||||
raw_amount = request.POST.get('wallet_amount', '0')
|
||||
amount = Decimal(str(raw_amount).replace(',', '.'))
|
||||
except (ValueError, TypeError, ArithmeticError):
|
||||
messages.error(request, 'Некорректная сумма для списания из кошелька.')
|
||||
return redirect('orders:order-detail', pk=pk)
|
||||
|
||||
# Вызываем сервис для оплаты из кошелька
|
||||
try:
|
||||
from customers.services.wallet_service import WalletService
|
||||
paid_amount = WalletService.pay_with_wallet(order, amount, request.user)
|
||||
|
||||
if paid_amount and paid_amount > 0:
|
||||
messages.success(
|
||||
request,
|
||||
f'Из кошелька клиента списано {paid_amount} руб. для оплаты заказа #{order.order_number}.'
|
||||
)
|
||||
else:
|
||||
messages.warning(
|
||||
request,
|
||||
'Не удалось списать средства из кошелька. Проверьте баланс и сумму заказа.'
|
||||
)
|
||||
except ValueError as e:
|
||||
messages.error(request, str(e))
|
||||
except Exception as e:
|
||||
messages.error(request, f'Ошибка при оплате из кошелька: {str(e)}')
|
||||
|
||||
return redirect('orders:order-detail', pk=pk)
|
||||
|
||||
Reference in New Issue
Block a user