Compare commits

...

11 Commits

Author SHA256 Message Date
00e535bb13 Added Houseno inte ApplicantPersonalData 2025-01-23 15:57:02 +01:00
103b172a60 update datenbank.drawio 2025-01-22 16:53:57 +01:00
c2edfab9a2 Added importCountry 2025-01-22 16:52:49 +01:00
180f8e5ae9 Merge branch 'schnacke'
ADDCity
2025-01-21 17:04:14 +01:00
dab3df3b14 AddLocation 2025-01-21 17:04:02 +01:00
75dc64b4f3 AddLocation 2025-01-21 17:00:39 +01:00
afad232068 Corrected references in QML frames 2025-01-20 17:28:34 +01:00
d870736dab Knappschaft weg 2025-01-20 13:08:39 +01:00
fc197246a6 Some GUI modification and DB documentation template 2025-01-20 08:31:25 +01:00
705bffc8d3 New employee to object as combobox 2025-01-17 11:06:07 +01:00
e94a9f9900 GUI in frames and other applicant-related stuff 2025-01-16 11:17:57 +01:00
35 changed files with 38387 additions and 1316 deletions

View File

@@ -2,8 +2,16 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
ColumnLayout
{
// ScrollView
// {
// anchors.fill: parent
// ScrollBar.vertical: ScrollBar
// {
// policy: ScrollBar.AlwaysOn
// }
ColumnLayout
{
id: colPar
anchors.fill: parent
Label
{
@@ -13,65 +21,153 @@ ColumnLayout
font.pixelSize: 35
}
ButtonGroup
{
buttons: radio.children
onClicked:
{
checkFields()
personalData.requiredField()
}
}
Row
{
Layout.fillWidth: true
id: radio
Layout.columnSpan: 2
RadioButton
{
checked: true
text: qsTr("Bewerber")
}
RadioButton
{
text: qsTr("Mitarbeiter")
}
}
RowLayout
{
Layout.fillWidth: true
spacing: 50
Frame
{
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
ApplicantPersonalData
{
id: personalData
width: parent.width
}
}
Frame
{
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
visible: radio.children[1].checked
ColumnLayout
{
Layout.alignment: Qt.AlignTop
width: parent.width
// CheckBox
// {
// id: checkcontactdata
// Layout.fillWidth: true
// text: qsTr("Kontaktdaten")
// checked: false
// }
// ApplicantContactData
// {
// visible: checkcontactdata.checked
// }
CheckBox
{
id: checkcontactdata
id: miniJobber
Layout.fillWidth: true
text: qsTr("Kontaktdaten")
text: qsTr("Minijob")
checked: false
onCheckStateChanged:
{
contactData.visible = checked
}
}
ApplicantContactData
{
id: contactData
visible: false
}
CheckBox
{
id: checkbankdata
Layout.fillWidth: true
text: qsTr("Bankdaten")
checked: false
onCheckStateChanged:
{
bankData.visible = checked
}
}
ApplicantBankData
{
id: bankData
visible: false
id: bankAccount
}
ApplicantNationality
ApplicantNationalInsurance
{
id: nationalInsurance
}
ApplicantVarious
{
// Layout.margins:
// {
// top: 30
// }
}
}
}
}
RowLayout
{
Layout.fillHeight: true
Layout.alignment: Qt.AlignRight
Button
{
text: qsTr("Abbrechen")
onClicked: appLoader.source = "EmployeeTable.qml"
}
Button
{
id: saveBtn
text: qsTr("Speichern")
enabled: false
// onClicked:
// {
// if (!checkAddContact.checked)
// {
// new_business = JsLib.addBusiness(customerView)
// business_model.addBusiness(new_business, 0)
// appLoader.source = "EmployeeTable.qml"
// }
// else
// {
// new_business = JsLib.addBusiness(customerView)
// var new_contact = JsLib.addBusiness(addContactLayout)
// contact_model.addContact(new_contact)
// }
// }
}
}
Item
{
Layout.fillHeight: true
}
}
function checkFields()
{
if(radio.children[1].checked)
{
if(!personalData.checkPersonalField() || !bankAccount.checkBankField() )
saveBtn.enabled = false
else
saveBtn.enabled = true
}
else if (!personalData.checkPersonalField())
saveBtn.enabled = false
else
saveBtn.enabled = true
}
}
//}

View File

@@ -2,15 +2,21 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
GridLayout
Frame
{
id: addContactLayout
Layout.fillWidth: true
Layout.fillHeight: true
id: addContactFrame
property alias contactGrid: addContactLayout
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
GridLayout
{
id: addContactLayout
anchors.fill: parent
// Layout.fillWidth: true
// Layout.fillHeight: true
// Layout.alignment: Qt.AlignTop
columns: 2
rowSpacing: 9
visible: false
property alias fname: firstname
property alias lname: lastname
@@ -99,7 +105,7 @@ GridLayout
Label
{
text: qsTr("Handy")
text: qsTr("Mobil")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
@@ -182,6 +188,7 @@ GridLayout
editable: false
model: ["Nein", "Ja"]
}
}
function checkContactField()
{

View File

@@ -26,7 +26,6 @@ ColumnLayout
checked: false
onCheckStateChanged:
{
addContactLayout.visible = checked
checkFields()
}
}
@@ -37,15 +36,21 @@ ColumnLayout
Layout.fillWidth: true
Layout.fillHeight: true
spacing: 45
Frame
{
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
CustomerView
{
id: customerView
width: parent.width
}
}
AddContact
{
id: addContactLayout
id: addContactFrame
visible: checkAddContact.checked
}
}
RowLayout
@@ -73,7 +78,7 @@ ColumnLayout
else
{
new_business = JsLib.addBusiness(customerView)
var new_contact = JsLib.addBusiness(addContactLayout)
var new_contact = JsLib.addBusiness(addContactFrame.contactGrid)
contact_model.addContact(new_contact)
}
}
@@ -103,7 +108,7 @@ ColumnLayout
{
if(checkAddContact.checked)
{
if(!customerView.checkBusinessField() || !addContactLayout.checkContactField())
if(!customerView.checkBusinessField() || !addContactFrame.checkContactField())
saveBtn.enabled = false
else
saveBtn.enabled = true

View File

@@ -26,7 +26,6 @@ ColumnLayout
checked: false
onCheckStateChanged:
{
addObjectLayout.visible = checked
//checkFields()
}
}
@@ -38,14 +37,21 @@ ColumnLayout
Layout.fillHeight: true
spacing: 45
Frame
{
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
ObjectView
{
id: objectView
width: parent.width
}
}
ObjectAddOns
{
id: addObjectLayout
visible: checkAddObject.checked
}
}
RowLayout

