Zum Hauptinhalt springen

Datenbank-Änderungen Sprint AW

Sammel-Sprint vom 13.06.2026 — 5 Items aus dem Cloud-DB-Backlog (Modul 9 + Modul 29 Teil B + 2 Views + Gast-Spalten) wurden in einem Rutsch eingespielt. Migrationen 2026061300001720260613000021, SQL-Blöcke 00330037.

Repo: de.profipos.shared · DB: 0profipos auf 88.99.138.84.

Übersicht

#MigrationSQL-BlöckeInhalt
17Sprint3Modul29bStoredProcedures0033 (6 Blocks)2 Procedures + EVENT (DISABLED)
18Sprint3Modul9QrReservierfixEsl0034 (6 Blocks)qr_codes_statisch + reservierfix_tische + 3 Spalten an tische + 2 FKs
19Sprint3ViewArtikelAktuellerPreis0035 (1 Block)View v_artikel_aktueller_preis (CTE + ROW_NUMBER)
20Sprint3ViewEslUpdatePending0036 (1 Block)View v_esl_update_pending mit Priorisierung
21Sprint3BestellungenGastSpalten0037 (3 Blocks)4 gast_*-Spalten + FULLTEXT-Index

Item 1 — Modul 29 Teil B: Stored Procedures + EVENT

-- Wartung: monatliche Partitionen anlegen
CALL proc_create_monthly_partitions();

-- Wartung: alte Partitionen archivieren
CALL proc_archive_old_partitions();

-- Scheduler-Event (DEAKTIVIERT bis Phase 2 Partitionierung live)
CREATE EVENT ev_partition_maintenance
ON SCHEDULE EVERY 1 DAY STARTS '2026-06-14 03:30:00'
DISABLE
DO BEGIN
CALL proc_create_monthly_partitions();
CALL proc_archive_old_partitions();
END;

Aktivierung (Phase 2):

ALTER EVENT ev_partition_maintenance ENABLE;
SET GLOBAL event_scheduler = ON;

Item 2 — Modul 9 Erweiterung: QR + Reservierfix + ESL

-- Neue Tabellen
CREATE TABLE qr_codes_statisch (
qr_code_uuid CHAR(36) PRIMARY KEY,
mandant_uuid CHAR(36) NOT NULL,
standort_uuid CHAR(36) NOT NULL,
kennung VARCHAR(60) NOT NULL,
ziel_url VARCHAR(500) NOT NULL,
erstellt_am DATETIME NOT NULL,
KEY idx_mandant (mandant_uuid)
);

CREATE TABLE reservierfix_tische (
reservierfix_tisch_id VARCHAR(100) NOT NULL,
tisch_uuid CHAR(36) NOT NULL,
zugeordnet_am DATETIME NOT NULL,
PRIMARY KEY (reservierfix_tisch_id, tisch_uuid),
CONSTRAINT fk_rt_tisch FOREIGN KEY (tisch_uuid)
REFERENCES tische(tisch_uuid) ON DELETE CASCADE
);

-- Erweiterung tische
ALTER TABLE tische
ADD COLUMN qr_code_static_uuid CHAR(36) NULL,
ADD COLUMN reservierfix_tisch_id VARCHAR(100) NULL,
ADD COLUMN esl_display_uuid CHAR(36) NULL,
ADD CONSTRAINT fk_tische_qr_code_static
FOREIGN KEY (qr_code_static_uuid) REFERENCES qr_codes_statisch(qr_code_uuid),
ADD CONSTRAINT fk_tische_esl_display
FOREIGN KEY (esl_display_uuid) REFERENCES esl_etiketten(esl_uuid);
Wichtige Schema-Entscheidungen
  • tische.reservierfix_tisch_id ist KEIN FK — VARCHAR(100) ohne Constraint. Die echte interne Brücke ist die separate Tabelle reservierfix_tische (mehrere externe IDs pro Tisch möglich).
  • tische.esl_display_uuid zeigt auf esl_etiketten(esl_uuid) — semantisch korrekter als geraete(geraet_uuid) (welches ESL-Etikett hängt am Tisch).

Item 3 — v_artikel_aktueller_preis

CTE + ROW_NUMBER ermittelt pro Artikel den aktuell gültigen Preis basierend auf artikel_preise (gueltig_ab, gueltig_bis, wochentage, uhrzeit_von, uhrzeit_bis).

SELECT *
FROM v_artikel_aktueller_preis
WHERE mandant_uuid = ? AND standort_uuid = ?;

Wochentag-Konvention ab Sprint AW: CSV deutscher Kürzel Mo,Di,Mi,Do,Fr,Sa,So. Leer/NULL = alle Tage.

Bestandsdaten-Migration

Der historische DB-Kommentar zu artikel_preise.wochentage sagt „1–7“ (Mo=1..So=7). Diese Notation greift in der neuen View nicht mehr — Bestandsdaten müssen einmalig auf die deutschen Kürzel umgeformt werden (offen, Backlog).

Die View matched per:

FIND_IN_SET(ELT(WEEKDAY(NOW())+1, 'Mo','Di','Mi','Do','Fr','Sa','So'), wochentage)

Item 4 — v_esl_update_pending

Priorisierte Liste anstehender ESL-Display-Updates:

PrioritätBedingung
hochPreisänderung wurde > 1 h nicht propagiert
normalsonstige ausstehende Updates

Quell-Tabelle: esl_update_queue (Feld angefordert_am, nicht created_at).

Item 5 — Gast-Spalten an bestellungen

Für Online-Bestellungen mit Gast-Kontaktdaten:

ALTER TABLE bestellungen
ADD COLUMN gast_vorname VARCHAR(80) NULL,
ADD COLUMN gast_nachname VARCHAR(80) NULL,
ADD COLUMN gast_email VARCHAR(180) NULL,
ADD COLUMN gast_telefon VARCHAR(40) NULL,
ADD FULLTEXT INDEX idx_ft_bestellungen_gast
(gast_vorname, gast_nachname, gast_email, gast_telefon);

Lesson Learned: DELIMITER ist KEIN Server-Konzept

// Klappt: ein Compound-Statement direkt durch PDO::exec
$this->execute(<<<SQL
CREATE PROCEDURE proc_xyz()
BEGIN
DECLARE x INT;
SET x = 1;
-- ...
END
SQL);

DELIMITER ist nur ein Konzept im mysql-CLI, der Server parsed die internen ; selbst. Das hat in der Vergangenheit zu unnötigen Workarounds (getAdapter()->getConnection()->exec()) geführt — nicht mehr nötig.

Verwandte Themen