change database schema for linking table from unique constraint to partial index

This commit is contained in:
2026-07-22 10:17:00 +02:00
parent 65e3e10e13
commit 9a73f27518
2 changed files with 217 additions and 164 deletions
@@ -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 ###
+170 -164
View File
@@ -6,8 +6,8 @@ import re
from pathlib import Path from pathlib import Path
import polars as pl import polars as pl
import sqlalchemy as sql import sqlalchemy as sa
from sqlalchemy import Column, String, Table, TypeDecorator, UniqueConstraint, event from sqlalchemy import Column, Index, String, Table, TypeDecorator, event, sql
from wce_crm import constants from wce_crm import constants
from wce_crm import types as t from wce_crm import types as t
@@ -37,7 +37,7 @@ class SafeDateTime(TypeDecorator):
class UTCDateTime(TypeDecorator): class UTCDateTime(TypeDecorator):
"""Safely coerces naive datetimes from SQLite into timezone-aware UTC.""" """Safely coerces naive datetimes from SQLite into timezone-aware UTC."""
impl = sql.DateTime impl = sa.DateTime
cache_ok = True cache_ok = True
def process_bind_param(self, value, dialect): def process_bind_param(self, value, dialect):
@@ -58,9 +58,9 @@ class UTCDateTime(TypeDecorator):
return value return value
MD_CRM = sql.MetaData() MD_CRM = sa.MetaData()
MD_MAIN = sql.MetaData() MD_MAIN = sa.MetaData()
ENGINE = sql.create_engine(f"sqlite:///{constants.Config.DB_PATH_MAIN}") ENGINE = sa.create_engine(f"sqlite:///{constants.Config.DB_PATH_MAIN}")
@event.listens_for(ENGINE, "connect") @event.listens_for(ENGINE, "connect")
@@ -71,33 +71,33 @@ def attach_second_db(dbapi_connection, connection_record):
cursor.close() cursor.close()
ext_crm_master: sql.Table = Table( ext_crm_master: Table = Table(
"Master", "Master",
MD_CRM, MD_CRM,
Column("ma_id", sql.Integer, nullable=False, unique=True), Column("ma_id", sa.Integer, nullable=False, unique=True),
Column("wce_id", sql.ForeignKey("Nutzer.wce_id")), Column("wce_id", sa.ForeignKey("Nutzer.wce_id")),
Column("ma_unternehmensname", sql.Text, nullable=True), Column("ma_unternehmensname", sa.Text, nullable=True),
Column("ma_branche", sql.Text, nullable=True), Column("ma_branche", sa.Text, nullable=True),
Column("ma_strasse", sql.Text, nullable=True), Column("ma_strasse", sa.Text, nullable=True),
Column("ma_hausnummer", sql.Text, nullable=True), Column("ma_hausnummer", sa.Text, nullable=True),
Column("ma_plz", sql.Text, nullable=True), Column("ma_plz", sa.Text, nullable=True),
Column("ma_ort", sql.Text, nullable=True), Column("ma_ort", sa.Text, nullable=True),
Column("ma_plz_postfach", sql.Text, nullable=True), Column("ma_plz_postfach", sa.Text, nullable=True),
Column("ma_postfach", sql.Text, nullable=True), Column("ma_postfach", sa.Text, nullable=True),
Column("ma_website", sql.Text, nullable=True), Column("ma_website", sa.Text, nullable=True),
Column("ma_mail", sql.Text, nullable=True), Column("ma_mail", sa.Text, nullable=True),
Column("ma_telefonnummer", sql.Text, nullable=True), Column("ma_telefonnummer", sa.Text, nullable=True),
Column("ma_faxnummer", sql.Text, nullable=True), Column("ma_faxnummer", sa.Text, nullable=True),
Column("ma_ersteintrag_datum", SafeDateTime, nullable=True), Column("ma_ersteintrag_datum", SafeDateTime, nullable=True),
Column("ma_aktualisierung_datum", SafeDateTime, nullable=True), Column("ma_aktualisierung_datum", SafeDateTime, nullable=True),
Column("ma_aktualisierung_nutzer", sql.Text, nullable=True), Column("ma_aktualisierung_nutzer", sa.Text, nullable=True),
Column("ma_sollprozess", sql.Text, nullable=True), Column("ma_sollprozess", sa.Text, nullable=True),
Column("ma_auslaendische_mitarbeiter", sql.Text, nullable=True), Column("ma_auslaendische_mitarbeiter", sa.Text, nullable=True),
Column("ma_quelle_information", sql.Text, nullable=True), Column("ma_quelle_information", sa.Text, nullable=True),
Column("ma_bemerkung", sql.Text, nullable=True), Column("ma_bemerkung", sa.Text, nullable=True),
Column("ma_kontakt", sql.Boolean, nullable=True), Column("ma_kontakt", sa.Boolean, nullable=True),
Column("ma_schlagworte", sql.Text, nullable=True), Column("ma_schlagworte", sa.Text, nullable=True),
Column("ma_archiviert", sql.Boolean, nullable=True, default=False), Column("ma_archiviert", sa.Boolean, nullable=True, default=False),
) )
@@ -141,26 +141,26 @@ def get_ext_crm_master(
if not db_path.exists(): if not db_path.exists():
raise FileNotFoundError(f"Database not found under >{db_path}<") raise FileNotFoundError(f"Database not found under >{db_path}<")
engine = sql.create_engine(f"sqlite:///{db_path}") engine = sa.create_engine(f"sqlite:///{db_path}")
stmt = sql.select(ext_crm_master) stmt = sa.select(ext_crm_master)
return pl.read_database(stmt, engine, schema_overrides=ext_crm_master_schema) return pl.read_database(stmt, engine, schema_overrides=ext_crm_master_schema)
DF_CRM_MASTER = get_ext_crm_master(constants.Config.DB_PATH_CRM) DF_CRM_MASTER = get_ext_crm_master(constants.Config.DB_PATH_CRM)
ext_crm_nutzer: sql.Table = Table( ext_crm_nutzer: Table = Table(
"Nutzer", "Nutzer",
MD_CRM, MD_CRM,
Column("wce_id", sql.Integer, nullable=False, unique=True), Column("wce_id", sa.Integer, nullable=False, unique=True),
Column("wce_name", sql.Text, nullable=True), Column("wce_name", sa.Text, nullable=True),
Column("wce_vorname", sql.Text, nullable=True), Column("wce_vorname", sa.Text, nullable=True),
Column("wce_kuerzel", sql.Text, nullable=True), Column("wce_kuerzel", sa.Text, nullable=True),
Column("wce_passwort", sql.Text, nullable=True), Column("wce_passwort", sa.Text, nullable=True),
Column("wce_angelegt_am", sql.DateTime, nullable=True), Column("wce_angelegt_am", sa.DateTime, nullable=True),
Column("wce_rolle", sql.Text, nullable=True), Column("wce_rolle", sa.Text, nullable=True),
Column("wce_angelegt_von", sql.Text, nullable=True), Column("wce_angelegt_von", sa.Text, nullable=True),
Column("wce_aktiv", sql.Boolean, nullable=True), Column("wce_aktiv", sa.Boolean, nullable=True),
Column("wce_letzter_login", sql.DateTime, nullable=True), Column("wce_letzter_login", sa.DateTime, nullable=True),
) )
ext_crm_nutzer_schema: t.PolarsSchema = { ext_crm_nutzer_schema: t.PolarsSchema = {
@@ -176,31 +176,31 @@ ext_crm_nutzer_schema: t.PolarsSchema = {
"wce_letzter_login": pl.Datetime, "wce_letzter_login": pl.Datetime,
} }
ext_crm_contact_person: sql.Table = Table( ext_crm_contact_person: Table = Table(
"Ansprechpartner", "Ansprechpartner",
MD_CRM, MD_CRM,
Column("an_id", sql.Integer, nullable=False, unique=True), Column("an_id", sa.Integer, nullable=False, unique=True),
Column("ma_id", sql.ForeignKey("Master.ma_id")), Column("ma_id", sa.ForeignKey("Master.ma_id")),
Column("wce_id", sql.ForeignKey("Nutzer.wce_id")), Column("wce_id", sa.ForeignKey("Nutzer.wce_id")),
Column("st_id", sql.Integer, nullable=False), Column("st_id", sa.Integer, nullable=False),
Column("an_sachgebiet", sql.Text, nullable=True), Column("an_sachgebiet", sa.Text, nullable=True),
Column("an_anrede", sql.Text, nullable=True), Column("an_anrede", sa.Text, nullable=True),
Column("an_titel", sql.Text, nullable=True), Column("an_titel", sa.Text, nullable=True),
Column("an_nachname", sql.Text, nullable=True), Column("an_nachname", sa.Text, nullable=True),
Column("an_vorname", sql.Text, nullable=True), Column("an_vorname", sa.Text, nullable=True),
Column("an_position", sql.Text, nullable=True), Column("an_position", sa.Text, nullable=True),
Column("an_mail", sql.Text, nullable=True), Column("an_mail", sa.Text, nullable=True),
Column("an_festnetz", sql.Text, nullable=True), Column("an_festnetz", sa.Text, nullable=True),
Column("an_mobil", sql.Text, nullable=True), Column("an_mobil", sa.Text, nullable=True),
Column("an_faxnummer", sql.Text, nullable=True), Column("an_faxnummer", sa.Text, nullable=True),
Column("an_hauptansprechpartner", sql.Text, nullable=True), Column("an_hauptansprechpartner", sa.Text, nullable=True),
Column("an_anrede_anschrift", sql.Text, nullable=True), Column("an_anrede_anschrift", sa.Text, nullable=True),
Column("an_bemerkung", sql.Text, nullable=True), Column("an_bemerkung", sa.Text, nullable=True),
Column("an_aktualisierung_datum", SafeDateTime, 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_letztes_kontaktdatum", SafeDateTime, nullable=True),
Column("an_ersteintrag_datum", 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(): if not db_path.exists():
raise FileNotFoundError(f"Database not found under >{db_path}<") raise FileNotFoundError(f"Database not found under >{db_path}<")
engine = sql.create_engine(f"sqlite:///{db_path}") engine = sa.create_engine(f"sqlite:///{db_path}")
stmt = sql.select(ext_crm_contact_person) stmt = sa.select(ext_crm_contact_person)
df = pl.read_database(stmt, engine, schema_overrides=ext_crm_contact_person_schema) df = pl.read_database(stmt, engine, schema_overrides=ext_crm_contact_person_schema)
df = df.with_columns( df = df.with_columns(
pl.col(pl.String).str.replace_all(r"[\r\t\n]", " ").str.strip_chars(" ") 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(None)
DF_CONTACT_PERSON = get_ext_crm_contact_person(constants.Config.DB_PATH_CRM) 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", "Master",
MD_CRM, MD_CRM,
Column("ma_id", sql.Integer, nullable=False, unique=True), Column("ma_id", sa.Integer, nullable=False, unique=True),
Column("wce_id", sql.ForeignKey("Nutzer.wce_id")), Column("wce_id", sa.ForeignKey("Nutzer.wce_id")),
Column("ma_unternehmensname", sql.Text, nullable=True), Column("ma_unternehmensname", sa.Text, nullable=True),
Column("ma_branche", sql.Text, nullable=True), Column("ma_branche", sa.Text, nullable=True),
Column("ma_strasse", sql.Text, nullable=True), Column("ma_strasse", sa.Text, nullable=True),
Column("ma_hausnummer", sql.Text, nullable=True), Column("ma_hausnummer", sa.Text, nullable=True),
Column("ma_plz", sql.Text, nullable=True), Column("ma_plz", sa.Text, nullable=True),
Column("ma_ort", sql.Text, nullable=True), Column("ma_ort", sa.Text, nullable=True),
Column("ma_plz_postfach", sql.Text, nullable=True), Column("ma_plz_postfach", sa.Text, nullable=True),
Column("ma_postfach", sql.Text, nullable=True), Column("ma_postfach", sa.Text, nullable=True),
Column("ma_website", sql.Text, nullable=True), Column("ma_website", sa.Text, nullable=True),
Column("ma_mail", sql.Text, nullable=True), Column("ma_mail", sa.Text, nullable=True),
Column("ma_telefonnummer", sql.Text, nullable=True), Column("ma_telefonnummer", sa.Text, nullable=True),
Column("ma_faxnummer", sql.Text, nullable=True), Column("ma_faxnummer", sa.Text, nullable=True),
Column("ma_ersteintrag_datum", SafeDateTime, nullable=True), Column("ma_ersteintrag_datum", SafeDateTime, nullable=True),
Column("ma_aktualisierung_datum", SafeDateTime, nullable=True), Column("ma_aktualisierung_datum", SafeDateTime, nullable=True),
Column("ma_aktualisierung_nutzer", sql.Text, nullable=True), Column("ma_aktualisierung_nutzer", sa.Text, nullable=True),
Column("ma_sollprozess", sql.Text, nullable=True), Column("ma_sollprozess", sa.Text, nullable=True),
Column("ma_auslaendische_mitarbeiter", sql.Text, nullable=True), Column("ma_auslaendische_mitarbeiter", sa.Text, nullable=True),
Column("ma_quelle_information", sql.Text, nullable=True), Column("ma_quelle_information", sa.Text, nullable=True),
Column("ma_bemerkung", sql.Text, nullable=True), Column("ma_bemerkung", sa.Text, nullable=True),
Column("ma_kontakt", sql.Boolean, nullable=True), Column("ma_kontakt", sa.Boolean, nullable=True),
Column("ma_schlagworte", sql.Text, nullable=True), Column("ma_schlagworte", sa.Text, nullable=True),
Column("ma_archiviert", sql.Boolean, nullable=True, default=False), Column("ma_archiviert", sa.Boolean, nullable=True, default=False),
schema="kontaktliste", schema="kontaktliste",
) )
grunderfassung_unternehmen: sql.Table = Table( grunderfassung_unternehmen: Table = Table(
"grunderfassung_unternehmen", "grunderfassung_unternehmen",
MD_MAIN, MD_MAIN,
Column( Column(
"un_id", "un_id",
sql.Integer, sa.Integer,
primary_key=True, primary_key=True,
autoincrement=True, autoincrement=True,
), ),
@@ -313,20 +313,20 @@ grunderfassung_unternehmen: sql.Table = Table(
default=lambda: datetime.datetime.now(datetime.UTC), default=lambda: datetime.datetime.now(datetime.UTC),
onupdate=lambda: datetime.datetime.now(datetime.UTC), onupdate=lambda: datetime.datetime.now(datetime.UTC),
), ),
Column("Metadaten_nutzer", sql.String(20), nullable=True), Column("Metadaten_nutzer", sa.String(20), nullable=True),
Column("Grunderfassung_fallnummer", sql.Text, nullable=True), Column("Grunderfassung_fallnummer", sa.Text, nullable=True),
Column("Grunderfassung_notiz", sql.Text, nullable=True), Column("Grunderfassung_notiz", sa.Text, nullable=True),
Column("Partnersuche__kanal_aufmerksamkeit", sql.Text, nullable=True, default=None), Column("Partnersuche__kanal_aufmerksamkeit", sa.Text, nullable=True, default=None),
Column("Partnersuche__person_suche", sql.Integer, nullable=True, default=None), Column("Partnersuche__person_suche", sa.Integer, nullable=True, default=None),
Column("Partnersuche__un_suche", sql.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", "grunderfassung_personen",
MD_MAIN, MD_MAIN,
Column( Column(
"pers_id", "pers_id",
sql.Integer, sa.Integer,
primary_key=True, primary_key=True,
autoincrement=True, autoincrement=True,
), ),
@@ -348,67 +348,67 @@ grunderfassung_personen: sql.Table = Table(
default=lambda: datetime.datetime.now(datetime.UTC), default=lambda: datetime.datetime.now(datetime.UTC),
onupdate=lambda: datetime.datetime.now(datetime.UTC), onupdate=lambda: datetime.datetime.now(datetime.UTC),
), ),
Column("Metadaten_nutzer", sql.String(20), nullable=True), Column("Metadaten_nutzer", sa.String(20), nullable=True),
Column("Metadaten_wiedereintrittsdatum", sql.Date, nullable=True, default=None), Column("Metadaten_wiedereintrittsdatum", sa.Date, nullable=True, default=None),
Column("Arbeitserfahrung", sql.Text, nullable=True), Column("Arbeitserfahrung", sa.Text, nullable=True),
Column("Grunderfassung_fallnummer", sql.Text, nullable=True), Column("Grunderfassung_fallnummer", sa.Text, nullable=True),
Column("Grunderfassung_notiz", sql.Text, nullable=True), Column("Grunderfassung_notiz", sa.Text, nullable=True),
Column("HoehereBildung", sql.Text, nullable=True), Column("HoehereBildung", sa.Text, nullable=True),
Column("Kontaktperson__KP_adresse", sql.Text, nullable=True), Column("Kontaktperson__KP_adresse", sa.Text, nullable=True),
Column("Kontaktperson__KP_anrede_anschrift", sql.Text, nullable=True), Column("Kontaktperson__KP_anrede_anschrift", sa.Text, nullable=True),
Column("Kontaktperson__KP_email", sql.Text, nullable=True), Column("Kontaktperson__KP_email", sa.Text, nullable=True),
Column("Kontaktperson__KP_festnetznummer", sql.Text, nullable=True), Column("Kontaktperson__KP_festnetznummer", sa.Text, nullable=True),
Column("Kontaktperson__KP_funktion_beziehung", sql.Text, nullable=True), Column("Kontaktperson__KP_funktion_beziehung", sa.Text, nullable=True),
Column("Kontaktperson__KP_mobilfunknummer", sql.Text, nullable=True), Column("Kontaktperson__KP_mobilfunknummer", sa.Text, nullable=True),
Column("Kontaktperson__KP_name", sql.Text, nullable=True), Column("Kontaktperson__KP_name", sa.Text, nullable=True),
Column( 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 ), # TODO: check if needed when set by trigger
Column("Kontaktperson__KP_titel", sql.Text, nullable=True), Column("Kontaktperson__KP_titel", sa.Text, nullable=True),
Column("Kontaktperson__KP_vorname", sql.Text, nullable=True), Column("Kontaktperson__KP_vorname", sa.Text, nullable=True),
Column("Projektrelevanz__relevanz", sql.Text, nullable=True), Column("Projektrelevanz__relevanz", sa.Text, nullable=True),
Column("Projektrelevanz__foerderperiode", sql.Text, nullable=True), Column("Projektrelevanz__foerderperiode", sa.Text, nullable=True),
Column("Schulbildung", sql.Text, nullable=True), Column("Schulbildung", sa.Text, nullable=True),
Column("Sprachkenntnisse", sql.Text, nullable=True), Column("Sprachkenntnisse", sa.Text, nullable=True),
Column("Stammdaten__PLZ", sql.Text, nullable=True), Column("Stammdaten__PLZ", sa.Text, nullable=True),
Column("Stammdaten__anrede_anschrift", sql.Text, nullable=True), Column("Stammdaten__anrede_anschrift", sa.Text, nullable=True),
Column("Stammdaten__anzahl_kinder__alter", sql.Text, nullable=True), Column("Stammdaten__anzahl_kinder__alter", sa.Text, nullable=True),
Column("Stammdaten__anzahl_kinder__anzahl", sql.Integer, nullable=True), Column("Stammdaten__anzahl_kinder__anzahl", sa.Integer, nullable=True),
Column("Stammdaten__aufenthaltsort", sql.Text, nullable=True), Column("Stammdaten__aufenthaltsort", sa.Text, nullable=True),
Column("Stammdaten__bundesland", sql.Text, nullable=True), Column("Stammdaten__bundesland", sa.Text, nullable=True),
Column("Stammdaten__land", sql.Text, nullable=True), Column("Stammdaten__land", sa.Text, nullable=True),
Column("Stammdaten__email", sql.Text, nullable=True), Column("Stammdaten__email", sa.Text, nullable=True),
Column("Stammdaten__familienstand", sql.Text, nullable=True), Column("Stammdaten__familienstand", sa.Text, nullable=True),
Column("Stammdaten__festnetznummer", sql.Text, nullable=True), Column("Stammdaten__festnetznummer", sa.Text, nullable=True),
Column("Stammdaten__geburtsdatum", sql.Date, nullable=True), Column("Stammdaten__geburtsdatum", sa.Date, nullable=True),
Column("Stammdaten__hausnummer", sql.Text, nullable=True), Column("Stammdaten__hausnummer", sa.Text, nullable=True),
Column("Stammdaten__herkunftsland", sql.Text, nullable=True), Column("Stammdaten__herkunftsland", sa.Text, nullable=True),
Column("Stammdaten__mobilfunknummer", sql.Text, nullable=True), Column("Stammdaten__mobilfunknummer", sa.Text, nullable=True),
Column("Stammdaten__name", sql.Text, nullable=True), Column("Stammdaten__name", sa.Text, nullable=True),
Column("Stammdaten__ort", sql.Text, nullable=True), Column("Stammdaten__ort", sa.Text, nullable=True),
Column("Stammdaten__rueckkehrer", sql.Boolean, nullable=True), Column("Stammdaten__rueckkehrer", sa.Boolean, nullable=True),
Column("Stammdaten__staatsangehoerigkeit", sql.Text, nullable=True), Column("Stammdaten__staatsangehoerigkeit", sa.Text, nullable=True),
Column("Stammdaten__strasse", sql.Text, nullable=True), Column("Stammdaten__strasse", sa.Text, nullable=True),
Column("Stammdaten__titel", sql.Text, nullable=True), Column("Stammdaten__titel", sa.Text, nullable=True),
Column("Stammdaten__vorname", sql.Text, nullable=True), Column("Stammdaten__vorname", sa.Text, nullable=True),
Column("WeitereInfos__WI_arbeitsstatus", sql.Text, nullable=True), Column("WeitereInfos__WI_arbeitsstatus", sa.Text, nullable=True),
Column("WeitereInfos__WI_aufenthaltstitel", sql.Text, nullable=True), Column("WeitereInfos__WI_aufenthaltstitel", sa.Text, nullable=True),
Column("WeitereInfos__WI_deutsch_sprache", sql.Text, nullable=True), Column("WeitereInfos__WI_deutsch_sprache", sa.Text, nullable=True),
Column("WeitereInfos__WI_gueltigkeit_aufenthaltstitel", sql.Date, nullable=True), Column("WeitereInfos__WI_gueltigkeit_aufenthaltstitel", sa.Date, nullable=True),
Column("WeitereInfos__WI_meldung_institution", sql.Text, 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", "zuordnung_personen_unternehmen",
MD_MAIN, MD_MAIN,
Column( Column(
"id", "id",
sql.Integer, sa.Integer,
primary_key=True, primary_key=True,
autoincrement=True, autoincrement=True,
), ),
Column("un_id", sql.ForeignKey("grunderfassung_unternehmen.un_id"), nullable=False), Column("un_id", sa.ForeignKey("grunderfassung_unternehmen.un_id"), nullable=False),
Column("pers_id", sql.ForeignKey("grunderfassung_personen.pers_id"), nullable=False), Column("pers_id", sa.ForeignKey("grunderfassung_personen.pers_id"), nullable=False),
Column( Column(
"gueltig_ab", "gueltig_ab",
UTCDateTime, UTCDateTime,
@@ -420,23 +420,29 @@ zuordnung_personen_unternehmen: sql.Table = Table(
UTCDateTime, UTCDateTime,
nullable=True, 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", "beratung_vorgang",
MD_MAIN, MD_MAIN,
Column( Column(
"vorgang_id", "vorgang_id",
sql.Integer, sa.Integer,
primary_key=True, primary_key=True,
autoincrement=True, autoincrement=True,
), ),
Column("un_id", sql.ForeignKey("grunderfassung_unternehmen.un_id"), nullable=True), Column("un_id", sa.ForeignKey("grunderfassung_unternehmen.un_id"), nullable=True),
Column("pers_id", sql.ForeignKey("grunderfassung_personen.pers_id"), nullable=True), Column("pers_id", sa.ForeignKey("grunderfassung_personen.pers_id"), nullable=True),
Column("titel", sql.Text, nullable=False), Column("titel", sa.Text, nullable=False),
Column("beratungs_typ", sql.String(20), nullable=False), Column("beratungs_typ", sa.String(20), nullable=False),
Column( Column(
"erstellt", "erstellt",
UTCDateTime, UTCDateTime,
@@ -458,29 +464,29 @@ beratung_vorgang: sql.Table = Table(
) )
beratung_einzelberatung: sql.Table = Table( beratung_einzelberatung: Table = Table(
"beratung_einzelberatung", "beratung_einzelberatung",
MD_MAIN, MD_MAIN,
Column( Column(
"beratung_id", "beratung_id",
sql.Integer, sa.Integer,
primary_key=True, primary_key=True,
autoincrement=True, autoincrement=True,
), ),
Column("vorgang_id", sql.ForeignKey("beratung_vorgang.vorgang_id"), nullable=False), Column("vorgang_id", sa.ForeignKey("beratung_vorgang.vorgang_id"), nullable=False),
Column("nutzer_id", sql.Integer, nullable=False), Column("nutzer_id", sa.Integer, nullable=False),
Column("nutzer_name", sql.String(20), nullable=False), Column("nutzer_name", sa.String(20), nullable=False),
Column( Column(
"zeitstempel", "zeitstempel",
UTCDateTime, UTCDateTime,
nullable=False, nullable=False,
default=lambda: datetime.datetime.now(datetime.UTC), default=lambda: datetime.datetime.now(datetime.UTC),
), ),
Column("ansprechpartner", sql.Text, nullable=False), Column("ansprechpartner", sa.Text, nullable=False),
Column("kommunikationsweg", sql.Text, nullable=False), Column("kommunikationsweg", sa.Text, nullable=False),
Column("thema_crm_matrix", sql.Text, nullable=True), Column("thema_crm_matrix", sa.Text, nullable=True),
Column("anmerkungen", sql.Text, nullable=True), Column("anmerkungen", sa.Text, nullable=True),
Column("rueckmeldung", sql.Text, nullable=True), Column("rueckmeldung", sa.Text, nullable=True),
Column( Column(
"erstellt", "erstellt",
UTCDateTime, UTCDateTime,