247 lines
17 KiB
Python
247 lines
17 KiB
Python
# Generated by Django 5.1.15 on 2026-09-02 00:19
|
|
|
|
import django.db.models.deletion
|
|
from django.conf import settings
|
|
from django.db import migrations, models
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
initial = True
|
|
|
|
dependencies = [
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name='Account',
|
|
fields=[
|
|
('id', models.CharField(max_length=36, primary_key=True, serialize=False)),
|
|
('code', models.CharField(max_length=20, verbose_name='کد حساب')),
|
|
('name', models.CharField(max_length=150, verbose_name='نام حساب')),
|
|
('level', models.PositiveSmallIntegerField(choices=[(1, 'حساب کل'), (2, 'حساب معین'), (3, 'حساب تفصیلی')], verbose_name='سطح')),
|
|
('account_type', models.CharField(choices=[('asset', 'دارایی'), ('liability', 'بدهی'), ('equity', 'سرمایه'), ('income', 'درآمد'), ('expense', 'هزینه')], max_length=15, verbose_name='نوع حساب')),
|
|
('is_system', models.BooleanField(default=False, verbose_name='حساب سیستمی')),
|
|
('is_active', models.BooleanField(default=True, verbose_name='فعال')),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='bizapps.account', verbose_name='حساب والد')),
|
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='accounts', to=settings.AUTH_USER_MODEL)),
|
|
],
|
|
options={
|
|
'verbose_name': 'حساب',
|
|
'verbose_name_plural': 'درخت حساب\u200cها',
|
|
'ordering': ['code'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='Customer',
|
|
fields=[
|
|
('id', models.CharField(max_length=36, primary_key=True, serialize=False)),
|
|
('name', models.CharField(max_length=150, verbose_name='نام')),
|
|
('phone', models.CharField(blank=True, max_length=20, verbose_name='شماره تماس')),
|
|
('email', models.CharField(blank=True, max_length=150, verbose_name='ایمیل')),
|
|
('address', models.CharField(blank=True, max_length=255, verbose_name='آدرس')),
|
|
('notes', models.TextField(blank=True, verbose_name='یادداشت')),
|
|
('total_purchases_count', models.PositiveIntegerField(default=0, verbose_name='تعداد خرید')),
|
|
('total_purchase_amount', models.FloatField(default=0, verbose_name='مجموع خرید')),
|
|
('last_purchase_date', models.DateTimeField(blank=True, null=True, verbose_name='آخرین خرید')),
|
|
('outstanding_balance', models.FloatField(default=0, verbose_name='مانده بدهی')),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('account', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='customer', to='bizapps.account', verbose_name='حساب تفصیلی')),
|
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='customers', to=settings.AUTH_USER_MODEL)),
|
|
],
|
|
options={
|
|
'verbose_name': 'مشتری',
|
|
'verbose_name_plural': 'مشتریان',
|
|
'ordering': ['name'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='Invoice',
|
|
fields=[
|
|
('id', models.CharField(max_length=36, primary_key=True, serialize=False)),
|
|
('invoice_number', models.CharField(max_length=30, verbose_name='شماره فاکتور')),
|
|
('invoice_date', models.DateTimeField(verbose_name='تاریخ فاکتور')),
|
|
('buyer_name', models.CharField(blank=True, max_length=150, verbose_name='نام خریدار')),
|
|
('buyer_phone', models.CharField(blank=True, max_length=20, verbose_name='شماره خریدار')),
|
|
('buyer_address', models.CharField(blank=True, max_length=255, verbose_name='آدرس خریدار')),
|
|
('seller_name', models.CharField(blank=True, max_length=150, verbose_name='نام فروشنده')),
|
|
('seller_phone', models.CharField(blank=True, max_length=20, verbose_name='شماره فروشنده')),
|
|
('seller_address', models.CharField(blank=True, max_length=255, verbose_name='آدرس فروشنده')),
|
|
('total_amount', models.FloatField(default=0, verbose_name='جمع کل')),
|
|
('discount_amount', models.FloatField(default=0, verbose_name='تخفیف')),
|
|
('tax_lines', models.JSONField(blank=True, default=list, verbose_name='ردیف\u200cهای مالیات')),
|
|
('final_amount', models.FloatField(default=0, verbose_name='مبلغ نهایی')),
|
|
('payment_type', models.CharField(choices=[('cash', 'نقدی'), ('credit', 'قسطی/نسیه')], default='cash', max_length=10)),
|
|
('payment_status', models.CharField(choices=[('unpaid', 'پرداخت\u200cنشده'), ('paid', 'پرداخت\u200cشده')], default='unpaid', max_length=10)),
|
|
('order_status', models.CharField(choices=[('pending_payment', 'در انتظار پرداخت'), ('ready_to_ship', 'آماده\u200cی ارسال'), ('shipped', 'ارسال\u200cشده'), ('delivered', 'تحویل\u200cشده'), ('cancelled', 'لغوشده')], default='ready_to_ship', max_length=20)),
|
|
('shipping_method', models.CharField(choices=[('pickup', 'تحویل حضوری'), ('post', 'پست'), ('courier', 'پیک')], default='pickup', max_length=10)),
|
|
('tracking_code', models.CharField(blank=True, max_length=100, verbose_name='کد رهگیری')),
|
|
('notes', models.TextField(blank=True, verbose_name='یادداشت')),
|
|
('paid_at', models.DateTimeField(blank=True, null=True, verbose_name='زمان پرداخت')),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='invoices', to='bizapps.customer')),
|
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='invoices', to=settings.AUTH_USER_MODEL)),
|
|
],
|
|
options={
|
|
'verbose_name': 'فاکتور',
|
|
'verbose_name_plural': 'فاکتورها',
|
|
'ordering': ['-invoice_date'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='LedgerEntry',
|
|
fields=[
|
|
('id', models.CharField(max_length=36, primary_key=True, serialize=False)),
|
|
('entry_type', models.CharField(choices=[('income', 'درآمد'), ('expense', 'هزینه')], max_length=10, verbose_name='نوع')),
|
|
('title', models.CharField(max_length=150, verbose_name='عنوان')),
|
|
('amount', models.FloatField(verbose_name='مبلغ')),
|
|
('category', models.CharField(blank=True, choices=[('sale_cash', 'فروش نقدی'), ('sale_credit', 'فروش قسطی/نسیه'), ('service_income', 'درآمد خدمات'), ('other_income', 'سایر درآمدها'), ('purchase_cash', 'خرید نقدی'), ('purchase_credit', 'خرید نسیه'), ('rent', 'اجاره'), ('salary', 'حقوق'), ('utility', 'قبض و آب\u200cوبرق'), ('transport', 'حمل\u200cونقل'), ('other_expense', 'سایر هزینه\u200cها')], max_length=100, verbose_name='دسته')),
|
|
('entry_date', models.DateField(verbose_name='تاریخ')),
|
|
('note', models.TextField(blank=True, verbose_name='یادداشت')),
|
|
('total_amount', models.FloatField(default=0, verbose_name='مبلغ کل تعهد')),
|
|
('counterparty_name', models.CharField(blank=True, max_length=150, verbose_name='طرف حساب')),
|
|
('counterparty_phone', models.CharField(blank=True, max_length=20, verbose_name='شماره طرف حساب')),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ledger_entries', to='bizapps.account', verbose_name='حساب معین')),
|
|
('linked_invoice', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ledger_entries', to='bizapps.invoice')),
|
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ledger_entries', to=settings.AUTH_USER_MODEL)),
|
|
],
|
|
options={
|
|
'verbose_name': 'ردیف دفتر درآمد/هزینه',
|
|
'verbose_name_plural': 'دفتر درآمد و هزینه',
|
|
'ordering': ['-entry_date'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='LedgerInstallment',
|
|
fields=[
|
|
('id', models.CharField(max_length=36, primary_key=True, serialize=False)),
|
|
('amount', models.FloatField(verbose_name='مبلغ قسط')),
|
|
('paid_date', models.DateField(verbose_name='تاریخ پرداخت')),
|
|
('reference', models.CharField(blank=True, max_length=150, verbose_name='شماره مرجع')),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('ledger_entry', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='installments', to='bizapps.ledgerentry')),
|
|
],
|
|
options={
|
|
'verbose_name': 'قسط',
|
|
'verbose_name_plural': 'اقساط',
|
|
'ordering': ['paid_date'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='Product',
|
|
fields=[
|
|
('id', models.CharField(max_length=36, primary_key=True, serialize=False)),
|
|
('name', models.CharField(max_length=150, verbose_name='نام کالا')),
|
|
('sku', models.CharField(blank=True, max_length=100, verbose_name='کد کالا')),
|
|
('category', models.CharField(blank=True, max_length=100, verbose_name='دسته')),
|
|
('unit', models.CharField(blank=True, default='عدد', max_length=30, verbose_name='واحد شمارش')),
|
|
('quantity', models.FloatField(default=0, verbose_name='موجودی')),
|
|
('unit_price', models.FloatField(default=0, verbose_name='قیمت فروش')),
|
|
('purchase_price', models.FloatField(default=0, verbose_name='قیمت خرید')),
|
|
('total_purchase_value', models.FloatField(default=0, verbose_name='ارزش موجودی')),
|
|
('low_stock_threshold', models.FloatField(default=0, verbose_name='آستانه\u200cی هشدار موجودی کم')),
|
|
('notes', models.TextField(blank=True, verbose_name='یادداشت')),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='products', to=settings.AUTH_USER_MODEL)),
|
|
],
|
|
options={
|
|
'verbose_name': 'کالا',
|
|
'verbose_name_plural': 'انبار',
|
|
'ordering': ['name'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='InvoiceItem',
|
|
fields=[
|
|
('id', models.CharField(max_length=36, primary_key=True, serialize=False)),
|
|
('description', models.CharField(max_length=255, verbose_name='شرح')),
|
|
('quantity', models.FloatField(verbose_name='تعداد')),
|
|
('unit_price', models.FloatField(verbose_name='قیمت واحد')),
|
|
('discount_percent', models.FloatField(default=0, verbose_name='درصد تخفیف')),
|
|
('total_price', models.FloatField(default=0, verbose_name='جمع')),
|
|
('invoice', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='bizapps.invoice')),
|
|
('product', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='bizapps.product')),
|
|
],
|
|
options={
|
|
'verbose_name': 'قلم فاکتور',
|
|
'verbose_name_plural': 'اقلام فاکتور',
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='StockMovement',
|
|
fields=[
|
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
|
('delta', models.FloatField(verbose_name='تغییر')),
|
|
('quantity_after', models.FloatField(verbose_name='موجودی بعد از تغییر')),
|
|
('note', models.CharField(blank=True, max_length=255, verbose_name='یادداشت')),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='movements', to='bizapps.product')),
|
|
],
|
|
options={
|
|
'verbose_name': 'تغییر موجودی',
|
|
'verbose_name_plural': 'تاریخچه\u200cی موجودی',
|
|
'ordering': ['-created_at'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='Transaction',
|
|
fields=[
|
|
('id', models.CharField(max_length=36, primary_key=True, serialize=False)),
|
|
('transaction_number', models.CharField(max_length=30, verbose_name='شماره سند')),
|
|
('transaction_date', models.DateTimeField(verbose_name='تاریخ سند')),
|
|
('transaction_type', models.CharField(choices=[('cash_sale', 'فروش نقدی'), ('credit_sale', 'فروش نسیه'), ('installment', 'دریافت قسط'), ('purchase', 'خرید'), ('expense', 'هزینه'), ('adjustment', 'تعدیل')], max_length=20)),
|
|
('debit_account', models.CharField(max_length=20, verbose_name='کد حساب بدهکار')),
|
|
('credit_account', models.CharField(max_length=20, verbose_name='کد حساب بستانکار')),
|
|
('amount', models.FloatField(verbose_name='مبلغ')),
|
|
('description', models.CharField(blank=True, max_length=255, verbose_name='شرح')),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('credit_account_ref', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='credit_transactions', to='bizapps.account', verbose_name='حساب بستانکار')),
|
|
('debit_account_ref', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='debit_transactions', to='bizapps.account', verbose_name='حساب بدهکار')),
|
|
('reference_invoice', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transactions', to='bizapps.invoice')),
|
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transactions', to=settings.AUTH_USER_MODEL)),
|
|
],
|
|
options={
|
|
'verbose_name': 'سند حسابداری',
|
|
'verbose_name_plural': 'اسناد حسابداری',
|
|
'ordering': ['-transaction_date'],
|
|
},
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='account',
|
|
index=models.Index(fields=['user', 'level'], name='bizapps_acc_user_id_e1d510_idx'),
|
|
),
|
|
migrations.AddConstraint(
|
|
model_name='account',
|
|
constraint=models.UniqueConstraint(fields=('user', 'code'), name='unique_user_account_code'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='customer',
|
|
index=models.Index(fields=['user', 'phone'], name='bizapps_cus_user_id_886a45_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='invoice',
|
|
index=models.Index(fields=['user', 'invoice_date'], name='bizapps_inv_user_id_89a273_idx'),
|
|
),
|
|
migrations.AddConstraint(
|
|
model_name='invoice',
|
|
constraint=models.UniqueConstraint(fields=('user', 'invoice_number'), name='unique_user_invoice_number'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='ledgerentry',
|
|
index=models.Index(fields=['user', 'entry_date'], name='bizapps_led_user_id_795e45_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='product',
|
|
index=models.Index(fields=['user', 'category'], name='bizapps_pro_user_id_adf41e_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='transaction',
|
|
index=models.Index(fields=['user', 'transaction_date'], name='bizapps_tra_user_id_7cbd25_idx'),
|
|
),
|
|
]
|