taskjuggler 3.1.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (410) hide show
  1. data/CHANGELOG +44 -0
  2. data/bin/tj3webd +4 -0
  3. data/data/css/tjreport.css +14 -5
  4. data/data/tjp.vim +22 -7
  5. data/examples/Fedora-20/reports.tji +2 -4
  6. data/examples/Scrum/Product Burndown.csv +26 -0
  7. data/examples/Scrum/Sprint 1 Burndown.csv +26 -0
  8. data/examples/Scrum/Sprint 2 Burndown.csv +26 -0
  9. data/examples/Scrum/Sprint 3 Burndown.csv +26 -0
  10. data/examples/Scrum/scrum.tjp +141 -0
  11. data/examples/Tutorial/tutorial.tjp +13 -7
  12. data/lib/taskjuggler/Attributes.rb +2 -3
  13. data/lib/taskjuggler/HTMLDocument.rb +25 -18
  14. data/lib/taskjuggler/Journal.rb +85 -65
  15. data/lib/taskjuggler/KeywordDocumentation.rb +25 -13
  16. data/lib/taskjuggler/LeaveList.rb +1 -1
  17. data/lib/taskjuggler/Limits.rb +3 -5
  18. data/lib/taskjuggler/MessageHandler.rb +173 -19
  19. data/lib/taskjuggler/Painter.rb +75 -0
  20. data/lib/taskjuggler/Painter/BasicShapes.rb +76 -0
  21. data/lib/taskjuggler/Painter/Color.rb +273 -0
  22. data/lib/taskjuggler/Painter/Element.rb +56 -0
  23. data/lib/taskjuggler/Painter/FontData.rb +221 -0
  24. data/lib/taskjuggler/Painter/FontMetrics.rb +125 -0
  25. data/lib/taskjuggler/Painter/FontMetricsData.rb +151 -0
  26. data/lib/taskjuggler/Painter/Group.rb +77 -0
  27. data/lib/taskjuggler/Painter/Points.rb +47 -0
  28. data/lib/taskjuggler/Painter/Primitives.rb +100 -0
  29. data/lib/taskjuggler/Painter/SVGSupport.rb +36 -0
  30. data/lib/taskjuggler/Painter/Text.rb +36 -0
  31. data/lib/taskjuggler/Project.rb +46 -29
  32. data/lib/taskjuggler/ProjectFileParser.rb +24 -22
  33. data/lib/taskjuggler/ProjectFileScanner.rb +2 -2
  34. data/lib/taskjuggler/PropertyTreeNode.rb +26 -34
  35. data/lib/taskjuggler/Query.rb +8 -5
  36. data/lib/taskjuggler/RealFormat.rb +3 -0
  37. data/lib/taskjuggler/Resource.rb +3 -5
  38. data/lib/taskjuggler/ResourceScenario.rb +19 -7
  39. data/lib/taskjuggler/RichText.rb +4 -6
  40. data/lib/taskjuggler/RichText/FunctionExample.rb +1 -1
  41. data/lib/taskjuggler/RichText/FunctionHandler.rb +5 -6
  42. data/lib/taskjuggler/RichText/Parser.rb +4 -6
  43. data/lib/taskjuggler/RichText/RTFNavigator.rb +1 -1
  44. data/lib/taskjuggler/RichText/RTFQuery.rb +2 -3
  45. data/lib/taskjuggler/RichText/RTFReport.rb +1 -1
  46. data/lib/taskjuggler/RichText/RTFReportLink.rb +1 -2
  47. data/lib/taskjuggler/RichText/RTFWithQuerySupport.rb +1 -1
  48. data/lib/taskjuggler/RichText/Scanner.rb +6 -6
  49. data/lib/taskjuggler/RichText/Snip.rb +1 -2
  50. data/lib/taskjuggler/RuntimeConfig.rb +9 -6
  51. data/lib/taskjuggler/ScenarioData.rb +4 -3
  52. data/lib/taskjuggler/Scoreboard.rb +6 -0
  53. data/lib/taskjuggler/SheetHandlerBase.rb +25 -8
  54. data/lib/taskjuggler/SimpleQueryExpander.rb +14 -5
  55. data/lib/taskjuggler/SyntaxReference.rb +1 -2
  56. data/lib/taskjuggler/TableColumnSorter.rb +84 -0
  57. data/lib/taskjuggler/Task.rb +3 -5
  58. data/lib/taskjuggler/TaskJuggler.rb +36 -29
  59. data/lib/taskjuggler/TaskScenario.rb +154 -66
  60. data/lib/taskjuggler/TextParser.rb +24 -17
  61. data/lib/taskjuggler/TextParser/Scanner.rb +16 -11
  62. data/lib/taskjuggler/TextParser/SourceFileInfo.rb +20 -15
  63. data/lib/taskjuggler/TimeSheets.rb +6 -12
  64. data/lib/taskjuggler/Tj3AppBase.rb +35 -16
  65. data/lib/taskjuggler/Tj3Config.rb +1 -1
  66. data/lib/taskjuggler/TjpSyntaxRules.rb +239 -49
  67. data/lib/taskjuggler/XMLElement.rb +9 -2
  68. data/lib/taskjuggler/apps/Tj3.rb +43 -37
  69. data/lib/taskjuggler/apps/Tj3Client.rb +62 -112
  70. data/lib/taskjuggler/apps/Tj3Daemon.rb +66 -29
  71. data/lib/taskjuggler/apps/Tj3Man.rb +5 -5
  72. data/lib/taskjuggler/apps/Tj3SsReceiver.rb +10 -13
  73. data/lib/taskjuggler/apps/Tj3SsSender.rb +13 -16
  74. data/lib/taskjuggler/apps/Tj3TsReceiver.rb +10 -13
  75. data/lib/taskjuggler/apps/Tj3TsSender.rb +12 -15
  76. data/lib/taskjuggler/apps/Tj3TsSummary.rb +12 -15
  77. data/lib/taskjuggler/apps/Tj3WebD.rb +99 -0
  78. data/lib/taskjuggler/daemon/Daemon.rb +50 -10
  79. data/lib/taskjuggler/daemon/DaemonConnector.rb +127 -0
  80. data/lib/taskjuggler/daemon/ProcessIntercom.rb +36 -21
  81. data/lib/taskjuggler/daemon/ProjectBroker.rb +122 -112
  82. data/lib/taskjuggler/daemon/ProjectServer.rb +78 -46
  83. data/lib/taskjuggler/daemon/ReportServer.rb +52 -28
  84. data/lib/taskjuggler/daemon/ReportServlet.rb +92 -21
  85. data/lib/taskjuggler/daemon/WebServer.rb +75 -22
  86. data/lib/taskjuggler/daemon/WelcomePage.rb +1 -0
  87. data/lib/taskjuggler/reports/AccountListRE.rb +3 -3
  88. data/lib/taskjuggler/reports/CSVFile.rb +9 -2
  89. data/lib/taskjuggler/reports/ChartPlotter.rb +453 -0
  90. data/lib/taskjuggler/reports/Navigator.rb +1 -0
  91. data/lib/taskjuggler/reports/NikuReport.rb +4 -4
  92. data/lib/taskjuggler/reports/Report.rb +6 -18
  93. data/lib/taskjuggler/reports/ReportBase.rb +9 -9
  94. data/lib/taskjuggler/reports/ReportContext.rb +2 -2
  95. data/lib/taskjuggler/reports/StatusSheetReport.rb +6 -6
  96. data/lib/taskjuggler/reports/TableReport.rb +24 -15
  97. data/lib/taskjuggler/reports/TimeSheetReport.rb +5 -5
  98. data/lib/taskjuggler/reports/TraceReport.rb +251 -0
  99. data/lib/tj3webd.rb +17 -0
  100. data/manual/Day_To_Day_Juggling +10 -3
  101. data/manual/Installation +38 -19
  102. data/manual/Software +25 -19
  103. data/manual/Tutorial +119 -110
  104. data/manual/html/Day_To_Day_Juggling.html +7 -5
  105. data/manual/html/Getting_Started.html +4 -4
  106. data/manual/html/How_To_Contribute.html +4 -4
  107. data/manual/html/Installation.html +19 -11
  108. data/manual/html/Intro.html +4 -4
  109. data/manual/html/Reporting_Bugs.html +4 -4
  110. data/manual/html/Rich_Text_Attributes.html +4 -4
  111. data/manual/html/Software.html +15 -11
  112. data/manual/html/TaskJuggler_2x_Migration.html +4 -4
  113. data/manual/html/TaskJuggler_Internals.html +4 -4
  114. data/manual/html/The_TaskJuggler_Syntax.html +4 -4
  115. data/manual/html/Tutorial.html +41 -32
  116. data/manual/html/account.html +4 -4
  117. data/manual/html/account.task.html +4 -4
  118. data/manual/html/accountprefix.html +4 -4
  119. data/manual/html/accountreport.html +27 -9
  120. data/manual/html/accountroot.html +5 -5
  121. data/manual/html/active.html +4 -4
  122. data/manual/html/adopt.task.html +4 -4
  123. data/manual/html/aggregate.html +4 -4
  124. data/manual/html/alert.html +4 -4
  125. data/manual/html/alertlevels.html +4 -4
  126. data/manual/html/allocate.html +5 -5
  127. data/manual/html/alphabet.html +4 -4
  128. data/manual/html/alternative.html +4 -4
  129. data/manual/html/author.html +4 -4
  130. data/manual/html/balance.html +5 -5
  131. data/manual/html/booking.resource.html +4 -4
  132. data/manual/html/booking.task.html +4 -4
  133. data/manual/html/caption.html +5 -5
  134. data/manual/html/cellcolor.column.html +43 -8
  135. data/manual/html/celltext.column.html +4 -4
  136. data/manual/html/center.html +5 -5
  137. data/manual/html/charge.html +4 -4
  138. data/manual/html/chargeset.html +4 -4
  139. data/manual/html/columnid.html +27 -15
  140. data/manual/html/columns.html +5 -5
  141. data/manual/html/complete.html +4 -4
  142. data/manual/html/copyright.html +4 -4
  143. data/manual/html/credits.html +4 -4
  144. data/manual/html/css/tjreport.css +14 -5
  145. data/manual/html/currency.html +4 -4
  146. data/manual/html/currencyformat.html +5 -5
  147. data/manual/html/dailymax.html +5 -5
  148. data/manual/html/dailymin.html +5 -5
  149. data/manual/html/dailyworkinghours.html +4 -4
  150. data/manual/html/date.extend.html +4 -4
  151. data/manual/html/date.html +5 -5
  152. data/manual/html/definitions.html +4 -4
  153. data/manual/html/depends.html +4 -4
  154. data/manual/html/details.html +4 -4
  155. data/manual/html/disabled.html +4 -4
  156. data/manual/html/duration.html +4 -4
  157. data/manual/html/efficiency.html +4 -4
  158. data/manual/html/effort.html +4 -4
  159. data/manual/html/email.html +4 -4
  160. data/manual/html/enabled.html +4 -4
  161. data/manual/html/end.column.html +4 -4
  162. data/manual/html/end.html +4 -4
  163. data/manual/html/end.limit.html +4 -4
  164. data/manual/html/end.report.html +5 -5
  165. data/manual/html/end.timesheet.html +4 -4
  166. data/manual/html/endcredit.html +4 -4
  167. data/manual/html/epilog.html +5 -5
  168. data/manual/html/export.html +4 -4
  169. data/manual/html/extend.html +4 -4
  170. data/manual/html/fail.html +43 -8
  171. data/manual/html/fdl.html +4 -4
  172. data/manual/html/flags.account.html +4 -4
  173. data/manual/html/flags.html +4 -4
  174. data/manual/html/flags.journalentry.html +4 -4
  175. data/manual/html/flags.report.html +5 -5
  176. data/manual/html/flags.resource.html +4 -4
  177. data/manual/html/flags.statussheet.html +4 -4
  178. data/manual/html/flags.task.html +4 -4
  179. data/manual/html/flags.timesheet.html +4 -4
  180. data/manual/html/fontcolor.column.html +43 -8
  181. data/manual/html/footer.html +5 -5
  182. data/manual/html/formats.html +5 -5
  183. data/manual/html/functions.html +4 -4
  184. data/manual/html/gapduration.html +4 -4
  185. data/manual/html/gaplength.html +4 -4
  186. data/manual/html/halign.center.html +4 -4
  187. data/manual/html/halign.column.html +43 -8
  188. data/manual/html/halign.left.html +4 -4
  189. data/manual/html/halign.right.html +4 -4
  190. data/manual/html/hasalert.html +4 -4
  191. data/manual/html/header.html +5 -5
  192. data/manual/html/headline.html +7 -7
  193. data/manual/html/height.html +72 -0
  194. data/manual/html/hideaccount.html +46 -11
  195. data/manual/html/hidejournalentry.html +5 -5
  196. data/manual/html/hidereport.html +43 -8
  197. data/manual/html/hideresource.html +44 -9
  198. data/manual/html/hidetask.html +44 -9
  199. data/manual/html/icalreport.html +4 -4
  200. data/manual/html/include.macro.html +4 -4
  201. data/manual/html/include.project.html +4 -4
  202. data/manual/html/include.properties.html +4 -4
  203. data/manual/html/index.html +2 -1
  204. data/manual/html/inherit.extend.html +4 -4
  205. data/manual/html/interval1.html +4 -4
  206. data/manual/html/interval2.html +4 -4
  207. data/manual/html/interval3.html +4 -4
  208. data/manual/html/interval4.html +4 -4
  209. data/manual/html/isactive.html +4 -4
  210. data/manual/html/ischildof.html +4 -4
  211. data/manual/html/isdependencyof.html +4 -4
  212. data/manual/html/isdutyof.html +4 -4
  213. data/manual/html/isfeatureof.html +4 -4
  214. data/manual/html/isleaf.html +4 -4
  215. data/manual/html/ismilestone.html +4 -4
  216. data/manual/html/isongoing.html +4 -4
  217. data/manual/html/isresource.html +4 -4
  218. data/manual/html/isresponsibilityof.html +4 -4
  219. data/manual/html/istask.html +4 -4
  220. data/manual/html/journalattributes.html +11 -7
  221. data/manual/html/journalentry.html +4 -4
  222. data/manual/html/journalmode.html +5 -5
  223. data/manual/html/leaveallowance.html +5 -5
  224. data/manual/html/leaves.html +5 -6
  225. data/manual/html/left.html +5 -5
  226. data/manual/html/length.html +4 -4
  227. data/manual/html/limits.allocate.html +4 -4
  228. data/manual/html/limits.html +4 -4
  229. data/manual/html/limits.resource.html +4 -4
  230. data/manual/html/limits.task.html +4 -4
  231. data/manual/html/listitem.column.html +4 -4
  232. data/manual/html/listtype.column.html +4 -4
  233. data/manual/html/loadunit.html +5 -5
  234. data/manual/html/logicalexpression.html +8 -44
  235. data/manual/html/logicalflagexpression.html +4 -4
  236. data/manual/html/macro.html +4 -4
  237. data/manual/html/managers.html +4 -4
  238. data/manual/html/mandatory.html +4 -4
  239. data/manual/html/maxend.html +4 -4
  240. data/manual/html/maximum.html +5 -5
  241. data/manual/html/maxstart.html +4 -4
  242. data/manual/html/milestone.html +4 -4
  243. data/manual/html/minend.html +4 -4
  244. data/manual/html/minimum.html +5 -5
  245. data/manual/html/minstart.html +4 -4
  246. data/manual/html/monthlymax.html +5 -5
  247. data/manual/html/monthlymin.html +5 -5
  248. data/manual/html/navbar.html +10 -4
  249. data/manual/html/navigator.html +4 -4
  250. data/manual/html/newtask.html +4 -4
  251. data/manual/html/nikureport.html +4 -4
  252. data/manual/html/note.task.html +4 -4
  253. data/manual/html/now.html +4 -4
  254. data/manual/html/numberformat.html +5 -5
  255. data/manual/html/onend.html +4 -4
  256. data/manual/html/onstart.html +4 -4
  257. data/manual/html/opennodes.html +5 -5
  258. data/manual/html/overtime.booking.html +4 -4
  259. data/manual/html/period.column.html +4 -4
  260. data/manual/html/period.limit.html +4 -4
  261. data/manual/html/period.report.html +5 -5
  262. data/manual/html/period.task.html +4 -4
  263. data/manual/html/persistent.html +4 -4
  264. data/manual/html/precedes.html +4 -4
  265. data/manual/html/priority.html +4 -4
  266. data/manual/html/priority.timesheet.html +4 -4
  267. data/manual/html/project.html +4 -4
  268. data/manual/html/projectid.html +4 -4
  269. data/manual/html/projectid.task.html +4 -4
  270. data/manual/html/projectids.html +4 -4
  271. data/manual/html/projection.html +5 -7
  272. data/manual/html/prolog.html +5 -5
  273. data/manual/html/properties.html +11 -5
  274. data/manual/html/purge.html +5 -5
  275. data/manual/html/rate.html +4 -4
  276. data/manual/html/rate.resource.html +4 -4
  277. data/manual/html/reference.extend.html +4 -4
  278. data/manual/html/remaining.html +4 -4
  279. data/manual/html/replace.html +4 -4
  280. data/manual/html/reportprefix.html +4 -4
  281. data/manual/html/resource.html +4 -10
  282. data/manual/html/resourceattributes.html +4 -4
  283. data/manual/html/resourceprefix.html +4 -4
  284. data/manual/html/resourcereport.html +28 -10
  285. data/manual/html/resourceroot.html +5 -5
  286. data/manual/html/resources.limit.html +4 -4
  287. data/manual/html/responsible.html +4 -4
  288. data/manual/html/richtext.extend.html +4 -4
  289. data/manual/html/right.html +5 -5
  290. data/manual/html/rollupaccount.html +44 -9
  291. data/manual/html/rollupresource.html +44 -9
  292. data/manual/html/rolluptask.html +44 -9
  293. data/manual/html/scale.column.html +4 -4
  294. data/manual/html/scenario.html +4 -22
  295. data/manual/html/scenario.ical.html +4 -4
  296. data/manual/html/scenarios.export.html +4 -4
  297. data/manual/html/scenarios.html +5 -5
  298. data/manual/html/scenariospecific.extend.html +4 -4
  299. data/manual/html/scheduled.html +4 -4
  300. data/manual/html/scheduling.html +4 -4
  301. data/manual/html/select.html +4 -4
  302. data/manual/html/selfcontained.html +5 -5
  303. data/manual/html/shift.allocate.html +4 -4
  304. data/manual/html/shift.html +4 -4
  305. data/manual/html/shift.resource.html +5 -5
  306. data/manual/html/shift.task.html +4 -4
  307. data/manual/html/shift.timesheet.html +4 -4
  308. data/manual/html/shifts.allocate.html +4 -4
  309. data/manual/html/shifts.resource.html +4 -4
  310. data/manual/html/shifts.task.html +4 -4
  311. data/manual/html/shorttimeformat.html +4 -4
  312. data/manual/html/sloppy.booking.html +4 -4
  313. data/manual/html/sloppy.projection.html +5 -5
  314. data/manual/html/sortaccounts.html +5 -5
  315. data/manual/html/sortjournalentries.html +5 -5
  316. data/manual/html/sortresources.html +5 -5
  317. data/manual/html/sorttasks.html +5 -5
  318. data/manual/html/start.column.html +4 -4
  319. data/manual/html/start.html +4 -4
  320. data/manual/html/start.limit.html +4 -4
  321. data/manual/html/start.report.html +5 -5
  322. data/manual/html/startcredit.html +4 -4
  323. data/manual/html/status.statussheet.html +4 -4
  324. data/manual/html/status.timesheet.html +4 -4
  325. data/manual/html/statussheet.html +4 -4
  326. data/manual/html/statussheetreport.html +4 -4
  327. data/manual/html/strict.projection.html +5 -5
  328. data/manual/html/summary.html +4 -4
  329. data/manual/html/supplement.html +4 -4
  330. data/manual/html/supplement.resource.html +4 -10
  331. data/manual/html/supplement.task.html +4 -28
  332. data/manual/html/tagfile.html +4 -4
  333. data/manual/html/task.html +4 -28
  334. data/manual/html/task.statussheet.html +4 -4
  335. data/manual/html/task.timesheet.html +4 -4
  336. data/manual/html/taskattributes.html +4 -4
  337. data/manual/html/taskprefix.html +4 -4
  338. data/manual/html/taskreport.html +28 -10
  339. data/manual/html/taskroot.html +5 -5
  340. data/manual/html/text.extend.html +4 -4
  341. data/manual/html/textreport.html +27 -9
  342. data/manual/html/timeformat.html +5 -5
  343. data/manual/html/timeoff.nikureport.html +4 -4
  344. data/manual/html/timesheet.html +4 -4
  345. data/manual/html/timesheetreport.html +23 -5
  346. data/manual/html/timezone.export.html +4 -4
  347. data/manual/html/timezone.html +4 -4
  348. data/manual/html/timezone.report.html +5 -5
  349. data/manual/html/timezone.shift.html +4 -4
  350. data/manual/html/timingresolution.html +4 -4
  351. data/manual/html/title.column.html +4 -4
  352. data/manual/html/title.html +5 -5
  353. data/manual/html/toc.html +207 -179
  354. data/manual/html/tooltip.column.html +45 -10
  355. data/manual/html/tracereport.html +405 -0
  356. data/manual/html/trackingscenario.html +6 -6
  357. data/manual/html/treelevel.html +4 -4
  358. data/manual/html/vacation.html +4 -4
  359. data/manual/html/vacation.resource.html +4 -4
  360. data/manual/html/vacation.shift.html +4 -4
  361. data/manual/html/warn.html +43 -8
  362. data/manual/html/weeklymax.html +5 -5
  363. data/manual/html/weeklymin.html +5 -5
  364. data/manual/html/weekstartsmonday.html +4 -4
  365. data/manual/html/weekstartssunday.html +6 -6
  366. data/manual/html/width.column.html +6 -6
  367. data/manual/html/width.html +72 -0
  368. data/manual/html/work.html +4 -4
  369. data/manual/html/workinghours.project.html +4 -4
  370. data/manual/html/workinghours.resource.html +4 -4
  371. data/manual/html/workinghours.shift.html +4 -4
  372. data/manual/html/yearlyworkingdays.html +4 -4
  373. data/spec/Color_spec.rb +60 -0
  374. data/spec/ProjectBroker_spec.rb +3 -2
  375. data/spec/StatusSheets_spec.rb +5 -4
  376. data/spec/TableColumnSorter_spec.rb +78 -0
  377. data/spec/TimeSheets_spec.rb +6 -2
  378. data/spec/Tj3Daemon_spec.rb +2 -2
  379. data/spec/TraceReport_spec.rb +117 -0
  380. data/taskjuggler.gemspec +1 -1
  381. data/test/MessageChecker.rb +3 -1
  382. data/test/ReferenceGenerator.rb +1 -1
  383. data/test/TestSuite/CSV-Reports/Leave.tjp +1 -1
  384. data/test/TestSuite/CSV-Reports/refs/resourcereport_with_tasks.csv +3 -0
  385. data/test/TestSuite/CSV-Reports/refs/taskcounter.csv +9 -0
  386. data/test/TestSuite/CSV-Reports/refs/taskreport_with_resources.csv +19 -16
  387. data/test/TestSuite/CSV-Reports/refs/weekly.csv +1 -0
  388. data/test/TestSuite/Export-Reports/refs/LogicalExpression.tjp +14 -2
  389. data/test/TestSuite/Export-Reports/refs/tutorial.tjp +98 -86
  390. data/test/TestSuite/Scheduler/Correct/Leaves.tjp +25 -0
  391. data/test/TestSuite/Syntax/Correct/Leave.tjp +1 -1
  392. data/test/TestSuite/Syntax/Correct/LogicalExpression.tjp +9 -1
  393. data/test/TestSuite/Syntax/Correct/TraceReport.tjp +10 -0
  394. data/test/TestSuite/Syntax/Correct/tutorial.tjp +10 -4
  395. data/test/test_CSV-Reports.rb +3 -3
  396. data/test/test_Export-Reports.rb +91 -86
  397. data/test/test_Journal.rb +15 -12
  398. data/test/test_Limits.rb +3 -3
  399. data/test/test_Project.rb +1 -2
  400. data/test/test_ProjectFileScanner.rb +1 -1
  401. data/test/test_PropertySet.rb +1 -1
  402. data/test/test_Query.rb +5 -6
  403. data/test/test_ReportGenerator.rb +15 -7
  404. data/test/test_RichText.rb +4 -3
  405. data/test/test_Scheduler.rb +19 -7
  406. data/test/test_ShiftAssignments.rb +2 -2
  407. data/test/test_SimpleQueryExpander.rb +29 -2
  408. data/test/test_Syntax.rb +14 -5
  409. metadata +49 -10
  410. data/lib/taskjuggler/LogFile.rb +0 -73
