taskjuggler 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (553) hide show
  1. data/CHANGELOG +61 -0
  2. data/README.rdoc +43 -27
  3. data/data/css/tjreport.css +30 -0
  4. data/data/tjp.vim +100 -89
  5. data/examples/ProjectTemplate/template.tjp +338 -0
  6. data/examples/ToDo-List/todolist.tjp +84 -0
  7. data/examples/{tutorial.tjp → Tutorial/tutorial.tjp} +9 -7
  8. data/lib/header.tmpl +1 -1
  9. data/lib/taskjuggler/Account.rb +2 -2
  10. data/lib/taskjuggler/AccountCredit.rb +29 -0
  11. data/lib/taskjuggler/AccountScenario.rb +73 -7
  12. data/lib/taskjuggler/AlertLevelDefinitions.rb +104 -0
  13. data/lib/taskjuggler/AlgorithmDiff.rb +2 -2
  14. data/lib/taskjuggler/Allocation.rb +1 -1
  15. data/lib/taskjuggler/AppConfig.rb +1 -1
  16. data/lib/taskjuggler/AttributeBase.rb +1 -1
  17. data/lib/taskjuggler/AttributeDefinition.rb +1 -1
  18. data/lib/taskjuggler/Attributes.rb +40 -3
  19. data/lib/taskjuggler/BatchProcessor.rb +15 -14
  20. data/lib/taskjuggler/Booking.rb +1 -1
  21. data/lib/taskjuggler/Charge.rb +2 -2
  22. data/lib/taskjuggler/ChargeSet.rb +1 -1
  23. data/lib/taskjuggler/DataCache.rb +24 -12
  24. data/lib/taskjuggler/FileList.rb +1 -1
  25. data/lib/taskjuggler/HTMLDocument.rb +1 -1
  26. data/lib/taskjuggler/HTMLElements.rb +1 -1
  27. data/lib/taskjuggler/ICalendar.rb +1 -1
  28. data/lib/taskjuggler/Interval.rb +1 -1
  29. data/lib/taskjuggler/IntervalList.rb +1 -1
  30. data/lib/taskjuggler/Journal.rb +61 -41
  31. data/lib/taskjuggler/KeywordArray.rb +1 -1
  32. data/lib/taskjuggler/KeywordDocumentation.rb +121 -33
  33. data/lib/taskjuggler/LeaveList.rb +103 -0
  34. data/lib/taskjuggler/Limits.rb +1 -1
  35. data/lib/taskjuggler/Log.rb +6 -3
  36. data/lib/taskjuggler/LogFile.rb +1 -1
  37. data/lib/taskjuggler/LogicalExpression.rb +1 -1
  38. data/lib/taskjuggler/LogicalFunction.rb +16 -2
  39. data/lib/taskjuggler/LogicalOperation.rb +3 -1
  40. data/lib/taskjuggler/MessageHandler.rb +13 -4
  41. data/lib/taskjuggler/PTNProxy.rb +118 -0
  42. data/lib/taskjuggler/Project.rb +58 -67
  43. data/lib/taskjuggler/ProjectFileParser.rb +39 -5
  44. data/lib/taskjuggler/ProjectFileScanner.rb +1 -1
  45. data/lib/taskjuggler/PropertyList.rb +26 -2
  46. data/lib/taskjuggler/PropertySet.rb +8 -1
  47. data/lib/taskjuggler/PropertyTreeNode.rb +36 -32
  48. data/lib/taskjuggler/Query.rb +1 -1
  49. data/lib/taskjuggler/RealFormat.rb +4 -2
  50. data/lib/taskjuggler/Resource.rb +3 -3
  51. data/lib/taskjuggler/ResourceScenario.rb +219 -140
  52. data/lib/taskjuggler/RichText.rb +1 -1
  53. data/lib/taskjuggler/RichText/Document.rb +2 -2
  54. data/lib/taskjuggler/RichText/Element.rb +2 -2
  55. data/lib/taskjuggler/RichText/FunctionExample.rb +2 -2
  56. data/lib/taskjuggler/RichText/FunctionHandler.rb +2 -2
  57. data/lib/taskjuggler/RichText/Parser.rb +2 -2
  58. data/lib/taskjuggler/RichText/RTFHandlers.rb +1 -1
  59. data/lib/taskjuggler/RichText/RTFNavigator.rb +1 -1
  60. data/lib/taskjuggler/RichText/RTFQuery.rb +1 -1
  61. data/lib/taskjuggler/RichText/RTFReport.rb +1 -1
  62. data/lib/taskjuggler/RichText/RTFReportLink.rb +1 -1
  63. data/lib/taskjuggler/RichText/RTFWithQuerySupport.rb +1 -1
  64. data/lib/taskjuggler/RichText/Scanner.rb +18 -4
  65. data/lib/taskjuggler/RichText/Snip.rb +2 -2
  66. data/lib/taskjuggler/RichText/SyntaxRules.rb +6 -14
  67. data/lib/taskjuggler/RichText/TOCEntry.rb +16 -7
  68. data/lib/taskjuggler/RichText/TableOfContents.rb +3 -2
  69. data/lib/taskjuggler/RuntimeConfig.rb +1 -1
  70. data/lib/taskjuggler/Scenario.rb +1 -1
  71. data/lib/taskjuggler/ScenarioData.rb +1 -1
  72. data/lib/taskjuggler/Scoreboard.rb +1 -1
  73. data/lib/taskjuggler/SheetHandlerBase.rb +1 -1
  74. data/lib/taskjuggler/SheetReceiver.rb +1 -1
  75. data/lib/taskjuggler/SheetSender.rb +3 -3
  76. data/lib/taskjuggler/Shift.rb +2 -2
  77. data/lib/taskjuggler/ShiftAssignments.rb +24 -19
  78. data/lib/taskjuggler/ShiftScenario.rb +4 -4
  79. data/lib/taskjuggler/SimpleQueryExpander.rb +1 -1
  80. data/lib/taskjuggler/StatusSheetReceiver.rb +1 -1
  81. data/lib/taskjuggler/StatusSheetSender.rb +1 -1
  82. data/lib/taskjuggler/StdIoWrapper.rb +1 -1
  83. data/lib/taskjuggler/SyntaxReference.rb +5 -2
  84. data/lib/taskjuggler/TableColumnDefinition.rb +1 -1
  85. data/lib/taskjuggler/Task.rb +4 -8
  86. data/lib/taskjuggler/TaskDependency.rb +1 -1
  87. data/lib/taskjuggler/TaskJuggler.rb +1 -1
  88. data/lib/taskjuggler/TaskScenario.rb +131 -51
  89. data/lib/taskjuggler/TernarySearchTree.rb +6 -4
  90. data/lib/taskjuggler/TextFormatter.rb +9 -2
  91. data/lib/taskjuggler/TextParser.rb +13 -3
  92. data/lib/taskjuggler/TextParser/MacroTable.rb +1 -1
  93. data/lib/taskjuggler/TextParser/Pattern.rb +52 -8
  94. data/lib/taskjuggler/TextParser/Rule.rb +11 -5
  95. data/lib/taskjuggler/TextParser/Scanner.rb +1 -1
  96. data/lib/taskjuggler/TextParser/SourceFileInfo.rb +1 -1
  97. data/lib/taskjuggler/TextParser/StackElement.rb +1 -1
  98. data/lib/taskjuggler/TextParser/State.rb +2 -2
  99. data/lib/taskjuggler/TextParser/TokenDoc.rb +1 -1
  100. data/lib/taskjuggler/TimeSheetReceiver.rb +1 -1
  101. data/lib/taskjuggler/TimeSheetSender.rb +1 -1
  102. data/lib/taskjuggler/TimeSheetSummary.rb +1 -1
  103. data/lib/taskjuggler/TimeSheets.rb +4 -6
  104. data/lib/taskjuggler/Tj3AppBase.rb +18 -1
  105. data/lib/taskjuggler/Tj3Config.rb +4 -4
  106. data/lib/taskjuggler/Tj3SheetAppBase.rb +1 -1
  107. data/lib/taskjuggler/TjException.rb +1 -1
  108. data/lib/taskjuggler/TjTime.rb +1 -1
  109. data/lib/taskjuggler/TjpExample.rb +1 -1
  110. data/lib/taskjuggler/TjpSyntaxRules.rb +920 -392
  111. data/lib/taskjuggler/URLParameter.rb +1 -1
  112. data/lib/taskjuggler/UTF8String.rb +1 -1
  113. data/lib/taskjuggler/UserManual.rb +1 -1
  114. data/lib/taskjuggler/VimSyntax.rb +9 -6
  115. data/lib/taskjuggler/WorkingHours.rb +12 -1
  116. data/lib/taskjuggler/XMLDocument.rb +1 -1
  117. data/lib/taskjuggler/XMLElement.rb +1 -1
  118. data/lib/taskjuggler/apps/Tj3.rb +8 -3
  119. data/lib/taskjuggler/apps/Tj3Client.rb +1 -1
  120. data/lib/taskjuggler/apps/Tj3Daemon.rb +1 -1
  121. data/lib/taskjuggler/apps/Tj3Man.rb +1 -1
  122. data/lib/taskjuggler/apps/Tj3SsReceiver.rb +2 -2
  123. data/lib/taskjuggler/apps/Tj3SsSender.rb +1 -1
  124. data/lib/taskjuggler/apps/Tj3TsReceiver.rb +1 -1
  125. data/lib/taskjuggler/apps/Tj3TsSender.rb +1 -1
  126. data/lib/taskjuggler/apps/Tj3TsSummary.rb +1 -1
  127. data/lib/taskjuggler/daemon/Daemon.rb +1 -1
  128. data/lib/taskjuggler/daemon/ProcessIntercom.rb +1 -1
  129. data/lib/taskjuggler/daemon/ProjectBroker.rb +1 -1
  130. data/lib/taskjuggler/daemon/ProjectServer.rb +1 -1
  131. data/lib/taskjuggler/daemon/ReportServer.rb +2 -2
  132. data/lib/taskjuggler/daemon/ReportServlet.rb +1 -1
  133. data/lib/taskjuggler/daemon/WebServer.rb +1 -1
  134. data/lib/taskjuggler/daemon/WelcomePage.rb +1 -1
  135. data/lib/taskjuggler/deep_copy.rb +1 -1
  136. data/lib/taskjuggler/reports/AccountListRE.rb +115 -0
  137. data/lib/taskjuggler/reports/CSVFile.rb +1 -1
  138. data/lib/taskjuggler/reports/CollisionDetector.rb +1 -1
  139. data/lib/taskjuggler/reports/ColumnTable.rb +1 -1
  140. data/lib/taskjuggler/reports/GanttChart.rb +1 -1
  141. data/lib/taskjuggler/reports/GanttContainer.rb +1 -3
  142. data/lib/taskjuggler/reports/GanttHeader.rb +1 -1
  143. data/lib/taskjuggler/reports/GanttHeaderScaleItem.rb +1 -1
  144. data/lib/taskjuggler/reports/GanttLine.rb +23 -12
  145. data/lib/taskjuggler/reports/GanttLoadStack.rb +1 -1
  146. data/lib/taskjuggler/reports/GanttMilestone.rb +1 -1
  147. data/lib/taskjuggler/reports/GanttRouter.rb +1 -1
  148. data/lib/taskjuggler/reports/GanttTaskBar.rb +1 -1
  149. data/lib/taskjuggler/reports/HTMLGraphics.rb +1 -1
  150. data/lib/taskjuggler/reports/ICalReport.rb +5 -2
  151. data/lib/taskjuggler/reports/Navigator.rb +1 -1
  152. data/lib/taskjuggler/reports/NikuReport.rb +1 -1
  153. data/lib/taskjuggler/reports/Report.rb +29 -4
  154. data/lib/taskjuggler/reports/ReportBase.rb +15 -1
  155. data/lib/taskjuggler/reports/ReportContext.rb +1 -1
  156. data/lib/taskjuggler/reports/ReportTable.rb +1 -1
  157. data/lib/taskjuggler/reports/ReportTableCell.rb +1 -1
  158. data/lib/taskjuggler/reports/ReportTableColumn.rb +1 -1
  159. data/lib/taskjuggler/reports/ReportTableLegend.rb +1 -1
  160. data/lib/taskjuggler/reports/ReportTableLine.rb +1 -1
  161. data/lib/taskjuggler/reports/ResourceListRE.rb +3 -5
  162. data/lib/taskjuggler/reports/StatusSheetReport.rb +2 -2
  163. data/lib/taskjuggler/reports/TableReport.rb +336 -204
  164. data/lib/taskjuggler/reports/TableReportColumn.rb +30 -0
  165. data/lib/taskjuggler/reports/TagFile.rb +2 -2
  166. data/lib/taskjuggler/reports/TaskListRE.rb +3 -6
  167. data/lib/taskjuggler/reports/TextReport.rb +1 -1
  168. data/lib/taskjuggler/reports/TimeSheetReport.rb +3 -3
  169. data/lib/taskjuggler/reports/TjpExportRE.rb +4 -1
  170. data/lib/tj3.rb +1 -1
  171. data/lib/tj3client.rb +1 -1
  172. data/lib/tj3d.rb +1 -1
  173. data/lib/tj3man.rb +1 -1
  174. data/lib/tj3ss_receiver.rb +1 -1
  175. data/lib/tj3ss_sender.rb +1 -1
  176. data/lib/tj3ts_receiver.rb +1 -1
  177. data/lib/tj3ts_sender.rb +1 -1
  178. data/lib/tj3ts_summary.rb +1 -1
  179. data/lib/updateheader.sh +4 -1
  180. data/manual/Getting_Started +7 -4
  181. data/manual/How_To_Contribute +26 -5
  182. data/manual/Installation +26 -18
  183. data/manual/Intro +55 -33
  184. data/manual/Reporting_Bugs +18 -8
  185. data/manual/Rich_Text_Attributes +16 -3
  186. data/manual/Software +2 -2
  187. data/manual/TaskJuggler_2x_Migration +2 -2
  188. data/manual/The_TaskJuggler_Syntax +10 -0
  189. data/manual/Tutorial +2 -2
  190. data/manual/html/Day_To_Day_Juggling.html +16 -12
  191. data/manual/html/Getting_Started.html +9 -7
  192. data/manual/html/How_To_Contribute.html +18 -10
  193. data/manual/html/Installation.html +18 -15
  194. data/manual/html/Intro.html +44 -28
  195. data/manual/html/Reporting_Bugs.html +9 -7
  196. data/manual/html/Rich_Text_Attributes.html +11 -8
  197. data/manual/html/Software.html +5 -5
  198. data/manual/html/TaskJuggler_2x_Migration.html +4 -4
  199. data/manual/html/TaskJuggler_Internals.html +3 -3
  200. data/manual/html/The_TaskJuggler_Syntax.html +6 -3
  201. data/manual/html/Tutorial.html +12 -12
  202. data/manual/html/account.html +19 -10
  203. data/manual/html/account.task.html +5 -28
  204. data/manual/html/accountprefix.html +5 -5
  205. data/manual/html/{report.html → accountreport.html} +140 -23
  206. data/manual/html/accountroot.html +142 -0
  207. data/manual/html/active.html +5 -5
  208. data/manual/html/adopt.task.html +7 -8
  209. data/manual/html/aggregate.html +145 -0
  210. data/manual/html/alert.html +12 -11
  211. data/manual/html/alertlevels.html +102 -0
  212. data/manual/html/allocate.html +6 -6
  213. data/manual/html/alphabet.html +1 -1
  214. data/manual/html/alternative.html +3 -3
  215. data/manual/html/author.html +3 -3
  216. data/manual/html/balance.html +84 -11
  217. data/manual/html/booking.resource.html +3 -3
  218. data/manual/html/booking.task.html +3 -3
  219. data/manual/html/caption.html +6 -4
  220. data/manual/html/cellcolor.column.html +3 -3
  221. data/manual/html/celltext.column.html +3 -3
  222. data/manual/html/center.html +28 -4
  223. data/manual/html/charge.html +3 -3
  224. data/manual/html/chargeset.html +5 -5
  225. data/manual/html/columnid.html +40 -9
  226. data/manual/html/columns.html +6 -4
  227. data/manual/html/complete.html +15 -9
  228. data/manual/html/copyright.html +5 -5
  229. data/manual/html/{credit.html → credits.html} +15 -12
  230. data/manual/html/css/tjreport.css +30 -0
  231. data/manual/html/currency.html +28 -15
  232. data/manual/html/currencyformat.html +4 -4
  233. data/manual/html/dailymax.html +3 -3
  234. data/manual/html/dailymin.html +3 -3
  235. data/manual/html/dailyworkinghours.html +3 -3
  236. data/manual/html/date.extend.html +3 -3
  237. data/manual/html/date.html +3 -3
  238. data/manual/html/definitions.html +3 -3
  239. data/manual/html/depends.html +3 -3
  240. data/manual/html/details.html +3 -3
  241. data/manual/html/disabled.html +9 -3
  242. data/manual/html/duration.html +3 -3
  243. data/manual/html/efficiency.html +3 -3
  244. data/manual/html/effort.html +3 -3
  245. data/manual/html/email.html +3 -3
  246. data/manual/html/enabled.html +9 -3
  247. data/manual/html/end.column.html +3 -3
  248. data/manual/html/end.html +3 -3
  249. data/manual/html/end.limit.html +3 -3
  250. data/manual/html/end.report.html +4 -4
  251. data/manual/html/end.timesheet.html +3 -3
  252. data/manual/html/endcredit.html +18 -9
  253. data/manual/html/epilog.html +6 -4
  254. data/manual/html/export.html +10 -6
  255. data/manual/html/extend.html +3 -3
  256. data/manual/html/fail.html +3 -3
  257. data/manual/html/fdl.html +3 -3
  258. data/manual/html/flags.account.html +3 -3
  259. data/manual/html/flags.html +3 -3
  260. data/manual/html/flags.journalentry.html +3 -3
  261. data/manual/html/flags.report.html +6 -4
  262. data/manual/html/flags.resource.html +3 -3
  263. data/manual/html/flags.statussheet.html +3 -3
  264. data/manual/html/flags.task.html +3 -3
  265. data/manual/html/flags.timesheet.html +3 -3
  266. data/manual/html/fontcolor.column.html +3 -3
  267. data/manual/html/footer.html +28 -4
  268. data/manual/html/formats.html +4 -4
  269. data/manual/html/functions.html +4 -4
  270. data/manual/html/gapduration.html +3 -3
  271. data/manual/html/gaplength.html +4 -4
  272. data/manual/html/halign.center.html +3 -3
  273. data/manual/html/halign.column.html +3 -3
  274. data/manual/html/halign.left.html +3 -3
  275. data/manual/html/halign.right.html +3 -3
  276. data/manual/html/hasalert.html +3 -3
  277. data/manual/html/header.html +28 -4
  278. data/manual/html/headline.html +6 -6
  279. data/manual/html/hideaccount.html +73 -0
  280. data/manual/html/hidejournalentry.html +6 -6
  281. data/manual/html/hidereport.html +3 -3
  282. data/manual/html/hideresource.html +4 -4
  283. data/manual/html/hidetask.html +4 -4
  284. data/manual/html/icalreport.html +3 -3
  285. data/manual/html/include.macro.html +4 -4
  286. data/manual/html/include.project.html +5 -6
  287. data/manual/html/include.properties.html +5 -97
  288. data/manual/html/index.html +2 -2
  289. data/manual/html/inherit.extend.html +3 -3
  290. data/manual/html/interval1.html +3 -3
  291. data/manual/html/interval2.html +3 -3
  292. data/manual/html/interval3.html +3 -3
  293. data/manual/html/interval4.html +3 -3
  294. data/manual/html/isactive.html +3 -3
  295. data/manual/html/ischildof.html +3 -3
  296. data/manual/html/isdependencyof.html +3 -3
  297. data/manual/html/isdutyof.html +3 -3
  298. data/manual/html/isfeatureof.html +3 -3
  299. data/manual/html/isleaf.html +3 -3
  300. data/manual/html/ismilestone.html +3 -3
  301. data/manual/html/isongoing.html +3 -3
  302. data/manual/html/isresource.html +5 -5
  303. data/manual/html/{alert level.html → isresponsibilityof.html} +19 -14
  304. data/manual/html/istask.html +5 -5
  305. data/manual/html/journalattributes.html +6 -4
  306. data/manual/html/journalentry.html +3 -3
  307. data/manual/html/journalmode.html +8 -6
  308. data/manual/html/leaveallowance.html +139 -0
  309. data/manual/html/leaves.html +140 -0
  310. data/manual/html/left.html +30 -6
  311. data/manual/html/length.html +4 -4
  312. data/manual/html/limits.allocate.html +5 -32
  313. data/manual/html/limits.html +3 -3
  314. data/manual/html/limits.resource.html +3 -3
  315. data/manual/html/limits.task.html +3 -3
  316. data/manual/html/listitem.column.html +3 -3
  317. data/manual/html/listtype.column.html +3 -3
  318. data/manual/html/loadunit.html +6 -4
  319. data/manual/html/logicalexpression.html +3 -3
  320. data/manual/html/logicalflagexpression.html +3 -3
  321. data/manual/html/macro.html +3 -3
  322. data/manual/html/managers.html +3 -3
  323. data/manual/html/mandatory.html +3 -3
  324. data/manual/html/maxend.html +3 -3
  325. data/manual/html/maximum.html +3 -3
  326. data/manual/html/maxstart.html +3 -3
  327. data/manual/html/milestone.html +3 -3
  328. data/manual/html/minend.html +3 -3
  329. data/manual/html/minimum.html +3 -3
  330. data/manual/html/minstart.html +3 -3
  331. data/manual/html/monthlymax.html +3 -3
  332. data/manual/html/monthlymin.html +3 -3
  333. data/manual/html/navbar.html +23 -5
  334. data/manual/html/navigator.html +34 -3
  335. data/manual/html/newtask.html +3 -3
  336. data/manual/html/nikureport.html +3 -3
  337. data/manual/html/note.task.html +3 -3
  338. data/manual/html/now.html +3 -3
  339. data/manual/html/numberformat.html +4 -4
  340. data/manual/html/onend.html +3 -3
  341. data/manual/html/onstart.html +3 -3
  342. data/manual/html/opennodes.html +6 -4
  343. data/manual/html/overtime.booking.html +4 -4
  344. data/manual/html/period.column.html +3 -3
  345. data/manual/html/period.limit.html +3 -3
  346. data/manual/html/period.report.html +4 -4
  347. data/manual/html/period.task.html +3 -3
  348. data/manual/html/persistent.html +3 -3
  349. data/manual/html/precedes.html +3 -3
  350. data/manual/html/priority.html +3 -3
  351. data/manual/html/priority.timesheet.html +3 -3
  352. data/manual/html/project.html +4 -4
  353. data/manual/html/projectid.html +3 -3
  354. data/manual/html/projectid.task.html +3 -3
  355. data/manual/html/projectids.html +3 -3
  356. data/manual/html/projection.html +9 -3
  357. data/manual/html/prolog.html +6 -4
  358. data/manual/html/properties.html +193 -9
  359. data/manual/html/purge.html +5 -5
  360. data/manual/html/rate.html +3 -3
  361. data/manual/html/rate.resource.html +3 -3
  362. data/manual/html/reference.extend.html +3 -3
  363. data/manual/html/remaining.html +3 -3
  364. data/manual/html/replace.html +9 -6
  365. data/manual/html/reportprefix.html +5 -5
  366. data/manual/html/resource.html +22 -4
  367. data/manual/html/resourceattributes.html +6 -6
  368. data/manual/html/resourceprefix.html +3 -3
  369. data/manual/html/resourcereport.html +311 -8
  370. data/manual/html/resourceroot.html +6 -4
  371. data/manual/html/resources.limit.html +4 -4
  372. data/manual/html/responsible.html +3 -3
  373. data/manual/html/richtext.extend.html +3 -3
  374. data/manual/html/right.html +30 -6
  375. data/manual/html/rollupaccount.html +69 -0
  376. data/manual/html/rollupresource.html +6 -6
  377. data/manual/html/rolluptask.html +4 -4
  378. data/manual/html/scale.column.html +3 -3
  379. data/manual/html/scenario.html +3 -3
  380. data/manual/html/scenario.ical.html +3 -3
  381. data/manual/html/scenarios.export.html +3 -3
  382. data/manual/html/scenarios.html +6 -4
  383. data/manual/html/scenariospecific.extend.html +3 -3
  384. data/manual/html/scheduled.html +3 -3
  385. data/manual/html/scheduling.html +3 -3
  386. data/manual/html/select.html +3 -3
  387. data/manual/html/selfcontained.html +6 -4
  388. data/manual/html/shift.allocate.html +77 -0
  389. data/manual/html/shift.html +13 -7
  390. data/manual/html/shift.resource.html +11 -5
  391. data/manual/html/shift.task.html +9 -3
  392. data/manual/html/shift.timesheet.html +4 -4
  393. data/manual/html/shifts.allocate.html +6 -6
  394. data/manual/html/shifts.resource.html +3 -3
  395. data/manual/html/shifts.task.html +3 -3
  396. data/manual/html/shorttimeformat.html +3 -3
  397. data/manual/html/sloppy.booking.html +4 -4
  398. data/manual/html/sloppy.projection.html +12 -6
  399. data/manual/html/sortaccounts.html +73 -0
  400. data/manual/html/sortjournalentries.html +8 -6
  401. data/manual/html/sortresources.html +4 -4
  402. data/manual/html/sorttasks.html +4 -4
  403. data/manual/html/start.column.html +3 -3
  404. data/manual/html/start.html +3 -3
  405. data/manual/html/start.limit.html +3 -3
  406. data/manual/html/start.report.html +4 -4
  407. data/manual/html/startcredit.html +10 -4
  408. data/manual/html/status.statussheet.html +5 -5
  409. data/manual/html/status.timesheet.html +5 -5
  410. data/manual/html/statussheet.html +3 -3
  411. data/manual/html/statussheetreport.html +10 -6
  412. data/manual/html/strict.projection.html +10 -4
  413. data/manual/html/summary.html +3 -3
  414. data/manual/html/supplement.html +5 -5
  415. data/manual/html/supplement.resource.html +22 -4
  416. data/manual/html/supplement.task.html +4 -4
  417. data/manual/html/tagfile.html +3 -3
  418. data/manual/html/task.html +3 -3
  419. data/manual/html/task.statussheet.html +3 -3
  420. data/manual/html/task.timesheet.html +3 -3
  421. data/manual/html/taskattributes.html +3 -3
  422. data/manual/html/taskprefix.html +3 -3
  423. data/manual/html/taskreport.html +347 -8
  424. data/manual/html/taskroot.html +6 -4
  425. data/manual/html/text.extend.html +3 -3
  426. data/manual/html/textreport.html +333 -8
  427. data/manual/html/timeformat.html +4 -4
  428. data/manual/html/timeoff.nikureport.html +3 -3
  429. data/manual/html/timesheet.html +3 -3
  430. data/manual/html/timesheetreport.html +10 -6
  431. data/manual/html/timezone.export.html +3 -3
  432. data/manual/html/timezone.html +3 -3
  433. data/manual/html/timezone.report.html +6 -4
  434. data/manual/html/timezone.shift.html +3 -3
  435. data/manual/html/timingresolution.html +3 -3
  436. data/manual/html/title.column.html +3 -3
  437. data/manual/html/title.html +4 -4
  438. data/manual/html/toc.html +1705 -658
  439. data/manual/html/tooltip.column.html +3 -3
  440. data/manual/html/trackingscenario.html +3 -3
  441. data/manual/html/treelevel.html +3 -3
  442. data/manual/html/vacation.html +3 -3
  443. data/manual/html/vacation.resource.html +4 -4
  444. data/manual/html/vacation.shift.html +4 -4
  445. data/manual/html/warn.html +3 -3
  446. data/manual/html/weeklymax.html +3 -3
  447. data/manual/html/weeklymin.html +3 -3
  448. data/manual/html/weekstartsmonday.html +3 -3
  449. data/manual/html/weekstartssunday.html +3 -3
  450. data/manual/html/width.column.html +3 -3
  451. data/manual/html/work.html +3 -3
  452. data/manual/html/workinghours.project.html +3 -3
  453. data/manual/html/workinghours.resource.html +3 -3
  454. data/manual/html/workinghours.shift.html +3 -3
  455. data/manual/html/yearlyworkingdays.html +4 -4
  456. data/spec/ICalendar_spec.rb +4 -2
  457. data/spec/IntervalList_spec.rb +1 -1
  458. data/spec/ProjectBroker_spec.rb +2 -6
  459. data/spec/StatusSheets_spec.rb +1 -1
  460. data/spec/TernarySearchTree_spec.rb +2 -2
  461. data/spec/TimeSheets_spec.rb +1 -1
  462. data/spec/Tj3Daemon_spec.rb +1 -1
  463. data/spec/Tj3_spec.rb +1 -1
  464. data/spec/support/DaemonControl.rb +1 -1
  465. data/spec/support/spec_helper.rb +19 -0
  466. data/taskjuggler.gemspec +1 -0
  467. data/test/MessageChecker.rb +1 -1
  468. data/test/ReferenceGenerator.rb +1 -1
  469. data/test/TestSuite/CSV-Reports/Leave.tjp +37 -0
  470. data/test/TestSuite/CSV-Reports/celltext.tjp +1 -1
  471. data/test/TestSuite/CSV-Reports/efficiency.tjp +20 -0
  472. data/test/TestSuite/CSV-Reports/headcount.tjp +31 -0
  473. data/test/TestSuite/CSV-Reports/refs/Leave.csv +5 -0
  474. data/test/TestSuite/CSV-Reports/refs/alert.csv +6 -0
  475. data/test/TestSuite/CSV-Reports/refs/celltext.csv +6 -0
  476. data/test/TestSuite/CSV-Reports/refs/efficiency.csv +5 -0
  477. data/test/TestSuite/CSV-Reports/refs/headcount.csv +4 -0
  478. data/test/TestSuite/CSV-Reports/refs/sortByTree.csv +6 -0
  479. data/test/TestSuite/CSV-Reports/refs/sortBy_duration.down.csv +6 -0
  480. data/test/TestSuite/CSV-Reports/refs/sortBy_effort.up.csv +6 -0
  481. data/test/TestSuite/CSV-Reports/refs/sortBy_plan.start.down.csv +6 -0
  482. data/test/TestSuite/CSV-Reports/refs/taskreport.csv +6 -0
  483. data/test/TestSuite/CSV-Reports/refs/taskreport_with_resources.csv +14 -0
  484. data/test/TestSuite/CSV-Reports/resourcereport.tjp +1 -1
  485. data/test/TestSuite/CSV-Reports/resourcereport_with_tasks.tjp +1 -1
  486. data/test/TestSuite/CSV-Reports/sortByTree.tjp +1 -1
  487. data/test/TestSuite/CSV-Reports/sortBy_plan.start.down.tjp +1 -1
  488. data/test/TestSuite/CSV-Reports/taskreport.tjp +1 -1
  489. data/test/TestSuite/CSV-Reports/taskreport_with_resources.tjp +1 -1
  490. data/test/TestSuite/Export-Reports/refs/AccountReport.tjp +1089 -0
  491. data/test/TestSuite/Export-Reports/refs/AlertLevels.tjp +24 -0
  492. data/test/TestSuite/Export-Reports/refs/Complete.tjp +5 -25
  493. data/test/TestSuite/Export-Reports/refs/navigator.tjp +58 -0
  494. data/test/TestSuite/Export-Reports/refs/template.tjp +142 -0
  495. data/test/TestSuite/Export-Reports/refs/textreport.tjp +19 -0
  496. data/test/TestSuite/ReportGenerator/Correct/Alerts.tjp +26 -7
  497. data/test/TestSuite/ReportGenerator/Correct/refs/Alerts-1.csv +177 -141
  498. data/test/TestSuite/ReportGenerator/Correct/refs/FTE-1.csv +1 -1
  499. data/test/TestSuite/Scheduler/Correct/Allocate.tjp +2 -2
  500. data/test/TestSuite/Scheduler/Correct/Shift2.tjp +4 -4
  501. data/test/TestSuite/Syntax/Correct/Account.tjp +23 -10
  502. data/test/TestSuite/Syntax/Correct/AccountReport.tjp +74 -0
  503. data/test/TestSuite/Syntax/Correct/AdoptedTasks.tjp +4 -0
  504. data/test/TestSuite/Syntax/Correct/AlertLevels.tjp +25 -0
  505. data/test/TestSuite/Syntax/Correct/Celltext.tjp +3 -3
  506. data/test/TestSuite/Syntax/Correct/Complete.tjp +8 -5
  507. data/test/TestSuite/Syntax/Correct/Leave.tjp +37 -0
  508. data/test/TestSuite/Syntax/Correct/Reports.tjp +4 -4
  509. data/test/TestSuite/Syntax/Correct/Shift.tjp +4 -4
  510. data/test/TestSuite/Syntax/Correct/manual2example.rb +4 -3
  511. data/test/TestSuite/Syntax/Correct/navigator.tjp +31 -0
  512. data/test/TestSuite/Syntax/Correct/template.tjp +338 -0
  513. data/test/TestSuite/Syntax/Correct/textreport.tjp +21 -0
  514. data/test/TestSuite/Syntax/Correct/tutorial.tjp +12 -10
  515. data/test/TestSuite/Syntax/Errors/{adopt_duplicate_child.tjp → adopt_duplicate_child-1.tjp} +0 -0
  516. data/test/TestSuite/Syntax/Errors/{adopt_common_root.tjp → adopt_duplicate_child-2.tjp} +1 -1
  517. data/test/TestSuite/Syntax/Errors/{adopt_duplicate_parent.tjp → adopt_duplicate_child-3.tjp} +1 -1
  518. data/test/TestSuite/Syntax/Errors/adopt_self.tjp +7 -0
  519. data/test/TestSuite/Syntax/Errors/alert_level_redef.tjp +8 -0
  520. data/test/TestSuite/Syntax/Errors/alert_name_redef.tjp +8 -0
  521. data/test/TestSuite/Syntax/Errors/too_few_alert_levels.tjp +5 -0
  522. data/test/TjpGen.rb +1 -1
  523. data/test/all.rb +1 -1
  524. data/test/test_AlgorithmDiff.rb +1 -1
  525. data/test/test_BatchProcessor.rb +23 -10
  526. data/test/test_CSV-Reports.rb +1 -1
  527. data/test/test_CSVFile.rb +1 -1
  528. data/test/test_CollisionDetector.rb +1 -1
  529. data/test/test_Export-Reports.rb +1 -1
  530. data/test/test_Journal.rb +42 -15
  531. data/test/test_Limits.rb +1 -1
  532. data/test/test_LogicalExpression.rb +1 -1
  533. data/test/test_MacroTable.rb +8 -3
  534. data/test/test_Project.rb +1 -1
  535. data/test/test_ProjectFileScanner.rb +1 -1
  536. data/test/test_PropertySet.rb +1 -1
  537. data/test/test_Query.rb +1 -1
  538. data/test/test_RealFormat.rb +1 -1
  539. data/test/test_ReportGenerator.rb +1 -1
  540. data/test/test_RichText.rb +1 -1
  541. data/test/test_Scheduler.rb +1 -1
  542. data/test/test_ShiftAssignments.rb +1 -1
  543. data/test/test_SimpleQueryExpander.rb +1 -1
  544. data/test/test_Syntax.rb +1 -1
  545. data/test/test_TextFormatter.rb +1 -1
  546. data/test/test_TjTime.rb +1 -1
  547. data/test/test_TjpExample.rb +1 -1
  548. data/test/test_URLParameter.rb +1 -1
  549. data/test/test_UTF8String.rb +1 -1
  550. data/test/test_WorkingHours.rb +1 -1
  551. data/test/test_deep_copy.rb +1 -1
  552. metadata +318 -248
  553. data/test/TestSuite/Syntax/Errors/purge_no_list.tjp +0 -8
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = LeaveList.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
+ class TaskJuggler
15
+
16
+ # This class describes a leave.
17
+ class Leave
18
+
19
+ attr_reader :interval, :type, :reason
20
+
21
+ # This Hash defines the supported leave types. It maps the symbol to its
22
+ # index. The index sequence is important when multiple leaves are defined
23
+ # for the same time slot. A subsequent definition with a type with a
24
+ # larger index will override the old leave type.
25
+ Types = {
26
+ :project => 1,
27
+ :annual => 2,
28
+ :special => 3,
29
+ :sick => 4,
30
+ :unpaid => 5,
31
+ :holiday => 6
32
+ }
33
+
34
+ # Create a new Leave object. _interval_ should be an Interval describing
35
+ # the leave period. _type_ must be one of the supported leave types
36
+ # (:holiday, :annual, :special, :unpaid, :sick and :project ). The
37
+ # _reason_ is an optional String that describes the leave reason.
38
+ def initialize(type, interval, reason = nil)
39
+ unless Types[type]
40
+ raise ArgumentError, "Unsupported leave type #{type}"
41
+ end
42
+ @type = type
43
+ @interval = interval
44
+ @reason = reason
45
+ end
46
+
47
+ def typeIdx
48
+ Types[@type]
49
+ end
50
+
51
+ def to_s
52
+ "#{@type} #{@description ? "\"#{@description}\"" : ""} #{@interval}"
53
+ end
54
+
55
+ end
56
+
57
+ # A list of leaves.
58
+ class LeaveList < Array
59
+
60
+ def initialize(*args)
61
+ super(*args)
62
+ end
63
+
64
+ end
65
+
66
+ class LeaveAllowance < Struct.new(:type, :date, :slots)
67
+
68
+ def initialize(type, date, slots)
69
+ unless Leave::Types[type]
70
+ raise ArgumentError, "Unsupported leave type #{type}"
71
+ end
72
+ super
73
+ end
74
+
75
+ end
76
+
77
+ # The LeaveAllowanceList can store lists of LeaveAllowance objects.
78
+ # Allowances are counted in time slots and can be negative to substract
79
+ # expired allowances.
80
+ class LeaveAllowanceList < Array
81
+
82
+ # Create a new empty LeaveAllowanceList.
83
+ def initialize(*args)
84
+ super(*args)
85
+ end
86
+
87
+ def balance(type, startDate, endDate)
88
+ unless Leave::Types[type]
89
+ raise ArgumentError, "Unsupported leave type #{type}"
90
+ end
91
+
92
+ balance = 0.0
93
+ each do |al|
94
+ balance += al.slots if al.type == type && al.date >= startDate &&
95
+ al.date < endDate
96
+ end
97
+ balance
98
+ end
99
+
100
+ end
101
+
102
+ end
103
+
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = Limits.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = Log.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -13,6 +13,7 @@
13
13
 
