BEGIN TRANSACTION;
DROP TABLE IF EXISTS "betriebsmittel";
CREATE TABLE "betriebsmittel" (
	"ID"	INTEGER,
	"kennzeichen"	TEXT NOT NULL COLLATE NOCASE,
	"gruppe"	INTEGER NOT NULL,
	"ort"	TEXT,
	"bezeichnung"	TEXT,
	"beschreibung"	TEXT,
	UNIQUE("kennzeichen" COLLATE NOCASE,"gruppe"),
	PRIMARY KEY("ID"),
	FOREIGN KEY("gruppe") REFERENCES "gruppen"("gruppe") ON UPDATE CASCADE ON DELETE RESTRICT,
	FOREIGN KEY("ort") REFERENCES "orte"("ort") ON UPDATE CASCADE ON DELETE RESTRICT
);
DROP TABLE IF EXISTS "gruppen";
CREATE TABLE "gruppen" (
	"gruppe"	INTEGER,
	"beschreibung"	TEXT,
	PRIMARY KEY("gruppe")
);
DROP TABLE IF EXISTS "input";
CREATE TABLE "input" (
	"ID"	INTEGER,
	"kennzeichen"	TEXT NOT NULL COLLATE NOCASE,
	"gruppe"	INTEGER NOT NULL,
	"byte"	INTEGER NOT NULL CHECK("byte" >= 0),
	"bit"	INTEGER NOT NULL CHECK("bit" BETWEEN 0 AND 7),
	"mapping"	TEXT,
	"funktion"	TEXT,
	"schaltet_betriebsmittel"	TEXT COLLATE NOCASE,
	"schaltet_gruppe"	INTEGER,
	"schaltet_klemme"	TEXT COLLATE NOCASE,
	UNIQUE("schaltet_betriebsmittel" COLLATE NOCASE,"schaltet_gruppe","schaltet_klemme"),
	PRIMARY KEY("ID" AUTOINCREMENT),
	UNIQUE("gruppe","byte","bit"),
	FOREIGN KEY("kennzeichen","gruppe") REFERENCES "betriebsmittel"("kennzeichen","gruppe") ON UPDATE CASCADE ON DELETE RESTRICT,
	FOREIGN KEY("schaltet_betriebsmittel","schaltet_gruppe") REFERENCES "betriebsmittel"("kennzeichen","gruppe") ON UPDATE CASCADE ON DELETE RESTRICT,
	CHECK(("schaltet_betriebsmittel" IS NULL AND "schaltet_gruppe" IS NULL) OR ("schaltet_betriebsmittel" IS NOT NULL AND "schaltet_gruppe" IS NOT NULL))
);
DROP TABLE IF EXISTS "orte";
CREATE TABLE "orte" (
	"ort"	TEXT,
	"beschreibung"	TEXT,
	PRIMARY KEY("ort")
);
DROP TABLE IF EXISTS "output";
CREATE TABLE "output" (
	"ID"	INTEGER,
	"kennzeichen"	TEXT NOT NULL COLLATE NOCASE,
	"gruppe"	INTEGER NOT NULL,
	"byte"	INTEGER NOT NULL CHECK("byte" >= 0),
	"bit"	INTEGER NOT NULL CHECK("bit" BETWEEN 0 AND 7),
	"mapping"	TEXT,
	"funktion"	TEXT,
	"schaltet_betriebsmittel"	TEXT COLLATE NOCASE,
	"schaltet_gruppe"	INTEGER,
	"schaltet_klemme"	TEXT COLLATE NOCASE,
	UNIQUE("schaltet_betriebsmittel" COLLATE NOCASE,"schaltet_gruppe","schaltet_klemme"),
	PRIMARY KEY("ID" AUTOINCREMENT),
	UNIQUE("gruppe","byte","bit"),
	FOREIGN KEY("kennzeichen","gruppe") REFERENCES "betriebsmittel"("kennzeichen","gruppe") ON UPDATE CASCADE ON DELETE RESTRICT,
	FOREIGN KEY("schaltet_betriebsmittel","schaltet_gruppe") REFERENCES "betriebsmittel"("kennzeichen","gruppe") ON UPDATE CASCADE ON DELETE RESTRICT,
	CHECK(("schaltet_betriebsmittel" IS NULL AND "schaltet_gruppe" IS NULL) OR ("schaltet_betriebsmittel" IS NOT NULL AND "schaltet_gruppe" IS NOT NULL))
);
INSERT INTO "betriebsmittel" ("ID","kennzeichen","gruppe","ort","bezeichnung","beschreibung") VALUES (1,'M25',1,'H1','Schaltschranklüfter',NULL),
 (2,'A12',3,'H1','Pilz Basisgerät',NULL),
 (3,'F26',1,'H1','Blitzschutz Typ3',NULL),
 (4,'H24',1,'H1','Leuchte Hauptschalter EIN',NULL),
 (5,'L22',1,'H1','Blitzschutz Typ 2',NULL),
 (6,'F16',1,'H1','Sicherung Energiemessung',NULL),
 (7,'A14',1,'H1','Energiemessung',NULL),
 (8,'B12',1,'H1','Stromsummenzähler (CT) L3',NULL),
 (9,'B13',1,'H1','Stromsummenzähler (CT) L2',NULL),
 (10,'B14',1,'H1','Stromsummenzähler (CT) L1',NULL),
 (11,'S11',1,'H1','Hauptschalter',NULL),
 (12,'S25',1,'H1','Temperaturregler Schaltschranklüfter',NULL),
 (13,'F25',1,'H1','LS Schaltschranklüfter',NULL),
 (17,'A11',3,'H1','Pilz Buskoppler Ethercat',NULL),
 (18,'A16',3,'H1','Pilz Ausgangsbaugruppe',NULL),
 (19,'A17',3,'H1','Pilz Eingangsbaugruppe',NULL),
 (20,'A22',3,'H1','Pilz Eingangsbaugruppe',NULL),
 (21,'A23',3,'H1','Pilz Ausgangsbaugruppe',NULL),
 (22,'A24',3,'H1','Pilz Ausgangsbaugruppe',NULL),
 (24,'S32',3,'H1','Pilz Notausschalter',NULL),
 (25,'K62',15,'H1','Relais Ventil Y65 (Presse öffnen)',NULL),
 (26,'K63',15,'H1','Relais Ventil Y66 (Presse öffnen)',NULL),
 (27,'Y65',15,'H1','Ventil Presse öffnen 1',NULL),
 (28,'Y66',15,'H1','Ventil Presse öffnen 2',NULL),
 (29,'K72',15,'H1','Relais Ventil Y75 (Presse öffnen)',NULL),
 (30,'K73',15,'H1','Relais Ventil Y76 (Presse öffnen)',NULL),
 (31,'Y75',15,'H1','Ventil Presse öffnen 3',NULL),
 (32,'Y76',15,'H1','Ventil Presse öffnen 4',NULL),
 (34,'A14',2,'H1','SPS Ausgansbaugruppe',NULL),
 (35,'T62',1,'H1','Netzgerät 400V 24VDC',NULL),
 (36,'S33',3,'H1','Pilz Notausschalter (oben)',NULL),
 (37,'S34',3,'H1','Taster Quittieren Not-Aus',NULL),
 (38,'H36',3,'H1','Leuchte Not-Aus Meldung',NULL),
 (39,'K37',3,'H1','',NULL),
 (40,'K37.1',3,'H1','',NULL),
 (41,'S42',3,'H1','Taster Quittieren Störung',NULL),
 (42,'A42',3,'H1','PIT m3.2p (Safe Operation Module)',NULL),
 (43,'S52',3,'H1','Taster Quittieren Betriebsart','');