@@ -1,10 +1,10 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <!-- This file has been generated by tj3man v3.1.0 -->
4
- <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
1
+ <!DOCTYPE>
2
+ <!-- This file has been generated by tj3man v3.2.0 -->
3
+ <html lang="en" xml:lang="en">
5
4
  <head>
6
5
  <title>Day_To_Day_Juggling</title>
7
6
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
7
+ <meta content="IE=9" http-equiv="X-UA-Compatible"/>
8
8
  </head>
9
9
  <link href="css/tjmanual.css" rel="stylesheet" type="text/css"></link>
10
10
  <body>
@@ -145,6 +145,7 @@
145
145
  <p class="manual">Each project contributor needs to fill out a time sheet each week. To simplify the process each contributor will receive a template that already contains a lot of the information they need to provide.</p>
146
146
  <p class="manual">To send out the time sheets, the command <code class="manual">tj3ts_sender</code> must be used. It will call <code class="manual">tj3client</code> with appropriate parameters. To use it, you need to have a properly configured daemon running and the appropriate project loaded. Then you need to add the configuration data for <code class="manual">tj3ts_sender</code> to your TaskJuggler configuration file. The time sheet related settings have their own top-level section:</p>
147
147
  <div class="manual" codesection="1"><pre class="manual" codesection="1">_global:
148
+ emailDeliveryMethod: smtp
148
149
  smtpServer: smtp.your_company.com
149
150
  authKey: topsecret
150
151
  scmCommand: "svn add %f ; svn commit -m '%m' %f"
@@ -159,7 +160,7 @@ _timesheets:
159
160
  digestRecipients:
160
161
  - managers@your_company.com
161
162
  </pre></div>
162
- <p class="manual">The <code class="manual">smtpServer</code> defines which host will handle your emails. Replace the host name with your local SMTP server. The 'scmCommand' setting contains the command to add and commit new and old files to the source code management system. The command in this example works for Subversion.</p>
163
+ <p class="manual">The <code class="manual">emailDeliveryMethod</code> defines how emails should be sent. Use <code class="manual">smtp</code> to directly send the emails to an SMTP server. The <code class="manual">smtpServer</code> defines which host will handle your emails. Replace the host name with your local SMTP server. Alternatively, you can use the method <code class="manual">sendmail</code> on UNIX-like systems to pass the email to the sendmail tool. In this case, the <code class="manual">smtpServer</code> line can be omitted. The 'scmCommand' setting contains the command to add and commit new and old files to the source code management system. The command in this example works for Subversion.</p>
163
164
  <p class="manual">The TaskJuggler server may serve multiple projects. With the <code class="manual">projectId</code> option you have to specify which project you would like to work with. <code class="manual">senderEmail</code> is the email address the time sheet infrastructure will use. Outgoing emails will have this address as sender so that replies will come back to this email address. We'll cover later how these are processed.</p>
164
165
  <p class="manual">The hideResource option works similarly to the <a href="hideresource.html">hideresource</a> attribute in the report definitions of the project plan. It allows you to restrict the sending of time sheet templates to a subset of your defined resources. In this example, we only want to send templates to individual resources and not the teams you might have defined.</p>
165
166
  <p class="manual">By default the time sheets will cover the week from Monday morning 0:00 to Sunday night 24:00. When called without the <code class="manual">-e</code> option, <code class="manual">tj3ts_sender</code> will send out templates for the current week.</p>
@@ -248,6 +249,7 @@ all
248
249
  <p class="manual">All time sheets should be successfully submitted by Sunday 24:00. After this deadline, your can send out a summary of all submitted time sheets. This summary will also contain a list of those project contributors that have not submitted their time sheet. These individuals will also get a reminder to submit their time sheets immediately.</p>
249
250
  <p class="manual">To send out the summary report, the program <code class="manual">tj3ts_summary</code> is used. Before you can use it, you need to add a few settings to the TaskJuggler configuration file.</p>
