This commit is contained in:
IGNY8 VPS (Salman)
2025-12-08 07:33:37 +00:00
parent d144f5d19a
commit 42d04fb7f2
3 changed files with 21 additions and 47 deletions

View File

@@ -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,

View File

@@ -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)),
]

View File

@@ -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/<int:user_id>/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/<int:pk>/approve_payment/', BillingAdminViewSet.as_view({'post': 'approve_payment'}), name='admin-billing-approve-payment'),
path('billing/<int:pk>/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/<int:pk>/', 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/<int:pk>/approve_payment/', AdminBillingViewSet.as_view({'post': 'approve_payment'}), name='admin-billing-approve-payment'),
path('billing/<int:pk>/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/<int:pk>/', 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/<int:pk>/', 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/<int:pk>/', 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/<int:pk>/set_default/', BillingAdminViewSet.as_view({'post': 'set_default_account_payment_method'}), name='admin-billing-account-payment-method-set-default'),
path('billing/account-payment-methods/<int:pk>/set_default/', AdminBillingViewSet.as_view({'post': 'set_default_account_payment_method'}), name='admin-billing-account-payment-method-set-default'),
]
urlpatterns += router.urls