expenseAllocation: Date-limit the transactions we work on.
This prevents the plugin from giving meaning to postings that might not really be there.
This commit is contained in:
parent
910b95c942
commit
16c47c64b2
3 changed files with 43 additions and 1 deletions
|
@ -14,10 +14,31 @@
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# 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/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
|
||||||
from . import errors as errormod
|
from . import errors as errormod
|
||||||
|
|
||||||
|
DEFAULT_START_DATE = datetime.date(2020, 3, 1)
|
||||||
|
DEFAULT_STOP_DATE = datetime.date(datetime.MAXYEAR, 1, 1)
|
||||||
|
|
||||||
|
class _GenericRange:
|
||||||
|
def __init__(self, start, stop):
|
||||||
|
self.start = start
|
||||||
|
self.stop = stop
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "{clsname}({self.start!r}, {self.stop!r})".format(
|
||||||
|
clsname=type(self).__name__,
|
||||||
|
self=self,
|
||||||
|
)
|
||||||
|
|
||||||
|
def __contains__(self, item):
|
||||||
|
return self.start <= item < self.stop
|
||||||
|
|
||||||
|
|
||||||
class PostingChecker:
|
class PostingChecker:
|
||||||
ACCOUNTS = ('',)
|
ACCOUNTS = ('',)
|
||||||
|
TXN_DATE_RANGE = _GenericRange(DEFAULT_START_DATE, DEFAULT_STOP_DATE)
|
||||||
VALUES_ENUM = {}
|
VALUES_ENUM = {}
|
||||||
|
|
||||||
def _meta_get(self, txn, post, key, default=None):
|
def _meta_get(self, txn, post, key, default=None):
|
||||||
|
@ -35,7 +56,7 @@ class PostingChecker:
|
||||||
raise errormod.InvalidMetadataError(txn, post, self.METADATA_KEY)
|
raise errormod.InvalidMetadataError(txn, post, self.METADATA_KEY)
|
||||||
|
|
||||||
def _should_check(self, txn, post):
|
def _should_check(self, txn, post):
|
||||||
ok = True
|
ok = txn.date in self.TXN_DATE_RANGE
|
||||||
if isinstance(self.ACCOUNTS, tuple):
|
if isinstance(self.ACCOUNTS, tuple):
|
||||||
ok = ok and post.account.startswith(self.ACCOUNTS)
|
ok = ok and post.account.startswith(self.ACCOUNTS)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -109,3 +109,21 @@ def test_default_values(account, set_value):
|
||||||
errors = checker.check(txn, txn.postings[-1])
|
errors = checker.check(txn, txn.postings[-1])
|
||||||
assert not errors
|
assert not errors
|
||||||
assert txn.postings[-1].meta['expenseAllocation'] == set_value
|
assert txn.postings[-1].meta['expenseAllocation'] == set_value
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('date,set_value', [
|
||||||
|
(testutil.EXTREME_FUTURE_DATE, False),
|
||||||
|
(testutil.FUTURE_DATE, True),
|
||||||
|
(testutil.FY_START_DATE, True),
|
||||||
|
(testutil.FY_MID_DATE, True),
|
||||||
|
(testutil.PAST_DATE, False),
|
||||||
|
])
|
||||||
|
def test_default_value_set_in_date_range(date, set_value):
|
||||||
|
txn = testutil.Transaction(date=date, postings=[
|
||||||
|
('Liabilites:CreditCard', -25),
|
||||||
|
('Expenses:General', 25),
|
||||||
|
])
|
||||||
|
checker = meta_expense_allocation.MetaExpenseAllocation()
|
||||||
|
errors = checker.check(txn, txn.postings[-1])
|
||||||
|
assert not errors
|
||||||
|
got_value = (txn.postings[-1].meta or {}).get('expenseAllocation')
|
||||||
|
assert bool(got_value) == bool(set_value)
|
||||||
|
|
|
@ -21,8 +21,11 @@ import beancount.core.data as bc_data
|
||||||
|
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
|
|
||||||
|
EXTREME_FUTURE_DATE = datetime.date(datetime.MAXYEAR, 12, 30)
|
||||||
|
FUTURE_DATE = datetime.date.today() + datetime.timedelta(days=365 * 99)
|
||||||
FY_START_DATE = datetime.date(2020, 3, 1)
|
FY_START_DATE = datetime.date(2020, 3, 1)
|
||||||
FY_MID_DATE = datetime.date(2020, 9, 1)
|
FY_MID_DATE = datetime.date(2020, 9, 1)
|
||||||
|
PAST_DATE = datetime.date(2000, 1, 1)
|
||||||
|
|
||||||
def parse_date(s, fmt='%Y-%m-%d'):
|
def parse_date(s, fmt='%Y-%m-%d'):
|
||||||
return datetime.datetime.strptime(s, fmt).date()
|
return datetime.datetime.strptime(s, fmt).date()
|
||||||
|
|
Loading…
Reference in a new issue