brisk-bills 0.6.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 (524) hide show
  1. data/CHANGELOG +8 -0
  2. data/COPYING +674 -0
  3. data/COPYING.LESSER +165 -0
  4. data/INSTALL +5 -0
  5. data/README +22 -0
  6. data/Rakefile +11 -0
  7. data/TODO.txt +112 -0
  8. data/app/controllers/admin/activities_controller.rb +151 -0
  9. data/app/controllers/admin/activities_controller/adjustment.rb +16 -0
  10. data/app/controllers/admin/activities_controller/labor.rb +119 -0
  11. data/app/controllers/admin/activities_controller/labor/slimtimer.rb +28 -0
  12. data/app/controllers/admin/activities_controller/material.rb +20 -0
  13. data/app/controllers/admin/activities_controller/proposal.rb +15 -0
  14. data/app/controllers/admin/activities_with_prices_controller.rb +68 -0
  15. data/app/controllers/admin/adjustments_controller.rb +22 -0
  16. data/app/controllers/admin/client_accounting_controller.rb +49 -0
  17. data/app/controllers/admin/client_financial_transactions_controller.rb +24 -0
  18. data/app/controllers/admin/client_representatives_controller.rb +31 -0
  19. data/app/controllers/admin/clients_controller.rb +31 -0
  20. data/app/controllers/admin/employee_client_labor_rate_controller.rb +30 -0
  21. data/app/controllers/admin/employees_controller.rb +32 -0
  22. data/app/controllers/admin/employees_controller/slimtimer.rb +29 -0
  23. data/app/controllers/admin/invoices_controller.rb +165 -0
  24. data/app/controllers/admin/labors_controller.rb +103 -0
  25. data/app/controllers/admin/labors_controller/slimtimer.rb +31 -0
  26. data/app/controllers/admin/materials_controller.rb +24 -0
  27. data/app/controllers/admin/payments_controller.rb +75 -0
  28. data/app/controllers/admin/proposals_controller.rb +22 -0
  29. data/app/controllers/admin/settings_controller.rb +23 -0
  30. data/app/controllers/application_controller.rb +22 -0
  31. data/app/controllers/authentication_controller.rb +131 -0
  32. data/app/helpers/activity_type_model_helper.rb +194 -0
  33. data/app/helpers/admin/activities_helper.rb +110 -0
  34. data/app/helpers/admin/activities_helper/labor_helper.rb +28 -0
  35. data/app/helpers/admin/activities_helper/proposal_helper.rb +11 -0
  36. data/app/helpers/admin/activities_helper/slimtimer_helper.rb +13 -0
  37. data/app/helpers/admin/activities_with_prices_helper.rb +17 -0
  38. data/app/helpers/admin/activity_tax_controller_helper.rb +48 -0
  39. data/app/helpers/admin/activity_tax_field_helper.rb +33 -0
  40. data/app/helpers/admin/activity_type_controller_helper.rb +83 -0
  41. data/app/helpers/admin/activity_type_field_helper.rb +45 -0
  42. data/app/helpers/admin/adjustments_helper.rb +5 -0
  43. data/app/helpers/admin/client_accounting_helper.rb +13 -0
  44. data/app/helpers/admin/client_financial_transactions_helper.rb +9 -0
  45. data/app/helpers/admin/client_representatives_helper.rb +26 -0
  46. data/app/helpers/admin/clients_helper.rb +6 -0
  47. data/app/helpers/admin/employee_client_labor_rate_helper.rb +77 -0
  48. data/app/helpers/admin/employees_helper.rb +9 -0
  49. data/app/helpers/admin/employees_helper/slimtimer_helper.rb +2 -0
  50. data/app/helpers/admin/has_credential_column_helper.rb +60 -0
  51. data/app/helpers/admin/invoices_helper.rb +59 -0
  52. data/app/helpers/admin/is_active_column_helper.rb +46 -0
  53. data/app/helpers/admin/labors_helper.rb +20 -0
  54. data/app/helpers/admin/labors_helper/slimtimer_helper.rb +13 -0
  55. data/app/helpers/admin/materials_helper.rb +5 -0
  56. data/app/helpers/admin/payments_helper.rb +41 -0
  57. data/app/helpers/admin/proposals_helper.rb +3 -0
  58. data/app/helpers/admin/settings_helper.rb +8 -0
  59. data/app/helpers/admin_layout_helper.rb +91 -0
  60. data/app/helpers/application_helper.rb +27 -0
  61. data/app/helpers/authentication_helper.rb +61 -0
  62. data/app/helpers/extensible_object_helper.rb +28 -0
  63. data/app/helpers/has_credential_model_helper.rb +39 -0
  64. data/app/helpers/invoice_pdf_helper.rb +71 -0
  65. data/app/helpers/is_active_model_helper.rb +40 -0
  66. data/app/helpers/money_model_helper.rb +21 -0
  67. data/app/model_views/client_accounting.rb +5 -0
  68. data/app/model_views/client_financial_transaction.rb +15 -0
  69. data/app/model_views/invoices_with_total.rb +36 -0
  70. data/app/models/activity.rb +104 -0
  71. data/app/models/activity/adjustment.rb +34 -0
  72. data/app/models/activity/labor.rb +91 -0
  73. data/app/models/activity/labor/slimtimer.rb +28 -0
  74. data/app/models/activity/material.rb +16 -0
  75. data/app/models/activity/proposal.rb +17 -0
  76. data/app/models/activity_type.rb +2 -0
  77. data/app/models/client.rb +93 -0
  78. data/app/models/client_eventlog.rb +5 -0
  79. data/app/models/client_representative.rb +22 -0
  80. data/app/models/credential.rb +195 -0
  81. data/app/models/employee.rb +49 -0
  82. data/app/models/employee/labor.rb +13 -0
  83. data/app/models/employee/slimtimer.rb +43 -0
  84. data/app/models/employee_client_labor_rate.rb +20 -0
  85. data/app/models/invoice.rb +280 -0
  86. data/app/models/invoice_payment.rb +8 -0
  87. data/app/models/notifier.rb +85 -0
  88. data/app/models/payment.rb +108 -0
  89. data/app/models/payment_method.rb +7 -0
  90. data/app/models/setting.rb +39 -0
  91. data/app/models/slimtimer_task.rb +6 -0
  92. data/app/models/slimtimer_time_entry.rb +69 -0
  93. data/app/views/admin/activities/_adjustment_column.rhtml +23 -0
  94. data/app/views/admin/activities/_form.rhtml +20 -0
  95. data/app/views/admin/activities/_form_attribute.rhtml +12 -0
  96. data/app/views/admin/activities/_labor_column.rhtml +17 -0
  97. data/app/views/admin/activities/_material_column.rhtml +10 -0
  98. data/app/views/admin/activities/_proposal_column.rhtml +11 -0
  99. data/app/views/admin/activities_with_prices/move_to_invoice.rhtml +44 -0
  100. data/app/views/admin/activities_with_prices/move_to_invoice.rjs +9 -0
  101. data/app/views/admin/invoices/download.rpdf +224 -0
  102. data/app/views/authentication/email.rjs +9 -0
  103. data/app/views/authentication/login.rhtml +75 -0
  104. data/app/views/authentication/login.rjs +14 -0
  105. data/app/views/authentication/reset_password_via_token.rhtml +16 -0
  106. data/app/views/authentication/reset_password_via_token.rjs +6 -0
  107. data/app/views/authentication/sign_in_error.rjs +2 -0
  108. data/app/views/layouts/_navigation_tree.rhtml +15 -0
  109. data/app/views/layouts/admin.rhtml +26 -0
  110. data/app/views/layouts/public.rhtml +18 -0
  111. data/app/views/notifier/_email_footer.html.rhtml +12 -0
  112. data/app/views/notifier/_email_footer.plain.rhtml +3 -0
  113. data/app/views/notifier/_email_header.html.rhtml +53 -0
  114. data/app/views/notifier/invoice_available.html.rhtml +5 -0
  115. data/app/views/notifier/invoice_available.plain.rhtml +4 -0
  116. data/app/views/notifier/reset_password_requested.html.rhtml +15 -0
  117. data/app/views/notifier/reset_password_requested.plain.rhtml +9 -0
  118. data/bin/brisk-bills +51 -0
  119. data/config/boot.rb +164 -0
  120. data/config/environment.rb +39 -0
  121. data/config/environments/development.rb +17 -0
  122. data/config/environments/production.rb +18 -0
  123. data/config/environments/test.rb +19 -0
  124. data/config/locale/en.rb +26 -0
  125. data/config/routes.rb +20 -0
  126. data/config/secrets.yml +2 -0
  127. data/db/migrate/001_create_employees.rb +14 -0
  128. data/db/migrate/002_create_employee_slimtimers.rb +14 -0
  129. data/db/migrate/003_create_slimtimer_tasks.rb +21 -0
  130. data/db/migrate/004_create_slimtimer_time_entries.rb +25 -0
  131. data/db/migrate/005_create_clients.rb +12 -0
  132. data/db/migrate/006_create_client_representatives.rb +16 -0
  133. data/db/migrate/007_create_client_eventlogs.rb +13 -0
  134. data/db/migrate/008_create_activities.rb +17 -0
  135. data/db/migrate/009_create_activity_labors.rb +16 -0
  136. data/db/migrate/010_create_employee_client_labor_rates.rb +19 -0
  137. data/db/migrate/011_create_activity_adjustments.rb +16 -0
  138. data/db/migrate/012_create_activity_materials.rb +16 -0
  139. data/db/migrate/013_create_activity_proposals.rb +18 -0
  140. data/db/migrate/014_create_invoices.rb +16 -0
  141. data/db/migrate/015_create_payments.rb +18 -0
  142. data/db/migrate/016_create_payment_methods.rb +18 -0
  143. data/db/migrate/017_create_invoice_payments.rb +14 -0
  144. data/db/migrate/018_create_activity_types.rb +37 -0
  145. data/db/migrate/019_create_settings.rb +45 -0
  146. data/db/migrate/020_is_active_employees_clients.rb +11 -0
  147. data/db/migrate/021_create_views_and_indexes.rb +78 -0
  148. data/db/migrate/022_create_client_financial_transactions.rb +32 -0
  149. data/db/migrate/023_create_credentials_migrate_representatives.rb +133 -0
  150. data/db/migrate/024_updates_for_sales_tax.rb +91 -0
  151. data/db/migrate/025_alter_credentials_for_reset.rb +11 -0
  152. data/db/migrate/026_create_st_settings.rb +17 -0
  153. data/db/migrate/027_create_sessions.rb +16 -0
  154. data/db/migrate/028_money_to_cents.rb +136 -0
  155. data/db/schema.rb +301 -0
  156. data/lib/brisk-bills.rb +17 -0
  157. data/lib/brisk-bills/initializer.rb +100 -0
  158. data/lib/dti-navigation-menu/lib/dti-navigation-menu.rb +27 -0
  159. data/lib/generators/generator_base_extension.rb +16 -0
  160. data/lib/generators/instance/instance_generator.rb +117 -0
  161. data/lib/generators/instance/templates/databases/mysql.yml +47 -0
  162. data/lib/generators/instance/templates/instance_boot.rb +166 -0
  163. data/lib/generators/instance/templates/instance_environment.rb +65 -0
  164. data/lib/generators/instance/templates/instance_generate +18 -0
  165. data/lib/generators/instance/templates/instance_rakefile +3 -0
  166. data/lib/generators/instance/templates/instance_routes.rb +1 -0
  167. data/lib/tasks/create_last_months_invoices.rake +37 -0
  168. data/lib/tasks/credential_tasks.rake +47 -0
  169. data/lib/tasks/first_time_setup.rake +96 -0
  170. data/lib/tasks/instance.rake +27 -0
  171. data/lib/tasks/invoice_as_csv.rake +32 -0
  172. data/lib/tasks/package.rake +120 -0
  173. data/lib/tasks/slimtimer_import.rake +198 -0
  174. data/lib/utilities.rb +18 -0
  175. data/log/.keep +0 -0
  176. data/public/.htaccess +40 -0
  177. data/public/404.html +30 -0
  178. data/public/500.html +30 -0
  179. data/public/blank.html +33 -0
  180. data/public/blank_iframe.html +2 -0
  181. data/public/dispatch.cgi +10 -0
  182. data/public/dispatch.fcgi +24 -0
  183. data/public/dispatch.rb +10 -0
  184. data/public/favicon.ico +0 -0
  185. data/public/images/active_scaffold/DO_NOT_EDIT +2 -0
  186. data/public/images/active_scaffold/default/add.gif +0 -0
  187. data/public/images/active_scaffold/default/arrow_down.gif +0 -0
  188. data/public/images/active_scaffold/default/arrow_up.gif +0 -0
  189. data/public/images/active_scaffold/default/close.gif +0 -0
  190. data/public/images/active_scaffold/default/cross.png +0 -0
  191. data/public/images/active_scaffold/default/indicator-small.gif +0 -0
  192. data/public/images/active_scaffold/default/indicator.gif +0 -0
  193. data/public/images/active_scaffold/default/magnifier.png +0 -0
  194. data/public/images/background.gif +0 -0
  195. data/public/images/brisk-bills-logo.gif +0 -0
  196. data/public/images/calendar_date_select/calendar.gif +0 -0
  197. data/public/images/dti-logo.gif +0 -0
  198. data/public/images/dti-logo.jpg +0 -0
  199. data/public/images/favicon.ico +0 -0
  200. data/public/images/invoice-background.jpg +0 -0
  201. data/public/images/login-form-spinner.gif +0 -0
  202. data/public/images/nav-arrow.gif +0 -0
  203. data/public/images/notice-error.gif +0 -0
  204. data/public/images/notice-info.gif +0 -0
  205. data/public/images/rails.png +0 -0
  206. data/public/javascripts/active_scaffold/DO_NOT_EDIT +2 -0
  207. data/public/javascripts/active_scaffold/default/active_scaffold.js +430 -0
  208. data/public/javascripts/active_scaffold/default/dhtml_history.js +867 -0
  209. data/public/javascripts/active_scaffold/default/form_enhancements.js +114 -0
  210. data/public/javascripts/active_scaffold/default/rico_corner.js +370 -0
  211. data/public/javascripts/application.js +2 -0
  212. data/public/javascripts/briskbills-quick-helpers.js +9 -0
  213. data/public/javascripts/builder.js +136 -0
  214. data/public/javascripts/controls.js +963 -0
  215. data/public/javascripts/dragdrop.js +973 -0
  216. data/public/javascripts/effects.js +1128 -0
  217. data/public/javascripts/modalbox.js +573 -0
  218. data/public/javascripts/prototype.js +4320 -0
  219. data/public/javascripts/scriptaculous.js +58 -0
  220. data/public/javascripts/shadedborder.js +249 -0
  221. data/public/javascripts/slider.js +275 -0
  222. data/public/javascripts/sound.js +55 -0
  223. data/public/javascripts/unittest.js +568 -0
  224. data/public/robots.txt +1 -0
  225. data/public/stylesheets/active_scaffold/DO_NOT_EDIT +2 -0
  226. data/public/stylesheets/active_scaffold/default/stylesheet-ie.css +35 -0
  227. data/public/stylesheets/active_scaffold/default/stylesheet.css +809 -0
  228. data/public/stylesheets/admin/global.css +152 -0
  229. data/public/stylesheets/admin/pages.css +137 -0
  230. data/public/stylesheets/admin/screen.css +3 -0
  231. data/public/stylesheets/admin/structure.css +88 -0
  232. data/public/stylesheets/modalbox.css +95 -0
  233. data/public/stylesheets/public/global.css +36 -0
  234. data/public/stylesheets/public/pages.css +105 -0
  235. data/public/stylesheets/public/screen.css +3 -0
  236. data/public/stylesheets/public/structure.css +0 -0
  237. data/public/stylesheets/spinner.gif +0 -0
  238. data/script/about +3 -0
  239. data/script/breakpointer +3 -0
  240. data/script/console +3 -0
  241. data/script/dbconsole +3 -0
  242. data/script/destroy +3 -0
  243. data/script/generate +3 -0
  244. data/script/performance/benchmarker +3 -0
  245. data/script/performance/profiler +3 -0
  246. data/script/performance/request +3 -0
  247. data/script/plugin +3 -0
  248. data/script/process/inspector +3 -0
  249. data/script/process/reaper +3 -0
  250. data/script/process/spawner +3 -0
  251. data/script/runner +3 -0
  252. data/script/server +3 -0
  253. data/test/fixtures/activities.yml +28 -0
  254. data/test/fixtures/activity_adjustments.yml +7 -0
  255. data/test/fixtures/activity_labors.yml +25 -0
  256. data/test/fixtures/activity_materials.yml +7 -0
  257. data/test/fixtures/activity_proposals.yml +7 -0
  258. data/test/fixtures/activity_types.yml +23 -0
  259. data/test/fixtures/client_eventlogs.yml +5 -0
  260. data/test/fixtures/client_financial_transactions.yml +7 -0
  261. data/test/fixtures/client_representatives.yml +56 -0
  262. data/test/fixtures/clients.yml +172 -0
  263. data/test/fixtures/credentials.yml +34 -0
  264. data/test/fixtures/employee_client_labor_rates.yml +365 -0
  265. data/test/fixtures/employee_slimtimers.yml +19 -0
  266. data/test/fixtures/employees.yml +22 -0
  267. data/test/fixtures/invoice_payments.yml +7 -0
  268. data/test/fixtures/invoices.yml +7 -0
  269. data/test/fixtures/payment_methods.yml +7 -0
  270. data/test/fixtures/payments.yml +7 -0
  271. data/test/fixtures/settings.yml +7 -0
  272. data/test/fixtures/slimtimer_tasks.yml +5 -0
  273. data/test/fixtures/slimtimer_time_entries.yml +5 -0
  274. data/test/functional/admin/activities_controller_test.rb +8 -0
  275. data/test/functional/admin/adjustments_controller_test.rb +8 -0
  276. data/test/functional/admin/client_accounting_controller_test.rb +8 -0
  277. data/test/functional/admin/client_financial_transactions_controller_test.rb +8 -0
  278. data/test/functional/admin/client_representatives_controller_test.rb +8 -0
  279. data/test/functional/admin/clients_controller_test.rb +8 -0
  280. data/test/functional/admin/employee_client_labor_rate_controller_test.rb +8 -0
  281. data/test/functional/admin/employees/slimtimer_controller_test.rb +8 -0
  282. data/test/functional/admin/employees_controller_test.rb +8 -0
  283. data/test/functional/admin/invoices_controller_test.rb +8 -0
  284. data/test/functional/admin/labors_controller_test.rb +8 -0
  285. data/test/functional/admin/materials_controller_test.rb +8 -0
  286. data/test/functional/admin/payments_controller_test.rb +8 -0
  287. data/test/functional/admin/proposals_controller_test.rb +8 -0
  288. data/test/functional/admin/settings_controller_test.rb +8 -0
  289. data/test/functional/authentication_controller_test.rb +8 -0
  290. data/test/test_helper.rb +30 -0
  291. data/test/test_unit_factory_helper.rb +154 -0
  292. data/test/unit/activity/adjustment_test.rb +8 -0
  293. data/test/unit/activity/labor_test.rb +279 -0
  294. data/test/unit/activity/material_test.rb +8 -0
  295. data/test/unit/activity/proposal_test.rb +8 -0
  296. data/test/unit/activity_test.rb +83 -0
  297. data/test/unit/activity_type_test.rb +8 -0
  298. data/test/unit/client_eventlog_test.rb +10 -0
  299. data/test/unit/client_financial_transaction_test.rb +8 -0
  300. data/test/unit/client_representative_test.rb +10 -0
  301. data/test/unit/client_test.rb +24 -0
  302. data/test/unit/credential_test.rb +217 -0
  303. data/test/unit/employee/slimtimer_test.rb +10 -0
  304. data/test/unit/employee_client_labor_rate_test.rb +8 -0
  305. data/test/unit/employee_test.rb +25 -0
  306. data/test/unit/invoice_payment_test.rb +8 -0
  307. data/test/unit/invoice_test.rb +459 -0
  308. data/test/unit/notifier_test.rb +9 -0
  309. data/test/unit/payment_method_test.rb +8 -0
  310. data/test/unit/payment_test.rb +155 -0
  311. data/test/unit/setting_test.rb +8 -0
  312. data/test/unit/slimtimer_task_test.rb +10 -0
  313. data/test/unit/slimtimer_time_entry_test.rb +132 -0
  314. data/vendor/plugins/InlineAttachment-0.3.0-modified/README +79 -0
  315. data/vendor/plugins/InlineAttachment-0.3.0-modified/init.rb +2 -0
  316. data/vendor/plugins/InlineAttachment-0.3.0-modified/lib/inline_attachment.rb +136 -0
  317. data/vendor/plugins/InlineAttachment-0.3.0-modified/lib/tmail_content_id.rb +40 -0
  318. data/vendor/plugins/active_scaffold/CHANGELOG +152 -0
  319. data/vendor/plugins/active_scaffold/MIT-LICENSE +20 -0
  320. data/vendor/plugins/active_scaffold/README +28 -0
  321. data/vendor/plugins/active_scaffold/Rakefile +24 -0
  322. data/vendor/plugins/active_scaffold/environment.rb +17 -0
  323. data/vendor/plugins/active_scaffold/frontends/default/images/add.gif +0 -0
  324. data/vendor/plugins/active_scaffold/frontends/default/images/arrow_down.gif +0 -0
  325. data/vendor/plugins/active_scaffold/frontends/default/images/arrow_up.gif +0 -0
  326. data/vendor/plugins/active_scaffold/frontends/default/images/close.gif +0 -0
  327. data/vendor/plugins/active_scaffold/frontends/default/images/cross.png +0 -0
  328. data/vendor/plugins/active_scaffold/frontends/default/images/indicator-small.gif +0 -0
  329. data/vendor/plugins/active_scaffold/frontends/default/images/indicator.gif +0 -0
  330. data/vendor/plugins/active_scaffold/frontends/default/images/magnifier.png +0 -0
  331. data/vendor/plugins/active_scaffold/frontends/default/javascripts/active_scaffold.js +430 -0
  332. data/vendor/plugins/active_scaffold/frontends/default/javascripts/dhtml_history.js +867 -0
  333. data/vendor/plugins/active_scaffold/frontends/default/javascripts/form_enhancements.js +114 -0
  334. data/vendor/plugins/active_scaffold/frontends/default/javascripts/rico_corner.js +370 -0
  335. data/vendor/plugins/active_scaffold/frontends/default/stylesheets/stylesheet-ie.css +35 -0
  336. data/vendor/plugins/active_scaffold/frontends/default/stylesheets/stylesheet.css +809 -0
  337. data/vendor/plugins/active_scaffold/frontends/default/views/_add_existing_form.html.erb +40 -0
  338. data/vendor/plugins/active_scaffold/frontends/default/views/_create_form.html.erb +49 -0
  339. data/vendor/plugins/active_scaffold/frontends/default/views/_create_form_on_list.html.erb +38 -0
  340. data/vendor/plugins/active_scaffold/frontends/default/views/_field_search.html.erb +45 -0
  341. data/vendor/plugins/active_scaffold/frontends/default/views/_form.html.erb +18 -0
  342. data/vendor/plugins/active_scaffold/frontends/default/views/_form_association.html.erb +20 -0
  343. data/vendor/plugins/active_scaffold/frontends/default/views/_form_association_footer.html.erb +42 -0
  344. data/vendor/plugins/active_scaffold/frontends/default/views/_form_association_header.html.erb +10 -0
  345. data/vendor/plugins/active_scaffold/frontends/default/views/_form_association_record.html.erb +27 -0
  346. data/vendor/plugins/active_scaffold/frontends/default/views/_form_attribute.html.erb +12 -0
  347. data/vendor/plugins/active_scaffold/frontends/default/views/_form_hidden_attribute.html.erb +1 -0
  348. data/vendor/plugins/active_scaffold/frontends/default/views/_form_messages.html.erb +5 -0
  349. data/vendor/plugins/active_scaffold/frontends/default/views/_horizontal_subform.html.erb +21 -0
  350. data/vendor/plugins/active_scaffold/frontends/default/views/_list.html.erb +37 -0
  351. data/vendor/plugins/active_scaffold/frontends/default/views/_list_actions.html.erb +13 -0
  352. data/vendor/plugins/active_scaffold/frontends/default/views/_list_calculations.html.erb +22 -0
  353. data/vendor/plugins/active_scaffold/frontends/default/views/_list_column_headings.html.erb +32 -0
  354. data/vendor/plugins/active_scaffold/frontends/default/views/_list_header.html.erb +14 -0
  355. data/vendor/plugins/active_scaffold/frontends/default/views/_list_inline_adapter.html.erb +9 -0
  356. data/vendor/plugins/active_scaffold/frontends/default/views/_list_pagination_links.html.erb +30 -0
  357. data/vendor/plugins/active_scaffold/frontends/default/views/_list_record.html.erb +35 -0
  358. data/vendor/plugins/active_scaffold/frontends/default/views/_live_search.html.erb +25 -0
  359. data/vendor/plugins/active_scaffold/frontends/default/views/_messages.html.erb +10 -0
  360. data/vendor/plugins/active_scaffold/frontends/default/views/_nested.html.erb +44 -0
  361. data/vendor/plugins/active_scaffold/frontends/default/views/_search.html.erb +21 -0
  362. data/vendor/plugins/active_scaffold/frontends/default/views/_show.html.erb +8 -0
  363. data/vendor/plugins/active_scaffold/frontends/default/views/_show_columns.html.erb +11 -0
  364. data/vendor/plugins/active_scaffold/frontends/default/views/_update_actions.html.erb +9 -0
  365. data/vendor/plugins/active_scaffold/frontends/default/views/_update_form.html.erb +53 -0
  366. data/vendor/plugins/active_scaffold/frontends/default/views/add_existing.js.rjs +16 -0
  367. data/vendor/plugins/active_scaffold/frontends/default/views/add_existing_form.html.erb +5 -0
  368. data/vendor/plugins/active_scaffold/frontends/default/views/create.html.erb +5 -0
  369. data/vendor/plugins/active_scaffold/frontends/default/views/delete.html.erb +13 -0
  370. data/vendor/plugins/active_scaffold/frontends/default/views/destroy.js.rjs +10 -0
  371. data/vendor/plugins/active_scaffold/frontends/default/views/edit_associated.js.rjs +15 -0
  372. data/vendor/plugins/active_scaffold/frontends/default/views/field_search.html.erb +5 -0
  373. data/vendor/plugins/active_scaffold/frontends/default/views/form_messages.js.rjs +1 -0
  374. data/vendor/plugins/active_scaffold/frontends/default/views/form_messages_on_create.js.rjs +2 -0
  375. data/vendor/plugins/active_scaffold/frontends/default/views/form_messages_on_update.js.rjs +2 -0
  376. data/vendor/plugins/active_scaffold/frontends/default/views/list.html.erb +44 -0
  377. data/vendor/plugins/active_scaffold/frontends/default/views/on_create.js.rjs +25 -0
  378. data/vendor/plugins/active_scaffold/frontends/default/views/on_update.js.rjs +11 -0
  379. data/vendor/plugins/active_scaffold/frontends/default/views/search.html.erb +5 -0
  380. data/vendor/plugins/active_scaffold/frontends/default/views/show.html.erb +5 -0
  381. data/vendor/plugins/active_scaffold/frontends/default/views/update.html.erb +8 -0
  382. data/vendor/plugins/active_scaffold/frontends/default/views/update_column.js.rjs +12 -0
  383. data/vendor/plugins/active_scaffold/init.rb +18 -0
  384. data/vendor/plugins/active_scaffold/install.rb +40 -0
  385. data/vendor/plugins/active_scaffold/install_assets.rb +36 -0
  386. data/vendor/plugins/active_scaffold/lib/active_record_permissions.rb +123 -0
  387. data/vendor/plugins/active_scaffold/lib/active_scaffold.rb +144 -0
  388. data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/core.rb +102 -0
  389. data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/create.rb +120 -0
  390. data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/delete.rb +46 -0
  391. data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/field_search.rb +46 -0
  392. data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/list.rb +77 -0
  393. data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/live_search.rb +46 -0
  394. data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/nested.rb +215 -0
  395. data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/search.rb +40 -0
  396. data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/show.rb +34 -0
  397. data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/subform.rb +17 -0
  398. data/vendor/plugins/active_scaffold/lib/active_scaffold/actions/update.rb +114 -0
  399. data/vendor/plugins/active_scaffold/lib/active_scaffold/attribute_params.rb +185 -0
  400. data/vendor/plugins/active_scaffold/lib/active_scaffold/config/base.rb +37 -0
  401. data/vendor/plugins/active_scaffold/lib/active_scaffold/config/core.rb +189 -0
  402. data/vendor/plugins/active_scaffold/lib/active_scaffold/config/create.rb +43 -0
  403. data/vendor/plugins/active_scaffold/lib/active_scaffold/config/delete.rb +25 -0
  404. data/vendor/plugins/active_scaffold/lib/active_scaffold/config/field_search.rb +53 -0
  405. data/vendor/plugins/active_scaffold/lib/active_scaffold/config/form.rb +49 -0
  406. data/vendor/plugins/active_scaffold/lib/active_scaffold/config/list.rb +134 -0
  407. data/vendor/plugins/active_scaffold/lib/active_scaffold/config/live_search.rb +52 -0
  408. data/vendor/plugins/active_scaffold/lib/active_scaffold/config/nested.rb +31 -0
  409. data/vendor/plugins/active_scaffold/lib/active_scaffold/config/search.rb +52 -0
  410. data/vendor/plugins/active_scaffold/lib/active_scaffold/config/show.rb +39 -0
  411. data/vendor/plugins/active_scaffold/lib/active_scaffold/config/subform.rb +33 -0
  412. data/vendor/plugins/active_scaffold/lib/active_scaffold/config/update.rb +32 -0
  413. data/vendor/plugins/active_scaffold/lib/active_scaffold/configurable.rb +29 -0
  414. data/vendor/plugins/active_scaffold/lib/active_scaffold/constraints.rb +178 -0
  415. data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/action_columns.rb +97 -0
  416. data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/action_link.rb +136 -0
  417. data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/action_links.rb +47 -0
  418. data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/actions.rb +45 -0
  419. data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/column.rb +297 -0
  420. data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/columns.rb +75 -0
  421. data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/error_message.rb +24 -0
  422. data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/set.rb +62 -0
  423. data/vendor/plugins/active_scaffold/lib/active_scaffold/data_structures/sorting.rb +89 -0
  424. data/vendor/plugins/active_scaffold/lib/active_scaffold/finder.rb +234 -0
  425. data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/association_helpers.rb +40 -0
  426. data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/controller_helpers.rb +25 -0
  427. data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/country_helpers.rb +348 -0
  428. data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/form_column_helpers.rb +267 -0
  429. data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/id_helpers.rb +125 -0
  430. data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/list_column_helpers.rb +178 -0
  431. data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/pagination_helpers.rb +37 -0
  432. data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/search_column_helpers.rb +172 -0
  433. data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/show_column_helpers.rb +46 -0
  434. data/vendor/plugins/active_scaffold/lib/active_scaffold/helpers/view_helpers.rb +196 -0
  435. data/vendor/plugins/active_scaffold/lib/active_scaffold/locale/en.rb +66 -0
  436. data/vendor/plugins/active_scaffold/lib/active_scaffold/locale/es.yml +64 -0
  437. data/vendor/plugins/active_scaffold/lib/active_scaffold/locale/hu.yml +62 -0
  438. data/vendor/plugins/active_scaffold/lib/bridges/bridge.rb +52 -0
  439. data/vendor/plugins/active_scaffold/lib/bridges/calendar_date_select/bridge.rb +11 -0
  440. data/vendor/plugins/active_scaffold/lib/bridges/calendar_date_select/lib/as_cds_bridge.rb +53 -0
  441. data/vendor/plugins/active_scaffold/lib/bridges/file_column/bridge.rb +12 -0
  442. data/vendor/plugins/active_scaffold/lib/bridges/file_column/lib/as_file_column_bridge.rb +49 -0
  443. data/vendor/plugins/active_scaffold/lib/bridges/file_column/lib/file_column_helpers.rb +51 -0
  444. data/vendor/plugins/active_scaffold/lib/bridges/file_column/lib/form_ui.rb +32 -0
  445. data/vendor/plugins/active_scaffold/lib/bridges/file_column/lib/list_ui.rb +26 -0
  446. data/vendor/plugins/active_scaffold/lib/bridges/file_column/test/functional/file_column_keep_test.rb +43 -0
  447. data/vendor/plugins/active_scaffold/lib/bridges/file_column/test/mock_model.rb +9 -0
  448. data/vendor/plugins/active_scaffold/lib/bridges/file_column/test/test_helper.rb +15 -0
  449. data/vendor/plugins/active_scaffold/lib/dhtml_confirm.rb +54 -0
  450. data/vendor/plugins/active_scaffold/lib/extensions/action_controller_rendering.rb +20 -0
  451. data/vendor/plugins/active_scaffold/lib/extensions/action_view_rendering.rb +87 -0
  452. data/vendor/plugins/active_scaffold/lib/extensions/array.rb +7 -0
  453. data/vendor/plugins/active_scaffold/lib/extensions/component_response_with_namespacing.rb +17 -0
  454. data/vendor/plugins/active_scaffold/lib/extensions/generic_view_paths.rb +33 -0
  455. data/vendor/plugins/active_scaffold/lib/extensions/localize.rb +10 -0
  456. data/vendor/plugins/active_scaffold/lib/extensions/name_option_for_datetime.rb +12 -0
  457. data/vendor/plugins/active_scaffold/lib/extensions/nil_id_in_url_params.rb +7 -0
  458. data/vendor/plugins/active_scaffold/lib/extensions/resources.rb +26 -0
  459. data/vendor/plugins/active_scaffold/lib/extensions/reverse_associations.rb +56 -0
  460. data/vendor/plugins/active_scaffold/lib/extensions/to_label.rb +8 -0
  461. data/vendor/plugins/active_scaffold/lib/extensions/unsaved_associated.rb +61 -0
  462. data/vendor/plugins/active_scaffold/lib/extensions/unsaved_record.rb +20 -0
  463. data/vendor/plugins/active_scaffold/lib/extensions/usa_state.rb +46 -0
  464. data/vendor/plugins/active_scaffold/lib/paginator.rb +136 -0
  465. data/vendor/plugins/active_scaffold/lib/responds_to_parent.rb +68 -0
  466. data/vendor/plugins/active_scaffold/public/blank.html +33 -0
  467. data/vendor/plugins/active_scaffold/test/bridges/bridge_test.rb +47 -0
  468. data/vendor/plugins/active_scaffold/test/config/create_test.rb +55 -0
  469. data/vendor/plugins/active_scaffold/test/config/list_test.rb +74 -0
  470. data/vendor/plugins/active_scaffold/test/config/update_test.rb +17 -0
  471. data/vendor/plugins/active_scaffold/test/const_mocker.rb +36 -0
  472. data/vendor/plugins/active_scaffold/test/data_structures/action_columns_test.rb +119 -0
  473. data/vendor/plugins/active_scaffold/test/data_structures/action_link_test.rb +78 -0
  474. data/vendor/plugins/active_scaffold/test/data_structures/action_links_test.rb +78 -0
  475. data/vendor/plugins/active_scaffold/test/data_structures/actions_test.rb +25 -0
  476. data/vendor/plugins/active_scaffold/test/data_structures/association_column_test.rb +41 -0
  477. data/vendor/plugins/active_scaffold/test/data_structures/column_test.rb +161 -0
  478. data/vendor/plugins/active_scaffold/test/data_structures/columns_test.rb +69 -0
  479. data/vendor/plugins/active_scaffold/test/data_structures/error_message_test.rb +28 -0
  480. data/vendor/plugins/active_scaffold/test/data_structures/set_test.rb +86 -0
  481. data/vendor/plugins/active_scaffold/test/data_structures/sorting_test.rb +96 -0
  482. data/vendor/plugins/active_scaffold/test/data_structures/standard_column_test.rb +34 -0
  483. data/vendor/plugins/active_scaffold/test/data_structures/virtual_column_test.rb +34 -0
  484. data/vendor/plugins/active_scaffold/test/extensions/active_record_test.rb +45 -0
  485. data/vendor/plugins/active_scaffold/test/extensions/array.rb +12 -0
  486. data/vendor/plugins/active_scaffold/test/misc/active_record_permissions.rb +154 -0
  487. data/vendor/plugins/active_scaffold/test/misc/configurable_test.rb +96 -0
  488. data/vendor/plugins/active_scaffold/test/misc/constraints_test.rb +175 -0
  489. data/vendor/plugins/active_scaffold/test/misc/finder_test.rb +70 -0
  490. data/vendor/plugins/active_scaffold/test/misc/lang_test.rb +12 -0
  491. data/vendor/plugins/active_scaffold/test/model_stub.rb +39 -0
  492. data/vendor/plugins/active_scaffold/test/run_all.rb +8 -0
  493. data/vendor/plugins/active_scaffold/test/test_helper.rb +13 -0
  494. data/vendor/plugins/active_scaffold/uninstall.rb +12 -0
  495. data/vendor/plugins/active_scaffold_as_gem/init.rb +21 -0
  496. data/vendor/plugins/active_scaffold_form_observation/init.rb +4 -0
  497. data/vendor/plugins/active_scaffold_form_observation/lib/active_scaffold_form_observation.rb +99 -0
  498. data/vendor/plugins/active_scaffold_full_refresh/init.rb +7 -0
  499. data/vendor/plugins/active_scaffold_full_refresh/lib/active_scaffold_full_refresh.rb +46 -0
  500. data/vendor/plugins/active_scaffold_move_column_under/init.rb +17 -0
  501. data/vendor/plugins/acts_as_money/README +24 -0
  502. data/vendor/plugins/acts_as_money/Rakefile +22 -0
  503. data/vendor/plugins/acts_as_money/init.rb +3 -0
  504. data/vendor/plugins/acts_as_money/install.rb +1 -0
  505. data/vendor/plugins/acts_as_money/lib/acts_as_money.rb +27 -0
  506. data/vendor/plugins/acts_as_money/tasks/money_tasks.rake +4 -0
  507. data/vendor/plugins/acts_as_money/test/money_test.rb +8 -0
  508. data/vendor/plugins/association_hacks/init.rb +1 -0
  509. data/vendor/plugins/association_hacks/lib/association_hacks.rb +27 -0
  510. data/vendor/plugins/railspdf/CHANGELOG +5 -0
  511. data/vendor/plugins/railspdf/README +88 -0
  512. data/vendor/plugins/railspdf/Rakefile +22 -0
  513. data/vendor/plugins/railspdf/TODO +1 -0
  514. data/vendor/plugins/railspdf/init.rb +3 -0
  515. data/vendor/plugins/railspdf/lib/railspdf.rb +65 -0
  516. data/vendor/plugins/railspdf/test/railspdf_test.rb +14 -0
  517. data/vendor/plugins/railspdf/test/test_helper.rb +9 -0
  518. data/vendor/plugins/render_component/README +37 -0
  519. data/vendor/plugins/render_component/Rakefile +22 -0
  520. data/vendor/plugins/render_component/init.rb +2 -0
  521. data/vendor/plugins/render_component/lib/components.rb +142 -0
  522. data/vendor/plugins/render_component/test/abstract_unit.rb +8 -0
  523. data/vendor/plugins/render_component/test/components_test.rb +140 -0
  524. metadata +657 -0
