taskjuggler 3.4.0 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (530) hide show
  1. data/CHANGELOG +41 -0
  2. data/data/css/tjreport.css +4 -1
  3. data/data/tjp.vim +22 -11
  4. data/examples/ToDo-List/todolist.tjp +1 -1
  5. data/lib/header.tmpl +1 -1
  6. data/lib/taskjuggler/Account.rb +1 -1
  7. data/lib/taskjuggler/AccountCredit.rb +1 -1
  8. data/lib/taskjuggler/AccountScenario.rb +1 -1
  9. data/lib/taskjuggler/AlertLevelDefinitions.rb +1 -1
  10. data/lib/taskjuggler/AlgorithmDiff.rb +1 -1
  11. data/lib/taskjuggler/Allocation.rb +1 -1
  12. data/lib/taskjuggler/AppConfig.rb +1 -1
  13. data/lib/taskjuggler/AttributeBase.rb +11 -1
  14. data/lib/taskjuggler/AttributeDefinition.rb +1 -1
  15. data/lib/taskjuggler/Attributes.rb +3 -3
  16. data/lib/taskjuggler/BatchProcessor.rb +1 -1
  17. data/lib/taskjuggler/Booking.rb +1 -1
  18. data/lib/taskjuggler/Charge.rb +1 -1
  19. data/lib/taskjuggler/ChargeSet.rb +1 -1
  20. data/lib/taskjuggler/DataCache.rb +1 -1
  21. data/lib/taskjuggler/FileList.rb +1 -1
  22. data/lib/taskjuggler/HTMLDocument.rb +2 -2
  23. data/lib/taskjuggler/HTMLElements.rb +1 -1
  24. data/lib/taskjuggler/ICalendar.rb +2 -2
  25. data/lib/taskjuggler/Interval.rb +1 -1
  26. data/lib/taskjuggler/IntervalList.rb +1 -1
  27. data/lib/taskjuggler/Journal.rb +1 -1
  28. data/lib/taskjuggler/KateSyntax.rb +1 -1
  29. data/lib/taskjuggler/KeywordArray.rb +1 -1
  30. data/lib/taskjuggler/KeywordDocumentation.rb +3 -2
  31. data/lib/taskjuggler/LeaveList.rb +1 -1
  32. data/lib/taskjuggler/Limits.rb +1 -1
  33. data/lib/taskjuggler/Log.rb +1 -1
  34. data/lib/taskjuggler/LogicalExpression.rb +1 -1
  35. data/lib/taskjuggler/LogicalFunction.rb +23 -1
  36. data/lib/taskjuggler/LogicalOperation.rb +5 -2
  37. data/lib/taskjuggler/MessageHandler.rb +9 -3
  38. data/lib/taskjuggler/PTNProxy.rb +1 -1
  39. data/lib/taskjuggler/Painter.rb +1 -1
  40. data/lib/taskjuggler/Project.rb +4 -3
  41. data/lib/taskjuggler/ProjectFileParser.rb +15 -4
  42. data/lib/taskjuggler/ProjectFileScanner.rb +1 -1
  43. data/lib/taskjuggler/PropertyList.rb +2 -2
  44. data/lib/taskjuggler/PropertySet.rb +2 -2
  45. data/lib/taskjuggler/PropertyTreeNode.rb +44 -16
  46. data/lib/taskjuggler/Query.rb +23 -10
  47. data/lib/taskjuggler/RealFormat.rb +1 -1
  48. data/lib/taskjuggler/Resource.rb +1 -1
  49. data/lib/taskjuggler/ResourceScenario.rb +6 -1
  50. data/lib/taskjuggler/RichText.rb +1 -1
  51. data/lib/taskjuggler/RichText/Document.rb +1 -1
  52. data/lib/taskjuggler/RichText/Element.rb +1 -1
  53. data/lib/taskjuggler/RichText/FunctionExample.rb +3 -3
  54. data/lib/taskjuggler/RichText/FunctionHandler.rb +1 -1
  55. data/lib/taskjuggler/RichText/Parser.rb +1 -1
  56. data/lib/taskjuggler/RichText/RTFHandlers.rb +1 -1
  57. data/lib/taskjuggler/RichText/RTFNavigator.rb +1 -1
  58. data/lib/taskjuggler/RichText/RTFQuery.rb +4 -3
  59. data/lib/taskjuggler/RichText/RTFReport.rb +1 -1
  60. data/lib/taskjuggler/RichText/RTFReportLink.rb +1 -1
  61. data/lib/taskjuggler/RichText/RTFWithQuerySupport.rb +1 -1
  62. data/lib/taskjuggler/RichText/Scanner.rb +2 -1
  63. data/lib/taskjuggler/RichText/Snip.rb +1 -1
  64. data/lib/taskjuggler/RichText/SyntaxRules.rb +1 -1
  65. data/lib/taskjuggler/RichText/TOCEntry.rb +1 -1
  66. data/lib/taskjuggler/RichText/TableOfContents.rb +1 -1
  67. data/lib/taskjuggler/RuntimeConfig.rb +1 -1
  68. data/lib/taskjuggler/Scenario.rb +1 -1
  69. data/lib/taskjuggler/ScenarioData.rb +1 -1
  70. data/lib/taskjuggler/Scoreboard.rb +10 -6
  71. data/lib/taskjuggler/SheetHandlerBase.rb +1 -1
  72. data/lib/taskjuggler/SheetReceiver.rb +1 -1
  73. data/lib/taskjuggler/SheetSender.rb +1 -1
  74. data/lib/taskjuggler/Shift.rb +1 -1
  75. data/lib/taskjuggler/ShiftAssignments.rb +1 -1
  76. data/lib/taskjuggler/ShiftScenario.rb +1 -1
  77. data/lib/taskjuggler/SimpleQueryExpander.rb +1 -1
  78. data/lib/taskjuggler/StatusSheetReceiver.rb +1 -1
  79. data/lib/taskjuggler/StatusSheetSender.rb +1 -1
  80. data/lib/taskjuggler/StdIoWrapper.rb +1 -1
  81. data/lib/taskjuggler/SyntaxReference.rb +15 -1
  82. data/lib/taskjuggler/TableColumnDefinition.rb +1 -1
  83. data/lib/taskjuggler/TableColumnSorter.rb +1 -1
  84. data/lib/taskjuggler/Task.rb +1 -1
  85. data/lib/taskjuggler/TaskDependency.rb +1 -1
  86. data/lib/taskjuggler/TaskJuggler.rb +7 -4
  87. data/lib/taskjuggler/TaskScenario.rb +95 -72
  88. data/lib/taskjuggler/TernarySearchTree.rb +1 -1
  89. data/lib/taskjuggler/TextFormatter.rb +1 -1
  90. data/lib/taskjuggler/TextParser.rb +1 -1
  91. data/lib/taskjuggler/TextParser/MacroTable.rb +1 -1
  92. data/lib/taskjuggler/TextParser/Pattern.rb +1 -1
  93. data/lib/taskjuggler/TextParser/Rule.rb +6 -1
  94. data/lib/taskjuggler/TextParser/Scanner.rb +1 -1
  95. data/lib/taskjuggler/TextParser/SourceFileInfo.rb +1 -1
  96. data/lib/taskjuggler/TextParser/StackElement.rb +1 -1
  97. data/lib/taskjuggler/TextParser/State.rb +1 -1
  98. data/lib/taskjuggler/TextParser/TokenDoc.rb +1 -1
  99. data/lib/taskjuggler/TimeSheetReceiver.rb +1 -1
  100. data/lib/taskjuggler/TimeSheetSender.rb +1 -1
  101. data/lib/taskjuggler/TimeSheetSummary.rb +1 -1
  102. data/lib/taskjuggler/TimeSheets.rb +1 -1
  103. data/lib/taskjuggler/Tj3AppBase.rb +3 -2
  104. data/lib/taskjuggler/Tj3Config.rb +3 -3
  105. data/lib/taskjuggler/Tj3SheetAppBase.rb +1 -1
  106. data/lib/taskjuggler/TjException.rb +1 -1
  107. data/lib/taskjuggler/TjTime.rb +17 -12
  108. data/lib/taskjuggler/TjpExample.rb +1 -1
  109. data/lib/taskjuggler/TjpSyntaxRules.rb +378 -303
  110. data/lib/taskjuggler/URLParameter.rb +1 -1
  111. data/lib/taskjuggler/UTF8String.rb +1 -1
  112. data/lib/taskjuggler/UserManual.rb +3 -3
  113. data/lib/taskjuggler/VimSyntax.rb +1 -1
  114. data/lib/taskjuggler/WorkingHours.rb +1 -1
  115. data/lib/taskjuggler/XMLDocument.rb +1 -1
  116. data/lib/taskjuggler/XMLElement.rb +1 -1
  117. data/lib/taskjuggler/apps/Tj3.rb +20 -6
  118. data/lib/taskjuggler/apps/Tj3Client.rb +1 -1
  119. data/lib/taskjuggler/apps/Tj3Daemon.rb +1 -1
  120. data/lib/taskjuggler/apps/Tj3Man.rb +2 -2
  121. data/lib/taskjuggler/apps/Tj3SsReceiver.rb +1 -1
  122. data/lib/taskjuggler/apps/Tj3SsSender.rb +1 -1
  123. data/lib/taskjuggler/apps/Tj3TsReceiver.rb +1 -1
  124. data/lib/taskjuggler/apps/Tj3TsSender.rb +1 -1
  125. data/lib/taskjuggler/apps/Tj3TsSummary.rb +1 -1
  126. data/lib/taskjuggler/apps/Tj3WebD.rb +2 -2
  127. data/lib/taskjuggler/daemon/Daemon.rb +1 -1
  128. data/lib/taskjuggler/daemon/DaemonConnector.rb +1 -1
  129. data/lib/taskjuggler/daemon/ProcessIntercom.rb +1 -1
  130. data/lib/taskjuggler/daemon/ProjectBroker.rb +1 -1
  131. data/lib/taskjuggler/daemon/ProjectServer.rb +1 -1
  132. data/lib/taskjuggler/daemon/ReportServer.rb +1 -1
  133. data/lib/taskjuggler/daemon/ReportServlet.rb +1 -1
  134. data/lib/taskjuggler/daemon/WebServer.rb +1 -1
  135. data/lib/taskjuggler/daemon/WelcomePage.rb +1 -1
  136. data/lib/taskjuggler/deep_copy.rb +1 -1
  137. data/lib/taskjuggler/reports/AccountListRE.rb +1 -1
  138. data/lib/taskjuggler/reports/CSVFile.rb +1 -1
  139. data/lib/taskjuggler/reports/ChartPlotter.rb +1 -1
  140. data/lib/taskjuggler/reports/CollisionDetector.rb +1 -1
  141. data/lib/taskjuggler/reports/ColumnTable.rb +1 -1
  142. data/lib/taskjuggler/reports/ExportRE.rb +1 -1
  143. data/lib/taskjuggler/reports/GanttChart.rb +1 -1
  144. data/lib/taskjuggler/reports/GanttContainer.rb +1 -1
  145. data/lib/taskjuggler/reports/GanttHeader.rb +1 -1
  146. data/lib/taskjuggler/reports/GanttHeaderScaleItem.rb +1 -1
  147. data/lib/taskjuggler/reports/GanttLine.rb +1 -1
  148. data/lib/taskjuggler/reports/GanttLoadStack.rb +1 -1
  149. data/lib/taskjuggler/reports/GanttMilestone.rb +1 -1
  150. data/lib/taskjuggler/reports/GanttRouter.rb +1 -1
  151. data/lib/taskjuggler/reports/GanttTaskBar.rb +1 -1
  152. data/lib/taskjuggler/reports/HTMLGraphics.rb +1 -1
  153. data/lib/taskjuggler/reports/ICalReport.rb +1 -1
  154. data/lib/taskjuggler/reports/MspXmlRE.rb +1 -1
  155. data/lib/taskjuggler/reports/Navigator.rb +1 -1
  156. data/lib/taskjuggler/reports/NikuReport.rb +1 -1
  157. data/lib/taskjuggler/reports/Report.rb +31 -19
  158. data/lib/taskjuggler/reports/ReportBase.rb +1 -1
  159. data/lib/taskjuggler/reports/ReportContext.rb +1 -1
  160. data/lib/taskjuggler/reports/ReportTable.rb +1 -1
  161. data/lib/taskjuggler/reports/ReportTableCell.rb +1 -1
  162. data/lib/taskjuggler/reports/ReportTableColumn.rb +1 -1
  163. data/lib/taskjuggler/reports/ReportTableLegend.rb +1 -1
  164. data/lib/taskjuggler/reports/ReportTableLine.rb +1 -1
  165. data/lib/taskjuggler/reports/ResourceListRE.rb +1 -1
  166. data/lib/taskjuggler/reports/StatusSheetReport.rb +1 -1
  167. data/lib/taskjuggler/reports/TableReport.rb +4 -5
  168. data/lib/taskjuggler/reports/TableReportColumn.rb +1 -1
  169. data/lib/taskjuggler/reports/TagFile.rb +1 -1
  170. data/lib/taskjuggler/reports/TaskListRE.rb +1 -1
  171. data/lib/taskjuggler/reports/TextReport.rb +1 -1
  172. data/lib/taskjuggler/reports/TimeSheetReport.rb +1 -1
  173. data/lib/taskjuggler/reports/TjpExportRE.rb +9 -2
  174. data/lib/taskjuggler/reports/TraceReport.rb +1 -1
  175. data/lib/tj3.rb +1 -1
  176. data/lib/tj3client.rb +1 -1
  177. data/lib/tj3d.rb +1 -1
  178. data/lib/tj3man.rb +1 -1
  179. data/lib/tj3ss_receiver.rb +1 -1
  180. data/lib/tj3ss_sender.rb +1 -1
  181. data/lib/tj3ts_receiver.rb +1 -1
  182. data/lib/tj3ts_sender.rb +1 -1
  183. data/lib/tj3ts_summary.rb +1 -1
  184. data/lib/tj3webd.rb +1 -1
  185. data/manual/How_To_Contribute +5 -6
  186. data/manual/Installation +3 -3
  187. data/manual/Rich_Text_Attributes +8 -3
  188. data/manual/html/Day_To_Day_Juggling.html +3 -3
  189. data/manual/html/Getting_Started.html +3 -3
  190. data/manual/html/How_To_Contribute.html +6 -7
  191. data/manual/html/Installation.html +6 -6
  192. data/manual/html/Intro.html +3 -3
  193. data/manual/html/Reporting_Bugs.html +3 -3
  194. data/manual/html/Rich_Text_Attributes.html +5 -4
  195. data/manual/html/Software.html +3 -3
  196. data/manual/html/TaskJuggler_2x_Migration.html +3 -3
  197. data/manual/html/TaskJuggler_Internals.html +3 -3
  198. data/manual/html/The_TaskJuggler_Syntax.html +3 -3
  199. data/manual/html/Tutorial.html +3 -3
  200. data/manual/html/account.html +3 -3
  201. data/manual/html/account.task.html +3 -3
  202. data/manual/html/accountprefix.html +3 -3
  203. data/manual/html/accountreport.html +5 -5
  204. data/manual/html/accountroot.html +3 -3
  205. data/manual/html/active.html +3 -3
  206. data/manual/html/adopt.task.html +3 -3
  207. data/manual/html/aggregate.html +3 -3
  208. data/manual/html/alert.html +3 -3
  209. data/manual/html/alertlevels.html +3 -3
  210. data/manual/html/allocate.html +3 -3
  211. data/manual/html/alphabet.html +11 -4
  212. data/manual/html/alternative.html +3 -3
  213. data/manual/html/author.html +3 -3
  214. data/manual/html/auxdir.html +7 -9
  215. data/manual/html/auxdir.report.html +69 -0
  216. data/manual/html/balance.html +5 -5
  217. data/manual/html/booking.resource.html +3 -3
  218. data/manual/html/booking.task.html +3 -3
  219. data/manual/html/caption.html +3 -3
  220. data/manual/html/cellcolor.column.html +4 -4
  221. data/manual/html/celltext.column.html +3 -3
  222. data/manual/html/center.html +3 -3
  223. data/manual/html/charge.html +3 -3
  224. data/manual/html/chargeset.html +3 -3
  225. data/manual/html/columnid.html +10 -6
  226. data/manual/html/columns.html +3 -3
  227. data/manual/html/complete.html +3 -3
  228. data/manual/html/copyright.html +3 -3
  229. data/manual/html/credits.html +3 -3
  230. data/manual/html/css/tjreport.css +4 -1
  231. data/manual/html/currency.html +3 -3
  232. data/manual/html/currencyformat.html +3 -3
  233. data/manual/html/dailymax.html +3 -3
  234. data/manual/html/dailymin.html +3 -3
  235. data/manual/html/dailyworkinghours.html +3 -3
  236. data/manual/html/date.extend.html +3 -3
  237. data/manual/html/date.html +4 -3
  238. data/manual/html/definitions.html +3 -3
  239. data/manual/html/depends.html +3 -3
  240. data/manual/html/details.html +3 -3
  241. data/manual/html/disabled.html +3 -3
  242. data/manual/html/duration.html +3 -3
  243. data/manual/html/efficiency.html +3 -3
  244. data/manual/html/effort.html +3 -3
  245. data/manual/html/email.html +3 -3
  246. data/manual/html/enabled.html +3 -3
  247. data/manual/html/end.column.html +3 -3
  248. data/manual/html/end.html +3 -3
  249. data/manual/html/end.limit.html +3 -3
  250. data/manual/html/end.report.html +3 -3
  251. data/manual/html/end.timesheet.html +3 -3
  252. data/manual/html/endcredit.html +3 -3
  253. data/manual/html/epilog.html +3 -3
  254. data/manual/html/export.html +3 -3
  255. data/manual/html/extend.html +58 -13
  256. data/manual/html/fail.html +4 -4
  257. data/manual/html/fdl.html +3 -3
  258. data/manual/html/flags.account.html +3 -3
  259. data/manual/html/flags.html +3 -3
  260. data/manual/html/flags.journalentry.html +3 -3
  261. data/manual/html/flags.report.html +3 -3
  262. data/manual/html/flags.resource.html +3 -3
  263. data/manual/html/flags.statussheet.html +3 -3
  264. data/manual/html/flags.task.html +3 -3
  265. data/manual/html/flags.timesheet.html +3 -3
  266. data/manual/html/fontcolor.column.html +4 -4
  267. data/manual/html/footer.html +3 -3
  268. data/manual/html/formats.export.html +3 -3
  269. data/manual/html/formats.html +3 -3
  270. data/manual/html/functions.html +4 -4
  271. data/manual/html/gapduration.html +3 -3
  272. data/manual/html/gaplength.html +3 -3
  273. data/manual/html/halign.center.html +3 -3
  274. data/manual/html/halign.column.html +4 -4
  275. data/manual/html/halign.left.html +3 -3
  276. data/manual/html/halign.right.html +3 -3
  277. data/manual/html/hasalert.html +3 -3
  278. data/manual/html/header.html +3 -3
  279. data/manual/html/headline.html +3 -3
  280. data/manual/html/height.html +3 -3
  281. data/manual/html/hideaccount.html +5 -4
  282. data/manual/html/hidejournalentry.html +3 -3
  283. data/manual/html/hidereport.html +4 -4
  284. data/manual/html/hideresource.html +5 -4
  285. data/manual/html/hidetask.html +5 -4
  286. data/manual/html/icalreport.html +3 -3
  287. data/manual/html/include.macro.html +3 -3
  288. data/manual/html/include.project.html +3 -3
  289. data/manual/html/include.properties.html +3 -3
  290. data/manual/html/index.html +2 -2
  291. data/manual/html/inherit.extend.html +4 -4
  292. data/manual/html/interval1.html +3 -3
  293. data/manual/html/interval2.html +3 -3
  294. data/manual/html/interval3.html +3 -3
  295. data/manual/html/interval4.html +3 -3
  296. data/manual/html/isactive.html +3 -3
  297. data/manual/html/ischildof.html +3 -3
  298. data/manual/html/isdependencyof.html +3 -3
  299. data/manual/html/isdutyof.html +3 -3
  300. data/manual/html/isfeatureof.html +3 -3
  301. data/manual/html/isleaf.html +3 -3
  302. data/manual/html/ismilestone.html +3 -3
  303. data/manual/html/isongoing.html +3 -3
  304. data/manual/html/isresource.html +3 -3
  305. data/manual/html/isresponsibilityof.html +3 -3
  306. data/manual/html/istask.html +5 -5
  307. data/manual/html/isvalid.html +66 -0
  308. data/manual/html/journalattributes.html +5 -5
  309. data/manual/html/journalentry.html +3 -3
  310. data/manual/html/journalmode.html +3 -3
  311. data/manual/html/leaveallowance.html +3 -3
  312. data/manual/html/leaves.html +3 -3
  313. data/manual/html/left.html +3 -3
  314. data/manual/html/length.html +5 -5
  315. data/manual/html/limits.allocate.html +3 -3
  316. data/manual/html/limits.html +3 -3
  317. data/manual/html/limits.resource.html +3 -3
  318. data/manual/html/limits.task.html +3 -3
  319. data/manual/html/listitem.column.html +3 -3
  320. data/manual/html/listtype.column.html +3 -3
  321. data/manual/html/loadunit.html +3 -3
  322. data/manual/html/logicalexpression.html +14 -4
  323. data/manual/html/logicalflagexpression.html +3 -3
  324. data/manual/html/macro.html +3 -3
  325. data/manual/html/managers.html +3 -3
  326. data/manual/html/mandatory.html +3 -3
  327. data/manual/html/maxend.html +3 -3
  328. data/manual/html/maximum.html +3 -3
  329. data/manual/html/maxstart.html +3 -3
  330. data/manual/html/milestone.html +3 -3
  331. data/manual/html/minend.html +3 -3
  332. data/manual/html/minimum.html +3 -3
  333. data/manual/html/minstart.html +3 -3
  334. data/manual/html/monthlymax.html +3 -3
  335. data/manual/html/monthlymin.html +3 -3
  336. data/manual/html/navbar.html +10 -2
  337. data/manual/html/navigator.html +3 -3
  338. data/manual/html/newtask.html +4 -4
  339. data/manual/html/nikureport.html +3 -3
  340. data/manual/html/note.task.html +3 -3
  341. data/manual/html/now.html +5 -5
  342. data/manual/html/number.extend.html +77 -0
  343. data/manual/html/numberformat.html +5 -5
  344. data/manual/html/onend.html +3 -3
  345. data/manual/html/onstart.html +3 -3
  346. data/manual/html/opennodes.html +5 -5
  347. data/manual/html/outputdir.html +67 -0
  348. data/manual/html/overtime.booking.html +5 -5
  349. data/manual/html/period.column.html +3 -3
  350. data/manual/html/period.limit.html +3 -3
  351. data/manual/html/period.report.html +3 -3
  352. data/manual/html/period.task.html +3 -3
  353. data/manual/html/persistent.html +3 -3
  354. data/manual/html/precedes.html +3 -3
  355. data/manual/html/priority.html +3 -3
  356. data/manual/html/priority.timesheet.html +3 -3
  357. data/manual/html/project.html +4 -4
  358. data/manual/html/projectid.html +3 -3
  359. data/manual/html/projectid.task.html +3 -3
  360. data/manual/html/projectids.html +3 -3
  361. data/manual/html/projection.html +3 -3
  362. data/manual/html/prolog.html +3 -3
  363. data/manual/html/properties.html +10 -4
  364. data/manual/html/purge.html +3 -3
  365. data/manual/html/rate.html +3 -3
  366. data/manual/html/rate.resource.html +3 -3
  367. data/manual/html/rawhtmlhead.html +3 -3
  368. data/manual/html/reference.extend.html +3 -3
  369. data/manual/html/remaining.html +3 -3
  370. data/manual/html/replace.html +3 -3
  371. data/manual/html/reportprefix.html +3 -3
  372. data/manual/html/resource.html +3 -3
  373. data/manual/html/resourceattributes.html +3 -3
  374. data/manual/html/resourceprefix.html +3 -3
  375. data/manual/html/resourcereport.html +5 -5
  376. data/manual/html/resourceroot.html +3 -3
  377. data/manual/html/resources.limit.html +3 -3
  378. data/manual/html/responsible.html +3 -3
  379. data/manual/html/richtext.extend.html +3 -3
  380. data/manual/html/right.html +3 -3
  381. data/manual/html/rollupaccount.html +4 -4
  382. data/manual/html/rollupresource.html +4 -4
  383. data/manual/html/rolluptask.html +4 -4
  384. data/manual/html/scale.column.html +3 -3
  385. data/manual/html/scenario.html +3 -3
  386. data/manual/html/scenario.ical.html +3 -3
  387. data/manual/html/scenarios.export.html +3 -3
  388. data/manual/html/scenarios.html +3 -3
  389. data/manual/html/scenariospecific.extend.html +4 -4
  390. data/manual/html/scheduled.html +3 -3
  391. data/manual/html/scheduling.html +3 -3
  392. data/manual/html/select.html +3 -3
  393. data/manual/html/selfcontained.html +3 -3
  394. data/manual/html/shift.allocate.html +3 -3
  395. data/manual/html/shift.html +4 -4
  396. data/manual/html/shift.resource.html +3 -3
  397. data/manual/html/shift.task.html +3 -3
  398. data/manual/html/shift.timesheet.html +3 -3
  399. data/manual/html/shifts.allocate.html +3 -3
  400. data/manual/html/shifts.resource.html +3 -3
  401. data/manual/html/shifts.task.html +3 -3
  402. data/manual/html/shorttimeformat.html +3 -3
  403. data/manual/html/sloppy.booking.html +3 -3
  404. data/manual/html/sloppy.projection.html +3 -3
  405. data/manual/html/sortaccounts.html +3 -3
  406. data/manual/html/sortjournalentries.html +3 -3
  407. data/manual/html/sortresources.html +3 -3
  408. data/manual/html/sorttasks.html +3 -3
  409. data/manual/html/start.column.html +3 -3
  410. data/manual/html/start.html +3 -3
  411. data/manual/html/start.limit.html +3 -3
  412. data/manual/html/start.report.html +3 -3
  413. data/manual/html/startcredit.html +3 -3
  414. data/manual/html/status.statussheet.html +3 -3
  415. data/manual/html/status.timesheet.html +3 -3
  416. data/manual/html/statussheet.html +3 -3
  417. data/manual/html/statussheetreport.html +3 -3
  418. data/manual/html/strict.projection.html +3 -3
  419. data/manual/html/summary.html +3 -3
  420. data/manual/html/supplement.html +3 -3
  421. data/manual/html/supplement.resource.html +3 -3
  422. data/manual/html/supplement.task.html +3 -3
  423. data/manual/html/tagfile.html +3 -3
  424. data/manual/html/task.html +3 -3
  425. data/manual/html/task.statussheet.html +3 -3
  426. data/manual/html/task.timesheet.html +3 -3
  427. data/manual/html/taskattributes.html +3 -3
  428. data/manual/html/taskprefix.html +3 -3
  429. data/manual/html/taskreport.html +5 -5
  430. data/manual/html/taskroot.export.html +3 -3
  431. data/manual/html/taskroot.html +3 -3
  432. data/manual/html/text.extend.html +3 -3
  433. data/manual/html/textreport.html +5 -5
  434. data/manual/html/timeformat.html +3 -3
  435. data/manual/html/timeformat1.html +3 -3
  436. data/manual/html/timeformat2.html +3 -3
  437. data/manual/html/timeoff.nikureport.html +3 -3
  438. data/manual/html/timesheet.html +3 -3
  439. data/manual/html/timesheetreport.html +3 -3
  440. data/manual/html/timezone.export.html +3 -3
  441. data/manual/html/timezone.html +3 -3
  442. data/manual/html/timezone.report.html +3 -3
  443. data/manual/html/timezone.shift.html +3 -3
  444. data/manual/html/timingresolution.html +3 -3
  445. data/manual/html/title.column.html +3 -3
  446. data/manual/html/title.html +3 -3
  447. data/manual/html/toc.html +276 -248
  448. data/manual/html/tooltip.column.html +4 -4
  449. data/manual/html/tracereport.html +5 -5
  450. data/manual/html/trackingscenario.html +3 -3
  451. data/manual/html/treelevel.html +3 -3
  452. data/manual/html/vacation.html +3 -3
  453. data/manual/html/vacation.resource.html +3 -3
  454. data/manual/html/vacation.shift.html +3 -3
  455. data/manual/html/warn.html +4 -4
  456. data/manual/html/weeklymax.html +3 -3
  457. data/manual/html/weeklymin.html +3 -3
  458. data/manual/html/weekstartsmonday.html +3 -3
  459. data/manual/html/weekstartssunday.html +3 -3
  460. data/manual/html/width.column.html +4 -4
  461. data/manual/html/width.html +3 -3
  462. data/manual/html/work.html +3 -3
  463. data/manual/html/workinghours.project.html +3 -3
  464. data/manual/html/workinghours.resource.html +3 -3
  465. data/manual/html/workinghours.shift.html +3 -3
  466. data/manual/html/yearlyworkingdays.html +3 -3
  467. data/spec/Color_spec.rb +2 -2
  468. data/spec/ICalendar_spec.rb +1 -1
  469. data/spec/IntervalList_spec.rb +1 -1
  470. data/spec/ProjectBroker_spec.rb +1 -1
  471. data/spec/StatusSheets_spec.rb +1 -1
  472. data/spec/TableColumnSorter_spec.rb +2 -2
  473. data/spec/TernarySearchTree_spec.rb +1 -1
  474. data/spec/TimeSheets_spec.rb +1 -1
  475. data/spec/Tj3Daemon_spec.rb +1 -1
  476. data/spec/Tj3_spec.rb +1 -1
  477. data/spec/TraceReport_spec.rb +2 -2
  478. data/spec/support/DaemonControl.rb +1 -1
  479. data/spec/support/spec_helper.rb +1 -1
  480. data/tasks/gem.rake +7 -1
  481. data/tasks/rdoc.rake +5 -1
  482. data/test/MessageChecker.rb +1 -1
  483. data/test/ReferenceGenerator.rb +1 -1
  484. data/test/TestSuite/CSV-Reports/refs/taskreport_with_resources.csv +14 -14
  485. data/test/TestSuite/CSV-Reports/taskreport_with_resources.tjp +1 -1
  486. data/test/TestSuite/Export-Reports/refs/CustomAttributes.tjp +62 -10
  487. data/test/TestSuite/Export-Reports/refs/Shift.tjp +1 -1
  488. data/test/TestSuite/Scheduler/Correct/DateAndDep.tjp +25 -0
  489. data/test/TestSuite/Scheduler/Correct/hammock.tjp +27 -0
  490. data/test/TestSuite/Scheduler/Errors/container_milestone.tjp +13 -0
  491. data/test/TestSuite/Scheduler/Errors/{weak_end_dep.tjp → impossible_end_dep.tjp} +2 -2
  492. data/test/TestSuite/Scheduler/Errors/{weak_start_dep.tjp → impossible_start_dep.tjp} +2 -2
  493. data/test/TestSuite/Scheduler/Errors/sched_runaway.tjp +20 -0
  494. data/test/TestSuite/Scheduler/Errors/{task_pred_before_gl.tjp → task_pred_before_1.tjp} +1 -1
  495. data/test/TestSuite/Scheduler/Errors/{task_pred_before_gd.tjp → task_pred_before_2.tjp} +1 -1
  496. data/test/TestSuite/Scheduler/Errors/{task_succ_after_gl.tjp → task_succ_after_1.tjp} +1 -1
  497. data/test/TestSuite/Scheduler/Errors/{task_succ_after_gd.tjp → task_succ_after_2.tjp} +1 -1
  498. data/test/TestSuite/Syntax/Correct/CustomAttributes.tjp +53 -9
  499. data/test/TestSuite/Syntax/Correct/LogicalExpression.tjp +11 -0
  500. data/test/TjpGen.rb +1 -1
  501. data/test/all.rb +1 -1
  502. data/test/test_AlgorithmDiff.rb +1 -1
  503. data/test/test_BatchProcessor.rb +1 -1
  504. data/test/test_CSV-Reports.rb +1 -1
  505. data/test/test_CSVFile.rb +1 -1
  506. data/test/test_CollisionDetector.rb +1 -1
  507. data/test/test_Export-Reports.rb +1 -1
  508. data/test/test_Journal.rb +1 -1
  509. data/test/test_Limits.rb +1 -1
  510. data/test/test_LogicalExpression.rb +1 -1
  511. data/test/test_MacroTable.rb +1 -1
  512. data/test/test_Project.rb +1 -1
  513. data/test/test_ProjectFileScanner.rb +1 -1
  514. data/test/test_PropertySet.rb +1 -1
  515. data/test/test_Query.rb +1 -1
  516. data/test/test_RealFormat.rb +1 -1
  517. data/test/test_ReportGenerator.rb +1 -1
  518. data/test/test_RichText.rb +1 -1
  519. data/test/test_Scheduler.rb +1 -1
  520. data/test/test_ShiftAssignments.rb +1 -1
  521. data/test/test_SimpleQueryExpander.rb +1 -1
  522. data/test/test_Syntax.rb +1 -1
  523. data/test/test_TextFormatter.rb +1 -1
  524. data/test/test_TjTime.rb +1 -1
  525. data/test/test_TjpExample.rb +1 -1
  526. data/test/test_URLParameter.rb +1 -1
  527. data/test/test_UTF8String.rb +1 -1
  528. data/test/test_WorkingHours.rb +1 -1
  529. data/test/test_deep_copy.rb +1 -1
  530. metadata +26 -14
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = StatusSheetReceiver.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = StatusSheetSender.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = StdIoWrapper.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = SyntaxReference.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -176,7 +176,21 @@ class TaskJuggler
176
176
  head << XMLElement.new('base', 'target' => 'navigator')
