taskjuggler 3.3.0 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (338) hide show
  1. data/CHANGELOG +35 -0
  2. data/data/tjp.vim +21 -7
  3. data/lib/taskjuggler/Allocation.rb +27 -3
  4. data/lib/taskjuggler/Attributes.rb +3 -2
  5. data/lib/taskjuggler/HTMLDocument.rb +3 -1
  6. data/lib/taskjuggler/KateSyntax.rb +213 -0
  7. data/lib/taskjuggler/Limits.rb +22 -0
  8. data/lib/taskjuggler/Log.rb +1 -1
  9. data/lib/taskjuggler/MessageHandler.rb +20 -10
  10. data/lib/taskjuggler/PTNProxy.rb +6 -1
  11. data/lib/taskjuggler/Project.rb +10 -4
  12. data/lib/taskjuggler/ProjectFileParser.rb +1 -2
  13. data/lib/taskjuggler/ProjectFileScanner.rb +41 -42
  14. data/lib/taskjuggler/ResourceScenario.rb +41 -1
  15. data/lib/taskjuggler/RichText/Element.rb +8 -0
  16. data/lib/taskjuggler/RichText/Parser.rb +1 -1
  17. data/lib/taskjuggler/RichText/RTFReportLink.rb +20 -10
  18. data/lib/taskjuggler/RichText/Scanner.rb +54 -38
  19. data/lib/taskjuggler/RichText/SyntaxRules.rb +12 -0
  20. data/lib/taskjuggler/SheetReceiver.rb +1 -1
  21. data/lib/taskjuggler/TableColumnDefinition.rb +5 -1
  22. data/lib/taskjuggler/TaskJuggler.rb +2 -2
  23. data/lib/taskjuggler/TaskScenario.rb +117 -33
  24. data/lib/taskjuggler/TextParser.rb +2 -4
  25. data/lib/taskjuggler/TextParser/MacroTable.rb +7 -0
  26. data/lib/taskjuggler/TextParser/Scanner.rb +10 -9
  27. data/lib/taskjuggler/Tj3Config.rb +1 -1
  28. data/lib/taskjuggler/TjTime.rb +5 -28
  29. data/lib/taskjuggler/TjpSyntaxRules.rb +85 -13
  30. data/lib/taskjuggler/UTF8String.rb +5 -0
  31. data/lib/taskjuggler/XMLElement.rb +2 -1
  32. data/lib/taskjuggler/apps/Tj3.rb +29 -5
  33. data/lib/taskjuggler/daemon/ProcessIntercom.rb +1 -1
  34. data/lib/taskjuggler/daemon/ProjectServer.rb +5 -2
  35. data/lib/taskjuggler/daemon/ReportServer.rb +7 -4
  36. data/lib/taskjuggler/reports/AccountListRE.rb +2 -0
  37. data/lib/taskjuggler/reports/CSVFile.rb +24 -2
  38. data/lib/taskjuggler/reports/GanttChart.rb +3 -2
  39. data/lib/taskjuggler/reports/GanttHeader.rb +18 -18
  40. data/lib/taskjuggler/reports/GanttLoadStack.rb +1 -1
  41. data/lib/taskjuggler/reports/MspXmlRE.rb +5 -1
  42. data/lib/taskjuggler/reports/Report.rb +29 -18
  43. data/lib/taskjuggler/reports/ReportTable.rb +5 -1
  44. data/lib/taskjuggler/reports/ReportTableCell.rb +16 -10
  45. data/lib/taskjuggler/reports/ResourceListRE.rb +2 -0
  46. data/lib/taskjuggler/reports/TableReport.rb +23 -16
  47. data/lib/taskjuggler/reports/TaskListRE.rb +2 -0
  48. data/lib/taskjuggler/reports/TraceReport.rb +1 -1
  49. data/manual/Installation +5 -1
  50. data/manual/Intro +1 -0
  51. data/manual/Rich_Text_Attributes +5 -0
  52. data/manual/TaskJuggler_Internals +82 -34
  53. data/manual/Tutorial +1 -1
  54. data/manual/html/Day_To_Day_Juggling.html +1 -1
  55. data/manual/html/Getting_Started.html +1 -1
  56. data/manual/html/How_To_Contribute.html +1 -1
  57. data/manual/html/Installation.html +3 -2
  58. data/manual/html/Intro.html +2 -1
  59. data/manual/html/Reporting_Bugs.html +1 -1
  60. data/manual/html/Rich_Text_Attributes.html +2 -1
  61. data/manual/html/Software.html +1 -1
  62. data/manual/html/TaskJuggler_2x_Migration.html +1 -1
  63. data/manual/html/TaskJuggler_Internals.html +15 -13
  64. data/manual/html/The_TaskJuggler_Syntax.html +1 -1
  65. data/manual/html/Tutorial.html +2 -2
  66. data/manual/html/account.html +1 -1
  67. data/manual/html/account.task.html +1 -1
  68. data/manual/html/accountprefix.html +1 -1
  69. data/manual/html/accountreport.html +14 -2
  70. data/manual/html/accountroot.html +1 -1
  71. data/manual/html/active.html +1 -1
  72. data/manual/html/adopt.task.html +1 -1
  73. data/manual/html/aggregate.html +1 -1
  74. data/manual/html/alert.html +1 -1
  75. data/manual/html/alertlevels.html +1 -1
  76. data/manual/html/allocate.html +1 -1
  77. data/manual/html/alphabet.html +1 -1
  78. data/manual/html/alternative.html +1 -1
  79. data/manual/html/author.html +3 -3
  80. data/manual/html/auxdir.html +69 -0
  81. data/manual/html/balance.html +3 -3
  82. data/manual/html/booking.resource.html +1 -1
  83. data/manual/html/booking.task.html +1 -1
  84. data/manual/html/caption.html +1 -1
  85. data/manual/html/cellcolor.column.html +1 -1
  86. data/manual/html/celltext.column.html +1 -1
  87. data/manual/html/center.html +1 -1
  88. data/manual/html/charge.html +1 -1
  89. data/manual/html/chargeset.html +1 -1
  90. data/manual/html/columnid.html +21 -9
  91. data/manual/html/columns.html +2 -2
  92. data/manual/html/complete.html +1 -1
  93. data/manual/html/copyright.html +1 -1
  94. data/manual/html/credits.html +1 -1
  95. data/manual/html/currency.html +1 -1
  96. data/manual/html/currencyformat.html +1 -1
  97. data/manual/html/dailymax.html +1 -1
  98. data/manual/html/dailymin.html +1 -1
  99. data/manual/html/dailyworkinghours.html +1 -1
  100. data/manual/html/date.extend.html +1 -1
  101. data/manual/html/date.html +1 -1
  102. data/manual/html/definitions.html +1 -1
  103. data/manual/html/depends.html +1 -1
  104. data/manual/html/details.html +1 -1
  105. data/manual/html/disabled.html +1 -1
  106. data/manual/html/duration.html +1 -1
  107. data/manual/html/efficiency.html +1 -1
  108. data/manual/html/effort.html +1 -1
  109. data/manual/html/email.html +1 -1
  110. data/manual/html/enabled.html +1 -1
  111. data/manual/html/end.column.html +1 -1
  112. data/manual/html/end.html +1 -1
  113. data/manual/html/end.limit.html +1 -1
  114. data/manual/html/end.report.html +1 -1
  115. data/manual/html/end.timesheet.html +1 -1
  116. data/manual/html/endcredit.html +1 -1
  117. data/manual/html/epilog.html +1 -1
  118. data/manual/html/export.html +1 -1
  119. data/manual/html/extend.html +1 -1
  120. data/manual/html/fail.html +1 -1
  121. data/manual/html/fdl.html +1 -1
  122. data/manual/html/flags.account.html +1 -1
  123. data/manual/html/flags.html +1 -1
  124. data/manual/html/flags.journalentry.html +1 -1
  125. data/manual/html/flags.report.html +1 -1
  126. data/manual/html/flags.resource.html +1 -1
  127. data/manual/html/flags.statussheet.html +1 -1
  128. data/manual/html/flags.task.html +1 -1
  129. data/manual/html/flags.timesheet.html +1 -1
  130. data/manual/html/fontcolor.column.html +1 -1
  131. data/manual/html/footer.html +1 -1
  132. data/manual/html/formats.export.html +1 -1
  133. data/manual/html/formats.html +1 -1
  134. data/manual/html/functions.html +1 -1
  135. data/manual/html/gapduration.html +1 -1
  136. data/manual/html/gaplength.html +1 -1
  137. data/manual/html/halign.center.html +1 -1
  138. data/manual/html/halign.column.html +1 -1
  139. data/manual/html/halign.left.html +1 -1
  140. data/manual/html/halign.right.html +1 -1
  141. data/manual/html/hasalert.html +1 -1
  142. data/manual/html/header.html +1 -1
  143. data/manual/html/headline.html +1 -1
  144. data/manual/html/height.html +1 -1
  145. data/manual/html/hideaccount.html +1 -1
  146. data/manual/html/hidejournalentry.html +1 -1
  147. data/manual/html/hidereport.html +1 -1
  148. data/manual/html/hideresource.html +1 -1
  149. data/manual/html/hidetask.html +1 -1
  150. data/manual/html/icalreport.html +1 -1
  151. data/manual/html/include.macro.html +1 -1
  152. data/manual/html/include.project.html +1 -1
  153. data/manual/html/include.properties.html +1 -1
  154. data/manual/html/index.html +1 -1
  155. data/manual/html/inherit.extend.html +1 -1
  156. data/manual/html/interval1.html +1 -1
  157. data/manual/html/interval2.html +1 -1
  158. data/manual/html/interval3.html +1 -1
  159. data/manual/html/interval4.html +1 -1
  160. data/manual/html/isactive.html +1 -1
  161. data/manual/html/ischildof.html +1 -1
  162. data/manual/html/isdependencyof.html +1 -1
  163. data/manual/html/isdutyof.html +1 -1
  164. data/manual/html/isfeatureof.html +1 -1
  165. data/manual/html/isleaf.html +1 -1
  166. data/manual/html/ismilestone.html +1 -1
  167. data/manual/html/isongoing.html +1 -1
  168. data/manual/html/isresource.html +1 -1
  169. data/manual/html/isresponsibilityof.html +1 -1
  170. data/manual/html/istask.html +1 -1
  171. data/manual/html/journalattributes.html +1 -1
  172. data/manual/html/journalentry.html +1 -1
  173. data/manual/html/journalmode.html +1 -1
  174. data/manual/html/leaveallowance.html +1 -1
  175. data/manual/html/leaves.html +1 -1
  176. data/manual/html/left.html +1 -1
  177. data/manual/html/length.html +1 -1
  178. data/manual/html/limits.allocate.html +1 -1
  179. data/manual/html/limits.html +1 -1
  180. data/manual/html/limits.resource.html +1 -1
  181. data/manual/html/limits.task.html +1 -1
  182. data/manual/html/listitem.column.html +1 -1
  183. data/manual/html/listtype.column.html +1 -1
  184. data/manual/html/loadunit.html +1 -1
  185. data/manual/html/logicalexpression.html +1 -1
  186. data/manual/html/logicalflagexpression.html +1 -1
  187. data/manual/html/macro.html +1 -1
  188. data/manual/html/managers.html +1 -1
  189. data/manual/html/mandatory.html +1 -1
  190. data/manual/html/maxend.html +1 -1
  191. data/manual/html/maximum.html +1 -1
  192. data/manual/html/maxstart.html +1 -1
  193. data/manual/html/milestone.html +1 -1
  194. data/manual/html/minend.html +1 -1
  195. data/manual/html/minimum.html +1 -1
  196. data/manual/html/minstart.html +1 -1
  197. data/manual/html/monthlymax.html +1 -1
  198. data/manual/html/monthlymin.html +1 -1
  199. data/manual/html/navbar.html +9 -1
  200. data/manual/html/navigator.html +1 -1
  201. data/manual/html/newtask.html +1 -1
  202. data/manual/html/nikureport.html +1 -1
  203. data/manual/html/note.task.html +1 -1
  204. data/manual/html/now.html +1 -1
  205. data/manual/html/numberformat.html +1 -1
  206. data/manual/html/onend.html +1 -1
  207. data/manual/html/onstart.html +1 -1
  208. data/manual/html/opennodes.html +1 -1
  209. data/manual/html/overtime.booking.html +1 -1
  210. data/manual/html/period.column.html +1 -1
  211. data/manual/html/period.limit.html +1 -1
  212. data/manual/html/period.report.html +1 -1
  213. data/manual/html/period.task.html +1 -1
  214. data/manual/html/persistent.html +1 -1
  215. data/manual/html/precedes.html +1 -1
  216. data/manual/html/priority.html +1 -1
  217. data/manual/html/priority.timesheet.html +1 -1
  218. data/manual/html/project.html +1 -1
  219. data/manual/html/projectid.html +1 -1
  220. data/manual/html/projectid.task.html +1 -1
  221. data/manual/html/projectids.html +1 -1
  222. data/manual/html/projection.html +1 -1
  223. data/manual/html/prolog.html +1 -1
  224. data/manual/html/properties.html +1 -1
  225. data/manual/html/purge.html +1 -1
  226. data/manual/html/rate.html +1 -1
  227. data/manual/html/rate.resource.html +3 -3
  228. data/manual/html/rawhtmlhead.html +68 -0
  229. data/manual/html/reference.extend.html +3 -3
  230. data/manual/html/remaining.html +1 -1
  231. data/manual/html/replace.html +1 -1
  232. data/manual/html/reportprefix.html +1 -1
  233. data/manual/html/resource.html +1 -1
  234. data/manual/html/resourceattributes.html +1 -1
  235. data/manual/html/resourceprefix.html +1 -1
  236. data/manual/html/resourcereport.html +14 -2
  237. data/manual/html/resourceroot.html +1 -1
  238. data/manual/html/resources.limit.html +1 -1
  239. data/manual/html/responsible.html +1 -1
  240. data/manual/html/richtext.extend.html +1 -1
  241. data/manual/html/right.html +1 -1
  242. data/manual/html/rollupaccount.html +1 -1
  243. data/manual/html/rollupresource.html +1 -1
  244. data/manual/html/rolluptask.html +1 -1
  245. data/manual/html/scale.column.html +1 -1
  246. data/manual/html/scenario.html +1 -1
  247. data/manual/html/scenario.ical.html +1 -1
  248. data/manual/html/scenarios.export.html +1 -1
  249. data/manual/html/scenarios.html +1 -1
  250. data/manual/html/scenariospecific.extend.html +1 -1
  251. data/manual/html/scheduled.html +1 -1
  252. data/manual/html/scheduling.html +2 -1
  253. data/manual/html/select.html +1 -1
  254. data/manual/html/selfcontained.html +1 -1
  255. data/manual/html/shift.allocate.html +1 -1
  256. data/manual/html/shift.html +1 -1
  257. data/manual/html/shift.resource.html +1 -1
  258. data/manual/html/shift.task.html +1 -1
  259. data/manual/html/shift.timesheet.html +1 -1
  260. data/manual/html/shifts.allocate.html +1 -1
  261. data/manual/html/shifts.resource.html +1 -1
  262. data/manual/html/shifts.task.html +1 -1
  263. data/manual/html/shorttimeformat.html +1 -1
  264. data/manual/html/sloppy.booking.html +1 -1
  265. data/manual/html/sloppy.projection.html +1 -1
  266. data/manual/html/sortaccounts.html +1 -1
  267. data/manual/html/sortjournalentries.html +1 -1
  268. data/manual/html/sortresources.html +1 -1
  269. data/manual/html/sorttasks.html +1 -1
  270. data/manual/html/start.column.html +1 -1
  271. data/manual/html/start.html +1 -1
  272. data/manual/html/start.limit.html +1 -1
  273. data/manual/html/start.report.html +1 -1
  274. data/manual/html/startcredit.html +1 -1
  275. data/manual/html/status.statussheet.html +1 -1
  276. data/manual/html/status.timesheet.html +1 -1
  277. data/manual/html/statussheet.html +1 -1
  278. data/manual/html/statussheetreport.html +1 -1
  279. data/manual/html/strict.projection.html +1 -1
  280. data/manual/html/summary.html +1 -1
  281. data/manual/html/supplement.html +1 -1
  282. data/manual/html/supplement.resource.html +1 -1
  283. data/manual/html/supplement.task.html +1 -1
  284. data/manual/html/tagfile.html +2 -2
  285. data/manual/html/task.html +1 -1
  286. data/manual/html/task.statussheet.html +1 -1
  287. data/manual/html/task.timesheet.html +1 -1
  288. data/manual/html/taskattributes.html +1 -1
  289. data/manual/html/taskprefix.html +1 -1
  290. data/manual/html/taskreport.html +14 -2
  291. data/manual/html/taskroot.export.html +1 -1
  292. data/manual/html/taskroot.html +1 -1
  293. data/manual/html/text.extend.html +1 -1
  294. data/manual/html/textreport.html +14 -2
  295. data/manual/html/timeformat.html +3 -3
  296. data/manual/html/timeformat1.html +67 -0
  297. data/manual/html/timeformat2.html +67 -0
  298. data/manual/html/timeoff.nikureport.html +3 -3
  299. data/manual/html/timesheet.html +1 -1
  300. data/manual/html/timesheetreport.html +1 -1
  301. data/manual/html/timezone.export.html +1 -1
  302. data/manual/html/timezone.html +1 -1
  303. data/manual/html/timezone.report.html +1 -1
  304. data/manual/html/timezone.shift.html +1 -1
  305. data/manual/html/timingresolution.html +1 -1
  306. data/manual/html/title.column.html +1 -1
  307. data/manual/html/title.html +1 -1
  308. data/manual/html/toc.html +270 -242
  309. data/manual/html/tooltip.column.html +1 -1
  310. data/manual/html/tracereport.html +14 -2
  311. data/manual/html/trackingscenario.html +1 -1
  312. data/manual/html/treelevel.html +1 -1
  313. data/manual/html/vacation.html +1 -1
  314. data/manual/html/vacation.resource.html +1 -1
  315. data/manual/html/vacation.shift.html +1 -1
  316. data/manual/html/warn.html +1 -1
  317. data/manual/html/weeklymax.html +1 -1
  318. data/manual/html/weeklymin.html +1 -1
  319. data/manual/html/weekstartsmonday.html +1 -1
  320. data/manual/html/weekstartssunday.html +1 -1
  321. data/manual/html/width.column.html +1 -1
  322. data/manual/html/width.html +1 -1
  323. data/manual/html/work.html +1 -1
  324. data/manual/html/workinghours.project.html +1 -1
  325. data/manual/html/workinghours.resource.html +1 -1
  326. data/manual/html/workinghours.shift.html +1 -1
  327. data/manual/html/yearlyworkingdays.html +1 -1
  328. data/tasks/kate.rake +8 -0
  329. data/test/TestSuite/HTML-Reports/Calendars.tjp +10 -0
  330. data/test/TestSuite/Scheduler/Correct/PersistentResources-2.tjp +33 -0
  331. data/test/TestSuite/Scheduler/Correct/PersistentResources.tjp +30 -0
  332. data/test/TestSuite/Scheduler/Correct/PriorityInversion.tjp +2 -0
  333. data/test/TestSuite/Syntax/Correct/Macro-4.tjp +4 -0
  334. data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
  335. data/test/test_BatchProcessor.rb +1 -1
  336. data/test/test_CSVFile.rb +10 -0
  337. data/test/test_RichText.rb +20 -0
  338. metadata +38 -9
