> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt
> Use this file to discover all available pages before exploring further.

# Eventos do Lender

> Referência de todos os CloudEvents que o Lender emite, com streams de aplicação, versões de esquema, assuntos, contratos de payload, definições apenas de catálogo e consumidores conectados.

O Lender publica CloudEvents 1.0 em modo binário de conteúdo por meio da biblioteca de streaming da Lerian. A emissão de negócio é apenas via outbox e pelo menos uma vez: a escrita de domínio e o envelope de outbox compartilham uma transação de banco de dados, e o relay publica depois do commit.

## Contrato do stream de aplicação

* `ce-source`: `lender`
* Fatos: `lerian.streaming.lender`
* Comandos: `lerian.streaming.lender.commands`
* Roteamento de dead letters: `lerian.streaming.lender.dlq`
* `ce-type`: `studio.lerian.lender.<resource>.<event>`
* Chave de dispatch: `<resource>.<event>` a partir de `ce-resourcetype` e `ce-eventtype`

O tópico identifica a aplicação produtora e a classe do stream, não um evento específico. Faça o roteamento pelos headers do CloudEvents, não pelo nome do tópico por evento. O Lender expõe o catálogo exato e os tópicos de aplicação em `GET /api/v1/streaming/manifest`.

## Eventos emitidos

O catálogo declara 39 definições. O Lender emite 37 delas: 35 fatos e 2 comandos. A tabela separa as chaves do catálogo do tipo de roteamento do CloudEvent.

