taskjuggler 3.0.0 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +61 -0
- data/README.rdoc +43 -27
- data/data/css/tjreport.css +30 -0
- data/data/tjp.vim +100 -89
- data/examples/ProjectTemplate/template.tjp +338 -0
- data/examples/ToDo-List/todolist.tjp +84 -0
- data/examples/{tutorial.tjp → Tutorial/tutorial.tjp} +9 -7
- data/lib/header.tmpl +1 -1
- data/lib/taskjuggler/Account.rb +2 -2
- data/lib/taskjuggler/AccountCredit.rb +29 -0
- data/lib/taskjuggler/AccountScenario.rb +73 -7
- data/lib/taskjuggler/AlertLevelDefinitions.rb +104 -0
- data/lib/taskjuggler/AlgorithmDiff.rb +2 -2
- data/lib/taskjuggler/Allocation.rb +1 -1
- data/lib/taskjuggler/AppConfig.rb +1 -1
- data/lib/taskjuggler/AttributeBase.rb +1 -1
- data/lib/taskjuggler/AttributeDefinition.rb +1 -1
- data/lib/taskjuggler/Attributes.rb +40 -3
- data/lib/taskjuggler/BatchProcessor.rb +15 -14
- data/lib/taskjuggler/Booking.rb +1 -1
- data/lib/taskjuggler/Charge.rb +2 -2
- data/lib/taskjuggler/ChargeSet.rb +1 -1
- data/lib/taskjuggler/DataCache.rb +24 -12
- data/lib/taskjuggler/FileList.rb +1 -1
- data/lib/taskjuggler/HTMLDocument.rb +1 -1
- data/lib/taskjuggler/HTMLElements.rb +1 -1
- data/lib/taskjuggler/ICalendar.rb +1 -1
- data/lib/taskjuggler/Interval.rb +1 -1
- data/lib/taskjuggler/IntervalList.rb +1 -1
- data/lib/taskjuggler/Journal.rb +61 -41
- data/lib/taskjuggler/KeywordArray.rb +1 -1
- data/lib/taskjuggler/KeywordDocumentation.rb +121 -33
- data/lib/taskjuggler/LeaveList.rb +103 -0
- data/lib/taskjuggler/Limits.rb +1 -1
- data/lib/taskjuggler/Log.rb +6 -3
- data/lib/taskjuggler/LogFile.rb +1 -1
- data/lib/taskjuggler/LogicalExpression.rb +1 -1
- data/lib/taskjuggler/LogicalFunction.rb +16 -2
- data/lib/taskjuggler/LogicalOperation.rb +3 -1
- data/lib/taskjuggler/MessageHandler.rb +13 -4
- data/lib/taskjuggler/PTNProxy.rb +118 -0
- data/lib/taskjuggler/Project.rb +58 -67
- data/lib/taskjuggler/ProjectFileParser.rb +39 -5
- data/lib/taskjuggler/ProjectFileScanner.rb +1 -1
- data/lib/taskjuggler/PropertyList.rb +26 -2
- data/lib/taskjuggler/PropertySet.rb +8 -1
- data/lib/taskjuggler/PropertyTreeNode.rb +36 -32
- data/lib/taskjuggler/Query.rb +1 -1
- data/lib/taskjuggler/RealFormat.rb +4 -2
- data/lib/taskjuggler/Resource.rb +3 -3
- data/lib/taskjuggler/ResourceScenario.rb +219 -140
- data/lib/taskjuggler/RichText.rb +1 -1
- data/lib/taskjuggler/RichText/Document.rb +2 -2
- data/lib/taskjuggler/RichText/Element.rb +2 -2
- data/lib/taskjuggler/RichText/FunctionExample.rb +2 -2
- data/lib/taskjuggler/RichText/FunctionHandler.rb +2 -2
- data/lib/taskjuggler/RichText/Parser.rb +2 -2
- data/lib/taskjuggler/RichText/RTFHandlers.rb +1 -1
- data/lib/taskjuggler/RichText/RTFNavigator.rb +1 -1
- data/lib/taskjuggler/RichText/RTFQuery.rb +1 -1
- data/lib/taskjuggler/RichText/RTFReport.rb +1 -1
- data/lib/taskjuggler/RichText/RTFReportLink.rb +1 -1
- data/lib/taskjuggler/RichText/RTFWithQuerySupport.rb +1 -1
- data/lib/taskjuggler/RichText/Scanner.rb +18 -4
- data/lib/taskjuggler/RichText/Snip.rb +2 -2
- data/lib/taskjuggler/RichText/SyntaxRules.rb +6 -14
- data/lib/taskjuggler/RichText/TOCEntry.rb +16 -7
- data/lib/taskjuggler/RichText/TableOfContents.rb +3 -2
- data/lib/taskjuggler/RuntimeConfig.rb +1 -1
- data/lib/taskjuggler/Scenario.rb +1 -1
- data/lib/taskjuggler/ScenarioData.rb +1 -1
- data/lib/taskjuggler/Scoreboard.rb +1 -1
- data/lib/taskjuggler/SheetHandlerBase.rb +1 -1
- data/lib/taskjuggler/SheetReceiver.rb +1 -1
- data/lib/taskjuggler/SheetSender.rb +3 -3
- data/lib/taskjuggler/Shift.rb +2 -2
- data/lib/taskjuggler/ShiftAssignments.rb +24 -19
- data/lib/taskjuggler/ShiftScenario.rb +4 -4
- data/lib/taskjuggler/SimpleQueryExpander.rb +1 -1
- data/lib/taskjuggler/StatusSheetReceiver.rb +1 -1
- data/lib/taskjuggler/StatusSheetSender.rb +1 -1
- data/lib/taskjuggler/StdIoWrapper.rb +1 -1
- data/lib/taskjuggler/SyntaxReference.rb +5 -2
- data/lib/taskjuggler/TableColumnDefinition.rb +1 -1
- data/lib/taskjuggler/Task.rb +4 -8
- data/lib/taskjuggler/TaskDependency.rb +1 -1
- data/lib/taskjuggler/TaskJuggler.rb +1 -1
- data/lib/taskjuggler/TaskScenario.rb +131 -51
- data/lib/taskjuggler/TernarySearchTree.rb +6 -4
- data/lib/taskjuggler/TextFormatter.rb +9 -2
- data/lib/taskjuggler/TextParser.rb +13 -3
- data/lib/taskjuggler/TextParser/MacroTable.rb +1 -1
- data/lib/taskjuggler/TextParser/Pattern.rb +52 -8
- data/lib/taskjuggler/TextParser/Rule.rb +11 -5
- data/lib/taskjuggler/TextParser/Scanner.rb +1 -1
- data/lib/taskjuggler/TextParser/SourceFileInfo.rb +1 -1
- data/lib/taskjuggler/TextParser/StackElement.rb +1 -1
- data/lib/taskjuggler/TextParser/State.rb +2 -2
- data/lib/taskjuggler/TextParser/TokenDoc.rb +1 -1
- data/lib/taskjuggler/TimeSheetReceiver.rb +1 -1
- data/lib/taskjuggler/TimeSheetSender.rb +1 -1
- data/lib/taskjuggler/TimeSheetSummary.rb +1 -1
- data/lib/taskjuggler/TimeSheets.rb +4 -6
- data/lib/taskjuggler/Tj3AppBase.rb +18 -1
- data/lib/taskjuggler/Tj3Config.rb +4 -4
- data/lib/taskjuggler/Tj3SheetAppBase.rb +1 -1
- data/lib/taskjuggler/TjException.rb +1 -1
- data/lib/taskjuggler/TjTime.rb +1 -1
- data/lib/taskjuggler/TjpExample.rb +1 -1
- data/lib/taskjuggler/TjpSyntaxRules.rb +920 -392
- data/lib/taskjuggler/URLParameter.rb +1 -1
- data/lib/taskjuggler/UTF8String.rb +1 -1
- data/lib/taskjuggler/UserManual.rb +1 -1
- data/lib/taskjuggler/VimSyntax.rb +9 -6
- data/lib/taskjuggler/WorkingHours.rb +12 -1
- data/lib/taskjuggler/XMLDocument.rb +1 -1
- data/lib/taskjuggler/XMLElement.rb +1 -1
- data/lib/taskjuggler/apps/Tj3.rb +8 -3
- data/lib/taskjuggler/apps/Tj3Client.rb +1 -1
- data/lib/taskjuggler/apps/Tj3Daemon.rb +1 -1
- data/lib/taskjuggler/apps/Tj3Man.rb +1 -1
- data/lib/taskjuggler/apps/Tj3SsReceiver.rb +2 -2
- data/lib/taskjuggler/apps/Tj3SsSender.rb +1 -1
- data/lib/taskjuggler/apps/Tj3TsReceiver.rb +1 -1
- data/lib/taskjuggler/apps/Tj3TsSender.rb +1 -1
- data/lib/taskjuggler/apps/Tj3TsSummary.rb +1 -1
- data/lib/taskjuggler/daemon/Daemon.rb +1 -1
- data/lib/taskjuggler/daemon/ProcessIntercom.rb +1 -1
- data/lib/taskjuggler/daemon/ProjectBroker.rb +1 -1
- data/lib/taskjuggler/daemon/ProjectServer.rb +1 -1
- data/lib/taskjuggler/daemon/ReportServer.rb +2 -2
- data/lib/taskjuggler/daemon/ReportServlet.rb +1 -1
- data/lib/taskjuggler/daemon/WebServer.rb +1 -1
- data/lib/taskjuggler/daemon/WelcomePage.rb +1 -1
- data/lib/taskjuggler/deep_copy.rb +1 -1
- data/lib/taskjuggler/reports/AccountListRE.rb +115 -0
- data/lib/taskjuggler/reports/CSVFile.rb +1 -1
- data/lib/taskjuggler/reports/CollisionDetector.rb +1 -1
- data/lib/taskjuggler/reports/ColumnTable.rb +1 -1
- data/lib/taskjuggler/reports/GanttChart.rb +1 -1
- data/lib/taskjuggler/reports/GanttContainer.rb +1 -3
- data/lib/taskjuggler/reports/GanttHeader.rb +1 -1
- data/lib/taskjuggler/reports/GanttHeaderScaleItem.rb +1 -1
- data/lib/taskjuggler/reports/GanttLine.rb +23 -12
- data/lib/taskjuggler/reports/GanttLoadStack.rb +1 -1
- data/lib/taskjuggler/reports/GanttMilestone.rb +1 -1
- data/lib/taskjuggler/reports/GanttRouter.rb +1 -1
- data/lib/taskjuggler/reports/GanttTaskBar.rb +1 -1
- data/lib/taskjuggler/reports/HTMLGraphics.rb +1 -1
- data/lib/taskjuggler/reports/ICalReport.rb +5 -2
- data/lib/taskjuggler/reports/Navigator.rb +1 -1
- data/lib/taskjuggler/reports/NikuReport.rb +1 -1
- data/lib/taskjuggler/reports/Report.rb +29 -4
- data/lib/taskjuggler/reports/ReportBase.rb +15 -1
- data/lib/taskjuggler/reports/ReportContext.rb +1 -1
- data/lib/taskjuggler/reports/ReportTable.rb +1 -1
- data/lib/taskjuggler/reports/ReportTableCell.rb +1 -1
- data/lib/taskjuggler/reports/ReportTableColumn.rb +1 -1
- data/lib/taskjuggler/reports/ReportTableLegend.rb +1 -1
- data/lib/taskjuggler/reports/ReportTableLine.rb +1 -1
- data/lib/taskjuggler/reports/ResourceListRE.rb +3 -5
- data/lib/taskjuggler/reports/StatusSheetReport.rb +2 -2
- data/lib/taskjuggler/reports/TableReport.rb +336 -204
- data/lib/taskjuggler/reports/TableReportColumn.rb +30 -0
- data/lib/taskjuggler/reports/TagFile.rb +2 -2
- data/lib/taskjuggler/reports/TaskListRE.rb +3 -6
- data/lib/taskjuggler/reports/TextReport.rb +1 -1
- data/lib/taskjuggler/reports/TimeSheetReport.rb +3 -3
- data/lib/taskjuggler/reports/TjpExportRE.rb +4 -1
- data/lib/tj3.rb +1 -1
- data/lib/tj3client.rb +1 -1
- data/lib/tj3d.rb +1 -1
- data/lib/tj3man.rb +1 -1
- data/lib/tj3ss_receiver.rb +1 -1
- data/lib/tj3ss_sender.rb +1 -1
- data/lib/tj3ts_receiver.rb +1 -1
- data/lib/tj3ts_sender.rb +1 -1
- data/lib/tj3ts_summary.rb +1 -1
- data/lib/updateheader.sh +4 -1
- data/manual/Getting_Started +7 -4
- data/manual/How_To_Contribute +26 -5
- data/manual/Installation +26 -18
- data/manual/Intro +55 -33
- data/manual/Reporting_Bugs +18 -8
- data/manual/Rich_Text_Attributes +16 -3
- data/manual/Software +2 -2
- data/manual/TaskJuggler_2x_Migration +2 -2
- data/manual/The_TaskJuggler_Syntax +10 -0
- data/manual/Tutorial +2 -2
- data/manual/html/Day_To_Day_Juggling.html +16 -12
- data/manual/html/Getting_Started.html +9 -7
- data/manual/html/How_To_Contribute.html +18 -10
- data/manual/html/Installation.html +18 -15
- data/manual/html/Intro.html +44 -28
- data/manual/html/Reporting_Bugs.html +9 -7
- data/manual/html/Rich_Text_Attributes.html +11 -8
- data/manual/html/Software.html +5 -5
- data/manual/html/TaskJuggler_2x_Migration.html +4 -4
- data/manual/html/TaskJuggler_Internals.html +3 -3
- data/manual/html/The_TaskJuggler_Syntax.html +6 -3
- data/manual/html/Tutorial.html +12 -12
- data/manual/html/account.html +19 -10
- data/manual/html/account.task.html +5 -28
- data/manual/html/accountprefix.html +5 -5
- data/manual/html/{report.html → accountreport.html} +140 -23
- data/manual/html/accountroot.html +142 -0
- data/manual/html/active.html +5 -5
- data/manual/html/adopt.task.html +7 -8
- data/manual/html/aggregate.html +145 -0
- data/manual/html/alert.html +12 -11
- data/manual/html/alertlevels.html +102 -0
- data/manual/html/allocate.html +6 -6
- data/manual/html/alphabet.html +1 -1
- data/manual/html/alternative.html +3 -3
- data/manual/html/author.html +3 -3
- data/manual/html/balance.html +84 -11
- data/manual/html/booking.resource.html +3 -3
- data/manual/html/booking.task.html +3 -3
- data/manual/html/caption.html +6 -4
- data/manual/html/cellcolor.column.html +3 -3
- data/manual/html/celltext.column.html +3 -3
- data/manual/html/center.html +28 -4
- data/manual/html/charge.html +3 -3
- data/manual/html/chargeset.html +5 -5
- data/manual/html/columnid.html +40 -9
- data/manual/html/columns.html +6 -4
- data/manual/html/complete.html +15 -9
- data/manual/html/copyright.html +5 -5
- data/manual/html/{credit.html → credits.html} +15 -12
- data/manual/html/css/tjreport.css +30 -0
- data/manual/html/currency.html +28 -15
- data/manual/html/currencyformat.html +4 -4
- data/manual/html/dailymax.html +3 -3
- data/manual/html/dailymin.html +3 -3
- data/manual/html/dailyworkinghours.html +3 -3
- data/manual/html/date.extend.html +3 -3
- data/manual/html/date.html +3 -3
- data/manual/html/definitions.html +3 -3
- data/manual/html/depends.html +3 -3
- data/manual/html/details.html +3 -3
- data/manual/html/disabled.html +9 -3
- data/manual/html/duration.html +3 -3
- data/manual/html/efficiency.html +3 -3
- data/manual/html/effort.html +3 -3
- data/manual/html/email.html +3 -3
- data/manual/html/enabled.html +9 -3
- data/manual/html/end.column.html +3 -3
- data/manual/html/end.html +3 -3
- data/manual/html/end.limit.html +3 -3
- data/manual/html/end.report.html +4 -4
- data/manual/html/end.timesheet.html +3 -3
- data/manual/html/endcredit.html +18 -9
- data/manual/html/epilog.html +6 -4
- data/manual/html/export.html +10 -6
- data/manual/html/extend.html +3 -3
- data/manual/html/fail.html +3 -3
- data/manual/html/fdl.html +3 -3
- data/manual/html/flags.account.html +3 -3
- data/manual/html/flags.html +3 -3
- data/manual/html/flags.journalentry.html +3 -3
- data/manual/html/flags.report.html +6 -4
- data/manual/html/flags.resource.html +3 -3
- data/manual/html/flags.statussheet.html +3 -3
- data/manual/html/flags.task.html +3 -3
- data/manual/html/flags.timesheet.html +3 -3
- data/manual/html/fontcolor.column.html +3 -3
- data/manual/html/footer.html +28 -4
- data/manual/html/formats.html +4 -4
- data/manual/html/functions.html +4 -4
- data/manual/html/gapduration.html +3 -3
- data/manual/html/gaplength.html +4 -4
- data/manual/html/halign.center.html +3 -3
- data/manual/html/halign.column.html +3 -3
- data/manual/html/halign.left.html +3 -3
- data/manual/html/halign.right.html +3 -3
- data/manual/html/hasalert.html +3 -3
- data/manual/html/header.html +28 -4
- data/manual/html/headline.html +6 -6
- data/manual/html/hideaccount.html +73 -0
- data/manual/html/hidejournalentry.html +6 -6
- data/manual/html/hidereport.html +3 -3
- data/manual/html/hideresource.html +4 -4
- data/manual/html/hidetask.html +4 -4
- data/manual/html/icalreport.html +3 -3
- data/manual/html/include.macro.html +4 -4
- data/manual/html/include.project.html +5 -6
- data/manual/html/include.properties.html +5 -97
- data/manual/html/index.html +2 -2
- data/manual/html/inherit.extend.html +3 -3
- data/manual/html/interval1.html +3 -3
- data/manual/html/interval2.html +3 -3
- data/manual/html/interval3.html +3 -3
- data/manual/html/interval4.html +3 -3
- data/manual/html/isactive.html +3 -3
- data/manual/html/ischildof.html +3 -3
- data/manual/html/isdependencyof.html +3 -3
- data/manual/html/isdutyof.html +3 -3
- data/manual/html/isfeatureof.html +3 -3
- data/manual/html/isleaf.html +3 -3
- data/manual/html/ismilestone.html +3 -3
- data/manual/html/isongoing.html +3 -3
- data/manual/html/isresource.html +5 -5
- data/manual/html/{alert level.html → isresponsibilityof.html} +19 -14
- data/manual/html/istask.html +5 -5
- data/manual/html/journalattributes.html +6 -4
- data/manual/html/journalentry.html +3 -3
- data/manual/html/journalmode.html +8 -6
- data/manual/html/leaveallowance.html +139 -0
- data/manual/html/leaves.html +140 -0
- data/manual/html/left.html +30 -6
- data/manual/html/length.html +4 -4
- data/manual/html/limits.allocate.html +5 -32
- data/manual/html/limits.html +3 -3
- data/manual/html/limits.resource.html +3 -3
- data/manual/html/limits.task.html +3 -3
- data/manual/html/listitem.column.html +3 -3
- data/manual/html/listtype.column.html +3 -3
- data/manual/html/loadunit.html +6 -4
- data/manual/html/logicalexpression.html +3 -3
- data/manual/html/logicalflagexpression.html +3 -3
- data/manual/html/macro.html +3 -3
- data/manual/html/managers.html +3 -3
- data/manual/html/mandatory.html +3 -3
- data/manual/html/maxend.html +3 -3
- data/manual/html/maximum.html +3 -3
- data/manual/html/maxstart.html +3 -3
- data/manual/html/milestone.html +3 -3
- data/manual/html/minend.html +3 -3
- data/manual/html/minimum.html +3 -3
- data/manual/html/minstart.html +3 -3
- data/manual/html/monthlymax.html +3 -3
- data/manual/html/monthlymin.html +3 -3
- data/manual/html/navbar.html +23 -5
- data/manual/html/navigator.html +34 -3
- data/manual/html/newtask.html +3 -3
- data/manual/html/nikureport.html +3 -3
- data/manual/html/note.task.html +3 -3
- data/manual/html/now.html +3 -3
- data/manual/html/numberformat.html +4 -4
- data/manual/html/onend.html +3 -3
- data/manual/html/onstart.html +3 -3
- data/manual/html/opennodes.html +6 -4
- data/manual/html/overtime.booking.html +4 -4
- data/manual/html/period.column.html +3 -3
- data/manual/html/period.limit.html +3 -3
- data/manual/html/period.report.html +4 -4
- data/manual/html/period.task.html +3 -3
- data/manual/html/persistent.html +3 -3
- data/manual/html/precedes.html +3 -3
- data/manual/html/priority.html +3 -3
- data/manual/html/priority.timesheet.html +3 -3
- data/manual/html/project.html +4 -4
- data/manual/html/projectid.html +3 -3
- data/manual/html/projectid.task.html +3 -3
- data/manual/html/projectids.html +3 -3
- data/manual/html/projection.html +9 -3
- data/manual/html/prolog.html +6 -4
- data/manual/html/properties.html +193 -9
- data/manual/html/purge.html +5 -5
- data/manual/html/rate.html +3 -3
- data/manual/html/rate.resource.html +3 -3
- data/manual/html/reference.extend.html +3 -3
- data/manual/html/remaining.html +3 -3
- data/manual/html/replace.html +9 -6
- data/manual/html/reportprefix.html +5 -5
- data/manual/html/resource.html +22 -4
- data/manual/html/resourceattributes.html +6 -6
- data/manual/html/resourceprefix.html +3 -3
- data/manual/html/resourcereport.html +311 -8
- data/manual/html/resourceroot.html +6 -4
- data/manual/html/resources.limit.html +4 -4
- data/manual/html/responsible.html +3 -3
- data/manual/html/richtext.extend.html +3 -3
- data/manual/html/right.html +30 -6
- data/manual/html/rollupaccount.html +69 -0
- data/manual/html/rollupresource.html +6 -6
- data/manual/html/rolluptask.html +4 -4
- data/manual/html/scale.column.html +3 -3
- data/manual/html/scenario.html +3 -3
- data/manual/html/scenario.ical.html +3 -3
- data/manual/html/scenarios.export.html +3 -3
- data/manual/html/scenarios.html +6 -4
- data/manual/html/scenariospecific.extend.html +3 -3
- data/manual/html/scheduled.html +3 -3
- data/manual/html/scheduling.html +3 -3
- data/manual/html/select.html +3 -3
- data/manual/html/selfcontained.html +6 -4
- data/manual/html/shift.allocate.html +77 -0
- data/manual/html/shift.html +13 -7
- data/manual/html/shift.resource.html +11 -5
- data/manual/html/shift.task.html +9 -3
- data/manual/html/shift.timesheet.html +4 -4
- data/manual/html/shifts.allocate.html +6 -6
- data/manual/html/shifts.resource.html +3 -3
- data/manual/html/shifts.task.html +3 -3
- data/manual/html/shorttimeformat.html +3 -3
- data/manual/html/sloppy.booking.html +4 -4
- data/manual/html/sloppy.projection.html +12 -6
- data/manual/html/sortaccounts.html +73 -0
- data/manual/html/sortjournalentries.html +8 -6
- data/manual/html/sortresources.html +4 -4
- data/manual/html/sorttasks.html +4 -4
- data/manual/html/start.column.html +3 -3
- data/manual/html/start.html +3 -3
- data/manual/html/start.limit.html +3 -3
- data/manual/html/start.report.html +4 -4
- data/manual/html/startcredit.html +10 -4
- data/manual/html/status.statussheet.html +5 -5
- data/manual/html/status.timesheet.html +5 -5
- data/manual/html/statussheet.html +3 -3
- data/manual/html/statussheetreport.html +10 -6
- data/manual/html/strict.projection.html +10 -4
- data/manual/html/summary.html +3 -3
- data/manual/html/supplement.html +5 -5
- data/manual/html/supplement.resource.html +22 -4
- data/manual/html/supplement.task.html +4 -4
- data/manual/html/tagfile.html +3 -3
- data/manual/html/task.html +3 -3
- data/manual/html/task.statussheet.html +3 -3
- data/manual/html/task.timesheet.html +3 -3
- data/manual/html/taskattributes.html +3 -3
- data/manual/html/taskprefix.html +3 -3
- data/manual/html/taskreport.html +347 -8
- data/manual/html/taskroot.html +6 -4
- data/manual/html/text.extend.html +3 -3
- data/manual/html/textreport.html +333 -8
- data/manual/html/timeformat.html +4 -4
- data/manual/html/timeoff.nikureport.html +3 -3
- data/manual/html/timesheet.html +3 -3
- data/manual/html/timesheetreport.html +10 -6
- data/manual/html/timezone.export.html +3 -3
- data/manual/html/timezone.html +3 -3
- data/manual/html/timezone.report.html +6 -4
- data/manual/html/timezone.shift.html +3 -3
- data/manual/html/timingresolution.html +3 -3
- data/manual/html/title.column.html +3 -3
- data/manual/html/title.html +4 -4
- data/manual/html/toc.html +1705 -658
- data/manual/html/tooltip.column.html +3 -3
- data/manual/html/trackingscenario.html +3 -3
- data/manual/html/treelevel.html +3 -3
- data/manual/html/vacation.html +3 -3
- data/manual/html/vacation.resource.html +4 -4
- data/manual/html/vacation.shift.html +4 -4
- data/manual/html/warn.html +3 -3
- data/manual/html/weeklymax.html +3 -3
- data/manual/html/weeklymin.html +3 -3
- data/manual/html/weekstartsmonday.html +3 -3
- data/manual/html/weekstartssunday.html +3 -3
- data/manual/html/width.column.html +3 -3
- data/manual/html/work.html +3 -3
- data/manual/html/workinghours.project.html +3 -3
- data/manual/html/workinghours.resource.html +3 -3
- data/manual/html/workinghours.shift.html +3 -3
- data/manual/html/yearlyworkingdays.html +4 -4
- data/spec/ICalendar_spec.rb +4 -2
- data/spec/IntervalList_spec.rb +1 -1
- data/spec/ProjectBroker_spec.rb +2 -6
- data/spec/StatusSheets_spec.rb +1 -1
- data/spec/TernarySearchTree_spec.rb +2 -2
- data/spec/TimeSheets_spec.rb +1 -1
- data/spec/Tj3Daemon_spec.rb +1 -1
- data/spec/Tj3_spec.rb +1 -1
- data/spec/support/DaemonControl.rb +1 -1
- data/spec/support/spec_helper.rb +19 -0
- data/taskjuggler.gemspec +1 -0
- data/test/MessageChecker.rb +1 -1
- data/test/ReferenceGenerator.rb +1 -1
- data/test/TestSuite/CSV-Reports/Leave.tjp +37 -0
- data/test/TestSuite/CSV-Reports/celltext.tjp +1 -1
- data/test/TestSuite/CSV-Reports/efficiency.tjp +20 -0
- data/test/TestSuite/CSV-Reports/headcount.tjp +31 -0
- data/test/TestSuite/CSV-Reports/refs/Leave.csv +5 -0
- data/test/TestSuite/CSV-Reports/refs/alert.csv +6 -0
- data/test/TestSuite/CSV-Reports/refs/celltext.csv +6 -0
- data/test/TestSuite/CSV-Reports/refs/efficiency.csv +5 -0
- data/test/TestSuite/CSV-Reports/refs/headcount.csv +4 -0
- data/test/TestSuite/CSV-Reports/refs/sortByTree.csv +6 -0
- data/test/TestSuite/CSV-Reports/refs/sortBy_duration.down.csv +6 -0
- data/test/TestSuite/CSV-Reports/refs/sortBy_effort.up.csv +6 -0
- data/test/TestSuite/CSV-Reports/refs/sortBy_plan.start.down.csv +6 -0
- data/test/TestSuite/CSV-Reports/refs/taskreport.csv +6 -0
- data/test/TestSuite/CSV-Reports/refs/taskreport_with_resources.csv +14 -0
- data/test/TestSuite/CSV-Reports/resourcereport.tjp +1 -1
- data/test/TestSuite/CSV-Reports/resourcereport_with_tasks.tjp +1 -1
- data/test/TestSuite/CSV-Reports/sortByTree.tjp +1 -1
- data/test/TestSuite/CSV-Reports/sortBy_plan.start.down.tjp +1 -1
- data/test/TestSuite/CSV-Reports/taskreport.tjp +1 -1
- data/test/TestSuite/CSV-Reports/taskreport_with_resources.tjp +1 -1
- data/test/TestSuite/Export-Reports/refs/AccountReport.tjp +1089 -0
- data/test/TestSuite/Export-Reports/refs/AlertLevels.tjp +24 -0
- data/test/TestSuite/Export-Reports/refs/Complete.tjp +5 -25
- data/test/TestSuite/Export-Reports/refs/navigator.tjp +58 -0
- data/test/TestSuite/Export-Reports/refs/template.tjp +142 -0
- data/test/TestSuite/Export-Reports/refs/textreport.tjp +19 -0
- data/test/TestSuite/ReportGenerator/Correct/Alerts.tjp +26 -7
- data/test/TestSuite/ReportGenerator/Correct/refs/Alerts-1.csv +177 -141
- data/test/TestSuite/ReportGenerator/Correct/refs/FTE-1.csv +1 -1
- data/test/TestSuite/Scheduler/Correct/Allocate.tjp +2 -2
- data/test/TestSuite/Scheduler/Correct/Shift2.tjp +4 -4
- data/test/TestSuite/Syntax/Correct/Account.tjp +23 -10
- data/test/TestSuite/Syntax/Correct/AccountReport.tjp +74 -0
- data/test/TestSuite/Syntax/Correct/AdoptedTasks.tjp +4 -0
- data/test/TestSuite/Syntax/Correct/AlertLevels.tjp +25 -0
- data/test/TestSuite/Syntax/Correct/Celltext.tjp +3 -3
- data/test/TestSuite/Syntax/Correct/Complete.tjp +8 -5
- data/test/TestSuite/Syntax/Correct/Leave.tjp +37 -0
- data/test/TestSuite/Syntax/Correct/Reports.tjp +4 -4
- data/test/TestSuite/Syntax/Correct/Shift.tjp +4 -4
- data/test/TestSuite/Syntax/Correct/manual2example.rb +4 -3
- data/test/TestSuite/Syntax/Correct/navigator.tjp +31 -0
- data/test/TestSuite/Syntax/Correct/template.tjp +338 -0
- data/test/TestSuite/Syntax/Correct/textreport.tjp +21 -0
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +12 -10
- data/test/TestSuite/Syntax/Errors/{adopt_duplicate_child.tjp → adopt_duplicate_child-1.tjp} +0 -0
- data/test/TestSuite/Syntax/Errors/{adopt_common_root.tjp → adopt_duplicate_child-2.tjp} +1 -1
- data/test/TestSuite/Syntax/Errors/{adopt_duplicate_parent.tjp → adopt_duplicate_child-3.tjp} +1 -1
- data/test/TestSuite/Syntax/Errors/adopt_self.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/alert_level_redef.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/alert_name_redef.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/too_few_alert_levels.tjp +5 -0
- data/test/TjpGen.rb +1 -1
- data/test/all.rb +1 -1
- data/test/test_AlgorithmDiff.rb +1 -1
- data/test/test_BatchProcessor.rb +23 -10
- data/test/test_CSV-Reports.rb +1 -1
- data/test/test_CSVFile.rb +1 -1
- data/test/test_CollisionDetector.rb +1 -1
- data/test/test_Export-Reports.rb +1 -1
- data/test/test_Journal.rb +42 -15
- data/test/test_Limits.rb +1 -1
- data/test/test_LogicalExpression.rb +1 -1
- data/test/test_MacroTable.rb +8 -3
- data/test/test_Project.rb +1 -1
- data/test/test_ProjectFileScanner.rb +1 -1
- data/test/test_PropertySet.rb +1 -1
- data/test/test_Query.rb +1 -1
- data/test/test_RealFormat.rb +1 -1
- data/test/test_ReportGenerator.rb +1 -1
- data/test/test_RichText.rb +1 -1
- data/test/test_Scheduler.rb +1 -1
- data/test/test_ShiftAssignments.rb +1 -1
- data/test/test_SimpleQueryExpander.rb +1 -1
- data/test/test_Syntax.rb +1 -1
- data/test/test_TextFormatter.rb +1 -1
- data/test/test_TjTime.rb +1 -1
- data/test/test_TjpExample.rb +1 -1
- data/test/test_URLParameter.rb +1 -1
- data/test/test_UTF8String.rb +1 -1
- data/test/test_WorkingHours.rb +1 -1
- data/test/test_deep_copy.rb +1 -1
- metadata +318 -248
- data/test/TestSuite/Syntax/Errors/purge_no_list.tjp +0 -8
@@ -3,7 +3,7 @@
|
|
3
3
|
#
|
4
4
|
# = TjException.rb -- The TaskJuggler III Project Management Software
|
5
5
|
#
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
7
7
|
# by Chris Schlaeger <chris@linux.com>
|
8
8
|
#
|
9
9
|
# This program is free software; you can redistribute it and/or modify
|
data/lib/taskjuggler/TjTime.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
#
|
4
4
|
# = TjTime.rb -- The TaskJuggler III Project Management Software
|
5
5
|
#
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
7
7
|
# by Chris Schlaeger <chris@linux.com>
|
8
8
|
#
|
9
9
|
# This program is free software; you can redistribute it and/or modify
|
@@ -3,7 +3,7 @@
|
|
3
3
|
#
|
4
4
|
# = TjpExample.rb -- The TaskJuggler III Project Management Software
|
5
5
|
#
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
7
7
|
# by Chris Schlaeger <chris@linux.com>
|
8
8
|
#
|
9
9
|
# This program is free software; you can redistribute it and/or modify
|
@@ -3,7 +3,7 @@
|
|
3
3
|
#
|
4
4
|
# = TjpSyntaxRules.rb -- The TaskJuggler III Project Management Software
|
5
5
|
#
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
7
7
|
# by Chris Schlaeger <chris@linux.com>
|
8
8
|
#
|
9
9
|
# This program is free software; you can redistribute it and/or modify
|
@@ -61,6 +61,18 @@ EOT
|
|
61
61
|
optionsRule('accountAttributes')
|
62
62
|
end
|
63
63
|
|
64
|
+
def rule_accountCredit
|
65
|
+
pattern(%w( !valDate $STRING !number ), lambda {
|
66
|
+
AccountCredit.new(@val[0], @val[1], @val[2])
|
67
|
+
})
|
68
|
+
arg(1, 'description', 'Short description of the transaction')
|
69
|
+
arg(2, 'amount', 'Amount to be booked.')
|
70
|
+
end
|
71
|
+
|
72
|
+
def rule_accountCredits
|
73
|
+
listRule('moreAccountCredits', '!accountCredit')
|
74
|
+
end
|
75
|
+
|
64
76
|
def rule_accountHeader
|
65
77
|
pattern(%w( _account !optionalID $STRING ), lambda {
|
66
78
|
if @property.nil? && !@accountprefix.empty?
|
@@ -91,18 +103,78 @@ EOT
|
|
91
103
|
})
|
92
104
|
end
|
93
105
|
|
106
|
+
def rule_accountReport
|
107
|
+
pattern(%w( !accountReportHeader !reportBody ), lambda {
|
108
|
+
@property = @property.parent
|
109
|
+
})
|
110
|
+
level(:beta)
|
111
|
+
doc('accountreport', <<'EOT'
|
112
|
+
The report lists accounts and their respective values in a table. The report can operate in two modes:
|
113
|
+
|
114
|
+
# Balance mode: If a [[balance]] has been set, the report will include the
|
115
|
+
defined cost and revenue accounts as well as all their sub accounts. To reduce
|
116
|
+
the list of included accounts, you can use the [[hideaccount]],
|
117
|
+
[[rollupaccount]] or [[accountroot]] attributes. The order of the task can
|
118
|
+
be controlled with [[sortaccounts]]. If the first sorting criteria is tree
|
119
|
+
sorting, the parent accounts will always be included to form the tree.
|
120
|
+
Tree sorting is the default. You need to change it if you do not want certain
|
121
|
+
parent accounts to be included in the report. Additionally, it will contain a line at the end that lists the balance (revenue - cost).
|
122
|
+
|
123
|
+
# Normal mode: All reports are listed in the order and completeness as defined
|
124
|
+
by the other report attributes. No balance line will be included.
|
125
|
+
EOT
|
126
|
+
)
|
127
|
+
example('AccountReport')
|
128
|
+
end
|
129
|
+
|
130
|
+
def rule_accountReportHeader
|
131
|
+
pattern(%w( _accountreport !optionalID !reportName ), lambda {
|
132
|
+
newReport(@val[1], @val[2], :accountreport, @sourceFileInfo[0])
|
133
|
+
|
134
|
+
unless @property.modified?('columns')
|
135
|
+
# Set the default columns for this report.
|
136
|
+
%w( bsi name monthly ).each do |col|
|
137
|
+
@property.get('columns') <<
|
138
|
+
TableColumnDefinition.new(col, columnTitle(col))
|
139
|
+
end
|
140
|
+
end
|
141
|
+
# Show all accounts, sorted by tree, seqno-up.
|
142
|
+
unless @property.modified?('hideAccount')
|
143
|
+
@property.set('hideAccount',
|
144
|
+
LogicalExpression.new(LogicalOperation.new(0)))
|
145
|
+
end
|
146
|
+
unless @property.modified?('sortAccounts')
|
147
|
+
@property.set('sortAccounts',
|
148
|
+
[ [ 'tree', true, -1 ],
|
149
|
+
[ 'seqno', true, -1 ] ])
|
150
|
+
end
|
151
|
+
})
|
152
|
+
end
|
153
|
+
|
94
154
|
def rule_accountScenarioAttributes
|
95
|
-
pattern(%w(
|
96
|
-
|
97
|
-
|
155
|
+
pattern(%w( _aggregate !aggregate ), lambda {
|
156
|
+
@property.set('aggregate', @val[1])
|
157
|
+
})
|
158
|
+
doc('aggregate', <<'EOT'
|
159
|
+
Specifies whether the account is used to track task or resource specific
|
160
|
+
amounts. The default is to track tasks.
|
161
|
+
EOT
|
162
|
+
)
|
163
|
+
example('AccountReport')
|
164
|
+
|
165
|
+
pattern(%w( _credits !accountCredits ), lambda {
|
166
|
+
begin
|
167
|
+
@property['credits', @scenarioIdx] += @val[1]
|
168
|
+
rescue AttributeOverwrite
|
169
|
+
# Adding multiple credits for an account is a pretty common idiom.
|
170
|
+
end
|
98
171
|
})
|
99
|
-
doc('
|
100
|
-
Book the specified
|
172
|
+
doc('credits', <<'EOT'
|
173
|
+
Book the specified amounts to the account at the specified date. The
|
174
|
+
desciptions are just used for documentary purposes.
|
101
175
|
EOT
|
102
176
|
)
|
103
177
|
example('Account', '1')
|
104
|
-
arg(2, 'description', 'Short description of the transaction')
|
105
|
-
arg(3, 'amount', 'Amount to be booked.')
|
106
178
|
|
107
179
|
pattern(%w( !flags ))
|
108
180
|
doc('flags.account', <<'EOT'
|
@@ -114,28 +186,48 @@ EOT
|
|
114
186
|
# Other attributes will be added automatically.
|
115
187
|
end
|
116
188
|
|
189
|
+
def rule_aggregate
|
190
|
+
pattern(%w( _resources ), lambda {
|
191
|
+
:resources
|
192
|
+
})
|
193
|
+
descr('Aggregate resources')
|
194
|
+
|
195
|
+
pattern(%w( _tasks ), lambda {
|
196
|
+
:tasks
|
197
|
+
})
|
198
|
+
descr('Aggregate tasks')
|
199
|
+
end
|
200
|
+
|
117
201
|
def rule_alertLevel
|
118
202
|
pattern(%w( $ID ), lambda {
|
119
|
-
level = @project.
|
203
|
+
level = @project['alertLevels'].indexById(@val[0])
|
120
204
|
unless level
|
121
|
-
|
122
|
-
|
205
|
+
levels = @project['alertLevels'].map { |l| l.id }
|
206
|
+
error('bad_alert', "Unknown alert level #{@val[0]}. Must be " +
|
207
|
+
"one of #{levels.join(', ')}", @sourceFileInfo[0])
|
123
208
|
end
|
124
209
|
level
|
125
210
|
})
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
property, the value can be reported in the alert column. When multiple entries
|
131
|
-
have been specified for the property, the entry with the date closest to the
|
132
|
-
report end date will be used. Container properties will inherit the highest
|
133
|
-
alert level of all its sub properties unless it has an own journal entry dated
|
134
|
-
closer to the report end than all of its sub properties.
|
211
|
+
arg(0, 'alert level', <<'EOT'
|
212
|
+
By default supported values are ''''green'''', ''''yellow'''' and ''''red''''.
|
213
|
+
The default value is ''''green''''. You can define your own levels with
|
214
|
+
[[alertlevels]].
|
135
215
|
EOT
|
136
216
|
)
|
137
217
|
end
|
138
218
|
|
219
|
+
def rule_alertLevelDefinition
|
220
|
+
pattern(%w( $ID $STRING !color ), lambda {
|
221
|
+
[ @val[0], @val[1], @val[2] ]
|
222
|
+
})
|
223
|
+
arg(0, 'ID', "A unique ID for the alert level")
|
224
|
+
arg(1, 'color name', 'A unique name of the alert level color')
|
225
|
+
end
|
226
|
+
|
227
|
+
def rule_alertLevelDefinitions
|
228
|
+
listRule('moreAlertLevelDefinitions', '!alertLevelDefinition')
|
229
|
+
end
|
230
|
+
|
139
231
|
def rule_allocate
|
140
232
|
pattern(%w( _allocate !allocations ), lambda {
|
141
233
|
checkContainer('allocate')
|
@@ -192,7 +284,8 @@ EOT
|
|
192
284
|
end
|
193
285
|
end
|
194
286
|
})
|
195
|
-
|
287
|
+
level(:removed)
|
288
|
+
doc('limits.allocate', '')
|
196
289
|
|
197
290
|
pattern(%w( _select !allocationSelectionMode ), lambda {
|
198
291
|
@allocate.setSelectionMode(@val[1])
|
@@ -230,7 +323,38 @@ So either all mandatory resources can be allocated for the time slot, or no
|
|
230
323
|
resource will be allocated.
|
231
324
|
EOT
|
232
325
|
)
|
233
|
-
pattern(%w(
|
326
|
+
pattern(%w( !allocateShiftAssignments !shiftAssignment ), lambda {
|
327
|
+
begin
|
328
|
+
@allocate.shifts = @shiftAssignments
|
329
|
+
rescue AttributeOverwrite
|
330
|
+
# Multiple shift assignments are a common idiom, so don't warn about
|
331
|
+
# them.
|
332
|
+
end
|
333
|
+
@shiftAssignments = nil
|
334
|
+
})
|
335
|
+
level(:deprecated)
|
336
|
+
also('shifts.allocate')
|
337
|
+
doc('shift.allocate', <<'EOT'
|
338
|
+
Limits the allocations of resources during the specified interval to the
|
339
|
+
specified shift. Multiple shifts can be defined, but shift intervals may not
|
340
|
+
overlap. Allocation shifts are an additional restriction to the
|
341
|
+
[[shifts.task|task shifts]] and [[shifts.resource|resource shifts]] or
|
342
|
+
[[workinghours.resource|resource working hours]]. Allocations will only be
|
343
|
+
made for time slots that are specified as duty time in all relevant shifts.
|
344
|
+
The restriction to the shift is only active during the specified time
|
345
|
+
interval. Outside of this interval, no restrictions apply.
|
346
|
+
EOT
|
347
|
+
)
|
348
|
+
|
349
|
+
pattern(%w( !allocateShiftsAssignments !shiftAssignments ), lambda {
|
350
|
+
begin
|
351
|
+
@allocate.shifts = @shiftAssignments
|
352
|
+
rescue AttributeOverwrite
|
353
|
+
# Multiple shift assignments are a common idiom, so don't warn about
|
354
|
+
# them.
|
355
|
+
end
|
356
|
+
@shiftAssignments = nil
|
357
|
+
})
|
234
358
|
doc('shifts.allocate', <<'EOT'
|
235
359
|
Limits the allocations of resources during the specified interval to the
|
236
360
|
specified shift. Multiple shifts can be defined, but shift intervals may not
|
@@ -280,27 +404,15 @@ EOT
|
|
280
404
|
descr('Pick a random resource from the list.')
|
281
405
|
end
|
282
406
|
|
283
|
-
def
|
284
|
-
pattern(%w(
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
@allocate.shifts.project = @project
|
289
|
-
end
|
407
|
+
def rule_allocateShiftAssignments
|
408
|
+
pattern(%w( _shift ), lambda {
|
409
|
+
@shiftAssignments = @allocate.shifts
|
410
|
+
})
|
411
|
+
end
|
290
412
|
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
intervals = @val[1]
|
295
|
-
end
|
296
|
-
intervals.each do |interval|
|
297
|
-
if !@allocate.shifts.
|
298
|
-
addAssignment(ShiftAssignment.new(@val[0].scenario(@scenarioIdx),
|
299
|
-
interval))
|
300
|
-
error('shift_assignment_overlap',
|
301
|
-
'Shifts may not overlap each other.', @sourceFileInfo[0])
|
302
|
-
end
|
303
|
-
end
|
413
|
+
def rule_allocateShiftsAssignments
|
414
|
+
pattern(%w( _shifts ), lambda {
|
415
|
+
@shiftAssignments = @allocate.shifts
|
304
416
|
})
|
305
417
|
end
|
306
418
|
|
@@ -338,29 +450,38 @@ EOT
|
|
338
450
|
end
|
339
451
|
|
340
452
|
def rule_balance
|
341
|
-
pattern(%w( _balance !
|
342
|
-
|
453
|
+
pattern(%w( _balance !balanceAccounts ), lambda {
|
454
|
+
@val[1]
|
455
|
+
})
|
456
|
+
doc('balance', <<'EOT'
|
457
|
+
During report generation, TaskJuggler can consider some accounts to be revenue accounts, while other can be considered cost accounts. By using the balance attribute, two top-level accounts can be designated for a profit-loss-analysis. This analysis includes all sub accounts of these two top-level accounts.
|
458
|
+
|
459
|
+
To clear a previously set balance, just use a ''''-''''.
|
460
|
+
EOT
|
461
|
+
)
|
462
|
+
example('AccountReport')
|
463
|
+
end
|
464
|
+
|
465
|
+
def rule_balanceAccounts
|
466
|
+
pattern(%w( !accountId !accountId ), lambda {
|
467
|
+
if @val[0].parent
|
343
468
|
error('cost_acct_no_top',
|
344
|
-
"The cost account #{@val[
|
345
|
-
@sourceFileInfo[
|
469
|
+
"The cost account #{@val[0].fullId} is not a top-level account.",
|
470
|
+
@sourceFileInfo[0])
|
346
471
|
end
|
347
|
-
if @val[
|
472
|
+
if @val[1].parent
|
348
473
|
error('rev_acct_no_top',
|
349
|
-
"The revenue account #{@val[
|
350
|
-
"account.", @sourceFileInfo[
|
474
|
+
"The revenue account #{@val[1].fullId} is not a top-level " +
|
475
|
+
"account.", @sourceFileInfo[1])
|
351
476
|
end
|
352
|
-
if @val[
|
477
|
+
if @val[0] == @val[1]
|
353
478
|
error('cost_rev_same',
|
354
479
|
'The cost and revenue accounts may not be the same.',
|
355
|
-
@sourceFileInfo[
|
480
|
+
@sourceFileInfo[0])
|
356
481
|
end
|
357
|
-
[ @val[
|
482
|
+
[ @val[0], @val[1] ]
|
358
483
|
})
|
359
|
-
|
360
|
-
During report generation, TaskJuggler can consider some accounts to be revenue accounts, while other can be considered cost accounts. By using the balance attribute, two top-level accounts can be designated for a profit-loss-analysis. This analysis includes all sub accounts of these two top-level accounts.
|
361
|
-
EOT
|
362
|
-
)
|
363
|
-
arg(1, 'cost account', <<'EOT'
|
484
|
+
arg(0, 'cost account', <<'EOT'
|
364
485
|
The top-level account that is used for all cost related charges.
|
365
486
|
EOT
|
366
487
|
)
|
@@ -368,6 +489,10 @@ EOT
|
|
368
489
|
The top-level account that is used for all revenue related charges.
|
369
490
|
EOT
|
370
491
|
)
|
492
|
+
|
493
|
+
pattern([ '_-' ], lambda {
|
494
|
+
[ nil, nil ]
|
495
|
+
})
|
371
496
|
end
|
372
497
|
|
373
498
|
def rule_bookingAttributes
|
@@ -383,7 +508,7 @@ EOT
|
|
383
508
|
@booking.overtime = @val[1]
|
384
509
|
})
|
385
510
|
doc('overtime.booking', <<'EOT'
|
386
|
-
This attribute enables bookings during off-hours and
|
511
|
+
This attribute enables bookings during off-hours and leaves. It implicitly
|
387
512
|
sets the [[sloppy.booking|sloppy]] attribute accordingly.
|
388
513
|
EOT
|
389
514
|
)
|
@@ -406,7 +531,7 @@ EOT
|
|
406
531
|
})
|
407
532
|
doc('sloppy.booking', <<'EOT'
|
408
533
|
Controls how strict TaskJuggler checks booking intervals for conflicts with
|
409
|
-
working periods and
|
534
|
+
working periods and leaves. This attribute only affects the check for
|
410
535
|
conflicts. No assignments will be made unless the [[overtime.booking|
|
411
536
|
overtime]] attribute is set accordingly.
|
412
537
|
EOT
|
@@ -462,20 +587,20 @@ EOT
|
|
462
587
|
end
|
463
588
|
if masterAccounts.include?(chargeSet.master)
|
464
589
|
error('chargeset_master',
|
465
|
-
"All charge sets for this
|
466
|
-
"accounts.", @sourceFileInfo[0], @property)
|
590
|
+
"All charge sets for this property must have different " +
|
591
|
+
"top-level accounts.", @sourceFileInfo[0], @property)
|
467
592
|
end
|
468
593
|
@property['chargeset', @scenarioIdx] =
|
469
594
|
@property['chargeset', @scenarioIdx] + [ chargeSet ]
|
470
595
|
})
|
471
596
|
doc('chargeset', <<'EOT'
|
472
|
-
A chargeset defines how the turnover associated with the
|
473
|
-
to one or more accounts. A
|
474
|
-
chargeset must deal with a different top-level account. A charge set
|
475
|
-
of one or more accounts. Each account must be a leaf account. The
|
476
|
-
may be followed by a percentage value that determines the share for
|
477
|
-
account. The total percentage of all accounts must be exactly 100%. If
|
478
|
-
accounts don't have a percentage specification, the remainder to 100% is
|
597
|
+
A chargeset defines how the turnover associated with the property will be
|
598
|
+
charged to one or more accounts. A property may have any number of charge sets,
|
599
|
+
but each chargeset must deal with a different top-level account. A charge set
|
600
|
+
consists of one or more accounts. Each account must be a leaf account. The
|
601
|
+
account ID may be followed by a percentage value that determines the share for
|
602
|
+
this account. The total percentage of all accounts must be exactly 100%. If
|
603
|
+
some accounts don't have a percentage specification, the remainder to 100% is
|
479
604
|
distributed evenly to them.
|
480
605
|
EOT
|
481
606
|
)
|
@@ -500,6 +625,20 @@ EOT
|
|
500
625
|
|
501
626
|
def rule_chargeSetItem
|
502
627
|
pattern(%w( !accountId !optionalPercent ), lambda {
|
628
|
+
if @property.is_a?(Task)
|
629
|
+
aggregate = :tasks
|
630
|
+
elsif @property.is_a?(Resource)
|
631
|
+
aggregate = :resources
|
632
|
+
else
|
633
|
+
raise "Unknown property type #{@property.class}"
|
634
|
+
end
|
635
|
+
|
636
|
+
if @val[0].get('aggregate') != aggregate
|
637
|
+
error('account_bad_aggregate',
|
638
|
+
"The account #{@val[0].fullId} cannot aggregate amounts " +
|
639
|
+
"related to #{aggregate}.")
|
640
|
+
end
|
641
|
+
|
503
642
|
[ @val[0], @val[1] ]
|
504
643
|
})
|
505
644
|
arg(0, 'account', 'The ID of a previously defined leaf account.')
|
@@ -883,21 +1022,22 @@ EOT
|
|
883
1022
|
|
884
1023
|
def rule_exportHeader
|
885
1024
|
pattern(%w( _export !optionalID $STRING ), lambda {
|
886
|
-
|
1025
|
+
newReport(@val[1], @val[2], :export, @sourceFileInfo[0])
|
1026
|
+
@property.set('formats', [ :tjp ])
|
887
1027
|
|
888
1028
|
# By default, we export all scenarios.
|
889
1029
|
scenarios = Array.new(@project.scenarios.items) { |i| i }
|
890
1030
|
scenarios.delete_if { |sc| !@project.scenario(sc).get('active') }
|
891
|
-
|
1031
|
+
@property.set('scenarios', scenarios)
|
892
1032
|
# Show all tasks, sorted by seqno-up.
|
893
|
-
|
894
|
-
|
1033
|
+
@property.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
|
1034
|
+
@property.set('sortTasks', [ [ 'seqno', true, -1 ] ])
|
895
1035
|
# Show all resources, sorted by seqno-up.
|
896
|
-
|
897
|
-
|
898
|
-
|
1036
|
+
@property.set('hideResource',
|
1037
|
+
LogicalExpression.new(LogicalOperation.new(0)))
|
1038
|
+
@property.set('sortResources', [ [ 'seqno', true, -1 ] ])
|
899
1039
|
})
|
900
|
-
arg(
|
1040
|
+
arg(2, 'file name', <<'EOT'
|
901
1041
|
The name of the report file to generate. It must end with a .tjp or .tji
|
902
1042
|
extension, or use . to use the standard output channel.
|
903
1043
|
EOT
|
@@ -940,7 +1080,7 @@ EOT
|
|
940
1080
|
)
|
941
1081
|
allOrNothingListRule('exportableResourceAttributes',
|
942
1082
|
{ 'booking' => 'Include bookings',
|
943
|
-
'
|
1083
|
+
'leaves' => 'Include leaves',
|
944
1084
|
'workinghours' => 'Include working hours' })
|
945
1085
|
|
946
1086
|
pattern(%w( !rollupresource ))
|
@@ -1418,6 +1558,15 @@ EOT
|
|
1418
1558
|
pattern(['_isresource', '_(', '_)' ])
|
1419
1559
|
doc('isresource', 'The result is true if the property is a resource.')
|
1420
1560
|
|
1561
|
+
pattern(%w( _isresponsibilityof _( $ID _, $ID _) ))
|
1562
|
+
doc('isresponsibilityof', <<'EOT'
|
1563
|
+
Will evaluate to true for tasks that have the specified resource
|
1564
|
+
assigned as [[responsible]] in the specified scenario.
|
1565
|
+
EOT
|
1566
|
+
)
|
1567
|
+
arg(2, 'Resource ID', 'The ID of a defined resource')
|
1568
|
+
arg(4, 'Scenario ID', 'A scenario ID')
|
1569
|
+
|
1421
1570
|
pattern(['_istask', '_(', '_)' ])
|
1422
1571
|
doc('istask', 'The result is true if the property is a task.')
|
1423
1572
|
|
@@ -1461,6 +1610,19 @@ EOT
|
|
1461
1610
|
)
|
1462
1611
|
end
|
1463
1612
|
|
1613
|
+
def rule_hideaccount
|
1614
|
+
pattern(%w( _hideaccount !logicalExpression ), lambda {
|
1615
|
+
@property.set('hideAccount', @val[1])
|
1616
|
+
})
|
1617
|
+
doc('hideaccount', <<'EOT'
|
1618
|
+
Do not include accounts that match the specified logical expression. If the
|
1619
|
+
report is sorted in ''''tree'''' mode (default) then enclosing accounts are
|
1620
|
+
listed even if the expression matches the account.
|
1621
|
+
EOT
|
1622
|
+
)
|
1623
|
+
also(%w( sortaccounts ))
|
1624
|
+
end
|
1625
|
+
|
1464
1626
|
def rule_hidejournalentry
|
1465
1627
|
pattern(%w( _hidejournalentry !flagLogicalExpression ), lambda {
|
1466
1628
|
@property.set('hideJournalEntry', @val[1])
|
@@ -1530,8 +1692,9 @@ EOT
|
|
1530
1692
|
unless @project.scenario(sc).get('active')
|
1531
1693
|
warning('ical_sc_disabled',
|
1532
1694
|
"Scenario #{sc} has been disabled")
|
1695
|
+
else
|
1696
|
+
@property.set('scenarios', [ @val[1] ])
|
1533
1697
|
end
|
1534
|
-
@property.set('scenarios', [ @val[1] ])
|
1535
1698
|
})
|
1536
1699
|
doc('scenario.ical', <<'EOT'
|
1537
1700
|
Id of the scenario that should be included in the report. By default, the
|
@@ -1543,21 +1706,23 @@ EOT
|
|
1543
1706
|
|
1544
1707
|
def rule_iCalReportHeader
|
1545
1708
|
pattern(%w( _icalreport !optionalID $STRING ), lambda {
|
1546
|
-
|
1547
|
-
|
1709
|
+
newReport(@val[1], @val[2], :iCal, @sourceFileInfo[0])
|
1548
1710
|
@property.set('formats', [ :iCal ])
|
1711
|
+
|
1549
1712
|
# By default, we export only the first scenario.
|
1550
|
-
|
1713
|
+
unless @project.scenario(0).get('active')
|
1714
|
+
@property.set('scenarios', [ 0 ])
|
1715
|
+
end
|
1551
1716
|
# Show all tasks, sorted by seqno-up.
|
1552
|
-
|
1553
|
-
|
1717
|
+
@property.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
|
1718
|
+
@property.set('sortTasks', [ [ 'seqno', true, -1 ] ])
|
1554
1719
|
# Show all resources, sorted by seqno-up.
|
1555
|
-
|
1556
|
-
|
1557
|
-
|
1720
|
+
@property.set('hideResource',
|
1721
|
+
LogicalExpression.new(LogicalOperation.new(0)))
|
1722
|
+
@property.set('sortResources', [ [ 'seqno', true, -1 ] ])
|
1558
1723
|
# Show all journal entries.
|
1559
|
-
|
1560
|
-
|
1724
|
+
@property.set('hideJournalEntry',
|
1725
|
+
LogicalExpression.new(LogicalOperation.new(0)))
|
1561
1726
|
})
|
1562
1727
|
arg(1, 'file name', <<'EOT'
|
1563
1728
|
The name of the report file to generate without an extension. Use . to use
|
@@ -1869,17 +2034,11 @@ EOT
|
|
1869
2034
|
optional
|
1870
2035
|
repeatable
|
1871
2036
|
|
1872
|
-
pattern(%w( _alert
|
1873
|
-
|
1874
|
-
unless level
|
1875
|
-
error('bad_alert', "Unknown alert level #{@val[1]}. Must be " +
|
1876
|
-
'green, yellow or red', @sourceFileInfo[0])
|
1877
|
-
end
|
1878
|
-
@journalEntry.alertLevel = level
|
2037
|
+
pattern(%w( _alert !alertLevel ), lambda {
|
2038
|
+
@journalEntry.alertLevel = @val[1]
|
1879
2039
|
})
|
1880
2040
|
doc('alert', <<'EOT'
|
1881
|
-
Specify the alert level for this entry.
|
1882
|
-
red. The default value is green. This attribute is inteded to be used for
|
2041
|
+
Specify the alert level for this entry. This attribute is inteded to be used for
|
1883
2042
|
status reporting. When used for a journal entry that is associated with a
|
1884
2043
|
property, the value can be reported in the alert column. When multiple entries
|
1885
2044
|
have been specified for the property, the entry with the date closest to the
|
@@ -1960,6 +2119,98 @@ EOT
|
|
1960
2119
|
arg(0, 'resource', 'The ID of a leaf resource')
|
1961
2120
|
end
|
1962
2121
|
|
2122
|
+
def rule_leave
|
2123
|
+
pattern(%w( !leaveType !vacationName !intervalOrDate ), lambda {
|
2124
|
+
Leave.new(@val[0].intern, @val[2], @val[1])
|
2125
|
+
})
|
2126
|
+
end
|
2127
|
+
|
2128
|
+
def rule_leaveList
|
2129
|
+
listRule('moreLeaveList', '!leave')
|
2130
|
+
end
|
2131
|
+
|
2132
|
+
def rule_leaveName
|
2133
|
+
optional
|
2134
|
+
pattern(%w( $STRING ), lambda {
|
2135
|
+
@val[0]
|
2136
|
+
})
|
2137
|
+
arg(0, 'name', 'An optional name or reason for the leave')
|
2138
|
+
end
|
2139
|
+
|
2140
|
+
def rule_leaveAllowance
|
2141
|
+
pattern(%w( _annual !valDate !optionalMinus !workingDuration ), lambda {
|
2142
|
+
LeaveAllowance.new(:annual, @val[1], (@val[2] ? -1 : 1) * @val[3])
|
2143
|
+
})
|
2144
|
+
end
|
2145
|
+
|
2146
|
+
def rule_leaveAllowanceList
|
2147
|
+
listRule('moreLeaveAllowanceList', '!leaveAllowance')
|
2148
|
+
end
|
2149
|
+
|
2150
|
+
def rule_leaveAllowances
|
2151
|
+
pattern(%w( _leaveallowances !leaveAllowanceList ), lambda {
|
2152
|
+
appendScListAttribute('leaveallowances', @val[1])
|
2153
|
+
})
|
2154
|
+
doc('leaveallowance', <<'EOT'
|
2155
|
+
Add or subtract leave allowances. Currently, only allowances for the annual
|
2156
|
+
leaves are supported. Allowances can be negative to deal with expired
|
2157
|
+
allowances. The ''''leaveallowancebalance'''' report [[columns|column]] can be
|
2158
|
+
used to report the current annual leave balance.
|
2159
|
+
|
2160
|
+
Leaves outside of the project period are silently ignored and will not be
|
2161
|
+
considered in the leave balance calculation. Therefor, leave allowances are
|
2162
|
+
only allowed within the project period.
|
2163
|
+
EOT
|
2164
|
+
)
|
2165
|
+
level(:beta)
|
2166
|
+
example('Leave')
|
2167
|
+
end
|
2168
|
+
|
2169
|
+
def rule_leaves
|
2170
|
+
pattern(%w( _leaves !leaveList ), lambda {
|
2171
|
+
LeaveList.new(@val[1])
|
2172
|
+
})
|
2173
|
+
doc('leaves', <<'EOT'
|
2174
|
+
Describe a list of leave periods. A leave can be due to a public holiday,
|
2175
|
+
personal or sick leave. At global scope, the leaves determine which day is
|
2176
|
+
considered a working day. Subsequent resource definitions will inherit the
|
2177
|
+
leave list.
|
2178
|
+
|
2179
|
+
Leaves can be defined at global level, at resource level and at shift level
|
2180
|
+
and intervals may overlap. The leave types have different priorities. A higher
|
2181
|
+
priority leave type can overwrite a lower priority type. This means that
|
2182
|
+
resource level leaves can overwrite global leaves when they have a higher
|
2183
|
+
priority. A sub resource can overwrite a leave of a enclosing resource.
|
2184
|
+
|
2185
|
+
Leave periods outside of the project interval are silently ignored. For leave
|
2186
|
+
periods that are partially outside of the project period only the part inside
|
2187
|
+
the project period will be considered.
|
2188
|
+
EOT
|
2189
|
+
)
|
2190
|
+
level(:beta)
|
2191
|
+
example('Leave')
|
2192
|
+
end
|
2193
|
+
|
2194
|
+
def rule_leaveType
|
2195
|
+
singlePattern('_project')
|
2196
|
+
descr('Assignment to another project (lowest priority)')
|
2197
|
+
|
2198
|
+
singlePattern('_annual')
|
2199
|
+
descr('Personal leave based on annual allowance')
|
2200
|
+
|
2201
|
+
singlePattern('_special')
|
2202
|
+
descr('Personal leave based on a special occasion')
|
2203
|
+
|
2204
|
+
singlePattern('_sick')
|
2205
|
+
descr('Sick leave')
|
2206
|
+
|
2207
|
+
singlePattern('_unpaid')
|
2208
|
+
descr('Unpaid leave')
|
2209
|
+
|
2210
|
+
singlePattern('_holiday')
|
2211
|
+
descr('Public or bank holiday (highest priority)')
|
2212
|
+
end
|
2213
|
+
|
1963
2214
|
def rule_limitAttributes
|
1964
2215
|
optionsRule('limitAttributesBody')
|
1965
2216
|
end
|
@@ -2296,10 +2547,6 @@ EOT
|
|
2296
2547
|
commaListRule('!journalSortCriterium')
|
2297
2548
|
end
|
2298
2549
|
|
2299
|
-
def rule_moreLeafResources
|
2300
|
-
commaListRule('!resourceLeafList')
|
2301
|
-
end
|
2302
|
-
|
2303
2550
|
def rule_moreListOfDays
|
2304
2551
|
commaListRule('!weekDayInterval')
|
2305
2552
|
end
|
@@ -2333,6 +2580,7 @@ Defines a navigator object with the specified ID. This object can be used in
|
|
2333
2580
|
reports to include a navigation bar with references to other reports.
|
2334
2581
|
EOT
|
2335
2582
|
)
|
2583
|
+
example('navigator')
|
2336
2584
|
end
|
2337
2585
|
|
2338
2586
|
def rule_navigatorAttributes
|
@@ -2512,6 +2760,7 @@ EOT
|
|
2512
2760
|
error('operand_unkn_scen', "Unknown scenario ID #{scenario}",
|
2513
2761
|
@sourceFileInfo[0])
|
2514
2762
|
end
|
2763
|
+
# TODO: Do at least some basic sanity checks of the attribute is valid.
|
2515
2764
|
LogicalAttribute.new(attribute, @project.scenario(scenarioIdx))
|
2516
2765
|
})
|
2517
2766
|
pattern(%w( !date ), lambda {
|
@@ -2629,6 +2878,13 @@ EOT
|
|
2629
2878
|
)
|
2630
2879
|
end
|
2631
2880
|
|
2881
|
+
def rule_optionalMinus
|
2882
|
+
optional
|
2883
|
+
pattern(%w( _- ), lambda {
|
2884
|
+
true
|
2885
|
+
})
|
2886
|
+
end
|
2887
|
+
|
2632
2888
|
def rule_optionalPercent
|
2633
2889
|
optional
|
2634
2890
|
pattern(%w( !number _% ), lambda {
|
@@ -2697,6 +2953,44 @@ EOT
|
|
2697
2953
|
repeatable
|
2698
2954
|
optional
|
2699
2955
|
|
2956
|
+
pattern(%w( _alertlevels !alertLevelDefinitions ), lambda {
|
2957
|
+
if @val[1].length < 2
|
2958
|
+
error('too_few_alert_levels',
|
2959
|
+
'You must specify at least 2 different alert levels.',
|
2960
|
+
@sourceFileInfo[1])
|
2961
|
+
end
|
2962
|
+
levels = @project['alertLevels']
|
2963
|
+
levels.clear
|
2964
|
+
@val[1].each do |level|
|
2965
|
+
if levels.indexById(level[0])
|
2966
|
+
error('alert_level_redef',
|
2967
|
+
"Alert level '#{level[0]}' has been defined multiple times.",
|
2968
|
+
@sourceFileInfo[1])
|
2969
|
+
end
|
2970
|
+
|
2971
|
+
if levels.indexByName(level[1])
|
2972
|
+
error('alert_name_redef',
|
2973
|
+
"Alert level name '#{level[1]}' has been defined multiple " +
|
2974
|
+
"times.", @sourceFileInfo[1])
|
2975
|
+
end
|
2976
|
+
|
2977
|
+
@project['alertLevels'].add(AlertLevelDefinition.new(*level))
|
2978
|
+
end
|
2979
|
+
})
|
2980
|
+
level(:beta)
|
2981
|
+
doc('alertlevels', <<'EOT'
|
2982
|
+
By default TaskJuggler supports the pre-defined alert levels: green, yellow
|
2983
|
+
and red. This attribute can be used to replace them with your own set of alert
|
2984
|
+
levels. You can define any number of levels, but you need to define at least
|
2985
|
+
two and they must be specified in ascending order from the least severity to
|
2986
|
+
highest severity. Additionally, you need to provide a 15x15 pixel image file
|
2987
|
+
with the name ''''flag-X.png'''' for each level where ''''X'''' matches the ID
|
2988
|
+
of the alert level. These files need to be in the ''''icons'''' directory to
|
2989
|
+
be found by the browser when showing HTML reports.
|
2990
|
+
EOT
|
2991
|
+
)
|
2992
|
+
example('AlertLevels')
|
2993
|
+
|
2700
2994
|
pattern(%w( !currencyFormat ), lambda {
|
2701
2995
|
@project['currencyFormat'] = @val[0]
|
2702
2996
|
})
|
@@ -2860,7 +3154,7 @@ to the specified workinghours and vacation. It affects the conversion of
|
|
2860
3154
|
working hours, working days, working weeks, working months and working years
|
2861
3155
|
into each other.
|
2862
3156
|
|
2863
|
-
When public holidays and
|
3157
|
+
When public holidays and leaves are disregarded, this value should be equal
|
2864
3158
|
to the number of working days per week times 52.1428 (the average number of
|
2865
3159
|
weeks per year). E. g. for a culture with 5 working days it is 260.714 (the
|
2866
3160
|
default), for 6 working days it is 312.8568 and for 7 working days it is
|
@@ -2919,26 +3213,18 @@ EOT
|
|
2919
3213
|
def rule_projectionAttributes
|
2920
3214
|
optional
|
2921
3215
|
repeatable
|
2922
|
-
pattern(%w( _sloppy )
|
2923
|
-
|
2924
|
-
|
2925
|
-
|
2926
|
-
})
|
2927
|
-
doc('sloppy.projection', <<'EOT'
|
2928
|
-
The sloppy projection mode has been deprecated. Please use
|
2929
|
-
[[trackingscenario]] feature instead.
|
2930
|
-
EOT
|
2931
|
-
)
|
3216
|
+
pattern(%w( _sloppy ))
|
3217
|
+
level(:deprecated)
|
3218
|
+
also('trackingscenario')
|
3219
|
+
doc('sloppy.projection', '')
|
2932
3220
|
|
2933
3221
|
pattern(%w( _strict ), lambda {
|
2934
3222
|
warning('projection_strict',
|
2935
3223
|
'The strict mode is now always used.')
|
2936
3224
|
})
|
2937
|
-
|
2938
|
-
|
2939
|
-
|
2940
|
-
EOT
|
2941
|
-
)
|
3225
|
+
level(:deprecated)
|
3226
|
+
also('trackingscenario')
|
3227
|
+
doc('strict.projection', '')
|
2942
3228
|
end
|
2943
3229
|
|
2944
3230
|
def rule_projectProlog
|
@@ -2969,15 +3255,13 @@ EOT
|
|
2969
3255
|
lastSyntaxToken(1)
|
2970
3256
|
doc('include.project', <<'EOT'
|
2971
3257
|
Includes the specified file name as if its contents would be written
|
2972
|
-
instead of the include property.
|
2973
|
-
|
2974
|
-
statements or report definitions, the filenames are relative to file
|
3258
|
+
instead of the include property. When the included files contains other
|
3259
|
+
include statements or report definitions, the filenames are relative to file
|
2975
3260
|
where they are defined in.
|
2976
3261
|
|
2977
|
-
|
2978
|
-
header section.
|
2979
|
-
|
2980
|
-
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.
|
3262
|
+
This version of the include directive may only be used inside the [[project]]
|
3263
|
+
header section. The included files must only contain content that may be
|
3264
|
+
present in a project header section.
|
2981
3265
|
EOT
|
2982
3266
|
)
|
2983
3267
|
end
|
@@ -2992,7 +3276,8 @@ statement itself. When the included files contains other include
|
|
2992
3276
|
statements or report definitions, the filenames are relative to file
|
2993
3277
|
where they are defined in.
|
2994
3278
|
|
2995
|
-
The included file may only contain macro definitions.
|
3279
|
+
The included file may only contain macro definitions. This version of the
|
3280
|
+
include directive can only be used before the [[project]] header.
|
2996
3281
|
EOT
|
2997
3282
|
)
|
2998
3283
|
end
|
@@ -3021,8 +3306,6 @@ EOT
|
|
3021
3306
|
@project['revenueAccount'] = @val[0][1]
|
3022
3307
|
})
|
3023
3308
|
|
3024
|
-
pattern(%w( !export ))
|
3025
|
-
|
3026
3309
|
pattern(%w( _flags !declareFlagList ), lambda {
|
3027
3310
|
unless @project['flags'].include?(@val[1])
|
3028
3311
|
@project['flags'] += @val[1]
|
@@ -3033,9 +3316,14 @@ Declare one or more flag for later use. Flags can be used to mark tasks, resourc
|
|
3033
3316
|
EOT
|
3034
3317
|
)
|
3035
3318
|
|
3036
|
-
pattern(%w( !iCalReport ))
|
3037
3319
|
pattern(%w( !propertiesInclude ))
|
3038
3320
|
|
3321
|
+
pattern(%w( !leaves ), lambda {
|
3322
|
+
@val[0].each do |v|
|
3323
|
+
@project['leaves'] << v
|
3324
|
+
end
|
3325
|
+
})
|
3326
|
+
|
3039
3327
|
pattern(%w( !limits ), lambda {
|
3040
3328
|
@project['limits'] = @val[0]
|
3041
3329
|
})
|
@@ -3048,8 +3336,6 @@ EOT
|
|
3048
3336
|
|
3049
3337
|
pattern(%w( !macro ))
|
3050
3338
|
|
3051
|
-
pattern(%w( !nikuReport ))
|
3052
|
-
|
3053
3339
|
pattern(%w( !navigator ))
|
3054
3340
|
|
3055
3341
|
pattern(%w( _projectid $ID ), lambda {
|
@@ -3082,12 +3368,10 @@ Set the default rate for all subsequently defined resources. The rate describes
|
|
3082
3368
|
EOT
|
3083
3369
|
)
|
3084
3370
|
|
3085
|
-
pattern(%w( !
|
3371
|
+
pattern(%w( !reportProperties ))
|
3086
3372
|
pattern(%w( !resource ))
|
3087
|
-
pattern(%w( !tagfile ))
|
3088
3373
|
pattern(%w( !shift ))
|
3089
3374
|
pattern(%w( !statusSheet ))
|
3090
|
-
pattern(%w( !statusSheetReport ))
|
3091
3375
|
|
3092
3376
|
pattern(%w( _supplement !supplement ))
|
3093
3377
|
doc('supplement', <<'EOT'
|
@@ -3105,10 +3389,11 @@ EOT
|
|
3105
3389
|
|
3106
3390
|
pattern(%w( !task ))
|
3107
3391
|
pattern(%w( !timeSheet ))
|
3108
|
-
pattern(%w( !timeSheetReport ))
|
3109
3392
|
pattern(%w( _vacation !vacationName !intervals ), lambda {
|
3110
3393
|
begin
|
3111
|
-
@
|
3394
|
+
@val[2].each do |interval|
|
3395
|
+
@project['leaves'] << Leave.new(:holiday, interval)
|
3396
|
+
end
|
3112
3397
|
rescue AttributeOverwrite
|
3113
3398
|
end
|
3114
3399
|
})
|
@@ -3129,6 +3414,7 @@ EOT
|
|
3129
3414
|
def rule_propertiesInclude
|
3130
3415
|
pattern(%w( _include !includeProperties !properties . ), lambda {
|
3131
3416
|
})
|
3417
|
+
lastSyntaxToken(1)
|
3132
3418
|
doc('include.properties', <<'EOT'
|
3133
3419
|
Includes the specified file name as if its contents would be written
|
3134
3420
|
instead of the include property. The only exception is the include
|
@@ -3157,11 +3443,6 @@ EOT
|
|
3157
3443
|
else
|
3158
3444
|
attr = @property.get(@val[1])
|
3159
3445
|
end
|
3160
|
-
unless attr.is_a?(Array)
|
3161
|
-
error('purge_no_list',
|
3162
|
-
"#{@val[1]} is not a list attribute. Only those can be purged.",
|
3163
|
-
@sourceFileInfo[1])
|
3164
|
-
end
|
3165
3446
|
if @property.attributeDefinition(@val[1]).scenarioSpecific
|
3166
3447
|
@property.getAttribute(@val[1], @scenarioIdx).reset
|
3167
3448
|
else
|
@@ -3169,11 +3450,16 @@ EOT
|
|
3169
3450
|
end
|
3170
3451
|
})
|
3171
3452
|
doc('purge', <<'EOT'
|
3172
|
-
|
3173
|
-
|
3174
|
-
|
3175
|
-
|
3176
|
-
|
3453
|
+
Many attributes inherit their values from the enclosing property or the global
|
3454
|
+
scope. In certain circumstances, this is not desirable, e. g. for list
|
3455
|
+
attributes. A list attribute is any attribute that takes a comma separated
|
3456
|
+
list of values as argument. [[allocate]] and [[flags.task]] are
|
3457
|
+
good examples of commonly used list attributes. By defining values for
|
3458
|
+
such a list attribute in a nested property, the new values will be appended to
|
3459
|
+
the list that was inherited from the enclosing property. The purge
|
3460
|
+
attribute resets any attribute to its default value. A subsequent definition
|
3461
|
+
for the attribute within the property will then add their values to an empty
|
3462
|
+
list. The value of the enclosing property is not affected by purge.
|
3177
3463
|
EOT
|
3178
3464
|
)
|
3179
3465
|
arg(1, 'attribute', 'Any name of a list attribute')
|
@@ -3202,35 +3488,29 @@ EOT
|
|
3202
3488
|
})
|
3203
3489
|
end
|
3204
3490
|
|
3205
|
-
def rule_report
|
3206
|
-
pattern(%w( !reportHeader !reportBody ), lambda {
|
3207
|
-
@property = @property.parent
|
3208
|
-
})
|
3209
|
-
doc('report', <<'EOT'
|
3210
|
-
Reports are used to store and vizualize the results of a scheduled project.
|
3211
|
-
The content, the output format and the appearance of a report can be adjusted
|
3212
|
-
with report attributes. Reports can be nested to create structured document
|
3213
|
-
trees. As with other properties, the resource attributes can be inherited from
|
3214
|
-
the enclosing report or the project.
|
3215
3491
|
|
3216
|
-
|
3217
|
-
|
3218
|
-
|
3219
|
-
|
3220
|
-
|
3221
|
-
|
3492
|
+
def rule_reports
|
3493
|
+
pattern(%w( !accountReport ))
|
3494
|
+
pattern(%w( !resourceReport ))
|
3495
|
+
pattern(%w( !taskReport ))
|
3496
|
+
pattern(%w( !textReport ))
|
3497
|
+
end
|
3222
3498
|
|
3223
|
-
|
3224
|
-
|
3225
|
-
|
3226
|
-
|
3499
|
+
def rule_reportableAttributes
|
3500
|
+
singlePattern('_annualleave')
|
3501
|
+
descr(<<'EOT'
|
3502
|
+
The number of annual leave units within the reported time period. The unit
|
3503
|
+
can be adjusted with [[loadunit]].
|
3227
3504
|
EOT
|
3228
|
-
|
3229
|
-
also(%w( resourcereport taskreport textreport ))
|
3230
|
-
end
|
3505
|
+
)
|
3231
3506
|
|
3507
|
+
singlePattern('_annualleavebalance')
|
3508
|
+
descr(<<'EOT'
|
3509
|
+
The balance of the annual leave at the end of the reporting interval. The unit
|
3510
|
+
can be adjusted with [[loadunit]].
|
3511
|
+
EOT
|
3512
|
+
)
|
3232
3513
|
|
3233
|
-
def rule_reportableAttributes
|
3234
3514
|
singlePattern('_alert')
|
3235
3515
|
descr(<<'EOT'
|
3236
3516
|
The alert level of the property that was reported with the date closest to the
|
@@ -3242,9 +3522,13 @@ EOT
|
|
3242
3522
|
)
|
3243
3523
|
|
3244
3524
|
singlePattern('_alertmessages')
|
3525
|
+
level(:deprecated)
|
3526
|
+
also('journal')
|
3245
3527
|
descr('Deprecated. Please use ''''journal'''' instead')
|
3246
3528
|
|
3247
3529
|
singlePattern('_alertsummaries')
|
3530
|
+
level(:deprecated)
|
3531
|
+
also('journal')
|
3248
3532
|
descr('Deprecated. Please use ''''journal'''' instead')
|
3249
3533
|
|
3250
3534
|
singlePattern('_alerttrend')
|
@@ -3255,6 +3539,12 @@ or flat.
|
|
3255
3539
|
EOT
|
3256
3540
|
)
|
3257
3541
|
|
3542
|
+
singlePattern('_balance')
|
3543
|
+
descr('The account balance at the beginning of the reported period.')
|
3544
|
+
|
3545
|
+
singlePattern('_bsi')
|
3546
|
+
descr('The hierarchical or work breakdown structure index (i. e. 1.2.3)')
|
3547
|
+
|
3258
3548
|
singlePattern('_chart')
|
3259
3549
|
descr(<<'EOT'
|
3260
3550
|
A Gantt chart. This column type requires all lines to have the same fixed
|
@@ -3282,6 +3572,8 @@ EOT
|
|
3282
3572
|
pattern([ '_completed' ], lambda {
|
3283
3573
|
'complete'
|
3284
3574
|
})
|
3575
|
+
level(:deprecated)
|
3576
|
+
also('complete')
|
3285
3577
|
descr('Deprecated alias for complete')
|
3286
3578
|
|
3287
3579
|
singlePattern('_criticalness')
|
@@ -3368,17 +3660,35 @@ EOT
|
|
3368
3660
|
descr(<<'EOT'
|
3369
3661
|
The Full-Time-Equivalent of a resource or group. This is the ratio of the
|
3370
3662
|
resource working time and the global working time. Working time is defined by
|
3371
|
-
working hours and
|
3663
|
+
working hours and leaves. The FTE value can vary over time and is
|
3372
3664
|
calculated for the report interval or the user specified interval.
|
3665
|
+
EOT
|
3666
|
+
)
|
3667
|
+
|
3668
|
+
singlePattern('_gauge')
|
3669
|
+
descr(<<'EOT'
|
3670
|
+
When [[complete]] values have been provided to capture the actual progress on
|
3671
|
+
tasks, the gauge column will list whether the task is ahead of, behind or on
|
3672
|
+
schedule.
|
3373
3673
|
EOT
|
3374
3674
|
)
|
3375
3675
|
|
3376
3676
|
singlePattern('_headcount')
|
3377
|
-
descr('
|
3677
|
+
descr(<<'EOT'
|
3678
|
+
For resources this is the headcount number of the resource or resource group.
|
3679
|
+
For a single resource this is the [[efficiency]] rounded to the next integer.
|
3680
|
+
For a group it is the sum of the sub resources headcount.
|
3681
|
+
|
3682
|
+
For tasks it's the number of different resources allocated to the task during
|
3683
|
+
the report interval. Resources are weighted with their rounded efficiencies.
|
3684
|
+
EOT
|
3685
|
+
)
|
3378
3686
|
|
3379
3687
|
pattern([ '_hierarchindex' ], lambda {
|
3380
3688
|
'bsi'
|
3381
3689
|
})
|
3690
|
+
level(:deprecated)
|
3691
|
+
also('bsi')
|
3382
3692
|
descr('Deprecated alias for bsi')
|
3383
3693
|
|
3384
3694
|
singlePattern('_hourly')
|
@@ -3411,12 +3721,18 @@ EOT
|
|
3411
3721
|
)
|
3412
3722
|
|
3413
3723
|
singlePattern('_journal_sub')
|
3724
|
+
level(:deprecated)
|
3725
|
+
also('journal')
|
3414
3726
|
descr('Deprecated. Please use ''''journal'''' instead')
|
3415
3727
|
|
3416
3728
|
singlePattern('_journalmessages')
|
3729
|
+
level(:deprecated)
|
3730
|
+
also('journal')
|
3417
3731
|
descr('Deprecated. Please use ''''journal'''' instead')
|
3418
3732
|
|
3419
3733
|
singlePattern('_journalsummaries')
|
3734
|
+
level(:deprecated)
|
3735
|
+
also('journal')
|
3420
3736
|
descr('Deprecated. Please use ''''journal'''' instead')
|
3421
3737
|
|
3422
3738
|
singlePattern('_line')
|
@@ -3521,6 +3837,20 @@ EOT
|
|
3521
3837
|
singlePattern('_seqno')
|
3522
3838
|
descr('The index of the item based on the declaration order')
|
3523
3839
|
|
3840
|
+
singlePattern('_sickleave')
|
3841
|
+
descr(<<'EOT'
|
3842
|
+
The number of sick leave units within the reported time period. The unit can
|
3843
|
+
be adjusted with [[loadunit]].
|
3844
|
+
EOT
|
3845
|
+
)
|
3846
|
+
|
3847
|
+
singlePattern('_specialleave')
|
3848
|
+
descr(<<'EOT'
|
3849
|
+
The number of special leave units within the reported time period. The unit
|
3850
|
+
can be adjusted with [[loadunit]].
|
3851
|
+
EOT
|
3852
|
+
)
|
3853
|
+
|
3524
3854
|
singlePattern('_start')
|
3525
3855
|
descr('The start date of the task')
|
3526
3856
|
|
@@ -3544,10 +3874,16 @@ EOT
|
|
3544
3874
|
pattern([ '_wbs' ], lambda {
|
3545
3875
|
'bsi'
|
3546
3876
|
})
|
3877
|
+
level(:deprecated)
|
3878
|
+
also('bsi')
|
3547
3879
|
descr('Deprecated alias for bsi.')
|
3548
3880
|
|
3549
|
-
singlePattern('
|
3550
|
-
descr('
|
3881
|
+
singlePattern('_unpaidleave')
|
3882
|
+
descr(<<'EOT'
|
3883
|
+
The number of unpaid leave units within the reported time period. The unit
|
3884
|
+
can be adjusted with [[loadunit]].
|
3885
|
+
EOT
|
3886
|
+
)
|
3551
3887
|
|
3552
3888
|
singlePattern('_weekly')
|
3553
3889
|
descr('A group of columns with one column for each week')
|
@@ -3561,6 +3897,23 @@ EOT
|
|
3561
3897
|
optional
|
3562
3898
|
repeatable
|
3563
3899
|
|
3900
|
+
pattern(%w( _accountroot !accountId), lambda {
|
3901
|
+
if @val[1].leaf?
|
3902
|
+
error('accountroot_leaf',
|
3903
|
+
"#{@val[1].fullId} is not a container account",
|
3904
|
+
@sourceFileInfo[1])
|
3905
|
+
end
|
3906
|
+
@property.set('accountRoot', @val[1])
|
3907
|
+
})
|
3908
|
+
doc('accountroot', <<'EOT'
|
3909
|
+
Only accounts below the specified root-level accounts are exported. The exported
|
3910
|
+
accounts will have the ID of the root-level account stripped from their ID, so that
|
3911
|
+
the sub-accounts of the root-level account become top-level accounts in the report
|
3912
|
+
file.
|
3913
|
+
EOT
|
3914
|
+
)
|
3915
|
+
example('AccountReport')
|
3916
|
+
|
3564
3917
|
pattern(%w( !balance ), lambda {
|
3565
3918
|
@property.set('costAccount', @val[0][0])
|
3566
3919
|
@property.set('revenueAccount', @val[0][1])
|
@@ -3586,6 +3939,7 @@ be interpreted as [[Rich_Text_Attributes|Rich Text]].
|
|
3586
3939
|
EOT
|
3587
3940
|
)
|
3588
3941
|
arg(1, 'text', 'The text')
|
3942
|
+
example('textreport')
|
3589
3943
|
|
3590
3944
|
pattern(%w( _columns !columnDef !moreColumnDef ), lambda {
|
3591
3945
|
columns = [ @val[1] ]
|
@@ -3631,6 +3985,7 @@ Define a text section that is put at the bottom of the report. The
|
|
3631
3985
|
text will be interpreted as [[Rich_Text_Attributes|Rich Text]].
|
3632
3986
|
EOT
|
3633
3987
|
)
|
3988
|
+
example('textreport')
|
3634
3989
|
also(%w( epilog header prolog ))
|
3635
3990
|
|
3636
3991
|
pattern(%w( !formats ))
|
@@ -3643,10 +3998,12 @@ Define a text section that is put at the top of the report. The
|
|
3643
3998
|
text will be interpreted as [[Rich_Text_Attributes|Rich Text]].
|
3644
3999
|
EOT
|
3645
4000
|
)
|
4001
|
+
example('textreport')
|
3646
4002
|
also(%w( epilog footer prolog ))
|
3647
4003
|
|
3648
4004
|
pattern(%w( !headline ))
|
3649
4005
|
pattern(%w( !hidejournalentry ))
|
4006
|
+
pattern(%w( !hideaccount ))
|
3650
4007
|
pattern(%w( !hideresource ))
|
3651
4008
|
pattern(%w( !hidetask ))
|
3652
4009
|
pattern(%w( !journalReportAttributes ))
|
@@ -3667,6 +4024,7 @@ will be interpreted as [[Rich_Text_Attributes|Rich Text]]. The margin will not
|
|
3667
4024
|
span the [[header]] or [[footer]] sections.
|
3668
4025
|
EOT
|
3669
4026
|
)
|
4027
|
+
example('textreport')
|
3670
4028
|
|
3671
4029
|
pattern(%w( _loadunit !loadunit ), lambda {
|
3672
4030
|
@property.set('loadUnit', @val[1])
|
@@ -3698,7 +4056,7 @@ EOT
|
|
3698
4056
|
also(%w( epilog footer header ))
|
3699
4057
|
|
3700
4058
|
pattern(%w( !purge ))
|
3701
|
-
pattern(%w( !
|
4059
|
+
pattern(%w( !reports ))
|
3702
4060
|
|
3703
4061
|
pattern(%w( _right $STRING ), lambda {
|
3704
4062
|
@property.set('right', newRichText(@val[1], @sourceFileInfo[1]))
|
@@ -3709,7 +4067,9 @@ will be interpreted as [[Rich_Text_Attributes|Rich Text]]. The margin will not
|
|
3709
4067
|
span the [[header]] or [[footer]] sections.
|
3710
4068
|
EOT
|
3711
4069
|
)
|
4070
|
+
example('textreport')
|
3712
4071
|
|
4072
|
+
pattern(%w( !rollupaccount ))
|
3713
4073
|
pattern(%w( !rollupresource ))
|
3714
4074
|
pattern(%w( !rolluptask ))
|
3715
4075
|
|
@@ -3737,6 +4097,7 @@ used.
|
|
3737
4097
|
EOT
|
3738
4098
|
)
|
3739
4099
|
|
4100
|
+
pattern(%w( !sortAccounts ))
|
3740
4101
|
pattern(%w( !sortJournalEntries ))
|
3741
4102
|
pattern(%w( !sortResources ))
|
3742
4103
|
pattern(%w( !sortTasks ))
|
@@ -3834,6 +4195,31 @@ EOT
|
|
3834
4195
|
singlePattern('$ID')
|
3835
4196
|
end
|
3836
4197
|
|
4198
|
+
def rule_reportName
|
4199
|
+
pattern(%w( $STRING ), lambda {
|
4200
|
+
@val[0]
|
4201
|
+
})
|
4202
|
+
arg(0, 'name', <<'EOT'
|
4203
|
+
The name of the report. This will be the base name for generated output files.
|
4204
|
+
The suffix will depend on the specified [[formats]]. It will also be used in
|
4205
|
+
navigation bars.
|
4206
|
+
|
4207
|
+
By default, report definitions do not generate any files. With more complex
|
4208
|
+
projects, most report definitions will be used to describe elements of
|
4209
|
+
composed reports. If you want to generate a file from this report, you must
|
4210
|
+
specify the list of [[formats]] that you want to generate. The report name
|
4211
|
+
will then be used as a base name to create the file. The suffix will be
|
4212
|
+
appended based on the generated format.
|
4213
|
+
|
4214
|
+
Reports have a local name space. All IDs and file names must be unique within
|
4215
|
+
the reports that belong to the same enclosing report. To reference a report
|
4216
|
+
for inclusion into another report, you need to specify the full report ID.
|
4217
|
+
This is composed of the report ID, prefixed by a dot-separated list of all
|
4218
|
+
parent report IDs.
|
4219
|
+
EOT
|
4220
|
+
)
|
4221
|
+
end
|
4222
|
+
|
3837
4223
|
def rule_reportPeriod
|
3838
4224
|
pattern(%w( _period !interval ), lambda {
|
3839
4225
|
@property.set('start', @val[1].start)
|
@@ -3846,6 +4232,28 @@ EOT
|
|
3846
4232
|
)
|
3847
4233
|
end
|
3848
4234
|
|
4235
|
+
def rule_reportProperties
|
4236
|
+
pattern(%w( !export ))
|
4237
|
+
pattern(%w( !iCalReport ))
|
4238
|
+
pattern(%w( !nikuReport ))
|
4239
|
+
pattern(%w( !reports ))
|
4240
|
+
pattern(%w( !tagfile ))
|
4241
|
+
pattern(%w( !statusSheetReport ))
|
4242
|
+
pattern(%w( !timeSheetReport ))
|
4243
|
+
end
|
4244
|
+
|
4245
|
+
def rule_reportPropertiesBody
|
4246
|
+
optional
|
4247
|
+
repeatable
|
4248
|
+
|
4249
|
+
pattern(%w( !macro ))
|
4250
|
+
pattern(%w( !reportProperties ))
|
4251
|
+
end
|
4252
|
+
|
4253
|
+
def rule_reportPropertiesFile
|
4254
|
+
pattern(%w( !reportPropertiesBody . ))
|
4255
|
+
end
|
4256
|
+
|
3849
4257
|
def rule_reportStart
|
3850
4258
|
pattern(%w( _start !date ), lambda {
|
3851
4259
|
if @val[1] > @property.get('end')
|
@@ -3866,93 +4274,6 @@ EOT
|
|
3866
4274
|
optionsRule('reportAttributes')
|
3867
4275
|
end
|
3868
4276
|
|
3869
|
-
def rule_reportHeader
|
3870
|
-
pattern(%w( !reportType !optionalID $STRING ), lambda {
|
3871
|
-
if @property.nil? && !@reportprefix.empty?
|
3872
|
-
@property = @project.report(@reportprefix)
|
3873
|
-
end
|
3874
|
-
if @val[1]
|
3875
|
-
id = (@property ? @property.fullId + '.' : '') + @val[1]
|
3876
|
-
if @project.report(id)
|
3877
|
-
error('report_exists', "report #{id} has already been defined.",
|
3878
|
-
@sourceFileInfo[1], @property)
|
3879
|
-
end
|
3880
|
-
end
|
3881
|
-
@property = Report.new(@project, @val[1], @val[2], @property)
|
3882
|
-
@property.sourceFileInfo = @sourceFileInfo[0]
|
3883
|
-
@property.inheritAttributes
|
3884
|
-
case @val[0]
|
3885
|
-
when 'taskreport'
|
3886
|
-
@property.typeSpec = :taskreport
|
3887
|
-
unless @property.modified?('columns')
|
3888
|
-
# Set the default columns for this report.
|
3889
|
-
%w( bsi name start end effort chart ).each do |col|
|
3890
|
-
@property.get('columns') <<
|
3891
|
-
TableColumnDefinition.new(col, columnTitle(col))
|
3892
|
-
end
|
3893
|
-
end
|
3894
|
-
# Show all tasks, sorted by tree, start-up, seqno-up.
|
3895
|
-
unless @property.modified?('hideTask')
|
3896
|
-
@property.set('hideTask',
|
3897
|
-
LogicalExpression.new(LogicalOperation.new(0)))
|
3898
|
-
end
|
3899
|
-
unless @property.modified?('softTask')
|
3900
|
-
@property.set('sortTasks',
|
3901
|
-
[ [ 'tree', true, -1 ],
|
3902
|
-
[ 'start', true, 0 ],
|
3903
|
-
[ 'seqno', true, -1 ] ])
|
3904
|
-
end
|
3905
|
-
# Show no resources, but set sorting to id-up.
|
3906
|
-
unless @property.modified?('hideResource')
|
3907
|
-
@property.set('hideResource',
|
3908
|
-
LogicalExpression.new(LogicalOperation.new(1)))
|
3909
|
-
end
|
3910
|
-
unless @property.modified?('sortResources')
|
3911
|
-
@property.set('sortResources', [ [ 'id', true, -1 ] ])
|
3912
|
-
end
|
3913
|
-
when 'resourcereport'
|
3914
|
-
@property.typeSpec = :resourcereport
|
3915
|
-
if @property.modified?('columns')
|
3916
|
-
# Set the default columns for this report.
|
3917
|
-
%w( no name ).each do |col|
|
3918
|
-
@property.get('columns') <<
|
3919
|
-
TableColumnDefinition.new(col, columnTitle(col))
|
3920
|
-
end
|
3921
|
-
end
|
3922
|
-
# Show all resources, sorted by tree and id-up.
|
3923
|
-
unless @property.modified?('hideResource')
|
3924
|
-
@property.set('hideResource',
|
3925
|
-
LogicalExpression.new(LogicalOperation.new(0)))
|
3926
|
-
end
|
3927
|
-
unless @property.modified?('sortResources')
|
3928
|
-
@property.set('sortResources', [ [ 'tree', true, -1 ],
|
3929
|
-
[ 'id', true, -1 ] ])
|
3930
|
-
end
|
3931
|
-
# Hide all resources, but set sorting to tree, start-up, seqno-up.
|
3932
|
-
unless @property.modified?('hideTask')
|
3933
|
-
@property.set('hideTask',
|
3934
|
-
LogicalExpression.new(LogicalOperation.new(1)))
|
3935
|
-
end
|
3936
|
-
unless @property.modified?('sortTasks')
|
3937
|
-
@property.set('sortTasks',
|
3938
|
-
[ [ 'tree', true, -1 ],
|
3939
|
-
[ 'start', true, 0 ],
|
3940
|
-
[ 'seqno', true, -1 ] ])
|
3941
|
-
end
|
3942
|
-
when 'textreport'
|
3943
|
-
@property.typeSpec = :textreport
|
3944
|
-
else
|
3945
|
-
raise "Unsupported report type #{@val[0]}"
|
3946
|
-
end
|
3947
|
-
})
|
3948
|
-
arg(2, 'name', <<'EOT'
|
3949
|
-
The name of the report. This will be the base name for generated output files.
|
3950
|
-
The suffix will depend on the specified [[formats]].It will also be used in
|
3951
|
-
navigation bars.
|
3952
|
-
EOT
|
3953
|
-
)
|
3954
|
-
end
|
3955
|
-
|
3956
4277
|
def rule_reportTitle
|
3957
4278
|
pattern(%w( _title $STRING ), lambda {
|
3958
4279
|
@property.set('title', @val[1])
|
@@ -3964,47 +4285,6 @@ EOT
|
|
3964
4285
|
)
|
3965
4286
|
end
|
3966
4287
|
|
3967
|
-
def rule_reportType
|
3968
|
-
singlePattern('_resourcereport')
|
3969
|
-
doc('resourcereport', <<'EOT'
|
3970
|
-
The report lists resources and their respective values in a table. The task
|
3971
|
-
that are the resources are allocated to can be listed as well. To reduce the
|
3972
|
-
list of included resources, you can use the [[hideresource]],
|
3973
|
-
[[rollupresource]] or [[resourceroot]] attributes. The order of the task can
|
3974
|
-
be controlled with [[sortresources]]. If the first sorting criteria is tree
|
3975
|
-
sorting, the parent resources will always be included to form the tree.
|
3976
|
-
Tree sorting is the default. You need to change it if you do not want certain
|
3977
|
-
parent resources to be included in the report.
|
3978
|
-
|
3979
|
-
The tasks that the resources are allocated to can be included as well. Use the
|
3980
|
-
[[hidetask]] attribute for this. See [[report]] for a complete list of
|
3981
|
-
attributes and the full syntax for this keyword.
|
3982
|
-
EOT
|
3983
|
-
)
|
3984
|
-
singlePattern('_taskreport')
|
3985
|
-
doc('taskreport', <<'EOT'
|
3986
|
-
The report lists tasks and their respective values in a table. To reduce the
|
3987
|
-
list of included tasks, you can use the [[hidetask]], [[rolluptask]] or
|
3988
|
-
[[taskroot]] attributes. The order of the task can be controlled with
|
3989
|
-
[[sorttasks]]. If the first sorting criteria is tree sorting, the parent tasks
|
3990
|
-
will always be included to form the tree. Tree sorting is the default. You
|
3991
|
-
need to change it if you do not want certain parent tasks to be included in
|
3992
|
-
the report.
|
3993
|
-
|
3994
|
-
The resources that are allocated to each task can be listed as well. Use the
|
3995
|
-
[[hideresource]] attribute for this. See [[report]] for a complete list of
|
3996
|
-
attributes and the full syntax for this keyword.
|
3997
|
-
EOT
|
3998
|
-
)
|
3999
|
-
singlePattern('_textreport')
|
4000
|
-
doc('textreport', <<'EOT'
|
4001
|
-
This report consists of 5 RichText sections, a header, a center section with a
|
4002
|
-
left and right margin and a footer. The sections may contain the output of
|
4003
|
-
other defined reports. See [[report]] for further details.
|
4004
|
-
EOT
|
4005
|
-
)
|
4006
|
-
end
|
4007
|
-
|
4008
4288
|
def rule_resource
|
4009
4289
|
pattern(%w( !resourceHeader !resourceBody ), lambda {
|
4010
4290
|
@property = @property.parent
|
@@ -4117,16 +4397,70 @@ EOT
|
|
4117
4397
|
end
|
4118
4398
|
|
4119
4399
|
def rule_resourceLeafList
|
4120
|
-
|
4121
|
-
[ @val[0] ] + (@val[1].nil? ? [] : @val[1])
|
4122
|
-
})
|
4400
|
+
listRule('moreResourceLeafList', '!leafResourceId')
|
4123
4401
|
end
|
4124
4402
|
|
4125
4403
|
def rule_resourceList
|
4126
4404
|
listRule('moreResources', '!resourceId')
|
4127
4405
|
end
|
4128
4406
|
|
4407
|
+
def rule_resourceReport
|
4408
|
+
pattern(%w( !resourceReportHeader !reportBody ), lambda {
|
4409
|
+
@property = @property.parent
|
4410
|
+
})
|
4411
|
+
doc('resourcereport', <<'EOT'
|
4412
|
+
The report lists resources and their respective values in a table. The task
|
4413
|
+
that are the resources are allocated to can be listed as well. To reduce the
|
4414
|
+
list of included resources, you can use the [[hideresource]],
|
4415
|
+
[[rollupresource]] or [[resourceroot]] attributes. The order of the task can
|
4416
|
+
be controlled with [[sortresources]]. If the first sorting criteria is tree
|
4417
|
+
sorting, the parent resources will always be included to form the tree.
|
4418
|
+
Tree sorting is the default. You need to change it if you do not want certain
|
4419
|
+
parent resources to be included in the report.
|
4420
|
+
|
4421
|
+
The tasks that the resources are allocated to can be included as well. Use the
|
4422
|
+
[[hidetask]] attribute for this.
|
4423
|
+
EOT
|
4424
|
+
)
|
4425
|
+
end
|
4426
|
+
|
4427
|
+
def rule_resourceReportHeader
|
4428
|
+
pattern(%w( _resourcereport !optionalID !reportName ), lambda {
|
4429
|
+
newReport(@val[1], @val[2], :resourcereport, @sourceFileInfo[0])
|
4430
|
+
|
4431
|
+
if @property.modified?('columns')
|
4432
|
+
# Set the default columns for this report.
|
4433
|
+
%w( no name ).each do |col|
|
4434
|
+
@property.get('columns') <<
|
4435
|
+
TableColumnDefinition.new(col, columnTitle(col))
|
4436
|
+
end
|
4437
|
+
end
|
4438
|
+
# Show all resources, sorted by tree and id-up.
|
4439
|
+
unless @property.modified?('hideResource')
|
4440
|
+
@property.set('hideResource',
|
4441
|
+
LogicalExpression.new(LogicalOperation.new(0)))
|
4442
|
+
end
|
4443
|
+
unless @property.modified?('sortResources')
|
4444
|
+
@property.set('sortResources', [ [ 'tree', true, -1 ],
|
4445
|
+
[ 'id', true, -1 ] ])
|
4446
|
+
end
|
4447
|
+
# Hide all resources, but set sorting to tree, start-up, seqno-up.
|
4448
|
+
unless @property.modified?('hideTask')
|
4449
|
+
@property.set('hideTask',
|
4450
|
+
LogicalExpression.new(LogicalOperation.new(1)))
|
4451
|
+
end
|
4452
|
+
unless @property.modified?('sortTasks')
|
4453
|
+
@property.set('sortTasks',
|
4454
|
+
[ [ 'tree', true, -1 ],
|
4455
|
+
[ 'start', true, 0 ],
|
4456
|
+
[ 'seqno', true, -1 ] ])
|
4457
|
+
end
|
4458
|
+
})
|
4459
|
+
end
|
4460
|
+
|
4129
4461
|
def rule_resourceScenarioAttributes
|
4462
|
+
pattern(%w( !chargeset ))
|
4463
|
+
|
4130
4464
|
pattern(%w( _efficiency !number ), lambda {
|
4131
4465
|
@property['efficiency', @scenarioIdx] = @val[1]
|
4132
4466
|
})
|
@@ -4184,6 +4518,15 @@ EOT
|
|
4184
4518
|
|
4185
4519
|
pattern(%w( !fail ))
|
4186
4520
|
|
4521
|
+
pattern(%w( !leaveAllowances ))
|
4522
|
+
|
4523
|
+
pattern(%w( !leaves ), lambda {
|
4524
|
+
begin
|
4525
|
+
@property['leaves', @scenarioIdx] += @val[0]
|
4526
|
+
rescue AttributeOverwrite
|
4527
|
+
end
|
4528
|
+
})
|
4529
|
+
|
4187
4530
|
pattern(%w( !limits ), lambda {
|
4188
4531
|
@property['limits', @scenarioIdx] = @val[0]
|
4189
4532
|
})
|
@@ -4221,14 +4564,36 @@ The rate specifies the daily cost of the resource.
|
|
4221
4564
|
EOT
|
4222
4565
|
)
|
4223
4566
|
|
4224
|
-
pattern(%w(
|
4567
|
+
pattern(%w( !resourceShiftAssignments !shiftAssignments ), lambda {
|
4568
|
+
checkContainer('shifts')
|
4569
|
+
# Set same value again to set the 'provided' state for the attribute.
|
4570
|
+
begin
|
4571
|
+
@property['shifts', @scenarioIdx] = @shiftAssignments
|
4572
|
+
rescue AttributeOverwrite
|
4573
|
+
# Multiple shift assignments are a common idiom, so don't warn about
|
4574
|
+
# them.
|
4575
|
+
end
|
4576
|
+
@shiftAssignments = nil
|
4577
|
+
})
|
4578
|
+
level(:deprecated)
|
4579
|
+
also('shift.resource')
|
4225
4580
|
doc('shift.resource', <<'EOT'
|
4226
4581
|
This keyword has been deprecated. Please use [[shifts.resource|shifts
|
4227
4582
|
(resource)]] instead.
|
4228
4583
|
EOT
|
4229
4584
|
)
|
4230
4585
|
|
4231
|
-
pattern(%w(
|
4586
|
+
pattern(%w( !resourceShiftsAssignments !shiftAssignments ), lambda {
|
4587
|
+
checkContainer('shifts')
|
4588
|
+
# Set same value again to set the 'provided' state for the attribute.
|
4589
|
+
begin
|
4590
|
+
@property['shifts', @scenarioIdx] = @shiftAssignments
|
4591
|
+
rescue AttributeOverwrite
|
4592
|
+
# Multiple shift assignments are a common idiom, so don't warn about
|
4593
|
+
# them.
|
4594
|
+
end
|
4595
|
+
@shiftAssignments = nil
|
4596
|
+
})
|
4232
4597
|
doc('shifts.resource', <<'EOT'
|
4233
4598
|
Limits the working time of a resource to a defined shift during the specified
|
4234
4599
|
interval. Multiple shifts can be defined, but shift intervals may not overlap.
|
@@ -4239,8 +4604,10 @@ EOT
|
|
4239
4604
|
|
4240
4605
|
pattern(%w( _vacation !vacationName !intervals ), lambda {
|
4241
4606
|
begin
|
4242
|
-
@
|
4243
|
-
|
4607
|
+
@val[2].each do |interval|
|
4608
|
+
# We map the old 'vacation' attribute to public holidays.
|
4609
|
+
@property['leaves', @scenarioIdx] << Leave.new(:holiday, interval)
|
4610
|
+
end
|
4244
4611
|
rescue AttributeOverwrite
|
4245
4612
|
end
|
4246
4613
|
})
|
@@ -4258,6 +4625,29 @@ EOT
|
|
4258
4625
|
# Other attributes will be added automatically.
|
4259
4626
|
end
|
4260
4627
|
|
4628
|
+
def rule_resourceShiftAssignments
|
4629
|
+
pattern(%w( _shift ), lambda {
|
4630
|
+
@shiftAssignments = @property['shifts', @scenarioIdx]
|
4631
|
+
})
|
4632
|
+
end
|
4633
|
+
|
4634
|
+
def rule_resourceShiftsAssignments
|
4635
|
+
pattern(%w( _shifts ), lambda {
|
4636
|
+
@shiftAssignments = @property['shifts', @scenarioIdx]
|
4637
|
+
})
|
4638
|
+
end
|
4639
|
+
|
4640
|
+
def rule_rollupaccount
|
4641
|
+
pattern(%w( _rollupaccount !logicalExpression ), lambda {
|
4642
|
+
@property.set('rollupAccount', @val[1])
|
4643
|
+
})
|
4644
|
+
doc('rollupaccount', <<'EOT'
|
4645
|
+
Do not show sub-accounts of accounts that match the specified logical
|
4646
|
+
expression.
|
4647
|
+
EOT
|
4648
|
+
)
|
4649
|
+
end
|
4650
|
+
|
4261
4651
|
def rule_rollupresource
|
4262
4652
|
pattern(%w( _rollupresource !logicalExpression ), lambda {
|
4263
4653
|
@property.set('rollupResource', @val[1])
|
@@ -4323,6 +4713,8 @@ EOT
|
|
4323
4713
|
pattern(%w( _disabled ), lambda {
|
4324
4714
|
@property.set('active', false)
|
4325
4715
|
})
|
4716
|
+
level(:deprecated)
|
4717
|
+
also('active')
|
4326
4718
|
doc('disabled', <<'EOT'
|
4327
4719
|
This attribute is deprecated. Please use [active] instead.
|
4328
4720
|
|
@@ -4334,6 +4726,8 @@ EOT
|
|
4334
4726
|
pattern(%w( _enabled ), lambda {
|
4335
4727
|
@property.set('active', true)
|
4336
4728
|
})
|
4729
|
+
level(:deprecated)
|
4730
|
+
also('active')
|
4337
4731
|
doc('enabled', <<'EOT'
|
4338
4732
|
This attribute is deprecated. Please use [active] instead.
|
4339
4733
|
|
@@ -4342,11 +4736,9 @@ scenario.
|
|
4342
4736
|
EOT
|
4343
4737
|
)
|
4344
4738
|
|
4345
|
-
pattern(%w( _projection !projection )
|
4346
|
-
|
4347
|
-
|
4348
|
-
'[[trackingscenario]] feature instead.')
|
4349
|
-
})
|
4739
|
+
pattern(%w( _projection !projection ))
|
4740
|
+
level(:deprecated)
|
4741
|
+
also('booking.task')
|
4350
4742
|
doc('projection', <<'EOT'
|
4351
4743
|
This keyword has been deprecated! Don't use it anymore!
|
4352
4744
|
|
@@ -4400,7 +4792,7 @@ EOT
|
|
4400
4792
|
def rule_scenarioIdCol
|
4401
4793
|
pattern(%w( $ID_WITH_COLON ), lambda {
|
4402
4794
|
if (@scenarioIdx = @project.scenarioIdx(@val[0])).nil?
|
4403
|
-
error('unknown_scenario_id', "Unknown scenario: @val[0]",
|
4795
|
+
error('unknown_scenario_id', "Unknown scenario: #{@val[0]}",
|
4404
4796
|
@sourceFileInfo[0])
|
4405
4797
|
end
|
4406
4798
|
})
|
@@ -4432,7 +4824,7 @@ EOT
|
|
4432
4824
|
doc('shift', <<'EOT'
|
4433
4825
|
A shift combines several workhours related settings in a reusable entity.
|
4434
4826
|
Besides the weekly working hours it can also hold information such as
|
4435
|
-
|
4827
|
+
leaves and a time zone.
|
4436
4828
|
|
4437
4829
|
Shifts have a global name space. All IDs must be unique within the shifts of
|
4438
4830
|
the project.
|
@@ -4444,27 +4836,23 @@ EOT
|
|
4444
4836
|
def rule_shiftAssignment
|
4445
4837
|
pattern(%w( !shiftId !intervalOptional ), lambda {
|
4446
4838
|
# Make sure we have a ShiftAssignment for the property.
|
4447
|
-
|
4448
|
-
|
4839
|
+
unless @shiftAssignments
|
4840
|
+
@shiftAssignments = ShiftAssignments.new
|
4841
|
+
@shiftAssignments.project = @project
|
4842
|
+
end
|
4449
4843
|
|
4450
4844
|
if @val[1].nil?
|
4451
4845
|
interval = TimeInterval.new(@project['start'], @project['end'])
|
4452
4846
|
else
|
4453
4847
|
interval = @val[1]
|
4454
4848
|
end
|
4455
|
-
if
|
4456
|
-
|
4849
|
+
if !@shiftAssignments.addAssignment(
|
4850
|
+
ShiftAssignment.new(@val[0].scenario(@scenarioIdx), interval))
|
4457
4851
|
error('shift_assignment_overlap',
|
4458
4852
|
'Shifts may not overlap each other.',
|
4459
4853
|
@sourceFileInfo[0], @property)
|
4460
4854
|
end
|
4461
|
-
|
4462
|
-
begin
|
4463
|
-
@property['shifts', @scenarioIdx] = sa
|
4464
|
-
rescue AttributeOverwrite
|
4465
|
-
# Multiple shift assignments are a common idiom, so don't warn about
|
4466
|
-
# them.
|
4467
|
-
end
|
4855
|
+
@shiftAssignments.assignments.last
|
4468
4856
|
})
|
4469
4857
|
end
|
4470
4858
|
|
@@ -4513,11 +4901,22 @@ EOT
|
|
4513
4901
|
end
|
4514
4902
|
|
4515
4903
|
def rule_shiftScenarioAttributes
|
4904
|
+
pattern(%w( !leaves ), lambda {
|
4905
|
+
begin
|
4906
|
+
@property['leaves', @scenarioIdx] += @val[0]
|
4907
|
+
rescue AttributeOverwrite
|
4908
|
+
end
|
4909
|
+
})
|
4910
|
+
|
4516
4911
|
pattern(%w( _replace ), lambda {
|
4517
4912
|
@property['replace', @scenarioIdx] = true
|
4518
4913
|
})
|
4519
4914
|
doc('replace', <<'EOT'
|
4520
|
-
|
4915
|
+
This replace mode is only effective for shifts that are assigned to resources
|
4916
|
+
directly. When replace mode is activated the leave definitions of the shift
|
4917
|
+
will replace all the leave definitions of the resource for the given period.
|
4918
|
+
|
4919
|
+
The mode is not effective for shifts that are assigned to tasks or allocations.
|
4521
4920
|
EOT
|
4522
4921
|
)
|
4523
4922
|
|
@@ -4544,8 +4943,13 @@ EOT
|
|
4544
4943
|
)
|
4545
4944
|
|
4546
4945
|
pattern(%w( _vacation !vacationName !intervalsOptional ), lambda {
|
4547
|
-
|
4548
|
-
@
|
4946
|
+
begin
|
4947
|
+
@val[2].each do |interval|
|
4948
|
+
# We map the old 'vacation' attribute to public holidays.
|
4949
|
+
@property['leaves', @scenarioIdx] << Leave.new(:holiday, interval)
|
4950
|
+
end
|
4951
|
+
rescue AttributeOverwrite
|
4952
|
+
end
|
4549
4953
|
})
|
4550
4954
|
doc('vacation.shift', <<'EOT'
|
4551
4955
|
Specify a vacation period associated with this shift.
|
@@ -4640,6 +5044,19 @@ EOT
|
|
4640
5044
|
)
|
4641
5045
|
end
|
4642
5046
|
|
5047
|
+
def rule_sortAccounts
|
5048
|
+
pattern(%w( _sortaccounts !sortCriteria ), lambda {
|
5049
|
+
@property.set('sortAccounts', @val[1])
|
5050
|
+
})
|
5051
|
+
doc('sortaccounts', <<'EOT'
|
5052
|
+
Determines how the accounts are sorted in the report. Multiple criteria can be
|
5053
|
+
specified as a comma separated list. If one criteria is not sufficient to sort
|
5054
|
+
a group of accounts, the next criteria will be used to sort the accounts in
|
5055
|
+
this group.
|
5056
|
+
EOT
|
5057
|
+
)
|
5058
|
+
end
|
5059
|
+
|
4643
5060
|
def rule_sortResources
|
4644
5061
|
pattern(%w( _sortresources !sortCriteria ), lambda {
|
4645
5062
|
@property.set('sortResources', @val[1])
|
@@ -4680,27 +5097,23 @@ EOT
|
|
4680
5097
|
end
|
4681
5098
|
def rule_ssReportHeader
|
4682
5099
|
pattern(%w( _statussheetreport !optionalID $STRING ), lambda {
|
4683
|
-
|
4684
|
-
|
4685
|
-
|
4686
|
-
|
4687
|
-
|
4688
|
-
end
|
4689
|
-
else
|
4690
|
-
fileName = "statusSheet#{@project.reports.length + 1}"
|
5100
|
+
newReport(@val[1], @val[2], :statusSheet, @sourceFileInfo[0])
|
5101
|
+
@property.set('formats', [ :tjp ])
|
5102
|
+
|
5103
|
+
unless @project.scenario(0).get('active')
|
5104
|
+
@property.set('scenarios', [ 0 ])
|
4691
5105
|
end
|
4692
|
-
report = newReport(@val[1], fileName, :statusSheet, @sourceFileInfo[0])
|
4693
|
-
report.set('scenarios', [ 0 ])
|
4694
5106
|
# Show all tasks, sorted by id-up.
|
4695
|
-
|
4696
|
-
|
5107
|
+
@property.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
|
5108
|
+
@property.set('sortTasks', [ [ 'id', true, -1 ] ])
|
4697
5109
|
# Show all resources, sorted by seqno-up.
|
4698
|
-
|
4699
|
-
|
4700
|
-
|
4701
|
-
|
5110
|
+
@property.set('hideResource',
|
5111
|
+
LogicalExpression.new(LogicalOperation.new(0)))
|
5112
|
+
@property.set('sortResources', [ [ 'seqno', true, -1 ] ])
|
5113
|
+
@property.set('loadUnit', :hours)
|
5114
|
+
@property.set('definitions', [])
|
4702
5115
|
})
|
4703
|
-
arg(
|
5116
|
+
arg(2, 'file name', <<'EOT'
|
4704
5117
|
The name of the status sheet report file to generate. It must end with a .tji
|
4705
5118
|
extension, or use . to use the standard output channel.
|
4706
5119
|
EOT
|
@@ -4759,7 +5172,7 @@ EOT
|
|
4759
5172
|
@sourceFileInfo[0])
|
4760
5173
|
@journalEntry.alertLevel = @val[1]
|
4761
5174
|
@journalEntry.author = @sheetAuthor
|
4762
|
-
|
5175
|
+
@journalEntry.moderators << @sheetModerator
|
4763
5176
|
})
|
4764
5177
|
end
|
4765
5178
|
|
@@ -4812,8 +5225,18 @@ EOT
|
|
4812
5225
|
'No trackingscenario defined.')
|
4813
5226
|
end
|
4814
5227
|
@sheetAuthor = @val[1]
|
5228
|
+
@sheetModerator = @val[1]
|
4815
5229
|
@sheetStart = @val[2].start
|
4816
5230
|
@sheetEnd = @val[2].end
|
5231
|
+
# Make sure that we don't have any status sheet entries from the same
|
5232
|
+
# author for the same report period. There may have been a previous
|
5233
|
+
# submission of the same report and this is an update to it. All old
|
5234
|
+
# entries must be removed before we process the sheet.
|
5235
|
+
@project['journal'].delete_if do |e|
|
5236
|
+
# Journal entries from status sheets have the sheet end date as entry
|
5237
|
+
# date.
|
5238
|
+
e.moderators.include?(@sheetModerator) && e.date == @sheetEnd
|
5239
|
+
end
|
4817
5240
|
})
|
4818
5241
|
arg(1, 'reporter', <<'EOT'
|
4819
5242
|
The ID of a defined resource. This identifies the status reporter. Unless the
|
@@ -4941,7 +5364,7 @@ EOT
|
|
4941
5364
|
pattern(%w( _report !reportId ), lambda {
|
4942
5365
|
@property = @val[1]
|
4943
5366
|
})
|
4944
|
-
arg(1, 'report ID', 'The ID of an already defined report.')
|
5367
|
+
arg(1, 'report ID', 'The absolute ID of an already defined report.')
|
4945
5368
|
end
|
4946
5369
|
|
4947
5370
|
def rule_supplementResource
|
@@ -4955,7 +5378,7 @@ EOT
|
|
4955
5378
|
pattern(%w( _task !taskId ), lambda {
|
4956
5379
|
@property = @val[1]
|
4957
5380
|
})
|
4958
|
-
arg(1, 'task ID', 'The ID of an already defined task.')
|
5381
|
+
arg(1, 'task ID', 'The absolute ID of an already defined task.')
|
4959
5382
|
end
|
4960
5383
|
|
4961
5384
|
def rule_tagfile
|
@@ -4973,16 +5396,16 @@ EOT
|
|
4973
5396
|
|
4974
5397
|
def rule_tagfileHeader
|
4975
5398
|
pattern(%w( _tagfile !optionalID $STRING ), lambda {
|
4976
|
-
|
4977
|
-
|
5399
|
+
newReport(@val[1], @val[2], :tagfile, @sourceFileInfo[0])
|
4978
5400
|
@property.set('formats', [ :ctags ])
|
5401
|
+
|
4979
5402
|
# Include all tasks.
|
4980
|
-
|
4981
|
-
|
5403
|
+
@property.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
|
5404
|
+
@property.set('sortTasks', [ [ 'seqno', true, -1 ] ])
|
4982
5405
|
# Include all resources.
|
4983
|
-
|
4984
|
-
|
4985
|
-
|
5406
|
+
@property.set('hideResource',
|
5407
|
+
LogicalExpression.new(LogicalOperation.new(0)))
|
5408
|
+
@property.set('sortResources', [ [ 'seqno', true, -1 ] ])
|
4986
5409
|
})
|
4987
5410
|
arg(2, 'file name', <<'EOT'
|
4988
5411
|
The name of the tagfile to generate. You can leave it empty and it will
|
@@ -5032,6 +5455,7 @@ EOT
|
|
5032
5455
|
@property.adopt(task)
|
5033
5456
|
end
|
5034
5457
|
})
|
5458
|
+
level(:experimental)
|
5035
5459
|
doc('adopt.task', <<'EOT'
|
5036
5460
|
Add a previously defined task to the sub-tasks of this task. This can be used
|
5037
5461
|
to create virtual sub projects that contain of task trees that were defined as
|
@@ -5039,10 +5463,7 @@ sub tasks of other tasks. Adopted tasks don't inherit anything from their step
|
|
5039
5463
|
parents. However, the adopting task is scheduled to fit all adopted childs as
|
5040
5464
|
well.
|
5041
5465
|
|
5042
|
-
|
5043
|
-
Adopted tasks may not have overlaping sub trees.
|
5044
|
-
|
5045
|
-
'''This feature is experimental right now. Don't use it!'''.
|
5466
|
+
A top-level tasks must never include the same task more than once.
|
5046
5467
|
EOT
|
5047
5468
|
)
|
5048
5469
|
|
@@ -5135,7 +5556,7 @@ Specifies the minimum required gap between the end of a preceding task and the
|
|
5135
5556
|
start of this task, or the start of a following task and the end of this task.
|
5136
5557
|
This is working time, not calendar time. 7d means 7 working days, not one
|
5137
5558
|
week. Whether a day is considered a working day or not depends on the defined
|
5138
|
-
working hours and global
|
5559
|
+
working hours and global leaves.
|
5139
5560
|
EOT
|
5140
5561
|
)
|
5141
5562
|
|
@@ -5285,15 +5706,65 @@ EOT
|
|
5285
5706
|
})
|
5286
5707
|
end
|
5287
5708
|
|
5288
|
-
def
|
5289
|
-
|
5290
|
-
|
5291
|
-
# TODO
|
5709
|
+
def rule_taskReport
|
5710
|
+
pattern(%w( !taskReportHeader !reportBody ), lambda {
|
5711
|
+
@property = @property.parent
|
5292
5712
|
})
|
5293
|
-
doc('
|
5294
|
-
|
5713
|
+
doc('taskreport', <<'EOT'
|
5714
|
+
The report lists tasks and their respective values in a table. To reduce the
|
5715
|
+
list of included tasks, you can use the [[hidetask]], [[rolluptask]] or
|
5716
|
+
[[taskroot]] attributes. The order of the task can be controlled with
|
5717
|
+
[[sorttasks]]. If the first sorting criteria is tree sorting, the parent tasks
|
5718
|
+
will always be included to form the tree. Tree sorting is the default. You
|
5719
|
+
need to change it if you do not want certain parent tasks to be included in
|
5720
|
+
the report.
|
5721
|
+
|
5722
|
+
The resources that are allocated to each task can be listed as well. Use the
|
5723
|
+
[[hideresource]] attribute for this.
|
5295
5724
|
EOT
|
5296
|
-
|
5725
|
+
)
|
5726
|
+
example('HtmlTaskReport')
|
5727
|
+
end
|
5728
|
+
|
5729
|
+
def rule_taskReportHeader
|
5730
|
+
pattern(%w( _taskreport !optionalID !reportName ), lambda {
|
5731
|
+
newReport(@val[1], @val[2], :taskreport, @sourceFileInfo[0])
|
5732
|
+
|
5733
|
+
unless @property.modified?('columns')
|
5734
|
+
# Set the default columns for this report.
|
5735
|
+
%w( bsi name start end effort chart ).each do |col|
|
5736
|
+
@property.get('columns') <<
|
5737
|
+
TableColumnDefinition.new(col, columnTitle(col))
|
5738
|
+
end
|
5739
|
+
end
|
5740
|
+
# Show all tasks, sorted by tree, start-up, seqno-up.
|
5741
|
+
unless @property.modified?('hideTask')
|
5742
|
+
@property.set('hideTask',
|
5743
|
+
LogicalExpression.new(LogicalOperation.new(0)))
|
5744
|
+
end
|
5745
|
+
unless @property.modified?('sortTasks')
|
5746
|
+
@property.set('sortTasks',
|
5747
|
+
[ [ 'tree', true, -1 ],
|
5748
|
+
[ 'start', true, 0 ],
|
5749
|
+
[ 'seqno', true, -1 ] ])
|
5750
|
+
end
|
5751
|
+
# Show no resources, but set sorting to id-up.
|
5752
|
+
unless @property.modified?('hideResource')
|
5753
|
+
@property.set('hideResource',
|
5754
|
+
LogicalExpression.new(LogicalOperation.new(1)))
|
5755
|
+
end
|
5756
|
+
unless @property.modified?('sortResources')
|
5757
|
+
@property.set('sortResources', [ [ 'id', true, -1 ] ])
|
5758
|
+
end
|
5759
|
+
})
|
5760
|
+
end
|
5761
|
+
|
5762
|
+
def rule_taskScenarioAttributes
|
5763
|
+
|
5764
|
+
pattern(%w( _account $ID ))
|
5765
|
+
level(:removed)
|
5766
|
+
also('chargeset')
|
5767
|
+
doc('account.task', '')
|
5297
5768
|
|
5298
5769
|
pattern(%w( !allocate ))
|
5299
5770
|
|
@@ -5381,10 +5852,13 @@ EOT
|
|
5381
5852
|
})
|
5382
5853
|
doc('complete', <<'EOT'
|
5383
5854
|
Specifies what percentage of the task is already completed. This can be useful
|
5384
|
-
for
|
5385
|
-
|
5386
|
-
|
5387
|
-
|
5855
|
+
for simple progress tracking like in a TODO list. The provided completion
|
5856
|
+
degree is used for the ''''complete'''' and ''''gauge'''' columns in reports.
|
5857
|
+
Reports with calendar elements may show the completed part of the task in a
|
5858
|
+
different color.
|
5859
|
+
|
5860
|
+
The completion percentage has no impact on the scheduler. It's meant for
|
5861
|
+
documentation purposes only.
|
5388
5862
|
EOT
|
5389
5863
|
)
|
5390
5864
|
example('Complete', '1')
|
@@ -5479,12 +5953,13 @@ EOT
|
|
5479
5953
|
@property['charge', @scenarioIdx] +
|
5480
5954
|
[ Charge.new(@val[1], :onEnd, @property, @scenarioIdx) ]
|
5481
5955
|
})
|
5956
|
+
level(:deprecated)
|
5482
5957
|
doc('endcredit', <<'EOT'
|
5483
5958
|
Specifies an amount that is credited to the accounts specified by the
|
5484
|
-
[[chargeset]] attributes at the moment the tasks ends.
|
5485
|
-
deprecated and should no longer be used. Use [[charge]] instead.
|
5959
|
+
[[chargeset]] attributes at the moment the tasks ends.
|
5486
5960
|
EOT
|
5487
5961
|
)
|
5962
|
+
also('charge')
|
5488
5963
|
example('Account', '1')
|
5489
5964
|
pattern(%w( !flags ))
|
5490
5965
|
doc('flags.task', <<'EOT'
|
@@ -5511,7 +5986,7 @@ is available is still considered working time, if there is no global vacation
|
|
5511
5986
|
and global working hours are defined accordingly.
|
5512
5987
|
|
5513
5988
|
For the length calculation, only the global working hours and the global
|
5514
|
-
|
5989
|
+
leaves matter. If a resource has additinal working hours defined, it's
|
5515
5990
|
quite possible that a task with a length of 5d will have an allocated effort
|
5516
5991
|
larger than 40 hours. Resource working hours only have an impact on whether an
|
5517
5992
|
allocation is made or not for a particular time slot. They don't effect the
|
@@ -5593,12 +6068,13 @@ EOT
|
|
5593
6068
|
@property['charge', @scenarioIdx] +=
|
5594
6069
|
[ Charge.new(@val[1], :onStart, @property, @scenarioIdx) ]
|
5595
6070
|
})
|
6071
|
+
level(:deprecated)
|
5596
6072
|
doc('startcredit', <<'EOT'
|
5597
6073
|
Specifies an amount that is credited to the account specified by the
|
5598
|
-
[[chargeset]] attributes at the moment the tasks starts.
|
5599
|
-
been deprecated and should no longer be used. Use [[charge]] instead.
|
6074
|
+
[[chargeset]] attributes at the moment the tasks starts.
|
5600
6075
|
EOT
|
5601
6076
|
)
|
6077
|
+
also('charge')
|
5602
6078
|
pattern(%w( !taskPeriod ))
|
5603
6079
|
|
5604
6080
|
pattern(%w( _precedes !taskPredList ), lambda {
|
@@ -5742,17 +6218,34 @@ end attribute comes after the start attribute.
|
|
5742
6218
|
EOT
|
5743
6219
|
)
|
5744
6220
|
|
5745
|
-
pattern(%w(
|
6221
|
+
pattern(%w( !taskShiftAssignments !shiftAssignments ), lambda {
|
5746
6222
|
checkContainer('shift')
|
6223
|
+
# Set same value again to set the 'provided' state for the attribute.
|
6224
|
+
begin
|
6225
|
+
@property['shifts', @scenarioIdx] = @shiftAssignments
|
6226
|
+
rescue AttributeOverwrite
|
6227
|
+
# Multiple shift assignments are a common idiom, so don't warn about
|
6228
|
+
# them.
|
6229
|
+
end
|
6230
|
+
@shiftAssignments = nil
|
5747
6231
|
})
|
6232
|
+
level(:deprecated)
|
5748
6233
|
doc('shift.task', <<'EOT'
|
5749
6234
|
This keyword has been deprecated. Please use [[shifts.task|shifts
|
5750
6235
|
(task)]] instead.
|
5751
6236
|
EOT
|
5752
6237
|
)
|
6238
|
+
also('shifts.task')
|
5753
6239
|
|
5754
|
-
pattern(%w(
|
6240
|
+
pattern(%w( !taskShiftsAssignments !shiftAssignments ), lambda {
|
5755
6241
|
checkContainer('shifts')
|
6242
|
+
begin
|
6243
|
+
@property['shifts', @scenarioIdx] = @shiftAssignments
|
6244
|
+
rescue AttributeOverwrite
|
6245
|
+
# Multiple shift assignments are a common idiom, so don't warn about
|
6246
|
+
# them.
|
6247
|
+
end
|
6248
|
+
@shiftAssignments = nil
|
5756
6249
|
})
|
5757
6250
|
doc('shifts.task', <<'EOT'
|
5758
6251
|
Limits the working time for this task during the during the specified interval
|
@@ -5790,6 +6283,37 @@ EOT
|
|
5790
6283
|
# Other attributes will be added automatically.
|
5791
6284
|
end
|
5792
6285
|
|
6286
|
+
def rule_taskShiftAssignments
|
6287
|
+
pattern(%w( _shift ), lambda {
|
6288
|
+
@shiftAssignments = @property['shifts', @scenarioIdx]
|
6289
|
+
})
|
6290
|
+
end
|
6291
|
+
|
6292
|
+
def rule_taskShiftsAssignments
|
6293
|
+
pattern(%w( _shifts ), lambda {
|
6294
|
+
@shiftAssignments = @property['shifts', @scenarioIdx]
|
6295
|
+
})
|
6296
|
+
end
|
6297
|
+
|
6298
|
+
def rule_textReport
|
6299
|
+
pattern(%w( !textReportHeader !reportBody ), lambda {
|
6300
|
+
@property = @property.parent
|
6301
|
+
})
|
6302
|
+
doc('textreport', <<'EOT'
|
6303
|
+
This report consists of 5 RichText sections, a header, a center section with a
|
6304
|
+
left and right margin and a footer. The sections may contain the output of
|
6305
|
+
other defined reports.
|
6306
|
+
EOT
|
6307
|
+
)
|
6308
|
+
example('textreport')
|
6309
|
+
end
|
6310
|
+
|
6311
|
+
def rule_textReportHeader
|
6312
|
+
pattern(%w( _textreport !optionalID !reportName ), lambda {
|
6313
|
+
newReport(@val[1], @val[2], :textreport, @sourceFileInfo[0])
|
6314
|
+
})
|
6315
|
+
end
|
6316
|
+
|
5793
6317
|
def rule_timeformat
|
5794
6318
|
pattern(%w( _timeformat $STRING ), lambda {
|
5795
6319
|
@val[1]
|
@@ -6009,7 +6533,7 @@ EOT
|
|
6009
6533
|
doc('shift.timesheet', <<'EOT'
|
6010
6534
|
Specifies an alternative [[shift]] for the time sheet period. This shift will
|
6011
6535
|
override any existing working hour definitions for the resource. It will not
|
6012
|
-
override already declared [[
|
6536
|
+
override already declared [[leaves]] though.
|
6013
6537
|
|
6014
6538
|
The primary use of this feature is to let the resources report different total
|
6015
6539
|
work time for the report period.
|
@@ -6118,19 +6642,23 @@ EOT
|
|
6118
6642
|
end
|
6119
6643
|
def rule_tsReportHeader
|
6120
6644
|
pattern(%w( _timesheetreport !optionalID $STRING ), lambda {
|
6121
|
-
|
6645
|
+
newReport(@val[1], @val[2], :timeSheet, @sourceFileInfo[0])
|
6646
|
+
@property.set('formats', [ :tjp ])
|
6122
6647
|
|
6123
|
-
|
6648
|
+
unless @project.scenario(0).get('active')
|
6649
|
+
@property.set('scenarios', [ 0 ])
|
6650
|
+
end
|
6124
6651
|
# Show all tasks, sorted by seqno-up.
|
6125
|
-
|
6126
|
-
|
6652
|
+
@property.set('hideTask', LogicalExpression.new(LogicalOperation.new(0)))
|
6653
|
+
@property.set('sortTasks', [ [ 'seqno', true, -1 ] ])
|
6127
6654
|
# Show all resources, sorted by seqno-up.
|
6128
|
-
|
6129
|
-
|
6130
|
-
|
6131
|
-
|
6655
|
+
@property.set('hideResource',
|
6656
|
+
LogicalExpression.new(LogicalOperation.new(0)))
|
6657
|
+
@property.set('sortResources', [ [ 'seqno', true, -1 ] ])
|
6658
|
+
@property.set('loadUnit', :hours)
|
6659
|
+
@property.set('definitions', [])
|
6132
6660
|
})
|
6133
|
-
arg(
|
6661
|
+
arg(2, 'file name', <<'EOT'
|
6134
6662
|
The name of the time sheet report file to generate. It must end with a .tji
|
6135
6663
|
extension, or use . to use the standard output channel.
|
6136
6664
|
EOT
|
@@ -6319,7 +6847,7 @@ EOT
|
|
6319
6847
|
def rule_vacationName
|
6320
6848
|
optional
|
6321
6849
|
pattern(%w( $STRING )) # We just throw the name away
|
6322
|
-
arg(0, 'name', 'An optional name for the
|
6850
|
+
arg(0, 'name', 'An optional name or reason for the leave')
|
6323
6851
|
end
|
6324
6852
|
|
6325
6853
|
def rule_valDate
|
@@ -6478,7 +7006,7 @@ EOT
|
|
6478
7006
|
60 * 60, # hours
|
6479
7007
|
60 * 60 * @project['dailyworkinghours'], # days
|
6480
7008
|
60 * 60 * @project['dailyworkinghours'] *
|
6481
|
-
(@project
|
7009
|
+
(@project.weeklyWorkingDays), # weeks
|
6482
7010
|
60 * 60 * @project['dailyworkinghours'] *
|
6483
7011
|
(@project['yearlyworkingdays'] / 12), # months
|
6484
7012
|
60 * 60 * @project['dailyworkinghours'] *
|