From 42d04fb7f2d542b83761c493ac2b6585caa367d5 Mon Sep 17 00:00:00 2001 From: "IGNY8 VPS (Salman)" Date: Mon, 8 Dec 2025 07:33:37 +0000 Subject: [PATCH] sdsd --- backend/igny8_core/auth/serializers.py | 21 ++++++---------- backend/igny8_core/business/billing/urls.py | 22 +++------------- .../igny8_core/modules/billing/admin_urls.py | 25 ++++++++----------- 3 files changed, 21 insertions(+), 47 deletions(-) diff --git a/backend/igny8_core/auth/serializers.py b/backend/igny8_core/auth/serializers.py index 84e38b98..9ab5f1fb 100644 --- a/backend/igny8_core/auth/serializers.py +++ b/backend/igny8_core/auth/serializers.py @@ -288,21 +288,14 @@ class RegisterSerializer(serializers.Serializer): from igny8_core.business.billing.models import CreditTransaction with transaction.atomic(): - # ALWAYS assign Free Trial plan for simple signup - # Ignore plan_id parameter - this is for free trial signups only + # ALWAYS assign the existing free plan for simple signup + # No fallbacks: if free plan is misconfigured, surface error immediately try: - plan = Plan.objects.get(slug='free-trial', is_active=True) + plan = Plan.objects.get(slug='free', is_active=True) except Plan.DoesNotExist: - # Fallback to 'free' if free-trial doesn't exist - try: - plan = Plan.objects.get(slug='free', is_active=True) - except Plan.DoesNotExist: - # Last fallback: get cheapest active plan - plan = Plan.objects.filter(is_active=True).order_by('price').first() - if not plan: - raise serializers.ValidationError({ - "plan": "Free trial plan not configured. Please contact support." - }) + raise serializers.ValidationError({ + "plan": "Free plan not configured. Please contact support." + }) # Generate account name if not provided account_name = validated_data.get('account_name') @@ -364,7 +357,7 @@ class RegisterSerializer(serializers.Serializer): transaction_type='subscription', amount=trial_credits, balance_after=trial_credits, - description=f'Free trial credits from {plan.name}', + description=f'Free plan credits from {plan.name}', metadata={ 'plan_slug': plan.slug, 'registration': True, diff --git a/backend/igny8_core/business/billing/urls.py b/backend/igny8_core/business/billing/urls.py index 32a35e7d..e0ef39d8 100644 --- a/backend/igny8_core/business/billing/urls.py +++ b/backend/igny8_core/business/billing/urls.py @@ -1,28 +1,14 @@ -""" -URL patterns for business billing module (invoices, payments, credit packages) -""" +"""Billing routes including bank transfer confirmation and credit endpoints.""" from django.urls import path, include from rest_framework.routers import DefaultRouter -from .views import ( - InvoiceViewSet, - PaymentViewSet, - CreditPackageViewSet, - CreditTransactionViewSet, - AdminBillingViewSet, - AccountPaymentMethodViewSet, - BillingViewSet, -) +from .views import BillingViewSet from igny8_core.modules.billing.views import ( CreditBalanceViewSet, CreditUsageViewSet, + CreditTransactionViewSet, ) router = DefaultRouter() -router.register(r'invoices', InvoiceViewSet, basename='invoice') -router.register(r'payments', PaymentViewSet, basename='payment') -router.register(r'credit-packages', CreditPackageViewSet, basename='credit-package') -router.register(r'transactions', CreditTransactionViewSet, basename='transaction') -router.register(r'payment-methods', AccountPaymentMethodViewSet, basename='payment-method') router.register(r'admin', BillingViewSet, basename='billing-admin') # Canonical credits endpoints (unified billing) router.register(r'credits/balance', CreditBalanceViewSet, basename='credit-balance') @@ -30,7 +16,5 @@ router.register(r'credits/usage', CreditUsageViewSet, basename='credit-usage') router.register(r'credits/transactions', CreditTransactionViewSet, basename='credit-transactions') urlpatterns = [ - # Country/config-driven available methods (legacy alias) - path('payment-methods/available/', PaymentViewSet.as_view({'get': 'available_methods'}), name='payment-methods-available'), path('', include(router.urls)), ] diff --git a/backend/igny8_core/modules/billing/admin_urls.py b/backend/igny8_core/modules/billing/admin_urls.py index 22463663..19dfd38d 100644 --- a/backend/igny8_core/modules/billing/admin_urls.py +++ b/backend/igny8_core/modules/billing/admin_urls.py @@ -2,9 +2,6 @@ from django.urls import path from rest_framework.routers import DefaultRouter from .views import AdminBillingViewSet -from igny8_core.business.billing.views import ( - AdminBillingViewSet as BillingAdminViewSet, -) router = DefaultRouter() @@ -13,27 +10,27 @@ urlpatterns = [ path('users/', AdminBillingViewSet.as_view({'get': 'list_users'}), name='admin-users-list'), path('users//adjust-credits/', AdminBillingViewSet.as_view({'post': 'adjust_credits'}), name='admin-adjust-credits'), path('credit-costs/', AdminBillingViewSet.as_view({'get': 'list_credit_costs', 'post': 'update_credit_costs'}), name='admin-credit-costs'), - # Unified admin billing endpoints (alias legacy /billing/admin/* under /admin/billing/*) - path('billing/invoices/', BillingAdminViewSet.as_view({'get': 'invoices'}), name='admin-billing-invoices'), - path('billing/payments/', BillingAdminViewSet.as_view({'get': 'payments'}), name='admin-billing-payments'), - path('billing/pending_payments/', BillingAdminViewSet.as_view({'get': 'pending_payments'}), name='admin-billing-pending-payments'), - path('billing//approve_payment/', BillingAdminViewSet.as_view({'post': 'approve_payment'}), name='admin-billing-approve-payment'), - path('billing//reject_payment/', BillingAdminViewSet.as_view({'post': 'reject_payment'}), name='admin-billing-reject-payment'), - path('billing/payment-method-configs/', BillingAdminViewSet.as_view({'get': 'payment_method_configs', 'post': 'payment_method_configs'}), name='admin-billing-payment-method-configs'), - path('billing/payment-method-configs//', BillingAdminViewSet.as_view({ + # Unified admin billing endpoints (legacy aliases routed to AdminBillingViewSet) + path('billing/invoices/', AdminBillingViewSet.as_view({'get': 'invoices'}), name='admin-billing-invoices'), + path('billing/payments/', AdminBillingViewSet.as_view({'get': 'payments'}), name='admin-billing-payments'), + path('billing/pending_payments/', AdminBillingViewSet.as_view({'get': 'pending_payments'}), name='admin-billing-pending-payments'), + path('billing//approve_payment/', AdminBillingViewSet.as_view({'post': 'approve_payment'}), name='admin-billing-approve-payment'), + path('billing//reject_payment/', AdminBillingViewSet.as_view({'post': 'reject_payment'}), name='admin-billing-reject-payment'), + path('billing/payment-method-configs/', AdminBillingViewSet.as_view({'get': 'payment_method_configs', 'post': 'payment_method_configs'}), name='admin-billing-payment-method-configs'), + path('billing/payment-method-configs//', AdminBillingViewSet.as_view({ 'get': 'payment_method_config', 'patch': 'payment_method_config', 'put': 'payment_method_config', 'delete': 'payment_method_config', }), name='admin-billing-payment-method-config'), - path('billing/account-payment-methods/', BillingAdminViewSet.as_view({'get': 'account_payment_methods', 'post': 'account_payment_methods'}), name='admin-billing-account-payment-methods'), - path('billing/account-payment-methods//', BillingAdminViewSet.as_view({ + path('billing/account-payment-methods/', AdminBillingViewSet.as_view({'get': 'account_payment_methods', 'post': 'account_payment_methods'}), name='admin-billing-account-payment-methods'), + path('billing/account-payment-methods//', AdminBillingViewSet.as_view({ 'get': 'account_payment_method', 'patch': 'account_payment_method', 'put': 'account_payment_method', 'delete': 'account_payment_method', }), name='admin-billing-account-payment-method'), - path('billing/account-payment-methods//set_default/', BillingAdminViewSet.as_view({'post': 'set_default_account_payment_method'}), name='admin-billing-account-payment-method-set-default'), + path('billing/account-payment-methods//set_default/', AdminBillingViewSet.as_view({'post': 'set_default_account_payment_method'}), name='admin-billing-account-payment-method-set-default'), ] urlpatterns += router.urls