    /*
     * This file contains an example project. It is part of the
     * TaskJuggler project management tool. It uses a made up software
     * development project to demonstrate some of the basic features of
     * TaskJuggler. Please see the TaskJuggler manual for a more detailed
     * description of the various syntax elements.
     */
    project acso "Accounting Software" "1.0" 2002-01-16 - 2002-04-28 {
      # Pick a day during the project that will be reported as 'today' in
      # the project reports. If not specified, the current day will be
      # used, but this will likely be outside of the project range, so it
      # can't be seen in the reports.
      now 2002-03-05-13:00
      # Hide the clock time. Only show the date.
      timeformat "%Y-%m-%d"
      # The currency for all money values is the Euro.
      currency "EUR"

      # We want to compare the baseline scenario to one with a slightly
      # delayed start.
      scenario plan "Plan" {
        # Mark all paths as critical that have less than 10% slack time.
        minslackrate 10.0
        scenario delayed "Delayed"
      }
    }

    # This is not a real copyright for this file. It's just used as an example.
    copyright "© 2002 Crappy Software, Inc."

    # The daily default rate of all resources. This can be overridden for each
    # resource. We specify this, so that we can do a good calculation of
    # the costs of the project.
    rate 310.0

    # Register Good Friday as a global holiday for all resources.
    vacation "Good Friday" 2002-03-29

    # This is one way to form teams
    macro allocate_developers [
      allocate dev1
      allocate dev2 { limits { dailymax 4h } }
      allocate dev3
    ]

    flags team

    resource dev "Developers" {
      resource dev1 "Paul Smith" { rate 330.0 }
      resource dev2 "Sébastien Bono"
      resource dev3 "Klaus Müller" { vacation 2002-02-01 - 2002-02-05 }

      flags team
    }
    resource misc "The Others" {
      resource test "Peter Murphy" { limits { dailymax 6.4h } rate 240.0 }
      resource doc "Dim Sung" { rate 280.0 vacation 2002-03-11 - 2002-03-16 }

      flags team
    }

    # In order to do a simple profit and loss analysis of the project we
    # specify accounts. One for the development costs, one for the
    # documentation costs, and one account to credit the customer payments
    # to.
    account dev "Development" cost
    account doc "Documentation" cost
    account rev "Payments" revenue

    # Now we specify the work packages. The whole project is described as
    # a task that contains subtasks. These subtasks are then broken down
    # into smaller tasks and so on. The innermost tasks describe the real
    # work and have resources allocated to them. Many attributes of tasks
    # are inherited from the enclosing task. This saves you a lot of typing.
    task AcSo "Accounting Software" {

      # All work-related costs will be booked to this account unless the
      # subtasks specify something different.
      account dev

      task spec "Specification" {
        # The effort to finish this task is 20 man-days.
        effort 20d
        # Now we use the macro declared above to allocate the resources
        # for this task. Because they can work in parallel, they may finish this
        # task earlier than in 20 working-days.
        ${allocate_developers}
        # Each task without subtasks must have a start or an end
        # criterion and a duration. For this task we use a reference to a
        # milestone defined further below as the start criterion. So this task
        # can not start before the specified milestone has been reached.
        # References to other tasks may be relative. Each exclamation mark (!)
        # means 'in the scope of the enclosing task'. To descent into a task, the
        # fullstop (.) together with the id of the tasks have to be specified.
        depends !deliveries.start
      }

      task software "Software Development" {

        # The software is the most critical task of the project. So we set
        # the priority of this task (and all its subtasks) to 1000, the top
        # priority. The higher the priority, the more likely the task will
        # get the requested resources.
        priority 1000

        # All subtasks depend on the specification task.
        depends !spec

        task database "Database coupling" {
          effort 20d
          allocate dev1, dev2
        }

        task gui "Graphical User Interface" {
          effort 35d
          # This task has taken 5 man-days more than originally planned.
          # We record this as well, so that we can generate reports that
          # compare the delayed schedule of the project to the original plan.
          delayed:effort 40d
          depends !database, !backend
          allocate dev2, dev3
        }

        task backend "Back-End Functions" {
          effort 30d
          # This task is behind schedule, because it should have been
          # finished already. To document this, we specify that the task
          # is 95% completed. If nothing is specified, TaskJuggler assumes
          # that the task is on schedule and computes the completion rate
          # according to the current day and the plan data.
          complete 95
          depends !database
          allocate dev1, dev2
        }
      }

      task test "Software testing" {

        task alpha "Alpha Test" {
          # Efforts can not only be specified as man-days, but also as
          # man-weeks, man-hours, etc. By default, TaskJuggler assumes
          # that a man-week is 5 man-days or 40 man-hours. These values
          # can be changed, of course.
          effort 1w
          # This task depends on a task in the scope of the enclosing
          # task's enclosing task. So we need two exclamation marks (!!)
          # to get there.
          depends !!software
          allocate test, dev2
          note "Hopefully most bugs will be found and fixed here."
        }

        task beta "Beta Test" {
          effort 4w
          depends !alpha
          allocate test, dev1
        }
      }

      task manual "Manual" {
        effort 10w
        depends !deliveries.start
        allocate doc, dev3
        account doc
      }

      task deliveries "Milestones" {

        # Some milestones have customer payments associated with them. We
        # credit these payments to the 'rev' account.
        account rev

        task start "Project start" {
          # A task that has no duration is a milestone. It only needs a
          # start or end criterion. All other tasks depend on this task.
          milestone
          start 2002-01-16
          # For some reason the actual start of the project got delayed.
          # We record this, so that we can compare the planned run to the
          # delayed run of the project.
          delayed:start 2002-01-20
          # At the beginning of this task we receive a payment from the
          # customer. This is credited to the account associated with this
          # task when the task starts.
          startcredit 33000.0
        }

        task prev "Technology Preview" {
          milestone
          depends !!software.backend
          startcredit 13000.0
        }

        task beta "Beta version" {
          milestone
          depends !!test.alpha
          startcredit 13000.0
        }

        task done "Ship Product to Customer" {
          milestone
          # The next line can be uncommented to trigger a warning about
          # the project being late. For all tasks, limits for the start and
          # end values can be specified. Those limits are checked after the
          # project has been scheduled. For all violated limits a warning
          # is issued.
          # maxend 2002-04-17
          depends !!test.beta, !!manual
          startcredit 14000.0
        }
      }
    }

    # Now the project has been specified completely. Stopping here would
    # result in a valid TaskJuggler file that could be processed and
    # scheduled. But no reports would be generated to visualize the
    # results.

    # A traditional Gantt Chart for the TaskJugglerUI
    taskreport "Gantt Chart" {
      headline "Project Gantt Chart"
      columns hierarchindex, name, start, end, effort, duration, chart
      # For this report we like to have the abbreviated weekday in front
      # of the date. %a is the tag for this.
      timeformat "%a %Y-%m-%d"
      loadunit days
      hideresource 1
    }

    # A list of tasks showing the resources assigned to each task.
    taskreport "Task Usage" {
      headline "Task Usage Report"
      columns hierarchindex, name, start, end, effort { title "Work" }, duration,
        cost, revenue
      timeformat "%Y-%m-%d"
      loadunit days
      hideresource ~isLeaf()
      sortresources nameup
    }

    # A list of all tasks with the percentage completed for each task
    taskreport "Tracking Gantt" {
      headline "Tracking Gantt Chart"
      columns hierarchindex, name, start, end, effort { title "Work" }, duration,
        completed, chart
      timeformat "%a %Y-%m-%d"
      loadunit days
      hideresource 1
    }

    # A graph showing resource allocation. It identifies whether each
    # resource is under- or over-allocated for.
    resourcereport "Resource Graph" {
      headline "Resource Allocation Graph"
      columns no, name, rate, utilization, freeload, chart
      loadunit days
      hidetask 1
    }

    # A list of all project resources, both human and material resources,
    # together with the associated costs.
    resourcereport "Resource Sheet" {
      headline "Resource Sheet"
      columns no, name, efficiency, id, maxeffort, rate
      loadunit days
      hidetask 1
    }

    # A list of resources and each task associated with each resource.
    resourcereport "Resource Usage" {
      headline "Resource Usage Report"
      columns no, name, utilization, freeload, cost, chart
      loadunit days
      hidetask 0
    }

    # This report looks like a regular calendar that shows the tasks by
    # their dates.
    htmlweeklycalendar "Calendar.html" {
      # Only show work days in the calendar.
      weekdays mon - fri
    }

    # This report is a status report for the current week. It also
    # provides an outlook for the next week.
    htmlstatusreport "Status-Report.html" {
    }

    # A P&L report for the project.
    htmlaccountreport "Accounting.html" {
      # Besides the number of the account and the name we have a column
      # with the total values (at the end of the project) and the values
      # for each month of the project.
      columns no, name, scenario, total, monthly
      headline "P&L for the Project"
      caption "The table shows the profit and loss analysis as well as
               the cashflow situation of the Accounting Software Project."
      # Since this is a cashflow calculation, we show accumulated values
      # for each account.
      accumulate
      scenarios plan, delayed
    }

    xmlreport "XML-Report.tjx" {
      version 2
      hidetask 0
      hideresource 0
      scenarios plan, delayed
    }

    icalreport "Calendar.ics"