taskjuggler 0.0.4 → 0.0.5

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 (829) hide show
  1. data/README +1 -1
  2. data/bin/tj3client +3 -0
  3. data/bin/tj3d +3 -0
  4. data/bin/tj3ts_receiver +3 -0
  5. data/bin/tj3ts_sender +3 -0
  6. data/bin/tj3ts_summary +3 -0
  7. data/data/css/tjmanual.css +14 -0
  8. data/data/css/tjreport.css +233 -21
  9. data/data/scripts/wz_tooltip.js +20 -20
  10. data/doc/AppConfig.html +1389 -0
  11. data/doc/Arguments.html +678 -0
  12. data/doc/COPYING.html +837 -0
  13. data/doc/Object.html +996 -0
  14. data/doc/README.html +523 -0
  15. data/doc/RuntimeConfig.html +762 -0
  16. data/doc/String.html +872 -0
  17. data/doc/TaskJuggler/Account.html +691 -0
  18. data/doc/TaskJuggler/AccountAttribute.html +707 -0
  19. data/doc/TaskJuggler/AccountScenario.html +650 -0
  20. data/doc/TaskJuggler/Allocation.html +898 -0
  21. data/doc/TaskJuggler/AllocationAttribute.html +737 -0
  22. data/doc/TaskJuggler/AttributeBase.html +1193 -0
  23. data/doc/TaskJuggler/AttributeDefinition.html +753 -0
  24. data/doc/TaskJuggler/BatchProcessor.html +1112 -0
  25. data/doc/TaskJuggler/Booking.html +797 -0
  26. data/doc/TaskJuggler/BookingListAttribute.html +709 -0
  27. data/doc/TaskJuggler/BooleanAttribute.html +707 -0
  28. data/doc/TaskJuggler/CSVFile.html +924 -0
  29. data/doc/TaskJuggler/CellSettingPattern.html +638 -0
  30. data/doc/TaskJuggler/CellSettingPatternList.html +687 -0
  31. data/doc/TaskJuggler/Charge.html +715 -0
  32. data/doc/TaskJuggler/ChargeListAttribute.html +671 -0
  33. data/doc/TaskJuggler/ChargeSet.html +887 -0
  34. data/doc/TaskJuggler/ChargeSetListAttribute.html +718 -0
  35. data/doc/TaskJuggler/ColumnListAttribute.html +673 -0
  36. data/doc/TaskJuggler/ColumnTable.html +701 -0
  37. data/doc/TaskJuggler/Daemon.html +728 -0
  38. data/doc/TaskJuggler/DateAttribute.html +675 -0
  39. data/doc/TaskJuggler/DefinitionListAttribute.html +593 -0
  40. data/doc/TaskJuggler/DependencyListAttribute.html +713 -0
  41. data/doc/TaskJuggler/DurationAttribute.html +707 -0
  42. data/doc/TaskJuggler/FixnumAttribute.html +629 -0
  43. data/doc/TaskJuggler/FlagListAttribute.html +709 -0
  44. data/doc/TaskJuggler/FloatAttribute.html +671 -0
  45. data/doc/TaskJuggler/FormatListAttribute.html +635 -0
  46. data/doc/TaskJuggler/GanttChart.html +1473 -0
  47. data/doc/TaskJuggler/GanttContainer.html +885 -0
  48. data/doc/TaskJuggler/GanttHeader.html +886 -0
  49. data/doc/TaskJuggler/GanttHeaderScaleItem.html +700 -0
  50. data/doc/TaskJuggler/GanttLine.html +1263 -0
  51. data/doc/TaskJuggler/GanttLoadStack.html +766 -0
  52. data/doc/TaskJuggler/GanttMilestone.html +865 -0
  53. data/doc/TaskJuggler/GanttRouter.html +1433 -0
  54. data/doc/TaskJuggler/GanttTaskBar.html +880 -0
  55. data/doc/TaskJuggler/HTMLDocument.html +719 -0
  56. data/doc/TaskJuggler/HTMLGraphics.html +775 -0
  57. data/doc/TaskJuggler/Interval.html +1016 -0
  58. data/doc/TaskJuggler/IntervalListAttribute.html +713 -0
  59. data/doc/TaskJuggler/JobInfo.html +881 -0
  60. data/doc/TaskJuggler/Journal.html +991 -0
  61. data/doc/TaskJuggler/JournalEntry.html +779 -0
  62. data/doc/TaskJuggler/JournalEntryList.html +952 -0
  63. data/doc/TaskJuggler/KeywordArray.html +628 -0
  64. data/doc/TaskJuggler/KeywordDocumentation.html +1662 -0
  65. data/doc/TaskJuggler/Limits/Limit.html +826 -0
  66. data/doc/TaskJuggler/Limits.html +966 -0
  67. data/doc/TaskJuggler/LimitsAttribute.html +707 -0
  68. data/doc/TaskJuggler/ListAttributeBase.html +641 -0
  69. data/doc/TaskJuggler/Log.html +1103 -0
  70. data/doc/TaskJuggler/LogFile.html +918 -0
  71. data/doc/TaskJuggler/LogicalAttribute.html +698 -0
  72. data/doc/TaskJuggler/LogicalExpression.html +739 -0
  73. data/doc/TaskJuggler/LogicalExpressionAttribute.html +629 -0
  74. data/doc/TaskJuggler/LogicalFlag.html +681 -0
  75. data/doc/TaskJuggler/LogicalFunction.html +1218 -0
  76. data/doc/TaskJuggler/LogicalOperation.html +1078 -0
  77. data/doc/TaskJuggler/Macro.html +646 -0
  78. data/doc/TaskJuggler/MacroParser.html +810 -0
  79. data/doc/TaskJuggler/MacroTable.html +810 -0
  80. data/doc/TaskJuggler/ManagerResponsibilities.html +674 -0
  81. data/doc/TaskJuggler/ManagerStatusRecord.html +678 -0
  82. data/doc/TaskJuggler/Message.html +757 -0
  83. data/doc/TaskJuggler/MessageHandler.html +679 -0
  84. data/doc/TaskJuggler/Navigator.html +867 -0
  85. data/doc/TaskJuggler/NavigatorElement.html +932 -0
  86. data/doc/TaskJuggler/NikuProject.html +662 -0
  87. data/doc/TaskJuggler/NikuReport.html +1316 -0
  88. data/doc/TaskJuggler/NikuResource.html +632 -0
  89. data/doc/TaskJuggler/OnShiftCache.html +864 -0
  90. data/doc/TaskJuggler/ProcessIntercom.html +847 -0
  91. data/doc/TaskJuggler/ProcessIntercomIface.html +664 -0
  92. data/doc/TaskJuggler/Project.html +3056 -0
  93. data/doc/TaskJuggler/ProjectBroker.html +1260 -0
  94. data/doc/TaskJuggler/ProjectBrokerIface.html +734 -0
  95. data/doc/TaskJuggler/ProjectFileParser.html +1951 -0
  96. data/doc/TaskJuggler/ProjectRecord.html +859 -0
  97. data/doc/TaskJuggler/ProjectServer.html +1092 -0
  98. data/doc/TaskJuggler/ProjectServerIface.html +768 -0
  99. data/doc/TaskJuggler/PropertyAttribute.html +629 -0
  100. data/doc/TaskJuggler/PropertyList.html +1336 -0
  101. data/doc/TaskJuggler/PropertySet.html +1785 -0
  102. data/doc/TaskJuggler/PropertyTreeNode.html +2482 -0
  103. data/doc/TaskJuggler/Query.html +1831 -0
  104. data/doc/TaskJuggler/RTFNavigator.html +729 -0
  105. data/doc/TaskJuggler/RTFQuery.html +1038 -0
  106. data/doc/TaskJuggler/RTFReport.html +740 -0
  107. data/doc/TaskJuggler/RealFormat.html +743 -0
  108. data/doc/TaskJuggler/RealFormatAttribute.html +593 -0
  109. data/doc/TaskJuggler/ReferenceAttribute.html +782 -0
  110. data/doc/TaskJuggler/Report.html +1255 -0
  111. data/doc/TaskJuggler/ReportBase.html +1198 -0
  112. data/doc/TaskJuggler/ReportContext.html +711 -0
  113. data/doc/TaskJuggler/ReportServer.html +988 -0
  114. data/doc/TaskJuggler/ReportServerIface.html +838 -0
  115. data/doc/TaskJuggler/ReportServerRecord.html +716 -0
  116. data/doc/TaskJuggler/ReportTable.html +1106 -0
  117. data/doc/TaskJuggler/ReportTableCell.html +1536 -0
  118. data/doc/TaskJuggler/ReportTableColumn.html +828 -0
  119. data/doc/TaskJuggler/ReportTableLegend.html +999 -0
  120. data/doc/TaskJuggler/ReportTableLine.html +1003 -0
  121. data/doc/TaskJuggler/Resource.html +938 -0
  122. data/doc/TaskJuggler/ResourceListAttribute.html +752 -0
  123. data/doc/TaskJuggler/ResourceListRE.html +674 -0
  124. data/doc/TaskJuggler/ResourceScenario.html +2457 -0
  125. data/doc/TaskJuggler/RichText.html +791 -0
  126. data/doc/TaskJuggler/RichTextAttribute.html +743 -0
  127. data/doc/TaskJuggler/RichTextDocument.html +972 -0
  128. data/doc/TaskJuggler/RichTextElement.html +1615 -0
  129. data/doc/TaskJuggler/RichTextException.html +667 -0
  130. data/doc/TaskJuggler/RichTextFunctionExample.html +737 -0
  131. data/doc/TaskJuggler/RichTextFunctionHandler.html +689 -0
  132. data/doc/TaskJuggler/RichTextImage.html +650 -0
  133. data/doc/TaskJuggler/RichTextIntermediate.html +1161 -0
  134. data/doc/TaskJuggler/RichTextParser.html +756 -0
  135. data/doc/TaskJuggler/RichTextScanner.html +2010 -0
  136. data/doc/TaskJuggler/RichTextSnip.html +942 -0
  137. data/doc/TaskJuggler/RichTextSyntaxRules.html +1722 -0
  138. data/doc/TaskJuggler/Scenario.html +594 -0
  139. data/doc/TaskJuggler/ScenarioData.html +815 -0
  140. data/doc/TaskJuggler/ScenarioListAttribute.html +671 -0
  141. data/doc/TaskJuggler/Scoreboard.html +1114 -0
  142. data/doc/TaskJuggler/SheetHandlerBase.html +1115 -0
  143. data/doc/TaskJuggler/SheetReceiver.html +1293 -0
  144. data/doc/TaskJuggler/SheetSender.html +1089 -0
  145. data/doc/TaskJuggler/Shift.html +689 -0
  146. data/doc/TaskJuggler/ShiftAssignment.html +950 -0
  147. data/doc/TaskJuggler/ShiftAssignments.html +1379 -0
  148. data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +707 -0
  149. data/doc/TaskJuggler/ShiftScenario.html +720 -0
  150. data/doc/TaskJuggler/SortListAttribute.html +631 -0
  151. data/doc/TaskJuggler/SourceFileInfo.html +698 -0
  152. data/doc/TaskJuggler/StatusSheetReceiver.html +615 -0
  153. data/doc/TaskJuggler/StatusSheetReport.html +872 -0
  154. data/doc/TaskJuggler/StatusSheetSender.html +654 -0
  155. data/doc/TaskJuggler/StringAttribute.html +671 -0
  156. data/doc/TaskJuggler/SymbolAttribute.html +629 -0
  157. data/doc/TaskJuggler/SyntaxReference.html +1155 -0
  158. data/doc/TaskJuggler/TOCEntry.html +723 -0
  159. data/doc/TaskJuggler/TSResourceRecord.html +670 -0
  160. data/doc/TaskJuggler/TSTaskRecord.html +682 -0
  161. data/doc/TaskJuggler/TableColumnDefinition.html +830 -0
  162. data/doc/TaskJuggler/TableOfContents.html +692 -0
  163. data/doc/TaskJuggler/TableReport.html +2444 -0
  164. data/doc/TaskJuggler/Task.html +781 -0
  165. data/doc/TaskJuggler/TaskDependency.html +730 -0
  166. data/doc/TaskJuggler/TaskListAttribute.html +713 -0
  167. data/doc/TaskJuggler/TaskListRE.html +673 -0
  168. data/doc/TaskJuggler/TaskScenario.html +4380 -0
  169. data/doc/TaskJuggler/TextFormatter.html +911 -0
  170. data/doc/TaskJuggler/TextParser/Pattern.html +1482 -0
  171. data/doc/TaskJuggler/TextParser/Rule.html +1288 -0
  172. data/doc/TaskJuggler/TextParser/StackElement.html +726 -0
  173. data/doc/TaskJuggler/TextParser/TextParserResultArray.html +648 -0
  174. data/doc/TaskJuggler/TextParser/TokenDoc.html +680 -0
  175. data/doc/TaskJuggler/TextParser.html +1670 -0
  176. data/doc/TaskJuggler/TextReport.html +856 -0
  177. data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +831 -0
  178. data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +832 -0
  179. data/doc/TaskJuggler/TextScanner/StreamHandle.html +737 -0
  180. data/doc/TaskJuggler/TextScanner.html +2430 -0
  181. data/doc/TaskJuggler/TimeSheet.html +1233 -0
  182. data/doc/TaskJuggler/TimeSheetReceiver.html +612 -0
  183. data/doc/TaskJuggler/TimeSheetRecord.html +1352 -0
  184. data/doc/TaskJuggler/TimeSheetReport.html +948 -0
  185. data/doc/TaskJuggler/TimeSheetSender.html +637 -0
  186. data/doc/TaskJuggler/TimeSheetSummary.html +865 -0
  187. data/doc/TaskJuggler/TimeSheets.html +674 -0
  188. data/doc/TaskJuggler/Tj3AppBase.html +782 -0
  189. data/doc/TaskJuggler/Tj3Client.html +1455 -0
  190. data/doc/TaskJuggler/Tj3Daemon.html +767 -0
  191. data/doc/TaskJuggler/Tj3SheetAppBase.html +696 -0
  192. data/doc/TaskJuggler/Tj3SsReceiver.html +682 -0
  193. data/doc/TaskJuggler/Tj3SsSender.html +708 -0
  194. data/doc/TaskJuggler/Tj3TsReceiver.html +681 -0
  195. data/doc/TaskJuggler/Tj3TsSender.html +702 -0
  196. data/doc/TaskJuggler/Tj3TsSummary.html +710 -0
  197. data/doc/TaskJuggler/TjException.html +630 -0
  198. data/doc/TaskJuggler/TjTime.html +2590 -0
  199. data/doc/TaskJuggler/TjpExample.html +835 -0
  200. data/doc/TaskJuggler/TjpExportRE.html +1581 -0
  201. data/doc/TaskJuggler/TjpSyntaxRules.html +13004 -0
  202. data/doc/TaskJuggler/UserManual.html +1145 -0
  203. data/doc/TaskJuggler/WorkingHours.html +1101 -0
  204. data/doc/TaskJuggler/WorkingHoursAttribute.html +694 -0
  205. data/doc/TaskJuggler/XMLBlob.html +645 -0
  206. data/doc/TaskJuggler/XMLComment.html +640 -0
  207. data/doc/TaskJuggler/XMLDocument.html +732 -0
  208. data/doc/TaskJuggler/XMLElement.html +900 -0
  209. data/doc/TaskJuggler/XMLNamedText.html +601 -0
  210. data/doc/TaskJuggler/XMLText.html +655 -0
  211. data/doc/TaskJuggler.html +2243 -0
  212. data/doc/index.html +3778 -17
  213. data/doc/lib/AccountScenario_rb.html +67 -0
  214. data/doc/lib/Account_rb.html +69 -0
  215. data/doc/lib/Allocation_rb.html +69 -0
  216. data/doc/lib/AppConfig_rb.html +69 -0
  217. data/doc/lib/AttributeBase_rb.html +67 -0
  218. data/doc/lib/AttributeDefinition_rb.html +65 -0
  219. data/doc/lib/Attributes_rb.html +81 -0
  220. data/doc/lib/BatchProcessor_rb.html +69 -0
  221. data/doc/lib/Booking_rb.html +65 -0
  222. data/doc/lib/ChargeSet_rb.html +67 -0
  223. data/doc/lib/Charge_rb.html +67 -0
  224. data/doc/lib/HTMLDocument_rb.html +67 -0
  225. data/doc/lib/Interval_rb.html +67 -0
  226. data/doc/lib/Journal_rb.html +65 -0
  227. data/doc/lib/KeywordArray_rb.html +65 -0
  228. data/doc/lib/KeywordDocumentation_rb.html +75 -0
  229. data/doc/lib/Limits_rb.html +67 -0
  230. data/doc/lib/LogFile_rb.html +67 -0
  231. data/doc/lib/Log_rb.html +69 -0
  232. data/doc/lib/LogicalExpression_rb.html +71 -0
  233. data/doc/lib/LogicalFunction_rb.html +67 -0
  234. data/doc/lib/LogicalOperation_rb.html +67 -0
  235. data/doc/lib/MacroParser_rb.html +69 -0
  236. data/doc/lib/MacroTable_rb.html +73 -0
  237. data/doc/lib/MessageHandler_rb.html +65 -0
  238. data/doc/lib/Message_rb.html +67 -0
  239. data/doc/lib/ProjectFileParser_rb.html +79 -0
  240. data/doc/lib/Project_rb.html +109 -0
  241. data/doc/lib/PropertyList_rb.html +65 -0
  242. data/doc/lib/PropertySet_rb.html +69 -0
  243. data/doc/lib/PropertyTreeNode_rb.html +65 -0
  244. data/doc/lib/Query_rb.html +67 -0
  245. data/doc/lib/RTFNavigator_rb.html +71 -0
  246. data/doc/lib/RTFQuery_rb.html +71 -0
  247. data/doc/lib/RTFReport_rb.html +69 -0
  248. data/doc/lib/RealFormat_rb.html +65 -0
  249. data/doc/lib/ResourceScenario_rb.html +67 -0
  250. data/doc/lib/Resource_rb.html +69 -0
  251. data/doc/lib/RichTextDocument_rb.html +71 -0
  252. data/doc/lib/RichTextElement_rb.html +73 -0
  253. data/doc/lib/RichTextFunctionExample_rb.html +71 -0
  254. data/doc/lib/RichTextFunctionHandler_rb.html +65 -0
  255. data/doc/lib/RichTextParser_rb.html +71 -0
  256. data/doc/lib/RichTextScanner_rb.html +67 -0
  257. data/doc/lib/RichTextSnip_rb.html +69 -0
  258. data/doc/lib/RichTextSyntaxRules_rb.html +65 -0
  259. data/doc/lib/RichText_rb.html +69 -0
  260. data/doc/lib/RuntimeConfig_rb.html +67 -0
  261. data/doc/lib/ScenarioData_rb.html +69 -0
  262. data/doc/lib/Scenario_rb.html +67 -0
  263. data/doc/lib/Scoreboard_rb.html +65 -0
  264. data/doc/lib/SheetHandlerBase_rb.html +69 -0
  265. data/doc/lib/SheetReceiver_rb.html +75 -0
  266. data/doc/lib/SheetSender_rb.html +73 -0
  267. data/doc/lib/ShiftAssignments_rb.html +67 -0
  268. data/doc/lib/ShiftScenario_rb.html +67 -0
  269. data/doc/lib/Shift_rb.html +69 -0
  270. data/doc/lib/SourceFileInfo_rb.html +65 -0
  271. data/doc/lib/StatusSheetReceiver_rb.html +67 -0
  272. data/doc/lib/StatusSheetSender_rb.html +67 -0
  273. data/doc/lib/SyntaxReference_rb.html +73 -0
  274. data/doc/lib/TOCEntry_rb.html +69 -0
  275. data/doc/lib/TableColumnDefinition_rb.html +65 -0
  276. data/doc/lib/TableOfContents_rb.html +69 -0
  277. data/doc/lib/TaskDependency_rb.html +65 -0
  278. data/doc/lib/TaskJuggler_rb.html +73 -0
  279. data/doc/lib/TaskScenario_rb.html +67 -0
  280. data/doc/lib/Task_rb.html +69 -0
  281. data/doc/lib/TextFormatter_rb.html +67 -0
  282. data/doc/lib/TextParser/Pattern_rb.html +67 -0
  283. data/doc/lib/TextParser/Rule_rb.html +65 -0
  284. data/doc/lib/TextParser/StackElement_rb.html +65 -0
  285. data/doc/lib/TextParser/TokenDoc_rb.html +65 -0
  286. data/doc/lib/TextParser_rb.html +75 -0
  287. data/doc/lib/TextScanner_rb.html +79 -0
  288. data/doc/lib/TimeSheetReceiver_rb.html +67 -0
  289. data/doc/lib/TimeSheetSender_rb.html +67 -0
  290. data/doc/lib/TimeSheetSummary_rb.html +67 -0
  291. data/doc/lib/TimeSheets_rb.html +65 -0
  292. data/doc/lib/Tj3AppBase_rb.html +77 -0
  293. data/doc/lib/Tj3Config_rb.html +69 -0
  294. data/doc/lib/Tj3SheetAppBase_rb.html +67 -0
  295. data/doc/lib/TjException_rb.html +65 -0
  296. data/doc/lib/TjTime_rb.html +69 -0
  297. data/doc/lib/TjpExample_rb.html +67 -0
  298. data/doc/lib/TjpSyntaxRules_rb.html +65 -0
  299. data/doc/lib/UTF8String_rb.html +65 -0
  300. data/doc/lib/UserManual_rb.html +77 -0
  301. data/doc/lib/WorkingHours_rb.html +67 -0
  302. data/doc/lib/XMLDocument_rb.html +67 -0
  303. data/doc/lib/XMLElement_rb.html +67 -0
  304. data/doc/lib/daemon/Daemon_rb.html +67 -0
  305. data/doc/lib/daemon/ProcessIntercom_rb.html +67 -0
  306. data/doc/lib/daemon/ProjectBroker_rb.html +79 -0
  307. data/doc/lib/daemon/ProjectServer_rb.html +83 -0
  308. data/doc/lib/daemon/ReportServer_rb.html +73 -0
  309. data/doc/lib/deep_copy_rb.html +65 -0
  310. data/doc/lib/reports/CSVFile_rb.html +67 -0
  311. data/doc/lib/reports/ColumnTable_rb.html +67 -0
  312. data/doc/lib/reports/GanttChart_rb.html +73 -0
  313. data/doc/lib/reports/GanttContainer_rb.html +67 -0
  314. data/doc/lib/reports/GanttHeaderScaleItem_rb.html +65 -0
  315. data/doc/lib/reports/GanttHeader_rb.html +67 -0
  316. data/doc/lib/reports/GanttLine_rb.html +77 -0
  317. data/doc/lib/reports/GanttLoadStack_rb.html +67 -0
  318. data/doc/lib/reports/GanttMilestone_rb.html +67 -0
  319. data/doc/lib/reports/GanttRouter_rb.html +65 -0
  320. data/doc/lib/reports/GanttTaskBar_rb.html +67 -0
  321. data/doc/lib/reports/HTMLGraphics_rb.html +65 -0
  322. data/doc/lib/reports/Navigator_rb.html +67 -0
  323. data/doc/lib/reports/NikuReport_rb.html +69 -0
  324. data/doc/lib/reports/ReportBase_rb.html +65 -0
  325. data/doc/lib/reports/ReportContext_rb.html +65 -0
  326. data/doc/lib/reports/ReportTableCell_rb.html +65 -0
  327. data/doc/lib/reports/ReportTableColumn_rb.html +65 -0
  328. data/doc/lib/reports/ReportTableLegend_rb.html +65 -0
  329. data/doc/lib/reports/ReportTableLine_rb.html +67 -0
  330. data/doc/lib/reports/ReportTable_rb.html +69 -0
  331. data/doc/lib/reports/Report_rb.html +91 -0
  332. data/doc/lib/reports/ResourceListRE_rb.html +73 -0
  333. data/doc/lib/reports/StatusSheetReport_rb.html +67 -0
  334. data/doc/lib/reports/TableReport_rb.html +75 -0
  335. data/doc/lib/reports/TaskListRE_rb.html +73 -0
  336. data/doc/lib/reports/TextReport_rb.html +67 -0
  337. data/doc/lib/reports/TimeSheetReport_rb.html +67 -0
  338. data/doc/lib/reports/TjpExportRE_rb.html +67 -0
  339. data/doc/lib/ruby-signal-bug_rb.html +54 -0
  340. data/doc/lib/taskjuggler3_rb.html +73 -0
  341. data/doc/lib/tj3client_rb.html +73 -0
  342. data/doc/lib/tj3d_rb.html +73 -0
  343. data/doc/lib/tj3man_rb.html +73 -0
  344. data/doc/lib/tj3ss_receiver_rb.html +69 -0
  345. data/doc/lib/tj3ss_sender_rb.html +69 -0
  346. data/doc/lib/tj3ts_receiver_rb.html +69 -0
  347. data/doc/lib/tj3ts_sender_rb.html +69 -0
  348. data/doc/lib/tj3ts_summary_rb.html +69 -0
  349. data/doc/rdoc.css +701 -0
  350. data/examples/tutorial.tjp +25 -6
  351. data/lib/Attributes.rb +6 -2
  352. data/lib/HTMLDocument.rb +18 -2
  353. data/lib/Journal.rb +47 -4
  354. data/lib/KeywordArray.rb +1 -1
  355. data/lib/KeywordDocumentation.rb +17 -77
  356. data/lib/Log.rb +3 -1
  357. data/lib/LogFile.rb +72 -0
  358. data/lib/LogicalExpression.rb +5 -10
  359. data/lib/LogicalFunction.rb +34 -18
  360. data/lib/LogicalOperation.rb +32 -18
  361. data/lib/Project.rb +85 -13
  362. data/lib/ProjectFileParser.rb +19 -6
  363. data/lib/PropertyList.rb +12 -2
  364. data/lib/PropertyTreeNode.rb +23 -9
  365. data/lib/Query.rb +51 -13
  366. data/lib/RTFReport.rb +2 -2
  367. data/lib/Resource.rb +157 -0
  368. data/lib/ResourceScenario.rb +215 -68
  369. data/lib/RichText.rb +15 -3
  370. data/lib/RichTextDocument.rb +2 -4
  371. data/lib/RichTextElement.rb +87 -25
  372. data/lib/RichTextScanner.rb +32 -5
  373. data/lib/RichTextSnip.rb +6 -4
  374. data/lib/RichTextSyntaxRules.rb +44 -8
  375. data/lib/RuntimeConfig.rb +93 -0
  376. data/lib/Scoreboard.rb +6 -6
  377. data/lib/SheetHandlerBase.rb +215 -0
  378. data/lib/SheetReceiver.rb +355 -0
  379. data/lib/SheetSender.rb +264 -0
  380. data/lib/ShiftAssignments.rb +35 -27
  381. data/lib/StatusSheetReceiver.rb +45 -0
  382. data/lib/StatusSheetSender.rb +54 -0
  383. data/lib/SyntaxReference.rb +2 -7
  384. data/lib/Task.rb +70 -0
  385. data/lib/TaskJuggler.rb +114 -12
  386. data/lib/TaskScenario.rb +131 -22
  387. data/lib/TextFormatter.rb +177 -0
  388. data/lib/TextParser.rb +10 -1
  389. data/lib/TextScanner.rb +63 -33
  390. data/lib/TimeSheetReceiver.rb +42 -0
  391. data/lib/TimeSheetSender.rb +55 -0
  392. data/lib/TimeSheetSummary.rb +149 -0
  393. data/lib/TimeSheets.rb +406 -0
  394. data/lib/Tj3AppBase.rb +114 -0
  395. data/lib/Tj3Config.rb +1 -1
  396. data/lib/Tj3SheetAppBase.rb +59 -0
  397. data/lib/TjTime.rb +14 -1
  398. data/lib/TjpSyntaxRules.rb +573 -211
  399. data/lib/UTF8String.rb +4 -0
  400. data/lib/UserManual.rb +8 -7
  401. data/lib/XMLElement.rb +27 -19
  402. data/lib/daemon/Daemon.rb +70 -0
  403. data/lib/daemon/ProcessIntercom.rb +117 -0
  404. data/lib/daemon/ProjectBroker.rb +450 -0
  405. data/lib/daemon/ProjectServer.rb +348 -0
  406. data/lib/daemon/ReportServer.rb +194 -0
  407. data/lib/reports/ColumnTable.rb +2 -0
  408. data/lib/reports/GanttChart.rb +5 -7
  409. data/lib/reports/GanttContainer.rb +5 -8
  410. data/lib/reports/GanttHeader.rb +1 -1
  411. data/lib/reports/GanttLine.rb +89 -53
  412. data/lib/reports/GanttMilestone.rb +7 -4
  413. data/lib/reports/GanttTaskBar.rb +7 -3
  414. data/lib/reports/HTMLGraphics.rb +24 -9
  415. data/lib/reports/NikuReport.rb +414 -0
  416. data/lib/reports/Report.rb +54 -20
  417. data/lib/reports/ReportBase.rb +21 -0
  418. data/lib/reports/ReportTable.rb +29 -11
  419. data/lib/reports/ReportTableCell.rb +154 -86
  420. data/lib/reports/ReportTableLegend.rb +77 -80
  421. data/lib/reports/ResourceListRE.rb +2 -3
  422. data/lib/reports/StatusSheetReport.rb +231 -0
  423. data/lib/reports/TableReport.rb +74 -65
  424. data/lib/reports/TaskListRE.rb +2 -4
  425. data/lib/reports/TextReport.rb +18 -12
  426. data/lib/reports/TimeSheetReport.rb +145 -80
  427. data/lib/reports/TjpExportRE.rb +4 -4
  428. data/lib/ruby-signal-bug.rb +43 -0
  429. data/lib/taskjuggler3.rb +27 -10
  430. data/lib/tj3client.rb +411 -77
  431. data/lib/tj3d.rb +110 -0
  432. data/lib/tj3ss_receiver.rb +56 -0
  433. data/lib/tj3ss_sender.rb +84 -0
  434. data/lib/tj3ts_receiver.rb +59 -0
  435. data/lib/tj3ts_sender.rb +78 -0
  436. data/lib/tj3ts_summary.rb +87 -0
  437. data/manual/Day_To_Day_Juggling +761 -32
  438. data/manual/Getting_Started +12 -12
  439. data/manual/Rich_Text_Attributes +13 -1
  440. data/manual/TaskJuggler_2x_Migration +41 -3
  441. data/manual/TaskJuggler_Internals +87 -0
  442. data/manual/The_TaskJuggler_Syntax +1 -2
  443. data/manual/Tutorial +10 -10
  444. data/test/TestSuite/CSV-Reports/celltext.tjp +1 -1
  445. data/test/TestSuite/HTML-Reports/TimeSheet.html +79 -0
  446. data/test/TestSuite/HTML-Reports/icons/trend-down.png +0 -0
  447. data/test/TestSuite/HTML-Reports/icons/trend-flat.png +0 -0
  448. data/test/TestSuite/HTML-Reports/icons/trend-up.png +0 -0
  449. data/test/TestSuite/HTML-Reports/reference.html +51 -0
  450. data/test/TestSuite/Scheduler/Correct/Booking2.html +603 -0
  451. data/test/TestSuite/Scheduler/Correct/Booking2.tjp +57 -0
  452. data/test/TestSuite/Scheduler/Correct/Duration.tjp +32 -18
  453. data/test/TestSuite/Scheduler/Correct/Manager.tjp +9 -0
  454. data/test/TestSuite/Scheduler/Correct/Shift.html +429 -0
  455. data/test/TestSuite/Scheduler/Correct/Shift2.html +162 -0
  456. data/test/TestSuite/Scheduler/Correct/Shift2.tjp +67 -0
  457. data/test/TestSuite/{Syntax/Correct/TimeSheet.tjp → Scheduler/Correct/TimeSheet2.tjp} +21 -8
  458. data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +52 -0
  459. data/test/TestSuite/Scheduler/Correct/css/tjreport.css +195 -0
  460. data/test/TestSuite/{Syntax → Scheduler}/Correct/icons/details.png +0 -0
  461. data/test/TestSuite/Scheduler/Correct/icons/flag-green.png +0 -0
  462. data/test/TestSuite/Scheduler/Correct/icons/flag-red.png +0 -0
  463. data/test/TestSuite/Scheduler/Correct/icons/flag-yellow.png +0 -0
  464. data/test/TestSuite/{Syntax → Scheduler}/Correct/icons/resource.png +0 -0
  465. data/test/TestSuite/{Syntax → Scheduler}/Correct/icons/resourcegroup.png +0 -0
  466. data/test/TestSuite/{Syntax → Scheduler}/Correct/icons/task.png +0 -0
  467. data/test/TestSuite/{Syntax → Scheduler}/Correct/icons/taskgroup.png +0 -0
  468. data/test/TestSuite/Scheduler/Correct/icons/trend-down.png +0 -0
  469. data/test/TestSuite/Scheduler/Correct/icons/trend-flat.png +0 -0
  470. data/test/TestSuite/Scheduler/Correct/icons/trend-up.png +0 -0
  471. data/test/TestSuite/{HTML-Reports/scripts → Scheduler/Correct}/scripts/wz_tooltip.js +0 -0
  472. data/test/TestSuite/Scheduler/Errors/manager_is_group.tjp +15 -0
  473. data/test/TestSuite/Scheduler/Errors/manager_is_self.tjp +11 -0
  474. data/test/TestSuite/Scheduler/Errors/resource_fail_check.tjp +12 -0
  475. data/test/TestSuite/Scheduler/Errors/resource_warn_check.tjp +12 -0
  476. data/test/TestSuite/Scheduler/Errors/task_fail_check.tjp +8 -0
  477. data/test/TestSuite/Scheduler/Errors/task_warn_check.tjp +8 -0
  478. data/test/TestSuite/Scheduler/Errors/ts_alert1_more_details.tjp +20 -0
  479. data/test/TestSuite/Scheduler/Errors/ts_alert2_more_details.tjp +21 -0
  480. data/test/TestSuite/Scheduler/Errors/ts_no_expected_end.tjp +26 -0
  481. data/test/TestSuite/Scheduler/Errors/ts_no_headline1.tjp +27 -0
  482. data/test/TestSuite/Scheduler/Errors/ts_no_rem_or_end.tjp +26 -0
  483. data/test/TestSuite/Scheduler/Errors/ts_no_remaining.tjp +26 -0
  484. data/test/TestSuite/Scheduler/Errors/ts_no_status_work.tjp +18 -0
  485. data/test/TestSuite/Scheduler/Errors/ts_no_work.tjp +26 -0
  486. data/test/TestSuite/Scheduler/Errors/ts_res_new_task.tjp +20 -0
  487. data/test/TestSuite/Scheduler/Errors/ts_work_too_high.tjp +27 -0
  488. data/test/TestSuite/Scheduler/Errors/ts_work_too_low.tjp +27 -0
  489. data/test/TestSuite/StatusSheets/boss.tji +45 -0
  490. data/test/TestSuite/StatusSheets/boss_mail +51 -0
  491. data/test/TestSuite/StatusSheets/dev2_mail +37 -0
  492. data/test/TestSuite/StatusSheets/project.tjp +275 -0
  493. data/test/TestSuite/StatusSheets/run +50 -0
  494. data/test/TestSuite/Syntax/Correct/Include.tjp +4 -0
  495. data/test/TestSuite/Syntax/Correct/Limits-1.tjp +10 -1
  496. data/test/TestSuite/Syntax/Correct/Manager.tjp +30 -0
  497. data/test/TestSuite/Syntax/Correct/Niku.tjp +66 -0
  498. data/test/TestSuite/Syntax/Correct/TimeSheet1.tjp +83 -0
  499. data/test/TestSuite/Syntax/Correct/include/dir1/file2.tji +1 -0
  500. data/test/TestSuite/Syntax/Correct/include/dir2/file3.tji +2 -0
  501. data/test/TestSuite/Syntax/Correct/include/file1.tji +3 -0
  502. data/test/TestSuite/Syntax/Correct/tutorial.tjp +29 -8
  503. data/test/TestSuite/Syntax/Errors/ts_bad_priority.tjp +19 -0
  504. data/test/TestSuite/Syntax/Errors/ts_default_details.tjp +22 -0
  505. data/test/TestSuite/Syntax/Errors/ts_default_summary.tjp +22 -0
  506. data/test/TestSuite/Syntax/Errors/ts_duplicate_task.tjp +23 -0
  507. data/test/TestSuite/Syntax/Errors/ts_end_too_early.tjp +18 -0
  508. data/test/TestSuite/Syntax/Errors/ts_headline_too_long.tjp +19 -0
  509. data/test/TestSuite/Syntax/Errors/ts_no_headline2.tjp +27 -0
  510. data/test/TestSuite/Syntax/Errors/ts_summary_too_long.tjp +29 -0
  511. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/boss_2002-03-01.tji +36 -0
  512. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev1_2002-03-01.tji +48 -0
  513. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev2_2002-03-01.tji +67 -0
  514. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev3_2002-03-01.tji +67 -0
  515. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/doc_2002-03-01.tji +48 -0
  516. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/resources.yml +31 -0
  517. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/test_2002-03-01.tji +36 -0
  518. data/test/TestSuite/TimeSheets/TimeSheetTemplates/acceptable_intervals +1 -0
  519. data/test/TestSuite/TimeSheets/TimeSheets/2002-03-01/all.tji +1 -0
  520. data/test/TestSuite/TimeSheets/TimeSheets/2002-03-01/dev2_2002-03-01.tji +54 -0
  521. data/test/TestSuite/TimeSheets/TimeSheets/all.tji +2 -0
  522. data/test/TestSuite/TimeSheets/dev2_mail1 +84 -0
  523. data/test/TestSuite/TimeSheets/dev2_mail2 +87 -0
  524. data/test/TestSuite/TimeSheets/project.tjp +271 -0
  525. data/test/TestSuite/TimeSheets/receiver.log +102 -0
  526. data/test/TestSuite/TimeSheets/run +75 -0
  527. data/test/TestSuite/TimeSheets/sender.log +794 -0
  528. data/test/TestSuite/TimeSheets/summary.log +884 -0
  529. data/test/TestSuite/TimeSheets/timesheets.log +45 -0
  530. data/test/TestSuite/TimeSheets/tj3d.log +292 -0
  531. data/test/test_CSV-Reports.rb +5 -3
  532. data/test/test_RichText.rb +264 -56
  533. data/test/test_Scheduler.rb +1 -0
  534. data/test/test_TextFormatter.rb +142 -0
  535. data/test/test_TjTime.rb +15 -0
  536. metadata +816 -644
  537. data/benchmarks/UTF-8-Strings.rb +0 -58
  538. data/doc/classes/AppConfig.html +0 -880
  539. data/doc/classes/Arguments.html +0 -230
  540. data/doc/classes/Object.html +0 -229
  541. data/doc/classes/String.html +0 -399
  542. data/doc/classes/TaskJuggler/Account.html +0 -257
  543. data/doc/classes/TaskJuggler/AccountAttribute.html +0 -261
  544. data/doc/classes/TaskJuggler/AccountScenario.html +0 -218
  545. data/doc/classes/TaskJuggler/Allocation.html +0 -423
  546. data/doc/classes/TaskJuggler/AllocationAttribute.html +0 -291
  547. data/doc/classes/TaskJuggler/AttributeBase.html +0 -704
  548. data/doc/classes/TaskJuggler/AttributeDefinition.html +0 -276
  549. data/doc/classes/TaskJuggler/BatchProcessor.html +0 -347
  550. data/doc/classes/TaskJuggler/Booking.html +0 -311
  551. data/doc/classes/TaskJuggler/BookingListAttribute.html +0 -263
  552. data/doc/classes/TaskJuggler/BooleanAttribute.html +0 -261
  553. data/doc/classes/TaskJuggler/CSVFile.html +0 -329
  554. data/doc/classes/TaskJuggler/CellSettingPattern.html +0 -201
  555. data/doc/classes/TaskJuggler/CellSettingPatternList.html +0 -253
  556. data/doc/classes/TaskJuggler/Charge.html +0 -283
  557. data/doc/classes/TaskJuggler/ChargeListAttribute.html +0 -229
  558. data/doc/classes/TaskJuggler/ChargeSet.html +0 -444
  559. data/doc/classes/TaskJuggler/ChargeSetListAttribute.html +0 -276
  560. data/doc/classes/TaskJuggler/ColumnListAttribute.html +0 -231
  561. data/doc/classes/TaskJuggler/ColumnTable.html +0 -262
  562. data/doc/classes/TaskJuggler/DateAttribute.html +0 -233
  563. data/doc/classes/TaskJuggler/DefinitionListAttribute.html +0 -162
  564. data/doc/classes/TaskJuggler/DependencyListAttribute.html +0 -267
  565. data/doc/classes/TaskJuggler/DurationAttribute.html +0 -229
  566. data/doc/classes/TaskJuggler/FixnumAttribute.html +0 -194
  567. data/doc/classes/TaskJuggler/FlagListAttribute.html +0 -263
  568. data/doc/classes/TaskJuggler/FloatAttribute.html +0 -229
  569. data/doc/classes/TaskJuggler/FormatListAttribute.html +0 -197
  570. data/doc/classes/TaskJuggler/GanttChart.html +0 -696
  571. data/doc/classes/TaskJuggler/GanttContainer.html +0 -445
  572. data/doc/classes/TaskJuggler/GanttHeader.html +0 -284
  573. data/doc/classes/TaskJuggler/GanttHeaderScaleItem.html +0 -249
  574. data/doc/classes/TaskJuggler/GanttLine.html +0 -402
  575. data/doc/classes/TaskJuggler/GanttLoadStack.html +0 -331
  576. data/doc/classes/TaskJuggler/GanttMilestone.html +0 -419
  577. data/doc/classes/TaskJuggler/GanttRouter.html +0 -431
  578. data/doc/classes/TaskJuggler/GanttTaskBar.html +0 -433
  579. data/doc/classes/TaskJuggler/HTMLDocument.html +0 -240
  580. data/doc/classes/TaskJuggler/HTMLGraphics.html +0 -231
  581. data/doc/classes/TaskJuggler/Interval.html +0 -558
  582. data/doc/classes/TaskJuggler/IntervalListAttribute.html +0 -267
  583. data/doc/classes/TaskJuggler/JobInfo.html +0 -340
  584. data/doc/classes/TaskJuggler/Journal.html +0 -443
  585. data/doc/classes/TaskJuggler/JournalEntry.html +0 -274
  586. data/doc/classes/TaskJuggler/JournalEntryList.html +0 -454
  587. data/doc/classes/TaskJuggler/KeywordArray.html +0 -179
  588. data/doc/classes/TaskJuggler/KeywordDocumentation.html +0 -846
  589. data/doc/classes/TaskJuggler/Limits/Limit.html +0 -385
  590. data/doc/classes/TaskJuggler/Limits.html +0 -422
  591. data/doc/classes/TaskJuggler/LimitsAttribute.html +0 -261
  592. data/doc/classes/TaskJuggler/ListAttributeBase.html +0 -207
  593. data/doc/classes/TaskJuggler/Log.html +0 -655
  594. data/doc/classes/TaskJuggler/LogicalAttribute.html +0 -259
  595. data/doc/classes/TaskJuggler/LogicalExpression.html +0 -292
  596. data/doc/classes/TaskJuggler/LogicalExpressionAttribute.html +0 -194
  597. data/doc/classes/TaskJuggler/LogicalFlag.html +0 -209
  598. data/doc/classes/TaskJuggler/LogicalFunction.html +0 -339
  599. data/doc/classes/TaskJuggler/LogicalOperation.html +0 -351
  600. data/doc/classes/TaskJuggler/Macro.html +0 -198
  601. data/doc/classes/TaskJuggler/MacroParser.html +0 -360
  602. data/doc/classes/TaskJuggler/MacroTable.html +0 -370
  603. data/doc/classes/TaskJuggler/Message.html +0 -285
  604. data/doc/classes/TaskJuggler/MessageHandler.html +0 -231
  605. data/doc/classes/TaskJuggler/Navigator.html +0 -313
  606. data/doc/classes/TaskJuggler/NavigatorElement.html +0 -449
  607. data/doc/classes/TaskJuggler/OnShiftCache.html +0 -316
  608. data/doc/classes/TaskJuggler/Project.html +0 -2257
  609. data/doc/classes/TaskJuggler/ProjectFileParser.html +0 -420
  610. data/doc/classes/TaskJuggler/PropertyAttribute.html +0 -194
  611. data/doc/classes/TaskJuggler/PropertyList.html +0 -668
  612. data/doc/classes/TaskJuggler/PropertySet.html +0 -1286
  613. data/doc/classes/TaskJuggler/PropertyTreeNode.html +0 -1742
  614. data/doc/classes/TaskJuggler/Query.html +0 -870
  615. data/doc/classes/TaskJuggler/RTFNavigator.html +0 -293
  616. data/doc/classes/TaskJuggler/RTFQuery.html +0 -343
  617. data/doc/classes/TaskJuggler/RTFReport.html +0 -304
  618. data/doc/classes/TaskJuggler/RealFormat.html +0 -309
  619. data/doc/classes/TaskJuggler/RealFormatAttribute.html +0 -162
  620. data/doc/classes/TaskJuggler/ReferenceAttribute.html +0 -328
  621. data/doc/classes/TaskJuggler/RemoteServiceManager.html +0 -335
  622. data/doc/classes/TaskJuggler/Report.html +0 -321
  623. data/doc/classes/TaskJuggler/ReportBase.html +0 -437
  624. data/doc/classes/TaskJuggler/ReportContext.html +0 -248
  625. data/doc/classes/TaskJuggler/ReportServer.html +0 -320
  626. data/doc/classes/TaskJuggler/ReportTable.html +0 -526
  627. data/doc/classes/TaskJuggler/ReportTableCell.html +0 -614
  628. data/doc/classes/TaskJuggler/ReportTableColumn.html +0 -368
  629. data/doc/classes/TaskJuggler/ReportTableLegend.html +0 -347
  630. data/doc/classes/TaskJuggler/ReportTableLine.html +0 -481
  631. data/doc/classes/TaskJuggler/Resource.html +0 -211
  632. data/doc/classes/TaskJuggler/ResourceListAttribute.html +0 -302
  633. data/doc/classes/TaskJuggler/ResourceListRE.html +0 -245
  634. data/doc/classes/TaskJuggler/ResourceScenario.html +0 -1229
  635. data/doc/classes/TaskJuggler/RichText.html +0 -357
  636. data/doc/classes/TaskJuggler/RichTextAttribute.html +0 -293
  637. data/doc/classes/TaskJuggler/RichTextDocument.html +0 -424
  638. data/doc/classes/TaskJuggler/RichTextElement.html +0 -932
  639. data/doc/classes/TaskJuggler/RichTextException.html +0 -212
  640. data/doc/classes/TaskJuggler/RichTextFunctionExample.html +0 -301
  641. data/doc/classes/TaskJuggler/RichTextFunctionHandler.html +0 -245
  642. data/doc/classes/TaskJuggler/RichTextIntermediate.html +0 -563
  643. data/doc/classes/TaskJuggler/RichTextParser.html +0 -321
  644. data/doc/classes/TaskJuggler/RichTextScanner.html +0 -424
  645. data/doc/classes/TaskJuggler/RichTextSnip.html +0 -404
  646. data/doc/classes/TaskJuggler/RichTextSyntaxRules.html +0 -1105
  647. data/doc/classes/TaskJuggler/Scenario.html +0 -163
  648. data/doc/classes/TaskJuggler/ScenarioData.html +0 -358
  649. data/doc/classes/TaskJuggler/ScenarioListAttribute.html +0 -229
  650. data/doc/classes/TaskJuggler/Scoreboard.html +0 -642
  651. data/doc/classes/TaskJuggler/Shift.html +0 -255
  652. data/doc/classes/TaskJuggler/ShiftAssignment.html +0 -492
  653. data/doc/classes/TaskJuggler/ShiftAssignments.html +0 -719
  654. data/doc/classes/TaskJuggler/ShiftAssignmentsAttribute.html +0 -261
  655. data/doc/classes/TaskJuggler/ShiftScenario.html +0 -282
  656. data/doc/classes/TaskJuggler/SortListAttribute.html +0 -196
  657. data/doc/classes/TaskJuggler/SourceFileInfo.html +0 -251
  658. data/doc/classes/TaskJuggler/StringAttribute.html +0 -229
  659. data/doc/classes/TaskJuggler/SymbolAttribute.html +0 -194
  660. data/doc/classes/TaskJuggler/SyntaxReference.html +0 -520
  661. data/doc/classes/TaskJuggler/TOCEntry.html +0 -246
  662. data/doc/classes/TaskJuggler/TSResourceRecord.html +0 -197
  663. data/doc/classes/TaskJuggler/TSTaskRecord.html +0 -215
  664. data/doc/classes/TaskJuggler/TableColumnDefinition.html +0 -309
  665. data/doc/classes/TaskJuggler/TableOfContents.html +0 -260
  666. data/doc/classes/TaskJuggler/TableReport.html +0 -1015
  667. data/doc/classes/TaskJuggler/Task.html +0 -203
  668. data/doc/classes/TaskJuggler/TaskDependency.html +0 -255
  669. data/doc/classes/TaskJuggler/TaskListAttribute.html +0 -267
  670. data/doc/classes/TaskJuggler/TaskListRE.html +0 -245
  671. data/doc/classes/TaskJuggler/TaskScenario.html +0 -2543
  672. data/doc/classes/TaskJuggler/TextParser/Pattern.html +0 -927
  673. data/doc/classes/TaskJuggler/TextParser/Rule.html +0 -783
  674. data/doc/classes/TaskJuggler/TextParser/StackElement.html +0 -272
  675. data/doc/classes/TaskJuggler/TextParser/TextParserResultArray.html +0 -212
  676. data/doc/classes/TaskJuggler/TextParser/TokenDoc.html +0 -225
  677. data/doc/classes/TaskJuggler/TextParser.html +0 -754
  678. data/doc/classes/TaskJuggler/TextReport.html +0 -367
  679. data/doc/classes/TaskJuggler/TextScanner/BufferStreamHandle.html +0 -355
  680. data/doc/classes/TaskJuggler/TextScanner/FileStreamHandle.html +0 -348
  681. data/doc/classes/TaskJuggler/TextScanner/StreamHandle.html +0 -264
  682. data/doc/classes/TaskJuggler/TextScanner.html +0 -815
  683. data/doc/classes/TaskJuggler/TimeSheetReport.html +0 -406
  684. data/doc/classes/TaskJuggler/TjException.html +0 -185
  685. data/doc/classes/TaskJuggler/TjTime.html +0 -1904
  686. data/doc/classes/TaskJuggler/TjpExample.html +0 -314
  687. data/doc/classes/TaskJuggler/TjpExportRE.html +0 -306
  688. data/doc/classes/TaskJuggler/TjpSyntaxRules.html +0 -10812
  689. data/doc/classes/TaskJuggler/UserManual.html +0 -605
  690. data/doc/classes/TaskJuggler/WorkingHours.html +0 -586
  691. data/doc/classes/TaskJuggler/WorkingHoursAttribute.html +0 -252
  692. data/doc/classes/TaskJuggler/XMLBlob.html +0 -207
  693. data/doc/classes/TaskJuggler/XMLComment.html +0 -206
  694. data/doc/classes/TaskJuggler/XMLDocument.html +0 -298
  695. data/doc/classes/TaskJuggler/XMLElement.html +0 -389
  696. data/doc/classes/TaskJuggler/XMLNamedText.html +0 -174
  697. data/doc/classes/TaskJuggler/XMLText.html +0 -221
  698. data/doc/classes/TaskJuggler.html +0 -1573
  699. data/doc/files/COPYING.html +0 -448
  700. data/doc/files/README.html +0 -134
  701. data/doc/files/lib/AccountScenario_rb.html +0 -117
  702. data/doc/files/lib/Account_rb.html +0 -119
  703. data/doc/files/lib/Allocation_rb.html +0 -119
  704. data/doc/files/lib/AppConfig_rb.html +0 -119
  705. data/doc/files/lib/AttributeBase_rb.html +0 -117
  706. data/doc/files/lib/AttributeDefinition_rb.html +0 -107
  707. data/doc/files/lib/Attributes_rb.html +0 -131
  708. data/doc/files/lib/BatchProcessor_rb.html +0 -119
  709. data/doc/files/lib/Booking_rb.html +0 -107
  710. data/doc/files/lib/ChargeSet_rb.html +0 -117
  711. data/doc/files/lib/Charge_rb.html +0 -117
  712. data/doc/files/lib/HTMLDocument_rb.html +0 -117
  713. data/doc/files/lib/Interval_rb.html +0 -117
  714. data/doc/files/lib/Journal_rb.html +0 -107
  715. data/doc/files/lib/KeywordArray_rb.html +0 -107
  716. data/doc/files/lib/KeywordDocumentation_rb.html +0 -123
  717. data/doc/files/lib/Limits_rb.html +0 -117
  718. data/doc/files/lib/Log_rb.html +0 -117
  719. data/doc/files/lib/LogicalExpression_rb.html +0 -121
  720. data/doc/files/lib/LogicalFunction_rb.html +0 -117
  721. data/doc/files/lib/LogicalOperation_rb.html +0 -117
  722. data/doc/files/lib/MacroParser_rb.html +0 -119
  723. data/doc/files/lib/MacroTable_rb.html +0 -123
  724. data/doc/files/lib/MessageHandler_rb.html +0 -107
  725. data/doc/files/lib/Message_rb.html +0 -117
  726. data/doc/files/lib/ProjectFileParser_rb.html +0 -129
  727. data/doc/files/lib/Project_rb.html +0 -153
  728. data/doc/files/lib/PropertyList_rb.html +0 -107
  729. data/doc/files/lib/PropertySet_rb.html +0 -119
  730. data/doc/files/lib/PropertyTreeNode_rb.html +0 -107
  731. data/doc/files/lib/Query_rb.html +0 -117
  732. data/doc/files/lib/RTFNavigator_rb.html +0 -121
  733. data/doc/files/lib/RTFQuery_rb.html +0 -121
  734. data/doc/files/lib/RTFReport_rb.html +0 -119
  735. data/doc/files/lib/RealFormat_rb.html +0 -107
  736. data/doc/files/lib/RemoteServiceManager_rb.html +0 -117
  737. data/doc/files/lib/ReportServer_rb.html +0 -107
  738. data/doc/files/lib/ResourceScenario_rb.html +0 -117
  739. data/doc/files/lib/Resource_rb.html +0 -119
  740. data/doc/files/lib/RichTextDocument_rb.html +0 -121
  741. data/doc/files/lib/RichTextElement_rb.html +0 -121
  742. data/doc/files/lib/RichTextFunctionExample_rb.html +0 -121
  743. data/doc/files/lib/RichTextFunctionHandler_rb.html +0 -107
  744. data/doc/files/lib/RichTextParser_rb.html +0 -121
  745. data/doc/files/lib/RichTextScanner_rb.html +0 -117
  746. data/doc/files/lib/RichTextSnip_rb.html +0 -119
  747. data/doc/files/lib/RichTextSyntaxRules_rb.html +0 -107
  748. data/doc/files/lib/RichText_rb.html +0 -119
  749. data/doc/files/lib/ScenarioData_rb.html +0 -119
  750. data/doc/files/lib/Scenario_rb.html +0 -117
  751. data/doc/files/lib/Scoreboard_rb.html +0 -107
  752. data/doc/files/lib/ShiftAssignments_rb.html +0 -117
  753. data/doc/files/lib/ShiftScenario_rb.html +0 -117
  754. data/doc/files/lib/Shift_rb.html +0 -119
  755. data/doc/files/lib/SourceFileInfo_rb.html +0 -107
  756. data/doc/files/lib/SyntaxReference_rb.html +0 -123
  757. data/doc/files/lib/TOCEntry_rb.html +0 -119
  758. data/doc/files/lib/TableColumnDefinition_rb.html +0 -107
  759. data/doc/files/lib/TableOfContents_rb.html +0 -119
  760. data/doc/files/lib/TaskDependency_rb.html +0 -107
  761. data/doc/files/lib/TaskJuggler_rb.html +0 -125
  762. data/doc/files/lib/TaskScenario_rb.html +0 -117
  763. data/doc/files/lib/Task_rb.html +0 -119
  764. data/doc/files/lib/TextParser/Pattern_rb.html +0 -117
  765. data/doc/files/lib/TextParser/Rule_rb.html +0 -107
  766. data/doc/files/lib/TextParser/StackElement_rb.html +0 -107
  767. data/doc/files/lib/TextParser/TokenDoc_rb.html +0 -107
  768. data/doc/files/lib/TextParser_rb.html +0 -125
  769. data/doc/files/lib/TextScanner_rb.html +0 -129
  770. data/doc/files/lib/Tj3Config_rb.html +0 -119
  771. data/doc/files/lib/TjException_rb.html +0 -107
  772. data/doc/files/lib/TjTime_rb.html +0 -119
  773. data/doc/files/lib/TjpExample_rb.html +0 -117
  774. data/doc/files/lib/TjpSyntaxRules_rb.html +0 -107
  775. data/doc/files/lib/UTF8String_rb.html +0 -140
  776. data/doc/files/lib/UserManual_rb.html +0 -127
  777. data/doc/files/lib/WorkingHours_rb.html +0 -117
  778. data/doc/files/lib/XMLDocument_rb.html +0 -117
  779. data/doc/files/lib/XMLElement_rb.html +0 -117
  780. data/doc/files/lib/deep_copy_rb.html +0 -107
  781. data/doc/files/lib/reports/CSVFile_rb.html +0 -117
  782. data/doc/files/lib/reports/ColumnTable_rb.html +0 -117
  783. data/doc/files/lib/reports/GanttChart_rb.html +0 -123
  784. data/doc/files/lib/reports/GanttContainer_rb.html +0 -117
  785. data/doc/files/lib/reports/GanttHeaderScaleItem_rb.html +0 -107
  786. data/doc/files/lib/reports/GanttHeader_rb.html +0 -117
  787. data/doc/files/lib/reports/GanttLine_rb.html +0 -127
  788. data/doc/files/lib/reports/GanttLoadStack_rb.html +0 -117
  789. data/doc/files/lib/reports/GanttMilestone_rb.html +0 -117
  790. data/doc/files/lib/reports/GanttRouter_rb.html +0 -107
  791. data/doc/files/lib/reports/GanttTaskBar_rb.html +0 -117
  792. data/doc/files/lib/reports/HTMLGraphics_rb.html +0 -107
  793. data/doc/files/lib/reports/Navigator_rb.html +0 -117
  794. data/doc/files/lib/reports/ReportBase_rb.html +0 -107
  795. data/doc/files/lib/reports/ReportContext_rb.html +0 -107
  796. data/doc/files/lib/reports/ReportTableCell_rb.html +0 -107
  797. data/doc/files/lib/reports/ReportTableColumn_rb.html +0 -107
  798. data/doc/files/lib/reports/ReportTableLegend_rb.html +0 -107
  799. data/doc/files/lib/reports/ReportTableLine_rb.html +0 -117
  800. data/doc/files/lib/reports/ReportTable_rb.html +0 -119
  801. data/doc/files/lib/reports/Report_rb.html +0 -137
  802. data/doc/files/lib/reports/ResourceListRE_rb.html +0 -123
  803. data/doc/files/lib/reports/TableReport_rb.html +0 -125
  804. data/doc/files/lib/reports/TaskListRE_rb.html +0 -123
  805. data/doc/files/lib/reports/TextReport_rb.html +0 -117
  806. data/doc/files/lib/reports/TimeSheetReport_rb.html +0 -117
  807. data/doc/files/lib/reports/TjpExportRE_rb.html +0 -117
  808. data/doc/files/lib/taskjuggler3_rb.html +0 -298
  809. data/doc/files/lib/tj3client_rb.html +0 -280
  810. data/doc/files/lib/tj3man_rb.html +0 -190
  811. data/doc/fr_class_index.html +0 -345
  812. data/doc/fr_file_index.html +0 -247
  813. data/doc/fr_method_index.html +0 -2355
  814. data/doc/rdoc-style.css +0 -299
  815. data/lib/RemoteServiceManager.rb +0 -80
  816. data/lib/ReportServer.rb +0 -66
  817. data/test/TestSuite/HTML-Reports/Alerts.html +0 -172
  818. data/test/TestSuite/HTML-Reports/CellText.html +0 -758
  819. data/test/TestSuite/HTML-Reports/ColumnPeriods.html +0 -156
  820. data/test/TestSuite/HTML-Reports/IsOngoing.html +0 -172
  821. data/test/TestSuite/HTML-Reports/LogicalFunctions.html +0 -80
  822. data/test/TestSuite/HTML-Reports/Query.html +0 -31
  823. data/test/TestSuite/HTML-Reports/depArrows.html +0 -842
  824. data/test/TestSuite/Syntax/Correct/RawHTML.tjp +0 -31
  825. data/test/TestSuite/Syntax/Correct/icons/flag-green.png +0 -0
  826. data/test/TestSuite/Syntax/Correct/icons/flag-red.png +0 -0
  827. data/test/TestSuite/Syntax/Correct/icons/flag-yellow.png +0 -0
  828. data/test/TestSuite/Syntax/Correct/scripts/wz_tooltip.js +0 -1301
  829. data/test/TestSuite/Syntax/Errors/export_bad_extn.tjp +0 -9
