====== 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')