INSERT INTO "gruppen" ("gruppe","beschreibung") VALUES (0,'Projektdaten'),
 (1,'Einspeisung'),
 (2,'Steuerung'),
 (3,'Pilz'),
 (11,'Bedienung Elemente'),
 (15,'Ventile'),
 (17,'Auswerfer'),
 (20,'Heizung'),
 (25,'Wasserbehälter'),
 (30,'Klemmleisten');
INSERT INTO "input" ("ID","kennzeichen","gruppe","byte","bit","mapping","funktion","schaltet_betriebsmittel","schaltet_gruppe","schaltet_klemme") VALUES (1,'A12',3,2060,4,'I4','Notaus Quittieren','S34',3,'4'),
 (2,'A12',3,2061,0,'I8','Quittieren Störung Pilz','S42',3,'4'),
 (3,'A12',3,2061,5,'I13','Betriebsart Einzelhub','A42',3,'SOM1'),
 (4,'A12',3,2061,6,'I14','Betriebsart Einrichten','A42',3,'SOM2'),
 (5,'A12',3,2061,7,'I15','Betriebsart -frei-','A42',3,'SOM3'),
 (6,'A12',3,2062,0,'I16','Betriebsart -frei-','A42',3,'SOM4'),
 (7,'A12',3,2062,1,'I17','Betriebsart -frei-','A42',3,'SOM5'),
 (8,'A12',3,2062,2,NULL,'reserve',NULL,NULL,NULL),
 (9,'A12',3,2062,3,NULL,'reserve',NULL,NULL,NULL);
