From 5d47a5b4cc650930581947329c6ba20d7c87f9aa Mon Sep 17 00:00:00 2001 From: ismail Date: Thu, 21 Aug 2025 16:51:26 +0300 Subject: [PATCH 1/3] updates --- inventory/tasks.py | 13 +++++++++++-- inventory/utils.py | 17 +++++++++++++---- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/inventory/tasks.py b/inventory/tasks.py index b04b49af..e874dd74 100644 --- a/inventory/tasks.py +++ b/inventory/tasks.py @@ -17,7 +17,7 @@ from django.core.mail import EmailMultiAlternatives from django.template.loader import render_to_string from django.utils.translation import gettext_lazy as _ from django.contrib.auth.models import User, Group, Permission -from inventory.models import DealerSettings, Dealer,Schedule,Notification +from inventory.models import DealerSettings, Dealer,Schedule,Notification,CarReservation,CarStatusChoices logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) @@ -1319,4 +1319,13 @@ def log_email_status(task): if task.success: logger.info(f"Email task for Schedule ID {task.args[0]} completed successfully. Result: {task.result}") else: - logger.error(f"Email task for Schedule ID {task.args[0]} failed. Error: {task.result}") \ No newline at end of file + logger.error(f"Email task for Schedule ID {task.args[0]} failed. Error: {task.result}") + +def remove_reservation_by_id(reservation_id): + try: + reservation = CarReservation.objects.get(pk=reservation_id) + reservation.car.status = CarStatusChoices.AVAILABLE + reservation.car.save() + reservation.delete() + except Exception as e: + logger.error(f"Error removing reservation with ID {reservation_id}: {e}") \ No newline at end of file diff --git a/inventory/utils.py b/inventory/utils.py index 8bf69b86..a0868a04 100644 --- a/inventory/utils.py +++ b/inventory/utils.py @@ -1,5 +1,6 @@ import json import secrets +import logging import datetime import requests from decimal import Decimal @@ -27,7 +28,7 @@ from django.contrib.contenttypes.models import ContentType from django_ledger.models.transactions import TransactionModel from django_ledger.models.journal_entry import JournalEntryModel from django.db import transaction -import logging +from django_q.models import Schedule as DjangoQSchedule from django_ledger.io import roles logger = logging.getLogger(__name__) @@ -223,13 +224,21 @@ def reserve_car(car, request): :return: Redirection to the car's detail page. """ try: - reserved_until = timezone.now() + timezone.timedelta(hours=24) - models.CarReservation.objects.create( + # reserved_until = timezone.now() + timezone.timedelta(hours=24) + reserved_until = timezone.now() + timezone.timedelta(minutes=1) + reservation = models.CarReservation.objects.create( car=car, reserved_by=request.user, reserved_until=reserved_until ) car.status = models.CarStatusChoices.RESERVED car.save() # --- Logging for Success --- + DjangoQSchedule.objects.create( + name=f"remove_reservation_for_car_with_vin_{car.vin}", + func='inventory.tasks.remove_reservation_by_id', + args=reservation.pk, + schedule_type=DjangoQSchedule.ONCE, + next_run=reserved_until, + ) logger.info( f"Car {car.pk} ('{car.id_car_make} {car.id_car_model}') reserved successfully " f"by user {request.user}. " @@ -1288,7 +1297,7 @@ def get_finance_data(estimate,dealer): ) discount = extra_info.data.get("discount", 0) discount = Decimal(discount) - + additional_services = car.get_additional_services() discounted_price=(Decimal(car.marked_price) - discount) vat_amount = discounted_price * vat.rate From 15394da2f6206328dd56de0b5b1c5eb6caca7c86 Mon Sep 17 00:00:00 2001 From: ismail Date: Sun, 24 Aug 2025 10:25:29 +0300 Subject: [PATCH 2/3] add check create coa account task --- inventory/signals.py | 3 +- inventory/tasks.py | 1209 +++++++++++++++++++++--------------------- 2 files changed, 615 insertions(+), 597 deletions(-) diff --git a/inventory/signals.py b/inventory/signals.py index b7a4dbf1..773f8e4c 100644 --- a/inventory/signals.py +++ b/inventory/signals.py @@ -1,7 +1,7 @@ from datetime import datetime, timedelta from decimal import Decimal from django.urls import reverse -from inventory.tasks import create_coa_accounts, create_make_accounts +from inventory.tasks import create_coa_accounts,check_create_coa_accounts, create_make_accounts from django.contrib.auth.models import Group from django.db.models.signals import post_save, post_delete from django.dispatch import receiver @@ -179,6 +179,7 @@ def create_ledger_entity(sender, instance, created, **kwargs): # Create COA accounts, background task async_task(create_coa_accounts, instance) + async_task('inventory.tasks.check_create_coa_accounts', instance, schedule_type='O', schedule_time=timedelta(seconds=20)) # create_settings(instance.pk) # create_accounts_for_make(instance.pk) diff --git a/inventory/tasks.py b/inventory/tasks.py index e874dd74..9ad55056 100644 --- a/inventory/tasks.py +++ b/inventory/tasks.py @@ -47,13 +47,8 @@ def create_settings(pk): .filter(role=roles.LIABILITY_CL_ACC_PAYABLE) .first(), ) - - -def create_coa_accounts(instance): - entity = instance.entity - coa = entity.get_default_coa() - - accounts_data = [ +def get_accounts_data(): + return [ # Current Assets (must start with 1) { "code": "1010", @@ -447,649 +442,671 @@ def create_coa_accounts(instance): }, ] - for account_data in accounts_data: - try: - account = entity.create_account( - coa_model=coa, - code=account_data["code"], - name=_(account_data["name"]), - role=_(account_data["role"]), - balance_type=_(account_data["balance_type"]), - active=True, - ) - account.role_default = account_data["default"] - account.save() - logger.info(f"Created default account: {account}") - except Exception as e: - logger.error(f"Error creating default account: {account_data['code']}, {e}") +def create_account(entity, coa, account_data): + try: + account = entity.create_account( + coa_model=coa, + code=account_data["code"], + name=account_data["name"], + role=account_data["role"], + balance_type=_(account_data["balance_type"]), + active=True, + ) + account.role_default = account_data["default"] + account.save() + logger.info(f"Created default account: {account}") + except Exception as e: + logger.error(f"Error creating default account: {account_data['code']}, {e}") +def create_coa_accounts(instance): + entity = instance.entity + coa = entity.get_default_coa() + + for account_data in get_accounts_data(): + create_account(entity, coa, account_data) + # Check if all accounts are created + # check_create_coa_accounts(instance) +def check_create_coa_accounts(instance): + logger.info("Checking if all accounts are created") + entity = instance.entity + coa = entity.get_default_coa() + + for account_data in get_accounts_data(): + if entity.get_all_accounts().filter(code=account_data["code"]).exists(): + logger.info(f"Default account already exists: {account_data['code']}") + continue + logger.info(f"Default account does not exist: {account_data['code']}") + create_account(entity, coa, account_data) -def create_coa_accounts1(pk): - with transaction.atomic(): - instance = Dealer.objects.select_for_update().get(pk=pk) - entity = instance.entity - coa = entity.get_default_coa() - # Cash Account - asset_ca_cash = entity.create_account( - coa_model=coa, - code="1101", - role=roles.ASSET_CA_CASH, - name=_("Cash"), - balance_type="debit", - active=True, - ) - asset_ca_cash.role_default = True - asset_ca_cash.save() - # Accounts Receivable Account - asset_ca_receivables = entity.create_account( - coa_model=coa, - code="1102", - role=roles.ASSET_CA_RECEIVABLES, - name=_("Accounts Receivable"), - balance_type="debit", - active=True, - ) - asset_ca_receivables.role_default = True - asset_ca_receivables.save() - # Inventory Account - asset_ca_inventory = entity.create_account( - coa_model=coa, - code="1103", - role=roles.ASSET_CA_INVENTORY, - name=_("Inventory"), - balance_type="debit", - active=True, - ) - asset_ca_inventory.role_default = True - asset_ca_inventory.save() +# def create_coa_accounts1(pk): +# with transaction.atomic(): +# instance = Dealer.objects.select_for_update().get(pk=pk) +# entity = instance.entity +# coa = entity.get_default_coa() - # Prepaid Expenses Account - asset_ca_prepaid = entity.create_account( - coa_model=coa, - code="1104", - role=roles.ASSET_CA_PREPAID, - name=_("Prepaid Expenses"), - balance_type="debit", - active=True, - ) - asset_ca_prepaid.role_default = True - asset_ca_prepaid.save() +# # Cash Account +# asset_ca_cash = entity.create_account( +# coa_model=coa, +# code="1101", +# role=roles.ASSET_CA_CASH, +# name=_("Cash"), +# balance_type="debit", +# active=True, +# ) +# asset_ca_cash.role_default = True +# asset_ca_cash.save() - # Employee Expenses Account - asset_ca_prepaid_employee = entity.create_account( - coa_model=coa, - code="1105", - role=roles.ASSET_CA_PREPAID, - name=_("Employee Advance"), - balance_type="debit", - active=True, - ) +# # Accounts Receivable Account +# asset_ca_receivables = entity.create_account( +# coa_model=coa, +# code="1102", +# role=roles.ASSET_CA_RECEIVABLES, +# name=_("Accounts Receivable"), +# balance_type="debit", +# active=True, +# ) +# asset_ca_receivables.role_default = True +# asset_ca_receivables.save() - # VAT Payable Account - liability_ltl_vat_receivable = entity.create_account( - coa_model=coa, - code="1106", - role=roles.ASSET_CA_RECEIVABLES, - name=_("VAT Receivable"), - balance_type="debit", - active=True, - ) +# # Inventory Account +# asset_ca_inventory = entity.create_account( +# coa_model=coa, +# code="1103", +# role=roles.ASSET_CA_INVENTORY, +# name=_("Inventory"), +# balance_type="debit", +# active=True, +# ) +# asset_ca_inventory.role_default = True +# asset_ca_inventory.save() - # Buildings Accumulated Depreciation Account - asset_ppe_buildings_accum_depreciation = entity.create_account( - coa_model=coa, - code="1201", - role=roles.ASSET_PPE_BUILDINGS_ACCUM_DEPRECIATION, - name=_("Buildings - Accum. Depreciation"), - balance_type="credit", - active=True, - ) - asset_ppe_buildings_accum_depreciation.role_default = True - asset_ppe_buildings_accum_depreciation.save() +# # Prepaid Expenses Account +# asset_ca_prepaid = entity.create_account( +# coa_model=coa, +# code="1104", +# role=roles.ASSET_CA_PREPAID, +# name=_("Prepaid Expenses"), +# balance_type="debit", +# active=True, +# ) +# asset_ca_prepaid.role_default = True +# asset_ca_prepaid.save() - # intangible Account - asset_lti_land_intangable = entity.create_account( - coa_model=coa, - code="1202", - role=roles.ASSET_INTANGIBLE_ASSETS, - name=_("Intangible Assets"), - balance_type="debit", - active=True, - ) - asset_lti_land_intangable.role_default = True - asset_lti_land_intangable.save() +# # Employee Expenses Account +# asset_ca_prepaid_employee = entity.create_account( +# coa_model=coa, +# code="1105", +# role=roles.ASSET_CA_PREPAID, +# name=_("Employee Advance"), +# balance_type="debit", +# active=True, +# ) - # investment property Account - asset_lti_land_investment = entity.create_account( - coa_model=coa, - code="1204", - role=roles.ASSET_LTI_SECURITIES, - name=_("Investments"), - balance_type="debit", - active=True, - ) - asset_lti_land_investment.role_default = True - asset_lti_land_investment.save() +# # VAT Payable Account +# liability_ltl_vat_receivable = entity.create_account( +# coa_model=coa, +# code="1106", +# role=roles.ASSET_CA_RECEIVABLES, +# name=_("VAT Receivable"), +# balance_type="debit", +# active=True, +# ) - # # Notes Receivable Account - # asset_lti_notes_receivable = entity.create_account( - # coa_model=coa, - # code="1201", - # role=roles.ASSET_LTI_NOTES_RECEIVABLE, - # name=_("Notes Receivable"), - # balance_type="debit", - # active=True, - # ) - # asset_lti_notes_receivable.role_default = True - # asset_lti_notes_receivable.save() +# # Buildings Accumulated Depreciation Account +# asset_ppe_buildings_accum_depreciation = entity.create_account( +# coa_model=coa, +# code="1201", +# role=roles.ASSET_PPE_BUILDINGS_ACCUM_DEPRECIATION, +# name=_("Buildings - Accum. Depreciation"), +# balance_type="credit", +# active=True, +# ) +# asset_ppe_buildings_accum_depreciation.role_default = True +# asset_ppe_buildings_accum_depreciation.save() - # # Land Account - # asset_lti_land = entity.create_account( - # coa_model=coa, - # code="1202", - # role=roles.ASSET_LTI_LAND, - # name=_("Land"), - # balance_type="debit", - # active=True, - # ) - # asset_lti_land.role_default = True - # asset_lti_land.save() +# # intangible Account +# asset_lti_land_intangable = entity.create_account( +# coa_model=coa, +# code="1202", +# role=roles.ASSET_INTANGIBLE_ASSETS, +# name=_("Intangible Assets"), +# balance_type="debit", +# active=True, +# ) +# asset_lti_land_intangable.role_default = True +# asset_lti_land_intangable.save() - # Buildings Account - asset_ppe_buildings = entity.create_account( - coa_model=coa, - code="1301", - role=roles.ASSET_PPE_BUILDINGS, - name=_("Buildings"), - balance_type="debit", - active=True, - ) - asset_ppe_buildings.role_default = True - asset_ppe_buildings.save() +# # investment property Account +# asset_lti_land_investment = entity.create_account( +# coa_model=coa, +# code="1204", +# role=roles.ASSET_LTI_SECURITIES, +# name=_("Investments"), +# balance_type="debit", +# active=True, +# ) +# asset_lti_land_investment.role_default = True +# asset_lti_land_investment.save() - # Accounts Payable Account - liability_cl_acc_payable = entity.create_account( - coa_model=coa, - code="2101", - role=roles.LIABILITY_CL_ACC_PAYABLE, - name=_("Accounts Payable"), - balance_type="credit", - active=True, - ) - liability_cl_acc_payable.role_default = True - liability_cl_acc_payable.save() +# # # Notes Receivable Account +# # asset_lti_notes_receivable = entity.create_account( +# # coa_model=coa, +# # code="1201", +# # role=roles.ASSET_LTI_NOTES_RECEIVABLE, +# # name=_("Notes Receivable"), +# # balance_type="debit", +# # active=True, +# # ) +# # asset_lti_notes_receivable.role_default = True +# # asset_lti_notes_receivable.save() - # Deferred Revenue Account - liability_cl_def_rev = entity.create_account( - coa_model=coa, - code="2103", - role=roles.LIABILITY_CL_DEFERRED_REVENUE, - name=_("Deferred Revenue"), - balance_type="credit", - active=True, - ) - liability_cl_def_rev.role_default = True - liability_cl_def_rev.save() +# # # Land Account +# # asset_lti_land = entity.create_account( +# # coa_model=coa, +# # code="1202", +# # role=roles.ASSET_LTI_LAND, +# # name=_("Land"), +# # balance_type="debit", +# # active=True, +# # ) +# # asset_lti_land.role_default = True +# # asset_lti_land.save() - # Wages Payable Account - liability_cl_wages_payable = entity.create_account( - coa_model=coa, - code="2102", - role=roles.LIABILITY_CL_WAGES_PAYABLE, - name=_("Wages Payable"), - balance_type="credit", - active=True, - ) - liability_cl_wages_payable.role_default = True - liability_cl_wages_payable.save() +# # Buildings Account +# asset_ppe_buildings = entity.create_account( +# coa_model=coa, +# code="1301", +# role=roles.ASSET_PPE_BUILDINGS, +# name=_("Buildings"), +# balance_type="debit", +# active=True, +# ) +# asset_ppe_buildings.role_default = True +# asset_ppe_buildings.save() - # Long-Term Notes Payable Account - liability_ltl_notes_payable = entity.create_account( - coa_model=coa, - code="2201", - role=roles.LIABILITY_LTL_NOTES_PAYABLE, - name=_("Long-Term Notes Payable"), - balance_type="credit", - active=True, - ) - liability_ltl_notes_payable.role_default = True - liability_ltl_notes_payable.save() +# # Accounts Payable Account +# liability_cl_acc_payable = entity.create_account( +# coa_model=coa, +# code="2101", +# role=roles.LIABILITY_CL_ACC_PAYABLE, +# name=_("Accounts Payable"), +# balance_type="credit", +# active=True, +# ) +# liability_cl_acc_payable.role_default = True +# liability_cl_acc_payable.save() - # VAT Payable Account - liability_ltl_vat_payable = entity.create_account( - coa_model=coa, - code="2106", - role=roles.LIABILITY_CL_OTHER, - name=_("VAT Payable"), - balance_type="credit", - active=True, - ) +# # Deferred Revenue Account +# liability_cl_def_rev = entity.create_account( +# coa_model=coa, +# code="2103", +# role=roles.LIABILITY_CL_DEFERRED_REVENUE, +# name=_("Deferred Revenue"), +# balance_type="credit", +# active=True, +# ) +# liability_cl_def_rev.role_default = True +# liability_cl_def_rev.save() - # taxes Payable Account - liability_ltl_taxes_payable = entity.create_account( - coa_model=coa, - code="2107", - role=roles.LIABILITY_CL_OTHER, - name=_("Taxes Payable"), - balance_type="credit", - active=True, - ) +# # Wages Payable Account +# liability_cl_wages_payable = entity.create_account( +# coa_model=coa, +# code="2102", +# role=roles.LIABILITY_CL_WAGES_PAYABLE, +# name=_("Wages Payable"), +# balance_type="credit", +# active=True, +# ) +# liability_cl_wages_payable.role_default = True +# liability_cl_wages_payable.save() - # social insurance Payable Account - liability_ltl_social_insurance_payable = entity.create_account( - coa_model=coa, - code="2108", - role=roles.LIABILITY_LTL_NOTES_PAYABLE, - name=_("Social Insurance Payable"), - balance_type="credit", - active=True, - ) +# # Long-Term Notes Payable Account +# liability_ltl_notes_payable = entity.create_account( +# coa_model=coa, +# code="2201", +# role=roles.LIABILITY_LTL_NOTES_PAYABLE, +# name=_("Long-Term Notes Payable"), +# balance_type="credit", +# active=True, +# ) +# liability_ltl_notes_payable.role_default = True +# liability_ltl_notes_payable.save() - # End of Service Benefits - entity.create_account( - coa_model=coa, - code="2202", - role=roles.LIABILITY_LTL_NOTES_PAYABLE, - name=_("End of Service Benefits"), - balance_type="credit", - active=True, - ) +# # VAT Payable Account +# liability_ltl_vat_payable = entity.create_account( +# coa_model=coa, +# code="2106", +# role=roles.LIABILITY_CL_OTHER, +# name=_("VAT Payable"), +# balance_type="credit", +# active=True, +# ) - # Mortgage Payable Account - liability_ltl_mortgage_payable = entity.create_account( - coa_model=coa, - code="2203", - role=roles.LIABILITY_LTL_MORTGAGE_PAYABLE, - name=_("Mortgage Payable"), - balance_type="credit", - active=True, - ) - liability_ltl_mortgage_payable.role_default = True - liability_ltl_mortgage_payable.save() +# # taxes Payable Account +# liability_ltl_taxes_payable = entity.create_account( +# coa_model=coa, +# code="2107", +# role=roles.LIABILITY_CL_OTHER, +# name=_("Taxes Payable"), +# balance_type="credit", +# active=True, +# ) - # Capital - equity_capital = entity.create_account( - coa_model=coa, - code="3101", - role=roles.EQUITY_CAPITAL, - name=_("Registered Capital"), - balance_type="credit", - active=True, - ) - equity_capital.role_default = True - equity_capital.save() - entity.create_account( - coa_model=coa, - code="3102", - role=roles.EQUITY_CAPITAL, - name=_("Additional Paid-In Capital"), - balance_type="credit", - active=True, - ) +# # social insurance Payable Account +# liability_ltl_social_insurance_payable = entity.create_account( +# coa_model=coa, +# code="2108", +# role=roles.LIABILITY_LTL_NOTES_PAYABLE, +# name=_("Social Insurance Payable"), +# balance_type="credit", +# active=True, +# ) - # Other Equity - other_equity = entity.create_account( - coa_model=coa, - code="3201", - role=roles.EQUITY_COMMON_STOCK, - name=_("Opening Balances"), - balance_type="credit", - active=True, - ) - other_equity.role_default = True - other_equity.save() +# # End of Service Benefits +# entity.create_account( +# coa_model=coa, +# code="2202", +# role=roles.LIABILITY_LTL_NOTES_PAYABLE, +# name=_("End of Service Benefits"), +# balance_type="credit", +# active=True, +# ) - # Reserves - reserve = entity.create_account( - coa_model=coa, - code="3301", - role=roles.EQUITY_ADJUSTMENT, - name=_("Statutory Reserve"), - balance_type="credit", - active=True, - ) - reserve.role_default = True - reserve.save() - entity.create_account( - coa_model=coa, - code="3302", - role=roles.EQUITY_ADJUSTMENT, - name=_("Foreign Currency Translation Reserve"), - balance_type="credit", - active=True, - ) +# # Mortgage Payable Account +# liability_ltl_mortgage_payable = entity.create_account( +# coa_model=coa, +# code="2203", +# role=roles.LIABILITY_LTL_MORTGAGE_PAYABLE, +# name=_("Mortgage Payable"), +# balance_type="credit", +# active=True, +# ) +# liability_ltl_mortgage_payable.role_default = True +# liability_ltl_mortgage_payable.save() - # Retained Earnings Account - equity_retained_earnings = entity.create_account( - coa_model=coa, - code="3401", - role=roles.EQUITY_PREFERRED_STOCK, - name=_("Operating Profits and Losses"), - balance_type="credit", - active=True, - ) - equity_retained_earnings.role_default = True - equity_retained_earnings.save() +# # Capital +# equity_capital = entity.create_account( +# coa_model=coa, +# code="3101", +# role=roles.EQUITY_CAPITAL, +# name=_("Registered Capital"), +# balance_type="credit", +# active=True, +# ) +# equity_capital.role_default = True +# equity_capital.save() +# entity.create_account( +# coa_model=coa, +# code="3102", +# role=roles.EQUITY_CAPITAL, +# name=_("Additional Paid-In Capital"), +# balance_type="credit", +# active=True, +# ) - equity_retained_earnings_losses = entity.create_account( - coa_model=coa, - code="3402", - role=roles.EQUITY_PREFERRED_STOCK, - name=_("Retained Earnings (or Losses)"), - balance_type="credit", - active=True, - ) +# # Other Equity +# other_equity = entity.create_account( +# coa_model=coa, +# code="3201", +# role=roles.EQUITY_COMMON_STOCK, +# name=_("Opening Balances"), +# balance_type="credit", +# active=True, +# ) +# other_equity.role_default = True +# other_equity.save() - # Sales Revenue Account - income_operational = entity.create_account( - coa_model=coa, - code="4101", - role=roles.INCOME_OPERATIONAL, - name=_("Sales Revenue"), - balance_type="credit", - active=True, - ) - income_operational.role_default = True - income_operational.save() +# # Reserves +# reserve = entity.create_account( +# coa_model=coa, +# code="3301", +# role=roles.EQUITY_ADJUSTMENT, +# name=_("Statutory Reserve"), +# balance_type="credit", +# active=True, +# ) +# reserve.role_default = True +# reserve.save() +# entity.create_account( +# coa_model=coa, +# code="3302", +# role=roles.EQUITY_ADJUSTMENT, +# name=_("Foreign Currency Translation Reserve"), +# balance_type="credit", +# active=True, +# ) - # Interest Income Account - income_interest = entity.create_account( - coa_model=coa, - code="4102", - role=roles.INCOME_INTEREST, - name=_("Interest Income"), - balance_type="credit", - active=True, - ) - income_interest.role_default = True - income_interest.save() +# # Retained Earnings Account +# equity_retained_earnings = entity.create_account( +# coa_model=coa, +# code="3401", +# role=roles.EQUITY_PREFERRED_STOCK, +# name=_("Operating Profits and Losses"), +# balance_type="credit", +# active=True, +# ) +# equity_retained_earnings.role_default = True +# equity_retained_earnings.save() - # Uneared Income Account - income_unearned = entity.create_account( - coa_model=coa, - code="4103", - role=roles.INCOME_OTHER, - name=_("Unearned Income"), - balance_type="credit", - active=True, - ) +# equity_retained_earnings_losses = entity.create_account( +# coa_model=coa, +# code="3402", +# role=roles.EQUITY_PREFERRED_STOCK, +# name=_("Retained Earnings (or Losses)"), +# balance_type="credit", +# active=True, +# ) - # Operating Revenues - entity.create_account( - coa_model=coa, - code="4104", - role=roles.INCOME_OPERATIONAL, - name=_("Sales/Service Revenue"), - balance_type="credit", - active=True, - ) +# # Sales Revenue Account +# income_operational = entity.create_account( +# coa_model=coa, +# code="4101", +# role=roles.INCOME_OPERATIONAL, +# name=_("Sales Revenue"), +# balance_type="credit", +# active=True, +# ) +# income_operational.role_default = True +# income_operational.save() - # Non-Operating Revenues - entity.create_account( - coa_model=coa, - code="4201", - role=roles.INCOME_OTHER, - name=_("Non-Operating Revenues"), - balance_type="credit", - active=True, - ) +# # Interest Income Account +# income_interest = entity.create_account( +# coa_model=coa, +# code="4102", +# role=roles.INCOME_INTEREST, +# name=_("Interest Income"), +# balance_type="credit", +# active=True, +# ) +# income_interest.role_default = True +# income_interest.save() - # Cost of Goods Sold (COGS) Account - expense_cogs = entity.create_account( - coa_model=coa, - code="5101", - role=roles.COGS, - name=_("Cost of Goods Sold"), - balance_type="debit", - active=True, - ) - expense_cogs.role_default = True - expense_cogs.save() +# # Uneared Income Account +# income_unearned = entity.create_account( +# coa_model=coa, +# code="4103", +# role=roles.INCOME_OTHER, +# name=_("Unearned Income"), +# balance_type="credit", +# active=True, +# ) - # accrued Expenses Account - expense_cogs = entity.create_account( - coa_model=coa, - code="6117", - role=roles.EXPENSE_OPERATIONAL, - name=_("Accrued Expenses"), - balance_type="debit", - active=True, - ) +# # Operating Revenues +# entity.create_account( +# coa_model=coa, +# code="4104", +# role=roles.INCOME_OPERATIONAL, +# name=_("Sales/Service Revenue"), +# balance_type="credit", +# active=True, +# ) - # accrued salaries Account - expense_cogs = entity.create_account( - coa_model=coa, - code="6118", - role=roles.EXPENSE_OPERATIONAL, - name=_("Accrued Salaries"), - balance_type="debit", - active=True, - ) +# # Non-Operating Revenues +# entity.create_account( +# coa_model=coa, +# code="4201", +# role=roles.INCOME_OTHER, +# name=_("Non-Operating Revenues"), +# balance_type="credit", +# active=True, +# ) - # Rent Expense Account - expense_rent = entity.create_account( - coa_model=coa, - code="6102", - role=roles.EXPENSE_OPERATIONAL, - name=_("Rent Expense"), - balance_type="debit", - active=True, - ) - # expense_rent.role_default = True - # expense_rent.save() +# # Cost of Goods Sold (COGS) Account +# expense_cogs = entity.create_account( +# coa_model=coa, +# code="5101", +# role=roles.COGS, +# name=_("Cost of Goods Sold"), +# balance_type="debit", +# active=True, +# ) +# expense_cogs.role_default = True +# expense_cogs.save() - # Salaries and Administrative Fees - expense_salaries = entity.create_account( - coa_model=coa, - code="6103", - role=roles.EXPENSE_OPERATIONAL, - name=_("Salaries and Administrative Fees"), - balance_type="debit", - active=True, - ) +# # accrued Expenses Account +# expense_cogs = entity.create_account( +# coa_model=coa, +# code="6117", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Accrued Expenses"), +# balance_type="debit", +# active=True, +# ) - # Medical Insurance - expense_medical_insurance = entity.create_account( - coa_model=coa, - code="6104", - role=roles.EXPENSE_OPERATIONAL, - name=_("Medical Insurance"), - balance_type="debit", - active=True, - ) +# # accrued salaries Account +# expense_cogs = entity.create_account( +# coa_model=coa, +# code="6118", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Accrued Salaries"), +# balance_type="debit", +# active=True, +# ) - # Marketing and Advertising Expenses - expense_marketing = entity.create_account( - coa_model=coa, - code="6105", - role=roles.EXPENSE_OPERATIONAL, - name=_("Marketing and Advertising Expenses"), - balance_type="debit", - active=True, - ) +# # Rent Expense Account +# expense_rent = entity.create_account( +# coa_model=coa, +# code="6102", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Rent Expense"), +# balance_type="debit", +# active=True, +# ) +# # expense_rent.role_default = True +# # expense_rent.save() - # Commissions and Incentives - expense_commissions = entity.create_account( - coa_model=coa, - code="6106", - role=roles.EXPENSE_OPERATIONAL, - name=_("Commissions and Incentives"), - balance_type="debit", - active=True, - ) +# # Salaries and Administrative Fees +# expense_salaries = entity.create_account( +# coa_model=coa, +# code="6103", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Salaries and Administrative Fees"), +# balance_type="debit", +# active=True, +# ) - # Travel Tickets - expense_travel = entity.create_account( - coa_model=coa, - code="6107", - role=roles.EXPENSE_OPERATIONAL, - name=_("Travel Tickets"), - balance_type="debit", - active=True, - ) +# # Medical Insurance +# expense_medical_insurance = entity.create_account( +# coa_model=coa, +# code="6104", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Medical Insurance"), +# balance_type="debit", +# active=True, +# ) - # Social Insurance - expense_other = entity.create_account( - coa_model=coa, - code="6108", - role=roles.EXPENSE_OPERATIONAL, - name=_("Social Insurance"), - balance_type="debit", - active=True, - ) +# # Marketing and Advertising Expenses +# expense_marketing = entity.create_account( +# coa_model=coa, +# code="6105", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Marketing and Advertising Expenses"), +# balance_type="debit", +# active=True, +# ) - # Government Fees - expense_other = entity.create_account( - coa_model=coa, - code="6109", - role=roles.EXPENSE_OPERATIONAL, - name=_("Government Fees"), - balance_type="debit", - active=True, - ) +# # Commissions and Incentives +# expense_commissions = entity.create_account( +# coa_model=coa, +# code="6106", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Commissions and Incentives"), +# balance_type="debit", +# active=True, +# ) - # Fees and Subscriptions - expense_other = entity.create_account( - coa_model=coa, - code="6110", - role=roles.EXPENSE_OPERATIONAL, - name=_("Fees and Subscriptions"), - balance_type="debit", - active=True, - ) +# # Travel Tickets +# expense_travel = entity.create_account( +# coa_model=coa, +# code="6107", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Travel Tickets"), +# balance_type="debit", +# active=True, +# ) - # Office Services Expenses - expense_other = entity.create_account( - coa_model=coa, - code="6111", - role=roles.EXPENSE_OPERATIONAL, - name=_("Office Services Expenses"), - balance_type="debit", - active=True, - ) +# # Social Insurance +# expense_other = entity.create_account( +# coa_model=coa, +# code="6108", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Social Insurance"), +# balance_type="debit", +# active=True, +# ) - # Office Supplies and Printing - expense_other = entity.create_account( - coa_model=coa, - code="6112", - role=roles.EXPENSE_OPERATIONAL, - name=_("Office Supplies and Printing"), - balance_type="debit", - active=True, - ) +# # Government Fees +# expense_other = entity.create_account( +# coa_model=coa, +# code="6109", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Government Fees"), +# balance_type="debit", +# active=True, +# ) - # Hospitality Expenses - expense_other = entity.create_account( - coa_model=coa, - code="6113", - role=roles.EXPENSE_OPERATIONAL, - name=_("Hospitality Expenses"), - balance_type="debit", - active=True, - ) +# # Fees and Subscriptions +# expense_other = entity.create_account( +# coa_model=coa, +# code="6110", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Fees and Subscriptions"), +# balance_type="debit", +# active=True, +# ) - # Bank Commissions - expense_other = entity.create_account( - coa_model=coa, - code="6114", - role=roles.EXPENSE_OPERATIONAL, - name=_("Bank Commissions"), - balance_type="debit", - active=True, - ) +# # Office Services Expenses +# expense_other = entity.create_account( +# coa_model=coa, +# code="6111", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Office Services Expenses"), +# balance_type="debit", +# active=True, +# ) - # Other Expenses - expense_other = entity.create_account( - coa_model=coa, - code="6115", - role=roles.EXPENSE_OPERATIONAL, - name=_("Other Expenses"), - balance_type="debit", - active=True, - ) +# # Office Supplies and Printing +# expense_other = entity.create_account( +# coa_model=coa, +# code="6112", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Office Supplies and Printing"), +# balance_type="debit", +# active=True, +# ) - # Transportation Expenses - expense_other = entity.create_account( - coa_model=coa, - code="6116", - role=roles.EXPENSE_OPERATIONAL, - name=_("Transportation Expenses"), - balance_type="debit", - active=True, - ) +# # Hospitality Expenses +# expense_other = entity.create_account( +# coa_model=coa, +# code="6113", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Hospitality Expenses"), +# balance_type="debit", +# active=True, +# ) - # 5.1 Direct Costs - entity.create_account( - coa_model=coa, - code="6201", - role=roles.EXPENSE_OPERATIONAL, - name=_("Cost of Goods Sold"), - balance_type="debit", - active=True, - ) - entity.create_account( - coa_model=coa, - code="6202", - role=roles.EXPENSE_OPERATIONAL, - name=_("Salaries and Wages"), - balance_type="debit", - active=True, - ) - entity.create_account( - coa_model=coa, - code="6203", - role=roles.EXPENSE_OPERATIONAL, - name=_("Sales Commissions"), - balance_type="debit", - active=True, - ) - entity.create_account( - coa_model=coa, - code="6204", - role=roles.EXPENSE_OPERATIONAL, - name=_("Shipping and Customs Clearance"), - balance_type="debit", - active=True, - ) +# # Bank Commissions +# expense_other = entity.create_account( +# coa_model=coa, +# code="6114", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Bank Commissions"), +# balance_type="debit", +# active=True, +# ) - # 5.3 Non-Operating Expenses - entity.create_account( - coa_model=coa, - code="6301", - role=roles.EXPENSE_OTHER, - name=_("Zakat"), - balance_type="debit", - active=True, - ) - entity.create_account( - coa_model=coa, - code="6302", - role=roles.EXPENSE_OTHER, - name=_("Taxes"), - balance_type="debit", - active=True, - ) - entity.create_account( - coa_model=coa, - code="6303", - role=roles.EXPENSE_OTHER, - name=_("Foreign Currency Translation"), - balance_type="debit", - active=True, - ) - entity.create_account( - coa_model=coa, - code="6304", - role=roles.EXPENSE_OTHER, - name=_("Interest Expenses"), - balance_type="debit", - active=True, - ) +# # Other Expenses +# expense_other = entity.create_account( +# coa_model=coa, +# code="6115", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Other Expenses"), +# balance_type="debit", +# active=True, +# ) - # create_settings(instance.pk) +# # Transportation Expenses +# expense_other = entity.create_account( +# coa_model=coa, +# code="6116", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Transportation Expenses"), +# balance_type="debit", +# active=True, +# ) + +# # 5.1 Direct Costs +# entity.create_account( +# coa_model=coa, +# code="6201", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Cost of Goods Sold"), +# balance_type="debit", +# active=True, +# ) +# entity.create_account( +# coa_model=coa, +# code="6202", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Salaries and Wages"), +# balance_type="debit", +# active=True, +# ) +# entity.create_account( +# coa_model=coa, +# code="6203", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Sales Commissions"), +# balance_type="debit", +# active=True, +# ) +# entity.create_account( +# coa_model=coa, +# code="6204", +# role=roles.EXPENSE_OPERATIONAL, +# name=_("Shipping and Customs Clearance"), +# balance_type="debit", +# active=True, +# ) + +# # 5.3 Non-Operating Expenses +# entity.create_account( +# coa_model=coa, +# code="6301", +# role=roles.EXPENSE_OTHER, +# name=_("Zakat"), +# balance_type="debit", +# active=True, +# ) +# entity.create_account( +# coa_model=coa, +# code="6302", +# role=roles.EXPENSE_OTHER, +# name=_("Taxes"), +# balance_type="debit", +# active=True, +# ) +# entity.create_account( +# coa_model=coa, +# code="6303", +# role=roles.EXPENSE_OTHER, +# name=_("Foreign Currency Translation"), +# balance_type="debit", +# active=True, +# ) +# entity.create_account( +# coa_model=coa, +# code="6304", +# role=roles.EXPENSE_OTHER, +# name=_("Interest Expenses"), +# balance_type="debit", +# active=True, +# ) + +# # create_settings(instance.pk) # @background From 6e344926b916c65418fc932b19323c3750c1d23c Mon Sep 17 00:00:00 2001 From: ismail Date: Sun, 24 Aug 2025 11:53:34 +0300 Subject: [PATCH 3/3] add models phone number validator --- inventory/forms.py | 1 + inventory/hooks.py | 22 ++ inventory/management/commands/run1.py | 9 + inventory/models.py | 13 +- inventory/signals.py | 6 +- inventory/tasks.py | 433 +------------------------- inventory/utils.py | 413 ++++++++++++++++++++++++ 7 files changed, 463 insertions(+), 434 deletions(-) create mode 100644 inventory/hooks.py create mode 100644 inventory/management/commands/run1.py diff --git a/inventory/forms.py b/inventory/forms.py index 4af30c0b..89dfe772 100644 --- a/inventory/forms.py +++ b/inventory/forms.py @@ -146,6 +146,7 @@ class StaffForm(forms.ModelForm): ) class Meta: + model = Staff fields = ["first_name","last_name", "arabic_name", "phone_number", "address", "logo", "group"] diff --git a/inventory/hooks.py b/inventory/hooks.py new file mode 100644 index 00000000..d210796c --- /dev/null +++ b/inventory/hooks.py @@ -0,0 +1,22 @@ +import logging +from inventory.models import Dealer +from .utils import get_accounts_data,create_account + +logger = logging.getLogger(__name__) + +def check_create_coa_accounts(task): + logger.info("Checking if all accounts are created") + instance_id = task.args[0] + instance = Dealer.objects.get(pk=instance_id) + entity = instance.entity + coa = entity.get_default_coa() + + for account_data in get_accounts_data(): + if entity.get_all_accounts().filter(code=account_data["code"]).exists(): + logger.info(f"Default account already exists: {account_data['code']}") + continue + logger.info(f"Default account does not exist: {account_data['code']}") + create_account(entity, coa, account_data) + +def print_results(task): + print(task.kwargs.get("dealer")) \ No newline at end of file diff --git a/inventory/management/commands/run1.py b/inventory/management/commands/run1.py new file mode 100644 index 00000000..da71f31c --- /dev/null +++ b/inventory/management/commands/run1.py @@ -0,0 +1,9 @@ +from django.core.management.base import BaseCommand +from django_q.tasks import async_task, result + + +class Command(BaseCommand): + def handle(self, *args, **kwargs): + from inventory.models import Dealer + instance = Dealer.objects.first() + async_task(name="test_task_test",func="inventory.tasks.test_task",dealer=instance,hook="inventory.hooks.print_results") \ No newline at end of file diff --git a/inventory/models.py b/inventory/models.py index ee42f924..da8cfaa6 100644 --- a/inventory/models.py +++ b/inventory/models.py @@ -2,6 +2,7 @@ import uuid from datetime import datetime from django.conf import settings from django.contrib.auth.models import Permission +from inventory.validators import SaudiPhoneNumberValidator from decimal import Decimal from django.urls import reverse from django.utils.text import slugify @@ -1305,7 +1306,7 @@ class Dealer(models.Model, LocalizedNameMixin): ) arabic_name = models.CharField(max_length=255, verbose_name=_("Arabic Name")) name = models.CharField(max_length=255, verbose_name=_("English Name")) - phone_number = PhoneNumberField(region="SA", verbose_name=_("Phone Number")) + phone_number = models.CharField(max_length=255, verbose_name=_("Phone Number"),validators=[SaudiPhoneNumberValidator]) address = models.CharField( max_length=200, blank=True, null=True, verbose_name=_("Address") ) @@ -1431,7 +1432,7 @@ class Staff(models.Model): last_name = models.CharField(max_length=255, verbose_name=_("Last Name")) arabic_name = models.CharField(max_length=255, verbose_name=_("Arabic Name")) - phone_number = PhoneNumberField(region="SA", verbose_name=_("Phone Number")) + phone_number = models.CharField(max_length=255, verbose_name=_("Phone Number"),validators=[SaudiPhoneNumberValidator]) staff_type = models.CharField( choices=StaffTypes.choices, max_length=255, verbose_name=_("Staff Type") ) @@ -1825,7 +1826,7 @@ class Organization(models.Model, LocalizedNameMixin): ) vrn = models.CharField(max_length=15, verbose_name=_("VAT Registration Number")) email = models.EmailField(verbose_name=_("Email")) - phone_number = PhoneNumberField(region="SA", verbose_name=_("Phone Number")) + phone_number = models.CharField(max_length=255, verbose_name=_("Phone Number"),validators=[SaudiPhoneNumberValidator]) address = models.CharField( max_length=200, blank=True, null=True, verbose_name=_("Address") ) @@ -1959,7 +1960,7 @@ class Representative(models.Model, LocalizedNameMixin): id_number = models.CharField( max_length=10, unique=True, verbose_name=_("ID Number") ) - phone_number = PhoneNumberField(region="SA", verbose_name=_("Phone Number")) + phone_number = models.CharField(max_length=255, verbose_name=_("Phone Number"),validators=[SaudiPhoneNumberValidator]) email = models.EmailField(max_length=255, verbose_name=_("Email Address")) address = models.CharField( max_length=200, blank=True, null=True, verbose_name=_("Address") @@ -1979,7 +1980,7 @@ class Lead(models.Model): first_name = models.CharField(max_length=50, verbose_name=_("First Name")) last_name = models.CharField(max_length=50, verbose_name=_("Last Name")) email = models.EmailField(verbose_name=_("Email")) - phone_number = PhoneNumberField(region="SA", verbose_name=_("Phone Number")) + phone_number = models.CharField(max_length=255, verbose_name=_("Phone Number"),validators=[SaudiPhoneNumberValidator]) address = models.CharField( max_length=200, blank=True, null=True, verbose_name=_("Address") ) @@ -2667,7 +2668,7 @@ class Vendor(models.Model, LocalizedNameMixin): arabic_name = models.CharField(max_length=255, verbose_name=_("Arabic Name")) name = models.CharField(max_length=255, verbose_name=_("English Name")) contact_person = models.CharField(max_length=100, verbose_name=_("Contact Person")) - phone_number = PhoneNumberField(region="SA", verbose_name=_("Phone Number")) + phone_number = models.CharField(max_length=255, verbose_name=_("Phone Number"),validators=[SaudiPhoneNumberValidator]) email = models.EmailField(max_length=255, verbose_name=_("Email Address")) address = models.CharField(max_length=200, verbose_name=_("Address")) logo = models.ImageField( diff --git a/inventory/signals.py b/inventory/signals.py index 773f8e4c..12582a3d 100644 --- a/inventory/signals.py +++ b/inventory/signals.py @@ -1,7 +1,7 @@ from datetime import datetime, timedelta from decimal import Decimal from django.urls import reverse -from inventory.tasks import create_coa_accounts,check_create_coa_accounts, create_make_accounts +from inventory.tasks import create_coa_accounts, create_make_accounts from django.contrib.auth.models import Group from django.db.models.signals import post_save, post_delete from django.dispatch import receiver @@ -178,8 +178,8 @@ def create_ledger_entity(sender, instance, created, **kwargs): entity.create_uom(name=u[1], unit_abbr=u[0]) # Create COA accounts, background task - async_task(create_coa_accounts, instance) - async_task('inventory.tasks.check_create_coa_accounts', instance, schedule_type='O', schedule_time=timedelta(seconds=20)) + async_task(name="create_coa_accounts",func=create_coa_accounts,dealer_pk=instance.pk,hook="inventory.hooks.check_create_coa_accounts") + # async_task('inventory.tasks.check_create_coa_accounts', instance, schedule_type='O', schedule_time=timedelta(seconds=20)) # create_settings(instance.pk) # create_accounts_for_make(instance.pk) diff --git a/inventory/tasks.py b/inventory/tasks.py index 9ad55056..fb9a2661 100644 --- a/inventory/tasks.py +++ b/inventory/tasks.py @@ -14,11 +14,11 @@ from django.core.files.base import ContentFile from django.contrib.auth import get_user_model from allauth.account.models import EmailAddress from django.core.mail import EmailMultiAlternatives +from .utils import get_accounts_data,create_account from django.template.loader import render_to_string from django.utils.translation import gettext_lazy as _ from django.contrib.auth.models import User, Group, Permission from inventory.models import DealerSettings, Dealer,Schedule,Notification,CarReservation,CarStatusChoices - logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) @@ -47,435 +47,15 @@ def create_settings(pk): .filter(role=roles.LIABILITY_CL_ACC_PAYABLE) .first(), ) -def get_accounts_data(): - return [ - # Current Assets (must start with 1) - { - "code": "1010", - "name": "Cash on Hand", - "role": roles.ASSET_CA_CASH, - "balance_type": roles.DEBIT, - "locked": False, - "default": True, # Default for ASSET_CA_CASH - }, - { - "code": "1020", - "name": "Bank", - "role": roles.ASSET_CA_CASH, - "balance_type": roles.DEBIT, - "locked": False, - "default": False, - }, - { - "code": "1030", - "name": "Accounts Receivable", - "role": roles.ASSET_CA_RECEIVABLES, - "balance_type": roles.DEBIT, - "locked": False, - "default": True, # Default for ASSET_CA_RECEIVABLES - }, - { - "code": "1040", - "name": "Inventory (Cars)", - "role": roles.ASSET_CA_INVENTORY, - "balance_type": roles.DEBIT, - "locked": False, - "default": True, # Default for ASSET_CA_INVENTORY - }, - { - "code": "1045", - "name": "Spare Parts Inventory", - "role": roles.ASSET_CA_INVENTORY, - "balance_type": roles.DEBIT, - "locked": False, - "default": False, - }, - { - "code": "1050", - "name": "Employee Advances", - "role": roles.ASSET_CA_RECEIVABLES, - "balance_type": roles.DEBIT, - "locked": False, - "default": False, - }, - { - "code": "1060", - "name": "Prepaid Expenses", - "role": roles.ASSET_CA_PREPAID, - "balance_type": roles.DEBIT, - "locked": False, - "default": True, # Default for ASSET_CA_PREPAID - }, - { - "code": "1070", - "name": "Notes Receivable", - "role": roles.ASSET_LTI_NOTES_RECEIVABLE, - "balance_type": roles.DEBIT, - "locked": False, - "default": True, # Default for ASSET_LTI_NOTES_RECEIVABLE - }, - # Fixed Assets (must also start with 1) - { - "code": "1110", - "name": "Lands", - "role": roles.ASSET_LTI_LAND, - "balance_type": roles.DEBIT, - "locked": False, - "default": True, # Default for ASSET_LTI_LAND - }, - { - "code": "1111", - "name": "Buildings", - "role": roles.ASSET_PPE_BUILDINGS, - "balance_type": roles.DEBIT, - "locked": False, - "default": True, # Default for ASSET_PPE_BUILDINGS - }, - { - "code": "1112", - "name": "Company Vehicles", - "role": roles.ASSET_PPE_EQUIPMENT, - "balance_type": roles.DEBIT, - "locked": False, - "default": True, # Default for ASSET_PPE_EQUIPMENT - }, - { - "code": "1113", - "name": "Equipment & Tools", - "role": roles.ASSET_PPE_EQUIPMENT, - "balance_type": roles.DEBIT, - "locked": False, - "default": False, - }, - { - "code": "1114", - "name": "Furniture & Fixtures", - "role": roles.ASSET_PPE_EQUIPMENT, - "balance_type": roles.DEBIT, - "locked": False, - "default": False, - }, - { - "code": "1115", - "name": "Other Fixed Assets", - "role": roles.ASSET_PPE_EQUIPMENT, - "balance_type": roles.DEBIT, - "locked": False, - "default": False, - }, - { - "code": "1120", - "name": "Long-term Investments", - "role": roles.ASSET_LTI_SECURITIES, - "balance_type": roles.DEBIT, - "locked": False, - "default": True, # Default for ASSET_LTI_SECURITIES - }, - { - "code": "1130", - "name": "Intangible Assets", - "role": roles.ASSET_INTANGIBLE_ASSETS, - "balance_type": roles.DEBIT, - "locked": False, - "default": True, # Default for ASSET_INTANGIBLE_ASSETS - }, - # Current Liabilities (must start with 2) - { - "code": "2010", - "name": "Accounts Payable", - "role": roles.LIABILITY_CL_ACC_PAYABLE, - "balance_type": roles.CREDIT, - "locked": True, - "default": True, # Default for LIABILITY_CL_ACC_PAYABLE - }, - { - "code": "2020", - "name": "Notes Payable", - "role": roles.LIABILITY_CL_ST_NOTES_PAYABLE, - "balance_type": roles.CREDIT, - "locked": False, - "default": True, # Default for LIABILITY_CL_ST_NOTES_PAYABLE - }, - { - "code": "2030", - "name": "Short-term Loans", - "role": roles.LIABILITY_CL_ST_NOTES_PAYABLE, - "balance_type": roles.CREDIT, - "locked": False, - "default": False, - }, - { - "code": "2040", - "name": "Employee Payables", - "role": roles.LIABILITY_CL_WAGES_PAYABLE, - "balance_type": roles.CREDIT, - "locked": False, - "default": True, # Default for LIABILITY_CL_WAGES_PAYABLE - }, - { - "code": "2050", - "name": "Accrued Expenses", - "role": roles.LIABILITY_CL_OTHER, - "balance_type": roles.CREDIT, - "locked": False, - "default": True, # Default for LIABILITY_CL_OTHER - }, - { - "code": "2060", - "name": "Accrued Taxes", - "role": roles.LIABILITY_CL_TAXES_PAYABLE, - "balance_type": roles.CREDIT, - "locked": False, - "default": False, # Default for LIABILITY_CL_TAXES_PAYABLE - }, - { - "code": "2070", - "name": "Provisions", - "role": roles.LIABILITY_CL_OTHER, - "balance_type": roles.CREDIT, - "locked": False, - "default": False, - }, - # Long-term Liabilities (must also start with 2) - { - "code": "2103", - "name": "Deferred Revenue", - "role": roles.LIABILITY_CL_DEFERRED_REVENUE, - "balance_type": roles.CREDIT, - "locked": False, - "default": True, # Default for LIABILITY_CL_DEFERRED_REVENUE - }, - { - "code": "2200", - "name": "Tax Payable", - "role": roles.LIABILITY_CL_TAXES_PAYABLE, - "balance_type": roles.CREDIT, - "locked": False, - "default": True, - }, - { - "code": "2210", - "name": "Long-term Bank Loans", - "role": roles.LIABILITY_LTL_NOTES_PAYABLE, - "balance_type": roles.CREDIT, - "locked": False, - "default": True, # Default for LIABILITY_LTL_NOTES_PAYABLE - }, - { - "code": "2220", - "name": "Lease Liabilities", - "role": roles.LIABILITY_LTL_NOTES_PAYABLE, - "balance_type": roles.CREDIT, - "locked": False, - "default": False, - }, - { - "code": "2230", - "name": "Other Long-term Liabilities", - "role": roles.LIABILITY_LTL_NOTES_PAYABLE, - "balance_type": roles.CREDIT, - "locked": False, - "default": False, - }, - # Equity (must start with 3) - { - "code": "3010", - "name": "Capital", - "role": roles.EQUITY_CAPITAL, - "balance_type": roles.CREDIT, - "locked": True, - "default": True, # Default for EQUITY_CAPITAL - }, - { - "code": "3020", - "name": "Statutory Reserve", - "role": roles.EQUITY_ADJUSTMENT, - "balance_type": roles.CREDIT, - "locked": False, - "default": True, # Default for EQUITY_ADJUSTMENT - }, - { - "code": "3030", - "name": "Retained Earnings", - "role": roles.EQUITY_ADJUSTMENT, - "balance_type": roles.CREDIT, - "locked": False, - "default": False, - }, - { - "code": "3040", - "name": "Profit & Loss for the Period", - "role": roles.EQUITY_ADJUSTMENT, - "balance_type": roles.CREDIT, - "locked": False, - "default": False, - }, - # Revenue (must start with 4) - { - "code": "4010", - "name": "Car Sales", - "role": roles.INCOME_OPERATIONAL, - "balance_type": roles.CREDIT, - "locked": True, - "default": True, # Default for INCOME_OPERATIONAL - }, - { - "code": "4020", - "name": "After-Sales Services", - "role": roles.INCOME_OPERATIONAL, - "balance_type": roles.CREDIT, - "locked": False, - "default": False, - }, - { - "code": "4030", - "name": "Car Rental Income", - "role": roles.INCOME_PASSIVE, - "balance_type": roles.CREDIT, - "locked": False, - "default": True, # Default for INCOME_PASSIVE - }, - { - "code": "4040", - "name": "Other Income", - "role": roles.INCOME_OTHER, - "balance_type": roles.CREDIT, - "locked": False, - "default": True, # Default for INCOME_OTHER - }, - # Expenses (must start with 5 for COGS, 6 for others) - { - "code": "5010", - "name": "Cost of Goods Sold", - "role": roles.COGS, - "balance_type": roles.DEBIT, - "locked": True, - "default": True, # Default for COGS - }, - { - "code": "5015", - "name": "Spare Parts Cost Consumed", - "role": roles.COGS, - "balance_type": roles.DEBIT, - "locked": False, - "default": False, - }, - { - "code": "6010", - "name": "Salaries & Wages", - "role": roles.EXPENSE_OPERATIONAL, - "balance_type": roles.DEBIT, - "locked": False, - "default": True, # Default for EXPENSE_OPERATIONAL - }, - { - "code": "6020", - "name": "Rent", - "role": roles.EXPENSE_OPERATIONAL, - "balance_type": roles.DEBIT, - "locked": False, - "default": False, - }, - { - "code": "6030", - "name": "Utilities", - "role": roles.EXPENSE_OPERATIONAL, - "balance_type": roles.DEBIT, - "locked": False, - "default": False, - }, - { - "code": "6040", - "name": "Advertising & Marketing", - "role": roles.EXPENSE_OPERATIONAL, - "balance_type": roles.DEBIT, - "locked": False, - "default": False, - }, - { - "code": "6050", - "name": "Maintenance", - "role": roles.EXPENSE_OPERATIONAL, - "balance_type": roles.DEBIT, - "locked": False, - "default": False, - }, - { - "code": "6060", - "name": "Operating Expenses", - "role": roles.EXPENSE_OPERATIONAL, - "balance_type": roles.DEBIT, - "locked": False, - "default": False, - }, - { - "code": "6070", - "name": "Depreciation", - "role": roles.EXPENSE_DEPRECIATION, - "balance_type": roles.DEBIT, - "locked": False, - "default": True, # Default for EXPENSE_DEPRECIATION - }, - { - "code": "6080", - "name": "Fees & Taxes", - "role": roles.EXPENSE_OPERATIONAL, - "balance_type": roles.DEBIT, - "locked": False, - "default": False, - }, - { - "code": "6090", - "name": "Bank Charges", - "role": roles.EXPENSE_OPERATIONAL, - "balance_type": roles.DEBIT, - "locked": False, - "default": False, - }, - { - "code": "6100", - "name": "Other Expenses", - "role": roles.EXPENSE_OTHER, - "balance_type": roles.DEBIT, - "locked": False, - "default": True, # Default for EXPENSE_OTHER - }, - ] -def create_account(entity, coa, account_data): - try: - account = entity.create_account( - coa_model=coa, - code=account_data["code"], - name=account_data["name"], - role=account_data["role"], - balance_type=_(account_data["balance_type"]), - active=True, - ) - account.role_default = account_data["default"] - account.save() - logger.info(f"Created default account: {account}") - except Exception as e: - logger.error(f"Error creating default account: {account_data['code']}, {e}") -def create_coa_accounts(instance): +def create_coa_accounts(**kwargs): + logger.info("creating all accounts are created") + instance = Dealer.objects.get(pk=kwargs['dealer_pk']) entity = instance.entity coa = entity.get_default_coa() for account_data in get_accounts_data(): create_account(entity, coa, account_data) - # Check if all accounts are created - # check_create_coa_accounts(instance) -def check_create_coa_accounts(instance): - logger.info("Checking if all accounts are created") - entity = instance.entity - coa = entity.get_default_coa() - - for account_data in get_accounts_data(): - if entity.get_all_accounts().filter(code=account_data["code"]).exists(): - logger.info(f"Default account already exists: {account_data['code']}") - continue - logger.info(f"Default account does not exist: {account_data['code']}") - create_account(entity, coa, account_data) @@ -1345,4 +925,7 @@ def remove_reservation_by_id(reservation_id): reservation.car.save() reservation.delete() except Exception as e: - logger.error(f"Error removing reservation with ID {reservation_id}: {e}") \ No newline at end of file + logger.error(f"Error removing reservation with ID {reservation_id}: {e}") + +def test_task(instance): + print(instance.pk) \ No newline at end of file diff --git a/inventory/utils.py b/inventory/utils.py index a0868a04..dc87e04c 100644 --- a/inventory/utils.py +++ b/inventory/utils.py @@ -1922,3 +1922,416 @@ def handle_payment(request, order): # def get_user_quota(user): # return user.dealer.quota + + + +def get_accounts_data(): + return [ + # Current Assets (must start with 1) + { + "code": "1010", + "name": "Cash on Hand", + "role": roles.ASSET_CA_CASH, + "balance_type": roles.DEBIT, + "locked": False, + "default": True, # Default for ASSET_CA_CASH + }, + { + "code": "1020", + "name": "Bank", + "role": roles.ASSET_CA_CASH, + "balance_type": roles.DEBIT, + "locked": False, + "default": False, + }, + { + "code": "1030", + "name": "Accounts Receivable", + "role": roles.ASSET_CA_RECEIVABLES, + "balance_type": roles.DEBIT, + "locked": False, + "default": True, # Default for ASSET_CA_RECEIVABLES + }, + { + "code": "1040", + "name": "Inventory (Cars)", + "role": roles.ASSET_CA_INVENTORY, + "balance_type": roles.DEBIT, + "locked": False, + "default": True, # Default for ASSET_CA_INVENTORY + }, + { + "code": "1045", + "name": "Spare Parts Inventory", + "role": roles.ASSET_CA_INVENTORY, + "balance_type": roles.DEBIT, + "locked": False, + "default": False, + }, + { + "code": "1050", + "name": "Employee Advances", + "role": roles.ASSET_CA_RECEIVABLES, + "balance_type": roles.DEBIT, + "locked": False, + "default": False, + }, + { + "code": "1060", + "name": "Prepaid Expenses", + "role": roles.ASSET_CA_PREPAID, + "balance_type": roles.DEBIT, + "locked": False, + "default": True, # Default for ASSET_CA_PREPAID + }, + { + "code": "1070", + "name": "Notes Receivable", + "role": roles.ASSET_LTI_NOTES_RECEIVABLE, + "balance_type": roles.DEBIT, + "locked": False, + "default": True, # Default for ASSET_LTI_NOTES_RECEIVABLE + }, + # Fixed Assets (must also start with 1) + { + "code": "1110", + "name": "Lands", + "role": roles.ASSET_LTI_LAND, + "balance_type": roles.DEBIT, + "locked": False, + "default": True, # Default for ASSET_LTI_LAND + }, + { + "code": "1111", + "name": "Buildings", + "role": roles.ASSET_PPE_BUILDINGS, + "balance_type": roles.DEBIT, + "locked": False, + "default": True, # Default for ASSET_PPE_BUILDINGS + }, + { + "code": "1112", + "name": "Company Vehicles", + "role": roles.ASSET_PPE_EQUIPMENT, + "balance_type": roles.DEBIT, + "locked": False, + "default": True, # Default for ASSET_PPE_EQUIPMENT + }, + { + "code": "1113", + "name": "Equipment & Tools", + "role": roles.ASSET_PPE_EQUIPMENT, + "balance_type": roles.DEBIT, + "locked": False, + "default": False, + }, + { + "code": "1114", + "name": "Furniture & Fixtures", + "role": roles.ASSET_PPE_EQUIPMENT, + "balance_type": roles.DEBIT, + "locked": False, + "default": False, + }, + { + "code": "1115", + "name": "Other Fixed Assets", + "role": roles.ASSET_PPE_EQUIPMENT, + "balance_type": roles.DEBIT, + "locked": False, + "default": False, + }, + { + "code": "1120", + "name": "Long-term Investments", + "role": roles.ASSET_LTI_SECURITIES, + "balance_type": roles.DEBIT, + "locked": False, + "default": True, # Default for ASSET_LTI_SECURITIES + }, + { + "code": "1130", + "name": "Intangible Assets", + "role": roles.ASSET_INTANGIBLE_ASSETS, + "balance_type": roles.DEBIT, + "locked": False, + "default": True, # Default for ASSET_INTANGIBLE_ASSETS + }, + # Current Liabilities (must start with 2) + { + "code": "2010", + "name": "Accounts Payable", + "role": roles.LIABILITY_CL_ACC_PAYABLE, + "balance_type": roles.CREDIT, + "locked": True, + "default": True, # Default for LIABILITY_CL_ACC_PAYABLE + }, + { + "code": "2020", + "name": "Notes Payable", + "role": roles.LIABILITY_CL_ST_NOTES_PAYABLE, + "balance_type": roles.CREDIT, + "locked": False, + "default": True, # Default for LIABILITY_CL_ST_NOTES_PAYABLE + }, + { + "code": "2030", + "name": "Short-term Loans", + "role": roles.LIABILITY_CL_ST_NOTES_PAYABLE, + "balance_type": roles.CREDIT, + "locked": False, + "default": False, + }, + { + "code": "2040", + "name": "Employee Payables", + "role": roles.LIABILITY_CL_WAGES_PAYABLE, + "balance_type": roles.CREDIT, + "locked": False, + "default": True, # Default for LIABILITY_CL_WAGES_PAYABLE + }, + { + "code": "2050", + "name": "Accrued Expenses", + "role": roles.LIABILITY_CL_OTHER, + "balance_type": roles.CREDIT, + "locked": False, + "default": True, # Default for LIABILITY_CL_OTHER + }, + { + "code": "2060", + "name": "Accrued Taxes", + "role": roles.LIABILITY_CL_TAXES_PAYABLE, + "balance_type": roles.CREDIT, + "locked": False, + "default": False, # Default for LIABILITY_CL_TAXES_PAYABLE + }, + { + "code": "2070", + "name": "Provisions", + "role": roles.LIABILITY_CL_OTHER, + "balance_type": roles.CREDIT, + "locked": False, + "default": False, + }, + # Long-term Liabilities (must also start with 2) + { + "code": "2103", + "name": "Deferred Revenue", + "role": roles.LIABILITY_CL_DEFERRED_REVENUE, + "balance_type": roles.CREDIT, + "locked": False, + "default": True, # Default for LIABILITY_CL_DEFERRED_REVENUE + }, + { + "code": "2200", + "name": "Tax Payable", + "role": roles.LIABILITY_CL_TAXES_PAYABLE, + "balance_type": roles.CREDIT, + "locked": False, + "default": True, + }, + { + "code": "2210", + "name": "Long-term Bank Loans", + "role": roles.LIABILITY_LTL_NOTES_PAYABLE, + "balance_type": roles.CREDIT, + "locked": False, + "default": True, # Default for LIABILITY_LTL_NOTES_PAYABLE + }, + { + "code": "2220", + "name": "Lease Liabilities", + "role": roles.LIABILITY_LTL_NOTES_PAYABLE, + "balance_type": roles.CREDIT, + "locked": False, + "default": False, + }, + { + "code": "2230", + "name": "Other Long-term Liabilities", + "role": roles.LIABILITY_LTL_NOTES_PAYABLE, + "balance_type": roles.CREDIT, + "locked": False, + "default": False, + }, + # Equity (must start with 3) + { + "code": "3010", + "name": "Capital", + "role": roles.EQUITY_CAPITAL, + "balance_type": roles.CREDIT, + "locked": True, + "default": True, # Default for EQUITY_CAPITAL + }, + { + "code": "3020", + "name": "Statutory Reserve", + "role": roles.EQUITY_ADJUSTMENT, + "balance_type": roles.CREDIT, + "locked": False, + "default": True, # Default for EQUITY_ADJUSTMENT + }, + { + "code": "3030", + "name": "Retained Earnings", + "role": roles.EQUITY_ADJUSTMENT, + "balance_type": roles.CREDIT, + "locked": False, + "default": False, + }, + { + "code": "3040", + "name": "Profit & Loss for the Period", + "role": roles.EQUITY_ADJUSTMENT, + "balance_type": roles.CREDIT, + "locked": False, + "default": False, + }, + # Revenue (must start with 4) + { + "code": "4010", + "name": "Car Sales", + "role": roles.INCOME_OPERATIONAL, + "balance_type": roles.CREDIT, + "locked": True, + "default": True, # Default for INCOME_OPERATIONAL + }, + { + "code": "4020", + "name": "After-Sales Services", + "role": roles.INCOME_OPERATIONAL, + "balance_type": roles.CREDIT, + "locked": False, + "default": False, + }, + { + "code": "4030", + "name": "Car Rental Income", + "role": roles.INCOME_PASSIVE, + "balance_type": roles.CREDIT, + "locked": False, + "default": True, # Default for INCOME_PASSIVE + }, + { + "code": "4040", + "name": "Other Income", + "role": roles.INCOME_OTHER, + "balance_type": roles.CREDIT, + "locked": False, + "default": True, # Default for INCOME_OTHER + }, + # Expenses (must start with 5 for COGS, 6 for others) + { + "code": "5010", + "name": "Cost of Goods Sold", + "role": roles.COGS, + "balance_type": roles.DEBIT, + "locked": True, + "default": True, # Default for COGS + }, + { + "code": "5015", + "name": "Spare Parts Cost Consumed", + "role": roles.COGS, + "balance_type": roles.DEBIT, + "locked": False, + "default": False, + }, + { + "code": "6010", + "name": "Salaries & Wages", + "role": roles.EXPENSE_OPERATIONAL, + "balance_type": roles.DEBIT, + "locked": False, + "default": True, # Default for EXPENSE_OPERATIONAL + }, + { + "code": "6020", + "name": "Rent", + "role": roles.EXPENSE_OPERATIONAL, + "balance_type": roles.DEBIT, + "locked": False, + "default": False, + }, + { + "code": "6030", + "name": "Utilities", + "role": roles.EXPENSE_OPERATIONAL, + "balance_type": roles.DEBIT, + "locked": False, + "default": False, + }, + { + "code": "6040", + "name": "Advertising & Marketing", + "role": roles.EXPENSE_OPERATIONAL, + "balance_type": roles.DEBIT, + "locked": False, + "default": False, + }, + { + "code": "6050", + "name": "Maintenance", + "role": roles.EXPENSE_OPERATIONAL, + "balance_type": roles.DEBIT, + "locked": False, + "default": False, + }, + { + "code": "6060", + "name": "Operating Expenses", + "role": roles.EXPENSE_OPERATIONAL, + "balance_type": roles.DEBIT, + "locked": False, + "default": False, + }, + { + "code": "6070", + "name": "Depreciation", + "role": roles.EXPENSE_DEPRECIATION, + "balance_type": roles.DEBIT, + "locked": False, + "default": True, # Default for EXPENSE_DEPRECIATION + }, + { + "code": "6080", + "name": "Fees & Taxes", + "role": roles.EXPENSE_OPERATIONAL, + "balance_type": roles.DEBIT, + "locked": False, + "default": False, + }, + { + "code": "6090", + "name": "Bank Charges", + "role": roles.EXPENSE_OPERATIONAL, + "balance_type": roles.DEBIT, + "locked": False, + "default": False, + }, + { + "code": "6100", + "name": "Other Expenses", + "role": roles.EXPENSE_OTHER, + "balance_type": roles.DEBIT, + "locked": False, + "default": True, # Default for EXPENSE_OTHER + }, + ] + +def create_account(entity, coa, account_data): + try: + account = entity.create_account( + coa_model=coa, + code=account_data["code"], + name=account_data["name"], + role=account_data["role"], + balance_type=_(account_data["balance_type"]), + active=True, + ) + account.role_default = account_data["default"] + account.save() + logger.info(f"Created default account: {account}") + except Exception as e: + logger.error(f"Error creating default account: {account_data['code']}, {e}") \ No newline at end of file