Source code for cadrumo.application.modelo._m349_ledger_guard
"""Modelo 349 raw-ledger safety guard.Modelo 349 operator rows require counterparty identity fields that raw ledgertransactions do not carry. The supported source paths are business invoices orexplicit operador detail rows, so raw intra-community ledger classifications mustfail closed instead of producing a zero-row declaration.The IVA categories that make a ledger row intra-community are not restated here:the selected revision declares them on its ledger guard binding, and a revisionthat declares no such binding has no raw-ledger obligation to enforce."""from__future__importannotationsfromtypingimportNoReturnfrom...core.operator_action_enumsimportActionEvidenceProvenancefrom...core.periodimportPeriodfrom...domain.calculations.registry.idsimportBindingIdfrom...domain.calculations.registry.ledger_iva_bindingsimportLedgerIvaProviderfrom...domain.calculations.registry.schemaimportModeloRevisionfrom...domain.iva.schemaimportIvaCategoryfrom...domain.modelos.row_modelsimportModelo349OperadorRow,ModeloDetailRowfrom...domain.modelos.work_unitimportWorkUnitfrom...domain.transactions.enumsimportTransactionLifecycleStatefrom...domain.transactions.modelsimportTransactionfrom...domain.transactions.protocolsimportTransactionCatalogueRepositoryProtocolfrom.action_errorsimportModeloAggregationBindingErrorfrom.preconditionsimportbuild_modelo_precondition_failure_LEDGER_GUARD_BINDING_ID:BindingId="modelo-349-ledger-intracommunity-guard"def_guarded_ledger_categories(revision:ModeloRevision)->frozenset[IvaCategory]:"""Return the intra-community IVA categories the revision's ledger guard declares."""forbindinginrevision.bindings:ifbinding.id==_LEDGER_GUARD_BINDING_IDandisinstance(binding.provider,LedgerIvaProvider):returnfrozenset(binding.provider.categories)returnfrozenset[IvaCategory]()def_is_active_guarded_transaction_in_period(transaction:Transaction,period:Period,categories:frozenset[IvaCategory],)->bool:"""Return whether a transaction belongs to the guarded M349 ledger slice."""iftransaction.lifecycle_stateisnotTransactionLifecycleState.ACTIVE:returnFalseiftransaction.iva_categorynotincategories:returnFalsereturnperiod.contains(transaction.raw.value_dateortransaction.raw.booked_date)def_raise_m349_operator_rows_refusal(work_unit:WorkUnit,transaction_ids:tuple[str,...])->NoReturn:"""Raise the grounded refusal for raw intracom ledger rows without operator rows."""modelo=str(work_unit.modelo)raiseModeloAggregationBindingError(translated_message="errors.error.error_modelo_aggregation_binding",context={"modelo":modelo,"filing_year":work_unit.filing_year,"period":work_unit.period.registry_token,"transaction_count":len(transaction_ids),"sample_transaction_ids":transaction_ids[:3],},precondition_failure=build_modelo_precondition_failure(subject_leaf_key="modelo.work.calculate",condition_id="modelo.work.calculate.m349.operator_rows.present",scenario_id="modelo.work.calculate.m349.operator_rows.intracom_ledger_without_operator_rows",evidence_id="modelo.work.calculate.m349.operator_rows",evidence_values={"work_unit_id":work_unit.work_unit_id,"modelo":modelo,"year":work_unit.filing_year,"period":work_unit.period.registry_token,"transaction_count":len(transaction_ids),"sample_transaction_ids":"|".join(transaction_ids[:3]),},provenance=ActionEvidenceProvenance.APPLICATION_STATE,),)
[docs]defraise_if_m349_intracom_ledger_rows_need_operator_rows(*,work_unit:WorkUnit,revision:ModeloRevision,transaction_repository:TransactionCatalogueRepositoryProtocol,detail_rows:tuple[ModeloDetailRow,...],)->None:"""Refuse M349 calculation when raw ledger rows lack declarable operator rows. Core types: :class:`~cadrumo.domain.calculations.registry.schema.ModeloRevision`. """ifany(isinstance(row,Modelo349OperadorRow)forrowindetail_rows):returncategories=_guarded_ledger_categories(revision)ifnotcategories:returntransaction_ids=tuple(sorted(transaction.transaction_idfortransactionintransaction_repository.load().transactions.values()if_is_active_guarded_transaction_in_period(transaction,work_unit.period,categories)),)iftransaction_ids:_raise_m349_operator_rows_refusal(work_unit,transaction_ids)