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)