update the account list queryset

This commit is contained in:
ismail 2025-06-03 13:55:09 +03:00
parent 7e16fa6804
commit 914b98a66b
6 changed files with 2 additions and 452 deletions

View File

@ -1,124 +0,0 @@
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)}'))

View File

@ -1,127 +0,0 @@
from django.core.management.base import BaseCommand, CommandError
from django_ledger.models import AccountModel, EntityModel, AccountRole, AccountType # تم التعديل هنا
class Command(BaseCommand):
help = 'ينشئ أو يحدث حسابات Django Ledger المحددة لكيان معين.'
def add_arguments(self, parser):
# إضافة وسيط لتحديد اسم الكيان
parser.add_argument(
'--entity_name',
type=str,
default='qemini', # اسم الكيان الافتراضي
help='اسم الكيان الذي سيتم ربط الحسابات به (افتراضي: qemini).'
)
def handle(self, *args, **options):
entity_name = options['entity_name']
# البحث عن الكيان بناءً على الاسم المقدم
try:
entity = EntityModel.objects.get(name__iexact=entity_name)
self.stdout.write(self.style.SUCCESS(f"تم العثور على الكيان: {entity.name}"))
except EntityModel.DoesNotExist:
raise CommandError(f"لم يتم العثور على كيان باسم '{entity_name}'. يرجى التأكد من وجوده.")
except Exception as e:
raise CommandError(f"حدث خطأ أثناء جلب الكيان '{entity_name}': {e}")
# قائمة الحسابات المراد إنشاؤها
accounts_data = [
# الأصول (مدين)
{'code': '1010', 'name': 'Cash on Hand', 'role': AccountRole.CASH, 'balance_type': AccountType.DEBIT},
{'code': '1020', 'name': 'Bank', 'role': AccountRole.CASH, 'balance_type': AccountType.DEBIT},
{'code': '1030', 'name': 'Accounts Receivable', 'role': AccountRole.RECEIVABLE, 'balance_type': AccountType.DEBIT},
{'code': '1040', 'name': 'Inventory (Cars)', 'role': AccountRole.INVENTORY, 'balance_type': AccountType.DEBIT},
{'code': '1045', 'name': 'Spare Parts Inventory', 'role': AccountRole.INVENTORY, 'balance_type': AccountType.DEBIT},
{'code': '1050', 'name': 'Employee Advances', 'role': AccountRole.OTHER_ASSET, 'balance_type': AccountType.DEBIT},
{'code': '1060', 'name': 'Prepaid Expenses', 'role': AccountRole.OTHER_ASSET, 'balance_type': AccountType.DEBIT},
{'code': '1070', 'name': 'Notes Receivable', 'role': AccountRole.RECEIVABLE, 'balance_type': AccountType.DEBIT},
{'code': '2010', 'name': 'Lands', 'role': AccountRole.FIXED_ASSET, 'balance_type': AccountType.DEBIT},
{'code': '2011', 'name': 'Buildings', 'role': AccountRole.FIXED_ASSET, 'balance_type': AccountType.DEBIT},
{'code': '2012', 'name': 'Company Vehicles', 'role': AccountRole.FIXED_ASSET, 'balance_type': AccountType.DEBIT},
{'code': '2013', 'name': 'Equipment & Tools', 'role': AccountRole.FIXED_ASSET, 'balance_type': AccountType.DEBIT},
{'code': '2014', 'name': 'Furniture & Fixtures', 'role': AccountRole.FIXED_ASSET, 'balance_type': AccountType.DEBIT},
{'code': '2015', 'name': 'Other Fixed Assets', 'role': AccountRole.FIXED_ASSET, 'balance_type': AccountType.DEBIT},
{'code': '2020', 'name': 'Long-term Investments', 'role': AccountRole.OTHER_ASSET, 'balance_type': AccountType.DEBIT},
{'code': '2030', 'name': 'Intangible Assets', 'role': AccountRole.INTANGIBLE_ASSET, 'balance_type': AccountType.DEBIT},
# الخصوم (دائن)
{'code': '3010', 'name': 'Accounts Payable', 'role': AccountRole.PAYABLE, 'balance_type': AccountType.CREDIT},
{'code': '3020', 'name': 'Notes Payable', 'role': AccountRole.PAYABLE, 'balance_type': AccountType.CREDIT},
{'code': '3030', 'name': 'Short-term Loans', 'role': AccountRole.OTHER_LIABILITY, 'balance_type': AccountType.CREDIT},
{'code': '3040', 'name': 'Employee Payables', 'role': AccountRole.OTHER_LIABILITY, 'balance_type': AccountType.CREDIT},
{'code': '3050', 'name': 'Accrued Expenses', 'role': AccountRole.OTHER_LIABILITY, 'balance_type': AccountType.CREDIT},
{'code': '3060', 'name': 'Accrued Taxes', 'role': AccountRole.OTHER_LIABILITY, 'balance_type': AccountType.CREDIT},
{'code': '3070', 'name': 'Provisions', 'role': AccountRole.PROVISION, 'balance_type': AccountType.CREDIT},
{'code': '4010', 'name': 'Long-term Bank Loans', 'role': AccountRole.LONG_TERM_DEBT, 'balance_type': AccountType.CREDIT},
{'code': '4020', 'name': 'Lease Liabilities', 'role': AccountRole.LONG_TERM_DEBT, 'balance_type': AccountType.CREDIT},
{'code': '4030', 'name': 'Other Long-term Liabilities', 'role': AccountRole.LONG_TERM_DEBT, 'balance_type': AccountType.CREDIT},
# حقوق الملكية (دائن)
{'code': '5010', 'name': 'Capital', 'role': AccountRole.EQUITY, 'balance_type': AccountType.CREDIT},
{'code': '5020', 'name': 'Statutory Reserve', 'role': AccountRole.RETAINED_EARNINGS, 'balance_type': AccountType.CREDIT},
{'code': '5030', 'name': 'Retained Earnings', 'role': AccountRole.RETAINED_EARNINGS, 'balance_type': AccountType.CREDIT},
{'code': '5040', 'name': 'Profit & Loss for the Period', 'role': AccountRole.RETAINED_EARNINGS, 'balance_type': AccountType.CREDIT},
# الإيرادات (دائن)
{'code': '6010', 'name': 'Car Sales', 'role': AccountRole.SALES, 'balance_type': AccountType.CREDIT},
{'code': '6020', 'name': 'After-Sales Services', 'role': AccountRole.SALES, 'balance_type': AccountType.CREDIT},
{'code': '6030', 'name': 'Car Rental Income', 'role': AccountRole.SALES, 'balance_type': AccountType.CREDIT},
{'code': '6040', 'name': 'Other Income', 'role': AccountRole.OTHER_INCOME, 'balance_type': AccountType.CREDIT},
# المصروفات (مدين)
{'code': '7010', 'name': 'Cost of Goods Sold', 'role': AccountRole.COST_OF_GOODS_SOLD, 'balance_type': AccountType.DEBIT},
{'code': '7015', 'name': 'Spare Parts Cost Consumed', 'role': AccountRole.COST_OF_GOODS_SOLD, 'balance_type': AccountType.DEBIT},
{'code': '7020', 'name': 'Salaries & Wages', 'role': AccountRole.OPERATING_EXPENSE, 'balance_type': AccountType.DEBIT},
{'code': '7030', 'name': 'Rent', 'role': AccountRole.OPERATING_EXPENSE, 'balance_type': AccountType.DEBIT},
{'code': '7040', 'name': 'Utilities', 'role': AccountRole.OPERATING_EXPENSE, 'balance_type': AccountType.DEBIT},
{'code': '7050', 'name': 'Advertising & Marketing', 'role': AccountRole.OPERATING_EXPENSE, 'balance_type': AccountType.DEBIT},
{'code': '7060', 'name': 'Maintenance', 'role': AccountRole.OPERATING_EXPENSE, 'balance_type': AccountType.DEBIT},
{'code': '7070', 'name': 'Operating Expenses', 'role': AccountRole.OPERATING_EXPENSE, 'balance_type': AccountType.DEBIT},
{'code': '7080', 'name': 'Depreciation', 'role': AccountRole.DEPRECIATION_EXPENSE, 'balance_type': AccountType.DEBIT},
{'code': '7090', 'name': 'Fees & Taxes', 'role': AccountRole.OTHER_EXPENSE, 'balance_type': AccountType.DEBIT},
{'code': '7100', 'name': 'Bank Charges', 'role': AccountRole.OTHER_EXPENSE, 'balance_type': AccountType.DEBIT},
{'code': '7110', 'name': 'Other Expenses', 'role': AccountRole.OTHER_EXPENSE, 'balance_type': AccountType.DEBIT},
]
created_count = 0
updated_count = 0
for acc_data in accounts_data:
try:
# البحث عن الحساب الموجود أو إنشاء حساب جديد
account, created = AccountModel.objects.get_or_create(
entity=entity,
code=acc_data['code'],
defaults={
'name': acc_data['name'],
'role': acc_data['role'], # تم التعديل هنا
'balance_type': acc_data['balance_type'] # تم التعديل هنا
}
)
if created:
created_count += 1
self.stdout.write(self.style.SUCCESS(f"تم إنشاء الحساب: {account.code} - {account.name}"))
else:
# إذا كان الحساب موجودًا، نقوم بتحديث اسمه ودوره ونوع رصيده إذا كان مختلفًا
if (account.name != acc_data['name'] or
account.role != acc_data['role'] or # تم التعديل هنا
account.balance_type != acc_data['balance_type']): # تم التعديل هنا
account.name = acc_data['name']
account.role = acc_data['role']
account.balance_type = acc_data['balance_type']
account.save()
updated_count += 1
self.stdout.write(self.style.WARNING(f"تم تحديث الحساب: {account.code} - {account.name}"))
else:
self.stdout.write(f"الحساب موجود بالفعل ولم يتطلب تحديث: {account.code} - {account.name}")
except Exception as e:
self.stdout.write(self.style.ERROR(f"خطأ في معالجة الحساب {acc_data['code']} - {acc_data['name']}: {e}"))
self.stdout.write(self.style.SUCCESS(f"\nعملية إنشاء/تحديث الحسابات اكتملت."))
self.stdout.write(self.style.SUCCESS(f"عدد الحسابات التي تم إنشاؤها حديثًا: {created_count}"))
self.stdout.write(self.style.SUCCESS(f"عدد الحسابات التي تم تحديثها: {updated_count}"))

