africompta 1.9.10 → 1.9.11

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +6 -1
  3. data/Gemfile.lock +14 -8
  4. data/africompta.gemspec +3 -2
  5. data/bin/afri_compta.rb +119 -0
  6. data/bin/africompta.sh +23 -0
  7. data/config.yaml.default +19 -0
  8. data/lib/africompta.rb +7 -1
  9. data/lib/africompta/acaccess.rb +54 -68
  10. data/lib/africompta/acqooxview.rb +10 -10
  11. data/lib/africompta/entities/account.rb +120 -116
  12. data/lib/africompta/entities/config_base.rb +9 -0
  13. data/lib/africompta/entities/remote.rb +240 -6
  14. data/lib/africompta/entities/report.rb +136 -0
  15. data/lib/africompta/entities/users.rb +18 -6
  16. data/lib/africompta/views/compta/admin.rb +135 -0
  17. data/lib/africompta/views/compta/check.rb +245 -0
  18. data/lib/africompta/views/compta/edit_accounts.rb +138 -0
  19. data/lib/africompta/views/compta/edit_movements.rb +167 -0
  20. data/lib/africompta/views/compta/remotes.rb +23 -0
  21. data/lib/africompta/views/compta/tabs.rb +9 -0
  22. data/lib/africompta/views/compta/users.rb +23 -0
  23. data/lib/africompta/views/report/compta_executive.rb +221 -0
  24. data/lib/africompta/views/report/compta_flat.rb +79 -0
  25. data/lib/africompta/views/report/tabs.rb +7 -2
  26. data/po/afri_compta-ar.po +2356 -0
  27. data/po/afri_compta-en.po +2253 -0
  28. data/po/afri_compta-fr.po +4345 -0
  29. data/test/ac_account.rb +176 -0
  30. data/{Test → test}/ac_africompta.rb +0 -0
  31. data/{Test → test}/ac_big.rb +0 -0
  32. data/test/ac_merge.rb +177 -0
  33. data/{Test → test}/ac_movement.rb +14 -1
  34. data/{Test → test}/ac_sqlite.rb +0 -0
  35. data/{Test → test}/config_test.yaml +1 -6
  36. data/test/other.conf +1 -0
  37. data/test/other.rb +18 -0
  38. data/test/test.conf +1 -0
  39. data/{Test → test}/test.rb +7 -14
  40. metadata +63 -18
  41. data/Test/ac_account.rb +0 -128
  42. data/lib/africompta/africompta.rb +0 -83
  43. data/lib/africompta/views/edit/movement.rb +0 -8
  44. data/lib/africompta/views/edit/tabs.rb +0 -8
  45. data/lib/africompta/views/report/annual.rb +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a91b9deaedb6cdd17d79b5c52d3fd3c1e028ec13
4
- data.tar.gz: 6734c25f6cb35d0096497db5e2d72cef12fb571d
3
+ metadata.gz: '08243c15dad8df272891c62ea2faf14f74da98ac'
4
+ data.tar.gz: cae8035c25a7289f8cd3901d81dd6470b17ccc7d
5
5
  SHA512:
6
- metadata.gz: a084bd9054e525ddcb3e1ade74d210f3d251a79622636c650e39cdcf4a360b3c5cb7071a0aa247fed0cd5e8fc39c0c02bafd19ac453906df2a96e3721702976f
7
- data.tar.gz: ffd82a27c7707fd174dd7abe110d2d07c84053d098e12e0c2698d90e63b06484c257c1b01b6feb5a254970150cf9402285b5440a46e75e0dcbfde59826cb93b3
6
+ metadata.gz: 98b9ecec86b7f200b922c36556bfb9ac2cc8f416e71b43260cdaeca5d31522a38b4e810ef2e6a0ed0b3494ddf7fa1aaaedf3c33bf1c3dcc6d55876a97ff9df14
7
+ data.tar.gz: ec678fd7608c2391ea85791fb6da89fab6c0acbff3bf538b1755390199bff3b6370604adadc36373e20bbbc415a2a17d4c5860e22e9d1c39169a782f1f2ec5ee
data/.gitignore CHANGED
@@ -8,8 +8,13 @@ config.yaml
8
8
  data
9
9
  tmp/
10
10
  .idea
11
+ *.mo
12
+ *.pot
11
13
  compta.db.*
12
14
  test/test.pdf