@@ -352,7 +352,16 @@ EOT
352
352
  @booking.overtime = @val[1]
353
353
  })
354
354
  doc('overtime.booking', <<'EOT'
355
- This attribute enables bookings to override working hours and vacations.
355
+ This attribute enables bookings during off-hours and vacations. It implicitly
356
+ sets the [[sloppy.booking|sloppy]] attribute accordingly.
357
+ EOT
358
+ )
359
+ arg(1, 'value', <<'EOT'
360
+ * '''0''': You can only book available working time. (Default)
361
+
362
+ * '''1''': You can book off-hours as well.
363
+
364
+ * '''2''': You can book working time, off-hours and vacation time.
356
365
  EOT
357
366
  )
358
367
 
@@ -365,9 +374,20 @@ EOT
365
374
  })
366
375
  doc('sloppy.booking', <<'EOT'
367
376
  Controls how strict TaskJuggler checks booking intervals for conflicts with
368
- vacation and other bookings. In case the error is suppressed the booking will
369
- not overwrite the existing bookings. It will avoid the already assigned
370
- intervals during booking.
377
+ working periods and vacations. This attribute only affects the check for
378
+ conflicts. No assignments will be made unless the [[overtime.booking|
379
+ overtime]] attribute is set accordingly.
380
+ EOT
381
+ )
382
+ arg(1, 'sloppyness', <<'EOT'
383
+ * '''0''': Period may not contain any off-duty hours, vacation or other task
384
+ assignments. (default)
385
+
386
+ * '''1''': Period may contain off-duty hours, but no vacation time or other
387
+ task assignments.
388
+
389
+ * '''2''': Period may contain off-duty hours and vacation time, but no other
390
+ task assignments.
371
391
  EOT
372
392
  )
