xrono 1.0.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 (520) hide show
  1. data/.gitignore +19 -0
  2. data/.rspec +1 -0
  3. data/.travis.yml +20 -0
  4. data/Gemfile +30 -0
  5. data/Gemfile.lock +336 -0
  6. data/LICENSE +21 -0
  7. data/README.md +64 -0
  8. data/RELEASE_NOTES.md +83 -0
  9. data/Rakefile +15 -0
  10. data/XRONO.md +64 -0
  11. data/app/assets/images/chosen-sprite.png +0 -0
  12. data/app/assets/images/grid.png +0 -0
  13. data/app/assets/images/isotope_logo.png +0 -0
  14. data/app/assets/images/logo.png +0 -0
  15. data/app/assets/images/logo_122x40.png +0 -0
  16. data/app/assets/images/logo_97x40.png +0 -0
  17. data/app/assets/images/main_bg.jpg +0 -0
  18. data/app/assets/images/nav_bg.jpg +0 -0
  19. data/app/assets/images/rails.png +0 -0
  20. data/app/assets/images/top_bg.jpg +0 -0
  21. data/app/assets/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  22. data/app/assets/images/ui-bg_flat_0_fbf9ee_40x100.png +0 -0
  23. data/app/assets/images/ui-bg_flat_55_fbec88_40x100.png +0 -0
  24. data/app/assets/images/ui-bg_flat_65_ffffff_40x100.png +0 -0
  25. data/app/assets/images/ui-bg_flat_75_cccccc_40x100.png +0 -0
  26. data/app/assets/images/ui-bg_flat_75_dadada_40x100.png +0 -0
  27. data/app/assets/images/ui-bg_flat_75_e6e6e6_40x100.png +0 -0
  28. data/app/assets/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  29. data/app/assets/images/ui-bg_flat_95_fef1ec_40x100.png +0 -0
  30. data/app/assets/images/ui-bg_glass_75_d0e5f5_1x400.png +0 -0
  31. data/app/assets/images/ui-bg_glass_85_dfeffc_1x400.png +0 -0
  32. data/app/assets/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  33. data/app/assets/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png +0 -0
  34. data/app/assets/images/ui-bg_inset-hard_100_f5f8f9_1x100.png +0 -0
  35. data/app/assets/images/ui-bg_inset-hard_100_fcfdfd_1x100.png +0 -0
  36. data/app/assets/images/ui-icons_217bc0_256x240.png +0 -0
  37. data/app/assets/images/ui-icons_222222_256x240.png +0 -0
  38. data/app/assets/images/ui-icons_2e83ff_256x240.png +0 -0
  39. data/app/assets/images/ui-icons_454545_256x240.png +0 -0
  40. data/app/assets/images/ui-icons_469bdd_256x240.png +0 -0
  41. data/app/assets/images/ui-icons_6da8d5_256x240.png +0 -0
  42. data/app/assets/images/ui-icons_888888_256x240.png +0 -0
  43. data/app/assets/images/ui-icons_cd0a0a_256x240.png +0 -0
  44. data/app/assets/images/ui-icons_d8e7f3_256x240.png +0 -0
  45. data/app/assets/images/ui-icons_f9bd01_256x240.png +0 -0
  46. data/app/assets/javascripts/add_taxonomy.js.erb +307 -0
  47. data/app/assets/javascripts/admin_invoices.js +15 -0
  48. data/app/assets/javascripts/api/v1/clients.js.coffee +3 -0
  49. data/app/assets/javascripts/api/v1/tokens.js.coffee +3 -0
  50. data/app/assets/javascripts/application.js.erb +25 -0
  51. data/app/assets/javascripts/bootstrap-dropdown.js +92 -0
  52. data/app/assets/javascripts/bootstrap-tabs.js +80 -0
  53. data/app/assets/javascripts/bootstrap.js.coffee +4 -0
  54. data/app/assets/javascripts/calendar.js +25 -0
  55. data/app/assets/javascripts/chosen.jquery.js +898 -0
  56. data/app/assets/javascripts/client_login/clients.js.coffee +3 -0
  57. data/app/assets/javascripts/client_login/reports.js.coffee +3 -0
  58. data/app/assets/javascripts/comments.js +16 -0
  59. data/app/assets/javascripts/css_browser_selector.js +8 -0
  60. data/app/assets/javascripts/dashboard.js +3 -0
  61. data/app/assets/javascripts/data_vaults.js.coffee +3 -0
  62. data/app/assets/javascripts/file_attachments.js +9 -0
  63. data/app/assets/javascripts/jquery-tagselector.js +50 -0
  64. data/app/assets/javascripts/jquery-ui-1.8.16.custom.min.js +791 -0
  65. data/app/assets/javascripts/jquery.jeditable.js +543 -0
  66. data/app/assets/javascripts/jquery_ujs.js +336 -0
  67. data/app/assets/javascripts/schedule_modal.js +25 -0
  68. data/app/assets/javascripts/specify_project.js +21 -0
  69. data/app/assets/javascripts/ticket_board.js +104 -0
  70. data/app/assets/stylesheets/_jquery-ui-1.8.16.custom.css +568 -0
  71. data/app/assets/stylesheets/application.css +7 -0
  72. data/app/assets/stylesheets/bootstrap_and_overrides.css.scss +41 -0
  73. data/app/assets/stylesheets/chosen.css +367 -0
  74. data/app/assets/stylesheets/client_login/clients.css.scss +3 -0
  75. data/app/assets/stylesheets/client_login/reports.css.scss +3 -0
  76. data/app/assets/stylesheets/data_vaults.css.scss +3 -0
  77. data/app/assets/stylesheets/jquery-tagselector.css +49 -0
  78. data/app/assets/stylesheets/responsive.scss +650 -0
  79. data/app/assets/stylesheets/screen.scss +303 -0
  80. data/app/controllers/admin/base_controller.rb +18 -0
  81. data/app/controllers/admin/invoices_controller.rb +42 -0
  82. data/app/controllers/admin/payroll_controller.rb +29 -0
  83. data/app/controllers/admin/site_settings_controller.rb +19 -0
  84. data/app/controllers/admin/unentered_time_report_controller.rb +26 -0
  85. data/app/controllers/admin/users_controller.rb +86 -0
  86. data/app/controllers/admin/weekly_time_report_controller.rb +11 -0
  87. data/app/controllers/api/base_controller.rb +14 -0
  88. data/app/controllers/api/v1/base_controller.rb +2 -0
  89. data/app/controllers/api/v1/clients_controller.rb +10 -0
  90. data/app/controllers/api/v1/credentials_controller.rb +10 -0
  91. data/app/controllers/api/v1/projects_controller.rb +27 -0
  92. data/app/controllers/api/v1/tickets_controller.rb +46 -0
  93. data/app/controllers/api/v1/tokens_controller.rb +30 -0
  94. data/app/controllers/api/v1/work_units_controller.rb +23 -0
  95. data/app/controllers/client_login/base_controller.rb +3 -0
  96. data/app/controllers/client_login/clients_controller.rb +35 -0
  97. data/app/controllers/client_login/contacts_controller.rb +53 -0
  98. data/app/controllers/client_login/projects_controller.rb +24 -0
  99. data/app/controllers/client_login/reports_controller.rb +23 -0
  100. data/app/controllers/client_login/tickets_controller.rb +41 -0
  101. data/app/controllers/client_login/work_units_controller.rb +11 -0
  102. data/app/controllers/clients_controller.rb +103 -0
  103. data/app/controllers/comments_controller.rb +75 -0
  104. data/app/controllers/contacts_controller.rb +54 -0
  105. data/app/controllers/dashboard/base_controller.rb +79 -0
  106. data/app/controllers/data_vaults_controller.rb +12 -0
  107. data/app/controllers/doorkeeper/application_controller.rb +33 -0
  108. data/app/controllers/file_attachments_controller.rb +60 -0
  109. data/app/controllers/projects_controller.rb +62 -0
  110. data/app/controllers/tickets_controller.rb +48 -0
  111. data/app/controllers/users_controller.rb +57 -0
  112. data/app/controllers/work_units_controller.rb +114 -0
  113. data/app/controllers/xrono/application_controller.rb +65 -0
  114. data/app/helpers/admin/unentered_time_report_helper.rb +9 -0
  115. data/app/helpers/admin_base_helper.rb +14 -0
  116. data/app/helpers/clients_helper.rb +5 -0
  117. data/app/helpers/dashboard_helper.rb +9 -0
  118. data/app/helpers/gravatar_helper.rb +5 -0
  119. data/app/helpers/refurl_helper.rb +9 -0
  120. data/app/helpers/xrono/application_helper.rb +54 -0
  121. data/app/mailers/notifier.rb +18 -0
  122. data/app/models/chart_data.rb +20 -0
  123. data/app/models/client.rb +98 -0
  124. data/app/models/comment.rb +8 -0
  125. data/app/models/contact.rb +10 -0
  126. data/app/models/data_vault.rb +6 -0
  127. data/app/models/file_attachment.rb +8 -0
  128. data/app/models/project.rb +76 -0
  129. data/app/models/role.rb +3 -0
  130. data/app/models/roles_user.rb +4 -0
  131. data/app/models/site_settings.rb +4 -0
  132. data/app/models/ticket.rb +85 -0
  133. data/app/models/user.rb +147 -0
  134. data/app/models/weekly_time_report.rb +26 -0
  135. data/app/models/work_unit.rb +99 -0
  136. data/app/models/work_unit/finders.rb +67 -0
  137. data/app/views/admin/_nav.html.haml +1 -0
  138. data/app/views/admin/base/index.html.haml +3 -0
  139. data/app/views/admin/base/reports.html.haml +3 -0
  140. data/app/views/admin/invoices/index.html.haml +19 -0
  141. data/app/views/admin/invoices/show.html.haml +57 -0
  142. data/app/views/admin/payroll/index.html.haml +18 -0
  143. data/app/views/admin/payroll/show.html.haml +56 -0
  144. data/app/views/admin/site_settings/edit.html.haml +32 -0
  145. data/app/views/admin/unentered_time_report/_week_navigation.html.haml +6 -0
  146. data/app/views/admin/unentered_time_report/show.html.haml +16 -0
  147. data/app/views/admin/users/_form.html.haml +48 -0
  148. data/app/views/admin/users/_locked_users.html.haml +31 -0
  149. data/app/views/admin/users/_users_table.html.haml +25 -0
  150. data/app/views/admin/users/edit.html.haml +1 -0
  151. data/app/views/admin/users/index.html.haml +14 -0
  152. data/app/views/admin/users/locked_clients.html.haml +13 -0
  153. data/app/views/admin/users/locked_users.html.haml +13 -0
  154. data/app/views/admin/users/new.html.haml +1 -0
  155. data/app/views/admin/users/projects.html.haml +25 -0
  156. data/app/views/admin/users/unlocked_clients.html.haml +13 -0
  157. data/app/views/admin/weekly_time_report/_week_pagination.html.haml +11 -0
  158. data/app/views/admin/weekly_time_report/show.html.haml +41 -0
  159. data/app/views/client_login/_work_unit_index.haml +16 -0
  160. data/app/views/client_login/base/index.html.haml +18 -0
  161. data/app/views/client_login/clients/show.html.haml +32 -0
  162. data/app/views/client_login/contacts/_form.html.haml +34 -0
  163. data/app/views/client_login/contacts/edit.html.haml +4 -0
  164. data/app/views/client_login/contacts/index.html.haml +30 -0
  165. data/app/views/client_login/contacts/new.html.haml +5 -0
  166. data/app/views/client_login/contacts/show.html.haml +26 -0
  167. data/app/views/client_login/projects/_tickets.html.haml +31 -0
  168. data/app/views/client_login/projects/show.html.haml +8 -0
  169. data/app/views/client_login/reports/index.html.haml +4 -0
  170. data/app/views/client_login/reports/work_units.html.haml +96 -0
  171. data/app/views/client_login/tickets/_form.html.haml +33 -0
  172. data/app/views/client_login/tickets/new.html.haml +1 -0
  173. data/app/views/client_login/tickets/show.html.haml +23 -0
  174. data/app/views/client_login/work_units/show.html.haml +18 -0
  175. data/app/views/clients/_breadcrumbs.html.haml +2 -0
  176. data/app/views/clients/_clients_table.html.haml +24 -0
  177. data/app/views/clients/_form.html.haml +34 -0
  178. data/app/views/clients/_projects.html.haml +31 -0
  179. data/app/views/clients/edit.html.haml +1 -0
  180. data/app/views/clients/inactive_clients.html.haml +9 -0
  181. data/app/views/clients/index.html.haml +8 -0
  182. data/app/views/clients/new.html.haml +1 -0
  183. data/app/views/clients/show.html.haml +34 -0
  184. data/app/views/clients/suspended_clients.html.haml +8 -0
  185. data/app/views/comments/_comment.html.haml +46 -0
  186. data/app/views/comments/_comment_form.haml +29 -0
  187. data/app/views/comments/_comments.html.haml +3 -0
  188. data/app/views/contacts/_form.html.haml +34 -0
  189. data/app/views/contacts/edit.html.haml +1 -0
  190. data/app/views/contacts/index.html.haml +23 -0
  191. data/app/views/contacts/new.html.haml +1 -0
  192. data/app/views/contacts/show.html.haml +26 -0
  193. data/app/views/dashboard/base/_two_week_time_report.html.haml +13 -0
  194. data/app/views/dashboard/base/_week_pagination.html.haml +10 -0
  195. data/app/views/dashboard/base/calendar.html.haml +1 -0
  196. data/app/views/dashboard/base/calendar.js.erb +3 -0
  197. data/app/views/dashboard/base/index.html.haml +18 -0
  198. data/app/views/devise/confirmations/new.html.haml +9 -0
  199. data/app/views/devise/mailer/confirmation_instructions.html.haml +4 -0
  200. data/app/views/devise/mailer/reset_password_instructions.html.haml +6 -0
  201. data/app/views/devise/mailer/unlock_instructions.html.haml +5 -0
  202. data/app/views/devise/passwords/edit.html.haml +17 -0
  203. data/app/views/devise/passwords/new.html.haml +12 -0
  204. data/app/views/devise/registrations/edit.html.haml +36 -0
  205. data/app/views/devise/registrations/new.html.haml +32 -0
  206. data/app/views/devise/sessions/new.html.haml +22 -0
  207. data/app/views/devise/shared/_links.haml +15 -0
  208. data/app/views/devise/unlocks/new.html.haml +9 -0
  209. data/app/views/file_attachments/_file_attachment.html.haml +10 -0
  210. data/app/views/file_attachments/_file_attachment_combined.html.haml +30 -0
  211. data/app/views/file_attachments/_file_attachments.html.haml +5 -0
  212. data/app/views/file_attachments/new.html.haml +17 -0
  213. data/app/views/layouts/application.html.haml +32 -0
  214. data/app/views/layouts/doorkeeper.html.haml +31 -0
  215. data/app/views/notifier/daily.text.erb +8 -0
  216. data/app/views/notifier/work_unit_notification.text.erb +17 -0
  217. data/app/views/projects/_breadcrumbs.html.haml +5 -0
  218. data/app/views/projects/_form.html.haml +94 -0
  219. data/app/views/projects/_pie_chart_metrics.html.haml +4 -0
  220. data/app/views/projects/_specify.html.haml +11 -0
  221. data/app/views/projects/_ticket_table.html.haml +36 -0
  222. data/app/views/projects/edit.html.haml +2 -0
  223. data/app/views/projects/new.html.haml +2 -0
  224. data/app/views/projects/show.html.haml +57 -0
  225. data/app/views/shared/_calendar.html.haml +86 -0
  226. data/app/views/shared/_data_vault.html.haml +16 -0
  227. data/app/views/shared/_files_and_comments.html.haml +21 -0
  228. data/app/views/shared/_flashes.html.haml +10 -0
  229. data/app/views/shared/_javascripts.html.haml +8 -0
  230. data/app/views/shared/_menu.html.haml +14 -0
  231. data/app/views/shared/_user_roles.html.haml +7 -0
  232. data/app/views/shared/_work_unit_index.html.haml +24 -0
  233. data/app/views/tickets/_add_ticket.html.haml +27 -0
  234. data/app/views/tickets/_breadcrumbs.html.haml +8 -0
  235. data/app/views/tickets/_form.html.haml +40 -0
  236. data/app/views/tickets/_ticket_detail.html.haml +18 -0
  237. data/app/views/tickets/edit.html.haml +2 -0
  238. data/app/views/tickets/modal_new.html.haml +28 -0
  239. data/app/views/tickets/new.html.haml +1 -0
  240. data/app/views/tickets/show.html.haml +28 -0
  241. data/app/views/tickets/ticket_detail.html.haml +18 -0
  242. data/app/views/users/_change_password_form.haml +13 -0
  243. data/app/views/users/_user_head.html.haml +7 -0
  244. data/app/views/users/edit.haml +34 -0
  245. data/app/views/users/historical_time.html.haml +5 -0
  246. data/app/views/users/index.html.haml +18 -0
  247. data/app/views/users/show.html.haml +13 -0
  248. data/app/views/work_units/_add_work_unit.html.haml +81 -0
  249. data/app/views/work_units/_breadcrumbs.html.haml +11 -0
  250. data/app/views/work_units/_dashboard_line.html.haml +6 -0
  251. data/app/views/work_units/_edit_work_unit.haml +44 -0
  252. data/app/views/work_units/_shared_form.haml +40 -0
  253. data/app/views/work_units/edit.html.haml +2 -0
  254. data/app/views/work_units/index.html.haml +7 -0
  255. data/app/views/work_units/new.html.haml +6 -0
  256. data/app/views/work_units/show.html.haml +25 -0
  257. data/app/workers/daily_notifier_worker.rb +7 -0
  258. data/app/workers/work_unit_notifier_worker.rb +7 -0
  259. data/config.ru +7 -0
  260. data/config/admin_navigation.rb +71 -0
  261. data/config/admin_reports_navigation.rb +6 -0
  262. data/config/boot.rb +6 -0
  263. data/config/client_navigation.rb +64 -0
  264. data/config/cucumber.yml +8 -0
  265. data/config/initializers/00_requirements.rb +2 -0
  266. data/config/initializers/backtrace_silencers.rb +7 -0
  267. data/config/initializers/devise.rb +144 -0
  268. data/config/initializers/doorkeeper.rb +32 -0
  269. data/config/initializers/doorkeeper_monkeypatch.rb +66 -0
  270. data/config/initializers/github_concern.rb +4 -0
  271. data/config/initializers/haml.rb +13 -0
  272. data/config/initializers/inflections.rb +10 -0
  273. data/config/initializers/load_controller_mixins.rb +1 -0
  274. data/config/initializers/mime_types.rb +5 -0
  275. data/config/initializers/paper_clip.rb +1 -0
  276. data/config/initializers/simple_navigation.rb +1 -0
  277. data/config/initializers/wrap_parameters.rb +14 -0
  278. data/config/locales/devise.en.yml +39 -0
  279. data/config/locales/doorkeeper.en.yml +23 -0
  280. data/config/locales/en.yml +201 -0
  281. data/config/locales/faker.en.yml +48 -0
  282. data/config/navigation.rb +78 -0
  283. data/config/rackspace_cloudfiles.yml +14 -0
  284. data/config/routes.rb +113 -0
  285. data/config/secondary_navigation.rb +65 -0
  286. data/config/trinidad.yml +4 -0
  287. data/config/warble.rb +144 -0
  288. data/db/migrate/20100825165612_create_clients.rb +14 -0
  289. data/db/migrate/20100825185313_create_projects.rb +14 -0
  290. data/db/migrate/20100825223943_create_tickets.rb +16 -0
  291. data/db/migrate/20100902174920_create_work_units.rb +14 -0
  292. data/db/migrate/20100902190129_add_missing_fields_to_work_units.rb +13 -0
  293. data/db/migrate/20100904173839_add_guid_to_clients_projects_tickets_and_work_orders.rb +13 -0
  294. data/db/migrate/20100922181642_create_comments.rb +19 -0
  295. data/db/migrate/20100927180254_devise_create_users.rb +32 -0
  296. data/db/migrate/20100927184505_add_details_to_users.rb +13 -0
  297. data/db/migrate/20100927191329_add_user_to_work_units.rb +9 -0
  298. data/db/migrate/20100928163356_create_roles.rb +22 -0
  299. data/db/migrate/20100928203745_create_addresses.rb +19 -0
  300. data/db/migrate/20100928204544_create_contacts.rb +17 -0
  301. data/db/migrate/20101007175626_add_lockable_to_users.rb +11 -0
  302. data/db/migrate/20101020162216_add_paid_at_to_work_units_table.rb +9 -0
  303. data/db/migrate/20101020162516_add_check_number_to_work_units_table.rb +9 -0
  304. data/db/migrate/20101020215135_add_paid_field_to_work_units_table.rb +9 -0
  305. data/db/migrate/20101020215226_add_invoiced_field_to_work_units_table.rb +9 -0
  306. data/db/migrate/20101020215457_remove_paid_at_from_work_units_table.rb +9 -0
  307. data/db/migrate/20101020215624_remove_check_number_from_work_units_table.rb +9 -0
  308. data/db/migrate/20101025161443_add_invoiced_at_to_work_units_table.rb +9 -0
  309. data/db/migrate/20101026151900_add_initials_to_clients.rb +9 -0
  310. data/db/migrate/20101029145059_create_file_attachments.rb +18 -0
  311. data/db/migrate/20101030142615_add_guid_to_users.rb +9 -0
  312. data/db/migrate/20101102145137_add_paid_at_to_work_units.rb +9 -0
  313. data/db/migrate/20101112151337_add_active_to_comments.rb +9 -0
  314. data/db/migrate/20101119172727_add_recieves_email_to_contact.rb +10 -0
  315. data/db/migrate/20101122225423_projects_users.rb +11 -0
  316. data/db/migrate/20101129214537_remove_projects_users_table.rb +11 -0
  317. data/db/migrate/20101130225328_contact_receives_email.rb +9 -0
  318. data/db/migrate/20101202203051_add_address_to_contacts.rb +19 -0
  319. data/db/migrate/20101202214746_remove_address_table.rb +17 -0
  320. data/db/migrate/20101216214304_add_hours_type_to_work_unit.rb +9 -0
  321. data/db/migrate/20101217152455_add_effective_hours_to_work_units.rb +9 -0
  322. data/db/migrate/20101228154820_add_overtime_multiplier_to_clients_table.rb +9 -0
  323. data/db/migrate/20101228154951_add_overtime_multiplier_to_projects_table.rb +9 -0
  324. data/db/migrate/20101228155122_create_site_settings_table.rb +11 -0
  325. data/db/migrate/20110107190927_add_site_logo_columns_to_site_settings.rb +15 -0
  326. data/db/migrate/20110111155513_add_total_yearly_pto_per_user_to_site_settings.rb +9 -0
  327. data/db/migrate/20110111220015_add_not_valid_to_file_attachment.rb +9 -0
  328. data/db/migrate/20110125153818_add_fullwidth_to_users.rb +9 -0
  329. data/db/migrate/20110222162404_add_daily_target_hours_to_users.rb +9 -0
  330. data/db/migrate/20110310021732_add_client_to_site_settings.rb +9 -0
  331. data/db/migrate/20110630194044_add_expanded_calendar_to_user.rb +9 -0
  332. data/db/migrate/20110922175742_add_state_to_tickets.rb +9 -0
  333. data/db/migrate/20111212193345_add_estimated_hours_to_tickets.rb +5 -0
  334. data/db/migrate/20111216152557_add_client_boolean_to_user.rb +5 -0
  335. data/db/migrate/20111220193307_add_repo_and_branch_to_projects_and_ticket.rb +6 -0
  336. data/db/migrate/20111220193619_create_git_pushes.rb +9 -0
  337. data/db/migrate/20111220193620_create_git_commits.rb +10 -0
  338. data/db/migrate/20111220193621_add_user_id_to_git_push.rb +5 -0
  339. data/db/migrate/20111220193622_create_github_concernable_git_pushes.rb +11 -0
  340. data/db/migrate/20111227140859_add_token_to_user.rb +7 -0
  341. data/db/migrate/20120102185406_add_completed_boolean_to_ticket.rb +5 -0
  342. data/db/migrate/20120104132121_add_completed_to_project.rb +5 -0
  343. data/db/migrate/20120124184915_modify_project_for_new_git_integration.rb +11 -0
  344. data/db/migrate/20120125145833_add_rates_to_project.rb +6 -0
  345. data/db/migrate/20120126151009_create_data_vaults.rb +11 -0
  346. data/db/migrate/20120126151341_create_versions.rb +18 -0
  347. data/db/migrate/20120126154403_rename_column_data_to_encrypted_data.rb +8 -0
  348. data/db/migrate/20120221193022_add_index_to_user_id_on_work_units.rb +5 -0
  349. data/db/migrate/20120221195345_acts_as_taggable_on_migration.rb +30 -0
  350. data/db/migrate/20120320212313_remove_timestamps_from_roles_users_table.rb +11 -0
  351. data/db/migrate/20120710034831_create_doorkeeper_tables.rb +42 -0
  352. data/db/migrate/20121021122002_add_missing_indices.rb +21 -0
  353. data/doc/website/favicon.ico +0 -0
  354. data/doc/website/images/clock_box.png +0 -0
  355. data/doc/website/images/demo.png +0 -0
  356. data/doc/website/images/download.png +0 -0
  357. data/doc/website/images/fork_me.png +0 -0
  358. data/doc/website/images/lightbox-blank.gif +0 -0
  359. data/doc/website/images/lightbox-btn-close.gif +0 -0
  360. data/doc/website/images/lightbox-btn-next.gif +0 -0
  361. data/doc/website/images/lightbox-btn-prev.gif +0 -0
  362. data/doc/website/images/lightbox-ico-loading.gif +0 -0
  363. data/doc/website/images/main_bg.png +0 -0
  364. data/doc/website/images/nav_bg.png +0 -0
  365. data/doc/website/images/screen_1.png +0 -0
  366. data/doc/website/images/screen_2.png +0 -0
  367. data/doc/website/images/screen_3.png +0 -0
  368. data/doc/website/images/screen_4.png +0 -0
  369. data/doc/website/images/screen_5.png +0 -0
  370. data/doc/website/images/screen_6.png +0 -0
  371. data/doc/website/images/support.png +0 -0
  372. data/doc/website/images/thumb_1.png +0 -0
  373. data/doc/website/images/thumb_2.png +0 -0
  374. data/doc/website/images/thumb_3.png +0 -0
  375. data/doc/website/images/thumb_4.png +0 -0
  376. data/doc/website/images/thumb_5.png +0 -0
  377. data/doc/website/images/thumb_6.png +0 -0
  378. data/doc/website/images/xrono_logo.png +0 -0
  379. data/doc/website/index.html +274 -0
  380. data/doc/website/javascripts/application.js +18 -0
  381. data/doc/website/javascripts/greyscalebasic_regular.typeface.js +1 -0
  382. data/doc/website/javascripts/jquery.lightbox-0.5.min.js +42 -0
  383. data/doc/website/javascripts/jquery.min.js +32 -0
  384. data/doc/website/javascripts/jquery.tweet.js +181 -0
  385. data/doc/website/javascripts/typeface.js +873 -0
  386. data/doc/website/javascripts/verdana_regular.typeface.js +1 -0
  387. data/doc/website/stylesheets/jquery.lightbox.css +104 -0
  388. data/doc/website/stylesheets/jquery.tweet.css +38 -0
  389. data/doc/website/stylesheets/reset-fonts-grids.css +32 -0
  390. data/doc/website/stylesheets/screen.css +228 -0
  391. data/doc/xrono_dash.png +0 -0
  392. data/doc/xrono_ticket.png +0 -0
  393. data/features/admin/invoices.feature +37 -0
  394. data/features/admin/manage_users.feature +17 -0
  395. data/features/admin/payroll.feature +64 -0
  396. data/features/admin/roles.feature +9 -0
  397. data/features/admin/site_settings.feature +19 -0
  398. data/features/admin/unentered_time_report.feature +38 -0
  399. data/features/admin/weekly_time_report.feature +14 -0
  400. data/features/api/v1/clients_controller.feature +58 -0
  401. data/features/authorization-admin.feature +34 -0
  402. data/features/authorization-non-admin.feature +38 -0
  403. data/features/client_login.feature +15 -0
  404. data/features/collaborative_work_units.feature +112 -0
  405. data/features/daily_emails.feature +11 -0
  406. data/features/dashboard.feature +74 -0
  407. data/features/manage_clients.feature +116 -0
  408. data/features/manage_comments.feature +30 -0
  409. data/features/manage_contacts.feature +56 -0
  410. data/features/manage_file_attachments.feature +51 -0
  411. data/features/manage_projects.feature +92 -0
  412. data/features/manage_self.feature +48 -0
  413. data/features/manage_tickets.feature +74 -0
  414. data/features/manage_users.feature +76 -0
  415. data/features/manage_work_units.feature +115 -0
  416. data/features/mockups/images/asset-tracker-client-show.png +0 -0
  417. data/features/mockups/images/asset-tracker.png +0 -0
  418. data/features/mockups/images/ixi - asset tracker v3 homepage - no time entered modal.png +0 -0
  419. data/features/mockups/images/ixi - asset tracker v3 homepage - schedule on modal.png +0 -0
  420. data/features/mockups/images/ixi - asset tracker v3 homepage.png +0 -0
  421. data/features/mockups/ixi - asset tracker v3 homepage - no time entered modal.bmml +194 -0
  422. data/features/mockups/ixi - asset tracker v3 homepage - schedule on modal.bmml +208 -0
  423. data/features/mockups/ixi - asset tracker v3 homepage.bmml +172 -0
  424. data/features/project_assignment.feature +69 -0
  425. data/features/search_work_units.feature +38 -0
  426. data/features/step_definitions/calendar_expansion_steps.rb +7 -0
  427. data/features/step_definitions/client_login_steps.rb +8 -0
  428. data/features/step_definitions/client_steps.rb +29 -0
  429. data/features/step_definitions/comment_steps.rb +4 -0
  430. data/features/step_definitions/contact_steps.rb +22 -0
  431. data/features/step_definitions/debug_steps.rb +5 -0
  432. data/features/step_definitions/devise_steps.rb +26 -0
  433. data/features/step_definitions/email_steps.rb +74 -0
  434. data/features/step_definitions/file_attachment_steps.rb +8 -0
  435. data/features/step_definitions/modified_web_steps.rb +25 -0
  436. data/features/step_definitions/pickle_steps.rb +101 -0
  437. data/features/step_definitions/project_steps.rb +32 -0
  438. data/features/step_definitions/search_steps.rb +3 -0
  439. data/features/step_definitions/ticket_board_steps.rb +39 -0
  440. data/features/step_definitions/ticket_detail_steps.rb +9 -0
  441. data/features/step_definitions/ticket_steps.rb +12 -0
  442. data/features/step_definitions/unentered_time_report_steps.rb +3 -0
  443. data/features/step_definitions/user_steps.rb +43 -0
  444. data/features/step_definitions/web_steps.rb +274 -0
  445. data/features/step_definitions/weekly_time_report_steps.rb +7 -0
  446. data/features/step_definitions/work_unit_index_steps.rb +8 -0
  447. data/features/step_definitions/work_unit_steps.rb +39 -0
  448. data/features/support/email.rb +21 -0
  449. data/features/support/env.rb +80 -0
  450. data/features/support/paths.rb +96 -0
  451. data/features/support/pickle.rb +26 -0
  452. data/features/support/selectors.rb +51 -0
  453. data/features/support/xrono.rb +19 -0
  454. data/features/work_unit_notifier.feature +11 -0
  455. data/lib/controller_mixins.rb +5 -0
  456. data/lib/controller_mixins/authorization.rb +15 -0
  457. data/lib/controller_mixins/contacts.rb +37 -0
  458. data/lib/controller_mixins/generic.rb +15 -0
  459. data/lib/controller_mixins/tickets.rb +35 -0
  460. data/lib/controller_mixins/work_units.rb +13 -0
  461. data/lib/date_ext.rb +16 -0
  462. data/lib/guid_referenced.rb +19 -0
  463. data/lib/tasks/.gitkeep +0 -0
  464. data/lib/tasks/acts_as_commentable_tasks.rake +4 -0
  465. data/lib/tasks/cucumber.rake +65 -0
  466. data/lib/tasks/git_repo_tasks.rake +47 -0
  467. data/lib/tasks/notifications.rake +8 -0
  468. data/lib/tasks/paperclip_tasks.rake +79 -0
  469. data/lib/xrono.rb +1 -0
  470. data/lib/xrono/engine.rb +45 -0
  471. data/public/404.html +26 -0
  472. data/public/422.html +26 -0
  473. data/public/500.html +26 -0
  474. data/public/favicon.ico +0 -0
  475. data/public/favicon.psd +0 -0
  476. data/public/robots.txt +5 -0
  477. data/public/stylesheets/.gitkeep +0 -0
  478. data/public/stylesheets/ie.css +53 -0
  479. data/public/stylesheets/print.css +57 -0
  480. data/public/stylesheets/screen.css +182 -0
  481. data/script/cucumber +10 -0
  482. data/script/rails +6 -0
  483. data/spec/blueprints.rb +86 -0
  484. data/spec/controllers/api/v1/clients_controller_spec.rb +41 -0
  485. data/spec/controllers/api/v1/projects_controller_spec.rb +54 -0
  486. data/spec/controllers/api/v1/tickets_controller_spec.rb +122 -0
  487. data/spec/controllers/api/v1/tokens_controller_spec.rb +52 -0
  488. data/spec/controllers/client_login/clients_controller_spec.rb +5 -0
  489. data/spec/controllers/client_login/reports_controller_spec.rb +5 -0
  490. data/spec/controllers/data_vaults_controller_spec.rb +5 -0
  491. data/spec/internal/app/controllers/application_controller.rb +5 -0
  492. data/spec/internal/config/admin_navigation.rb +71 -0
  493. data/spec/internal/config/database.yml +14 -0
  494. data/spec/internal/config/database.yml.example +20 -0
  495. data/spec/internal/config/database.yml.mysql +20 -0
  496. data/spec/internal/config/database.yml.mysql.jruby +20 -0
  497. data/spec/internal/config/database.yml.postgres +20 -0
  498. data/spec/internal/config/database.yml.postgres.jruby +20 -0
  499. data/spec/internal/config/navigation.rb +80 -0
  500. data/spec/internal/config/routes.rb +3 -0
  501. data/spec/internal/config/secondary_navigation.rb +65 -0
  502. data/spec/internal/db/schema.rb +296 -0
  503. data/spec/internal/log/.gitignore +1 -0
  504. data/spec/internal/public/favicon.ico +0 -0
  505. data/spec/internal/public/system/attachment_files/2/original/tmp.txt +1 -0
  506. data/spec/internal/public/system/attachment_files/3/original/tmp.txt +1 -0
  507. data/spec/lib/date_ext_spec.rb +40 -0
  508. data/spec/mailers/notifier_spec.rb +9 -0
  509. data/spec/models/client_spec.rb +167 -0
  510. data/spec/models/contact_spec.rb +29 -0
  511. data/spec/models/data_vault_spec.rb +5 -0
  512. data/spec/models/project_spec.rb +115 -0
  513. data/spec/models/ticket_spec.rb +223 -0
  514. data/spec/models/user_spec.rb +258 -0
  515. data/spec/models/work_unit_spec.rb +467 -0
  516. data/spec/spec_helper.rb +44 -0
  517. data/spec/support/xrono/macros.rb +15 -0
  518. data/vendor/plugins/.gitkeep +0 -0
  519. data/xrono.gemspec +50 -0
  520. metadata +1209 -0
