Payment providers as classes (Strategy + factory); 10342 = monthly; health logs a failed Bazaar check
- payment/providers.py: ZarinpalProvider / BazaarProvider with one interface (check_plan, sku_for, payment_url, purchase_extras, discount_blocker, reconcile_user); provider_for / provider_for_method pick one; unknown fails. create_order, purchase view, discount redeem and reconcile_user_orders use it instead of scattered ifs. - subscription.0015: Bazaar SKU 10342 on the one-month plan (owner: "probably the monthly one"). - config/health: the Bazaar check no longer swallows its exception without a log. 982 tests green. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -91,12 +91,6 @@ class RedeemDiscountView(APIView):
|
||||
from payment.models import Order
|
||||
# سفارش باید متعلق به همان کاربر احرازهویتشده باشد (جلوگیری از اعمال تخفیف روی سفارش دیگران).
|
||||
order = get_object_or_404(Order, pk=order_id, user_id=request.user.id)
|
||||
# بازار بی«تخفیف پویا» قیمتِ ثابتِ پیشخان را میگیرد؛ تخفیف آنوقت فقط کد را میسوزاند. با کلید،
|
||||
# مبلغِ کمشده در JWT به بازار میرود (payment.views.BazaarStartPurchaseView).
|
||||
if order.provider == 'bazaar':
|
||||
from payment import bazaar
|
||||
if not bazaar.dynamic_price_configured():
|
||||
raise ValidationError({'orderId': 'کدِ تخفیف روی خرید از کافهبازار اعمال نمیشود.'})
|
||||
|
||||
try:
|
||||
with transaction.atomic():
|
||||
@@ -117,15 +111,12 @@ class RedeemDiscountView(APIView):
|
||||
if order_locked.status != 'pending':
|
||||
raise ValidationError({'code': 'این سفارش دیگر قابل اعمال تخفیف نیست.'})
|
||||
|
||||
# بعد از رفتن به درگاه، authorityِ زرینپال با مبلغِ قبلی گرفته شده و
|
||||
# دوباره استفاده میشود؛ تخفیف در این لحظه یعنی کاربر مبلغِ قبلی را
|
||||
# میپردازد ولی verify با مبلغِ جدید رد میشود — پول کم میشود و
|
||||
# اشتراکی فعال نمیشود.
|
||||
if order_locked.gateway_authority:
|
||||
raise ValidationError({'code': 'کدِ تخفیف را پیش از رفتن به درگاهِ پرداخت وارد کنید.'})
|
||||
# همان قاعده برای بازار: قیمت در JWT امضا شده و خرید در بازار شروع شده است.
|
||||
if order_locked.bazaar_price_rial is not None:
|
||||
raise ValidationError({'code': 'کدِ تخفیف را پیش از رفتن به صفحهی خریدِ بازار وارد کنید.'})
|
||||
# هر روشِ پرداخت خودش میداند کی دیگر تخفیف نمینشیند (زرینپال: بعد از رفتن به درگاه؛ بازار:
|
||||
# بیکلیدِ «تخفیف پویا» یا بعد از امضای قیمت). payment/providers.py.
|
||||
from payment.providers import provider_for
|
||||
blocker = provider_for(order_locked.provider).discount_blocker(order_locked)
|
||||
if blocker:
|
||||
raise ValidationError({'code': blocker})
|
||||
|
||||
# یک کد برای هر سفارش: کدهای درصدی روی هم جمع میشدند.
|
||||
if Redemption.objects.filter(order_id=order_locked.id).exists():
|
||||
|
||||
Reference in New Issue
Block a user