diff --git a/src/accounting/report/reports/balance_sheet.py b/src/accounting/report/reports/balance_sheet.py index 949ef24..5caeeb1 100644 --- a/src/accounting/report/reports/balance_sheet.py +++ b/src/accounting/report/reports/balance_sheet.py @@ -27,6 +27,7 @@ from accounting.locale import gettext from accounting.models import Currency, BaseAccount, Account, Transaction, \ JournalEntry from accounting.report.period import Period +from .utils.base_report import BaseReport from .utils.csv_export import BaseCSVRow, csv_download from .utils.option_link import OptionLink from .utils.page_params import PageParams @@ -371,7 +372,7 @@ class BalanceSheetPageParams(PageParams): .order_by(Currency.code).all()] -class BalanceSheet: +class BalanceSheet(BaseReport): """The balance sheet.""" def __init__(self, currency: Currency, period: Period): diff --git a/src/accounting/report/reports/income_expenses.py b/src/accounting/report/reports/income_expenses.py index 23420f8..cf3786e 100644 --- a/src/accounting/report/reports/income_expenses.py +++ b/src/accounting/report/reports/income_expenses.py @@ -29,6 +29,7 @@ from accounting.models import Currency, Account, Transaction, JournalEntry from accounting.report.income_expense_account import IncomeExpensesAccount from accounting.report.period import Period from accounting.utils.pagination import Pagination +from .utils.base_report import BaseReport from .utils.csv_export import BaseCSVRow, csv_download from .utils.option_link import OptionLink from .utils.page_params import PageParams @@ -387,7 +388,7 @@ def _populate_entries(entries: list[Entry]) -> None: entry.account = accounts[entry.entry.account_id] -class IncomeExpenses: +class IncomeExpenses(BaseReport): """The income and expenses log.""" def __init__(self, currency: Currency, account: IncomeExpensesAccount, diff --git a/src/accounting/report/reports/income_statement.py b/src/accounting/report/reports/income_statement.py index 97697b7..64c8633 100644 --- a/src/accounting/report/reports/income_statement.py +++ b/src/accounting/report/reports/income_statement.py @@ -27,6 +27,7 @@ from accounting.locale import gettext from accounting.models import Currency, BaseAccount, Account, Transaction, \ JournalEntry from accounting.report.period import Period +from .utils.base_report import BaseReport from .utils.csv_export import BaseCSVRow, csv_download from .utils.option_link import OptionLink from .utils.page_params import PageParams @@ -200,7 +201,7 @@ class IncomeStatementPageParams(PageParams): .order_by(Currency.code).all()] -class IncomeStatement: +class IncomeStatement(BaseReport): """The income statement.""" def __init__(self, currency: Currency, period: Period): diff --git a/src/accounting/report/reports/journal.py b/src/accounting/report/reports/journal.py index 36e9676..5e03186 100644 --- a/src/accounting/report/reports/journal.py +++ b/src/accounting/report/reports/journal.py @@ -28,6 +28,7 @@ from accounting.locale import gettext from accounting.models import Currency, Account, Transaction, JournalEntry from accounting.report.period import Period from accounting.utils.pagination import Pagination +from .utils.base_report import BaseReport from .utils.csv_export import BaseCSVRow, csv_download from .utils.page_params import PageParams from .utils.period_choosers import JournalPeriodChooser @@ -172,7 +173,7 @@ def _populate_entries(entries: list[Entry]) -> None: entry.currency = currencies[entry.entry.currency_code] -class Journal: +class Journal(BaseReport): """The journal.""" def __init__(self, period: Period): diff --git a/src/accounting/report/reports/ledger.py b/src/accounting/report/reports/ledger.py index 4f6b64d..6e6e659 100644 --- a/src/accounting/report/reports/ledger.py +++ b/src/accounting/report/reports/ledger.py @@ -28,6 +28,7 @@ from accounting.locale import gettext from accounting.models import Currency, Account, Transaction, JournalEntry from accounting.report.period import Period from accounting.utils.pagination import Pagination +from .utils.base_report import BaseReport from .utils.csv_export import BaseCSVRow, csv_download from .utils.option_link import OptionLink from .utils.page_params import PageParams @@ -342,7 +343,7 @@ def _populate_entries(entries: list[Entry]) -> None: entry.note = entry.transaction.note -class Ledger: +class Ledger(BaseReport): """The ledger.""" def __init__(self, currency: Currency, account: Account, period: Period): diff --git a/src/accounting/report/reports/trial_balance.py b/src/accounting/report/reports/trial_balance.py index d32e006..8c06a63 100644 --- a/src/accounting/report/reports/trial_balance.py +++ b/src/accounting/report/reports/trial_balance.py @@ -26,6 +26,7 @@ from accounting import db from accounting.locale import gettext from accounting.models import Currency, Account, Transaction, JournalEntry from accounting.report.period import Period +from .utils.base_report import BaseReport from .utils.csv_export import BaseCSVRow, csv_download from .utils.option_link import OptionLink from .utils.page_params import PageParams @@ -162,7 +163,7 @@ class TrialBalancePageParams(PageParams): .order_by(Currency.code).all()] -class TrialBalance: +class TrialBalance(BaseReport): """The trial balance.""" def __init__(self, currency: Currency, period: Period): diff --git a/src/accounting/report/reports/utils/base_report.py b/src/accounting/report/reports/utils/base_report.py new file mode 100644 index 0000000..9438c87 --- /dev/null +++ b/src/accounting/report/reports/utils/base_report.py @@ -0,0 +1,40 @@ +# The Mia! Accounting Flask Project. +# Author: imacat@mail.imacat.idv.tw (imacat), 2023/3/8 + +# Copyright (c) 2023 imacat. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The base report. + +""" +from abc import ABC, abstractmethod + +from flask import Response + + +class BaseReport(ABC): + """The base report class.""" + + @abstractmethod + def csv(self) -> Response: + """Returns the report as CSV for download. + + :return: The response of the report for download. + """ + + @abstractmethod + def html(self) -> str: + """Composes and returns the report as HTML. + + :return: The report as HTML. + """