Tarifgruppen & Gebühren anlegen
Jede Gebührenart eines Hafens (Hafengeld, Lotsgeld, Festmacher, Abfall …) ist eine Tarifgruppe. In jeder Gruppe legen Sie einen oder mehrere Tarife an — die einzelnen Gebührenzeilen. Diese Seite zeigt beides.
Den Bildschirm Tariff groups öffnen
Gehen Sie zu Navigation → Admin → Cost Calculations → Tariff groups (Route /invoicing-and-tariffs/tariff-groups/cost-calculation).
Zum Anlegen und Ändern von Gruppen brauchen Sie das Recht Tariff admin (invoices.tariff_admin).
Schritt 1 — Eine Tarifgruppe anlegen
Klicken Sie auf New und tragen Sie die Gruppendaten ein:
| Feld | Was Sie eintragen |
|---|---|
| Name | Sprechender Name, z. B. Den Helder — Hafengeld |
| System code | pcc_<hafen>_<kategorie>, z. B. pcc_denhelder_havengeld |
| Currency code | EUR |
| Starts on | Erster Gültigkeitstag der Gebühren, z. B. 2026-01-01 |
| Ends on | Leer lassen für unbefristet |
| UI Template | Beschriftung der Ergebnisüberschrift, z. B. Hafengeld |
| Tariff group type | Invoice calculation |
| Application area | Schreibgeschützt — steht bereits auf cost calculation |
Klicken Sie auf Save. Sie sind jetzt auf der Detailseite der Tarifgruppe.
Schritt 2 — Die Gruppe an Ihren Hafen binden
Jede Tarifgruppe braucht eine Hafenbedingung. Ohne sie gelten ihre Tarife für alle Häfen, nicht nur für Ihren.
Öffnen Sie auf der Karte Business logic den Reiter Conditions und klicken Sie auf Add:
| Feld | Wert |
|---|---|
| Logic type | Custom |
| Field type | ConditionString |
| Source field | $.__DefinitionSystemCode |
| String operator | Equals |
| Value | pccDenHelder (der System code Ihres Hafens — exakt so, wie Sie ihn am Objekt gesetzt haben) |
Klicken Sie bei der Bedingung auf Save. Wiederholen Sie das bei jeder Tarifgruppe, die Sie für diesen Hafen anlegen.
Schritt 3 — Die Tarife (Gebühren) anlegen
Gehen Sie von der Detailseite der Tarifgruppe in ihre Tarifliste und klicken Sie auf Add tariff. Das Tarifformular hat eine Karte Details und eine Karte Business logic.
Felder, die jeder Tarif hat:
| Feld | Was Sie eintragen |
|---|---|
| Name | Name der Gebühr, z. B. Hafengeld — Seeschiff Nieuwe Diep |
| Amount type | Number |
| Tariff type | Regular |
| Currency code | EUR |
| System code | Kurzer, stabiler Code |
| UI Template | Beschriftung der Ergebniszeile — Pflicht, darf nicht leer sein |
| Starts on / Ends on | Passend zur Gültigkeit der Gebührenordnung |
Das Feld Amount source bestimmt, welche Form die Gebühr hat. Wählen Sie Direct oder Matrix und füllen Sie die Felder der jeweiligen Form aus.
Form A — Satz pro Einheit
Nehmen Sie diese Form, wenn die Gebühr ein fester Satz mal einer Schiffsangabe ist (z. B. 0,93 € pro GT).
Karte Details:
| Feld | Wert |
|---|---|
| Amount source | Direct |
| Amount | Der Satz, z. B. 0.93 |
| UI Template | z. B. Port dues ({{$.ship.gt}} × 0.93) — die Vorlage in Backticks setzen, wenn sie wörtlich stehen soll, sonst die echte Handlebars-Syntax im Feld verwenden |
Business logic — Reiter Calculations → Add:
| Feld | Wert |
|---|---|
| Logic type | Custom |
| Field type | CalculationPricePerUnit |
| Source field | $.ship.gt (oder $.ship.loa, $.tugsInbound.numberOfTugs usw.) |
| Calculation order | 0 |
Damit multipliziert die Engine den Betrag mit dem Wert unter diesem Feldpfad.
Business logic — Reiter Conditions (optional): Gilt der Satz nur für bestimmte Schiffstypen, ergänzen Sie ein ConditionArray (siehe Bedingungsübersicht unten).
Beispiel Den Helder: Hafengeld für Seeschiffe am Nieuwe Diep — Amount 0.93, CalculationPricePerUnit mit Source field $.ship.gt.
Form B — Staffelwert
Nehmen Sie diese Form, wenn die Gebühr davon abhängt, in welche Stufe ein Wert fällt (z. B. Lotsgeld nach Tiefgangsstufe).
Karte Details:
| Feld | Wert |
|---|---|
| Amount source | Matrix |
| Amount | 0 |
| Amount source template | Der Handlebars-Schlüssel, der die Staffel steuert, z. B. {{pilotsOutbound.draft}} |
Business logic — Reiter Conditions → ein ConditionNumeric ergänzen, das gegen Null- und Leereingaben schützt:
| Feld | Wert |
|---|---|
| Field type | ConditionNumeric |
| Source field | pilotsOutbound.draft |
| Numeric operator | GreaterThan |
| Value | 0 |
Füllen Sie danach die Karte Tariff Matrix (siehe Schritt 4).
Beispiel Den Helder: Lotsgeld einwärts — Amount source Matrix, Amount source template {{pilotsInbound.draft}}, 169 Tiefgangsstufen in dm.
Form C — Pauschale
Nehmen Sie diese Form, wenn die Gebühr ein fester Betrag ist, wahlweise nur für bestimmte Schiffstypen oder Bedingungen.
Karte Details:
| Feld | Wert |
|---|---|
| Amount source | Direct |
| Amount | Die feste Gebühr, z. B. 120 |
Business logic — Reiter Conditions: Bedingungen ergänzen, die einschränken, wann der Tarif greift (z. B. ein ConditionArray auf $.podh.callPeriod mit dem Key day). Gilt die Gebühr immer, lassen Sie die Bedingungen leer.
Legen Sie keinen Knoten CalculationPricePerUnit an — bei einer Pauschale braucht es keinen.
Beispiel Den Helder: Festmacher tagsüber — Amount 120, ConditionArray auf $.podh.callPeriod = ["day"].
Schritt 4 — Die Tarifmatrix füllen (Stufen)
Die Karte Tariff Matrix erscheint nur bei Amount source = Matrix. Bei Direct-Tarifen wird sie nicht angezeigt.
Jede Zeile ist eine Stufe:
| Spalte | Hinweise |
|---|---|
| Name | Bezeichnung der Stufe, z. B. 0–270 dm |
| System code | Wird vorbelegt; änderbar |
| Amount | Satz für diese Stufe |
| From | Untergrenze (einschließlich). Die erste Stufe muss bei 0 beginnen. |
| To | Obergrenze (ausschließlich). Die letzte Stufe sollte eine große Zahl nehmen, z. B. 9999, damit alle Werte abgedeckt sind. |
| UI Template | Beschriftung der Ergebniszeile dieser Stufe |
Die Stufen müssen lückenlos aneinandergrenzen — das To einer Zeile ist das From der nächsten. Bei Lücken liefert die Staffel nichts zurück.
Mit Add unten auf der Karte hängen Sie eine leere Zeile an. Füllen Sie jede Zeile und klicken Sie auf Save.
Stufen aus Excel importieren
Bei großen Stufentabellen (das Lotsgeld in Den Helder hat 169 Zeilen) nutzen Sie den Import:
- Stellen Sie sicher, dass Amount source = Matrix am Tarif gespeichert ist — die Schaltfläche Import Tariff Matrix erscheint nur in der Ansicht, nicht im Bearbeitungsmodus.
- Klicken Sie in der Kopfleiste auf Import Tariff Matrix.
- Klicken Sie im Dialog zuerst auf Download example file, um den richtigen Spaltenaufbau zu bekommen.
- Tragen Sie Ihre Stufen in die Beispieldatei ein.
- Setzen Sie das Häkchen bei Replace existing tariff matrix, wenn vorhandene Zeilen überschrieben werden sollen.
- Klicken Sie auf Import.
Fangen Sie immer mit Download example file an — die Spaltenreihenfolge der Vorlage ist die, die der Import erwartet.
Bedingungen im Überblick
Bedingungen legen Sie auf dem Reiter Conditions der Karte Business logic an — am Tarif, nicht an der Gruppe. Ausnahme ist die Hafenbindung, die an die Gruppe gehört.
| Bedingungstyp | Wann | Wichtige Felder |
|---|---|---|
| ConditionString | Hafenbindung — den System code des Hafens abgleichen | Source field $.__DefinitionSystemCode, String operator Equals, Value = pccDenHelder |
| ConditionArray | Abgleich gegen ein Listenfeld (Schiffstyp, Gebiet, Anlaufzeitraum …) | Source field z. B. $.general.shipType, Array operator Any, Values = Array aus Listen-Keys wie tanker_lng, bulkcarrier |
| ConditionNumeric | Zahlenvergleiche (Tiefgang > 0, GT zwischen zwei Werten …) | Numeric operator: Between / Equals / GreaterThan / SmallerThan |
| ConditionBoolean | Ja/Nein-Felder | Boolean operator True oder False |
Der Typ ConditionBoolean (für Felder wie ispsApplicable) war in den Referenzdaten, mit denen diese Dokumentation entstand, nicht enthalten. Das Formular zeigt die Operatoren True und False — prüfen Sie das Ergebnis an einer echten booleschen Bedingung, bevor Sie sie produktiv einsetzen.
Manche Gebühren sollen pro Hafenanlauf nur einmal greifen, egal wie viele Tarifzeilen passen — etwa eine Abfallgebühr, die nicht doppelt zählen darf. Für diese Zeilengruppierung gibt es keinen Bildschirm; sie braucht eine Konfigurationsänderung durch das SHIPM8-Team. Wenden Sie sich an den Support, wenn eine Gebühr das benötigt.