Palfinger AG · Equipment Domain · Internal Concept

Service Date Redesign

Konzept & POC Vorschlag · Concept & POC Proposal
Version 0.1 · Draft Datum: 2026-04-14 Status: In Review Domain: Equipment Screen · Service Cockpit
🇩🇪 Deutsch
🇬🇧 English

1Hintergrund & Ziel

Die Equipment-Domain bei Palfinger ist die zentrale Datenbank für den vollständigen Lebenszyklus eines Gerätes — von der Produktion über Verkauf und Garantie bis hin zu Service und Verschrottung.

Projektziel:

Partner (der ein Service durchführt) sowie der End-Kunde des Gerätes sollen zukünftig vollständige Informationen über den Service-Status erhalten und Folgeaktionen (z.B. Terminvereinbarungen) direkt planen können.

Betroffene Systeme
  • Equipment Screen – Dashboard Widget
  • Service Cockpit – Assigned Equipments Filter
  • Equipment GraphQL API
  • Telematik-Integration
  • Notification-System (Partner + End-Kunde)
Betroffene Rollen
  • Palfinger-Intern (Equipment-Manager)
  • Partner / Servicebetrieb
  • End-Kunde
  • System (Telematik-Automat)

2Ist-Zustand

Aktuelles Datenmodell (vereinfacht)

Code anzeigen / Show code
// GraphQL: equipment.expected_service_date
// Store:   TimeToServiceState
interface TimeToServiceState {
  isLoading:           boolean;
  hasError:            boolean;
  expectedServiceDate: Date | null;   // einziges Datum
}

Befüllungs-Quellen aktuell

#QuelleWann?Metadaten gespeichert?
1Telematik-AutoEquipment-Aktivierung (Garantie + 1 Jahr)Nein
2Manuell (User)Bei Änderung im WidgetTeilweise (Datum der Änderung)
3Smart Process – ServiceNach ServiceabschlussTeilweise (Datum der Änderung)
Aktuell kein Tracking: Es ist nicht erkennbar, woher ein Datum stammt oder wer es zuletzt geändert hat. Quelle "Telematik-Auto" hinterlässt keine Spur.

3Problem & Lücken

Fehlende Datum-Typen
  • Kein "Letztes Service Datum"
  • Kein "Manuell gesetztes Datum" separat
  • Kein vereinbarter Kunden-Termin
  • Keine Unterscheidung: berechnet vs. manuell
Fehlende Telematik-Anzeige
  • Betriebsstunden bis Service werden empfangen, aber nicht angezeigt
  • Reset auf 0 nach Service → keine Notification
  • Keine Verknüpfung Stunden ↔ Datum
Fehlender Audit-Trail
  • Kein changedBy
  • Kein changedAt
  • Kein source (telematic / manual / smart_process)
Keine Filter-Funktion
  • Service Cockpit: kein Datumsrange-Filter für Service Date
  • Kein Filter für Legal Inspection Date

4Neues Datenmodell

4.1 Service Date – Erweitertes Modell

Code anzeigen / Show code
interface ServiceDateData {
  // ── Kern-Datums ────────────────────────────────────────────
  lastServiceDate:         Date | null;   // Wann wurde zuletzt ein Service durchgeführt
  expectedServiceDate:     Date | null;   // Auto-berechnet (z.B. lastService + Intervall)
  manualServiceDate:        Date | null;   // Vom User / Smart Process manuell gesetzt
  customerAppointment:      CustomerAppointment | null;

  // ── Audit-Trail ────────────────────────────────────────────
  dateSource:              'telematic' | 'manual' | 'smart_process' | null;
  lastChangedBy:           string | null;   // User-Name oder "System"
  lastChangedAt:           Date | null;

  // ── Telematik (optional) ───────────────────────────────────
  isTelematic:             boolean;
  remainingOperatingHours: number | null;   // verbleibende Stunden bis Service
  operatingHourThreshold:  number | null;   // Schwellwert (z.B. 1000 Std.)
  currentOperatingHours:   number | null;   // aktuelle Betriebsstunden
}

interface CustomerAppointment {
  date: Date;
  time: string | null;   // z.B. "14:30"
  confirmedBy: string | null;
}

4.2 Prioritäts-Logik: Welches Datum wird angezeigt?

PrioritätDatumBadgeBedingung
1 (höchste)manualServiceDateManuellWenn vorhanden
2expectedServiceDateBerechnetFallback wenn kein manuelles Datum
3(kein Datum)Nicht gesetztWeder manuell noch berechnet vorhanden

4.3 Namensgebung: "Legal Inspection Date"

Empfehlung: Statutory Inspection Date