INSERT INTO "orte" ("ort","beschreibung") VALUES ('H1','Schaltschrank 1, groß'),
 ('H2','Schaltschrank 2, klein oberhalb H1'),
 ('H3','Schaltschrank 3, klein, hinter Ventilgruppe'),
 ('H4','mobiles Bedienelement'),
 ('H5','Monitorgehäuse, schwenbar'),
 ('H6','direkt an Presse montiert'),
 (NULL,NULL);
INSERT INTO "output" ("ID","kennzeichen","gruppe","byte","bit","mapping","funktion","schaltet_betriebsmittel","schaltet_gruppe","schaltet_klemme") VALUES (1,'A14',2,2,0,NULL,'Schaltet -K72 und damit Ventil -Y75','K72',15,NULL);
DROP VIEW IF EXISTS "v_input";
CREATE VIEW "v_input" AS
SELECT
  i.ID,
  i.kennzeichen,
  i.byte,
  i.bit,
  printf('%d.%d', i.byte, i.bit) AS adresse,
  i.gruppe,
  i.funktion
FROM input i;
DROP VIEW IF EXISTS "v_output";
CREATE VIEW "v_output" AS
SELECT
  o.ID,
  o.kennzeichen,
  o.byte,
  o.bit,
  printf('%d.%d', o.byte, o.bit) AS adresse,
  o.gruppe,
  o.funktion
FROM output o;
DROP TRIGGER IF EXISTS "bm_upper_ai";
CREATE TRIGGER bm_upper_ai
AFTER INSERT ON betriebsmittel
FOR EACH ROW
BEGIN
  UPDATE betriebsmittel
     SET kennzeichen = UPPER(kennzeichen)
   WHERE rowid = NEW.rowid
     AND kennzeichen <> UPPER(kennzeichen) COLLATE BINARY;
END;
DROP TRIGGER IF EXISTS "bm_upper_au";
CREATE TRIGGER bm_upper_au
AFTER UPDATE OF kennzeichen ON betriebsmittel
FOR EACH ROW
BEGIN
  UPDATE betriebsmittel
     SET kennzeichen = UPPER(kennzeichen)
   WHERE rowid = NEW.rowid
     AND kennzeichen <> UPPER(kennzeichen) COLLATE BINARY;