373
393
  end
@@ -508,8 +528,8 @@ EOT
508
528
  @column = TableColumnDefinition.new(@val[0], title)
509
529
  })
510
530
  doc('columnid', <<'EOT'
511
- In addition to the listed IDs all user defined attributes can be used as
512
- column IDs.
531
+ This is a comprehensive list of all pre-defined [[columns]]. In addition to
532
+ the listed IDs all user defined attributes can be used as column IDs.
513
533
  EOT
514
534
  )
515
535
  end
@@ -531,7 +551,7 @@ provided for a column, the first matching one is taken for each cell.
531
551
  EOT
532
552
  )
533
553
  arg(1, 'text',
534
- 'Alterntive cell text specified as [[Rich_Text_Attributes Rich Text]]')
554
+ 'Alterntive cell text specified as [[Rich_Text_Attributes|Rich Text]]')
535
555
 
536
556
  pattern(%w( _cellcolor !logicalExpression !color ), lambda {
537
557
  @column.cellColor.addPattern(
@@ -574,8 +594,8 @@ EOT
574
594
  @column.end = @val[1].end
575
595
  })
576
596
  doc('period.column', <<'EOT'
577
- This property is a shortcut for setting the [[start.column start]] and
578
- [[end.column end]] property at the same time.
597
+ This property is a shortcut for setting the [[start.column|start]] and
598
+ [[end.column|end]] property at the same time.
579
599
  EOT
580
600
  )
581
601
 
@@ -621,7 +641,7 @@ column, the first matching one is taken for each cell.
621
641
  EOT
622
642
  )