14
14
  require 'singleton'
15
15
  require 'monitor'
16
+ require 'term/ansicolor'
16
17
 
17
18
  class TaskJuggler
18
19
 
@@ -133,7 +134,8 @@ class TaskJuggler
133
134
  def Log.stopProgressMeter
134
135
  return if @@silent
135
136
 
136
- $stdout.print("#{@@progressMeter} [ Done ]\n")
137
+ $stdout.print("#{@@progressMeter} [ " +
138
+ Term::ANSIColor.green("Done") + " ]\n")
137
139
  end
138
140
 
139
141
  # This function may only be called when Log#startProgressMeter has been
@@ -162,7 +164,8 @@ class TaskJuggler
162
164
  bar = '=' * full + ' ' * (length - full)
163
165
  label = (percent * 100.0).to_i.to_s + '%'
164
166
  bar[length / 2 - label.length / 2, label.length] = label
165
- $stdout.print("#{@@progressMeter} [#{bar}]\r")
167
+ $stdout.print("#{@@progressMeter} [" +
168
+ Term::ANSIColor.green("#{bar}") + "]\r")
166
169
  end
167
170
 
168
171
  end
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = LogFile.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = LogicalExpression.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = LogicalFunction.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -34,6 +34,7 @@ class TaskJuggler
34
34
  'ismilestone' => 1,
