From 914b98a66b062221c65c387703bada1c30236c35 Mon Sep 17 00:00:00 2001 From: ismail Date: Tue, 3 Jun 2025 13:55:09 +0300 Subject: [PATCH] update the account list queryset --- inventory/management/commands/deepseek.py | 124 ----------------- inventory/management/commands/gemini.py | 127 ------------------ inventory/management/commands/gpt.py | 123 ----------------- inventory/management/commands/qwen.py | 76 ----------- inventory/views.py | 2 +- .../ledger/coa_accounts/account_list.html | 2 +- 6 files changed, 2 insertions(+), 452 deletions(-) delete mode 100644 inventory/management/commands/deepseek.py delete mode 100644 inventory/management/commands/gemini.py delete mode 100644 inventory/management/commands/gpt.py delete mode 100644 inventory/management/commands/qwen.py diff --git a/inventory/management/commands/deepseek.py b/inventory/management/commands/deepseek.py deleted file mode 100644 index 01712cb6..00000000 --- a/inventory/management/commands/deepseek.py +++ /dev/null @@ -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)}')) \ No newline at end of file diff --git a/inventory/management/commands/gemini.py b/inventory/management/commands/gemini.py deleted file mode 100644 index 3208e6f5..00000000 --- a/inventory/management/commands/gemini.py +++ /dev/null @@ -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}")) diff --git a/inventory/management/commands/gpt.py b/inventory/management/commands/gpt.py deleted file mode 100644 index ed26711a..00000000 --- a/inventory/management/commands/gpt.py +++ /dev/null @@ -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.")) diff --git a/inventory/management/commands/qwen.py b/inventory/management/commands/qwen.py deleted file mode 100644 index 66d77ac0..00000000 --- a/inventory/management/commands/qwen.py +++ /dev/null @@ -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".')) \ No newline at end of file diff --git a/inventory/views.py b/inventory/views.py index 793e9689..4142e952 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -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): diff --git a/templates/ledger/coa_accounts/account_list.html b/templates/ledger/coa_accounts/account_list.html index d4229287..8731c60e 100644 --- a/templates/ledger/coa_accounts/account_list.html +++ b/templates/ledger/coa_accounts/account_list.html @@ -53,7 +53,7 @@
{% 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 %}