This commit is contained in:
IGNY8 VPS (Salman)
2025-12-08 18:22:10 +00:00
parent 33ad6768ec
commit 9f85ce4f52
11 changed files with 774 additions and 198 deletions

View File

@@ -0,0 +1,19 @@
# Generated by Django 5.2.8 on 2025-12-08 17:30
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('igny8_core_auth', '0009_add_plan_annual_discount_and_featured'),
]
operations = [
migrations.AddField(
model_name='subscription',
name='plan',
field=models.ForeignKey(blank=True, help_text='Plan for this subscription (historical tracking)', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='subscriptions', to='igny8_core_auth.plan'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 5.2.8 on 2025-12-08 17:31
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('igny8_core_auth', '0010_add_subscription_plan_field'),
]
operations = [
migrations.AlterField(
model_name='site',
name='industry',
field=models.ForeignKey(help_text='Industry this site belongs to (required)', on_delete=django.db.models.deletion.PROTECT, related_name='sites', to='igny8_core_auth.industry'),
),
]

View File

@@ -230,6 +230,14 @@ class Subscription(models.Model):
]
account = models.OneToOneField('igny8_core_auth.Account', on_delete=models.CASCADE, related_name='subscription', db_column='tenant_id')
plan = models.ForeignKey(
'igny8_core_auth.Plan',
on_delete=models.PROTECT,
related_name='subscriptions',
null=True,
blank=True,
help_text='Plan for this subscription (historical tracking)'
)
stripe_subscription_id = models.CharField(
max_length=255,
blank=True,
@@ -286,9 +294,7 @@ class Site(SoftDeletableModel, AccountBaseModel):
'igny8_core_auth.Industry',
on_delete=models.PROTECT,
related_name='sites',
null=True,
blank=True,
help_text="Industry this site belongs to"
help_text="Industry this site belongs to (required)"
)
is_active = models.BooleanField(default=True, db_index=True)
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='active')

View File

@@ -287,7 +287,7 @@ class RegisterSerializer(serializers.Serializer):
def create(self, validated_data):
from django.db import transaction
from igny8_core.business.billing.models import CreditTransaction
from igny8_core.business.billing.models import Subscription
from igny8_core.auth.models import Subscription
from igny8_core.business.billing.models import AccountPaymentMethod
from igny8_core.business.billing.services.invoice_service import InvoiceService
from django.utils import timezone

View File

@@ -215,6 +215,12 @@ class Invoice(AccountBaseModel):
# Metadata
notes = models.TextField(blank=True)
metadata = models.JSONField(default=dict)
pdf_file = models.FileField(
upload_to='invoices/pdf/%Y/%m/',
null=True,
blank=True,
help_text='Generated PDF invoice file'
)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.2.8 on 2025-12-08 17:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('billing', '0006_accountpaymentmethod'),
]
operations = [
migrations.AddField(
model_name='invoice',
name='pdf_file',
field=models.FileField(blank=True, help_text='Generated PDF invoice file', null=True, upload_to='invoices/pdf/%Y/%m/'),
),
]