@@ -27,6 +27,8 @@ class TaskJuggler
27
27
  def initialize(report)
28
28
  super
29
29
  @table = ReportTable.new
30
+ @table.selfcontained = report.get('selfcontained')
31
+ @table.auxDir = report.get('auxdir')
30
32
  end
31
33
 
32
34
  # Generate the table in the intermediate format.
@@ -39,6 +39,8 @@ class TaskJuggler
39
39
  'balance' => [ 'Balance', true, :right, true ],
40
40
  'bsi' => [ 'BSI', false, :left, false ],
41
41
  'closedtasks' => [ 'Closed Tasks', true, :right, true ],
42
+ 'competitorcount' => [ 'Competitor count', true, :right, true ],
43
+ 'competitors' => [ 'Competitors', true, :left, true ],
42
44
  'complete' => [ 'Completion', false, :right, true ],
43
45
  'cost' => [ 'Cost', true, :right, true ],
44
46
  'duration' => [ 'Duration', true, :right, true ],
@@ -66,6 +68,7 @@ class TaskJuggler
66
68
  'responsible' => [ 'Responsible', false, :left, true ],
67
69
  'revenue' => [ 'Revenue', true, :right, true ],
68
70
  'scenario' => [ 'Scenario', false, :left, true ],
71
+ 'scheduling' => [ 'Scheduling Mode', true, :left, true ],
69
72
  'sickleave' => [ 'Sick Leave', true, :right, true ],