35
35
  'isongoing' => 1,
36
36
  'isresource' => 0,
37
+ 'isresponsibilityof' => 2,
37
38
  'istask' => 0,
38
39
  'treelevel' => 0
39
40
  }
@@ -114,7 +115,7 @@ class TaskJuggler
114
115
  end
115
116
 
116
117
  query = expr.query
117
- property.getAllocatedTime(scenarioIdx, query.start, query.end,
118
+ property.getAllocatedTime(scenarioIdx, query.startIdx, query.endIdx,
118
119
  scopeProperty) > 0.0
119
120
  end
120
121
 
@@ -211,6 +212,19 @@ class TaskJuggler
211
212
  property.is_a?(Resource)
212
213
  end
213
214
 
215
+ def isresponsibilityof(expr, args)
216
+ property = properties(expr)[0]
217
+ # The result can only be true when called for a Task property.
218
+ return false unless (task = property).is_a?(Task)
219
+ project = task.project
220
+ # 1st arg must be a resource ID.
221
+ return false if (resource = project.resource(args[0])).nil?
222
+ # 2nd arg must be a scenario index.
223
+ return false if (scenarioIdx = project.scenarioIdx(args[1])).nil?
224
+
225
+ task['responsible', scenarioIdx].include?(resource)
226
+ end
227
+
214
228
  def istask(expr, args)
215
229
  property = properties(expr)[0]
216
230
  return false unless property
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = LogicalOperation.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -11,6 +11,8 @@
11
11
  # published by the Free Software Foundation.
12
12
  #
13
13
 
14
+ require 'taskjuggler/TjTime'
15
+ require 'taskjuggler/RichText'
14
16
  require 'taskjuggler/TjException'
15
17
 
16
18
  class TaskJuggler
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = MessageHandler.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -11,6 +11,11 @@
11
11
  # published by the Free Software Foundation.
12
12
  #
13
13
 
14
+ if RUBY_VERSION < "1.9.0"
15
+ require 'rubygems'
16
+ end
17
+
18
+ require 'term/ansicolor'
14
19
  require 'taskjuggler/TextParser/SourceFileInfo'
15
20
 
16
21
  class TaskJuggler
@@ -19,6 +24,8 @@ class TaskJuggler
19
24
  # application can send out.
20
25
  class Message
21
26
 
27
+ include Term::ANSIColor
28
+
22
29
  attr_reader :type, :id, :message, :sourceFileInfo, :line
23
30
 
24
31
  # Create a new Message object. The _type_ specifies what tpye of message
@@ -69,11 +76,13 @@ class TaskJuggler
69
76
  str += "#{@sourceFileInfo.fileName}:#{sourceFileInfo.lineNo}: "
70
77
  end
71
78
  if @scenario
72
- str += "#{@type.to_s.capitalize} in scenario #{@scenario.id}: "
79
+ tag = "#{@type.to_s.capitalize} in scenario #{@scenario.id}: "
73
80
  else
74
- str += "#{@type.to_s.capitalize}: "
81
+ tag = "#{@type.to_s.capitalize}: "
75
82
  end
76
- str += @message
83
+ colors = { :fatal => red, :error => red, :warning => magenta,
84
+ :info => blue, :debug => green }
85
+ str += colors[@type] + tag + @message + reset
77
86
  str += "\n" + @line if @line
78
87
  str
79
88
  end
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = PTNProxy.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
+ class TaskJuggler
15
+
16
+ # This class provides objects that represent PropertyTreeNode objects that
17
+ # were adopted (directly or indirectly) in their new parental context. Such
18
+ # objects are used as elements of a PropertyList which can only hold each
19
+ # PropertyTreeNode objects once. By using this class, we can add such
20
+ # objects more than once, each time with a new parental context that was
21
+ # created by an adoption.
22
+ class PTNProxy
23
+
24
+ attr_reader :parent
25
+
26
+ def initialize(ptn, parent)
27
+ @ptn = ptn
28
+ raise "Adopted classes must have a parent" unless parent
29
+ @parent = parent
30
+ @indext = nil
31
+ @tree = nil
32
+ @level = -1
33
+ end
34
+
35
+ def set(attribute, val)
36
+ if attribute == 'index'
37
+ @index = val
38
+ elsif attribute == 'tree'
39
+ @tree = val
40
+ else
41
+ @ptn.set(attribute, val)
42
+ end
43
+ end
44
+
45
+ def get(attribute)
46
+ if attribute == 'index'
47
+ @index
48
+ elsif attribute == 'tree'
49
+ @tree
50
+ else
51
+ @ptn.get(attribute)
52
+ end
53
+ end
54
+
55
+ def [](attribute, scenarioIdx)
56
+ if attribute == 'index'
57
+ @index
58
+ elsif attribute == 'tree'
59
+ @tree
60
+ else
61
+ @ptn[attribute, scenarioIdx]
62
+ end
63
+ end
64
+
65
+ # Returns the level that this property is on. Top-level properties return
66
+ # 0, their children 1 and so on. This value is cached internally, so it does
67
+ # not have to be calculated each time the function is called.
68
+ def level
69
+ return @level if @level >= 0
70
+
71
+ t = self
72
+ @level = 0
73
+ until (t = t.parent).nil?
74
+ @level += 1
75
+ end
76
+ @level
77
+ end
78
+
79
+ # Find out if this property is a direct or indirect child of _ancestor_.
80
+ def isChildOf?(ancestor)
81
+ parent = self
82
+ while parent = parent.parent
83
+ return true if (parent == ancestor)
84
+ end
85
+ false
86
+ end
87
+
88
+ # Return the 'index' attributes of this property, prefixed by the 'index'
89
+ # attributes of all its parents. The result is an Array of Fixnums.
90
+ def getIndicies
91
+ idcs = []
92
+ p = self
93
+ begin
94
+ parent = p.parent
95
+ idcs.insert(0, p.get('index'))
96
+ p = parent
97
+ end while p
98
+ idcs
99
+ end
100
+
101
+ def method_missing(func, *args, &block)
102
+ @ptn.send(func, *args, &block)
103
+ end
104
+
105
+ alias_method :respond_to_?, :respond_to?
106
+
107
+ def respond_to?(method)
108
+ respond_to_?(method) || @ptn.respond_to?(method)
109
+ end
110
+
111
+ def is_a?(type)
112
+ @ptn.is_a?(type)
113
+ end
114
+
115
+ end
116
+
117
+ end
118
+
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = Project.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -15,7 +15,11 @@ require 'taskjuggler/TjException'
15
15
  require 'taskjuggler/MessageHandler'
16
16
  require 'taskjuggler/FileList'
17
17
  require 'taskjuggler/TjTime'
18
+ require 'taskjuggler/AlertLevelDefinitions'
19
+ require 'taskjuggler/AccountCredit'
18
20
  require 'taskjuggler/Booking'
21
+ require 'taskjuggler/DataCache'
22
+ require 'taskjuggler/LeaveList'
19
23
  require 'taskjuggler/PropertySet'
20
24
  require 'taskjuggler/Attributes'
21
25
  require 'taskjuggler/RealFormat'
@@ -67,10 +71,7 @@ class TaskJuggler
67
71
  # Currently, these levels are hardcoded. Each level entry has 3
68
72
  # members: the tjp syntax token, the user visible name and the
69
73
  # associated color as RGB byte array.
70
- 'alertLevels' => [
71
- [ 'green', 'Green', '#008000' ],
72
- [ 'yellow', 'Yellow', '#BEA800' ],
73
- [ 'red', 'Red', '#C00000' ] ],
74
+ 'alertLevels' => AlertLevelDefinitions.new,
74
75
  'copyright' => nil,
75
76
  'costAccount' => nil,
76
77
  'currency' => "EUR",
@@ -80,6 +81,7 @@ class TaskJuggler
80
81
  'flags' => [],
81
82
  'journal' => Journal.new,
82
83
  'limits' => nil,
84
+ 'leaves' => LeaveList.new,
83
85
  'loadUnit' => :days,
84
86
  'name' => name,
85
87
  'navigators' => {},
@@ -96,7 +98,6 @@ class TaskJuggler
96
98
  'timeFormat' => "%Y-%m-%d",
97
99
  'timezone' => TjTime.timeZone,
98
100
  'trackingScenarioIdx' => nil,
99
- 'vacations' => [],
100
101
  'version' => version || "1.0",
101
102
  'weekStartsMonday' => true,
102
103
  'workinghours' => nil,
@@ -134,24 +135,24 @@ class TaskJuggler
134
135
  attrs = [
135
136
  # ID Name Type
136
137
  # Inh. Inh.Prj Scen. Default
137
- [ 'bsi', 'BSI', StringAttribute,
138
+ [ 'bsi', 'BSI', StringAttribute,
138
139
  false, false, false, "" ],
139
- [ 'id', 'ID', StringAttribute,
140
+ [ 'id', 'ID', StringAttribute,
140
141
  false, false, false, nil ],
141
142
  [ 'index', 'Index', FixnumAttribute,
142
143
  false, false, false, -1 ],
143
- [ 'name', 'Name', StringAttribute,
144
+ [ 'leaves', 'Leaves', LeaveListAttribute,
145
+ true, true, true, LeaveList.new ],
146
+ [ 'name', 'Name', StringAttribute,
144
147
  false, false, false, nil ],
145
148
  [ 'replace', 'Replace', BooleanAttribute,
146
149
  true, false, true, false ],
147
- [ 'seqno', 'No', FixnumAttribute,
150
+ [ 'seqno', 'No', FixnumAttribute,
148
151
  false, false, false, nil ],
149
152
  [ 'timezone', 'Time Zone', StringAttribute,
150
153
  true, true, true, TjTime.timeZone ],
151
154
  [ 'tree', 'Tree Index', StringAttribute,
152
155
  false, false, false, "" ],
153
- [ 'vacations', 'Vacations', TimeIntervalListAttribute,
154
- true, true, true, [] ],
155
156
  [ 'workinghours', 'Working Hours', WorkingHoursAttribute,
156
157
  true, true, true, nil ]
157
158
  ]
@@ -161,8 +162,12 @@ class TaskJuggler
161
162
  attrs = [
162
163
  # ID Name Type
163
164
  # Inh. Inh.Prj Scen. Default
165
+ [ 'aggregate', 'Aggregate', SymbolAttribute,
166
+ true, false, false, :tasks ],
164
167
  [ 'bsi', 'BSI', StringAttribute,
165
168
  false, false, false, "" ],
169
+ [ 'credits', 'Credits', AccountCreditListAttribute,
170
+ false, false, true, [] ],
166
171
  [ 'id', 'ID', StringAttribute,
167
172
  false, false, false, nil ],
168
173
  [ 'index', 'Index', FixnumAttribute,
@@ -186,6 +191,8 @@ class TaskJuggler
186
191
  false, false, true, 0.0 ],
187
192
  [ 'bsi', 'BSI', StringAttribute,
188
193
  false, false, false, "" ],
194
+ [ 'chargeset', 'Charge Sets', ChargeSetListAttribute,
195
+ true, false, true, [] ],
189
196
  [ 'criticalness', 'Criticalness', FloatAttribute,
190
197
  false, false, true, 0.0 ],
191
198
  [ 'duties', 'Duties', TaskListAttribute,
@@ -202,10 +209,12 @@ class TaskJuggler
202
209
  false, false, false, [] ],
203
210
  [ 'flags', 'Flags', FlagListAttribute,
204
211
  true, false, true, [] ],
205
- [ 'headcount', 'Headcount', FixnumAttribute,
206
- false, false, true, 1 ],
207
212
  [ 'index', 'Index', FixnumAttribute,
208
213
  false, false, false, -1 ],
214
+ [ 'leaveallowances', 'Leave Allowances', LeaveAllowanceListAttribute,
215
+ true, false, true, LeaveAllowanceList.new ],
216
+ [ 'leaves', 'Leaves', LeaveListAttribute,
217
+ true, true, true, LeaveList.new ],
209
218
  [ 'limits', 'Limits', LimitsAttribute,
210
219
  true, true, true, nil ],
211
220
  [ 'managers', 'Managers', ResourceListAttribute,
@@ -220,8 +229,6 @@ class TaskJuggler
220
229
  true, false, true, nil ],
221
230
  [ 'tree', 'Tree Index', StringAttribute,
222
231
  false, false, false, "" ],
223
- [ 'vacations', 'Vacations', TimeIntervalListAttribute,
224
- true, true, true, [] ],
225
232
  [ 'warn', 'Warning Condition', LogicalExpressionListAttribute,
226
233
  false, false, false, [] ],
227
234
  [ 'workinghours', 'Working Hours', WorkingHoursAttribute,
@@ -267,6 +274,8 @@ class TaskJuggler
267
274
  true, false, true, [] ],
268
275
  [ 'forward', 'Scheduling', BooleanAttribute,
269
276
  true, false, true, true ],
277
+ [ 'gauge', 'Schedule gauge', StringAttribute,
278
+ false, false, true, nil ],
270
279
  [ 'id', 'ID', StringAttribute,
271
280
  false, false, false, nil ],
272
281
  [ 'index', 'Index', FixnumAttribute,
@@ -324,6 +333,8 @@ class TaskJuggler
324
333
  attrs = [
325
334
  # ID Name Type
326
335
  # Inh. Inh.Prj Scen. Default
336
+ [ 'accountRoot', 'Account Root', PropertyAttribute,
337
+ true, false, false, nil ],
327
338
  [ 'bsi', 'BSI', StringAttribute,
328
339
  false, false, false, "" ],
329
340
  [ 'caption', 'Caption', RichTextAttribute,
@@ -354,6 +365,8 @@ class TaskJuggler
354
365
  true, false, false, nil ],
355
366
  [ 'headline', 'Headline', RichTextAttribute,
356
367
  true, false, false, nil ],
368
+ [ 'hideAccount', 'Hide Account', LogicalExpressionAttribute,
369
+ true, false, false, nil ],
357
370
  [ 'hideJournalEntry', 'Hide JournalEntry', LogicalExpressionAttribute,
358
371
  true, false, false, nil ],
359
372
  [ 'hideResource', 'Hide Resource', LogicalExpressionAttribute,
@@ -392,6 +405,8 @@ class TaskJuggler
392
405
  true, true, false, nil ],
393
406
  [ 'right', 'Right', RichTextAttribute,
394
407
  true, false, false, nil ],
408
+ [ 'rollupAccount', 'Rollup Account', LogicalExpressionAttribute,
409
+ true, false, false, nil ],
395
410
  [ 'rollupResource', 'Rollup Resource', LogicalExpressionAttribute,
396
411
  true, false, false, nil ],
397
412
  [ 'rollupTask', 'Rollup Task', LogicalExpressionAttribute,
@@ -404,6 +419,8 @@ class TaskJuggler
404
419
  false, false, false, nil ],
405
420
  [ 'shortTimeFormat', 'Short Time Format', StringAttribute,
406
421
  true, true, false, nil ],
422
+ [ 'sortAccounts', 'Sort Accounts', SortListAttribute,
423
+ true, false, false, [[ 'seqno', true, -1 ]] ],
407
424
  [ 'sortJournalEntries', 'Sort Journal Entries', JournalSortListAttribute,
408
425
  true, false, false, [[ :alert, 1 ], [ :date, 1 ], [ :seqno, 1 ]] ],
409
426
  [ 'sortResources', 'Sort Resources', SortListAttribute,
@@ -440,10 +457,10 @@ class TaskJuggler
440
457
 
441
458
  @timeSheets = TimeSheets.new
442
459
 
443
- # A scoreboard that reflects the global working hours and vacations.
460
+ # A scoreboard that reflects the global working hours and leaves.
444
461
  @scoreboard = nil
445
- # A scoreboard that reflects the global working hours but no vacations.
446
- @scoreboardNoVacations = nil
462
+ # A scoreboard that reflects the global working hours but no leaves.
463
+ @scoreboardNoLeaves = nil
447
464
 
448
465
  # The ReportContext provides additional settings to the report that can
449
466
  # complement or replace the report attributes. Reports can include other
@@ -495,48 +512,15 @@ class TaskJuggler
495
512
  @scenarios.items
496
513
  end
497
514
 
498
- # Try to match _levelName_ to a defined alert level name and return the
499
- # index of it. If no level is found, nil is returned.
500
- def alertLevelIndex(levelName)
501
- @attributes['alertLevels'].length.times do |i|
502
- if @attributes['alertLevels'][i][0] == levelName
503
- return i
504
- end
505
- end
506
- nil
507
- end
508
-
509
- # Return the ID or keyword of the alert level with the given _levelIndex_.
510
- # Or nil if the level does not exist.
511
- def alertLevelId(levelIndex)
512
- return 'unknown' unless @attributes['alertLevels'][levelIndex]
513
- @attributes['alertLevels'][levelIndex][0]
514
- end
515
-
516
- # Return the user readable name of the alert level with the given
517
- # _levelIndex_. Or nil if the level does not exist.
518
- def alertLevelName(levelIndex)
519
- return 'unknown' unless @attributes['alertLevels'][levelIndex]
520
- @attributes['alertLevels'][levelIndex][1]
521
- end
522
-
523
- # Return the color of the alert level with the given _levelIndex_. Or nil
524
- # if the level does not exist. The color is an RGB encoded byte array,
525
- # stored as hexadecimal String, prefixed with a pound sign.
526
- def alertLevelColor(levelIndex)
527
- return 'unknown' unless @attributes['alertLevels'][levelIndex]
528
- @attributes['alertLevels'][levelIndex][2]
529
- end
530
-
531
515
  # Return the average number of working hours per day. This defaults to 8 but
532
516
  # can be set to other values by the user.
533
517
  def dailyWorkingHours
534
518
  @attributes['dailyworkinghours'].to_f
535
519
  end
536
520
 
537
- # Return the average number of working days per week.
538
521
  def weeklyWorkingDays
539
- @attributes['yearlyworkingdays'] / 52.1429
522
+ @attributes['workinghours'].weeklyWorkingHours /
523
+ @attributes['dailyworkinghours']
540
524
  end
541
525
 
542
526
  # Return the average number of working days per month.
@@ -625,7 +609,7 @@ class TaskJuggler
625
609
  def schedule
626
610
  initScoreboards
627
611
 
628
- [ @shifts, @resources, @tasks ].each do |p|
612
+ [ @accounts, @shifts, @resources, @tasks ].each do |p|
629
613
  # Set all index counters to their proper values.
630
614
  p.index
631
615
  end
@@ -680,7 +664,9 @@ class TaskJuggler
680
664
 
681
665
  unless @accounts.empty?
682
666
  @reports.each do |report|
683
- if report.get('costAccount').nil? || report.get('revenueAccount').nil?
667
+ if (report.typeSpec != :accountreport) &&
668
+ (report.get('costAccount').nil? ||
669
+ report.get('revenueAccount').nil?)
684
670
  warning('report_without_balance',
685
671
  "The report #{report.fullId} has no 'balance' defined. " +
686
672
  "No cost or revenue computation will be possible.",
@@ -738,6 +724,7 @@ class TaskJuggler
738
724
  Log.stopProgressMeter
739
725
  end
740
726
  end
727
+ DataCache.instance.flush
741
728
  end
742
729
 
743
730
  def generateReport(reportId, regExpMode, formats = nil,
@@ -828,6 +815,10 @@ class TaskJuggler
828
815
  @reports.addProperty(report)
829
816
  end
830
817
 
818
+ def removeAccount(account) # :nodoc:
819
+ @accounts.removeProperty(account)
820
+ end
821
+
831
822
  # call-seq:
832
823
  # isWorkingTime(slotIdx) -> true or false
833
824
  # isWorkingTime(slot) -> true or false
@@ -837,7 +828,7 @@ class TaskJuggler
837
828
  # Return true if the slot or interval is withing globally defined working
838
829
  # time or false if not. If the argument is a TimeInterval, all slots of
839
830
  # the interval must be working time to return true as result. Global work
840
- # time means, no global vacation defined and the slot lies within a
831
+ # time means, no global leaves defined and the slot lies within a
841
832
  # defined global working time period.
842
833
  def isWorkingTime(*args)
843
834
  # Normalize argument(s) to TimeInterval
@@ -869,7 +860,7 @@ class TaskJuggler
869
860
  # hasWorkingTime(interval) -> true or false
870
861
  #
871
862
  # Return true if the interval overlaps with a globally defined working
872
- # time or false if not. Global work time means, no global vacation defined
863
+ # time or false if not. Global work time means, no global leaves defined
873
864
  # and the slot lies within a defined global working time period.
874
865
  def hasWorkingTime(*args)
875
866
  # Normalize argument(s) to TimeInterval
@@ -941,20 +932,20 @@ class TaskJuggler
941
932
  end
942
933
  end
943
934
 
944
- # Return the number of working days (ignoring global vacations) during the
935
+ # Return the number of working days (ignoring global leaves) during the
945
936
  # given _interval_.
946
937
  def workingDays(interval)
947
938
  startIdx = dateToIdx(interval.start)
948
939
  endIdx = dateToIdx(interval.end)
949
940
  slots = 0
950
941
  startIdx.upto(endIdx) do |idx|
951
- slots += 1 unless @scoreboardNoVacations[idx]
942
+ slots += 1 unless @scoreboardNoLeaves[idx]
952
943
  end
953
944
  slotsToDays(slots)
954
945
  end
955
946
 
956
947
  # Return the number of global working slots during the given time interval
957
- # specified by _startIdx_ and _endIdx_. This method takes global vacations
948
+ # specified by _startIdx_ and _endIdx_. This method takes global leaves
958
949
  # into account.
959
950
  def getWorkSlots(startIdx, endIdx)
960
951
  slots = 0
@@ -1244,7 +1235,7 @@ class TaskJuggler
1244
1235
  @scoreboard = Scoreboard.new(@attributes['start'], @attributes['end'],
1245
1236
  @attributes['scheduleGranularity'], 2)
1246
1237
  # And the same for another scoreboard.
1247
- @scoreboardNoVacations =
1238
+ @scoreboardNoLeaves =
1248
1239
  Scoreboard.new(@attributes['start'], @attributes['end'],
1249
1240
  @attributes['scheduleGranularity'], 2)
1250
1241
 
@@ -1256,15 +1247,15 @@ class TaskJuggler
1256
1247
  scoreboardSize.times do |i|
1257
1248
  if workinghours.onShift?(date)
1258
1249
  @scoreboard[i] = nil
1259
- @scoreboardNoVacations[i] = nil
1250
+ @scoreboardNoLeaves[i] = nil
1260
1251
  end
1261
1252
  date += delta
1262
1253
  end
1263
1254
 
1264
- # Mark all global vacation slots as such
1265
- @attributes['vacations'].each do |vacation|
1266
- startIdx = @scoreboard.dateToIdx(vacation.start)
1267
- endIdx = @scoreboard.dateToIdx(vacation.end)
1255
+ # Mark all global leave slots as such
1256
+ @attributes['leaves'].each do |leave|
1257
+ startIdx = @scoreboard.dateToIdx(leave.interval.start)
1258
+ endIdx = @scoreboard.dateToIdx(leave.interval.end)
1268
1259
  startIdx.upto(endIdx - 1) do |i|
1269
1260
  # If the slot is nil or set to 4 then don't set the time-off bit.
1270
1261
  sb = @scoreboard[i]