smartkiosk-server 0.9.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.
Files changed (254) hide show
  1. data/.gitignore +32 -0
  2. data/.rspec +1 -0
  3. data/Capfile +4 -0
  4. data/Gemfile +71 -0
  5. data/Gemfile.lock +439 -0
  6. data/Guardfile +25 -0
  7. data/LICENSE +287 -0
  8. data/README.md +13 -0
  9. data/Rakefile +5 -0
  10. data/app/acquirers/cards_mkb_acquirer.rb +87 -0
  11. data/app/acquirers/cash_acquirer.rb +22 -0
  12. data/app/admin/agents.rb +108 -0
  13. data/app/admin/collections.rb +62 -0
  14. data/app/admin/commissions.rb +87 -0
  15. data/app/admin/gateways.rb +183 -0
  16. data/app/admin/limits.rb +82 -0
  17. data/app/admin/payments.rb +246 -0
  18. data/app/admin/provider_groups.rb +60 -0
  19. data/app/admin/provider_profiles.rb +11 -0
  20. data/app/admin/provider_receipt_templates.rb +82 -0
  21. data/app/admin/providers.rb +201 -0
  22. data/app/admin/rebates.rb +83 -0
  23. data/app/admin/report_results.rb +66 -0
  24. data/app/admin/report_templates.rb +209 -0
  25. data/app/admin/reports.rb +158 -0
  26. data/app/admin/revisions.rb +120 -0
  27. data/app/admin/system_receipt_templates.rb +76 -0
  28. data/app/admin/terminal_builds.rb +39 -0
  29. data/app/admin/terminal_profiles.rb +123 -0
  30. data/app/admin/terminals.rb +388 -0
  31. data/app/admin/users.rb +117 -0
  32. data/app/admin/versions.rb +131 -0
  33. data/app/admin/welcome.rb +64 -0
  34. data/app/assets/fonts/PT_Sans-Web-Bold.eot +0 -0
  35. data/app/assets/fonts/PT_Sans-Web-Bold.svg +6386 -0
  36. data/app/assets/fonts/PT_Sans-Web-Bold.ttf +0 -0
  37. data/app/assets/fonts/PT_Sans-Web-Bold.woff +0 -0
  38. data/app/assets/fonts/PT_Sans-Web-Regular.eot +0 -0
  39. data/app/assets/fonts/PT_Sans-Web-Regular.svg +5650 -0
  40. data/app/assets/fonts/PT_Sans-Web-Regular.ttf +0 -0
  41. data/app/assets/fonts/PT_Sans-Web-Regular.woff +0 -0
  42. data/app/assets/images/chosen-sprite.png +0 -0
  43. data/app/assets/javascripts/active_admin/chosen.js.erb.coffee +12 -0
  44. data/app/assets/javascripts/active_admin/qtip.js.coffee +22 -0
  45. data/app/assets/javascripts/active_admin/sortable_forms.js.coffee +14 -0
  46. data/app/assets/javascripts/active_admin.js.coffee +9 -0
  47. data/app/assets/javascripts/application.js +15 -0
  48. data/app/assets/javascripts/report_templates.js.coffee +10 -0
  49. data/app/assets/javascripts/terminals.js.coffee +12 -0
  50. data/app/assets/stylesheets/active_admin/PIE.css.scss +18 -0
  51. data/app/assets/stylesheets/active_admin/filter_numeric_range.css.scss +14 -0
  52. data/app/assets/stylesheets/active_admin/selectable_check_boxes.css.scss +12 -0
  53. data/app/assets/stylesheets/active_admin/sortable_forms.css.scss +11 -0
  54. data/app/assets/stylesheets/active_admin.css.scss +705 -0
  55. data/app/assets/stylesheets/fonts.css.scss +14 -0
  56. data/app/assets/stylesheets/provider_groups.css.scss +12 -0
  57. data/app/assets/stylesheets/provider_receipt_templates.css.scss +12 -0
  58. data/app/assets/stylesheets/terminals.css.scss +9 -0
  59. data/app/controllers/application_controller.rb +12 -0
  60. data/app/controllers/collections_controller.rb +10 -0
  61. data/app/controllers/payments_controller.rb +73 -0
  62. data/app/controllers/system_receipt_templates_controller.rb +10 -0
  63. data/app/controllers/terminal_builds_controller.rb +5 -0
  64. data/app/controllers/terminal_orders_controller.rb +25 -0
  65. data/app/controllers/terminal_pings_controller.rb +45 -0
  66. data/app/controllers/welcome_controller.rb +5 -0
  67. data/app/helpers/active_admin/report_templates_helper.rb +56 -0
  68. data/app/helpers/active_admin/views_helper.rb +20 -0
  69. data/app/helpers/application_helper.rb +2 -0
  70. data/app/mailers/.gitkeep +0 -0
  71. data/app/models/.gitkeep +0 -0
  72. data/app/models/ability.rb +30 -0
  73. data/app/models/agent.rb +24 -0
  74. data/app/models/collection.rb +65 -0
  75. data/app/models/commission.rb +77 -0
  76. data/app/models/commission_section.rb +75 -0
  77. data/app/models/gateway.rb +99 -0
  78. data/app/models/gateway_attachment.rb +9 -0
  79. data/app/models/gateway_setting.rb +7 -0
  80. data/app/models/gateway_switch.rb +7 -0
  81. data/app/models/limit.rb +77 -0
  82. data/app/models/limit_section.rb +58 -0
  83. data/app/models/payment.rb +322 -0
  84. data/app/models/provider.rb +59 -0
  85. data/app/models/provider_field.rb +7 -0
  86. data/app/models/provider_gateway.rb +47 -0
  87. data/app/models/provider_group.rb +45 -0
  88. data/app/models/provider_profile.rb +9 -0
  89. data/app/models/provider_rebate.rb +69 -0
  90. data/app/models/provider_receipt_template.rb +85 -0
  91. data/app/models/rebate.rb +84 -0
  92. data/app/models/report.rb +71 -0
  93. data/app/models/report_result.rb +11 -0
  94. data/app/models/report_template.rb +56 -0
  95. data/app/models/revision.rb +104 -0
  96. data/app/models/role.rb +48 -0
  97. data/app/models/system_receipt_template.rb +13 -0
  98. data/app/models/terminal.rb +126 -0
  99. data/app/models/terminal_build.rb +62 -0
  100. data/app/models/terminal_order.rb +42 -0
  101. data/app/models/terminal_ping.rb +120 -0
  102. data/app/models/terminal_profile.rb +51 -0
  103. data/app/models/terminal_profile_promotion.rb +18 -0
  104. data/app/models/terminal_profile_provider.rb +11 -0
  105. data/app/models/terminal_profile_provider_group.rb +19 -0
  106. data/app/models/user.rb +38 -0
  107. data/app/models/user_role.rb +45 -0
  108. data/app/reports/agents_report.rb +81 -0
  109. data/app/reports/collections_report.rb +151 -0
  110. data/app/reports/payments_report.rb +189 -0
  111. data/app/reports/terminals_report.rb +123 -0
  112. data/app/uploaders/file_uploader.rb +53 -0
  113. data/app/uploaders/icon_uploader.rb +15 -0
  114. data/app/uploaders/zip_uploader.rb +53 -0
  115. data/app/views/admin/gateways/providers.html.arb +10 -0
  116. data/app/views/admin/revisions/payments.html.arb +28 -0
  117. data/app/views/admin/terminal_profiles/_tree.html.haml +35 -0
  118. data/app/views/admin/terminal_profiles/sort.html.haml +21 -0
  119. data/app/views/admin/terminals/pings.html.arb +55 -0
  120. data/app/views/admin/terminals/upgrade_build.html.arb +30 -0
  121. data/app/views/layouts/application.html.erb +1 -0
  122. data/app/views/welcome/index.html.erb +25 -0
  123. data/app/workers/pay_worker.rb +11 -0
  124. data/app/workers/report_worker.rb +7 -0
  125. data/app/workers/revise_worker.rb +7 -0
  126. data/config/acquiring.yml +13 -0
  127. data/config/application.rb +75 -0
  128. data/config/boot.rb +6 -0
  129. data/config/database.yml +17 -0
  130. data/config/deploy/roundlake-passenger.rb +3 -0
  131. data/config/deploy/roundlake-trinidad.rb +3 -0
  132. data/config/deploy.rb +37 -0
  133. data/config/environment.rb +5 -0
  134. data/config/environments/development.rb +39 -0
  135. data/config/environments/production.rb +67 -0
  136. data/config/environments/test.rb +37 -0
  137. data/config/initializers/active_admin.rb +31 -0
  138. data/config/initializers/backtrace_silencers.rb +7 -0
  139. data/config/initializers/devise.rb +232 -0
  140. data/config/initializers/inflections.rb +15 -0
  141. data/config/initializers/mime_types.rb +5 -0
  142. data/config/initializers/money.rb +6 -0
  143. data/config/initializers/redis.rb +4 -0
  144. data/config/initializers/secret_token.rb +7 -0
  145. data/config/initializers/session_store.rb +8 -0
  146. data/config/initializers/setup_rack.rb +1 -0
  147. data/config/initializers/wrap_parameters.rb +14 -0
  148. data/config/locales/active_admin.ru.yml +71 -0
  149. data/config/locales/activerecord.ru.yml +645 -0
  150. data/config/locales/devise.ru.yml +57 -0
  151. data/config/locales/ru.yml +33 -0
  152. data/config/locales/smartkiosk.gateways.ru.yml +241 -0
  153. data/config/locales/smartkiosk.hardware.ru.yml +38 -0
  154. data/config/locales/smartkiosk.reports.ru.yml +56 -0
  155. data/config/locales/smartkiosk.ru.yml +163 -0
  156. data/config/nginx.conf +9 -0
  157. data/config/redis.yml +9 -0
  158. data/config/routes.rb +48 -0
  159. data/config/schedule.rb +13 -0
  160. data/config/sidekiq.yml +5 -0
  161. data/config/trinidad.yml +6 -0
  162. data/config.ru +4 -0
  163. data/db/migrate/20120825083035_create_terminals.rb +47 -0
  164. data/db/migrate/20120825083305_create_payments.rb +51 -0
  165. data/db/migrate/20120827062618_devise_create_users.rb +50 -0
  166. data/db/migrate/20120827132621_create_admin_notes.rb +17 -0
  167. data/db/migrate/20120827132622_move_admin_notes_to_comments.rb +25 -0
  168. data/db/migrate/20120903193346_create_providers.rb +24 -0
  169. data/db/migrate/20120922075345_create_collections.rb +26 -0
  170. data/db/migrate/20120922080440_create_agents.rb +29 -0
  171. data/db/migrate/20120922081104_create_commissions.rb +10 -0
  172. data/db/migrate/20120927035841_create_gateways.rb +13 -0
  173. data/db/migrate/20120927040626_create_provider_gateways.rb +13 -0
  174. data/db/migrate/20120927091849_create_limits.rb +10 -0
  175. data/db/migrate/20120927164647_create_roles.rb +14 -0
  176. data/db/migrate/20121003131522_create_report_templates.rb +18 -0
  177. data/db/migrate/20121007135652_create_reports.rb +13 -0
  178. data/db/migrate/20121008073905_create_report_results.rb +10 -0
  179. data/db/migrate/20121017114538_create_gateway_settings.rb +12 -0
  180. data/db/migrate/20121017114556_create_gateway_attachments.rb +10 -0
  181. data/db/migrate/20121019132606_create_revisions.rb +19 -0
  182. data/db/migrate/20121023073501_create_gateway_switches.rb +10 -0
  183. data/db/migrate/20121112142743_create_terminal_orders.rb +13 -0
  184. data/db/migrate/20121118191553_create_versions.rb +19 -0
  185. data/db/migrate/20121125093414_create_system_receipt_templates.rb +9 -0
  186. data/db/migrate/20121127192257_create_terminal_builds.rb +10 -0
  187. data/db/migrate/20121212053441_create_rebates.rb +15 -0
  188. data/db/migrate/20121216143855_create_provider_receipt_templates.rb +9 -0
  189. data/db/migrate/20130101091100_create_terminal_profiles.rb +13 -0
  190. data/db/migrate/20130101091734_create_provider_rebates.rb +21 -0
  191. data/db/migrate/20130102164447_create_limit_sections.rb +14 -0
  192. data/db/migrate/20130102164503_create_commission_sections.rb +17 -0
  193. data/db/migrate/20130102171743_create_provider_profiles.rb +10 -0
  194. data/db/migrate/20130103152507_create_provider_fields.rb +17 -0
  195. data/db/migrate/20130103154526_create_provider_groups.rb +10 -0
  196. data/db/migrate/20130104063628_create_terminal_profile_providers.rb +11 -0
  197. data/db/migrate/20130104090957_create_terminal_profile_provider_groups.rb +11 -0
  198. data/db/migrate/20130108091644_create_terminal_profile_promotions.rb +10 -0
  199. data/db/schema.rb +489 -0
  200. data/db/seeds/receipt_templates/payment.txt +19 -0
  201. data/db/seeds/receipt_templates/system/balance.txt +13 -0
  202. data/db/seeds/receipt_templates/system/collection.txt +17 -0
  203. data/db/seeds/receipt_templates/system/touchtest.txt +15 -0
  204. data/db/seeds.rb +18 -0
  205. data/doc/README_FOR_APP +2 -0
  206. data/init.rb +1 -0
  207. data/lib/active_admin/cancan_integration.rb +81 -0
  208. data/lib/active_admin/form_builder_fix.rb +76 -0
  209. data/lib/active_admin/inputs/filter_date_range_input_fix.rb +24 -0
  210. data/lib/active_admin/inputs/filter_multiple_select_input.rb +18 -0
  211. data/lib/active_admin/inputs/filter_numeric_range_input.rb +31 -0
  212. data/lib/active_admin/resource_controller_fix.rb +23 -0
  213. data/lib/active_admin/views/pages/base_fix.rb +13 -0
  214. data/lib/assets/.gitkeep +0 -0
  215. data/lib/blueprints.rb +79 -0
  216. data/lib/date_expander.rb +38 -0
  217. data/lib/dav4rack/build_resource.rb +59 -0
  218. data/lib/formtastic/inputs/selectable_check_boxes.rb +39 -0
  219. data/lib/paper_trail/version_fix.rb +3 -0
  220. data/lib/report_builder.rb +88 -0
  221. data/lib/seeder.rb +103 -0
  222. data/lib/smartkiosk/server/version.rb +5 -0
  223. data/lib/smartkiosk/server.rb +35 -0
  224. data/lib/string_file.rb +12 -0
  225. data/lib/tasks/.gitkeep +0 -0
  226. data/lib/tasks/db.rake +27 -0
  227. data/lib/tasks/dump.rake +53 -0
  228. data/lib/tasks/matrioshka.rake +16 -0
  229. data/log/.gitkeep +0 -0
  230. data/log/gateways/.gitkeep +0 -0
  231. data/public/404.html +26 -0
  232. data/public/422.html +26 -0
  233. data/public/500.html +25 -0
  234. data/public/robots.txt +5 -0
  235. data/script/rails +6 -0
  236. data/smartkiosk-server.gemspec +23 -0
  237. data/spec/controllers/collections_controller_spec.rb +32 -0
  238. data/spec/controllers/payments_controller_spec.rb +123 -0
  239. data/spec/controllers/system_receipt_templates_controller_spec.rb +5 -0
  240. data/spec/controllers/terminal_builds_controller_spec.rb +5 -0
  241. data/spec/controllers/terminal_orders_controller_spec.rb +32 -0
  242. data/spec/controllers/terminal_pings_controller_spec.rb +31 -0
  243. data/spec/spec_helper.rb +66 -0
  244. data/vendor/assets/javascripts/.gitkeep +0 -0
  245. data/vendor/assets/javascripts/chosen.jquery.js +1026 -0
  246. data/vendor/assets/javascripts/datepicker-ru.jquery.js +21 -0
  247. data/vendor/assets/javascripts/nestedSortable.jquery.js +429 -0
  248. data/vendor/assets/javascripts/qtip.jquery.js +3403 -0
  249. data/vendor/assets/stylesheets/.gitkeep +0 -0
  250. data/vendor/assets/stylesheets/chosen.jquery.css +397 -0
  251. data/vendor/assets/stylesheets/modules/PIE.htc +96 -0
  252. data/vendor/assets/stylesheets/qtip.jquery.css.scss +604 -0
  253. data/vendor/plugins/.gitkeep +0 -0
  254. metadata +333 -0
