SnapplerContable
Esta gema agrega a una aplicacion la capacidad de manejar cuentas contables con el modelo teorico economico.
Instalacion
Agregar esta linea al Gemfile
gem "snappler_contable_multicurrency"
Ejecutar
$ bundle install
Después de instalar se deben correr estos comandos
$ rails g snappler_contable:initializer
Esto va a crear el achivo:
config/initializers/snappler_contable.rb
$ rails g snappler_contable:migrate
Esto va a crear las migraciones:
aaaammdd_snappler_contable_migrate.rb
aaaammdd_snappler_contable_add_currencies.rb
aaaammdd_snappler_contable_app_ledger_accounts.rb
$ rake db:migrate
Y listo
$ rails g snappler_contable:new_currency
Esto crea una migracion simulando una nueva moneda, ejemplo el YEN
aaaammdd_snappler_contable_new_currency.rb
Problemas en Rails
Migrations
Versión de ActiveRecord
Si muestra un error como este al migrar:
Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release
Se debe agregar la versión de Rails en la definición de la superclase en las migraciones:
class SnapplerContableMigrate <ActiveRecord::Migration
...
Agregar:
class SnapplerContableMigrate <ActiveRecord::Migration[5.1]
...
Error crando cuentas base (activo, pasivo...)
Rails agregó un control
---```bash
$ rails g snappler_contable:initializer
Esto va a crear el achivo:
```bash
# Configuracion de constantes para el sistema.
config/initializers/snappler_contable.rb
$ rails g snappler_contable:migrate
Esto va a crear las migraciones:
aaaammdd_snappler_contable_migrate.rb
aaaammdd_snappler_contable_add_currencies.rb
aaaammdd_snappler_contable_app_ledger_accounts.rb
$ rake db:migrate
Y listo
$ rails g snappler_contable:new_currency
Esto crea una migracion simulando una nueva moneda, ejemplo el YEN
aaaammdd_snappler_contable_new_currency.rb
Problemas en Rails
Migrations
Versión de ActiveRecord
Si muestra un error como este al migrar:
Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release
Se debe agregar la versión de Rails en la definición de la superclase en las migraciones:
class SnapplerContableMigrate <ActiveRecord::Migration
...
Agregar:
class SnapplerContableMigrate <ActiveRecord::Migration[5.1]
...
Error crando cuentas base (activo, pasivo...)
Rails agregó un control
---```bash
$ rails g snappler_contable:initializer
Esto va a crear el achivo:
```bash
# Configuracion de constantes para el sistema.
config/initializers/snappler_contable.rb
$ rails g snappler_contable:migrate
Esto va a crear las migraciones:
aaaammdd_snappler_contable_migrate.rb
aaaammdd_snappler_contable_add_currencies.rb
aaaammdd_snappler_contable_app_ledger_accounts.rb
$ rake db:migrate
Y listo
$ rails g snappler_contable:new_currency
Esto crea una migracion simulando una nueva moneda, ejemplo el YEN
aaaammdd_snappler_contable_new_currency.rb
Uso
Traer cuentas
xxxx = LedgerAccount.get('Nombre de cuenta')
Ejemplo:
activo = LedgerAccount.get('activo')
pasivo = LedgerAccount.get('pasivo')
patrimonio_neto = LedgerAccount.get('patrimonio_neto')
resultado_positivo = LedgerAccount.get('resultado_positivo')
resultado_negativo = LedgerAccount.get('resultado_negativo') (*)
(*) LedgerAccount.get('resultado_negativo') == LedgerAccount.get('Resultado Negativo')
Es similar, ya que el parametro se trata poniendo en minuscula y cambiando los " " por "_"
Agregar cuentas hijas
Agregar cuentas hija
xxxx = LedgerAccount.get('XXXX')
xxxx.add_child("YYYY", "yyyy")
Ejemplo:
activo = LedgerAccount.get('activo')
disponibilidades = activo.add_child("Disponibilidades", "disponibilidades")
caja = disponibilidades.add_child("Caja", "caja")
banco = disponibilidades.add_child("Banco", "banco")
dejando una estructura asi:
1 activo
1.1 disponibilidades
1.1.1 caja
1.1.2 banco
Agregar cuentas hija con objeto relacionado
xxxx = LedgerAccount.get('XXXX')
xxxx.add_child("ZZZZ", "zzzz", objeto_owner)
Ejemplo:
banco = LedgerAccount.get('banco')
banco_1 = Bank.find(1)
banco_acc_1 = banco.add_child(banco_1.name, "banco", banco_1)
banco_2 = Bank.find(2)
banco_acc_2 = banco.add_child(banco_2.name, "banco", banco_2)
dejando una estructura asi:
1 activo
1.1 disponibilidades
1.1.1 caja
1.1.2 banco
1.1.2.1 banco_1
1.1.2.2 banco_2
Generar Operaciones
entryX = SnapplerContable.op(array_debe(*), array_haber(*), hash(**))
(*) La estructura del array_debe o array_haber, es la misma, es un array de hashes, cada hash tiene la sig estructura:
{
account: cuenta_x,
value: XXX.XX,
ledger_currency: 'XXX',
represent_value: XXX.XX,
represent_ledger_currency: 'XXX',
currency_change: XXX.XX,
}
(**) El hash es opcional y su estructura es:
{
code_name: '',
owner: ''
datetime: DateTime
}
Ejemplo:
Movimiento Comun
entry1 = SnapplerContable.op([{account: cliente_1, value: 100}],
[{account: ventas, value: 100}])
Movimiento en otra divisa
entry2 = SnapplerContable.op([{account: cliente_1, value: 100, ledger_currency: 'USD'}],
[{account: ventas, value: 100, ledger_currency: 'USD'}])
Movimiento con variacion de divisas 1
entry3 = SnapplerContable.op([{account: caja, value: 152, ledger_currency: 'ARS'}],
[{account: cliente_1, value: 152, ledger_currency: 'ARS', represent_value: 10, represent_ledger_currency: 'USD', currency_change: 15.2}])
Movimiento con variacion de divisas 2
entry4 = SnapplerContable.op([{account: caja, value: 1520, ledger_currency: 'ARS'}],
[{account: caja, value: 1520, ledger_currency: 'ARS', represent_value: 100, represent_ledger_currency: 'USD', currency_change: 15.2}])
Consultas de saldo a una cuenta
xxxx = LedgerAccount.get('XXXX')
xxxx.balance_YYY(hash(*))
xxxx.balance(hash(*))
(*) El hash es opcional y su estructura es:
{
from: '',
to: DateTime
}
Ejemplo:
cliente_1 = LedgerAccount.get('cliente_1')
cliente_1.balance_ars
cliente_1.balance_usd
cliente_1.balance_ars({from: '20/10/2017'})
cliente_1.balance_usd({to: '20/10/2017'})
cliente_1.balance_usd({from: '20/10/2017', to: '22/10/2017'})
cliente_1.balance
cliente_1.balance({from: '20/10/2017', to: '22/10/2017'})
Helper que imprime el arbol de cuentas
<%= print_accounts_tree %>
RubyGems
Esta gema está publicada en RubyGems:
user: juan.labattaglia@snappler.com
Actualizacion
Una vez que hay una nueva versión, modificar lib/snappler_contable/version.rb
Luego ejecutar:
gem build snappler_contable_multicurrency.gemspec
gem push snappler_contable_multicurrency-[VERSION].gem