Saltar al contenido principal
Version: 0.62.0-rc.1266

Integración con Cala Ledger

Este documento describe la integración con Cala Ledger para contabilidad por partida doble.

Descripción general​

Cala Ledger proporciona:

  • Contabilidad por partida doble
  • Gestión de jerarquía de cuentas
  • Cálculo de saldos
  • Plantillas de transacciones

Arquitectura​

Jerarquía de cuentas​

Tipos de cuentas​

CuentaTipoPropósito
EfectivoActivoEfectivo del banco
Préstamos por cobrarActivoPrincipal de préstamos pendientes
Depósitos de clientesPasivoSaldos de depósitos de clientes
Ingresos por interesesIngresosIntereses ganados
Gastos por interesesGastosIntereses pagados

Plantillas de transacciones​

Registro de depósito​

DÉBITO: Efectivo (Activo) $1,000
CRÉDITO: Depósito de cliente (Pasivo) $1,000

Desembolso de préstamo​

DÉBITO: Préstamos por cobrar (Activo) $10,000
CRÉDITO: Efectivo (Activo) $10,000

Devengo de intereses​

DÉBITO: Intereses por cobrar (Activo) $100
CRÉDITO: Ingresos por intereses (Ingresos) $100

Pago de préstamo​

DÉBITO: Efectivo (Activo) $500
CRÉDITO: Préstamos por cobrar (Activo) $400
CRÉDITO: Intereses por cobrar (Activo) $100

Adaptador de libro mayor​

pub struct DepositLedger {
cala: CalaClient,
}

impl DepositLedger {
pub async fn record_deposit(
&self,
account_id: AccountId,
amount: UsdCents,
) -> Result<TransactionId> {
let entries = vec![
Entry::debit(self.cash_account, amount),
Entry::credit(account_id, amount),
];

self.cala.post_transaction(entries).await
}

pub async fn process_withdrawal(
&self,
account_id: AccountId,
amount: UsdCents,
) -> Result<TransactionId> {
let entries = vec![
Entry::debit(account_id, amount),
Entry::credit(self.cash_account, amount),
];

self.cala.post_transaction(entries).await
}
}

Consultas de Saldo​

Saldo de Cuenta​

pub async fn get_balance(&self, account_id: AccountId) -> Result<Balance> {
self.cala.get_balance(account_id).await
}

pub struct Balance {
pub settled: UsdCents,
pub pending: UsdCents,
pub available: UsdCents,
}

Balance de Comprobación​

pub async fn trial_balance(&self, as_of: DateTime<Utc>) -> Result<TrialBalance> {
self.cala.trial_balance(as_of).await
}

Registro de Transacciones​

Todas las transacciones se registran con:

  • ID de transacción único
  • Marca de tiempo
  • ID de correlación (para rastreo)
  • Descripción
  • Detalles de entrada

Garantías de Consistencia​

  • Transacciones atómicas (todo o nada)
  • Entradas balanceadas (débitos = créditos)
  • Historial de transacciones inmutable
  • Pista de auditoría para todos los cambios