Source code for aeat.domain.calculations.registry._temporal
"""Temporal selection for registry-backed modelo revisions.Selects exactly one :class:`ModeloRevision` from a :class:`ModeloDefinition`given a filing year, period, and optional date constraint."""from__future__importannotationsfromdatetimeimportdatefrom._errorsimportAmbiguousRevisionSelectionError,NoRevisionForPeriodErrorfrom._period_selector_matchimportselector_token_for_requestfrom._schemaimportModeloDefinition,ModeloRevision
[docs]defselect_revision(modelo:ModeloDefinition,*,filing_year:int,period:str,on:date|None=None,revision_id:str|None=None,)->ModeloRevision:"""Select exactly one :class:`ModeloRevision` for a filing period. Args: modelo: The :class:`ModeloDefinition` to select a revision from. filing_year: AEAT filing year used to narrow revisions by ``period_selector``. period: Period token (e.g. ``"1T"``, ``"0A"``, ``"ALTA"``); case-insensitive against the revision's declared periods. on: Optional reference date that must fall within the revision's ``valid_from`` / ``valid_to`` window. revision_id: Optional explicit revision id; restricts candidates to the matching revision when supplied. """candidates=[]forrevisioninmodelo.revisions.values():ifrevision_idisnotNoneandrevision.id!=revision_id:continueifnotrevision.period_selector.includes_year(filing_year):continue# Case-insensitive comparison is intentional: _resolve_period() in the# declaracion parser calls .upper() on every period string before it# reaches the registry, producing "ALTA"/"MODIFICACION"/"BAJA" for M036# whose canonical registry periods are lowercase. All other period# literal formats are case-invariant, and the shared matcher also lets# symbolic EVENT-N selectors cover concrete EVENT-1/EVENT-2 operator# scopes. Downstream consumers receive the caller-supplied period (the# RegistrySnapshot stores it verbatim), not the registry's canonical# form, so no case-sensitive downstream regression is possible from# this comparison.ifselector_token_for_request(revision.period_selector.periods,period)isNone:continueifonisnotNoneand(revision.valid_from>onor(revision.valid_toisnotNoneandrevision.valid_to<on)):continuecandidates.append(revision)ifnotcandidates:raiseNoRevisionForPeriodError(modelo_id=modelo.id,filing_year=filing_year,period=period,revision_id=revision_id,)iflen(candidates)>1:raiseAmbiguousRevisionSelectionError(modelo_id=modelo.id,candidate_ids=tuple(revision.idforrevisionincandidates),)returncandidates[0]