====== 3.2 ENIVERSPIMS — Arbeitsaufträge ======
//Stand: 2026-03-05//
Übergeordnet: [[de:int:wvdsshell:notes:03-pims:start|PIMS-Architektur — Gesamtübersicht]]
Verwandt: [[de:int:wvdsshell:notes:03-pims:inspection|3.1 Prüfwesen]] | [[de:int:wvdsshell:notes:03-pims:safety|3.3 Sicherheitsgespräche]]
===== Konzept: work.order als zentrales Koordinationsobjekt =====
''work.order'' ist **das zentrale Objekt** in PIMS — es deckt alle Arten von Arbeiten ab:
^ ART ^ Bedeutung ^ Anteil in ENIVERS ARBEIT ^ Herkunft ^
| R | Reparatur | 59 % (20.448) | AMED Reparaturliste + ARBEIT |
| U | Wiederkehrende Überprüfung | 16 % (5.733) | WIS TimeTrain → hier |
| A | Wiederkehrende Arbeiten | 7.5 % (2.625) | ARBEIT |
| P | Projektauftrag | 6.3 % (2.208) | ARBEIT |
| S | Störungsbeseitigung | 4.2 % (1.473) | ARBEIT |
| W | Wartung | 2.6 % (922) | ARBEIT |
| N/B/V/K | Sonstige | 4.4 % | ARBEIT |
**Vorteil gegenüber TimeTrain:** Ein einziges Modell vereint Prüfaufträge (U),
Reparaturaufträge (R) und Wartungsaufträge (W). Verknüpfungen zwischen ihnen
(Prüfung → Mangel → Reparaturauftrag) bleiben im selben Schema sichtbar.
===== work.order =====
CREATE TABLE work.order (
id INT NOT NULL IDENTITY PRIMARY KEY,
order_number VARCHAR(20) NULL, -- generierte Auftragsnummer
-- Zuordnung
anlage VARCHAR(10) NULL, -- Werk/Anlage (aus ARBEIT.ANLAGE: 'LDB1','LDB2')
item_id INT NULL, -- FK → ENIVERSCAFM.asset.item
branch_id INT NULL, -- FK → ENIVERSCAFM.org.branch
emr_stelle NVARCHAR(50) NULL, -- EMR-Stelle / Bezeichnung (aus ARBEIT)
-- Typ + Inhalt
order_type VARCHAR(5) NOT NULL, -- FK → shared.list_item (list_type='ARBEIT_ART')
title NVARCHAR(200) NOT NULL, -- Kurzbeschreibung (aus ARBEIT.ARBEIT 75 Zeichen)
description NVARCHAR(MAX) NULL, -- Detailbeschreibung (aus ARBEIT.BEMERKUNG)
work_status VARCHAR(5) NULL, -- FK → shared.list_item (list_type='WORK_STATUS')
priority VARCHAR(5) NULL, -- FK → shared.list_item (list_type='WORK_PRIORITY')
-- Termine
date_received DATETIME2 NULL, -- Eingang (ARBEIT.EING_DAT)
date_due DATETIME2 NULL, -- Fälligkeitstermin (ARBEIT.TERMIN)
date_period_end DATETIME2 NULL, -- Zeitraumende (ARBEIT.ZEITRAUM)
date_completed DATETIME2 NULL, -- Erledigt (ARBEIT.ERLED_DAT)
date_installed DATETIME2 NULL, -- Inbetriebnahme (ARBEIT.INBETR_DAT)
-- Personal
requester_id INT NULL, -- Anforderer (ARBEIT.ANFORDERER)
requester_name NVARCHAR(50) NULL,
assignee_code VARCHAR(10) NULL, -- Bearbeiter-Kürzel (ARBEIT.BEARBEITER)
department_code VARCHAR(5) NULL, -- Abteilung (ARBEIT.strArbAbteilung)
-- Freigabe
requires_approval BIT NOT NULL DEFAULT 0,
approval_given BIT NULL, -- NULL=offen, 1=freigegeben, 0=abgelehnt
approval_code VARCHAR(5) NULL, -- Wer hat freigegeben
-- Aufwand
effort_hours DECIMAL(8,2) NULL, -- ARBEIT.AUFWAND
standzeit_min INT NULL, -- Stillstandszeit (ARBEIT.Standzeit)
-- Verknüpfungen
plan_id INT NULL, -- FK → work.plan
parent_order_id INT NULL, -- FK → work.order (Folgeauftrag)
-- Inspection-Verknüpfung (wenn ART='U')
rule_id INT NULL, -- FK → inspection.rule
-- Fault-Verknüpfung (wenn ART='R', aus Schadensmeldung)
fault_report_id INT NULL, -- FK → fault.report
-- Notizen + Arbeitsstand
progress_notes NVARCHAR(MAX) NULL, -- ARBEIT.ARBEITSSTAND
additional_notes NVARCHAR(MAX) NULL, -- ARBEIT.ZUSATZ_BEMERKUNG
-- Migration
legacy_id INT NULL, -- ARBEIT.Zahler oder Reparaturliste.LfdNr
legacy_source VARCHAR(20) NULL, -- 'ENIVERS_ARBEIT' | 'AMED_REPA' | 'WIS_TT'
-- Audit
created_at DATETIME2 NOT NULL DEFAULT SYSUTCDATETIME(),
updated_at DATETIME2 NOT NULL DEFAULT SYSUTCDATETIME(),
created_by INT NULL,
updated_by INT NULL
)
==== Status-Werte (aus ENIVERS ARBEIT, normalisiert) ====
Aus ''ARBEIT.STATUS'' (Werte 1–8, Bedeutung aus Quellcode abzuleiten):
INSERT INTO shared.list_item (list_type, code, label, sort_order) VALUES
('WORK_STATUS', '1', 'Offen', 1),
('WORK_STATUS', '2', 'In Bearbeitung', 2),
('WORK_STATUS', '3', 'Erledigt', 3),
('WORK_STATUS', '4', 'Zurückgestellt', 4),
('WORK_STATUS', '5', 'Wartend auf Freigabe', 5),
('WORK_STATUS', '6', 'Storniert', 6),
('WORK_STATUS', '7', 'Geplant', 7),
('WORK_STATUS', '8', 'Archiviert', 8);
//Hinweis: Genaue Semantik der Status-Codes ist anhand AMED/ENIVERS-Quellcode zu verifizieren.//
===== work.order_cost — Kostenerfassung =====
Normalisiert aus ''ARBEIT'' (PL_KOS, Material, Fremdleistung, MON_KOS) in separate Zeilen:
CREATE TABLE work.order_cost (
id INT NOT NULL IDENTITY PRIMARY KEY,
order_id INT NOT NULL, -- FK → work.order
cost_type VARCHAR(20) NOT NULL, -- 'PLANUNG', 'MATERIAL', 'FREMDLEISTUNG', 'MONTAGE'
amount DECIMAL(12,2) NOT NULL,
currency CHAR(3) NOT NULL DEFAULT 'EUR',
notes NVARCHAR(500) NULL
)
^ cost_type ^ Herkunft ARBEIT-Spalte ^ Beschreibung ^
| ''PLANUNG'' | PL_KOS | Geplante Gesamtkosten |
| ''MATERIAL'' | Material | Materialkosten |
| ''FREMDLEISTUNG'' | Fremdleistung | Externe Dienstleister |
| ''MONTAGE'' | MON_KOS / AufwAuG | Montagekosten |
===== work.plan — Arbeitsplanung =====
Abgeleitet aus ''ENIVERS.tblArbeitPlan'' (Stillstandspläne, Revisionspläne):
CREATE TABLE work.plan (
id INT NOT NULL IDENTITY PRIMARY KEY,
name VARCHAR(25) NOT NULL, -- tblArbeitPlan.strApName
designation NVARCHAR(50) NULL, -- strApBezeichnung
date_begin DATETIME2 NULL,
date_end DATETIME2 NULL,
department_code VARCHAR(5) NULL,
is_shutdown BIT NOT NULL DEFAULT 0, -- strApStillstand
branch_id INT NULL,
is_inactive BIT NOT NULL DEFAULT 0,
notes NVARCHAR(MAX) NULL,
-- Migration
legacy_id INT NULL, -- tblArbeitPlan.idArbeitPlan
-- Audit
created_at DATETIME2 NOT NULL DEFAULT SYSUTCDATETIME(),
updated_at DATETIME2 NOT NULL DEFAULT SYSUTCDATETIME()
)
===== fault.report — Schadensmeldungen =====
Zentraler Mangel-/Schadensbericht. Abgeleitet aus **AMED Reparaturliste** (100.159 Einträge).
CREATE TABLE fault.report (
id INT NOT NULL IDENTITY PRIMARY KEY,
item_id INT NULL, -- FK → ENIVERSCAFM.asset.item
-- Meldung
report_date DATE NOT NULL, -- Datum der Meldung
reporter_name NVARCHAR(50) NULL, -- Melder
description NVARCHAR(500) NOT NULL, -- Schadensmeldung
-- Betroffene Disziplinen (aus Reparaturliste: bit-Flags)
discipline_mech BIT NOT NULL DEFAULT 0,
discipline_emr BIT NOT NULL DEFAULT 0,
discipline_piping BIT NOT NULL DEFAULT 0,
discipline_other BIT NOT NULL DEFAULT 0,
discipline_other_text NVARCHAR(255) NULL,
-- Gefährdungspotential
has_accident_potential BIT NOT NULL DEFAULT 0, -- bitUnfallpotential
-- Status pro Disziplin
status_mech SMALLINT NULL,
status_emr SMALLINT NULL,
status_piping SMALLINT NULL,
status_other SMALLINT NULL,
-- Abschluss
date_completed DATE NULL,
date_start DATE NULL,
date_end DATE NULL,
-- Freigabe
approval_id INT NULL,
-- Folge-Aufträge
work_order_id INT NULL, -- FK → work.order (generierter Reparaturauftrag)
-- Safety
safety_check_type VARCHAR(5) NULL, -- FK → shared.list_item (list_type='SAFETY_CHECK')
-- A=Risikoanalyse, S=Sicherheitsgespräch, C=Check
-- Migration
legacy_id INT NULL, -- Reparaturliste.LfdNr
legacy_idgpb INT NULL, -- Reparaturliste.IDGPB
-- Audit
created_at DATETIME2 NOT NULL DEFAULT SYSUTCDATETIME(),
updated_at DATETIME2 NOT NULL DEFAULT SYSUTCDATETIME()
)
==== Safety-Check-Typen (aus AMED Sicherheitscheck-Tabelle) ====
INSERT INTO shared.list_item (list_type, code, label, sort_order) VALUES
('SAFETY_CHECK', 'A', 'Risikoanalyse', 1),
('SAFETY_CHECK', 'S', 'Sicherheitsgespräch', 2),
('SAFETY_CHECK', 'C', 'Sicherheitscheck', 3);
===== Verknüpfungsmodell =====
work.plan (Revision / Stillstand)
│
└─► work.order (plan_id)
│
┌─────────┼──────────────┐
│ │ │
▼ ▼ ▼
ART='U' ART='R' ART='W'
(Prüfung) (Reparatur) (Wartung)
│ ▲
│ │ fault_report_id
│ │
▼ │
inspection.result
│
└──► fault.report ──► work.order (ART='R')