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,49 +0,0 @@
1
- class Project < ActiveRecord::Base
2
- validates_presence_of :name
3
- validates_length_of :name, :allow_nil => false, :maximum => 64
4
- validates_uniqueness_of :name
5
- validates_inclusion_of :track_todo, :in => [true, false], :allow_nil => true, :message => I18n.translate('activerecord.errors.messages')[:blank]
6
- validates_inclusion_of :enable_subtasks, :in => [true, false], :allow_nil => false, :message => I18n.translate('activerecord.errors.messages')[:blank]
7
- validates_inclusion_of :enable_customer, :in => [true, false], :allow_nil => true, :message => I18n.translate('activerecord.errors.messages')[:blank]
8
- validates_inclusion_of :enable_users, :in => [true, false], :allow_nil => true, :message => I18n.translate('activerecord.errors.messages')[:blank]
9
-
10
- belongs_to :customer
11
- has_many :tasks, :order => 'period_id, position', :dependent => :destroy
12
- has_many :unplanned_tasks, :class_name => 'Task', :conditions => 'period_id IS NULL', :order => 'position'
13
- has_many :works, :dependent => :destroy
14
- has_and_belongs_to_many :work_lock_subscribers, :class_name => 'User', :join_table => "work_lock_subscriptions", :foreign_key => "project_id", :association_foreign_key => 'subscriber_user_id'
15
-
16
- validates_inclusion_of :track_times, :in => [true, false], :message => I18n.translate('activerecord.errors.messages')[:blank]
17
-
18
- def active_tasks
19
- tasks.find(:all, :conditions => "finished_at IS NULL", :order => "position")
20
- end
21
-
22
- def recent_tasks
23
- Task.find(:all, :conditions => "period_id = #{periods.first.id} AND (position IS NOT NULL OR finished_at >= '#{1.week.ago.iso8601}')", :order => "position, finished_at")
24
- end
25
-
26
- def tasks_with_children
27
- tasks.map {|t| t.self_with_children}.flatten
28
- end
29
-
30
- def first_active_period
31
- t = active_tasks
32
- periods = t.map {|t| t.period}.compact.uniq
33
- periods = periods.select {|p| p.active?}
34
- periods.sort_by {|p| p.end_on}.first
35
- end
36
-
37
- def enable_invoicing?
38
- true
39
- end
40
-
41
- def track_done?
42
- true
43
- end
44
-
45
- def total_hours
46
- works.inject(BigDecimal('0')) {|total, work| total + work.hours}
47
- end
48
-
49
- end
@@ -1,13 +0,0 @@
1
- class PublicHoliday < ActiveRecord::Base
2
- # Return an array of either a public holiday or nil for each day of the given week.
3
- def self.find_by_week(year, week)
4
- first_date = Date.commercial(year, week, 1)
5
- last_date = first_date + 6
6
- results = self.find(:all, :conditions => ['"on" BETWEEN ? AND ?', first_date, last_date], :order => '"on"')
7
- (0..6).each do |day|
8
- results.insert(day, nil) if results[day] && results[day].on > first_date + day
9
- end
10
- results
11
- end
12
-
13
- end
@@ -1,29 +0,0 @@
1
- class ReportFilter
2
- attr_accessor :title
3
- attr_reader :start_on
4
- attr_reader :end_on
5
- attr_reader :page_size
6
-
7
- def initialize(attributes)
8
- date = Date.today - 5
9
- @start_on = Date.civil(date.year, date.month, 01)
10
- @end_on = Date.civil(date.year, date.month, -1)
11
- @page_size = 1000
12
-
13
- if attributes
14
- attributes = attributes.clone
15
-
16
- start_on_param = attributes.delete(:start_on)
17
- @start_on = Date.parse(start_on_param) if start_on_param && start_on_param.size > 0
18
-
19
- end_on_param = attributes.delete(:end_on)
20
- @end_on = Date.parse(end_on_param) if end_on_param && end_on_param.size > 0
21
-
22
- page_size_param = attributes.delete(:page_size)
23
- @page_size = page_size_param.to_i if page_size_param.to_i > 0
24
-
25
- raise "Unknown parameters: #{attributes.inspect}" unless attributes.empty?
26
- end
27
- end
28
-
29
- end
@@ -1,8 +0,0 @@
1
- class SearchResult
2
- attr_reader :title, :options
3
-
4
- def initialize(title, options)
5
- @title = title
6
- @options = options
7
- end
8
- end
@@ -1,41 +0,0 @@
1
- require 'action_view/helpers/url_helper'
2
-
3
- class Sidebar
4
- include Rails.application.routes.url_helpers
5
- include ActionView::Helpers::TagHelper
6
- include ERB::Util
7
-
8
- def initialize(controller)
9
- @controller = controller
10
- end
11
-
12
- def blocks(period)
13
- @period = period
14
- # TODO (uwe): This does not scale!
15
- #periods = Period.find(:all).select {|period| period.active_or_future?(true) && period.party.includes?(user)}
16
- periods = Period.find_active_or_future(true)
17
-
18
- blocks = periods.sort_by {|p| p.required_speed}.reverse.map do |period|
19
- content = @controller.render_to_string :partial => '/periods/sidebar_block',
20
- :locals => {:period => period}
21
-
22
- { :id => period.id,
23
- :title => "#{period.party.name}##{period.position} (#{'%0.1f' % period.required_speed})",
24
- :options => {:controller => 'periods', :action => :show, :id => period},
25
- :content => content
26
- }
27
- end
28
- started_tasks = Task.find_started
29
- if not started_tasks.empty?
30
- links = started_tasks.map do |task|
31
- "<li><a href=\"#{url_for(:host => @controller.request.host_with_port, :controller => 'tasks', :action => 'list_started', :id => task.id)}\">#{task.description}</a></li>"
32
- end
33
- blocks.unshift({ :title => @controller.l(:started_tasks),
34
- :options => {:controller => 'tasks', :action => :list_started},
35
- :content => "<ul>#{links}"
36
- })
37
- end
38
- blocks
39
- end
40
-
41
- end
@@ -1,425 +0,0 @@
1
- require 'time_extras'
2
-
3
- class Task < ActiveRecord::Base
4
- extend UserSystem
5
- include UserSystem
6
-
7
- COMPLETED = 'COMPLETED'
8
- POSTPONED = 'POSTPONED'
9
- MOVED = 'MOVED'
10
- ABORTED = 'ABORTED'
11
-
12
- belongs_to :project
13
- belongs_to :period
14
- belongs_to :ancestor_task, :class_name => 'Task', :foreign_key => 'previous_task_id'
15
- belongs_to :customer
16
- has_many :descendant_tasks, :class_name => 'Task', :foreign_key => 'previous_task_id', :dependent => :destroy
17
- has_many :estimates, :order => 'created_at', :dependent => :destroy
18
- has_many :works, :order => 'completed_at', :dependent => :destroy
19
- has_many :task_files, :dependent => :destroy
20
- has_and_belongs_to_many :users
21
- belongs_to :creator, :class_name => 'User', :foreign_key => 'created_by'
22
- belongs_to :updater, :class_name => 'User', :foreign_key => 'updated_by'
23
-
24
- acts_as_list :scope => '#{parent_id ? "parent_id = #{parent_id}" : period_id ? "period_id = #{period_id}" : "period_id IS NULL AND parent_id IS NULL AND project_id = #{project_id}"} AND finished_at IS NULL'
25
- acts_as_tree :order => 'position'
26
-
27
- validates_presence_of :project_id, :if => Proc.new { |task| task.parent_id.nil? }
28
- validates_presence_of :parent_id, :if => Proc.new { |task| task.project_id.nil? }
29
- validates_presence_of :position, :on => :update, :if => Proc.new { |task| task.finished_at.nil? }
30
- validates_presence_of :finished_at, :on => :update, :if => Proc.new { |task| task.position.nil? }
31
- validates_presence_of :resolution, :if => :finished_at
32
- validates_presence_of :description, :if => :project_id
33
-
34
- validates_size_of :description, :maximum => 80, :if => :description
35
-
36
- #validates_uniqueness_of :description, :scope => :project_id, :if => Proc.new {|task| task.project_id && task.previous_task_id.nil?}
37
- validates_uniqueness_of :description, :scope => :period_id, :if => :period_id
38
- validates_uniqueness_of :position, :scope => :parent_id, :if => :parent_id, :allow_nil => true
39
- validates_uniqueness_of :position, :scope => :period_id, :if => :period_id, :allow_nil => true
40
- validates_uniqueness_of :position, :scope => [:period_id, :parent_id, :project_id], :if => Proc.new {|task| task.period_id.nil? && task.parent_id.nil?}, :allow_nil => true
41
-
42
- before_create {|record| record.created_by = current_user.id}
43
- before_save {|record| record.updated_by = current_user.id}
44
-
45
- validate do |r|
46
- if r.parent_id && (r.period_id || r.project_id)
47
- r.errors.add :parent_id, "A subtask may have neither period nor project set."
48
- end
49
- if r.new_record? && r.period && r.period.passed?
50
- r.errors.add :period_id, "You may not add a task to a past period."
51
- end
52
- end
53
-
54
- def self.find_open
55
- find(:all, :conditions => 'finished_at IS NULL', :order => 'description')
56
- end
57
-
58
- def self.find_started
59
- if current_user
60
- user_clause = " OR user_id = #{current_user.id}"
61
- end
62
- conditions = "start_time IS NOT NULL AND completed_at IS NULL AND (user_id IS NULL#{user_clause})"
63
- Work.find(:all, :conditions => conditions).map {|work| work.task}.compact.sort_by do |t|
64
- [t.root_task.project.name, t.root_task.period ? t.root_task.period.end_on : 0, t.position || 0]
65
- end
66
- end
67
-
68
- def self.recent_conditions
69
- return "finished_at >= '#{1.week.ago.iso8601}'"
70
- end
71
-
72
- def self.find_descendant(period_id, ancestor_task_id)
73
- candidate_tasks = Task.find :all,
74
- :conditions => ["id = ? OR previous_task_id = ?", ancestor_task_id, ancestor_task_id]
75
- candidate_tasks = candidate_tasks.select {|t| t.root_task.period_id == period_id}
76
- logger.error "Multiple descendants in period: #{period_id} #{ancestor_task_id}" if candidate_tasks.size > 1
77
- candidate_tasks[0]
78
- end
79
-
80
- def self_with_children
81
- [self] << children.map {|t| t.self_with_children}.flatten
82
- end
83
-
84
- def todo
85
- estimates.last ? estimates.last.todo : initial_estimate
86
- end
87
-
88
- def estimate(new_todo)
89
- return unless new_todo && new_todo != ''
90
- new_todo = new_todo.to_i
91
- if new_todo == 0
92
- finish(Task::COMPLETED, false)
93
- end
94
- previous_estimate = estimates.last
95
- new_estimate = Estimate.new
96
- if previous_estimate
97
- return if new_todo == previous_estimate.todo
98
- else
99
- return if new_todo == initial_estimate
100
- end
101
- now = Time.now
102
- if previous_estimate && (now < previous_estimate.created_at || now.strftime('%Y-%m-%DT%H:%M:%S') == previous_estimate.created_at.strftime('%Y-%m-%DT%H:%M:%S'))
103
- previous_estimate.todo = new_todo
104
- previous_estimate.user = current_user
105
- previous_estimate.save!
106
- else
107
- new_estimate.task_id = self.id
108
- new_estimate.todo = new_todo
109
- new_estimate.created_at = now
110
- new_estimate.user = current_user
111
- new_estimate.save!
112
- estimates << new_estimate
113
- end
114
- end
115
-
116
- def done
117
- nil
118
- end
119
-
120
- def done=(hours_done)
121
- return unless hours_done && hours_done != '' && BigDecimal(hours_done) != 0
122
- return if end_work(hours_done)
123
- new_work = Work.new
124
- new_work.hours = hours_done
125
- new_work.task_id = self.id
126
- new_work.completed_at = DateTime.now
127
- new_work.save!
128
- works << new_work
129
- end
130
-
131
- def total_done
132
- total = BigDecimal('0')
133
- works.each {|work| total += work.hours}
134
- total
135
- end
136
-
137
- def open
138
- if finished_at
139
- self.finished_at = nil
140
- self.resolution = nil
141
- self.position = nil
142
- insert_at 1
143
- estimate(initial_estimate)
144
- parent.open if parent
145
- end
146
- end
147
-
148
- def reopen
149
- if period && period.passed?
150
- raise "You cannot reopen a task in a period that is passed."
151
- else
152
- open
153
- save!
154
- children.each {|child_task| child_task.reopen}
155
- end
156
- self
157
- end
158
-
159
- def move_to_period(new_period)
160
- raise "Cannot move finished tasks" unless active?
161
- return self if new_period == period
162
-
163
- self.remove_from_list
164
- self.position = nil
165
-
166
- if self.period
167
- old_todo = self.todo
168
- if parent
169
- parent.move_to_period new_period
170
- end
171
- if leaf?
172
- self.finish((new_period.nil? || (new_period.party == self.period.party)) ? Task::POSTPONED : Task::MOVED, true)
173
- end
174
- existing_task = Task.find_descendant(new_period && new_period.id, ancestor_id)
175
- if existing_task ||= Task.find_by_period_id_and_previous_task_id(new_period && new_period.id, ancestor_id)
176
- raise "mismatch" unless existing_task.project == root_task.project
177
- raise "Mismatch" unless existing_task.period == new_period
178
- existing_task.open
179
- existing_task.previous_task_id = self.previous_task_id || self.id
180
- existing_task.description = self.description
181
- existing_task.users = self.users
182
- existing_task.save!
183
- existing_task.estimate(old_todo)
184
- return existing_task
185
- else
186
- new_task = Task.new
187
- new_task.previous_task_id = ancestor_id
188
- if parent
189
- new_parent = Task.find_descendant(new_period.id, parent.ancestor_id)
190
- new_task.parent = new_parent
191
- else
192
- new_task.project = root_task.project
193
- new_task.period = new_period
194
- end
195
- new_task.description = self.description
196
- new_task.initial_estimate = self.initial_estimate
197
- new_task.position = nil
198
- new_task.users = self.users
199
- new_task.save!
200
- new_task.insert_at 1
201
- new_task.estimate(old_todo)
202
- return new_task
203
- end
204
- else
205
- self.period_id = new_period && new_period.id
206
- self.period = new_period
207
- self.insert_at(1)
208
- self.position = 1
209
- self.move_to_bottom
210
- self.save!
211
- return self
212
- end
213
- end
214
-
215
- def grab
216
- self.users << current_user
217
- end
218
-
219
- def release
220
- self.users.delete current_user
221
- end
222
-
223
- def finish(resolution, save_work)
224
- unless finished_at || work_started?
225
- self.finished_at = Time.now
226
- self.resolution = resolution
227
- remove_from_list
228
- self.position = nil
229
- save!
230
- estimate(0) if save_work
231
- parent.check_finished(self.finished_at, resolution, save_work) if parent
232
- end
233
- end
234
-
235
- def check_finished(subtask_finsihed_at, resolution, save_work)
236
- return if self.finished_at
237
- children.each do |child_task|
238
- return if child_task.active?
239
- end
240
- finish(resolution, save_work)
241
- end
242
-
243
- def active?
244
- finished_at.nil? || work_started? || active_children?
245
- end
246
-
247
- def active_children?
248
- children.detect {|child| child.active?}
249
- end
250
-
251
- def finished?
252
- completed?
253
- end
254
-
255
- def completed?
256
- finished_at || completed_children?
257
- end
258
-
259
- def completed_children?
260
- children.detect {|child| child.completed?}
261
- end
262
-
263
- def loggable?
264
- active? && leaf?
265
- end
266
-
267
- def leaf?
268
- children.size == 0
269
- end
270
-
271
- def root?
272
- parent.nil?
273
- end
274
-
275
- def root_task
276
- root_task = self
277
- root_task = root_task.parent while root_task.parent
278
- root_task
279
- end
280
-
281
- def invoicing?
282
- root_task.project.enable_invoicing?
283
- end
284
-
285
- def track_done?
286
- project.track_done?
287
- end
288
-
289
- def track_times?
290
- project.try :track_times?
291
- end
292
-
293
- def track_todo?
294
- root_task.project.track_todo?
295
- end
296
-
297
- def enable_subtasks?
298
- root_task.project.enable_subtasks?
299
- end
300
-
301
- def enable_users?
302
- root_task.project.enable_users?
303
- end
304
-
305
- def enable_customer?
306
- root_task.project.enable_customer?
307
- end
308
-
309
- def enable_invoicing?
310
- root_task.project.enable_invoicing?
311
- end
312
-
313
- alias_method :old_period, :period
314
- def period
315
- old_period || root_task.old_period
316
- end
317
-
318
- alias_method :old_project, :project
319
- def project
320
- old_project || root_task.old_project
321
- end
322
-
323
- def depth
324
- root_task = self
325
- depth = 0
326
- while !root_task.root?
327
- root_task = root_task.parent
328
- depth += 1
329
- end
330
- depth
331
- end
332
-
333
- def estimate_data(date, actual=false)
334
- if children.empty?
335
- return 0 if actual && (resolution == ABORTED || resolution == POSTPONED)
336
- return 0 if finished_at && (date >= finished_at.to_date)
337
- estimate = Estimate.find(:first, :conditions => "task_id = #{id} AND created_at < '#{(date+1).to_s}'", :order => 'created_at DESC,id DESC')
338
- if estimate
339
- estimate.todo
340
- elsif actual || created_at < (date+1).to_time
341
- initial_estimate
342
- else
343
- 0
344
- end
345
- else
346
- total = BigDecimal('0')
347
- children.each {|child_task| total += child_task.estimate_data(date, actual)}
348
- total
349
- end
350
- end
351
-
352
- def work_data(date)
353
- return 0 if resolution == ABORTED
354
- relevant_works = Work.find(:all, :conditions => "task_id = #{id} AND completed_at < '#{(date+1).to_s}'")
355
- total = BigDecimal('0')
356
- relevant_works.each do |work|
357
- total += work.hours
358
- end
359
- total
360
- end
361
-
362
- def start_work
363
- return if work_started?
364
- open
365
- grab if current_user
366
- new_work = works.new
367
-
368
- # TODO (uwe): Only needed for rails 1.2.x branch. Remove when moving to 1.3 or 2.0.
369
- new_work.task = self
370
-
371
- new_work.started_on = Time.previous_quarter.to_date
372
- new_work.start_time = Time.previous_quarter.time_of_day
373
- if current_user
374
- last_work = current_user.works.select {|w| w.completed_at}.last
375
- else
376
- last_work = Work.find(:first, :conditions => 'completed_at IS NOT NULL', :order => 'completed_at DESC')
377
- end
378
- if last_work && last_work.completed_at > new_work.started_on.at(new_work.start_time)
379
- new_work.started_at = last_work.completed_at
380
- end
381
-
382
- new_work.user = current_user
383
- new_work.project_id = project.id
384
- new_work.save!
385
- works << new_work
386
- end
387
-
388
- def works_with_children
389
- works << children.map {|t| t.works_with_children}.flatten
390
- end
391
-
392
- def abort
393
- finish(Task::ABORTED, false)
394
- end
395
-
396
- def work_started?
397
- !started_work.nil?
398
- end
399
-
400
- def started_work
401
- started_works = works.select {|work| work.start_time && work.completed_at.nil?}
402
- if current_user
403
- started_by_user = started_works.select {|work| work.user == current_user}.last
404
- return started_by_user if started_by_user
405
- end
406
- started_works.select {|work| work.user.nil?}.last
407
- end
408
-
409
- def description_with_id
410
- "##{id}: #{description}"
411
- end
412
-
413
- def description_with_parents
414
- if parent.nil?
415
- "#{project.name}: #{description}"
416
- else
417
- "#{parent.description_with_parents} - #{description}"
418
- end
419
- end
420
-
421
- def ancestor_id
422
- previous_task_id || id
423
- end
424
-
425
- end