@@ -0,0 +1,81 @@
1
+ module ActiveAdmin
2
+ module ViewHelpers
3
+ # lib/active_admin/view_helpers/auto_link_helper.rb
4
+
5
+ def auto_link(resource, link_content = nil)
6
+ content = link_content || display_name(resource)
7
+ if can?(:read, resource) && registration = active_admin_resource_for(resource.class)
8
+ begin
9
+ content = link_to(content, send(registration.route_instance_path, resource))
10
+ rescue
11
+ end
12
+ end
13
+ content
14
+ end
15
+ end
16
+
17
+ module Views
18
+ class IndexAsTable
19
+ class IndexTableFor
20
+ # lib/active_admin/views/index_as_table.rb
21
+
22
+ def default_actions(options = {})
23
+ options = {
24
+ :name => ""
25
+ }.merge(options)
26
+ column options[:name] do |resource|
27
+ links = ''.html_safe
28
+ if controller.action_methods.include?('show') && can?(:read, resource)
29
+ links += link_to I18n.t('active_admin.view'), resource_path(resource), :class => "member_link view_link"
30
+ end
31
+ if controller.action_methods.include?('edit') && can?(:update, resource)
32
+ links += link_to I18n.t('active_admin.edit'), edit_resource_path(resource), :class => "member_link edit_link"
33
+ end
34
+ if controller.action_methods.include?('destroy') && can?(:destroy, resource)
35
+ links += link_to I18n.t('active_admin.delete'), resource_path(resource), :method => :delete, :data => {:confirm => I18n.t('active_admin.delete_confirmation')}, :class => "member_link delete_link"
36
+ end
37
+ links += yield(resource) if block_given?
38
+ links
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ class Resource
46
+ # lib/active_admin/resource/menu.rb
47
+
48
+ # The :if block is evaluated by TabbedNavigation#display_item?
49
+ def default_menu_options
50
+ klass = resource_class # avoid variable capture
51
+ super.merge(:if => proc{ can? :read, klass })
52
+ end
53
+
54
+ # lib/active_admin/resource/action_items.rb
55
+
56
+ def add_default_action_items
57
+ # New Link on all actions except :new and :show
58
+ add_action_item(:except => [:new, :show], :if => proc{ can? :create, active_admin_config.resource_class }) do
59
+ if controller.action_methods.include?('new')
60
+ link_to(I18n.t('active_admin.new_model', :model => active_admin_config.resource_label), new_resource_path)
61
+ end
62
+ end
63
+
64
+ # Edit link on show
65
+ add_action_item(:only => :show, :if => proc{ can? :update, resource }) do
66
+ if controller.action_methods.include?('edit')
67
+ link_to(I18n.t('active_admin.edit_model', :model => active_admin_config.resource_label), edit_resource_path(resource))
68
+ end
69
+ end
70
+
71
+ # Destroy link on show
72
+ add_action_item(:only => :show, :if => proc{ can? :destroy, resource }) do
73
+ if controller.action_methods.include?("destroy")
74
+ link_to(I18n.t('active_admin.delete_model', :model => active_admin_config.resource_label),
75
+ resource_path(resource),
76
+ :method => :delete, :data => {:confirm => I18n.t('active_admin.delete_confirmation')})
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,76 @@
1
+ ActiveAdmin::FormBuilder.class_eval do
2
+ # TODO: Upgrade AA and remove
3
+ def semantic_errors(*args)
4
+ content = with_new_form_buffer { super }
5
+ form_buffers.last << content.html_safe unless content.nil?
6
+ end
7
+
8
+ # TODO: Support consistency
9
+ def has_many(association, options = {}, &block)
10
+ options = { :for => association }.merge(options)
11
+ options[:class] ||= ""
12
+ options[:class] << "inputs has_many_fields"
13
+
14
+ # Add Delete Links
15
+ form_block = proc do |has_many_form|
16
+ # @see https://github.com/justinfrench/formtastic/blob/2.2.1/lib/formtastic/helpers/inputs_helper.rb#L373
17
+ contents = if block.arity == 1 # for backwards compatibility with REE & Ruby 1.8.x
18
+ block.call(has_many_form)
19
+ else
20
+ index = parent_child_index(options[:parent]) if options[:parent]
21
+ block.call(has_many_form, index)
22
+ end
23
+
24
+ if has_many_form.object.new_record?
25
+ contents += template.content_tag(:li) do
26
+ template.link_to I18n.t('active_admin.has_many_delete'), "#", :onclick => "$(this).closest('.has_many_fields').remove(); return false;", :class => "button"
27
+ end
28
+ end
29
+
30
+ contents
31
+ end
32
+
33
+ content = with_new_form_buffer do
34
+ attributes = { :class => "has_many #{association}" }
35
+ unless options[:sortable].blank?
36
+ attributes[:class] << " sortable"
37
+ attributes['data-sortable'] = options[:sortable]
38
+ end
39
+
40
+ template.content_tag :div, attributes do
41
+ form_buffers.last << template.content_tag(:h3, object.class.reflect_on_association(association).klass.model_name.human(:count => 1.1))
42
+ inputs options, &form_block
43
+
44
+ js = js_for_has_many(association, form_block, template)
45
+ form_buffers.last << js.html_safe
46
+ end
47
+ end
48
+ form_buffers.last << content.html_safe
49
+ end
50
+
51
+ private
52
+
53
+ # TODO: Remove as https://github.com/gregbell/active_admin/issues/1832 is closed
54
+ def js_for_has_many(association, form_block, template)
55
+ association_reflection = object.class.reflect_on_association(association)
56
+ association_human_name = association_reflection.klass.model_name
57
+ placeholder = "NEW_#{association_human_name.upcase.split(' ').join('_')}_RECORD"
58
+
59
+ js = with_new_form_buffer do
60
+ inputs_for_nested_attributes :for => [association, association_reflection.klass.new],
61
+ :class => "inputs has_many_fields",
62
+ :for_options => { :child_index => placeholder },
63
+ &form_block
64
+ end
65
+
66
+ js = template.escape_javascript(js)
67
+
68
+ text = I18n.t 'active_admin.has_many_new', :model => association_human_name.human
69
+ onclick = "$(this).siblings('li.input').append('#{js}'.replace(/#{placeholder}/g, new Date().getTime())); return false;"
70
+
71
+ template.link_to text, "#",
72
+ :onclick => onclick,
73
+ :class => "button"
74
+ end
75
+
76
+ end
@@ -0,0 +1,24 @@
1
+ module ActiveAdmin
2
+ module Inputs
3
+ class FilterDateRangeInput
4
+
5
+ def to_html
6
+ input_wrapping do
7
+ [ label_html,
8
+ builder.text_field(gt_input_name, input_html_options(gt_input_name, 'datepickergte')),
9
+ template.content_tag(:span, "-", :class => "seperator"),
10
+ builder.text_field(lt_input_name, input_html_options(lt_input_name, 'datepickerlte')),
11
+ ].join("\n").html_safe
12
+ end
13
+ end
14
+
15
+ def input_html_options(input_name = gt_input_name, extra_class = '')
16
+ current_value = @object.send(input_name)
17
+ { :size => 12,
18
+ :class => "datepicker #{extra_class}",
19
+ :max => 10,
20
+ :value => current_value.respond_to?(:strftime) ? current_value.strftime("%Y-%m-%d") : "" }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,18 @@
1
+ module ActiveAdmin
2
+ module Inputs
3
+ class FilterMultipleSelectInput < Formtastic::Inputs::SelectInput
4
+ include FilterBase
5
+
6
+ def input_name
7
+ "#{super}_in"
8
+ end
9
+
10
+ def extra_input_html_options
11
+ {
12
+ :multiple => 'multiple',
13
+ :'data-placeholder' => I18n.t('active_admin.filters.multiple_select.placeholder')
14
+ }
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,31 @@
1
+ module ActiveAdmin
2
+ module Inputs
3
+ class FilterNumericRangeInput < ::Formtastic::Inputs::StringInput
4
+ include FilterBase
5
+
6
+ def to_html
7
+ input_wrapping do
8
+ [ label_html,
9
+ builder.text_field(gt_input_name, input_html_options(gt_input_name)),
10
+ template.content_tag(:span, "-".html_safe, :class => "seperator"),
11
+ builder.text_field(lt_input_name, input_html_options(lt_input_name)),
12
+ ].join("\n").html_safe
13
+ end
14
+ end
15
+
16
+ def gt_input_name
17
+ "#{method}_gte"
18
+ end
19
+ alias :input_name :gt_input_name
20
+
21
+ def lt_input_name
22
+ "#{method}_lte"
23
+ end
24
+
25
+ def input_html_options(input_name = gt_input_name)
26
+ current_value = @object.send(input_name)
27
+ { :size => 10, :id => "#{input_name}_numeric" , :value => current_value}
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,23 @@
1
+ module ActiveAdmin
2
+ class ResourceController < BaseController
3
+ before_filter :fix_datetime_filter_inclusion, :only => :index
4
+
5
+ def clean_search_params(search_params)
6
+ super.delete_if do |key, value|
7
+ value == [""]
8
+ end
9
+ end
10
+
11
+ private
12
+
13
+ def fix_datetime_filter_inclusion
14
+ resource_class.columns.each do |c|
15
+ next unless c.type == :datetime
16
+
17
+ if !params["q"].blank? && !params["q"]["#{c.name}_lte"].blank?
18
+ params["q"]["#{c.name}_lte"] += " 23:59:59.999999"
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ class ActiveAdmin::Views::Pages::Base < Arbre::HTML::Document
2
+
3
+ private
4
+
5
+ # Renders the content for the footer
6
+ def build_footer
7
+ div :id => "footer" do
8
+ revision = Smartkiosk::Server.revision.blank? ? '' : "(#{Smartkiosk::Server.revision})"
9
+ para "Smartkiosk #{Smartkiosk::Server::VERSION} #{revision} &copy; 2012 &mdash; #{Date.today.year}".html_safe
10
+ end
11
+ end
12
+
13
+ end
File without changes
data/lib/blueprints.rb ADDED
@@ -0,0 +1,79 @@
1
+ require 'machinist/active_record'
2
+
3
+ require 'provider_field'
4
+
5
+ User.blueprint do
6
+ full_name { Faker::Name.name }
7
+ end
8
+
9
+ Agent.blueprint do
10
+ title { Faker::Name.name }
11
+ end
12
+
13
+ ProviderProfile.blueprint do
14
+ title { Faker::HipsterIpsum.words(2).join(' ') }
15
+ end
16
+
17
+ TerminalProfile.blueprint do
18
+ title { Faker::HipsterIpsum.words(2).join(' ') }
19
+ support_phone { Faker::PhoneNumber.short_phone_number }
20
+ end
21
+
22
+ ProviderGroup.blueprint do
23
+ title { Faker::HipsterIpsum.words(2).join(' ') }
24
+ end
25
+
26
+ Terminal.blueprint do
27
+ terminal_profile { TerminalProfile.first || TerminalProfile.make! }
28
+ agent { Agent.first }
29
+ address { Faker::Address.street_address }
30
+ keyword { "TEST-" + (Terminal.count + 1).to_s }
31
+ condition { ['ok', 'warning', 'error'].sample }
32
+ state { ['active', 'disabled', 'upgrading', 'rebooting'].sample }
33
+ notified_at { DateTime.now }
34
+ collected_at { DateTime.now }
35
+ printer_error { [nil, 1, 2000].sample }
36
+ cash_acceptor_error { [nil, 1, 2000].sample }
37
+ modem_error { [nil, 1, 2000].sample }
38
+ issues_started_at { [nil, nil, DateTime.now].sample }
39
+ has_adv_monitor { [true, false].sample }
40
+ end
41
+
42
+ Payment.blueprint do
43
+ payment_type { [0,1,2].sample }
44
+ session_id { Random.new.rand(1...1000000) }
45
+ terminal { Terminal.all.sample }
46
+ gateway { Gateway.first }
47
+ provider { Provider.all.sample }
48
+ paid_amount { Random.new.rand(100..10000).round(2) }
49
+ enrolled_amount { Random.new.rand(100..10000).round(2) }
50
+ commission_amount { Random.new.rand(1..1000).round(2) }
51
+ rebate_amount { Random.new.rand(1..1000).round(2) }
52
+ paid_at { DateTime.now }
53
+ state { ['error', 'queue', 'manual', 'paid', 'checked'].sample }
54
+ end
55
+
56
+ TerminalPing.blueprint do
57
+ state { 'active' }
58
+ ip { '127.0.0.1' }
59
+ version { '0.0.1' }
60
+ banknotes { {'50' => 5, '1000' => 3} }
61
+ cash_acceptor { {'error' => nil, 'version' => '1.0'} }
62
+ printer { {'error' => nil, 'version' => '1.0'} }
63
+ modem { {'error' => nil, 'version' => '1.0', 'signal_level' => 4, 'balance' => 44.5} }
64
+ queues { {'payments' => 4, 'orders' => 0} }
65
+ end
66
+
67
+ Provider.blueprint do
68
+ title { Faker::HipsterIpsum.words(2).join(' ') }
69
+ provider_profile { ProviderProfile.first || ProviderProfile.make! }
70
+ provider_group { ProviderGroup.first || ProviderGroup.make! }
71
+ end
72
+
73
+ ProviderField.blueprint do
74
+ keyword { Faker::Lorem.word }
75
+ title { Faker::HipsterIpsum.word }
76
+ kind { ['phone', 'string', 'date', 'select'].sample }
77
+ values { Faker::HipsterIpsum.words(3).join(',') }
78
+ mask { ['1-x-2', '1-1', nil].sample }
79
+ end
@@ -0,0 +1,38 @@
1
+ module DateExpander extend ActiveSupport::Concern
2
+ included do
3
+ cattr_accessor :date_expander_field
4
+ expand_date_from :created_at
5
+
6
+ before_create do
7
+ x = self.class.date_expander_field
8
+ x = self.send(x)
9
+
10
+ if self.class.date_expander_field == :created_at && x.blank?
11
+ x = DateTime.now
12
+ end
13
+
14
+ unless x.blank?
15
+ self.hour = x.change(:min => 0)
16
+ self.day = x.change(:hour => 0).to_date
17
+ self.month = x.change(:day => 1, :hour => 0).to_date
18
+ end
19
+ end
20
+
21
+ before_update do
22
+ x = self.class.date_expander_field
23
+ x = self.send(x)
24
+
25
+ unless x.blank?
26
+ self.hour = x.change(:min => 0)
27
+ self.day = x.change(:hour => 0).to_date
28
+ self.month = x.change(:day => 1, :hour => 0).to_date
29
+ end
30
+ end
31
+ end
32
+
33
+ module ClassMethods
34
+ def expand_date_from(field)
35
+ self.date_expander_field = field
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,59 @@
1
+ require 'dav4rack/file_resource'
2
+
3
+ module DAV4Rack
4
+
5
+ class BuildResource < FileResource
6
+
7
+ # TODO: This is a workaround of Rack bug
8
+ # Fix is in master which is incompatible with current Rails (facepalm)
9
+ # https://github.com/rack/rack/commit/7c36a88f73339bebe8b91b27e47ac958a7965f4f
10
+ #
11
+ # The whole method should be removed as soon as new Rack is released
12
+ def get(request, response)
13
+ return super unless stat.directory?
14
+
15
+ response.body = ""
16
+
17
+ rack_directory = Rack::Directory.new(root).call(request.env)[2]
18
+
19
+ rack_directory.files.map do |x|
20
+ x[0].gsub! /^#{Regexp.escape('%2Fbuilds')}/, '/builds'
21
+ x
22
+ end
23
+
24
+ rack_directory.each do |line|
25
+ response.body << line
26
+ end
27
+ response['Content-Length'] = response.body.bytesize.to_s
28
+ OK
29
+ end
30
+
31
+ def put(*args)
32
+ raise HTTPStatus::Forbidden
33
+ end
34
+
35
+ def delete(*args)
36
+ raise HTTPStatus::Forbidden
37
+ end
38
+
39
+ def copy(*args)
40
+ raise HTTPStatus::Forbidden
41
+ end
42
+
43
+ def move(*args)
44
+ raise HTTPStatus::Forbidden
45
+ end
46
+
47
+ def make_collection
48
+ raise HTTPStatus::Forbidden
49
+ end
50
+
51
+ protected
52
+
53
+ def prop_hash
54
+ {}
55
+ end
56
+
57
+ end
58
+
59
+ end
@@ -0,0 +1,39 @@
1
+ module Formtastic
2
+ module Inputs
3
+ class SelectableCheckBoxesInput < CheckBoxesInput
4
+ def to_html
5
+ input_wrapping do
6
+ choices_wrapping do
7
+ legend_html <<
8
+ hidden_field_for_all <<
9
+ choices_group_wrapping do
10
+ select_all_html +
11
+ collection.map { |choice|
12
+ choice_wrapping(choice_wrapping_html_options(choice)) do
13
+ choice_html(choice)
14
+ end
15
+ }.join("\n").html_safe
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ def select_all_html
22
+ choice_wrapping({}) do
23
+ check_box = template.check_box_tag(nil, nil, false,
24
+ :onclick => <<-JS
25
+ selector = $(this);
26
+ condition = selector.is(':checked');
27
+
28
+ selector.closest('.choices-group').find('[type=checkbox]').attr('checked', condition);
29
+ JS
30
+ )
31
+
32
+ template.content_tag(:label,
33
+ check_box << I18n.t('select_all')
34
+ )
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,3 @@
1
+ Version.module_eval do
2
+ belongs_to :user, :foreign_key => 'whodunnit'
3
+ end
@@ -0,0 +1,88 @@
1
+ module ReportBuilder
2
+ def self.constantize(keyword)
3
+ "#{keyword.camelize}Report".constantize rescue false
4
+ end
5
+
6
+ class Base
7
+ attr_accessor :report
8
+ attr_accessor :template
9
+
10
+ def self.requires_dates!
11
+ @requires_dates = true
12
+ end
13
+
14
+ def self.requires_dates?
15
+ !!@requires_dates
16
+ end
17
+
18
+ def requires_dates?
19
+ self.class.requires_dates?
20
+ end
21
+
22
+ def initialize(report=nil)
23
+ unless report.blank?
24
+ self.report = report
25
+ self.template = report.report_template
26
+ end
27
+ end
28
+
29
+ def keyword
30
+ self.class.name.underscore.gsub('_report', '')
31
+ end
32
+
33
+ def arelize(field)
34
+ field = field.split('.')
35
+ table = tables[field.first]
36
+
37
+ raise "Table `#{field.first}' not found for `#{template.kind}' report kind" if table.blank?
38
+
39
+ table[field.last.to_sym]
40
+ end
41
+
42
+ def query
43
+ query = context(report.start, report.finish)
44
+
45
+ aggregate = {
46
+ 'postgresql' => 'MIN'
47
+ }[ActiveRecord::Base.configurations[Rails.env]['adapter']]
48
+
49
+ fields = template.fields.select{|x| !x.blank?}.each do |field|
50
+ projection = arelize(field)
51
+
52
+ if !aggregate.blank? && !template.groupping.blank?
53
+ projection = Arel::Nodes::NamedFunction.new(
54
+ aggregate, [ projection ]
55
+ )
56
+ end
57
+
58
+ projection = projection.as("\"#{field}\"")
59
+ query = query.project(projection)
60
+ end
61
+
62
+ order = arelize(template.sorting) unless template.sorting.blank?
63
+ order = order.desc if !order.blank? && template.sort_desc
64
+ query = query.group(arelize template.groupping) unless template.groupping.blank?
65
+ query = query.order(order) unless order.blank?
66
+
67
+ unless template.conditions.blank?
68
+ template.conditions.each do |column, value|
69
+ next if value.blank?
70
+
71
+ if value.is_a?(Array)
72
+ query = query.where(arelize(column).in(value))
73
+ else
74
+ query = query.where(arelize(column).eq(value))
75
+ end
76
+ end
77
+ end
78
+
79
+ unless template.calculations.blank?
80
+ template.calculations.select{|x| !x.blank?}.each do |calculation|
81
+ query = calculations[calculation].call(query, template)
82
+ end
83
+ end
84
+
85
+ query.to_sql
86
+ end
87
+ end
88
+ end
data/lib/seeder.rb ADDED
@@ -0,0 +1,103 @@
1
+ # encoding: utf-8
2
+
3
+ require 'blueprints'
4
+
5
+ require 'role'
6
+ require 'provider_gateway'
7
+ require 'terminal_profile_promotion'
8
+
9
+ class Seeder
10
+ seeds_root = File.expand_path "../../db/seeds/", __FILE__
11
+
12
+ cattr_accessor :engines
13
+ cattr_accessor :system_receipt_templates_path, :providers_receipt_template_path
14
+ attr_accessor :user, :agent, :terminals, :dummy
15
+
16
+ @@engines = []
17
+ @@system_receipt_templates_path = "#{seeds_root}/receipt_templates/system/*.txt"
18
+ @@providers_receipt_template_path = "#{seeds_root}/receipt_templates/payment.txt"
19
+
20
+ def initialize
21
+ seed_roles
22
+
23
+ @user = User.make! :root => true, :email => 'admin@example.com', :password => 'password'
24
+ @agent = Agent.make!
25
+ @terminals = []
26
+ end
27
+
28
+ def truncate_database
29
+ DatabaseCleaner.strategy = :truncation
30
+ DatabaseCleaner.clean
31
+ end
32
+
33
+ def seed_engines
34
+ self.class.engines.each do |e|
35
+ e.const_get('Engine').load_seed
36
+ end
37
+ end
38
+
39
+ def seed_roles
40
+ Role.entries.each do |x|
41
+ Role.create! :keyword => x
42
+ end
43
+ end
44
+
45
+ def seed_gateways
46
+ @dummy = Gateway.create! :title => 'Заглушка', :keyword => 'dummy', :payzilla => 'dummy'
47
+ end
48
+
49
+ def seed_terminal(keyword)
50
+ Terminal.make!(:keyword => keyword, :agent => @agent).ping! TerminalPing.make
51
+ end
52
+
53
+ def seed_test_terminals
54
+ 100.times do |i|
55
+ @terminals << Terminal.make!(:agent => @agent)
56
+ end
57
+ end
58
+
59
+ def seed_terminal_profiles
60
+ TerminalProfile.make!
61
+ end
62
+
63
+ def seed_test_providers
64
+ Provider.make! :keyword => 'first'
65
+ Provider.make! :keyword => 'second'
66
+ Provider.make! :keyword => 'third'
67
+ Provider.make! :keyword => 'fourth'
68
+
69
+ Provider.all.each do |p|
70
+ ProviderGateway.create! :provider => p, :gateway => @dummy, :priority => 1
71
+
72
+ ([1,5].sample).times do
73
+ ProviderField.make! :provider => p
74
+ end
75
+ end
76
+ end
77
+
78
+ def seed_test_terminal_profile_promotions
79
+ profile = TerminalProfile.first
80
+
81
+ Provider.all.each_with_index do |p, i|
82
+ TerminalProfilePromotion.create! :terminal_profile => profile, :provider => p
83
+ end
84
+ end
85
+
86
+ def seed_test_payments
87
+ 100.times do |i|
88
+ Payment.make! :agent => @agent, :terminal => @terminals.sample, :provider_gateway => @dummy.provider_gateways.sample, :gateway_error => [nil, -1].sample
89
+ end
90
+ end
91
+
92
+ def seed_receipt_templates
93
+ Dir[self.class.system_receipt_templates_path].each do |rt|
94
+ SystemReceiptTemplate.create! :keyword => File.basename(rt).gsub('.txt', ''), :template => File.read(rt)
95
+ end
96
+
97
+ ProviderReceiptTemplate.create!(
98
+ :system => true,
99
+ :template => File.read(providers_receipt_template_path)
100
+ )
101
+ end
102
+
103
+ end