Source code for cadrumo.domain.calculations.registry.m303_prorrata_activity_projection
"""Projection from canonical M303 prorrata rows to official endpoints.The five ``DP30305`` activity rows are durable children of the encrypted``ProrrataRegister``. This registry-side module reads the revision's reviewedendpoint declarations and projects those row facts into their five fixedofficial slots. It neither introduces an independent scalar input channel norrenders a withdrawn export layout."""from__future__importannotationsfromdecimalimportDecimalfrompydanticimportBaseModel,Fieldfrom....core.filing_projection_refimport(M303ProrrataActivityProjectionField,M303ProrrataActivityProjectionRef,)from....core.modelsimportSTRICT_FROZEN_CONFIGfrom...prorrata_register.registerimportProrrataActivityRow,ProrrataRegisterfrom.errorsimportRegistryValidationError_FIELDS=frozenset(M303ProrrataActivityProjectionField)
[docs]classM303ProrrataActivityEndpointValue(BaseModel):"""One official endpoint paired with the value projected from its row child."""model_config=STRICT_FROZEN_CONFIGprojection_ref:M303ProrrataActivityProjectionRefvalue:str|Decimal
[docs]classM303ProrrataActivityRowProjection(BaseModel):"""The five reviewed official endpoint values for one persisted row slot."""model_config=STRICT_FROZEN_CONFIGslot:int=Field(ge=1,le=5)endpoints:tuple[M303ProrrataActivityEndpointValue,...]=Field(min_length=5,max_length=5)
[docs]defproject_m303_prorrata_activity_rows(*,projection_refs:tuple[M303ProrrataActivityProjectionRef,...],register:ProrrataRegister,ejercicio:int,)->tuple[M303ProrrataActivityRowProjection,...]:"""Project an applicable register's five row children into a revision's endpoints. The registry determines which official box belongs to which fixed row slot; the register determines the values. An inactive prorrata year has no row projection. An active year whose canonical collection is incomplete fails rather than yielding blank or zero endpoint values. """ifnotregister.requires_activity_rows_for(ejercicio):ifprojection_refs:_validate_projection_refs(projection_refs)return()ifnotregister.activity_rows_complete_for(ejercicio):raiseRegistryValidationError.for_prorrata_activity_rows_incomplete(ejercicio=ejercicio)refs=_validate_projection_refs(projection_refs)returntuple(_project_row(row,refs=refs[row.slot])forrowinregister.activity_rows_for_ejercicio(ejercicio))
def_validate_projection_refs(refs:tuple[M303ProrrataActivityProjectionRef,...],)->dict[int,dict[M303ProrrataActivityProjectionField,M303ProrrataActivityProjectionRef]]:resolved:dict[int,dict[M303ProrrataActivityProjectionField,M303ProrrataActivityProjectionRef]]={}casilla_ids=tuple(ref.casilla_idforrefinrefs)iflen(set(casilla_ids))!=len(casilla_ids):raiseRegistryValidationError("m303 prorrata projection references duplicate endpoint casillas")forrefinrefs:by_field=resolved.setdefault(ref.slot,{})ifref.fieldinby_field:raiseRegistryValidationError(f"m303 prorrata projection has duplicate reference for slot {ref.slot} field {ref.field.value!r}",)by_field[ref.field]=refexpected={slot:set(_FIELDS)forslotinrange(1,6)}actual={slot:set(by_field)forslot,by_fieldinresolved.items()}ifactual!=expected:raiseRegistryValidationError("m303 prorrata projection endpoint matrix is incomplete or malformed: "f"expected {expected!r}, got {actual!r}",)returnresolveddef_project_row(row:ProrrataActivityRow,*,refs:dict[M303ProrrataActivityProjectionField,M303ProrrataActivityProjectionRef],)->M303ProrrataActivityRowProjection:"""Pair one canonical row's typed values with its revision-selected endpoints."""values:dict[M303ProrrataActivityProjectionField,str|Decimal]={M303ProrrataActivityProjectionField.CNAE:row.cnae_code,M303ProrrataActivityProjectionField.OPERACIONES_TOTAL:row.operaciones_total,M303ProrrataActivityProjectionField.OPERACIONES_CON_DERECHO:row.operaciones_con_derecho,M303ProrrataActivityProjectionField.TIPO:row.prorrata_type.value,M303ProrrataActivityProjectionField.PORCENTAJE:row.percentage,}returnM303ProrrataActivityRowProjection(slot=row.slot,endpoints=tuple(M303ProrrataActivityEndpointValue(projection_ref=refs[field],value=values[field])forfieldinM303ProrrataActivityProjectionField),)__all__=["M303ProrrataActivityEndpointValue","M303ProrrataActivityRowProjection","project_m303_prorrata_activity_rows",]