13
15
  test/*db
14
16
  test/data*
15
- /*gem
17
+ test/thread*
18
+ /*gem
19
+
20
+ afri_compta.conf
data/Gemfile.lock CHANGED
@@ -1,18 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- africompta (1.9.10.pre.1)
5
- qooxview (= 1.9.10.pre.1)
4
+ africompta (1.9.10)
5
+ prawn (= 1.0.0)
6
+ qooxview (= 1.9.10)
6
7
 
7
8
  PATH
8
9
  remote: ../HelperClasses
9
10
  specs:
10
- helper_classes (0.3.2)
11
+ helper_classes (0.3.5)
11
12
 
12
13
  PATH
13
14
  remote: ../QooxView
14
15
  specs:
15
- qooxview (1.9.10.pre.1)
16
+ qooxview (1.9.10)
16
17
  activemodel (= 3.1.1)
17
18
  activerecord (= 3.1.1)
18
19
  activesupport (= 3.1.1)
@@ -20,11 +21,11 @@ PATH
20
21
  chunky_png (= 1.3.4)
21
22
  docsplit (= 0.7.6)
22
23
  gettext (= 3.0.0)
23
- helper_classes (= 0.3.2)
24
+ helper_classes (= 0.3.5)
24
25
  i18n (= 0.6.0)
25
26
  iconv (= 1.0.3)
26
27
  iniparse (= 1.4.0)
27
- json (= 1.8.2)
28
+ json (= 2.1.0)
28
29
  locale (= 2.0.8)
29
30
  multi_json (= 1.0.3)
30
31
  net-ldap (= 0.5.1)
@@ -59,10 +60,14 @@ GEM
59
60
  i18n (0.6.0)
60
61
  iconv (1.0.3)
61
62
  iniparse (1.4.0)
62
- json (1.8.2)
63
+ json (2.1.0)
63
64
  locale (2.0.8)
64
65
  multi_json (1.0.3)
65
66
  net-ldap (0.5.1)
67
+ pdf-core (0.2.5)
68
+ prawn (1.0.0)
69
+ pdf-core (~> 0.2.2)
70
+ ttfunk (~> 1.1.1)
66
71
  rqrcode (0.4.2)
67
72
  rqrcode-with-patches (0.5.4)
68
73
  chunky_png
@@ -70,7 +75,8 @@ GEM
70
75
  serialport (1.3.1)
71
76
  sqlite3 (1.3.10)
72
77
  text (1.2.3)
73
- tzinfo (0.3.44)
78
+ ttfunk (1.1.1)
79
+ tzinfo (0.3.53)
74
80
 
75
81
  PLATFORMS
76
82
  ruby
data/africompta.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'africompta'
3
- s.version = '1.9.10'
3
+ s.version = '1.9.11'
4
4
  s.date = '2015-06-20'
5
5
  s.summary = 'Africompta-module for QooxView'
6
6
  s.description = 'With this module you can have a simple accounting-system.
@@ -19,5 +19,6 @@ see http://github.com/ineiti/AfriCompta_client .'
19
19
  'https://github.com/ineiti/AfriCompta'
20
20
  s.license = 'GPLv3'
21
21
 
22
- s.add_dependency 'qooxview', '1.9.10'
22
+ s.add_dependency 'qooxview', '1.9.11'
23
+ s.add_dependency 'prawn', '1.0.0'
23
24
  end
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ if ARGV == %w(-p)
5
+ DEBUG_LVL = 0
6
+ else
7
+ DEBUG_LVL = 2
8
+ end
9
+
10
+ require 'bundler/setup'
11
+ require 'helper_classes'
12
+ include HelperClasses
13
+ include System
14
+
15
+ Encoding.default_external = Encoding::UTF_8
16
+
17
+ require 'fileutils'
18
+
19
+ begin
20
+ require 'africompta'
21
+ if not FileTest.exists? $config_file
22
+ puts "Config-file doesn't exist, copying a standard one"
23
+ FileUtils.cp "#{File.join(AFRICOMPTA_DIR, '..', '..', 'config.yaml')}.default",
24
+ $config_file
25
+ load_config_yaml
26
+ end
27
+ rescue Exception => e
28
+ puts "#{e.inspect}"
29
+ puts "#{e.to_s}"
30
+ puts e.backtrace
31
+ exit
32
+ end
33
+
34
+ begin
35
+ QooxView::init('entities', 'views')
36
+ rescue Exception => e
37
+ case e.to_s
38
+ when /UpdatePot|MakeMo|PrintHelp|value_entity_uncomplete/
39
+ else
40
+ puts e.inspect
41
+ puts e.backtrace
42
+ dputs(0) { "Error: Couldn't load things!" }
43
+ dputs(0) { "#{e.inspect}" }
44
+ dputs(0) { "#{e.to_s}" }
45
+ puts e.backtrace
46
+ end
47
+ exit
48
+ end
49
+
50
+ webrick_port = get_config(3302, :Webrick, :port)
51
+ dputs(2) { "Starting at port #{webrick_port}" }
52
+
53
+ $profiling = get_config(nil, :profiling)
54
+ if $profiling
55
+ dputs(1) { 'Starting Profiling' }
56
+ require 'rubygems'
57
+ require 'perftools'
58
+ PerfTools::CpuProfiler.start("/tmp/#{$profiling}") do
59
+ QooxView::startWeb webrick_port, get_config(30, :profiling, :duration)
60
+ dputs(1) { 'Finished profiling' }
61
+ end
62
+
63
+ if $profiling
64
+ puts "Now run the following:
65
+ pprof.rb --pdf /tmp/#{$profiling} > /tmp/#{$profiling}.pdf
66
+ open /tmp/#{$profiling}.pdf
67
+ CPUPROFILE_FREQUENCY=500
68
+ "
69
+ end
70
+ else
71
+ dputs(1) { 'Starting autosave' }
72
+ $autosave = Thread.new {
73
+ loop {
74
+ sleep 60
75
+ rescue_all "Error: couldn't save all" do
76
+ Entities.save_all
77
+ end
78
+ }
79
+ }
80
+
81
+ # Shows time every minute in the logs
82
+ if get_config(false, :showTime)
83
+ dputs(1) { 'Showing time' }
84
+ $show_time = Thread.new {
85
+ loop {
86
+ sleep 60
87
+ dputs(1) { 'It is now: ' + Time.now.strftime('%Y-%m-%d %H:%M') }
88
+ }
89
+ }
90
+ end
91
+
92
+ # Catch SIGINT signal so we can save everything before quitting
93
+ trap('SIGINT') {
94
+ throw :ctrl_c
95
+ }
96
+
97
+ ConfigBase.set_functions(%w(accounting accounting_standalone))
98
+ # Finally start QooxView
99
+ catch :ctrl_c do
100
+ rescue_all 'Error: QooxView aborted' do
101
+ log_msg :main, "Started Gestion on port #{webrick_port}"
102
+ images_path = File.join(File.expand_path(File.dirname(__FILE__)), 'Images')
103
+ RPCQooxdooHandler.add_file_path(:Images, images_path)
104
+ include HelperClasses::HashAccessor
105
+ $config = {}
106
+ Welcome.nologin
107
+ QooxView::startWeb webrick_port
108
+ end
109
+ end
110
+
111
+ # Clean up all threads
112
+ if get_config(true, :autosave)
113
+ $autosave.kill
114
+ end
115
+ $show_time and $show_time.kill
116
+
117
+ # And finally save all before quitting
118
+ Entities.save_all
119
+ end
data/bin/africompta.sh ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env bash
2
+ cd "$( dirname ${BASH_SOURCE[0]} )/.."
3
+ DIR_AC="$(pwd)"
4
+ DIR_RES="$DIR_AC/.."
5
+
6
+ echo "DATA_DIR=$HOME/Library/AfriCompta" > ../afri_compta.conf
7
+ export PATH="$DIR_RES/ruby/bin:$PATH"
8
+ export GEM_PATH="$DIR_RES/ruby/lib/ruby"
9
+ echo path: $PATH
10
+ echo gem_path: $GEM_PATH
11
+ ruby --version
12
+ which ruby
13
+ pkill -f "afri_compta.rb"
14
+ bin/afri_compta.rb &
15
+ AFRICOMPTA=$!
16
+ sleep 5
17
+ echo $AFRICOMPTA
18
+ open -Wn -a Safari.app http://localhost:3302
19
+ kill $!
20
+ #open -a Safari.app http://localhost:3302/$!
21
+ #pkill -f "afri_compta.rb"
22
+ echo Done with AfriCompta
23
+ #read a
@@ -0,0 +1,19 @@
1
+ # Uncomment to automatically login admin
2
+ #autologin: admin
3
+ # Together with autologin, allows for more than one at the same time,
4
+ # for example for chat
5
+ #multilogin: true
6
+
7
+ StorageType:
8
+ CSV:
9
+ backup_count: 5
10
+
11
+ #profiling: profile.txt
12
+ # duration: 30
13
+
14
+ Webrick:
15
+ # port: 3302
16
+
17
+ Views:
18
+ # CourseTabs:
19
+ # order: 0
data/lib/africompta.rb CHANGED
@@ -1,2 +1,8 @@
1
1
  require 'bundler/setup'
2
- require 'africompta/africompta'
2
+ require 'qooxview'
3
+ require 'africompta/acaccess'
4
+ require 'africompta/acqooxview'
5
+
6
+ AFRICOMPTA_DIR = File.join(File.dirname(__FILE__), 'africompta')
7
+ QooxView.load_dirs(%w(entities views).collect { |d|
8
+ File.join(AFRICOMPTA_DIR, d) })
@@ -64,30 +64,6 @@ class ACaccess < RPCQooxdooPath
64
64
  ret
65
65
  end
66
66
 
67
- def self.accounts_fetch_old(user)
68
- ret = ''
69
-
70
- Accounts.matches_by_account_id(0).to_a.concat(
71
- Accounts.matches_by_account_id(nil)).sort { |a, b|
72
- a.global_id <=> b.global_id }.each { |a|
73
- dputs(2) { "Found one root-account #{a.rev_index} - #{a.path_id}" }
74
- if a.global_id
75
- dputs(3) { "It's global" }
76
- a.get_tree { |acc|
77
- dputs(4) { "In get_tree #{acc.path_id}: #{acc.deleted == true} - #{acc.rev_index}" }
78
- if acc.rev_index > user.account_index
79
- dputs(4) { "Found account #{acc.name} with index #{acc.rev_index}" }
80
- ret += "#{acc.to_s}\n"
81
- end
82
- }
83
- else
84
- dputs(3) { "It's not global" }
85
- end
86
- dputs(3) { 'Will search for next' }
87
- }
88
- ret
89
- end
90
-
91
67
  def self.accounts_fetch(user)
92
68
  Accounts.data.select { |_k, v| v._rev_index > user.account_index }.
93
69
  collect { |k, _v| Accounts.get_data_instance(k) }.
@@ -100,9 +76,9 @@ class ACaccess < RPCQooxdooPath
100
76
  # Two cases:
101
77
  # path/arg/user,pass - arg is used
102
78
  # path/user,pass - arg is nil
103
- path, arg, id = p.split("/")
79
+ path, arg, id = p.split('/')
104
80
  arg, id = id, arg if not id
105
- user, pass = id.split(",")
81
+ user, pass = id.split(',')
106
82
 
107
83
  log_msg 'ACaccess.get', "get-merge-path #{path} - #{arg} with " +
108
84
  "user #{user} and pass #{pass}"
@@ -120,52 +96,55 @@ class ACaccess < RPCQooxdooPath
120
96
  ret = ''
121
97
  dputs(2) { "user index is: #{u.account_index}" }
122
98
  # Returns only one account
123
- if $1 == '_one'
124
- return Accounts.match_by_global_id(arg).to_s
125
- end
126
- if $1 == '_all'
127
- dputs(2) { 'Putting all accounts' }
128
- ret = Accounts.search_all.collect { |acc|
129
- dputs(4) { "Found account #{acc.name} with index #{acc.rev_index}" }
130
- acc.to_s(true)
131
- }.join("\n")
132
- elsif $1 == '_count'
133
- ret += Accounts.search_all.size.to_s
134
- elsif $1 == '_part'
135
- acc_start, acc_end = arg.split(",")
136
- dputs(2) { "Putting accounts #{acc_start}..#{acc_end}" }
137
- Accounts.search_all.select { |acc|
138
- acc.rev_index >= acc_start.to_i and acc.rev_index <= acc_end.to_i
139
- }.each { |acc|
140
- dputs(4) { "Found account #{acc.name} with index #{acc.rev_index}" }
141
- ret += "#{acc.to_s(true)}\n"
142
- }
143
- else
144
- dputs(2) { 'Starting to search accounts' }
145
- t = Time.now
146
- ret += ACaccess.accounts_fetch(u)
147
- dputs(2) { "Found #{ret.count("\n")} after #{Time.now - t} seconds" }
99
+ case $1
100
+ when '_one'
101
+ return Accounts.match_by_global_id(arg).to_s
102
+ when '_all'
103
+ dputs(2) { 'Putting all accounts' }
104
+ ret = Accounts.search_all.collect { |acc|
105
+ dputs(4) { "Found account #{acc.name} with index #{acc.rev_index}" }
106
+ acc.to_s(true)
107
+ }.join("\n")
108
+ when '_count'
109
+ ret += Accounts.search_all.size.to_s
110
+ when '_part'
111
+ acc_start, acc_end = arg.split(',')
112
+ dputs(2) { "Putting accounts #{acc_start}..#{acc_end}" }
113
+ Accounts.search_all.select { |acc|
114
+ acc.rev_index >= acc_start.to_i and acc.rev_index <= acc_end.to_i
115
+ }.each { |acc|
116
+ dputs(4) { "Found account #{acc.name} with index #{acc.rev_index}" }
117
+ ret += "#{acc.to_s(true)}\n"
118
+ }
119
+ else
120
+ dputs(2) { 'Starting to search accounts' }
121
+ t = Time.now
122
+ ret += ACaccess.accounts_fetch(u)
123
+ dputs(2) { "Found #{ret.count("\n")} after #{Time.now - t} seconds" }
148
124
  end
149
125
  dputs(3) { 'Finished search' }
150
126
  return ret
151
-
152
127
  # Gets all movements (for the accounts of that user)
153
128
  when /movements_get(.*)/
154
129
  dputs(2) { "movements_get#{$1} with #{arg.inspect}" }
155
130
  start, stop = u.movement_index + 1, u_local.movement_index - 1
156
- # Returns only one account
157
- if $1 == '_one'
158
- return Movements.match_by_global_id(arg).to_s
159
- end
160
- if $1 == '_all_actual'
161
- start, stop = arg.split(/,/)
162
- ret = print_movements_actual(start, stop)
163
- else
164
- if $1 == '_all'
165
- start, stop = arg.split(/,/)
166
- end
167
- ret = print_movements(start, stop)
168
- end
131
+ ret = case $1
132
+ when '_one'
133
+ # Returns only one account
134
+ Movements.match_by_global_id(arg).to_s
135
+ when '_all_actual'
136
+ start, stop = arg.split(/,/)
137
+ print_movements_actual(start, stop)
138
+ when '_all'
139
+ Movements.search_all.collect { |m|
140
+ m.to_s
141
+ }.join("\n")
142
+ when '_range'
143
+ start, stop = arg.split(/,/)
144
+ print_movements(start, stop)
145
+ else
146
+ print_movements(start, stop)
147
+ end
169
148
  dputs(2) { "Sending a total of #{ret.length}" }
170
149
  dputs(3) { "Sending:\n #{ret.inspect}" }
171
150
  return ret
@@ -174,7 +153,7 @@ class ACaccess < RPCQooxdooPath
174
153
  return $VERSION.to_s
175
154
 
176
155
  when 'index'
177
- return [u_local.account_index, u_local.movement_index].join(",")
156
+ return [u_local.account_index, u_local.movement_index].join(',')
178
157
 
179
158
  when 'local_id'
180
159
  return u_local.full
@@ -196,11 +175,17 @@ class ACaccess < RPCQooxdooPath
196
175
  mov.delete
197
176
  end
198
177
  dputs(3) { 'Finished deleting' }
178
+
179
+ when 'get_db'
180
+ Entities.save_all
181
+ return IO.read(Accounts.storage[:SQLiteAC].db_file)
199
182
  end
183
+
200
184
  return ''
201
185
  end
202
186
 
203
187
  def self.post(path, input)
188
+ #dputs_func
204
189
  dputs(5) { "self.post with #{path} and #{input.inspect}" }
205
190
  log_msg 'ACaccess.post', "post-merge-path #{path} with " +
206
191
  "user #{input['user']} and pass #{input['pass']}"
@@ -231,7 +216,7 @@ class ACaccess < RPCQooxdooPath
231
216
  else
232
217
  dputs(0) { "Error: couldn't create movement from #{m.inspect}" }
233
218
  end
234
- u.update_movement_index
219
+ u.update_movement_index unless input._debug
235
220
  }
236
221
  end
237
222
  when 'movement_delete'
@@ -244,7 +229,7 @@ class ACaccess < RPCQooxdooPath
244
229
  when 'account_put'
245
230
  dputs(3) { "Going to put account #{input['account'].inspect}" }
246
231
  acc = Accounts.from_s(input['account'])
247
- u.update_account_index
232
+ u.update_account_index unless input._debug
248
233
  dputs(2) { "Saved account #{acc.global_id}" }
249
234
  when 'account_delete'
250
235
  dputs(3) { 'Going to delete account' }
@@ -253,5 +238,6 @@ class ACaccess < RPCQooxdooPath
253
238
  end
254
239
  return 'ok'
255
240
  end
241
+
256
242
  end
257
243