frontpage construction

This commit is contained in:
2026-05-26 16:04:49 +02:00
parent ee288a47dc
commit cd1643a359
4 changed files with 138 additions and 60 deletions

View File

@@ -62,7 +62,7 @@ from PySide6.QtWidgets import (
QWidget, 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") K = TypeVar("K")
V = TypeVar("V") V = TypeVar("V")
@@ -2373,9 +2373,11 @@ class NoScrollFilter(QObject):
class ClickableCell(QFrame): class ClickableCell(QFrame):
"""cell in the table on the startup screen""" """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__() super().__init__()
self.data_record = data_record # Wir merken uns den ganzen Datensatz self.data_record = data_record # Wir merken uns den ganzen Datensatz
self.setStyleSheet(""" self.setStyleSheet("""
@@ -3468,7 +3470,8 @@ class SearchFormPage(QWidget):
title.setStyleSheet("font-size: 14px; font-style: italic;") # font-weight: bold; title.setStyleSheet("font-size: 14px; font-style: italic;") # font-weight: bold;
container_layout.addWidget(title) container_layout.addWidget(title)
# container_layout.addWidget(MyFormPart(FORM_FIELD_DEF, "Test-Gruppe")) # 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) container_layout.addSpacing(30)
@@ -3508,10 +3511,10 @@ class MainWindow(QMainWindow):
self.new_entry_select.company_requested.connect(self.show_company_page) self.new_entry_select.company_requested.connect(self.show_company_page)
self.stack.addWidget(self.new_entry_select) self.stack.addWidget(self.new_entry_select)
# SEITE: Bsp. # SEITE: Bsp.
self.company_page = SearchFormPage() self.company_recording_page = SearchFormPage()
self.company_page.back_main_requested.connect(self.show_main_page) self.company_recording_page.back_main_requested.connect(self.show_main_page)
self.company_page.back_requested.connect(self.show_new_entry_select) self.company_recording_page.back_requested.connect(self.show_new_entry_select)
self.stack.addWidget(self.company_page) self.stack.addWidget(self.company_recording_page)
def setup_main_page(self): def setup_main_page(self):
# --- 2. DAS ZENTRALE WIDGET --- # --- 2. DAS ZENTRALE WIDGET ---
@@ -3586,78 +3589,90 @@ class MainWindow(QMainWindow):
# Zeilen-Zähler (0 ist für die Überschriften) # Zeilen-Zähler (0 ist für die Überschriften)
self.current_row = 0 self.current_row = 0
# Beispieldaten (Projekt Gamma hat kein 'c3') # 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): for col_idx, title in enumerate(headers):
self.grid.addWidget(HeaderCell(title), self.current_row, col_idx) self.grid.addWidget(HeaderCell(title), self.current_row, col_idx)
self.current_row += 1 self.current_row += 1
data = [ data = be_init_rec.get_company_list()
{
"c1": "Projekt Alpha", # data = [
"c2": "Alles komplett.", # {
"c3": "Teamleitung", # "c1": "Projekt Alpha",
"c4": "Hoch", # "c2": "Alles komplett.",
"date": "17.04.", # "c3": "Teamleitung",
}, # "c4": "Hoch",
{ # "date": "17.04.",
"c1": "Projekt Beta", # },
"c2": "Abteilung fehlt.", # {
"c4": "Wartend", # "c1": "Projekt Beta",
"date": "21.04.", # "c2": "Abteilung fehlt.",
}, # "c4": "Wartend",
{ # "date": "21.04.",
"c1": "Projekt Gamma", # },
"c2": "Alles komplett.", # {
"c3": "Teamleitung", # "c1": "Projekt Gamma",
"c4": "Mittel", # "c2": "Alles komplett.",
"date": "30.04.", # "c3": "Teamleitung",
}, # "c4": "Mittel",
{ # "date": "30.04.",
"c1": "Projekt Delta", # },
"c2": "Abteilung fehlt.", # {
"c4": "Wartend", # "c1": "Projekt Delta",
"date": "05.05.", # "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: for entry in data:
self.add_row_to_grid(entry) self.add_row_to_grid(entry)
return main_widget return main_widget
# --- HILFSMETHODE UM EINE ZEILE EINZUFÜGEN --- # --- 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 row = self.current_row
# Beim Erstellen der Zelle übergeben wir den kompletten Datensatz # Beim Erstellen der Zelle übergeben wir den kompletten Datensatz
cell = ClickableCell(entry["c1"], entry) cell = ClickableCell(entry.name, entry)
cell.clicked.connect(self.show_details) cell.clicked.connect(self.goto_initial_recording)
self.grid.addWidget(cell, row, 0) self.grid.addWidget(cell, row, 0)
# Wir verbinden das Klick-Signal der Zelle mit unserer Wechsel-Funktion # 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") # c3_value = entry.get("c3")
if c3_value: # if c3_value:
self.grid.addWidget(ClickableCell(c3_value, entry), row, 2) # self.grid.addWidget(ClickableCell(c3_value, entry), row, 2)
else: # else:
empty_box = QFrame() # empty_box = QFrame()
empty_box.setStyleSheet( # empty_box.setStyleSheet(
"QFrame { background-color: #f8fafc; border: 2px dashed #e2e8f0; border-radius: 8px; }" # "QFrame { background-color: #f8fafc; border: 2px dashed #e2e8f0; border-radius: 8px; }"
) # )
self.grid.addWidget(empty_box, row, 2) # self.grid.addWidget(empty_box, row, 2)
self.grid.addWidget(ClickableCell(entry.get("c4", ""), entry), row, 3) # 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("date", ""), entry), row, 4)
self.current_row += 1 # Zähler für den nächsten Eintrag erhöhen 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 # 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 # 2. Auf die Detail-Seite umblättern
self.stack.setCurrentWidget(self.detail_page) # self.stack.setCurrentWidget(self.detail_page)
def show_main_page(self): def show_main_page(self):
# Zurück zur Tabelle blättern # Zurück zur Tabelle blättern
@@ -3667,7 +3682,7 @@ class MainWindow(QMainWindow):
self.stack.setCurrentWidget(self.new_entry_select) self.stack.setCurrentWidget(self.new_entry_select)
def show_company_page(self): def show_company_page(self):
self.stack.setCurrentWidget(self.company_page) self.stack.setCurrentWidget(self.company_recording_page)
# --- MENÜ LOGIK --- # --- MENÜ LOGIK ---
def create_menu(self): def create_menu(self):

View File

@@ -12,9 +12,41 @@ from pprint import pprint
from typing import Annotated, Any from typing import Annotated, Any
import babel import babel
import polars as pl
import sqlalchemy as sql
from pydantic import BaseModel, ConfigDict, EmailStr, Field, field_validator, model_validator from pydantic import BaseModel, ConfigDict, EmailStr, Field, field_validator, model_validator
from PySide6.QtCore import QDate, Qt 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): # class FlatBaseModel(BaseModel):
# @classmethod # @classmethod

View File

@@ -1,8 +1,10 @@
from __future__ import annotations from __future__ import annotations
import dataclasses as dc
from typing import Any, TypedDict, cast from typing import Any, TypedDict, cast
import polars as pl import polars as pl
import sqlalchemy as sql
from wce_crm import db from wce_crm import db
@@ -176,3 +178,32 @@ def get_initial_recording(
raise KeyError(f"Database ID {id_} not found") raise KeyError(f"Database ID {id_} not found")
return row._asdict() 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

View File

@@ -363,15 +363,15 @@ grunderfassung_unternehmen: sql.Table = Table(
# Column("Metadaten_aktualisierung", sql.Text, nullable=True), # Column("Metadaten_aktualisierung", sql.Text, nullable=True),
# Column("Metadaten_erstellung", sql.Text, nullable=True), # Column("Metadaten_erstellung", sql.Text, nullable=True),
Column("Partnersuche__kanal_aufmerksamkeit", sql.Text, nullable=True), Column("Partnersuche__kanal_aufmerksamkeit", sql.Text, nullable=True),
Column("Partnersuche__person_suche", sql.Text, nullable=True), Column("Partnersuche__person_suche", sql.Integer, nullable=True),
Column("Partnersuche__un_suche", sql.Text, nullable=True), Column("Partnersuche__un_suche", sql.Integer, nullable=True),
Column("Projektrelevanz__relevanz", sql.Boolean, nullable=True), Column("Projektrelevanz__relevanz", sql.Boolean, nullable=True),
Column("Schulbildung", sql.Text, nullable=True), Column("Schulbildung", sql.Text, nullable=True),
Column("Sprachkenntnisse", sql.Text, nullable=True), Column("Sprachkenntnisse", sql.Text, nullable=True),
Column("Stammdaten__PLZ", sql.Text, nullable=True), Column("Stammdaten__PLZ", sql.Text, nullable=True),
Column("Stammdaten__anrede_anschrift", 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__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__aufenthaltsort", sql.Text, nullable=True),
Column("Stammdaten__bundesland", sql.Text, nullable=True), Column("Stammdaten__bundesland", sql.Text, nullable=True),
Column("Stammdaten__land", sql.Text, nullable=True), Column("Stammdaten__land", sql.Text, nullable=True),