Moved the utilities that are only for the report generators from the "accounting.report" module to the "accounting.report.reports.utils" module.
This commit is contained in:
@ -28,12 +28,12 @@ from accounting import db
|
||||
from accounting.locale import gettext
|
||||
from accounting.models import Currency, BaseAccount, Account, Transaction, \
|
||||
JournalEntry
|
||||
from accounting.report.option_link import OptionLink
|
||||
from accounting.report.page_params import PageParams
|
||||
from accounting.report.period import Period
|
||||
from accounting.report.period_choosers import BalanceSheetPeriodChooser
|
||||
from accounting.report.report_chooser import ReportChooser
|
||||
from accounting.report.report_type import ReportType
|
||||
from .utils.option_link import OptionLink
|
||||
from .utils.page_params import PageParams
|
||||
from .utils.period_choosers import BalanceSheetPeriodChooser
|
||||
from .utils.report_chooser import ReportChooser
|
||||
from .utils.report_type import ReportType
|
||||
|
||||
|
||||
class BalanceSheetAccount:
|
||||
|
@ -28,13 +28,13 @@ from flask import url_for, render_template, Response
|
||||
from accounting import db
|
||||
from accounting.locale import gettext
|
||||
from accounting.models import Currency, Account, Transaction, JournalEntry
|
||||
from accounting.report.option_link import OptionLink
|
||||
from accounting.report.page_params import PageParams
|
||||
from accounting.report.period import Period
|
||||
from accounting.report.period_choosers import IncomeExpensesPeriodChooser
|
||||
from accounting.report.report_chooser import ReportChooser
|
||||
from accounting.report.report_type import ReportType
|
||||
from accounting.utils.pagination import Pagination
|
||||
from .utils.option_link import OptionLink
|
||||
from .utils.page_params import PageParams
|
||||
from .utils.period_choosers import IncomeExpensesPeriodChooser
|
||||
from .utils.report_chooser import ReportChooser
|
||||
from .utils.report_type import ReportType
|
||||
|
||||
|
||||
class Entry:
|
||||
|
@ -28,12 +28,12 @@ from accounting import db
|
||||
from accounting.locale import gettext
|
||||
from accounting.models import Currency, BaseAccount, Account, Transaction, \
|
||||
JournalEntry
|
||||
from accounting.report.option_link import OptionLink
|
||||
from accounting.report.page_params import PageParams
|
||||
from accounting.report.period import Period
|
||||
from accounting.report.period_choosers import IncomeStatementPeriodChooser
|
||||
from accounting.report.report_chooser import ReportChooser
|
||||
from accounting.report.report_type import ReportType
|
||||
from .utils.option_link import OptionLink
|
||||
from .utils.page_params import PageParams
|
||||
from .utils.period_choosers import IncomeStatementPeriodChooser
|
||||
from .utils.report_chooser import ReportChooser
|
||||
from .utils.report_type import ReportType
|
||||
|
||||
|
||||
class IncomeStatementAccount:
|
||||
|
@ -28,12 +28,12 @@ from flask import render_template, Response
|
||||
from accounting import db
|
||||
from accounting.locale import gettext
|
||||
from accounting.models import Currency, Account, Transaction, JournalEntry
|
||||
from accounting.report.page_params import PageParams
|
||||
from accounting.report.period import Period
|
||||
from accounting.report.period_choosers import JournalPeriodChooser
|
||||
from accounting.report.report_chooser import ReportChooser
|
||||
from accounting.report.report_type import ReportType
|
||||
from accounting.utils.pagination import Pagination
|
||||
from .utils.page_params import PageParams
|
||||
from .utils.period_choosers import JournalPeriodChooser
|
||||
from .utils.report_chooser import ReportChooser
|
||||
from .utils.report_type import ReportType
|
||||
|
||||
|
||||
class Entry:
|
||||
|
@ -28,13 +28,13 @@ from flask import url_for, render_template, Response
|
||||
from accounting import db
|
||||
from accounting.locale import gettext
|
||||
from accounting.models import Currency, Account, Transaction, JournalEntry
|
||||
from accounting.report.option_link import OptionLink
|
||||
from accounting.report.page_params import PageParams
|
||||
from accounting.report.period import Period
|
||||
from accounting.report.period_choosers import LedgerPeriodChooser
|
||||
from accounting.report.report_chooser import ReportChooser
|
||||
from accounting.report.report_type import ReportType
|
||||
from accounting.utils.pagination import Pagination
|
||||
from .utils.option_link import OptionLink
|
||||
from .utils.page_params import PageParams
|
||||
from .utils.period_choosers import LedgerPeriodChooser
|
||||
from .utils.report_chooser import ReportChooser
|
||||
from .utils.report_type import ReportType
|
||||
|
||||
|
||||
class Entry:
|
||||
|
@ -27,12 +27,12 @@ from flask import url_for, Response, render_template
|
||||
from accounting import db
|
||||
from accounting.locale import gettext
|
||||
from accounting.models import Currency, Account, Transaction, JournalEntry
|
||||
from accounting.report.option_link import OptionLink
|
||||
from accounting.report.page_params import PageParams
|
||||
from accounting.report.period import Period
|
||||
from accounting.report.period_choosers import TrialBalancePeriodChooser
|
||||
from accounting.report.report_chooser import ReportChooser
|
||||
from accounting.report.report_type import ReportType
|
||||
from .utils.option_link import OptionLink
|
||||
from .utils.page_params import PageParams
|
||||
from .utils.period_choosers import TrialBalancePeriodChooser
|
||||
from .utils.report_chooser import ReportChooser
|
||||
from .utils.report_type import ReportType
|
||||
|
||||
|
||||
class TrialBalanceAccount:
|
||||
|
19
src/accounting/report/reports/utils/__init__.py
Normal file
19
src/accounting/report/reports/utils/__init__.py
Normal file
@ -0,0 +1,19 @@
|
||||
# The Mia! Accounting Flask Project.
|
||||
# Author: imacat@mail.imacat.idv.tw (imacat), 2023/3/7
|
||||
|
||||
# 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 utilities to generate reports.
|
||||
|
||||
"""
|
34
src/accounting/report/reports/utils/option_link.py
Normal file
34
src/accounting/report/reports/utils/option_link.py
Normal file
@ -0,0 +1,34 @@
|
||||
# The Mia! Accounting Flask Project.
|
||||
# Author: imacat@mail.imacat.idv.tw (imacat), 2023/3/5
|
||||
|
||||
# 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 option link.
|
||||
|
||||
"""
|
||||
|
||||
|
||||
class OptionLink:
|
||||
"""An option link."""
|
||||
|
||||
def __init__(self, title: str, url: str, is_active: bool):
|
||||
"""Constructs an option link.
|
||||
|
||||
:param title: The title.
|
||||
:param url: The URI.
|
||||
:param is_active: True if active, or False otherwise
|
||||
"""
|
||||
self.title: str = title
|
||||
self.url: str = url
|
||||
self.is_active: bool = is_active
|
68
src/accounting/report/reports/utils/page_params.py
Normal file
68
src/accounting/report/reports/utils/page_params.py
Normal file
@ -0,0 +1,68 @@
|
||||
# The Mia! Accounting Flask Project.
|
||||
# Author: imacat@mail.imacat.idv.tw (imacat), 2023/3/6
|
||||
|
||||
# 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 page parameters of a report.
|
||||
|
||||
"""
|
||||
import typing as t
|
||||
from abc import ABC, abstractmethod
|
||||
from urllib.parse import urlparse, ParseResult, parse_qsl, urlencode, \
|
||||
urlunparse
|
||||
|
||||
from flask import request
|
||||
|
||||
from accounting.utils.txn_types import TransactionType
|
||||
from .report_chooser import ReportChooser
|
||||
|
||||
|
||||
class PageParams(ABC):
|
||||
"""The page parameters of a report."""
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def has_data(self) -> bool:
|
||||
"""Returns whether there is any data on the page.
|
||||
|
||||
:return: True if there is any data, or False otherwise.
|
||||
"""
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def report_chooser(self) -> ReportChooser:
|
||||
"""Returns the report chooser.
|
||||
|
||||
:return: The report chooser.
|
||||
"""
|
||||
|
||||
@property
|
||||
def txn_types(self) -> t.Type[TransactionType]:
|
||||
"""Returns the transaction types.
|
||||
|
||||
:return: The transaction types.
|
||||
"""
|
||||
return TransactionType
|
||||
|
||||
@property
|
||||
def csv_uri(self) -> str:
|
||||
uri: str = request.full_path if request.query_string \
|
||||
else request.path
|
||||
uri_p: ParseResult = urlparse(uri)
|
||||
params: list[tuple[str, str]] = parse_qsl(uri_p.query)
|
||||
params = [x for x in params if x[0] != "as"]
|
||||
params.append(("as", "csv"))
|
||||
parts: list[str] = list(uri_p)
|
||||
parts[4] = urlencode(params)
|
||||
return urlunparse(parts)
|
219
src/accounting/report/reports/utils/period_choosers.py
Normal file
219
src/accounting/report/reports/utils/period_choosers.py
Normal file
@ -0,0 +1,219 @@
|
||||
# The Mia! Accounting Flask Project.
|
||||
# Author: imacat@mail.imacat.idv.tw (imacat), 2023/3/4
|
||||
|
||||
# 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 period choosers.
|
||||
|
||||
This file is largely taken from the NanoParma ERP project, first written in
|
||||
2021/9/16 by imacat (imacat@nanoparma.com).
|
||||
|
||||
"""
|
||||
import typing as t
|
||||
from abc import ABC, abstractmethod
|
||||
from datetime import date
|
||||
|
||||
from flask import url_for
|
||||
|
||||
from accounting.models import Currency, Account, Transaction
|
||||
from accounting.report.period import YearPeriod, Period, ThisMonth, \
|
||||
LastMonth, SinceLastMonth, ThisYear, LastYear, Today, Yesterday, \
|
||||
TemplatePeriod
|
||||
|
||||
|
||||
class PeriodChooser(ABC):
|
||||
"""The period chooser."""
|
||||
|
||||
def __init__(self, start: date | None):
|
||||
"""Constructs a period chooser.
|
||||
|
||||
:param start: The start of the period.
|
||||
"""
|
||||
|
||||
# Shortcut periods
|
||||
self.this_month_url: str = self._url_for(ThisMonth())
|
||||
"""The URL for this month."""
|
||||
self.last_month_url: str = self._url_for(LastMonth())
|
||||
"""The URL for last month."""
|
||||
self.since_last_month_url: str = self._url_for(SinceLastMonth())
|
||||
"""The URL since last mint."""
|
||||
self.this_year_url: str = self._url_for(ThisYear())
|
||||
"""The URL for this year."""
|
||||
self.last_year_url: str = self._url_for(LastYear())
|
||||
"""The URL for last year."""
|
||||
self.today_url: str = self._url_for(Today())
|
||||
"""The URL for today."""
|
||||
self.yesterday_url: str = self._url_for(Yesterday())
|
||||
"""The URL for yesterday."""
|
||||
self.all_url: str = self._url_for(Period(None, None))
|
||||
"""The URL for all period."""
|
||||
self.url_template: str = self._url_for(TemplatePeriod())
|
||||
"""The URL template."""
|
||||
|
||||
# Attributes
|
||||
self.data_start: date | None = start
|
||||
"""The start of the data."""
|
||||
self.has_data: bool = start is not None
|
||||
"""Whether there is any data."""
|
||||
self.has_last_month: bool = False
|
||||
"""Where there is data in last month."""
|
||||
self.has_last_year: bool = False
|
||||
"""Whether there is data in last year."""
|
||||
self.has_yesterday: bool = False
|
||||
"""Whether there is data in yesterday."""
|
||||
self.available_years: t.Iterator[int] = []
|
||||
"""The available years."""
|
||||
|
||||
if self.has_data is not None:
|
||||
today: date = date.today()
|
||||
self.has_last_month = start < date(today.year, today.month, 1)
|
||||
self.has_last_year = start.year < today.year
|
||||
self.has_yesterday = start < today
|
||||
self.available_years: t.Iterator[int] = []
|
||||
if start.year < today.year - 1:
|
||||
self.available_years \
|
||||
= reversed(range(start.year, today.year - 1))
|
||||
|
||||
@abstractmethod
|
||||
def _url_for(self, period: Period) -> str:
|
||||
"""Returns the URL for a period.
|
||||
|
||||
:param period: The period.
|
||||
:return: The URL for the period.
|
||||
"""
|
||||
pass
|
||||
|
||||
def year_url(self, year: int) -> str:
|
||||
"""Returns the period URL of a year.
|
||||
|
||||
:param year: The year
|
||||
:return: The period URL of the year.
|
||||
"""
|
||||
return self._url_for(YearPeriod(year))
|
||||
|
||||
|
||||
class JournalPeriodChooser(PeriodChooser):
|
||||
"""The journal period chooser."""
|
||||
|
||||
def __init__(self):
|
||||
"""Constructs the journal period chooser."""
|
||||
first: Transaction | None \
|
||||
= Transaction.query.order_by(Transaction.date).first()
|
||||
super().__init__(None if first is None else first.date)
|
||||
|
||||
def _url_for(self, period: Period) -> str:
|
||||
if period.is_default:
|
||||
return url_for("accounting.report.journal-default")
|
||||
return url_for("accounting.report.journal", period=period)
|
||||
|
||||
|
||||
class LedgerPeriodChooser(PeriodChooser):
|
||||
"""The ledger period chooser."""
|
||||
|
||||
def __init__(self, currency: Currency, account: Account):
|
||||
"""Constructs the ledger period chooser."""
|
||||
self.currency: Currency = currency
|
||||
"""The currency."""
|
||||
self.account: Account = account
|
||||
"""The account."""
|
||||
first: Transaction | None \
|
||||
= Transaction.query.order_by(Transaction.date).first()
|
||||
super().__init__(None if first is None else first.date)
|
||||
|
||||
def _url_for(self, period: Period) -> str:
|
||||
if period.is_default:
|
||||
return url_for("accounting.report.ledger-default",
|
||||
currency=self.currency, account=self.account)
|
||||
return url_for("accounting.report.ledger",
|
||||
currency=self.currency, account=self.account,
|
||||
period=period)
|
||||
|
||||
|
||||
class IncomeExpensesPeriodChooser(PeriodChooser):
|
||||
"""The income and expenses period chooser."""
|
||||
|
||||
def __init__(self, currency: Currency, account: Account):
|
||||
"""Constructs the income and expenses period chooser."""
|
||||
self.currency: Currency = currency
|
||||
"""The currency."""
|
||||
self.account: Account = account
|
||||
"""The account."""
|
||||
first: Transaction | None \
|
||||
= Transaction.query.order_by(Transaction.date).first()
|
||||
super().__init__(None if first is None else first.date)
|
||||
|
||||
def _url_for(self, period: Period) -> str:
|
||||
if period.is_default:
|
||||
return url_for("accounting.report.income-expenses-default",
|
||||
currency=self.currency, account=self.account)
|
||||
return url_for("accounting.report.income-expenses",
|
||||
currency=self.currency, account=self.account,
|
||||
period=period)
|
||||
|
||||
|
||||
class TrialBalancePeriodChooser(PeriodChooser):
|
||||
"""The trial balance period chooser."""
|
||||
|
||||
def __init__(self, currency: Currency):
|
||||
"""Constructs the trial balance period chooser."""
|
||||
self.currency: Currency = currency
|
||||
"""The currency."""
|
||||
first: Transaction | None \
|
||||
= Transaction.query.order_by(Transaction.date).first()
|
||||
super().__init__(None if first is None else first.date)
|
||||
|
||||
def _url_for(self, period: Period) -> str:
|
||||
if period.is_default:
|
||||
return url_for("accounting.report.trial-balance-default",
|
||||
currency=self.currency)
|
||||
return url_for("accounting.report.trial-balance",
|
||||
currency=self.currency, period=period)
|
||||
|
||||
|
||||
class IncomeStatementPeriodChooser(PeriodChooser):
|
||||
"""The income statement period chooser."""
|
||||
|
||||
def __init__(self, currency: Currency):
|
||||
"""Constructs the income statement period chooser."""
|
||||
self.currency: Currency = currency
|
||||
"""The currency."""
|
||||
first: Transaction | None \
|
||||
= Transaction.query.order_by(Transaction.date).first()
|
||||
super().__init__(None if first is None else first.date)
|
||||
|
||||
def _url_for(self, period: Period) -> str:
|
||||
if period.is_default:
|
||||
return url_for("accounting.report.income-statement-default",
|
||||
currency=self.currency)
|
||||
return url_for("accounting.report.income-statement",
|
||||
currency=self.currency, period=period)
|
||||
|
||||
|
||||
class BalanceSheetPeriodChooser(PeriodChooser):
|
||||
"""The balance sheet period chooser."""
|
||||
|
||||
def __init__(self, currency: Currency):
|
||||
"""Constructs the balance sheet period chooser."""
|
||||
self.currency: Currency = currency
|
||||
"""The currency."""
|
||||
first: Transaction | None \
|
||||
= Transaction.query.order_by(Transaction.date).first()
|
||||
super().__init__(None if first is None else first.date)
|
||||
|
||||
def _url_for(self, period: Period) -> str:
|
||||
if period.is_default:
|
||||
return url_for("accounting.report.balance-sheet-default",
|
||||
currency=self.currency)
|
||||
return url_for("accounting.report.balance-sheet",
|
||||
currency=self.currency, period=period)
|
170
src/accounting/report/reports/utils/report_chooser.py
Normal file
170
src/accounting/report/reports/utils/report_chooser.py
Normal file
@ -0,0 +1,170 @@
|
||||
# The Mia! Accounting Flask Project.
|
||||
# Author: imacat@mail.imacat.idv.tw (imacat), 2023/3/4
|
||||
|
||||
# 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 report chooser.
|
||||
|
||||
This file is largely taken from the NanoParma ERP project, first written in
|
||||
2021/9/16 by imacat (imacat@nanoparma.com).
|
||||
|
||||
"""
|
||||
import re
|
||||
import typing as t
|
||||
|
||||
from flask import url_for
|
||||
from flask_babel import LazyString
|
||||
|
||||
from accounting import db
|
||||
from accounting.locale import gettext
|
||||
from accounting.models import Currency, Account
|
||||
from accounting.report.period import Period
|
||||
from accounting.template_globals import default_currency_code
|
||||
from .option_link import OptionLink
|
||||
from .report_type import ReportType
|
||||
|
||||
|
||||
class ReportChooser:
|
||||
"""The report chooser."""
|
||||
|
||||
def __init__(self, active_report: ReportType,
|
||||
period: Period | None = None,
|
||||
currency: Currency | None = None,
|
||||
account: Account | None = None):
|
||||
"""Constructs the report chooser.
|
||||
|
||||
:param active_report: The active report.
|
||||
:param period: The period.
|
||||
:param currency: The currency.
|
||||
:param account: The account.
|
||||
"""
|
||||
self.__active_report: ReportType = active_report
|
||||
"""The currently active report."""
|
||||
self.__period: Period = Period.get_instance() if period is None \
|
||||
else period
|
||||
"""The period."""
|
||||
self.__currency: Currency = db.session.get(
|
||||
Currency, default_currency_code()) \
|
||||
if currency is None else currency
|
||||
"""The currency."""
|
||||
self.__account: Account = Account.find_by_code("1111-001") \
|
||||
if account is None else account
|
||||
"""The currency."""
|
||||
self.__reports: list[OptionLink] = []
|
||||
"""The links to the reports."""
|
||||
self.current_report: str | LazyString = ""
|
||||
"""The title of the current report."""
|
||||
self.__reports.append(self.__journal)
|
||||
self.__reports.append(self.__ledger)
|
||||
self.__reports.append(self.__income_expenses)
|
||||
self.__reports.append(self.__trial_balance)
|
||||
self.__reports.append(self.__income_statement)
|
||||
self.__reports.append(self.__balance_sheet)
|
||||
for report in self.__reports:
|
||||
if report.is_active:
|
||||
self.current_report = report.title
|
||||
|
||||
@property
|
||||
def __journal(self) -> OptionLink:
|
||||
"""Returns the journal.
|
||||
|
||||
:return: The journal.
|
||||
"""
|
||||
url: str = url_for("accounting.report.journal-default") \
|
||||
if self.__period.is_default \
|
||||
else url_for("accounting.report.journal", period=self.__period)
|
||||
return OptionLink(gettext("Journal"), url,
|
||||
self.__active_report == ReportType.JOURNAL)
|
||||
|
||||
@property
|
||||
def __ledger(self) -> OptionLink:
|
||||
"""Returns the ledger.
|
||||
|
||||
:return: The ledger.
|
||||
"""
|
||||
url: str = url_for("accounting.report.ledger-default",
|
||||
currency=self.__currency, account=self.__account) \
|
||||
if self.__period.is_default \
|
||||
else url_for("accounting.report.ledger",
|
||||
currency=self.__currency, account=self.__account,
|
||||
period=self.__period)
|
||||
return OptionLink(gettext("Ledger"), url,
|
||||
self.__active_report == ReportType.LEDGER)
|
||||
|
||||
@property
|
||||
def __income_expenses(self) -> OptionLink:
|
||||
"""Returns the income and expenses.
|
||||
|
||||
:return: The income and expenses.
|
||||
"""
|
||||
account: Account = self.__account
|
||||
if not re.match(r"[12][12]", account.base_code):
|
||||
account: Account = Account.find_by_code("1111-001")
|
||||
url: str = url_for("accounting.report.income-expenses-default",
|
||||
currency=self.__currency, account=account) \
|
||||
if self.__period.is_default \
|
||||
else url_for("accounting.report.income-expenses",
|
||||
currency=self.__currency, account=account,
|
||||
period=self.__period)
|
||||
return OptionLink(gettext("Income and Expenses"), url,
|
||||
self.__active_report == ReportType.INCOME_EXPENSES)
|
||||
|
||||
@property
|
||||
def __trial_balance(self) -> OptionLink:
|
||||
"""Returns the trial balance.
|
||||
|
||||
:return: The trial balance.
|
||||
"""
|
||||
url: str = url_for("accounting.report.trial-balance-default",
|
||||
currency=self.__currency) \
|
||||
if self.__period.is_default \
|
||||
else url_for("accounting.report.trial-balance",
|
||||
currency=self.__currency, period=self.__period)
|
||||
return OptionLink(gettext("Trial Balance"), url,
|
||||
self.__active_report == ReportType.TRIAL_BALANCE)
|
||||
|
||||
@property
|
||||
def __income_statement(self) -> OptionLink:
|
||||
"""Returns the income statement.
|
||||
|
||||
:return: The income statement.
|
||||
"""
|
||||
url: str = url_for("accounting.report.income-statement-default",
|
||||
currency=self.__currency) \
|
||||
if self.__period.is_default \
|
||||
else url_for("accounting.report.income-statement",
|
||||
currency=self.__currency, period=self.__period)
|
||||
return OptionLink(gettext("Income Statement"), url,
|
||||
self.__active_report == ReportType.INCOME_STATEMENT)
|
||||
|
||||
@property
|
||||
def __balance_sheet(self) -> OptionLink:
|
||||
"""Returns the balance sheet.
|
||||
|
||||
:return: The balance sheet.
|
||||
"""
|
||||
url: str = url_for("accounting.report.balance-sheet-default",
|
||||
currency=self.__currency) \
|
||||
if self.__period.is_default \
|
||||
else url_for("accounting.report.balance-sheet",
|
||||
currency=self.__currency, period=self.__period)
|
||||
return OptionLink(gettext("Balance Sheet"), url,
|
||||
self.__active_report == ReportType.BALANCE_SHEET)
|
||||
|
||||
def __iter__(self) -> t.Iterator[OptionLink]:
|
||||
"""Returns the iteration of the reports.
|
||||
|
||||
:return: The iteration of the reports.
|
||||
"""
|
||||
return iter(self.__reports)
|
36
src/accounting/report/reports/utils/report_type.py
Normal file
36
src/accounting/report/reports/utils/report_type.py
Normal file
@ -0,0 +1,36 @@
|
||||
# The Mia! Accounting Flask Project.
|
||||
# Author: imacat@mail.imacat.idv.tw (imacat), 2023/3/4
|
||||
|
||||
# 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 report types.
|
||||
|
||||
"""
|
||||
from enum import Enum
|
||||
|
||||
|
||||
class ReportType(Enum):
|
||||
"""The report types."""
|
||||
JOURNAL: str = "journal"
|
||||
"""The journal."""
|
||||
LEDGER: str = "ledger"
|
||||
"""The ledger."""
|
||||
INCOME_EXPENSES: str = "income-expenses"
|
||||
"""The income and expenses."""
|
||||
TRIAL_BALANCE: str = "trial-balance"
|
||||
"""The trial balance."""
|
||||
INCOME_STATEMENT: str = "income-statement"
|
||||
"""The income statement."""
|
||||
BALANCE_SHEET: str = "balance-sheet"
|
||||
"""The balance sheet."""
|
Reference in New Issue
Block a user