View File

@@ -29,7 +29,7 @@ ApplicationWindow
text: qsTr("Eingesetzter Mitarbeiter")
Layout.alignment: Qt.AlignRight
}
TextField
ComboBox
{
id: assignee
Layout.fillWidth: true
@@ -103,10 +103,10 @@ ApplicationWindow
text: qsTr("Hinzufügen")
onClicked:
{
if (assignee.text.trim() !== "" && duration.text.trim() !== "" && wage.text.trim() !== "" && cleanDays.text.trim() !== "" && tasks.text.trim() !== "" && output.text.trim() !== "")
if (duration.text.trim() !== "" && wage.text.trim() !== "" && cleanDays.text.trim() !== "" && tasks.text.trim() !== "" && output.text.trim() !== "")
{
var ne = {
"assignee": assignee.text.trim(),
"assignee": assignee.currentText,
"duration": duration.text.trim(),
"wage": wage.text.trim(),
"cleandays": cleanDays.text.trim(),

View File

@@ -4,6 +4,7 @@ import QtQuick.Layouts
GridLayout
{
id: bankAccount
columns: 2
Label
{
@@ -14,6 +15,8 @@ GridLayout
{
id: iban
Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
}
Label
{
@@ -25,5 +28,13 @@ GridLayout
{
id: bankname
Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
}
function checkBankField()
{
return (iban.text.trim() && bankname.text.trim())
}
}

View File

@@ -0,0 +1,52 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
Label
{
text: qsTr("Geburtsname")
}
TextField
{
id: birthname
Layout.fillWidth: true
}
Label
{
text: qsTr("Geburtsdatum")
}
TextField
{
id: birthday
Layout.fillWidth: true
placeholderText: qsTr("TT.MM.JJJJ")
validator: RegularExpressionValidator
{
regularExpression: /((^|)(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]))\.((^|)(0[1-9]{1}|1[0-2]{1}))\.((^|)(196[0-9]{1}|19[7-9]{1}[0-9]{1}|20[0-9]{2}))/
}
}
Label
{
text: qsTr("Geburtsort")
}
TextField
{
id: placeofbirth
Layout.fillWidth: true
}
Label
{
text: qsTr("Geschlecht")
}
ComboBox
{
id: gender
Layout.fillWidth: true
editable: false
model: [qsTr("Mann"), qsTr("Frau"), qsTr("Divers")]
}

View File

@@ -23,9 +23,6 @@ GridLayout
}
RowLayout
{
ComboBox
{
id: postcode

19
Gui/ApplicantMiniJob.qml Normal file
View File

@@ -0,0 +1,19 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
GridLayout
{
columns: 2
Label
{
text: qsTr("Knappschaft")
}
TextField
{
id: knappschaft
Layout.fillWidth: true
}
}

View File

@@ -0,0 +1,131 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
GridLayout
{
id: nationalInsurance
columns: 2
Label
{
text: qsTr("Staatsangehörigkeit Deutsch")
}
ButtonGroup
{
buttons: radio.children
onClicked:
{
checkFields()
personalData.requiredField()
}
}
Row
{
id: radio
Layout.fillWidth: true
Layout.alignment: Qt.AlignLeft
RadioButton
{
text: qsTr("Ja")
checked: true
}
RadioButton
{
text: qsTr("Nein")
}
}
Label
{
text: qsTr("Sozialversicherungs-Nr")
}
TextField
{
id: socialnumber
Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
}
Label
{
text: qsTr("Steuer-ID")
}
TextField
{
id: taxnumber
Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
}
Label
{
text: qsTr("Krankenkasse")
}
TextField
{
id: medicalinsurance
Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
}
CheckBox
{
Layout.columnSpan: 2
text: qsTr("Arbeitserlaubnis")
visible: radio.children[1].checked
}
Label
{
text: qsTr("Staatsangehörigkeit")
visible: radio.children[1].checked
}
TextField
{
id: nationality
visible: radio.children[1].checked
Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
}
Label
{
text: qsTr("Pass gültig bis")
visible: radio.children[1].checked
}
TextField
{
id: pass
visible: radio.children[1].checked
Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
}
Label
{
text: qsTr("Aufenthaltstitel gültig bis")
visible: radio.children[1].checked
}
TextField
{
id: aufenthalt
visible: radio.children[1].checked
Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
}
}

View File

@@ -2,62 +2,6 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
GridLayout
{
columns: 2
Label
{
text: qsTr("Staatsangehörigkeit Deutsch")
}
Row
{
RadioButton
{
id: radioyes
text: qsTr("Ja")
checked: true
}
RadioButton
{
id: radiono
text: qsTr("Nein")
}
}
Label
{
text: qsTr("Sozialversicherungs-Nr")
}
TextField
{
id: socialnumber
}
Label
{
text: qsTr("Steuer-ID")
}
TextField
{
id: taxnumber
}
Label
{
text: qsTr("Krankenkasse")
}
TextField
{
id: medicalinsurance
}
Item
{
Layout.columnSpan: 2
visible: radiono.checked
GridLayout
{
columns: 2
CheckBox
{
Layout.columnSpan: 2
@@ -70,6 +14,7 @@ GridLayout
TextField
{
id: nationality
}
Label
{
@@ -78,6 +23,7 @@ GridLayout
TextField
{
id: pass
}
Label
{
@@ -86,7 +32,6 @@ GridLayout
TextField
{
id: aufenthalt
}
}
}
}

View File

@@ -5,32 +5,12 @@ import QtQuick.Layouts
GridLayout
{
id: personalData
columns: 2
ButtonGroup
{
buttons: radio.children
}
Row
{
Layout.fillWidth: true
id: radio
Layout.columnSpan: 2
RadioButton
{
checked: true
text: qsTr("Bewerber")
}
RadioButton
{
text: qsTr("Mitarbeiter")
}
}
columns: 4
Label
{
text: qsTr("Anrede")
Layout.alignment: Qt.AlignRight
}
ComboBox
{
@@ -38,10 +18,14 @@ GridLayout
Layout.fillWidth: true
editable: false
model: [qsTr("Herr"), qsTr("Frau")]
onCurrentTextChanged: briefAnrede.text = title.currentText === "Herr"? "Sehr geehrter " +
title.currentText: "Sehr geehrte " + title.currentText
Layout.columnSpan: 3
}
Label
{
text: qsTr("Vorname")
Layout.alignment: Qt.AlignRight
}
TextField
{
@@ -49,11 +33,13 @@ GridLayout
Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
onTextChanged: checkFields()
Layout.columnSpan: 3
}
Label
{
text: qsTr("Nachname")
Layout.alignment: Qt.AlignRight
}
TextField
{
@@ -61,58 +47,124 @@ GridLayout
Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
onTextChanged: checkFields()
Layout.columnSpan: 3
}
Label
{
text: qsTr("Straße")
Layout.alignment: Qt.AlignRight
}
TextField
{
id: street
Layout.fillWidth: true
placeholderTextColor: "red"
}
Label
{
text: qsTr("Geburtsname")
text: qsTr("Nr.")
Layout.alignment: Qt.AlignRight
}
TextField
{
id: birthname
property string name: "houseno"
id: houseno
Layout.fillWidth: true
placeholderTextColor: "red"
}
Label
{
text: qsTr("Geburtsdatum")
text: qsTr("PLZ")
Layout.alignment: Qt.AlignRight
}
TextField
ComboBox
{
id: birthday
id: postcode
Layout.fillWidth: true
placeholderText: qsTr("TT.MM.JJJJ")
editable: true
onCurrentTextChanged: checkFields()
onEditTextChanged: checkFields()
onActivated: currentValue
model: address_model
textRole: "display"
popup.height: 300
popup.y: postcode.y + 5 - (postcode.height * 2)
currentIndex: -1
onCurrentIndexChanged: city.currentIndex = postcode.currentIndex
validator: RegularExpressionValidator
{
regularExpression: /((^|)(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]))\.((^|)(0[1-9]{1}|1[0-2]{1}))\.((^|)(196[0-9]{1}|19[7-9]{1}[0-9]{1}|20[0-9]{2}))/
regularExpression: /([0-9]{1,5})/
}
}
Label
{
text: qsTr("Geburtsort")
}
TextField
{
id: placeofbirth
Layout.fillWidth: true
}
Label
{
text: qsTr("Geschlecht")
text: qsTr("Ort")
Layout.alignment: Qt.AlignRight
}
ComboBox
{
id: gender
id: city
Layout.fillWidth: true
editable: false
model: [qsTr("Mann"), qsTr("Frau"), qsTr("Divers")]
editable: true
onEditTextChanged: checkFields()
onCurrentTextChanged: checkFields()
model: address_model
textRole: "city"
popup.height: 300
popup.y: postcode.y + 5 - (postcode.height * 2)
currentIndex: -1
}
Label
{
text: qsTr("Telefonnummer")
Layout.alignment: Qt.AlignRight
}
TextField
{
id: phonenumber
Layout.fillWidth: true
placeholderTextColor: "red"
Layout.columnSpan: 3
}
Label
{
text: qsTr("Mobil")
Layout.alignment: Qt.AlignRight
}
TextField
{
id: cellphone
Layout.fillWidth: true
placeholderTextColor: "red"
Layout.columnSpan: 3
}
Label
{
text: qsTr("E-Mail")
Layout.alignment: Qt.AlignRight
}
TextField
{
id: email
Layout.fillWidth: true
placeholderTextColor: "red"
Layout.columnSpan: 3
}
Label
{
text: qsTr("Familienstand")
Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked
}
ComboBox
{
@@ -120,46 +172,106 @@ GridLayout
Layout.fillWidth: true
editable: false
model: [qsTr("ledig"), qsTr("verheiratet"), qsTr("verwitwet"), qsTr("geschieden")]
visible: radio.children[1].checked
Layout.columnSpan: 3
}
Label
{
text: qsTr("Jobbeschreibung")
Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked
}
TextField
{
id: jobdescription
Layout.fillWidth: true
visible: radio.children[1].checked
placeholderTextColor: "red"
Layout.columnSpan: 3
}
Label
{
text: qsTr("Arbeitsbeginn")
Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked
}
TextField
{
id: workstart
Layout.fillWidth: true
visible: radio.children[1].checked
placeholderTextColor: "red"
Layout.columnSpan: 3
}
Label
{
text: qsTr("Bei Befristung Ende")
Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked
}
TextField
{
id: workend
Layout.fillWidth: true
visible: radio.children[1].checked
placeholderTextColor: "red"
Layout.columnSpan: 3
}
Label
{
text: qsTr("Arbeitszeiten")
Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked
}
TextField
{
id: timetowork
Layout.fillWidth: true
visible: radio.children[1].checked
placeholderTextColor: "red"
Layout.columnSpan: 3
}
Label
{
text: qsTr("Briefanrede")
Layout.alignment: Qt.AlignRight
}
TextField
{
id: briefAnrede
Layout.fillWidth: true
placeholderTextColor: "red"
Layout.columnSpan: 3
}
Item
{
Layout.fillHeight: true
Layout.columnSpan: 4
}
function checkPersonalField()
{
if (radio.children[0].checked)
{
return (firstname.text.trim() && lastname.text.trim())
}
else
{
console.log("Mitarbeiter")
return (firstname.text.trim() && lastname.text.trim())
}
}
function requiredField()
{
var pf = (radio.children[1].checked)?"Pflichtfeld":""
street.placeholderText = pf
phonenumber.placeholderText = pf
cellphone.placeholderText = pf
email.placeholderText = pf
jobdescription.placeholderText = pf
workstart.placeholderText = pf
workend.placeholderText = pf
timetowork.placeholderText = pf
briefAnrede.placeholderText = pf
}
}

53
Gui/ApplicantVarious.qml Normal file
View File

@@ -0,0 +1,53 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
GridLayout
{
columns: 2
Label
{
text: qsTr("Grad der Behinderung")
}
TextField
{
id: behinderung
placeholderText: "0,0"
Layout.fillWidth: true
}
Label
{
text: qsTr("Disponent")
}
TextField
{
id: disponent
Layout.fillWidth: true
}
Label
{
text: qsTr("Kostenstelle")
}
TextField
{
id: kostenstelle
Layout.fillWidth: true
}
Label
{
text: qsTr("Fremdlohn-Nr.")
}
TextField
{
id: fremdLohnNummer
Layout.fillWidth: true
}
}

27
Gui/CustomerDetails.qml Normal file
View File

@@ -0,0 +1,27 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
Item
{
property int selectedClient: -1
id: clDet
ColumnLayout
{
Label
{
text: qsTr("Ausgewählter Kunde " + selectedClient)
}
Button
{
text: qsTr("Kunden zeigen")
onClicked: customersStack.pop()
}
}
Component.onCompleted:
{
business_model.onRowClicked(selectedClient)
}
}

View File

@@ -9,206 +9,11 @@ Item {
property var availableFilters: ["Name", "Adresse", "PLZ", "Ort"]
id: test
SearchBar
StackView
{
id:searchBar
anchors.margins: 9
}
Button
{
id: addBusinessBtn
icon.source: "qrc:/images/addbusiness.svg"
icon.color: "olive"
anchors.right: parent.right
flat: true
onClicked: appLoader.source = "AddCustomer.qml"
}
ColumnLayout
{
id: tableColumn
anchors
{
top: searchBar.bottom
bottom: parent.bottom
left: parent.left
right: parent.right
}
RowLayout
{
RadioButton
{
id: showAll
checked: true
text: qsTr("Alle")
onClicked: viewCriterion(showAll)
}
RadioButton
{
id: showInterested
text: qsTr("Interessent")
onClicked: viewCriterion(showInterested)
}
RadioButton
{
id: showClientele
text: qsTr("Kunden")
onClicked: viewCriterion(showClientele)
}
RadioButton
{
id: showProvider
text: qsTr("Lieferant")
onClicked: viewCriterion(showProvider)
}
RadioButton
{
id: showFinished
text: qsTr("Erledigt")
onClicked: viewCriterion(showFinished)
}
}
HorizontalHeaderView
{
id: horizontalHeader
Layout.fillWidth: true
implicitHeight: 40
movableColumns: true //@disable-check M16
syncView: customerTable
delegate: Rectangle {
color: addBusinessBtn.palette.alternateBase
border.color: addBusinessBtn.palette.base
implicitHeight: 40
Layout.fillWidth: true
implicitWidth: 1
Text
{
text: model.display
elide: Text.ElideRight
width: parent.width
height: parent.height
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
color: addBusinessBtn.palette.text
}
}
}
TableView
{
//property var customWidths: [0.2, 0.5, 0.3, 05, 0.2, 0.2]
property real newWidth: 0
id: customerTable
Layout.fillHeight: true
Layout.fillWidth: true
ScrollBar.vertical: ScrollBar
{
policy: customerTable.contentHeight > customerTable.height ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff
}
columnSpacing: 1
rowSpacing: 2
model: business_model
alternatingRows: true
resizableColumns: true // @disable-check M16
selectionBehavior: TableView.SelectRows
selectionModel: ItemSelectionModel
{
id: selModel
model: customerTable.model
}
// columnWidthProvider: function(column)
// {
// switch (column)
// {
// case 0: return width * 0.2;
// case 1: return width * 0.5;
// case 2: return width * 0.3;
// default: return width / model.columnCount();
// }
//return customWidths[column] * width;
//return tableColumn.content.implicitWidth // model.columnCount()
// newWidth = columnWidth(column)
// return newWidth
// }
Timer
{
id: redrawTable
running: true
interval: 1
repeat: false
onTriggered:
{
customerTable.forceLayout();
}
}
delegate:Rectangle
{
required property bool selected
required property bool current
implicitWidth: customerTable.width / customerTable.columns
implicitHeight: 25
color: selected
? addBusinessBtn.palette.highlight //palette.highlight
: (customerTable.alternatingRows && row % 2 !== 0
? addBusinessBtn.palette.base // palette.base
: addBusinessBtn.palette.alternateBase) //palette.alternateBase)
Text
{
text: model.display == null? "": model.display
elide: Text.ElideRight
width: parent.width
height: parent.height
verticalAlignment: Text.AlignVCenter
leftPadding: 9 //@d isable-check M16
color: addBusinessBtn.palette.text
}
MouseArea
{
property bool hovered: false
id: mouseArea
id: customersStack
anchors.fill: parent
hoverEnabled: true
onClicked:
{
business_model.onRowClicked(row)
}
onEntered:
{
customerTable.selectionModel.select(customerTable.model.index(row, 0), ItemSelectionModel.SelectCurrent | ItemSelectionModel.Rows)
}
}
}
onContentWidthChanged:
{
//console.log("Model changed!!")
redrawTable.start()
}
}
Item
{
//Layout.fillHeight: true
Layout.fillWidth: true
}
}
function viewCriterion(criterion)
{
business_model.viewCriterion(criterion.text)
initialItem: "CustomersTable.qml"
}
}

View File

@@ -149,7 +149,7 @@ GridLayout
Label
{
text: qsTr("Handy")
text: qsTr("Mobil")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField

219
Gui/CustomersTable.qml Normal file
View File

@@ -0,0 +1,219 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
import QtQuick.Controls.Fusion
Item
{
SearchBar
{
id:searchBar
anchors.margins: 9
}
Button
{
id: addBusinessBtn
icon.source: "qrc:/images/addbusiness.svg"
icon.color: "olive"
anchors.right: parent.right
flat: true
onClicked: appLoader.source = "AddCustomer.qml"
}
ColumnLayout
{
id: tableColumn
anchors
{
top: searchBar.bottom
bottom: parent.bottom
left: parent.left
right: parent.right
}
RowLayout
{
RadioButton
{
id: showAll
checked: true
text: qsTr("Alle")
onClicked: viewCriterion(showAll)
}
RadioButton
{
id: showInterested
text: qsTr("Interessent")
onClicked: viewCriterion(showInterested)
}
RadioButton
{
id: showClientele
text: qsTr("Kunden")
onClicked: viewCriterion(showClientele)
}
RadioButton
{
id: showProvider
text: qsTr("Lieferant")
onClicked: viewCriterion(showProvider)
}
RadioButton
{
id: showFinished
text: qsTr("Erledigt")
onClicked: viewCriterion(showFinished)
}
}
HorizontalHeaderView
{
id: horizontalHeader
Layout.fillWidth: true
implicitHeight: 40
movableColumns: true //@disable-check M16
syncView: customerTable
delegate: Rectangle {
color: addBusinessBtn.palette.alternateBase
border.color: addBusinessBtn.palette.base
implicitHeight: 40
Layout.fillWidth: true
implicitWidth: 1
Text
{
text: model.display
elide: Text.ElideRight
width: parent.width
height: parent.height
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
color: addBusinessBtn.palette.text
}
}
}
TableView
{
//property var customWidths: [0.2, 0.5, 0.3, 05, 0.2, 0.2]
property real newWidth: 0
id: customerTable
Layout.fillHeight: true
Layout.fillWidth: true
ScrollBar.vertical: ScrollBar
{
policy: customerTable.contentHeight > customerTable.height ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff
}
columnSpacing: 1
rowSpacing: 2
model: business_model
alternatingRows: true
resizableColumns: true // @disable-check M16
selectionBehavior: TableView.SelectRows
selectionModel: ItemSelectionModel
{
id: selModel
model: customerTable.model
}
// columnWidthProvider: function(column)
// {
// switch (column)
// {
// case 0: return width * 0.2;
// case 1: return width * 0.5;
// case 2: return width * 0.3;
// default: return width / model.columnCount();
// }
//return customWidths[column] * width;
//return tableColumn.content.implicitWidth // model.columnCount()
// newWidth = columnWidth(column)
// return newWidth
// }
Timer
{
id: redrawTable
running: true
interval: 1
repeat: false
onTriggered:
{
customerTable.forceLayout();
}
}
delegate:Rectangle
{
required property bool selected
required property bool current
implicitWidth: customerTable.width / customerTable.columns
implicitHeight: 25
color: selected
? addBusinessBtn.palette.highlight //palette.highlight
: (customerTable.alternatingRows && row % 2 !== 0
? addBusinessBtn.palette.base // palette.base
: addBusinessBtn.palette.alternateBase) //palette.alternateBase)
Text
{
text: model.display == null? "": model.display
elide: Text.ElideRight
width: parent.width
height: parent.height
verticalAlignment: Text.AlignVCenter
leftPadding: 9 //@d isable-check M16
color: addBusinessBtn.palette.text
}
MouseArea
{
property bool hovered: false
id: mouseArea
anchors.fill: parent
hoverEnabled: true
// onClicked:
// {
// business_model.onRowClicked(row)
// }
onDoubleClicked:
{
customersStack.push("CustomerDetails.qml", {selectedClient: row});
}
onEntered:
{
customerTable.selectionModel.select(customerTable.model.index(row, 0), ItemSelectionModel.SelectCurrent | ItemSelectionModel.Rows)
}
}
}
onContentWidthChanged:
{
//console.log("Model changed!!")
redrawTable.start()
}
}
Item
{
//Layout.fillHeight: true
Layout.fillWidth: true
}
}
function viewCriterion(criterion)
{
business_model.viewCriterion(criterion.text)
}
Component.onCompleted: customersStack.pop()
}

View File

@@ -8,9 +8,124 @@ ColumnLayout
Rectangle
{
color: "blue"
color: "dimgrey"
Layout.fillHeight: true
Layout.fillWidth: true
Layout.bottomMargin: 9
Layout.bottomMargin: 3
radius: 45
RowLayout
{
anchors.fill: parent
Rectangle
{
id: contractButton
width: 300
height: 145
color: "darkslategray"
radius: 45
Layout.alignment: Qt.AlignHCenter
border.color: "steelblue"
border.width: 1
Text
{
text: qsTr("Aufträge")
anchors.centerIn: parent
font.pixelSize: 45
font.bold: true
color: "lightgoldenrodyellow"
}
MouseArea
{
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
onPressed:
{
contractButton.color = "darkolivegreen"
contractButton.border.width = 3
contractButton.border.color = "skyblue"
console.log("Aufträge...")
}
onReleased:
{
contractButton.color = "darkslategray"
contractButton.border.width = 1
contractButton.border.color = "steelblue"
}
onHoveredChanged:
{
var w = contractButton.border.width === 3? 1: 3
contractButton.border.width = w
}
onExited:
{
contractButton.color = "darkslategray"
contractButton.border.color = "steelblue"
contractButton.border.width = 1
}
}
}
Rectangle
{
id: offerButton
width: 300
height: 145
color: "darkslategray"
radius: 45
Layout.alignment: Qt.AlignHCenter
border.color: "steelblue"
border.width: 1
Text
{
text: qsTr("Angebote")
anchors.centerIn: parent
font.pixelSize: 45
font.bold: true
color: "lightgoldenrodyellow"
}
MouseArea
{
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
onPressed:
{
offerButton.color = "darkolivegreen"
offerButton.border.width = 3
offerButton.border.color = "skyblue"
console.log("Angebote...")
}
onReleased:
{
offerButton.color = "darkslategray"
offerButton.border.width = 1
offerButton.border.color = "steelblue"
}
onHoveredChanged:
{
var w = offerButton.border.width === 3? 1: 3
offerButton.border.width = w
}
onExited:
{
offerButton.color = "darkslategray"
offerButton.border.color = "steelblue"
offerButton.border.width = 1
}
}
}
}
}
}

27
Gui/EmployeeDetails.qml Normal file
View File

@@ -0,0 +1,27 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
Item
{
property int selectedEmployee: -1
id: emDet
ColumnLayout
{
Label
{
text: qsTr("Ausgewählter Mitarbeiter " + selectedEmployee)
}
Button
{
text: qsTr("Mitarbeiter zeigen")
onClicked: employeesStack.pop()
}
}
Component.onCompleted:
{
business_model.onRowClicked(selectedEmployee)
}
}

View File

@@ -4,121 +4,13 @@ import QtQuick.Controls
import Qt.labs.qmlmodels
Item {
property var availableFilters: ["Name", "Adresse", "PLZ", "Ort", "Status"]
SearchBar
Item
{
StackView
{
id:searchBar
anchors.margins: 9
}
ColumnLayout
{
anchors
{
top: searchBar.bottom
bottom: parent.bottom
left: parent.left
right: parent.right
}
RowLayout
{
RadioButton
{
checked: true
text: qsTr("Alle")
}
RadioButton
{
text: qsTr("Bewerber")
}
RadioButton
{
text: qsTr("Mitarbeiter")
}
RadioButton
{
text: qsTr("Erledigt")
}
RadioButton
{
text: qsTr("Ausgeschieden")
}
}
HorizontalHeaderView
{
id: horizontalHeader
Layout.fillWidth: true
syncView: testTable
}
TableView
{
id: testTable
Layout.fillHeight: true
Layout.fillWidth: true
columnSpacing: 1
rowSpacing: 2
model: business_model
selectionBehavior: TableView.SelectRows
selectionModel: ItemSelectionModel
{
id: selModel
model: testTable.model
}
delegate:Rectangle
{
required property bool selected
required property bool current
implicitWidth: 200
implicitHeight: 25
color: selected? "lightblue": palette.base
Text
{
Layout.fillWidth: true
text: model.display
}
MouseArea
{
id: mouseArea
property bool hovered:false
id: employeesStack
anchors.fill: parent
hoverEnabled: true
onClicked:
{
business_model.onRowClicked(row)
testTable.selectionModel.select(testTable.model.index(row, 0), ItemSelectionModel.SelectCurrent | ItemSelectionModel.Rows)
}
}
}
}
initialItem: "EmployeesTable.qml"
}
}

132
Gui/EmployeesTable.qml Normal file
View File

@@ -0,0 +1,132 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
Item
{
property var availableFilters: ["Name", "Adresse", "PLZ", "Ort", "Status"]
SearchBar
{
id:searchBar
anchors.margins: 9
}
Button
{
id: addEmployeeBtn
icon.source: "qrc:/images/addbusiness.svg"
icon.color: "olive"
anchors.right: parent.right
flat: true
onClicked: appLoader.source = "AddApplicant.qml"
}
ColumnLayout
{
anchors
{
top: searchBar.bottom
bottom: parent.bottom
left: parent.left
right: parent.right
}
RowLayout
{
RadioButton
{
checked: true
text: qsTr("Alle")
}
RadioButton
{
text: qsTr("Bewerber")
}
RadioButton
{
text: qsTr("Mitarbeiter")
}
RadioButton
{
text: qsTr("Erledigt")
}
RadioButton
{
text: qsTr("Ausgeschieden")
}
}
HorizontalHeaderView
{
id: horizontalHeader
Layout.fillWidth: true
syncView: testTable
}
TableView
{
id: testTable
Layout.fillHeight: true
Layout.fillWidth: true
columnSpacing: 1
rowSpacing: 2
model: business_model
selectionBehavior: TableView.SelectRows
selectionModel: ItemSelectionModel
{
id: selModel
model: testTable.model
}
delegate:Rectangle
{
required property bool selected
required property bool current
implicitWidth: 200
implicitHeight: 25
color: selected? "lightblue": palette.base
Text
{
Layout.fillWidth: true
text: model.display? model.display: ""
}
MouseArea
{
id: mouseArea
property bool hovered:false
anchors.fill: parent
hoverEnabled: true
onDoubleClicked:
{
employeesStack.push("EmployeeDetails.qml", {selectedEmployee: row});
}
}
}
}
}
Component.onCompleted: employeesStack.pop()
}

View File

@@ -1,11 +1,15 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
ColumnLayout
Frame
{
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
ColumnLayout
{
id: addObjectLayout
visible: false
width: parent.width
ObjectAddOnEmployee
{
id: oaoemployee
@@ -18,4 +22,5 @@ ColumnLayout
{
Layout.fillHeight: true
}
}
}

27
Gui/ObjectDetails.qml Normal file
View File

@@ -0,0 +1,27 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
Item
{
property int selectedObject: -1
id: obDet
ColumnLayout
{
Label
{
text: qsTr("Ausgewählter Objekt " + selectedObject)
}
Button
{
text: qsTr("Objekts zeigen")
onClicked: customersStack.pop()
}
}
Component.onCompleted:
{
business_model.onRowClicked(selectedObject)
}
}

View File

@@ -6,155 +6,13 @@ import QtQuick.Controls.Fusion
Item {
property var availableFilters: [""]
SearchBar
{
id:searchBar
anchors.margins: 9
}
Button
StackView
{
id: addObjectBtn
icon.source: "qrc:/images/addbusiness.svg"
icon.color: "olive"
anchors.right: parent.right
flat: true
onClicked: appLoader.source = "AddObject.qml"
}
ColumnLayout
{
id: tableColumn
anchors
{
top: searchBar.bottom
bottom: parent.bottom
left: parent.left
right: parent.right
}
HorizontalHeaderView
{
id: horizontalHeaderview
Layout.fillWidth: true
implicitHeight: 40
visible: false
movableColumns: true //@disable-check M16
syncView: objectTable
delegate: Rectangle {
color: addObjectBtn.palette.alternateBase
border.color: addObjectBtn.palette.base
implicitHeight: 40
Layout.fillWidth: true
implicitWidth: 1
Text
{
text: model.display
elide: Text.ElideRight
width: parent.width
height: parent.height
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
color: addObjectBtn.palette.text
}
}
}
TableView
{
property real newWidth: 0
id: objectTable
Layout.fillHeight: true
Layout.fillWidth: true
ScrollBar.vertical: ScrollBar
{
policy: objectTable.contentHeight > objectTable.height ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff
}
columnSpacing: 1
rowSpacing: 2
//model: object_model
alternatingRows: true
resizableColumns: true // @disable-check M16
selectionBehavior: TableView.SelectRows
selectionModel: ItemSelectionModel
{
id: obmodel
model: objectTable.model
}
// Timer
// {
// id: redrawTable
// running: true
// interval: 1
// repeat: false
// onTriggered:
// {
// objectTable.forceLayout();
// }
// }
delegate:Rectangle
{
required property bool selected
required property bool current
implicitWidth: objectTable.width / objectTable.columns
implicitHeight: 25
color: selected
? addObjectBtn.palette.highlight //palette.highlight
: (objectTable.alternatingRows && row % 2 !== 0
? addObjectBtn.palette.base // palette.base
: addObjectBtn.palette.alternateBase) //palette.alternateBase)
Text
{
text: model.display == null? "": model.display
elide: Text.ElideRight
width: parent.width
height: parent.height
verticalAlignment: Text.AlignVCenter
leftPadding: 9 //@d isable-check M16
color: addObjectBtn.palette.text
}
MouseArea
{
property bool hovered: false
id: mouseArea
id: objectsStack
anchors.fill: parent
hoverEnabled: true
onClicked:
{
object_model.onRowClicked(row)
initialItem: "ObjectsTable.qml"
}
onEntered:
{
objectTable.selectionModel.select(objectTable.model.index(row, 0), ItemSelectionModel.SelectCurrent | ItemSelectionModel.Rows)
}
}
}
// onContentWidthChanged:
// {
// redrawTable.start()
// }
}
Item
{
Layout.fillWidth: true
}
}
// function viewCriterion(criterion)
// {
// object_model.viewCriterion(criterion.text)
// }
}

160
Gui/ObjectsTable.qml Normal file
View File

@@ -0,0 +1,160 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
import QtQuick.Controls.Fusion
Item
{
SearchBar
{
id:searchBar
anchors.margins: 9
}
Button
{
id: addObjectBtn
icon.source: "qrc:/images/addbusiness.svg"
icon.color: "olive"
anchors.right: parent.right
flat: true
onClicked: appLoader.source = "AddObject.qml"
}
ColumnLayout
{
id: tableColumn
anchors
{
top: searchBar.bottom
bottom: parent.bottom
left: parent.left
right: parent.right
}
HorizontalHeaderView
{
id: horizontalHeaderview
Layout.fillWidth: true
implicitHeight: 40
visible: false
movableColumns: true //@disable-check M16
syncView: objectTable
delegate: Rectangle {
color: addObjectBtn.palette.alternateBase
border.color: addObjectBtn.palette.base
implicitHeight: 40
Layout.fillWidth: true
implicitWidth: 1
Text
{
text: model.display
elide: Text.ElideRight
width: parent.width
height: parent.height
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
color: addObjectBtn.palette.text
}
}
}
TableView
{
property real newWidth: 0
id: objectTable
Layout.fillHeight: true
Layout.fillWidth: true
ScrollBar.vertical: ScrollBar
{
policy: objectTable.contentHeight > objectTable.height ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff
}
columnSpacing: 1
rowSpacing: 2
//model: object_model
alternatingRows: true
resizableColumns: true // @disable-check M16
selectionBehavior: TableView.SelectRows
selectionModel: ItemSelectionModel
{
id: obmodel
model: objectTable.model
}
// Timer
// {
// id: redrawTable
// running: true
// interval: 1
// repeat: false
// onTriggered:
// {
// objectTable.forceLayout();
// }
// }
delegate:Rectangle
{
required property bool selected
required property bool current
implicitWidth: objectTable.width / objectTable.columns
implicitHeight: 25
color: selected
? addObjectBtn.palette.highlight //palette.highlight
: (objectTable.alternatingRows && row % 2 !== 0
? addObjectBtn.palette.base // palette.base
: addObjectBtn.palette.alternateBase) //palette.alternateBase)
Text
{
text: model.display == null? "": model.display
elide: Text.ElideRight
width: parent.width
height: parent.height
verticalAlignment: Text.AlignVCenter
leftPadding: 9 //@d isable-check M16
color: addObjectBtn.palette.text
}
MouseArea
{
property bool hovered: false
id: mouseArea
anchors.fill: parent
hoverEnabled: true
onDoubleClicked:
{
objectsStack.push("ObjectDetails.qml", {selectedObject: row});
}
onEntered:
{
objectTable.selectionModel.select(objectTable.model.index(row, 0), ItemSelectionModel.SelectCurrent | ItemSelectionModel.Rows)
}
}
}
// onContentWidthChanged:
// {
// redrawTable.start()
// }
}
Item
{
Layout.fillWidth: true
}
}
// function viewCriterion(criterion)
// {
// object_model.viewCriterion(criterion.text)
// }
Component.onCompleted: objectsStack.pop()
}

View File

@@ -41,7 +41,7 @@ ApplicationWindow
top: topBar.bottom
bottom: parent.bottom
topMargin: 0
bottomMargin: 9
bottomMargin: 5
rightMargin: 9
leftMargin: 9
}
@@ -57,7 +57,7 @@ ApplicationWindow
}
else
{
if (db_con) appLoader.source= "AddApplicant.qml"
if (db_con) appLoader.source= "LoginScreen.qml"
else appLoader.source= "NoDbConnection.qml"
}
}

BIN
doc/PYQCRM_DATENBANK.odt Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

BIN
doc/pyqcrm_er_diagram.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 KiB

View File

@@ -8,13 +8,17 @@ class AddressDAO:
def __init__(self):
#print(f"*** File: {__file__}, init()")
self.__con = DbManager().getConnection()
if self.__con:
self.__cur = self.__con.cursor()
def __importPlz(self):
with open("import json filepath here", "r") as plz:
with open("pfad zur datei", "r") as plz:
postcodes = json.load(plz)
irgendwas = ""
try:
for i in postcodes:
test =i["plz_name"].split(",")
@@ -24,13 +28,44 @@ class AddressDAO:
town = town.strip()
if town:
print(f"PROCESSING {i['name']} {town}")
self.__cur.callproc("addZipCodes", (i["name"], town,))
self.__cur.callproc("addZipCodes", (i["name"], town, irgendwas,))
#self.__cur.callproc("addZipCodes", ("56271", "Kleinmaischeid", irgendwas,))
except mariadb.OperationalError as e:
print(f"Database Error: {e}")
finally:
self.__con.commit()
print("FINISHED")#
def __importCountry(self):
with open("pfad zur datei", "r") as country:
countries = json.load(country)
old = ""
try:
for i in countries["daten"]:
if i[4] == "":
continue
elif i[8] == "YU":
continue
elif i[4] == old:
continue
elif i[4] == "Serbien und Montenegro":
continue
elif i[4] == "Bosnien und Herzegowina":
continue
print(i[4], i[3], i[2], i[8], i[7])
self.__cur.execute("INSERT INTO country (country, countryshort, nationality, iso2, iso3) VALUES (%s, %s, %s, %s, %s)", (i[4], i[3], i[2], i[8], i[7]))
old = i[4]
except mariadb.OperationalError as e:
print(f"Database Error: {e}")
finally:
self.__con.commit()
print("FINISHED")#
def getAddressData(self, all = True, zipcode = None):
try:
if self.__cur:

View File

@@ -15,6 +15,8 @@ from lib.DB.BTypeModel import BTypeModel
from lib.DB.ContactModel import ContactModel
# [pyqcrm]
# program-name=""
# version=

10
qml.qrc
View File

@@ -29,5 +29,15 @@
<file>Gui/ApplicantContactData.qml</file>
<file>Gui/ApplicantBankData.qml</file>
<file>Gui/ApplicantNationality.qml</file>
<file>Gui/ApplicantNationalInsurance.qml</file>
<file>Gui/ApplicantMiniJob.qml</file>
<file>Gui/ApplicantVarious.qml</file>
<file>Gui/ApplicantBirthData.qml</file>
<file>Gui/CustomersTable.qml</file>
<file>Gui/CustomerDetails.qml</file>
<file>Gui/ObjectsTable.qml</file>
<file>Gui/EmployeesTable.qml</file>
<file>Gui/EmployeeDetails.qml</file>
<file>Gui/ObjectDetails.qml</file>
</qresource>
</RCC>