| Chave de definição | `ce-type` | Stream | Esquema | Assunto | Ocorre quando |
| - | - | - | - | - | - |
| `accounting_profile.configured` | `studio.lerian.lender.accounting_profile.configured` | Fato | `1.1.0` | `profile_id` | Um perfil contábil se torna a configuração ativa. |
| `assignment_set.approved` | `studio.lerian.lender.assignment_set.approved` | Fato | `1.0.0` | `assignment_set_id` | Uma composição de cessão é aprovada de forma durável e seu arquivo de oferta passa a ser derivável a partir dessa aprovação. |
| `assignment_set.accepted` | `studio.lerian.lender.assignment_set.accepted` | Fato | `1.0.0` | `assignment_set_id` | Um administrador de fundo aceita a cessão inteira e seus recebíveis saem do portfólio do tenant. |
| `collection.payment.applied` | `studio.lerian.lender.collection_payment.applied` | Fato | `1.0.0` | `application_id` | Um pagamento de cobrança verificado é aplicado a um caminho de empréstimo. |
| `collection.payment.unapplied` | `studio.lerian.lender.collection_payment.unapplied` | Fato | `1.0.0` | `application_id` | Um pagamento de cobrança verificado é retido como caixa não aplicado. |
| `collection.payment.reapplied` | `studio.lerian.lender.collection_payment.reapplied` | Fato | `1.0.0` | `application_id` | Caixa anteriormente não aplicado é liberado para os recebíveis. |
| `collection.payment.refunded` | `studio.lerian.lender.collection_payment.refunded` | Fato | `1.0.0` | `application_id` | Caixa anteriormente não aplicado é devolvido por meio do provedor. |
| `loan_application.submitted` | `studio.lerian.lender.loan_application.submitted` | Fato | `2.0.0` | `loan_application_id` | Uma proposta validada é persistida para underwriting. |
| `loan_application.approved` | `studio.lerian.lender.loan_application.approved` | Fato | `2.0.0` | `loan_application_id` | Uma proposta pendente é aprovada. |
| `loan_application.rejected` | `studio.lerian.lender.loan_application.rejected` | Fato | `2.0.0` | `loan_application_id` | Uma proposta pendente é rejeitada. |
| `loan_application.withdrawn` | `studio.lerian.lender.loan_application.withdrawn` | Fato | `2.0.0` | `loan_application_id` | Uma proposta pendente ou aprovada é retirada. |
| `loan_application.disbursed` | `studio.lerian.lender.loan_application.disbursed` | Fato | `2.0.0` | `loan_application_id` | Os fundos são desembolsados para uma proposta aprovada ou já desembolsada. |
| `loan_charge.applied` | `studio.lerian.lender.loan_charge.applied` | Fato | `1.0.0` | `loan_account_id` | Um encargo da versão do produto é persistido em uma conta de empréstimo. |
| `loan_product.created` | `studio.lerian.lender.loan_product.created` | Fato | `1.0.0` | `loan_product_id` | Um rascunho de produto de empréstimo é criado. |
| `loan_product.activated` | `studio.lerian.lender.loan_product.activated` | Fato | `1.0.0` | `loan_product_id` | Um produto de empréstimo se torna ativo. |
| `loan_product.current_version_promoted` | `studio.lerian.lender.loan_product.current_version_promoted` | Fato | `1.0.0` | `loan_product_id` | Um produto ativo passa a apontar para outra de suas versões. |
| `loan_product_version.created` | `studio.lerian.lender.loan_product_version.created` | Fato | `1.0.0` | `loan_product_version_id` | Uma versão imutável do produto de empréstimo é anexada. |
| `loan_schedule.prepayment_applied` | `studio.lerian.lender.loan_schedule.prepayment_applied` | Fato | `1.0.0` | `schedule_version_id` | Um pagamento antecipado cria uma versão sucessora do cronograma. |
| `loan_schedule.rescheduled` | `studio.lerian.lender.loan_schedule.rescheduled` | Fato | `1.0.0` | `schedule_version_id` | Um reagendamento cria uma versão sucessora do cronograma. |
| `repayment.recorded` | `studio.lerian.lender.repayment.recorded` | Fato | `1.0.0` | `transaction_id` | Um pagamento e sua alocação de caixa são registrados. |
| `returned_payment_receivable.opened` | `studio.lerian.lender.returned_payment_receivable.opened` | Fato | `1.0.0` | `receivable_id` | Um pagamento final estornado abre uma dívida separada do tomador, fora da operação de crédito já encerrada. |
| `returned_payment_receivable.collected` | `studio.lerian.lender.returned_payment_receivable.collected` | Fato | `1.0.0` | `receivable_id` | O tomador paga essa dívida por outros meios e ela é encerrada. |
| `returned_payment_receivable.written_off` | `studio.lerian.lender.returned_payment_receivable.written_off` | Fato | `1.0.0` | `receivable_id` | Uma dívida que envelheceu até o estágio final da escala do produto é baixada a prejuízo. |
| `repayment_reversal.recorded` | `studio.lerian.lender.repayment_reversal.recorded` | Fato | `1.0.0` | `transaction_id` | Um estorno de pagamento é registrado com linhagem. |
| `loan_account.pdd_stage_transitioned` | `studio.lerian.lender.loan_account.pdd_stage_transitioned` | Fato | `1.0.0` | `loan_account_id` | Uma conta de empréstimo BR muda ou regulariza seu estágio de PDD. |
| `prepayment_quote.created` | `studio.lerian.lender.prepayment_quote.created` | Fato | `1.0.0` | `quote_id` | Uma cotação de pagamento antecipado BR imutável é persistida. |
| `prepayment_settlement.recorded` | `studio.lerian.lender.prepayment_settlement.recorded` | Fato | `1.0.0` | `settlement_id` | Uma liquidação de pagamento antecipado BR aceita é registrada. |
| `loan_account.debt_balance_changed` | `studio.lerian.lender.loan_account.debt_balance_changed` | Fato | `2.0.0` | `loan_account_id` | O saldo devedor canônico de quitação total é revisado. |
| `loan_account.payment_overdue` | `studio.lerian.lender.loan_account.payment_overdue` | Fato | `1.0.0` | `loan_account_id` | Uma parcela de consignado entra ou sai do estado de atraso. |
| `loan_account.problem_asset_assessed` | `studio.lerian.lender.loan_account.problem_asset_assessed` | Fato | `1.0.0` | `loan_account_id` | Um operador de crédito declara, com evidência, se uma conta de empréstimo brasileira é um ativo problemático por um motivo qualitativo. |
| `loan_account.problem_asset_reassessment_overdue` | `studio.lerian.lender.loan_account.problem_asset_reassessment_overdue` | Fato | `1.0.0` | `loan_account_id` | Uma caracterização qualitativa de ativo problemático vigente ultrapassa o prazo de reavaliação da versão de produto. |
| `consignado.exclusao.requested` | `studio.lerian.lender.consignado_exclusao.requested` | Comando | `1.0.0` | `request_ref` | O Lender solicita o cancelamento de um contrato de Consignado após a liquidação. |
| `consignado.redirecionamento.requested` | `studio.lerian.lender.consignado_redirecionamento.requested` | Comando | `1.0.0` | `request_ref` | O Lender solicita o redirecionamento de folha de pagamento para um vínculo empregatício elegível. |
| `payroll_deduction.refund_required` | `studio.lerian.lender.payroll_deduction.refund_required` | Fato | `1.0.0` | `receipt_id` | Caixa de folha de pagamento pós-quitação cria uma obrigação de reembolso ao tomador. |
| `payroll_overdeduction.refund_required` | `studio.lerian.lender.payroll_overdeduction.refund_required` | Fato | `1.0.0` | `refund_case_id` | A folha de pagamento descontou mais do que o devido na competência. |
| `collection.instruction.issued` | `studio.lerian.lender.collection_instruction.issued` | Fato | `1.0.0` | `instrument_id` | O Lender emite uma instrução de cobrança extraordinária. |
| `guarantee_recovery.cash_allocated` | `studio.lerian.lender.guarantee_recovery_cash.allocated` | Fato | `1.0.0` | `receipt_id` | Caixa confirmado de recuperação de garantia é alocado sem violar a conservação. |

