""" 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 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')