diff --git a/prototypes/t_qt_2.py b/prototypes/t_qt_2.py index c0878d6..a066cff 100644 --- a/prototypes/t_qt_2.py +++ b/prototypes/t_qt_2.py @@ -62,7 +62,7 @@ from PySide6.QtWidgets import ( QWidget, ) -from wce_crm.backend import initial_recording as be_init_rec +from wce_crm.backend import backend as be_init_rec K = TypeVar("K") V = TypeVar("V") @@ -2373,9 +2373,11 @@ class NoScrollFilter(QObject): class ClickableCell(QFrame): """cell in the table on the startup screen""" - clicked = Signal(dict) # Signal which also sends data as dictionary + clicked = Signal( + be_init_rec.FrontpageCompany + ) # Signal which also sends data as dictionary - def __init__(self, text, data_record): + def __init__(self, text: str, data_record: be_init_rec.FrontpageCompany): super().__init__() self.data_record = data_record # Wir merken uns den ganzen Datensatz self.setStyleSheet(""" @@ -3468,7 +3470,8 @@ class SearchFormPage(QWidget): title.setStyleSheet("font-size: 14px; font-style: italic;") # font-weight: bold; container_layout.addWidget(title) # container_layout.addWidget(MyFormPart(FORM_FIELD_DEF, "Test-Gruppe")) - container_layout.addWidget(AutoForm(cfg=CONFIG_GRUNDERFASSUNG_UNTERNEHMEN)) + self.auto_form = AutoForm(cfg=CONFIG_GRUNDERFASSUNG_UNTERNEHMEN) + container_layout.addWidget(self.auto_form) container_layout.addSpacing(30) @@ -3508,10 +3511,10 @@ class MainWindow(QMainWindow): self.new_entry_select.company_requested.connect(self.show_company_page) self.stack.addWidget(self.new_entry_select) # SEITE: Bsp. - self.company_page = SearchFormPage() - self.company_page.back_main_requested.connect(self.show_main_page) - self.company_page.back_requested.connect(self.show_new_entry_select) - self.stack.addWidget(self.company_page) + self.company_recording_page = SearchFormPage() + self.company_recording_page.back_main_requested.connect(self.show_main_page) + self.company_recording_page.back_requested.connect(self.show_new_entry_select) + self.stack.addWidget(self.company_recording_page) def setup_main_page(self): # --- 2. DAS ZENTRALE WIDGET --- @@ -3586,78 +3589,90 @@ class MainWindow(QMainWindow): # Zeilen-Zähler (0 ist für die Überschriften) self.current_row = 0 # Beispieldaten (Projekt Gamma hat kein 'c3') - headers = ["Name", "Beschreibung", "Abteilung", "Status", "Datum"] + headers = [ + "UN/ NWP/ Kontaktperson", + "Individualberatung", + "Pauschalberatung", + "Verlaufsprotokoll", + "Datum", + ] for col_idx, title in enumerate(headers): self.grid.addWidget(HeaderCell(title), self.current_row, col_idx) self.current_row += 1 - data = [ - { - "c1": "Projekt Alpha", - "c2": "Alles komplett.", - "c3": "Teamleitung", - "c4": "Hoch", - "date": "17.04.", - }, - { - "c1": "Projekt Beta", - "c2": "Abteilung fehlt.", - "c4": "Wartend", - "date": "21.04.", - }, - { - "c1": "Projekt Gamma", - "c2": "Alles komplett.", - "c3": "Teamleitung", - "c4": "Mittel", - "date": "30.04.", - }, - { - "c1": "Projekt Delta", - "c2": "Abteilung fehlt.", - "c4": "Wartend", - "date": "05.05.", - }, - ] + data = be_init_rec.get_company_list() + + # data = [ + # { + # "c1": "Projekt Alpha", + # "c2": "Alles komplett.", + # "c3": "Teamleitung", + # "c4": "Hoch", + # "date": "17.04.", + # }, + # { + # "c1": "Projekt Beta", + # "c2": "Abteilung fehlt.", + # "c4": "Wartend", + # "date": "21.04.", + # }, + # { + # "c1": "Projekt Gamma", + # "c2": "Alles komplett.", + # "c3": "Teamleitung", + # "c4": "Mittel", + # "date": "30.04.", + # }, + # { + # "c1": "Projekt Delta", + # "c2": "Abteilung fehlt.", + # "c4": "Wartend", + # "date": "05.05.", + # }, + # ] - # Wir gehen die Datenliste mit enumerate durch, um den row_index für das Grid zu bekommen for entry in data: self.add_row_to_grid(entry) return main_widget # --- HILFSMETHODE UM EINE ZEILE EINZUFÜGEN --- - def add_row_to_grid(self, entry): + def add_row_to_grid(self, entry: be_init_rec.FrontpageCompany): row = self.current_row # Beim Erstellen der Zelle übergeben wir den kompletten Datensatz - cell = ClickableCell(entry["c1"], entry) - cell.clicked.connect(self.show_details) + cell = ClickableCell(entry.name, entry) + cell.clicked.connect(self.goto_initial_recording) self.grid.addWidget(cell, row, 0) # Wir verbinden das Klick-Signal der Zelle mit unserer Wechsel-Funktion - self.grid.addWidget(ClickableCell(entry["c2"], entry), row, 1) + # self.grid.addWidget(ClickableCell(entry["c2"], entry), row, 1) - c3_value = entry.get("c3") - if c3_value: - self.grid.addWidget(ClickableCell(c3_value, entry), row, 2) - else: - empty_box = QFrame() - empty_box.setStyleSheet( - "QFrame { background-color: #f8fafc; border: 2px dashed #e2e8f0; border-radius: 8px; }" - ) - self.grid.addWidget(empty_box, row, 2) + # c3_value = entry.get("c3") + # if c3_value: + # self.grid.addWidget(ClickableCell(c3_value, entry), row, 2) + # else: + # empty_box = QFrame() + # empty_box.setStyleSheet( + # "QFrame { background-color: #f8fafc; border: 2px dashed #e2e8f0; border-radius: 8px; }" + # ) + # self.grid.addWidget(empty_box, row, 2) - self.grid.addWidget(ClickableCell(entry.get("c4", ""), entry), row, 3) - self.grid.addWidget(ClickableCell(entry.get("date", ""), entry), row, 4) + # self.grid.addWidget(ClickableCell(entry.get("c4", ""), entry), row, 3) + # self.grid.addWidget(ClickableCell(entry.get("date", ""), entry), row, 4) self.current_row += 1 # Zähler für den nächsten Eintrag erhöhen - def show_details(self, data): + def goto_initial_recording( + self, + data: be_init_rec.FrontpageCompany, + ): + self.company_recording_page.auto_form.load_data(data.erfassung_id) + self.stack.setCurrentWidget(self.company_recording_page) # 1. Daten an die Detail-Seite übergeben - self.detail_page.update_content(data) + # self.detail_page.update_content(data) # 2. Auf die Detail-Seite umblättern - self.stack.setCurrentWidget(self.detail_page) + # self.stack.setCurrentWidget(self.detail_page) def show_main_page(self): # Zurück zur Tabelle blättern @@ -3667,7 +3682,7 @@ class MainWindow(QMainWindow): self.stack.setCurrentWidget(self.new_entry_select) def show_company_page(self): - self.stack.setCurrentWidget(self.company_page) + self.stack.setCurrentWidget(self.company_recording_page) # --- MENÜ LOGIK --- def create_menu(self): diff --git a/prototypes/tests.py b/prototypes/tests.py index 157a467..1022ef5 100644 --- a/prototypes/tests.py +++ b/prototypes/tests.py @@ -12,9 +12,41 @@ from pprint import pprint from typing import Annotated, Any import babel +import polars as pl +import sqlalchemy as sql from pydantic import BaseModel, ConfigDict, EmailStr, Field, field_validator, model_validator from PySide6.QtCore import QDate, Qt +from wce_crm import constants, db +from wce_crm.backend import backend + +# %% +db_path = constants.Config.DB_PATH_MAIN +crm_path = constants.Config.DB_PATH_CRM +engine = sql.create_engine(f"sqlite:///{str(db_path)}") +engine_crm = sql.create_engine(f"sqlite:///{str(crm_path)}") +# %% +stmt = sql.select( + db.grunderfassung_unternehmen.c.erfassung_id, + db.grunderfassung_unternehmen.c.Partnersuche__un_suche, +) + +with engine.connect() as conn: + res = conn.execute(stmt) + + +for r in res: + print(r) +# %% + + +# %% +backend.get_company_list() + + +# %% +db.DF_CRM_MASTER.filter(pl.col.ma_id == 381) + # %% # class FlatBaseModel(BaseModel): # @classmethod diff --git a/src/wce_crm/backend/initial_recording.py b/src/wce_crm/backend/backend.py similarity index 85% rename from src/wce_crm/backend/initial_recording.py rename to src/wce_crm/backend/backend.py index 3caceac..390afd9 100644 --- a/src/wce_crm/backend/initial_recording.py +++ b/src/wce_crm/backend/backend.py @@ -1,8 +1,10 @@ from __future__ import annotations +import dataclasses as dc from typing import Any, TypedDict, cast import polars as pl +import sqlalchemy as sql from wce_crm import db @@ -176,3 +178,32 @@ def get_initial_recording( raise KeyError(f"Database ID {id_} not found") return row._asdict() + + +@dc.dataclass(slots=True) +class FrontpageCompany: + erfassung_id: int + ma_id: int + name: str + + +def get_company_list() -> list[FrontpageCompany]: + stmt = sql.select( + db.grunderfassung_unternehmen.c.erfassung_id, + db.grunderfassung_unternehmen.c.Partnersuche__un_suche, + ) + + with db.ENGINE.connect() as conn: + res = conn.execute(stmt) + + front_page_companies: list[FrontpageCompany] = [] + + for entry in res: + erfassung_id = entry[0] + ma_id = entry[1] + comp_info = comp_search_get_info(ma_id) + name = comp_info["ma_unternehmensname"] + + front_page_companies.append(FrontpageCompany(erfassung_id, ma_id, name)) + + return front_page_companies diff --git a/src/wce_crm/db.py b/src/wce_crm/db.py index 14a9895..879c78e 100644 --- a/src/wce_crm/db.py +++ b/src/wce_crm/db.py @@ -363,15 +363,15 @@ grunderfassung_unternehmen: sql.Table = Table( # Column("Metadaten_aktualisierung", sql.Text, nullable=True), # Column("Metadaten_erstellung", sql.Text, nullable=True), Column("Partnersuche__kanal_aufmerksamkeit", sql.Text, nullable=True), - Column("Partnersuche__person_suche", sql.Text, nullable=True), - Column("Partnersuche__un_suche", sql.Text, nullable=True), + Column("Partnersuche__person_suche", sql.Integer, nullable=True), + Column("Partnersuche__un_suche", sql.Integer, nullable=True), Column("Projektrelevanz__relevanz", sql.Boolean, 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.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),