## Contratos de payload emitidos

Os contratos abaixo espelham as tags JSON de `data` do CloudEvent no contrato publicado do Lender. `?` significa que o campo pode estar ausente. Os structs de wire em Go não declaram campos de ponteiro anuláveis. `unknown` é JSON bruto e pode carregar qualquer valor JSON, incluindo `null`. Valores decimais são strings JSON, os timestamps são strings RFC 3339 em UTC, e `YYYYMM` é uma competência de seis dígitos.

```typescript theme={null}
type DecimalString = string
type RFC3339 = string
type YYYYMM = string
```

> [accordion] accounting\_profile.configured
>
> **Chave de definição:** `accounting_profile.configured`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.1.0`
>
> **Assunto:** `profile_id`
>
> ```typescript theme={null}
> type AccountingProfilePostingLeg = {
>   account: string
>   role?: string
>   side: string
>   component?: string
>   optional: boolean
> }
>
> type AccountingProfilePostingRule = {
>   event_type: string
>   legs: AccountingProfilePostingLeg[]
> }
>
> type AccountingProfileConfiguredDataV1 = {
>   profile_id: string
>   loan_product_version_id: string
>   accounting_mode: string
>   posting_rules: AccountingProfilePostingRule[]
>   effective_from: string
>   created_at: RFC3339
> }
> ```
>
> `effective_from` é o dia civil em que o plano de contas que ela descreve passa a valer. Sem esse campo, dois eventos sobre a mesma versão de produto descrevem dois planos diferentes e nada no fio diz qual vale em cada mês.

> [accordion] assignment\_set.approved / assignment\_set.accepted
>
> **Chaves de definição:** `assignment_set.approved`, `assignment_set.accepted`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `assignment_set_id`
>
> Uma composição de cessão é aprovada de forma durável. O evento identifica a aprovação imutável que determina o arquivo de oferta.
>
> ```typescript theme={null}
> type AssignmentSetApprovedDataV1 = {
>   assignment_set_id: string
>   assignment_fund_id: string
>   approval_id: string
>   approval_digest: string
>   approval_schema_version: string
>   valuation_version: string
>   currency: string
>   item_count: number
>   total_assignment_price: DecimalString
>   approved_by: string
>   approved_at: RFC3339
>   trail_observed_at: RFC3339
> }
> ```
>
> Um administrador de fundo aceita a cessão inteira. O evento relata os totais financeiros no nível do conjunto após a baixa dos recebíveis do portfólio do tenant. O campo `risk_retention` informa o regime de retenção sob o qual a cessão foi registrada. O campo `retained_fraction` é a parcela da perda esperada que a instituição mantém depois da venda.
>
> ```typescript theme={null}
> type AssignmentSetAcceptedDataV1 = {
>   assignment_set_id: string
>   assignment_fund_id: string
>   registry_provider: string
>   risk_retention: string
>   retained_fraction: DecimalString
>   provenance: string
>   recorded_by: string
>   accepted_at: RFC3339
>   currency: string
>   item_count: number
>   total_face_value: DecimalString
>   total_assignment_price: DecimalString
>   total_discount_amount: DecimalString
> }
> ```

> [accordion] collection.payment.\*
>
> **Chaves de definição:** `collection.payment.applied`, `collection.payment.unapplied`, `collection.payment.reapplied`, `collection.payment.refunded`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `application_id`
>
> ```typescript theme={null}
> type CollectionPaymentDataV1 = {
>   application_id: string
>   notification_id: string
>   instrument_id: string
>   provider: string
>   provider_account_id: string
>   provider_payment_id: string
>   received_amount: DecimalString
>   applied_amount: DecimalString
>   unapplied_amount: DecimalString
>   refunded_amount?: DecimalString
>   currency: string
>   applied_transaction_id?: string
>   repair_reason?: string
>   refund_request_id?: string
>   refund_transaction_id?: string
> }
> ```

> [accordion] loan\_application.submitted
>
> **Chave de definição:** `loan_application.submitted`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `2.0.0`
>
> **Assunto:** `loan_application_id`
>
> ```typescript theme={null}
> type LoanApplicationSubmittedDataV2 = {
>   loan_application_id: string
>   loan_product_version_id: string
>   borrower_id: string
>   assigned_officer_id: string
>   status: string
>   requested_principal_amount: DecimalString
>   requested_interest_rate: DecimalString
>   requested_installments: number
>   expected_disbursement_date: RFC3339
>   preview_profile_version: string
>   preview_jurisdiction_code: string
>   preview_schedule_snapshot_id?: string
>   created_at: RFC3339
>   updated_at: RFC3339
> }
> ```

> [accordion] loan\_application.approved
>
> **Chave de definição:** `loan_application.approved`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `2.0.0`
>
> **Assunto:** `loan_application_id`
>
> ```typescript theme={null}
> type LoanApplicationApprovedDataV2 = {
>   loan_application_id: string
>   loan_product_version_id: string
>   borrower_id: string
>   assigned_officer_id: string
>   status: string
>   approved_amount: DecimalString
>   approval_decision_id: string
>   approval_decision_at: RFC3339
>   approved_by: string
>   requested_principal_amount: DecimalString
>   preview_profile_version: string
>   preview_jurisdiction_code: string
>   updated_at: RFC3339
> }
> ```

> [accordion] loan\_application.rejected
>
> **Chave de definição:** `loan_application.rejected`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `2.0.0`
>
> **Assunto:** `loan_application_id`
>
> ```typescript theme={null}
> type LoanApplicationRejectedDataV2 = {
>   loan_application_id: string
>   loan_product_version_id: string
>   borrower_id: string
>   assigned_officer_id: string
>   status: string
>   rejection_decision_id: string
>   rejection_decision_at: RFC3339
>   rejected_by: string
>   requested_principal_amount: DecimalString
>   preview_profile_version: string
>   preview_jurisdiction_code: string
>   updated_at: RFC3339
> }
> ```

> [accordion] loan\_application.withdrawn
>
> **Chave de definição:** `loan_application.withdrawn`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `2.0.0`
>
> **Assunto:** `loan_application_id`
>
> ```typescript theme={null}
> type LoanApplicationWithdrawnDataV2 = {
>   loan_application_id: string
>   loan_product_version_id: string
>   borrower_id: string
>   assigned_officer_id: string
>   status: string
>   withdrawal_decision_id: string
>   withdrawal_decision_at: RFC3339
>   withdrawn_by: string
>   requested_principal_amount: DecimalString
>   preview_profile_version: string
>   preview_jurisdiction_code: string
>   updated_at: RFC3339
> }
> ```

> [accordion] loan\_application.disbursed
>
> **Chave de definição:** `loan_application.disbursed`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `2.0.0`
>
> **Assunto:** `loan_application_id`
>
> ```typescript theme={null}
> type LoanApplicationDisbursedDataV2 = {
>   loan_application_id: string
>   loan_product_version_id: string
>   borrower_id: string
>   assigned_officer_id: string
>   status: string
>   loan_account_id: string
>   disbursement_event_id: string
>   disbursement_transaction_id: string
>   gross_requested_amount: DecimalString
>   net_delivered_amount: DecimalString
>   disbursed_at: RFC3339
>   profile_version: string
>   jurisdiction_extensions?: unknown
>   preview_jurisdiction_code: string
>   updated_at: RFC3339
> }
> ```

> [accordion] loan\_charge.applied
>
> **Chave de definição:** `loan_charge.applied`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `loan_account_id`
>
> ```typescript theme={null}
> type LoanChargeAppliedDataV1 = {
>   request_id: string
>   loan_account_id: string
>   source_product_version_id: string
>   charge_template_id: string
>   charge_code: string
>   charge_type: string
>   amount: DecimalString
>   rate: DecimalString
>   currency: string
>   account_created_at: RFC3339
>   assessed_at: RFC3339
> }
> ```

> [accordion] loan\_product.created
>
> **Chave de definição:** `loan_product.created`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `loan_product_id`
>
> ```typescript theme={null}
> type LoanProductCreatedDataV1 = {
>   loan_product_id: string
>   name: string
>   loan_type: string
>   status: string
>   jurisdiction_code: string
>   current_version_id?: string
>   created_at: RFC3339
> }
> ```

> [accordion] loan\_product.activated
>
> **Chave de definição:** `loan_product.activated`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `loan_product_id`
>
> ```typescript theme={null}
> type LoanProductActivatedDataV1 = {
>   loan_product_id: string
>   current_version_id: string
>   status: string
>   name: string
>   loan_type: string
>   jurisdiction_code: string
>   created_at: RFC3339
> }
> ```

> [accordion] loan\_product.current\_version\_promoted
>
> **Chave de definição:** `loan_product.current_version_promoted`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `loan_product_id`
>
> O produto é o agregado depois do reapontamento, então `current_version_id` é o novo pino. Contratos já escritos ficam na versão em que nasceram. Apenas novas solicitações passam a originar na versão promovida. O campo `promoted_by` contém o sujeito autenticado tal como veio. Ele fica vazio quando nenhuma pessoa pediu a promoção.
>
> ```typescript theme={null}
> type LoanProductCurrentVersionPromotedDataV1 = {
>   loan_product_id: string
>   current_version_id: string
>   status: string
>   name: string
>   loan_type: string
>   jurisdiction_code: string
>   promoted_by: string
>   promoted_at: RFC3339
> }
> ```

> [accordion] loan\_product\_version.created
>
> **Chave de definição:** `loan_product_version.created`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `loan_product_version_id`
>
> ```typescript theme={null}
> type LoanProductVersionCreatedDataV1 = {
>   loan_product_version_id: string
>   loan_product_id: string
>   jurisdiction_code: string
>   jurisdiction_extensions?: unknown
>   rate_mode: string
>   floating_rate_table_id?: string
>   floating_spread_bps: number
>   fixed_annual_rate_bps: number
>   requires_floating_rate: boolean
>   min_annual_rate_bps?: number
>   max_annual_rate_bps?: number
>   admitted_borrower_kinds: string[]
>   created_at: RFC3339
> }
> ```
>
> As faixas mínima e máxima de taxa ficam ausentes quando a versão não guarda nenhuma. Uma versão sem faixa não emite nenhuma das duas chaves, em vez de emitir uma faixa de zero a zero, que se leria como "só 0% é permitido". O campo `admitted_borrower_kinds` está sempre presente. Um array vazio significa que a versão não admite nenhum tomador.

> [accordion] loan\_schedule.prepayment\_applied
>
> **Chave de definição:** `loan_schedule.prepayment_applied`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `schedule_version_id`
>
> ```typescript theme={null}
> type LoanSchedulePrepaymentAppliedDataV1 = {
>   loan_account_id: string
>   schedule_version_id: string
>   previous_schedule_version_id: string
>   version_number: number
>   reason: string
>   trigger_transaction_id: string
>   request_id: string
>   payload_hash: string
>   prepayment_amount: DecimalString
>   effective_date: RFC3339
>   business_date: RFC3339
>   profile_version: string
>   jurisdiction_code: string
>   created_at: RFC3339
>   installment_count: number
> }
> ```

> [accordion] loan\_schedule.rescheduled
>
> **Chave de definição:** `loan_schedule.rescheduled`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `schedule_version_id`
>
> ```typescript theme={null}
> type LoanScheduleRescheduledDataV1 = {
>   loan_account_id: string
>   schedule_version_id: string
>   previous_schedule_version_id: string
>   version_number: number
>   reason: string
>   trigger_transaction_id: string
>   request_id: string
>   payload_hash: string
>   effective_date: RFC3339
>   business_date: RFC3339
>   first_rescheduled_due_date: RFC3339
>   profile_version: string
>   jurisdiction_code: string
>   created_at: RFC3339
>   installment_count: number
> }
> ```

> [accordion] repayment.recorded
>
> **Chave de definição:** `repayment.recorded`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `transaction_id`
>
> ```typescript theme={null}
> type RepaymentAllocation = {
>   installment_number: number
>   due_date: RFC3339
>   principal_amount: DecimalString
>   interest_amount: DecimalString
>   fees_amount: DecimalString
>   penalties_amount: DecimalString
>   total_amount: DecimalString
>   fully_paid: boolean
> }
>
> type RepaymentRecordedDataV1 = {
>   transaction_id: string
>   loan_account_id: string
>   request_id: string
>   funding_mode: string
>   paid_amount: DecimalString
>   overpayment_amount: DecimalString
>   effective_date: RFC3339
>   created_at: RFC3339
>   allocation_count: number
>   allocations: RepaymentAllocation[]
> }
> ```

> [accordion] returned\_payment\_receivable.opened / returned\_payment\_receivable.collected / returned\_payment\_receivable.written\_off
>
> **Chaves de definição:** `returned_payment_receivable.opened`, `returned_payment_receivable.collected`, `returned_payment_receivable.written_off`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `receivable_id`
>
> Os três fatos projetam o mesmo agregado por uma única projeção compartilhada, de modo que dois fatos sobre a mesma dívida não podem descrevê-la de formas diferentes. Todo campo está sempre presente. Um campo que ainda não se aplica contém uma string vazia. Ele nunca fica ausente e nunca é `null`. Leia `status` para distinguir os estados, não a vacuidade de um campo.
>
> Os campos `stage` e `provision_amount` trazem o envelhecimento da dívida. Os campos `provision_consumed` e `loss` dividem a baixa. O campo `reversal_transaction_id` é único por recebível e é a âncora à qual uma reentrega do mesmo estorno resolve.
>
> ```typescript theme={null}
> type ReturnedPaymentReceivableDataV1 = {
>   receivable_id: string
>   loan_account_id: string
>   borrower_id: string
>   original_transaction_id: string
>   reversal_transaction_id: string
>   currency: string
>   amount: DecimalString
>   status: string
>   opened_at: RFC3339
>   opened_on: string
>   collected_at: RFC3339 | ""
>   collected_on: string
>   collected_by: string
>   stage: string
>   provision_amount: DecimalString
>   written_off_at: RFC3339 | ""
>   written_off_on: string
>   provision_consumed: DecimalString | ""
>   loss: DecimalString | ""
> }
> ```

> [accordion] repayment\_reversal.recorded
>
> **Chave de definição:** `repayment_reversal.recorded`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `transaction_id`
>
> ```typescript theme={null}
> type RepaymentAllocation = {
>   installment_number: number
>   due_date: RFC3339
>   principal_amount: DecimalString
>   interest_amount: DecimalString
>   fees_amount: DecimalString
>   penalties_amount: DecimalString
>   total_amount: DecimalString
>   fully_paid: boolean
> }
>
> type RepaymentReversalRecordedDataV1 = {
>   transaction_id: string
>   original_transaction_id: string
>   loan_account_id: string
>   request_id: string
>   paid_amount: DecimalString
>   overpayment_amount: DecimalString
>   effective_date: RFC3339
>   created_at: RFC3339
>   profile_version: string
>   jurisdiction_code: string
>   allocation_count: number
>   allocations: RepaymentAllocation[]
> }
> ```

> [accordion] loan\_account.pdd\_stage\_transitioned
>
> **Chave de definição:** `loan_account.pdd_stage_transitioned`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `loan_account_id`
>
> ```typescript theme={null}
> type LoanAccountPDDStageTransitionedDataV1 = {
>   loan_account_id: string
>   transition_id: string
>   from_stage: string
>   to_stage: string
>   accrual_state: string
>   reason?: string
>   effective_at: RFC3339
>   business_date: RFC3339
>   triggered_by?: string
>   profile_version?: string
>   jurisdiction_code?: string
>   created_at: RFC3339
> }
> ```

> [accordion] prepayment\_quote.created
>
> **Chave de definição:** `prepayment_quote.created`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `quote_id`
>
> ```typescript theme={null}
> type PrepaymentQuoteCreatedDataV1 = {
>   quote_id: string
>   loan_account_id: string
>   quote_type: string
>   principal_outstanding: DecimalString
>   interest_rebate: DecimalString
>   charge_rebate: DecimalString
>   iof_reconciliation: DecimalString
>   gross_amount: DecimalString
>   net_settlement_amount: DecimalString
>   rebate_mandatory: boolean
>   expires_at: RFC3339
>   currency: string
>   sla_due_at: RFC3339
>   statement_available_at: RFC3339
>   instrument_id: string
>   instrument_type: string
>   instrument_requested_at: RFC3339
>   profile_version?: string
>   jurisdiction_code?: string
>   consumer_protection_regime?: string
>   created_at: RFC3339
> }
> ```

> [accordion] prepayment\_settlement.recorded
>
> **Chave de definição:** `prepayment_settlement.recorded`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `settlement_id`
>
> ```typescript theme={null}
> type PrepaymentSettlementRecordedDataV1 = {
>   settlement_id: string
>   quote_id: string
>   loan_account_id: string
>   transaction_id: string
>   schedule_version_id?: string
>   settlement_type: string
>   principal_outstanding: DecimalString
>   interest_rebate: DecimalString
>   charge_rebate: DecimalString
>   iof_reconciliation: DecimalString
>   gross_amount: DecimalString
>   net_settlement_amount: DecimalString
>   final_principal_amount: DecimalString
>   final_interest_amount: DecimalString
>   final_charge_amount: DecimalString
>   final_iof_amount: DecimalString
>   profile_version?: string
>   jurisdiction_code?: string
>   consumer_protection_regime?: string
>   accepted_at: RFC3339
>   created_at: RFC3339
> }
> ```

> [accordion] loan\_account.debt\_balance\_changed
>
> **Chave de definição:** `loan_account.debt_balance_changed`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `2.0.0`
>
> **Assunto:** `loan_account_id`
>
> ```typescript theme={null}
> type LoanAccountDebtBalanceChangedDataV2 = {
>   loan_account_id: string
>   numero_contrato: string
>   reason: string
>   revision: number
>   balance_before: DecimalString
>   balance_after: DecimalString
>   currency: string
>   valuation_version: string
>   profile_version?: string
>   jurisdiction_code?: string
>   effective_at: RFC3339
>   created_at: RFC3339
> }
> ```

> [accordion] loan\_account.payment\_overdue
>
> **Chave de definição:** `loan_account.payment_overdue`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `loan_account_id`
>
> ```typescript theme={null}
> type LoanAccountPaymentOverdueDataV1 = {
>   loan_account_id: string
>   numero_contrato: string
>   competencia: YYYYMM
>   occurrence: number
>   reason: string
>   installment_number: number
>   installment_due_date: RFC3339
>   overdue_amount: DecimalString
>   currency: string
>   profile_version?: string
>   jurisdiction_code?: string
>   detected_at: RFC3339
>   resolved_at?: RFC3339
>   created_at: RFC3339
> }
> ```

> [accordion] loan\_account.problem\_asset\_assessed
>
> **Chave de definição:** `loan_account.problem_asset_assessed`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `loan_account_id`
>
> O Lender o emite nos dois veredictos. Uma declaração com `characterizes_problem_asset` igual a `false` é a única forma de retirar uma caracterização anterior.
>
> ```typescript theme={null}
> type LoanAccountProblemAssetAssessedDataV1 = {
>   assessment_id: string
>   loan_account_id: string
>   trigger: string
>   source: string
>   evidence_reference: string
>   characterizes_problem_asset: boolean
>   declared_by: string
>   evaluated_on: string
>   created_at: RFC3339
> }
> ```

> [accordion] loan\_account.problem\_asset\_reassessment\_overdue
>
> **Chave de definição:** `loan_account.problem_asset_reassessment_overdue`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `loan_account_id`
>
> Este fato é um chamado à revisão. Ele não muda nada no contrato: o estágio, a provisão e a decisão de reconhecimento de receita ficam como estavam. O Lender o emite uma vez por contrato por data de referência, e uma declaração de qualquer veredicto o encerra.
>
> ```typescript theme={null}
> type LoanAccountProblemAssetReassessmentOverdueDataV1 = {
>   loan_account_id: string
>   business_date: string
>   trigger: string
>   last_assessed_on: string
>   horizon_days: number
>   days_overdue: number
> }
> ```

> [accordion] consignado.exclusao.requested
>
> **Chave de definição:** `consignado.exclusao.requested`
>
> **Tópico:** `lerian.streaming.lender.commands`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `request_ref`
>
> ```typescript theme={null}
> type ConsignadoExclusaoRequestedDataV1 = {
>   request_ref: string
>   settlement_id: string
>   loan_account_id: string
>   contract_id: string
>   numero_contrato: string
>   motivo_exclusao: string
>   settled_at: RFC3339
> }
> ```

> [accordion] consignado.redirecionamento.requested
>
> **Chave de definição:** `consignado.redirecionamento.requested`
>
> **Tópico:** `lerian.streaming.lender.commands`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `request_ref`
>
> ```typescript theme={null}
> type ConsignadoRedirecionamentoRequestedDataV1 = {
>   request_ref: string
>   numero_contrato: string
>   source_vinculo_ref: string
>   target_vinculo_ref: string
>   target_matricula: string
>   target_cnpj: string
>   target_esocial_category: string
>   disruption_status: string
>   effective_at: RFC3339
> }
> ```

> [accordion] payroll\_deduction.refund\_required
>
> **Chave de definição:** `payroll_deduction.refund_required`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `receipt_id`
>
> ```typescript theme={null}
> type PayrollDeductionRefundRequiredDataV1 = {
>   receipt_id: string
>   account_id: string
>   product_version_id: string
>   payoff_effective_at: RFC3339
>   receipt_settled_at: RFC3339
>   amount: DecimalString
>   currency: string
>   required_at: RFC3339
> }
> ```

> [accordion] payroll\_overdeduction.refund\_required
>
> **Chave de definição:** `payroll_overdeduction.refund_required`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `refund_case_id`
>
> ```typescript theme={null}
> type PayrollOverdeductionRefundRequiredDataV1 = {
>   refund_case_id: string
>   loan_account_id: string
>   product_version_id: string
>   numero_contrato: string
>   competencia: YYYYMM
>   detecting_run_id: string
>   amount: DecimalString
>   currency: string
>   reversal_source_reference: string
>   required_at: RFC3339
> }
> ```

> [accordion] collection.instruction.issued
>
> **Chave de definição:** `collection.instruction.issued`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `instrument_id`
>
> ```typescript theme={null}
> type CollectionInstructionIssuedDataV1 = {
>   instrument_id: string
>   loan_account_id: string
>   instruction_ref: string
>   agent_name: string
>   agent_account_id: string
>   kind: string
>   numero_contrato: string
>   competencia?: YYYYMM
>   amount: DecimalString
>   currency: string
>   issued_at: RFC3339
>   valid_until: RFC3339
> }
> ```

> [accordion] guarantee\_recovery.cash\_allocated
>
> **Chave de definição:** `guarantee_recovery.cash_allocated`
>
> **Tópico:** `lerian.streaming.lender`
>
> **Esquema:** `1.0.0`
>
> **Assunto:** `receipt_id`
>
> ```typescript theme={null}
> type GuaranteeRecoveryCashAllocatedDataV1 = {
>   receipt_id: string
>   loan_account_id: string
>   disruption_ref: string
>   source_sequence: number
>   cash_source: string
>   amount: DecimalString
>   repayment_applied: DecimalString
>   prepayment_applied: DecimalString
>   unapplied: DecimalString
>   currency: string
>   settled_at: RFC3339
> }
> ```

## Catalogadas, mas não emitidas

Estas duas definições estão presentes no manifest, mas não têm chamador de emissão do Lender fora de teste. Não trate suas formas de origem `lender` como integrações operacionais.

| Chave de definição | `ce-type` derivado (não emitido) | Stream | Status |
| - | - | - | - |
| `consignado.averbacao.rejected` | `studio.lerian.lender.consignado_averbacao.rejected` | Fato | Espelho reservado de origem Lender. O Lender consome esse fato do gateway; veja Eventos consumidos. O Consignado emite o fato operacional com `ce-source: consignado-gw`. |
| `consignado.reconciliation.received` | `studio.lerian.lender.consignado_reconciliation.received` | Fato | Espelho reservado de origem Lender. O Lender consome esse fato do gateway; veja Eventos consumidos. O Consignado emite o fato operacional com `ce-source: consignado-gw`. |

## Eventos consumidos

O Lender conecta 15 chaves de fato do gateway a partir de `lerian.streaming.consignado-gw` e um fato do Matcher a partir de `lerian.streaming.matcher`. Cada consumidor é controlado por configuração e registrado no bootstrap.

| Produtor | Chave de definição | `ce-type` |
| - | - | - |
| `consignado-gw` | `consignado.contract.registered` | `studio.lerian.consignado-gw.consignado_contract.registered` |
| `consignado-gw` | `consignado.disbursement.confirmed` | `studio.lerian.consignado-gw.consignado_disbursement.confirmed` |
| `consignado-gw` | `consignado.averbacao.rejected` | `studio.lerian.consignado-gw.consignado_averbacao.rejected` |
| `consignado-gw` | `consignado.employment_status.reported` | `studio.lerian.consignado-gw.consignado_employment_status.reported` |
| `consignado-gw` | `consignado.redirecionamento.confirmed` | `studio.lerian.consignado-gw.consignado_redirecionamento.confirmed` |
| `consignado-gw` | `consignado.redirecionamento.rejected` | `studio.lerian.consignado-gw.consignado_redirecionamento.rejected` |
| `consignado-gw` | `consignado.reconciliation.received` | `studio.lerian.consignado-gw.consignado_reconciliation.received` |
| `consignado-gw` | `consignado.exclusao.confirmed` | `studio.lerian.consignado-gw.consignado_exclusao.confirmed` |
| `consignado-gw` | `consignado.exclusao.rejected` | `studio.lerian.consignado-gw.consignado_exclusao.rejected` |
| `consignado-gw` | `consignado.contract_correction.available` | `studio.lerian.consignado-gw.consignado_contract_correction.available` |
| `consignado-gw` | `consignado.disbursement_correction.available` | `studio.lerian.consignado-gw.consignado_disbursement_correction.available` |
| `consignado-gw` | `consignado_portabilidade.efetivada` | `studio.lerian.consignado-gw.consignado_portabilidade.efetivada` |
| `consignado-gw` | `consignado_portabilidade.rejeitada` | `studio.lerian.consignado-gw.consignado_portabilidade.rejeitada` |
| `consignado-gw` | `consignado_refinanciamento.efetivado` | `studio.lerian.consignado-gw.consignado_refinanciamento.efetivado` |
| `consignado-gw` | `consignado_refinanciamento.revertido` | `studio.lerian.consignado-gw.consignado_refinanciamento.revertido` |
| `matcher` | `match_run.completed` | `studio.lerian.matcher.match_run.completed` |

O gateway tem caminhos de emissão para as primeiras 13 chaves de gateway listadas. O par de portabilidade apenas chega ao Lender quando seu consumidor de resultados está habilitado e o manifest do gateway em produção declara o evento. O manifest não declara os dois resultados de refinanciamento, então esses dois listeners não recebem tráfego do runtime atual do gateway. O Lender não registra `consignado.proposal.accepted`. Essa chave não é uma entrada de registro do Lender.

## Planos de eventos internos

O Lender também grava tipos de evento de outbox internos para intenções de ledger, trabalho de cobrança e handoffs assinados do hub. Eles são contratos de coordenação locais ao processo, não entradas do catálogo de eventos. Este inventário público os omite propositalmente.

## Regras de entrega e compatibilidade

* Faça a deduplicação por `(ce-source, ce-id)` e torne os handlers idempotentes.
* Leia `ce-schemaversion` antes de decodificar. A versão é um header do CloudEvents, nunca um sufixo de tópico.
* Valores monetários e taxas são strings decimais. Os timestamps são RFC 3339 em UTC.
* Os consumidores de fatos conectados filtram chaves exatas. Eles ignoram e fazem commit dos fatos não correspondentes nos tópicos de aplicação compartilhados. Registros malformados tratados seguem a política de DLQ do consumidor.
* Um identificador de negócio obrigatório ausente impede a emissão ou a execução do comando. O Lender nunca o sintetiza.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.