3.2 ENIVERSPIMS — Arbeitsaufträge

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')
Zuletzt geändert: den 05.03.2026 um 22:04