# The Mia! Accounting 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 named shortcut periods. """ import datetime as dt from accounting.locale import gettext from .month_end import month_end from .period import Period class ThisMonth(Period): """The period of this month.""" def __init__(self): today: dt.date = dt.date.today() this_month_start: dt.date = dt.date(today.year, today.month, 1) super().__init__(this_month_start, month_end(today)) self.is_default = True self.is_this_month = True def _set_properties(self) -> None: self.spec = "this-month" self.desc = gettext("This Month") self.is_a_month = True self.is_type_month = True class LastMonth(Period): """The period of this month.""" def __init__(self): today: dt.date = dt.date.today() year: int = today.year month: int = today.month - 1 if month < 1: year = year - 1 month = 12 start: dt.date = dt.date(year, month, 1) super().__init__(start, month_end(start)) self.is_last_month = True def _set_properties(self) -> None: self.spec = "last-month" self.desc = gettext("Last Month") self.is_a_month = True self.is_type_month = True class SinceLastMonth(Period): """The period of this month.""" def __init__(self): today: dt.date = dt.date.today() year: int = today.year month: int = today.month - 1 if month < 1: year = year - 1 month = 12 start: dt.date = dt.date(year, month, 1) super().__init__(start, None) self.is_since_last_month = True def _set_properties(self) -> None: self.spec = "since-last-month" self.desc = gettext("Since Last Month") self.is_type_month = True class ThisYear(Period): """The period of this year.""" def __init__(self): year: int = dt.date.today().year start: dt.date = dt.date(year, 1, 1) end: dt.date = dt.date(year, 12, 31) super().__init__(start, end) self.is_this_year = True def _set_properties(self) -> None: self.spec = "this-year" self.desc = gettext("This Year") self.is_a_year = True class LastYear(Period): """The period of last year.""" def __init__(self): year: int = dt.date.today().year start: dt.date = dt.date(year - 1, 1, 1) end: dt.date = dt.date(year - 1, 12, 31) super().__init__(start, end) self.is_last_year = True def _set_properties(self) -> None: self.spec = "last-year" self.desc = gettext("Last Year") self.is_a_year = True class Today(Period): """The period of today.""" def __init__(self): today: dt.date = dt.date.today() super().__init__(today, today) self.is_today = True def _set_properties(self) -> None: self.spec = "today" self.desc = gettext("Today") self.is_a_day = True class Yesterday(Period): """The period of yesterday.""" def __init__(self): yesterday: dt.date = dt.date.today() - dt.timedelta(days=1) super().__init__(yesterday, yesterday) self.is_yesterday = True def _set_properties(self) -> None: self.spec = "yesterday" self.desc = gettext("Yesterday") self.is_a_day = True class AllTime(Period): """The period of all time.""" def __init__(self): super().__init__(None, None) self.is_all = True def _set_properties(self) -> None: self.spec = "all-time" self.desc = gettext("All") class TemplatePeriod(Period): """The period template.""" def __init__(self): super().__init__(None, None) def _set_properties(self) -> None: self.spec = "PERIOD" class YearPeriod(Period): """A year period.""" def __init__(self, year: int): """Constructs a year period. :param year: The year. """ start: dt.date = dt.date(year, 1, 1) end: dt.date = dt.date(year, 12, 31) super().__init__(start, end)