Files
goodtimes/goodtimes/webhook/subscription_service.py
2024-08-12 12:54:29 +05:30

78 lines
2.5 KiB
Python

from datetime import timedelta
from django.utils import timezone
import datetime
from manage_subscriptions.models import PrincipalSubscription
class SubscriptionService:
def __init__(self):
self._principal_subscription = None
@property
def principal_subscription(self):
"""Get the current principal subscription."""
return self._principal_subscription
@principal_subscription.setter
def principal_subscription(self, value):
"""Set the current principal subscription."""
self._principal_subscription = value
def create_principal_subscription(
self,
principal,
subscription,
stripe_subscription,
order_id,
current_period_start,
current_period_end,
coupon=None,
):
"""Create a principal subscription and return it."""
start_date, end_date = self._calculate_dates(
current_period_start, current_period_end, subscription.plan.days
)
principal_subscription = PrincipalSubscription.objects.create(
principal=principal,
subscription=subscription,
stripe_subscription_id=stripe_subscription or "Non Recurring",
is_paid=True,
auto_renew=bool(stripe_subscription),
is_stripe_subscription=bool(stripe_subscription),
order_id=order_id,
start_date=start_date,
end_date=end_date,
grace_period_end_date=end_date + timedelta(days=15),
coupon_code=coupon.coupon_code if coupon else None,
)
if coupon:
self._update_coupon(coupon)
self.principal_subscription = principal_subscription
return principal_subscription
def _calculate_dates(
self, current_period_start, current_period_end, subscription_days
):
"""Calculate subscription start and end dates."""
today = timezone.now().date()
start_date = (
datetime.datetime.fromtimestamp(current_period_start).date()
if current_period_start
else today
)
end_date = (
datetime.datetime.fromtimestamp(current_period_end).date()
if current_period_end
else (today + timedelta(days=subscription_days))
)
return start_date, end_date
def _update_coupon(self, coupon):
"""Update coupon usage count."""
coupon.no_of_redeems += 1
coupon.save()
print("Coupon Saved Successfully!!!")