Skip to content
This repository was archived by the owner on Jul 29, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion backend/dashboard/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ def subscription_list_api(request):
"start_date": sub.start_date.strftime("%Y-%m-%d") if sub.start_date else "N/A",
"end_date": sub.end_date.strftime("%Y-%m-%d") if sub.end_date else "N/A",
"is_active": sub.is_active,
"transaction_id": sub.yookassa_payment_method_id or "-",
"transaction_id": sub.latest_yookassa_payment_id or "-",
}
for sub in page.object_list
],
Expand Down
5 changes: 3 additions & 2 deletions backend/subscription/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ def payment_response(payment, subscription, status):
'yookassa_payment_id': payment.id,
'subscription_id': subscription.subscription_id
} if payment is not None else {
'yookassa_payment_id': subscription.yookassa_payment_method_id,
'yookassa_payment_id': subscription.latest_yookassa_payment_id,
'subscription_id': subscription.subscription_id
}, status=status
)
Expand All @@ -19,7 +19,8 @@ def status_response(is_subscribed, subscription, user, status):
{
'is_subscribed': is_subscribed,
'user_id': user.user_id,
'next_payment': subscription.end_date,
'next_payment': subscription.end_date.replace(tzinfo=None).isoformat(
timespec='seconds'),
'is_active': subscription.is_active,
'subscription_id': subscription.subscription_id
} if subscription is not None else
Expand Down
16 changes: 10 additions & 6 deletions backend/subscription/service.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import logging
import uuid

from dateutil.utils import today
from django.utils import timezone
from yookassa import Configuration, Payment
from yookassa.domain.notification import WebhookNotificationFactory, WebhookNotificationEventType
Expand Down Expand Up @@ -80,7 +79,10 @@ def recreate_subscription_payment(user, subscription):
payment = create_payment(subscription, payment_description)
return payment, subscription
else:
subscription.activate(subscription.yookassa_payment_method_id)
# payment = create_payment_without_confirmation(subscription, payment_description, subscription.yookassa_payment_method_id)
# subscription.activate(subscription.latest_yookassa_payment_id)
subscription.is_active = True
subscription.save()
return None, subscription

def cancel_subscription(token):
Expand Down Expand Up @@ -109,11 +111,12 @@ def handle_message_from_yookassa(data):
def handle_success(response_object):
subscription = get_subscription_from_webhook(response_object)
metadata = response_object.metadata
payment = Payment.find_one(payment_id=response_object.payment_id)
if metadata.get('payment_type') == "initial_subscription":
subscription.activate(response_object.id)
subscription.activate(response_object.payment_id, payment.payment_method.id)
logger.info(f"Initial subscription {subscription.subscription_id} activated")
elif metadata.get('payment_type') == "reccurring_subscription":
subscription.renew_subscription(response_object.id)
subscription.renew_subscription(response_object.payment_id)
logger.info(f"Initial subscription {subscription.subscription_id} updated")
else:
raise YooKassaError(f"Payment type {response_object.event} not supported")
Expand All @@ -122,7 +125,7 @@ def handle_cancel(response_object):
subscription = get_subscription_from_webhook(response_object)
metadata = response_object.metadata
if metadata.get('payment_type') == "initial_subscription":
subscription.delete()
subscription.deactivate()
logger.info(f"Initial subscription {subscription.subscription_id} deleted, initial payment canceled")
elif metadata.get('payment_type') == "reccurring_subscription":
subscription.deactivate()
Expand All @@ -148,7 +151,7 @@ def create_payment(subscription, description):
}
}, uuid.uuid4())

def create_payment_without_confirmation(subscription, description):
def create_payment_without_confirmation(subscription, description, payment_method_id):
return Payment.create({
"amount": {
"value": SUBSCRIPTION_PRICE,
Expand All @@ -157,6 +160,7 @@ def create_payment_without_confirmation(subscription, description):
"capture": True,
"description": description,
"save_payment_method": True,
"payment_method_id": payment_method_id,
"metadata": {
"subscription_internal_id": str(subscription.subscription_id),
"payment_type": "recurring_subscription"
Expand Down
2 changes: 1 addition & 1 deletion backend/subscription/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ def charge_recurring_subscriptions():

logger.info(f"Attempting to renew subscription {sub.subscription_id} for user {sub.user.email}")
try:
create_payment_without_confirmation(sub, f"Продление ежемесячной подписки для {sub.user.email}")
create_payment_without_confirmation(sub, f"Продление ежемесячной подписки для {sub.user.email}", sub.yookassa_payment_method_id)
logger.info(f"Renewal payment initiated for subscription {sub.subscription_id}.")
except Exception as e:
logger.info(f"Failed to initiate renewal payment for subscription {sub.subscription_id}: {e}")
Expand Down