Source code for cadrumo.adapters.persistence.profile.purchase_invoice_evidence
"""Concrete persistence bindings for the ledger evidence application ports.Core types::class:`~cadrumo.adapters.persistence.storage.sql.secure_objects.SecureObjectRepository`,:class:`~cadrumo.core.classification.policies.SensitivityClass`."""from__future__importannotationsfromcollections.abcimportSequencefromtypingimportTYPE_CHECKING,ClassVar,overridefrom....application.ledger.evidenceimportPurchaseInvoiceEvidence,PurchaseInvoiceEvidenceDocumentfrom....application.ledger.evidence_portsimportEvidenceAttachmentIngestRequestfrom....core.classification.policiesimportSensitivityClassfrom....core.identity.digestimportContentDigestfrom....domain.attachments.enumsimportAttachmentKind,AttachmentSourcefrom....domain.attachments.serviceimportAttachmentFileContent,AttachmentIngestionRequest,add_attachmentfrom..storage.attachmentimportAttachmentStorefrom..storage.envelope.secure_bound_repositoryimportSecureBoundRepositoryfrom..storage.secure_object_namespacesimportLEDGER_PURCHASE_INVOICE_EVIDENCE_NAMESPACEifTYPE_CHECKING:from..storage.sql.secure_objectsimportSecureObjectRepository
[docs]classPurchaseInvoiceEvidenceRepository(SecureBoundRepository[PurchaseInvoiceEvidenceDocument]):"""Encrypted repository for one bucket's evidence catalogue."""namespace:ClassVar[str]=LEDGER_PURCHASE_INVOICE_EVIDENCE_NAMESPACE.namespacesensitivity:ClassVar[SensitivityClass]=LEDGER_PURCHASE_INVOICE_EVIDENCE_NAMESPACE.sensitivityschema_version:ClassVar[int]=LEDGER_PURCHASE_INVOICE_EVIDENCE_NAMESPACE.schema_versionpayload_type=PurchaseInvoiceEvidenceDocument
[docs]classLedgerEvidenceRepositoryAdapter:"""Translate encrypted evidence documents into application record tuples."""def__init__(self,*,objects:SecureObjectRepository)->None:"""Bind the encrypted purchase-evidence object repository."""self._repository=PurchaseInvoiceEvidenceRepository(objects=objects)
[docs]defload(self,*,bucket_id:str)->tuple[PurchaseInvoiceEvidence,...]:"""Load evidence records for one bucket."""document=self._repository.load(bucket_id)return()ifdocumentisNoneelsetuple(document.records)
[docs]defsave(self,*,bucket_id:str,records:Sequence[PurchaseInvoiceEvidence])->None:"""Persist evidence records for one bucket."""self._repository.save(PurchaseInvoiceEvidenceDocument(bucket_id=bucket_id,records=tuple(records)),)
[docs]classLedgerEvidenceAttachmentIngestor:"""Translate application ingestion facts into attachment-service inputs."""def__init__(self,*,store:AttachmentStore)->None:"""Bind the attachment store used for evidence ingestion."""self._store=store
[docs]defingest(self,request:EvidenceAttachmentIngestRequest)->ContentDigest:"""Ingest one evidence file and return its content digest."""ifrequest.media_kind=="pdf":kind=AttachmentKind.INVOICE_PDFelifrequest.media_kind=="image":kind=AttachmentKind.RECEIPT_IMAGEelse:raiseValueError(f"unsupported evidence media kind: {request.media_kind!r}")attachment=add_attachment(self._store,content=AttachmentFileContent(path=request.source_path),request=AttachmentIngestionRequest(kind=kind,source=AttachmentSource.LOCAL_FILE,source_reference=str(request.source_path),mime_type=request.mime_type,captured_at=request.captured_at,bucket_id=request.bucket_id,captured_by=request.actor,source_command="aeat app ledger evidence add",),)returnattachment.attachment_id