snappler_contable 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +315 -0
- data/Rakefile +38 -0
- data/app/models/ledger_account.rb +151 -0
- data/app/models/ledger_account_activo.rb +6 -0
- data/app/models/ledger_account_pasivo.rb +6 -0
- data/app/models/ledger_account_patrimonio_neto.rb +6 -0
- data/app/models/ledger_account_resultado_negativo.rb +6 -0
- data/app/models/ledger_account_resultado_positivo.rb +6 -0
- data/app/models/ledger_currency.rb +3 -0
- data/app/models/ledger_entry.rb +3 -0
- data/app/models/ledger_move.rb +54 -0
- data/lib/generators/snappler_contable/initializer_generator.rb +9 -0
- data/lib/generators/snappler_contable/migrate_generator.rb +24 -0
- data/lib/generators/snappler_contable/templates/snappler_contable_app_ledger_accounts.rb +17 -0
- data/lib/generators/snappler_contable/templates/snappler_contable_migrate.rb +57 -0
- data/lib/snappler_contable/ext/string.rb +5 -0
- data/lib/snappler_contable/railtie.rb +4 -0
- data/lib/snappler_contable/snappler_contable.rb +131 -0
- data/lib/snappler_contable/snappler_contable_active_record_extension.rb +172 -0
- data/lib/snappler_contable/tree_node.rb +47 -0
- data/lib/snappler_contable/version.rb +3 -0
- data/lib/snappler_contable.rb +19 -0
- data/lib/tasks/snappler_contable_tasks.rake +4 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +58 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/snappler_contable_test.rb +7 -0
- data/test/test_helper.rb +15 -0
- metadata +127 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
class SnapplerContableAppLedgerAccounts < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
activo = LedgerAccountActivo.first
|
4
|
+
# sub_cuenta_activo_1 = activo.add_child("Sub Cuenta Activo 1")
|
5
|
+
# sub_cuenta_activo_2 = activo.add_child("Sub Cuenta Activo 2")
|
6
|
+
# sub_sub_cuenta_activo = sub_cuenta_activo_2.add_child("Sub Sub Cuenta Activo 1")
|
7
|
+
|
8
|
+
pasivo = LedgerAccountPasivo.first
|
9
|
+
patrimonio_neto = LedgerAccountPatrimonioNeto.first
|
10
|
+
resultado_positivo = LedgerAccountResultadoPositivo.first
|
11
|
+
resultado_negativo = LedgerAccountResultadoNegativo.first
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.down
|
15
|
+
LedgerAccount.destroy_all("master_ledger_account_id <> 0")
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
class SnapplerContableMigrate < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :ledger_accounts do |t|
|
4
|
+
t.string :name
|
5
|
+
t.integer :balance_sum, :default => 0
|
6
|
+
t.string :code
|
7
|
+
t.string :code_name
|
8
|
+
t.integer :order_column
|
9
|
+
t.references :contable, :polymorphic => true
|
10
|
+
t.integer :master_ledger_account_id
|
11
|
+
t.string :type
|
12
|
+
|
13
|
+
t.timestamps
|
14
|
+
end
|
15
|
+
add_index :ledger_accounts, :contable_id
|
16
|
+
|
17
|
+
#Las primeras 5 deben existir
|
18
|
+
aa = LedgerAccountActivo.create(name: 'Activo', code: '1', master_ledger_account_id: '0')
|
19
|
+
ap = LedgerAccountPasivo.create(name: 'Pasivo', code: '2', master_ledger_account_id: '0')
|
20
|
+
apn = LedgerAccountPatrimonioNeto.create(name: 'Patrimonio Neto', code: '3', master_ledger_account_id: '0')
|
21
|
+
arp = LedgerAccountResultadoPositivo.create(name: 'Resultado Positivo', code: '4', master_ledger_account_id: '0')
|
22
|
+
arn = LedgerAccountResultadoNegativo.create(name: 'Resultado Negativo', code: '5', master_ledger_account_id: '0')
|
23
|
+
|
24
|
+
create_table :ledger_moves do |t|
|
25
|
+
t.references :ledger_entry
|
26
|
+
t.references :ledger_account
|
27
|
+
t.string :dh, :limit => 1
|
28
|
+
t.integer :value, :default => 0
|
29
|
+
t.references :ledger_currency
|
30
|
+
t.float :currency_ratio
|
31
|
+
|
32
|
+
t.timestamps
|
33
|
+
end
|
34
|
+
add_index :ledger_moves, :ledger_entry_id
|
35
|
+
add_index :ledger_moves, :ledger_account_id
|
36
|
+
add_index :ledger_moves, :ledger_currency_id
|
37
|
+
|
38
|
+
create_table :ledger_entries do |t|
|
39
|
+
t.timestamps
|
40
|
+
end
|
41
|
+
|
42
|
+
create_table :ledger_currencies do |t|
|
43
|
+
t.string :name
|
44
|
+
t.string :code
|
45
|
+
|
46
|
+
t.timestamps
|
47
|
+
end
|
48
|
+
LedgerCurrency.create(name: 'Peso', code: 'ARS')
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.down
|
52
|
+
drop_table :ledger_accounts
|
53
|
+
drop_table :ledger_moves
|
54
|
+
drop_table :ledger_entries
|
55
|
+
drop_table :ledger_currencies
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
|
2
|
+
module SnapplerContable
|
3
|
+
|
4
|
+
def self.default_currency=(default_currency)
|
5
|
+
@my_default_currrency = default_currency
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.default_currency
|
9
|
+
#@my_default_currrency
|
10
|
+
LedgerCurrency.find_by_code(@my_default_currrency)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.valid_operations=(operations)
|
14
|
+
@my_valid_operations = operations
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def self.valid_operations
|
19
|
+
@my_valid_operations
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def self.accounts_tree
|
24
|
+
tree = TreeNode.new(nil, true)
|
25
|
+
tree.add_child_ledger_accounts(LedgerAccount.where(:master_ledger_account_id => 0))
|
26
|
+
return tree
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.account_sub_tree(ledger_account)
|
30
|
+
tree = TreeNode.new(nil, true)
|
31
|
+
tree.add_child_ledger_accounts([ledger_account])
|
32
|
+
return tree
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.re_code_tree
|
36
|
+
LedgerAccount.where(:master_ledger_account_id => 0).each do |account|
|
37
|
+
account.re_code('')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.extract_accounts(moves_array, operation, debe_haber)
|
42
|
+
|
43
|
+
res_accounts = []
|
44
|
+
moves_array.each do |move|
|
45
|
+
move[:dh] = debe_haber
|
46
|
+
if move.key? :account
|
47
|
+
acc = move[:account]
|
48
|
+
if (acc.class.to_s == 'LedgerAccount') or (acc.class.superclass.to_s == 'LedgerAccount')
|
49
|
+
res_accounts << move
|
50
|
+
else
|
51
|
+
if move.key? :operation
|
52
|
+
oper = move[:operation]
|
53
|
+
else
|
54
|
+
oper = operation
|
55
|
+
end
|
56
|
+
if oper.nil?
|
57
|
+
raise "No se puede extraer la cuenta del objeto #{acc.class.to_s} con operation == nil"
|
58
|
+
else
|
59
|
+
unless acc.nil?
|
60
|
+
if acc.respond_to? "get_ledger_account_by_operation"
|
61
|
+
move[:account] = acc.get_ledger_account_by_operation(oper)
|
62
|
+
res_accounts << move
|
63
|
+
else
|
64
|
+
raise "La clase #{acc.class.to_s} no implementa el modulo contable."
|
65
|
+
end
|
66
|
+
else
|
67
|
+
raise "Se paso como cuenta un objeto Nil"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
else
|
72
|
+
raise "El hash de movimiento no tiene :account - #{move}"
|
73
|
+
end
|
74
|
+
unless move.key? :value
|
75
|
+
raise "El hash de movimiento no tiene :value - #{move}"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
return res_accounts
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.op(array_debe, array_haber, operation_debe = nil, operation_haber = nil)
|
82
|
+
|
83
|
+
if operation_haber.nil?
|
84
|
+
operation_haber = operation_debe
|
85
|
+
end
|
86
|
+
|
87
|
+
#TODO Verificar si viene el mismo objeto en el debe y el haber y pedir DOS operaciones
|
88
|
+
debe_accounts = extract_accounts(array_debe, operation_debe, 'D')
|
89
|
+
haber_accounts = extract_accounts(array_haber, operation_haber, 'H')
|
90
|
+
|
91
|
+
total_debe = debe_accounts.inject(0){|init, move| init + move[:value] }
|
92
|
+
total_haber = haber_accounts.inject(0){|init, move| init + move[:value] }
|
93
|
+
|
94
|
+
if total_haber != total_debe
|
95
|
+
raise "Las sumas del DEBE y HABER son diferentes - debe: #{total_debe} haber: #{total_haber}"
|
96
|
+
end
|
97
|
+
|
98
|
+
all_moves = debe_accounts + haber_accounts
|
99
|
+
|
100
|
+
#verificando si todos los movimientos tienen orden
|
101
|
+
if all_moves.inject(true){|res, move| res & (move.key? :order)}
|
102
|
+
all_moves.sort!{|a, b| a[:order] <=> b[:order]}
|
103
|
+
end
|
104
|
+
|
105
|
+
dc = SnapplerContable.default_currency
|
106
|
+
|
107
|
+
le = LedgerEntry.create
|
108
|
+
all_moves.each do |m|
|
109
|
+
if m.key? :currency
|
110
|
+
if m[:currency].is_a? Numeric
|
111
|
+
m[:currency] = LedgerCurrency.find(m[:currency])
|
112
|
+
end
|
113
|
+
unless m.key? :currency_ratio
|
114
|
+
m[:currency_ratio] = 1
|
115
|
+
end
|
116
|
+
else
|
117
|
+
m[:currency] = dc
|
118
|
+
m[:currency_ratio] = 1
|
119
|
+
end
|
120
|
+
le.ledger_moves.build(ledger_account: m[:account], value: m[:value], dh: m[:dh], ledger_currency: m[:currency], currency_ratio: m[:currency_ratio])
|
121
|
+
end
|
122
|
+
|
123
|
+
if le.save
|
124
|
+
le
|
125
|
+
else
|
126
|
+
le.destroy
|
127
|
+
raise "Fallo la creacion del movimiento: #{all_moves}"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
module SnapplerContable
|
2
|
+
module SnapplerContableActiveRecordExtension
|
3
|
+
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
base.extend ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
# add your static(class) methods here
|
10
|
+
module ClassMethods
|
11
|
+
#act_as_snappler_contable(:accounts => [:acc_1, :acc_2],
|
12
|
+
# :account_by_operation => {:oper_1 => :acc_1, :oper_2 => :acc_2})
|
13
|
+
#
|
14
|
+
def act_as_snappler_contable(config_hash = nil)
|
15
|
+
if config_hash.nil? or config_hash.class.to_s != "Hash"
|
16
|
+
raise "\nError en la declaracion de act_as_snappler_contable en la clase #{name}\nUso de act_as_snappler_contable:\n #act_as_snappler_contable(:accounts => [:acc_1, :acc_2],\n # :account_by_operation => {:oper_1 => :acc_1,\n # :oper_2 => :acc_2})\n"
|
17
|
+
end
|
18
|
+
|
19
|
+
if config_hash.key? :accounts
|
20
|
+
|
21
|
+
ledger_account_aux = config_hash[:accounts]
|
22
|
+
@my_ledger_accounts = {}
|
23
|
+
ledger_account_aux.each do |account|
|
24
|
+
#si es hash, esta relacionado con otro objeto
|
25
|
+
if account.is_a? Hash
|
26
|
+
account.each_pair do |key, value|
|
27
|
+
@my_ledger_accounts[key] = value unless @my_ledger_accounts.key? key
|
28
|
+
end
|
29
|
+
else
|
30
|
+
@my_ledger_accounts[account] = nil unless @my_ledger_accounts.key? account
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
@my_ledger_accounts.each_key do |code_name|
|
35
|
+
|
36
|
+
if LedgerAccount.find_by_code_name(code_name.to_s.snp_underscore).nil?
|
37
|
+
raise "La cuenta '#{code_name}' (code_name: '#{code_name.to_s.snp_underscore}') no existe como cuenta contable LedgerAccount"
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
else
|
42
|
+
raise "La clase '#{self.class}' no declara cuentas en 'act_as_snappler_contable{:accounts => []}'"
|
43
|
+
end
|
44
|
+
|
45
|
+
if config_hash.key? :account_by_operation
|
46
|
+
@my_op_account_hash = config_hash[:account_by_operation]
|
47
|
+
#chequea que todas las operaciones existan
|
48
|
+
valid_ops = SnapplerContable.valid_operations
|
49
|
+
@my_op_account_hash.each_pair do |oper, acc|
|
50
|
+
unless valid_ops.include? oper
|
51
|
+
raise "La clase #{self.name} declara la operacion ':#{oper}', que no existe como operacion valida en 'config/initializers/snappler_contable.rb'"
|
52
|
+
end
|
53
|
+
unless @my_ledger_accounts.include? acc
|
54
|
+
raise "La clase #{self.name} indica: ':#{oper} => :#{acc}', pero la cuenta '#{acc}' no esta incluida en 'act_as_snappler_contable{:accounts => []}'"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
else
|
58
|
+
raise "La clase '#{self.class}' no declara cuenta por operacion en 'act_as_snappler_contable{:account_by_operation => []}'"
|
59
|
+
end
|
60
|
+
|
61
|
+
#Definicion de metodos
|
62
|
+
|
63
|
+
define_method(:get_parent_belongs_to) do |ledger_account_code_name|
|
64
|
+
parent_belongs_to = self.class.get_my_ledger_accounts[ledger_account_code_name]
|
65
|
+
|
66
|
+
unless parent_belongs_to.nil?
|
67
|
+
unless self.respond_to? parent_belongs_to
|
68
|
+
raise "No existe la relacion 'belongs_to :#{parent_belongs_to}' en la clase #{self.class}"
|
69
|
+
end
|
70
|
+
|
71
|
+
if eval("self.#{parent_belongs_to.to_s}").nil?
|
72
|
+
raise "El objeto de la relacion belongs_to :#{parent_belongs_to} es nil. Class #{self.class} belongs_to :#{parent_belongs_to} - id: #{self.id}"
|
73
|
+
end
|
74
|
+
|
75
|
+
parent_object = eval("self.#{parent_belongs_to.to_s}")
|
76
|
+
|
77
|
+
return parent_belongs_to, parent_object
|
78
|
+
|
79
|
+
else
|
80
|
+
return nil, nil
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
define_method(:get_name_and_code_name) do |ledger_account_code_name|
|
85
|
+
|
86
|
+
parent_belongs_to, parent_object = get_parent_belongs_to(ledger_account_code_name)
|
87
|
+
if parent_belongs_to.nil?
|
88
|
+
|
89
|
+
name_aux = ledger_account_code_name.to_s.titleize + " "
|
90
|
+
code_name_aux = name_aux
|
91
|
+
else
|
92
|
+
|
93
|
+
parent_object_account = parent_object.get_ledger_account_by_code_name(ledger_account_code_name)
|
94
|
+
parent_name_aux, parent_code_name_aux = parent_object.get_name_and_code_name(ledger_account_code_name)
|
95
|
+
name_aux = parent_name_aux + " "
|
96
|
+
code_name_aux = parent_code_name_aux + " "
|
97
|
+
end
|
98
|
+
name_aux += self.class.to_s
|
99
|
+
name_aux += ":"
|
100
|
+
|
101
|
+
#TODO configuracion del campo "name" para que pueda tomar otro campo para nombre
|
102
|
+
name_aux += (self.respond_to?(:name)) ? self.name.to_s.titleize : self.id.to_s
|
103
|
+
code_name_aux += "#{self.class.to_s} #{self.id.to_s}"
|
104
|
+
code_name_aux = code_name_aux.snp_underscore
|
105
|
+
return name_aux, code_name_aux
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
define_method(:get_ledger_account_by_operation) do |operation|
|
110
|
+
if SnapplerContable.valid_operations.include? operation
|
111
|
+
ledger_account_code_name = self.class.get_my_accounts_by_operation[operation]
|
112
|
+
if ledger_account_code_name.blank?
|
113
|
+
raise "La operacion ':#{operation.to_s}' no esta incluida como :account_by_operation en la sentencia 'act_as_snappler_contable' de la clase #{self.class.to_s.titleize}"
|
114
|
+
else
|
115
|
+
return get_ledger_account_by_code_name(ledger_account_code_name)
|
116
|
+
end
|
117
|
+
else
|
118
|
+
raise "La operacion ':#{operation.to_s}' no esta incluida como valid_operation en 'config/initializers/snappler_contable.rb'"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
define_method(:get_ledger_account_by_code_name) do |ledger_account_code_name|
|
123
|
+
if self.class.get_my_ledger_accounts.include? ledger_account_code_name
|
124
|
+
if self.persisted?
|
125
|
+
name_aux, code_name_aux = get_name_and_code_name(ledger_account_code_name)
|
126
|
+
res_ledger_account = LedgerAccount.find_by_code_name(code_name_aux)
|
127
|
+
if res_ledger_account.nil?
|
128
|
+
#no existe la cuenta relacionada, se crea
|
129
|
+
#verifica que no este en relacion belongs_to
|
130
|
+
parent_belongs_to, parent_object = get_parent_belongs_to(ledger_account_code_name)
|
131
|
+
if parent_belongs_to.nil?
|
132
|
+
master_ledger_account = LedgerAccount.find_by_code_name(ledger_account_code_name.to_s)
|
133
|
+
else
|
134
|
+
master_ledger_account = parent_object.get_ledger_account_by_code_name(ledger_account_code_name)
|
135
|
+
end
|
136
|
+
if not master_ledger_account.nil?
|
137
|
+
#uso la clase del padre para crear la cuenta de objeto
|
138
|
+
res_ledger_account = master_ledger_account.class.create(name: name_aux, code_name: code_name_aux, master_ledger_account: master_ledger_account, contable: self )
|
139
|
+
return res_ledger_account
|
140
|
+
else
|
141
|
+
raise "No existe la cuenta padre #{ledger_account_code_name.to_s}"
|
142
|
+
end
|
143
|
+
else
|
144
|
+
#se devuelve la cuenta relacionada
|
145
|
+
return res_ledger_account
|
146
|
+
end
|
147
|
+
else
|
148
|
+
raise "El objeto de clase #{self.class} aun no esta persistido, no tiene cuenta #{ledger_account_code_name.to_s} asociada"
|
149
|
+
end
|
150
|
+
else
|
151
|
+
raise "La clase '#{self.class.to_s.titleize}' no esta vinculada a la cuenta #{ledger_account_code_name.to_s}"
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
define_method(:ledger_accounts) do
|
156
|
+
res = self.class.get_my_ledger_accounts.map{|a| a.first}
|
157
|
+
res.map{|acc_code_name| get_ledger_account_by_code_name(acc_code_name)}
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def get_my_accounts_by_operation
|
162
|
+
@my_op_account_hash
|
163
|
+
end
|
164
|
+
|
165
|
+
def get_my_ledger_accounts
|
166
|
+
@my_ledger_accounts
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module SnapplerContable
|
2
|
+
class TreeNode
|
3
|
+
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
attr_accessor :object, :childrens, :root
|
7
|
+
|
8
|
+
def initialize(account, root=false)
|
9
|
+
if root
|
10
|
+
@object = 'ROOT'
|
11
|
+
else
|
12
|
+
@object = account
|
13
|
+
end
|
14
|
+
@childrens = []
|
15
|
+
@root = root
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_child_ledger_accounts(accounts)
|
19
|
+
accounts.each do |account|
|
20
|
+
node = TreeNode.new(account)
|
21
|
+
childrens << node
|
22
|
+
node.add_child_ledger_accounts(account.child_ledger_accounts)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def name
|
27
|
+
root ? 'ROOT' : "#{object.code} : #{object.name} (#{object.id})"
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_s(indent=0)
|
31
|
+
res = (' ' * indent) + "#{name}\n"
|
32
|
+
res = res + @childrens.map{ |child| " " + child.to_s(indent + 4)}.join("\n")
|
33
|
+
res.gsub("\n\n", "\n")
|
34
|
+
end
|
35
|
+
|
36
|
+
def each(&block)
|
37
|
+
unless root
|
38
|
+
block.call object
|
39
|
+
end
|
40
|
+
childrens.each do |child|
|
41
|
+
child.each(&block)
|
42
|
+
end
|
43
|
+
self
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "snappler_contable/ext/string"
|
2
|
+
require "snappler_contable/snappler_contable_active_record_extension"
|
3
|
+
require "snappler_contable/snappler_contable"
|
4
|
+
require "snappler_contable/tree_node"
|
5
|
+
|
6
|
+
module SnapplerContable
|
7
|
+
|
8
|
+
# To setup run $ rails generate snappler_contable:install
|
9
|
+
def self.setup
|
10
|
+
yield self
|
11
|
+
end
|
12
|
+
|
13
|
+
class ActiveRecord::Base
|
14
|
+
include SnapplerContableActiveRecordExtension
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'snappler_contable/railtie' if defined?(Rails)
|