# DrCr: Web-based double-entry bookkeeping framework # Copyright (C) 2022–2024 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 . from flask import render_template, url_for from drcr.models import AccountConfiguration, Posting, Transaction, TrialBalancer, reporting_commodity from drcr.database import db from drcr.webapp import eofy_date import drcr.plugins from . import views # Load routes from .reports import tax_summary_report from .util import assert_aud def plugin_init(): 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')) 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)')) drcr.plugins.account_kinds.append(('austax.income13', 'Partnerships and trusts (13)')) #drcr.plugins.account_kinds.append(('austax.income18', 'Net capital gain (18)')) drcr.plugins.account_kinds.append(('austax.income20', 'Foreign source income and foreign assets or property (20)')) drcr.plugins.account_kinds.append(('austax.d2', 'Work-related travel expenses (D2)')) 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.d9', 'Gifts or donations (D9)')) drcr.plugins.account_kinds.append(('austax.d15', 'Other deductions (D15)')) drcr.plugins.account_kinds.append(('austax.offset', 'Tax offset')) drcr.plugins.account_kinds.append(('austax.paygw', 'PAYG withheld amounts')) drcr.plugins.account_kinds.append(('austax.cgtasset', 'CGT asset')) drcr.plugins.account_kinds.append(('austax.rfb', 'Reportable fringe benefit')) drcr.plugins.transaction_providers.append(make_tax_transactions) @assert_aud def make_tax_transactions(start_date=None, end_date=None): # Get EOFY date dt = eofy_date() if (start_date is not None and start_date > dt) or (end_date is not None and end_date < dt): return [] report = tax_summary_report() tax_amount = report.by_id('total_tax').amount - report.by_id('offsets').amount # Estimated tax payable transactions = [Transaction( dt=dt, description='Estimated income tax', postings=[ Posting(account='Income Tax', quantity=tax_amount.quantity, commodity=reporting_commodity()), Posting(account='Income Tax Control', quantity=-tax_amount.quantity, commodity=reporting_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=reporting_commodity()), # FIXME: Correct account Posting(account='Income Tax Control', quantity=-loan_repayment.quantity, commodity=reporting_commodity()) ] )) # Get trial balance balancer = TrialBalancer.from_cached() 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=reporting_commodity()), Posting(account=account_name, quantity=-accounts[account_name].quantity, commodity=reporting_commodity()) ] )) return transactions