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
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = tj3webd.rb -- The TaskJuggler III Project Management Software
5
+ #
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
+ # by Chris Schlaeger <chris@linux.com>
8
+ #
9
+ # This program is free software; you can redistribute it and/or modify
10
+ # it under the terms of version 2 of the GNU General Public License as
11
+ # published by the Free Software Foundation.
12
+ #
13
+
14
+ require 'taskjuggler/apps/Tj3WebD'
15
+
16
+ exit TaskJuggler::Tj3WebD.new.main()
17
+
@@ -315,6 +315,7 @@ data for ''''tj3ts_sender'''' to your TaskJuggler configuration file.
315
315
  The time sheet related settings have their own top-level section:
316
316
 
317
317
  _global:
318
+ emailDeliveryMethod: smtp
318
319
  smtpServer: smtp.your_company.com
319
320
  authKey: topsecret
320
321
  scmCommand: "svn add %f ; svn commit -m '%m' %f"
@@ -329,10 +330,15 @@ The time sheet related settings have their own top-level section:
329
330
  digestRecipients:
330
331
  - managers@your_company.com
331
332
 
333
+ The ''''emailDeliveryMethod'''' defines how emails should be sent.
334
+ Use ''''smtp'''' to directly send the emails to an SMTP server.
332
335
  The ''''smtpServer'''' defines which host will handle your emails. Replace the
333
- host name with your local SMTP server. The 'scmCommand' setting contains the
334
- command to add and commit new and old files to the source code management
335
- system. The command in this example works for Subversion.
336
+ host name with your local SMTP server. Alternatively, you can use the
337
+ method ''''sendmail'''' on UNIX-like systems to pass the email to the
338
+ sendmail tool. In this case, the ''''smtpServer'''' line can be
339
+ omitted. The 'scmCommand' setting contains the command to add and
340
+ commit new and old files to the source code management system. The
341
+ command in this example works for Subversion.
336
342
 
337
343
  The TaskJuggler server may serve multiple projects. With the
338
344
  ''''projectId'''' option you have to specify which project you would
@@ -545,6 +551,7 @@ used. Before you can use it, you need to add a few settings to the
545
551
  TaskJuggler configuration file.
546
552
 
547
553
  _global:
554
+ emailDeliveryMethod: smtp
548
555
  smtpServer: smtp.your_company.com
549
556
  authKey: topsecret
550
557
  projectId: prj
@@ -275,12 +275,18 @@ downloaded.
275
275
  tar -Zxvf ruby-X.X.X-*.tar.gz
276
276
 
277
277
  This will create a directory with the same name as the archive, but
278
- without the ''''.tar.gz'''' extension. Now change into this directory
279
- and configure the source code for your specific OS and compile it.
280
- For this to work, you need to have the GNU C compiler and related
281
- utilities installed. We configure Ruby to append ''''19'''' to all
282
- executable names. This way, you can easily choose if you want to run
283
- the old or the new Ruby. ''''ruby'''' runs your distribution Ruby,
278
+ without the ''''.tar.gz'''' extension.
279
+
280
+ Before you continue, make sure you have all the necessary packages
281
+ installed to compile ruby. That would be everything you need to
282
+ compile C programs. That includes gcc, make, zlib and libyaml. If
283
+ something is missing, you will run into problems in the next 2 steps.
284
+ It's sometimes not obvious which package to install to fix the issue.
285
+
286
+ Now change into this directory and configure the source code for your
287
+ specific OS and compile it. We configure Ruby to append ''''19'''' to
288
+ all executable names. This way, you can easily choose if you want to
289
+ run the old or the new Ruby. ''''ruby'''' runs your distribution Ruby,
284
290
  ''''ruby19'''' runs your new ruby.
285
291
 
286
292
  cd ruby-X.X.X-*
@@ -293,6 +299,30 @@ will be installed into ''''/usr/local/bin''''.
293
299
 
294
300
  sudo make install
295
301
 