@@ -0,0 +1,17 @@
1
+ Feature: Manage users (admin)
2
+
3
+ Scenario: Lock a user
4
+ Given I am an authenticated user with an admin role
5
+ And a user exists with first_name: "Test", last_name: "Man", middle_initial: "T", email: "test@example.com", password: "secret", password_confirmation: "secret"
6
+ When I go to the admin user's edit page
7
+ And I check "user_locked"
8
+ And I press "Update"
9
+ Then I should see "Updated successfully"
10
+
11
+ Scenario: Unlock a user
12
+ Given I am an authenticated user with an admin role
13
+ And a user exists with first_name: "Test", last_name: "Man", middle_initial: "T", email: "test@example.com", password: "secret", password_confirmation: "secret", locked_at: "2010-01-01"
14
+ When I go to the admin user's edit page
15
+ And I uncheck "user_locked"
16
+ And I press "Update"
17
+ Then I should see "Updated successfully"
@@ -0,0 +1,64 @@
1
+ Feature: Payroll report
2
+ As an admin user
3
+ I should be able to list unpaid work units for employees
4
+
5
+ Scenario: List user with unpaid work unit
6
+ Given I am an authenticated user with an admin role
7
+ Given a user exist with first_name: "test", middle_initial: "t", last_name: "man", email: "testman@example.com", password: "123456", password_confirmation: "123456"
8
+ Given a client "Test Client" exist with name: "Test Client"
9
+ Given a project "Test Project" exist with name: "Test Project", client: client "Test Client"
10
+ Given a ticket "Test Ticket" exist with name: "Test Ticket", project: project "Test Project"
11
+ Given a work_unit exist with description: "Test Work Unit", ticket: ticket "Test Ticket", hours: 1, scheduled_at: "2010-10-01 00:00:00", created_at: "2010-10-01 00:00:00", user: user
12
+ When I go to the admin payroll index page
13
+ Then I should see a link with text "Test T Man"
14
+
15
+ Scenario: A user does not have any unpaid work units
16
+ Given I am an authenticated user with an admin role
17
+ Given a user exist with first_name: "clark", last_name: "kent", email: "clarkk@xrono.org", password: "123456", password_confirmation: "123456"
18
+ Given a client "Test Client" exist with name: "Test Client"
19
+ Given a project "Test Project" exist with name: "Test Project", client: client "Test Client"
20
+ Given a ticket "Test Ticket" exist with name: "Test Ticket", project: project "Test Project"
21
+ Given a work_unit exist with description: "Test Work Unit", ticket: ticket "Test Ticket", hours: 1, scheduled_at: "2010-10-01 00:00:00", created_at: "2010-10-01 00:00:00", paid_at: "2010-11-01 00:00:00", paid: "1234", user: user
22
+ When I go to the admin payroll index page
23
+ Then I should not see a link with text "kent, clark"
24
+
25
+ Scenario: Show user with unpaid work unit
26
+ Given I am an authenticated user with an admin role
27
+ Given a user exists
28
+ Given a work_unit exists with hours: 1, hours_type: "Normal", user: user
29
+ When I go to the admin payroll show page for the user
30
+ Then I should see "1.0" within "tfoot"
31
+
32
+ @javascript
33
+ Scenario: Update user with unpaid work unit
34
+ Given I am an authenticated user with an admin role
35
+ Given a user "Test Man" exist with first_name: "test", middle_initial: "z", last_name: "man", email: "testman@example.com", password: "123456", password_confirmation: "123456"
36
+ Given a client "Test Client" exist with name: "Test Client"
37
+ Given a project "Test Project" exist with name: "Test Project", client: client "Test Client"
38
+ Given a ticket "Test Ticket" exist with name: "Test Ticket", project: project "Test Project"
39
+ Given a work_unit exist with description: "Test Work Unit", ticket: ticket "Test Ticket", hours: 1, scheduled_at: "2010-10-01 00:00:00", created_at: "2010-10-01 00:00:00", user: user "Test Man"
40
+ When I go to the admin payroll show page for the user
41
+ And I fill in "autofill_all" with "123"
42
+ And I press "Submit"
43
+ Then I should see "All payroll is filled for user Test Z Man"
44
+
45
+
46
+ Scenario: Work units are scheduled in the future
47
+ Given I am an authenticated user with an admin role
48
+ Given a user "test" exist with first_name: "test", last_name: "man", email: "testman@example.com", password: "123456", password_confirmation: "123456"
49
+ Given a client "Test Client" exist with name: "Test Client"
50
+ Given a project "Test Project" exist with name: "Test Project", client: client "Test Client"
51
+ Given a ticket "Test Ticket" exist with name: "Test Ticket", project: project "Test Project"
52
+ Given a work_unit exist with description: "Test Work Unit", ticket: ticket "Test Ticket", hours: 1, scheduled_at: "3000-10-01 00:00:00", created_at: "2010-10-01 00:00:00", user: user
53
+ When I go to the admin payroll show page for the user
54
+ Then I should see "3000/10/01" within ".future"
55
+
56
+ Scenario: Work units hours add up to equal total
57
+ Given I am an authenticated user with an admin role
58
+ Given a user exists
59
+ Given a work unit exists with hours: 1, hours_type: "Normal", user: user
60
+ Given a work unit exists with hours: 1, hours_type: "Normal", user: user
61
+ Given a work unit exists with hours: 2, hours_type: "Overtime", user: user
62
+ When I go to the admin payroll show page for the user
63
+ Then I should see "Total For Pay Period: 5.0 Hours"
64
+
@@ -0,0 +1,9 @@
1
+ Feature: Roles
2
+
3
+ Scenario: Edit a user's roles
4
+ Given I am an authenticated user with an admin role
5
+ And a project exists
6
+ And a user exists
7
+ When I am on the admin user's projects page
8
+ And I press "Submit"
9
+ Then I should see "Roles have been updated successfully" within ".alert-message"
@@ -0,0 +1,19 @@
1
+ Feature: Site Settings
2
+
3
+ Scenario: Edit the site settings
4
+ Given site settings exist with overtime_multiplier: 1.5, total_yearly_pto_per_user: 40.00
5
+ And I am an authenticated user with an admin role
6
+ When I am on the edit admin site settings page
7
+ And I fill in "admin_site_settings_overtime_multiplier" with "2.00"
8
+ And I fill in "admin_site_settings_total_yearly_pto_per_user" with "41.00"
9
+ And I press "Update"
10
+ Then I should see "Site Settings updated successfully" within ".alert-message"
11
+ And the "admin_site_settings_overtime_multiplier" field should hold "2"
12
+ And the "admin_site_settings_total_yearly_pto_per_user" field should hold "41"
13
+
14
+ Scenario: Destroy site logo
15
+ Given site settings exist with overtime_multiplier: 1.5, total_yearly_pto_per_user: 40.00
16
+ And I am an authenticated user with an admin role
17
+ When I am on the edit admin site settings page
18
+ And I press "Remove site logo"
19
+ Then I should see "Site logo removed successfully" within ".alert-message"
@@ -0,0 +1,38 @@
1
+ @wip
2
+ Feature: Unentered Time Report
3
+ As an admin user
4
+ I should be able to list users who didn't enter time
5
+
6
+ Scenario: List users with unentered time
7
+ Given I am an authenticated user with an admin role
8
+ And a client "Test Client" exists with name: "Test Client"
9
+ And a project "Test Project" exists with name: "Test Project", client: client "Test Client"
10
+ And a ticket "Test Ticket" exists with name: "Test Ticket", project: project "Test Project"
11
+ And a work_unit exists with description: "Test Work Unit", ticket: ticket "Test Ticket", hours: 1, scheduled_at: "2010-10-01 00:00:00", created_at: "2010-10-01 00:00:00"
12
+ And a user exists with first_name: "Stan", last_name: "Lee", middle_initial: "M", email: "stanlee@example.com", password: "123456", password_confirmation: "123456"
13
+ And the user "stanlee@example.com" has a "developer" role on project: "Test Project"
14
+ When I go to path "/admin/unentered_time_report/2001-10-01"
15
+ Then I should see a link with text "Stan M Lee"
16
+
17
+
18
+ Scenario: List all hours entered by active users for the day
19
+ Given I am an authenticated user with an admin role
20
+ And a user exists with first_name: "Stan", last_name: "Lee", middle_initial: "M", email: "stanlee@example.com", password: "123456", password_confirmation: "123456"
21
+ And a client "Test Client" exists with name: "Test Client"
22
+ And a project "Test Project" exists with name: "Test Project", client: client "Test Client"
23
+ And user is assigned to the project
24
+ And a ticket "Test Ticket" exists with name: "Test Ticket", project: project "Test Project"
25
+ And a work_unit exists with description: "Test Work Unit", ticket: ticket "Test Ticket", hours: 1, scheduled_at: "2010-10-01 12:00:00", created_at: "2010-10-01 12:00:00", user: user
26
+ When I go to path "/admin/unentered_time_report/2010-10-01"
27
+ Then I should see "1.0 hours entered."
28
+
29
+
30
+ Scenario: Do not list user with unpaid work unit
31
+ Given I am an authenticated user with an admin role
32
+ And a user exists with first_name: "Stan", last_name: "Lee", middle_initial: "M", email: "stanlee@example.com", password: "123456", password_confirmation: "123456"
33
+ And a client "Test Client" exists with name: "Test Client"
34
+ And a project "Test Project" exists with name: "Test Project", client: client "Test Client"
35
+ And a ticket "Test Ticket" exists with name: "Test Ticket", project: project "Test Project"
36
+ And a work_unit exists with description: "Test Work Unit", ticket: ticket "Test Ticket", hours: 1, scheduled_at: "2010-10-01 12:00:00", created_at: "2010-10-01 12:00:00", user: user
37
+ When I go to path "/admin/unentered_time_report/2010-10-01"
38
+ Then I should not see a link with text "Stan M Lee" within "#Friday"
@@ -0,0 +1,14 @@
1
+ Feature: Weekly Time Report
2
+ As an admin user
3
+ I should be able to list users' calendars
4
+
5
+ Scenario: List users with time
6
+ Given I am an authenticated user with an admin role
7
+ And a user exists with first_name: "Stan", last_name: "Lee", middle_initial: "M", email: "stanlee@example.com", password: "123456", password_confirmation: "123456"
8
+ And the user "stanlee@example.com" has a "developer" role
9
+ And a client "Test Client" exists with name: "Test Client"
10
+ And a project "Test Project" exists with name: "Test Project", client: client "Test Client"
11
+ And a ticket "Test Ticket" exists with name: "Test Ticket", project: project "Test Project"
12
+ And a work_unit exists with description: "Test Work Unit", ticket: ticket "Test Ticket", hours: 1, scheduled_at: "2010-10-01 00:00:00", created_at: "2010-10-01 00:00:00"
13
+ When I go to path "/admin/weekly_time_report/2001-10-01"
14
+ Then I should see "Stan M Lee"
@@ -0,0 +1,58 @@
1
+ Feature: API - V1 - Client Management
2
+ As a user
3
+ I should be able to manage clients through an API
4
+
5
+ @wip
6
+ Scenario: List clients
7
+ Given I am an authenticated user
8
+ Given the following clients:
9
+ |name |status |guid|
10
+ |name 1|Active |1 |
11
+ |name 2|Inactive |2 |
12
+ |name 3|Suspended |3 |
13
+ |name 4|Active |4 |
14
+ When I go to path "/api/v1/clients.json":
15
+ Then I should see JSON:
16
+ """
17
+ [
18
+ {"client": {
19
+ "name": "name 1",
20
+ "status": "Active",
21
+ "guid": "1"
22
+ }},
23
+ {"client": {
24
+ "name": "name 2",
25
+ "status": "Inactive",
26
+ "guid": "2"
27
+ }},
28
+ {"client": {
29
+ "name": "name 3",
30
+ "status": "Suspended",
31
+ "guid": "3"
32
+ }},
33
+ {"client": {
34
+ "name": "name 4",
35
+ "status": "Active",
36
+ "guid": "4"
37
+ }}
38
+ ]
39
+ """
40
+
41
+ @wip
42
+ Scenario: Show client
43
+ Given I am an authenticated user
44
+ Given the following clients:
45
+ |name |status |guid|
46
+ |name 1|Active |1a |
47
+ |name 2|Inactive |2a |
48
+ |name 3|Suspended |3a |
49
+ |name 4|Active |4a |
50
+ When I go to path "/api/v1/clients/3a.json":
51
+ Then I should see JSON:
52
+ """
53
+ {"client": {
54
+ "name": "name 3",
55
+ "status": "Suspended",
56
+ "guid": "3a"
57
+ }}
58
+ """
@@ -0,0 +1,34 @@
1
+ Feature: Admin Authorization
2
+ As an admin
3
+ I should have role-specific priveleges
4
+
5
+ Scenario: List users (admin role)
6
+ Given I am an authenticated user with an admin role
7
+ Given the following user records:
8
+ | first_name | last_name | middle_initial | email | password | role |
9
+ | admin | mcadmin | a | admin@example.com | secret | admin |
10
+ When I go to the admin users page
11
+ Then I should see "Admin A Mcadmin"
12
+
13
+ Scenario: Create users (admin role)
14
+ Given I am an authenticated user with an admin role
15
+ Given I am on the admin user's new page
16
+ When I fill in "First name" with "name 1"
17
+ And I fill in "Last name" with "man"
18
+ And I fill in "Middle initial" with "m"
19
+ And I fill in "Email" with "name1@example.com"
20
+ And I fill in "Password" with "secretpass"
21
+ And I fill in "Password confirmation" with "secretpass"
22
+ And I press "Create"
23
+ Then I should see "Name 1 M Man"
24
+
25
+ Scenario: Edit a user
26
+ Given I am an authenticated user with an admin role
27
+ Given a user exists with first_name: "Test", last_name: "Man", middle_initial: "T", email: "test@example.com", password: "secret", password_confirmation: "secret"
28
+ When I go to the admin user's edit page
29
+ Then I should see "First name"
30
+ And I should see "Last name"
31
+ And I should see "Middle initial"
32
+ And I should see "Email"
33
+ And I should see "Password"
34
+ And I should see "Locked"
@@ -0,0 +1,38 @@
1
+ Feature: Non-admin Authorization
2
+ As a non-admin user
3
+ I should not have admin priveleges
4
+
5
+ Scenario: List all users (non-admin)
6
+ Given I am an authenticated user
7
+ When I go to the admin users page
8
+ Then I should be on the home page
9
+ And I should see "You must be an admin to do that." within ".alert-message"
10
+
11
+ Scenario: Create a new user (non-admin)
12
+ Given I am an authenticated user
13
+ When I go to the admin user's new page
14
+ Then I should be on the home page
15
+ And I should see "You must be an admin to do that." within ".alert-message"
16
+
17
+ Scenario: Edit a user (non-admin)
18
+ Given I am an authenticated user
19
+ Given a user exists with first_name: "Test", last_name: "Man", middle_initial: "T", email: "test@example.com", password: "secret", password_confirmation: "secret"
20
+ When I go to the admin user's edit page
21
+ Then I should be on the home page
22
+ And I should see "You must be an admin to do that." within ".alert-message"
23
+
24
+ Scenario: Change user password (non-admin)
25
+ Given I am an authenticated user with a client role
26
+ When I am on my edit profile page
27
+ And I fill in "Password" with "password"
28
+ And I fill in "Password Confirmation" with "password"
29
+ And I press "Change Password"
30
+ Then I should see "Successfully updated password" within ".alert-message"
31
+
32
+ Scenario: Change user password unsuccessfully (non-admin)
33
+ Given I am an authenticated user with a client role
34
+ When I am on my edit profile page
35
+ And I fill in "Password" with "password"
36
+ And I fill in "Password Confirmation" with "incorrect_password"
37
+ And I press "Change Password"
38
+ Then I should see "Error changing password" within ".alert-message"
@@ -0,0 +1,15 @@
1
+ Feature: Client Login
2
+ If a user has the client boolean set to true,
3
+ then they should have different login behaviour.
4
+
5
+ Scenario: Logging in with only one client
6
+ Given I am an authenticated user with a client role
7
+ And I only have 1 client
8
+ And I visit /
9
+ Then I should be on the clients client_login_client page
10
+
11
+ Scenario: Logging in with more than one client
12
+ Given I am an authenticated user with a client role
13
+ And I only have 2 client
14
+ And I visit /
15
+ Then I should be on the client_login_clients page
@@ -0,0 +1,112 @@
1
+ Feature: Ticket board
2
+ In order to add work units for clients/projects not currently assigned
3
+ Developer
4
+ wants a checkbox to populate client selector with all clients
5
+
6
+ @javascript
7
+ Scenario: Collaboration checkbox is displayed for developers
8
+ Given I am an authenticated user with a developer role
9
+ And I visit /
10
+ And I follow "close"
11
+ Then I should see "Show hidden clients and projects"
12
+
13
+ Scenario: Collaboration checkbox is not displayed for clients
14
+ Given I am an authenticated user with a client role
15
+ And I visit /
16
+ Then I should not see "Show hidden clients and projects"
17
+
18
+ Scenario: Only show clients with projects assigned to current users by default
19
+ Given I am an authenticated user with a developer role
20
+ Given a client "test client" exists with name: "test client"
21
+ And a project "test project" exists with name: "test project", client: client "test client"
22
+ And a ticket exists with project: project "test project", name: "test ticket"
23
+ And I am assigned to the project
24
+
25
+ And a client "test client1" exists with name: "test client1", initials: "TC1", status: "Active"
26
+ And a project exists with name: "test project1", client: client "test client1"
27
+ And I am assigned to the project
28
+
29
+ And a client "test client2" exists with name: "test client2", initials: "TC2", status: "Active"
30
+ And a project exists with name: "test project2", client: client "test client2"
31
+ And I visit /
32
+ Then I should not see "test client2" within "#work_unit_client_id"
33
+ Then I should see "test client1" within "#work_unit_client_id"
34
+
35
+ @javascript
36
+ Scenario: Clicking checkbox reveals all clients
37
+ Given I am an authenticated user with a developer role
38
+ Given a client "test client" exists with name: "test client"
39
+ And a project "test project" exists with name: "test project", client: client "test client"
40
+ And a ticket exists with project: project "test project", name: "test ticket"
41
+ And I am assigned to the project
42
+
43
+ And a client "test client1" exists with name: "test client1", initials: "TC1", status: "Active"
44
+ And a project exists with name: "test project1", client: client "test client1"
45
+ And I am assigned to the project
46
+
47
+ And a client "test client2" exists with name: "test client2", initials: "TC2", status: "Active"
48
+ And a project exists with name: "test project2", client: client "test client2"
49
+ And I visit /
50
+ And I follow "close"
51
+ And I check "checkbox"
52
+ Then I should see "test client1" within "#work_unit_client_id"
53
+ Then I should see "test client2" within "#work_unit_client_id"
54
+
55
+ @javascript
56
+ Scenario: When box is checked one can also see projects not assigned to oneself
57
+ Given I am an authenticated user with a developer role
58
+ Given a client "test client" exists with name: "test client"
59
+ And a project "test project" exists with name: "test project", client: client "test client"
60
+ And a ticket exists with project: project "test project", name: "test ticket"
61
+ And I am assigned to the project
62
+
63
+ And a client "test client1" exists with name: "test client1", initials: "TC1", status: "Active"
64
+ And a project exists with name: "test project1", client: client "test client1"
65
+ And I am assigned to the project
66
+
67
+ And a client "test client2" exists with name: "test client2", initials: "TC2", status: "Active"
68
+ And a project exists with name: "test project2", client: client "test client2"
69
+ And I visit /
70
+ And I follow "close"
71
+ And I check "checkbox"
72
+ And I select "test client2" from "work_unit_client_id"
73
+ Then I should see "test project2" within "#work_unit_project_id"
74
+
75
+ @javascript
76
+ Scenario: Checking & unchecking box re-hides clients without assigned projects
77
+ Given I am an authenticated user with a developer role
78
+ Given a client "test client" exists with name: "test client"
79
+ And a project "test project" exists with name: "test project", client: client "test client"
80
+ And a ticket exists with project: project "test project", name: "test ticket"
81
+ And I am assigned to the project
82
+
83
+ And a client "test client1" exists with name: "test client1", initials: "TC1", status: "Active"
84
+ And a project exists with name: "test project1", client: client "test client1"
85
+ And I am assigned to the project
86
+
87
+ And a client "test client2" exists with name: "test client2", initials: "TC2", status: "Active"
88
+ And a project exists with name: "test project2", client: client "test client2"
89
+ And I visit /
90
+ And I follow "close"
91
+ And I check "checkbox"
92
+ And I select "test client2" from "work_unit_client_id"
93
+ And I uncheck "checkbox"
94
+ Then I should not see "test client2" within "#work_unit_client_id"
95
+
96
+ @javascript
97
+ Scenario: Add new work order to a ticket
98
+ Given I am an authenticated user with a developer role
99
+ Given a client "test client" exists with name: "test client"
100
+ And a project "test project" exists with name: "test project", client: client "test client"
101
+ And a ticket exists with project: project "test project", name: "test ticket"
102
+ And I visit /
103
+ And I follow "close"
104
+ And I check "checkbox"
105
+ And I select "test client" from "work_unit_client_id"
106
+ And I select "test project" from "work_unit_project_id"
107
+ And I select "test ticket" from "work_unit_ticket_id"
108
+ And I select "Normal" from "hours_type"
109
+ And I fill in "work_unit_hours" with "2"
110
+ And I fill in "work_unit_description" with "test description"
111
+ When I press "Create Work Unit"
112
+ Then I should see "Current: 2.0" within "#current_hours"
@@ -0,0 +1,11 @@
1
+ Feature: Send Daily Email Report
2
+
3
+ @foo
4
+ Scenario: A client receives a daily email of their hours
5
+ Given all emails have been delivered
6
+ And a client exists with name: "Test Client"
7
+ And a contact "Test Contact" exists with client: client, email_address: "testcontact@example.com", receives_email: true
8
+ When the daily email goes out to client: "Test Client"
9
+ Then 1 email should be delivered to "testcontact@example.com"
10
+ And the first email should contain "Test Client,\nFor your records:\n\nTotal Hours:"
11
+
@@ -0,0 +1,74 @@
1
+ Feature: Dashboard
2
+
3
+ Scenario: Total hours for each day
4
+ Given I am on the clients page
5
+ Given I am an authenticated user
6
+ And I have a "Normal" work unit scheduled today for "3.0" hours
7
+ And I have an "Overtime" work unit scheduled today for "2.0" hours
8
+ When I go to the home page
9
+ Then I should see "Week: 6.0" within ".calendar_foot"
10
+ Then I should see "Current: 6.0" within "#current_hours"
11
+
12
+ Scenario: Non-entered time warning
13
+ Given I am an authenticated user with a developer role
14
+ And I have no work units for the previous day
15
+ When I go to the home page
16
+ Then I should see "You have not entered any time for the previous working day." within "#message"
17
+
18
+ @javascript @test
19
+ Scenario: Only show projects assigned to current users on Dashboard
20
+ Given I am an authenticated user with a developer role
21
+ Given a client "test client" exists with name: "test client"
22
+ And a project "test project" exists with name: "test project", client: client "test client"
23
+ And a ticket exists with project: project "test project", name: "test ticket"
24
+ And I am assigned to the project
25
+ And a project exists with name: "test project1", client: client "test client"
26
+ And I am assigned to the project
27
+ And a project exists with name: "test project2", client: client "test client"
28
+ And I visit /
29
+ And I follow "close"
30
+ And I select "test client" from "work_unit[client_id]"
31
+ Then I should see "test project1" within "#work_unit_project_id"
32
+ Then I should not see "test project2" within "#work_unit_project_id"
33
+
34
+ @javascript
35
+ Scenario: It should show the new ticket field when I select new ticket while creating a work unit
36
+ Given I am an authenticated user with a developer role
37
+ Given a client "test client" exists with name: "test client"
38
+ And a project "test project" exists with name: "test project", client: client "test client"
39
+ And I am assigned to the project
40
+ And I visit /
41
+ And I follow "close"
42
+ And I select "test client" from "work_unit[client_id]"
43
+ And I select "test project" from "work_unit[project_id]"
44
+ And I select "New Ticket" from "work_unit[ticket_id]"
45
+ Then I should see the new ticket fields
46
+
47
+ @javascript
48
+ Scenario: It should create a new ticket on demand while making a work unit
49
+ Given I am an authenticated user with a developer role
50
+ Given a client "test client" exists with name: "test client", initials: "TTC", status: "Active"
51
+ And a project "test project" exists with name: "test project", client: client "test client"
52
+ And I am assigned to the project
53
+ And I visit /
54
+ And I follow "close"
55
+ And I select "test client" from "work_unit[client_id]"
56
+ And I select "test project" from "work_unit[project_id]"
57
+ And I select "New Ticket" from "work_unit[ticket_id]"
58
+ And I fill in "on_demand_ticket_name" with "test ticket"
59
+ And I fill in "on_demand_ticket_description" with "test ticket"
60
+ And I fill in "on_demand_ticket_estimated_hours" with "test ticket"
61
+ And I select "Normal" from "Type:"
62
+ And I fill in "work_unit_hours" with "2"
63
+ And I fill in "work_unit_description" with "work_unit_description"
64
+ And I press "Create Work Unit"
65
+ Then there should be a ticket named "test ticket" with 2 hours
66
+
67
+
68
+ @javascript
69
+ Scenario: Only show tickets assigned to current users on Dashboard
70
+ Given I am an authenticated user with a developer role
71
+ Given a client "test client" exists with name: "test client"
72
+ And a project "test project" exists with name: "test project", client: client "test client"
73
+ And a ticket exists with project: project "test project", name: "test ticket"
74
+ And I am assigned to the project