from time import sleep from datetime import datetime from django.db import transaction from django_ledger.io import roles from django.core.mail import send_mail from background_task import background from django.utils.translation import gettext_lazy as _ from inventory.models import DealerSettings,CarMake,Dealer # @background def create_settings(pk): instance = Dealer.objects.get(pk=pk) DealerSettings.objects.create( dealer=instance, invoice_cash_account=instance.entity.get_all_accounts().filter(role=roles.ASSET_CA_CASH).first(), invoice_prepaid_account=instance.entity.get_all_accounts().filter(role=roles.ASSET_CA_RECEIVABLES).first(), invoice_unearned_account=instance.entity.get_all_accounts().filter(role=roles.LIABILITY_CL_DEFERRED_REVENUE).first(), bill_cash_account=instance.entity.get_all_accounts().filter(role=roles.ASSET_CA_CASH).first(), bill_prepaid_account=instance.entity.get_all_accounts().filter(role=roles.ASSET_CA_PREPAID).first(), bill_unearned_account=instance.entity.get_all_accounts().filter(role=roles.LIABILITY_CL_ACC_PAYABLE).first() ) @background def create_coa_accounts(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() # 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() # 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, ) # 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, ) # 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() # 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() # 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() # # 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() # # 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() # 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() # 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() # 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() # 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() # 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() # 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, ) # 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, ) # 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, ) # 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) # 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() # 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) # 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() # 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) # 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() 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, ) # 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() # 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() # 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, ) # Operating Revenues entity.create_account(coa_model=coa, code="4104", role=roles.INCOME_OPERATIONAL, name=_("Sales/Service Revenue"), balance_type="credit", 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) # 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() # 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, ) # 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, ) # 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() # 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, ) # 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, ) # 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, ) # 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, ) # Travel Tickets expense_travel = entity.create_account( coa_model=coa, code="6107", role=roles.EXPENSE_OPERATIONAL, name=_("Travel Tickets"), 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, ) # Government Fees expense_other = entity.create_account( coa_model=coa, code="6109", role=roles.EXPENSE_OPERATIONAL, name=_("Government Fees"), 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, ) # 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, ) # 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, ) # Hospitality Expenses expense_other = entity.create_account( coa_model=coa, code="6113", role=roles.EXPENSE_OPERATIONAL, name=_("Hospitality Expenses"), 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, ) # Other Expenses expense_other = entity.create_account( coa_model=coa, code="6115", role=roles.EXPENSE_OPERATIONAL, name=_("Other Expenses"), 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, ) # 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 # def create_groups(instance): # group_names = ["Inventory", "Accountant", "Sales"] # for group_name in group_names: # group, _ = Group.objects.get_or_create(name=f"{instance.pk}_{group_name}") # group_manager,_ = CustomGroup.objects.get_or_create(name=group_name, dealer=instance, group=group) # group_manager.set_default_permissions() # instance.user.groups.add(group) # @background def create_accounts_for_make(dealer,makes): entity = dealer.entity coa = entity.get_default_coa() for make in makes: last_account = entity.get_all_accounts().filter(role=roles.ASSET_CA_RECEIVABLES).order_by('-created').first() if len(last_account.code) == 4: code = f"{int(last_account.code)}{1:03d}" elif len(last_account.code) > 4: code = f"{int(last_account.code)+1}" if not entity.get_all_accounts().filter( name=make.name, role=roles.ASSET_CA_RECEIVABLES, coa_model=coa, balance_type="credit", active=True ).exists(): entity.create_account( name=make.name, code=code, role=roles.ASSET_CA_RECEIVABLES, coa_model=coa, balance_type="credit", active=True ) @background def send_email(from_, to_, subject, message): subject = subject message = message from_email = from_ recipient_list = [to_] send_mail(subject, message, from_email, recipient_list) @background def long_running_task(task_id, *args, **kwargs): """Example background task""" print(f"Starting task {task_id} with args: {args}, kwargs: {kwargs}") # Simulate work for i in range(5): print(f"Task {task_id} progress: {i+1}/5") result = f"Task {task_id} completed at {datetime.now()}" print(result) return result