from django_ledger.io import roles from django.core.management.base import BaseCommand from django.utils.translation import gettext_lazy as _ from django_ledger.models import ChartOfAccountModel, AccountModel,EntityModel class Command(BaseCommand): help = 'Creates Chart of Accounts for Deepseek entity' def handle(self, *args, **options): """ Create chart of accounts for automotive dealership business """ # Create Chart of Accounts entity_model = EntityModel.objects.get( name="Claude" ) # entity_model.get_all_accounts().delete() coa_model, created = ChartOfAccountModel.objects.get_or_create( entity=entity_model, name='Automotive Dealership Chart of Accounts', ) accounts_data = [ # Current Assets { 'code': '1010', 'name': 'Cash on Hand', 'name_arabic': 'الصندوق', 'role': roles.ASSET_CA_CASH, 'balance_type': roles.DEBIT, 'locked': True }, { 'code': '1020', 'name': 'Bank', 'name_arabic': 'البنك', 'role': roles.ASSET_CA_CASH, 'balance_type': roles.DEBIT, 'locked': True }, { 'code': '1030', 'name': 'Accounts Receivable', 'name_arabic': 'العملاء', 'role': roles.ASSET_CA_RECEIVABLES, 'balance_type': roles.DEBIT, 'locked': True }, { 'code': '1040', 'name': 'Inventory (Cars)', 'name_arabic': 'مخزون السيارات', 'role': roles.ASSET_CA_INVENTORY, 'balance_type': roles.DEBIT, 'locked': True }, { 'code': '1045', 'name': 'Spare Parts Inventory', 'name_arabic': 'مخزون قطع الغيار', 'role': roles.ASSET_CA_INVENTORY, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '1050', 'name': 'Employee Advances', 'name_arabic': 'سُلف وأمانات الموظفين', 'role': roles.ASSET_CA_RECEIVABLES, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '1060', 'name': 'Prepaid Expenses', 'name_arabic': 'مصروفات مدفوعة مقدماً', 'role': roles.ASSET_CA_PREPAID, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '1070', 'name': 'Notes Receivable', 'name_arabic': 'أوراق القبض', 'role': roles.ASSET_LTI_NOTES_RECEIVABLE, 'balance_type': roles.DEBIT, 'locked': False }, # Fixed Assets (2000-2999) { 'code': '2010', 'name': 'Lands', 'name_arabic': 'أراضي', 'role': roles.ASSET_LTI_LAND, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '2011', 'name': 'Buildings', 'name_arabic': 'مباني', 'role': roles.ASSET_PPE_BUILDINGS, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '2012', 'name': 'Company Vehicles', 'name_arabic': 'سيارات الشركة', 'role': roles.ASSET_PPE_EQUIPMENT, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '2013', 'name': 'Equipment & Tools', 'name_arabic': 'أجهزة ومعدات', 'role': roles.ASSET_PPE_EQUIPMENT, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '2014', 'name': 'Furniture & Fixtures', 'name_arabic': 'أثاث وديكور', 'role': roles.ASSET_PPE_EQUIPMENT, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '2015', 'name': 'Other Fixed Assets', 'name_arabic': 'أصول ثابتة أخرى', 'role': roles.ASSET_PPE_EQUIPMENT, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '2020', 'name': 'Long-term Investments', 'name_arabic': 'استثمارات طويلة الأجل', 'role': roles.ASSET_LTI_SECURITIES, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '2030', 'name': 'Intangible Assets', 'name_arabic': 'أصول غير ملموسة', 'role': roles.ASSET_INTANGIBLE_ASSETS, 'balance_type': roles.DEBIT, 'locked': False }, # Current Liabilities (3000-3999) { 'code': '3010', 'name': 'Accounts Payable', 'name_arabic': 'الموردين', 'role': roles.LIABILITY_CL_ACC_PAYABLE, 'balance_type': roles.CREDIT, 'locked': True }, { 'code': '3020', 'name': 'Notes Payable', 'name_arabic': 'أوراق الدفع', 'role': roles.LIABILITY_CL_ST_NOTES_PAYABLE, 'balance_type': roles.CREDIT, 'locked': False }, { 'code': '3030', 'name': 'Short-term Loans', 'name_arabic': 'قروض قصيرة الأجل', 'role': roles.LIABILITY_CL_ST_NOTES_PAYABLE, 'balance_type': roles.CREDIT, 'locked': False }, { 'code': '3040', 'name': 'Employee Payables', 'name_arabic': 'السلف المستحقة', 'role': roles.LIABILITY_CL_WAGES_PAYABLE, 'balance_type': roles.CREDIT, 'locked': False }, { 'code': '3050', 'name': 'Accrued Expenses', 'name_arabic': 'مصروفات مستحقة', 'role': roles.LIABILITY_CL_OTHER, 'balance_type': roles.CREDIT, 'locked': False }, { 'code': '3060', 'name': 'Accrued Taxes', 'name_arabic': 'ضرائب مستحقة', 'role': roles.LIABILITY_CL_TAXES_PAYABLE, 'balance_type': roles.CREDIT, 'locked': False }, { 'code': '3070', 'name': 'Provisions', 'name_arabic': 'مخصصات', 'role': roles.LIABILITY_CL_OTHER, 'balance_type': roles.CREDIT, 'locked': False }, # Long-term Liabilities (4000-4999) { 'code': '4010', 'name': 'Long-term Bank Loans', 'name_arabic': 'قروض طويلة الأجل', 'role': roles.LIABILITY_LTL_NOTES_PAYABLE, 'balance_type': roles.CREDIT, 'locked': False }, { 'code': '4020', 'name': 'Lease Liabilities', 'name_arabic': 'التزامات تمويلية', 'role': roles.LIABILITY_LTL_NOTES_PAYABLE, 'balance_type': roles.CREDIT, 'locked': False }, { 'code': '4030', 'name': 'Other Long-term Liabilities', 'name_arabic': 'التزامات أخرى طويلة الأجل', 'role': roles.LIABILITY_LTL_NOTES_PAYABLE, 'balance_type': roles.CREDIT, 'locked': False }, # Equity (5000-5999) { 'code': '5010', 'name': 'Capital', 'name_arabic': 'رأس المال', 'role': roles.EQUITY_CAPITAL, 'balance_type': roles.CREDIT, 'locked': True }, { 'code': '5020', 'name': 'Statutory Reserve', 'name_arabic': 'الاحتياطي القانوني', 'role': roles.EQUITY_ADJUSTMENT, 'balance_type': roles.CREDIT, 'locked': False }, { 'code': '5030', 'name': 'Retained Earnings', 'name_arabic': 'احتياطي الأرباح', 'role': roles.EQUITY_ADJUSTMENT, 'balance_type': roles.CREDIT, 'locked': False }, { 'code': '5040', 'name': 'Profit & Loss for the Period', 'name_arabic': 'أرباح وخسائر الفترة', 'role': roles.EQUITY_ADJUSTMENT, 'balance_type': roles.CREDIT, 'locked': False }, # Revenue (6000-6999) { 'code': '6010', 'name': 'Car Sales', 'name_arabic': 'مبيعات السيارات', 'role': roles.INCOME_OPERATIONAL, 'balance_type': roles.CREDIT, 'locked': True }, { 'code': '6020', 'name': 'After-Sales Services', 'name_arabic': 'إيرادات خدمات ما بعد البيع', 'role': roles.INCOME_OPERATIONAL, 'balance_type': roles.CREDIT, 'locked': False }, { 'code': '6030', 'name': 'Car Rental Income', 'name_arabic': 'إيرادات تأجير سيارات', 'role': roles.INCOME_PASSIVE, 'balance_type': roles.CREDIT, 'locked': False }, { 'code': '6040', 'name': 'Other Income', 'name_arabic': 'إيرادات أخرى', 'role': roles.INCOME_OTHER, 'balance_type': roles.CREDIT, 'locked': False }, # Expenses (7000-7999) { 'code': '7010', 'name': 'Cost of Goods Sold', 'name_arabic': 'تكلفة البضاعة المباعة', 'role': roles.COGS, 'balance_type': roles.DEBIT, 'locked': True }, { 'code': '7015', 'name': 'Spare Parts Cost Consumed', 'name_arabic': 'تكلفة قطع الغيار المستهلكة', 'role': roles.COGS, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '7020', 'name': 'Salaries & Wages', 'name_arabic': 'رواتب وأجور', 'role': roles.EXPENSE_OPERATIONAL, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '7030', 'name': 'Rent', 'name_arabic': 'إيجار', 'role': roles.EXPENSE_OPERATIONAL, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '7040', 'name': 'Utilities', 'name_arabic': 'كهرباء ومياه', 'role': roles.EXPENSE_OPERATIONAL, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '7050', 'name': 'Advertising & Marketing', 'name_arabic': 'دعاية وإعلان', 'role': roles.EXPENSE_OPERATIONAL, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '7060', 'name': 'Maintenance', 'name_arabic': 'صيانة', 'role': roles.EXPENSE_OPERATIONAL, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '7070', 'name': 'Operating Expenses', 'name_arabic': 'مصاريف تشغيلية', 'role': roles.EXPENSE_OPERATIONAL, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '7080', 'name': 'Depreciation', 'name_arabic': 'استهلاك أصول ثابتة', 'role': roles.EXPENSE_DEPRECIATION, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '7090', 'name': 'Fees & Taxes', 'name_arabic': 'رسوم وضرائب', 'role': roles.EXPENSE_OPERATIONAL, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '7100', 'name': 'Bank Charges', 'name_arabic': 'مصاريف بنكية', 'role': roles.EXPENSE_OPERATIONAL, 'balance_type': roles.DEBIT, 'locked': False }, { 'code': '7110', 'name': 'Other Expenses', 'name_arabic': 'مصاريف أخرى', 'role': roles.EXPENSE_OTHER, 'balance_type': roles.DEBIT, 'locked': False } ] # Create accounts created_accounts = [] for account_data in accounts_data: try: account = entity_model.create_account( coa_model=coa_model, code=account_data['code'], name=_(account_data['name']), role=_(account_data['role']), balance_type=_(account_data['balance_type']), active=True ) created_accounts.append(account) self.stdout.write(self.style.SUCCESS( f"Created account: {account.code} - {account.name}" )) except Exception as e: self.stdout.write(self.style.ERROR( f"Error creating account {account_data['code']}: {str(e)}" )) self.stdout.write(self.style.SUCCESS( f"\nSuccessfully created {len(created_accounts)} accounts in Chart of Accounts" )) return coa_model, created_accounts