623
643
  arg(2, 'text', <<'EOT'
624
- The content of the tooltip. The text is interpreted as [[Rich_Text_Attributes
644
+ The content of the tooltip. The text is interpreted as [[Rich_Text_Attributes|
625
645
  Rich Text]].
626
646
  EOT
627
647
  )
@@ -688,10 +708,16 @@ EOT
688
708
 
689
709
  def rule_details
690
710
  pattern(%w( _details $STRING ), lambda {
711
+ return if @val[1].empty?
712
+
691
713
  rtTokenSetMore =
692
714
  %w( LINEBREAK SPACE WORD BOLD ITALIC CODE BOLDITALIC PRE HREF HREFEND
693
715
  REF REFEND HLINE TITLE2 TITLE3 TITLE2END TITLE3END BULLET1 BULLET2
694
716
  BULLET3 NUMBER1 NUMBER2 NUMBER3 )
717
+ if @val[1] == "Some more details\n"
718
+ error('ts_default_details',
719
+ "'Some more details' is not a valid value")
720
+ end
695
721
  @journalEntry.details = newRichText(@val[1], rtTokenSetMore)
696
722
  })
697
723
  doc('details', <<'EOT'
@@ -700,7 +726,7 @@ can be several paragraphs long.
700
726
  EOT
701
727
  )
702
728
  arg(1, 'text', <<'EOT'
703
- The text will be interpreted as [[Rich_Text_Attributes Rich Text]]. Only a
729
+ The text will be interpreted as [[Rich_Text_Attributes|Rich Text]]. Only a
704
730
  subset of the markup is supported for this attribute. You can use word
705
731
  formatting, paragraphs, hyperlinks, lists, section and subsection
706
732
  headers.
@@ -728,8 +754,24 @@ EOT
728
754
  descr('years')
729
755
  end
730
756
 
757
+ def rule_durationUnitOrPercent
758
+ pattern(%w( _% ), lambda { -1 })
759
+ descr('percentage of reported period')
760
+
761
+ pattern(%w( _min ), lambda { 0 })
762
+ descr('minutes')
763
+
764
+ pattern(%w( _h ), lambda { 1 })
765
+ descr('hours')
766
+
767
+ pattern(%w( _d ), lambda { 2 })
768
+ descr('days')
769
+ end
770
+
731
771
  def rule_export
732
- pattern(%w( !exportHeader !exportBody ))
772
+ pattern(%w( !exportHeader !exportBody ), lambda {
773
+ @property = nil
774
+ })
733
775
  doc('export', <<'EOT'
734
776
  The export report looks like a regular TaskJuggler file but contains fixed
735
777
  start and end dates for all tasks. The tasks only have start and end times,
@@ -754,22 +796,8 @@ EOT
754
796
  end
755
797
 
756
798
  def rule_exportHeader
757
- pattern(%w( _export $STRING ), lambda {
758
- if @val[1] != '.'
759
- suffix = @val[1][-4, 4]
760
- if suffix != '.tjp' && suffix != '.tji'
761
- error('export_bad_extn',
762
- 'Export report files must have a .tjp or .tji extension.')
763
- end
764
- # File name without extension.
765
- name = @val[1][0..-5]
766
- end
767
-
768
- if @project.reports[@val[1]]
769
- error('report_redefinition',
770
- "A report with the name #{name} has already been defined.")
771
- end
772
- newReport(@val[1], :export, sourceFileInfo)
799
+ pattern(%w( _export !optionalID $STRING ), lambda {
800
+ newReport(@val[1], @val[2], :export, sourceFileInfo)
773
801
  })
774
802
  arg(1, 'file name', <<'EOT'
775
803
  The name of the report file to generate. It must end with a .tjp or .tji
@@ -786,11 +814,14 @@ EOT
786
814
  @property.set('definitions', @val[1])
787
815
  })
788
816
  doc('definitions', <<"EOT"
789
- This attributes controls what definitions will be contained in the report. By default, '.tjp' reports have all definitions included and '.tji' reports have no definitions included.
817
+ This attributes controls what definitions will be contained in the report. If
818
+ the list includes ''project'', the generated file will have a ''''.tjp''''
819
+ extension. Otherwise it will have a ''''.tji'''' extension.
790
820
  EOT
791
821
  )
792
822
  allOrNothingListRule('exportDefinitions',
793
823
  { 'flags' => 'Include flag definitions',
824
+ 'project' => 'Include project header',
794
825
  'projecids' => 'Include project IDs',
795
826
  'tasks' => 'Include task definitions',
796
827
  'resources' => 'Include resource definitions' })
@@ -966,6 +997,19 @@ EOT
966
997
  singlePattern('_resource')
967
998
  end
968
999
 
1000
+ def rule_fail
1001
+ pattern(%w( _fail !logicalExpression ), lambda {
1002
+ @property['fail', @scenarioIdx] = @val[1]
1003
+ })
1004
+ doc('fail', <<'EOT'
1005
+ The fail attribute adds a logical expression to the property. The condition
1006
+ described by the logical expression is checked after the scheduling and an
1007
+ error is raised if the condition evaluates to true. This attribute is
1008
+ primarily intended for testing purpuses.
1009
+ EOT
1010
+ )
1011
+ end
1012
+
969
1013
  def rule_flag
970
1014
  pattern(%w( $ID ), lambda {
971
1015
  unless @project['flags'].include?(@val[0])
@@ -990,6 +1034,22 @@ EOT
990
1034
  listRule('moreFlagList', '!flag')
991
1035
  end
992
1036
 
1037
+ def rule_formats
1038
+ pattern(%w( _formats !outputFormats ), lambda {
1039
+ @property.set('formats', @val[1])
1040
+ })
1041
+ doc('formats', <<'EOT'
1042
+ This attribute defines for which output formats the report should be
1043
+ generated. By default, this list is empty. Unless a formats attribute was
1044
+ added to a report definition, no output will be generated for this report.
1045
+
1046
+ As reports are composable, a report may include other report definitions. A
1047
+ format definition is only needed for the outermost report that includes the
1048
+ others.
1049
+ EOT
1050
+ )
1051
+ end
1052
+
993
1053
  def rule_functions
994
1054
  # This rule is not used by the parser. It's only for the documentation.
995
1055
  pattern(%w( !functionsBody ))
@@ -1098,6 +1158,21 @@ EOT
1098
1158
  )
1099
1159
  end
1100
1160
 
1161
+ def rule_headline
1162
+ pattern(%w( _headline $STRING ), lambda {
1163
+ @property.set('headline', newRichText(@val[1]))
1164
+ })
1165
+ doc('headline', <<'EOT'
1166
+ Specifies the headline for a report.
1167
+ EOT
1168
+ )
1169
+ arg(1, 'text', <<'EOT'
1170
+ The text used for the headline. It is interpreted as
1171
+ [[Rich_Text_Attributes|Rich Text]].
1172
+ EOT
1173
+ )
1174
+ end
1175
+
1101
1176
  def rule_hideresource
1102
1177
  pattern(%w( _hideresource !logicalExpression ), lambda {
1103
1178
  @property.set('hideResource', @val[1])
@@ -1245,6 +1320,10 @@ EOT
1245
1320
  mode = @val[1][0]
1246
1321
  endSpec = @val[1][1]
1247
1322
  if mode == 0
1323
+ unless @val[0] < endSpec
1324
+ error('start_before_end', "The end date (#{endSpec}) must be after " +
1325
+ "the start date (#{@val[0]}).")
1326
+ end
1248
1327
  Interval.new(@val[0], endSpec)
1249
1328
  else
1250
1329
  Interval.new(@val[0], @val[0] + endSpec)
@@ -1272,12 +1351,15 @@ EOT
1272
1351
  60 * 60 * 24 * 30.4167, # months
1273
1352
  60 * 60 * 24 * 365 # years
1274
1353
  ]
1354
+ if @val[0] == 0.0
1355
+ error('zero_duration', "The interval duration may not be 0.")
1356
+ end
1275
1357
  duration = @val[0] * convFactors[@val[1]]
1276
1358
  resolution = @project.nil? ? 60 * 60 : @project['scheduleGranularity']
1277
1359
  # Make sure the interval aligns with the timing resolution.
1278
1360
  (duration / resolution).to_i * resolution
1279
1361
  })
1280
- arg(0, 'duration', 'The duration of the interval')
1362
+ arg(0, 'duration', 'The duration of the interval. May not be 0.')
1281
1363
  end
1282
1364
 
1283
1365
  def rule_intervalEnd
@@ -1357,13 +1439,9 @@ EOT
1357
1439
 
1358
1440
  pattern(%w( !author ))
1359
1441
 
1360
- pattern(%w( !summary ), lambda {
1361
- @journalEntry.summary = @val[0]
1362
- })
1442
+ pattern(%w( !summary ))
1363
1443
 
1364
- pattern(%w( !details ), lambda {
1365
- @journalEntry.details = @val[0]
1366
- })
1444
+ pattern(%w( !details ))
1367
1445
  end
1368
1446
 
1369
1447
  def rule_journalEntryBody
@@ -1377,7 +1455,7 @@ EOT
1377
1455
  })
1378
1456
  arg(2, 'headline', <<'EOT'
1379
1457
  The headline of the journal entry. It will be interpreted as
1380
- [[Rich_Text_Attributes Rich Text]].
1458
+ [[Rich_Text_Attributes|Rich Text]].
1381
1459
  EOT
1382
1460
  )
1383
1461
  end
@@ -1404,7 +1482,7 @@ EOT
1404
1482
  pattern(%w( _end !valDate ), lambda {
1405
1483
  @limitInterval.end = @val[1]
1406
1484
  })
1407
- doc('limit.end', <<'EOT'
1485
+ doc('end.limit', <<'EOT'
1408
1486
  The end date of the limit interval. It must be within the project time frame.
1409
1487
  EOT
1410
1488
  )
@@ -1412,7 +1490,7 @@ EOT
1412
1490
  pattern(%w( _period !valInterval ), lambda {
1413
1491
  @limitInterval = @val[1]
1414
1492
  })
1415
- doc('limit.period', <<'EOT'
1493
+ doc('period.limit', <<'EOT'
1416
1494
  This property is a shortcut for setting the start and end dates of the limit
1417
1495
  interval. Both dates must be within the project time frame.
1418
1496
  EOT
@@ -1421,19 +1499,20 @@ EOT
1421
1499
  pattern(%w( _resources !resourceLeafList ), lambda {
1422
1500
  @limitResources = @val[1]
1423
1501
  })
1424
- doc('limit.resources', <<'EOT'
1502
+ doc('resources.limit', <<'EOT'
1425
1503
  When [[limits]] are used in a [[task]] context, the limits can be restricted
1426
1504
  to a list of resources that are allocated to the task. In that case each
1427
- resource will not be allocated more than the specified upper limit. Lower
1428
- limits have no impact on the scheduler but do generate a warning when not met.
1429
- All specified resources must be leaf resources.
1505
+ listed resource will not be allocated more than the specified upper limit.
1506
+ Lower limits have no impact on the scheduler but do generate a warning when
1507
+ not met. All specified resources must be leaf resources.
1430
1508
  EOT
1431
1509
  )
1510
+ example('Limits-1', '5')
1432
1511
 
1433
1512
  pattern(%w( _start !valDate ), lambda {
1434
1513
  @limitInterval.start = @val[1]
1435
1514
  })
1436
- doc('limit.start', <<'EOT'
1515
+ doc('start.limit', <<'EOT'
1437
1516
  The start date of the limit interval. It must be within the project time frame.
1438
1517
  EOT
1439
1518
  )
@@ -1611,9 +1690,17 @@ attributes like [[hidetask]] or [[hideresource]] the logical expression
1611
1690
  evaluates to true for a certain property, this property is hidden or rolled-up
1612
1691
  in the report.
1613
1692
 
1614
- Operands can be declared flags, built-in [[functions]], property attributes
1615
- (specified as scenario.attribute) or another logical expression. The latter
1616
- should be enclosed in brackets to avoid ambiguities. An operand can also be just a number. 0 evaluates to false, all other numbers to true.
1693
+ Operands can be previously declared flags, built-in [[functions]], property
1694
+ attributes (specified as scenario.attribute) or another logical expression.
1695
+ When you combine logical operations to a more complex expression, the
1696
+ operators are evaluated from left to right. '''a | b & c''' is identical to
1697
+ '''(a | b) & c'''. It's highly recommended that you always use brackets to
1698
+ control the evaluation sequence. Currently, TaskJuggler does not support the
1699
+ concept of operator precedence or right-left associativity. This may change in
1700
+ the future.
1701
+
1702
+ An operand can also be just a number. 0 evaluates to false, all other numbers
1703
+ to true.
1617
1704
  EOT
1618
1705
  )
1619
1706
  also(%w( functions ))
@@ -1708,10 +1795,6 @@ EOT
1708
1795
  commaListRule('$ID')
1709
1796
  end
1710
1797
 
1711
- def rule_moreResources
1712
- commaListRule('!resourceList')
1713
- end
1714
-
1715
1798
  def rule_morePredTasks
1716
1799
  commaListRule('!taskPredList')
1717
1800
  end
@@ -1763,6 +1846,53 @@ EOT
1763
1846
  })
1764
1847
  end
1765
1848
 
1849
+ def rule_nikuReportAttributes
1850
+ optional
1851
+ repeatable
1852
+
1853
+ pattern(%w( !formats ))
1854
+ pattern(%w( !headline ))
1855
+ pattern(%w( !hideresource ))
1856
+ pattern(%w( !hidetask ))
1857
+ pattern(%w( !reportEnd ))
1858
+ pattern(%w( !reportPeriod ))
1859
+ pattern(%w( !reportStart ))
1860
+ pattern(%w( !reportTitle ))
1861
+ end
1862
+
1863
+ def rule_nikuReportBody
1864
+ pattern(%w( _{ !nikuReportAttributes _} ), lambda {
1865
+
1866
+ })
1867
+ end
1868
+
1869
+ def rule_nikuReportHeader
1870
+ pattern(%w( _nikureport !optionalID $STRING ), lambda {
1871
+ newReport(@val[1], @val[2], :niku, sourceFileInfo)
1872
+ })
1873
+ arg(1, 'file name', <<'EOT'
1874
+ The name of the time sheet report file to generate. It must end with a .tji
1875
+ extension, or use . to use the standard output channel.
1876
+ EOT
1877
+ )
1878
+ end
1879
+
1880
+ def rule_nikuReport
1881
+ pattern(%w( !nikuReportHeader !nikuReportBody ), lambda {
1882
+ @property = nil
1883
+ })
1884
+ doc('nikureport', <<'EOT'
1885
+ This report generates an XML file to be imported into the enterprise resource
1886
+ management software Clarity(R) from Computer Associates(R). The files contains
1887
+ allocation curves for the specified resources. All tasks with identical user
1888
+ defined attributes ''''ClarityPID'''' and ''''ClarityPNAME'''' are bundled
1889
+ into a Clarity project. The resulting XML file can be imported into Clarity
1890
+ with the xog-in tool.
1891
+ EOT
1892
+ )
1893
+ example('Niku')
1894
+ end
1895
+
1766
1896
  def rule_number
1767
1897
  singlePattern('$INTEGER')
1768
1898
  singlePattern('$FLOAT')
@@ -1834,7 +1964,7 @@ EOT
1834
1964
  operation
1835
1965
  })
1836
1966
  arg(0, 'operand', <<'EOT'
1837
- An operand can consist of a date, a text string, a [[functions function]], a
1967
+ An operand can consist of a date, a text string, a [[functions|function]], a
1838
1968
  property attribute or a numerical value. It can also be the name of a declared
1839
1969
  flag. Use the scenario.attribute notation to use an attribute of the currently
1840
1970
  evaluated property. The scenario ID always has to be specified, also for
@@ -1942,6 +2072,11 @@ EOT
1942
2072
  :html
1943
2073
  })
1944
2074
  descr('Generate a web page (HTML file)')
2075
+
2076
+ pattern(%w( _niku ), lambda {
2077
+ :niku
2078
+ })
2079
+ descr('Generate a XOG XML file to be used with Clarity.')
1945
2080
  end
1946
2081
 
1947
2082
  def rule_outputFormats
@@ -2222,6 +2357,8 @@ where they are defined in.
2222
2357
 
2223
2358
  The included files may only contain content that may be present in a project
2224
2359
  header section.
2360
+
2361
+ If the include statement is the last statement in the file it must have the option block. The option block can be empty, but the curly braces must be present.
2225
2362
  EOT
2226
2363
  )
2227
2364
  end
@@ -2266,7 +2403,6 @@ EOT
2266
2403
  })