70
73
  'specialleave' => [ 'Special Leave', true, :right, true ],
71
74
  'status' => [ 'Status', false, :left, true ],
@@ -336,7 +339,7 @@ class TaskJuggler
336
339
  # set so that the lines of the Gantt chart line up with the lines of the
337
340
  # table.
338
341
  gantt = GanttChart.new(a('now'),
339
- a('weekStartsMonday'), self)
342
+ a('weekStartsMonday'), columnDef, self)
340
343
 
341
344
  gantt.generateByScale(rStart, rEnd, columnDef.scale)
342
345
  # The header consists of 2 lines separated by a 1 pixel boundary.
@@ -352,23 +355,23 @@ class TaskJuggler
352
355
  @table.equiLines = true
353
356
  when 'hourly'
354
357
  genCalChartHeader(columnDef, rStart.midnight, rEnd, :sameTimeNextHour,
355
- :weekdayAndDate, :hour)
358
+ '%A %Y-%m-%d', '%H')
356
359
  when 'daily'
357
360
  genCalChartHeader(columnDef, rStart.midnight, rEnd, :sameTimeNextDay,
358
- :monthAndYear, :day)
361
+ '%b %Y', '%d')
359
362
  when 'weekly'
360
363
  genCalChartHeader(columnDef,
361
364
  rStart.beginOfWeek(a('weekStartsMonday')), rEnd,
362
- :sameTimeNextWeek, :monthAndYear, :day)
365
+ :sameTimeNextWeek, '%b %Y', '%d')
363
366
  when 'monthly'