International verständlich, juristisch korrekt und in allen Sprachen eindeutig übersetzbar. Ersetzt "Legal Inspection Date" überall einheitlich.

Naming-Kandidaten anzeigen / Show naming candidates
KandidatProContra
Statutory Inspection DateInternational, juristisch präziseLeicht formell
Legal Inspection DateBereits im Code vorhanden"Legal" ist mehrdeutig (≠ lawful)
Mandatory Inspection DateEinfach & verständlichWeniger präzise
Periodic Safety Inspection DateSehr beschreibendZu lang

5Widget-Design: Service Date

5.1 Widget ohne Telematik

Standard-Größe: 1 Zeile im Gridster (wie bisher)

Next Service Date Manuell
✏️ Edit
Last Service 15.03.2025
Next Service (Manual) 15.03.2026
185 days left

📌 Customer Appointment: 22.04.2026, 09:00 Uhr
ℹ️ Set manually by Max Mustermann · 01.01.2026

Variante: Kein manuelles Datum → Fallback auf "Expected"

Next Service Date Berechnet
✏️ Edit
Last Service 15.03.2025
Next Service (Expected) 15.03.2026
185 days left

📅 Kein Kunden-Termin vereinbart
ℹ️ Calculated from warranty date (Telematic auto)

Variante: Überfällig

Next Service Date Überfällig
✏️ Edit
Last Service 15.03.2024
Next Service (Manual) 15.03.2025 ⚠️ 30 days overdue

📌 Customer Appointment: 20.04.2025, 14:00 Uhr
ℹ️ Set manually by Max Mustermann · 10.01.2025

5.2 Widget mit Telematik (größer – 2 Gridster-Rows)

Erweitertes Widget inkl. Betriebsstunden-Block

Next Service Date Telematic
✏️ Edit
Last Service 15.03.2025
Next Service (Expected) 15.03.2026
185 days left

⚙️ Operating Hours until next Service
Current 342 / 1.000 hrs
658 hrs remaining

📌 Customer Appointment: 22.04.2026, 09:00 Uhr
ℹ️ Expected date: Warranty + 1 Year (Telematic auto)

Variante: Telematik – Stunden fast aufgebraucht

Next Service Date Telematic
✏️ Edit
Last Service 15.03.2025
Next Service (Manual) 20.05.2026
80 days left

⚙️ Operating Hours until next Service
Current 920 / 1.000 hrs ⚠️
Only 80 hrs remaining

📅 Kein Kunden-Termin vereinbart
ℹ️ Set manually by Max Mustermann · 01.01.2026

6Service Cockpit: Filter & Suche

Im Service Cockpit unter Assigned Equipments soll eine Datumsrange-Suche für Service Date eingeführt werden — analog zum bestehenden Filter für Legal / Statutory Inspection Date.

Neue Filter-Felder

FeldTypFilter-Optionen
Service Date (Next)Date RangeVon – Bis, "overdue only", "no date set"
Last Service DateDate RangeVon – Bis
Statutory Inspection DateDate RangeVon – Bis, "overdue only"
Customer AppointmentDate RangeVon – Bis, "has appointment"
Umsetzungs-Pattern: Bestehende Implementierung für Legal Inspection Date als Vorlage verwenden und auf Service Date anwenden (gleiche GraphQL-Filterstruktur, gleiche UI-Komponente).

7POC-Plan & Phasen

1
Discovery
Analyse, Datenmodell, API-Design
2
Backend POC
GraphQL Schema, DB-Migration
3
Widget POC
Angular Widget Redesign
4
Cockpit
Filter & Suche
5
Rollout
Statutory Inspection + Notification
Phase 1 · Discovery
Analyse & Konzept-Finalisierung
  • Stakeholder-Alignment (Equipment Domain, Service Cockpit, Telematik-Team)
  • GraphQL API Design für neues ServiceDateData-Modell
  • Klärung: Woher kommt "letztes Service Datum"? (Smart Process Trigger?)
  • DB-Migrations-Strategie festlegen
  • Entscheidung: "Statutory Inspection Date" als endgültiger Name?
Phase 2 · Backend POC
GraphQL Schema & Datenbank
  • Neues Schema: ServiceDateData als GQL-Type
  • Audit-Felder in DB hinzufügen: source, changed_by, changed_at
  • last_service_date Feld einführen
  • Telematik-Stunden-Feld exposen: remaining_operating_hours
  • Migration bestehender expected_service_date-Daten
Phase 3 · Widget POC
Angular Dashboard Widget Redesign
  • TimeToServiceContentComponent erweitern (neue Inputs)
  • TimeToServiceStore — State auf ServiceDateData umbauen
  • Zwei Widget-Größen: Standard (ohne Telematik) / Erweitert (mit Telematik)
  • Edit-Dialog: Möglichkeit Kunden-Termin mit Uhrzeit zu setzen
  • Source-Badge + Audit-Info-Zeile implementieren
  • Gridster-Config: Dynamische Row-Anzahl je nach isTelematic
