from django.core.management.base import BaseCommand from django_ledger.models import EntityModel, ChartOfAccountModel, AccountModel from django.contrib.auth import get_user_model User = get_user_model() class Command(BaseCommand): help = 'Creates Chart of Accounts for Deepseek entity' def handle(self, *args, **options): # Get or create admin user admin_user = User.objects.filter(is_superuser=True).first() if not admin_user: self.stdout.write(self.style.ERROR('No admin user found!')) return # Get or create Deepseek entity with minimal valid fields entity, created = EntityModel.objects.get_or_create( name='Deepseek', defaults={ 'admin': admin_user, 'fy_start_month': 1, # January fiscal year start 'accrual_method': True # Using accrual accounting } ) if created: self.stdout.write(self.style.SUCCESS('Created Deepseek entity')) else: self.stdout.write(self.style.SUCCESS('Deepseek entity already exists')) # Get or create Chart of Accounts coa, created = ChartOfAccountModel.objects.get_or_create( slug='deepseek-coa', defaults={ 'name': 'Deepseek Chart of Accounts', 'entity': entity, 'description': 'Standard COA for Deepseek automotive business' } ) if created: self.stdout.write(self.style.SUCCESS('Created Chart of Accounts')) else: self.stdout.write(self.style.SUCCESS('Chart of Accounts already exists')) # Account definitions with string role literals ACCOUNTS = [ # Assets ('1010', 'Cash on Hand', 'الصندوق', 'asset_ca_cash'), ('1020', 'Bank', 'البنك', 'asset_ca_cash'), ('1030', 'Accounts Receivable', 'العملاء', 'asset_ca_receivable'), ('1040', 'Inventory (Cars)', 'مخزون السيارات', 'asset_ca_inventory'), ('1045', 'Spare Parts Inventory', 'مخزون قطع الغيار', 'asset_ca_inventory'), ('1050', 'Employee Advances', 'سُلف وأمانات الموظفين', 'asset_ca_other'), ('1060', 'Prepaid Expenses', 'مصروفات مدفوعة مقدماً', 'asset_ca_other'), ('1070', 'Notes Receivable', 'أوراق القبض', 'asset_ca_receivable'), ('2010', 'Lands', 'أراضي', 'asset_ppe_land'), ('2011', 'Buildings', 'مباني', 'asset_ppe_building'), ('2012', 'Company Vehicles', 'سيارات الشركة', 'asset_ppe_equipment'), ('2013', 'Equipment & Tools', 'أجهزة ومعدات', 'asset_ppe_equipment'), ('2014', 'Furniture & Fixtures', 'أثاث وديكور', 'asset_ppe_equipment'), ('2015', 'Other Fixed Assets', 'أصول ثابتة أخرى', 'asset_ppe_other'), ('2020', 'Long-term Investments', 'استثمارات طويلة الأجل', 'asset_lt_investments'), ('2030', 'Intangible Assets', 'أصول غير ملموسة', 'asset_lt_intangible'), # Liabilities ('3010', 'Accounts Payable', 'الموردين', 'liability_cl_acc_payable'), ('3020', 'Notes Payable', 'أوراق الدفع', 'liability_cl_acc_payable'), ('3030', 'Short-term Loans', 'قروض قصيرة الأجل', 'liability_cl_debt'), ('3040', 'Employee Payables', 'السلف المستحقة', 'liability_cl_acc_payable'), ('3050', 'Accrued Expenses', 'مصروفات مستحقة', 'liability_cl_acc_expense'), ('3060', 'Accrued Taxes', 'ضرائب مستحقة', 'liability_cl_acc_expense'), ('3070', 'Provisions', 'مخصصات', 'liability_cl_acc_expense'), ('4010', 'Long-term Bank Loans', 'قروض طويلة الأجل', 'liability_lt_loans'), ('4020', 'Lease Liabilities', 'التزامات تمويلية', 'liability_lt_loans'), ('4030', 'Other Long-term Liabilities', 'التزامات أخرى طويلة الأجل', 'liability_lt_other'), # Equity ('5010', 'Capital', 'رأس المال', 'equity_capital'), ('5020', 'Statutory Reserve', 'الاحتياطي القانوني', 'equity_retained'), ('5030', 'Retained Earnings', 'احتياطي الأرباح', 'equity_retained'), ('5040', 'Profit & Loss for the Period', 'أرباح وخسائر الفترة', 'equity_earnings'), # Income ('6010', 'Car Sales', 'مبيعات السيارات', 'income_operating'), ('6020', 'After-Sales Services', 'إيرادات خدمات ما بعد البيع', 'income_operating'), ('6030', 'Car Rental Income', 'إيرادات تأجير سيارات', 'income_operating'), ('6040', 'Other Income', 'إيرادات أخرى', 'income_other'), # Expenses ('7010', 'Cost of Goods Sold', 'تكلفة البضاعة المباعة', 'expense_cogs'), ('7015', 'Spare Parts Cost Consumed', 'تكلفة قطع الغيار المستهلكة', 'expense_cogs'), ('7020', 'Salaries & Wages', 'رواتب وأجور', 'expense_operating'), ('7030', 'Rent', 'إيجار', 'expense_operating'), ('7040', 'Utilities', 'كهرباء ومياه', 'expense_operating'), ('7050', 'Advertising & Marketing', 'دعاية وإعلان', 'expense_operating'), ('7060', 'Maintenance', 'صيانة', 'expense_operating'), ('7070', 'Operating Expenses', 'مصاريف تشغيلية', 'expense_operating'), ('7080', 'Depreciation', 'استهلاك أصول ثابتة', 'expense_depreciation'), ('7090', 'Fees & Taxes', 'رسوم وضرائب', 'expense_operating'), ('7100', 'Bank Charges', 'مصاريف بنكية', 'expense_operating'), ('7110', 'Other Expenses', 'مصاريف أخرى', 'expense_other'), ] # Create accounts created_count = 0 for code, name_en, name_ar, role in ACCOUNTS: acc, created = AccountModel.objects.get_or_create( coa=coa, code=code, defaults={ 'name': name_en, 'name_ar': name_ar, 'role_default': role, 'active': True, 'balance_type': 'debit' if role.startswith(('asset', 'expense')) else 'credit' } ) if created: created_count += 1 self.stdout.write(self.style.SUCCESS(f'Successfully created {created_count} accounts')) self.stdout.write(self.style.SUCCESS(f'Total accounts in COA: {len(ACCOUNTS)}'))