diff --git a/alembic/versions/2afa4e506448_adding_consulting_sessions.py b/alembic/versions/2afa4e506448_adding_consulting_sessions.py new file mode 100644 index 0000000..cc27941 --- /dev/null +++ b/alembic/versions/2afa4e506448_adding_consulting_sessions.py @@ -0,0 +1,73 @@ +"""adding consulting sessions + +Revision ID: 2afa4e506448 +Revises: 1a8e957522a4 +Create Date: 2026-07-09 14:21:24.586706 + +""" + +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op + +import wce_crm.db + +# revision identifiers, used by Alembic. +revision: str = "2afa4e506448" +down_revision: Union[str, Sequence[str], None] = "1a8e957522a4" +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! ### + op.create_table( + "beratung_vorgang", + sa.Column("vorgang_id", sa.Integer(), autoincrement=True, nullable=False), + sa.Column("un_id", sa.Integer(), nullable=True), + sa.Column("pers_id", sa.Integer(), nullable=True), + sa.Column("titel", sa.Text(), nullable=False), + sa.Column("beratungs_typ", sa.String(length=20), nullable=False), + sa.Column("erstellt", wce_crm.db.UTCDateTime(), nullable=False), + sa.Column("aktualisiert", wce_crm.db.UTCDateTime(), nullable=True), + sa.ForeignKeyConstraint( + ["pers_id"], + ["grunderfassung_personen.pers_id"], + ), + sa.ForeignKeyConstraint( + ["un_id"], + ["grunderfassung_unternehmen.un_id"], + ), + sa.PrimaryKeyConstraint("vorgang_id"), + ) + op.create_table( + "beratung_einzelberatung", + sa.Column("beratung_id", sa.Integer(), autoincrement=True, nullable=False), + sa.Column("vorgang_id", sa.Integer(), nullable=False), + sa.Column("nutzer_id", sa.Integer(), nullable=False), + sa.Column("nutzer_name", sa.String(length=20), nullable=False), + sa.Column("zeitstempel", wce_crm.db.UTCDateTime(), nullable=False), + sa.Column("ansprechpartner", sa.Text(), nullable=False), + sa.Column("kommunikationsweg", sa.Text(), nullable=False), + sa.Column("thema_crm_matrix", sa.Text(), nullable=True), + sa.Column("anmerkungen", sa.Text(), nullable=True), + sa.Column("rueckmeldung", sa.Text(), nullable=True), + sa.Column("erstellt", wce_crm.db.UTCDateTime(), nullable=False), + sa.Column("aktualisiert", wce_crm.db.UTCDateTime(), nullable=True), + sa.ForeignKeyConstraint( + ["vorgang_id"], + ["beratung_vorgang.vorgang_id"], + ), + sa.PrimaryKeyConstraint("beratung_id"), + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table("beratung_einzelberatung") + op.drop_table("beratung_vorgang") + # ### end Alembic commands ### diff --git a/data_model/project_db_schema.aml b/data_model/project_db_schema.aml index 0fe031e..ffd0d98 100644 --- a/data_model/project_db_schema.aml +++ b/data_model/project_db_schema.aml @@ -85,7 +85,7 @@ Beratung_Vorgang | Beratung kann an Unternehmen allein (pauschal), Person allein pers_id int nullable -> Grunderfassung_Personen(pers_id) | sowohl Pauschal- als auch Individualberatung bei Personenbindung möglich titel text beratung_typ berat_typ(pauschal, individual) - erstellt "timestamp with time zone"=`datetime.datetime.now(datetime.UTC)` nullable + erstellt "timestamp with time zone"=`datetime.datetime.now(datetime.UTC)` aktualisiert "timestamp with time zone"=`datetime.datetime.now(datetime.UTC)` nullable {on_update: `datetime.datetime.now(datetime.UTC)`} temporaer bool | Gibt an, ob der Vorgang losgelöst von der Grunderfassung gestartet wurde (Daten müssen nachträglich zugeordnet werden); theoretisch auch erfüllt, wenn `un_id` und `pers_id` beide NULL sind @@ -93,12 +93,14 @@ Beratung_Vorgang | Beratung kann an Unternehmen allein (pauschal), Person allein Beratung_Einzelberatung | Änderungen müssen über einen DB-Trigger an Elterntabelle zurückgeschrieben werden beratung_id int pk {autoIncrement} vorgang_id int -> Beratung_Vorgang(vorgang_id) | Jede Beratung muss zu einem Beratungsvorgang gehören. - erstellt "timestamp with time zone"=`datetime.datetime.now(datetime.UTC)` nullable | gekoppelt mit Elterntabelle 'Beratung_Vorgang' über Trigger + erstellt "timestamp with time zone"=`datetime.datetime.now(datetime.UTC)` | gekoppelt mit Elterntabelle 'Beratung_Vorgang' über Trigger aktualisiert "timestamp with time zone"=`datetime.datetime.now(datetime.UTC)` nullable {on_update: `datetime.datetime.now(datetime.UTC)`} | gekoppelt mit Elterntabelle 'Beratung_Vorgang' über Trigger nutzer_id int | externe Nutzerverwaltung - nutzer_name text | externe Nuttzerverwaltung - ansprechpartner text nullable - thema text nullable | Verlinkung ins CRM, genaue Gestaltung noch unklar + nutzer_name text | externe Nutzerverwaltung + zeitstempel "timestamp with time zone" | Nutzereingabe + ansprechpartner text + kommunikationsweg text + thema_crm_matrix text nullable | Verlinkung ins CRM, genaue Gestaltung noch unklar anmerkungen text nullable rueckmeldung txt nullable diff --git a/src/wce_crm/data_models.py b/src/wce_crm/data_models.py index e5ab2b9..667a58c 100644 --- a/src/wce_crm/data_models.py +++ b/src/wce_crm/data_models.py @@ -178,6 +178,7 @@ class FlatBaseModel(BaseModel): return dict(items) +# ** InitRec class Grunderfassung_Unternehmen(FlatBaseModel): # default in SQLAlchemy with lambda and timezone-aware datetime Metadaten_erstellung: AwareDatetime | None = None @@ -342,3 +343,35 @@ class Grunderfassung_Sprachen(BaseModel): SP_nachweis: str | None SP_art_nachweis: str | None = None SP_datum_nachweis: datetime.date | None = None + + +# ** Consulting +class Beratungsgespraech(BaseModel): + model_config = ConfigDict(str_strip_whitespace=True) + + un_id: int | None + pers_id: int | None + titel: str + beratungs_typ: str + + # default in SQLAlchemy with lambda and timezone-aware datetime + erstellt: AwareDatetime | None = None + aktualisiert: AwareDatetime | None = None # see above + + +class Beratungsgespraech_Vorgang(BaseModel): + model_config = ConfigDict(str_strip_whitespace=True) + + vorgang_id: int + nutzer_id: int + nutzer_name: str + zeitstempel: AwareDatetime + ansprechpartner: str + kommunikationsweg: str + thema_crm_matrix: str | None + anmerkungen: str | None + rueckmeldung: str | None + + # default in SQLAlchemy with lambda and timezone-aware datetime + erstellt: AwareDatetime | None = None + aktualisiert: AwareDatetime | None = None # see above diff --git a/src/wce_crm/db.py b/src/wce_crm/db.py index 749fddb..efa699b 100644 --- a/src/wce_crm/db.py +++ b/src/wce_crm/db.py @@ -374,3 +374,71 @@ zuordnung_personen_unternehmen: sql.Table = Table( onupdate=lambda: datetime.datetime.now(datetime.UTC), ), ) + + +beratung_vorgang: sql.Table = Table( + "beratung_vorgang", + MD_MAIN, + Column( + "vorgang_id", + sql.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( + "erstellt", + UTCDateTime, + nullable=False, + default=lambda: datetime.datetime.now(datetime.UTC), + ), + Column( + "aktualisiert", + UTCDateTime, + nullable=True, + default=lambda: datetime.datetime.now(datetime.UTC), + onupdate=lambda: datetime.datetime.now(datetime.UTC), + ), +) + + +beratung_einzelberatung: sql.Table = Table( + "beratung_einzelberatung", + MD_MAIN, + Column( + "beratung_id", + sql.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( + "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( + "erstellt", + UTCDateTime, + nullable=False, + default=lambda: datetime.datetime.now(datetime.UTC), + ), + Column( + "aktualisiert", + UTCDateTime, + nullable=True, + default=lambda: datetime.datetime.now(datetime.UTC), + onupdate=lambda: datetime.datetime.now(datetime.UTC), + ), +)