177
177
  html.html << (body = XMLElement.new('body'))
178
178
 
179
+ body << (divf = XMLElement.new('div'))
180
+ divf << (form = XMLElement.new(
181
+ 'form', 'action' => 'http://www.google.com/search',
182
+ 'method' => "get", 'target' => '_blank', 'style' => 'margin:0'))
183
+ form << XMLElement.new('input', 'type' => 'text',
184
+ 'value' => '',
185
+ 'maxlength' => '255',
186
+ 'size' => '25',
187
+ 'name' => 'q')
188
+ form << XMLElement.new('input', 'type' => 'submit', 'value' => 'Search')
189
+ form << XMLElement.new('input', 'type' => 'hidden',
190
+ 'value' => 'taskjuggler.org/manual',
191
+ 'name' => 'sitesearch')
179
192
  body << (h3 = XMLElement.new('h3'))
193
+
180
194
  letters.each do |l|
181
195
  h3 << XMLNamedText.new(l.upcase, 'a',
182
196
  'href' => "navbar.html##{l}")
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = TableColumnDefinition.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = TableColumnSorter.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = Task.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = TaskDependency.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = TaskJuggler.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -144,10 +144,13 @@ class TaskJuggler
144
144
  # Generate all specified reports. The project must have be scheduled before
145
145
  # this method can be called. It returns true if no error occured, false
