DrCr/austax/__init__.py

96 lines
3.8 KiB
Python
Raw Normal View History

2023-01-04 18:03:08 +11:00
# DrCr: Web-based double-entry bookkeeping framework
# Copyright (C) 2022–2023 Lee Yingtong Li (RunasSudo)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
2023-01-07 19:01:05 +11:00
from flask import render_template, url_for
2023-01-04 18:03:08 +11:00
2023-01-07 14:07:58 +11:00
from drcr.models import AccountConfiguration, Posting, Transaction, TrialBalancer
from drcr.database import db
2023-01-04 18:03:08 +11:00
import drcr.plugins
from .reports import eofy_date, tax_summary_report
2023-01-07 14:07:58 +11:00
from . import views
2023-01-04 18:03:08 +11:00
def plugin_init():
2023-01-07 19:01:05 +11:00
drcr.plugins.data_sources.append(('cgt_adjustments', 'CGT adjustments'))
drcr.plugins.advanced_reports.append(('cgt_assets', 'CGT assets'))
drcr.plugins.advanced_reports.append(('tax_summary', 'Tax summary'))
2023-01-04 18:03:08 +11:00
drcr.plugins.account_kinds.append(('austax.income1', 'Salary or wages (1)'))
drcr.plugins.account_kinds.append(('austax.income5', 'Australian Government allowances and payments (5)'))
drcr.plugins.account_kinds.append(('austax.income10', 'Gross interest (10)'))
2023-01-27 21:49:29 +11:00
drcr.plugins.account_kinds.append(('austax.d2', 'Work-related travel expenses (D2)'))
2023-01-04 18:03:08 +11:00
drcr.plugins.account_kinds.append(('austax.d4', 'Work-related self-education expenses (D4)'))
drcr.plugins.account_kinds.append(('austax.d5', 'Other work-related expenses (D5)'))
drcr.plugins.account_kinds.append(('austax.paygw', 'PAYG withheld amounts'))
2023-01-07 02:05:21 +11:00
drcr.plugins.account_kinds.append(('austax.cgtasset', 'CGT asset'))
drcr.plugins.account_kinds.append(('austax.rfb', 'Reportable fringe benefit'))
2023-01-04 18:03:08 +11:00
drcr.plugins.transaction_providers.append(make_tax_transactions)
def make_tax_transactions():
report = tax_summary_report()
tax_amount = report.by_id('total_tax').amount
# Get EOFY date
dt = eofy_date()
2023-01-04 18:03:08 +11:00
# Estimated tax payable
transactions = [Transaction(
2023-01-04 18:03:08 +11:00
dt=dt,
description='Estimated income tax',
2023-01-04 18:03:08 +11:00
postings=[
Posting(account='Income Tax', quantity=tax_amount.quantity, commodity='$'),
Posting(account='Income Tax Control', quantity=-tax_amount.quantity, commodity='$')
]
)]
# Mandatory study loan repayment
loan_repayment = report.by_id('loan_repayment').amount
if loan_repayment.quantity != 0:
transactions.append(Transaction(
dt=dt,
description='Mandatory study loan repayment payable',
postings=[
Posting(account='HELP', quantity=loan_repayment.quantity, commodity='$'), # FIXME: Correct account
Posting(account='Income Tax Control', quantity=-loan_repayment.quantity, commodity='$')
]
))
# Get trial balance
balancer = TrialBalancer()
balancer.apply_transactions(db.session.scalars(db.select(Transaction).options(db.selectinload(Transaction.postings))).all())
accounts = dict(sorted(balancer.accounts.items()))
# Get account configurations
account_configurations = AccountConfiguration.get_all_kinds()
# PAYG withholding
for account_name, kinds in account_configurations.items():
if 'austax.paygw' in kinds:
if account_name in accounts and accounts[account_name].quantity != 0:
# Transfer balance to Income Tax Control
transactions.append(Transaction(
dt=dt,
description='PAYG withheld amounts',
postings=[
Posting(account='Income Tax Control', quantity=accounts[account_name].quantity, commodity='$'),
Posting(account=account_name, quantity=-accounts[account_name].quantity, commodity='$')
]
))
return transactions