Source code for cadrumo.domain.modelos.modelo_fact_context
"""Typed governed-fact resolution context for modelo reduction calculations."""from__future__importannotationsfromdataclassesimportdataclassfromdatetimeimportdatefromdecimalimportDecimalfrom..calculations.registry.errorsimportRegistryValidationErrorfrom..calculations.registry.facts.resolutionimportResolvedScalarFact,ScalarFactQueryfrom..calculations.registry.governed_fact_scopeimportGovernedFactSourcefrom..calculations.registry.schema_baseimportDateAxis_MODELO_FACT_DATE_AXES:dict[str,DateAxis]={"lirpf-art-20-trabajo-reduccion-rnt-ceiling":DateAxis.FILING_PERIOD,"lirpf-art-52-individual-contribution-sublimit":DateAxis.FILING_PERIOD,"lirpf-dt12-rescate-reduction-rate":DateAxis.FILING_PERIOD,"lirpf-dt12-general-window-following-years":DateAxis.FILING_PERIOD,"lirpf-dt12-transitional-contingency-first-year":DateAxis.FILING_PERIOD,"lirpf-dt12-transitional-contingency-last-year":DateAxis.FILING_PERIOD,"lirpf-dt12-transitional-window-following-years":DateAxis.FILING_PERIOD,"lirpf-dt12-cliff-last-year":DateAxis.FILING_PERIOD,"sal-special-reserve-allocation-rate":DateAxis.FILING_PERIOD,"sal-special-reserve-capital-multiple":DateAxis.FILING_PERIOD,}
[docs]@dataclass(frozen=True,slots=True)classModeloFactResolutionContext:"""Authority and explicit filing/devengo coordinates for modelo facts."""authority:GovernedFactSourcefiling_period:datedevengo_date:date
[docs]definteger(self,fact_id:str)->int:"""Resolve an integer-valued modelo governed fact."""value=self._scalar(fact_id)iftype(value)isnotint:raiseRegistryValidationError(f"modelo fact {fact_id!r} must resolve to an integer")returnvalue
[docs]defdecimal(self,fact_id:str)->Decimal:"""Resolve a Decimal-valued modelo governed fact."""value=self.resolved_decimal(fact_id).payload.valueifnotisinstance(value,Decimal):raiseRegistryValidationError(f"modelo fact {fact_id!r} must resolve to a Decimal")returnvalue
[docs]defresolved_decimal(self,fact_id:str)->ResolvedScalarFact:"""Resolve a Decimal modelo fact while preserving its provenance."""resolved=self.resolved_scalar(fact_id)ifnotisinstance(resolved.payload.value,Decimal):raiseRegistryValidationError(f"modelo fact {fact_id!r} must resolve to a Decimal")returnresolved
[docs]defresolved_scalar(self,fact_id:str)->ResolvedScalarFact:"""Resolve a modelo fact on its declared temporal coordinate."""try:date_axis=_MODELO_FACT_DATE_AXES[fact_id]exceptKeyErrorasexc:raiseRegistryValidationError(f"unregistered modelo 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"modelo fact {fact_id!r} must resolve to a scalar")returnresolved
def_scalar(self,fact_id:str)->int|Decimal:resolved=self.resolved_scalar(fact_id)value=resolved.payload.valueiftype(value)isnotintandnotisinstance(value,Decimal):raiseRegistryValidationError(f"modelo fact {fact_id!r} must resolve to an integer or Decimal")returnvalue