""" DB-Versionierung für die CRM-Datenbank (kbp_crm.db). Analog zu auth/model/checkdb.py: Beim Start wird checkupdates() aufgerufen und führt alle _db_Vxx_xx-Funktionen aus, deren Versionsnummer größer ist als die in der Systeminfo-Tabelle vermerkte. Neue Migrationen werden als weitere _db_Vxx_xx-Funktionen ergänzt. :author: Mistral Vibe :date: 2026-09-02 :version: 1.0 """ from datetime import datetime from sqlalchemy.exc import OperationalError from db import dbapp from crm.model import CrmSysteminfo BINDKEY = "appdb" session = dbapp.session def _updatesysteminfo(versionnr: str): """Aktualisiert Versionsnummer und Zeitstempel in der Systeminfo-Tabelle.""" s: CrmSysteminfo = CrmSysteminfo.query.get(1) s.version = versionnr s.lastupdate = datetime.now() def _db_V01_00(): """ Ersteinrichtung: Alle CRM-Tabellen anlegen und Systeminfo-Datensatz schreiben. """ dbapp.create_all(bind_key=BINDKEY) systeminfo = CrmSysteminfo() systeminfo.id = 1 systeminfo.version = "01.00" systeminfo.lastupdate = datetime.now() systeminfo.initialinstall = datetime.now() session.add(systeminfo) session.commit() def _db_V01_01(): """ Legt die Tabelle 'kontakte' an. Bei bestehenden Datenbanken, die mit Version 01.00 initialisiert wurden, fehlt diese Tabelle, da das Kontakt-Modell erst nachträglich ergänzt wurde. create_all erzeugt nur fehlende Tabellen, bestehende bleiben unangetastet. """ dbapp.create_all(bind_key=BINDKEY) _updatesysteminfo('01.01') session.commit() def _db_V01_02(): """ Legt die Tabelle 'projekte' an. Bei bestehenden Datenbanken, die mit Version 01.01 initialisiert wurden, fehlt diese Tabelle, da das Projekt-Modell erst nachträglich ergänzt wurde. create_all erzeugt nur fehlende Tabellen, bestehende bleiben unangetastet. """ dbapp.create_all(bind_key=BINDKEY) _updatesysteminfo('01.02') session.commit() def _db_V01_03(): """ Legt die Tabellen 'kontaktadressen' und 'call_logs' an. Bei bestehenden Datenbanken, die mit Version 01.02 initialisiert wurden, fehlen diese Tabellen, da die Modelle erst nachträglich ergänzt wurden. """ dbapp.create_all(bind_key=BINDKEY) _updatesysteminfo('01.03') session.commit() def _db_V01_04(): """ Fügt die Spalte 'position' zur Tabelle 'kontaktadressen' hinzu. Bei bestehenden Datenbanken, die mit Version 01.03 initialisiert wurden, fehlt diese Spalte, da das Feld erst nachträglich ergänzt wurde. """ from sqlalchemy import text session.execute(text("ALTER TABLE kontaktadressen ADD COLUMN position VARCHAR(200)")) _updatesysteminfo('01.04') session.commit() def checkupdates(): """ Ermittelt die aktuelle DB-Version aus der Systeminfo-Tabelle und führt alle _db_Vxx_xx-Funktionen aus, deren Versionsnummer größer ist. Ist die Datenbank noch leer (Tabelle fehlt), wird die Ersteinrichtung ausgeführt. """ curr_dbversion = '_db_V01_00' try: systeminfo: CrmSysteminfo = CrmSysteminfo.query.get(1) curr_dbversion = "_db_V" + systeminfo.version.replace(".", "_") except (OperationalError, AttributeError): _db_V01_00() versionen = sorted(filter(lambda f: f.startswith("_db_V"), globals())) for v in versionen: if v > curr_dbversion: globals()[v]() print('########## crm Database updated')