Source code for cadrumo.application.live.expedientes_ports
"""Application-owned capabilities and DTOs for live expedientes reads.The expedientes lifecycle stores an application snapshot and consumes aread-only declaration-register capability. Browser, Sede DTO, and encryptedstorage implementations are composed outside this module and translated atthat boundary."""from__future__importannotationsfromcollections.abcimportCallablefromcontextlibimportAbstractAsyncContextManagerfromdataclassesimportdataclassfromdatetimeimportdatetimefromtypingimportTYPE_CHECKING,Any,Literal,ProtocolfrompydanticimportBaseModel,Field,model_validatorfrom...core.configimportSettingsfrom...core.errors.hierarchyimportpydantic_validation_boundaryfrom...core.filing_yearimportFilingYearfrom...core.identity.aeat_expedienteimportAeatExpedienteIdfrom...core.modelsimportSTRICT_FROZEN_CONFIGfrom...core.periodimportPeriodfrom.snapshot_baseimportSnapshotRepositoryifTYPE_CHECKING:from..auth.session_typesimportAeatSession
[docs]classExpedientesDeclaration(BaseModel):"""Application DTO for one read-only declaration-register row."""model_config=STRICT_FROZEN_CONFIGmodelo:str=Field(min_length=1,max_length=8)ejercicio:FilingYearperiod:Periodexpediente_id:AeatExpedienteIdestado:str=Field(min_length=1,max_length=16)tipo_solicitud:str|None=Field(default=None,max_length=128)observaciones:str|None=Field(default=None,max_length=512)presented_at:datetimejustificante_link_text:str|None=Field(default=None,max_length=32)archive_link_text:str|None=Field(default=None,max_length=32)declaration_copy_link_text:str|None=Field(default=None,max_length=32)justificante_cell_index:int=Field(default=7,ge=0)archive_cell_index:int|None=Field(default=8,ge=0)declaration_copy_cell_index:int|None=Field(default=None,ge=0)mode:Literal["read"]="read"@model_validator(mode="after")@pydantic_validation_boundarydef_period_year_matches_ejercicio(self)->ExpedientesDeclaration:ifself.period.filing_year!=self.ejercicio:raiseValueError("period.filing_year must match ejercicio")returnself
[docs]asyncdefwalk(self,*,modelo:str,ejercicio:int)->tuple[ExpedientesDeclaration,...]:"""Return application-owned rows for one modelo/year query."""...
[docs]classExpedientesDeclarationReaderProtocol(Protocol):"""Open a translated, read-only declaration-register session."""
[docs]defopen_register(self,session:AeatSession,*,settings:Settings,)->AbstractAsyncContextManager[ExpedientesRegisterProtocol]:"""Yield a register whose adapter DTOs/errors never cross the port."""...
[docs]@dataclass(frozen=True,slots=True)classExpedientesPorts:"""Required live-read and bucket-persistence capabilities."""declaration_reader:ExpedientesDeclarationReaderProtocolsnapshot_repository_factory:ExpedientesSnapshotRepositoryFactory
[docs]classExpedientesPortsFactory(Protocol):"""Construct expedientes capabilities for one profile bucket."""def__call__(self,*,bucket_id:str)->ExpedientesPorts:"""Return the required bundle for ``bucket_id``."""...