From 97b75f4eebbd85c50e48a8786fd0fb4fea8640fe Mon Sep 17 00:00:00 2001 From: foefl Date: Wed, 20 May 2026 16:45:51 +0200 Subject: [PATCH] added custom search widget to prepare loading and saving --- prototypes/t_qt_2.py | 2064 ++++++++++++++++++++++-------------------- 1 file changed, 1089 insertions(+), 975 deletions(-) diff --git a/prototypes/t_qt_2.py b/prototypes/t_qt_2.py index 0a01059..56c278f 100644 --- a/prototypes/t_qt_2.py +++ b/prototypes/t_qt_2.py @@ -12,7 +12,8 @@ import uuid from collections.abc import Sequence from pathlib import Path from pprint import pprint -from typing import Annotated, Any, Protocol, TypeAlias, TypedDict, cast +from typing import Annotated, Any, Final, Protocol, TypeAlias, TypedDict, cast +from typing_extensions import override import babel from pydantic import BaseModel, ConfigDict, EmailStr, Field, ValidationError, field_validator @@ -210,6 +211,7 @@ class FormFieldType(enum.StrEnum): DYNAMIC_LIST = enum.auto() DYNAMIC_DROPDOWN = enum.auto() TEXT_SEARCH = enum.auto() + CUSTOM = enum.auto() @dc.dataclass(slots=True) @@ -243,6 +245,7 @@ class FormField: key: str = "" tooltip: str = "" info: str = "" + custom_widget: str = "" init_label: str = dc.field(init=False) def __post_init__( @@ -264,6 +267,16 @@ class FormField: # and not options # ): # raise ValueError("Invalid field definition: Dropdown requires options") + if self.type is FormFieldType.CUSTOM and not self.custom_widget: + raise ValueError("Custom widget must be named using parameter >custom_widget<") + elif self.type is FormFieldType.CUSTOM and self.custom_widget not in CUSTOM_WIDGETS: + raise KeyError( + ( + f"Custom widget >{self.custom_widget}< is not a known member " + "of the custom widget registry" + ) + ) + if self.type in (FormFieldType.DROPDOWN, FormFieldType.EXTENDED_DROPDOWN): self.dropdown_options = tuple(DropdownOption(op[0], op[1]) for op in options) @@ -295,6 +308,27 @@ class CustomForm(Protocol): def validate_form_data(self) -> list[str]: ... +class CustomWidget(QWidget): + def __init__( + self, + form_fields: Sequence[FormField], + label: str = "Suche", + prefix: str = "", + ) -> None: + super().__init__() + self.form_fields = form_fields + self.label = label + self.prefix = prefix + + def get_form_data(self) -> dict[str, Any]: ... + + def set_form_data(self, data: Any) -> None: ... + + def reset_form(self) -> None: ... + + def validate_form_data(self) -> list[str]: ... + + def _build_ui_recursively( schema: Sequence[FormField], parent_layout: QFormLayout, @@ -517,6 +551,19 @@ def _build_ui_recursively( } parent_layout.addRow(widget) + case FormFieldType.CUSTOM: + widget_class = CUSTOM_WIDGETS[field.custom_widget] + widget = widget_class( + form_fields=field.children, + label=field.label, + prefix=f"{full_key}", + ) + widget_registry[full_key] = { + "widget": widget, + "form_field": field, + } + parent_layout.addRow(widget) + case _: raise NotImplementedError(f"Not supported field type: {field.type.value}") @@ -578,6 +625,9 @@ def reset_form( elif isinstance(widget, DynamicDropdownWidget): # dynamic list widget manages its widgets by itself widget.reset_form() + elif isinstance(widget, CustomWidget): + # dynamic list widget manages its widgets by itself + widget.reset_form() widget.setStyleSheet("") @@ -712,7 +762,7 @@ def validate_form_data( if widget.currentData() is not None: continue error_post = True - elif isinstance(widget, DynamicListWidget): + elif isinstance(widget, (DynamicListWidget, DynamicDropdownWidget, CustomWidget)): errors_widget = widget.validate_form_data() if not errors_widget: continue @@ -993,410 +1043,273 @@ class CompanyForm_Search_old(QWidget): self.company_selected.emit(ma_id) -class CompanyForm_Search_Data(TypedDict): - ma_id: int +# class CompanyForm_Search_Data(TypedDict): +# ma_id: int +# an_id: int -class Grunderfassung_Suche(QWidget): - # company_selected = Signal(int) +# class Grunderfassung_Suche_old(QWidget): +# # company_selected = Signal(int) - def __init__( - self, - # form_fields: Sequence[FormField], - label: str = "Suche", - prefix: str = "", - ): - super().__init__() - # self.form_fields = form_fields - self.label = label - self.prefix = prefix - # self.widget_registry: WidgetRegistry = {} - self.export_data: CompanyForm_Search_Data = {"ma_id": -1} - self.PROPERTY_MA_ID = "user_ma_id" +# def __init__( +# self, +# # form_fields: Sequence[FormField], +# label: str = "Suche", +# prefix: str = "", +# ): +# super().__init__() +# # self.form_fields = form_fields +# self.label = label +# self.prefix = prefix +# # self.widget_registry: WidgetRegistry = {} +# self.export_data: CompanyForm_Search_Data = {"ma_id": -1, "an_id": -1} +# self.PROPERTY_MA_ID = "user_ma_id" - main_layout = QVBoxLayout(self) - main_layout.setContentsMargins(0, 0, 0, 0) - form_layout = QFormLayout() - form_layout.setSpacing(10) - # TODO: remove title? - title = QLabel(self.label) - title.setStyleSheet("font-size: 14px; font-weight: bold;") - main_layout.addWidget(title) - # --- SEARCH --- - self.company_search_input = QLineEdit(placeholderText="Tippen zum Suchen...") - form_layout.addRow("Suche:", self.company_search_input) - self.company_search_completer = QCompleter() - self.company_search_completer.setCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive) - self.company_search_completer.setFilterMode(Qt.MatchFlag.MatchContains) - self.company_search_input.setCompleter(self.company_search_completer) - self.company_search_completer.activated[QModelIndex].connect( # type: ignore - self._selected_company_on_completer - ) - self.company_search_input.textChanged.connect(self._search_company_change_manually) - # --- FILLED FIELDS --- - # name - self.company_name = QLineEdit(placeholderText="Name des Partners") - form_layout.addRow("Name Unternehmen/Netzwerkpartner:", self.company_name) - # street - street_layout = QHBoxLayout() - street_layout.setContentsMargins(0, 0, 0, 0) - street_layout.setSpacing(10) - self.company_street = QLineEdit(placeholderText="Straße") - self.company_streetnumber = QLineEdit(placeholderText="Nr.") - self.company_streetnumber.setMaximumWidth(80) - street_layout.addWidget(self.company_street, stretch=3) - street_layout.addWidget(self.company_streetnumber, stretch=1) - form_layout.addRow("Straße / Nr.:", street_layout) - # ZIP, city - # --- 3. Kombinierte Zeile: PLZ & Ort --- - city_layout = QHBoxLayout() - city_layout.setContentsMargins(0, 0, 0, 0) - city_layout.setSpacing(10) - self.company_zip = QLineEdit(placeholderText="PLZ") - self.company_city = QLineEdit(placeholderText="Ort") - self.company_zip.setMaximumWidth(100) # PLZ ist immer relativ kurz - city_layout.addWidget(self.company_zip, stretch=1) - city_layout.addWidget(self.company_city, stretch=3) - form_layout.addRow("PLZ / Ort:", city_layout) +# main_layout = QVBoxLayout(self) +# main_layout.setContentsMargins(0, 0, 0, 0) +# form_layout = QFormLayout() +# form_layout.setSpacing(10) +# # TODO: remove title? +# title = QLabel(self.label) +# title.setStyleSheet("font-size: 14px; font-weight: bold;") +# main_layout.addWidget(title) +# # --- SEARCH --- +# self.company_search_input = QLineEdit(placeholderText="Tippen zum Suchen...") +# form_layout.addRow("Suche:", self.company_search_input) +# self.company_search_completer = QCompleter() +# self.company_search_completer.setCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive) +# self.company_search_completer.setFilterMode(Qt.MatchFlag.MatchContains) +# self.company_search_input.setCompleter(self.company_search_completer) +# self.company_search_completer.activated[QModelIndex].connect( # type: ignore +# self._selected_company_on_completer +# ) +# self.company_search_input.textChanged.connect(self._search_company_change_manually) +# # --- FILLED FIELDS --- +# # name +# self.company_name = QLineEdit(placeholderText="Name des Partners") +# form_layout.addRow("Name Unternehmen/Netzwerkpartner:", self.company_name) +# # street +# street_layout = QHBoxLayout() +# street_layout.setContentsMargins(0, 0, 0, 0) +# street_layout.setSpacing(10) +# self.company_street = QLineEdit(placeholderText="Straße") +# self.company_streetnumber = QLineEdit(placeholderText="Nr.") +# self.company_streetnumber.setMaximumWidth(80) +# street_layout.addWidget(self.company_street, stretch=3) +# street_layout.addWidget(self.company_streetnumber, stretch=1) +# form_layout.addRow("Straße / Nr.:", street_layout) +# # ZIP, city +# # --- 3. Kombinierte Zeile: PLZ & Ort --- +# city_layout = QHBoxLayout() +# city_layout.setContentsMargins(0, 0, 0, 0) +# city_layout.setSpacing(10) +# self.company_zip = QLineEdit(placeholderText="PLZ") +# self.company_city = QLineEdit(placeholderText="Ort") +# self.company_zip.setMaximumWidth(100) # PLZ ist immer relativ kurz +# city_layout.addWidget(self.company_zip, stretch=1) +# city_layout.addWidget(self.company_city, stretch=3) +# form_layout.addRow("PLZ / Ort:", city_layout) - # !! ------------------------------------------------------------------- - # Integration of person search - # TODO: remove title - spacing_layout = QVBoxLayout() - spacing_layout.addSpacing(15) - form_layout.addRow(spacing_layout) +# # !! ------------------------------------------------------------------- +# # Integration of person search +# # TODO: remove title +# spacing_layout = QVBoxLayout() +# spacing_layout.addSpacing(15) +# form_layout.addRow(spacing_layout) - title = QLabel("--- Suche Nutzer ---") - title.setStyleSheet("font-size: 14px; font-weight: bold;") - main_layout.addWidget(title) - # --- SEARCH --- - self.person_search_input = QComboBox() - self.person_search_input.setEditable(True) - self.person_search_input.setInsertPolicy(QComboBox.InsertPolicy.NoInsert) - line_edit = self.person_search_input.lineEdit() - assert line_edit - line_edit.setPlaceholderText("Suchen...") - # --- FILLED FIELDS --- - form_layout.addRow("Suche Ansprechpartner:", self.person_search_input) - self.person_completer = self.person_search_input.completer() - assert self.person_completer - self.person_completer.setCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive) - self.person_completer.setFilterMode(Qt.MatchFlag.MatchContains) - self.person_completer.setCompletionMode(QCompleter.CompletionMode.PopupCompletion) - # self.person_search_input.activated.connect(self._selected_person_on_completer) - self.person_search_input.currentIndexChanged.connect( - self._selected_person_on_completer - ) - # salutation - self.person_titel = QLineEdit() - self.person_anrede = QLineEdit() - hor_layout = QHBoxLayout() - hor_layout.addWidget(self.person_anrede, stretch=1) - hor_layout.addWidget(self.person_titel, stretch=1) - form_layout.addRow("Anrede / Titel:", hor_layout) - # names - self.person_nachname = QLineEdit() - self.person_vorname = QLineEdit() - hor_layout = QHBoxLayout() - hor_layout.addWidget(self.person_nachname, stretch=1) - hor_layout.addWidget(self.person_vorname, stretch=1) - form_layout.addRow("Nachname / Vorname:", hor_layout) - # phones - phone_layout = QHBoxLayout() - phone_layout.setContentsMargins(0, 0, 0, 0) - phone_layout.setSpacing(10) - self.person_landline_number = QLineEdit() - self.person_mobile_number = QLineEdit() - phone_layout.addWidget(self.person_landline_number, stretch=1) - phone_layout.addWidget(self.person_mobile_number, stretch=1) - form_layout.addRow("Telefon Festnetz / Mobil:", phone_layout) - # additional - self.person_email = QLineEdit() - form_layout.addRow("E-Mail:", self.person_email) - self.person_funktion = QLineEdit() - form_layout.addRow("Funktion:", self.person_funktion) +# title = QLabel("--- Suche Nutzer ---") +# title.setStyleSheet("font-size: 14px; font-weight: bold;") +# main_layout.addWidget(title) +# # --- SEARCH --- +# self.person_search_input = QComboBox() +# self.person_search_input.setEditable(True) +# self.person_search_input.setInsertPolicy(QComboBox.InsertPolicy.NoInsert) +# line_edit = self.person_search_input.lineEdit() +# assert line_edit +# line_edit.setPlaceholderText("Suchen...") +# # --- FILLED FIELDS --- +# form_layout.addRow("Suche Ansprechpartner:", self.person_search_input) +# self.person_completer = self.person_search_input.completer() +# assert self.person_completer +# self.person_completer.setCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive) +# self.person_completer.setFilterMode(Qt.MatchFlag.MatchContains) +# self.person_completer.setCompletionMode(QCompleter.CompletionMode.PopupCompletion) +# # self.person_search_input.activated.connect(self._selected_person_on_completer) +# self.person_search_input.currentIndexChanged.connect( +# self._selected_person_on_completer +# ) +# # salutation +# self.person_titel = QLineEdit() +# self.person_anrede = QLineEdit() +# hor_layout = QHBoxLayout() +# hor_layout.addWidget(self.person_anrede, stretch=1) +# hor_layout.addWidget(self.person_titel, stretch=1) +# form_layout.addRow("Anrede / Titel:", hor_layout) +# # names +# self.person_nachname = QLineEdit() +# self.person_vorname = QLineEdit() +# hor_layout = QHBoxLayout() +# hor_layout.addWidget(self.person_nachname, stretch=1) +# hor_layout.addWidget(self.person_vorname, stretch=1) +# form_layout.addRow("Nachname / Vorname:", hor_layout) +# # phones +# phone_layout = QHBoxLayout() +# phone_layout.setContentsMargins(0, 0, 0, 0) +# phone_layout.setSpacing(10) +# self.person_landline_number = QLineEdit() +# self.person_mobile_number = QLineEdit() +# phone_layout.addWidget(self.person_landline_number, stretch=1) +# phone_layout.addWidget(self.person_mobile_number, stretch=1) +# form_layout.addRow("Telefon Festnetz / Mobil:", phone_layout) +# # additional +# self.person_email = QLineEdit() +# form_layout.addRow("E-Mail:", self.person_email) +# self.person_funktion = QLineEdit() +# form_layout.addRow("Funktion:", self.person_funktion) - # ------------------------------------------------------------------------ +# # ------------------------------------------------------------------------ - # add fom layout - main_layout.addLayout(form_layout) - main_layout.addSpacing(20) - main_layout.addWidget( - QLabel('>>>> Platzhalter "Wie sind Sie auf uns aufmerksam geworden?"') - ) +# # add fom layout +# main_layout.addLayout(form_layout) +# main_layout.addSpacing(20) +# main_layout.addWidget( +# QLabel('>>>> Platzhalter "Wie sind Sie auf uns aufmerksam geworden?"') +# ) - self.autofilled_fields: tuple[QLineEdit, ...] = ( - self.company_name, - self.company_street, - self.company_streetnumber, - self.company_zip, - self.company_city, - self.person_titel, - self.person_anrede, - self.person_nachname, - self.person_vorname, - self.person_landline_number, - self.person_mobile_number, - self.person_email, - self.person_funktion, - ) +# self.autofilled_fields: tuple[QLineEdit, ...] = ( +# self.company_name, +# self.company_street, +# self.company_streetnumber, +# self.company_zip, +# self.company_city, +# self.person_titel, +# self.person_anrede, +# self.person_nachname, +# self.person_vorname, +# self.person_landline_number, +# self.person_mobile_number, +# self.person_email, +# self.person_funktion, +# ) - for field in self.autofilled_fields: - field.setReadOnly(True) - field.setProperty("styleClass", "stempel") +# for field in self.autofilled_fields: +# field.setReadOnly(True) +# field.setProperty("styleClass", "stempel") - self.update_company_data() - # self.update_person_data(None) +# self.update_company_data() +# # self.update_person_data(None) - def fill_out_company(self, comp_info: be_init_rec.CompanyInfo): - self.company_name.setText(comp_info["ma_unternehmensname"]) - self.company_street.setText(comp_info["ma_strasse"]) - self.company_streetnumber.setText(comp_info["ma_hausnummer"]) - self.company_zip.setText(comp_info["ma_plz"]) - self.company_city.setText(comp_info["ma_ort"]) +# def fill_out_company(self, comp_info: be_init_rec.CompanyInfo): +# self.company_name.setText(comp_info["ma_unternehmensname"]) +# self.company_street.setText(comp_info["ma_strasse"]) +# self.company_streetnumber.setText(comp_info["ma_hausnummer"]) +# self.company_zip.setText(comp_info["ma_plz"]) +# self.company_city.setText(comp_info["ma_ort"]) - def fill_out( - self, - info: be_init_rec.ContactPersonInfo, - ) -> None: - self.person_titel.setText(info["an_titel"]) - self.person_anrede.setText(info["an_anrede"]) - self.person_nachname.setText(info["an_nachname"]) - self.person_vorname.setText(info["an_vorname"]) - self.person_landline_number.setText(info["an_festnetz"]) - self.person_mobile_number.setText(info["an_mobil"]) - self.person_email.setText(info["an_mail"]) - self.person_funktion.setText(info["an_position"]) +# def fill_out( +# self, +# info: be_init_rec.ContactPersonInfo, +# ) -> None: +# self.person_titel.setText(info["an_titel"]) +# self.person_anrede.setText(info["an_anrede"]) +# self.person_nachname.setText(info["an_nachname"]) +# self.person_vorname.setText(info["an_vorname"]) +# self.person_landline_number.setText(info["an_festnetz"]) +# self.person_mobile_number.setText(info["an_mobil"]) +# self.person_email.setText(info["an_mail"]) +# self.person_funktion.setText(info["an_position"]) - def clear_autofilled_fields(self) -> None: - self.company_search_input.clear() - self.person_search_input.clear() - for field in self.autofilled_fields: - field.clear() +# def clear_autofilled_fields(self) -> None: +# self.company_search_input.clear() +# self.person_search_input.clear() +# for field in self.autofilled_fields: +# field.clear() - def update_company_data(self) -> None: - self.clear_autofilled_fields() - search_items = QStandardItemModel() - search_choices = be_init_rec.comp_search_choices() - for item, db_index in search_choices: - qitem = QStandardItem(item) - qitem.setData(db_index, Qt.ItemDataRole.UserRole) - search_items.appendRow(qitem) +# def update_company_data(self) -> None: +# self.clear_autofilled_fields() +# search_items = QStandardItemModel() +# search_choices = be_init_rec.comp_search_choices() +# for item, db_index in search_choices: +# qitem = QStandardItem(item) +# qitem.setData(db_index, Qt.ItemDataRole.UserRole) +# search_items.appendRow(qitem) - self.company_search_completer.setModel(search_items) +# self.company_search_completer.setModel(search_items) - def update_person_data( - self, - ma_id: int | None, - ) -> None: - self.clear_autofilled_fields() - search_choices = be_init_rec.contact_person_search_choices(ma_id, True) - for item, db_index in search_choices: - self.person_search_input.addItem(item, db_index) - self.person_search_input.setCurrentIndex(0) +# def update_person_data( +# self, +# ma_id: int | None, +# ) -> None: +# self.clear_autofilled_fields() +# search_choices = be_init_rec.contact_person_search_choices(ma_id, True) +# for item, db_index in search_choices: +# self.person_search_input.addItem(item, db_index) +# self.person_search_input.setCurrentIndex(0) - def _selected_company_on_completer( - self, - index: QModelIndex, - ) -> None: - ma_id = index.data(Qt.ItemDataRole.UserRole) - comp_info = be_init_rec.comp_search_get_info( - ma_id=ma_id, - ) - self.company_search_input.setProperty(self.PROPERTY_MA_ID, ma_id) - self.fill_out_company(comp_info) - # self.company_selected.emit(ma_id) - self.update_person_data(ma_id) +# def _selected_company_on_completer( +# self, +# index: QModelIndex, +# ) -> None: +# ma_id = index.data(Qt.ItemDataRole.UserRole) +# comp_info = be_init_rec.comp_search_get_info( +# ma_id=ma_id, +# ) +# self.company_search_input.setProperty(self.PROPERTY_MA_ID, ma_id) +# self.fill_out_company(comp_info) +# # self.company_selected.emit(ma_id) +# self.update_person_data(ma_id) - def _selected_person_on_completer( - self, - index: int, - ): - an_id = self.person_search_input.itemData(index) - comp_info = be_init_rec.contact_person_search_get_info( - an_id=an_id, - ) - self.fill_out(comp_info) +# def _selected_person_on_completer( +# self, +# index: int, +# ): +# an_id = self.person_search_input.itemData(index) +# comp_info = be_init_rec.contact_person_search_get_info( +# an_id=an_id, +# ) +# self.fill_out(comp_info) - def _search_company_change_manually( - self, - _: str, - ) -> None: - self.company_search_input.setProperty(self.PROPERTY_MA_ID, -1) +# def _search_company_change_manually( +# self, +# _: str, +# ) -> None: +# self.company_search_input.setProperty(self.PROPERTY_MA_ID, -1) - def get_form_data(self) -> CompanyForm_Search_Data: - ma_id = self.company_search_input.property(self.PROPERTY_MA_ID) - self.export_data["ma_id"] = ma_id +# def get_form_data(self) -> CompanyForm_Search_Data: +# ma_id = self.company_search_input.property(self.PROPERTY_MA_ID) +# self.export_data["ma_id"] = ma_id - return self.export_data +# return self.export_data - def set_form_data( - self, - ma_id: int, - ) -> None: - comp_info = be_init_rec.comp_search_get_info( - ma_id=ma_id, - ) - self.company_search_input.setText(comp_info["ma_unternehmensname"]) - self.fill_out_company(comp_info) - # self.company_selected.emit(ma_id) +# def set_form_data( +# self, +# ma_id: int, +# ) -> None: +# comp_info = be_init_rec.comp_search_get_info( +# ma_id=ma_id, +# ) +# self.company_search_input.setText(comp_info["ma_unternehmensname"]) +# self.fill_out_company(comp_info) +# # self.company_selected.emit(ma_id) -FORM_FIELDS_SEARCH_HEAD = [ - FormField( - "Suche", - FormFieldType.TEXT_SEARCH, - required=False, - key="kontaktliste_un_suche", - ), - FormField( - "Name Unternehmen/Netzwerkpartner", - FormFieldType.TEXT, - required=False, - key="kontaktliste_un_name", - readonly=True, - info="ma_unternehmensname", - ), - FormField( - "Straße", - FormFieldType.TEXT, - required=False, - key="kontaktliste_un_straße", - readonly=True, - info="ma_strasse", - ), - FormField( - "Hausnummer", - FormFieldType.TEXT, - required=False, - key="kontaktliste_un_hausnummer", - readonly=True, - info="ma_hausnummer", - ), - FormField( - "PLZ", - FormFieldType.TEXT, - required=False, - key="kontaktliste_un_PLZ", - readonly=True, - info="ma_plz", - ), - FormField( - "Ort", - FormFieldType.TEXT, - required=False, - key="kontaktliste_un_ort", - readonly=True, - info="ma_ort", - ), - FormField( - "Suche Ansprechpartner", - FormFieldType.EXTENDED_DROPDOWN, - required=False, - key="kontaktliste_person_suche", - info="ma_ort", - ), - FormField( - "Titel", - FormFieldType.TEXT, - required=False, - key="kontaktliste_person_titel", - readonly=True, - info="an_titel", - ), - FormField( - "Anrede", - FormFieldType.TEXT, - required=False, - key="kontaktliste_person_anrede", - readonly=True, - info="an_anrede", - ), - FormField( - "Name", - FormFieldType.TEXT, - required=False, - key="kontaktliste_person_name", - readonly=True, - info="an_nachname", - ), - FormField( - "Vorname", - FormFieldType.TEXT, - required=False, - key="kontaktliste_person_vorname", - readonly=True, - info="an_vorname", - ), - FormField( - "Telefon", - FormFieldType.TEXT, - required=False, - key="kontaktliste_person_telefon", - readonly=True, - info="an_festnetz", - ), - FormField( - "Mobil", - FormFieldType.TEXT, - required=False, - key="kontaktliste_person_mobilfunk", - readonly=True, - info="an_mobil", - ), - FormField( - "E-Mail", - FormFieldType.TEXT, - required=False, - key="kontaktliste_person_email", - readonly=True, - info="an_mail", - ), - FormField( - "Funktion im Unternehmen", - FormFieldType.TEXT, - required=False, - key="kontaktliste_person_funktion", - readonly=True, - info="an_position", - ), - FormField( - "Wie sind Sie auf uns aufmerksam geworden?", - FormFieldType.DROPDOWN, - required=False, - key="kontaktliste_kanal_aufmerksamkeit", - options=[ - ("Agentur für Arbeit", None), - ("Ausländerbehörde", None), - ("Jobcenter", None), - ("Freunde/Familie", None), - ("Anerkennungsstelle", None), - ("Beratungsstelle", None), - ("Internet", None), - ("Arbeitgeber", None), - ("Bildungsdienstleister", None), - ("Welcome-Mappe", None), - ("Newsletter WFE", None), - ("Newsletter RM", None), - ("Sonstiges", None), - ], - ), -] - - -class Grunderfassung_Suche_new(QWidget): +class Grunderfassung_Suche(CustomWidget): def __init__( self, form_fields: Sequence[FormField], label: str = "Suche", prefix: str = "", ): - super().__init__() + super().__init__( + form_fields=form_fields, + label=label, + prefix=prefix, + ) self.form_fields = form_fields self.label = label self.prefix = prefix self.widget_registry: WidgetRegistry = {} - self.export_data: CompanyForm_Search_Data = {"ma_id": -1} + self.export_data: dict[str, Any] = {} self.PROPERTY_MA_ID = "user_ma_id" main_layout = QVBoxLayout(self) @@ -1428,6 +1341,11 @@ class Grunderfassung_Suche_new(QWidget): self._selected_person_on_completer ) # self.company_search_completer = self.company_search_input.completer() + lookup = search_widgets_by_key( + self.widget_registry, "kontaktliste_kanal_aufmerksamkeit" + ) + assert len(lookup) == 1 + self.channel_awareness = lookup[0] self.company_widgets: dict[str, QWidget] = {} self.person_widgets: dict[str, QWidget] = {} @@ -1464,6 +1382,12 @@ class Grunderfassung_Suche_new(QWidget): button = QPushButton("Reset form") button.clicked.connect(self.reset_form) main_layout.addWidget(button) + button = QPushButton("Get form data") + button.clicked.connect(self.get_form_data) + main_layout.addWidget(button) + button = QPushButton("Set form data") + button.clicked.connect(self.set_form_data) + main_layout.addWidget(button) self.update_company_data() @@ -1498,11 +1422,6 @@ class Grunderfassung_Suche_new(QWidget): ) set_widget_value(widget, data[key]) - def reset_form(self) -> None: - reset_form(self.widget_registry) - self._clear_company_fields() - self._clear_person_fields() - def _clear_company_fields(self) -> None: for widget in self.company_widgets.values(): widget = cast(QLineEdit, widget) @@ -1571,22 +1490,63 @@ class Grunderfassung_Suche_new(QWidget): ) -> None: self.company_search_input.setProperty(self.PROPERTY_MA_ID, -1) - def get_form_data(self) -> CompanyForm_Search_Data: + @override + def reset_form(self) -> None: + reset_form(self.widget_registry) + self._clear_company_fields() + self._clear_person_fields() + + @override + def validate_form_data(self) -> list[str]: + return validate_form_data(self.widget_registry) + + @override + def get_form_data(self) -> dict[str, Any]: # TODO decide if value is checked here or later in the Pydantic validation + raw_data = get_form_data(self.widget_registry) ma_id = self.company_search_input.property(self.PROPERTY_MA_ID) + # index = self.person_search_input.currentIndex() + an_id = self.person_search_input.currentData() self.export_data["ma_id"] = ma_id + self.export_data["an_id"] = an_id + widget = cast(QComboBox, self.channel_awareness["widget"]) + self.export_data[self.channel_awareness["form_field"].key] = widget.currentData() + + print("raw_data:\n") + pprint(raw_data) + + print("\nExport data:") + pprint(self.export_data) return self.export_data - # def set_form_data( - # self, - # ma_id: int, - # ) -> None: - # comp_info = be_init_rec.comp_search_get_info( - # ma_id=ma_id, - # ) - # self.company_search_input.setText(comp_info["ma_unternehmensname"]) - # self.fill_out_company(comp_info) + @override + def set_form_data( + self, + data: dict[str, Any], + ) -> None: + if not self.export_data: + raise RuntimeError() + data = self.export_data + ma_id = data["ma_id"] + comp_info = be_init_rec.comp_search_get_info( + ma_id=data["ma_id"], + ) + self.company_search_input.setText(comp_info["ma_unternehmensname"]) + self.fill_out_company(comp_info) + self.update_person_data(ma_id) + an_id = data["an_id"] + pers_info = be_init_rec.contact_person_search_get_info( + an_id=an_id, + ) + index = self.person_search_input.findData(an_id) + if index < 0: + raise IndexError("Data for person search was not found") + self.person_search_input.setCurrentIndex(index) + self.fill_out_person(pers_info) + widget = cast(QComboBox, self.channel_awareness["widget"]) + value = data[self.channel_awareness["form_field"].key] + set_widget_value(widget, value) class ContactPersonForm_Search(QWidget): @@ -1742,594 +1702,6 @@ def search_widgets_by_key( return hits -FORM_FIELDS_CONTACT_PERSON = [ - FormField( - "Name Unternehmen/Netzwerkpartner (pre-filled von Suche)", - FormFieldType.TEXT, - key="KP_name_partner", - required=False, - placeholder="Text wird nach gewähltem Unternehmen angezeigt", - readonly=True, - ), - FormField( - "Titel", - FormFieldType.TEXT, - key="KP_titel", - required=False, - tooltip=( - "* nur wenn anrufende Person oder kontaktaufnehmende Person " - "nicht die zu beratende Person ist" - ), - ), - FormField( - "Anrede_Anschrift", - FormFieldType.TEXT, - key="KP_anrede_anschrift", - required=True, - ), - FormField( - "Name", - FormFieldType.TEXT, - key="KP_name", - required=True, - ), - FormField( - "Vorname", - FormFieldType.TEXT, - key="KP_vorname", - required=False, - ), - FormField( - "Festnetznummer", - FormFieldType.TEXT, - key="KP_festnetznummer", - required=False, - ), - FormField( - "Mobilfunknummer", - FormFieldType.TEXT, - key="KP_mobilfunknummer", - required=False, - ), - FormField( - "E-Mail", - FormFieldType.TEXT, - key="KP_email", - required=False, - ), - FormField( - "Funktion/Beziehung zur beratenden Person", - FormFieldType.TEXT, - key="KP_funktion_beziehung", - required=False, - ), - FormField( - "Adresse", - FormFieldType.LONGTEXT, - key="KP_adresse", - required=False, - ), -] - -FORM_FIELDS_MASTER_DATA = [ - FormField( - "Titel", - FormFieldType.TEXT, - key="Stammdaten_titel", - required=False, - tooltip=( - "* nur wenn anrufende Person oder kontaktaufnehmende Person " - "nicht die zu beratende Person ist" - ), - ), - FormField( - "Anrede", - FormFieldType.TEXT, - key="Stammdaten_anrede_anschrift", - required=True, - ), - FormField( - "Name", - FormFieldType.TEXT, - key="Stammdaten_name", - required=True, - ), - FormField( - "Vorname", - FormFieldType.TEXT, - key="Stammdaten_vorname", - required=False, - ), - FormField( - "Geburtsdatum", - FormFieldType.DATE, - key="Stammdaten_geburtsdatum", - required=False, - tooltip=( - "* Wichtig zu erfragen, da u.a. Mindestgehaltsschwelle davon abhängt " - "(Regelung bei Ü45 Jahre)" - ), - ), - FormField( - "Herkunftsland", - FormFieldType.EXTENDED_DROPDOWN, - key="Stammdaten_herkunftsland", - required=True, - placeholder="Suche...", - options=COUNTRY_LIST.for_dropdown, - tooltip=("* Wichtig zu erfragen aufgrund eventueller EU-Freizügigkeitsregelung"), - ), - FormField( - "Staatsangehörigkeit", - FormFieldType.EXTENDED_DROPDOWN, - key="Stammdaten_staatsangehoerigkeit", - required=False, - placeholder="Suche...", - options=COUNTRY_LIST.for_dropdown, - tooltip=("* Wichtig zu erfragen aufgrund eventueller EU-Freizügigkeitsregelung"), - ), - FormField( - "Rückkehrer", - FormFieldType.DROPDOWN, - key="Stammdaten_rueckkehrer", - required=False, - options=[("ja", None), ("nein", None)], - tooltip=("* Wichtig zu erfragen aufgrund eventueller EU-Freizügigkeitsregelung"), - ), - FormField( - "Wo befindet sich die Person?", - FormFieldType.DROPDOWN, - key="Stammdaten_aufenthaltsort", - required=True, - options=[("Inland", None), ("Ausland EU/EWR", None), ("Ausland Drittstaat", None)], - ), - FormField( - "Straße", - FormFieldType.TEXT, - key="Stammdaten_strasse", - required=False, - ), - FormField( - "Hausnummer", - FormFieldType.TEXT, - key="Stammdaten_hausnummer", - required=False, - ), - FormField( - "PLZ", - FormFieldType.TEXT, - key="Stammdaten_PLZ", - required=False, - ), - FormField( - "Ort", - FormFieldType.TEXT, - key="Stammdaten_ort", - required=False, - ), - FormField( - "Bundesland", - FormFieldType.DROPDOWN, - key="Stammdaten_bundesland", - required=False, - options=GERMAN_STATE_LIST.for_dropdown, - tooltip=( - "nur wenn Inland angegeben und die Angabe zieht es in keine Dokumente " - "rüber! Liste Bundesländer verwenden" - ), - ), - FormField( - "Land", - FormFieldType.EXTENDED_DROPDOWN, - key="Stammdaten_land", - required=False, - placeholder="Suche...", - options=COUNTRY_LIST.for_dropdown, - ), - FormField( - "Festnetznummer", - FormFieldType.TEXT, - key="Stammdaten_festnetznummer", - required=False, - ), - FormField( - "Mobilfunknummer", - FormFieldType.TEXT, - key="Stammdaten_mobilfunknummer", - required=False, - ), - FormField( - "E-Mail", - FormFieldType.TEXT, - key="Stammdaten_email", - required=False, - ), - FormField( - "Familienstand", - FormFieldType.TEXT, - key="Stammdaten_familienstand", - required=False, - tooltip="* Wichtig zu erfragen aufgrund Lebensunterhaltssicherung", - ), - FormField( - "Anzahl Kinder", - FormFieldType.DYNAMIC_DROPDOWN, - required=False, - tooltip="* Wichtig zu erfragen aufgrund Lebensunterhaltssicherung", - key="Stammdaten_anzahl_kinder", - children=[ - FormField( - "Anzahl Kinder", - FormFieldType.DROPDOWN, - required=False, - options=[(str(x), None) for x in range(11)], - tooltip="* Wichtig zu erfragen aufgrund Lebensunterhaltssicherung", - key="anzahl", - children=[ - FormField("Alter Kind", FormFieldType.TEXT, key="alter"), - ], - ), - ], - ), -] - -FORM_FIELDS_ADDITIONAL_DATA = [ - FormField( - "Deutsch als Kommunikationssprache", - FormFieldType.DROPDOWN, - required=False, - key="WI_deutsch_sprache", - options=[ - ("nein", None), - ("ja, als Muttersprache", None), - ("ja, als Fremdsprache", None), - ], - ), - FormField( - "Aufenthaltstitel", - FormFieldType.DROPDOWN, - required=False, - key="WI_aufenthaltstitel", - options=[ - ("anerkannter Flüchtling §§ 22 - 26 AufenthG", None), - ("Aufenthaltsgestattung §55 AufenthG", None), - ("Blaue Karte EU § 18g AufenthG", None), - ("BüMA (Bescheinigung über Meldung als Asylsuchender)", None), - ("Duldung § 60 AufenthG", None), - ("bisher kein Aufenthaltstitel", None), - ("Deutscher", None), - ("familiäre Gründe §§ 27 - 36 AufenthG", None), - ("Niederlassungserlaubnis §9 AufenthG", None), - ("Staatsbürger EUR/EWR/CH", None), - ("Aufenthalt für Ausbildung §§ 16 - 17 AufenthG", None), - ("Aufenthalt für Erwerbstätigkeit §§ 18- 21 AufenthG", None), - ("Chancenaufenthaltsrecht §104c AufenthG", None), - ("Sonstiges", None), - ], - tooltip="sofern nicht bekannt, unbedingt einfordern", - ), - FormField( - "Gültigkeit Aufenthaltsstatus", - FormFieldType.DATE, - required=False, - key="WI_gueltigkeit_aufenthaltstitel", - ), - FormField( - "Arbeitsstatus aktuell", - FormFieldType.DROPDOWN, - required=False, - key="WI_arbeitsstatus", - options=[ - ("Arbeitslos", None), - ("Ausbildung/Qualifizierung Inland", None), - ("geringfügig beschäftigt", None), - ("in Anstellung Inland", None), - ("selbstständig Inland", None), - ("Ausbildung/Qualifizierung Ausland", None), - ("in Anstellung Ausland", None), - ("selbstständig Ausland", None), - ], - ), - FormField( - "Gemeldet bei Institutionen ", - FormFieldType.DROPDOWN, - required=False, - key="WI_meldung_institution", - options=[ - ("bei keiner", None), - ("Jobcenter mit Leistungsbezug", None), - ("Jobcenter ohne Leistungsbezug", None), - ("Sozialamt mit Leistungsbezug", None), - ("Sozialamt ohne Leistungsbezug", None), - ("Agentur für Arbeit mit Leistungsbezug", None), - ("Agentur für Arbeit ohne Leistungsbezug", None), - ], - ), -] - -FORM_FIELDS_SCHOOL = [ - FormField("Abschluss", FormFieldType.TEXT, required=False, key="SB_abschluss"), - FormField( - "Abschlussgrad laut Dokument", - FormFieldType.TEXT, - required=False, - key="SB_abschlussgrad", - ), - FormField( - "Schule", - FormFieldType.TEXT, - required=False, - key="SB_schule", - ), - FormField( - "Ort", - FormFieldType.TEXT, - required=False, - key="SB_ort", - ), - FormField( - "Land", - FormFieldType.EXTENDED_DROPDOWN, - key="SB_land", - required=False, - placeholder="Suche...", - options=COUNTRY_LIST.for_dropdown, - ), - FormField("Abschlussjahr", FormFieldType.TEXT, required=False, key="SB_abschlussjahr"), - FormField( - "Bemerkungsfeld", - FormFieldType.TEXT, - required=False, - key="SB_bemerkungsfeld", - ), -] - -FORM_FIELDS_HIGHER_EDUCATION = [ - FormField( - "Anerkennung", - FormFieldType.TEXT, - required=False, - key="HB_anerkennung", - ), - FormField( - "Abschlussgrad", - FormFieldType.TEXT, - required=False, - key="HB_abschlussgrad", - tooltip=( - "bitte den Titel eingeben z.B. Doktor, Diplom oder " - "Betriebswirt (Fachschulabschluss)" - ), - ), - FormField( - "Abschlussgrad laut Dokument", - FormFieldType.TEXT, - required=False, - key="HB_abschlussgrad_dokument", - ), - FormField( - "Hochschule / Ausbildungsbetrieb / Berufsschule", - FormFieldType.TEXT, - required=False, - key="HB_organisation", - ), - FormField( - "Beruf / Fachrichtung", - FormFieldType.TEXT, - required=False, - key="HB_beruf", - tooltip=( - "bitte spezifizieren z.B. Allgemeinmedizin, Ingenieur Maschinenbau, " - "technischer Betriebswirt Datenverarbeitung" - ), - ), - FormField( - "Land", - FormFieldType.EXTENDED_DROPDOWN, - key="HB_land", - required=False, - placeholder="Suche...", - options=COUNTRY_LIST.for_dropdown, - ), - FormField( - "Ort", - FormFieldType.TEXT, - required=False, - key="HB_ort", - ), - FormField( - "Abschlussjahr", - FormFieldType.TEXT, - required=False, - key="HB_abschlussjahr", - ), - FormField( - "Bemerkungsfeld", - FormFieldType.TEXT, - required=False, - key="HB_bemerkungsfeld", - tooltip="z.B. Promotionen oder den Studiengang angeben", - ), -] - -FORM_FIELDS_WORK_EXPERIENCE = [ - FormField( - "Branche", - FormFieldType.DROPDOWN, - required=False, - key="AE_branche", - options=[("DROPDOWN-LISTE AN ANDERER STELLE DEFINIERT", None)], - ), - FormField( - "Berufsbezeichnung/Tätigkeit", - FormFieldType.TEXT, - required=False, - key="AE_bezeichnung", - ), - FormField( - "Funktion", - FormFieldType.DROPDOWN, - required=False, - key="AE_funktion", - options=[ - ("Auszubildender", None), - ("Fachkraft", None), - ("Hilfskraft", None), - ("Akademiker", None), - ("Führungskraft", None), - ("Praktikant", None), - ("FSJ/BFD", None), - ("Elternzeit", None), - ("Sabbatical", None), - ("Sonstiges", None), - ], - ), - FormField( - "Unternehmen", - FormFieldType.TEXT, - required=False, - key="AE_unternehmen", - ), - FormField( - "Land", - FormFieldType.EXTENDED_DROPDOWN, - key="AE_land", - required=False, - placeholder="Suche...", - options=COUNTRY_LIST.for_dropdown, - ), - FormField( - "Zeitspanne (von ... bis ...)", - FormFieldType.TEXT, - required=False, - key="AE_zeitspanne", - ), - FormField( - "Beschäftsigungsart", - FormFieldType.DROPDOWN, - required=False, - key="AE_beschaeftigungsart", - options=[ - ("Vollzeit", None), - ("Teilzeit", None), - ("Sonstiges", None), - ], - tooltip="Minijob, Praktikum, Wehrdienst, soziale Dienste", - ), - FormField( - "Bemerkungsfeld", - FormFieldType.TEXT, - required=False, - key="AE_bemerkungsfeld", - ), -] - -FORM_FIELDS_LANGUAGES = [ - FormField( - "Sprache", - FormFieldType.TEXT, - required=False, - key="SP_sprache", - ), - FormField( - "Niveau", - FormFieldType.DROPDOWN, - required=False, - key="SP_niveau", - options=[ - ("A1", None), - ("A2", None), - ("B1", None), - ("B2", None), - ("C1", None), - ("C2", None), - ], - ), - FormField( - "Nachweis", - FormFieldType.DROPDOWN, - required=False, - key="SP_nachweis", - options=[ - ("vorhanden", None), - ("nicht vorhanden", None), - ], - ), - FormField( - "Art des Nachweises (NUR WENN VORHANDEN)", - FormFieldType.TEXT, - required=False, - key="SP_art_nachweis", - ), - FormField( - "Datum des Nachweises (NUR WENN VORHANDEN)", - FormFieldType.DATE, - required=False, - key="SP_datum_nachweis", - ), -] - - -FORM_FIELDS = [ - FormField( - "Status && Projektrelevanz", - FormFieldType.GROUP, - key="Projektrelevanz", - children=[ - FormField( - "Projektrelevanz", - FormFieldType.DROPDOWN, - key="Projektrelevanz_relevanz", - required=True, - options=[("ja", None), ("nein", None)], - ), - ], - ), - FormField( - "Daten Kontaktperson", - FormFieldType.GROUP, - key="Kontaktperson", - children=FORM_FIELDS_CONTACT_PERSON, - ), - FormField( - "Stammdaten", - FormFieldType.GROUP, - key="Stammdaten", - children=FORM_FIELDS_MASTER_DATA, - ), - FormField( - "Weitere Informationen", - FormFieldType.GROUP, - key="WeitereInfos", - children=FORM_FIELDS_ADDITIONAL_DATA, - ), - FormField( - "Schulbildung", - FormFieldType.DYNAMIC_LIST, - children=FORM_FIELDS_SCHOOL, - key="Schulbildung", - ), - FormField( - "Studium/Ausbildung", - FormFieldType.DYNAMIC_LIST, - children=FORM_FIELDS_HIGHER_EDUCATION, - key="HoehereBildung", - ), - FormField( - "Arbeitserfahrung", - FormFieldType.DYNAMIC_LIST, - children=FORM_FIELDS_WORK_EXPERIENCE, - key="Arbeitserfahrung", - ), - FormField( - "Sprachkenntnisse", - FormFieldType.DYNAMIC_LIST, - children=FORM_FIELDS_LANGUAGES, - key="Sprachkenntnisse", - ), -] - - class AutoForm(QWidget): def __init__( self, @@ -3085,6 +2457,748 @@ class NewEntrySelect_view(QWidget): # ) +CUSTOM_WIDGETS: Final[dict[str, type[CustomWidget]]] = { + "grunderfassung_suche": Grunderfassung_Suche, +} + + +FORM_FIELDS_SEARCH_HEAD = [ + FormField( + "Suche", + FormFieldType.TEXT_SEARCH, + required=False, + key="kontaktliste_un_suche", + ), + FormField( + "Name Unternehmen/Netzwerkpartner", + FormFieldType.TEXT, + required=False, + key="kontaktliste_un_name", + readonly=True, + info="ma_unternehmensname", + ), + FormField( + "Straße", + FormFieldType.TEXT, + required=False, + key="kontaktliste_un_straße", + readonly=True, + info="ma_strasse", + ), + FormField( + "Hausnummer", + FormFieldType.TEXT, + required=False, + key="kontaktliste_un_hausnummer", + readonly=True, + info="ma_hausnummer", + ), + FormField( + "PLZ", + FormFieldType.TEXT, + required=False, + key="kontaktliste_un_PLZ", + readonly=True, + info="ma_plz", + ), + FormField( + "Ort", + FormFieldType.TEXT, + required=False, + key="kontaktliste_un_ort", + readonly=True, + info="ma_ort", + ), + FormField( + "Suche Ansprechpartner", + FormFieldType.EXTENDED_DROPDOWN, + required=False, + key="kontaktliste_person_suche", + info="ma_ort", + ), + FormField( + "Titel", + FormFieldType.TEXT, + required=False, + key="kontaktliste_person_titel", + readonly=True, + info="an_titel", + ), + FormField( + "Anrede", + FormFieldType.TEXT, + required=False, + key="kontaktliste_person_anrede", + readonly=True, + info="an_anrede", + ), + FormField( + "Name", + FormFieldType.TEXT, + required=False, + key="kontaktliste_person_name", + readonly=True, + info="an_nachname", + ), + FormField( + "Vorname", + FormFieldType.TEXT, + required=False, + key="kontaktliste_person_vorname", + readonly=True, + info="an_vorname", + ), + FormField( + "Telefon", + FormFieldType.TEXT, + required=False, + key="kontaktliste_person_telefon", + readonly=True, + info="an_festnetz", + ), + FormField( + "Mobil", + FormFieldType.TEXT, + required=False, + key="kontaktliste_person_mobilfunk", + readonly=True, + info="an_mobil", + ), + FormField( + "E-Mail", + FormFieldType.TEXT, + required=False, + key="kontaktliste_person_email", + readonly=True, + info="an_mail", + ), + FormField( + "Funktion im Unternehmen", + FormFieldType.TEXT, + required=False, + key="kontaktliste_person_funktion", + readonly=True, + info="an_position", + ), + FormField( + "Wie sind Sie auf uns aufmerksam geworden?", + FormFieldType.DROPDOWN, + required=False, + key="kontaktliste_kanal_aufmerksamkeit", + options=[ + ("Agentur für Arbeit", None), + ("Ausländerbehörde", None), + ("Jobcenter", None), + ("Freunde/Familie", None), + ("Anerkennungsstelle", None), + ("Beratungsstelle", None), + ("Internet", None), + ("Arbeitgeber", None), + ("Bildungsdienstleister", None), + ("Welcome-Mappe", None), + ("Newsletter WFE", None), + ("Newsletter RM", None), + ("Sonstiges", None), + ], + ), +] + + +FORM_FIELDS_CONTACT_PERSON = [ + FormField( + "Name Unternehmen/Netzwerkpartner (pre-filled von Suche)", + FormFieldType.TEXT, + key="KP_name_partner", + required=False, + placeholder="Text wird nach gewähltem Unternehmen angezeigt", + readonly=True, + ), + FormField( + "Titel", + FormFieldType.TEXT, + key="KP_titel", + required=False, + tooltip=( + "* nur wenn anrufende Person oder kontaktaufnehmende Person " + "nicht die zu beratende Person ist" + ), + ), + FormField( + "Anrede_Anschrift", + FormFieldType.TEXT, + key="KP_anrede_anschrift", + required=True, + ), + FormField( + "Name", + FormFieldType.TEXT, + key="KP_name", + required=True, + ), + FormField( + "Vorname", + FormFieldType.TEXT, + key="KP_vorname", + required=False, + ), + FormField( + "Festnetznummer", + FormFieldType.TEXT, + key="KP_festnetznummer", + required=False, + ), + FormField( + "Mobilfunknummer", + FormFieldType.TEXT, + key="KP_mobilfunknummer", + required=False, + ), + FormField( + "E-Mail", + FormFieldType.TEXT, + key="KP_email", + required=False, + ), + FormField( + "Funktion/Beziehung zur beratenden Person", + FormFieldType.TEXT, + key="KP_funktion_beziehung", + required=False, + ), + FormField( + "Adresse", + FormFieldType.LONGTEXT, + key="KP_adresse", + required=False, + ), +] + +FORM_FIELDS_MASTER_DATA = [ + FormField( + "Titel", + FormFieldType.TEXT, + key="Stammdaten_titel", + required=False, + tooltip=( + "* nur wenn anrufende Person oder kontaktaufnehmende Person " + "nicht die zu beratende Person ist" + ), + ), + FormField( + "Anrede", + FormFieldType.TEXT, + key="Stammdaten_anrede_anschrift", + required=True, + ), + FormField( + "Name", + FormFieldType.TEXT, + key="Stammdaten_name", + required=True, + ), + FormField( + "Vorname", + FormFieldType.TEXT, + key="Stammdaten_vorname", + required=False, + ), + FormField( + "Geburtsdatum", + FormFieldType.DATE, + key="Stammdaten_geburtsdatum", + required=False, + tooltip=( + "* Wichtig zu erfragen, da u.a. Mindestgehaltsschwelle davon abhängt " + "(Regelung bei Ü45 Jahre)" + ), + ), + FormField( + "Herkunftsland", + FormFieldType.EXTENDED_DROPDOWN, + key="Stammdaten_herkunftsland", + required=True, + placeholder="Suche...", + options=COUNTRY_LIST.for_dropdown, + tooltip=("* Wichtig zu erfragen aufgrund eventueller EU-Freizügigkeitsregelung"), + ), + FormField( + "Staatsangehörigkeit", + FormFieldType.EXTENDED_DROPDOWN, + key="Stammdaten_staatsangehoerigkeit", + required=False, + placeholder="Suche...", + options=COUNTRY_LIST.for_dropdown, + tooltip=("* Wichtig zu erfragen aufgrund eventueller EU-Freizügigkeitsregelung"), + ), + FormField( + "Rückkehrer", + FormFieldType.DROPDOWN, + key="Stammdaten_rueckkehrer", + required=False, + options=[("ja", None), ("nein", None)], + tooltip=("* Wichtig zu erfragen aufgrund eventueller EU-Freizügigkeitsregelung"), + ), + FormField( + "Wo befindet sich die Person?", + FormFieldType.DROPDOWN, + key="Stammdaten_aufenthaltsort", + required=True, + options=[("Inland", None), ("Ausland EU/EWR", None), ("Ausland Drittstaat", None)], + ), + FormField( + "Straße", + FormFieldType.TEXT, + key="Stammdaten_strasse", + required=False, + ), + FormField( + "Hausnummer", + FormFieldType.TEXT, + key="Stammdaten_hausnummer", + required=False, + ), + FormField( + "PLZ", + FormFieldType.TEXT, + key="Stammdaten_PLZ", + required=False, + ), + FormField( + "Ort", + FormFieldType.TEXT, + key="Stammdaten_ort", + required=False, + ), + FormField( + "Bundesland", + FormFieldType.DROPDOWN, + key="Stammdaten_bundesland", + required=False, + options=GERMAN_STATE_LIST.for_dropdown, + tooltip=( + "nur wenn Inland angegeben und die Angabe zieht es in keine Dokumente " + "rüber! Liste Bundesländer verwenden" + ), + ), + FormField( + "Land", + FormFieldType.EXTENDED_DROPDOWN, + key="Stammdaten_land", + required=False, + placeholder="Suche...", + options=COUNTRY_LIST.for_dropdown, + ), + FormField( + "Festnetznummer", + FormFieldType.TEXT, + key="Stammdaten_festnetznummer", + required=False, + ), + FormField( + "Mobilfunknummer", + FormFieldType.TEXT, + key="Stammdaten_mobilfunknummer", + required=False, + ), + FormField( + "E-Mail", + FormFieldType.TEXT, + key="Stammdaten_email", + required=False, + ), + FormField( + "Familienstand", + FormFieldType.TEXT, + key="Stammdaten_familienstand", + required=False, + tooltip="* Wichtig zu erfragen aufgrund Lebensunterhaltssicherung", + ), + FormField( + "Anzahl Kinder", + FormFieldType.DYNAMIC_DROPDOWN, + required=False, + tooltip="* Wichtig zu erfragen aufgrund Lebensunterhaltssicherung", + key="Stammdaten_anzahl_kinder", + children=[ + FormField( + "Anzahl Kinder", + FormFieldType.DROPDOWN, + required=False, + options=[(str(x), None) for x in range(11)], + tooltip="* Wichtig zu erfragen aufgrund Lebensunterhaltssicherung", + key="anzahl", + children=[ + FormField("Alter Kind", FormFieldType.TEXT, key="alter"), + ], + ), + ], + ), +] + +FORM_FIELDS_ADDITIONAL_DATA = [ + FormField( + "Deutsch als Kommunikationssprache", + FormFieldType.DROPDOWN, + required=False, + key="WI_deutsch_sprache", + options=[ + ("nein", None), + ("ja, als Muttersprache", None), + ("ja, als Fremdsprache", None), + ], + ), + FormField( + "Aufenthaltstitel", + FormFieldType.DROPDOWN, + required=False, + key="WI_aufenthaltstitel", + options=[ + ("anerkannter Flüchtling §§ 22 - 26 AufenthG", None), + ("Aufenthaltsgestattung §55 AufenthG", None), + ("Blaue Karte EU § 18g AufenthG", None), + ("BüMA (Bescheinigung über Meldung als Asylsuchender)", None), + ("Duldung § 60 AufenthG", None), + ("bisher kein Aufenthaltstitel", None), + ("Deutscher", None), + ("familiäre Gründe §§ 27 - 36 AufenthG", None), + ("Niederlassungserlaubnis §9 AufenthG", None), + ("Staatsbürger EUR/EWR/CH", None), + ("Aufenthalt für Ausbildung §§ 16 - 17 AufenthG", None), + ("Aufenthalt für Erwerbstätigkeit §§ 18- 21 AufenthG", None), + ("Chancenaufenthaltsrecht §104c AufenthG", None), + ("Sonstiges", None), + ], + tooltip="sofern nicht bekannt, unbedingt einfordern", + ), + FormField( + "Gültigkeit Aufenthaltsstatus", + FormFieldType.DATE, + required=False, + key="WI_gueltigkeit_aufenthaltstitel", + ), + FormField( + "Arbeitsstatus aktuell", + FormFieldType.DROPDOWN, + required=False, + key="WI_arbeitsstatus", + options=[ + ("Arbeitslos", None), + ("Ausbildung/Qualifizierung Inland", None), + ("geringfügig beschäftigt", None), + ("in Anstellung Inland", None), + ("selbstständig Inland", None), + ("Ausbildung/Qualifizierung Ausland", None), + ("in Anstellung Ausland", None), + ("selbstständig Ausland", None), + ], + ), + FormField( + "Gemeldet bei Institutionen ", + FormFieldType.DROPDOWN, + required=False, + key="WI_meldung_institution", + options=[ + ("bei keiner", None), + ("Jobcenter mit Leistungsbezug", None), + ("Jobcenter ohne Leistungsbezug", None), + ("Sozialamt mit Leistungsbezug", None), + ("Sozialamt ohne Leistungsbezug", None), + ("Agentur für Arbeit mit Leistungsbezug", None), + ("Agentur für Arbeit ohne Leistungsbezug", None), + ], + ), +] + +FORM_FIELDS_SCHOOL = [ + FormField("Abschluss", FormFieldType.TEXT, required=False, key="SB_abschluss"), + FormField( + "Abschlussgrad laut Dokument", + FormFieldType.TEXT, + required=False, + key="SB_abschlussgrad", + ), + FormField( + "Schule", + FormFieldType.TEXT, + required=False, + key="SB_schule", + ), + FormField( + "Ort", + FormFieldType.TEXT, + required=False, + key="SB_ort", + ), + FormField( + "Land", + FormFieldType.EXTENDED_DROPDOWN, + key="SB_land", + required=False, + placeholder="Suche...", + options=COUNTRY_LIST.for_dropdown, + ), + FormField("Abschlussjahr", FormFieldType.TEXT, required=False, key="SB_abschlussjahr"), + FormField( + "Bemerkungsfeld", + FormFieldType.TEXT, + required=False, + key="SB_bemerkungsfeld", + ), +] + +FORM_FIELDS_HIGHER_EDUCATION = [ + FormField( + "Anerkennung", + FormFieldType.TEXT, + required=False, + key="HB_anerkennung", + ), + FormField( + "Abschlussgrad", + FormFieldType.TEXT, + required=False, + key="HB_abschlussgrad", + tooltip=( + "bitte den Titel eingeben z.B. Doktor, Diplom oder " + "Betriebswirt (Fachschulabschluss)" + ), + ), + FormField( + "Abschlussgrad laut Dokument", + FormFieldType.TEXT, + required=False, + key="HB_abschlussgrad_dokument", + ), + FormField( + "Hochschule / Ausbildungsbetrieb / Berufsschule", + FormFieldType.TEXT, + required=False, + key="HB_organisation", + ), + FormField( + "Beruf / Fachrichtung", + FormFieldType.TEXT, + required=False, + key="HB_beruf", + tooltip=( + "bitte spezifizieren z.B. Allgemeinmedizin, Ingenieur Maschinenbau, " + "technischer Betriebswirt Datenverarbeitung" + ), + ), + FormField( + "Land", + FormFieldType.EXTENDED_DROPDOWN, + key="HB_land", + required=False, + placeholder="Suche...", + options=COUNTRY_LIST.for_dropdown, + ), + FormField( + "Ort", + FormFieldType.TEXT, + required=False, + key="HB_ort", + ), + FormField( + "Abschlussjahr", + FormFieldType.TEXT, + required=False, + key="HB_abschlussjahr", + ), + FormField( + "Bemerkungsfeld", + FormFieldType.TEXT, + required=False, + key="HB_bemerkungsfeld", + tooltip="z.B. Promotionen oder den Studiengang angeben", + ), +] + +FORM_FIELDS_WORK_EXPERIENCE = [ + FormField( + "Branche", + FormFieldType.DROPDOWN, + required=False, + key="AE_branche", + options=[("DROPDOWN-LISTE AN ANDERER STELLE DEFINIERT", None)], + ), + FormField( + "Berufsbezeichnung/Tätigkeit", + FormFieldType.TEXT, + required=False, + key="AE_bezeichnung", + ), + FormField( + "Funktion", + FormFieldType.DROPDOWN, + required=False, + key="AE_funktion", + options=[ + ("Auszubildender", None), + ("Fachkraft", None), + ("Hilfskraft", None), + ("Akademiker", None), + ("Führungskraft", None), + ("Praktikant", None), + ("FSJ/BFD", None), + ("Elternzeit", None), + ("Sabbatical", None), + ("Sonstiges", None), + ], + ), + FormField( + "Unternehmen", + FormFieldType.TEXT, + required=False, + key="AE_unternehmen", + ), + FormField( + "Land", + FormFieldType.EXTENDED_DROPDOWN, + key="AE_land", + required=False, + placeholder="Suche...", + options=COUNTRY_LIST.for_dropdown, + ), + FormField( + "Zeitspanne (von ... bis ...)", + FormFieldType.TEXT, + required=False, + key="AE_zeitspanne", + ), + FormField( + "Beschäftsigungsart", + FormFieldType.DROPDOWN, + required=False, + key="AE_beschaeftigungsart", + options=[ + ("Vollzeit", None), + ("Teilzeit", None), + ("Sonstiges", None), + ], + tooltip="Minijob, Praktikum, Wehrdienst, soziale Dienste", + ), + FormField( + "Bemerkungsfeld", + FormFieldType.TEXT, + required=False, + key="AE_bemerkungsfeld", + ), +] + +FORM_FIELDS_LANGUAGES = [ + FormField( + "Sprache", + FormFieldType.TEXT, + required=False, + key="SP_sprache", + ), + FormField( + "Niveau", + FormFieldType.DROPDOWN, + required=False, + key="SP_niveau", + options=[ + ("A1", None), + ("A2", None), + ("B1", None), + ("B2", None), + ("C1", None), + ("C2", None), + ], + ), + FormField( + "Nachweis", + FormFieldType.DROPDOWN, + required=False, + key="SP_nachweis", + options=[ + ("vorhanden", None), + ("nicht vorhanden", None), + ], + ), + FormField( + "Art des Nachweises (NUR WENN VORHANDEN)", + FormFieldType.TEXT, + required=False, + key="SP_art_nachweis", + ), + FormField( + "Datum des Nachweises (NUR WENN VORHANDEN)", + FormFieldType.DATE, + required=False, + key="SP_datum_nachweis", + ), +] + + +FORM_FIELDS = [ + FormField( + "Suche", + FormFieldType.CUSTOM, + custom_widget="grunderfassung_suche", + key="grunderfassung_suche", + children=FORM_FIELDS_SEARCH_HEAD, + ), + FormField( + "Status && Projektrelevanz", + FormFieldType.GROUP, + key="Projektrelevanz", + children=[ + FormField( + "Projektrelevanz", + FormFieldType.DROPDOWN, + key="Projektrelevanz_relevanz", + required=True, + options=[("ja", None), ("nein", None)], + ), + ], + ), + FormField( + "Daten Kontaktperson", + FormFieldType.GROUP, + key="Kontaktperson", + children=FORM_FIELDS_CONTACT_PERSON, + ), + FormField( + "Stammdaten", + FormFieldType.GROUP, + key="Stammdaten", + children=FORM_FIELDS_MASTER_DATA, + ), + FormField( + "Weitere Informationen", + FormFieldType.GROUP, + key="WeitereInfos", + children=FORM_FIELDS_ADDITIONAL_DATA, + ), + FormField( + "Schulbildung", + FormFieldType.DYNAMIC_LIST, + children=FORM_FIELDS_SCHOOL, + key="Schulbildung", + ), + FormField( + "Studium/Ausbildung", + FormFieldType.DYNAMIC_LIST, + children=FORM_FIELDS_HIGHER_EDUCATION, + key="HoehereBildung", + ), + FormField( + "Arbeitserfahrung", + FormFieldType.DYNAMIC_LIST, + children=FORM_FIELDS_WORK_EXPERIENCE, + key="Arbeitserfahrung", + ), + FormField( + "Sprachkenntnisse", + FormFieldType.DYNAMIC_LIST, + children=FORM_FIELDS_LANGUAGES, + key="Sprachkenntnisse", + ), +] + + class SearchFormPage(QWidget): back_main_requested = Signal() # Signal für den Zurück-Button back_requested = Signal() # Signal für den Zurück-Button @@ -3184,7 +3298,7 @@ class SearchFormPage(QWidget): # --- SUCHE MIT NAMEN --- # self.company_search = Grunderfassung_Suche() - self.company_search = Grunderfassung_Suche_new(FORM_FIELDS_SEARCH_HEAD) + self.company_search = Grunderfassung_Suche(FORM_FIELDS_SEARCH_HEAD) container_layout.addWidget(self.company_search) # self.contact_person_search = ContactPersonForm_Search() # container_layout.addWidget(self.contact_person_search)