diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index c73e35d..64e613b 100644 Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ diff --git a/core/views.py b/core/views.py index 30a464b..c3c7849 100644 --- a/core/views.py +++ b/core/views.py @@ -20,6 +20,7 @@ from django.core.mail import send_mail from django.conf import settings from django.views.decorators.csrf import csrf_exempt from django.http import HttpResponse +from django.contrib.sites.shortcuts import get_current_site import json def home(request): @@ -546,11 +547,54 @@ def thawani_checkout(request, plan): messages.error(request, _("Failed to initiate payment. Please try again later.")) return redirect('dashboard') +def _activate_subscription_and_notify(transaction, plan, request=None): + """ + Helper to activate subscription, send WhatsApp/Email, and handle receipt link. + """ + # Activate Subscription + profile = transaction.user.profile + profile.subscription_plan = plan + profile.is_subscription_active = True + + if plan == 'MONTHLY': + profile.subscription_expiry = timezone.now().date() + timedelta(days=30) + elif plan == 'ANNUAL': + profile.subscription_expiry = timezone.now().date() + timedelta(days=365) + + profile.save() + + # Get receipt URL + if request: + receipt_url = request.build_absolute_uri(reverse('transaction_receipt', args=[transaction.receipt_number])) + else: + # Fallback for webhook or when request is missing + host = os.getenv('HOST_FQDN', 'masarcargo.com') + receipt_url = f"https://{host}{reverse('transaction_receipt', args=[transaction.receipt_number])}" + + # Notifications + expiry_date = profile.subscription_expiry.strftime('%Y-%m-%d') + msg = _("Your subscription for MASAR CARGO has been successfully renewed! Your new expiry date is %(date)s. You can view your receipt here: %(url)s") % { + "date": expiry_date, + "url": receipt_url + } + + if profile.full_phone_number: + send_whatsapp_message(profile.full_phone_number, msg) + + if transaction.user.email: + send_mail( + _("Subscription Activated - MASAR CARGO"), + msg, + settings.DEFAULT_FROM_EMAIL, + [transaction.user.email], + fail_silently=True, + ) + return receipt_url + @login_required def thawani_success(request): session_id = request.GET.get('session_id') if not session_id: - # Fallback to looking for the last pending transaction for this user transaction = Transaction.objects.filter(user=request.user, status='PENDING', payment_method='Thawani').first() else: transaction = get_object_or_404(Transaction, session_id=session_id, user=request.user) @@ -566,37 +610,12 @@ def thawani_success(request): transaction.status = 'COMPLETED' transaction.save() - # Activate Subscription - profile = transaction.user.profile - plan = session_data['data']['metadata'].get('plan', profile.subscription_plan) - profile.subscription_plan = plan - profile.is_subscription_active = True - - if plan == 'MONTHLY': - profile.subscription_expiry = timezone.now().date() + timedelta(days=30) - elif plan == 'ANNUAL': - profile.subscription_expiry = timezone.now().date() + timedelta(days=365) - - profile.save() - - # Notifications - expiry_date = profile.subscription_expiry.strftime('%Y-%m-%d') - msg = _("Your subscription for MASAR CARGO has been successfully renewed! Your new expiry date is %(date)s. Thank you for using our service.") % {"date": expiry_date} - - if profile.full_phone_number: - send_whatsapp_message(profile.full_phone_number, msg) - - if transaction.user.email: - send_mail( - _("Subscription Activated - MASAR CARGO"), - msg, - settings.DEFAULT_FROM_EMAIL, - [transaction.user.email], - fail_silently=True, - ) + plan = session_data['data']['metadata'].get('plan', transaction.user.profile.subscription_plan) + _activate_subscription_and_notify(transaction, plan, request) messages.success(request, _("Payment successful! Your subscription is now active.")) - return redirect('dashboard') + # Redirect directly to the receipt for "Automated Invoice" feel + return redirect('transaction_receipt', receipt_number=transaction.receipt_number) else: transaction.status = 'FAILED' transaction.save() @@ -613,9 +632,6 @@ def thawani_cancel(request): @csrf_exempt def thawani_webhook(request): - """ - Handle asynchronous status updates from Thawani. - """ if request.method == 'POST': try: data = json.loads(request.body) @@ -632,16 +648,8 @@ def thawani_webhook(request): transaction.status = 'COMPLETED' transaction.save() - # Activate Subscription - profile = transaction.user.profile - plan = data['data']['metadata'].get('plan', profile.subscription_plan) - profile.subscription_plan = plan - profile.is_subscription_active = True - if plan == 'MONTHLY': - profile.subscription_expiry = timezone.now().date() + timedelta(days=30) - elif plan == 'ANNUAL': - profile.subscription_expiry = timezone.now().date() + timedelta(days=365) - profile.save() + plan = data['data']['metadata'].get('plan', transaction.user.profile.subscription_plan) + _activate_subscription_and_notify(transaction, plan, request) else: transaction.status = 'FAILED' transaction.save() @@ -714,4 +722,4 @@ def admin_app_settings(request): else: form = AppSettingForm(instance=settings_obj) - return render(request, 'core/app_settings.html', {'form': form}) + return render(request, 'core/app_settings.html', {'form': form}) \ No newline at end of file