haikal/inventory/tasks.py
2025-04-28 14:40:08 +03:00

580 lines
18 KiB
Python

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_coa_accounts(pk):
instance = Dealer.objects.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)
# @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_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_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)