View File

@ -1,123 +0,0 @@
from django.core.management.base import BaseCommand
from django_ledger.models.entity import EntityModel
from django_ledger.models.chart_of_accounts import ChartOfAccountModel
from django_ledger.models.accounts import AccountModel
from django_ledger.models.roles import RoleModel
from django_ledger.models.balance_types import BalanceTypeModel
class Command(BaseCommand):
help = 'Create the chart of accounts for the ChatGPT entity'
def handle(self, *args, **options):
# Step 1: Retrieve or create the entity
entity, created = EntityModel.objects.get_or_create(name="chatgpt")
if created:
self.stdout.write(self.style.SUCCESS("Entity 'chatgpt' created."))
else:
self.stdout.write(self.style.WARNING("Entity 'chatgpt' already exists."))
# Step 2: Retrieve or create the default Chart of Accounts
if hasattr(entity, 'default_coa') and entity.default_coa:
coa = entity.default_coa
self.stdout.write(self.style.WARNING("Default Chart of Accounts already exists."))
else:
coa = ChartOfAccountModel.objects.create(name="Default CoA", entity=entity)
entity.default_coa = coa
entity.save()
self.stdout.write(self.style.SUCCESS("Default Chart of Accounts created."))
# Step 3: Define the accounts to be created
accounts = [
(1010, 'Cash on Hand', 'الصندوق', 'asset'),
(1020, 'Bank', 'البنك', 'asset'),
(1030, 'Accounts Receivable', 'العملاء', 'asset'),
(1040, 'Inventory (Cars)', 'مخزون السيارات', 'asset'),
(1045, 'Spare Parts Inventory', 'مخزون قطع الغيار', 'asset'),
(1050, 'Employee Advances', 'سُلف وأمانات الموظفين', 'asset'),
(1060, 'Prepaid Expenses', 'مصروفات مدفوعة مقدماً', 'asset'),
(1070, 'Notes Receivable', 'أوراق القبض', 'asset'),
(2010, 'Lands', 'أراضي', 'asset'),
(2011, 'Buildings', 'مباني', 'asset'),
(2012, 'Company Vehicles', 'سيارات الشركة', 'asset'),
(2013, 'Equipment & Tools', 'أجهزة ومعدات', 'asset'),
(2014, 'Furniture & Fixtures', 'أثاث وديكور', 'asset'),
(2015, 'Other Fixed Assets', 'أصول ثابتة أخرى', 'asset'),
(2020, 'Long-term Investments', 'استثمارات طويلة الأجل', 'asset'),
(2030, 'Intangible Assets', 'أصول غير ملموسة', 'asset'),
(3010, 'Accounts Payable', 'الموردين', 'liability'),
(3020, 'Notes Payable', 'أوراق الدفع', 'liability'),
(3030, 'Short-term Loans', 'قروض قصيرة الأجل', 'liability'),
(3040, 'Employee Payables', 'السلف المستحقة', 'liability'),
(3050, 'Accrued Expenses', 'مصروفات مستحقة', 'liability'),
(3060, 'Accrued Taxes', 'ضرائب مستحقة', 'liability'),
(3070, 'Provisions', 'مخصصات', 'liability'),
(4010, 'Long-term Bank Loans', 'قروض طويلة الأجل', 'liability'),
(4020, 'Lease Liabilities', 'التزامات تمويلية', 'liability'),
(4030, 'Other Long-term Liabilities', 'التزامات أخرى طويلة الأجل', 'liability'),
(5010, 'Capital', 'رأس المال', 'equity'),
(5020, 'Statutory Reserve', 'الاحتياطي القانوني', 'equity'),
(5030, 'Retained Earnings', 'احتياطي الأرباح', 'equity'),
(5040, 'Profit & Loss for the Period', 'أرباح وخسائر الفترة', 'equity'),
(6010, 'Car Sales', 'مبيعات السيارات', 'income'),
(6020, 'After-Sales Services', 'إيرادات خدمات ما بعد البيع', 'income'),
(6030, 'Car Rental Income', 'إيرادات تأجير سيارات', 'income'),
(6040, 'Other Income', 'إيرادات أخرى', 'income'),
(7010, 'Cost of Goods Sold', 'تكلفة البضاعة المباعة', 'expense'),
(7015, 'Spare Parts Cost Consumed', 'تكلفة قطع الغيار المستهلكة', 'expense'),
(7020, 'Salaries & Wages', 'رواتب وأجور', 'expense'),
(7030, 'Rent', 'إيجار', 'expense'),
(7040, 'Utilities', 'كهرباء ومياه', 'expense'),
(7050, 'Advertising & Marketing', 'دعاية وإعلان', 'expense'),
(7060, 'Maintenance', 'صيانة', 'expense'),
(7070, 'Operating Expenses', 'مصاريف تشغيلية', 'expense'),
(7080, 'Depreciation', 'استهلاك أصول ثابتة', 'expense'),
(7090, 'Fees & Taxes', 'رسوم وضرائب', 'expense'),
(7100, 'Bank Charges', 'مصاريف بنكية', 'expense'),
(7110, 'Other Expenses', 'مصاريف أخرى', 'expense'),
]
# Mapping for role and balance_type
role_mapping = {
'asset': 'ASSET',
'liability': 'LIABILITY',
'equity': 'EQUITY',
'income': 'INCOME',
'expense': 'EXPENSE',
}
balance_type_mapping = {
'ASSET': 'DEBIT',
'LIABILITY': 'CREDIT',
'EQUITY': 'CREDIT',
'INCOME': 'CREDIT',
'EXPENSE': 'DEBIT',
}
# Step 4: Delete existing accounts in the CoA
existing_accounts = AccountModel.objects.filter(coa_model=coa)
count_deleted = existing_accounts.count()
existing_accounts.delete()
self.stdout.write(self.style.SUCCESS(f"Deleted {count_deleted} existing accounts."))
# Step 5: Create new accounts
for code, name_en, name_ar, role_slug in accounts:
role = RoleModel.objects.get(slug=role_slug)
balance_type = BalanceTypeModel.objects.get(role=role)
parent = None # Set to None for root accounts
# Determine parent-child relationships
if code in [1040, 1045, 2012, 2013, 2014, 2015, 2020, 2030]:
parent_code = code - 10 # Example logic for determining parent code
parent = AccountModel.objects.get(coa_model=coa, code=parent_code)
account = AccountModel.objects.create(
coa_model=coa,
code=code,
name=name_en,
arabic_name=name_ar,
role=role,
balance_type=balance_type,
parent=parent,
depth=parent.depth + 1 if parent else 0,
)
self.stdout.write(self.style.SUCCESS(f"Account {name_en} ({code}) created."))