Phase 4 · Service Cockpit
Filter & Datumsrange-Suche
  • Assigned Equipments: Service Date Range Filter
  • Pattern von Statutory Inspection Date Filter übernehmen
  • GraphQL Filter-Query erweitern
  • "Has customer appointment" Filter
Phase 5 · Rollout
Statutory Inspection Date + Notifications
  • Gleiches Konzept für Statutory Inspection Date umsetzen
  • Legal → Statutory Umbenennung (API Migration)
  • Notification-System: Partner + End-Kunde informieren
  • E-Mail / Push bei Service fällig / Kunden-Termin erstellt

8Offene Fragen

1
Woher kommt "Letztes Service Datum"?
Wird es automatisch gesetzt wenn Smart Process – Service abgeschlossen wird? Oder muss der Partner es manuell bestätigen?
2
Telematik: Stunden-Reset Trigger
Wer setzt die Stunden nach Service auf 0? Kommt das automatisch vom Gerät oder muss der Partner es bestätigen? Und: Löst dieser Reset das "lastServiceDate"-Update aus?
3
Kunden-Termin: Wer darf ihn setzen?
Nur Partner? Oder auch Palfinger-intern? Bekommt der End-Kunde eine Notification wenn ein Termin vereinbart wird?
4
Statutory vs. Legal: Breaking Change Strategie
Wann wird der alte API-Name deprecated? Gibt es externe Konsumenten der GraphQL API die migriert werden müssen?
5
Notification-System: Scope des POC?
Soll das Notification-System Teil des POC sein oder ein separates Feature nach der initialen Implementierung?

1Background & Goal

The Equipment Domain at Palfinger is the central database for the complete lifecycle of a device — from production through sale and warranty to service and decommissioning.

Project Goal:

Partners performing services and end customers of the equipment should receive complete information about service status and be able to directly plan follow-up actions (e.g. scheduling appointments).

Affected Systems
  • Equipment Screen – Dashboard Widget
  • Service Cockpit – Assigned Equipments Filter
  • Equipment GraphQL API
  • Telematics Integration
  • Notification System (Partner + End Customer)
Affected Roles
  • Palfinger Internal (Equipment Manager)
  • Partner / Service Provider
  • End Customer
  • System (Telematics Auto-Trigger)

2Current State

Current Data Model (simplified)

Code anzeigen / Show code
// GraphQL: equipment.expected_service_date
// Store:   TimeToServiceState
interface TimeToServiceState {
  isLoading:           boolean;
  hasError:            boolean;
  expectedServiceDate: Date | null;   // single date field
}

Date Population Sources (current)

#SourceWhen?Metadata stored?
1Telematics AutoEquipment activation (Warranty + 1 year)No
2Manual (User)On change in widgetPartial (date of change)
3Smart Process – ServiceAfter service completionPartial (date of change)
No audit trail: It is not possible to determine where a date comes from or who last changed it. The "Telematics Auto" source leaves no trace.

3Problems & Gaps

Missing Date Types
  • No "Last Service Date"
  • No separate "Manually Set Date"
  • No agreed customer appointment
  • No distinction: calculated vs. manual
Missing Telematics Display
  • Operating hours until service are received but not displayed
  • Reset to 0 after service → no notification
  • No link between hours and date
Missing Audit Trail
  • No changedBy
  • No changedAt
  • No source (telematic / manual / smart_process)
No Filter Functionality
  • Service Cockpit: no date range filter for Service Date
  • No filter for Statutory Inspection Date

4New Data Model

4.1 Service Date – Extended Model

Code anzeigen / Show code
interface ServiceDateData {
  // ── Core Dates ─────────────────────────────────────────────
  lastServiceDate:         Date | null;   // When was the last service performed
  expectedServiceDate:     Date | null;   // Auto-calculated (e.g. lastService + interval)
  manualServiceDate:        Date | null;   // Manually set by user / Smart Process
  customerAppointment:      CustomerAppointment | null;

  // ── Audit Trail ────────────────────────────────────────────
  dateSource:              'telematic' | 'manual' | 'smart_process' | null;
  lastChangedBy:           string | null;   // User name or "System"
  lastChangedAt:           Date | null;

  // ── Telematics (optional) ──────────────────────────────────
  isTelematic:             boolean;
  remainingOperatingHours: number | null;   // remaining hours until service
  operatingHourThreshold:  number | null;   // threshold (e.g. 1000 hrs)
  currentOperatingHours:   number | null;   // current operating hours
}