364
367
  genCalChartHeader(columnDef, rStart.beginOfMonth, rEnd,
365
- :sameTimeNextMonth, :year, :shortMonthName)
368
+ :sameTimeNextMonth, '%Y', '%b')
366
369
  when 'quarterly'
367
370
  genCalChartHeader(columnDef, rStart.beginOfQuarter, rEnd,
368
- :sameTimeNextQuarter, :year, :quarterName)
371
+ :sameTimeNextQuarter, '%Y', 'Q%Q')
369
372
  when 'yearly'
370
373
  genCalChartHeader(columnDef, rStart.beginOfYear, rEnd, :sameTimeNextYear,
371
- nil, :year)
374
+ nil, '%Y')
372
375
  else
373
376
  # This is the most common case. It does not need any special treatment.
374
377
  # We just set the pre-defined or user-defined column title in the first
@@ -543,11 +546,15 @@ class TaskJuggler
543
546
  # each hour, day, week, etc. _columnDef_ is the definition of the columns.
544
547
  # _t_ is the start time for the calendar. _sameTimeNextFunc_ is a function
545
548
  # that is called to advance _t_ to the next table column interval.
546
- # _name1Func_ and _name2Func_ are functions that return the upper and lower
547
- # title of the particular column.
549
+ # _timeformat1_ and _timeformat2_ are strftime format Strings that are used
550
+ # to generate the upper and lower title of the particular column.
548
551
  def genCalChartHeader(columnDef, t, rEnd, sameTimeNextFunc,
549
- name1Func, name2Func)
552
+ timeformat1, timeformat2)
550
553
  tableColumn = ReportTableColumn.new(@table, columnDef, '')
