Me imagino algo así:
Ledgerizer.setup do |conf|
conf.tenant(:subsidiary, currency: :clp) do
conf.liability :user_funds_custody, currencies: [:clp, :btc] # estas son las currencies que acepta la cuenta
conf.asset :user_funds_to_confirm, currencies: [:clp, :btc]
conf.entry :user_deposit, document: :ledger_line do
conf.debit account: :user_funds_to_confirm, accountable: :account
conf.credit account: :user_funds_custody, accountable: :account
end
conf.entry :user_deposit_espejo, document: :ledger_line do # no sé bien cómo llamarle a esta entry pero no importa porque podría tener cualquier nombre
conf.debit account: :user_funds_to_confirm # las cuentas también podrían ser las que se nos ocurran. Vos decís que tiene sentido tenerlas relacionadas con el tenant y me parece bien.
conf.credit account: :user_funds_custody
end
end
end
En la ejecución, tendríamos algo así:
def perform
execute_user_deposit_entry(
tenant: tenant,
document: line,
datetime: line.created_at
) do
debit(account: :user_funds_to_confirm, accountable: account, amount: amount)
credit(account: :user_funds_custody, accountable: account, amount: amount)
end
execute_user_deposit_espejo_entry(
tenant: tenant,
document: line,
datetime: line.created_at,
conversion_rate: Money.new(8478,085, :clp)
) do
debit(account: :user_funds_to_confirm, amount: amount)
credit(account: :user_funds_custody, amount: amount)
end
end
Entonces, al ejecutar execute_user_deposit_entry
pasa lo de siempre pero, al ejecutar execute_user_deposit_espejo_entry
:
- si el
amount
es clp, podría ignorar elconversion_rate
o dar un error porque se espera que el amount sea distinto a CLP. - si el
amount
es distinto a la base, se usa elconversion_rate
para pasar a CLP y se guarda en CLP. Elconversion_rate
quedaría guardado en el entry. - la
LedgerLine
podría ser el respaldo de las dos entries, no hace falta que sea otra cosa.
Las ventajas de tenerlo así:
- la entry sigue siendo la suma de creditos + debitos = 0 sin hacer un truco de sumar las monedas que son iguales ni torcerle la mano.
- permite registrar distintas monedas y mantener eso separado del funcionamiento de la cuenta espejo. Que acá se traduciría a una entry normal que necesita convertir sus montos antes de guardarse.
- permite explicitamente registrar una cuenta con conversión (no me gusta la idea de que sea algo que sucede por debajo y que funcione distinto al resto de las cuentas)
Alternativa a lo anterior:
A la entry espejo no se le pasa el conversion_rate
desde afuera. Podríamos tener algo así:
execute_user_deposit_espejo_entry(
tenant: tenant,
document: line,
datetime: line.created_at,
convert_to_base_currency: true
) do
debit(account: :user_funds_to_confirm, amount: amount)
credit(account: :user_funds_custody, amount: amount)
end
Le pasaríamos convert_to_base_currency: true
entonces la gema sabría que tiene que tomar la moneda del amount y convertir a la base_currency.
Podrían ser nuevas entries, nada especial acá. En Buda crearíamos ese modelo Revaluation para asociar como respaldo y ya