interface CustomerAppointment {
  date: Date;
  time: string | null;   // e.g. "14:30"
  confirmedBy: string | null;
}

4.2 Priority Logic: Which date is displayed?

PriorityDateBadgeCondition
1 (highest)manualServiceDateManualIf present
2expectedServiceDateCalculatedFallback if no manual date
3(no date)Not setNeither manual nor calculated available

4.3 Naming: "Legal Inspection Date"

Recommendation: Statutory Inspection Date

Internationally understood, legally precise and unambiguously translatable in all languages. Replaces "Legal Inspection Date" uniformly everywhere.

Naming-Kandidaten anzeigen / Show naming candidates
CandidateProCon
Statutory Inspection DateInternational, legally preciseSlightly formal
Legal Inspection DateAlready in codebase"Legal" is ambiguous (≠ lawful)
Mandatory Inspection DateSimple & clearLess precise
Periodic Safety Inspection DateVery descriptiveToo long

5Widget Design: Service Date

See the German section for full widget mockups — layout is identical in both languages.

Widget variants summary:
  • Without Telematics (standard size): Last service date, Next service date (manual or calculated), Progress bar, Customer appointment, Audit info line
  • With Telematics (extended, 2 Gridster rows): All of the above + Operating Hours block (current / threshold / remaining)
  • Overdue state: Red header, warning badge, red progress bar
  • Warning state (hours low): Orange telematics block when remaining hours < 10%

6Service Cockpit: Filter & Search

In Service Cockpit under Assigned Equipments, a date range search for Service Date will be introduced — analogous to the existing filter for Statutory Inspection Date.

New Filter Fields

FieldTypeFilter Options
Service Date (Next)Date RangeFrom – To, "overdue only", "no date set"
Last Service DateDate RangeFrom – To
Statutory Inspection DateDate RangeFrom – To, "overdue only"
Customer AppointmentDate RangeFrom – To, "has appointment"
Implementation Pattern: Use the existing Statutory Inspection Date filter implementation as a template and apply it to Service Date (same GraphQL filter structure, same UI component).

7POC Plan & Phases

1
Discovery
Analysis, data model, API design
2
Backend POC
GraphQL schema, DB migration
3
Widget POC
Angular widget redesign
4
Cockpit
Filter & search
5
Rollout
Statutory Inspection + Notifications
Phase 1 · Discovery
Analysis & Concept Finalization
  • Stakeholder alignment (Equipment Domain, Service Cockpit, Telematics team)
  • GraphQL API design for the new ServiceDateData model
  • Clarification: Where does "last service date" come from? (Smart Process trigger?)
  • Define DB migration strategy
  • Decision: "Statutory Inspection Date" as the final name?
Phase 2 · Backend POC
GraphQL Schema & Database
  • New schema: ServiceDateData as GQL type
  • Add audit fields to DB: source, changed_by, changed_at
  • Introduce last_service_date field
  • Expose telematics hours field: remaining_operating_hours
  • Migration of existing expected_service_date data
Phase 3 · Widget POC
Angular Dashboard Widget Redesign
  • Extend TimeToServiceContentComponent (new inputs)
  • Refactor TimeToServiceStore state to ServiceDateData
  • Two widget sizes: Standard (no telematics) / Extended (with telematics)
  • Edit dialog: ability to set customer appointment with time
  • Source badge + audit info row
  • Gridster config: dynamic row count based on isTelematic
Phase 4 · Service Cockpit
Filter & Date Range Search
  • Assigned Equipments: Service Date range filter
  • Reuse pattern from Statutory Inspection Date filter
  • Extend GraphQL filter query
  • "Has customer appointment" filter
Phase 5 · Rollout
Statutory Inspection Date + Notifications
  • Apply same concept to Statutory Inspection Date
  • Legal → Statutory rename (API migration)
  • Notification system: inform partner + end customer
  • Email / push when service due / customer appointment created

8Open Questions

1
Where does "Last Service Date" come from?
Is it automatically set when Smart Process – Service is completed? Or does the partner need to manually confirm it?
2
Telematics: Hours Reset Trigger
Who resets the hours to 0 after service? Does it come automatically from the device or does the partner confirm it? And does this reset trigger the "lastServiceDate" update?
3
Customer Appointment: Who can set it?
Only the partner? Or also Palfinger internal? Does the end customer receive a notification when an appointment is scheduled?
4
Statutory vs. Legal: Breaking Change Strategy
When will the old API name be deprecated? Are there external consumers of the GraphQL API that need to be migrated?
5
Notification System: POC Scope?
Should the notification system be part of the POC or a separate feature after initial implementation?