554
+ # Overwrite the built-in time formats if the user specified a different
555
+ # one.
556
+ timeformat1 = columnDef.timeformat1 if columnDef.timeformat1
557
+ timeformat2 = columnDef.timeformat2 if columnDef.timeformat2
551
558
 
552
559
  # Calendar chars only work when all lines have same height.
553
560
  @table.equiLines = true
@@ -559,6 +566,7 @@ class TaskJuggler
559
566
  # Create the table that is embedded in this column.
560
567
  tableColumn.cell1.special = table = ColumnTable.new
561
568
  table.equiLines = true
569
+ table.selfcontained = a('selfcontained')
562
570
  tableColumn.cell2.hidden = true
563
571
  table.viewWidth = columnDef.width ? columnDef.width : 450
564
572
 
@@ -569,12 +577,12 @@ class TaskJuggler
569
577
  while t < rEnd
570
578
  cellsInInterval = 0
571
579
  # Label for upper scale. The yearly calendar only has a lower scale.
572
- currentInterval = t.send(name1Func) if name1Func
580
+ currentInterval = t.to_s(timeformat1) if timeformat1
573
581
  firstColumn = nil
574
582
  # The innter loops terminates when the label for the upper scale has
575
583
  # changed to the next scale cell.
576
- while t < rEnd && (name1Func.nil? ||
577
- t.send(name1Func) == currentInterval)
584
+ while t < rEnd && (timeformat1.nil? ||
585
+ t.to_s(timeformat1) == currentInterval)
578
586
  # call TjTime::sameTimeNext... function to get the end of the column.
579
587
  nextT = t.send(sameTimeNextFunc)
580
588
  iv = TimeInterval.new(t, nextT)
@@ -586,11 +594,11 @@ class TaskJuggler
586
594
  # all lower scale cells that belong to this upper cell.
587
595
  if firstColumn.nil?
588
596
  firstColumn = column
589
- column.cell1.text = currentInterval.to_s
597
+ column.cell1.text = currentInterval
590
598
  else
591
599
  column.cell1.hidden = true
592
600
  end
593
- column.cell2.text = t.send(name2Func).to_s
601
+ column.cell2.text = t.to_s(timeformat2)
594
602
  # We assume an average of 7 pixel per character
595
603
  width = 8 + 7 * column.cell2.text.length
596
604
  # Ensure a minimum with of 28 to have good looking tables even with
@@ -1135,7 +1143,6 @@ class TaskJuggler
1135
1143
 
1136
1144
  # Cells for containers should be using bold font face.
1137
1145
  cell.bold = true if property.container? && line.bold
1138
- cell.selfcontained = a('selfcontained')
1139
1146
  cell
1140
1147
  end
1141
1148
 
@@ -27,6 +27,8 @@ class TaskJuggler
27
27
  def initialize(report)
28
28
  super
29
29
  @table = ReportTable.new
30
+ @table.selfcontained = report.get('selfcontained')
31
+ @table.auxDir = report.get('auxdir')
30
32
  end
31
33
 
32
34
  # Generate the table in the intermediate format.
@@ -88,7 +88,7 @@ class TaskJuggler
88
88
  discontinuedColumns = 0
89
89
  if File.exists?(@fileName)
90
90
  begin
91
- @table = CSVFile.new.read(@fileName)
91
+ @table = CSVFile.new(nil, nil).read(@fileName)
92
92
  rescue
93
93
  error('tr_cannot_read_csv',
94
94
  "Cannot read CSV file #{@fileName}: #{$!}")
@@ -42,7 +42,11 @@ recommended Ruby version to make full use of TaskJuggler is 1.9.2.
42
42
  Ruby 1.9.1 contains some bugs that prevent the multi-core support to
43
43
  work. For users that are not interested in multi-core support, the web
44
44
  server, the time sheet infrastructure and daemon Ruby 1.8.7 is still
