Utilization dimensions

Utilization dimensions

Product line

Standard

|

Expert

Operating mode

CLOUD ABO

|

ON-PREMISES

Modules

Services & CRM

Budget & Phases

Purchases

Resource Planning

Business Intelligence

Created: 22.11.2022
Machine translated
Updated: 09.05.2023 | Corrected spelling errors.

Utilization Graphs are shown broken down according to different dimensions. These are the criteria according to which the bars (or values) are divided.

This can be, for example, by project leader, by industry, by project type, etc. But you can also define any of your own dimensions, such as Verkauft/Offeriert,  Produktiv/Unproduktiv etc.

Utilization dimensions are defined in the folder Settings > Resource planning > Utilization dimensions:

designation Name of the dimension. This designation appears as button text on the detail view and can be defined in different interface languages if required.
Active Controls whether this utilization dimension is applied.
Order

Here you can control the order in which the buttons for utilization graphs are displayed on the detail view. These are sorted in ascending order.

We recommend choosing larger sort steps (e.g. steps of 10). This will allow you to insert buttons in between.

Show in same class

Controls whether the load dimension should also be shown on the class of the selected object or only on the opposite side (default).
See also section Own Class / Opposite Side .

Quantity of series

Here you can set how many series (bar segments in the graphic) should be shown. You can choose between:

  • All
  • 3 Series and others
  • 5 Series and Others
  • 7 Series and Others
  • 9 Series and Others

The corresponding quantity of series are then displayed as individual segments and the remaining values under Andere totaled is shown.

Classes

Controls which classes are available in this load dimension. Possible classes are:

See also section Own Own Class / Opposite Side .

Condition

Here, a display condition can be specified via OCL expression, which can be used to control whether or when this load dimension is displayed or not.

In the OCL editor, Eintrag shown. This is the up-to-date selected object in the tree.

If the object is used in the OCL, the administrator must write the code in such a way that it works for all combinations of class / single object / list. oclIsTypeOf the specific type tested and/or with: oclAsType cast.

The result of this expression must return a Yes/No (Boolean) value.

The resource view evaluates this expression. If the expression is empty or the result is true, then the view is shown.

Calculation method

The dimensional criteria can be calculated as follows:

  • Folder: If this calculation method is selected, another field appears where a Keyword Folder can be selected. The objects are then shown as bar segments according to their assignment (e.g. by industry, if the projects are stored in an industry folder structure).
    • If the folder keyword does not Exclusive is, the dimension object is invalid. This invalid dimension cannot be selected in the graphic.
    • If the folder keyword does not Inclusive is, the associated objects are shown combined in a bar segment “Other”.
  • Expression: Here you can specify an OCL expression. The expression must return a string value as a result. The bar segments correspond to the grouped results of this evaluation. Example: Summary of plan data on projects by project type. The expression in this case would then be typ.bezeichnung.
    If a criterion does not fit all underlying objects (e.g. bearbeiterstufe not to the planning editors), then the unsuitable objects are shown in a bar segment Other combined. No error appears.
  • Python class: For the calculation you can also use a Python class, in which the data is prepared accordingly. This makes it possible to define a completely own logic for the representation of the bars. While the other calculation methods simply group the existing planning data (the sum of each bar is equal), the values can be calculated completely independently via the Python class. UtilizationProvider are indicated, see further down .
Expression / Keyword folder / Python class reference Depending on the calculation method set (see previous point), a field is Expression, Ordner or Pythonklassenreferenz at this point and can be filled accordingly.
Remarks Free text field for the description of the load dimension. This field is purely informative and has no further functionality.

Own class / opposite side

The load dimensions are always shown for the opposite side. This means:

A resource planning entry (so-called resource planning entry) ResourceLinks) always contains on one side a user (project user, PlanningWorker, AbstractWorker) and on the other side a project or a project phase, depending on the Planning Level .

The other side is always the other side. So if a utilization dimension is defined for the class project, it appears as a utilization graph on the user and vice versa.

