Source code for cadrumo.domain.contribuyente.family_fact_context
"""Typed governed-fact resolution context for family calculations."""from__future__importannotationsfromdataclassesimportdataclassfromdatetimeimportdatefromdecimalimportDecimalfrom..calculations.registry.errorsimportRegistryValidationErrorfrom..calculations.registry.facts.resolutionimportResolvedScalarFact,ScalarFactQueryfrom..calculations.registry.governed_fact_scopeimportGovernedFactSourcefrom..calculations.registry.schema_baseimportDateAxis_FAMILY_FACT_DATE_AXES:dict[str,DateAxis]={"lirpf-art-58-descendant-ordinary-maximum-age":DateAxis.FILING_PERIOD,"lirpf-art-58-under-three-maximum-age":DateAxis.FILING_PERIOD,"lirpf-art-61-shared-custody-proration-factor":DateAxis.FILING_PERIOD,"lirpf-art-81-adoption-entry-window-years":DateAxis.FILING_PERIOD,"lirpf-art-81-contribution-ceiling-retired-effective-year":DateAxis.FILING_PERIOD,"lirpf-art-81-maternity-post-birth-enrollment-effective-year":DateAxis.FILING_PERIOD,"madrid-birth-adoption-following-periods":DateAxis.FILING_PERIOD,"madrid-nacimiento-adopcion-applicability":DateAxis.FILING_PERIOD,"madrid-nacimiento-adopcion-full-proration-share":DateAxis.FILING_PERIOD,}
[docs]@dataclass(frozen=True,slots=True)classFamilyFactResolutionContext:"""Authority and explicit filing/devengo coordinates for family facts."""authority:GovernedFactSourcefiling_period:datedevengo_date:date
[docs]definteger(self,fact_id:str)->int:"""Resolve an integer-valued family governed fact."""value=self._scalar(fact_id)iftype(value)isnotint:raiseRegistryValidationError(f"family fact {fact_id!r} must resolve to an integer")returnvalue
[docs]defdecimal(self,fact_id:str)->Decimal:"""Resolve a Decimal-valued family governed fact."""value=self._scalar(fact_id)ifnotisinstance(value,Decimal):raiseRegistryValidationError(f"family fact {fact_id!r} must resolve to a Decimal")returnvalue
[docs]defresolved_scalar(self,fact_id:str)->ResolvedScalarFact:"""Resolve a family fact on its declared temporal coordinate. The mapping is deliberately closed: consumers cannot accidentally use the filing coordinate for a fact whose declaration moves to devengo. """try:date_axis=_FAMILY_FACT_DATE_AXES[fact_id]exceptKeyErrorasexc:raiseRegistryValidationError(f"unregistered family governed fact {fact_id!r}")fromexceffective_date=self.filing_periodifdate_axisisDateAxis.FILING_PERIODelseself.devengo_dateresolved=self.authority.resolve_governed_fact(ScalarFactQuery(fact_id=fact_id,date_axis=date_axis,effective_date=effective_date))ifnotisinstance(resolved,ResolvedScalarFact):raiseRegistryValidationError(f"family fact {fact_id!r} must resolve to a scalar")returnresolved
def_scalar(self,fact_id:str)->int|Decimal:resolved=self.resolved_scalar(fact_id)iftype(resolved.payload.value)isnotintandnotisinstance(resolved.payload.value,Decimal):raiseRegistryValidationError(f"family fact {fact_id!r} must resolve to an integer or Decimal")returnresolved.payload.value