View File

@ -1,76 +0,0 @@
from django.core.management.base import BaseCommand
from django_ledger.models import AccountModel
from django_ledger.constants import ACCOUNT_TYPE_ASSET, ACCOUNT_TYPE_LIABILITY, ACCOUNT_TYPE_EQUITY, ACCOUNT_TYPE_INCOME, ACCOUNT_TYPE_EXPENSE
class Command(BaseCommand):
help = 'Creates default accounts for the entity "qwen" in Django Ledger'
def handle(self, *args, **kwargs):
self.stdout.write('Creating accounts for entity "qwen"...')
accounts_data = [
# Assets (Debit Balance)
{'code': '1010', 'name_ar': 'الصندوق', 'name_en': 'Cash on Hand', 'type': ACCOUNT_TYPE_ASSET},
{'code': '1020', 'name_ar': 'البنك', 'name_en': 'Bank', 'type': ACCOUNT_TYPE_ASSET},
{'code': '1030', 'name_ar': 'العملاء', 'name_en': 'Accounts Receivable', 'type': ACCOUNT_TYPE_ASSET},
{'code': '1040', 'name_ar': 'مخزون السيارات', 'name_en': 'Inventory (Cars)', 'type': ACCOUNT_TYPE_ASSET},
{'code': '1045', 'name_ar': 'مخزون قطع الغيار', 'name_en': 'Spare Parts Inventory', 'type': ACCOUNT_TYPE_ASSET},
{'code': '1050', 'name_ar': 'سُلف وأمانات الموظفين', 'name_en': 'Employee Advances', 'type': ACCOUNT_TYPE_ASSET},
{'code': '1060', 'name_ar': 'مصروفات مدفوعة مقدماً', 'name_en': 'Prepaid Expenses', 'type': ACCOUNT_TYPE_ASSET},
{'code': '1070', 'name_ar': 'أوراق القبض', 'name_en': 'Notes Receivable', 'type': ACCOUNT_TYPE_ASSET},
# Liabilities (Credit Balance)
{'code': '3010', 'name_ar': 'الموردين', 'name_en': 'Accounts Payable', 'type': ACCOUNT_TYPE_LIABILITY},
{'code': '3020', 'name_ar': 'أوراق الدفع', 'name_en': 'Notes Payable', 'type': ACCOUNT_TYPE_LIABILITY},
{'code': '3030', 'name_ar': 'قروض قصيرة الأجل', 'name_en': 'Short-term Loans', 'type': ACCOUNT_TYPE_LIABILITY},
{'code': '3040', 'name_ar': 'السلف المستحقة', 'name_en': 'Employee Payables', 'type': ACCOUNT_TYPE_LIABILITY},
{'code': '3050', 'name_ar': 'مصروفات مستحقة', 'name_en': 'Accrued Expenses', 'type': ACCOUNT_TYPE_LIABILITY},
{'code': '3060', 'name_ar': 'ضرائب مستحقة', 'name_en': 'Accrued Taxes', 'type': ACCOUNT_TYPE_LIABILITY},
{'code': '3070', 'name_ar': 'مخصصات', 'name_en': 'Provisions', 'type': ACCOUNT_TYPE_LIABILITY},
# Equity (Credit Balance)
{'code': '5010', 'name_ar': 'رأس المال', 'name_en': 'Capital', 'type': ACCOUNT_TYPE_EQUITY},
{'code': '5020', 'name_ar': 'الاحتياطي القانوني', 'name_en': 'Statutory Reserve', 'type': ACCOUNT_TYPE_EQUITY},
{'code': '5030', 'name_ar': 'احتياطي الأرباح', 'name_en': 'Retained Earnings', 'type': ACCOUNT_TYPE_EQUITY},
{'code': '5040', 'name_ar': 'أرباح وخسائر الفترة', 'name_en': 'Profit & Loss for the Period', 'type': ACCOUNT_TYPE_EQUITY},
# Income (Revenue) (Credit Balance)
{'code': '6010', 'name_ar': 'مبيعات السيارات', 'name_en': 'Car Sales', 'type': ACCOUNT_TYPE_INCOME},
{'code': '6020', 'name_ar': 'إيرادات خدمات ما بعد البيع', 'name_en': 'After-Sales Services', 'type': ACCOUNT_TYPE_INCOME},
{'code': '6030', 'name_ar': 'إيرادات تأجير سيارات', 'name_en': 'Car Rental Income', 'type': ACCOUNT_TYPE_INCOME},
{'code': '6040', 'name_ar': 'إيرادات أخرى', 'name_en': 'Other Income', 'type': ACCOUNT_TYPE_INCOME},
# Expenses (Debit Balance)
{'code': '7010', 'name_ar': 'تكلفة البضاعة المباعة', 'name_en': 'Cost of Goods Sold', 'type': ACCOUNT_TYPE_EXPENSE},
{'code': '7015', 'name_ar': 'تكلفة قطع الغيار المستهلكة', 'name_en': 'Spare Parts Cost Consumed', 'type': ACCOUNT_TYPE_EXPENSE},
{'code': '7020', 'name_ar': 'رواتب وأجور', 'name_en': 'Salaries & Wages', 'type': ACCOUNT_TYPE_EXPENSE},
{'code': '7030', 'name_ar': 'إيجار', 'name_en': 'Rent', 'type': ACCOUNT_TYPE_EXPENSE},
{'code': '7040', 'name_ar': 'كهرباء ومياه', 'name_en': 'Utilities', 'type': ACCOUNT_TYPE_EXPENSE},
{'code': '7050', 'name_ar': 'دعاية وإعلان', 'name_en': 'Advertising & Marketing', 'type': ACCOUNT_TYPE_EXPENSE},
{'code': '7060', 'name_ar': 'صيانة', 'name_en': 'Maintenance', 'type': ACCOUNT_TYPE_EXPENSE},
{'code': '7070', 'name_ar': 'مصاريف تشغيلية', 'name_en': 'Operating Expenses', 'type': ACCOUNT_TYPE_EXPENSE},
{'code': '7080', 'name_ar': 'استهلاك أصول ثابتة', 'name_en': 'Depreciation', 'type': ACCOUNT_TYPE_EXPENSE},
{'code': '7090', 'name_ar': 'رسوم وضرائب', 'name_en': 'Fees & Taxes', 'type': ACCOUNT_TYPE_EXPENSE},
{'code': '7100', 'name_ar': 'مصاريف بنكية', 'name_en': 'Bank Charges', 'type': ACCOUNT_TYPE_EXPENSE},
{'code': '7110', 'name_ar': 'مصاريف أخرى', 'name_en': 'Other Expenses', 'type': ACCOUNT_TYPE_EXPENSE},
]
created_count = 0
for acc in accounts_data:
account, created = objects.get_or_create(
code=acc['code'],
defaults={
'name': acc['name_ar'],
'name_en': acc['name_en'],
'account_type': acc['type'],
'balance_type': BALANCE_TYPE_CREDIT if acc['type'] in [
ACCOUNT_TYPE_LIABILITY,
ACCOUNT_TYPE_EQUITY,
ACCOUNT_TYPE_INCOME
] else BALANCE_TYPE_DEBIT
}
)
if created:
created_count += 1
self.stdout.write(self.style.SUCCESS(f'Successfully created {created_count} accounts for "qwen".'))

View File

@ -3330,7 +3330,7 @@ class AccountListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
model = AccountModel
template_name = "ledger/coa_accounts/account_list.html"
context_object_name = "accounts"
paginate_by = 30
permission_required = ["inventory.view_carfinance"]
def get_queryset(self):

View File

@ -53,7 +53,7 @@
<!-- Assets Tab -->
<div class="tab-pane fade show active" id="assets" role="tabpanel" aria-labelledby="assets-tab">
{% include "partials/search_box.html" %}
{% with accounts=accounts|filter_by_role:"ex_" %}
{% with accounts=accounts|filter_by_role:"asset_" %}
{% include "ledger/coa_accounts/partials/account_table.html" %}
{% endwith %}
</div>