146
146
  # otherwise.
147
- def generateReports(outputDir = './')
147
+ def generateReports(outputDir = nil)
148
148
  @project.checkReports
149
- outputDir += '/' unless outputDir.empty? || outputDir[-1] == '/'
150
- @project.outputDir = outputDir
149
+ if outputDir
150
+ # Make sure the output directory path always ends with a '/' unless empty.
151
+ outputDir += '/' unless outputDir.empty? || outputDir[-1] == '/'
152
+ @project.outputDir = outputDir
153
+ end
151
154
  Log.enter('reports', 'Generating reports ...')
152
155
 
153
156
  begin
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = TaskScenario.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -119,6 +119,8 @@ class TaskJuggler
119
119
  task = task.parent
120
120
  end
121
121
 
122
+ @contendedResources = Hash.new { |hash, key| hash[key] = Hash.new(0) }
123
+
122
124
  # Collect the mandatory allocations.
123
125
  @mandatories = []
124
126
  @allocate.each do |allocation|
@@ -504,34 +506,21 @@ class TaskJuggler
504
506
  task = dependency.task
505
507
  limit = task[dependency.onEnd ? 'end' : 'start', @scenarioIdx]
506
508
  next if limit.nil?
507
- if @start < limit
509
+ if @start < limit ||
510
+ (dependency.gapDuration > 0 &&
511
+ limit + dependency.gapDuration > @start) ||
512
+ (dependency.gapLength > 0 &&
513
+ calcLength(limit, @start) < dependency.gapLength)
508
514
  error('task_pred_before',
509
- "Task #{@property.fullId} (#{@start}) must start after " +
515
+ "Task #{@property.fullId} (#{@start}) must start " +
516
+ (dependency.gapDuration > 0 ?
517
+ "#{dependency.gapDuration / (60 * 60 * 24)} days " :
518
+ (dependency.gapLength > 0 ?
519
+ "#{@project.slotsToDays(dependency.gapLength)} " +
520
+ "working days " : '')) +
521
+ "after " +
510
522
  "#{dependency.onEnd ? 'end' : 'start'} (#{limit}) of task " +
511
- "#{task.fullId}.")
512
- end
513
- if dependency.gapDuration > 0
514
- if limit + dependency.gapDuration > @start
515
- error('task_pred_before_gd',
516
- "Task #{@property.fullId} must start " +
517
- "#{dependency.gapDuration / (60 * 60 * 24)} days after " +
518
- "#{dependency.onEnd ? 'end' : 'start'} of task " +
519
- "#{task.fullId}. TaskJuggler cannot enforce this condition " +
520
- "because the task is scheduled ALAP (finish-to-start) or " +
521
- "has a fixed #{dependency.onEnd ? 'end' : 'start'} date.")
522
- end
523
- end
524
- if dependency.gapLength > 0
525
- if calcLength(limit, @start) < dependency.gapLength
526
- error('task_pred_before_gl',
527
- "Task #{@property.fullId} must start " +
528
- "#{@project.slotsToDays(dependency.gapLength)} " +
529
- "working days after " +
530
- "#{dependency.onEnd ? 'end' : 'start'} of task " +
531
- "#{task.fullId}. TaskJuggler cannot enforce this condition " +
532
- "because the task is scheduled ALAP (finish-to-start) or " +
533
- "has a fixed #{dependency.onEnd ? 'end' : 'start'} date.")
534
- end
523
+ "#{task.fullId}. This condition could not be met.")
535
524
  end
