Skip to content

Instantly share code, notes, and snippets.

@ldlsegovia
Created July 29, 2020 13:35
Show Gist options
  • Save ldlsegovia/fae7e3ec869de558a3aa4160592f96d8 to your computer and use it in GitHub Desktop.
Save ldlsegovia/fae7e3ec869de558a3aa4160592f96d8 to your computer and use it in GitHub Desktop.

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 el conversion_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 el conversion_rate para pasar a CLP y se guarda en CLP. El conversion_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í:

  1. 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.
  2. 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.
  3. 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.

Revalorización

Podrían ser nuevas entries, nada especial acá. En Buda crearíamos ese modelo Revaluation para asociar como respaldo y ya

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment