diff --git a/alembic/versions/665259cdfdc0_change_unique_constraint_to_partial_.py b/alembic/versions/665259cdfdc0_change_unique_constraint_to_partial_.py new file mode 100644 index 0000000..dbd9743 --- /dev/null +++ b/alembic/versions/665259cdfdc0_change_unique_constraint_to_partial_.py @@ -0,0 +1,47 @@ +"""change unique constraint to partial index for company person linking table + +Revision ID: 665259cdfdc0 +Revises: 03d4f000f445 +Create Date: 2026-07-22 10:14:43.889298 + +""" + +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "665259cdfdc0" +down_revision: Union[str, Sequence[str], None] = "03d4f000f445" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table("zuordnung_personen_unternehmen", schema=None) as batch_op: + batch_op.drop_constraint(batch_op.f("uq_un_id_pers_id"), type_="unique") + batch_op.create_index( + "uq_aktive_zuordnung", + ["un_id", "pers_id"], + unique=True, + sqlite_where=sa.text("gueltig_bis IS NULL"), + ) + + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table("zuordnung_personen_unternehmen", schema=None) as batch_op: + batch_op.drop_index( + "uq_aktive_zuordnung", sqlite_where=sa.text("gueltig_bis IS NULL") + ) + batch_op.create_unique_constraint( + batch_op.f("uq_un_id_pers_id"), ["un_id", "pers_id"] + ) + + # ### end Alembic commands ### diff --git a/src/wce_crm/db.py b/src/wce_crm/db.py index 16350dc..af0734e 100644 --- a/src/wce_crm/db.py +++ b/src/wce_crm/db.py @@ -6,8 +6,8 @@ import re from pathlib import Path import polars as pl -import sqlalchemy as sql -from sqlalchemy import Column, String, Table, TypeDecorator, UniqueConstraint, event +import sqlalchemy as sa +from sqlalchemy import Column, Index, String, Table, TypeDecorator, event, sql from wce_crm import constants from wce_crm import types as t @@ -37,7 +37,7 @@ class SafeDateTime(TypeDecorator): class UTCDateTime(TypeDecorator): """Safely coerces naive datetimes from SQLite into timezone-aware UTC.""" - impl = sql.DateTime + impl = sa.DateTime cache_ok = True def process_bind_param(self, value, dialect): @@ -58,9 +58,9 @@ class UTCDateTime(TypeDecorator): return value -MD_CRM = sql.MetaData() -MD_MAIN = sql.MetaData() -ENGINE = sql.create_engine(f"sqlite:///{constants.Config.DB_PATH_MAIN}") +MD_CRM = sa.MetaData() +MD_MAIN = sa.MetaData() +ENGINE = sa.create_engine(f"sqlite:///{constants.Config.DB_PATH_MAIN}") @event.listens_for(ENGINE, "connect") @@ -71,33 +71,33 @@ def attach_second_db(dbapi_connection, connection_record): cursor.close() -ext_crm_master: sql.Table = Table( +ext_crm_master: Table = Table( "Master", MD_CRM, - Column("ma_id", sql.Integer, nullable=False, unique=True), - Column("wce_id", sql.ForeignKey("Nutzer.wce_id")), - Column("ma_unternehmensname", sql.Text, nullable=True), - Column("ma_branche", sql.Text, nullable=True), - Column("ma_strasse", sql.Text, nullable=True), - Column("ma_hausnummer", sql.Text, nullable=True), - Column("ma_plz", sql.Text, nullable=True), - Column("ma_ort", sql.Text, nullable=True), - Column("ma_plz_postfach", sql.Text, nullable=True), - Column("ma_postfach", sql.Text, nullable=True), - Column("ma_website", sql.Text, nullable=True), - Column("ma_mail", sql.Text, nullable=True), - Column("ma_telefonnummer", sql.Text, nullable=True), - Column("ma_faxnummer", sql.Text, nullable=True), + Column("ma_id", sa.Integer, nullable=False, unique=True), + Column("wce_id", sa.ForeignKey("Nutzer.wce_id")), + Column("ma_unternehmensname", sa.Text, nullable=True), + Column("ma_branche", sa.Text, nullable=True), + Column("ma_strasse", sa.Text, nullable=True), + Column("ma_hausnummer", sa.Text, nullable=True), + Column("ma_plz", sa.Text, nullable=True), + Column("ma_ort", sa.Text, nullable=True), + Column("ma_plz_postfach", sa.Text, nullable=True), + Column("ma_postfach", sa.Text, nullable=True), + Column("ma_website", sa.Text, nullable=True), + Column("ma_mail", sa.Text, nullable=True), + Column("ma_telefonnummer", sa.Text, nullable=True), + Column("ma_faxnummer", sa.Text, nullable=True), Column("ma_ersteintrag_datum", SafeDateTime, nullable=True), Column("ma_aktualisierung_datum", SafeDateTime, nullable=True), - Column("ma_aktualisierung_nutzer", sql.Text, nullable=True), - Column("ma_sollprozess", sql.Text, nullable=True), - Column("ma_auslaendische_mitarbeiter", sql.Text, nullable=True), - Column("ma_quelle_information", sql.Text, nullable=True), - Column("ma_bemerkung", sql.Text, nullable=True), - Column("ma_kontakt", sql.Boolean, nullable=True), - Column("ma_schlagworte", sql.Text, nullable=True), - Column("ma_archiviert", sql.Boolean, nullable=True, default=False), + Column("ma_aktualisierung_nutzer", sa.Text, nullable=True), + Column("ma_sollprozess", sa.Text, nullable=True), + Column("ma_auslaendische_mitarbeiter", sa.Text, nullable=True), + Column("ma_quelle_information", sa.Text, nullable=True), + Column("ma_bemerkung", sa.Text, nullable=True), + Column("ma_kontakt", sa.Boolean, nullable=True), + Column("ma_schlagworte", sa.Text, nullable=True), + Column("ma_archiviert", sa.Boolean, nullable=True, default=False), ) @@ -141,26 +141,26 @@ def get_ext_crm_master( if not db_path.exists(): raise FileNotFoundError(f"Database not found under >{db_path}<") - engine = sql.create_engine(f"sqlite:///{db_path}") - stmt = sql.select(ext_crm_master) + engine = sa.create_engine(f"sqlite:///{db_path}") + stmt = sa.select(ext_crm_master) return pl.read_database(stmt, engine, schema_overrides=ext_crm_master_schema) DF_CRM_MASTER = get_ext_crm_master(constants.Config.DB_PATH_CRM) -ext_crm_nutzer: sql.Table = Table( +ext_crm_nutzer: Table = Table( "Nutzer", MD_CRM, - Column("wce_id", sql.Integer, nullable=False, unique=True), - Column("wce_name", sql.Text, nullable=True), - Column("wce_vorname", sql.Text, nullable=True), - Column("wce_kuerzel", sql.Text, nullable=True), - Column("wce_passwort", sql.Text, nullable=True), - Column("wce_angelegt_am", sql.DateTime, nullable=True), - Column("wce_rolle", sql.Text, nullable=True), - Column("wce_angelegt_von", sql.Text, nullable=True), - Column("wce_aktiv", sql.Boolean, nullable=True), - Column("wce_letzter_login", sql.DateTime, nullable=True), + Column("wce_id", sa.Integer, nullable=False, unique=True), + Column("wce_name", sa.Text, nullable=True), + Column("wce_vorname", sa.Text, nullable=True), + Column("wce_kuerzel", sa.Text, nullable=True), + Column("wce_passwort", sa.Text, nullable=True), + Column("wce_angelegt_am", sa.DateTime, nullable=True), + Column("wce_rolle", sa.Text, nullable=True), + Column("wce_angelegt_von", sa.Text, nullable=True), + Column("wce_aktiv", sa.Boolean, nullable=True), + Column("wce_letzter_login", sa.DateTime, nullable=True), ) ext_crm_nutzer_schema: t.PolarsSchema = { @@ -176,31 +176,31 @@ ext_crm_nutzer_schema: t.PolarsSchema = { "wce_letzter_login": pl.Datetime, } -ext_crm_contact_person: sql.Table = Table( +ext_crm_contact_person: Table = Table( "Ansprechpartner", MD_CRM, - Column("an_id", sql.Integer, nullable=False, unique=True), - Column("ma_id", sql.ForeignKey("Master.ma_id")), - Column("wce_id", sql.ForeignKey("Nutzer.wce_id")), - Column("st_id", sql.Integer, nullable=False), - Column("an_sachgebiet", sql.Text, nullable=True), - Column("an_anrede", sql.Text, nullable=True), - Column("an_titel", sql.Text, nullable=True), - Column("an_nachname", sql.Text, nullable=True), - Column("an_vorname", sql.Text, nullable=True), - Column("an_position", sql.Text, nullable=True), - Column("an_mail", sql.Text, nullable=True), - Column("an_festnetz", sql.Text, nullable=True), - Column("an_mobil", sql.Text, nullable=True), - Column("an_faxnummer", sql.Text, nullable=True), - Column("an_hauptansprechpartner", sql.Text, nullable=True), - Column("an_anrede_anschrift", sql.Text, nullable=True), - Column("an_bemerkung", sql.Text, nullable=True), + Column("an_id", sa.Integer, nullable=False, unique=True), + Column("ma_id", sa.ForeignKey("Master.ma_id")), + Column("wce_id", sa.ForeignKey("Nutzer.wce_id")), + Column("st_id", sa.Integer, nullable=False), + Column("an_sachgebiet", sa.Text, nullable=True), + Column("an_anrede", sa.Text, nullable=True), + Column("an_titel", sa.Text, nullable=True), + Column("an_nachname", sa.Text, nullable=True), + Column("an_vorname", sa.Text, nullable=True), + Column("an_position", sa.Text, nullable=True), + Column("an_mail", sa.Text, nullable=True), + Column("an_festnetz", sa.Text, nullable=True), + Column("an_mobil", sa.Text, nullable=True), + Column("an_faxnummer", sa.Text, nullable=True), + Column("an_hauptansprechpartner", sa.Text, nullable=True), + Column("an_anrede_anschrift", sa.Text, nullable=True), + Column("an_bemerkung", sa.Text, nullable=True), Column("an_aktualisierung_datum", SafeDateTime, nullable=True), - Column("an_aktualisierung_nutzer", sql.Text, nullable=True), + Column("an_aktualisierung_nutzer", sa.Text, nullable=True), Column("an_letztes_kontaktdatum", SafeDateTime, nullable=True), Column("an_ersteintrag_datum", SafeDateTime, nullable=True), - Column("an_archiviert", sql.Boolean, nullable=True, default=0), + Column("an_archiviert", sa.Boolean, nullable=True, default=0), ) @@ -242,8 +242,8 @@ def get_ext_crm_contact_person( if not db_path.exists(): raise FileNotFoundError(f"Database not found under >{db_path}<") - engine = sql.create_engine(f"sqlite:///{db_path}") - stmt = sql.select(ext_crm_contact_person) + engine = sa.create_engine(f"sqlite:///{db_path}") + stmt = sa.select(ext_crm_contact_person) df = pl.read_database(stmt, engine, schema_overrides=ext_crm_contact_person_schema) df = df.with_columns( pl.col(pl.String).str.replace_all(r"[\r\t\n]", " ").str.strip_chars(" ") @@ -255,43 +255,43 @@ def get_ext_crm_contact_person( # df_contact_person = get_ext_crm_contact_person(None) DF_CONTACT_PERSON = get_ext_crm_contact_person(constants.Config.DB_PATH_CRM) -ext_crm_master_attach: sql.Table = Table( +ext_crm_master_attach: Table = Table( "Master", MD_CRM, - Column("ma_id", sql.Integer, nullable=False, unique=True), - Column("wce_id", sql.ForeignKey("Nutzer.wce_id")), - Column("ma_unternehmensname", sql.Text, nullable=True), - Column("ma_branche", sql.Text, nullable=True), - Column("ma_strasse", sql.Text, nullable=True), - Column("ma_hausnummer", sql.Text, nullable=True), - Column("ma_plz", sql.Text, nullable=True), - Column("ma_ort", sql.Text, nullable=True), - Column("ma_plz_postfach", sql.Text, nullable=True), - Column("ma_postfach", sql.Text, nullable=True), - Column("ma_website", sql.Text, nullable=True), - Column("ma_mail", sql.Text, nullable=True), - Column("ma_telefonnummer", sql.Text, nullable=True), - Column("ma_faxnummer", sql.Text, nullable=True), + Column("ma_id", sa.Integer, nullable=False, unique=True), + Column("wce_id", sa.ForeignKey("Nutzer.wce_id")), + Column("ma_unternehmensname", sa.Text, nullable=True), + Column("ma_branche", sa.Text, nullable=True), + Column("ma_strasse", sa.Text, nullable=True), + Column("ma_hausnummer", sa.Text, nullable=True), + Column("ma_plz", sa.Text, nullable=True), + Column("ma_ort", sa.Text, nullable=True), + Column("ma_plz_postfach", sa.Text, nullable=True), + Column("ma_postfach", sa.Text, nullable=True), + Column("ma_website", sa.Text, nullable=True), + Column("ma_mail", sa.Text, nullable=True), + Column("ma_telefonnummer", sa.Text, nullable=True), + Column("ma_faxnummer", sa.Text, nullable=True), Column("ma_ersteintrag_datum", SafeDateTime, nullable=True), Column("ma_aktualisierung_datum", SafeDateTime, nullable=True), - Column("ma_aktualisierung_nutzer", sql.Text, nullable=True), - Column("ma_sollprozess", sql.Text, nullable=True), - Column("ma_auslaendische_mitarbeiter", sql.Text, nullable=True), - Column("ma_quelle_information", sql.Text, nullable=True), - Column("ma_bemerkung", sql.Text, nullable=True), - Column("ma_kontakt", sql.Boolean, nullable=True), - Column("ma_schlagworte", sql.Text, nullable=True), - Column("ma_archiviert", sql.Boolean, nullable=True, default=False), + Column("ma_aktualisierung_nutzer", sa.Text, nullable=True), + Column("ma_sollprozess", sa.Text, nullable=True), + Column("ma_auslaendische_mitarbeiter", sa.Text, nullable=True), + Column("ma_quelle_information", sa.Text, nullable=True), + Column("ma_bemerkung", sa.Text, nullable=True), + Column("ma_kontakt", sa.Boolean, nullable=True), + Column("ma_schlagworte", sa.Text, nullable=True), + Column("ma_archiviert", sa.Boolean, nullable=True, default=False), schema="kontaktliste", ) -grunderfassung_unternehmen: sql.Table = Table( +grunderfassung_unternehmen: Table = Table( "grunderfassung_unternehmen", MD_MAIN, Column( "un_id", - sql.Integer, + sa.Integer, primary_key=True, autoincrement=True, ), @@ -313,20 +313,20 @@ grunderfassung_unternehmen: sql.Table = Table( default=lambda: datetime.datetime.now(datetime.UTC), onupdate=lambda: datetime.datetime.now(datetime.UTC), ), - Column("Metadaten_nutzer", sql.String(20), nullable=True), - Column("Grunderfassung_fallnummer", sql.Text, nullable=True), - Column("Grunderfassung_notiz", sql.Text, nullable=True), - Column("Partnersuche__kanal_aufmerksamkeit", sql.Text, nullable=True, default=None), - Column("Partnersuche__person_suche", sql.Integer, nullable=True, default=None), - Column("Partnersuche__un_suche", sql.Integer, nullable=True, default=None), + Column("Metadaten_nutzer", sa.String(20), nullable=True), + Column("Grunderfassung_fallnummer", sa.Text, nullable=True), + Column("Grunderfassung_notiz", sa.Text, nullable=True), + Column("Partnersuche__kanal_aufmerksamkeit", sa.Text, nullable=True, default=None), + Column("Partnersuche__person_suche", sa.Integer, nullable=True, default=None), + Column("Partnersuche__un_suche", sa.Integer, nullable=True, default=None), ) -grunderfassung_personen: sql.Table = Table( +grunderfassung_personen: Table = Table( "grunderfassung_personen", MD_MAIN, Column( "pers_id", - sql.Integer, + sa.Integer, primary_key=True, autoincrement=True, ), @@ -348,67 +348,67 @@ grunderfassung_personen: sql.Table = Table( default=lambda: datetime.datetime.now(datetime.UTC), onupdate=lambda: datetime.datetime.now(datetime.UTC), ), - Column("Metadaten_nutzer", sql.String(20), nullable=True), - Column("Metadaten_wiedereintrittsdatum", sql.Date, nullable=True, default=None), - Column("Arbeitserfahrung", sql.Text, nullable=True), - Column("Grunderfassung_fallnummer", sql.Text, nullable=True), - Column("Grunderfassung_notiz", sql.Text, nullable=True), - Column("HoehereBildung", sql.Text, nullable=True), - Column("Kontaktperson__KP_adresse", sql.Text, nullable=True), - Column("Kontaktperson__KP_anrede_anschrift", sql.Text, nullable=True), - Column("Kontaktperson__KP_email", sql.Text, nullable=True), - Column("Kontaktperson__KP_festnetznummer", sql.Text, nullable=True), - Column("Kontaktperson__KP_funktion_beziehung", sql.Text, nullable=True), - Column("Kontaktperson__KP_mobilfunknummer", sql.Text, nullable=True), - Column("Kontaktperson__KP_name", sql.Text, nullable=True), + Column("Metadaten_nutzer", sa.String(20), nullable=True), + Column("Metadaten_wiedereintrittsdatum", sa.Date, nullable=True, default=None), + Column("Arbeitserfahrung", sa.Text, nullable=True), + Column("Grunderfassung_fallnummer", sa.Text, nullable=True), + Column("Grunderfassung_notiz", sa.Text, nullable=True), + Column("HoehereBildung", sa.Text, nullable=True), + Column("Kontaktperson__KP_adresse", sa.Text, nullable=True), + Column("Kontaktperson__KP_anrede_anschrift", sa.Text, nullable=True), + Column("Kontaktperson__KP_email", sa.Text, nullable=True), + Column("Kontaktperson__KP_festnetznummer", sa.Text, nullable=True), + Column("Kontaktperson__KP_funktion_beziehung", sa.Text, nullable=True), + Column("Kontaktperson__KP_mobilfunknummer", sa.Text, nullable=True), + Column("Kontaktperson__KP_name", sa.Text, nullable=True), Column( - "Kontaktperson__KP_name_partner", sql.Text, nullable=True + "Kontaktperson__KP_name_partner", sa.Text, nullable=True ), # TODO: check if needed when set by trigger - Column("Kontaktperson__KP_titel", sql.Text, nullable=True), - Column("Kontaktperson__KP_vorname", sql.Text, nullable=True), - Column("Projektrelevanz__relevanz", sql.Text, nullable=True), - Column("Projektrelevanz__foerderperiode", sql.Text, nullable=True), - Column("Schulbildung", sql.Text, nullable=True), - Column("Sprachkenntnisse", sql.Text, nullable=True), - Column("Stammdaten__PLZ", sql.Text, nullable=True), - Column("Stammdaten__anrede_anschrift", sql.Text, nullable=True), - Column("Stammdaten__anzahl_kinder__alter", sql.Text, nullable=True), - Column("Stammdaten__anzahl_kinder__anzahl", sql.Integer, nullable=True), - Column("Stammdaten__aufenthaltsort", sql.Text, nullable=True), - Column("Stammdaten__bundesland", sql.Text, nullable=True), - Column("Stammdaten__land", sql.Text, nullable=True), - Column("Stammdaten__email", sql.Text, nullable=True), - Column("Stammdaten__familienstand", sql.Text, nullable=True), - Column("Stammdaten__festnetznummer", sql.Text, nullable=True), - Column("Stammdaten__geburtsdatum", sql.Date, nullable=True), - Column("Stammdaten__hausnummer", sql.Text, nullable=True), - Column("Stammdaten__herkunftsland", sql.Text, nullable=True), - Column("Stammdaten__mobilfunknummer", sql.Text, nullable=True), - Column("Stammdaten__name", sql.Text, nullable=True), - Column("Stammdaten__ort", sql.Text, nullable=True), - Column("Stammdaten__rueckkehrer", sql.Boolean, nullable=True), - Column("Stammdaten__staatsangehoerigkeit", sql.Text, nullable=True), - Column("Stammdaten__strasse", sql.Text, nullable=True), - Column("Stammdaten__titel", sql.Text, nullable=True), - Column("Stammdaten__vorname", sql.Text, nullable=True), - Column("WeitereInfos__WI_arbeitsstatus", sql.Text, nullable=True), - Column("WeitereInfos__WI_aufenthaltstitel", sql.Text, nullable=True), - Column("WeitereInfos__WI_deutsch_sprache", sql.Text, nullable=True), - Column("WeitereInfos__WI_gueltigkeit_aufenthaltstitel", sql.Date, nullable=True), - Column("WeitereInfos__WI_meldung_institution", sql.Text, nullable=True), + Column("Kontaktperson__KP_titel", sa.Text, nullable=True), + Column("Kontaktperson__KP_vorname", sa.Text, nullable=True), + Column("Projektrelevanz__relevanz", sa.Text, nullable=True), + Column("Projektrelevanz__foerderperiode", sa.Text, nullable=True), + Column("Schulbildung", sa.Text, nullable=True), + Column("Sprachkenntnisse", sa.Text, nullable=True), + Column("Stammdaten__PLZ", sa.Text, nullable=True), + Column("Stammdaten__anrede_anschrift", sa.Text, nullable=True), + Column("Stammdaten__anzahl_kinder__alter", sa.Text, nullable=True), + Column("Stammdaten__anzahl_kinder__anzahl", sa.Integer, nullable=True), + Column("Stammdaten__aufenthaltsort", sa.Text, nullable=True), + Column("Stammdaten__bundesland", sa.Text, nullable=True), + Column("Stammdaten__land", sa.Text, nullable=True), + Column("Stammdaten__email", sa.Text, nullable=True), + Column("Stammdaten__familienstand", sa.Text, nullable=True), + Column("Stammdaten__festnetznummer", sa.Text, nullable=True), + Column("Stammdaten__geburtsdatum", sa.Date, nullable=True), + Column("Stammdaten__hausnummer", sa.Text, nullable=True), + Column("Stammdaten__herkunftsland", sa.Text, nullable=True), + Column("Stammdaten__mobilfunknummer", sa.Text, nullable=True), + Column("Stammdaten__name", sa.Text, nullable=True), + Column("Stammdaten__ort", sa.Text, nullable=True), + Column("Stammdaten__rueckkehrer", sa.Boolean, nullable=True), + Column("Stammdaten__staatsangehoerigkeit", sa.Text, nullable=True), + Column("Stammdaten__strasse", sa.Text, nullable=True), + Column("Stammdaten__titel", sa.Text, nullable=True), + Column("Stammdaten__vorname", sa.Text, nullable=True), + Column("WeitereInfos__WI_arbeitsstatus", sa.Text, nullable=True), + Column("WeitereInfos__WI_aufenthaltstitel", sa.Text, nullable=True), + Column("WeitereInfos__WI_deutsch_sprache", sa.Text, nullable=True), + Column("WeitereInfos__WI_gueltigkeit_aufenthaltstitel", sa.Date, nullable=True), + Column("WeitereInfos__WI_meldung_institution", sa.Text, nullable=True), ) -zuordnung_personen_unternehmen: sql.Table = Table( +zuordnung_personen_unternehmen: Table = Table( "zuordnung_personen_unternehmen", MD_MAIN, Column( "id", - sql.Integer, + sa.Integer, primary_key=True, autoincrement=True, ), - Column("un_id", sql.ForeignKey("grunderfassung_unternehmen.un_id"), nullable=False), - Column("pers_id", sql.ForeignKey("grunderfassung_personen.pers_id"), nullable=False), + Column("un_id", sa.ForeignKey("grunderfassung_unternehmen.un_id"), nullable=False), + Column("pers_id", sa.ForeignKey("grunderfassung_personen.pers_id"), nullable=False), Column( "gueltig_ab", UTCDateTime, @@ -420,23 +420,29 @@ zuordnung_personen_unternehmen: sql.Table = Table( UTCDateTime, nullable=True, ), - UniqueConstraint("un_id", "pers_id", name="uq_un_id_pers_id"), + Index( + "uq_aktive_zuordnung", + "un_id", + "pers_id", + unique=True, + sqlite_where=sql.text("gueltig_bis IS NULL"), + ), ) -beratung_vorgang: sql.Table = Table( +beratung_vorgang: Table = Table( "beratung_vorgang", MD_MAIN, Column( "vorgang_id", - sql.Integer, + sa.Integer, primary_key=True, autoincrement=True, ), - Column("un_id", sql.ForeignKey("grunderfassung_unternehmen.un_id"), nullable=True), - Column("pers_id", sql.ForeignKey("grunderfassung_personen.pers_id"), nullable=True), - Column("titel", sql.Text, nullable=False), - Column("beratungs_typ", sql.String(20), nullable=False), + Column("un_id", sa.ForeignKey("grunderfassung_unternehmen.un_id"), nullable=True), + Column("pers_id", sa.ForeignKey("grunderfassung_personen.pers_id"), nullable=True), + Column("titel", sa.Text, nullable=False), + Column("beratungs_typ", sa.String(20), nullable=False), Column( "erstellt", UTCDateTime, @@ -458,29 +464,29 @@ beratung_vorgang: sql.Table = Table( ) -beratung_einzelberatung: sql.Table = Table( +beratung_einzelberatung: Table = Table( "beratung_einzelberatung", MD_MAIN, Column( "beratung_id", - sql.Integer, + sa.Integer, primary_key=True, autoincrement=True, ), - Column("vorgang_id", sql.ForeignKey("beratung_vorgang.vorgang_id"), nullable=False), - Column("nutzer_id", sql.Integer, nullable=False), - Column("nutzer_name", sql.String(20), nullable=False), + Column("vorgang_id", sa.ForeignKey("beratung_vorgang.vorgang_id"), nullable=False), + Column("nutzer_id", sa.Integer, nullable=False), + Column("nutzer_name", sa.String(20), nullable=False), Column( "zeitstempel", UTCDateTime, nullable=False, default=lambda: datetime.datetime.now(datetime.UTC), ), - Column("ansprechpartner", sql.Text, nullable=False), - Column("kommunikationsweg", sql.Text, nullable=False), - Column("thema_crm_matrix", sql.Text, nullable=True), - Column("anmerkungen", sql.Text, nullable=True), - Column("rueckmeldung", sql.Text, nullable=True), + Column("ansprechpartner", sa.Text, nullable=False), + Column("kommunikationsweg", sa.Text, nullable=False), + Column("thema_crm_matrix", sa.Text, nullable=True), + Column("anmerkungen", sa.Text, nullable=True), + Column("rueckmeldung", sa.Text, nullable=True), Column( "erstellt", UTCDateTime,