By setting the check mark “Show in same class,” the utilization graph is also shown on the own class, which can be useful on lists of objects (e.g. the utilization dimension Bearbeiter on a team list).

Caution is advised when calculating the dimensions via Python if the option “Show on same class” is activated: a case distinction must be made here, so that a utilization dimension works on both the own and the counterclass.

Example Utilization dimension by keyword folder

In Vertec it is possible to define your own categories using keyword folders and to assign entries to these categories. These can be e.g. locations, industries, skills etc.

The resource planning data can be grouped and summarized according to these categories by defining a utilization dimension.

In this example, we would like to evaluate the resource planning data by industry. For this purpose, there is a keyword folder projects by industry:

Now we create a new utilization dimension in the folder Settings > Resource planning > Utilization dimensions:

As calculation method we select Ordner.

A field keyword folder appears below, where buttons with the three dots can be used to select the desired keyword folder.

As a class we choose Projekt, because the folder keyword evaluates projects.

If we do not want to show the folder only on users (by default, the load dimension is shown on the opposite side, in our example, users (AbstractWorker)), we put a check mark on Show on same class.

Now the evaluation will appear automatically on users and, because we have checked the box, on projects:

For the absolute numbers, the graph can also be exported to Excel.

Calculation of load dimensions via Python

The most extensive control over the calculation of a load graph allows the calculation method via Python.

The calculation is carried out by a UtilizationProvider Class that defines the following methods:

initialize(self, entries, startdate, enddate, subscriber) Is called at the beginning of the calculation and initializes the provider with the output objects for the evaluation (single object or content of a selected container) and the period to be displayed.
generate(self, start, end, subscriber)

Called for each bar (interval) of the graph.

The return value is the list of segments for the bar as a tuple (caption, value).

The generation of the return list can be done (as with Bi generators ) with the Python yield Operator.

get_series_properties(self)

Optional method. Invoked at the beginning of the calculation and allows to specify the representation of the individual segments even more precisely.

For each possible segment caption, a dictionary containing information about

  • caption
  • orderIdx and
  • color

be returned.

Example of a provider that generates a utilization graph according to productive/unproductive (Planning Level Project ):

class ProdInternalUtilizationProvider(object):
    productive_label_text = vtcapp.translate('label_productive')
    internal_label_text = vtcapp.translate('label_internal')

    def initialize(self, entries, start, end, subscriber):
        self.provider = vtcplanningcore.ResourcePlanningProvider(
            entries, start, end)
        self.entries_are_workers = vtcplanning.is_abstractworker(entries)

        if self.entries_are_workers:
            self.projects = self.provider.get_otherside_entries(subscriber)
        else:
            self.projects = entries

    def get_series_properties(self):
        prod_series = {
            'caption': self.productive_label_text,
            'orderIdx': 1,
            'color': 'clDarkRed',
        }
        internal_series = {
            'caption': self.internal_label_text,
            'orderIdx': 2,
            'color': 'clLightRed',
        }
        return [internal_series, prod_series]

    def generate(self, startdate, enddate, subscriber):
        """ Generates a list of series. Each series is identified by
        its name in the return value """
        for project in self.projects:
            if self.entries_are_workers:
                planned_minutes = self.provider.get_planned_minutes_aggregated(
                    None, project, startdate, None, subscriber)
            else:
                planned_minutes = self.provider.get_planned_minutes_aggregated(
                    project, None, startdate, None, subscriber)

            # self.evalocl subscribes implicitly
            if self.evalocl("typ.produktiv", project):
                yield (self.productive_label_text, planned_minutes)
            else:
                yield (self.internal_label_text, planned_minutes)

The class must be defined in a script module. On the definition of the load dimension, it is then <Modulname>.<Klassenname> referenced.

Supplied load dimensions

The following load dimensions are supplied by Vertec as standard:

  • Projects (for class) Projekt)
  • Project types (for class Projekt)
  • User (for class Projektbearbeiter)
  • User levels (for class Projektbearbeiter)
  • Project phase status (for class Projektphase)