Files
shopship/apps/bizapps/migrations/0001_initial.py
T
2026-09-04 13:05:54 +03:30

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