536
525
  end
537
526
 
@@ -540,34 +529,21 @@ class TaskJuggler
540
529
  task = dependency.task
541
530
  limit = task[dependency.onEnd ? 'end' : 'start', @scenarioIdx]
542
531
  next if limit.nil?
543
- if limit < @end
532
+ if limit < @end ||
533
+ (dependency.gapDuration > 0 &&
534
+ limit - dependency.gapDuration < @end) ||
535
+ (dependency.gapLength > 0 &&
536
+ calcLength(@end, limit) < dependency.gapLength)
544
537
  error('task_succ_after',
545
- "Task #{@property.fullId} (#{@end}) must end before " +
538
+ "Task #{@property.fullId} (#{@end}) must end " +
539
+ (dependency.gapDuration > 0 ?
540
+ "#{dependency.gapDuration / (60 * 60 * 24)} days " :
541
+ (dependency.gapLength > 0 ?
542
+ "#{@project.slotsToDays(dependency.gapLength)} " +
543
+ "working days " : '')) +
544
+ "before " +
546
545
  "#{dependency.onEnd ? 'end' : 'start'} (#{limit}) of task " +
547
- "#{task.fullId}.")
548
- end
549
- if dependency.gapDuration > 0
550
- if limit - dependency.gapDuration < @end
551
- error('task_succ_after_gd',
552
- "Task #{@property.fullId} must end " +
553
- "#{dependency.gapDuration / (60 * 60 * 24)} days before " +
554
- "#{dependency.onEnd ? 'end' : 'start'} of task " +
555
- "#{task.fullId}. TaskJuggler cannot enforce this condition " +
556
- "because the task is scheduled ASAP (start-to-finish) or " +
557
- "has a fixed #{dependency.onEnd ? 'end' : 'start'} date.")
558
- end
559
- end
560
- if dependency.gapLength > 0
561
- if calcLength(@end, limit) < dependency.gapLength
562
- error('task_succ_after_gl',
563
- "Task #{@property.fullId} must end " +
564
- "#{@project.slotsToDays(dependency.gapLength)} " +
565
- "working days before " +
566
- "#{dependency.onEnd ? 'end' : 'start'} of task " +
567
- "#{task.fullId}. TaskJuggler cannot enforce this condition " +
568
- "because the task is scheduled ASAP (start-to-finish) or " +
569
- "has a fixed #{dependency.onEnd ? 'end' : 'start'} date.")
570
- end
546
+ "#{task.fullId}. This condition could not be met.")
571
547
  end
572
548
  end
573
549
 
@@ -994,6 +970,15 @@ class TaskJuggler
994
970
  # For leaf tasks, propagate start may set the date. Container task dates
995
971
  # are only set in scheduleContainer().
996
972
  if @property.leaf?
973
+ # If we already have a date, we will only shrink the task period with
974
+ # the new date.
975
+ if (setDate = instance_variable_get('@' + thisEnd)) &&
976
+ atEnd ? date > setDate : date < setDate
977
+ Log.msg { "Preserving #{thisEnd} date of #{typename} " +
978
+ "#{@property.fullId}: #{setDate}" }
979
+ return
980
+ end
981
+
997
982
  instance_variable_set(('@' + thisEnd).intern, date)
998
983
  typename = 'Task'
999
984
  if @durationType == :startEndTask
@@ -1203,10 +1188,10 @@ class TaskJuggler
1203
1188
  # task B depends on A and they are specified this way:
1204
1189
  # task A: | --> D-
1205
1190
  # task B: -D <-- |
1206
- if @end && startDate > @end
1207
- error('weak_start_dep',
1208
- "Task #{@property.fullId} has a too weak start dependencies " +
1209
- "to be scheduled properly.")
1191
+ if @end && (startDate.nil? || startDate > @end)
1192
+ error('impossible_start_dep',
1193
+ "Task #{@property.fullId} has start date dependencies " +
1194
+ "that conflict with the end date #{@end}.")
1210
1195
  end
