dodil/erp-brick-tax
DODIL ERP brick: tax
src/brick_tax/domain/settings_book.py
"""The settings as dated rows (module.yaml config_rows → tax_settings). The value on a date is the latest row that
started on or before it; a stored null, or no row at all, is the default. A first row for a key carries any date; every
later one starts after today (domain/schedule.py)."""
from dataclasses import dataclass
from datetime import date
from typing import Any, Iterable
from brick_tax.domain.values import SETTINGS, Settings, decode_value
@dataclass
class SettingRow:
setting_key: str
valid_from: date
value: Any = None # decoded
set_by: str = ""
def value_at(rows: Iterable[SettingRow], key: str, on: date) -> Any:
found = [r for r in rows if r.setting_key == key and r.valid_from <= on]
return max(found, key=lambda r: r.valid_from).value if found else None
def at(rows: Iterable[SettingRow], on: date) -> Settings:
rows = list(rows)
return Settings.from_values({k: value_at(rows, k, on) for k in SETTINGS})
def from_stored(setting_key: str, valid_from: date, raw, set_by: str) -> SettingRow:
return SettingRow(setting_key, valid_from, decode_value(raw), set_by)