56 lines
3.3 KiB
Python
56 lines
3.3 KiB
Python
from django.db import models
|
||
|
||
|
||
class Plan(models.Model):
|
||
"""
|
||
⚠️ اصلاح نسبت به سند اولیه: نمونهی پاسخ GET /api/subscription/plans در
|
||
سند Endpointهای API یک فیلد boolean به اسم `popular` داره («ماهانه» →
|
||
false، «سالانه» → true) که در دیاگرام مدلها (سند معماری داده) برای
|
||
Plan اصلاً ذکر نشده. چون بدون این فیلد نمیشه دقیقاً همون response
|
||
schema رو پیادهسازی کرد، اینجا اضافه شده — دقیقاً مثل فیکس is_correct
|
||
روی content.Choice در فاز ۱.
|
||
"""
|
||
title = models.CharField(max_length=50)
|
||
price = models.PositiveIntegerField()
|
||
currency = models.CharField(max_length=10, default='IRT')
|
||
discount_percent = models.PositiveSmallIntegerField(default=0)
|
||
popular = models.BooleanField(default=False) # <-- اصلاح/افزوده شده
|
||
# ⚠️ اصلاح دیگه: سند طراحی هیچ فیلد durationای برای Plan نداره، در
|
||
# نتیجهی این نبود، activate_subscription قبلاً مدت اشتراک رو با یک
|
||
# قاعدهی stub (چک کردن کلمهی «سالانه»/yearly در عنوان) حدس میزد که
|
||
# شکننده و وابسته به متن title بود. duration_days اینجا بهعنوان منبع
|
||
# صریح و قابلاتکای مدت اشتراک اضافه شده؛ پیشفرض ۳۰ روز.
|
||
duration_days = models.PositiveIntegerField(default=30) # <-- اصلاح/افزوده شده
|
||
|
||
def __str__(self):
|
||
return self.title
|
||
|
||
|
||
class Subscription(models.Model):
|
||
"""
|
||
⚠️ اصلاح نسبت به سند اولیه: STATUS_CHOICES در سند فقط شامل
|
||
active/expired/canceled بود. اما در جریان POST /api/subscription/purchase
|
||
یک Subscription قبل از تایید پرداخت (که با payment webhook میاد) ساخته
|
||
میشه؛ بدون یک وضعیت میانی، راهی برای نمایش «سفارش ثبت شده ولی هنوز
|
||
پرداخت تایید نشده» وجود نداره. برای همین وضعیت pending اضافه و بهعنوان
|
||
پیشفرض ساخت (بهجای active در سند) تنظیم شده؛ فعالسازی واقعی توسط
|
||
subscription.services.activate_subscription بعد از webhook پرداخت انجام
|
||
میشه.
|
||
"""
|
||
STATUS_CHOICES = [
|
||
('pending', 'در انتظار پرداخت'), # <-- اصلاح/افزوده شده
|
||
('active', 'فعال'),
|
||
('expired', 'منقضی'),
|
||
('canceled', 'لغوشده'),
|
||
]
|
||
|
||
user_id = models.IntegerField(unique=True, db_index=True) # ارجاع سبک به accounts.User
|
||
plan = models.ForeignKey(Plan, on_delete=models.SET_NULL, null=True, related_name='subscriptions')
|
||
status = models.CharField(max_length=15, choices=STATUS_CHOICES, default='pending')
|
||
started_at = models.DateTimeField(auto_now_add=True)
|
||
expires_at = models.DateTimeField(null=True, blank=True)
|
||
order_id = models.IntegerField(null=True, blank=True) # ارجاع سبک به payment.Order
|
||
|
||
def __str__(self):
|
||
return f"sub-user{self.user_id}-{self.status}"
|