250
251
  <div class="manual" codesection="1"><pre class="manual" codesection="1">_global:
252
+ emailDeliveryMethod: smtp
251
253
  smtpServer: smtp.your_company.com
252
254
  authKey: topsecret
253
255
  projectId: prj
@@ -1,10 +1,10 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <!-- This file has been generated by tj3man v3.1.0 -->
4
- <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
1
+ <!DOCTYPE>
2
+ <!-- This file has been generated by tj3man v3.2.0 -->
3
+ <html lang="en" xml:lang="en">
5
4
  <head>
6
5
  <title>Getting_Started</title>
7
6
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
7
+ <meta content="IE=9" http-equiv="X-UA-Compatible"/>
8
8
  </head>
9
9
  <link href="css/tjmanual.css" rel="stylesheet" type="text/css"></link>
10
10
  <body>
@@ -1,10 +1,10 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <!-- This file has been generated by tj3man v3.1.0 -->
4
- <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
1
+ <!DOCTYPE>
2
+ <!-- This file has been generated by tj3man v3.2.0 -->
3
+ <html lang="en" xml:lang="en">
5
4
  <head>
6
5
  <title>How_To_Contribute</title>
7
6
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
7
+ <meta content="IE=9" http-equiv="X-UA-Compatible"/>
8
8
  </head>
9
9
  <link href="css/tjmanual.css" rel="stylesheet" type="text/css"></link>
10
10
  <body>
@@ -1,10 +1,10 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <!-- This file has been generated by tj3man v3.1.0 -->
4
- <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
1
+ <!DOCTYPE>
2
+ <!-- This file has been generated by tj3man v3.2.0 -->
3
+ <html lang="en" xml:lang="en">
5
4
  <head>
6
5
  <title>Installation</title>
7
6
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
7
+ <meta content="IE=9" http-equiv="X-UA-Compatible"/>
8
8
  </head>
9
9
  <link href="css/tjmanual.css" rel="stylesheet" type="text/css"></link>
10
10
  <body>
@@ -135,7 +135,9 @@ export PATH=${PATH}:${TASKJUGGLER_DIR}/bin
135
135
  <p class="manual">The source code is distributed as zipped tarfile. You can extract it like this. Change the file name to the actual version you have downloaded.</p>
136
136
  <div class="manual" codesection="1"><pre class="manual" codesection="1"> tar -Zxvf ruby-X.X.X-*.tar.gz
137
137
  </pre></div>
138
- <p class="manual">This will create a directory with the same name as the archive, but without the <code class="manual">.tar.gz</code> extension. Now change into this directory and configure the source code for your specific OS and compile it. For this to work, you need to have the GNU C compiler and related utilities installed. We configure Ruby to append <code class="manual">19</code> to all executable names. This way, you can easily choose if you want to run the old or the new Ruby. <code class="manual">ruby</code> runs your distribution Ruby, <code class="manual">ruby19</code> runs your new ruby.</p>
138
+ <p class="manual">This will create a directory with the same name as the archive, but without the <code class="manual">.tar.gz</code> extension.</p>
139
+ <p class="manual">Before you continue, make sure you have all the necessary packages installed to compile ruby. That would be everything you need to compile C programs. That includes gcc, make, zlib and libyaml. If something is missing, you will run into problems in the next 2 steps. It's sometimes not obvious which package to install to fix the issue.</p>
140
+ <p class="manual">Now change into this directory and configure the source code for your specific OS and compile it. We configure Ruby to append <code class="manual">19</code> to all executable names. This way, you can easily choose if you want to run the old or the new Ruby. <code class="manual">ruby</code> runs your distribution Ruby, <code class="manual">ruby19</code> runs your new ruby.</p>
139
141
  <div class="manual" codesection="1"><pre class="manual" codesection="1"> cd ruby-X.X.X-*
140
142
  ./configure --program-suffix=19
141
143
  make
@@ -143,16 +145,22 @@ export PATH=${PATH}:${TASKJUGGLER_DIR}/bin
143
145
  <p class="manual">If all goes well, you can install it now. This requires root permission, so you need to enter the root password. All executables will be installed into <code class="manual">/usr/local/bin</code>.</p>
144
146
  <div class="manual" codesection="1"><pre class="manual" codesection="1"> sudo make install
145
147
  </pre></div>
148
+ <p class="manual">The TaskJuggler front-end scripts always use the <code class="manual">ruby</code> interpreter that's the first in the PATH. You need to set a link in your local <code class="manual">bin</code> directory to point to your <code class="manual">ruby19</code> executable as <code class="manual">ruby</code>.</p>
149
+ <div class="manual" codesection="1"><pre class="manual" codesection="1"> ln -s /usr/local/bin/ruby19 ${HOME}/bin/ruby
150
+ </pre></div>
151
+ <p class="manual">Make sure your <code class="manual">${HOME}/bin</code> directory is the first directory in the <code class="manual">PATH</code>. This step varies a lot depending on the login shell. E. g. for <code class="manual">bash</code> put the following at the end in your <code class="manual">.profile</code> shell config file. Please make sure that <code class="manual">/usr/local/bin</code> is also in the PATH so that the ruby executables (all having a <code class="manual">19</code> suffix) will be found as well.</p>
152
+ <div class="manual" codesection="1"><pre class="manual" codesection="1"> export PATH=${HOME}/bin:${PATH}
153
+ </pre></div>
154
+ <p class="manual">Log out and back in again. Now</p>
155
+ <div class="manual" codesection="1"><pre class="manual" codesection="1"> which ruby
156
+ </pre></div>
157
+ <p class="manual">should show return the path to the link to your <code class="manual">${HOME}/bin/ruby</code>. You now have the latest Ruby installed and are ready to use TaskJuggler.</p>
146
158
  <p class="manual">As a final step, you need to install the <code class="manual">mail</code> and <code class="manual">term-ansicolor</code> gems.</p>
147
159
  <div class="manual" codesection="1"><pre class="manual" codesection="1"> sudo gem19 install mail term-ansicolor
148
160
  </pre></div>
149
161
  <p class="manual">If you don't want to use TaskJuggler from the git repository, you can install the TaskJuggler gem as well.</p>
150
162
  <div class="manual" codesection="1"><pre class="manual" codesection="1"> sudo gem19 install taskjuggler
151
163
  </pre></div>
152
- <p class="manual">The TaskJuggler front-end scripts always use the <code class="manual">ruby</code> interpreter that's the first in the PATH. You need to set a link in your local <code class="manual">bin</code> directory to point to your <code class="manual">ruby19</code> executable as <code class="manual">ruby</code>. Make sure your <code class="manual">${HOME}/bin</code> directory is the first directory in the <code class="manual">PATH</code>.</p>
153
- <div class="manual" codesection="1"><pre class="manual" codesection="1"> ln -s /usr/local/bin/ruby19 ${HOME}/bin/ruby
154
- </pre></div>
155
- <p class="manual">That's it. You now have the latest Ruby installed and are ready to use TaskJuggler.</p>
156
164
  <h2 class="manual" id="Installing_the_Vim_Support">2.7 Installing the Vim Support</h2>
157
165
  <p class="manual">TaskJuggler can be used with any text editor that supports UTF-8 text file editing. If you don't have a preference yet, we recommend to try the <a href="http://www.vim.org" target="_top">Vim</a> text editor. It's a very powerful editor and it has been customized for better integration with TaskJuggler. This section describes, how to activate and use the Vim integration. Vim is provided by pretty much any Linux distribution and also works well on MacOX and Windows. See the web page for how to install it if you don't have it yet.</p>
158
166
  <p class="manual">This section describes the integration on Linux. Please see the <a href="How_To_Contribute.html">How_To_Contribute</a> section if you want to contribute the description for another OS.</p>
@@ -176,8 +184,8 @@ augroup END
176
184
  <ul>
177
185
  <li>Syntax highlighting. TJP keywords should be colored in different colors.</li>
178
186
  <li>Syntax folding. The optional parts of properties within the curly braces can be collapsed. For this to work, the opening brace needs to be on the same line as the property keyword. The closing brace must be the first non-blank character of the last line of the block. See the <code class="manual">:help fold</code> Vim help command for details how to open and close folds.</li>
179
- <li>Tag navigation. If you include a <a href="tagfile" target="_top">tagfile</a> report in your project, Vim will know all property IDs and can jump to them. If you have a task with the ID <code class="manual">foo.bar</code>, the command <code class="manual">:ta foo.bar</code> will put the cursor right where task <code class="manual">foo.bar</code> was declared.</li>
180
- <li>ID completion. If you include a <a href="tagfile" target="_top">tagfile</a> report in your project, Vim can tell you the full hierarchical ID of a property. Just move the cursor to the first line of the property definition and press <code class="manual">Ctrl-]</code>.</li>
187
+ <li>Tag navigation. If you include a <a href="tagfile.html">tagfile</a> report in your project, Vim will know all property IDs and can jump to them. If you have a task with the ID <code class="manual">foo.bar</code>, the command <code class="manual">:ta foo.bar</code> will put the cursor right where task <code class="manual">foo.bar</code> was declared.</li>
188
+ <li>ID completion. If you include a <a href="tagfile.html">tagfile</a> report in your project, Vim can tell you the full hierarchical ID of a property. Just move the cursor to the first line of the property definition and press <code class="manual">Ctrl-]</code>.</li>
181
189
  <li>Run tj3 from within vim. Just type <code class="manual">:make your_project.tjp</code> to start the scheduling process. In case of errors or warnings, you will be able to navigate the errors with <code class="manual">:cn</code> and <code class="manual">:cp</code>.</li>
182
190
  <li>Move the cursor over any TaskJuggler syntax keyword and press <code class="manual">shift-k</code> to get the manual page for this keyword.</li>
