taskjuggler 3.3.0 → 3.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +35 -0
- data/data/tjp.vim +21 -7
- data/lib/taskjuggler/Allocation.rb +27 -3
- data/lib/taskjuggler/Attributes.rb +3 -2
- data/lib/taskjuggler/HTMLDocument.rb +3 -1
- data/lib/taskjuggler/KateSyntax.rb +213 -0
- data/lib/taskjuggler/Limits.rb +22 -0
- data/lib/taskjuggler/Log.rb +1 -1
- data/lib/taskjuggler/MessageHandler.rb +20 -10
- data/lib/taskjuggler/PTNProxy.rb +6 -1
- data/lib/taskjuggler/Project.rb +10 -4
- data/lib/taskjuggler/ProjectFileParser.rb +1 -2
- data/lib/taskjuggler/ProjectFileScanner.rb +41 -42
- data/lib/taskjuggler/ResourceScenario.rb +41 -1
- data/lib/taskjuggler/RichText/Element.rb +8 -0
- data/lib/taskjuggler/RichText/Parser.rb +1 -1
- data/lib/taskjuggler/RichText/RTFReportLink.rb +20 -10
- data/lib/taskjuggler/RichText/Scanner.rb +54 -38
- data/lib/taskjuggler/RichText/SyntaxRules.rb +12 -0
- data/lib/taskjuggler/SheetReceiver.rb +1 -1
- data/lib/taskjuggler/TableColumnDefinition.rb +5 -1
- data/lib/taskjuggler/TaskJuggler.rb +2 -2
- data/lib/taskjuggler/TaskScenario.rb +117 -33
- data/lib/taskjuggler/TextParser.rb +2 -4
- data/lib/taskjuggler/TextParser/MacroTable.rb +7 -0
- data/lib/taskjuggler/TextParser/Scanner.rb +10 -9
- data/lib/taskjuggler/Tj3Config.rb +1 -1
- data/lib/taskjuggler/TjTime.rb +5 -28
- data/lib/taskjuggler/TjpSyntaxRules.rb +85 -13
- data/lib/taskjuggler/UTF8String.rb +5 -0
- data/lib/taskjuggler/XMLElement.rb +2 -1
- data/lib/taskjuggler/apps/Tj3.rb +29 -5
- data/lib/taskjuggler/daemon/ProcessIntercom.rb +1 -1
- data/lib/taskjuggler/daemon/ProjectServer.rb +5 -2
- data/lib/taskjuggler/daemon/ReportServer.rb +7 -4
- data/lib/taskjuggler/reports/AccountListRE.rb +2 -0
- data/lib/taskjuggler/reports/CSVFile.rb +24 -2
- data/lib/taskjuggler/reports/GanttChart.rb +3 -2
- data/lib/taskjuggler/reports/GanttHeader.rb +18 -18
- data/lib/taskjuggler/reports/GanttLoadStack.rb +1 -1
- data/lib/taskjuggler/reports/MspXmlRE.rb +5 -1
- data/lib/taskjuggler/reports/Report.rb +29 -18
- data/lib/taskjuggler/reports/ReportTable.rb +5 -1
- data/lib/taskjuggler/reports/ReportTableCell.rb +16 -10
- data/lib/taskjuggler/reports/ResourceListRE.rb +2 -0
- data/lib/taskjuggler/reports/TableReport.rb +23 -16
- data/lib/taskjuggler/reports/TaskListRE.rb +2 -0
- data/lib/taskjuggler/reports/TraceReport.rb +1 -1
- data/manual/Installation +5 -1
- data/manual/Intro +1 -0
- data/manual/Rich_Text_Attributes +5 -0
- data/manual/TaskJuggler_Internals +82 -34
- data/manual/Tutorial +1 -1
- data/manual/html/Day_To_Day_Juggling.html +1 -1
- data/manual/html/Getting_Started.html +1 -1
- data/manual/html/How_To_Contribute.html +1 -1
- data/manual/html/Installation.html +3 -2
- data/manual/html/Intro.html +2 -1
- data/manual/html/Reporting_Bugs.html +1 -1
- data/manual/html/Rich_Text_Attributes.html +2 -1
- data/manual/html/Software.html +1 -1
- data/manual/html/TaskJuggler_2x_Migration.html +1 -1
- data/manual/html/TaskJuggler_Internals.html +15 -13
- data/manual/html/The_TaskJuggler_Syntax.html +1 -1
- data/manual/html/Tutorial.html +2 -2
- data/manual/html/account.html +1 -1
- data/manual/html/account.task.html +1 -1
- data/manual/html/accountprefix.html +1 -1
- data/manual/html/accountreport.html +14 -2
- data/manual/html/accountroot.html +1 -1
- data/manual/html/active.html +1 -1
- data/manual/html/adopt.task.html +1 -1
- data/manual/html/aggregate.html +1 -1
- data/manual/html/alert.html +1 -1
- data/manual/html/alertlevels.html +1 -1
- data/manual/html/allocate.html +1 -1
- data/manual/html/alphabet.html +1 -1
- data/manual/html/alternative.html +1 -1
- data/manual/html/author.html +3 -3
- data/manual/html/auxdir.html +69 -0
- data/manual/html/balance.html +3 -3
- data/manual/html/booking.resource.html +1 -1
- data/manual/html/booking.task.html +1 -1
- data/manual/html/caption.html +1 -1
- data/manual/html/cellcolor.column.html +1 -1
- data/manual/html/celltext.column.html +1 -1
- data/manual/html/center.html +1 -1
- data/manual/html/charge.html +1 -1
- data/manual/html/chargeset.html +1 -1
- data/manual/html/columnid.html +21 -9
- data/manual/html/columns.html +2 -2
- data/manual/html/complete.html +1 -1
- data/manual/html/copyright.html +1 -1
- data/manual/html/credits.html +1 -1
- data/manual/html/currency.html +1 -1
- data/manual/html/currencyformat.html +1 -1
- data/manual/html/dailymax.html +1 -1
- data/manual/html/dailymin.html +1 -1
- data/manual/html/dailyworkinghours.html +1 -1
- data/manual/html/date.extend.html +1 -1
- data/manual/html/date.html +1 -1
- data/manual/html/definitions.html +1 -1
- data/manual/html/depends.html +1 -1
- data/manual/html/details.html +1 -1
- data/manual/html/disabled.html +1 -1
- data/manual/html/duration.html +1 -1
- data/manual/html/efficiency.html +1 -1
- data/manual/html/effort.html +1 -1
- data/manual/html/email.html +1 -1
- data/manual/html/enabled.html +1 -1
- data/manual/html/end.column.html +1 -1
- data/manual/html/end.html +1 -1
- data/manual/html/end.limit.html +1 -1
- data/manual/html/end.report.html +1 -1
- data/manual/html/end.timesheet.html +1 -1
- data/manual/html/endcredit.html +1 -1
- data/manual/html/epilog.html +1 -1
- data/manual/html/export.html +1 -1
- data/manual/html/extend.html +1 -1
- data/manual/html/fail.html +1 -1
- data/manual/html/fdl.html +1 -1
- data/manual/html/flags.account.html +1 -1
- data/manual/html/flags.html +1 -1
- data/manual/html/flags.journalentry.html +1 -1
- data/manual/html/flags.report.html +1 -1
- data/manual/html/flags.resource.html +1 -1
- data/manual/html/flags.statussheet.html +1 -1
- data/manual/html/flags.task.html +1 -1
- data/manual/html/flags.timesheet.html +1 -1
- data/manual/html/fontcolor.column.html +1 -1
- data/manual/html/footer.html +1 -1
- data/manual/html/formats.export.html +1 -1
- data/manual/html/formats.html +1 -1
- data/manual/html/functions.html +1 -1
- data/manual/html/gapduration.html +1 -1
- data/manual/html/gaplength.html +1 -1
- data/manual/html/halign.center.html +1 -1
- data/manual/html/halign.column.html +1 -1
- data/manual/html/halign.left.html +1 -1
- data/manual/html/halign.right.html +1 -1
- data/manual/html/hasalert.html +1 -1
- data/manual/html/header.html +1 -1
- data/manual/html/headline.html +1 -1
- data/manual/html/height.html +1 -1
- data/manual/html/hideaccount.html +1 -1
- data/manual/html/hidejournalentry.html +1 -1
- data/manual/html/hidereport.html +1 -1
- data/manual/html/hideresource.html +1 -1
- data/manual/html/hidetask.html +1 -1
- data/manual/html/icalreport.html +1 -1
- data/manual/html/include.macro.html +1 -1
- data/manual/html/include.project.html +1 -1
- data/manual/html/include.properties.html +1 -1
- data/manual/html/index.html +1 -1
- data/manual/html/inherit.extend.html +1 -1
- data/manual/html/interval1.html +1 -1
- data/manual/html/interval2.html +1 -1
- data/manual/html/interval3.html +1 -1
- data/manual/html/interval4.html +1 -1
- data/manual/html/isactive.html +1 -1
- data/manual/html/ischildof.html +1 -1
- data/manual/html/isdependencyof.html +1 -1
- data/manual/html/isdutyof.html +1 -1
- data/manual/html/isfeatureof.html +1 -1
- data/manual/html/isleaf.html +1 -1
- data/manual/html/ismilestone.html +1 -1
- data/manual/html/isongoing.html +1 -1
- data/manual/html/isresource.html +1 -1
- data/manual/html/isresponsibilityof.html +1 -1
- data/manual/html/istask.html +1 -1
- data/manual/html/journalattributes.html +1 -1
- data/manual/html/journalentry.html +1 -1
- data/manual/html/journalmode.html +1 -1
- data/manual/html/leaveallowance.html +1 -1
- data/manual/html/leaves.html +1 -1
- data/manual/html/left.html +1 -1
- data/manual/html/length.html +1 -1
- data/manual/html/limits.allocate.html +1 -1
- data/manual/html/limits.html +1 -1
- data/manual/html/limits.resource.html +1 -1
- data/manual/html/limits.task.html +1 -1
- data/manual/html/listitem.column.html +1 -1
- data/manual/html/listtype.column.html +1 -1
- data/manual/html/loadunit.html +1 -1
- data/manual/html/logicalexpression.html +1 -1
- data/manual/html/logicalflagexpression.html +1 -1
- data/manual/html/macro.html +1 -1
- data/manual/html/managers.html +1 -1
- data/manual/html/mandatory.html +1 -1
- data/manual/html/maxend.html +1 -1
- data/manual/html/maximum.html +1 -1
- data/manual/html/maxstart.html +1 -1
- data/manual/html/milestone.html +1 -1
- data/manual/html/minend.html +1 -1
- data/manual/html/minimum.html +1 -1
- data/manual/html/minstart.html +1 -1
- data/manual/html/monthlymax.html +1 -1
- data/manual/html/monthlymin.html +1 -1
- data/manual/html/navbar.html +9 -1
- data/manual/html/navigator.html +1 -1
- data/manual/html/newtask.html +1 -1
- data/manual/html/nikureport.html +1 -1
- data/manual/html/note.task.html +1 -1
- data/manual/html/now.html +1 -1
- data/manual/html/numberformat.html +1 -1
- data/manual/html/onend.html +1 -1
- data/manual/html/onstart.html +1 -1
- data/manual/html/opennodes.html +1 -1
- data/manual/html/overtime.booking.html +1 -1
- data/manual/html/period.column.html +1 -1
- data/manual/html/period.limit.html +1 -1
- data/manual/html/period.report.html +1 -1
- data/manual/html/period.task.html +1 -1
- data/manual/html/persistent.html +1 -1
- data/manual/html/precedes.html +1 -1
- data/manual/html/priority.html +1 -1
- data/manual/html/priority.timesheet.html +1 -1
- data/manual/html/project.html +1 -1
- data/manual/html/projectid.html +1 -1
- data/manual/html/projectid.task.html +1 -1
- data/manual/html/projectids.html +1 -1
- data/manual/html/projection.html +1 -1
- data/manual/html/prolog.html +1 -1
- data/manual/html/properties.html +1 -1
- data/manual/html/purge.html +1 -1
- data/manual/html/rate.html +1 -1
- data/manual/html/rate.resource.html +3 -3
- data/manual/html/rawhtmlhead.html +68 -0
- data/manual/html/reference.extend.html +3 -3
- data/manual/html/remaining.html +1 -1
- data/manual/html/replace.html +1 -1
- data/manual/html/reportprefix.html +1 -1
- data/manual/html/resource.html +1 -1
- data/manual/html/resourceattributes.html +1 -1
- data/manual/html/resourceprefix.html +1 -1
- data/manual/html/resourcereport.html +14 -2
- data/manual/html/resourceroot.html +1 -1
- data/manual/html/resources.limit.html +1 -1
- data/manual/html/responsible.html +1 -1
- data/manual/html/richtext.extend.html +1 -1
- data/manual/html/right.html +1 -1
- data/manual/html/rollupaccount.html +1 -1
- data/manual/html/rollupresource.html +1 -1
- data/manual/html/rolluptask.html +1 -1
- data/manual/html/scale.column.html +1 -1
- data/manual/html/scenario.html +1 -1
- data/manual/html/scenario.ical.html +1 -1
- data/manual/html/scenarios.export.html +1 -1
- data/manual/html/scenarios.html +1 -1
- data/manual/html/scenariospecific.extend.html +1 -1
- data/manual/html/scheduled.html +1 -1
- data/manual/html/scheduling.html +2 -1
- data/manual/html/select.html +1 -1
- data/manual/html/selfcontained.html +1 -1
- data/manual/html/shift.allocate.html +1 -1
- data/manual/html/shift.html +1 -1
- data/manual/html/shift.resource.html +1 -1
- data/manual/html/shift.task.html +1 -1
- data/manual/html/shift.timesheet.html +1 -1
- data/manual/html/shifts.allocate.html +1 -1
- data/manual/html/shifts.resource.html +1 -1
- data/manual/html/shifts.task.html +1 -1
- data/manual/html/shorttimeformat.html +1 -1
- data/manual/html/sloppy.booking.html +1 -1
- data/manual/html/sloppy.projection.html +1 -1
- data/manual/html/sortaccounts.html +1 -1
- data/manual/html/sortjournalentries.html +1 -1
- data/manual/html/sortresources.html +1 -1
- data/manual/html/sorttasks.html +1 -1
- data/manual/html/start.column.html +1 -1
- data/manual/html/start.html +1 -1
- data/manual/html/start.limit.html +1 -1
- data/manual/html/start.report.html +1 -1
- data/manual/html/startcredit.html +1 -1
- data/manual/html/status.statussheet.html +1 -1
- data/manual/html/status.timesheet.html +1 -1
- data/manual/html/statussheet.html +1 -1
- data/manual/html/statussheetreport.html +1 -1
- data/manual/html/strict.projection.html +1 -1
- data/manual/html/summary.html +1 -1
- data/manual/html/supplement.html +1 -1
- data/manual/html/supplement.resource.html +1 -1
- data/manual/html/supplement.task.html +1 -1
- data/manual/html/tagfile.html +2 -2
- data/manual/html/task.html +1 -1
- data/manual/html/task.statussheet.html +1 -1
- data/manual/html/task.timesheet.html +1 -1
- data/manual/html/taskattributes.html +1 -1
- data/manual/html/taskprefix.html +1 -1
- data/manual/html/taskreport.html +14 -2
- data/manual/html/taskroot.export.html +1 -1
- data/manual/html/taskroot.html +1 -1
- data/manual/html/text.extend.html +1 -1
- data/manual/html/textreport.html +14 -2
- data/manual/html/timeformat.html +3 -3
- data/manual/html/timeformat1.html +67 -0
- data/manual/html/timeformat2.html +67 -0
- data/manual/html/timeoff.nikureport.html +3 -3
- data/manual/html/timesheet.html +1 -1
- data/manual/html/timesheetreport.html +1 -1
- data/manual/html/timezone.export.html +1 -1
- data/manual/html/timezone.html +1 -1
- data/manual/html/timezone.report.html +1 -1
- data/manual/html/timezone.shift.html +1 -1
- data/manual/html/timingresolution.html +1 -1
- data/manual/html/title.column.html +1 -1
- data/manual/html/title.html +1 -1
- data/manual/html/toc.html +270 -242
- data/manual/html/tooltip.column.html +1 -1
- data/manual/html/tracereport.html +14 -2
- data/manual/html/trackingscenario.html +1 -1
- data/manual/html/treelevel.html +1 -1
- data/manual/html/vacation.html +1 -1
- data/manual/html/vacation.resource.html +1 -1
- data/manual/html/vacation.shift.html +1 -1
- data/manual/html/warn.html +1 -1
- data/manual/html/weeklymax.html +1 -1
- data/manual/html/weeklymin.html +1 -1
- data/manual/html/weekstartsmonday.html +1 -1
- data/manual/html/weekstartssunday.html +1 -1
- data/manual/html/width.column.html +1 -1
- data/manual/html/width.html +1 -1
- data/manual/html/work.html +1 -1
- data/manual/html/workinghours.project.html +1 -1
- data/manual/html/workinghours.resource.html +1 -1
- data/manual/html/workinghours.shift.html +1 -1
- data/manual/html/yearlyworkingdays.html +1 -1
- data/tasks/kate.rake +8 -0
- data/test/TestSuite/HTML-Reports/Calendars.tjp +10 -0
- data/test/TestSuite/Scheduler/Correct/PersistentResources-2.tjp +33 -0
- data/test/TestSuite/Scheduler/Correct/PersistentResources.tjp +30 -0
- data/test/TestSuite/Scheduler/Correct/PriorityInversion.tjp +2 -0
- data/test/TestSuite/Syntax/Correct/Macro-4.tjp +4 -0
- data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
- data/test/test_BatchProcessor.rb +1 -1
- data/test/test_CSVFile.rb +10 -0
- data/test/test_RichText.rb +20 -0
- metadata +38 -9
@@ -39,6 +39,8 @@ class TaskJuggler
|
|
39
39
|
'balance' => [ 'Balance', true, :right, true ],
|
40
40
|
'bsi' => [ 'BSI', false, :left, false ],
|
41
41
|
'closedtasks' => [ 'Closed Tasks', true, :right, true ],
|
42
|
+
'competitorcount' => [ 'Competitor count', true, :right, true ],
|
43
|
+
'competitors' => [ 'Competitors', true, :left, true ],
|
42
44
|
'complete' => [ 'Completion', false, :right, true ],
|
43
45
|
'cost' => [ 'Cost', true, :right, true ],
|
44
46
|
'duration' => [ 'Duration', true, :right, true ],
|
@@ -66,6 +68,7 @@ class TaskJuggler
|
|
66
68
|
'responsible' => [ 'Responsible', false, :left, true ],
|
67
69
|
'revenue' => [ 'Revenue', true, :right, true ],
|
68
70
|
'scenario' => [ 'Scenario', false, :left, true ],
|
71
|
+
'scheduling' => [ 'Scheduling Mode', true, :left, true ],
|
69
72
|
'sickleave' => [ 'Sick Leave', true, :right, true ],
|
70
73
|
'specialleave' => [ 'Special Leave', true, :right, true ],
|
71
74
|
'status' => [ 'Status', false, :left, true ],
|
@@ -336,7 +339,7 @@ class TaskJuggler
|
|
336
339
|
# set so that the lines of the Gantt chart line up with the lines of the
|
337
340
|
# table.
|
338
341
|
gantt = GanttChart.new(a('now'),
|
339
|
-
a('weekStartsMonday'), self)
|
342
|
+
a('weekStartsMonday'), columnDef, self)
|
340
343
|
|
341
344
|
gantt.generateByScale(rStart, rEnd, columnDef.scale)
|
342
345
|
# The header consists of 2 lines separated by a 1 pixel boundary.
|
@@ -352,23 +355,23 @@ class TaskJuggler
|
|
352
355
|
@table.equiLines = true
|
353
356
|
when 'hourly'
|
354
357
|
genCalChartHeader(columnDef, rStart.midnight, rEnd, :sameTimeNextHour,
|
355
|
-
|
358
|
+
'%A %Y-%m-%d', '%H')
|
356
359
|
when 'daily'
|
357
360
|
genCalChartHeader(columnDef, rStart.midnight, rEnd, :sameTimeNextDay,
|
358
|
-
|
361
|
+
'%b %Y', '%d')
|
359
362
|
when 'weekly'
|
360
363
|
genCalChartHeader(columnDef,
|
361
364
|
rStart.beginOfWeek(a('weekStartsMonday')), rEnd,
|
362
|
-
:sameTimeNextWeek,
|
365
|
+
:sameTimeNextWeek, '%b %Y', '%d')
|
363
366
|
when 'monthly'
|
364
367
|
genCalChartHeader(columnDef, rStart.beginOfMonth, rEnd,
|
365
|
-
:sameTimeNextMonth,
|
368
|
+
:sameTimeNextMonth, '%Y', '%b')
|
366
369
|
when 'quarterly'
|
367
370
|
genCalChartHeader(columnDef, rStart.beginOfQuarter, rEnd,
|
368
|
-
:sameTimeNextQuarter,
|
371
|
+
:sameTimeNextQuarter, '%Y', 'Q%Q')
|
369
372
|
when 'yearly'
|
370
373
|
genCalChartHeader(columnDef, rStart.beginOfYear, rEnd, :sameTimeNextYear,
|
371
|
-
nil,
|
374
|
+
nil, '%Y')
|
372
375
|
else
|
373
376
|
# This is the most common case. It does not need any special treatment.
|
374
377
|
# We just set the pre-defined or user-defined column title in the first
|
@@ -543,11 +546,15 @@ class TaskJuggler
|
|
543
546
|
# each hour, day, week, etc. _columnDef_ is the definition of the columns.
|
544
547
|
# _t_ is the start time for the calendar. _sameTimeNextFunc_ is a function
|
545
548
|
# that is called to advance _t_ to the next table column interval.
|
546
|
-
#
|
547
|
-
# title of the particular column.
|
549
|
+
# _timeformat1_ and _timeformat2_ are strftime format Strings that are used
|
550
|
+
# to generate the upper and lower title of the particular column.
|
548
551
|
def genCalChartHeader(columnDef, t, rEnd, sameTimeNextFunc,
|
549
|
-
|
552
|
+
timeformat1, timeformat2)
|
550
553
|
tableColumn = ReportTableColumn.new(@table, columnDef, '')
|
554
|
+
# Overwrite the built-in time formats if the user specified a different
|
555
|
+
# one.
|
556
|
+
timeformat1 = columnDef.timeformat1 if columnDef.timeformat1
|
557
|
+
timeformat2 = columnDef.timeformat2 if columnDef.timeformat2
|
551
558
|
|
552
559
|
# Calendar chars only work when all lines have same height.
|
553
560
|
@table.equiLines = true
|
@@ -559,6 +566,7 @@ class TaskJuggler
|
|
559
566
|
# Create the table that is embedded in this column.
|
560
567
|
tableColumn.cell1.special = table = ColumnTable.new
|
561
568
|
table.equiLines = true
|
569
|
+
table.selfcontained = a('selfcontained')
|
562
570
|
tableColumn.cell2.hidden = true
|
563
571
|
table.viewWidth = columnDef.width ? columnDef.width : 450
|
564
572
|
|
@@ -569,12 +577,12 @@ class TaskJuggler
|
|
569
577
|
while t < rEnd
|
570
578
|
cellsInInterval = 0
|
571
579
|
# Label for upper scale. The yearly calendar only has a lower scale.
|
572
|
-
currentInterval = t.
|
580
|
+
currentInterval = t.to_s(timeformat1) if timeformat1
|
573
581
|
firstColumn = nil
|
574
582
|
# The innter loops terminates when the label for the upper scale has
|
575
583
|
# changed to the next scale cell.
|
576
|
-
while t < rEnd && (
|
577
|
-
t.
|
584
|
+
while t < rEnd && (timeformat1.nil? ||
|
585
|
+
t.to_s(timeformat1) == currentInterval)
|
578
586
|
# call TjTime::sameTimeNext... function to get the end of the column.
|
579
587
|
nextT = t.send(sameTimeNextFunc)
|
580
588
|
iv = TimeInterval.new(t, nextT)
|
@@ -586,11 +594,11 @@ class TaskJuggler
|
|
586
594
|
# all lower scale cells that belong to this upper cell.
|
587
595
|
if firstColumn.nil?
|
588
596
|
firstColumn = column
|
589
|
-
column.cell1.text = currentInterval
|
597
|
+
column.cell1.text = currentInterval
|
590
598
|
else
|
591
599
|
column.cell1.hidden = true
|
592
600
|
end
|
593
|
-
column.cell2.text = t.
|
601
|
+
column.cell2.text = t.to_s(timeformat2)
|
594
602
|
# We assume an average of 7 pixel per character
|
595
603
|
width = 8 + 7 * column.cell2.text.length
|
596
604
|
# Ensure a minimum with of 28 to have good looking tables even with
|
@@ -1135,7 +1143,6 @@ class TaskJuggler
|
|
1135
1143
|
|
1136
1144
|
# Cells for containers should be using bold font face.
|
1137
1145
|
cell.bold = true if property.container? && line.bold
|
1138
|
-
cell.selfcontained = a('selfcontained')
|
1139
1146
|
cell
|
1140
1147
|
end
|
1141
1148
|
|
@@ -88,7 +88,7 @@ class TaskJuggler
|
|
88
88
|
discontinuedColumns = 0
|
89
89
|
if File.exists?(@fileName)
|
90
90
|
begin
|
91
|
-
@table = CSVFile.new.read(@fileName)
|
91
|
+
@table = CSVFile.new(nil, nil).read(@fileName)
|
92
92
|
rescue
|
93
93
|
error('tr_cannot_read_csv',
|
94
94
|
"Cannot read CSV file #{@fileName}: #{$!}")
|
data/manual/Installation
CHANGED
@@ -42,7 +42,11 @@ recommended Ruby version to make full use of TaskJuggler is 1.9.2.
|
|
42
42
|
Ruby 1.9.1 contains some bugs that prevent the multi-core support to
|
43
43
|
work. For users that are not interested in multi-core support, the web
|
44
44
|
server, the time sheet infrastructure and daemon Ruby 1.8.7 is still
|
45
|
-
ok to use. On Windows you need at least Ruby 1.9.2.
|
45
|
+
ok to use. On Windows you need at least Ruby 1.9.2. If you want to
|
46
|
+
use non-ASCII characters, Ruby 1.9.2 or later is required as well.
|
47
|
+
|
48
|
+
You must have configured your system locale to be UTF-8 to work
|
49
|
+
properly with non-ASCII characters.
|
46
50
|
|
47
51
|
See below for instructions on how to use the latest and greates Ruby
|
48
52
|
version in parallel with your distribution Ruby.
|
data/manual/Intro
CHANGED
@@ -124,6 +124,7 @@ that you use those components in accordance with their licenses.
|
|
124
124
|
* Powerful project description language with macro support
|
125
125
|
* Scales well on multi-core or multi-CPU systems
|
126
126
|
* Support for project management teams and revision control systems
|
127
|
+
* Data export to Microsoft Project and Computer Associates Clarity
|
127
128
|
|
128
129
|
==== Web Publishing and Groupware Functions ====
|
129
130
|
|
data/manual/Rich_Text_Attributes
CHANGED
@@ -121,6 +121,11 @@ in nowiki tags.
|
|
121
121
|
|
122
122
|
<nowiki> This is not '''bold''' text. </nowiki>
|
123
123
|
|
124
|
+
You can also insert raw HTML code by enclosing it in
|
125
|
+
'''<nowiki><html>...</html></nowiki>''' tags. For all other output
|
126
|
+
formats, this content will be ignored. There is also no error checking
|
127
|
+
if the code is valid! Use this feature very carefully.
|
128
|
+
|
124
129
|
==== Block and Inline Generators ====
|
125
130
|
|
126
131
|
Block and inline generators are a very powerful extension that allow
|
@@ -2,31 +2,57 @@
|
|
2
2
|
|
3
3
|
This chapter contains information that you don't need to know to use
|
4
4
|
TaskJuggler. It describes internal algorithms that are provided for
|
5
|
-
the curious.
|
5
|
+
the curious.
|
6
6
|
|
7
7
|
=== How the Scheduler works ===
|
8
8
|
|
9
|
+
It's important to understand that the scheduler implementation is not
|
10
|
+
an optimization algorithm. It does not search a solution space and
|
11
|
+
evaluates various alternative results against each other. This has
|
12
|
+
been tried, but for any real-world project, the solution space becomes
|
13
|
+
unmanageable and scheduling runs took hours to complete.
|
14
|
+
|
15
|
+
Instead, we use a heuristic to decide when each task gets its
|
16
|
+
resources assigned. This heuristic is certainly not perfect but has
|
17
|
+
shown good results with fairly moderate computation costs. The
|
18
|
+
following sections contain an overview of the scheduling algorithm.
|
19
|
+
Users are also encouraged to read the actual source code. It can be
|
20
|
+
found in ''''Project.rb'''', ''''TaskScenario.rb'''',
|
21
|
+
''''ResourceScenario.rb'''' and ''''Allocation.rb''''. All these files
|
22
|
+
can be found in the ''''lib/taskjuggler'''' directory. You can also
|
23
|
+
browse the sources on [https://github.com/taskjuggler/TaskJuggler
|
24
|
+
github].
|
25
|
+
|
9
26
|
The scheduler needs to determine the start and end date for all tasks
|
10
|
-
that don't have such dates yet.
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
27
|
+
that don't have such dates yet. To deal with multiple concurrent time
|
28
|
+
zones, all time related events are stored internally as UTC
|
29
|
+
time.Additionally, it allocates resources to tasks. All events such
|
30
|
+
as start or end of a task, or allocation of a resource can only happen
|
31
|
+
aligned with the [[timingresolution|timing resolution]]. This
|
32
|
+
determines the smallest possible allocation period that we call a time
|
33
|
+
slot. The duration of the slot can be set by the user. Possible
|
34
|
+
values are 5, 10, 15, 30 and 60 minutes.
|
17
35
|
|
18
36
|
TaskJuggler keeps a scoreboard for each time slot for each leaf
|
19
|
-
resource.
|
20
|
-
|
37
|
+
resource. Each scoreboard entry specifies whether the resource is
|
38
|
+
unassigned, assigned to a specific task or on leave. This explains why
|
39
|
+
the project duration and number of allocated resources determines the
|
40
|
+
memory usage of the scheduler.
|
21
41
|
|
22
|
-
|
42
|
+
For the scheduling of the project, the scheduler only looks at leave
|
43
|
+
tasks that are not milestones. Container tasks and milestones are
|
44
|
+
scheduled once all necessary information is available. During the
|
45
|
+
scheduling process, leave tasks can have 3 different states.
|
23
46
|
|
24
47
|
# ''''Not ready for scheduling'''': The task is missing a start or
|
25
48
|
end date that depends on another task's date that hasn't been
|
26
49
|
determined yet.
|
27
50
|
# ''''Ready for scheduling'''': The task has at least a start or end
|
28
51
|
date but one of them is still missing or resources have not yet been
|
29
|
-
assigned for all time slots.
|
52
|
+
assigned for all time slots. The scheduling direction (ASAP or ALAP)
|
53
|
+
determines whether the start or end date is needed. ASAP tasks are
|
54
|
+
scheduled from start to end, so they require a start date. ALAP tasks
|
55
|
+
are scheduled from end to start.
|
30
56
|
# ''''Scheduling completed'''': The task has a start and end date and
|
31
57
|
resources have been assigned for all time slots.
|
32
58
|
|
@@ -36,35 +62,40 @@ be in the ready state. If that's not the case, the project schedule
|
|
36
62
|
cannot be determined and an error is raised. In case there are more
|
37
63
|
than one task in the ready state, we need to have a well defined
|
38
64
|
priority of the tasks. This is necessary since those ready tasks may
|
39
|
-
compete for the same resource
|
65
|
+
compete for the same resource in the same time slot.
|
40
66
|
|
41
67
|
The priority can be directly influenced by the user with the
|
42
|
-
[[priority]] attribute.
|
43
|
-
|
44
|
-
|
45
|
-
criticalness
|
46
|
-
|
47
|
-
|
68
|
+
[[priority]] attribute. This user-defined priority always trumps the
|
69
|
+
other internal criteria described below. In case two tasks have the
|
70
|
+
same priority, an additional measure is used. This measure is called
|
71
|
+
path criticalness. The path criticalness is calculated for each leaf
|
72
|
+
task. The path criticalness is a measure for how important the task is
|
73
|
+
to keep the overall project duration (start of first task to end of
|
74
|
+
last task) to a minimum.
|
48
75
|
|
49
76
|
To determine the path criticalness, we first need to determine the
|
50
|
-
resource criticalness. This is a measure for how likely the
|
51
|
-
that have this resource in their allocation list will actually
|
52
|
-
the resource. A resource criticalness larger than 1.0 means that
|
77
|
+
resource criticalness first. This is a measure for how likely the
|
78
|
+
tasks that have this resource in their allocation list will actually
|
79
|
+
get the resource. A resource criticalness larger than 1.0 means that
|
53
80
|
statistically, at least one tasks will not get enough of this
|
54
81
|
resource. This is just a statistical measure based on the total
|
55
82
|
requested allocations and the number of available work time.
|
56
83
|
|
57
84
|
Once we have determined the criticalness of all allocated resources,
|
58
85
|
we can calculate the criticalness of each individual task. This
|
59
|
-
really only matters for effort based tasks. These really need their
|
60
|
-
allocations
|
86
|
+
really only matters for [[effort]] based tasks. These really need their
|
87
|
+
allocations to be finished within a limited amount of time. For
|
88
|
+
[[length]] and [[duration]] tasks, the allocations are by definition
|
61
89
|
optional. The user can still influence the allocation to length and
|
62
|
-
duration tasks by adjusting the priority appropriately.
|
63
|
-
|
64
|
-
of
|
90
|
+
duration tasks by adjusting the priority appropriately. However,
|
91
|
+
there is no guarantee that such tasks will ever get any resources
|
92
|
+
assigned. The criticalness of an effort based task is defined as the
|
93
|
+
average of the criticalness of the resources allocated to this task.
|
65
94
|
|
66
95
|
We also assign a criticalness to milestones. Based on their priority
|
67
|
-
a criticalness between 0 and 2.0 is assigned.
|
96
|
+
a criticalness between 0 and 2.0 is assigned. This is done to reflect
|
97
|
+
the user perception that milestones are usually some important goal
|
98
|
+
of the project.
|
68
99
|
|
69
100
|
The final step is now the computation of the path criticalness for
|
70
101
|
each effort-based leaf task. For each possible chain of task (path)
|
@@ -74,12 +105,22 @@ criticalness of that task.
|
|
74
105
|
|
75
106
|
This heuristic will favor allocations to task with critical resources
|
76
107
|
and long dependency chains. As a result, the critical paths of the
|
77
|
-
project are tried to be kept short.
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
108
|
+
project are tried to be kept short. The user can use the
|
109
|
+
'''criticalness''' and '''pathcriticalness''' [[columnid|columns]] to
|
110
|
+
review the respective values for he project's tasks and resources.
|
111
|
+
|
112
|
+
When the criticalness and pathcriticalness for all leaf resources and
|
113
|
+
tasks has been determined, the leaf tasks are sorted by priority
|
114
|
+
(hight to low), then by pathcricialness (high to low) and then by the
|
115
|
+
index (low to high). In a loop that is terminated when all tasks have
|
116
|
+
been scheduled or an error condition has been detected, the first
|
117
|
+
task that is ready for scheduling is completely scheduled. This means
|
118
|
+
that resources are allocated for all time slots and missing dates are
|
119
|
+
being computed. The newly determined end (for ASAP tasks) or start
|
120
|
+
(for ALAP tasks) date is then propagated to dependent tasks,
|
121
|
+
milestones or parent tasks if needed. This can result in other tasks
|
122
|
+
becoming ready for scheduling and the list is searched again for the
|
123
|
+
first task that is ready for scheduling to be scheduled.
|
83
124
|
|
84
125
|
A task can only be scheduled when it is ready for scheduling. This
|
85
126
|
means that at least the start date for the scheduling process must be
|
@@ -90,3 +131,10 @@ be scheduled from start to end, ALAP tasks from end to start. This is
|
|
90
131
|
important to understand as resource assignments for each time slot
|
91
132
|
will be determined in this order.
|
92
133
|
|
134
|
+
Mixing ASAP and ALAP tasks in the same project is supported but
|
135
|
+
should be used very carefully. It can lead to situations where a
|
136
|
+
lower priority tasks that is earlier in the scheduling process ready
|
137
|
+
for scheduling takes away resources from a higher prioritized task
|
138
|
+
that competes for the same resources. This condition is known is
|
139
|
+
priority inversion. If the scheduler detects such a situation, a
|
140
|
+
warning is generated.
|
data/manual/Tutorial
CHANGED
@@ -652,7 +652,7 @@ definition.
|
|
652
652
|
<[example file="tutorial" tag="overview"]>
|
653
653
|
|
654
654
|
The generated report can be found
|
655
|
-
[http://www.taskjuggler.org/tj3/examples/Overview.html
|
655
|
+
[http://www.taskjuggler.org/tj3/examples/Tutorial/Overview.html
|
656
656
|
here]. It servers as an entry page for the other reports. While it
|
657
657
|
already contains some references, a navigator bar would be handy as
|
658
658
|
well. Fortunately, there is a block generator called 'navigator' to
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<!DOCTYPE>
|
2
|
-
<!-- This file has been generated by tj3man v3.
|
2
|
+
<!-- This file has been generated by tj3man v3.4.0 -->
|
3
3
|
<html lang="en" xml:lang="en">
|
4
4
|
<head>
|
5
5
|
<title>Installation</title>
|
@@ -38,7 +38,8 @@
|
|
38
38
|
<p class="manual">If you are interested in becoming the maintainer for any of the currently unmaintained (and untested) OSes, please contact us via the developer mailing list.</p>
|
39
39
|
<h3 class="manual" id="Other_required_Software">2.1.2 Other required Software</h3>
|
40
40
|
<ul><li>
|
41
|
-
<b>Ruby:</b> TaskJuggler 3.x is written in Ruby. You need a Ruby runtime environment to run it. This can be downloaded from <a href="http://www.ruby-lang.org/en/downloads/" target="_top">here</a>. Most Linux distributions usually have Ruby already included. So does MacOS X Leopard. For Windows, there is a one-click installer available. The recommended Ruby version to make full use of TaskJuggler is 1.9.2. Ruby 1.9.1 contains some bugs that prevent the multi-core support to work. For users that are not interested in multi-core support, the web server, the time sheet infrastructure and daemon Ruby 1.8.7 is still ok to use. On Windows you need at least Ruby 1.9.2.</li></ul>
|
41
|
+
<b>Ruby:</b> TaskJuggler 3.x is written in Ruby. You need a Ruby runtime environment to run it. This can be downloaded from <a href="http://www.ruby-lang.org/en/downloads/" target="_top">here</a>. Most Linux distributions usually have Ruby already included. So does MacOS X Leopard. For Windows, there is a one-click installer available. The recommended Ruby version to make full use of TaskJuggler is 1.9.2. Ruby 1.9.1 contains some bugs that prevent the multi-core support to work. For users that are not interested in multi-core support, the web server, the time sheet infrastructure and daemon Ruby 1.8.7 is still ok to use. On Windows you need at least Ruby 1.9.2. If you want to use non-ASCII characters, Ruby 1.9.2 or later is required as well.</li></ul>
|
42
|
+
<p class="manual">You must have configured your system locale to be UTF-8 to work properly with non-ASCII characters.</p>
|
42
43
|
<p class="manual">See below for instructions on how to use the latest and greates Ruby version in parallel with your distribution Ruby.</p>
|
43
44
|
<ul><li>
|
44
45
|
<b>RubyGems:</b> If it did not come with your OS or the Ruby installation, see <a href="http://docs.rubygems.org" target="_top">here</a> how to get and install it. RubyGems is a cross-platform package manager. It will download and install all other required software packages automatically when you install TaskJuggler. These packages are called Ruby gems.</li></ul>
|
data/manual/html/Intro.html
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
<!DOCTYPE>
|
2
|
-
<!-- This file has been generated by tj3man v3.
|
2
|
+
<!-- This file has been generated by tj3man v3.4.0 -->
|
3
3
|
<html lang="en" xml:lang="en">
|
4
4
|
<head>
|
5
5
|
<title>Intro</title>
|
@@ -76,6 +76,7 @@
|
|
76
76
|
<li>Powerful project description language with macro support</li>
|
77
77
|
<li>Scales well on multi-core or multi-CPU systems</li>
|
78
78
|
<li>Support for project management teams and revision control systems</li>
|
79
|
+
<li>Data export to Microsoft Project and Computer Associates Clarity</li>
|
79
80
|
</ul>
|
80
81
|
<h3 class="manual" id="Web_Publishing_and_Groupware_Functions">1.3.6 Web Publishing and Groupware Functions</h3>
|
81
82
|
<ul>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<!DOCTYPE>
|
2
|
-
<!-- This file has been generated by tj3man v3.
|
2
|
+
<!-- This file has been generated by tj3man v3.4.0 -->
|
3
3
|
<html lang="en" xml:lang="en">
|
4
4
|
<head>
|
5
5
|
<title>Rich_Text_Attributes</title>
|
@@ -84,6 +84,7 @@ This is a '''''italic and bold''''' word.
|
|
84
84
|
<p class="manual">In some situations, it is desirable to not interpret certain markup sequences and reproduce the text verbatim. Such text must be enclosed in nowiki tags.</p>
|
85
85
|
<div class="manual" codesection="1"><pre class="manual" codesection="1"><nowiki> This is not '''bold''' text. </nowiki>
|
86
86
|
</pre></div>
|
87
|
+
<p class="manual">You can also insert raw HTML code by enclosing it in <b><html>...</html></b> tags. For all other output formats, this content will be ignored. There is also no error checking if the code is valid! Use this feature very carefully.</p>
|
87
88
|
<h3 class="manual" id="Block_and_Inline_Generators">5.4.3 Block and Inline Generators</h3>
|
88
89
|
<p class="manual">Block and inline generators are a very powerful extension that allow you to insert arbitrarily complex content. Block generators create a text block whereas inline generators generate an element that fits inside a text paragraph.</p>
|
89
90
|
<p class="manual">Block generators use the following syntax:</p>
|
data/manual/html/Software.html
CHANGED