45
- ok to use. On Windows you need at least Ruby 1.9.2.
45
+ ok to use. On Windows you need at least Ruby 1.9.2. If you want to
46
+ use non-ASCII characters, Ruby 1.9.2 or later is required as well.
47
+
48
+ You must have configured your system locale to be UTF-8 to work
49
+ properly with non-ASCII characters.
46
50
 
47
51
  See below for instructions on how to use the latest and greates Ruby
48
52
  version in parallel with your distribution Ruby.
@@ -124,6 +124,7 @@ that you use those components in accordance with their licenses.
124
124
  * Powerful project description language with macro support
125
125
  * Scales well on multi-core or multi-CPU systems
126
126
  * Support for project management teams and revision control systems
127
+ * Data export to Microsoft Project and Computer Associates Clarity
127
128
 
128
129
  ==== Web Publishing and Groupware Functions ====
129
130
 
@@ -121,6 +121,11 @@ in nowiki tags.
121
121
 
122
122
  <nowiki> This is not '''bold''' text. </nowiki>
123
123
 
124
+ You can also insert raw HTML code by enclosing it in
125
+ '''<nowiki><html>...</html></nowiki>''' tags. For all other output
126
+ formats, this content will be ignored. There is also no error checking
127
+ if the code is valid! Use this feature very carefully.
128
+
124
129
  ==== Block and Inline Generators ====
125
130
 
126
131
  Block and inline generators are a very powerful extension that allow
@@ -2,31 +2,57 @@
2
2
 
3
3
  This chapter contains information that you don't need to know to use
4
4
  TaskJuggler. It describes internal algorithms that are provided for
5
- the curious.
5
+ the curious.
6
6
 
7
7
  === How the Scheduler works ===
8
8
 
9
+ It's important to understand that the scheduler implementation is not
10
+ an optimization algorithm. It does not search a solution space and
11
+ evaluates various alternative results against each other. This has
12
+ been tried, but for any real-world project, the solution space becomes
13
+ unmanageable and scheduling runs took hours to complete.
14
+
15
+ Instead, we use a heuristic to decide when each task gets its
16
+ resources assigned. This heuristic is certainly not perfect but has
17
+ shown good results with fairly moderate computation costs. The
18
+ following sections contain an overview of the scheduling algorithm.
19
+ Users are also encouraged to read the actual source code. It can be
20
+ found in ''''Project.rb'''', ''''TaskScenario.rb'''',
21
+ ''''ResourceScenario.rb'''' and ''''Allocation.rb''''. All these files
22
+ can be found in the ''''lib/taskjuggler'''' directory. You can also
23
+ browse the sources on [https://github.com/taskjuggler/TaskJuggler
24
+ github].
25
+
9
26
  The scheduler needs to determine the start and end date for all tasks
10
- that don't have such dates yet. Additionally, it allocates resources
11
- to tasks. All events such as start of a task, or allocation of a
12
- resource can only happen aligned with the [[timingresolution|timing
13
- resolution]]. The smallest possible allocation period is
14
- called a time slot. The duration of the slot can be determined by the
15
- user. Possible values are 5, 10, 15, 30 and 60 minutes. Internally,
16
- all events are stored as UTC time.
27
+ that don't have such dates yet. To deal with multiple concurrent time
28
+ zones, all time related events are stored internally as UTC
29
+ time.Additionally, it allocates resources to tasks. All events such
30
+ as start or end of a task, or allocation of a resource can only happen
31
+ aligned with the [[timingresolution|timing resolution]]. This
32
+ determines the smallest possible allocation period that we call a time
33
+ slot. The duration of the slot can be set by the user. Possible
34
+ values are 5, 10, 15, 30 and 60 minutes.
17
35
 
18
36
  TaskJuggler keeps a scoreboard for each time slot for each leaf
19
- resource. This explains why the project duration and number of
20
- allocated resources determines the memory usage of the scheduler.
37
+ resource. Each scoreboard entry specifies whether the resource is
38
+ unassigned, assigned to a specific task or on leave. This explains why
39
+ the project duration and number of allocated resources determines the
40
+ memory usage of the scheduler.
21
41
 
22
- During the scheduling process, tasks can have 3 different states.
42
+ For the scheduling of the project, the scheduler only looks at leave
43
+ tasks that are not milestones. Container tasks and milestones are
44
+ scheduled once all necessary information is available. During the
45
+ scheduling process, leave tasks can have 3 different states.
23
46
 
24
47
  # ''''Not ready for scheduling'''': The task is missing a start or
25
48
  end date that depends on another task's date that hasn't been
26
49
  determined yet.
27
50
  # ''''Ready for scheduling'''': The task has at least a start or end
28
51
  date but one of them is still missing or resources have not yet been
29
- assigned for all time slots.
52
+ assigned for all time slots. The scheduling direction (ASAP or ALAP)
53
+ determines whether the start or end date is needed. ASAP tasks are
54
+ scheduled from start to end, so they require a start date. ALAP tasks
55
+ are scheduled from end to start.
30
56
  # ''''Scheduling completed'''': The task has a start and end date and
31
57
  resources have been assigned for all time slots.
32
58
 
@@ -36,35 +62,40 @@ be in the ready state. If that's not the case, the project schedule
36
62
  cannot be determined and an error is raised. In case there are more
37
63
  than one task in the ready state, we need to have a well defined
38
64
  priority of the tasks. This is necessary since those ready tasks may
39
- compete for the same resource for the same time slot.
65
+ compete for the same resource in the same time slot.
40
66
 
41
67
  The priority can be directly influenced by the user with the