302
+ The TaskJuggler front-end scripts always use the ''''ruby''''
303
+ interpreter that's the first in the PATH. You need to set a link in
304
+ your local ''''bin'''' directory to point to your ''''ruby19''''
305
+ executable as ''''ruby''''.
306
+
307
+ ln -s /usr/local/bin/ruby19 ${HOME}/bin/ruby
308
+
309
+ Make sure your ''''${HOME}/bin'''' directory is the first directory in
310
+ the ''''PATH''''. This step varies a lot depending on the login
311
+ shell. E. g. for ''''bash'''' put the following at the end in your
312
+ ''''.profile'''' shell config file. Please make sure that
313
+ ''''/usr/local/bin'''' is also in the PATH so that the ruby
314
+ executables (all having a ''''19'''' suffix) will be found as well.
315
+
316
+ export PATH=${HOME}/bin:${PATH}
317
+
318
+ Log out and back in again. Now
319
+
320
+ which ruby
321
+
322
+ should show return the path to the link to your
323
+ ''''${HOME}/bin/ruby''''. You now have the latest Ruby installed and
324
+ are ready to use TaskJuggler.
325
+
296
326
  As a final step, you need to install the ''''mail'''' and
297
327
  ''''term-ansicolor'''' gems.
298
328
 
@@ -303,17 +333,6 @@ install the TaskJuggler gem as well.
303
333
 
304
334
  sudo gem19 install taskjuggler
305
335
 
306
- The TaskJuggler front-end scripts always use the ''''ruby''''
307
- interpreter that's the first in the PATH. You need to set a link in
308
- your local ''''bin'''' directory to point to your ''''ruby19''''
309
- executable as ''''ruby''''. Make sure your ''''${HOME}/bin''''
310
- directory is the first directory in the ''''PATH''''.
311
-
312
- ln -s /usr/local/bin/ruby19 ${HOME}/bin/ruby
313
-
314
- That's it. You now have the latest Ruby installed and are ready to
315
- use TaskJuggler.
316
-
317
336
  === Installing the Vim Support ===
318
337
 
319
338
  TaskJuggler can be used with any text editor that supports UTF-8 text
@@ -364,11 +383,11 @@ should have the following features available:
364
383
  must be the first non-blank character of the last line of the
365
384
  block. See the '''':help fold'''' Vim help command for details how
366
385
  to open and close folds.
367
- * Tag navigation. If you include a [tagfile] report in your project,
386
+ * Tag navigation. If you include a [[tagfile]] report in your project,
368
387
  Vim will know all property IDs and can jump to them. If you have a
369
388
  task with the ID ''''foo.bar'''', the command '''':ta foo.bar''''
370
389
  will put the cursor right where task ''''foo.bar'''' was declared.
371
- * ID completion. If you include a [tagfile] report in your project,
390
+ * ID completion. If you include a [[tagfile]] report in your project,
372
391
  Vim can tell you the full hierarchical ID of a property. Just move
373
392
  the cursor to the first line of the property definition and press
374
393
  ''''Ctrl-]''''.
@@ -91,9 +91,8 @@ get this user manual (browser).
91
91
 
92
92
  ''''tj3d'''' is the TaskJuggler daemon. It is a program that runs
93
93
  in the background, disconnected from your shell to provide certain
94
- services. It can generate reports on demand and serves them as web
95
- pages to a web browser. It's also used to process incoming time
96
- sheets.
94
+ services. It can generate reports on demand and processes incoming
95
+ time sheets or status reports.
97
96
 
98
97
  Depending on the size of your project the scheduling time can take
99
98
  several minutes or more. Since all operations need to be done on the
@@ -157,22 +156,6 @@ the ''''-c'''' option. See
157
156
 
158
157
  for details.
159
158
 
160
- The daemon can also be turned into a web server that serves the HTML
161
- reports of one or more projects. To enable the web server, start the
162
- daemon with the ''''-w'''' option. By default, the web server is
163
- listening on port 8080. This can be changed in the ''''_global''''
164
- section of the config file.
165
-
166
- _global:
167
- authKey: topsecret
168
- webServerPort: 8080
169
-
170
- To access the HTML reports point your web browser to
171
- ''''http://localhost:8080/taskjuggler''''. This assumes that the
172
- server is running on your local machine. You will then see a list of
173
- all loaded projects. Click on the project name to get a list of all
174
- reports for this project.
175
-
176
159
  So far, the daemon has not received any kind of security review. We
177
160
  strongly advise you to only use the daemon in a trusted environment
178
161
  with only trusted users!
@@ -213,5 +196,28 @@ A server that is running can be terminated with the following command.
213
196
 
214
197
  tj3client terminate
215
198
 
199
+ === ''''tj3webd'''' ===
200
+
201
+ This is a web server to serve the HTML reports of a project to any
202
+ web browser. The HTML reports are generated on the fly when accessed.
203
+ ''''tj3webd'''' requires that ''''tj3d'''' is already running on the
204
+ same machine.
205
+
206
+ By default, the web server is listening on port 8080. This can be
207
+ changed in the ''''_global'''' section of the config file.
208
+
209
+ _global:
210
+ authKey: topsecret
211
+ webServerPort: 8080
212
+
213
+ To access the HTML reports point your web browser to
214
+ ''''http://localhost:8080/taskjuggler''''. This assumes that the
215
+ server is running on your local machine. You will then see a list of
216
+ all loaded projects. Click on the project name to get a list of all
217
+ reports for this project.
216
218
 
219
+ ''WARNING: Please be aware that the web server when you have started
220
+ it can be accessed by anybody on your local machine and by anybody
221
+ that can reach your machine over the network! It will serve all
222
+ reports of all projects that are hosted by the TaskJuggler daemon.''
217
223
 
@@ -1,50 +1,54 @@
1
1
  == The Tutorial: Your first Project ==
2
2
 
3
3
  We have mentioned already that TaskJuggler uses plain text files that
4
- describe the project to schedule it. As you will see now, the syntax
4
+ capture the known parts of the project. As you will see now, the syntax
5
5
  of these files is easy to understand and very intuitive. This chapter
6
6
  will walk you step by step through your first project. You create the
7
7
  project plan for a made-up accounting software project. This project
8
- demonstrates some of the commonly used features of TaskJuggler. The
9
- complete example can be downloaded
10
- [http://www.taskjuggler.org/tj3/examples/Tutorial/tutorial.tjp here]. The
8
+ demonstrates most of the commonly used features of TaskJuggler. It
9
+ also includes some of the more advanced concepts that you may or may
10
+ not need for your projects. Don't get scared by them. You can use
11
+ them once you are more familiar with TaskJuggler and your projects
12
+ grow larger. The complete tutorial example can be downloaded
13
+ [http://www.taskjuggler.org/tj3/examples/Tutorial/tutorial.tjp here].
14
+ You can use any plain text editor to view and modify it. The
11
15
  resulting reports can be found
12
- [http://www.taskjuggler.org/tj3/examples/Tutorial/Overview.html
13
- here].
16
+ [http://www.taskjuggler.org/tj3/examples/Tutorial/Overview.html here].
14
17
 
15
18
  === Starting the project ===
16
19
 
17
- To start a TaskJuggler project file you need to use the [[project]]
20
+ Every TaskJuggler project file must start with the [[project]]
18
21
  property. It tells TaskJuggler the name of your project and a start
19
22
  and end date. The start and end dates don't need to be exact, but must
20
- fit all tasks of the project. It is the time interval the TaskJuggler
23
+ fit all tasks of the project. It is the time interval the TaskJuggler
21
24
  scheduler will use to fit the tasks in. So, make it large enough for
22
25
  all your tasks to fit in. But don't make it too large, because this
23
26
  will result in longer scheduling times and higher memory consumption.
24
27
 
25
28
  <[example file="tutorial" tag="header1"]>
26
29
 
27
- All TaskJuggler properties have two required attributes, a unique ID
28
- and a name, and a set of optional attributes. The name must always be
29
- specified. The ID can be omitted if you never have to reference the
30
- property from another context. If you omit the ID, TaskJuggler will
31
- automatically generate a unique ID. The other optional attributes are
32
- always enclosed in curly braces. If no optional attributes are
33
- specified, the braces can be omitted as well. In this example we will
34
- introduce a number of there attributes that may or may not matter to
35
- you. If you don't see an immediate need for a specific attribute, feel
36
- free to ignore it for now. You can always come back to them later. A
37
- full list of the supported attributes can be found in the
38
- ''attributes'' section of the [[project]] property documentation.
39
-
40
- Attributes always start with a keyword that is unique in the context.
41
- A context is delimited by a set of curly braces that enclose optional
42
- attributes of a property. The area between properties is called the
43
- global scope. Usually, attributes have one or more arguments. These
44
- arguments can be dates, character strings, numbers or symbols. Strings
45
- must be enclosed in single or double quotes. The argument types and
46
- meaning is explained for each keyword in the syntax reference section
47
- of this manual.
30
+ All TaskJuggler properties have a unique ID ,a name, and a set of
31
+ optional attributes. The name must always be specified. The ID can be
32
+ omitted if you never have to reference the property from another
33
+ context. If you omit the ID, TaskJuggler will automatically generate a
34
+ unique ID. The optional attributes are always enclosed in curly
35
+ braces. If no optional attributes are specified, the braces can be
36
+ omitted as well. In this example we will introduce a number of the
37
+ attributes that may or may not matter for your specific projects. If
38
+ you don't see an immediate need for a specific attribute, feel free to
39
+ ignore it for now. You can always come back to them later. A full list
40
+ of the supported project attributes can be found in the ''attributes''
41
+ section of the [[project]] property documentation.
42
+
43
+ Attributes always start with a keyword that identifies them. The
44
+ meaning and parameters of attributes depends on the property context
45
+ that they are used in. A context is delimited by a set of curly
46
+ braces that enclose optional attributes of a property. The area
47
+ outside of any property is called the global scope. Usually,
48
+ attributes have one or more arguments. These arguments can be dates,
49
+ character strings, numbers or symbols. Strings must be enclosed in
50
+ single or double quotes. The argument types and meaning is explained
51
+ for each keyword in the syntax reference section of this manual.
48
52
 
49
53
  TaskJuggler manages all events with an accuracy of up to 15 minutes.
50
54
  In many cases, you don't care about this level of accuracy.
@@ -62,7 +66,7 @@ See [[interval2]] for details.
62
66
 
63
67
  project acso "Accounting Software" 2002-01-16-0:00-+0100
64
68
 
65
- The [[currency]] attribute specifies the unit of currency values.
69
+ The [[currency]] attribute specifies the unit of all currency values.
66
70
 
67
71
  <[example file="tutorial" tag="currency"]>
68
72
 
@@ -70,7 +74,7 @@ Because each culture has its own way of specifying dates and numbers,
70
74
  the format for these are configurable. Use the [[timeformat]]
71
75
  attribute to specify the default format for dates. This format is used
72
76
  for reports, it does not affect the way you specify dates in the
73
- project files. Here you always need to use the [[date|ISO standardized
77
+ project files. Here you always need to use the [[date|TaskJuggler date
74
78
  notation]].
75
79
 
76
80
  <[example file="tutorial" tag="formats"]>
@@ -79,9 +83,9 @@ We also can specify the way numbers or currency values are shown in
79
83
  the reports. Use the [[numberformat]] and [[currencyformat]]
80
84
  attributes for this.
81
85
 
82
- The optional attribute [[now]] is used to set the current day for the
86
+ The attribute [[now]] is used to set the current day for the
83
87
  scheduler to another value than to the moment your invoke TaskJuggler.
84
- When this attribute is not present, TaskJuggler will use the current
88
+ If this attribute is not present, TaskJuggler will use the current
85
89
  moment of time to determine where you are with your tasks. To get a
86
90
  defined result for the reports in this example we've picked a specific
87
91
  date that fits our purpose here. In your projects, you would use
@@ -92,16 +96,17 @@ date that fits our purpose here. In your projects, you would use
92
96
  In this tutorial we would like to compare two scenarios of the
93
97
  project. The first scenario is the one that we have planned. The
94
98
  second scenario is how it really happened. The two scenarios have the
95
- same task structure, but the start and end dates of the task may vary.
96
- In reality we assume that the project got delayed, so we call the
97
- second scenario "Delayed". The scenario property is used to specify
98
- the scenarios. The delayed scenario is nested into the plan scenario.
99
- This tells TaskJuggler to use all values from the plan scenario also
100
- for the second scenario unless the second scenario has it's own
101
- values. This is a very easy but also powerful way to analyze the
102
- impact of certain changes to the plan of record. We'll see further
103
- below, how to specify values for a scenario and how to compare the
104
- results.
99
+ same task structure, but the start and end dates and other attributes
100
+ of the task that are scenario specific may vary. In this example we
101
+ assume that the project got delayed and use a second scenario that we
102
+ name "Delayed" to describe the actual project. The scenario property
103
+ is used to specify the scenarios. The delayed scenario is nested into
104
+ the plan scenario. This tells TaskJuggler to use all values from the
105
+ plan scenario also for the second scenario unless the second scenario
106
+ has it's own values. This is a very easy but also powerful way to
107
+ analyze the impact of certain changes to the plan of record. We'll
108
+ see further below, how to specify values for a scenario and how to
109
+ compare the results.
105
110
 
106
111
  <[example file="tutorial" tag="scenario"]>
107
112
 
@@ -120,36 +125,34 @@ daily costs of an employee. This can be changed for certain employees
120
125
  later, but it illustrates an important concept of TaskJuggler –
121
126
  inheritance of attributes. In order to reduce the size of the
122
127
  TaskJuggler project file to a readable minimum, properties inherit
123
- many optional attributes from their enclosing scopes. We'll see
124
- further below, what this actually means. Right after the project
125
- property we are at top-level scope, so this is the default for all
126
- following properties.
128
+ many attributes from their enclosing scopes. We'll see further below,
129
+ what this actually means. Right after the project property we are at
130
+ top-level scope, so this is the default for all following properties.
127
131
 
128
132
  <[example file="tutorial" tag="rate"]>
129
133
 
130
134
  The [[rate]] attribute can be used to specify the daily costs of
131
- resources. All subsequent resources will get this rate. But it can be
132
- changed to a different rate at group or individual resource level.
135
+ resources. All subsequently declared resources will get this rate. But
136
+ it can certainly be changed to a different rate at group or individual
137
+ resource level.
133
138
 
134
139
  You may also want to tell TaskJuggler about holidays that affect
135
- all resources. Global vacations are time periods where TaskJuggler
140
+ all resources. Global holidays are time periods where TaskJuggler
136
141
  does not do any resource assignments to tasks.
137
142
 
138
143
  <[example file="tutorial" tag="vacation"]>
139
144
 
140
- Use the [[vacation]] attribute to define a global vacation. Global
141
- vacations must have a name and a date or date range. This is slightly
142
- different from vacations of individual resources. They are defined
143
- with the [[vacation.resource|vacation attribute for resources]] where
144
- the name is optional. The vacation name is purely for documentation
145
- purposes.
145
+ Use the [[leaves]] attribute to define a global holiday. Global
146
+ holidays may have a name and must have a date or date range. Other leaves for
147
+ individual resources or groups of resources can be defines similarly.
146
148
 
147
149
  === Macros ===
148
150
 
149
- Macros are another TaskJuggler feature to keep project files small.
150
- Macros are text patterns that can be defined once and inserted
151
- multiple times in the project file. A [[macro]] always has a name and the
152
- text pattern is enclosed by square brackets.
151
+ Macros are another TaskJuggler feature to save you typing work and to
152
+ keep project files small and maintainable. Macros are text patterns
153
+ that can be defined once and inserted multiple times in the project
154
+ file. A [[macro]] always has a name and the text pattern is enclosed
155
+ by square brackets.
153
156
 
154
157
  <[example file="tutorial" tag="macro"]>
155
158
 
@@ -162,22 +165,22 @@ pattern.
162
165
  === Declaring Flags ===
163
166
 
164
167
  A TaskJuggler feature that you will probably make heavy use of is
165
- flags. Once declared you can attach them to many properties. When you
168
+ flags. Once declared you can attach them to any property. When you
166
169
  generate reports of the TaskJuggler results, you can use the flags to
167
- filter out information and limit the report to exactly those details
168
- that you want to have included.
170
+ filter out unwanted properties and limit the report to exactly those
171
+ details that you want to have included.
169
172
 
170
173
  <[example file="tutorial" tag="flags"]>
171
174
 
172
- This is flag declaration. All [[flags]] need to be declared, before they
173
- can be used to avoid hard to find errors due to misspelled flag
174
- names. The flags should be declared shortly below the project header.
175
- We will see further down, how we can make use of these flags.
175
+ This is a [[flags]] declaration. All flags need to be declared before
176
+ they can be used to avoid hard to find errors due to misspelled flag
177
+ names. The flags should be declared before any property at global
178
+ scope. We will see further down, how we can make use of these flags.
176
179
 
177
180
  === Declaring Accounts ===
178
181
 
179
- The use of our resources will create costs. For a profit and loss
180
- analysis, we need to balance the costs against the customer payments.
182
+ The use of our resources will generate costs. For a profit and loss
183
+ analysis, we need to balance the cost against the customer payments.
181
184
  In order not to get lost with all the various amounts, we declare 3
182
185
  [[account|accounts]] to credit the amounts to. We create one account
183
186
  for the development costs, one for the documentation costs, and one
@@ -185,14 +188,12 @@ for the customer payments.
185
188
 
186
189
  <[example file="tutorial" tag="accounts"]>
187
190
 
188
- Like all TaskJuggler properties, the account needs an ID and a name.
189
- IDs may only consist of the characters a to z, A to Z and the
190
- underscore. All but the first character may also be digits 0 to 9.
191
- All global TaskJuggler properties have IDs. The ID is necessary so
192
- that we can reference the property again later without having to write
193
- the potentially much longer name. The name may contain space
194
- characters and therefore has to be enclosed with single or double
195
- quotes.
191
+ The account needs an ID and a name. IDs may only consist of the
192
+ characters a to z, A to Z and the underscore. All but the first
193
+ character may also be digits 0 to 9. The ID is necessary so that we
194
+ can reference the property again later without having to write the
195
+ potentially much longer name. The name may contain space characters
196
+ and therefore has to be enclosed with single or double quotes.
196
197
 
197
198
  Accounts can be grouped by nesting them. You can use this feature to
198
199
  create sets of accounts. Such sets can then be balanced against each
@@ -211,11 +212,11 @@ project.
211
212
  <[example file="tutorial" tag="resources"]>
212
213
 
213
214
  This snippet of the example shows the use of the [[resource|
214
- resource property]]. Just like accounts, resources always have an ID
215
- and a Name. These IDs also need to be unique within their property
216
- class. Names are strings and as such enclosed in double quotes. As
217
- you can see, resource properties can be nested: ''''dev'''' is a group
218
- or container resource, a team that consists of three other resources.
215
+ resource property]]. Just like accounts, resources should have an ID
216
+ and must have a name. Resource IDs, like account IDs must also be
217
+ unique within their property class. As you can see, resource
218
+ properties can be nested: ''''dev'''' is a group or container
219
+ resource, a team that consists of three other resources.
219
220
 
220
221
  ''''dev1'''', alias Paul Smith, costs more than the normal employee.
221
222
  So the declaration of ''''dev1'''' overwrites the inherited default
@@ -224,34 +225,42 @@ rate with a higher value.
224
225
  The default value has been inherited from the enclosing scope,
225
226
  resource ''''dev'''', which in turn has inherited it from the global
226
227
  scope. The declaration of the resource Klaus Müller uses another
227
- optional attribute. With vacation you can specify a certain time
228
- interval where the resource is not available. Vacations are list
229
- attributes. They accumulate the declarations. If you want to get rid
230
- of inherited values, you can use the [[purge]] attribute to clear the
228
+ optional attribute. Attributes are only inherited from the parent
229
+ property if the attribute was declared in the parent property before
230
+ the child property declaration was started.
231
+
232
+ The syntax reference lists for each property whether an attribute is
233
+ inherited from the parent or the attribute in the global scope.
234
+
235
+ With [[leaves]] you can specify certain time intervals where the
236
+ resource is not available. Leaves are list attributes. They accumulate
237
+ the declarations. If you want to get rid of inherited or previously
238
+ assigned values, you can use the [[purge]] attribute to clear the
231
239
  list.
232
240
 
233
- It is important that you understand how TaskJuggler handles time
234
- intervals. Internally, TaskJuggler uses the number of seconds after
235
- January 1st, 1970 to store any date. So all dates are actually stored
236
- with an accuracy of 1 second in UTC time. ''''2002-02-01'''' specifies
237
- midnight February 1st, 2002. Following the TaskJuggler concept of
238
- requiring as little information as necessary and extending the rest
239
- with sensible defaults, TaskJuggler adds the time 0:00:00 if nothing
240
- else has been specified. So the vacation ends on midnight February
241
- 5th, 2002. Well, almost. Every time you specify a time interval, the
242
- end date is not included in the interval. So Klaus Müller's vacation
243
- ends exactly at 0:00:00 on February 4th, 2002.
241
+ ''''leaves'''' requires a time interval. It is important to understand
242
+ how TaskJuggler handles time intervals. Internally, TaskJuggler uses
243
+ the number of seconds after January 1st, 1970 to store any date. So
244
+ all dates are actually stored with an accuracy of 1 second in UTC
245
+ time. ''''2002-02-01'''' specifies midnight February 1st, 2002.
246
+ Following the TaskJuggler concept of requiring as little information
247
+ as necessary and extending the rest with sensible defaults,
248
+ TaskJuggler adds the time 0:00:00 if nothing else has been specified.
249
+ So the vacation ends on midnight February 5th, 2002. Well, almost.
250
+ Every time you specify a time interval, the end date is not included
251
+ in the interval. So Klaus Müller's vacation ends exactly at 0:00:00 on
252
+ February 5th, 2002. February 5 is not part of the leave!
244
253
 
245
254
  Peter Murphy only works 6.4 hours a day. So we use the
246
255
  [[limits.resource|limits]] attribute to limit his daily working hours.
247
256
  We could also define exact working hours using the [[shift|shift
248
257
  property]], but we ignore this for now.
249
258
 
250
- Note that we have attached the flag team after the declaration of the
251
- sub-resources to the team resources. This way, these flags don't get
252
- passed down to the sub-resources. If we would have declared the flags
253
- before the sub-resources, then they would have the flags attached as
254
- well.
259
+ Note that we have attached the flag ''''team'''' after the declaration
260
+ of the sub-resources to the team resources. This way, these flags
261
+ don't get passed down to the sub-resources. If we would have declared
262
+ the flags before the sub-resources, then they would have the flags
263
+ attached as well.
255
264
 
256
265
  === Specifying the Tasks ===
257
266
 
@@ -259,7 +268,7 @@ Let's focus on the real work now. The project should solve a problem:
259
268
  the creation of an accounting software. Because the job is quite
260
269
  complicated, we break it down into several subtasks. We need to do a
261
270
  specification, develop the software, test the software, and write a
262
- manual. Using the [[task|task property]], thiis would look as follows:
271
+ manual. Using the [[task|task property]], this would look as follows:
263
272
 
264
273
  <[example file="tutorial" tag="task1"]>
265
274
 
@@ -296,7 +305,7 @@ resources could be allocated long enough to reach the specified
296
305
  effort. Tasks with ''''length'''' or ''''duration'''' criteria and
297
306
  allocated resources will last exactly as long as requested. Resources
298
307
  will be allocated only if available. It's possible that such a tasks
299
- ends up with no allocations at all since the resources are always
308
+ ends up with no allocations at all if the resources are always
300
309
  assigned to other tasks for that period. Each task can only have one
301
310
  of the three duration criteria. Container tasks may never have a
302
311
  duration specification. They are automatically adjusted to fit all
@@ -310,13 +319,9 @@ expression ''''${allocate_developers}'''' is simply expanded to
310
319
  If you need to [[allocate]] the same bunch of people to several tasks,
311
320
  the macro saves you some typing. You could have written the allocate
312
321
  attributes directly instead of using the macro. Since the allocation
313
- of multiple resources to a task is a very common place for macro
322
+ of multiple resources to a task is a good place for macro
314
323
  usage, we found it a good idea to use it in this example as well.
315
324
 
316
- One more interesting thing to note is the fact that we like the
317
- resource ''''dev2'''' only to work 4 hours each day on this task, so
318
- we use the optional attribute [[limits.resource]] to specify this.
319
-
320
325
  For TaskJuggler to schedule a task, it needs to know either the start
321
326
  and end criteria of a task, or one of them and a duration
322
327
  specification. The start and end criteria can either be fixed dates or
@@ -324,7 +329,7 @@ relative dates. Relative dates are specifications of the type ''task B
324
329
  starts after task A has finished''. Or in other words, task B depends
325
330
  on task A. In this example the spec task depends on a subtasks of the
326
331
  deliveries task. We have not specified it yet, but it has the local ID
327
- start.
332
+ ''''start''''.
328
333
 
329
334
  To specify the dependency between the two tasks, we use the
330
335
  [[depends]] attribute. This attribute must be followed by one or more
@@ -370,6 +375,10 @@ the AcSo scope that contains the spec tasks. For a change, we
370
375
 
371
376
  <[example file="tutorial" tag="gui"]>
372
377
 
378
+ One more interesting thing to note is the fact that we like the
379
+ resource ''''dev2'''' only to work 6 hours each day on this task, so
380
+ we use the optional attribute [[limits.resource]] to specify this.
381
+
373
382
  TaskJuggler can schedule your project for two different [[scenario|
374
383
  scenarios]]. We have called the first scenario ''''plan'''' scenario
375
384
  and the second ''''delayed'''' scenario. Many of the reports allow you