Source code for cadrumo.application.modelo.art20_advisory
"""Generic verification mechanics for registry-selected Art.20 declarations."""from__future__importannotationsfromcollections.abcimportMappingfromdecimalimportDecimalfrom...core.casilla_idimportCasillaIdfrom...domain.calculations.registry.facts.resolutionimportMappingFactQuery,ResolvedMappingFactfrom...domain.calculations.registry.schema_baseimportDateAxisfrom...domain.modelos.errorsimportModeloErrorfrom...domain.modelos.modelo_fact_contextimportModeloFactResolutionContextfrom...domain.modelos.verification_reportimport(ModeloVerificationFinding,ModeloVerificationFindingKind,ModeloVerificationFindingSeverity,)from.semantic_role_resolutionimportAmbiguousSemanticRoleCasillaError,casilla_id_for_unique_revision_semantic_role__all__=["art20_reduccion_advisory_finding"]_ART20_RNT_ROLE="irpf_rendimiento_trabajo_rendimiento_neto"_ART20_REDUCCION_ROLE="irpf_rendimiento_trabajo_reduccion_gastos_generales"_ART20_RNT_CEILING_FACT_ID="lirpf-art-20-trabajo-reduccion-rnt-ceiling"# Registry authority: selected Art.20 verification declarations are consumed through the dated mapping factdef_registry_art20_declaration(revision:object,*,context:ModeloFactResolutionContext,)->ResolvedMappingFact:"""Resolve the selected M100 surface and dated Art.20 mapping fact."""authority=context.authorityeffective_date=context.filing_periodresolved=authority.resolve_governed_fact(MappingFactQuery(fact_id="lirpf-art-20-reduction-verification-mapping",date_axis=DateAxis.FILING_PERIOD,effective_date=effective_date,),)ifnotisinstance(resolved,ResolvedMappingFact):raiseTypeError("selected Art.20 declaration must resolve as a mapping fact")delrevisionreturnresolved
[docs]defart20_reduccion_advisory_finding(revision:object,casilla_values:Mapping[CasillaId,Decimal],*,context:ModeloFactResolutionContext,)->ModeloVerificationFinding|None:"""Warn when in-band trabajo income has no general reduction declaration."""try:rnt_id=casilla_id_for_unique_revision_semantic_role(revision,_ART20_RNT_ROLE)reduccion_id=casilla_id_for_unique_revision_semantic_role(revision,_ART20_REDUCCION_ROLE)exceptAmbiguousSemanticRoleCasillaErrorasexc:raiseModeloError(str(exc),context=exc.ambiguity.context())fromexcifrnt_idisNoneorreduccion_idisNone:returnNonernt_value=casilla_values.get(rnt_id,Decimal(0))reduccion_value=casilla_values.get(reduccion_id,Decimal(0))resolved_ceiling=context.resolved_decimal(_ART20_RNT_CEILING_FACT_ID)ceiling=resolved_ceiling.payload.valueifnotisinstance(ceiling,Decimal):raiseModeloError("Art. 20 RNT ceiling fact must resolve to a Decimal")ifnot(Decimal(0)<rnt_value<ceilingandreduccion_value==Decimal(0)):returnNone_registry_art20_declaration(revision,context=context)returnModeloVerificationFinding(kind=ModeloVerificationFindingKind.ADVISORY,severity=ModeloVerificationFindingSeverity.WARNING,casilla_id=reduccion_id,message_locale_key="application.modelo.findings.art20_reduccion_possible",message_facts={"rnt_id":rnt_id,"rnt_value":rnt_value,"reduccion_id":reduccion_id,},legal_refs=resolved_ceiling.legal_refs,source_refs=resolved_ceiling.source_refs,)