- subscription.0017/0018, payment.0013: pack plans deleted, QuestionCredit/HeartsPass models and Plan.kind / question_credits / hearts_days / Order.question_credits / hearts_days dropped. The only paid pack order was the company owner's test account (user 26). - Assistant: no credit spending; quota is the daily cap only (free 2, every plan 4, gift subscription 4). - Bazaar: verify_purchase is subscription-only (no inapp guess), start/purchase responses lose productType, verify refuses an order without a subscription. A paid order with no subscription now logs ERROR. - Removed POST /api/payment/orders (internal; no caller). Its permission tests stay. - Pack-based tests rewritten on subscriptions (refund, security, Bazaar token); pack-only test files deleted. - docs: profit table for 4/day on both payment routes plus free users; handbook, operations, CLAUDE.md current. 949 tests green. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
62 lines
2.9 KiB
Python
62 lines
2.9 KiB
Python
from rest_framework import serializers
|
||
|
||
|
||
class BazaarVerifyRequestSerializer(serializers.Serializer):
|
||
orderId = serializers.CharField()
|
||
purchaseToken = serializers.CharField()
|
||
|
||
|
||
class BazaarStartResponseSerializer(serializers.Serializer):
|
||
orderId = serializers.CharField()
|
||
sku = serializers.CharField(help_text='productIdِ PurchaseRequestِ Poolakey.')
|
||
amount = serializers.IntegerField(help_text='مبلغِ سفارش (تومان)، پس از کدِ تخفیف.')
|
||
dynamicPriceToken = serializers.CharField(
|
||
allow_null=True, help_text='JWTِ «تخفیف پویا» برای PurchaseRequest.dynamicPriceToken؛ null یعنی قیمتِ پیشخان.')
|
||
|
||
|
||
class BazaarVerifyResponseSerializer(serializers.Serializer):
|
||
orderId = serializers.CharField()
|
||
status = serializers.CharField()
|
||
valid = serializers.BooleanField()
|
||
|
||
|
||
class ZarinpalCallbackResponseSerializer(serializers.Serializer):
|
||
"""فقط وقتی settings.ZARINPAL_REDIRECT_URL خالی باشه برگردونده میشه؛
|
||
وگرنه کاربر به همون URL ریدایرکت میشه، نه به این JSON."""
|
||
orderId = serializers.CharField()
|
||
status = serializers.CharField()
|
||
|
||
|
||
class TransactionSerializer(serializers.Serializer):
|
||
id = serializers.CharField()
|
||
gateway = serializers.CharField()
|
||
status = serializers.CharField()
|
||
paidAt = serializers.DateTimeField(allow_null=True)
|
||
|
||
|
||
class OrderDetailResponseSerializer(serializers.Serializer):
|
||
orderId = serializers.CharField()
|
||
status = serializers.CharField()
|
||
amount = serializers.IntegerField()
|
||
transactions = TransactionSerializer(many=True)
|
||
|
||
|
||
class InvoiceSerializer(serializers.Serializer):
|
||
orderId = serializers.CharField()
|
||
invoiceNumber = serializers.CharField(help_text='شمارهی فاکتور: «TD-» و شناسهی سفارش، شش رقمی.')
|
||
status = serializers.ChoiceField(choices=['pending', 'paid', 'failed', 'canceled', 'refunded'])
|
||
provider = serializers.CharField(help_text='gateway (زرینپال) یا bazaar')
|
||
planTitle = serializers.CharField(allow_blank=True)
|
||
listPrice = serializers.IntegerField(allow_null=True, help_text='قیمتِ پایه پیش از تخفیف؛ null برای سفارشهای پیش از ۱۴۰۵-۰۷-۰۹.')
|
||
discountAmount = serializers.IntegerField(allow_null=True)
|
||
discountCode = serializers.CharField(allow_blank=True)
|
||
amount = serializers.IntegerField(help_text='مبلغِ پرداختی (پس از تخفیف).')
|
||
currency = serializers.CharField()
|
||
createdAt = serializers.DateTimeField()
|
||
paidAt = serializers.DateTimeField(allow_null=True)
|
||
refId = serializers.CharField(allow_blank=True, help_text='کدِ پیگیریِ پرداخت (شمارهی مرجعِ زرینپال/بازار).')
|
||
|
||
|
||
class InvoiceListResponseSerializer(serializers.Serializer):
|
||
invoices = InvoiceSerializer(many=True)
|