2267
2404
 
2268
2405
  pattern(%w( !export ))
2269
- pattern(%w( !timeSheetReport ))
2270
2406
 
2271
2407
  pattern(%w( _flags !declareFlagList ), lambda {
2272
2408
  unless @project['flags'].include?(@val[1])
@@ -2292,6 +2428,8 @@ EOT
2292
2428
 
2293
2429
  pattern(%w( !macro ))
2294
2430
 
2431
+ pattern(%w( !nikuReport ))
2432
+
2295
2433
  pattern(%w( !navigator ))
2296
2434
 
2297
2435
  pattern(%w( _projectid $ID ), lambda {
@@ -2328,6 +2466,7 @@ EOT
2328
2466
  pattern(%w( !resource ))
2329
2467
  pattern(%w( !shift ))
2330
2468
  pattern(%w( !statusSheet ))
2469
+ pattern(%w( !statusSheetReport ))
2331
2470
 
2332
2471
  pattern(%w( _supplement !supplement ))
2333
2472
  doc('supplement', <<'EOT'
@@ -2344,6 +2483,7 @@ EOT
2344
2483
 
2345
2484
  pattern(%w( !task ))
2346
2485
  pattern(%w( !timeSheet ))
2486
+ pattern(%w( !timeSheetReport ))
2347
2487
  pattern(%w( _vacation !vacationName !intervals ), lambda {
2348
2488
  @project['vacations'] = @project['vacations'] + @val[2]
2349
2489
  })
@@ -2364,7 +2504,7 @@ Specifies which scenario should be used for time sheet reports. By default,
2364
2504
  the top-level scenario will be used.
2365
2505
  EOT
2366
2506
  )
2367
-
2507
+ example('TimeSheet1', '2')
2368
2508
  end
2369
2509
 
2370
2510
  def rule_propertiesInclude
@@ -2534,8 +2674,8 @@ EOT
2534
2674
  singlePattern('_daily')
2535
2675
  descr('A group of columns with one column for each day')
2536
2676
 
2537
- singlePattern('_depends')
2538
- descr('A comma separated list of tasks that have to precede this task.')
2677
+ singlePattern('_directreports')
2678
+ descr('The resources that have this resource assigned as manager.')
2539
2679
 
2540
2680
  singlePattern('_duration')
2541
2681
  descr('The duration of a task')
@@ -2564,6 +2704,19 @@ EOT
2564
2704
  singlePattern('_flags')
2565
2705
  descr('List of attached flags')
2566
2706
 
2707
+ singlePattern('_followers')
2708
+ descr(<<'EOT'
2709
+ A list of tasks that depend on the current task. The list contains the names,
2710
+ the IDs, the date and the type of dependency. For the type the following
2711
+ symbols are used
2712
+
2713
+ * '''<nowiki>]->[</nowiki>''': End-to-Start dependency
2714
+ * '''<nowiki>[->[</nowiki>''': Start-to-Start dependency
2715
+ * '''<nowiki>]->]</nowiki>''': End-to-End dependency
2716
+ * '''<nowiki>[->]</nowiki>''': Start-to-End dependency
2717
+ EOT
2718
+ )
2719
+
2567
2720
  singlePattern('_freetime')
2568
2721
  descr(<<'EOT'
2569
2722
  The amount of unallocated work time of a resource during the reporting period.
@@ -2598,6 +2751,12 @@ EOT
2598
2751
  singlePattern('_index')
2599
2752
  descr('The index of the item based on the nesting hierachy')
2600
2753
 
2754
+ singlePattern('_journal')
2755
+ descr(<<'EOT'
2756
+ The journal entries for the task or resource for the reported interval.
2757
+ EOT
2758
+ )
2759
+
2601
2760
  singlePattern('_line')
2602
2761
  descr('The line number in the report')
2603
2762
 
@@ -2629,8 +2788,18 @@ EOT
2629
2788
  descr('The criticalness of the task with respect to all the paths that ' +
2630
2789
  'it is a part of.')
2631
2790
 
2632
- singlePattern('_precedes')
2633
- descr('A comma separated list of tasks that have to follow this task.')
2791
+ singlePattern('_precursor')
2792
+ descr(<<EOT
2793
+ A list of tasks the current task depends on. The list contains the names, the
2794
+ IDs, the date and the type of dependency. For the type the following symbols
2795
+ are used
2796
+
2797
+ * '''<nowiki>]->[</nowiki>''': End-to-Start dependency
2798
+ * '''<nowiki>[->[</nowiki>''': Start-to-Start dependency
2799
+ * '''<nowiki>]->]</nowiki>''': End-to-End dependency
2800
+ * '''<nowiki>[->]</nowiki>''': Start-to-End dependency
2801
+ EOT
2802
+ )
2634
2803
 
2635
2804
  singlePattern('_priority')
2636
2805
  descr('The priority of a task')
@@ -2641,6 +2810,12 @@ EOT
2641
2810
  singlePattern('_rate')
2642
2811
  descr('The daily cost of a resource.')
2643
2812
 
2813
+ singlePattern('_reports')
2814
+ descr(<<'EOT'
2815
+ All resources that have this resource assigned as a direct or indirect manager.
2816
+ EOT
2817
+ )
2818
+
2644
2819
  singlePattern('_resources')
2645
2820
  descr('A list of resources that are assigned to the task in the report ' +
2646
2821
  'time frame.')
@@ -2699,7 +2874,7 @@ EOT
2699
2874
  })
2700
2875
  doc('caption', <<'EOT'
2701
2876
  The caption will be embedded in the footer of the table or data segment. The
2702
- text will be interpreted as [[Rich_Text_Attributes Rich Text]].
2877
+ text will be interpreted as [[Rich_Text_Attributes|Rich Text]].
2703
2878
  EOT
2704
2879
  )
2705
2880
  arg(1, 'text', 'The caption text.')
@@ -2710,7 +2885,7 @@ EOT
2710
2885
  })
2711
2886
  doc('center', <<'EOT'
2712
2887
  This attribute defines the center section of the [[textreport]]. The text will
2713
- be interpreted as [[Rich_Text_Attributes Rich Text]].
2888
+ be interpreted as [[Rich_Text_Attributes|Rich Text]].
2714
2889
  EOT
2715
2890
  )
2716
2891
  arg(1, 'text', 'The text')
@@ -2735,7 +2910,7 @@ EOT
2735
2910
  })