1211
1196
 
1212
1197
  startDate
@@ -1260,10 +1245,10 @@ class TaskJuggler
1260
1245
  # task A precedes B and they are specified this way:
1261
1246
  # task A: | --> D-
1262
1247
  # task B: -D <-- |
1263
- if @start && (endDate.nil? || endDate > @start)
1264
- error('weak_end_dep',
1265
- "Task #{@property.fullId} has a too weak end dependencies " +
1266
- "to be scheduled properly.")
1248
+ if @start && (endDate.nil? || endDate < @start)
1249
+ error('impossible_end_dep',
1250
+ "Task #{@property.fullId} has end date dependencies " +
1251
+ "that conflict with the start date #{@start}.")
1267
1252
  end
1268
1253
 
1269
1254
  endDate
@@ -1341,7 +1326,6 @@ class TaskJuggler
1341
1326
  query.string = query.scaleLoad(effort)
1342
1327
  end
1343
1328
 
1344
-
1345
1329
  # The remaining (as of 'now') effort allocated for the task in the
1346
1330
  # specified interval. In case a Resource is given as scope property only
1347
1331
  # the effort allocated for this resource is taken into account.
@@ -1755,7 +1739,7 @@ class TaskJuggler
1755
1739
  when :lengthTask
1756
1740
  bookResources