42
- [[priority]] attribute. In case two tasks have the same priority, an
43
- additional measure is used. This measure is called path criticalness. The
44
- path criticalness is calculated for each leaf task. The path
45
- criticalness is a measure for how important the task is to keep the
46
- overall project duration (start of first task to end of last task) to
47
- a minimum.
68
+ [[priority]] attribute. This user-defined priority always trumps the
69
+ other internal criteria described below. In case two tasks have the
70
+ same priority, an additional measure is used. This measure is called
71
+ path criticalness. The path criticalness is calculated for each leaf
72
+ task. The path criticalness is a measure for how important the task is
73
+ to keep the overall project duration (start of first task to end of
74
+ last task) to a minimum.
48
75
 
49
76
  To determine the path criticalness, we first need to determine the
50
- resource criticalness. This is a measure for how likely the tasks
51
- that have this resource in their allocation list will actually get
52
- the resource. A resource criticalness larger than 1.0 means that
77
+ resource criticalness first. This is a measure for how likely the
78
+ tasks that have this resource in their allocation list will actually
79
+ get the resource. A resource criticalness larger than 1.0 means that
53
80
  statistically, at least one tasks will not get enough of this
54
81
  resource. This is just a statistical measure based on the total
55
82
  requested allocations and the number of available work time.
56
83
 
57
84
  Once we have determined the criticalness of all allocated resources,
58
85
  we can calculate the criticalness of each individual task. This
59
- really only matters for effort based tasks. These really need their
60
- allocations. For length and duration tasks, the allocations are
86
+ really only matters for [[effort]] based tasks. These really need their
87
+ allocations to be finished within a limited amount of time. For
88
+ [[length]] and [[duration]] tasks, the allocations are by definition
61
89
  optional. The user can still influence the allocation to length and
62
- duration tasks by adjusting the priority appropriately. The
63
- criticalness of a task is defined as the average of the criticalness
64
- of the resources allocated to this task.
90
+ duration tasks by adjusting the priority appropriately. However,
91
+ there is no guarantee that such tasks will ever get any resources
92
+ assigned. The criticalness of an effort based task is defined as the
93
+ average of the criticalness of the resources allocated to this task.
65
94
 
66
95
  We also assign a criticalness to milestones. Based on their priority
67
- a criticalness between 0 and 2.0 is assigned.
96
+ a criticalness between 0 and 2.0 is assigned. This is done to reflect
97
+ the user perception that milestones are usually some important goal
98
+ of the project.
68
99
 
69
100
  The final step is now the computation of the path criticalness for
70
101
  each effort-based leaf task. For each possible chain of task (path)
@@ -74,12 +105,22 @@ criticalness of that task.
74
105
 
75
106
  This heuristic will favor allocations to task with critical resources
76
107
  and long dependency chains. As a result, the critical paths of the
77
- project are tried to be kept short.
78
-
79
- This heuristic is certainly not perfect but has shown good results
80
- with fairly short computation overhead. The scheduling process is not
81
- an optimization process. It does not evaluate alternatives and it
82
- does not search for local extremes in a solution space.
108
+ project are tried to be kept short. The user can use the
109
+ '''criticalness''' and '''pathcriticalness''' [[columnid|columns]] to
110
+ review the respective values for he project's tasks and resources.
111
+
112
+ When the criticalness and pathcriticalness for all leaf resources and
113
+ tasks has been determined, the leaf tasks are sorted by priority
114
+ (hight to low), then by pathcricialness (high to low) and then by the
115
+ index (low to high). In a loop that is terminated when all tasks have
116
+ been scheduled or an error condition has been detected, the first
117
+ task that is ready for scheduling is completely scheduled. This means
118
+ that resources are allocated for all time slots and missing dates are
119
+ being computed. The newly determined end (for ASAP tasks) or start
120
+ (for ALAP tasks) date is then propagated to dependent tasks,
121
+ milestones or parent tasks if needed. This can result in other tasks
122
+ becoming ready for scheduling and the list is searched again for the
123
+ first task that is ready for scheduling to be scheduled.
83
124
 
84
125
  A task can only be scheduled when it is ready for scheduling. This
85
126
  means that at least the start date for the scheduling process must be
@@ -90,3 +131,10 @@ be scheduled from start to end, ALAP tasks from end to start. This is
90
131
  important to understand as resource assignments for each time slot
91
132
  will be determined in this order.
92
133
 
134
+ Mixing ASAP and ALAP tasks in the same project is supported but
135
+ should be used very carefully. It can lead to situations where a
136
+ lower priority tasks that is earlier in the scheduling process ready
137
+ for scheduling takes away resources from a higher prioritized task
138
+ that competes for the same resources. This condition is known is
139
+ priority inversion. If the scheduler detects such a situation, a
140
+ warning is generated.
@@ -652,7 +652,7 @@ definition.
652
652
  <[example file="tutorial" tag="overview"]>
653
653
 
654
654
  The generated report can be found