2736
2911
  doc('epilog', <<'EOT'
2737
2912
  Define a text section that is printed right after the actual report data. The
2738
- text will be interpreted as [[Rich_Text_Attributes Rich Text]].
2913
+ text will be interpreted as [[Rich_Text_Attributes|Rich Text]].
2739
2914
  EOT
2740
2915
  )
2741
2916
  also(%w( footer header prolog ))
@@ -2752,41 +2927,24 @@ EOT
2752
2927
  })
2753
2928
  doc('footer', <<'EOT'
2754
2929
  Define a text section that is put at the bottom of the report. The
2755
- text will be interpreted as [[Rich_Text_Attributes Rich Text]].
2930
+ text will be interpreted as [[Rich_Text_Attributes|Rich Text]].
2756
2931
  EOT
2757
2932
  )
2758
2933
  also(%w( epilog header prolog ))
2759
2934
 
2760
- pattern(%w( _formats !outputFormats ), lambda {
2761
- @property.set('formats', @val[1])
2762
- })
2763
- doc('formats', <<'EOT'
2764
- EOT
2765
- )
2935
+ pattern(%w( !formats ))
2766
2936
 
2767
2937
  pattern(%w( _header $STRING ), lambda {
2768
2938
  @property.set('header', newRichText(@val[1]))
2769
2939
  })
2770
2940
  doc('header', <<'EOT'
2771
2941
  Define a text section that is put at the top of the report. The
2772
- text will be interpreted as [[Rich_Text_Attributes Rich Text]].
2942
+ text will be interpreted as [[Rich_Text_Attributes|Rich Text]].
2773
2943
  EOT
2774
2944
  )
2775
2945
  also(%w( epilog footer prolog ))
2776
2946
 
2777
- pattern(%w( _headline $STRING ), lambda {
2778
- @property.set('headline', newRichText(@val[1]))
2779
- })
2780
- doc('headline', <<'EOT'
2781
- Specifies the headline for a report.
2782
- EOT
2783
- )
2784
- arg(1, 'text', <<'EOT'
2785
- The text used for the headline. It is interpreted as
2786
- [[Rich_Text_Attributes Rich Text]].
2787
- EOT
2788
- )
2789
-
2947
+ pattern(%w( !headline ))
2790
2948
  pattern(%w( !hideresource ))
2791
2949
 
2792
2950
  pattern(%w( !hidetask ))
@@ -2796,7 +2954,7 @@ EOT
2796
2954
  })
2797
2955
  doc('left', <<'EOT'
2798
2956
  This attribute defines the left margin section of the [[textreport]]. The text
2799
- will be interpreted as [[Rich_Text_Attributes Rich Text]]. The margin will not
2957
+ will be interpreted as [[Rich_Text_Attributes|Rich Text]]. The margin will not
2800
2958
  span the [[header]] or [[footer]] sections.
2801
2959
  EOT
2802
2960
  )
@@ -2816,29 +2974,11 @@ EOT
2816
2974
  })
2817
2975
  doc('prolog', <<'EOT'
2818
2976
  Define a text section that is printed right before the actual report data. The
2819
- text will be interpreted as [[Rich_Text_Attributes Rich Text]].
2977
+ text will be interpreted as [[Rich_Text_Attributes|Rich Text]].
2820
2978
  EOT
2821
2979
  )
2822
2980
  also(%w( epilog footer header ))
2823
2981
 
2824
- pattern(%w( _rawhead $STRING ), lambda {
2825
- @property.set('rawHead', @val[1])
2826
- })
2827
- doc('rawhead', <<'EOT'
2828
- Specifies a section of raw HTML code that will be inserted at the top of the
2829
- report.
2830
- EOT
2831
- )
2832
-
2833
- pattern(%w( _rawtail $STRING ), lambda {
2834
- @property.set('rawTail', @val[1])
2835
- })
2836
- doc('rawtail', <<'EOT'
2837
- Specifies a section of raw HTML code that will be inserted at the bottom of
2838
- the report.
2839
- EOT
2840
- )
2841
-
2842
2982
  pattern(%w( !report ))
2843
2983
 
2844
2984
  pattern(%w( _right $STRING ), lambda {
@@ -2846,7 +2986,7 @@ EOT
2846
2986
  })
2847
2987
  doc('right', <<'EOT'
2848
2988
  This attribute defines the right margin section of the [[textreport]]. The text
2849
- will be interpreted as [[Rich_Text_Attributes Rich Text]]. The margin will not
2989
+ will be interpreted as [[Rich_Text_Attributes|Rich Text]]. The margin will not
2850
2990
  span the [[header]] or [[footer]] sections.
2851
2991
  EOT
2852
2992
  )
@@ -2879,27 +3019,8 @@ used.
2879
3019
  EOT
2880
3020
  )
2881
3021
 
2882
- pattern(%w( _sortresources !sortCriteria ), lambda {
2883
- @property.set('sortResources', @val[1])
2884
- })
2885
- doc('sortresources', <<'EOT'
2886
- Determines how the resources are sorted in the report. Multiple criteria can be
2887
- specified as a comma separated list. If one criteria is not sufficient to sort
2888
- a group of resources, the next criteria will be used to sort the resources in
2889
- this group.
2890
- EOT
2891
- )
2892
-
2893
- pattern(%w( _sorttasks !sortCriteria ), lambda {
2894
- @property.set('sortTasks', @val[1])
2895
- })
2896
- doc('sorttasks', <<'EOT'
2897
- Determines how the tasks are sorted in the report. Multiple criteria can be
2898
- specified as comma separated list. If one criteria is not sufficient to sort a
2899
- group of tasks, the next criteria will be used to sort the tasks within
2900
- this group.
2901
- EOT
2902
- )
3022
+ pattern(%w( !sortResources ))
3023
+ pattern(%w( !sortTasks ))
2903
3024
 
2904
3025
  pattern(%w( !reportStart ))
2905
3026
 
@@ -2918,14 +3039,7 @@ EOT
2918
3039
  @property.set('timeFormat', @val[0])
2919
3040
  })
2920
3041
 
2921
- pattern(%w( _title $STRING ), lambda {
2922
- @property.set('title', @val[1])
2923
- })
2924
- doc('title', <<'EOT'
2925
- The title of the report will be used in external references to the report. It
2926
- will not show up in the reports directly. It's used e. g. by [[navigator]].
2927
- EOT
2928
- )
3042
+ pattern(%w( !reportTitle ))
2929
3043
  end
2930
3044
 
2931
3045
  def rule_reportEnd
@@ -3082,6 +3196,19 @@ EOT
3082
3196
  )
3083
3197
  end
3084
3198
 
3199
+ def rule_reportTitle
3200
+ pattern(%w( _title $STRING ), lambda {
3201
+ @property.set('title', @val[1])
3202
+ })
3203
+ doc('title', <<'EOT'
3204
+ The title of the report will be used in external references to the report. It
3205
+ will not show up in the reports directly. It's used e. g. by [[navigator]].
3206
+ EOT
3207
+ )
3208
+ end
3209
+
3210
+
3211
+
3085
3212
  def rule_reportType
3086
3213
  singlePattern('_resourcereport')