183
191
  </ul>
@@ -1,10 +1,10 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <!-- This file has been generated by tj3man v3.1.0 -->
4
- <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
1
+ <!DOCTYPE>
2
+ <!-- This file has been generated by tj3man v3.2.0 -->
3
+ <html lang="en" xml:lang="en">
5
4
  <head>
6
5
  <title>Intro</title>
7
6
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
7
+ <meta content="IE=9" http-equiv="X-UA-Compatible"/>
8
8
  </head>
9
9
  <link href="css/tjmanual.css" rel="stylesheet" type="text/css"></link>
10
10
  <body>
@@ -1,10 +1,10 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <!-- This file has been generated by tj3man v3.1.0 -->
4
- <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
1
+ <!DOCTYPE>
2
+ <!-- This file has been generated by tj3man v3.2.0 -->
3
+ <html lang="en" xml:lang="en">
5
4
  <head>
6
5
  <title>Reporting_Bugs</title>
7
6
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
7
+ <meta content="IE=9" http-equiv="X-UA-Compatible"/>
8
8
  </head>
9
9
  <link href="css/tjmanual.css" rel="stylesheet" type="text/css"></link>
10
10
  <body>
@@ -1,10 +1,10 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <!-- This file has been generated by tj3man v3.1.0 -->
4
- <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
1
+ <!DOCTYPE>
2
+ <!-- This file has been generated by tj3man v3.2.0 -->
3
+ <html lang="en" xml:lang="en">
5
4
  <head>
6
5
  <title>Rich_Text_Attributes</title>
7
6
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
7
+ <meta content="IE=9" http-equiv="X-UA-Compatible"/>
8
8
  </head>
9
9
  <link href="css/tjmanual.css" rel="stylesheet" type="text/css"></link>
10
10
  <body>
@@ -1,10 +1,10 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <!-- This file has been generated by tj3man v3.1.0 -->
4
- <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
1
+ <!DOCTYPE>
2
+ <!-- This file has been generated by tj3man v3.2.0 -->
3
+ <html lang="en" xml:lang="en">
5
4
  <head>
6
5
  <title>Software</title>
7
6
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
7
+ <meta content="IE=9" http-equiv="X-UA-Compatible"/>
8
8
  </head>
9
9
  <link href="css/tjmanual.css" rel="stylesheet" type="text/css"></link>
10
10
  <body>
@@ -81,7 +81,7 @@ shift.timesheet
81
81
  <h2 class="manual" id="tj3d">6.3 <code class="manual">tj3d</code>
82
82
  </h2>
83
83
  <p class="manual">
84
- <code class="manual">tj3d</code> is the TaskJuggler daemon. It is a program that runs in the background, disconnected from your shell to provide certain services. It can generate reports on demand and serves them as web pages to a web browser. It's also used to process incoming time sheets.</p>
84
+ <code class="manual">tj3d</code> is the TaskJuggler daemon. It is a program that runs in the background, disconnected from your shell to provide certain services. It can generate reports on demand and processes incoming time sheets or status reports.</p>
85
85
  <p class="manual">Depending on the size of your project the scheduling time can take several minutes or more. Since all operations need to be done on the data of a scheduled project, it makes sense to have this data readily available. This is the job of the TaskJuggler server or daemon in Linux lingo. The program is called <code class="manual">tj3d</code>. When started, it automatically disconnects from the terminal and runs in the background. All interactions with the server are done via the TCP/IP protocol. For security reasons, only connections from the same machine (localhost) are accepted. To get access all clients must provide an authentication key. A TaskJuggler server can serve any number of projects. Once a project has been loaded successfully, clients can retrieve the data in form of reports. Projects are identified by their project ID. If a newly added project has the same ID such as an already loaded project, the new project will replace the old project once it was scheduled successfully. Before you start the server, you need to provide a configuration file with some basic settings.</p>
86
86
  <p class="manual">All taskjuggler components can use the same TaskJuggler configuration file. The format is a simple plain text format that follows the <a href="http://www.yaml.org/" target="_top">YAML specification</a>. The file should be called <code class="manual">.taskjuglerrc</code> or <code class="manual">taskjuggler.rc</code>. The settings are structured by sections. Section names always start with an underscore.</p>
87
87
  <div class="manual" codesection="1"><pre class="manual" codesection="1">_global:
@@ -104,12 +104,6 @@ shift.timesheet
104
104
  <div class="manual" codesection="1"><pre class="manual" codesection="1">tj3d --help
105
105
  </pre></div>
106
106
  <p class="manual">for details.</p>
107
- <p class="manual">The daemon can also be turned into a web server that serves the HTML reports of one or more projects. To enable the web server, start the daemon with the <code class="manual">-w</code> option. By default, the web server is listening on port 8080. This can be changed in the <code class="manual">_global</code> section of the config file.</p>
108
- <div class="manual" codesection="1"><pre class="manual" codesection="1">_global:
109
- authKey: topsecret
110
- webServerPort: 8080
111
- </pre></div>
112
- <p class="manual">To access the HTML reports point your web browser to <code class="manual">http://localhost:8080/taskjuggler</code>. This assumes that the server is running on your local machine. You will then see a list of all loaded projects. Click on the project name to get a list of all reports for this project.</p>
113
107
  <p class="manual">So far, the daemon has not received any kind of security review. We strongly advise you to only use the daemon in a trusted environment with only trusted users!</p>
114
108
  <h2 class="manual" id="tj3client">6.4 <code class="manual">tj3client</code>
115
109
  </h2>
@@ -132,6 +126,16 @@ shift.timesheet
132
126
  <p class="manual">A server that is running can be terminated with the following command.</p>
133
127
  <div class="manual" codesection="1"><pre class="manual" codesection="1">tj3client terminate
134
128
  </pre></div>
129
+ <h2 class="manual" id="tj3webd">6.5 <code class="manual">tj3webd</code>
130
+ </h2>
131
+ <p class="manual">This is a web server to serve the HTML reports of a project to any web browser. The HTML reports are generated on the fly when accessed. <code class="manual">tj3webd</code> requires that <code class="manual">tj3d</code> is already running on the same machine.</p>
132
+ <p class="manual">By default, the web server is listening on port 8080. This can be changed in the <code class="manual">_global</code> section of the config file.</p>
133
+ <div class="manual" codesection="1"><pre class="manual" codesection="1">_global:
134
+ authKey: topsecret
135
+ webServerPort: 8080
136
+ </pre></div>
137
+ <p class="manual">To access the HTML reports point your web browser to <code class="manual">http://localhost:8080/taskjuggler</code>. This assumes that the server is running on your local machine. You will then see a list of all loaded projects. Click on the project name to get a list of all reports for this project.</p>
138
+ <p class="manual"><i>WARNING: Please be aware that the web server when you have started it can be accessed by anybody on your local machine and by anybody that can reach your machine over the network! It will serve all reports of all projects that are hosted by the TaskJuggler daemon.</i></p>
135
139
  </div></div>
136
140
  <br/>
137
141
  <hr/>
@@ -1,10 +1,10 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <!-- This file has been generated by tj3man v3.1.0 -->
4
- <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
1
+ <!DOCTYPE>
2
+ <!-- This file has been generated by tj3man v3.2.0 -->
3
+ <html lang="en" xml:lang="en">
5
4
  <head>
6
5
  <title>TaskJuggler_2x_Migration</title>
7
6
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
7
+ <meta content="IE=9" http-equiv="X-UA-Compatible"/>
8
8
  </head>
9
9
  <link href="css/tjmanual.css" rel="stylesheet" type="text/css"></link>
10
10
  <body>
@@ -1,10 +1,10 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <!-- This file has been generated by tj3man v3.1.0 -->
4
- <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
1
+ <!DOCTYPE>
2
+ <!-- This file has been generated by tj3man v3.2.0 -->
3
+ <html lang="en" xml:lang="en">
5
4
  <head>
6
5
  <title>TaskJuggler_Internals</title>
7
6
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
7
+ <meta content="IE=9" http-equiv="X-UA-Compatible"/>
8
8
  </head>
9
9
  <link href="css/tjmanual.css" rel="stylesheet" type="text/css"></link>
10
10
  <body>
@@ -1,10 +1,10 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <!-- This file has been generated by tj3man v3.1.0 -->
4
- <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
1
+ <!DOCTYPE>
2
+ <!-- This file has been generated by tj3man v3.2.0 -->
3
+ <html lang="en" xml:lang="en">
5
4
  <head>
6
5
  <title>The_TaskJuggler_Syntax</title>
7
6
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
7
+ <meta content="IE=9" http-equiv="X-UA-Compatible"/>
8
8
  </head>
9
9
  <link href="css/tjmanual.css" rel="stylesheet" type="text/css"></link>
10
10
  <body>
@@ -1,10 +1,10 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <!-- This file has been generated by tj3man v3.1.0 -->
4
- <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
1
+ <!DOCTYPE>
2
+ <!-- This file has been generated by tj3man v3.2.0 -->
3
+ <html lang="en" xml:lang="en">
5
4
  <head>
6
5
  <title>Tutorial</title>
7
6
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
7
+ <meta content="IE=9" http-equiv="X-UA-Compatible"/>
8
8
  </head>
9
9
  <link href="css/tjmanual.css" rel="stylesheet" type="text/css"></link>
10
10
  <body>
@@ -23,34 +23,34 @@
23
23
  <br/>
24
24
  <div style="width:90%; margin-left:5%; margin-right:5%"><div class="manual">
25
25
  <h1 class="manual" id="The_Tutorial_Your_first_Project">4 The Tutorial: Your first Project</h1>
