602 lines
20 KiB
Python
602 lines
20 KiB
Python
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(pk):
|
|
instance = Dealer.objects.get(pk=pk)
|
|
entity = instance.entity
|
|
coa = entity.get_default_coa()
|
|
|
|
for make in CarMake.objects.all():
|
|
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}"
|
|
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 |