Dev #7

Merged
foefl merged 74 commits from dev into main 2026-07-31 14:19:01 +00:00
2 changed files with 110 additions and 13 deletions
Showing only changes of commit 9dc26e36b5 - Show all commits
+109 -13
View File
@@ -32,6 +32,7 @@ from PySide6.QtGui import QAction
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
QAbstractItemView, QAbstractItemView,
QApplication, QApplication,
QButtonGroup,
QComboBox, QComboBox,
QCompleter, QCompleter,
QDateEdit, QDateEdit,
@@ -48,6 +49,7 @@ from PySide6.QtWidgets import (
QMessageBox, QMessageBox,
QPlainTextEdit, QPlainTextEdit,
QPushButton, QPushButton,
QRadioButton,
QScrollArea, QScrollArea,
QSizePolicy, QSizePolicy,
QStackedWidget, QStackedWidget,
@@ -76,7 +78,7 @@ from wce_crm.logging import (
logger_get_data, logger_get_data,
logger_gui, logger_gui,
) )
from wce_crm.types import ExtMaId, InitRecId from wce_crm.types import ExtMaId, InitRecId, UserId
if TYPE_CHECKING: if TYPE_CHECKING:
... ...
@@ -1151,9 +1153,11 @@ class AutoForm(QWidget):
def __init__( def __init__(
self, self,
session: Session,
cfg: AutoFormConfig, cfg: AutoFormConfig,
) -> None: ) -> None:
super().__init__() super().__init__()
self.session = session
self.cfg = cfg self.cfg = cfg
self.setStyleSheet(""" self.setStyleSheet("""
QGroupBox { QGroupBox {
@@ -2050,8 +2054,13 @@ class NewEntrySelect_view(QWidget):
company_requested = Signal(bool) # Signal "Unternehmen" (bool: reset yes/no) company_requested = Signal(bool) # Signal "Unternehmen" (bool: reset yes/no)
person_requested = Signal() # Signal "Individualperson" person_requested = Signal() # Signal "Individualperson"
def __init__(self): def __init__(
self,
session: Session,
):
super().__init__() super().__init__()
self.session = session
layout = QVBoxLayout(self) layout = QVBoxLayout(self)
layout.setAlignment(Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignLeft) layout.setAlignment(Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignLeft)
@@ -2123,8 +2132,13 @@ class Page_InitRecCompany(QWidget):
update_triggered = Signal() # form saved (data changed for front page) update_triggered = Signal() # form saved (data changed for front page)
company_profile_requested = Signal(InitRecId) company_profile_requested = Signal(InitRecId)
def __init__(self): def __init__(
self,
session: Session,
):
super().__init__() super().__init__()
self.session = session
# Hauptlayout der Seite # Hauptlayout der Seite
outer_layout = QHBoxLayout(self) outer_layout = QHBoxLayout(self)
vert_layout = QVBoxLayout() vert_layout = QVBoxLayout()
@@ -2193,7 +2207,7 @@ class Page_InitRecCompany(QWidget):
# --- AUTO FORM LAYOUT --- # --- AUTO FORM LAYOUT ---
container_layout.addSpacing(20) container_layout.addSpacing(20)
self.auto_form = AutoForm(cfg=CONFIG_GRUNDERFASSUNG_UNTERNEHMEN) self.auto_form = AutoForm(self.session, cfg=CONFIG_GRUNDERFASSUNG_UNTERNEHMEN)
container_layout.addWidget(self.auto_form) container_layout.addWidget(self.auto_form)
self.auto_form.update_triggered.connect(lambda: self.update_triggered.emit()) self.auto_form.update_triggered.connect(lambda: self.update_triggered.emit())
@@ -2268,8 +2282,12 @@ class Page_InitRecPerson(QWidget):
back_requested = Signal() # back button back_requested = Signal() # back button
update_triggered = Signal() # form saved (data changed for front page) update_triggered = Signal() # form saved (data changed for front page)
def __init__(self): def __init__(
self,
session: Session,
):
super().__init__() super().__init__()
self.session = session
# Hauptlayout der Seite # Hauptlayout der Seite
outer_layout = QHBoxLayout(self) outer_layout = QHBoxLayout(self)
vert_layout = QVBoxLayout() vert_layout = QVBoxLayout()
@@ -2328,7 +2346,7 @@ class Page_InitRecPerson(QWidget):
# --- AUTO FORM LAYOUT --- # --- AUTO FORM LAYOUT ---
container_layout.addSpacing(20) container_layout.addSpacing(20)
self.auto_form = AutoForm(cfg=CONFIG_GRUNDERFASSUNG_PERSONEN) self.auto_form = AutoForm(self.session, cfg=CONFIG_GRUNDERFASSUNG_PERSONEN)
container_layout.addWidget(self.auto_form) container_layout.addWidget(self.auto_form)
self.auto_form.update_triggered.connect(lambda: self.update_triggered.emit()) self.auto_form.update_triggered.connect(lambda: self.update_triggered.emit())
@@ -2413,8 +2431,12 @@ class Page_CompanyProfile(QWidget):
# update_triggered = Signal() # form saved (data changed for front page) # update_triggered = Signal() # form saved (data changed for front page)
consulting_requested = Signal(ConsultingRequest) consulting_requested = Signal(ConsultingRequest)
def __init__(self): def __init__(
self,
session: Session,
):
super().__init__() super().__init__()
self.session = session
# state management # state management
self.current_id: InitRecId = -1 self.current_id: InitRecId = -1
@@ -2632,6 +2654,7 @@ class Page_CompanyProfile(QWidget):
assert self.current_id > -1, ( assert self.current_id > -1, (
"tried to call consulting from comp profile without set ID" "tried to call consulting from comp profile without set ID"
) )
# TODO
req = ConsultingRequest(cons_type=cons_type, un_id=self.current_id) req = ConsultingRequest(cons_type=cons_type, un_id=self.current_id)
self.consulting_requested.emit(req) self.consulting_requested.emit(req)
@@ -2858,6 +2881,32 @@ class MasterDataFormWidget(QWidget):
""") """)
@dc.dataclass(slots=True)
class Session:
user_id: UserId | None = None
user_name: str | None = None
@dc.dataclass(slots=True)
class Page_Consulting_State:
session: Session | None = None
un_id: InitRecId | None = None
pers_id: InitRecId | None = None
cons_type: ConsultingType | None = None
@dc.dataclass(slots=True)
class ConsultingSession:
user_id: UserId
user_name: str
timestamp: datetime.datetime
partner: str
interaction_scheme: str
topic: str # TODO should be linked to something, target unclear (need specification by customer)
notes: str
response: str
class Page_Consulting(QWidget): class Page_Consulting(QWidget):
back_main_requested = Signal() # back to main page back_main_requested = Signal() # back to main page
back_requested = Signal(bool) # back to init rec (bool: reset yes/no) back_requested = Signal(bool) # back to init rec (bool: reset yes/no)
@@ -2865,10 +2914,16 @@ class Page_Consulting(QWidget):
# more like listening to 'child' ("Beratungen") # more like listening to 'child' ("Beratungen")
# update_triggered = Signal() # form saved (data changed for front page) # update_triggered = Signal() # form saved (data changed for front page)
def __init__(self): def __init__(
self,
session: Session,
):
super().__init__() super().__init__()
self.session = session
# state management # state management
self.STATE = Page_Consulting_State()
# self.current_id: InitRecId = -1 # self.current_id: InitRecId = -1
# self.COMPANY_FETAURES_MASTER_DATA: dict[str, str] = { # self.COMPANY_FETAURES_MASTER_DATA: dict[str, str] = {
# "ma_unternehmensname": "Name:", # "ma_unternehmensname": "Name:",
@@ -2965,6 +3020,19 @@ class Page_Consulting(QWidget):
# container_layout.addWidget(self.title_company_name) # container_layout.addWidget(self.title_company_name)
container_layout.addWidget(QLabel("PLATZHALTER")) container_layout.addWidget(QLabel("PLATZHALTER"))
self.type_pauschal_btn = QRadioButton("Pauschalberatung")
self.type_individual_btn = QRadioButton("Individualberatung")
self.type_pauschal_btn.setChecked(True)
self.type_group = QButtonGroup()
self.type_group.addButton(self.type_pauschal_btn, 0)
self.type_group.addButton(self.type_individual_btn, 1)
self.type_group.idClicked.connect(self.type_consulting_changed)
container_layout.addWidget(self.type_pauschal_btn)
container_layout.addWidget(self.type_individual_btn)
container_layout.addSpacing(20) container_layout.addSpacing(20)
# separation in left and right # separation in left and right
@@ -3071,12 +3139,38 @@ class Page_Consulting(QWidget):
# } # }
# """) # """)
# TODO placeholder, check if needed
def _sync_state_to_ui(self) -> None: ...
def _sync_ui_to_state(self) -> None: ...
def type_consulting_changed(
self,
button_id: int,
) -> None:
logger_gui.debug("[Consultin Page] Trigger type buttons...")
cons_type: ConsultingType
if button_id == 0:
cons_type = ConsultingType.PAUSCHAL
elif button_id == 1:
cons_type = ConsultingType.INDIVIUAL
else:
raise RuntimeError(f"No consulting type defined for button id: {button_id}")
logger_gui.debug("[Consulting Page] Selected cons_type: %s", cons_type)
self.STATE.cons_type = cons_type
def load_from_request( def load_from_request(
self, self,
req: ConsultingRequest, req: ConsultingRequest,
) -> None: ) -> None:
# TODO add correct loading behaviour # TODO add correct loading behaviour
# TODO add validation (correct type with necessary information)
logger_gui.debug("[Consulting] Loading with request:\n%s", req) logger_gui.debug("[Consulting] Loading with request:\n%s", req)
self.STATE.un_id = req.un_id
self.STATE.pers_id = req.pers_id
self.STATE.cons_type = req.cons_type
# def set_company_name(self, name: str) -> None: # def set_company_name(self, name: str) -> None:
# if not name: # if not name:
@@ -3148,6 +3242,7 @@ class MainWindow(QMainWindow):
super().__init__() super().__init__()
# STATE MANAGEMENT # STATE MANAGEMENT
self.session = Session(user_id=42, user_name="TEST-USER")
self._history_stack: list[int] = [] self._history_stack: list[int] = []
self.setWindowTitle("Master") self.setWindowTitle("Master")
@@ -3165,32 +3260,32 @@ class MainWindow(QMainWindow):
self.stack.addWidget(self.main_page) self.stack.addWidget(self.main_page)
# SITE: add new entries for 'Grunderfassung' # SITE: add new entries for 'Grunderfassung'
self.new_entry_select = NewEntrySelect_view() self.new_entry_select = NewEntrySelect_view(self.session)
self.new_entry_select.back_requested.connect(self.show_main_page) self.new_entry_select.back_requested.connect(self.show_main_page)
self.new_entry_select.company_requested.connect(self.show_page_initrec_company) self.new_entry_select.company_requested.connect(self.show_page_initrec_company)
self.new_entry_select.person_requested.connect(self.show_page_initrec_person) self.new_entry_select.person_requested.connect(self.show_page_initrec_person)
self.stack.addWidget(self.new_entry_select) self.stack.addWidget(self.new_entry_select)
# SITE: 'Grunderfassung Unternehmen' # SITE: 'Grunderfassung Unternehmen'
self.initrec_company = Page_InitRecCompany() self.initrec_company = Page_InitRecCompany(self.session)
self.initrec_company.back_main_requested.connect(self.show_main_page) self.initrec_company.back_main_requested.connect(self.show_main_page)
self.initrec_company.back_requested.connect(self.show_new_entry_select) self.initrec_company.back_requested.connect(self.show_new_entry_select)
self.initrec_company.update_triggered.connect(self.update_grid) self.initrec_company.update_triggered.connect(self.update_grid)
self.initrec_company.company_profile_requested.connect(self.show_page_company_profile) self.initrec_company.company_profile_requested.connect(self.show_page_company_profile)
self.stack.addWidget(self.initrec_company) self.stack.addWidget(self.initrec_company)
# SITE: 'Grunderfassung Person' # SITE: 'Grunderfassung Person'
self.initrec_person = Page_InitRecPerson() self.initrec_person = Page_InitRecPerson(self.session)
self.initrec_person.back_main_requested.connect(self.show_main_page) self.initrec_person.back_main_requested.connect(self.show_main_page)
self.initrec_person.back_requested.connect(self.show_new_entry_select) self.initrec_person.back_requested.connect(self.show_new_entry_select)
self.initrec_person.update_triggered.connect(self.update_grid) self.initrec_person.update_triggered.connect(self.update_grid)
self.stack.addWidget(self.initrec_person) self.stack.addWidget(self.initrec_person)
# SITE: 'Unternehmensprofil' # SITE: 'Unternehmensprofil'
self.company_profile = Page_CompanyProfile() self.company_profile = Page_CompanyProfile(self.session)
self.company_profile.back_main_requested.connect(self.show_main_page) self.company_profile.back_main_requested.connect(self.show_main_page)
self.company_profile.back_requested.connect(self.show_page_initrec_company) self.company_profile.back_requested.connect(self.show_page_initrec_company)
self.company_profile.consulting_requested.connect(self.show_page_consulting) self.company_profile.consulting_requested.connect(self.show_page_consulting)
self.stack.addWidget(self.company_profile) self.stack.addWidget(self.company_profile)
# SITE: 'Beratungsgespräch' # SITE: 'Beratungsgespräch'
self.consulting_page = Page_Consulting() self.consulting_page = Page_Consulting(self.session)
self.consulting_page.back_main_requested.connect(self.show_main_page) self.consulting_page.back_main_requested.connect(self.show_main_page)
# self.consulting_page.back_requested.connect( # self.consulting_page.back_requested.connect(
# self.show_page_company_profile_without_load # self.show_page_company_profile_without_load
@@ -3366,6 +3461,7 @@ class MainWindow(QMainWindow):
self.stack.setCurrentIndex(prev_idx) self.stack.setCurrentIndex(prev_idx)
def show_main_page(self): def show_main_page(self):
self._history_stack.clear()
self._navigate_to_target(self.main_page) self._navigate_to_target(self.main_page)
def show_new_entry_select(self): def show_new_entry_select(self):
+1
View File
@@ -5,6 +5,7 @@ from typing import TYPE_CHECKING, TypeAlias
if TYPE_CHECKING: if TYPE_CHECKING:
import polars as pl import polars as pl
UserId: TypeAlias = int
InitRecId: TypeAlias = int InitRecId: TypeAlias = int
ExtMaId: TypeAlias = int ExtMaId: TypeAlias = int
ExtAnId: TypeAlias = int ExtAnId: TypeAlias = int