@@ -0,0 +1,14 @@
1
+ class CreateInvoicePayments < ActiveRecord::Migration
2
+ def self.up
3
+ create_table( :invoice_payments, :options => 'TYPE=InnoDB') do |t|
4
+ t.integer :payment_id, :invoice_id, :null => false
5
+ t.decimal :amount, :precision => 10, :scale => 2, :null => false
6
+ end
7
+
8
+ add_index :invoice_payments, [:payment_id, :invoice_id]
9
+ end
10
+
11
+ def self.down
12
+ drop_table :invoice_payments
13
+ end
14
+ end
@@ -0,0 +1,37 @@
1
+ class CreateActivityTypes < ActiveRecord::Migration
2
+ def self.up
3
+ create_table( :activity_types, :options => 'TYPE=InnoDB') do |t|
4
+ t.string :label
5
+
6
+ t.timestamps
7
+ end
8
+
9
+ # Create invoice_activity_types for habtm
10
+ create_table( :invoices_activity_types, :options => 'TYPE=InnoDB', :id => false ) do |t|
11
+ t.integer :invoice_id, :activity_type_id
12
+ end
13
+
14
+ add_index :invoices_activity_types, [:invoice_id, :activity_type_id]
15
+
16
+ activity_types = []
17
+
18
+ say_with_time "Populating initial activities ..." do
19
+ # Now create the initial entries:
20
+ activity_models_path = BRISKBILLS_ROOT+'/app/models/activity'
21
+
22
+ Find.find(activity_models_path) do |a|
23
+ activity_types << ActivityType.create( :label => $1.capitalize ) if /^#{activity_models_path}\/([^\/]+)\.rb$/.match a
24
+ end
25
+ end
26
+
27
+ # Adjust all the pre-existing invoices to reflect the new activity_types habtm the way they should
28
+ say_with_time "Associating existing invoices with activity types" do
29
+ Invoice.find(:all).each { |inv| activity_types.each{ |a| inv.activity_types << a } }
30
+ end
31
+ end
32
+
33
+ def self.down
34
+ drop_table :activity_types
35
+ drop_table :invoices_activity_types
36
+ end
37
+ end
@@ -0,0 +1,45 @@
1
+ class CreateSettings < ActiveRecord::Migration
2
+ def self.up
3
+ create_table( :settings, :options => 'TYPE=InnoDB') do |t|
4
+ t.string :keyname, :label
5
+ t.text :keyval, :description
6
+
7
+ t.timestamps
8
+ end
9
+
10
+ [
11
+ ['company_name', 'Company Name', 'The name of your business', 'ACME Widgets'],
12
+ ['company_url', 'Company URL', 'The address of your website', 'http://localhost'],
13
+ ['company_address1', 'Company Address 1', 'The address of your business, line 1', '1234 5th St.'],
14
+ ['company_address2', 'Company Address 2', 'The address of your business, line 2', 'Suite 100'],
15
+ ['company_city', 'Company City', 'The city your business resides in', 'New York'],
16
+ ['company_state', 'Company State', 'The state your business resides in', 'NY'],
17
+ ['company_zip', 'Company Zip', 'The zip code your business resides in', '55555'],
18
+ ['company_phone', 'Company Phone', 'The main phone line of your business', '555-555-5555'],
19
+ ['company_fax', 'Company Fax', 'The main fax line of your business', '555-555-5555'],
20
+ ['company_logo_file','Company Logo File', 'The filename of your company logo. This file should be a JPG, located in your public/images folder.', 'dti-logo.jpg'],
21
+
22
+ ['site_admin_email', 'Site Admin E-mail', 'An e-mail address to send system notifications to', 'root@localhost'],
23
+ ['site_admin_name', 'Site Admin Name', 'The person to send system notifications to', 'Root'],
24
+ ['bcc_invoices_to', 'Bcc Invoices To', 'A BCC line of recipients for invoices genration emails', 'root@localhost'],
25
+
26
+ ['slimtimer_dont_autoassign_tasks', 'SlimTimer Task Auto-assign Ignore', 'Don\'t automatically assign a client to any tasks that match this regular expression', '/^(walk in|web lead|dti)$/i'],
27
+ ['slimtimer_dont_autoassign_clients', 'SlimTimer Client Auto-assign Ignore', 'Don\'t automatically assign any clients whose company names match this regular expression', '/^DeRose Technologies, Inc\.$/i'],
28
+ ['slimtimer_sync_from_days_ago', 'SlimTimer Sync Tasks From', 'How many days prior, to keep in sync with the database', '30'],
29
+ ['slimtimer_ignore_tasks', 'SlimTimer Ignore Tasks', 'Ignore time entries with tasks that match this regular expression', '/^(in|out|lunch|Day Off|off)$/i']
30
+
31
+ ].each do |s|
32
+ Setting.create(
33
+ :keyname => (s.length > 0) ? s[0] : nil,
34
+ :label => (s.length > 1) ? s[1] : nil,
35
+ :description => (s.length > 2) ? s[2] : nil,
36
+ :keyval => (s.length > 3) ? s[3] : nil
37
+ )
38
+ end
39
+
40
+ end
41
+
42
+ def self.down
43
+ drop_table :settings
44
+ end
45
+ end
@@ -0,0 +1,11 @@
1
+ class IsActiveEmployeesClients < ActiveRecord::Migration
2
+ def self.up
3
+ [:clients, :employees].each do |table_name|
4
+ add_column table_name, :is_active, :boolean, :default => true, :null => false
5
+ end
6
+ end
7
+
8
+ def self.down
9
+ [:clients, :employees].each { |table_name| remove_column table_name, :is_active }
10
+ end
11
+ end
@@ -0,0 +1,78 @@
1
+ class CreateViewsAndIndexes < ActiveRecord::Migration
2
+
3
+ CREATE_INDEXES = {
4
+ :activities => [:invoice_id, :client_id],
5
+ :invoices => [:client_id],
6
+ :payments => [:client_id, :payment_method_id]
7
+ }
8
+
9
+ CREATE_VIEWS = [
10
+ ['clients_with_charges_sum',
11
+ 'SELECT
12
+ invoices.client_id,
13
+ SUM(activities.cost) AS charges_sum
14
+ FROM invoices
15
+ LEFT JOIN activities ON activities.invoice_id = invoices.id
16
+ GROUP BY invoices.client_id;'],
17
+
18
+ ['clients_with_payment_sum',
19
+ 'SELECT
20
+ payments.client_id,
21
+ SUM(payments.amount) AS payment_sum
22
+ FROM payments
23
+ GROUP BY payments.client_id;'],
24
+
25
+ ['clients_with_balances',
26
+ 'SELECT
27
+ clients.*,
28
+ IF(SUM(activities.cost) IS NULL, 0, SUM(activities.cost)) AS uninvoiced_activities_balance,
29
+ IF(clients_with_charges_sum.charges_sum IS NULL, 0,clients_with_charges_sum.charges_sum) AS charges_sum,
30
+ IF(clients_with_payment_sum.payment_sum IS NULL, 0,clients_with_payment_sum.payment_sum) AS payment_sum,
31
+ (
32
+ IF(clients_with_charges_sum.charges_sum IS NULL, 0,clients_with_charges_sum.charges_sum)-
33
+ IF(clients_with_payment_sum.payment_sum IS NULL, 0,clients_with_payment_sum.payment_sum)
34
+ ) AS balance
35
+ FROM clients
36
+ LEFT JOIN clients_with_charges_sum ON clients_with_charges_sum.client_id = clients.id
37
+ LEFT JOIN clients_with_payment_sum ON clients_with_payment_sum.client_id = clients.id
38
+ LEFT JOIN activities ON (activities.is_published = 1 AND activities.invoice_id IS NULL AND activities.client_id = clients.id)
39
+ GROUP BY clients.id
40
+ ORDER BY clients.company_name;'],
41
+
42
+ ['invoices_with_payments',
43
+ 'SELECT
44
+ invoices.id AS invoice_id,
45
+ IF(SUM(invoice_payments.amount) IS NULL, 0,SUM(invoice_payments.amount)) AS amount_paid
46
+ FROM invoices
47
+ LEFT JOIN invoice_payments ON invoice_payments.invoice_id = invoices.id
48
+ GROUP BY invoices.id'
49
+ ],
50
+
51
+ ['invoices_with_totals',
52
+ 'SELECT
53
+ invoices.id, invoices.client_id, invoices.comments, invoices.issued_on, invoices.is_published, invoices.created_at, invoices.updated_at,
54
+ IF(SUM(activities.cost) IS NULL, 0,SUM(activities.cost)) AS amount,
55
+ invoices_with_payments.amount_paid,
56
+ IF(IF(SUM(activities.cost) IS NULL, 0,SUM(activities.cost))-invoices_with_payments.amount_paid = 0, true,false) AS is_paid
57
+ FROM invoices
58
+ LEFT JOIN activities ON activities.invoice_id = invoices.id
59
+ LEFT JOIN invoices_with_payments ON invoices_with_payments.invoice_id = invoices.id
60
+ GROUP BY invoices.id;']
61
+ ]
62
+
63
+ def self.migrate_indexes_with(m)
64
+ CREATE_INDEXES.each_pair{|t,cols| cols.each{|c| self.send m, t, c }}
65
+ end
66
+
67
+ def self.up
68
+ migrate_indexes_with :add_index
69
+
70
+ CREATE_VIEWS.each { |view_def| execute( 'CREATE OR REPLACE VIEW %s AS %s' % [view_def[0], view_def[1]] ) }
71
+ end
72
+
73
+ def self.down
74
+ migrate_indexes_with :remove_index
75
+
76
+ CREATE_VIEWS.reverse.each{|view_def| execute "DROP VIEW IF EXISTS #{view_def[0]};" }
77
+ end
78
+ end
@@ -0,0 +1,32 @@
1
+ class CreateClientFinancialTransactions < ActiveRecord::Migration
2
+
3
+ CREATE_VIEWS = [
4
+ ['client_finance_transactions_union',
5
+ "SELECT
6
+ CONCAT('invoice',invoices_with_totals.id) AS id,
7
+ client_id,
8
+ issued_on AS date,
9
+ CONCAT('Invoice ',invoices_with_totals.id) AS description,
10
+ amount*-1 AS amount
11
+ FROM invoices_with_totals
12
+ UNION
13
+ SELECT
14
+ CONCAT('payment',payments.id) AS id,
15
+ client_id,
16
+ paid_on AS date,
17
+ CONCAT('Payment - ',payment_methods.name, IF(payments.payment_method_identifier IS NULL,'',CONCAT(' ',payments.payment_method_identifier))) AS description,
18
+ amount
19
+ FROM payments
20
+ LEFT JOIN payment_methods ON payment_methods.id = payments.payment_method_id;"],
21
+
22
+ ['client_finance_transactions', 'SELECT * FROM client_finance_transactions_union ORDER BY date DESC;']
23
+ ]
24
+
25
+ def self.up
26
+ CREATE_VIEWS.each { |view_def| execute( 'CREATE OR REPLACE VIEW %s AS %s' % [view_def[0], view_def[1]] ) }
27
+ end
28
+
29
+ def self.down
30
+ CREATE_VIEWS.reverse.each{|view_def| execute "DROP VIEW #{view_def[0]};" }
31
+ end
32
+ end
@@ -0,0 +1,133 @@
1
+ class CreateCredentialsMigrateRepresentatives < ActiveRecord::Migration
2
+
3
+ USER_TABLES = [:client_representatives, :employees]
4
+
5
+ def self.user_tables_find(find_args = {})
6
+ # To Keep it DRY down there ...
7
+ USER_TABLES.collect{ |t| t.to_s.classify.constantize.find(:all, find_args) }.flatten
8
+ end
9
+
10
+ def self.up
11
+
12
+ # Phase 1: Since we're here - habtm the client_representatives
13
+ say_with_time "Migrating Client Representatives" do
14
+ # Create the Representatives to clients habtm relationship
15
+ create_table( :client_representatives_clients, :options => 'TYPE=InnoDB', :id => false ) do |t|
16
+ t.integer :client_id, :client_representative_id
17
+ end
18
+
19
+ add_index :client_representatives_clients, :client_id
20
+ add_index :client_representatives_clients, :client_representative_id
21
+
22
+ # This is possibly a cheesy way to do it, but it'll work ok enough, I think:
23
+ clients_map = [] # Largely minimizes sql lookups
24
+ curr_cr = nil # keeps track of what we're working on
25
+
26
+ # Reassign the client_id to the habtm
27
+ ClientRepresentative.find(
28
+ :all,
29
+ :select => 'id, email_address, client_id',
30
+ :order => 'email_address'
31
+ ).each do |cr|
32
+
33
+ client_id = cr[:client_id]
34
+
35
+ if curr_cr.nil? or (curr_cr[:email_address] != cr[:email_address])
36
+ curr_cr = cr
37
+ else
38
+ ClientRepresentative.delete cr.id
39
+ end
40
+
41
+ clients_map[client_id] = Client.find client_id unless clients_map[client_id]
42
+
43
+ curr_cr.clients << clients_map[client_id] if clients_map[client_id] # Its possible this client doesn't exist
44
+ end
45
+
46
+ # Remove the :client_id column from the reps table
47
+ remove_column :client_representatives, :client_id
48
+ end
49
+
50
+ # Phase 2: Credentials themselves
51
+
52
+ say_with_time "Migrating Credentials" do
53
+
54
+ # First we create the credentials table:
55
+ create_table( :credentials, :options => 'TYPE=InnoDB') do |t|
56
+ t.string :email_address, :password_hash
57
+
58
+ t.integer :failed_login_count, :null => false, :default => 0
59
+ t.timestamp :failed_login_at
60
+
61
+ t.boolean :login_enabled, :default => 0, :null => false
62
+
63
+ t.references :user, :polymorphic => true
64
+
65
+ t.timestamps
66
+ end
67
+
68
+ # Then we create 'disabled' credentials to the reps/employees ...
69
+ user_tables_find(:select => 'id, email_address').each do |u|
70
+ u.create_credential :email_address => u[:email_address], :login_enabled => 0
71
+ end
72
+
73
+ # Remove the :email column from the reps table
74
+ USER_TABLES.each{ |t| remove_column t, :email_address }
75
+ end
76
+
77
+ # Phase 3: Add some credential related settings while we're here:
78
+ Setting.create!(
79
+ :keyname => 'account_lockout_threshold',
80
+ :label => 'Account Lockout Threshold',
81
+ :description => 'Number of incorrect logins before an account is locked out',
82
+ :keyval => '3'
83
+ )
84
+
85
+ Setting.create!(
86
+ :keyname => 'account_lockout_duration',
87
+ :label => 'Account Lockout Duration',
88
+ :description => 'Number of seconds for an account to be locked out, after the lockout threshold has been reached',
89
+ :keyval => '900'
90
+ )
91
+ end
92
+
93
+ def self.down
94
+
95
+ # Phase 2:
96
+ say_with_time "Downgrading Credentials" do
97
+ USER_TABLES.each{ |t| add_column t, :email_address, :string }
98
+
99
+ ClientRepresentative.reset_column_information
100
+ Employee.reset_column_information
101
+
102
+ user_tables_find(:select => 'id, email_address, credential.*', :include => [:credential]).each do |u|
103
+ u[:email_address] = u.credential.email_address and u.save! if u.credential
104
+ end
105
+
106
+ end
107
+
108
+ # Phase 1:
109
+ say_with_time "Downgrading Client Representatives" do
110
+ add_column :client_representatives, :client_id, :integer
111
+
112
+ ClientRepresentative.reset_column_information
113
+
114
+ ClientRepresentative.find(:all, :include => :clients).each do |cr|
115
+ cr[:client_id] = cr.client_ids[0]
116
+ cr.save!
117
+ end
118
+ end
119
+
120
+ # Now we remove our settings
121
+ say_with_time "Removing Credential Settings" do
122
+ Setting.find(
123
+ :all,
124
+ :conditions => { :keyname => %w(account_lockout_threshold account_lockout_duration) }
125
+ ).each{|s| s.destroy }
126
+ end
127
+
128
+ drop_table :credentials
129
+
130
+ drop_table :client_representatives_clients
131
+
132
+ end
133
+ end
@@ -0,0 +1,91 @@
1
+ require "#{BRISKBILLS_ROOT}/db/migrate/021_create_views_and_indexes"
2
+
3
+ class UpdatesForSalesTax < ActiveRecord::Migration
4
+
5
+ CREATE_VIEWS = [
6
+ ['clients_with_charges_sum',
7
+ 'SELECT
8
+ invoices.client_id,
9
+ SUM(IF(activities.cost IS NULL, 0,activities.cost)+IF(activities.tax IS NULL, 0, activities.tax)) AS charges_sum
10
+ FROM invoices
11
+ LEFT JOIN activities ON activities.invoice_id = invoices.id
12
+ GROUP BY invoices.client_id;'],
13
+
14
+ ['clients_with_balances',
15
+ 'SELECT
16
+ clients.*,
17
+ SUM(IF(activities.cost IS NULL, 0,activities.cost)+IF(activities.tax IS NULL, 0, activities.tax)) AS uninvoiced_activities_balance,
18
+ clients_with_charges_sum.charges_sum,
19
+ IF(clients_with_payment_sum.payment_sum IS NULL, 0,clients_with_payment_sum.payment_sum) AS payment_sum,
20
+ (
21
+ clients_with_charges_sum.charges_sum -
22
+ IF(clients_with_payment_sum.payment_sum IS NULL, 0,clients_with_payment_sum.payment_sum)
23
+ ) AS balance
24
+ FROM clients
25
+ LEFT JOIN clients_with_charges_sum ON clients_with_charges_sum.client_id = clients.id
26
+ LEFT JOIN clients_with_payment_sum ON clients_with_payment_sum.client_id = clients.id
27
+ LEFT JOIN activities ON (activities.is_published = 1 AND activities.invoice_id IS NULL AND activities.client_id = clients.id)
28
+ GROUP BY clients.id
29
+ ORDER BY clients.company_name;'],
30
+
31
+ ['invoices_with_totals',
32
+ 'SELECT
33
+ invoices.id, invoices.client_id, invoices.comments, invoices.issued_on, invoices.is_published, invoices.created_at, invoices.updated_at,
34
+ SUM(IF(activities.cost IS NULL, 0,activities.cost)+IF(activities.tax IS NULL, 0, activities.tax)) AS amount,
35
+ invoices_with_payments.amount_paid,
36
+ IF(SUM(IF(activities.cost IS NULL, 0,activities.cost)+IF(activities.tax IS NULL, 0, activities.tax))-invoices_with_payments.amount_paid = 0, true,false) AS is_paid
37
+ FROM invoices
38
+ LEFT JOIN activities ON activities.invoice_id = invoices.id
39
+ LEFT JOIN invoices_with_payments ON invoices_with_payments.invoice_id = invoices.id
40
+ GROUP BY invoices.id;']
41
+ ]
42
+
43
+ def self.replace_views(views)
44
+ views.each { |vd| execute( 'CREATE OR REPLACE VIEW %s AS %s' % [vd[0], vd[1]] ) }
45
+ end
46
+
47
+ def self.up
48
+ add_column :activities, :tax, :decimal, :precision => 10, :scale => 2, :default => nil, :null => true
49
+
50
+ say_with_time "Updating Views" do
51
+ replace_views CREATE_VIEWS
52
+ end
53
+
54
+ say_with_time "Creating Tax Settings" do
55
+ Setting.create!(
56
+ :keyname => 'sales_tax_percent',
57
+ :label => 'Sales Tax %',
58
+ :description => 'Sales Tax Percentage. The added tax percentage against the item price.',
59
+ :keyval => '6'
60
+ )
61
+
62
+ Setting.create!(
63
+ :keyname => 'sales_tax_flat',
64
+ :label => 'Sales Flat (flat)',
65
+ :description => 'A flat tax amount added to the item price, independant of the actual cost.',
66
+ :keyval => '0'
67
+ )
68
+ end
69
+
70
+ end
71
+
72
+
73
+ def self.down
74
+
75
+ say_with_time "Updating Views" do
76
+ updated_view_names = CREATE_VIEWS.collect{|v| v[0]}
77
+
78
+ replace_views ::CreateViewsAndIndexes::CREATE_VIEWS.select{|v| true if updated_view_names.include? v[0] }.reverse
79
+ end
80
+
81
+ remove_column :activities, :tax
82
+
83
+ say_with_time "Removing Tax Settings" do
84
+ Setting.find(
85
+ :all,
86
+ :conditions => { :keyname => %w(sales_tax_percent sales_tax_flat) }
87
+ ).each{|s| s.destroy }
88
+ end
89
+
90
+ end
91
+ end