"""Application facades for modelo registry discovery queries.
CLI discovery commands call this module instead of constructing
:class:`RegistryQueryService` or reading the registry authority directly. Each
facade delegates to the central validated authority exposed by
``resources().modelos.authority`` and returns the domain query report unchanged.
The ``*_for_scope`` helpers accept a concrete :class:`~core.Period` and
pass its filing year plus bare registry token into the query service, so
revision selection stays inside the authority-backed registry layer.
"""
from __future__ import annotations
from datetime import date
from ...core import Period, TaxDomain
from ...core.resources import resources
from ...domain.calculations.registry import InputKind, ModeloSupportMatrixReport, RegistryQueryService
def _service() -> RegistryQueryService:
return RegistryQueryService(resources().modelos.authority)
[docs]
def declared_modelo_period_tokens(modelo: str | None) -> tuple[str, ...]:
"""Return every period token declared by any revision of one modelo."""
if not modelo or not modelo.strip():
return ()
definition = resources().modelos.authority.validate_modelo(modelo.strip())
return tuple(
sorted({token for revision in definition.revisions.values() for token in revision.period_selector.periods}),
)
[docs]
def registry_modelo_codes() -> tuple[str, ...]:
"""Return registry-backed modelo codes in authority order."""
return tuple(str(modelo.id) for modelo in _service()._authority.modelos)
[docs]
def registry_support_matrix() -> ModeloSupportMatrixReport:
"""Return the registry-wide per-modelo support/capability matrix.
Every :class:`~domain.calculations.registry.ModeloEntry` is derived
directly from the loaded registry authority (calc-grade, manifest, export
formats, extractor, declared casilla renames, declared deprecation
decisions, and declared AEAT-portal cross-references) — never
hand-maintained.
"""
return _service().support_matrix()
[docs]
def registry_list_modelos(*, year: int | None = None, domain: TaxDomain | None = None):
"""Return the registry modelo list report, optionally filtered by tax family."""
return _service().list_modelos(year=year, domain=domain)
[docs]
def registry_describe_modelo(modelo: str, *, period: str | None = None, as_of: date | None = None):
"""Return the registry modelo description report."""
return _service().describe_modelo(modelo, period=period, as_of=as_of)
[docs]
def registry_describe_modelo_for_scope(modelo: str, *, period: Period, as_of: date | None = None):
"""Return the registry modelo description report for an exact :class:`Period`."""
return _service().describe_modelo_for_scope(
modelo,
filing_year=period.year,
period=period.registry_token,
as_of=as_of,
)
[docs]
def registry_describe_modelo_for_registry_scope(
modelo: str,
*,
filing_year: int,
period: str,
as_of: date | None = None,
):
return _service().describe_modelo_for_scope(
modelo,
filing_year=filing_year,
period=period,
as_of=as_of,
)
[docs]
def registry_casillas(
modelo: str,
*,
period: str | None = None,
as_of: date | None = None,
input_kind: InputKind | None = None,
required: bool | None = None,
form_number: str | None = None,
):
"""Return the registry casilla report."""
return _service().casillas(
modelo,
period=period,
as_of=as_of,
input_kind=input_kind,
required=required,
form_number=form_number,
)
[docs]
def registry_casillas_for_scope(
modelo: str,
*,
period: Period,
as_of: date | None = None,
input_kind: InputKind | None = None,
required: bool | None = None,
form_number: str | None = None,
):
"""Return the registry casilla report for an exact :class:`Period`."""
return _service().casillas_for_scope(
modelo,
filing_year=period.year,
period=period.registry_token,
as_of=as_of,
input_kind=input_kind,
required=required,
form_number=form_number,
)
[docs]
def registry_casillas_for_registry_scope(
modelo: str,
*,
filing_year: int,
period: str,
as_of: date | None = None,
input_kind: InputKind | None = None,
required: bool | None = None,
form_number: str | None = None,
):
return _service().casillas_for_scope(
modelo,
filing_year=filing_year,
period=period,
as_of=as_of,
input_kind=input_kind,
required=required,
form_number=form_number,
)
[docs]
def registry_casilla(
modelo: str,
casilla: str,
*,
period: str | None = None,
as_of: date | None = None,
):
"""Return the single-casilla semantic detail report."""
return _service().casilla(modelo, casilla, period=period, as_of=as_of)
[docs]
def registry_casilla_for_registry_scope(
modelo: str,
casilla: str,
*,
filing_year: int,
period: str,
as_of: date | None = None,
):
return _service().casilla_for_scope(
modelo,
casilla,
filing_year=filing_year,
period=period,
as_of=as_of,
)
[docs]
def registry_bindings(modelo: str, *, period: str | None = None, as_of: date | None = None):
"""Return the registry bindings report for a modelo and optional period."""
return _service().bindings(modelo, period=period, as_of=as_of)
[docs]
def registry_bindings_for_year(modelo: str, *, filing_year: int, as_of: date | None = None):
"""Return the registry bindings report for a filing year."""
return _service().bindings_for_year(modelo, filing_year=filing_year, as_of=as_of)
[docs]
def registry_bindings_for_scope(modelo: str, *, period: Period, as_of: date | None = None):
"""Return the registry bindings report for an exact :class:`Period`."""
return _service().bindings_for_scope(
modelo,
filing_year=period.year,
period=period.registry_token,
as_of=as_of,
)
__all__ = [
"declared_modelo_period_tokens",
"registry_bindings",
"registry_bindings_for_scope",
"registry_bindings_for_year",
"registry_casilla",
"registry_casilla_for_registry_scope",
"registry_casillas",
"registry_casillas_for_registry_scope",
"registry_casillas_for_scope",
"registry_describe_modelo",
"registry_describe_modelo_for_registry_scope",
"registry_describe_modelo_for_scope",
"registry_formulas",
"registry_formulas_for_registry_scope",
"registry_formulas_for_scope",
"registry_list_modelos",
"registry_modelo_codes",
"registry_support_matrix",
]