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,
)
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):

View File

@@ -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

View File

@@ -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

View File

@@ -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),