gestion 1.9.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (233) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +48 -0
  3. data/.project +14 -0
  4. data/Binaries/adduser_to_buzz +15 -0
  5. data/Binaries/backup +7 -0
  6. data/Binaries/check_gestion +8 -0
  7. data/Binaries/gestion.gnumail +22 -0
  8. data/Binaries/gestion.logrotate +34 -0
  9. data/Binaries/gestion.service +12 -0
  10. data/Binaries/gestion_update.rb +183 -0
  11. data/Binaries/gestion_update.service +10 -0
  12. data/Binaries/get_compta +11 -0
  13. data/Binaries/kill_gestion +16 -0
  14. data/Binaries/ldap/add_indexes +51 -0
  15. data/Binaries/ldap/backup +2 -0
  16. data/Binaries/ldap/install_ldap +92 -0
  17. data/Binaries/ldap/restore +7 -0
  18. data/Binaries/lib_backup +5 -0
  19. data/Binaries/log_scan_errors +8 -0
  20. data/Binaries/loop_gestion +64 -0
  21. data/Binaries/onetimers/sync_courses_from_compta.rb +74 -0
  22. data/Binaries/onetimers/transfer_cash_from_ldap_to_csv +26 -0
  23. data/Binaries/reboot +5 -0
  24. data/Binaries/restore +3 -0
  25. data/Binaries/restore_do +22 -0
  26. data/Binaries/sort_events +31 -0
  27. data/Binaries/start_gestion +18 -0
  28. data/Binaries/swipe_gestion +18 -0
  29. data/Binaries/update_africompta +21 -0
  30. data/Binaries/update_users +3 -0
  31. data/Diplomas.src/accredited.odg +0 -0
  32. data/Diplomas.src/diploma.odg +0 -0
  33. data/Diplomas.src/label.odg +0 -0
  34. data/Diplomas.src/presence_sheet.ods +0 -0
  35. data/Diplomas.src/presence_sheet_small.ods +0 -0
  36. data/Diplomas.src/student_card.odg +0 -0
  37. data/Doc/130514-it-ideas.odt +0 -0
  38. data/Doc/Compta-cash.mm +179 -0
  39. data/Doc/General.odt +0 -0
  40. data/Entities/AccessGroups.rb +117 -0
  41. data/Entities/Activity.rb +178 -0
  42. data/Entities/ChatMsg.rb +142 -0
  43. data/Entities/Classroom.rb +11 -0
  44. data/Entities/Client.rb +19 -0
  45. data/Entities/Computer.rb +21 -0
  46. data/Entities/ConfigBase.rb +280 -0
  47. data/Entities/Course.rb +1588 -0
  48. data/Entities/CourseType.rb +171 -0
  49. data/Entities/DFiles.rb +466 -0
  50. data/Entities/FilesManage.rb +226 -0
  51. data/Entities/Grade.rb +186 -0
  52. data/Entities/Internet.rb +300 -0
  53. data/Entities/Netdev.rb +10 -0
  54. data/Entities/Person.rb +1175 -0
  55. data/Entities/Plug.rb +98 -0
  56. data/Entities/Quiz.rb +33 -0
  57. data/Entities/Recharges.rb +37 -0
  58. data/Entities/Report.rb +136 -0
  59. data/Entities/Room.rb +12 -0
  60. data/Entities/SMS.rb +30 -0
  61. data/Entities/ScheduleType.rb +33 -0
  62. data/Entities/Share.rb +120 -0
  63. data/Entities/Task.rb +51 -0
  64. data/Entities/Ticket.rb +72 -0
  65. data/Entities/Usage.rb +143 -0
  66. data/Entities/Worker.rb +29 -0
  67. data/Files/apache-profeda.conf +36 -0
  68. data/Files/label.erb +121 -0
  69. data/Files/label_notfound.erb +64 -0
  70. data/Files/label_notpassed.erb +84 -0
  71. data/Files/mobileinfo.erb +115 -0
  72. data/Files/smb.conf +333 -0
  73. data/Files/timetable.html +36 -0
  74. data/Files/timetable.js +239 -0
  75. data/Gemfile +12 -0
  76. data/Gemfile.dev +12 -0
  77. data/Gemfile.dev.lock +127 -0
  78. data/Gemfile.lock +127 -0
  79. data/Gemfile.prod +8 -0
  80. data/Gestion +35 -0
  81. data/Gestion.rb +220 -0
  82. data/INSTALL +40 -0
  83. data/Images/connection.xcf +0 -0
  84. data/Images/connection_no.png +0 -0
  85. data/Images/connection_wait.png +0 -0
  86. data/Images/connection_yes.png +0 -0
  87. data/Paths/Exas.rb +13 -0
  88. data/Paths/Files.rb +19 -0
  89. data/Paths/GetDiplomas.rb +20 -0
  90. data/Paths/Info.rb +114 -0
  91. data/Paths/Label.rb +187 -0
  92. data/Paths/MobileInfo.rb +19 -0
  93. data/Paths/internetCash.rb +34 -0
  94. data/Paths/internetWifi.rb +54 -0
  95. data/README.md +60 -0
  96. data/Rakefile +13 -0
  97. data/TODO +1391 -0
  98. data/Test/.gitignore +3 -0
  99. data/Test/Diplomas/base_gestion.odt +0 -0
  100. data/Test/Diplomas/base_report.odt +0 -0
  101. data/Test/Diplomas/carte_etudiant.odg +0 -0
  102. data/Test/Diplomas/exam_language.odt +0 -0
  103. data/Test/Diplomas/label.odg +0 -0
  104. data/Test/Diplomas/presence_sheet.ods +0 -0
  105. data/Test/Diplomas/presence_sheet_small.ods +0 -0
  106. data/Test/Diplomas/student_card.odg +0 -0
  107. data/Test/Manual/testMerge +18 -0
  108. data/Test/config_test.yaml +26 -0
  109. data/Test/db.testGestion +0 -0
  110. data/Test/dfiles/descs/avg-rescue.desc +10 -0
  111. data/Test/dfiles/descs/avg.desc +8 -0
  112. data/Test/dfiles/descs/driver.desc +8 -0
  113. data/Test/dfiles/descs/linuxmint.desc +7 -0
  114. data/Test/dfiles/files/avg-160203.exe +1 -0
  115. data/Test/dfiles/files/avg.iso +1 -0
  116. data/Test/dfiles/files/driver.exe +1 -0
  117. data/Test/dfiles/index_post.html +3 -0
  118. data/Test/dfiles/index_pre.html +8 -0
  119. data/Test/dfiles/priorities +5 -0
  120. data/Test/ge_activity.rb +124 -0
  121. data/Test/ge_chat.rb +106 -0
  122. data/Test/ge_compta.rb +67 -0
  123. data/Test/ge_configbase.rb +54 -0
  124. data/Test/ge_course.rb +1114 -0
  125. data/Test/ge_dfiles.rb +121 -0
  126. data/Test/ge_filesmanage.rb +180 -0
  127. data/Test/ge_info.rb +27 -0
  128. data/Test/ge_internet.rb +246 -0
  129. data/Test/ge_login.rb +55 -0
  130. data/Test/ge_person.rb +373 -0
  131. data/Test/ge_qvinfo.rb +28 -0
  132. data/Test/ge_report.rb +97 -0
  133. data/Test/ge_share.rb +27 -0
  134. data/Test/ge_sms.rb +34 -0
  135. data/Test/ge_tasks.rb +19 -0
  136. data/Test/ge_usage.rb +168 -0
  137. data/Test/ge_view.rb +46 -0
  138. data/Test/multiconf-captive +29 -0
  139. data/Test/test.conf +7 -0
  140. data/Test/test.rb +49 -0
  141. data/Test/test_bytes.png +0 -0
  142. data/VERSION +140 -0
  143. data/Views/Admin/Backup.rb +91 -0
  144. data/Views/Admin/Configuration.rb +44 -0
  145. data/Views/Admin/Credit.rb +32 -0
  146. data/Views/Admin/FilesManage.rb +219 -0
  147. data/Views/Admin/Function.rb +39 -0
  148. data/Views/Admin/Power.rb +49 -0
  149. data/Views/Admin/Printer.rb +37 -0
  150. data/Views/Admin/Server.rb +252 -0
  151. data/Views/Admin/Tabs.rb +5 -0
  152. data/Views/Admin/Update.rb +73 -0
  153. data/Views/Admin/UpdateSystem.rb +26 -0
  154. data/Views/Cashbox/Activity.rb +191 -0
  155. data/Views/Cashbox/Course.rb +141 -0
  156. data/Views/Cashbox/Credit.rb +79 -0
  157. data/Views/Cashbox/Report.rb +115 -0
  158. data/Views/Cashbox/Service.rb +105 -0
  159. data/Views/Cashbox/Tabs.rb +10 -0
  160. data/Views/Compta/Accounts.rb +36 -0
  161. data/Views/Compta/Course.rb +96 -0
  162. data/Views/Compta/Show.rb +6 -0
  163. data/Views/Compta/Transfer.rb +66 -0
  164. data/Views/Course/Diploma.rb +203 -0
  165. data/Views/Course/Grade.rb +401 -0
  166. data/Views/Course/Modify.rb +447 -0
  167. data/Views/Course/Print.rb +94 -0
  168. data/Views/Course/Responsible.rb +44 -0
  169. data/Views/Course/Stats.rb +76 -0
  170. data/Views/Course/Students.rb +92 -0
  171. data/Views/Course/Tabs.rb +220 -0
  172. data/Views/Internet/Access.rb +134 -0
  173. data/Views/Internet/ClassEdit.rb +24 -0
  174. data/Views/Internet/ClassUsers.rb +81 -0
  175. data/Views/Internet/Config.rb +32 -0
  176. data/Views/Internet/Mobile.rb +213 -0
  177. data/Views/Internet/Recharges.rb +49 -0
  178. data/Views/Internet/Tabs.rb +6 -0
  179. data/Views/Inventory/Computer.rb +24 -0
  180. data/Views/Inventory/Room.rb +18 -0
  181. data/Views/Inventory/Tabs.rb +9 -0
  182. data/Views/Inventory/TicketClosed.rb +7 -0
  183. data/Views/Inventory/TicketOpen.rb +23 -0
  184. data/Views/Library/Person.rb +36 -0
  185. data/Views/Library/Tabs.rb +7 -0
  186. data/Views/Network/Block.rb +87 -0
  187. data/Views/Network/Netdevs.rb +21 -0
  188. data/Views/Network/Restriction.rb +37 -0
  189. data/Views/Network/Share.rb +167 -0
  190. data/Views/Network/Tables.rb +28 -0
  191. data/Views/Network/Tabs.rb +6 -0
  192. data/Views/Person/Admin.rb +99 -0
  193. data/Views/Person/Center.rb +48 -0
  194. data/Views/Person/Course.rb +72 -0
  195. data/Views/Person/Modify.rb +153 -0
  196. data/Views/Person/Tabs.rb +162 -0
  197. data/Views/Report/ComptaExecutive.rb +221 -0
  198. data/Views/Report/ComptaFlat.rb +79 -0
  199. data/Views/Report/ReportCourse.rb +47 -0
  200. data/Views/Report/Tabs.rb +8 -0
  201. data/Views/Report/Usage.rb +52 -0
  202. data/Views/Report/UsageCases.rb +59 -0
  203. data/Views/Self/Cash.rb +67 -0
  204. data/Views/Self/Chat.rb +55 -0
  205. data/Views/Self/Concours.rb +109 -0
  206. data/Views/Self/Email.rb +34 -0
  207. data/Views/Self/Internet.rb +255 -0
  208. data/Views/Self/Results.rb +17 -0
  209. data/Views/Self/Services.rb +85 -0
  210. data/Views/Self/Show.rb +47 -0
  211. data/Views/Self/Tabs.rb +5 -0
  212. data/Views/Special/DFileEdit.rb +13 -0
  213. data/Views/Special/PlugEdit.rb +56 -0
  214. data/Views/Special/Tabs.rb +6 -0
  215. data/Views/Special/Vnc.rb +39 -0
  216. data/Views/Task/Client.rb +21 -0
  217. data/Views/Task/Edit.rb +33 -0
  218. data/Views/Task/List.rb +55 -0
  219. data/Views/Task/Tabs.rb +9 -0
  220. data/Views/Task/Worker.rb +30 -0
  221. data/Views/Template/Activity.rb +33 -0
  222. data/Views/Template/CourseType.rb +63 -0
  223. data/Views/Template/ScheduleType.rb +29 -0
  224. data/Views/Template/Tabs.rb +5 -0
  225. data/Views/Welcome.rb +121 -0
  226. data/config.yaml.default +36 -0
  227. data/po/Gestion-ar.po +2356 -0
  228. data/po/Gestion-en.mo +0 -0
  229. data/po/Gestion-en.po +4363 -0
  230. data/po/Gestion-fr.mo +0 -0
  231. data/po/Gestion-fr.po +4345 -0
  232. data/po/traduction-ar.rtf +76 -0
  233. metadata +381 -0
