433 lines
16 KiB
Python
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 |