"""Filed-declaration register listing helpers for live AEAT workflows.This module is the read-only selector boundary between the authenticatedSede declaration register and the heavier capture pipeline. It works onlywith :class:`~aeat.adapters.outbound.aeat.sede.Declaracion` register rows:listing reports expose which AEAT artefact links are available, and selectorhelpers narrow one in-memory register result by period, expediente id, andcaller limit before any artefact is downloaded.The helpers do not authenticate, open browser sessions, persist observations,or stamp filing records. Those effects belong to:mod:`aeat.application.live._filed_data_capture` and:mod:`aeat.application.live._filed_observation_persistence` after thelive-read gate and registry checks have run."""from__future__importannotationsfromdatetimeimportdatetimefrompydanticimportBaseModel,ConfigDictfrom...adapters.outbound.aeat.sedeimportDeclaracionfrom...coreimportPeriodfrom._errorsimportLiveApplicationInputErrorfrom._remote_state_modelsimportFiledDataCaptureFailureRow
[docs]classFiledDataListingRow(BaseModel):"""One filed declaration row listed from AEAT without downloading artefacts."""model_config=ConfigDict(frozen=True)modelo:stryear:intperiod:Periodexpediente_id:strstatus:strpresented_at:datetimehas_submitted_file:boolhas_declaration_copy:boolhas_justificante:bool
[docs]classBulkFiledDataListingReport(BaseModel):"""Read-only filed-declaration listing report across multiple modelos."""model_config=ConfigDict(frozen=True)modelos:tuple[str,...]year_from:intyear_to:introw_count:intfailed_count:introws:tuple[FiledDataListingRow,...]failures:tuple[FiledDataCaptureFailureRow,...]
[docs]defselect_declarations_for_capture(declarations:tuple[Declaracion,...],*,period:Period|None=None,expediente_id:str|None=None,limit:int|None=None,)->tuple[Declaracion,...]:"""Select register :class:`~aeat.adapters.outbound.aeat.sede.Declaracion` rows. Selection is an in-memory filter over one already-read register result. It does not fetch AEAT artefacts or persist local evidence; the capture service performs those steps after the live-read gate. """selected=declarationsifperiodisnotNone:selected=tuple(rowforrowinselectedifrow.period==period)ifexpediente_idisnotNone:selected=tuple(rowforrowinselectedifrow.expediente_id==expediente_id)ifexpediente_idisnotNoneandnotselected:raiseLiveApplicationInputError(message=f"AEAT declaration register did not return expediente {expediente_id!r}",translated_message="live.errors.expediente_not_found",context={"expediente_id":str(expediente_id)},)iflimitisnotNone:selected=selected[:limit]returnselected
[docs]deffiled_data_listing_row(declaration:Declaracion)->FiledDataListingRow:"""Return link-availability metadata for one AEAT declaration register item. Returns: A :class:`FiledDataListingRow` with archive, declaration-copy, and justificante link-availability flags for the declaration. """returnFiledDataListingRow(modelo=declaration.modelo,year=declaration.ejercicio,period=declaration.period,expediente_id=declaration.expediente_id,status=declaration.estado,presented_at=declaration.presented_at,has_submitted_file=bool(declaration.archive_link_textanddeclaration.archive_cell_indexisnotNone),has_declaration_copy=bool(declaration.declaration_copy_link_textanddeclaration.declaration_copy_cell_indexisnotNone,),has_justificante=bool(declaration.justificante_link_textanddeclaration.justificante_cell_indexisnotNone),)