-- Migration: Widerrufs-Button nach EU-RL 2026/2673 (§ 312g BGB neu)
-- Datum:     2026-04-19
-- Autor:     Thomas Bartelt / Wlanium
-- Scope:     Elektronischer Widerruf für B2C (Endverbraucher=1, Gast=103)
-- Silent-Modus bis Mitte Mai 2026 via Config-Flag (kein DB-Flag nötig)

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 1;

-- ============================================================
-- Tabelle: revocations
-- Ein Eintrag pro Bestellung, für die ein Widerrufs-Link erzeugt
-- wurde. Legacy-Bestellungen vor Go-Live bleiben unberührt.
-- ============================================================
CREATE TABLE IF NOT EXISTS revocations (
  id                    BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  order_id              BIGINT UNSIGNED NOT NULL,
  customer_id           INT UNSIGNED NULL,
  customer_email        VARCHAR(255) NOT NULL,
  customer_group_id     INT NOT NULL COMMENT 'Snapshot zum Bestellzeitpunkt',

  token_hash            CHAR(64) NOT NULL COMMENT 'SHA-256 des URL-Tokens',
  expires_at            DATETIME NOT NULL COMMENT '20 Tage ab Bestelldatum',

  status                ENUM('pending','submitted','processed','expired','revoked_by_admin')
                          NOT NULL DEFAULT 'pending',

  submitted_at          DATETIME NULL,
  processed_at          DATETIME NULL,
  owner_notified_at     DATETIME NULL,
  customer_confirmed_at DATETIME NULL,

  reason_id             INT UNSIGNED NULL,
  reason_text           TEXT NULL,

  ip_anonymized         VARCHAR(45) NULL COMMENT 'gesetzt nur bei submit, /24 v4 oder /48 v6',
  user_agent            VARCHAR(255) NULL,

  admin_note            TEXT NULL,

  created_at            DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at            DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

  PRIMARY KEY (id),
  UNIQUE KEY uk_token_hash (token_hash),
  UNIQUE KEY uk_order_id  (order_id) COMMENT 'max 1 Widerruf pro Bestellung',
  KEY idx_status_expires (status, expires_at),
  KEY idx_customer_email (customer_email),
  CONSTRAINT fk_rev_order FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


-- ============================================================
-- Tabelle: revocation_reasons
-- Optionale Gründe-Liste für das Widerrufs-Formular.
-- Bewusst eigene Tabelle, nicht cancellationreasons (andere Semantik).
-- ============================================================
CREATE TABLE IF NOT EXISTS revocation_reasons (
  id     INT UNSIGNED NOT NULL AUTO_INCREMENT,
  label  VARCHAR(150) NOT NULL,
  sort   SMALLINT UNSIGNED NOT NULL DEFAULT 0,
  active TINYINT(1) UNSIGNED NOT NULL DEFAULT 1,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


-- Seed: 6 Standardgründe
INSERT INTO revocation_reasons (label, sort, active) VALUES
  ('Artikel entspricht nicht der Beschreibung', 10, 1),
  ('Falscher Artikel geliefert',                20, 1),
  ('Artikel beschädigt angekommen',             30, 1),
  ('Artikel passt nicht / nicht kompatibel',    40, 1),
  ('Lieferung zu spät',                         50, 1),
  ('Anderer Grund',                             99, 1);
