backlog 0.37.2 → 0.41.4

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 (568) hide show
  1. checksums.yaml +7 -0
  2. data/History.txt +128 -0
  3. data/README.txt +4 -2
  4. data/bin/backlog +1 -1
  5. data/lib/array_helper.rb +4 -4
  6. data/{vendor/plugins → lib}/backlog_jira/README +0 -0
  7. data/{vendor/plugins → lib}/backlog_jira/Rakefile +0 -0
  8. data/{vendor/plugins → lib}/backlog_jira/generators/backlog_jira/backlog_jira_generator.rb +0 -0
  9. data/{vendor/plugins → lib}/backlog_jira/generators/backlog_jira/templates/migration.rb +0 -0
  10. data/{vendor/plugins → lib}/backlog_jira/generators/history_model/history_model_generator.rb +0 -0
  11. data/{vendor/plugins → lib}/backlog_jira/generators/history_model/templates/fixtures.yml +0 -0
  12. data/{vendor/plugins → lib}/backlog_jira/generators/history_model/templates/functional_test.rb +0 -0
  13. data/{vendor/plugins → lib}/backlog_jira/generators/history_model/templates/model.rb +0 -0
  14. data/{vendor/plugins → lib}/backlog_jira/generators/history_model/templates/unit_test.rb +0 -0
  15. data/lib/backlog_jira/init.rb +66 -0
  16. data/{vendor/plugins → lib}/backlog_jira/install.rb +0 -0
  17. data/{vendor/plugins → lib}/backlog_jira/lib/backlog_jira.rb +0 -0
  18. data/{vendor/plugins → lib}/backlog_jira/lib/tasks/backlog_jira_tasks.rake +0 -0
  19. data/{vendor/plugins → lib}/backlog_jira/test/backlog_jira_test.rb +0 -0
  20. data/{vendor/plugins → lib}/backlog_jira/uninstall.rb +0 -0
  21. data/lib/big_decimal_yaml_fix.rb +16 -25
  22. data/lib/tasks/backup.rake +18 -18
  23. data/lib/time_extras.rb +6 -6
  24. data/lib/user_system.rb +41 -38
  25. data/lib/version_from_history.rb +2 -2
  26. metadata +196 -749
  27. data/Capfile +0 -2
  28. data/Gemfile +0 -34
  29. data/Gemfile.lock +0 -139
  30. data/MODIFICATIONS.txt +0 -13
  31. data/Manifest.txt +0 -0
  32. data/README_LOGIN_SUGAR +0 -194
  33. data/Rakefile +0 -73
  34. data/Rakefile~ +0 -73
  35. data/Screenshot.png +0 -0
  36. data/app/controllers/absences_controller.rb +0 -67
  37. data/app/controllers/application_controller.rb +0 -185
  38. data/app/controllers/application_controller.rb.rails2 +0 -186
  39. data/app/controllers/customers_controller.rb +0 -51
  40. data/app/controllers/dashboard_controller.rb +0 -17
  41. data/app/controllers/estimates_controller.rb +0 -49
  42. data/app/controllers/groups_controller.rb +0 -65
  43. data/app/controllers/parties_controller.rb +0 -33
  44. data/app/controllers/periods_controller.rb +0 -242
  45. data/app/controllers/projects_controller.rb +0 -185
  46. data/app/controllers/public_holidays_controller.rb +0 -70
  47. data/app/controllers/search_controller.rb +0 -15
  48. data/app/controllers/task_files_controller.rb +0 -19
  49. data/app/controllers/tasks_controller.rb +0 -305
  50. data/app/controllers/user_controller.rb +0 -251
  51. data/app/controllers/welcome_controller.rb +0 -29
  52. data/app/controllers/work_locks_controller.rb +0 -88
  53. data/app/controllers/works_controller.rb +0 -383
  54. data/app/helpers/absences_helper.rb +0 -2
  55. data/app/helpers/application_helper.rb +0 -119
  56. data/app/helpers/application_helper.rb.rails2 +0 -118
  57. data/app/helpers/customers_helper.rb +0 -2
  58. data/app/helpers/dashboard_helper.rb +0 -2
  59. data/app/helpers/estimates_helper.rb +0 -2
  60. data/app/helpers/groups_helper.rb +0 -2
  61. data/app/helpers/parties_helper.rb +0 -2
  62. data/app/helpers/periods_helper.rb +0 -57
  63. data/app/helpers/projects_helper.rb +0 -74
  64. data/app/helpers/public_holidays_helper.rb +0 -2
  65. data/app/helpers/search_helper.rb +0 -2
  66. data/app/helpers/task_files_helper.rb +0 -2
  67. data/app/helpers/tasks_helper.rb +0 -2
  68. data/app/helpers/user_helper.rb +0 -53
  69. data/app/helpers/welcome_helper.rb +0 -2
  70. data/app/helpers/work_locks_helper.rb +0 -2
  71. data/app/helpers/works_helper.rb +0 -5
  72. data/app/mailers/user_notify.rb +0 -76
  73. data/app/models/absence.rb +0 -27
  74. data/app/models/chart.rb +0 -5
  75. data/app/models/clock.rb +0 -14
  76. data/app/models/configuration.rb +0 -2
  77. data/app/models/customer.rb +0 -2
  78. data/app/models/estimate.rb +0 -17
  79. data/app/models/group.rb +0 -16
  80. data/app/models/party.rb +0 -27
  81. data/app/models/period.rb +0 -251
  82. data/app/models/project.rb +0 -49
  83. data/app/models/public_holiday.rb +0 -13
  84. data/app/models/report_filter.rb +0 -29
  85. data/app/models/search_result.rb +0 -8
  86. data/app/models/sidebar.rb +0 -41
  87. data/app/models/task.rb +0 -425
  88. data/app/models/task_file.rb +0 -7
  89. data/app/models/task_notify.rb +0 -27
  90. data/app/models/user.rb +0 -146
  91. data/app/models/work.rb +0 -191
  92. data/app/models/work_lock.rb +0 -11
  93. data/app/models/work_lock_nagger.rb +0 -60
  94. data/app/models/work_lock_notify.rb +0 -43
  95. data/app/models/works_report_filter.rb +0 -27
  96. data/app/views/absences/_form.rhtml +0 -10
  97. data/app/views/absences/edit.rhtml +0 -9
  98. data/app/views/absences/list.rhtml +0 -25
  99. data/app/views/absences/new.rhtml +0 -8
  100. data/app/views/absences/show.rhtml +0 -8
  101. data/app/views/customers/_form.rhtml +0 -7
  102. data/app/views/customers/_name_list.rhtml +0 -5
  103. data/app/views/customers/edit.rhtml +0 -9
  104. data/app/views/customers/list.rhtml +0 -28
  105. data/app/views/customers/new.rhtml +0 -8
  106. data/app/views/customers/show.rhtml +0 -8
  107. data/app/views/dashboard/show.rhtml +0 -24
  108. data/app/views/display_notice.rjs +0 -1
  109. data/app/views/groups/_form.rhtml +0 -7
  110. data/app/views/groups/edit.rhtml +0 -57
  111. data/app/views/groups/list.rhtml +0 -26
  112. data/app/views/groups/new.rhtml +0 -7
  113. data/app/views/groups/set_member.rjs +0 -1
  114. data/app/views/layouts/_headers.rhtml +0 -24
  115. data/app/views/layouts/_left_top.rhtml +0 -33
  116. data/app/views/layouts/_notice.rhtml +0 -12
  117. data/app/views/layouts/_shortcuts.rhtml +0 -22
  118. data/app/views/layouts/_shortcuts_js.rhtml +0 -19
  119. data/app/views/layouts/mwrt002.html.erb +0 -44
  120. data/app/views/layouts/wide.rhtml +0 -23
  121. data/app/views/periods/_burn_down_chart.rhtml +0 -9
  122. data/app/views/periods/_form.rhtml +0 -74
  123. data/app/views/periods/_link.rhtml +0 -3
  124. data/app/views/periods/_show_active.rhtml +0 -61
  125. data/app/views/periods/_sidebar_block.rhtml +0 -11
  126. data/app/views/periods/_title.rhtml +0 -18
  127. data/app/views/periods/edit.rhtml +0 -10
  128. data/app/views/periods/finish_task.rjs +0 -4
  129. data/app/views/periods/move_task_to_period.rjs +0 -4
  130. data/app/views/periods/new.rhtml +0 -9
  131. data/app/views/periods/order.rjs +0 -0
  132. data/app/views/periods/reopen_task.rjs +0 -6
  133. data/app/views/periods/show.rhtml +0 -56
  134. data/app/views/projects/_buttons.rhtml +0 -4
  135. data/app/views/projects/_form.rhtml +0 -44
  136. data/app/views/projects/_name_list.rhtml +0 -5
  137. data/app/views/projects/edit.rhtml +0 -14
  138. data/app/views/projects/finish_task.rjs +0 -3
  139. data/app/views/projects/list.rhtml +0 -16
  140. data/app/views/projects/move_task_to_period.rjs +0 -3
  141. data/app/views/projects/new.rhtml +0 -11
  142. data/app/views/projects/reopen_task.rjs +0 -3
  143. data/app/views/projects/show.rhtml +0 -39
  144. data/app/views/public_holidays/_form.rhtml +0 -7
  145. data/app/views/public_holidays/edit.rhtml +0 -9
  146. data/app/views/public_holidays/list.rhtml +0 -25
  147. data/app/views/public_holidays/new.rhtml +0 -8
  148. data/app/views/public_holidays/show.rhtml +0 -8
  149. data/app/views/redirect.rjs +0 -1
  150. data/app/views/search/results.rhtml +0 -40
  151. data/app/views/task_notify/invite.en.html.erb +0 -13
  152. data/app/views/task_notify/invite.no.html.erb +0 -13
  153. data/app/views/tasks/_backlog_header.rhtml +0 -17
  154. data/app/views/tasks/_completed.rhtml +0 -18
  155. data/app/views/tasks/_fields_header.rhtml +0 -13
  156. data/app/views/tasks/_form.rhtml +0 -125
  157. data/app/views/tasks/_invite.rjs +0 -1
  158. data/app/views/tasks/_period_header.rhtml +0 -1
  159. data/app/views/tasks/_task.rhtml +0 -116
  160. data/app/views/tasks/_update.rjs +0 -2
  161. data/app/views/tasks/edit.rhtml +0 -81
  162. data/app/views/tasks/grab.rhtml +0 -9
  163. data/app/views/tasks/invite.rhtml +0 -9
  164. data/app/views/tasks/list.rhtml +0 -77
  165. data/app/views/tasks/list_started.rhtml +0 -62
  166. data/app/views/tasks/new.rhtml +0 -10
  167. data/app/views/tasks/notes.rhtml +0 -12
  168. data/app/views/tasks/start_work.rjs +0 -1
  169. data/app/views/tasks/update_estimate.rjs +0 -3
  170. data/app/views/user/_edit.rhtml +0 -31
  171. data/app/views/user/_password.rhtml +0 -21
  172. data/app/views/user/change_password.rhtml +0 -19
  173. data/app/views/user/delete.rhtml +0 -14
  174. data/app/views/user/edit.rhtml +0 -154
  175. data/app/views/user/forgot_password.rhtml +0 -19
  176. data/app/views/user/login.rhtml +0 -33
  177. data/app/views/user/logout.rhtml +0 -8
  178. data/app/views/user/set_group.rjs +0 -1
  179. data/app/views/user/signup.rhtml +0 -15
  180. data/app/views/user/toggle_work_lock_monitoring.rjs +0 -2
  181. data/app/views/user/welcome.rhtml +0 -8
  182. data/app/views/user_notify/change_password.en.html.erb +0 -10
  183. data/app/views/user_notify/change_password.no.html.erb +0 -10
  184. data/app/views/user_notify/forgot_password.en.html.erb +0 -11
  185. data/app/views/user_notify/forgot_password.no.html.erb +0 -11
  186. data/app/views/user_notify/monitoring.en.html.erb +0 -3
  187. data/app/views/user_notify/monitoring.no.html.erb +0 -3
  188. data/app/views/user_notify/monitoring_invitation.en.html.erb +0 -7
  189. data/app/views/user_notify/monitoring_invitation.no.html.erb +0 -7
  190. data/app/views/user_notify/signup.en.html.erb +0 -12
  191. data/app/views/user_notify/signup.no.html.erb +0 -12
  192. data/app/views/work_lock_notify/lock.en.html.erb +0 -7
  193. data/app/views/work_lock_notify/lock.no.html.erb +0 -7
  194. data/app/views/work_lock_notify/nag.en.html.erb +0 -6
  195. data/app/views/work_lock_notify/nag.no.html.erb +0 -7
  196. data/app/views/work_locks/_form.rhtml +0 -10
  197. data/app/views/work_locks/edit.rhtml +0 -9
  198. data/app/views/work_locks/list.rhtml +0 -25
  199. data/app/views/work_locks/new.rhtml +0 -8
  200. data/app/views/work_locks/show.rhtml +0 -8
  201. data/app/views/works/_buttons.rhtml +0 -2
  202. data/app/views/works/_description_list.rhtml +0 -5
  203. data/app/views/works/_form.rhtml +0 -107
  204. data/app/views/works/_new_row.rhtml +0 -141
  205. data/app/views/works/_row.rhtml +0 -115
  206. data/app/views/works/_row_field.rhtml +0 -17
  207. data/app/views/works/_task_id_list.rhtml +0 -5
  208. data/app/views/works/_weekly_work_sheet_buttons.rhtml +0 -22
  209. data/app/views/works/daily_work_sheet.rhtml +0 -108
  210. data/app/views/works/edit.rhtml +0 -11
  211. data/app/views/works/list.rhtml +0 -148
  212. data/app/views/works/list_excel.rhtml +0 -114
  213. data/app/views/works/new.rhtml +0 -12
  214. data/app/views/works/show.rhtml +0 -10
  215. data/app/views/works/timeliste.rhtml +0 -884
  216. data/app/views/works/update_new_row.rjs +0 -28
  217. data/app/views/works/update_row.rjs +0 -18
  218. data/app/views/works/update_time.rjs +0 -3
  219. data/app/views/works/weekly_work_sheet.rhtml +0 -64
  220. data/app/views/works/weekly_work_sheet_details.rhtml +0 -102
  221. data/backlog.gemspec +0 -44
  222. data/config.ru +0 -4
  223. data/config/application.rb +0 -11
  224. data/config/boot.rb +0 -13
  225. data/config/database.yml +0 -15
  226. data/config/database.yml~ +0 -17
  227. data/config/environment.rb +0 -100
  228. data/config/environments/development.rb +0 -30
  229. data/config/environments/development.rb.rails2 +0 -26
  230. data/config/environments/production.rb +0 -33
  231. data/config/environments/test.rb +0 -24
  232. data/config/environments/user_environment.rb +0 -21
  233. data/config/initializers/backtrace_silencers.rb +0 -7
  234. data/config/initializers/inflections.rb +0 -10
  235. data/config/initializers/jdbc.rb +0 -7
  236. data/config/initializers/mime_types.rb +0 -5
  237. data/config/initializers/secret_token.rb +0 -7
  238. data/config/initializers/session_store.rb +0 -8
  239. data/config/locales/en.yml +0 -200
  240. data/config/locales/no.yml +0 -193
  241. data/config/mime_types.yaml +0 -1
  242. data/config/routes.rb +0 -5
  243. data/config/war.rb +0 -27
  244. data/config/warble.rb +0 -84
  245. data/cruise_build.sh +0 -14
  246. data/cruise_config.rb +0 -5
  247. data/db/migrate/001_create_tasks.rb +0 -22
  248. data/db/migrate/003_add_estimation_points.rb +0 -16
  249. data/db/migrate/004_add_period.rb +0 -63
  250. data/db/migrate/005_add_field_work_started_at.rb +0 -9
  251. data/db/migrate/006_works_data_fix.rb +0 -13
  252. data/db/migrate/007_add_task_created_at.rb +0 -23
  253. data/db/migrate/008_add_backlog_options.rb +0 -13
  254. data/db/migrate/009_add_subtasks.rb +0 -29
  255. data/db/migrate/010_add_work_start.rb +0 -9
  256. data/db/migrate/011_login_sugar.rb +0 -21
  257. data/db/migrate/012_add_resolution.rb +0 -12
  258. data/db/migrate/013_create_estimates.rb +0 -20
  259. data/db/migrate/014_add_customer_option.rb +0 -11
  260. data/db/migrate/015_add_user_option.rb +0 -33
  261. data/db/migrate/016_add_invoicable_flag.rb +0 -11
  262. data/db/migrate/017_increase_backlog_name_limit.rb +0 -10
  263. data/db/migrate/018_create_groups.rb +0 -118
  264. data/db/migrate/019_remove_unique_index_for_period_position.rb +0 -9
  265. data/db/migrate/020_create_task_files.rb +0 -17
  266. data/db/migrate/021_create_work_accounts.rb +0 -111
  267. data/db/migrate/022_remove_track_done_flag.rb +0 -9
  268. data/db/migrate/023_add_indices_for_burn_down_chart.rb +0 -13
  269. data/db/migrate/024_add_sprint_option.rb +0 -10
  270. data/db/migrate/025_add_simple_auditing_of_tasks.rb +0 -11
  271. data/db/migrate/026_add_users_to_tasks.rb +0 -14
  272. data/db/migrate/027_create_work_locks.rb +0 -25
  273. data/db/migrate/028_create_absences.rb +0 -34
  274. data/db/migrate/029_add_work_comments.rb +0 -9
  275. data/db/migrate/030_create_public_holidays.rb +0 -11
  276. data/db/migrate/031_expand_work_done_precision.rb +0 -9
  277. data/db/migrate/20100720124707_merge_work_account_into_backlog.rb +0 -74
  278. data/db/migrate/20101006092700_rename_backlogs_to_projects.rb +0 -22
  279. data/db/migrate/20101006092700_rename_backlogs_to_projects.rb~ +0 -22
  280. data/db/schema.rb +0 -159
  281. data/db/seeds.rb +0 -7
  282. data/db/test.db +0 -0
  283. data/etc/backlog.conf +0 -32
  284. data/ext/mkrf_conf.rb +0 -26
  285. data/lib/class_table_inheritance.rb +0 -224
  286. data/lib/postgresql-8.2-504.jdbc4.jar +0 -0
  287. data/lib/tasks/jdbc.rake +0 -8
  288. data/lib/url_for_fix.rb +0 -30
  289. data/nbproject/private/config.properties +0 -0
  290. data/nbproject/private/private.properties +0 -1
  291. data/nbproject/private/private.xml +0 -4
  292. data/nbproject/private/rake-t.txt +0 -95
  293. data/nbproject/project.properties +0 -4
  294. data/nbproject/project.xml +0 -9
  295. data/public/404.html +0 -26
  296. data/public/422.html +0 -26
  297. data/public/500.html +0 -26
  298. data/public/Frav/303/246rsskjema.xls +0 -0
  299. data/public/applets/bsf.jar +0 -0
  300. data/public/applets/jruby.jar +0 -0
  301. data/public/favicon.ico +0 -0
  302. data/public/images/add.png +0 -0
  303. data/public/images/add.svg +0 -70
  304. data/public/images/ajax-loading.gif +0 -0
  305. data/public/images/appunti_architetto_franc_01.svg +0 -92
  306. data/public/images/arrow-down.gif +0 -0
  307. data/public/images/arrow-up.gif +0 -0
  308. data/public/images/arrow07_2.png +0 -0
  309. data/public/images/arrow07_4.png +0 -0
  310. data/public/images/arrow_down.png +0 -0
  311. data/public/images/arrow_down.svg +0 -59
  312. data/public/images/arrow_left.png +0 -0
  313. data/public/images/arrow_left.svg +0 -59
  314. data/public/images/arrow_right.png +0 -0
  315. data/public/images/arrow_right.svg +0 -59
  316. data/public/images/arrow_up.png +0 -0
  317. data/public/images/arrow_up.svg +0 -59
  318. data/public/images/black-70.png +0 -0
  319. data/public/images/black.png +0 -0
  320. data/public/images/blank.jpg +0 -0
  321. data/public/images/blank.png +0 -0
  322. data/public/images/cestino_pieno_architetto_01.svg +0 -470
  323. data/public/images/checkmark.png +0 -0
  324. data/public/images/checkmark_org.png +0 -0
  325. data/public/images/clipboard.png +0 -0
  326. data/public/images/clipboard.svg +0 -62
  327. data/public/images/construction_hammer_jon__01.svg +0 -116
  328. data/public/images/delete.png +0 -0
  329. data/public/images/email.png +0 -0
  330. data/public/images/email_grey.png +0 -0
  331. data/public/images/eraser.png +0 -0
  332. data/public/images/eraser_org.png +0 -0
  333. data/public/images/ernes_stop.png +0 -0
  334. data/public/images/ernes_stop_org.png +0 -0
  335. data/public/images/flag_red.png +0 -0
  336. data/public/images/flag_yellow.png +0 -0
  337. data/public/images/grab.png +0 -0
  338. data/public/images/grab_gray.png +0 -0
  339. data/public/images/group.png +0 -0
  340. data/public/images/hammer.png +0 -0
  341. data/public/images/header.jpg +0 -0
  342. data/public/images/nextlabel.gif +0 -0
  343. data/public/images/pagebak.jpg +0 -0
  344. data/public/images/paper3.svg +0 -54
  345. data/public/images/period.png +0 -0
  346. data/public/images/period_org.png +0 -0
  347. data/public/images/person.org.png +0 -0
  348. data/public/images/prevlabel.gif +0 -0
  349. data/public/images/question.svg +0 -56
  350. data/public/images/rails.png +0 -0
  351. data/public/images/refresh.png +0 -0
  352. data/public/images/rmagick.gif +0 -0
  353. data/public/images/rmagick_270.gif +0 -0
  354. data/public/images/tabella_architetto_franc_01.svg +0 -105
  355. data/public/images/task.png +0 -0
  356. data/public/images/text-x-generic.png +0 -0
  357. data/public/images/user group.png +0 -0
  358. data/public/images/user.png +0 -0
  359. data/public/images/view_fullscreen.png +0 -0
  360. data/public/images/work_account.png +0 -0
  361. data/public/javascripts/application.js +0 -2
  362. data/public/javascripts/builder.js +0 -136
  363. data/public/javascripts/controls.js +0 -965
  364. data/public/javascripts/dragdrop.js +0 -974
  365. data/public/javascripts/effects.js +0 -1123
  366. data/public/javascripts/lightwindow.js +0 -1921
  367. data/public/javascripts/prototype.js +0 -6001
  368. data/public/javascripts/rails.js +0 -175
  369. data/public/javascripts/ruby.js +0 -46
  370. data/public/javascripts/scriptaculous.js +0 -58
  371. data/public/javascripts/slider.js +0 -275
  372. data/public/javascripts/sound.js +0 -55
  373. data/public/javascripts/unittest.js +0 -568
  374. data/public/javascripts/zapatec/utils/transport.js +0 -2217
  375. data/public/javascripts/zapatec/utils/utils.js +0 -1799
  376. data/public/javascripts/zapatec/utils/zapatec.js +0 -90
  377. data/public/javascripts/zapatec/utils/zpeventdriven.js +0 -212
  378. data/public/javascripts/zapatec/utils/zpwidget.js +0 -729
  379. data/public/javascripts/zapatec/zpcal/lang/calendar-no.js +0 -124
  380. data/public/javascripts/zapatec/zpcal/src/calendar-core.js +0 -2878
  381. data/public/javascripts/zapatec/zpcal/src/calendar-date-core.js +0 -348
  382. data/public/javascripts/zapatec/zpcal/src/calendar-setup.js +0 -360
  383. data/public/javascripts/zapatec/zpcal/src/calendar.js +0 -35
  384. data/public/robots.txt +0 -5
  385. data/public/stylesheets/backlog.css +0 -135
  386. data/public/stylesheets/lightwindow.css +0 -376
  387. data/public/stylesheets/mwrt002.css +0 -54
  388. data/public/stylesheets/mwrt002MAC.css +0 -3
  389. data/public/stylesheets/mwrt002NN.css +0 -3
  390. data/public/stylesheets/scaffold.css +0 -74
  391. data/public/stylesheets/user.css +0 -74
  392. data/public/stylesheets/zpcal/themes/green.css +0 -153
  393. data/public/stylesheets/zpcal/themes/layouts/layout-2d.css +0 -134
  394. data/public/stylesheets/zpcal/themes/layouts/layout-common.css +0 -74
  395. data/public/stylesheets/zpcal/themes/menuarrow.gif +0 -0
  396. data/public/stylesheets/zpcal/themes/scroller-down.gif +0 -0
  397. data/public/stylesheets/zpcal/themes/scroller-up.gif +0 -0
  398. data/script/rails +0 -6
  399. data/test/client/login.rb +0 -23
  400. data/test/client/login_test.rb +0 -64
  401. data/test/client/setup.rb +0 -25
  402. data/test/fixtures/absences.yml +0 -11
  403. data/test/fixtures/configurations.yml +0 -5
  404. data/test/fixtures/customers.yml +0 -7
  405. data/test/fixtures/estimates.yml +0 -10
  406. data/test/fixtures/groups.yml +0 -6
  407. data/test/fixtures/groups_users.yml +0 -3
  408. data/test/fixtures/parties.yml +0 -32
  409. data/test/fixtures/periods.yml +0 -24
  410. data/test/fixtures/projects.yml +0 -8
  411. data/test/fixtures/public_holidays.yml +0 -7
  412. data/test/fixtures/task_files.yml +0 -13
  413. data/test/fixtures/tasks.yml +0 -82
  414. data/test/fixtures/users.yml +0 -59
  415. data/test/fixtures/work_lock_subscriptions.yml +0 -7
  416. data/test/fixtures/work_locks.yml +0 -11
  417. data/test/fixtures/works.yml +0 -47
  418. data/test/functional/absences_controller_test.rb +0 -93
  419. data/test/functional/customers_controller_test.rb +0 -93
  420. data/test/functional/dashboard_controller_test.rb +0 -18
  421. data/test/functional/estimates_controller_test.rb +0 -40
  422. data/test/functional/groups_controller_test.rb +0 -120
  423. data/test/functional/parties_controller_test.rb +0 -35
  424. data/test/functional/periods_controller_test.rb +0 -297
  425. data/test/functional/projects_controller_test.rb +0 -152
  426. data/test/functional/public_holidays_controller_test.rb +0 -93
  427. data/test/functional/search_controller_test.rb +0 -24
  428. data/test/functional/task_files_controller_test.rb +0 -29
  429. data/test/functional/tasks_controller_test.rb +0 -229
  430. data/test/functional/user_controller_test.rb +0 -261
  431. data/test/functional/welcome_controller_test.rb +0 -62
  432. data/test/functional/work_locks_controller_test.rb +0 -93
  433. data/test/functional/works_controller_test.rb +0 -220
  434. data/test/integration/user_system_test.rb +0 -95
  435. data/test/mocks/test/clock.rb +0 -14
  436. data/test/performance/browsing_test.rb +0 -9
  437. data/test/performance/common.rb +0 -91
  438. data/test/performance/jetty_test.rb +0 -15
  439. data/test/performance/server_test.rb +0 -17
  440. data/test/test_helper.rb +0 -119
  441. data/test/test_helper.rb~ +0 -121
  442. data/test/unit/absence_test.rb +0 -29
  443. data/test/unit/big_decimal_yaml_fix_test.rb +0 -15
  444. data/test/unit/configuration_test.rb +0 -10
  445. data/test/unit/customer_test.rb +0 -10
  446. data/test/unit/estimate_test.rb +0 -10
  447. data/test/unit/group_test.rb +0 -10
  448. data/test/unit/party_test.rb +0 -10
  449. data/test/unit/period_test.rb +0 -9
  450. data/test/unit/public_holiday_test.rb +0 -10
  451. data/test/unit/task_file_test.rb +0 -10
  452. data/test/unit/task_test.rb +0 -73
  453. data/test/unit/time_of_day_test.rb +0 -23
  454. data/test/unit/user_test.rb +0 -148
  455. data/test/unit/work_lock_subscription_test.rb +0 -10
  456. data/test/unit/work_lock_test.rb +0 -10
  457. data/test/unit/work_test.rb +0 -81
  458. data/vendor/plugins/acts_as_list/README +0 -23
  459. data/vendor/plugins/acts_as_list/init.rb +0 -3
  460. data/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb +0 -256
  461. data/vendor/plugins/acts_as_list/test/list_test.rb +0 -332
  462. data/vendor/plugins/acts_as_tree/README +0 -26
  463. data/vendor/plugins/acts_as_tree/Rakefile +0 -22
  464. data/vendor/plugins/acts_as_tree/init.rb +0 -1
  465. data/vendor/plugins/acts_as_tree/lib/active_record/acts/tree.rb +0 -96
  466. data/vendor/plugins/acts_as_tree/test/abstract_unit.rb +0 -0
  467. data/vendor/plugins/acts_as_tree/test/acts_as_tree_test.rb +0 -219
  468. data/vendor/plugins/acts_as_tree/test/database.yml +0 -0
  469. data/vendor/plugins/acts_as_tree/test/fixtures/mixin.rb +0 -0
  470. data/vendor/plugins/acts_as_tree/test/fixtures/mixins.yml +0 -0
  471. data/vendor/plugins/acts_as_tree/test/schema.rb +0 -0
  472. data/vendor/plugins/assert_cookie/MIT-LICENSE +0 -7
  473. data/vendor/plugins/assert_cookie/README +0 -6
  474. data/vendor/plugins/assert_cookie/Rakefile +0 -21
  475. data/vendor/plugins/assert_cookie/init.rb +0 -1
  476. data/vendor/plugins/assert_cookie/lib/assert_cookie.rb +0 -73
  477. data/vendor/plugins/assert_cookie/meta.yml +0 -7
  478. data/vendor/plugins/assert_cookie/test/test_assert_cookie.rb +0 -124
  479. data/vendor/plugins/assert_cookie/test/test_helper.rb +0 -31
  480. data/vendor/plugins/auto_complete/README +0 -23
  481. data/vendor/plugins/auto_complete/Rakefile +0 -22
  482. data/vendor/plugins/auto_complete/init.rb +0 -2
  483. data/vendor/plugins/auto_complete/lib/auto_complete.rb +0 -47
  484. data/vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb +0 -143
  485. data/vendor/plugins/auto_complete/test/auto_complete_test.rb +0 -67
  486. data/vendor/plugins/backlog_jira/init.rb +0 -66
  487. data/vendor/plugins/dynamic_form/MIT-LICENSE +0 -20
  488. data/vendor/plugins/dynamic_form/README +0 -13
  489. data/vendor/plugins/dynamic_form/Rakefile +0 -10
  490. data/vendor/plugins/dynamic_form/dynamic_form.gemspec +0 -12
  491. data/vendor/plugins/dynamic_form/init.rb +0 -1
  492. data/vendor/plugins/dynamic_form/lib/action_view/helpers/dynamic_form.rb +0 -300
  493. data/vendor/plugins/dynamic_form/lib/action_view/locale/en.yml +0 -8
  494. data/vendor/plugins/dynamic_form/lib/dynamic_form.rb +0 -5
  495. data/vendor/plugins/dynamic_form/test/dynamic_form_i18n_test.rb +0 -42
  496. data/vendor/plugins/dynamic_form/test/dynamic_form_test.rb +0 -370
  497. data/vendor/plugins/dynamic_form/test/test_helper.rb +0 -9
  498. data/vendor/plugins/has_history/README +0 -12
  499. data/vendor/plugins/has_history/Rakefile +0 -22
  500. data/vendor/plugins/has_history/generators/history_migration/history_migration_generator.rb +0 -30
  501. data/vendor/plugins/has_history/generators/history_migration/templates/migration.rb +0 -14
  502. data/vendor/plugins/has_history/generators/history_model/history_model_generator.rb +0 -39
  503. data/vendor/plugins/has_history/generators/history_model/templates/fixtures.yml +0 -17
  504. data/vendor/plugins/has_history/generators/history_model/templates/functional_test.rb +0 -129
  505. data/vendor/plugins/has_history/generators/history_model/templates/migration.rb +0 -14
  506. data/vendor/plugins/has_history/generators/history_model/templates/model.rb +0 -4
  507. data/vendor/plugins/has_history/generators/history_model/templates/unit_test.rb +0 -75
  508. data/vendor/plugins/has_history/init.rb +0 -5
  509. data/vendor/plugins/has_history/install.rb +0 -1
  510. data/vendor/plugins/has_history/lib/has_history.rb +0 -178
  511. data/vendor/plugins/has_history/lib/tasks/has_history_tasks.rake +0 -4
  512. data/vendor/plugins/has_history/test/has_history_test.rb +0 -31
  513. data/vendor/plugins/has_history/test/ignorant_master.rb +0 -3
  514. data/vendor/plugins/has_history/test/ignorant_master_history.rb +0 -4
  515. data/vendor/plugins/has_history/test/lone_master.rb +0 -42
  516. data/vendor/plugins/has_history/test/paired_master.rb +0 -5
  517. data/vendor/plugins/has_history/test/paired_master_history.rb +0 -5
  518. data/vendor/plugins/has_history/test/test_helper.rb +0 -154
  519. data/vendor/plugins/has_history/uninstall.rb +0 -1
  520. data/vendor/plugins/prototype_legacy_helper/lib/prototype_legacy_helper.rb +0 -432
  521. data/vendor/plugins/prototype_legacy_helper/test/test_prototype_helper.rb +0 -297
  522. data/vendor/plugins/rails_time/MIT-LICENSE +0 -20
  523. data/vendor/plugins/rails_time/README +0 -28
  524. data/vendor/plugins/rails_time/init.rb +0 -2
  525. data/vendor/plugins/rails_time/lib/activerecord_time_extension.rb +0 -28
  526. data/vendor/plugins/rails_time/lib/time_of_day.rb +0 -88
  527. data/vendor/plugins/rails_time/test/database.yml +0 -18
  528. data/vendor/plugins/rails_time/test/debug.log +0 -1
  529. data/vendor/plugins/rails_time/test/rails_time_test.rb +0 -122
  530. data/vendor/plugins/rails_time/test/schema.rb +0 -10
  531. data/vendor/plugins/rails_time/test/test_helper.rb +0 -17
  532. data/vendor/plugins/verification/MIT-LICENSE +0 -20
  533. data/vendor/plugins/verification/README +0 -34
  534. data/vendor/plugins/verification/Rakefile +0 -22
  535. data/vendor/plugins/verification/init.rb +0 -3
  536. data/vendor/plugins/verification/lib/action_controller/verification.rb +0 -132
  537. data/vendor/plugins/verification/test/test_helper.rb +0 -18
  538. data/vendor/plugins/verification/test/verification_test.rb +0 -270
  539. data/vendor/plugins/will_paginate/LICENSE +0 -18
  540. data/vendor/plugins/will_paginate/README +0 -138
  541. data/vendor/plugins/will_paginate/Rakefile +0 -27
  542. data/vendor/plugins/will_paginate/init.rb +0 -4
  543. data/vendor/plugins/will_paginate/lib/will_paginate.rb +0 -61
  544. data/vendor/plugins/will_paginate/lib/will_paginate/collection.rb +0 -132
  545. data/vendor/plugins/will_paginate/lib/will_paginate/core_ext.rb +0 -80
  546. data/vendor/plugins/will_paginate/lib/will_paginate/finder.rb +0 -181
  547. data/vendor/plugins/will_paginate/lib/will_paginate/view_helpers.rb +0 -206
  548. data/vendor/plugins/will_paginate/test/array_pagination_test.rb +0 -131
  549. data/vendor/plugins/will_paginate/test/boot.rb +0 -23
  550. data/vendor/plugins/will_paginate/test/console +0 -9
  551. data/vendor/plugins/will_paginate/test/finder_test.rb +0 -290
  552. data/vendor/plugins/will_paginate/test/fixtures/admin.rb +0 -3
  553. data/vendor/plugins/will_paginate/test/fixtures/developer.rb +0 -11
  554. data/vendor/plugins/will_paginate/test/fixtures/developers_projects.yml +0 -13
  555. data/vendor/plugins/will_paginate/test/fixtures/project.rb +0 -15
  556. data/vendor/plugins/will_paginate/test/fixtures/projects.yml +0 -7
  557. data/vendor/plugins/will_paginate/test/fixtures/replies.yml +0 -34
  558. data/vendor/plugins/will_paginate/test/fixtures/reply.rb +0 -5
  559. data/vendor/plugins/will_paginate/test/fixtures/schema.rb +0 -38
  560. data/vendor/plugins/will_paginate/test/fixtures/topic.rb +0 -4
  561. data/vendor/plugins/will_paginate/test/fixtures/topics.yml +0 -30
  562. data/vendor/plugins/will_paginate/test/fixtures/user.rb +0 -2
  563. data/vendor/plugins/will_paginate/test/fixtures/users.yml +0 -35
  564. data/vendor/plugins/will_paginate/test/helper.rb +0 -25
  565. data/vendor/plugins/will_paginate/test/lib/activerecord_test_case.rb +0 -23
  566. data/vendor/plugins/will_paginate/test/lib/activerecord_test_connector.rb +0 -67
  567. data/vendor/plugins/will_paginate/test/lib/load_fixtures.rb +0 -13
  568. data/vendor/plugins/will_paginate/test/pagination_test.rb +0 -240