655
- [http://www.taskjuggler.org/tj3/examples/Overview.html
655
+ [http://www.taskjuggler.org/tj3/examples/Tutorial/Overview.html
656
656
  here]. It servers as an entry page for the other reports. While it
657
657
  already contains some references, a navigator bar would be handy as
658
658
  well. Fortunately, there is a block generator called 'navigator' to
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE>
2
- <!-- This file has been generated by tj3man v3.3.0 -->
2
+ <!-- This file has been generated by tj3man v3.4.0 -->
3
3
  <html lang="en" xml:lang="en">
4
4
  <head>
5
5
  <title>Day_To_Day_Juggling</title>
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE>
2
- <!-- This file has been generated by tj3man v3.3.0 -->
2
+ <!-- This file has been generated by tj3man v3.4.0 -->
3
3
  <html lang="en" xml:lang="en">
4
4
  <head>
5
5
  <title>Getting_Started</title>
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE>
2
- <!-- This file has been generated by tj3man v3.3.0 -->
2
+ <!-- This file has been generated by tj3man v3.4.0 -->
3
3
  <html lang="en" xml:lang="en">
4
4
  <head>
5
5
  <title>How_To_Contribute</title>
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE>
2
- <!-- This file has been generated by tj3man v3.3.0 -->
2
+ <!-- This file has been generated by tj3man v3.4.0 -->
3
3
  <html lang="en" xml:lang="en">
4
4
  <head>
5
5
  <title>Installation</title>
@@ -38,7 +38,8 @@
38
38
  <p class="manual">If you are interested in becoming the maintainer for any of the currently unmaintained (and untested) OSes, please contact us via the developer mailing list.</p>
39
39
  <h3 class="manual" id="Other_required_Software">2.1.2 Other required Software</h3>
40
40
  <ul><li>
41
- <b>Ruby:</b> TaskJuggler 3.x is written in Ruby. You need a Ruby runtime environment to run it. This can be downloaded from <a href="http://www.ruby-lang.org/en/downloads/" target="_top">here</a>. Most Linux distributions usually have Ruby already included. So does MacOS X Leopard. For Windows, there is a one-click installer available. The recommended Ruby version to make full use of TaskJuggler is 1.9.2. Ruby 1.9.1 contains some bugs that prevent the multi-core support to work. For users that are not interested in multi-core support, the web server, the time sheet infrastructure and daemon Ruby 1.8.7 is still ok to use. On Windows you need at least Ruby 1.9.2.</li></ul>
41
+ <b>Ruby:</b> TaskJuggler 3.x is written in Ruby. You need a Ruby runtime environment to run it. This can be downloaded from <a href="http://www.ruby-lang.org/en/downloads/" target="_top">here</a>. Most Linux distributions usually have Ruby already included. So does MacOS X Leopard. For Windows, there is a one-click installer available. The recommended Ruby version to make full use of TaskJuggler is 1.9.2. Ruby 1.9.1 contains some bugs that prevent the multi-core support to work. For users that are not interested in multi-core support, the web server, the time sheet infrastructure and daemon Ruby 1.8.7 is still ok to use. On Windows you need at least Ruby 1.9.2. If you want to use non-ASCII characters, Ruby 1.9.2 or later is required as well.</li></ul>
42
+ <p class="manual">You must have configured your system locale to be UTF-8 to work properly with non-ASCII characters.</p>
42
43
  <p class="manual">See below for instructions on how to use the latest and greates Ruby version in parallel with your distribution Ruby.</p>
43
44
  <ul><li>
44
45
  <b>RubyGems:</b> If it did not come with your OS or the Ruby installation, see <a href="http://docs.rubygems.org" target="_top">here</a> how to get and install it. RubyGems is a cross-platform package manager. It will download and install all other required software packages automatically when you install TaskJuggler. These packages are called Ruby gems.</li></ul>
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE>
2
- <!-- This file has been generated by tj3man v3.3.0 -->
2
+ <!-- This file has been generated by tj3man v3.4.0 -->
3
3
  <html lang="en" xml:lang="en">
4
4
  <head>
5
5
  <title>Intro</title>
@@ -76,6 +76,7 @@
76
76
  <li>Powerful project description language with macro support</li>
77
77
  <li>Scales well on multi-core or multi-CPU systems</li>
78
78
  <li>Support for project management teams and revision control systems</li>
79
+ <li>Data export to Microsoft Project and Computer Associates Clarity</li>
79
80
  </ul>
80
81
  <h3 class="manual" id="Web_Publishing_and_Groupware_Functions">1.3.6 Web Publishing and Groupware Functions</h3>
81
82
  <ul>
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE>
2
- <!-- This file has been generated by tj3man v3.3.0 -->
2
+ <!-- This file has been generated by tj3man v3.4.0 -->
3
3
  <html lang="en" xml:lang="en">
4
4
  <head>
5
5
  <title>Reporting_Bugs</title>
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE>
2
- <!-- This file has been generated by tj3man v3.3.0 -->
2
+ <!-- This file has been generated by tj3man v3.4.0 -->
3
3
  <html lang="en" xml:lang="en">
4
4
  <head>
5
5
  <title>Rich_Text_Attributes</title>
@@ -84,6 +84,7 @@ This is a '''''italic and bold''''' word.
84
84
  <p class="manual">In some situations, it is desirable to not interpret certain markup sequences and reproduce the text verbatim. Such text must be enclosed in nowiki tags.</p>
85
85
  <div class="manual" codesection="1"><pre class="manual" codesection="1">&lt;nowiki&gt; This is not '''bold''' text. &lt;/nowiki&gt;
86
86
  </pre></div>
87
+ <p class="manual">You can also insert raw HTML code by enclosing it in <b>&lt;html&gt;...&lt;/html&gt;</b> tags. For all other output formats, this content will be ignored. There is also no error checking if the code is valid! Use this feature very carefully.</p>
87
88
  <h3 class="manual" id="Block_and_Inline_Generators">5.4.3 Block and Inline Generators</h3>
88
89
  <p class="manual">Block and inline generators are a very powerful extension that allow you to insert arbitrarily complex content. Block generators create a text block whereas inline generators generate an element that fits inside a text paragraph.</p>
89
90
  <p class="manual">Block generators use the following syntax:</p>
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE>
2
- <!-- This file has been generated by tj3man v3.3.0 -->
2
+ <!-- This file has been generated by tj3man v3.4.0 -->
3
3
  <html lang="en" xml:lang="en">
4
4
  <head>
5
5
  <title>Software</title>
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE>
2
- <!-- This file has been generated by tj3man v3.3.0 -->
2
+ <!-- This file has been generated by tj3man v3.4.0 -->
3
3
  <html lang="en" xml:lang="en">
4
4
  <head>
5
5
  <title>TaskJuggler_2x_Migration</title>