1757
1741
  # The doneLength is only increased for global working time slots.
1758
- @doneLength += 1 if @project.isWorkingTime(@currentSlotIdx)
1742
+ @doneLength += 1 if onShift?(@currentSlotIdx)
1759
1743
 
1760
1744
  # If we have reached the specified duration or lengths, we set the end
1761
1745
  # or start date and propagate the value to neighbouring tasks.
@@ -1931,11 +1915,6 @@ class TaskJuggler
1931
1915
  end
1932
1916
 
1933
1917
  @doneEffort += r['efficiency', @scenarioIdx]
1934
- # Limits do not take efficiency into account. Limits are usage limits,
1935
- # not effort limits.
1936
- @allLimits.each do |limit|
1937
- limit.inc(@currentSlotIdx, resource)
1938
- end
1939
1918
 
1940
1919
  unless @assignedresources.include?(r)
1941
1920
  @assignedresources << r
@@ -1946,12 +1925,21 @@ class TaskJuggler
1946
1925
  # the same resources and are potentially delaying the progress of
1947
1926
  # this Task.
1948
1927
  @competitors << competitor unless @competitors.include?(competitor)
1928
+ @contendedResources[competitor][r] += 1
1949
1929
  end
1950
1930
  end
1951
1931
 
1952
1932
  booked