26
- <p class="manual">We have mentioned already that TaskJuggler uses plain text files that describe the project to schedule it. As you will see now, the syntax of these files is easy to understand and very intuitive. This chapter will walk you step by step through your first project. You create the project plan for a made-up accounting software project. This project demonstrates some of the commonly used features of TaskJuggler. The complete example can be downloaded <a href="http://www.taskjuggler.org/tj3/examples/Tutorial/tutorial.tjp" target="_top">here</a>. The resulting reports can be found <a href="http://www.taskjuggler.org/tj3/examples/Tutorial/Overview.html" target="_top">here</a>.</p>
26
+ <p class="manual">We have mentioned already that TaskJuggler uses plain text files that capture the known parts of the project. As you will see now, the syntax of these files is easy to understand and very intuitive. This chapter will walk you step by step through your first project. You create the project plan for a made-up accounting software project. This project demonstrates most of the commonly used features of TaskJuggler. It also includes some of the more advanced concepts that you may or may not need for your projects. Don't get scared by them. You can use them once you are more familiar with TaskJuggler and your projects grow larger. The complete tutorial example can be downloaded <a href="http://www.taskjuggler.org/tj3/examples/Tutorial/tutorial.tjp" target="_top">here</a>. You can use any plain text editor to view and modify it. The resulting reports can be found <a href="http://www.taskjuggler.org/tj3/examples/Tutorial/Overview.html" target="_top">here</a>.</p>
27
27
  <h2 class="manual" id="Starting_the_project">4.1 Starting the project</h2>
28
- <p class="manual">To start a TaskJuggler project file you need to use the <a href="project.html">project</a> property. It tells TaskJuggler the name of your project and a start and end date. The start and end dates don't need to be exact, but must fit all tasks of the project. It is the time interval the TaskJuggler scheduler will use to fit the tasks in. So, make it large enough for all your tasks to fit in. But don't make it too large, because this will result in longer scheduling times and higher memory consumption.</p>
28
+ <p class="manual">Every TaskJuggler project file must start with the <a href="project.html">project</a> property. It tells TaskJuggler the name of your project and a start and end date. The start and end dates don't need to be exact, but must fit all tasks of the project. It is the time interval the TaskJuggler scheduler will use to fit the tasks in. So, make it large enough for all your tasks to fit in. But don't make it too large, because this will result in longer scheduling times and higher memory consumption.</p>
29
29
  <div class="codeframe"><pre class="code">project acso "Accounting Software" 2002-01-16 +4m {
30
30
  }
31
31
  </pre></div>
32
- <p class="manual">All TaskJuggler properties have two required attributes, a unique ID and a name, and a set of optional attributes. The name must always be specified. The ID can be omitted if you never have to reference the property from another context. If you omit the ID, TaskJuggler will automatically generate a unique ID. The other optional attributes are always enclosed in curly braces. If no optional attributes are specified, the braces can be omitted as well. In this example we will introduce a number of there attributes that may or may not matter to you. If you don't see an immediate need for a specific attribute, feel free to ignore it for now. You can always come back to them later. A full list of the supported attributes can be found in the <i>attributes</i> section of the <a href="project.html">project</a> property documentation.</p>
33
- <p class="manual">Attributes always start with a keyword that is unique in the context. A context is delimited by a set of curly braces that enclose optional attributes of a property. The area between properties is called the global scope. Usually, attributes have one or more arguments. These arguments can be dates, character strings, numbers or symbols. Strings must be enclosed in single or double quotes. The argument types and meaning is explained for each keyword in the syntax reference section of this manual.</p>
32
+ <p class="manual">All TaskJuggler properties have a unique ID ,a name, and a set of optional attributes. The name must always be specified. The ID can be omitted if you never have to reference the property from another context. If you omit the ID, TaskJuggler will automatically generate a unique ID. The optional attributes are always enclosed in curly braces. If no optional attributes are specified, the braces can be omitted as well. In this example we will introduce a number of the attributes that may or may not matter for your specific projects. If you don't see an immediate need for a specific attribute, feel free to ignore it for now. You can always come back to them later. A full list of the supported project attributes can be found in the <i>attributes</i> section of the <a href="project.html">project</a> property documentation.</p>
33
+ <p class="manual">Attributes always start with a keyword that identifies them. The meaning and parameters of attributes depends on the property context that they are used in. A context is delimited by a set of curly braces that enclose optional attributes of a property. The area outside of any property is called the global scope. Usually, attributes have one or more arguments. These arguments can be dates, character strings, numbers or symbols. Strings must be enclosed in single or double quotes. The argument types and meaning is explained for each keyword in the syntax reference section of this manual.</p>
34
34
  <p class="manual">TaskJuggler manages all events with an accuracy of up to 15 minutes. In many cases, you don't care about this level of accuracy. Nevertheless, it's good to have it when you need it. All dates can optionally be extended by a time. By default, TaskJuggler assumes that all times are UTC (world time) times. If you prefer a different time zone, you need to use the <a href="timezone.html">timezone</a> attribute.</p>
35
35
  <div class="codeframe"><pre class="code"> timezone "Europe/Paris"
36
36
  </pre></div>
37
37
  <p class="manual">Be aware that the project start and end dates in the project header are specified before you specify the time zone. The project header dates are always assumed to be UTC unless you specify differently. See <a href="interval2.html">interval2</a> for details.</p>
38
38
  <div class="manual" codesection="1"><pre class="manual" codesection="1">project acso "Accounting Software" 2002-01-16-0:00-+0100
39
39
  </pre></div>
40
- <p class="manual">The <a href="currency.html">currency</a> attribute specifies the unit of currency values.</p>
40
+ <p class="manual">The <a href="currency.html">currency</a> attribute specifies the unit of all currency values.</p>
41
41
  <div class="codeframe"><pre class="code"> currency "USD"
42
42
  </pre></div>
43
- <p class="manual">Because each culture has its own way of specifying dates and numbers, the format for these are configurable. Use the <a href="timeformat.html">timeformat</a> attribute to specify the default format for dates. This format is used for reports, it does not affect the way you specify dates in the project files. Here you always need to use the <a href="date.html">ISO standardized
43
+ <p class="manual">Because each culture has its own way of specifying dates and numbers, the format for these are configurable. Use the <a href="timeformat.html">timeformat</a> attribute to specify the default format for dates. This format is used for reports, it does not affect the way you specify dates in the project files. Here you always need to use the <a href="date.html">TaskJuggler date
44
44
  notation</a>.</p>
45
45
  <div class="codeframe"><pre class="code"> timeformat "%Y-%m-%d"
46
46
  numberformat "-" "" "," "." 1
47
47
  currencyformat "(" ")" "," "." 0
48
48
  </pre></div>
49
49
  <p class="manual">We also can specify the way numbers or currency values are shown in the reports. Use the <a href="numberformat.html">numberformat</a> and <a href="currencyformat.html">currencyformat</a> attributes for this.</p>
50
- <p class="manual">The optional attribute <a href="now.html">now</a> is used to set the current day for the scheduler to another value than to the moment your invoke TaskJuggler. When this attribute is not present, TaskJuggler will use the current moment of time to determine where you are with your tasks. To get a defined result for the reports in this example we've picked a specific date that fits our purpose here. In your projects, you would use <a href="now.html">now</a> to generate status reports for the date you specify.</p>
50
+ <p class="manual">The attribute <a href="now.html">now</a> is used to set the current day for the scheduler to another value than to the moment your invoke TaskJuggler. If this attribute is not present, TaskJuggler will use the current moment of time to determine where you are with your tasks. To get a defined result for the reports in this example we've picked a specific date that fits our purpose here. In your projects, you would use <a href="now.html">now</a> to generate status reports for the date you specify.</p>
51
51
  <div class="codeframe"><pre class="code"> now 2002-03-05-13:00
52
52
  </pre></div>
53
- <p class="manual">In this tutorial we would like to compare two scenarios of the project. The first scenario is the one that we have planned. The second scenario is how it really happened. The two scenarios have the same task structure, but the start and end dates of the task may vary. In reality we assume that the project got delayed, so we call the second scenario "Delayed". The scenario property is used to specify the scenarios. The delayed scenario is nested into the plan scenario. This tells TaskJuggler to use all values from the plan scenario also for the second scenario unless the second scenario has it's own values. This is a very easy but also powerful way to analyze the impact of certain changes to the plan of record. We'll see further below, how to specify values for a scenario and how to compare the results.</p>
53
+ <p class="manual">In this tutorial we would like to compare two scenarios of the project. The first scenario is the one that we have planned. The second scenario is how it really happened. The two scenarios have the same task structure, but the start and end dates and other attributes of the task that are scenario specific may vary. In this example we assume that the project got delayed and use a second scenario that we name "Delayed" to describe the actual project. The scenario property is used to specify the scenarios. The delayed scenario is nested into the plan scenario. This tells TaskJuggler to use all values from the plan scenario also for the second scenario unless the second scenario has it's own values. This is a very easy but also powerful way to analyze the impact of certain changes to the plan of record. We'll see further below, how to specify values for a scenario and how to compare the results.</p>
54
54
  <div class="codeframe"><pre class="code"> scenario plan "Plan" {
55
55
  scenario delayed "Delayed"
56
56
  }
@@ -85,16 +85,16 @@ notation</a>.</p>
85
85
  }
86
86
  </pre></div>
87
87
  <h2 class="manual" id="Global_Attributes">4.2 Global Attributes</h2>