3087
3214
  doc('resourcereport', <<'EOT'
@@ -3131,6 +3258,12 @@ EOT
3131
3258
  def rule_resourceAttributes
3132
3259
  repeatable
3133
3260
  optional
3261
+ pattern(%w( _email $STRING ), lambda {
3262
+ @property.set('email', @val[1])
3263
+ })
3264
+ doc('email',
3265
+ 'The email address of the resource.')
3266
+
3134
3267
  pattern(%w( !journalEntry ))
3135
3268
  pattern(%w( !purge ))
3136
3269
  pattern(%w( !resource ))
@@ -3178,10 +3311,7 @@ EOT
3178
3311
 
3179
3312
  def rule_resourceId
3180
3313
  pattern(%w( $ID ), lambda {
3181
- id = @val[0]
3182
- id = @resourceprefix + '.' + id unless @resourceprefix.empty?
3183
- # In case we have a nested supplement, we need to prepend the parent ID.
3184
- id = @property.fullId + '.' + id if @property && @property.is_a?(Resource)
3314
+ id = (@resourceprefix.empty? ? '' : @resourceprefix + '.') + @val[0]
3185
3315
  if (resource = @project.resource(id)).nil?
3186
3316
  error('resource_id_expected', "#{id} is not a defined resource.")
3187
3317
  end
@@ -3218,9 +3348,7 @@ EOT
3218
3348
  end
3219
3349
 
3220
3350
  def rule_resourceList
3221
- pattern(%w( !resourceId !moreResources ), lambda {
3222
- [ @val[0] ] + @val[1]
3223
- })
3351
+ listRule('moreResources', '!resourceId')
3224
3352
  end
3225
3353
 
3226
3354
  def rule_resourceScenarioAttributes
@@ -3266,6 +3394,8 @@ EOT
3266
3394
  also(%w( scheduling ))
3267
3395
  example('Booking')
3268
3396
 
3397
+ pattern(%w( !fail ))
3398
+
3269
3399
  pattern(%w( !limits ), lambda {
3270
3400
  @property['limits', @scenarioIdx] = @val[0]
3271
3401
  })
@@ -3274,6 +3404,26 @@ Set per-interval usage limits for the resource.
3274
3404
  EOT
3275
3405
  )
3276
3406
 
3407
+ pattern(%w( _managers !resourceList ), lambda {
3408
+ @property['managers', @scenarioIdx] =
3409
+ @property['managers', @scenarioIdx] + @val[1]
3410
+ })
3411
+ doc('managers', <<'EOT'
3412
+ Defines one or more resources to be the manager who is responsible for this
3413
+ resource. Managers must be leaf resources. This attribute does not impact the
3414
+ scheduling. It can only be used for documentation purposes.
3415
+
3416
+ You must only specify direct managers here. Do not list higher level managers
3417
+ here. If necessary, use the [[purge]] attribute to clear
3418
+ inherited managers. For most use cases, there should be only one manager. But
3419
+ TaskJuggler is not limited to just one manager. Dotted reporting lines can be
3420
+ captured as well as long as the managers are not reporting to each other.
3421
+ EOT
3422
+ )
3423
+ also(%w( statussheet ))
3424
+ example('Manager')
3425
+
3426
+
3277
3427
  pattern(%w( _rate !number ), lambda {
3278
3428
  @property['rate', @scenarioIdx] = @val[1]
3279
3429
  })
@@ -3284,8 +3434,8 @@ EOT
3284
3434
 
3285
3435
  pattern(%w( _shift !shiftAssignments ))
3286
3436
  doc('shift.resource', <<'EOT'
3287
- This keyword has been deprecated. Please use [shifts.resource shifts
3288
- (resource)] instead.
3437
+ This keyword has been deprecated. Please use [[shifts.resource|shifts
3438
+ (resource)]] instead.
3289
3439
  EOT
3290
3440
  )
3291
3441
 
@@ -3310,6 +3460,8 @@ to the 'Shift' property.
3310
3460
  EOT
3311
3461
  )
3312
3462
 
3463
+ pattern(%w( !warn ))
3464
+
3313
3465
  pattern(%w( !workinghoursResource ))
3314
3466
  # Other attributes will be added automatically.
3315
3467
  end
@@ -3417,6 +3569,7 @@ EOT
3417
3569
  if (@scenarioIdx = @project.scenarioIdx(@val[0])).nil?
3418
3570
  error('unknown_scenario_id', "Unknown scenario: #{@val[0]}")
3419
3571
  end
3572
+ @scenarioIdx
3420
3573
  })
3421
3574
  arg(0, 'scenario', 'ID of a defined scenario')
3422
3575
  end
@@ -3546,6 +3699,11 @@ EOT
3546
3699
  Sets the time zone of the shift. The working hours of the shift are assumed to
3547
3700
  be within the specified time zone. The time zone does not effect the vaction
3548
3701
  interval. The latter is assumed to be within the project time zone.
3702
+
3703
+ TaskJuggler stores all dates internally as UTC. Since all events must align
3704
+ with the [[timingresolution|timing resolution]] for time zones you may have to
3705
+ change the timing resolution appropriately. The time zone difference compared
3706
+ to UTC must be a multiple of the used timing resolution.
3549
3707
  EOT
3550
3708
  )
3551
3709
  arg(1, 'zone', <<'EOT'
@@ -3623,6 +3781,32 @@ EOT
3623
3781
  )
3624
3782
  end
3625
3783
 
3784
+ def rule_sortResources
3785
+ pattern(%w( _sortresources !sortCriteria ), lambda {
3786
+ @property.set('sortResources', @val[1])
3787
+ })
3788
+ doc('sortresources', <<'EOT'
3789
+ Determines how the resources are sorted in the report. Multiple criteria can be
3790
+ specified as a comma separated list. If one criteria is not sufficient to sort
3791
+ a group of resources, the next criteria will be used to sort the resources in
3792
+ this group.
3793
+ EOT
3794
+ )
3795
+ end
3796
+
3797
+ def rule_sortTasks
3798
+ pattern(%w( _sorttasks !sortCriteria ), lambda {
3799
+ @property.set('sortTasks', @val[1])
3800
+ })
3801
+ doc('sorttasks', <<'EOT'
3802
+ Determines how the tasks are sorted in the report. Multiple criteria can be
3803
+ specified as comma separated list. If one criteria is not sufficient to sort a
3804
+ group of tasks, the next criteria will be used to sort the tasks within
3805
+ this group.
3806
+ EOT
3807
+ )
3808
+ end
3809
+
3626
3810
  def rule_sortTree
