186 lines
6.1 KiB
Python
186 lines
6.1 KiB
Python
#!/usr/bin/env python
|
|
"""
|
|
Create API test data for billing endpoints
|
|
All test records are marked with 'API_TEST' in name/description/notes
|
|
"""
|
|
import os
|
|
import sys
|
|
import django
|
|
|
|
# Setup Django
|
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'igny8_core.settings')
|
|
django.setup()
|
|
|
|
from django.utils import timezone
|
|
from django.contrib.auth import get_user_model
|
|
from igny8_core.auth.models import Account, Plan
|
|
from igny8_core.business.billing.models import (
|
|
Invoice, Payment, CreditTransaction, AccountPaymentMethod, PaymentMethodConfig
|
|
)
|
|
from decimal import Decimal
|
|
from datetime import timedelta
|
|
|
|
User = get_user_model()
|
|
|
|
print("Creating API test data...")
|
|
|
|
# Get or create test account
|
|
try:
|
|
account = Account.objects.get(name__icontains='scale')
|
|
print(f"✓ Using existing account: {account.name} (ID: {account.id})")
|
|
except Account.DoesNotExist:
|
|
# Get a plan
|
|
plan = Plan.objects.filter(is_active=True).first()
|
|
account = Account.objects.create(
|
|
name='API_TEST_ACCOUNT',
|
|
slug='api-test-account',
|
|
plan=plan,
|
|
credits=5000,
|
|
status='active'
|
|
)
|
|
print(f"✓ Created test account: {account.name} (ID: {account.id})")
|
|
|
|
# Create test invoices
|
|
invoice1, created = Invoice.objects.get_or_create(
|
|
account=account,
|
|
invoice_number='INV-API-TEST-001',
|
|
defaults={
|
|
'status': 'pending',
|
|
'subtotal': Decimal('99.99'),
|
|
'tax': Decimal('0.00'),
|
|
'total': Decimal('99.99'),
|
|
'currency': 'USD',
|
|
'invoice_date': timezone.now().date(),
|
|
'due_date': (timezone.now() + timedelta(days=30)).date(),
|
|
'billing_email': 'test@igny8.com',
|
|
'notes': 'API_TEST: Invoice for approval test',
|
|
'line_items': [{'description': 'API Test Service', 'amount': 99.99, 'quantity': 1}],
|
|
}
|
|
)
|
|
if created:
|
|
print(f"✓ Created test invoice 1 (ID: {invoice1.id})")
|
|
else:
|
|
print(f"✓ Existing test invoice 1 (ID: {invoice1.id})")
|
|
|
|
invoice2, created = Invoice.objects.get_or_create(
|
|
account=account,
|
|
invoice_number='INV-API-TEST-002',
|
|
defaults={
|
|
'status': 'pending',
|
|
'subtotal': Decimal('49.99'),
|
|
'tax': Decimal('0.00'),
|
|
'total': Decimal('49.99'),
|
|
'currency': 'USD',
|
|
'invoice_date': timezone.now().date(),
|
|
'due_date': (timezone.now() + timedelta(days=30)).date(),
|
|
'billing_email': 'test@igny8.com',
|
|
'notes': 'API_TEST: Invoice for rejection test',
|
|
'line_items': [{'description': 'API Test Service', 'amount': 49.99, 'quantity': 1}],
|
|
}
|
|
)
|
|
if created:
|
|
print(f"✓ Created test invoice 2 (ID: {invoice2.id})")
|
|
else:
|
|
print(f"✓ Existing test invoice 2 (ID: {invoice2.id})")
|
|
|
|
# Create test payment for approval
|
|
pending_payment, created = Payment.objects.get_or_create(
|
|
account=account,
|
|
invoice=invoice1,
|
|
manual_reference='API_TEST_REF_001',
|
|
defaults={
|
|
'status': 'pending_approval',
|
|
'payment_method': 'bank_transfer',
|
|
'amount': Decimal('99.99'),
|
|
'currency': 'USD',
|
|
'manual_notes': 'API_TEST: Test payment for approval endpoint',
|
|
}
|
|
)
|
|
if created:
|
|
print(f"✓ Created pending payment (ID: {pending_payment.id}) for approve_payment endpoint")
|
|
else:
|
|
print(f"✓ Existing pending payment (ID: {pending_payment.id})")
|
|
|
|
# Create test payment for rejection
|
|
reject_payment, created = Payment.objects.get_or_create(
|
|
account=account,
|
|
invoice=invoice2,
|
|
manual_reference='API_TEST_REF_002',
|
|
defaults={
|
|
'status': 'pending_approval',
|
|
'payment_method': 'manual',
|
|
'amount': Decimal('49.99'),
|
|
'currency': 'USD',
|
|
'manual_notes': 'API_TEST: Test payment for rejection endpoint',
|
|
}
|
|
)
|
|
if created:
|
|
print(f"✓ Created pending payment (ID: {reject_payment.id}) for reject_payment endpoint")
|
|
else:
|
|
print(f"✓ Existing pending payment (ID: {reject_payment.id})")
|
|
|
|
# Get or create test payment method config
|
|
configs = PaymentMethodConfig.objects.filter(payment_method='bank_transfer')
|
|
if configs.exists():
|
|
config = configs.first()
|
|
print(f"✓ Using existing payment method config (ID: {config.id})")
|
|
created = False
|
|
else:
|
|
config = PaymentMethodConfig.objects.create(
|
|
payment_method='bank_transfer',
|
|
display_name='API_TEST Bank Transfer',
|
|
instructions='API_TEST: Transfer to account 123456789',
|
|
is_enabled=True,
|
|
sort_order=1,
|
|
)
|
|
print(f"✓ Created payment method config (ID: {config.id})")
|
|
created = True
|
|
|
|
# Create test account payment method
|
|
account_method, created = AccountPaymentMethod.objects.get_or_create(
|
|
account=account,
|
|
type='bank_transfer',
|
|
defaults={
|
|
'display_name': 'API_TEST Account Bank Transfer',
|
|
'instructions': 'API_TEST: Test account-specific payment method',
|
|
'is_default': True,
|
|
}
|
|
)
|
|
if created:
|
|
print(f"✓ Created account payment method (ID: {account_method.id})")
|
|
else:
|
|
print(f"✓ Existing account payment method (ID: {account_method.id})")
|
|
|
|
# Create test credit transaction
|
|
transaction, created = CreditTransaction.objects.get_or_create(
|
|
account=account,
|
|
transaction_type='adjustment',
|
|
amount=1000,
|
|
defaults={
|
|
'balance_after': account.credits,
|
|
'description': 'API_TEST: Test credit adjustment',
|
|
'metadata': {'test': True, 'reason': 'API testing'},
|
|
}
|
|
)
|
|
if created:
|
|
print(f"✓ Created credit transaction (ID: {transaction.id})")
|
|
else:
|
|
print(f"✓ Existing credit transaction (ID: {transaction.id})")
|
|
|
|
print("\n" + "="*60)
|
|
print("API Test Data Summary:")
|
|
print("="*60)
|
|
print(f"Account ID: {account.id}")
|
|
print(f"Pending Payment (approve): ID {pending_payment.id}")
|
|
print(f"Pending Payment (reject): ID {reject_payment.id}")
|
|
print(f"Payment Method Config: ID {config.id}")
|
|
print(f"Account Payment Method: ID {account_method.id}")
|
|
print(f"Credit Transaction: ID {transaction.id}")
|
|
print("="*60)
|
|
print("\nTest endpoints:")
|
|
print(f"POST /v1/admin/billing/{pending_payment.id}/approve_payment/")
|
|
print(f"POST /v1/admin/billing/{reject_payment.id}/reject_payment/")
|
|
print(f"POST /v1/admin/users/{account.id}/adjust-credits/")
|
|
print(f"GET /v1/billing/payment-methods/{account_method.id}/set_default/")
|
|
print("="*60)
|