1953
1933
  end
1954
1934
 
1935
+ def onShift?(sbIdx)
1936
+ if @shifts && @shifts.assigned?(sbIdx)
1937
+ return @shifts.onShift?(sbIdx)
1938
+ else
1939
+ return @project.isWorkingTime(sbIdx)
1940
+ end
1941
+ end
1942
+
1955
1943
  # Check if all of the task limits are not exceded at the given _sbIdx_. If
1956
1944
  # a _resource_ is provided, the limit for that particular resource is
1957
1945
  # checked. If no resource is provided, only non-resource-specific limits
@@ -1963,6 +1951,15 @@ class TaskJuggler
1963
1951
  true
1964
1952
  end
1965
1953
 
1954
+ # Limits do not take efficiency into account. Limits are usage limits, not
1955
+ # effort limits.
1956
+ def incLimits(sbIdx, resource = nil)
1957
+ @allLimits.each do |limit|
1958
+ limit.inc(sbIdx, resource)
1959
+ end
1960
+ end
1961
+
1962
+
1966
1963
  # Calculate the number of general working time slots between the TjTime
1967
1964
  # objects _d1_ and _d2_.
1968
1965
  def calcLength(d1, d2)
@@ -2041,7 +2038,7 @@ class TaskJuggler
2041
2038
  startIdx = @project.dateToIdx(date = @start)
2042
2039
  endIdx = @project.dateToIdx(@project['now'])
2043
2040
  startIdx.upto(endIdx) do |idx|
2044
- @doneLength += 1 if @project.isWorkingTime(idx)
2041
+ @doneLength += 1 if onShift?(idx)
2045
2042
  date += slotDuration
2046
2043
  # Continue not only until the @length has been reached, but also
2047
2044
  # the tentativeEnd date. This allows us to detect overbookings.
@@ -2169,15 +2166,41 @@ class TaskJuggler
2169
2166
  end
2170
2167
 
2171
2168
  def markAsRunaway
2172
- warning('runaway', "Task #{@property.fullId} does not fit into " +
2173
- "project time frame")
2174
-
2175
2169
  @isRunAway = true
2170
+ remainingEffort =
2171
+ @project.convertToDailyLoad(@project['scheduleGranularity'] *
2172
+ (@effort - @doneEffort))
2173
+ warning('runaway', "#{remainingEffort}d of effort of task " +
2174
+ "#{@property.fullId} " +
2175
+ "does not fit into the project time frame. ")
2176
+ unless @competitors.empty?
2177
+ multi = @competitors.length > 1
2178
+ info('runaway_tasks',
2179
+ "The following task#{multi ? 's' : ''} " +
2180
+ "compete#{multi ? '' : 's'} for the same resources that " +
2181
+ "this task is requesting: ")
2182
+ @competitors.each do |t|
2183
+ res = @contendedResources[t].to_a
2184
+ res.sort! { |i, j| j[1] <=> i[1] }
2185
+ resList = res.map { |r| "#{r[0].id}(#{r[1]})" }.join(', ')
2186
+ info('runaway_competitor',
2187
+ "Task #{t.fullId} has conflicts for the following " +
2188
+ "resource#{res.length > 1 ? 's' : ''}: #{resList}",
2189
+ t.sourceFileInfo)
2190
+ end
2191
+ end
2176
2192
  end
2177
2193
 
2178
2194
  # This function determines if a task is a milestones and marks it
2179
2195
  # accordingly.
2180
2196
  def markAsMilestone
2197
+ # Containers may not be milestones
2198
+ if @milestone && @property.container?
2199
+ error('container_milestone',
2200
+ "Container task #{@property.fullId} may not be marked " +
2201
+ "as a milestone.")
2202
+ end
2203
+
2181
2204
  return if @property.container? || @hasDurationSpec ||
2182
2205
  !@booking.empty? || !@allocate.empty?
2183
2206
 
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = TernarySearchTree.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = TextFormatter.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = TextParser.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = MacroTable.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = Pattern.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
7
7
  # by Chris Schlaeger <chris@linux.com>
8
8
  #
9
9
  # This program is free software; you can redistribute it and/or modify