3627
3811
  pattern(%w( $ID ), lambda {
3628
3812
  if @val[0] != 'tree'
@@ -3635,6 +3819,51 @@ EOT
3635
3819
  arg(0, 'tree',
3636
3820
  'Use \'tree\' as first criteria to keep the breakdown structure.')
3637
3821
  end
3822
+ def rule_ssReportHeader
3823
+ pattern(%w( _statussheetreport !optionalID $STRING ), lambda {
3824
+ if (fileName = @val[2]) != '.'
3825
+ if @project.reports[fileName]
3826
+ error('report_redefinition',
3827
+ "A report with the name '#{fileName}' has already been " +
3828
+ "defined.")
3829
+ end
3830
+ else
3831
+ fileName = "statusSheet#{@project.reports.length + 1}"
3832
+ end
3833
+ report = newReport(@val[1], fileName, :statusSheet, sourceFileInfo)
3834
+ report.set('scenarios', [ 0 ])
3835
+ # Show all tasks, sorted by id-up.
3836
+ report.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
3837
+ report.set('sortTasks', [ [ 'id', true, -1 ] ])
3838
+ # Show all resources, sorted by seqno-up.
3839
+ report.set('hideResource', LogicalExpression.new(LogicalOperation.new(0)))
3840
+ report.set('sortResources', [ [ 'seqno', true, -1 ] ])
3841
+ report.set('loadUnit', :hours)
3842
+ report.set('definitions', [])
3843
+ })
3844
+ arg(1, 'file name', <<'EOT'
3845
+ The name of the status sheet report file to generate. It must end with a .tji
3846
+ extension, or use . to use the standard output channel.
3847
+ EOT
3848
+ )
3849
+ end
3850
+
3851
+ def rule_ssReportAttributes
3852
+ optional
3853
+ repeatable
3854
+
3855
+ pattern(%w( !hideresource ))
3856
+ pattern(%w( !hidetask ))
3857
+ pattern(%w( !reportEnd ))
3858
+ pattern(%w( !reportPeriod ))
3859
+ pattern(%w( !reportStart ))
3860
+ pattern(%w( !sortResources ))
3861
+ pattern(%w( !sortTasks ))
3862
+ end
3863
+
3864
+ def rule_ssReportBody
3865
+ optionsRule('ssReportAttributes')
3866
+ end
3638
3867
 
3639
3868
  def rule_ssStatusAttributes
3640
3869
  optional
@@ -3671,7 +3900,9 @@ EOT
3671
3900
  end
3672
3901
 
3673
3902
  def rule_statusSheet
3674
- pattern(%w( !statusSheetHeader !statusSheetBody ))
3903
+ pattern(%w( !statusSheetHeader !statusSheetBody ), lambda {
3904
+ [ @sheetAuthor, @sheetStart, @sheetEnd ]
3905
+ })
3675
3906
  doc('statussheet', <<'EOT'
3676
3907
  A status sheet can be used to capture the status of various tasks outside of
3677
3908
  the regular task tree definition. It is intended for use by managers that
@@ -3694,9 +3925,10 @@ EOT
3694
3925
  end
3695
3926
 
3696
3927
  def rule_statusSheetHeader
3697
- pattern(%w( _statussheet !resourceId !date ), lambda {
3928
+ pattern(%w( _statussheet !resourceId !valIntervalOrDate ), lambda {
3698
3929
  @sheetAuthor = @val[1]
3699
- @sheetEnd = @val[2]
3930
+ @sheetStart = @val[2].start
3931
+ @sheetEnd = @val[2].end
3700
3932
  })
3701
3933
  arg(1, 'reporter', <<'EOT'
3702
3934
  The ID of a defined resource. This identifies the status reporter. Unless the
@@ -3706,6 +3938,20 @@ EOT
3706
3938
  )
3707
3939
  end
3708
3940
 
3941
+ def rule_statusSheetReport
3942
+ pattern(%w( !ssReportHeader !ssReportBody ), lambda {
3943
+ @property = nil
3944
+ })
3945
+ doc('statussheetreport', <<'EOT'
3946
+ A status sheet report is a template for a status sheet. It collects all the
3947
+ status information of the top-level task that a resource is responsible for.
3948
+ This report is typically used by managers or team leads to review the time
3949
+ sheet status information and destill it down to a summary that can be
3950
+ forwarded to the next person in the reporting chain.
3951
+ EOT
3952
+ )
3953
+ end
3954
+
3709
3955
  def rule_statusSheetTask
3710
3956
  pattern(%w( !statusSheetTaskHeader !statusSheetTaskBody), lambda {
3711
3957
  @property = @propertyStack.pop
@@ -3741,17 +3987,30 @@ EOT
3741
3987
  end
3742
3988
  def rule_summary
3743
3989
  pattern(%w( _summary $STRING ), lambda {
3990
+ return if @val[1].empty?
3991
+
3992
+ if @val[1].length > 480
3993
+ error('ts_summary_too_long',
3994
+ "The summary text must be 480 characters long or shorter. " +
3995
+ "This text has #{@val[1].length} characters.")
3996
+ end
3997
+ if @val[1] == "A summary text\n"
3998
+ error('ts_default_summary',
3999
+ "'A summary text' is not a valid summary")
4000
+ end
3744
4001
  rtTokenSetIntro =
3745
4002
  %w( LINEBREAK SPACE WORD BOLD ITALIC CODE BOLDITALIC HREF HREFEND )
3746
4003
  @journalEntry.summary = newRichText(@val[1], rtTokenSetIntro)
3747
4004
  })
3748
4005
  doc('summary', <<'EOT'
3749
4006
  This is the introductory part of the journal or status entry. It should
3750
- summarize the full entry but should contain more details than the headline.
4007
+ only summarize the full entry but should contain more details than the
4008
+ headline. The text including formatting characters must be 240 characters long
4009
+ or less.
3751
4010
  EOT
3752
4011
  )
3753
4012
  arg(1, 'text', <<'EOT'
3754
- The text will be interpreted as [[Rich_Text_Attributes Rich Text]]. Only a
4013
+ The text will be interpreted as [[Rich_Text_Attributes|Rich Text]]. Only a
3755
4014
  small subset of the markup is supported for this attribute. You can use word
3756
4015
  formatting, hyperlinks and paragraphs.
3757
4016
  EOT
@@ -4214,6 +4473,8 @@ properties from the reports.
4214
4473
  EOT
4215
4474
  )
4216
4475
 
4476
+ pattern(%w( !fail ))
4477
+
4217
4478
  pattern(%w( _length !workingDuration ), lambda {
4218
4479
  checkContainer('length')
4219
4480
  @property['length', @scenarioIdx] = @val[1]
@@ -4347,6 +4608,10 @@ resources. It does not mean that the task happens earlier, though that is
4347
4608
  usually the effect you will see. It also does not have any effect on tasks
4348
4609
  that don't have any resources assigned (e.g. milestones).
4349
4610
 
4611
+ For milestones it will raise or lower the chances that task leading up the
4612
+ milestone will get their resources over task with equal priority that compete
4613
+ for the same resources.
4614
+
4350
4615
  This attribute is inherited by subtasks if specified prior to the definition
4351
4616
  of the subtask.
4352
4617
  EOT
@@ -4367,7 +4632,8 @@ EOT
4367
4632
  )
4368
4633
 
4369
4634
  pattern(%w( _responsible !resourceList ), lambda {
4370
- @property['responsible', @scenarioIdx] = @val[1]
4635
+ @property['responsible', @scenarioIdx] =
4636
+ @property['responsible', @scenarioIdx] + @val[1]
4371
4637
  })
4372
4638
  doc('responsible', <<'EOT'
4373
4639
  The ID of the resource that is responsible for this task. This value is for
@@ -4460,6 +4726,9 @@ will be inherited from the enclosing tasks or the project start date.
4460
4726
  EOT
4461
4727
  )
4462
4728
  also(%w( end period.task maxstart minstart scheduling ))
4729
+
4730
+ pattern(%w( !warn ))
4731
+
4463
4732
  # Other attributes will be added automatically.
4464
4733
  end
4465
4734
 
@@ -4617,11 +4886,9 @@ EOT
4617
4886
 
4618
4887
  def rule_timeSheet
4619
4888
  pattern(%w( !timeSheetHeader !timeSheetBody ), lambda {
4620
-
4889
+ @timeSheet
4621
4890
  })
4622
4891
  doc('timesheet', <<'EOT'
4623
- This feature is not yet functional!
4624
-
4625
4892
  A time sheet record can be used to capture the current status of the tasks
4626
4893
  assigned to a specific resource and the achieved progress for a given period
4627
4894
  of time. The status is assumed to be for the end of this time period. There
@@ -4636,24 +4903,28 @@ The work is booked for the scenario specified by [[trackingscenario]].
4636
4903
  The intended use for time sheets is to have all resources report a time sheet
4637
4904
  every day, week or month. All time sheets can be added to the project plan.
4638
4905
  The status information is always used to determin the current status of the
4639
- project. The [[work]], [[remaining]] and [[end.timesheet end]] attributes are
4640
- ignored if there are also [[booking bookings]] for the resource in the time
4906
+ project. The [[work]], [[remaining]] and [[end.timesheet|end]] attributes are
4907
+ ignored if there are also [[booking|bookings]] for the resource in the time
4641
4908
  sheet period. The non-ignored attributes of the time sheets
4642
4909
  will be converted into [[booking]] statements internally. These bookings can
4643
- then be [[export exported]] into a file which can then be added to the project
4910
+ then be [[export|exported]] into a file which can then be added to the project
4644
4911
  again. This way, you can use time sheets to incrementally record progress of
4645
4912
  your project. There is a possibility that time sheets conflict with other data
4646
4913
  in the plan. In case TaskJuggler cannot automatically resolve them, these
4647
4914
  conflicts have to be manually resolved by either changing the plan or the time
4648
4915
  sheet.
4649
4916
 
4650
- The status messages are interpreted as [[journalentry journal entries]]. The
4917
+ The status messages are interpreted as [[journalentry|journal entries]]. The
4651
4918
  alert level will be evaluated and the current state of the project can be put
4652
- into a dashboard using the ''''alert'''' and ''''alertmessage'''' [[columnid
4919
+ into a dashboard using the ''''alert'''' and ''''alertmessage'''' [[columnid|
4653
4920
  columns]].
4921
+
4922
+ Currently, the provided effort values and dates are not yet used to
4923
+ automatically update the plan data. This feature will be added in future
4924
+ versions.
4654
4925
  EOT
4655
4926
  )
4656
- example('TimeSheet')
4927
+ example('TimeSheet1', '1')
4657
4928
  end
4658
4929
 
4659
4930
  def rule_timeSheetAttributes
@@ -4668,6 +4939,7 @@ If the task exists already, an error is generated. The new task can be used
4668
4939
  immediately to report progress and status against it.
4669
4940
  EOT
4670
4941
  )
4942
+ example('TimeSheet1', '3')
4671
4943
 
4672
4944
  pattern(%w( _shift !shiftId ), lambda {
4673
4945
 
@@ -4675,19 +4947,25 @@ EOT
4675
4947
  doc('shift.timesheet', <<'EOT'
4676
4948
  Specifies an alternative [[shift]] for the time sheet period. This shift will
4677
4949
  override any existing working hour definitions for the resource. It will not
4678
- override already declared [[vacation vacations]] though.
4950
+ override already declared [[vacation|vacations]] though.
4679
4951
 
4680
4952
  The primary use of this feature is to let the resources report different total
4681
4953
  work time for the report period.
4682
4954
  EOT
4683
4955
  )
4684
4956
 
4685
- pattern(%w( !tsTaskHeader !tsTaskBody ))
4957
+ pattern(%w( !tsStatus ))
4958
+
4959
+ pattern(%w( !tsTaskHeader !tsTaskBody ), lambda {
4960
+ @property = nil
4961
+ @timeSheetRecord = nil
4962
+ })
4686
4963
  doc('task.timesheet', <<'EOT'
4687
4964
  Specifies an existing task that progress and status should be reported
4688
4965
  against.
4689
4966
  EOT
4690
4967
  )
4968
+ example('TimeSheet1', '4')
4691
4969
  end
4692
4970
 
4693
4971
  def rule_timeSheetBody
@@ -4697,16 +4975,25 @@ EOT
4697
4975
  end
4698
4976
 
4699
4977
  def rule_timeSheetHeader
4700
- pattern(%w( _timesheet !resourceId !valIntervalOrDate ),
4701
- lambda {
4702
- @sheetAuthor = @val[1]
4703
- @sheetStart = @val[2].start
4704
- @sheetEnd = @val[2].end
4978
+ pattern(%w( _timesheet !resourceId !valIntervalOrDate ), lambda {
4979
+ sheetAuthor = @val[1]
4980
+ @property = nil
4981
+ unless sheetAuthor.leaf?
4982
+ error('ts_group_author',
4983
+ 'A resource group cannot file a time sheet')
4984
+ end
4985
+ # Currently time sheets are hardcoded for scenario 0.
4986
+ @timeSheet = TimeSheet.new(sheetAuthor, @val[2],
4987
+ @project['trackingScenarioIdx'])
4988
+ @timeSheet.sourceFileInfo = @scanner.sourceFileInfo
4989
+ @project.timeSheets << @timeSheet
4705
4990
  })
4706
4991
  end
4707
4992
 
4708
4993
  def rule_timeSheetReport
4709
- pattern(%w( !tsReportHeader !tsReportBody ))
4994
+ pattern(%w( !tsReportHeader !tsReportBody ), lambda {
4995
+ @property = nil
4996
+ })
4710
4997
  doc('timesheetreport', <<'EOT'
4711
4998
  For projects that flow mostly according to plan, TaskJuggler already knows
4712
4999
  much of the information that should be contained in the time sheets. With this
@@ -4749,28 +5036,25 @@ EOT
4749
5036
  end
4750
5037
 
4751
5038
  def rule_tsNewTaskHeader
4752
- pattern(%w( _newtask !taskIdUnverifd ), lambda {
4753
-
5039
+ pattern(%w( _newtask !taskIdUnverifd $STRING ), lambda {
5040
+ @timeSheetRecord = TimeSheetRecord.new(@timeSheet, @val[1])
5041
+ @timeSheetRecord.name = @val[2]
5042
+ @timeSheetRecord.sourceFileInfo = @scanner.sourceFileInfo
4754
5043
  })
4755
5044
  arg(1, 'task', 'ID of the new task')
4756
5045
  end
4757
5046
  def rule_tsReportHeader
4758
- pattern(%w( _timesheetreport $STRING ), lambda {
4759
- if (fileName = @val[1]) != '.'
4760
- suffix = fileName[-4, 4]
4761
- if suffix != '.tji'
4762
- error('tsreport_bad_extn',
4763
- 'time sheet report files must have a .tji extension.')
4764
- end
4765
-
4766
- if @project.reports[fileName]
4767
- error('report_redefinition',
4768
- "A report with the name '#{fileName}' has already been defined.")
4769
- end
4770
- else
4771
- fileName = "timeSheet#{@project.reports.length + 1}"
4772
- end
4773
- newReport(fileName, :timeSheet, sourceFileInfo)
5047
+ pattern(%w( _timesheetreport !optionalID $STRING ), lambda {
5048
+ report = newReport(@val[1], @val[2], :timeSheet, sourceFileInfo)
5049
+ report.set('scenarios', [ 0 ])
5050
+ # Show all tasks, sorted by seqno-up.
5051
+ report.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
5052
+ report.set('sortTasks', [ [ 'seqno', true, -1 ] ])
5053
+ # Show all resources, sorted by seqno-up.
5054
+ report.set('hideResource', LogicalExpression.new(LogicalOperation.new(0)))
5055
+ report.set('sortResources', [ [ 'seqno', true, -1 ] ])
5056
+ report.set('loadUnit', :hours)
5057
+ report.set('definitions', [])
4774
5058
  })
4775
5059
  arg(1, 'file name', <<'EOT'
4776
5060
  The name of the time sheet report file to generate. It must end with a .tji
@@ -4808,12 +5092,24 @@ EOT
4808
5092
 
4809
5093
  def rule_tsStatusHeader
4810
5094
  pattern(%w( _status !alertLevel $STRING ), lambda {
4811
- @journalEntry = JournalEntry.new(@project['journal'], @sheetEnd,
4812
- @val[2], @property,
5095
+ if @val[2].length > 120
5096
+ error('ts_headline_too_long',
5097
+ "The headline must be 120 or less characters long. This one " +
5098
+ "has #{@val[2].length} characters.")
5099
+ end
5100
+ if @val[2] == 'Your headline here!'
5101
+ error('ts_no_headline',
5102
+ "'Your headline here!' is not a valid headline")
5103
+ end
5104
+ @journalEntry = JournalEntry.new(@project['journal'],
5105
+ @timeSheet.interval.end,
5106
+ @val[2],
5107
+ @property || @timeSheet.resource,
4813
5108
  @scanner.sourceFileInfo)
4814
5109
  @journalEntry.alertLevel = @val[1]
4815
- @journalEntry.author = @sheetAuthor
4816
-
5110
+ @journalEntry.timeSheetRecord = @timeSheetRecord
5111
+ @journalEntry.author = @timeSheet.resource
5112
+ @timeSheetRecord.status = @journalEntry if @timeSheetRecord
4817
5113
  })
4818
5114
  end
4819
5115
 
@@ -4824,6 +5120,11 @@ The status attribute can be used to describe the current status of the task or
4824
5120
  resource. The content of the status messages is added to the project journal.
4825
5121
  EOT
4826
5122
  )
5123
+ arg(2, 'headline', <<'EOT'
5124
+ A short headline for the status. Must be 60 characters or shorter.
5125
+ EOT
5126
+ )
5127
+ example('TimeSheet1', '4')
4827
5128
  end
4828
5129
 
4829
5130
  def rule_tsTaskAttributes
@@ -4831,20 +5132,31 @@ EOT
4831
5132
  repeatable
4832
5133
 
4833
5134
  pattern(%w( _end !valDate ), lambda {
4834
-
5135
+ if @val[1] < @timeSheet.interval.start
5136
+ error('ts_end_too_early',
5137
+ "The expected task end date must be after the start date of " +
5138
+ "this time sheet report.")
5139
+ end
5140
+ @timeSheetRecord.expectedEnd = @val[1]
4835
5141
  })
4836
5142
  doc('end.timesheet', <<'EOT'
4837
5143
  The expected end date for the task. This can only be used for duration based
4838
5144
  task. For effort based task [[remaining]] has to be used.
4839
5145
  EOT
4840
5146
  )
5147
+ example('TimeSheet1', '5')
4841
5148
 
4842
5149
  pattern(%w( _priority $INTEGER ), lambda {
4843
-
5150
+ priority = @val[1]
5151
+ if priority < 1 || priority > 1000
5152
+ error('ts_bad_priority',
5153
+ "Priority value #{priority} must be between 1 and 1000.")
5154
+ end
5155
+ @timeSheetRecord.priority = priority
4844
5156
  })
4845
5157
  doc('priority.timesheet', <<'EOT'
4846
5158
  The priority is a value between 1 and 1000. It is used to determine the
4847
- sequence of task when converting [[work]] to [[booking bookings]]. Tasks that
5159
+ sequence of task when converting [[work]] to [[booking|bookings]]. Tasks that
4848
5160
  need to finish earlier in the period should have a high priority, tasks that
4849
5161
  end later in the period should have a low priority. For tasks that don't get
4850
5162
  finished in the reported period the priority should be set to 1.
@@ -4852,29 +5164,30 @@ EOT
4852
5164
  )
4853
5165
 
4854
5166
  pattern(%w( _remaining !workingDuration ), lambda {
4855
-
5167
+ @timeSheetRecord.remaining = @val[1]
4856
5168
  })
4857
5169
  doc('remaining', <<'EOT'
4858
5170
  The remaining effort for the task. This value is ignored if there are
4859
- [[booking bookings]] for the resource that overlap with the time sheet period.
5171
+ [[booking|bookings]] for the resource that overlap with the time sheet period.
4860
5172
  If there are no bookings, the value is compared with the [[effort]]
4861
5173
  specification of the task. If there a mismatch between the accumulated effort
4862
5174
  specified with bookings, [[work]] and [[remaining]] on one side and the
4863
5175
  specified [[effort]] on the other, a warning is generated.
4864
5176
 
4865
5177
  This attribute can only be used with tasks that are effort based. Duration
4866
- based tasks need to have an [[end.timesheet end]] attribute.
5178
+ based tasks need to have an [[end.timesheet|end]] attribute.
4867
5179
  EOT
4868
5180
  )
5181
+ example('TimeSheet1', '6')
4869
5182
 
4870
5183
  pattern(%w( !tsStatus ))
4871
5184
 
4872
- pattern(%w( _work !workingDuration ), lambda {
4873
-
5185
+ pattern(%w( _work !workingDurationPercent ), lambda {
5186
+ @timeSheetRecord.work = @val[1]
4874
5187
  })
4875
5188
  doc('work', <<'EOT'
4876
5189
  The amount of time that the resource has spend with the task during the
4877
- reported period. This value is ignored when there are [[booking bookings]] for
5190
+ reported period. This value is ignored when there are [[booking|bookings]] for
4878
5191
  the resource overlapping with the time sheet period. If there are no bookings,
4879
5192
  TaskJuggler will try to convert the work specification into bookings
4880
5193
  internally before the actual scheduling is started.
@@ -4888,28 +5201,26 @@ regular 40 hour work week, exactly 40 hours total or 5 working days have to be
4888
5201
  reported.
4889
5202
  EOT
4890
5203
  )
5204
+ example('TimeSheet1', '4')
4891
5205
  end
4892
5206
 
4893
5207
  def rule_tsTaskBody
4894
- pattern(%w( _{ !tsTaskAttributes _} ), lambda {
4895
- @property = nil
4896
- })
5208
+ pattern(%w( _{ !tsTaskAttributes _} ))
4897
5209
  end
4898
5210
 
4899
5211
  def rule_tsTaskHeader
4900
5212
  pattern(%w( _task !taskId ), lambda {
4901
5213
  @property = @val[1]
4902
- # TODO: This is not too useful here. Needs to be done in postScheduling.
4903
- #scenarioIdx = @project['trackingScenarioIdx']
4904
- #taskStart = @property['start', scenarioIdx] || @project['start']
4905
- #taskEnd = @property['end', scenarioIdx] || @project['end']
4906
-
4907
- #if !Interval.new(@sheetStart, @sheetEnd).
4908
- # overlaps?(Interval.new(taskStart, taskEnd))
4909
- # warning('ts_task_not_active',
4910
- # "Task #{@property.fullId} is not active during the time sheet " +
4911
- # "reporting period")
4912
- #end
5214
+ unless @property.leaf?
5215
+ error('ts_task_not_leaf',
5216
+ 'You cannot specify a task that has sub tasks here.')
5217
+ end
5218
+ scenarioIdx = @timeSheet.scenarioIdx
5219
+ taskStart = @property['start', scenarioIdx] || @project['start']
5220
+ taskEnd = @property['end', scenarioIdx] || @project['end']
5221
+
5222
+ @timeSheetRecord = TimeSheetRecord.new(@timeSheet, @property)
5223
+ @timeSheetRecord.sourceFileInfo = @scanner.sourceFileInfo
4913
5224
  })
4914
5225
  arg(1, 'task', 'ID of an already existing task')
4915
5226
  end
@@ -4945,6 +5256,10 @@ EOT
4945
5256
  mode = @val[1][0]
4946
5257
  endSpec = @val[1][1]
4947
5258
  if mode == 0
5259
+ unless @val[0] < endSpec
5260
+ error('start_before_end', "The end date (#{endSpec}) must be " +
5261
+ "after the start date (#{@val[0]}).")
5262
+ end
4948
5263
  iv = Interval.new(@val[0], endSpec)
4949
5264
  else
4950
5265
  iv = Interval.new(@val[0], @val[0] + endSpec)
@@ -5007,6 +5322,20 @@ EOT
5007
5322
  listRule('moreValIntervals', '!valIntervalOrDate')
5008
5323
  end
5009
5324
 
5325
+ def rule_warn
5326
+ pattern(%w( _warn !logicalExpression ), lambda {
5327
+ @property['warn', @scenarioIdx] = @val[1]
5328
+ })
5329
+ doc('warn', <<'EOT'
5330
+ The warn attribute adds a logical expression to the property. The condition
5331
+ described by the logical expression is checked after the scheduling and an
5332
+ warning is generated if the condition evaluates to true. This attribute is
5333
+ primarily intended for testing purpuses.
5334
+ EOT
5335
+ )
5336
+ end
5337
+
5338
+
5010
5339
  def rule_weekday
5011
5340
  pattern(%w( _sun ), lambda { 0 })
5012
5341
  pattern(%w( _mon ), lambda { 1 })
@@ -5057,16 +5386,49 @@ EOT
5057
5386
  60 * 60 * @project['dailyworkinghours'] *
5058
5387
  @project['yearlyworkingdays'] # years
5059
5388
  ]
5389
+ # The result will always be in number of time slots.
5060
5390
  (@val[0] * convFactors[@val[1]] /
5061
5391
  @project['scheduleGranularity']).round.to_i
5062
5392
  })
5063
5393
  arg(0, 'value', 'A floating point or integer number')
5064
5394
  end
5065
5395
 
5396
+ def rule_workingDurationPercent
5397
+ pattern(%w( !number !durationUnitOrPercent ), lambda {
5398
+ if @val[1] >= 0
5399
+ # Absolute value in minutes, hours or days.
5400
+ convFactors = [ 60, # minutes
5401
+ 60 * 60, # hours
5402
+ 60 * 60 * @project['dailyworkinghours'] # days
5403
+ ]
5404
+ # The result will always be in number of time slots.
5405
+ (@val[0] * convFactors[@val[1]] /
5406
+ @project['scheduleGranularity']).round.to_i
5407
+ else
5408
+ # Percentage values are always returned as Float in the rage of 0.0 to
5409
+ # 1.0.
5410
+ if @val[0] < 0.0 || @val[0] > 100.0
5411
+ error('illegal_percentage',
5412
+ "Percentage values must be between 0 and 100%.")
5413
+ end
5414
+ @val[0] / 100.0
5415
+ end
5416
+ })
5417
+ arg(0, 'value', 'A floating point or integer number')
5418
+ end
5419
+
5066
5420
  def rule_workinghours
5067
5421
  pattern(%w( _workinghours !listOfDays !listOfTimes), lambda {
5068
- wh = @property.nil? ? @project['workinghours'] :
5069
- @property['workinghours', @scenarioIdx]
5422
+ if @property.nil?
5423
+ # We are changing global working hours.
5424
+ wh = @project['workinghours']
5425
+ else
5426
+ unless (wh = @property['workinghours', @scenarioIdx])
5427
+ # The property does not have it's own WorkingHours yet.
5428
+ wh = WorkingHours.new(@project['workinghours'])
5429
+ @property['workinghours', @scenarioIdx] = wh
5430
+ end
5431
+ end
5070
5432
  wh.timezone = @property.nil? ? @project['timezone'] :
5071
5433
  @property['timezone', @scenarioIdx]
5072
5434
  7.times { |i| wh.setWorkingHours(i, @val[2]) if @val[1][i] }