CREATE DATABASE pmv;
USE pmv;

CREATE TABLE mitglied (
  nr int(11) unsigned NOT NULL,
  vorname varchar(40) NOT NULL,
  nachname varchar(40) NOT NULL,
  geburtsdatum date NOT NULL,
  email varchar(80) DEFAULT NULL,
  telefon varchar(20) DEFAULT NULL,
  nickname varchar(32) DEFAULT NULL,
  strasse varchar(40) DEFAULT NULL,
  plz mediumint(5) DEFAULT NULL,
  ort varchar(40) DEFAULT NULL,
  staatsang varchar(2) NOT NULL COMMENT 'ISO2-Kürzel',
  eintrittsdatum date NOT NULL,
  austrittsdatum date DEFAULT NULL,
  schwebend tinyint(1) NOT NULL DEFAULT 1,
  stimmberechtigt tinyint(1) DEFAULT 0,
  status ENUM('aktiv', 'ruhend', 'ausgetreten') NOT NULL DEFAULT 'aktiv',
  PRIMARY KEY (nr),
  KEY ix_nachname (nachname),
  KEY ix_nickname (nickname)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE beitrag (
  mitgliednr int(11) unsigned NOT NULL,
  beitrag decimal(10,2) DEFAULT NULL,
  reduziert tinyint(1) NOT NULL DEFAULT 0,
  reduziert_bis date DEFAULT NULL,
  mahnstatus tinyint(3) NOT NULL DEFAULT 0,
  mahndatum date DEFAULT NULL,
  lastschrift tinyint(1) NOT NULL DEFAULT 0,
  letztebuchung date DEFAULT NULL,
  letzteueberweisung date DEFAULT NULL,
  bemerkung varchar(80) DEFAULT NULL,
  PRIMARY KEY (mitgliednr),
  CONSTRAINT fk_beitrag_mitglied FOREIGN KEY (mitgliednr) REFERENCES mitglied (nr)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE buchung (
  id int(11) unsigned NOT NULL AUTO_INCREMENT,
  mitgliednr int(11) unsigned NOT NULL,
  buchungsdatum date NOT NULL,
  soll decimal(10,2) DEFAULT NULL,
  ist decimal(10,2) DEFAULT NULL,
  abrechnungsjahr year(4) DEFAULT NULL,
  PRIMARY KEY (id),
  KEY ix_mitgliednr (mitgliednr),
  KEY ix_datum (buchungsdatum),
  CONSTRAINT fk_buchung_mitglied FOREIGN KEY (mitgliednr) REFERENCES mitglied (nr)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE bundesland (
  ls tinyint(2) unsigned zerofill NOT NULL,
  bez_amtlich varchar(30) NOT NULL,
  bezeichnung varchar(30) NOT NULL,
  kuerzel char(2) NOT NULL,
  PRIMARY KEY (ls),
  UNIQUE KEY ix_kuerzel (kuerzel)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE gemeinde (
  ags char(8) NOT NULL,
  bezeichnung varchar(60) NOT NULL,
  plz mediumint(5) unsigned zerofill DEFAULT NULL,
  lat decimal(6,4) DEFAULT NULL,
  lon decimal(7,4) DEFAULT NULL,
  flaeche float DEFAULT NULL,
  PRIMARY KEY (ags)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE gliederung (
  gliederung_id smallint(5) unsigned NOT NULL,
  kuerzel varchar(8) NOT NULL,
  bezeichnung varchar(40) NOT NULL,
  PRIMARY KEY (gliederung_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE global (
  id smallint(5) unsigned NOT NULL,
  globname varchar(20) NOT NULL,
  datentyp enum('Integer','Float','Decimal','String','Boolean','Date') DEFAULT NULL,
  beschreibung varchar(80) DEFAULT NULL,
  wert text DEFAULT NULL,
  PRIMARY KEY (id),
  KEY ix_globname (globname)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE konto (
  id int(11) unsigned NOT NULL AUTO_INCREMENT,
  mitgliednr int(11) unsigned NOT NULL,
  system varchar(20) DEFAULT NULL,
  benutzername varchar(20) DEFAULT NULL,
  PRIMARY KEY (id),
  KEY fk_konto_mitglied (mitgliednr),
  CONSTRAINT fk_konto_mitglied FOREIGN KEY (mitgliednr) REFERENCES mitglied (nr)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE versammlung (
  id int(11) unsigned NOT NULL AUTO_INCREMENT,
  bezeichnung varchar(80) NOT NULL,
  datum_von DATE NOT NULL,
  datum_bis DATE,
  ort varchar(40) DEFAULT NULL,
  typ tinyint(3) NOT NULL DEFAULT 1 COMMENT '1=Parteitag, 2=Aufstellung',
  PRIMARY KEY (id),
  KEY ix_versammlungsdatum (datum_von)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE wahl (
  id smallint(5) unsigned NOT NULL,
  kuerzel varchar(8) NOT NULL,
  bezeichnung varchar(40) NOT NULL,
  wahltag date NOT NULL,
  PRIMARY KEY (id),
  KEY ix_wahltag (wahltag)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE wahlkreis (
  wahl_id smallint(5) unsigned NOT NULL,
  nr smallint(5) unsigned NOT NULL,
  bezeichnung varchar(60) NOT NULL,
  PRIMARY KEY (wahl_id,nr)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE session (
  sessionkey CHAR(32) NOT NULL,
  sessionstart TIMESTAMP NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (sessionkey)
) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4;