@@ -1,7 +0,0 @@
1
- class TaskFile < ActiveRecord::Base
2
- belongs_to :task
3
-
4
- def image?
5
- content_type =~ /^image\//
6
- end
7
- end
@@ -1,27 +0,0 @@
1
- class TaskNotify < ActionMailer::Base
2
- def invite(inviter, invitee, task, task_url, grab_url)
3
- setup_email(invitee)
4
-
5
- # Email header info
6
- @subject += "#{inviter.name} has invited you to grab task: #{task.id}."
7
-
8
- # Email body substitutions
9
- @body["app_name"] = UserSystem::CONFIG[:app_name].to_s
10
- @body["app_url"] = UserSystem::CONFIG[:app_url].to_s
11
- @body["task"] = task
12
- @body["task_url"] = task_url
13
- @body["grab_url"] = grab_url
14
- @body["inviter"] = inviter
15
- @body["invitee"] = invitee
16
- end
17
-
18
- private
19
-
20
- def setup_email(user)
21
- @recipients = "#{user.email}"
22
- @from = UserSystem::CONFIG[:email_from].to_s
23
- @subject = "[#{UserSystem::CONFIG[:app_name]}] "
24
- @sent_on = Time.now
25
- @headers['Content-Type'] = "text/plain; charset=#{UserSystem::CONFIG[:mail_charset]}; format=flowed"
26
- end
27
- end
@@ -1,146 +0,0 @@
1
- require 'digest/sha1'
2
- require 'clock'
3
-
4
- # this model expects a certain database layout and its based on the name/login pattern.
5
- #class User < ActiveRecord::Base
6
- class User < Party
7
- class_table_inheritance
8
-
9
- # TODO (uwe): We need to specify :join_table, :foreign_key and :association_foreign_key
10
- # even if they follow the defaults since ClassTableInheritanceInRails breaks it.
11
- has_and_belongs_to_many :groups, :join_table => "groups_users", :foreign_key => "user_id", :association_foreign_key => 'group_id'
12
- has_and_belongs_to_many :work_lock_subscribers, :class_name => 'User', :join_table => "user_work_lock_subscriptions", :foreign_key => "user_id", :association_foreign_key => 'subscriber_user_id'
13
- has_and_belongs_to_many :work_lock_subscriptions, :class_name => 'User', :join_table => "user_work_lock_subscriptions", :association_foreign_key => "user_id", :foreign_key => 'subscriber_user_id'
14
- has_many :works, :foreign_key => :user_id, :order => :completed_at
15
- has_many :work_locks, :foreign_key => :user_id, :order => :end_on
16
-
17
- attr_accessor :password_needs_confirmation
18
-
19
- after_save '@password_needs_confirmation = false'
20
- after_validation :crypt_password
21
-
22
- validates_presence_of :login
23
- validates_length_of :login, :within => 3..40
24
- validates_uniqueness_of :login
25
-
26
- validates_presence_of :email
27
- validates_length_of :email, :allow_nil => false, :maximum => 60, :if => :email
28
- validates_uniqueness_of :email
29
-
30
- # This is commented out since I want to allow empty passwords
31
- # validates_presence_of :password, :if => :validate_password?
32
- validates_confirmation_of :password, :if => :validate_password?
33
- # This is commented out since I want to allow empty passwords
34
- # validates_length_of :password, { :minimum => 5, :if => :validate_password? }
35
- validates_length_of :password, { :maximum => 40, :if => :validate_password? }
36
-
37
- validates_length_of :first_name, :allow_nil => true, :maximum => 40
38
- validates_length_of :last_name, :allow_nil => true, :maximum => 40
39
-
40
- validates_length_of :role, :allow_nil => true, :maximum => 40
41
-
42
- validates_length_of :security_token, :allow_nil => true, :maximum => 40
43
- validates_inclusion_of :deleted, :in => [true, false], :allow_nil => true, :message => I18n.translate('activerecord.errors.messages')[:blank]
44
-
45
- def initialize(attributes = nil)
46
- super
47
- @password_needs_confirmation = false
48
- end
49
-
50
- def controller
51
- self.class.name.downcase
52
- end
53
-
54
- def self.authenticate(login, pass)
55
- u = find(:first, :conditions => ["login = ? AND verified = ? AND deleted = ?", login, true, false])
56
- return nil if u.nil?
57
- find(:first, :conditions => ["login = ? AND salted_password = ? AND verified = ?", login, salted_password(u.salt, hashed(pass)), true])
58
- end
59
-
60
- def self.authenticate_by_token(id, token)
61
- # Allow logins for deleted accounts, but only via this method (and
62
- # not the regular authenticate call)
63
- logger.info "Attempting authorization of #{id} with #{token}"
64
- u = find(:first, :conditions => ["id = ? AND security_token = ?", id, token])
65
- if u.nil? || u.token_expired?
66
- logger.info "Not authenticated"
67
- return nil
68
- end
69
- logger.info "Authenticated by token: #{u.inspect}"
70
- u.update_attribute :verified, true
71
- return u
72
- end
73
-
74
- def token_expired?
75
- self.security_token.nil? or self.token_expiry.nil? or (Clock.now > self.token_expiry)
76
- end
77
-
78
- def token_stale?
79
- token_expired? or Clock.now.to_i >= (self.token_expiry.to_i - self.class.token_lifetime / 2)
80
- end
81
-
82
- def generate_security_token
83
- if token_stale?
84
- token = new_security_token
85
- return token
86
- else
87
- return self.security_token
88
- end
89
- end
90
-
91
- def change_password(pass, confirm = nil)
92
- self.password = pass
93
- self.password_confirmation = confirm.nil? ? pass : confirm
94
- @password_needs_confirmation = true
95
- end
96
-
97
- def self.token_lifetime
98
- UserSystem::CONFIG[:security_token_life_hours] * 60 * 60
99
- end
100
-
101
- def name
102
- [first_name, last_name].compact.join(' ')
103
- end
104
-
105
- def includes?(user)
106
- return user == self
107
- end
108
-
109
- def users
110
- [self]
111
- end
112
-
113
- protected
114
-
115
- attr_accessor :password, :password_confirmation
116
-
117
- def validate_password?
118
- @password_needs_confirmation
119
- end
120
-
121
- def self.hashed(str)
122
- hashed_password = Digest::SHA1.hexdigest("change-me--#{str}--")[0..39]
123
- return hashed_password
124
- end
125
-
126
- def crypt_password
127
- if @password_needs_confirmation
128
- self[:salt] = self.class.hashed("salt-#{Clock.now}")
129
- self[:salted_password] = self.class.salted_password(salt, self.class.hashed(@password))
130
- end
131
- end
132
-
133
- def new_security_token
134
- expiry = Time.at(Clock.now.to_i + self.class.token_lifetime)
135
- self[:security_token] = self.class.hashed(self.salted_password + Clock.now.to_i.to_s + rand.to_s)
136
- self[:token_expiry] = expiry
137
- # update_without_callbacks
138
- update
139
- return self.security_token
140
- end
141
-
142
- def self.salted_password(salt, hashed_password)
143
- salted_password = hashed(salt + hashed_password)
144
- return salted_password
145
- end
146
- end
@@ -1,191 +0,0 @@
1
- class Work < ActiveRecord::Base
2
- extend UserSystem
3
- include UserSystem
4
-
5
- belongs_to :task
6
- belongs_to :user
7
- belongs_to :project
8
- belongs_to :customer
9
-
10
- validates_associated :task
11
- validates_presence_of :project
12
- validates_presence_of :started_on
13
- validates_presence_of :start_time, :if => :track_times?
14
-
15
- def initialize(*args)
16
- super
17
- self.invoice = true if self.invoice.nil?
18
- end
19
-
20
- def track_times?
21
- project && project.track_times?
22
- end
23
-
24
- # Return an array with an array of works per day:
25
- # [
26
- # [m0, t0, w0, t0, f0, nil, nil],
27
- # [m1, t1, w1, t1, f1, nil, nil],
28
- # [m2, t2, nil,t2, nil,nil, nil],
29
- # [nil,t2, nil,nil,nil,nil, nil],
30
- # ]
31
- def self.works_for_week(year, week_no, user = current_user)
32
- first = Date.commercial(year, week_no, 1)
33
- last = first + 6
34
- works = find(:all, :conditions => "completed_at IS NOT NULL AND started_on BETWEEN '#{first}' AND '#{last}'", :order => 'started_on, start_time')
35
- length = 0
36
- works_per_day = (0..6).map do |day|
37
- works_for_day = works.select {|work| work.started_on == (first + day) && (work.user_id.nil? || (user && work.user_id == user.id)) }
38
- length = [length, works_for_day.length].max
39
- works_for_day
40
- end
41
- works_per_day.each {|works_for_day| works_for_day[length-1] ||= nil} if length > 0
42
- works_by_row = works_per_day.transpose
43
- end
44
-
45
- # Return a hash with work accounts as keys an array of work hours totals per day as values:
46
- # {
47
- # <#Project#1> => [ 8, 7, 9, 12, 4, nil, nil],
48
- # <#Project#2> => [nil, 1, nil, nil, 4, nil, nil],
49
- # <#Project#3> => [nil, nil, nil, nil, nil, 4, 3],
50
- # ]
51
- def self.works_for_week_by_project(year, week_no, user = current_user)
52
- first_date = Date.commercial(year, week_no, 1)
53
- last_date = first_date + 6
54
- works = find(:all, :conditions => "user_id #{user ? " = #{user.id}" : "IS NULL"} AND started_on BETWEEN '#{first_date}' AND '#{last_date}'", :order => 'completed_at, started_on, start_time')
55
- result = {}
56
- works.each do |work|
57
- day_of_week = work.started_on.cwday - 1
58
- result[work.project] ||= []
59
- result[work.project][day_of_week] ||= BigDecimal('0')
60
- result[work.project][day_of_week] += work.hours
61
- end
62
- result.values.each {|project_totals| project_totals[6] ||= nil}
63
- result.values.each {|project_totals| (0..6).each {|i| project_totals[i] = nil if project_totals[i] == 0}}
64
- result
65
- end
66
-
67
- # Return a hash with an array of work totals per day:
68
- # {
69
- # project1.id => [[m, t, w, t, f, s, s], [m, t, w, t, f, s, s]],
70
- # project2.id => [<work for monday>, 0, <work for wednesday>, <work for thursday>, <work for friday>, 0, <work for sunday>]
71
- # }
72
- def self.work_totals_for_week(year, week_no, user = current_user)
73
- first = Date.commercial(year, week_no, 1)
74
- last = first + 6
75
- works = find(:all, :conditions => "completed_at IS NOT NULL AND started_on BETWEEN '#{first}' AND '#{last}'", :order => 'started_on, start_time, completed_at')
76
- totals_per_project = {}
77
- works.map{|w| w.project}.uniq.each do |project|
78
- totals_per_project[project.id] = [[], []]
79
- (0..6).each do |day|
80
- works_for_day = works.select {|work| (work.project == project) && (work.started_on == (first + day)) && ((user.nil? && work.user_id.nil?) || (user && work.user_id == user.id)) }
81
- invoice_works_for_day = works_for_day.select {|work| work.invoice? }
82
- internal_works_for_day = works_for_day.select {|work| !work.invoice? }
83
-
84
- invoice_day_total = invoice_works_for_day.reduce(BigDecimal('0')){|total, work| total += work.hours}
85
- internal_day_total = internal_works_for_day.reduce(BigDecimal('0')){|total, work| total += work.hours}
86
- totals_per_project[project.id][0] << invoice_day_total
87
- totals_per_project[project.id][1] << internal_day_total
88
- end
89
- end
90
- totals_per_project.reject! do |project_id, day_totals|
91
- !day_totals[0].find{|day_total| day_total > 0} && !day_totals[1].find{|day_total| day_total > 0}
92
- end
93
- totals_per_project
94
- end
95
-
96
- def self.find_work_for_day(date, user = current_user)
97
- Work.find(:all, :conditions => "started_on = '#{date}' AND user_id = #{user.id}",
98
- :order => 'start_time, completed_at')
99
- end
100
-
101
- def self.work_sum_per_month(year, month_no, user = current_user)
102
- first = Date.new(year, month_no, 1)
103
- last = Date.new(year, month_no, -1)
104
- count = find_by_sql("select sum(hours) from works where completed_at IS NOT NULL AND started_on BETWEEN '#{first}' AND '#{last}' AND user_id = #{user.id}")[0]['sum']
105
- count ? count : 0
106
- end
107
-
108
- def self.invoice_work_sum_per_month(year, month_no, user = current_user)
109
- first = Date.new(year, month_no, 1)
110
- last = Date.new(year, month_no, -1)
111
- count = find_by_sql("select sum(hours) from works where invoice = true AND completed_at IS NOT NULL AND started_on BETWEEN '#{first}' AND '#{last}' AND user_id = #{user.id}")[0]['sum']
112
- count ? count : 0
113
- end
114
-
115
- def self.work_sum_per_week(year, week_no, user = current_user)
116
- first = Date.commercial(year, week_no, 1)
117
- last = first + 6
118
- count = find_by_sql("select sum(hours) from works where completed_at IS NOT NULL AND started_on BETWEEN '#{first}' AND '#{last}' AND user_id = #{user.id}")[0]['sum']
119
- count ? count : 0
120
- end
121
-
122
- def self.invoice_work_sum_per_week(year, week_no, user = current_user)
123
- first = Date.commercial(year, week_no, 1)
124
- last = first + 6
125
- count = find_by_sql("select sum(hours) from works where invoice = true AND completed_at IS NOT NULL AND started_on BETWEEN '#{first}' AND '#{last}' AND user_id = #{user.id}")[0]['sum']
126
- count ? count : 0
127
- end
128
-
129
- def self.work_sum_per_day(date, user = current_user)
130
- count = find_by_sql("select sum(hours) from works where completed_at IS NOT NULL AND started_on = '#{date}' AND user_id = #{user.id}")[0]['sum']
131
- count ? count : 0
132
- end
133
-
134
- def self.invoice_work_sum_per_day(date, user = current_user)
135
- count = find_by_sql("select sum(hours) from works where invoice = true AND completed_at IS NOT NULL AND started_on = '#{date}' AND user_id = #{user.id}")[0]['sum']
136
- count ? count : 0
137
- end
138
-
139
-
140
- def started?
141
- completed_at.nil?
142
- end
143
-
144
- def started_at
145
- started_on && start_time && started_on.at(start_time)
146
- end
147
-
148
- def started_at=(new_value)
149
- case new_value
150
- when String:
151
- t = Time.parse(new_value)
152
- when Time:
153
- t = new_value
154
- else
155
- raise "Illegal argument: #{new_value.inspect}"
156
- end
157
- self.started_on = Date.new(t.year, t.month, t.day)
158
- self.start_time = TimeOfDay.new(t.hour, t.min)
159
- end
160
-
161
- def started_on=(new_value)
162
- super
163
- self.completed_at_time = completed_at_time.to_s if self.started_on_was.nil?
164
- self.started_on
165
- end
166
-
167
- def completed_at_time
168
- completed_at && completed_at.time_of_day
169
- end
170
-
171
- def completed_at_time=(new_value)
172
- new_value.strip!
173
- if new_value.empty?
174
- self.completed_at = nil
175
- return
176
- end
177
- time_of_day = TimeOfDay.parse(new_value)
178
- date = started_on || completed_at.try(:to_date) || Date.today
179
- self.completed_at = date.at time_of_day
180
- end
181
-
182
- def calculate_hours!
183
- return unless started_at && completed_at
184
- self.hours = calculate_hours
185
- end
186
-
187
- def calculate_hours
188
- BigDecimal(((completed_at - started_at) / 3600).to_s).round(3)
189
- end
190
-
191
- end
@@ -1,11 +0,0 @@
1
- class WorkLock < ActiveRecord::Base
2
- extend UserSystem
3
-
4
- belongs_to :user
5
-
6
- def self.find_by_week(year, week)
7
- first_date = Date.commercial(year, week, 1)
8
- last_date = first_date + 6
9
- result = self.find(:first, :conditions => ['user_id = ? AND start_on <= ? AND end_on >= ?', current_user.id, first_date, last_date])
10
- end
11
- end
@@ -1,60 +0,0 @@
1
- class WorkLockNagger
2
- include Rails.application.routes.url_helpers
3
-
4
- def initialize(start_delay = 1)
5
- @start_delay = start_delay
6
- end
7
-
8
- def nag
9
- sleep @start_delay.minute
10
- puts "Work Lock Nagger started"
11
- begin
12
- if File.exists? APP_CONFIG_FILE
13
- config = YAML::load(ERB.new(IO.read(APP_CONFIG_FILE)).result) || {}
14
- app_url = config[:app_url]
15
- end
16
- if app_url
17
- url = app_url + 'works/weekly_work_sheet'
18
- else
19
- host = Socket::gethostname
20
- port = config && config[:port] || 3000
21
- url = url_for(:host => host, :port => port, :controller => 'works', :action => :weekly_work_sheet)
22
- end
23
- rescue Exception => e
24
- puts "Work Lock Nagger Exception"
25
- puts e.message
26
- puts e.backtrace
27
- exit 1
28
- end
29
-
30
- loop do
31
- puts "Nagging"
32
- begin
33
- late_work_locks = WorkLock.find(
34
- :all,
35
- :conditions => ["end_on < ? and not exists (select id from work_locks wl2 where wl2.user_id = work_locks.user_id and wl2.end_on > work_locks.end_on)", 1.week.ago.monday ])
36
-
37
- late_users = late_work_locks.map{|wl| wl.user}.uniq
38
- late_users.each do |u|
39
- missing_date = (u.work_locks.last.end_on + 7)
40
- year = missing_date.year
41
- week = missing_date.cweek
42
- WorkLockNotify.deliver_nag(u, week, url + "/#{year}/#{week}")
43
- end
44
- now = Time.now
45
- next_nag_time = Time.local(now.year, now.month, now.day, 10, 0, 0)
46
- next_nag_time += 1.day if next_nag_time <= now
47
- sleep_duration = next_nag_time - now
48
- puts "Sleeping #{sleep_duration.to_i / 3600} hours #{(sleep_duration.to_i % 3600) / 60} minutes and #{sleep_duration.to_i % 60} seconds."
49
- puts "From #{now} to #{next_nag_time}."
50
- sleep sleep_duration
51
- rescue Exception => e
52
- p e
53
- puts e.backtrace
54
- sleep 5.minutes
55
- end
56
- puts "Nag ends"; STDOUT.flush
57
- end
58
- end
59
-
60
- end