END;
DROP TRIGGER IF EXISTS "in_upper_ai";
CREATE TRIGGER in_upper_ai
AFTER INSERT ON input
FOR EACH ROW
BEGIN
  UPDATE input
     SET kennzeichen = UPPER(kennzeichen),
         schaltet_betriebsmittel = CASE
             WHEN schaltet_betriebsmittel IS NULL THEN NULL
             ELSE UPPER(schaltet_betriebsmittel)
         END
   WHERE rowid = NEW.rowid
     AND (kennzeichen <> UPPER(kennzeichen) COLLATE BINARY
          OR (schaltet_betriebsmittel IS NOT NULL
              AND schaltet_betriebsmittel <> UPPER(schaltet_betriebsmittel) COLLATE BINARY));
END;
DROP TRIGGER IF EXISTS "in_upper_au";
CREATE TRIGGER in_upper_au
AFTER UPDATE OF kennzeichen, schaltet_betriebsmittel ON input
FOR EACH ROW
BEGIN
  UPDATE input
     SET kennzeichen = UPPER(kennzeichen),
         schaltet_betriebsmittel = CASE
             WHEN schaltet_betriebsmittel IS NULL THEN NULL
             ELSE UPPER(schaltet_betriebsmittel)
         END
   WHERE rowid = NEW.rowid
     AND (kennzeichen <> UPPER(kennzeichen) COLLATE BINARY
          OR (schaltet_betriebsmittel IS NOT NULL
              AND schaltet_betriebsmittel <> UPPER(schaltet_betriebsmittel) COLLATE BINARY));
END;
DROP TRIGGER IF EXISTS "orte_upper_ai";
CREATE TRIGGER orte_upper_ai
AFTER INSERT ON orte
FOR EACH ROW
WHEN NEW.ort <> UPPER(NEW.ort)
BEGIN
  UPDATE orte
     SET ort = UPPER(NEW.ort)
   WHERE rowid = NEW.rowid;
END;
DROP TRIGGER IF EXISTS "orte_upper_au";
CREATE TRIGGER orte_upper_au
AFTER UPDATE OF ort ON orte
FOR EACH ROW
WHEN NEW.ort <> UPPER(NEW.ort)
BEGIN
  UPDATE orte
     SET ort = UPPER(NEW.ort)
   WHERE rowid = NEW.rowid;
END;
DROP TRIGGER IF EXISTS "out_upper_ai";
CREATE TRIGGER out_upper_ai
AFTER INSERT ON output
FOR EACH ROW
BEGIN
  UPDATE output
     SET kennzeichen = UPPER(kennzeichen),
         schaltet_betriebsmittel = CASE
             WHEN schaltet_betriebsmittel IS NULL THEN NULL
             ELSE UPPER(schaltet_betriebsmittel)
         END
   WHERE rowid = NEW.rowid
     AND (kennzeichen <> UPPER(kennzeichen) COLLATE BINARY
          OR (schaltet_betriebsmittel IS NOT NULL
              AND schaltet_betriebsmittel <> UPPER(schaltet_betriebsmittel) COLLATE BINARY));
END;
DROP TRIGGER IF EXISTS "out_upper_au";
CREATE TRIGGER out_upper_au
AFTER UPDATE OF kennzeichen, schaltet_betriebsmittel ON output
FOR EACH ROW
BEGIN
  UPDATE output
     SET kennzeichen = UPPER(kennzeichen),
         schaltet_betriebsmittel = CASE
             WHEN schaltet_betriebsmittel IS NULL THEN NULL
             ELSE UPPER(schaltet_betriebsmittel)
         END
   WHERE rowid = NEW.rowid
     AND (kennzeichen <> UPPER(kennzeichen) COLLATE BINARY
          OR (schaltet_betriebsmittel IS NOT NULL
              AND schaltet_betriebsmittel <> UPPER(schaltet_betriebsmittel) COLLATE BINARY));
END;
COMMIT;