88
- <p class="manual">For this tutorial, we also like to do a simple profit and loss analysis of the project. We will track labor cost versus customer payments. To calculate the labor costs we have to specify the default daily costs of an employee. This can be changed for certain employees later, but it illustrates an important concept of TaskJuggler – inheritance of attributes. In order to reduce the size of the TaskJuggler project file to a readable minimum, properties inherit many optional attributes from their enclosing scopes. We'll see further below, what this actually means. Right after the project property we are at top-level scope, so this is the default for all following properties.</p>
88
+ <p class="manual">For this tutorial, we also like to do a simple profit and loss analysis of the project. We will track labor cost versus customer payments. To calculate the labor costs we have to specify the default daily costs of an employee. This can be changed for certain employees later, but it illustrates an important concept of TaskJuggler – inheritance of attributes. In order to reduce the size of the TaskJuggler project file to a readable minimum, properties inherit many attributes from their enclosing scopes. We'll see further below, what this actually means. Right after the project property we are at top-level scope, so this is the default for all following properties.</p>
89
89
  <div class="codeframe"><pre class="code">rate 390.0
90
90
  </pre></div>
91
- <p class="manual">The <a href="rate.html">rate</a> attribute can be used to specify the daily costs of resources. All subsequent resources will get this rate. But it can be changed to a different rate at group or individual resource level.</p>
92
- <p class="manual">You may also want to tell TaskJuggler about holidays that affect all resources. Global vacations are time periods where TaskJuggler does not do any resource assignments to tasks.</p>
91
+ <p class="manual">The <a href="rate.html">rate</a> attribute can be used to specify the daily costs of resources. All subsequently declared resources will get this rate. But it can certainly be changed to a different rate at group or individual resource level.</p>
92
+ <p class="manual">You may also want to tell TaskJuggler about holidays that affect all resources. Global holidays are time periods where TaskJuggler does not do any resource assignments to tasks.</p>
93
93
  <div class="codeframe"><pre class="code">leaves holiday "Good Friday" 2002-03-29
94
94
  </pre></div>
95
- <p class="manual">Use the <a href="vacation.html">vacation</a> attribute to define a global vacation. Global vacations must have a name and a date or date range. This is slightly different from vacations of individual resources. They are defined with the <a href="vacation.resource.html">vacation attribute for resources</a> where the name is optional. The vacation name is purely for documentation purposes.</p>
95
+ <p class="manual">Use the <a href="leaves.html">leaves</a> attribute to define a global holiday. Global holidays may have a name and must have a date or date range. Other leaves for individual resources or groups of resources can be defines similarly.</p>
96
96
  <h2 class="manual" id="Macros">4.3 Macros</h2>
97
- <p class="manual">Macros are another TaskJuggler feature to keep project files small. Macros are text patterns that can be defined once and inserted multiple times in the project file. A <a href="macro.html">macro</a> always has a name and the text pattern is enclosed by square brackets.</p>
97
+ <p class="manual">Macros are another TaskJuggler feature to save you typing work and to keep project files small and maintainable. Macros are text patterns that can be defined once and inserted multiple times in the project file. A <a href="macro.html">macro</a> always has a name and the text pattern is enclosed by square brackets.</p>
98
98
  <div class="codeframe"><pre class="code">macro allocate_developers [
99
99
  allocate dev1
100
100
  allocate dev2
@@ -103,19 +103,19 @@ notation</a>.</p>
103
103
  </pre></div>
104
104
  <p class="manual">To use the macro you simply have to write <code class="manual">${allocate_developers}</code> and TaskJuggler will replace the term <code class="manual">${allocate_developers}</code> with the pattern. We will use this macro further below in the example and then explain the meaning of the pattern.</p>
105
105
  <h2 class="manual" id="Declaring_Flags">4.4 Declaring Flags</h2>
106
- <p class="manual">A TaskJuggler feature that you will probably make heavy use of is flags. Once declared you can attach them to many properties. When you generate reports of the TaskJuggler results, you can use the flags to filter out information and limit the report to exactly those details that you want to have included.</p>
106
+ <p class="manual">A TaskJuggler feature that you will probably make heavy use of is flags. Once declared you can attach them to any property. When you generate reports of the TaskJuggler results, you can use the flags to filter out unwanted properties and limit the report to exactly those details that you want to have included.</p>
107
107
  <div class="codeframe"><pre class="code">flags team
108
108
  </pre></div>
109
- <p class="manual">This is flag declaration. All <a href="flags.html">flags</a> need to be declared, before they can be used to avoid hard to find errors due to misspelled flag names. The flags should be declared shortly below the project header. We will see further down, how we can make use of these flags.</p>
109
+ <p class="manual">This is a <a href="flags.html">flags</a> declaration. All flags need to be declared before they can be used to avoid hard to find errors due to misspelled flag names. The flags should be declared before any property at global scope. We will see further down, how we can make use of these flags.</p>
110
110
  <h2 class="manual" id="Declaring_Accounts">4.5 Declaring Accounts</h2>
111
- <p class="manual">The use of our resources will create costs. For a profit and loss analysis, we need to balance the costs against the customer payments. In order not to get lost with all the various amounts, we declare 3 <a href="account.html">accounts</a> to credit the amounts to. We create one account for the development costs, one for the documentation costs, and one for the customer payments.</p>
111
+ <p class="manual">The use of our resources will generate costs. For a profit and loss analysis, we need to balance the cost against the customer payments. In order not to get lost with all the various amounts, we declare 3 <a href="account.html">accounts</a> to credit the amounts to. We create one account for the development costs, one for the documentation costs, and one for the customer payments.</p>
112
112
  <div class="codeframe"><pre class="code">account cost "Project Cost" {
113
113
  account dev "Development"
114
114
  account doc "Documentation"
115
115
  }
116
116
  account rev "Payments"
117
117
  </pre></div>
118
- <p class="manual">Like all TaskJuggler properties, the account needs an ID and a name. IDs may only consist of the characters a to z, A to Z and the underscore. All but the first character may also be digits 0 to 9. All global TaskJuggler properties have IDs. The ID is necessary so that we can reference the property again later without having to write the potentially much longer name. The name may contain space characters and therefore has to be enclosed with single or double quotes.</p>
118
+ <p class="manual">The account needs an ID and a name. IDs may only consist of the characters a to z, A to Z and the underscore. All but the first character may also be digits 0 to 9. The ID is necessary so that we can reference the property again later without having to write the potentially much longer name. The name may contain space characters and therefore has to be enclosed with single or double quotes.</p>
119
119
  <p class="manual">Accounts can be grouped by nesting them. You can use this feature to create sets of accounts. Such sets can then be balanced against each other to create a profit and loss analysis. When you have specified accounts in your project, you must at least define one default <a href="balance.html">balance</a>.</p>
120
120
  <div class="codeframe"><pre class="code">balance cost rev
121
121
  </pre></div>
@@ -163,16 +163,19 @@ resource misc "The Others" {
163
163
  }
164
164
  </pre></div>
165
165
  <p class="manual">This snippet of the example shows the use of the <a href="resource.html">
166
- resource property</a>. Just like accounts, resources always have an ID and a Name. These IDs also need to be unique within their property class. Names are strings and as such enclosed in double quotes. As you can see, resource properties can be nested: <code class="manual">dev</code> is a group or container resource, a team that consists of three other resources.</p>
166
+ resource property</a>. Just like accounts, resources should have an ID and must have a name. Resource IDs, like account IDs must also be unique within their property class. As you can see, resource properties can be nested: <code class="manual">dev</code> is a group or container resource, a team that consists of three other resources.</p>
167
167
  <p class="manual">
168
168
  <code class="manual">dev1</code>, alias Paul Smith, costs more than the normal employee. So the declaration of <code class="manual">dev1</code> overwrites the inherited default rate with a higher value.</p>
169
- <p class="manual">The default value has been inherited from the enclosing scope, resource <code class="manual">dev</code>, which in turn has inherited it from the global scope. The declaration of the resource Klaus Müller uses another optional attribute. With vacation you can specify a certain time interval where the resource is not available. Vacations are list attributes. They accumulate the declarations. If you want to get rid of inherited values, you can use the <a href="purge.html">purge</a> attribute to clear the list.</p>
170
- <p class="manual">It is important that you understand how TaskJuggler handles time intervals. Internally, TaskJuggler uses the number of seconds after January 1st, 1970 to store any date. So all dates are actually stored with an accuracy of 1 second in UTC time. <code class="manual">2002-02-01</code> specifies midnight February 1st, 2002. Following the TaskJuggler concept of requiring as little information as necessary and extending the rest with sensible defaults, TaskJuggler adds the time 0:00:00 if nothing else has been specified. So the vacation ends on midnight February 5th, 2002. Well, almost. Every time you specify a time interval, the end date is not included in the interval. So Klaus Müller's vacation ends exactly at 0:00:00 on February 4th, 2002.</p>
169
+ <p class="manual">The default value has been inherited from the enclosing scope, resource <code class="manual">dev</code>, which in turn has inherited it from the global scope. The declaration of the resource Klaus Müller uses another optional attribute. Attributes are only inherited from the parent property if the attribute was declared in the parent property before the child property declaration was started.</p>
170
+ <p class="manual">The syntax reference lists for each property whether an attribute is inherited from the parent or the attribute in the global scope.</p>
171
+ <p class="manual">With <a href="leaves.html">leaves</a> you can specify certain time intervals where the resource is not available. Leaves are list attributes. They accumulate the declarations. If you want to get rid of inherited or previously assigned values, you can use the <a href="purge.html">purge</a> attribute to clear the list.</p>
172
+ <p class="manual">
173
+ <code class="manual">leaves</code> requires a time interval. It is important to understand how TaskJuggler handles time intervals. Internally, TaskJuggler uses the number of seconds after January 1st, 1970 to store any date. So all dates are actually stored with an accuracy of 1 second in UTC time. <code class="manual">2002-02-01</code> specifies midnight February 1st, 2002. Following the TaskJuggler concept of requiring as little information as necessary and extending the rest with sensible defaults, TaskJuggler adds the time 0:00:00 if nothing else has been specified. So the vacation ends on midnight February 5th, 2002. Well, almost. Every time you specify a time interval, the end date is not included in the interval. So Klaus Müller's vacation ends exactly at 0:00:00 on February 5th, 2002. February 5 is not part of the leave!</p>
171
174
  <p class="manual">Peter Murphy only works 6.4 hours a day. So we use the <a href="limits.resource.html">limits</a> attribute to limit his daily working hours. We could also define exact working hours using the <a href="shift.html">shift
172
175
  property</a>, but we ignore this for now.</p>
173
- <p class="manual">Note that we have attached the flag team after the declaration of the sub-resources to the team resources. This way, these flags don't get passed down to the sub-resources. If we would have declared the flags before the sub-resources, then they would have the flags attached as well.</p>
176
+ <p class="manual">Note that we have attached the flag <code class="manual">team</code> after the declaration of the sub-resources to the team resources. This way, these flags don't get passed down to the sub-resources. If we would have declared the flags before the sub-resources, then they would have the flags attached as well.</p>
174
177
  <h2 class="manual" id="Specifying_the_Tasks">4.7 Specifying the Tasks</h2>
175
- <p class="manual">Let's focus on the real work now. The project should solve a problem: the creation of an accounting software. Because the job is quite complicated, we break it down into several subtasks. We need to do a specification, develop the software, test the software, and write a manual. Using the <a href="task.html">task property</a>, thiis would look as follows:</p>
178
+ <p class="manual">Let's focus on the real work now. The project should solve a problem: the creation of an accounting software. Because the job is quite complicated, we break it down into several subtasks. We need to do a specification, develop the software, test the software, and write a manual. Using the <a href="task.html">task property</a>, this would look as follows:</p>
176
179
  <div class="codeframe"><pre class="code">task AcSo "Accounting Software" {
177
180
  task spec "Specification" {
178
181
  }
@@ -199,15 +202,14 @@ property</a>, but we ignore this for now.</p>
199
202
  depends !deliveries.start
200
203
  }
201
204
  </pre></div>
202
- <p class="manual">The <a href="effort.html">effort</a> to complete the task is specified with 20 man-days. Alternatively we could have used the <a href="length.html">length</a> attribute or the <a href="duration.html">duration</a> attribute. <code class="manual">length</code> specifies the duration of the task in working days while <code class="manual">duration</code> specifies the duration in calendar days. Contrary to <code class="manual">effort</code>, these two don't have to have a specification of the involved resources. Since <code class="manual">effort</code> specifies the duration in man-days, we need to say who should be allocated to the task. The task won't finish before the resources could be allocated long enough to reach the specified effort. Tasks with <code class="manual">length</code> or <code class="manual">duration</code> criteria and allocated resources will last exactly as long as requested. Resources will be allocated only if available. It's possible that such a tasks ends up with no allocations at all since the resources are always assigned to other tasks for that period. Each task can only have one of the three duration criteria. Container tasks may never have a duration specification. They are automatically adjusted to fit all sub tasks.</p>
205
+ <p class="manual">The <a href="effort.html">effort</a> to complete the task is specified with 20 man-days. Alternatively we could have used the <a href="length.html">length</a> attribute or the <a href="duration.html">duration</a> attribute. <code class="manual">length</code> specifies the duration of the task in working days while <code class="manual">duration</code> specifies the duration in calendar days. Contrary to <code class="manual">effort</code>, these two don't have to have a specification of the involved resources. Since <code class="manual">effort</code> specifies the duration in man-days, we need to say who should be allocated to the task. The task won't finish before the resources could be allocated long enough to reach the specified effort. Tasks with <code class="manual">length</code> or <code class="manual">duration</code> criteria and allocated resources will last exactly as long as requested. Resources will be allocated only if available. It's possible that such a tasks ends up with no allocations at all if the resources are always assigned to other tasks for that period. Each task can only have one of the three duration criteria. Container tasks may never have a duration specification. They are automatically adjusted to fit all sub tasks.</p>
203
206
  <p class="manual">Here we use the allocate_developers macro mentioned above. The expression <code class="manual">${allocate_developers}</code> is simply expanded to</p>
204
207
  <div class="codeframe"><pre class="code"> allocate dev1
205
208
  allocate dev2
206
209
  allocate dev3
207
210
  </pre></div>
208
- <p class="manual">If you need to <a href="allocate.html">allocate</a> the same bunch of people to several tasks, the macro saves you some typing. You could have written the allocate attributes directly instead of using the macro. Since the allocation of multiple resources to a task is a very common place for macro usage, we found it a good idea to use it in this example as well.</p>
209
- <p class="manual">One more interesting thing to note is the fact that we like the resource <code class="manual">dev2</code> only to work 4 hours each day on this task, so we use the optional attribute <a href="limits.resource.html">limits.resource</a> to specify this.</p>
210
- <p class="manual">For TaskJuggler to schedule a task, it needs to know either the start and end criteria of a task, or one of them and a duration specification. The start and end criteria can either be fixed dates or relative dates. Relative dates are specifications of the type <i>task B starts after task A has finished</i>. Or in other words, task B depends on task A. In this example the spec task depends on a subtasks of the deliveries task. We have not specified it yet, but it has the local ID start.</p>
211
+ <p class="manual">If you need to <a href="allocate.html">allocate</a> the same bunch of people to several tasks, the macro saves you some typing. You could have written the allocate attributes directly instead of using the macro. Since the allocation of multiple resources to a task is a good place for macro usage, we found it a good idea to use it in this example as well.</p>
212
+ <p class="manual">For TaskJuggler to schedule a task, it needs to know either the start and end criteria of a task, or one of them and a duration specification. The start and end criteria can either be fixed dates or relative dates. Relative dates are specifications of the type <i>task B starts after task A has finished</i>. Or in other words, task B depends on task A. In this example the spec task depends on a subtasks of the deliveries task. We have not specified it yet, but it has the local ID <code class="manual">start</code>.</p>
211
213
  <p class="manual">To specify the dependency between the two tasks, we use the <a href="depends.html">depends</a> attribute. This attribute must be followed by one or more task IDs. If more than one ID is specified, each ID has to be separated with a comma from the previous one. Task IDs can be either absolute IDs or relative IDs. An absolute ID of a task is the ID of this task prepended by the IDs of all enclosing tasks. The task IDs are separated by a dot from each other. The absolute ID of the specification task would be <code class="manual">AcSo.spec</code>.</p>
212
214
  <p class="manual">Relative IDs always start with one or more exclamation marks. Each exclamation mark moves the scope to the next enclosing task. So <code class="manual">!deliveries.start</code> is expanded to <code class="manual">AcSo.deliveries.start</code> since <code class="manual">AcSo</code> is the enclosing task of deliveries. Relative task IDs are a little bit confusing at first, but have a real advantage over absolute IDs. Sooner or later you want to move tasks around in your project and then it's a lot less likely that you have to fix dependency specifications of relative IDs.</p>
213
215
  <p class="manual">The software development task is still too complex to specify it directly. So we split it further into subtasks.</p>
@@ -257,8 +259,15 @@ property</a>, but we ignore this for now.</p>
257
259
  delayed:effort 40d
258
260
  depends !database, !backend
259
261
  allocate dev2, dev3
262
+ # Resource dev2 should only work 6 hours per day on this task.
263
+ limits {
264
+ dailymax 6h {
265
+ resources dev2
266
+ }
267
+ }
260
268
  }
