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