Payment event ledger (PaymentEvent) replicated to the backup server, plus CSV export script on 247

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-13 14:18:47 +03:30
parent 947f946909
commit 8d8665edf3
10 changed files with 199 additions and 3 deletions

View File

@@ -17,6 +17,8 @@ from rest_framework.exceptions import APIException
from statuslog.signals import status_changed
from . import events
from .models import Order, Transaction
from .providers import PROVIDERS, provider_for
@@ -135,6 +137,8 @@ def create_order(*, user_id: int, amount: int, currency: str = 'IRT',
subscription_id=subscription_id, plan_id=plan_id, provider=provider,
)
events.record('order_created', order=order, plan_id=plan_id, amount=amount, currency=currency,
duration_days=order.duration_days, sku=bazaar_product_sku)
# بازار paymentUrl ندارد (اپ با Poolakey می‌خرد)؛ زرین‌پال آدرسِ PaymentRedirectView را دارد (providers.py).
payment_url = provider_for(order.provider).payment_url(order)
return order, payment_url
@@ -387,6 +391,7 @@ def cancel_pending_order(order: Order, *, staff: str = '') -> None:
raise OrderStateError(f'سفارشِ {order.id} «{order.get_status_display()}» است؛ فقط سفارشِ در انتظار لغو می‌شود.')
order.status = 'canceled'
order.save(update_fields=['status'])
events.record('admin_cancel', order=order, staff=staff)
status_changed.send(sender='payment.Order', object_id=order.id, old_status='pending',
new_status='canceled', event=f'admin_cancel:{staff}'[:50], user_id=order.user_id)
@@ -428,6 +433,7 @@ def refund_order(order: Order, *, staff: str = '') -> dict:
order.status = 'refunded'
order.save(update_fields=['status'])
events.record('admin_refund', order=order, staff=staff, subscription_days=summary['subscription_days'])
Transaction.objects.create(order=order, gateway='admin', status='refunded',
gateway_ref_id=f'refund-{order.id}')
status_changed.send(sender='payment.Order', object_id=order.id, old_status='paid',