261
269
  </pre></div>
270
+ <p class="manual">One more interesting thing to note is the fact that we like the resource <code class="manual">dev2</code> only to work 6 hours each day on this task, so we use the optional attribute <a href="limits.resource.html">limits.resource</a> to specify this.</p>
262
271
  <p class="manual">TaskJuggler can schedule your project for two different <a href="scenario.html">
263
272
  scenarios</a>. We have called the first scenario <code class="manual">plan</code> scenario and the second <code class="manual">delayed</code> scenario. Many of the reports allow you to put the values of both scenarios side by side to each other, so you can compare the scenarios. All scenario-specific values that are not explicitly stated for the <code class="manual">delayed</code> scenario are taken from the <code class="manual">plan</code> scenario. So the user only has to specify the values that differ in the delayed scenario. The two scenarios must have the same task structure and the same dependencies. But the start and end dates of tasks as well as the duration may vary. In the example we have planned the work on the graphical user interface to be 35 man-days. It turned out that we actually needed 40 man-days. By prefixing the <a href="effort.html">effort</a> attribute with <code class="manual">delayed:</code>, the effort value for the <code class="manual">delayed</code> scenario can be specified.</p>
264
273
  <div class="codeframe"><pre class="code"> task backend "Back-End Functions" {
@@ -443,7 +452,7 @@ generators</a> to include task attributes such as the start and end date.</p>
443
452
  # of the date. %a is the tag for this.
444
453
  timeformat "%a %Y-%m-%d"
445
454
  loadunit days
446
- hideresource 1
455
+ hideresource @all
447
456
  balance cost rev
448
457
  caption 'All effort values are in man days.'
449
458
 
@@ -463,7 +472,7 @@ generators</a> to include task attributes such as the start and end date.</p>
463
472
  </pre></div>
464
473
  <p class="manual">The generated report can be found <a href="http://www.taskjuggler.org/tj3/examples/Overview.html" target="_top">here</a>. It servers as an entry page for the other reports. While it already contains some references, a navigator bar would be handy as well. Fortunately, there is a block generator called 'navigator' to take care of this. But before we can include the navigator in the report, we need to define it first.</p>
465
474
  <div class="codeframe"><pre class="code">navigator navbar {
466
- hidereport 0
475
+ hidereport @none
467
476
  }
468
477
  </pre></div>
469
478
  <p class="manual">