data/Entities/Plug.rb ADDED
@@ -0,0 +1,98 @@
1
+ class Plugs < Entities
2
+ def setup_data
3
+ value_str :internal_id
4
+ value_str :fixed_id
5
+ value_str :center_name
6
+ value_str :center_id
7
+ value_str :center_city
8
+ value_str :ip_local
9
+ value_date :installation
10
+ value_str :telephone
11
+ value_str :credit
12
+ value_str :internet_left
13
+ value_list_drop :model, '%w(DreamPlug08 DreamPlug10 Smileplug
14
+ Cubox-i1 Cubox-i2x Cubox-i4)'
15
+ value_int :storage_size
16
+
17
+ Network::Device.add_observer(self)
18
+ update('add', Network::Device.search_dev({uevent: {driver: 'option'}}).first)
19
+ end
20
+
21
+ def update(op, dev = nil)
22
+ return unless ConfigBase.has_function?(:plug_admin)
23
+ dputs(2) { "Updating with operation #{op} and device #{dev}" }
24
+ if op =~ /add/ && dev && dev.instance_variable_defined?(:@serial_sms_new)
25
+ dev.serial_sms_new.push(Proc.new { |sms| new_sms(sms) })
26
+ end
27
+ end
28
+
29
+ def new_sms(sms)
30
+ dputs_func
31
+ dputs(2) { "Found new sms #{sms.inspect}" }
32
+ search_all_.each { |p|
33
+ # Match for incomplete, but existing telephone number. Make sure that
34
+ # +235999999 matches 999999, in both ways
35
+ p1 = p.telephone.to_s.gsub(/[^0-9]/, '')
36
+ p2 = sms._number.gsub(/[^0-9]/, '')
37
+ dputs(3) { "Phone-numbers are _#{p1}_ and _#{p2}_" }
38
+ if p1.length > 0 && (p1 =~ /#{p2}$/ || p2 =~ /#{p1}$/)
39
+ p.new_sms(sms)
40
+ end
41
+ }
42
+ end
43
+
44
+ def listp_center
45
+ Plugs.search_all_.collect{|p| [p.plug_id, p.center_name]}
46
+ end
47
+ end
48
+
49
+ class Plug < Entity
50
+ def send_cmd_sms(*cmds)
51
+ return unless telephone.to_s.length > 0 &&
52
+ !$MobileControl.operator_missing?
53
+ msg = "cmd: #{cmds.join('::')}"
54
+ add_stat(msg, :sms, :send)
55
+ $MobileControl.device.sms_send(telephone.to_s, msg)
56
+ end
57
+
58
+ def send_credit(amount)
59
+ return unless telephone.to_s.length > 0 &&
60
+ !$MobileControl.operator_missing?
61
+ add_stat(amount.to_s, :credit, :send)
62
+ $MobileControl.operator.credit_send(telephone.to_s, amount)
63
+ end
64
+
65
+ def new_sms(sms)
66
+ add_stat(sms._msg, :sms, :rcv)
67
+ log_msg :Plug, "Got new sms #{sms.inspect}"
68
+ case sms._msg
69
+ when /^stat: (.*): (.*) :: (.*) :: (.*)/
70
+ host, state, disk, time = $1, $2, $3, $4
71
+ _, _, _, internet, credit = state.split(':')
72
+ dputs(2) { "Host #{host} has state #{state}" }
73
+ self.internal_id = host
74
+ if internet != 'noop'
75
+ self.internet_left = internet.gsub(/[^0-9]/, '').to_i * 1_000_000
76
+ self.credit = credit
77
+ dputs(2) { "Host #{host} has #{internet} Bytes and #{self.credit} left" }
78
+ end
79
+ else
80
+ log_msg :Plut, "Unknown message from #{host}"
81
+ end
82
+ end
83
+
84
+ def add_stat(msg, type, dir)
85
+ PlugStats.create(time: Time.now, msg: msg, msg_type: [type],
86
+ msg_dir: [dir], plug: self)
87
+ end
88
+ end
89
+
90
+ class PlugStats < Entities
91
+ def setup_data
92
+ value_time :time
93
+ value_str :msg
94
+ value_list :msg_type, '%w( sms email rpc credit )'
95
+ value_list :msg_dir, '%w( send rcv )'
96
+ value_entity :plug
97
+ end
98
+ end
data/Entities/Quiz.rb ADDED
@@ -0,0 +1,33 @@
1
+ class Quizs < Entities
2
+ def setup_data
3
+ value_str :email
4
+ value_str :full_name
5
+ value_str :reply
6
+ value_int :score
7
+ end
8
+
9
+ def create( a )
10
+ dputs( 4 ){ "Creating Quiz with #{a.inspect}" }
11
+ q = super( a )
12
+ q.score = q.evaluate
13
+ q
14
+ end
15
+
16
+ def self.results
17
+ self.search_all.collect{|q| [ q.score, q.full_name ] }.
18
+ sort{ |a,b| b[0] <=> a[0] }.collect{|q| q.join( ":" ) }
19
+ end
20
+ end
21
+
22
+ class Quiz < Entity
23
+ def evaluate
24
+ correct = %w( 1992 2007 faux route fai faux faux courriel www faux recherche ouvert
25
+ 90 55000 ICANN IANA IAB NTIC isoc-chad.org )
26
+ s = 0
27
+ reply.split(",")[0..-2].each{|r|
28
+ r.to_s == correct.shift.to_s and s += 1
29
+ }
30
+ s
31
+ end
32
+
33
+ end
@@ -0,0 +1,37 @@
1
+ class Recharges < Entities
2
+ def setup_data
3
+ value_str :time
4
+ value_int :volume
5
+ value_int :days_valid
6
+ value_int :days_goal
7
+ end
8
+
9
+ def enabled?
10
+ search_all_.length > 0
11
+ end
12
+ end
13
+
14
+ class Recharge < Entity
15
+ def left_today(left_total)
16
+ return -1 if days_goal.to_i <= 0
17
+ end_of_day = (days_goal.to_i - (Date.today - day) - 1) * volume.to_i / days_goal.to_i
18
+ (left_total - (end_of_day < 0 ? 0 : end_of_day)).to_i
19
+ end
20
+
21
+ def day
22
+ begin
23
+ year, month, day = time.scan(/../)
24
+ Date.new(2000 + year.to_i, month.to_i, day.to_i)
25
+ rescue ArgumentError => e
26
+ Date.today
27
+ end
28
+ end
29
+
30
+ def self.left_today(left_total)
31
+ if (r = Recharges.search_all_).length > 0
32
+ r.sort { |a, b| a.time <=> b.time }.last.left_today(left_total)
33
+ else
34
+ -1
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,136 @@
1
+ class ReportAccounts < Entities
2
+ def setup_data
3
+ value_entity_account :root, :drop, :path
4
+ value_entity_account :account, :drop, :path
5
+ value_int :level
6
+ end
7
+ end
8
+
9
+
10
+ class Reports < Entities
11
+ def setup_data
12
+ value_str :name
13
+ value_list_entity_reportAccounts :accounts
14
+ end
15
+ end
16
+
17
+ class Report < Entity
18
+ attr_accessor :print_accounts, :print_movements, :print_account
19
+
20
+ def print_account_monthly(acc, start, months, counter)
21
+ stop = (start >> months) - 1
22
+
23
+ line = []
24
+ zeros = false
25
+ @print_account = ''
26
+ @print_accounts = counter.to_f / accounts.count
27
+ p_a = 0
28
+ acc.account.get_tree(acc.level.to_i) { |acc_sub, depth|
29
+ acc_sub.get_tree(depth > 0 ? 0 : -1) { p_a += accounts.count }
30
+ }
31
+ acc.account.get_tree(acc.level.to_i) { |acc_sub, depth|
32
+ dputs(2) { "Doing #{acc_sub.path} - #{depth.inspect}. Done: #{@print_accounts}" }
33
+ sum = Array.new(months) { 0 }
34
+ acc_sub.get_tree(depth > 0 ? 0 : -1) { |acc_sum|
35
+ @print_account = acc_sum.get_path
36
+ @print_accounts += 1.0 / p_a
37
+ p_m = 1.0 / acc_sum.movements.count
38
+ @print_movements = 0
39
+ acc_sum.movements.each { |m|
40
+ @print_movements += p_m
41
+ if (start..stop).include? m.date
42
+ sum[m.date.month - start.month] += m.get_value(acc_sum)
43
+ end
44
+ }
45
+ }
46
+ if sum.inject(false) { |m, o| m |= o != 0 } or line.size == 0
47
+ if line.size == 0
48
+ zeros = true
49
+ elsif zeros
50
+ line = []
51
+ zeros = false
52
+ end
53
+ line.push [acc_sub.path, sum + [sum.inject(:+)]]
54
+ end
55
+ }
56
+ line
57
+ end
58
+
59
+ def print_heading_monthly(start = Date.today, months = 12)
60
+ ['Period', (0...months).collect { |m|
61
+ (start >> m).strftime('%Y/%m')
62
+ } + ['Sum']]
63
+ end
64
+
65
+ def print_list_monthly(start = Date.today, months = 12)
66
+ stop = start >> (months - 1)
67
+ acc_counter = -1
68
+ list = accounts.collect { |acc|
69
+ line = print_account_monthly(acc, start, months, acc_counter += 1)
70
+ if line.size > 1
71
+ line.push ['Sum', line.reduce(Array.new(months+1, 0)) { |memo, obj|
72
+ dputs(2) { "#{memo}, #{obj.inspect}" }
73
+ memo = memo.zip(obj[1]).map { |a, b| a + b }
74
+ }]
75
+ end
76
+ line
77
+ }
78
+ if list.size > 1
79
+ list + [[['Total', running = list.reduce(Array.new(months+1, 0)) { |memo, obj|
80
+ dputs(2) { "#{memo}, #{obj.inspect}" }
81
+ memo = memo.zip(obj.last.last).map { |a, b| a + b }
82
+ }],
83
+ ['Running', running[0..-2].reduce([]) { |m, o| m + [(m.last || 0) + o] }]]]
84
+ else
85
+ list
86
+ end
87
+ end
88
+
89
+ def print(start = Date.today, months = 12)
90
+
91
+ end
92
+
93
+ def listp_accounts
94
+ accounts.collect { |a|
95
+ [a.id, "#{a.level}: #{a.account.path}"]
96
+ }
97
+ end
98
+
99
+ def print_pdf_monthly(start = Date.today, months = 12)
100
+ stop = start >> (months - 1)
101
+ file = "/tmp/report_#{name}.pdf"
102
+ Prawn::Document.generate(file,
103
+ :page_size => 'A4',
104
+ :page_layout => :landscape,
105
+ :bottom_margin => 2.cm) do |pdf|
106
+
107
+ pdf.text "Report for #{name}",
108
+ :align => :center, :size => 20
109
+ pdf.font_size 7
110
+ pdf.text "From #{start.strftime('%Y/%m')} to #{stop.strftime('%Y/%m')}"
111
+ pdf.move_down 1.cm
112
+
113
+ pdf.table([print_heading_monthly(start, months).flatten.collect { |ch|
114
+ {:content => ch, :align => :center} }] +
115
+ print_list_monthly(start, months).collect { |acc|
116
+ acc.collect { |a, values|
117
+ [a] + values.collect { |v| Account.total_form(v) }
118
+ }
119
+ }.flatten(1).collect { |line|
120
+ a, s = (line[0] =~ /::/ ? [:left, :normal] : [:right, :bold])
121
+ [{:content => line.shift, :align => a, :font_style => s}] +
122
+ line.collect { |v|
123
+ {:content => v, :align => :right, :font_style => s} }
124
+ },
125
+ :header => true)
126
+ pdf.move_down(2.cm)
127
+
128
+ pdf.repeat(:all, :dynamic => true) do
129
+ pdf.draw_text "#{Date.today} - #{name}",
130
+ :at => [0, -20], :size => 10
131
+ pdf.draw_text pdf.page_number, :at => [18.cm, -20]
132
+ end
133
+ end
134
+ file
135
+ end
136
+ end
data/Entities/Room.rb ADDED
@@ -0,0 +1,12 @@
1
+ # Represents the different rooms available in the facility
2
+
3
+ class Rooms < Entities
4
+ def setup_data
5
+ value_block :all
6
+ value_str :name
7
+ value_int :size
8
+ value_str :ip_net
9
+ value_int :computers
10
+ value_str :description
11
+ end
12
+ end
data/Entities/SMS.rb ADDED
@@ -0,0 +1,30 @@
1
+ # Holds SMS from Modem
2
+
3
+ class SMSs < Entities
4
+ def setup_data
5
+ value_date :date
6
+ value_phone :phone
7
+ value_txt :text
8
+ value_int :index
9
+ end
10
+
11
+ def last(count)
12
+ return [] if @data.length == 0 || count <= 0
13
+
14
+ msgs = [count, @data.length].min
15
+ dputs(3) { "Getting #{msgs} SMS for #{@data.inspect}" }
16
+ @data.keys.sort[-msgs..-1].collect { |d|
17
+ get_data_instance(d)
18
+ }
19
+ end
20
+
21
+ def create(sms)
22
+ if !match_by_date(sms._date)
23
+ super({date: sms._date, phone: sms._number, text: sms._msg,
24
+ index: sms._id})
25
+ end
26
+ while @data.length > 50
27
+ get_data_instance(@data.first.first).delete
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ class ScheduleTypes < Entities
2
+ def setup_data
3
+ value_str :name
4
+ value_str :schedule
5
+ end
6
+
7
+ def self.get_script
8
+ return IO.read('Files/timetable.js')
9
+ end
10
+
11
+ def self.get_html(weeks: false)
12
+ return "<style type='text/css'>
13
+ td.select {
14
+ background-color: #00ffff
15
+ }</style>
16
+ <table width='80%' border=0 onload='add_weeks(16); add_days();add_hours();'> " +
17
+ (weeks ? "<tr id='tr_weeks'></tr>" : '') +
18
+ "<tr id='tr_days'></tr>
19
+ <tr id='tr_programs'></ tr>
20
+ <tr id='tr_hours'></tr>
21
+ </ table>"
22
+ end
23
+ end
24
+
25
+ class ScheduleType < Entity
26
+ def schedule_array
27
+ JSON.parse(schedule)
28
+ end
29
+
30
+ def schedule_array=(s)
31
+ schedule = s.to_json
32
+ end
33
+ end
data/Entities/Share.rb ADDED
@@ -0,0 +1,120 @@
1
+ # Holds share for samba
2
+
3
+ class Shares < Entities
4
+ def setup_data
5
+ value_block :config
6
+ value_str :name
7
+ value_str :path
8
+ value_str :comment
9
+ value_str :force_user
10
+ value_str :force_group
11
+ #value_text :args
12
+ value_list_drop :public, '%w( No Read ReadWrite )'
13
+
14
+ value_block :acl
15
+ value_str :acl
16
+ end
17
+
18
+ def migration_1(s)
19
+ s.public = [s.public.first == 'Yes' ? 'ReadWrite' : 'No']
20
+ end
21
+
22
+ def save_config(domain)
23
+ dputs_func
24
+ return unless Shares.is_active?
25
+
26
+ a = IO.read('Files/smb.conf')
27
+ a.gsub!(/WORKGROUP/, domain)
28
+ a.gsub!(/SERVER/, "Profeda-server on #{domain}")
29
+ a += "\n"
30
+ Shares.search_all_.each { |sh|
31
+ if !Dir.exists?(sh.path)
32
+ FileUtils.mkdir_p(sh.path)
33
+ end
34
+ begin
35
+ FileUtils.chmod 0777, sh.path
36
+ rescue Errno::EROFS => e
37
+ log_msg :Share, "Oups, couldn't chmod #{e.inspect}"
38
+ end
39
+ a += "\n\n[#{sh.name}]\n path = #{sh.path}\n comment = #{sh.comment}\n"
40
+ valid_users = []
41
+ if sh.force_user.to_s.length > 0
42
+ a += " force user = #{sh.force_user}\n"
43
+ valid_users.push sh.force_user
44
+ end
45
+ if sh.force_group.to_s.length > 0
46
+ a += " force group = #{sh.force_group}\n"
47
+ valid_users.push sh.force_group
48
+ end
49
+ case sh.public.first
50
+ when 'Read'
51
+ a += " guest ok = yes\n writeable = no\n"
52
+ when 'ReadWrite'
53
+ a += " guest ok = yes\n writeable = yes\n"
54
+ else
55
+ read = []
56
+ write = []
57
+ dputs(4) { "sh is #{sh.class}" }
58
+ sh.acl.class == Hash and sh.acl.each { |k, v|
59
+ dputs(4) { "Found #{k}: #{v}" }
60
+ case v
61
+ when /rw/
62
+ write.push k
63
+ when /ro/
64
+ read.push k
65
+ end
66
+ }
67
+ a += " read list = #{read.join(',')}\n write list = #{write.join(',')}\n" +
68
+ " valid users = #{ (read + write + valid_users).uniq.join(',')}\n"
69
+ end
70
+ a += " directory mask = 0775\n create mask = 0664\n"
71
+ #a += " hide files = /~$*/*.tmp/\n blocking locks = no\n"
72
+ #a += " create mask = 741\n map archive = yes\n map system = yes\n" +
73
+ # " map hidden = yes\n"
74
+ }
75
+ file_smb = "#{ConfigBase.samba_config}/smb.conf"
76
+ File.open(file_smb, 'w') { |f|
77
+ f.write(a)
78
+ }
79
+
80
+ Platform.restart('samba')
81
+ end
82
+
83
+ def self.is_active?
84
+ ConfigBase.samba_simul == %w(false) &&
85
+ !get_config(false, :Entities, :Share, :simulation)
86
+ end
87
+ end
88
+
89
+ class Share < Entity
90
+ def setup_instance
91
+ if not self.acl
92
+ self.acl = {}
93
+ end
94
+ end
95
+
96
+ def add_htaccess
97
+ if File.exists? path
98
+ File.open("#{path}/.htaccess", "w") { |f|
99
+ f << "AuthType Basic
100
+ AuthName 'Restricted Access'
101
+ AuthUserFile '#{path}/.htpasswd'
102
+ Require valid-user
103
+ "
104
+ }
105
+ File.exists? passfile = "#{path}/.htpasswd" and
106
+ FileUtils.rm passfile
107
+ if acl.class == Hash
108
+ acl.each { |k, v|
109
+ dputs(4) { "Adding #{k} to htpasswd" }
110
+ case v
111
+ when /rw|ro/
112
+ dputs(4) { "Really adding #{k} to #{passfile}" }
113
+ user = Persons.find_by_login_name(k)
114
+ System.run_str("/usr/bin/htpasswd -bnd #{user.login_name} '#{user.password_plain }' >> #{passfile}")
115
+ end
116
+ }
117
+ end
118
+ end
119
+ end
120
+ end
data/Entities/Task.rb ADDED
@@ -0,0 +1,51 @@
1
+ class Tasks < Entities
2
+ def setup_data
3
+ value_str :date_name
4
+
5
+ value_block :who
6
+ value_str :client
7
+ value_str :person
8
+ value_entity_person :worker, :drop, :full_name
9
+
10
+ value_block :work
11
+ value_date :date
12
+ value_list_drop :time, "22.times.collect{|t| sprintf( '%02i.%02i', 7 + ( t / 2 ).floor, 30 * ( t % 2 ) )}"
13
+ value_int :duration_hours
14
+ value_text :work
15
+
16
+ value_block :other
17
+ value_int :transport_length
18
+ value_list_single :transport_type, "%w( moto voiture taxi )"
19
+ value_int :cost
20
+ value_str :cost_description
21
+ value_int :gain
22
+ value_str :gain_description
23
+ end
24
+
25
+ def data_to_time( d )
26
+ dputs( 3 ){ d.inspect }
27
+ t = d[:date].split('.').values_at( 2, 1, 0 ) +
28
+ d[:time].to_s.split('.')
29
+ Time.utc( *t )
30
+ end
31
+
32
+ def listp_tasks
33
+ @data.values.sort{|a,b|
34
+ data_to_time(a) <=> data_to_time(b)
35
+ }.reverse.collect{ |d|
36
+ [ d[:task_id], data_to_time(d).strftime("%d.%m.%y") + " - " + d[:person].to_s]
37
+ }
38
+ end
39
+
40
+ def list_task_month( worker, year, month, client )
41
+ @data.values.select{|d|
42
+ dputs( 3 ){ "Data is: #{d.inspect}" }
43
+ date = data_to_time( d )
44
+ dputs( 3 ){ [ date.inspect, year, month, worker, d[:person] ].inspect }
45
+ date.year == year.to_i and
46
+ date.month == month.to_i and
47
+ worker == Entities.Workers.find_full_name( d[:person][0] ) and
48
+ client.name == d[:client][0]
49
+ }
50
+ end
51
+ end
@@ -0,0 +1,72 @@
1
+ # A ticket is opened for computers only
2
+
3
+ class Tickets < Entities
4
+ def setup_data
5
+ value_block :date
6
+ value_date :opened
7
+ value_date :closed
8
+ value_list_drop :severity, "%w( critique grave moyen optionnel )"
9
+ value_str_ro :created_by
10
+ value_entity_person_empty :assigned, :drop, :full_name,
11
+ lambda{|p| p.permissions.index("maintenance")}
12
+ value_entity_computer_empty :computer, :drop, :name_service
13
+ value_str :other
14
+
15
+ value_block :detail
16
+ value_text :todo
17
+ value_text :verification
18
+ value_text :work
19
+ end
20
+
21
+ def listp_opened( closed = false )
22
+ search_all.select{|k|
23
+ ( not k.closed ) ^ closed
24
+ }.collect{|k|
25
+ dputs( 4 ){ "k is #{k.inspect}" }
26
+ comp = k.computer != 0 ? k.computer.name_service : "---"
27
+ [k.ticket_id, "#{k.opened} - #{comp}" ]
28
+ }.sort{|a,b|
29
+ a[1] <=> b[1]
30
+ }.reverse
31
+ end
32
+
33
+ def listp_closed
34
+ listp_opened( true )
35
+ end
36
+
37
+ end
38
+
39
+ module TicketLayout
40
+ def t_layout( method )
41
+ set_data_class :Tickets
42
+ @update = true
43
+ @order = method == :opened ? 150 : 200
44
+
45
+ gui_hbox do
46
+ gui_vbox :nogroup do
47
+ vtlp_list :ticket_list, method, :width => 150
48
+ if method == :opened
49
+ show_button :new_ticket, :delete
50
+ else
51
+ show_button :delete
52
+ end
53
+ end
54
+
55
+ gui_vbox :nogroup do
56
+ gui_hbox :nogroup do
57
+ gui_vbox :nogroup do
58
+ show_block :date
59
+ end
60
+ gui_vbox :nogroup do
61
+ show_block :detail, :width => 150
62
+ end
63
+ end
64
+ if method == :opened
65
+ show_button :save_ticket
66
+ else
67
+ show_button :save
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end