433 lines
16 KiB
Python

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