2 Commits

Author SHA256 Message Date
bf3bf8fe3e remove test https push main.py 2025-05-14 11:09:17 +02:00
fff434a3b5 test https push in main.py 2025-05-14 11:08:13 +02:00
36 changed files with 1315 additions and 30249 deletions

2
.gitignore vendored
View File

@@ -210,7 +210,7 @@ dmypy.json
# pytype static type analyzer # pytype static type analyzer
.pytype/ .pytype/
.qtcreator/ .qtcreator/
*.pyproject.user* *.pyproject.user
# Cython debug symbols # Cython debug symbols
cython_debug/ cython_debug/

120
Gui/AddCustomer.qml Normal file
View File

@@ -0,0 +1,120 @@
// import QtQuick
// import QtQuick.Layouts
// import QtQuick.Controls
// import QtQuick.Dialogs
// import Js
// ColumnLayout
// {
// property var new_business: null
// Layout.fillWidth: true
// Layout.fillHeight: true
// spacing: 15
// Label
// {
// text: qsTr("Kunden anlegen")
// horizontalAlignment: Text.AlignHCenter
// Layout.fillWidth: true
// font.pixelSize: 35
// }
// CheckBox
// {
// id: checkAddContact
// text: qsTr("Ansprechpartner hinzufügen")
// Layout.alignment: Qt.AlignRight
// checked: false
// onCheckStateChanged:
// {
// checkFields()
// }
// }
// RowLayout
// {
// id: addCustomer
// Layout.fillWidth: true
// Layout.fillHeight: true
// spacing: 45
// Frame
// {
// Layout.alignment: Qt.AlignTop
// Layout.fillWidth: true
// CustomerView
// {
// id: customerView
// width: parent.width
// }
// }
// AddContact
// {
// id: addContactFrame
// visible: checkAddContact.checked
// }
// }
// RowLayout
// {
// Layout.fillHeight: true
// Layout.alignment: Qt.AlignRight
// Button
// {
// text: qsTr("Abbrechen")
// onClicked: contentStack.pop()
// }
// Button
// {
// id: saveBtn
// text: qsTr("Speichern")
// enabled: false
// onClicked:
// {
// if (!checkAddContact.checked)
// {
// new_business = JsLib.parseForm(customerView)
// business_model.addBusiness(new_business, 0)
// contentStack.pop()
// }
// else
// {
// new_business = JsLib.parseForm(customerView)
// var new_contact = JsLib.parseForm(addContactFrame.contactGrid)
// contact_model.addContact(new_contact)
// }
// }
// }
// }
// Item
// {
// id: spacer3
// Layout.fillHeight: true
// }
// //Component.onCompleted: contact_model.contactIdReady.connect(onContactId)
// Connections
// {
// target: contact_model
// function onContactIdReady()
// {
// var con_id = arguments[0]
// business_model.addBusiness(new_business, con_id)
// contentStack.pop()
// }
// }
// function checkFields()
// {
// if(checkAddContact.checked)
// {
// if(!customerView.checkBusinessField() || !addContactFrame.checkContactField())
// saveBtn.enabled = false
// else
// saveBtn.enabled = true
// }
// else if (!customerView.checkBusinessField())
// saveBtn.enabled = false
// else
// saveBtn.enabled = true
// }
// }

View File

@@ -4,121 +4,117 @@ import QtQuick.Controls
import QtQuick.Dialogs import QtQuick.Dialogs
import Js import Js
import Gui import Gui
ScrollView ScrollView
{ {
id: scroll id: scroll
width: parent.width width: parent.width
height: parent.height height: parent.height
ColumnLayout
{
property var new_business: null property var new_business: null
height: Screen.desktopAvailableHeight
width: scroll.width
Layout.fillWidth: true
Layout.fillHeight: true
spacing: 15
ColumnLayout Label
{ {
text: qsTr("Kunden anlegen")
height: Screen.desktopAvailableHeight horizontalAlignment: Text.AlignHCenter
width: scroll.width
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true font.pixelSize: 35
spacing: 15
Label
{
text: qsTr("Kunden anlegen")
horizontalAlignment: Text.AlignHCenter
Layout.fillWidth: true
font.pixelSize: 35
}
CheckBox
{
id: checkAddContact
text: qsTr("Ansprechpartner hinzufügen")
Layout.alignment: Qt.AlignRight
checked: false
onCheckStateChanged:
{
checkFields()
}
}
RowLayout
{
id: addCustomer
// Layout.fillWidth: true
// Layout.fillHeight: true
spacing: 45
Frame
{
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
CustomerView
{
id: customerView
width: parent.width
}
}
AddContact
{
id: addContactFrame
visible: checkAddContact.checked
}
}
RowLayout
{
Layout.fillHeight: true
Layout.alignment: Qt.AlignRight
Button
{
text: qsTr("Abbrechen")
onClicked: contentStack.pop()
}
Button
{
id: saveBtn
text: qsTr("Speichern")
enabled: false
onClicked:
{
if (!checkAddContact.checked)
{
new_business = JsLib.parseForm(customerView)
console.log(JSON.stringify(new_business))
business_model.addBusiness(new_business, 0)
contentStack.pop()
}
else
{
new_business = JsLib.parseForm(customerView)
var new_contact = JsLib.parseForm(addContactFrame.contactGrid)
contact_model.addContact(new_contact)
}
}
}
}
Item
{
id: spacer3
Layout.fillHeight: true
}
//Component.onCompleted: contact_model.contactIdReady.connect(onContactId)
Connections
{
target: contact_model
function onContactIdReady()
{
var con_id = arguments[0]
business_model.addBusiness(new_business, con_id)
contentStack.pop()
}
}
} }
CheckBox
{
id: checkAddContact
text: qsTr("Ansprechpartner hinzufügen")
Layout.alignment: Qt.AlignRight
checked: false
onCheckStateChanged:
{
checkFields()
}
}
RowLayout
{
id: addCustomer
// Layout.fillWidth: true
// Layout.fillHeight: true
spacing: 45
Frame
{
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
CustomerView
{
id: customerView
width: parent.width
}
}
AddContact
{
id: addContactFrame
visible: checkAddContact.checked
}
}
RowLayout
{
Layout.fillHeight: true
Layout.alignment: Qt.AlignRight
Button
{
text: qsTr("Abbrechen")
onClicked: contentStack.pop()
}
Button
{
id: saveBtn
text: qsTr("Speichern")
enabled: true
onClicked:
{
if (!checkAddContact.checked)
{
new_business = JsLib.parseForm(customerView)
business_model.addBusiness(new_business, 0)
contentStack.pop()
}
else
{
new_business = JsLib.parseForm(customerView)
var new_contact = JsLib.parseForm(addContactFrame.contactGrid)
contact_model.addContact(new_contact)
}
}
}
}
Item
{
id: spacer3
Layout.fillHeight: true
}
//Component.onCompleted: contact_model.contactIdReady.connect(onContactId)
Connections
{
target: contact_model
function onContactIdReady()
{
var con_id = arguments[0]
business_model.addBusiness(new_business, con_id)
contentStack.pop()
}
}
function checkFields() function checkFields()
{ {
if(checkAddContact.checked) if(checkAddContact.checked)
@@ -134,3 +130,4 @@ ScrollView
saveBtn.enabled = true saveBtn.enabled = true
} }
} }
}

View File

@@ -276,7 +276,7 @@ GridLayout
} }
function checkBusinessField() function checkBusinessField()
{ {
if (!firmenName.text.trim() || !streetid.text.trim() || !housenoid.text.trim()) if (!firmenName.text.trim() || !streetid.text.trim())
{ {
return false return false

View File

@@ -13,10 +13,10 @@ ColumnLayout {
anchors.fill: parent
spacing: Dimensions.l spacing: Dimensions.l
// Component.onCompleted: contentStack.pop() Component.onCompleted: contentStack.pop()
RowLayout RowLayout
{ {

View File

@@ -0,0 +1,174 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
GridLayout
{
columns: 2
rowSpacing: 25
Layout.leftMargin: 7
// Grid row
ColumnLayout
{
Layout.columnSpan: 2
Label
{
id: contactLabel
color: "darksalmon"
font.bold: true
text: qsTr("Ansprechpartner")
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['salute'] + " " + contact['contact']['fname'] + " " + contact['contact']['lname']: ""
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Geburtsdatum")
font.bold: true
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['birthday']: ""
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("E-Mail")
font.bold: true
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['email']: ""
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Position")
font.bold: true
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['position']: ""
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Priorität")
font.bold: true
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['priority']: ""
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Telefon")
font.bold: true
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['phone']: ""
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Handy")
font.bold: true
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['cell']: ""
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Abrechnung")
font.bold: true
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['invoice']: ""
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Mahnung")
font.bold: true
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['reminder']: ""
}
}
// Grid row
Item
{
Layout.columnSpan: 2
Layout.fillHeight: true
}
Component.onCompleted:
{
if (contact && contact['contact']['salute'] === "Frau")
contactLabel.text = qsTr("Ansprechpartnerin")
}
}

61
Gui/CustomerDetails.qml Normal file
View File

@@ -0,0 +1,61 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
ColumnLayout
{
property int selectedClient: -1
property var client: null
property var contact: null
id: clDet
Button
{
text: qsTr("Zurück")
onClicked: contentStack.pop()
}
SplitView
{
id: clDetView
Layout.fillHeight: true
Layout.fillWidth: true
leftPadding: 9
rightPadding: 9
CustomerDetailsView
{
id: customerDetails
}
CustomerContactDetails
{
id: contactDetails
visible: false
}
NoCustomerContact
{
id: noCustomerContact
visible: false
}
}
Item
{
//Layout.columnSpan: 2
Layout.fillHeight: true
}
Component.onCompleted:
{
//business_model.onRowClicked(selectedClient)
client = business_model.getClientDetails()
if (client['business']['contactid'] > 0)
{
contact = contact_model.getContactDetails(client['business']['contactid'])
contactDetails.visible = true
}
else noCustomerContact.visible = true
}
}

225
Gui/CustomerDetailsView.qml Normal file
View File

@@ -0,0 +1,225 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
GridLayout
{
columns: 2
rowSpacing: 25
SplitView.preferredWidth: clDetView.width / 3 * 1.8
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Steuer-ID")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['tax']? client['business']['tax']: ""
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Anmerkungen")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['info']? client['business']['info']: ""
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Kundenname")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['company']
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("CEO")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['ceo']
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Telefon")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['phone']? client['business']['phone']: ""
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Handy")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['cell']? client['business']['cell']: ""
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Webseite")
font.bold: true
}
Label
{
id: clientWebsite
color: "goldenrod"
font.underline: false
text: client['business']['website']? '<a href="' + client['business']['website'] + '">' + client['business']['website'] + '</a>': ""
onLinkActivated:
{
var web_protocol = /^((http|https):\/\/)/;
var client_website = !web_protocol.test(client['business']['website'])? "https://" + client['business']['website']: client['business']['website'];
Qt.openUrlExternally(client_website)
}
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("E-Mail")
font.bold: true
}
Label
{
id: clientEmail
color: "goldenrod"
text: client['business']['email']? '<a href="mailto:' + client['business']['email'] + '">' + client['business']['email'] + '</a>': ""
onLinkActivated: Qt.openUrlExternally('mailto:' + client['business']['email'])
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Straße")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['street']? client['business']['tax']: ""
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Haus-Nr.")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['house']? client['business']['house']: ""
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("PLZ")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['zip']? client['business']['zip']: ""
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Stadt")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['city']? client['business']['city']: ""
}
}
// Grid row
// Item
// {
// Layout.columnSpan: 2
// Layout.fillHeight: true
// }
}

271
Gui/CustomerView.qml Normal file
View File

@@ -0,0 +1,271 @@
// import QtQuick
// import QtQuick.Controls
// import QtQuick.Layouts
// GridLayout
// {
// id: customerView
// columns: 4
// Layout.fillWidth: true
// Layout.fillHeight: true
// rowSpacing: 9
// property alias businesstxt: firmenName
// property alias street: streetid
// property alias postcodetxt: postcode
// property alias citytxt: city
// Label
// {
// id: lblFirmenName
// text: qsTr("Firmenname*")
// Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
// }
// TextField
// {
// property string name: "business"
// id: firmenName
// Layout.fillWidth: true
// Layout.alignment: Qt.AlignVCenter
// onTextChanged: checkFields()
// Layout.columnSpan: 3
// }
// Label
// {
// text: qsTr("Straße*")
// Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
// }
// TextField
// {
// property string name: "street"
// id: streetid
// Layout.fillWidth: true
// onTextChanged: checkFields()
// }
// Label
// {
// text: qsTr("Nr.*")
// Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
// }
// TextField
// {
// property string name: "houseno"
// id: housenoid
// Layout.fillWidth: true
// onTextChanged: checkFields()
// validator: RegularExpressionValidator
// {
// regularExpression: /([0-9a-zA-Z\-]{1,6})/
// }
// }
// Label
// {
// text: qsTr("PLZ")
// Layout.alignment: Qt.AlignRight
// }
// ComboBox
// {
// property string name: "postcode"
// id: postcode
// Layout.fillWidth: true
// editable: true
// onCurrentTextChanged: checkFields()
// onEditTextChanged: checkFields()
// onActivated: currentValue
// model: address_model
// textRole: "display"
// popup.height: 300
// currentIndex: -1
// onCurrentIndexChanged: city.currentIndex = postcode.currentIndex
// Layout.columnSpan: 3
// validator: RegularExpressionValidator
// {
// regularExpression: /([0-9]{1,5})/
// }
// }
// Label
// {
// text: qsTr("Ort")
// Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
// }
// ComboBox
// {
// property string name: "city"
// id: city
// Layout.fillWidth: true
// editable: true
// onEditTextChanged: checkFields()
// onCurrentTextChanged: checkFields()
// model: address_model
// textRole: "city"
// popup.height: 300
// currentIndex: -1
// Layout.columnSpan: 3
// }
// Label
// {
// text: qsTr("Telefon")
// Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
// }
// TextField
// {
// property string name: "telephone"
// id: telephone
// Layout.fillWidth: true
// Layout.columnSpan: 3
// validator: RegularExpressionValidator
// {
// regularExpression: /([+0-9]{1})([0-9]{1,17})/
// }
// }
// Label
// {
// text: qsTr("Mobil")
// Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
// }
// TextField
// {
// property string name: "cellphone"
// id: cellphone
// Layout.fillWidth: true
// Layout.columnSpan: 3
// validator: RegularExpressionValidator
// {
// regularExpression: /([+0-9]{1})([0-9]{1,17})/
// }
// }
// Label
// {
// text: qsTr("E-Mail")
// Layout.alignment: Qt.AlignRight
// }
// TextField
// {
// property string name: "email"
// id: email
// Layout.fillWidth: true
// placeholderText: qsTr("beispiel@domain.de")
// Layout.columnSpan: 3
// validator: RegularExpressionValidator
// {
// regularExpression: /([\+!#$%&\*\\/\=?\^_`\.{|}\~\-\_0-9A-Za-z]{1,185})@([0-9A-Za-z\.\-\_]{1,64})\.([a-zA-z]{2,5})/
// }
// }
// Label
// {
// text: qsTr("Homepage")
// Layout.alignment: Qt.AlignRight
// }
// TextField
// {
// property string name: "homepage"
// id: homepage
// Layout.fillWidth: true
// Layout.columnSpan: 3
// placeholderText: "www.oschkarischtverhaftetwegensexy.jinx"
// }
// Label
// {
// text: qsTr("Geschäftsführer")
// Layout.alignment: Qt.AlignRight
// }
// TextField
// {
// property string name: "ceo"
// id: ceo
// Layout.fillWidth: true
// Layout.columnSpan: 3
// }
// Label
// {
// text: qsTr("USt-IdNr")
// Layout.alignment: Qt.AlignRight
// }
// TextField
// {
// property string name: "taxno"
// id: taxno
// Layout.fillWidth: true
// Layout.columnSpan: 3
// }
// Label
// {
// text: qsTr("Typ")
// Layout.alignment: Qt.AlignRight
// }
// ComboBox
// {
// property string name: "typeid"
// id: typeid
// Layout.fillWidth: true
// editable: false
// model: business_type
// textRole: "display"
// Layout.columnSpan: 3
// }
// Label
// {
// text: qsTr("Info")
// Layout.alignment: Qt.AlignRight | Qt.AlignTop
// }
// ScrollView
// {
// id: infoView
// Layout.fillWidth: true
// Layout.preferredHeight: 100
// Layout.columnSpan: 3
// ScrollBar.horizontal: ScrollBar
// {
// policy: ScrollBar.AlwaysOn
// }
// TextArea
// {
// property string name: "customerinfo"
// id: customerInfo
// implicitWidth: parent.width
// wrapMode: TextEdit.Wrap
// background: Rectangle
// {
// color: customerInfo.palette.base
// border.color: customerInfo.activeFocus? customerInfo.palette.highlight: customerInfo.palette.base
// }
// }
// }
// function checkBusinessField()
// {
// if (!firmenName.text.trim() || !streetid.text.trim())
// {
// return false
// }
// else
// {
// if (!postcode.editText.trim() || !postcode.currentText || !city.editText.trim() || !city.currentText)
// return false
// else
// return true
// }
// }
// }

177
Gui/CustomersTable.qml Normal file
View File

@@ -0,0 +1,177 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
ColumnLayout {
property var availableFilters: ["Name", "Adresse", "PLZ", "Ort"]
function viewCriterion(criterion)
{
business_model.viewCriterion(criterion.text);
}
anchors.fill: parent
spacing: Dimensions.l
Component.onCompleted: contentStack.pop()
RowLayout
{
Layout.fillWidth: true
spacing: Dimensions.l
SearchBar
{
}
QuickFilter {
onSelectedChanged: (name) => {
business_model.viewCriterion(name)
}
model: ListModel {
ListElement {
name: "Alle"
text: qsTr("Alle")
selected: true
}
ListElement {
name: "Interessent"
text: qsTr("Interessent")
selected: false
}
ListElement {
name: "Kunde"
text: qsTr("Kunde")
selected: false
}
ListElement {
name: "Lieferant"
text: qsTr("Lieferant")
selected: false
}
ListElement {
name: "Erledigt"
text: qsTr("Erledigt")
selected: false
}
}
}
Button
{
id: addCustomer
Layout.alignment: Qt.AlignRight
icon.source: "qrc:/images/PlusCircle.svg"
text: qsTr("Kunde Hinzufügen")
onClicked: contentStack.push("AddCustomer.qml")
}
}
ColumnLayout
{
Layout.fillWidth: true
Layout.fillHeight: true
Layout.verticalStretchFactor: 1
clip: true
HorizontalHeaderView
{
id: horizontalHeader
Layout.fillWidth: true
implicitHeight: 40
movableColumns: true //@disable-check M16
syncView: customerTable
delegate: Rectangle
{
Layout.fillWidth: true
border.color: addCustomer.palette.base
color: addCustomer.palette.alternateBase
implicitHeight: 40
implicitWidth: 1
Text
{
color: addCustomer.palette.text
elide: Text.ElideRight
height: parent.height
horizontalAlignment: Text.AlignHCenter
text: model.display
verticalAlignment: Text.AlignVCenter
width: parent.width
}
}
}
TableView {
id: customerTable
property real newWidth: 0
Layout.fillHeight: true
Layout.fillWidth: true
alternatingRows: true
columnSpacing: 1
model: business_model
resizableColumns: true
rowSpacing: 2
selectionBehavior: TableView.SelectRows
z: 1
ScrollBar.vertical: ScrollBar {
policy: customerTable.contentHeight > customerTable.height ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff
}
delegate: Rectangle {
required property bool current
required property bool selected
color: selected ? addCustomer.palette.highlight //palette.highlight
: (customerTable.alternatingRows && row % 2 !== 0 ? addCustomer.palette.base // palette.base
: addCustomer.palette.alternateBase) //palette.alternateBase)
implicitHeight: 25
implicitWidth: customerTable.width / customerTable.columns
Text {
color: addCustomer.palette.text
elide: Text.ElideRight
height: parent.height
leftPadding: 9
text: model.display == null ? "" : model.display // @disable-check M126
verticalAlignment: Text.AlignVCenter
width: parent.width
}
MouseArea {
id: mouseArea
property bool hovered: false
anchors.fill: parent
hoverEnabled: true
onDoubleClicked: {
business_model.onRowClicked(row);
contentStack.push("CustomerDetails.qml", {
selectedClient: row
});
}
onEntered: {
customerTable.selectionModel.select(customerTable.model.index(row, 0), ItemSelectionModel.SelectCurrent | ItemSelectionModel.Rows);
}
}
}
selectionModel: ItemSelectionModel {
id: selModel
model: customerTable.model
}
}
}
Item {
Layout.fillHeight: true
}
}

View File

@@ -1,51 +1,42 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls
import TeroStyle import TeroStyle
import Js
ScrollView ColumnLayout {
{ anchors.fill: parent
ColumnLayout { spacing: Dimensions.l
Component.onCompleted: {
employee_model.addedNewEmployee.connect(successful => {
if (successful)
contentStack.pop();
});
}
ApplicantForm {
id: applicantForm
Layout.alignment: Qt.AlignTop
Layout.fillHeight: true
Layout.verticalStretchFactor: 1
}
RowLayout {
Layout.alignment: Qt.AlignRight
spacing: Dimensions.l spacing: Dimensions.l
Component.onCompleted: {
employee_model.addedNewEmployee.connect(successful => { Button {
if (successful) icon.source: "qrc:/images/ArrowLeftCircle-Outline.svg"
contentStack.pop(); text: qsTr("Verwerfen")
});
onClicked: contentStack.pop()
} }
Button {
enabled: applicantForm.valid
icon.source: "qrc:/images/CheckCircle.svg"
text: qsTr("Speichern")
ApplicantForm onClicked: {
{ employee_model.addApplicant(applicantForm.value);
id: applicantForm
Layout.alignment: Qt.AlignTop
Layout.fillHeight: true
Layout.verticalStretchFactor: 1
}
RowLayout
{
Layout.alignment: Qt.AlignRight
spacing: Dimensions.l
Button
{
icon.source: "qrc:/images/ArrowLeftCircle-Outline.svg"
text: qsTr("Verwerfen")
onClicked: contentStack.pop()
}
Button
{
enabled: applicantForm.valid
icon.source: "qrc:/images/CheckCircle.svg"
text: qsTr("Speichern")
onClicked:
{
employee_model.addApplicant(applicantForm.value);
}
} }
} }
} }

View File

@@ -2,9 +2,9 @@ import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import Js import Js
ColumnLayout {
id: colPar
ScrollView
{
function checkFields() { function checkFields() {
if (!personalData.checkPersonalField()) if (!personalData.checkPersonalField())
saveBtn.enabled = false; saveBtn.enabled = false;
@@ -19,91 +19,83 @@ ScrollView
console.log('failedtoadd'); console.log('failedtoadd');
} }
} }
ColumnLayout {
id: colPar
Layout.fillHeight: true
Layout.fillWidth: true
anchors.fill: parent
implicitWidth: parent.width
Component.onCompleted: {
employee_model.addedNewEmployee.connect(onAddNewEmployee);
}
Layout.fillHeight: true Label {
id: headline
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
font.pixelSize: 35
text: qsTr("Mitarbeiter / Bewerber hinzufügen")
}
RowLayout {
Layout.fillWidth: true Layout.fillWidth: true
anchors.fill: parent spacing: Dimensions.l
implicitWidth: parent.width
Component.onCompleted: { Frame {
employee_model.addedNewEmployee.connect(onAddNewEmployee); Layout.alignment: Qt.AlignTop
}
Label {
id: headline
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
font.pixelSize: 35
text: qsTr("Mitarbeiter / Bewerber hinzufügen")
}
RowLayout {
Layout.fillWidth: true Layout.fillWidth: true
spacing: Dimensions.l Layout.horizontalStretchFactor: 1
EmployeePersonalData {
id: personalData
implicitWidth: parent.width
Frame {
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
Layout.horizontalStretchFactor: 1
EmployeePersonalData {
id: personalData
implicitWidth: parent.width
}
}
Frame {
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
Layout.horizontalStretchFactor: 1
ColumnLayout {
Layout.alignment: Qt.AlignTop
implicitWidth: parent.width
EmployeeBankData {
id: bankAccount
}
EmployeeNationalInsurance {
id: nationalInsurance
}
EmployeeVarious {
id: applicantVarious
}
}
} }
} }
Item { Frame {
Layout.fillHeight: true Layout.alignment: Qt.AlignTop
}
RowLayout {
Layout.alignment: Qt.AlignRight
Layout.fillWidth: true Layout.fillWidth: true
Layout.horizontalStretchFactor: 1
Button { ColumnLayout {
text: qsTr("Abbrechen") Layout.alignment: Qt.AlignTop
implicitWidth: parent.width
onClicked: contentStack.pop() EmployeeBankData {
} id: bankAccount
Button {
id: saveBtn
enabled: false }
text: qsTr("Speichern") EmployeeNationalInsurance {
id: nationalInsurance
}
EmployeeVarious {
id: applicantVarious
onClicked: {
const new_applicant = JsLib.parseForm(personalData, bankAccount, nationalInsurance, applicantVarious);
employee_model.addEmployee(new_applicant);
} }
} }
} }
} }
Item {
Layout.fillHeight: true
}
RowLayout {
Layout.alignment: Qt.AlignRight
Layout.fillWidth: true
Button {
text: qsTr("Abbrechen")
onClicked: contentStack.pop()
}
Button {
id: saveBtn
enabled: false
text: qsTr("Speichern")
onClicked: {
const new_applicant = JsLib.parseForm(personalData, bankAccount, nationalInsurance, applicantVarious);
employee_model.addEmployee(new_applicant);
}
}
}
} }

View File

@@ -8,21 +8,19 @@ ColumnLayout
readonly property int fieldM: 235 readonly property int fieldM: 235
readonly property int fieldS: 110 readonly property int fieldS: 110
readonly property bool valid: city.acceptableInput && email.acceptableInput && firstname.acceptableInput && lastname.acceptableInput && mobile.acceptableInput && phone.acceptableInput && postcode.acceptableInput && formofaddress.acceptableInput && title.acceptableInput readonly property bool valid: city.acceptableInput && email.acceptableInput && firstname.acceptableInput && lastname.acceptableInput && mobile.acceptableInput && phone.acceptableInput && postcode.acceptableInput && formofaddress.acceptableInput && title.acceptableInput
readonly property var value: QtObject readonly property var value: QtObject {
{ readonly property string city: (city.editText ? city.editText : city.currentText) ?? ""
readonly property string city: (city.editText ? city.editText : city.currentText) ?? "" readonly property string email: email.text
readonly property string email: email.text readonly property string firstname: firstname.text
readonly property string firstname: firstname.text readonly property string formofaddress: formofaddress.currentText ?? ""
readonly property string formofaddress: formofaddress.text readonly property string houseno: houseno.text ?? ""
readonly property string houseno: houseno.text readonly property string lastname: lastname.text
readonly property string lastname: lastname.text readonly property string mobile: mobile.text
readonly property string mobile: mobile.text readonly property string phone: phone.text
readonly property string phone: phone.text readonly property string postcode: (postcode.editText ? postcode.editText : postcode.currentText) ?? ""
readonly property string postcode: (postcode.editText ? postcode.editText : postcode.currentText) ?? "" readonly property string street: (street.editText ? street.editText : street.currentText) ?? ""
readonly property string street: street.text readonly property string title: title.currentText
readonly property string title: title.currentText }
readonly property string country: (country.editText ? country.editText : country.currentText) ?? ""
}
spacing: Dimensions.l spacing: Dimensions.l
@@ -43,7 +41,6 @@ ColumnLayout
label: qsTr("Anrede") label: qsTr("Anrede")
ComboBox { ComboBox {
// property string name: "title"
id: title id: title
implicitWidth: fieldM implicitWidth: fieldM
@@ -63,14 +60,11 @@ ColumnLayout
} }
} }
} }
Field Field {
{
label: qsTr("Vorname") label: qsTr("Vorname")
mandatory: true mandatory: true
TextField TextField {
{
// property string name: "firstname"
id: firstname id: firstname
implicitWidth: fieldM implicitWidth: fieldM
@@ -85,7 +79,6 @@ ColumnLayout
mandatory: true mandatory: true
TextField { TextField {
// property string name: "lastname"
id: lastname id: lastname
implicitWidth: fieldM implicitWidth: fieldM
@@ -99,45 +92,39 @@ ColumnLayout
RowLayout { RowLayout {
spacing: Dimensions.m spacing: Dimensions.m
Field Field {
{ id: street
label: qsTr("Straße") label: qsTr("Straße")
mandatory: true mandatory: true
TextField TextField {
{
// property string name: "street"
id: street
implicitWidth: fieldM implicitWidth: fieldM
placeholderText: qsTr("Musterstraße") placeholderText: qsTr("Musterstraße")
validator: NotEmptyValidator { validator: NotEmptyValidator {
} }
} }
} }
Field Field {
{ id: houseno
mandatory: true mandatory: true
label: qsTr("Hausnummer") label: qsTr("Hausnummer")
TextField TextField {
{
// property string name: "houseno"
id: houseno
implicitWidth: fieldS implicitWidth: fieldS
placeholderText: qsTr("1a") placeholderText: qsTr("1a")
validator: NotEmptyValidator { validator: NotEmptyValidator {
} }
} }
} }
Field Field {
{
label: qsTr("PLZ") label: qsTr("PLZ")
mandatory: true mandatory: true
ComboBox ComboBox {
{
// property string name: "postcode"
id: postcode id: postcode
currentIndex: -1 currentIndex: -1
@@ -152,14 +139,11 @@ ColumnLayout
validator: NotEmptyValidator {} validator: NotEmptyValidator {}
} }
} }
Field Field {
{
label: qsTr("Ort") label: qsTr("Ort")
mandatory: true mandatory: true
ComboBox ComboBox {
{
// property string name: "city"
id: city id: city
currentIndex: -1 currentIndex: -1
@@ -172,22 +156,6 @@ ColumnLayout
} }
} }
} }
Field
{
label: qsTr("Land")
mandatory: true
ComboBox
{
// property string name: "country"
id: country
currentIndex: 37
editable: true
implicitWidth: fieldM
model: address_model
textRole: "country"
}
}
} }
IconLabel { IconLabel {
color: Colors.foreground color: Colors.foreground
@@ -206,7 +174,6 @@ ColumnLayout
label: qsTr("Telefonnummer") label: qsTr("Telefonnummer")
TextField { TextField {
// property string name: "phone"
id: phone id: phone
implicitWidth: fieldM implicitWidth: fieldM
@@ -216,13 +183,10 @@ ColumnLayout
} }
} }
} }
Field Field {
{
label: qsTr("Mobil") label: qsTr("Mobil")
TextField TextField {
{
// property string name: "mobile"
id: mobile id: mobile
implicitWidth: fieldM implicitWidth: fieldM
@@ -232,13 +196,10 @@ ColumnLayout
} }
} }
} }
Field Field {
{
label: qsTr("E-Mail Adresse") label: qsTr("E-Mail Adresse")
TextField TextField {
{
// property string name: "email"
id: email id: email
implicitWidth: fieldM implicitWidth: fieldM
@@ -248,13 +209,10 @@ ColumnLayout
} }
} }
} }
Field Field {
{
label: qsTr("Briefanrede") label: qsTr("Briefanrede")
TextField TextField {
{
// property string name: "formofaddress"
id: formofaddress id: formofaddress
implicitWidth: fieldM implicitWidth: fieldM

View File

@@ -4,6 +4,7 @@ import QtQuick.Controls
import Qt.labs.qmlmodels import Qt.labs.qmlmodels
ColumnLayout { ColumnLayout {
anchors.fill: parent
spacing: Dimensions.l spacing: Dimensions.l
RowLayout { RowLayout {

View File

@@ -19,8 +19,8 @@ Item {
contentStack.replace("Dashboard.qml"); contentStack.replace("Dashboard.qml");
} }
// anchors.fill: parent anchors.fill: parent
// anchors.topMargin: Dimensions.l anchors.topMargin: Dimensions.l
Component.onCompleted: { Component.onCompleted: {
loggedin_user.loginOkay.connect(loggedin); loggedin_user.loginOkay.connect(loggedin);

View File

@@ -38,7 +38,7 @@ ColumnLayout {
BarButton { BarButton {
ButtonGroup.group: mainNav ButtonGroup.group: mainNav
icon.source: "qrc:/images/BuildingOffice2-Outline.svg" icon.source: "qrc:/images/BuildingOffice2-Outline.svg"
target: "/Gui/Objects/ObjectsTable.qml" target: "/Gui/ObjectsTable.qml"
text: qsTr("Objekt") text: qsTr("Objekt")
visible: !onSubPage visible: !onSubPage
} }

View File

@@ -1,255 +0,0 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
GridLayout
{
id: newObject
columns: 4
Layout.fillWidth: true
Layout.fillHeight: true
rowSpacing: 9
//// New grid row
Label
{
text: qsTr("Land")
Layout.alignment: Qt.AlignRight
visible: false
}
ComboBox
{
property string name: "country"
id: country
Layout.fillWidth: true
editable: true
// onEditTextChanged: checkFields()
// onCurrentTextChanged: checkFields()
model: address_model
textRole: "country"
popup.height: 300
currentIndex: 37
visible: false
}
Label
{
text: qsTr("PLZ")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
ComboBox
{
property string name: "postcode"
id: postcode
Layout.fillWidth: true
editable: true
onCurrentTextChanged: checkFields()
onEditTextChanged: checkFields()
onActivated: currentValue
model: address_model
textRole: "display"
popup.height: 300
currentIndex: -1
onCurrentIndexChanged: city.currentIndex = postcode.currentIndex
validator: RegularExpressionValidator
{
regularExpression: /([0-9]{1,5})/
}
}
Label
{
text: qsTr("Ort")
Layout.alignment: Qt.AlignRight
}
ComboBox
{
property string name: "city"
id: city
Layout.fillWidth: true
editable: true
onEditTextChanged: checkFields()
onCurrentTextChanged: checkFields()
model: address_model
textRole: "city"
popup.height: 300
currentIndex: -1
}
Label
{
text: qsTr("Straße*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
property string name: "street"
id: street
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
onTextChanged: checkFields()
}
Label
{
text: qsTr("Nr.*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
property string name: "houseno"
id: houseno
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
onTextChanged: checkFields()
}
// New grid row
// New grid row
Label
{
text: qsTr("Parteien")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
SpinBox
{
property string name: "units"
id: partitions
Layout.fillWidth: true
from: 1
to: 100
value: 1
editable: true
}
Label
{
text: qsTr("Stockwerke")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
SpinBox
{
property string name: "floors"
id: floors
Layout.fillWidth: true
from: 1
to: 100
value: 1
editable: true
}
// New grid row
Label
{
text: qsTr("Zwischenetage")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
ComboBox
{
property string name: "mezzanin"
id: mezzanin
Layout.fillWidth: true
editable: false
model: [qsTr("Ja"), qsTr("Nein")]
}
Label
{
text: qsTr("Aufzug")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
ComboBox
{
property string name: "lift"
id: lift
Layout.fillWidth: true
editable: false
model: [qsTr("Ja"), qsTr("Nein")]
}
//New grid row
Label
{
text: qsTr("Objekt-Nr.")
Layout.alignment: Qt.AlignRight
}
TextField
{
property string name: "objectno"
id: objectno
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
placeholderText: qsTr("0 oder leer um eine Nummer automatisch zu generieren")
placeholderTextColor: "pink"
}
Label
{
text: qsTr("Besonderheiten")
Layout.alignment: Qt.AlignRight
}
TextField
{
property string name: "remarks"
id: remarks
Layout.fillWidth: true
}
//// New grid row
Label
{
text: qsTr("Reinigungsmittel wo?*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
property string name: "cleaningproducts"
id: cleaningproducts
Layout.fillWidth: true
onTextChanged: checkFields()
}
Item
{
Layout.fillHeight: true
}
function checkObjectField()
{
return street.text.trim() && houseno.text.trim() &&
(postcode.editText.trim() || postcode.currentText.trim()) &&
(city.editText.trim() || city.currentText.trim()) &&
cleaningproducts.text.trim()
}
}

View File

@@ -1,163 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import QtQuick.Dialogs
import Js
ScrollView
{
id: scroll
width: parent.width
height: parent.height
ColumnLayout
{
height: Screen.desktopAvailableHeight
width: scroll.width
property var new_object: null
//property alias checkAddContact: checkAddContact
spacing: 15
Label
{
text: qsTr("Objekt anlegen")
horizontalAlignment: Text.AlignHCenter
Layout.fillWidth: true
font.pixelSize: 35
}
CheckBox
{
id: checkAddObjectContact
text: qsTr("Ansprechpartner hinzufügen")
Layout.alignment: Qt.AlignRight
checked: false
onCheckStateChanged:
{
checkFields()
}
}
RowLayout
{
id: addObject
Layout.fillWidth: true
Layout.fillHeight: true
spacing: 45
Frame
{
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
AddNewObject
{
id: newObject
width: parent.width
}
}
ObjectAddOns
{
id: addObjectLayout
visible: checkAddObjectContact.checked
}
}
RowLayout
{
Layout.fillHeight: true
Layout.alignment: Qt.AlignRight
Button
{
text: qsTr("Abbrechen")
onClicked: contentStack.pop()
}
Button
{
property var new_object: null
id: saveBtn
text: qsTr("Speichern")
enabled: false
onClicked:
{
new_object = JsLib.parseForm(newObject)
// For Debugging
console.log(JSON.stringify(new_object))
//
new_object['lift'] = new_object['lift'] === 'Ja' ? 1 : 0
new_object['mezzanin'] = new_object['mezzanin'] === 'Ja' ? 1 : 0
object_model.addObject(new_object)
}
}
}
Item
{
id: spacer3
Layout.fillHeight: true
}
Component.onCompleted:
{
//object_model.objectAdded.connect(onObjectAdded)
//contact_model.objectContactAdded.connect(onObjectContact)
}
Connections
{
target: object_model
function onObjectIdReady()
{
var obj_id = arguments[0]
if (checkAddObjectContact.checked && obj_id)
{
var new_objecto = addObjectLayout.getForm()
contact_model.addObjectContact(new_objecto, obj_id)
object_model.viewCriterion("Alle")
}
contentStack.pop()
}
}
// function onObjectAdded(added, oid)
// {
// if (!added)
// console.log(qsTr("Fehler beim Objekt-Anlegen!"))
// if (checkAddObjectContact.checked && oid)
// {
// var new_objecto = addObjectLayout.getForm()
// contact_model.addObjectContact(new_objecto, oid)
// }
// else appLoader.source = "ObjectTable.qml"
// }
// function onObjectContact(added)
// {
// if (!added)
// console.log(qsTr("Fehler beim Objekt-Kontakt-Anlegen!"))
// else
// {
// //object_model.viewCriterion("Alle")
// appLoader.source = "ObjectTable.qml"
// }
// }
}
function checkFields()
{
if(checkAddObjectContact.checked)
{
if(!newObject.checkObjectField() || !addObjectLayout.contactPerson.contacts || !addObjectLayout.contactPerson.contacts.length)
saveBtn.enabled = false
else
saveBtn.enabled = true
}
else if (!newObject.checkObjectField())
saveBtn.enabled = false
else
saveBtn.enabled = true
}
}

View File

@@ -1,130 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
ApplicationWindow
{
id: addMitarbeiter
title: qsTr("Objekt - Neuer Mitarbeiter")
ColumnLayout
{
anchors.fill: parent
anchors.margins: 10
Label
{
text: qsTr("Mitarbeiter zuweisen")
Layout.alignment: Qt.AlignHCenter
font.pixelSize: 35
}
GridLayout
{
Layout.fillWidth: true
columns: 2
rowSpacing: 4
columnSpacing: 6
Label
{
text: qsTr("Eingesetzter Mitarbeiter")
Layout.alignment: Qt.AlignRight
}
ComboBox
{
id: assignee
Layout.fillWidth: true
}
Label
{
text: qsTr("Lohn Mitarbeiter pro Stunde")
Layout.alignment: Qt.AlignRight
}
TextField
{
id: wage
Layout.fillWidth: true
}
Label
{
text: qsTr("Einsatzdauer")
Layout.alignment: Qt.AlignRight
}
TextField
{
id: duration
Layout.fillWidth: true
}
Label
{
text: qsTr("Reinigungstage")
Layout.alignment: Qt.AlignRight
}
TextField
{
id: cleanDays
Layout.fillWidth: true
}
Label
{
text: qsTr("Tätigkeiten")
Layout.alignment: Qt.AlignRight
}
TextField
{
id: tasks
Layout.fillWidth: true
}
Label
{
text: qsTr("Ertrag")
Layout.alignment: Qt.AlignRight
}
TextField
{
id: output
Layout.fillWidth: true
}
Item
{
Layout.fillHeight: true
Layout.columnSpan: 2
}
}
RowLayout
{
Layout.fillWidth: true
spacing: 5
Item
{
Layout.fillWidth: true
}
Button
{
text: qsTr("Abbrechen")
onClicked: addMitarbeiter.close()
}
Button
{
text: qsTr("Hinzufügen")
onClicked:
{
if (duration.text.trim() !== "" && wage.text.trim() !== "" && cleanDays.text.trim() !== "" && tasks.text.trim() !== "" && output.text.trim() !== "")
{
var ne = {
"assignee": assignee.currentText,
"duration": duration.text.trim(),
"wage": wage.text.trim(),
"cleandays": cleanDays.text.trim(),
"tasks": tasks.text.trim(),
"output": output.text.trim(),
};
addMitarbeiter.addNewEmployee(ne)
addMitarbeiter.close()
}
}
}
}
}
signal addNewEmployee(var new_employee)
}

View File

@@ -1,317 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
GridLayout
{
property var contacts: null
columns: 2
Layout.fillWidth: true
Label
{
text: qsTr("Position")
Layout.alignment: Qt.AlignRight | Qt.AlignTop
}
ComboBox
{
//property string name: "contacttype"
id: posizion
Layout.fillWidth: true
editable: false
model: [qsTr("Beirat"), qsTr("Hausmeister"), qsTr("Hausbewohner"), qsTr("Sonstiges")]
}
Label
{
text: qsTr("Anrede")
Layout.alignment: Qt.AlignRight
}
ComboBox
{
id: title
model: [qsTr("Herr"), qsTr("Frau"), qsTr("Keine Angabe")]
Layout.fillWidth: true
}
Label
{
text: qsTr("Vorname*")
Layout.alignment: Qt.AlignRight
}
TextField
{
id: firstname
Layout.fillWidth: true
// onTextChanged: checkContactFields()
}
Label
{
text: qsTr("Nachname*")
Layout.alignment: Qt.AlignRight
}
TextField
{
id: lastname
Layout.fillWidth: true
}
Label
{
text: mobile.text ? qsTr("Telefonnummer") : qsTr("Telefonnummer*")
Layout.alignment: Qt.AlignRight
}
TextField
{
id: phonenumber
Layout.fillWidth: true
}
Label
{
text: phonenumber.text ? qsTr("Mobil") : qsTr("Mobil*")
Layout.alignment: Qt.AlignRight
}
TextField
{
id: mobile
Layout.fillWidth: true
}
RowLayout
{
Layout.fillWidth: true
Layout.columnSpan: 2
Item
{
Layout.fillWidth: true
}
Button
{
id: removeContact
text: qsTr("Entfernen")
enabled: false
onClicked:
{
if (contactView.highlightFollowsCurrentItem)
{
delete contacts[contactView.currentIndex]
contacts = contacts.filter(elm => elm)
contactModel.remove(contactView.currentIndex)
contactView.highlightFollowsCurrentItem = false
contactView.currentIndex = -1
if (Object.keys(contacts).length === 0)
{
enabled = false
console.log(contacts)
}
checkFields()
}
}
}
Button
{
id: addContact
text: qsTr("Hinzufügen")
enabled: firstname.text.trim() && lastname.text.trim() && (phonenumber.text.trim() || mobile.text.trim()) && (contacts === null || Object.keys(contacts).length < 3)
onClicked:
{
var num_contacts = 0
if (contacts !== null && contacts !== undefined) num_contacts = Object.keys(contacts).length
else contacts = []
if (num_contacts < 3 && firstname.text.trim() !== "" && lastname.text.trim() !== "" && (phonenumber.text.trim() !== "" || mobile.text.trim() !== ""))
{
contacts[num_contacts] = {}
contacts[num_contacts]["title"] = title.currentText
contacts[num_contacts]["position"] = posizion.currentText
contacts[num_contacts]["fname"] = firstname.text.trim()
contacts[num_contacts]["lname"] = lastname.text.trim()
contacts[num_contacts]["phone"] = phonenumber.text.trim()
contacts[num_contacts]["mobile"] = mobile.text.trim()
contactModel.append({name: title.currentText + " " + firstname.text.trim() + " " + lastname.text.trim(), phone: phonenumber.text.trim(), mobile: mobile.text.trim(), posizion: posizion.currentText})
if (checkFields())
{
saveBtn.enabled = true
}
firstname.text = ""
lastname.text = ""
phonenumber.text = ""
mobile.text = ""
posizion.currentIndex = 0
title.currentIndex = 0
removeContact.enabled = true
checkFields()
}
}
}
}
Label
{
text: qsTr("Ansprechpartner")
Layout.alignment: Qt.AlignRight | Qt.AlignTop
}
ListModel
{
id: contactModel
}
// Component
// {
// id: headline
// Row
// {
// spacing: 9
// Text
// {
// id: cpname
// text: qsTr("Name")
// font.bold: true
// horizontalAlignment: Text.AlignLeft
// color: "white"
// }
// Text
// {
// id: cpphone
// text: qsTr("Telefon")
// font.bold: true
// horizontalAlignment: Text.AlignLeft
// color: "white"
// }
// Text
// {
// id: cpmobile
// text: qsTr("Mobil")
// font.bold: true
// horizontalAlignment: Text.AlignLeft
// color: "white"
// }
// Text
// {
// id: cppos
// text: qsTr("Position")
// font.bold: true
// horizontalAlignment: Text.AlignLeft
// color: "white"
// }
// Text
// {
// id: cttype
// text: qsTr("Typ")
// font.bold: true
// horizontalAlignment: Text.AlignLeft
// color: "white"
// }
// }
// }
Component
{
id: highlight
Rectangle
{
width: parent.width
color: "lightsteelblue"; radius: 5
y: contactView.currentItem.y
Behavior on y
{
SpringAnimation
{
spring: 3
damping: 0.2
}
}
}
}
Rectangle
{
id: mainRect
Layout.fillWidth: true
implicitHeight: 100
color: firstname.palette.base
border.color: firstname.activeFocus? firstname.palette.highlight: firstname.palette.base
clip: true
ScrollView
{
id: objContactView
// Layout.fillWidth: true
// Layout.preferredHeight: 100
//Layout.columnSpan: 3
anchors.fill: mainRect
ScrollBar.vertical.policy: ScrollBar.AlwaysOn
ListView
{
id: contactView
anchors.fill: objContactView
// implicitHeight: objContactView.height
// implicitWidth: objContactView.width
model: contactModel
// header: headline
highlight: Rectangle { color: "slategray"; radius: 3}
highlightFollowsCurrentItem: false
//focus: true test
onActiveFocusChanged: if(!focus) currentIndex = -1
delegate: Item
{
width: contactView.width
height: 77
MouseArea
{
anchors.fill: parent
onClicked:
{
contactView.currentIndex = index
contactView.highlightFollowsCurrentItem = true
}
}
Column
{
anchors.margins: 5
//spacing: 3
Text
{
text: '<b>' + qsTr('Name: ') + '</b>' + model.name
horizontalAlignment: Text.AlignLeft
color: "white"
}
Text
{
text: '<b>' + qsTr('Telefon: ') + '</b>' + model.phone
horizontalAlignment: Text.AlignLeft
color: "white"
}
Text
{
text: '<b>' + qsTr('Handy: ') + '</b>' + model.mobile
horizontalAlignment: Text.AlignLeft
color: "white"
}
Text
{
text: '<b>' + qsTr('Position: ') + '</b>' + model.posizion
horizontalAlignment: Text.AlignLeft
color: "white"
}
} // Column
} // delegate
} // Listview
} // Scrollview
}
}

View File

@@ -1,125 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
GridLayout
{
// property var employeeForm: null
// property var employees: null
// id: oaoemployee
// columns: 2
// rows: 4
// Label
// {
// text: qsTr("Mitarbeiter")
// Layout.alignment: Qt.AlignRight | Qt.AlignTop
// }
// ListModel
// {
// id: employeeModel
// }
// Component
// {
// id: employeesHeader
// Row
// {
// Text
// {
// id: empName
// text: qsTr("Mitarbeiter")
// width: 175
// font.bold: true
// horizontalAlignment: Text.AlignLeft
// color: "black"
// }
// }
// }
// Rectangle
// {
// Layout.fillWidth: true
// implicitHeight: 75
// Layout.rowSpan: 2
// color: mitarbeiterhin.palette.base
// border.color: mitarbeiterhin.activeFocus? mitarbeiterhin.palette.highlight: mitarbeiterhin.palette.base
// ListView
// {
// id: employeesList
// //anchors.fill: parent
// implicitHeight: parent.height
// model: employeeModel
// header: employeesHeader
// delegate: Row
// {
// width: 200
// height: 15
// //padding: 7
// Text
// {
// text: model.namens
// }
// }
// }
// }
// RowLayout
// {
// Layout.columnSpan: 2
// Layout.fillWidth: true
// Item
// {
// Layout.fillWidth: true
// }
// Button
// {
// id: mitarbeiterraus
// text: qsTr("Mitarbeiter entfernen")
// }
// Button
// {
// id: mitarbeiterhin
// text: qsTr("Mitarbeiter hinzufügen")
// onClicked:
// {
// var nm = Qt.createComponent("AddObjectEmployee.qml")
// if (nm.status === Component.Ready)
// {
// employeeForm = nm.createObject (appWindow, {width: 600, height: 400})
// employeeForm.addNewEmployee.connect(onAddEmployee)
// employeeForm.show()
// }
// else console.log(nm.errorString())
// }
// }
// }
// function onAddEmployee(new_employee)
// {
// var num_employees = 0
// if (employees === null || employees === undefined) employees = {}
// else num_employees = Object.keys(employees).length;
// employees[num_employees] = {}
// employees[num_employees]["assignee"] = new_employee["assignee"];
// employees[num_employees]["duration"] = new_employee["duration"];
// employees[num_employees]["wage"] = new_employee["wage"];
// employees[num_employees]["cleandays"] = new_employee["cleandays"];
// employees[num_employees]["tasks"] = new_employee["tasks"];
// employees[num_employees]["output"] = new_employee["output"];
// employeeModel.append({namens: new_employee["assignee"]});
// }
}

View File

@@ -1,28 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Js
Frame
{
property alias contactPerson: oaocontactperson
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
ColumnLayout
{
id: addObjectLayout
width: parent.width
ObjectAddOnContactPerson
{
id: oaocontactperson
}
Item
{
Layout.fillHeight: true
}
}
function getForm()
{
return oaocontactperson.contacts
}
}

View File

@@ -1,27 +0,0 @@
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("Zurück zu den Objekten")
onClicked: contentStack.pop()
}
}
Component.onCompleted:
{
object_model.onRowClicked(selectedObject)
}
}

View File

@@ -1,238 +0,0 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
GridLayout
{
id: objectView
columns: 4
Layout.fillWidth: true
Layout.fillHeight: true
rowSpacing: 9
Label
{
text: qsTr("Firma")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
ComboBox
{
property string name: "business"
id: business
editable: true
Layout.fillWidth: true
Layout.columnSpan: 3
}
Label
{
text: qsTr("Straße*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
property string name: "street"
id: street
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
onTextChanged: checkFields()
}
Label
{
text: qsTr("Nr.*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
property string name: "houseno"
id: houseno
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
onTextChanged: checkFields()
}
Label
{
text: qsTr("PLZ*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
property string name: "postcode"
id: postcode
Layout.fillWidth: true
onTextChanged: checkFields()
}
Label
{
text: qsTr("Ort")
Layout.alignment: Qt.AlignRight
}
ComboBox
{
property string name: "city"
id: city
Layout.fillWidth: true
editable: true
onEditTextChanged: checkFields()
onCurrentTextChanged: checkFields()
model: address_model
textRole: "city"
popup.height: 300
currentIndex: -1
}
Label
{
text: qsTr("Lohnanteil inkl. Fahrtkosten")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
id: lohnanteil
Layout.fillWidth: true
Layout.columnSpan: 3
}
Label
{
text: qsTr("Materialanteil")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
id: materialanteil
Layout.fillWidth: true
Layout.columnSpan: 3
}
Label
{
text: qsTr("Zusatz 1")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
id: zusatz1
Layout.fillWidth: true
Layout.columnSpan: 3
}
Label
{
text: qsTr("Zusatz 2")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
id: zusatz2
Layout.fillWidth: true
Layout.columnSpan: 3
}
Label
{
text: qsTr("Gesamt Netto")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{id: gesamtnetto
Layout.fillWidth: true
Layout.columnSpan: 3
}
Label
{
text: qsTr("MwSt")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
id: mwst
Layout.fillWidth: true
Layout.columnSpan: 3
}
Label
{
text: qsTr("Gesamt(Netto+MwSt)")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
id: gesamt
Layout.fillWidth: true
Layout.columnSpan: 3
}
Label
{
text: qsTr("Zahlungsziel")
Layout.alignment: Qt.AlignRight
}
ComboBox
{
property string name: "zahlungsziel"
id: zahlungsziel
Layout.fillWidth: true
editable: false
textRole: "display"
Layout.columnSpan: 3
}
Label
{
text: qsTr("Info")
Layout.alignment: Qt.AlignRight | Qt.AlignTop
}
ScrollView
{
id: infoview
Layout.fillWidth: true
Layout.preferredHeight: 110
Layout.columnSpan: 3
ScrollBar.horizontal: ScrollBar
{
policy: ScrollBar.AlwaysOn
}
TextArea
{
id: objectInfo
property string name: "objectinfo"
implicitWidth: parent.width
wrapMode: TextEdit.Wrap
background: Rectangle
{
color: objectInfo.palette.base
border.color: objectInfo.activeFocus? objectInfo.palette.highlight: objectInfo.palette.base
width: parent.width
}
}
}
Item
{
Layout.fillHeight: true
}
}

View File

@@ -1,186 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
ColumnLayout
{
property var availableFilters: [""]
spacing: Dimensions.l
function viewCriterion(criterion)
{
business_model.viewCriterion(criterion.text);
}
function onObjectContactAdded(added)
{
console.log(added)
if (added) object_model.viewCriterion("")
}
Component.onCompleted:
{
contact_model.objectContactAdded.connect(onObjectContactAdded)
// contentStack.pop()
}
RowLayout
{
Layout.fillWidth: true
spacing: Dimensions.l
SearchBar
{
}
QuickFilter {
onSelectedChanged: (name) => {
business_model.viewCriterion(name)
}
model: ListModel {
ListElement {
name: "Alle"
text: qsTr("Alle")
selected: true
}
ListElement {
name: "Aktiv"
text: qsTr("Aktiv")
selected: false
}
ListElement {
name: "Ehemalig"
text: qsTr("Ehemalig")
selected: false
}
ListElement {
name: "Angebote"
text: qsTr("Angebote")
selected: false
}
}
}
Button
{
id: addObjectBtn
icon.source: "qrc:/images/PlusCircle.svg"
text: qsTr("Objekt Hinzufügen")
Layout.alignment: Qt.AlignRight
onClicked: contentStack.push("AddObject.qml")
}
}
ColumnLayout
{
id: tableColumn
Layout.fillWidth: true
Layout.fillHeight: true
Layout.verticalStretchFactor: 1
clip: true
// anchors
// {
// top: searchBar.bottom
// bottom: parent.bottom
// left: parent.left
// right: parent.right
// topMargin: 15
// }
HorizontalHeaderView
{
id: horizontalHeaderview
Layout.fillWidth: true
implicitHeight: 40
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
z: 1
// height: tableColumn.height - horizontalHeaderview.height
Layout.fillHeight: true
Layout.fillWidth: true
columnSpacing: 1
rowSpacing: 2
model: object_model
alternatingRows: true
resizableColumns: true // @disable-check M16
selectionBehavior: TableView.SelectRows
ScrollBar.vertical: ScrollBar
{
policy: objectTable.contentHeight > objectTable.height ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff
}
selectionModel: ItemSelectionModel
{
id: obmodel
model: objectTable.model
}
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 === undefined)? "": 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:
{
contentStack.push("ObjectDetails.qml", {selectedObject: row});
}
onEntered:
{
objectTable.selectionModel.select(objectTable.model.index(row, 0), ItemSelectionModel.SelectCurrent | ItemSelectionModel.Rows)
}
}
}
}
}
Item {
Layout.fillHeight: true
}
}

View File

@@ -1 +0,0 @@
module Objects

View File

@@ -5,6 +5,7 @@ import Qt.labs.qmlmodels
ColumnLayout ColumnLayout
{ {
anchors.fill: parent
spacing: Dimensions.l spacing: Dimensions.l
function viewOffers(criterion) function viewOffers(criterion)
{ {

View File

@@ -22,14 +22,11 @@ function firstConf(tabs)
function parseForm(...form) function parseForm(...form)
{ {
let data_form = {}; let data_form = {};
for (var i = 0; i < form.length; i++) for (var i = 0; i < form.length; i++)
{ {
for (var j = 0; j < form[i].children.length; j++) for (var j = 0; j < form[i].children.length; j++)
{ {
console.log(form[i].children[j])
if (form[i].children[j].toString().startsWith("Combo")) if (form[i].children[j].toString().startsWith("Combo"))
{ {
if(form[i].children[j].editText) if(form[i].children[j].editText)

File diff suppressed because it is too large Load Diff

View File

@@ -165,6 +165,7 @@ class ConfigLoader(QObject):
else: else:
return None return None
def __invalidateEncryptionKey(self): def __invalidateEncryptionKey(self):
# print(f"In {__file__} file, __invalidateEncryptionKey()") # print(f"In {__file__} file, __invalidateEncryptionKey()")
self.__config['pyqcrm']['ENCRYPTION_KEY_VALID'] = 'No' self.__config['pyqcrm']['ENCRYPTION_KEY_VALID'] = 'No'
@@ -199,6 +200,11 @@ class ConfigLoader(QObject):
except Exception as e: except Exception as e:
print(str(e)) print(str(e))
def __configLoad(self): def __configLoad(self):
# print(f"In {__file__} file, __configLoad()") # print(f"In {__file__} file, __configLoad()")
try: try:

View File

@@ -75,7 +75,7 @@ class BusinessModel(QAbstractTableModel):
self.__business_dao.newBusinessAdded.connect(self.__refreshView) self.__business_dao.newBusinessAdded.connect(self.__refreshView)
self.__conf = ConfigLoader().getConfig() self.__conf = ConfigLoader().getConfig()
self.__key = self.__conf['pyqcrm']['ENCRYPTION_KEY'] self.__key = self.__conf['pyqcrm']['ENCRYPTION_KEY']
self.__getData() # self.__getData()
def __getData(self, criterion = "Alle"): def __getData(self, criterion = "Alle"):
self.beginResetModel() self.beginResetModel()

View File

@@ -50,15 +50,15 @@ class ContactDAO(QObject):
self.newObjectContactAdded.emit(False) self.newObjectContactAdded.emit(False)
def getContact(self, contact_id, enc_key = None): def getContact(self, contact_id, enc_key = None):
try: # try:
if self.__cur: # if self.__cur:
self.__cur.callproc("getCustomerContact", (contact_id, enc_key,)) # self.__cur.callproc("getCustomerContact", (contact_id, enc_key,))
#self.__all_cols = [desc[0] for desc in self.__cur.description] # #self.__all_cols = [desc[0] for desc in self.__cur.description]
return self.__cur.fetchall() #, self.__all_cols # return self.__cur.fetchall() #, self.__all_cols
else: # else:
return None #, None # return None #, None
except mariadb.Error as e: # except mariadb.Error as e:
print(str(e)) # print(str(e))
pass

View File

@@ -1,6 +1,8 @@
import json import json
from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot, Signal, QJsonDocument from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot, Signal, QJsonDocument
from PySide6.QtQml import QJSValue, QJSValueIterator from PySide6.QtQml import QJSValue
from .EmployeeDAO import EmployeeDAO from .EmployeeDAO import EmployeeDAO
# from ..PyqcrmFlags import PyqcrmFlags, PyqcrmAppliEmpyFlags # from ..PyqcrmFlags import PyqcrmFlags, PyqcrmAppliEmpyFlags
from ..ConfigLoader import ConfigLoader from ..ConfigLoader import ConfigLoader
@@ -33,31 +35,20 @@ class EmployeeModel(QAbstractTableModel):
self.__employee_dao.addEmployee(new_employee, self.__key, False) self.__employee_dao.addEmployee(new_employee, self.__key, False)
@Slot(QJSValue) @Slot(QJSValue)
def addApplicant(self, new_applicant): def addApplicant(self, applicant: QJSValue):
data = {} self.__employee_dao.addEmployee({
it = QJSValueIterator(new_applicant) "city": applicant.property("city").toString(),
while it.hasNext(): "email": applicant.property("email").toString(),
it.next() "firstname": applicant.property("firstname").toString(),
if "function" in it.value().toString() or "objectName" == it.name(): "formofaddress": applicant.property("formofaddress").toString(),
continue "houseno": applicant.property("houseno").toString(),
data[it.name()] = it.value().toString() "lastname": applicant.property("lastname").toString(),
self.__employee_dao.addEmployee(data, self.__key) "mobile": applicant.property("mobile").toString(),
"phone": applicant.property("phone").toString(),
# @Slot(QJSValue) "postcode": applicant.property("postcode").toInt(),
# def addApplicant(self, applicant: QJSValue): "street": applicant.property("street").toString(),
# self.__employee_dao.addEmployee({ "title": applicant.property("title").toString(),
# "city": applicant.property("city").toString(), }, self.__key, True)
# "email": applicant.property("email").toString(),
# "firstname": applicant.property("firstname").toString(),
# "formofaddress": applicant.property("formofaddress").toString(),
# "houseno": applicant.property("houseno").toString(),
# "lastname": applicant.property("lastname").toString(),
# "mobile": applicant.property("mobile").toString(),
# "phone": applicant.property("phone").toString(),
# "postcode": applicant.property("postcode").toInt(),
# "street": applicant.property("street").toString(),
# "title": applicant.property("title").toString(),
# }, self.__key, True)
@Slot(bool) @Slot(bool)
def __refreshView(self, added): def __refreshView(self, added):

11
main.py
View File

@@ -22,7 +22,6 @@ from lib.Printers import Printers
os.environ['QML_XHR_ALLOW_FILE_READ'] = '1' os.environ['QML_XHR_ALLOW_FILE_READ'] = '1'
# [pyqcrm] # [pyqcrm]
# program-name="" # program-name=""
# version= # version=
@@ -58,12 +57,12 @@ def initializeProgram():
if DbManager().getConnection(): if DbManager().getConnection():
db_con = True db_con = True
user = UserManager() user = UserManager()
business_model = BusinessModel() # business_model = BusinessModel()
address_model = AddressModel() address_model = AddressModel()
business_type = BTypeModel() # business_type = BTypeModel()
contact_model = ContactModel() # contact_model = ContactModel()
employee_model = EmployeeModel() # employee_model = EmployeeModel()
object_model = ObjectModel() # object_model = ObjectModel()
publishContext() publishContext()

18
qml.qrc
View File

@@ -6,8 +6,10 @@
<file>Gui/DbConfiguration.qml</file> <file>Gui/DbConfiguration.qml</file>
<file>Gui/LoginScreen.qml</file> <file>Gui/LoginScreen.qml</file>
<file>Gui/AddContact.qml</file> <file>Gui/AddContact.qml</file>
<file>Gui/AddCustomer.qml</file>
<file>Gui/Dashboard.qml</file> <file>Gui/Dashboard.qml</file>
<file>Gui/main.qml</file> <file>Gui/main.qml</file>
<file>Gui/CustomerView.qml</file>
<file>Gui/NoDbConnection.qml</file> <file>Gui/NoDbConnection.qml</file>
<file>Gui/Notifications.qml</file> <file>Gui/Notifications.qml</file>
<file>Gui/AddObject.qml</file> <file>Gui/AddObject.qml</file>
@@ -16,10 +18,15 @@
<file>Gui/ObjectAddOnContactPerson.qml</file> <file>Gui/ObjectAddOnContactPerson.qml</file>
<file>Gui/ObjectAddOnEmployee.qml</file> <file>Gui/ObjectAddOnEmployee.qml</file>
<file>Gui/AddObjectEmployee.qml</file> <file>Gui/AddObjectEmployee.qml</file>
<file>Gui/CustomersTable.qml</file>
<file>Gui/CustomerDetails.qml</file>
<file>Gui/ObjectsTable.qml</file> <file>Gui/ObjectsTable.qml</file>
<file>Gui/ObjectDetails.qml</file> <file>Gui/ObjectDetails.qml</file>
<file>Gui/AddNewObject.qml</file> <file>Gui/AddNewObject.qml</file>
<file>Gui/PrinterDialog.qml</file> <file>Gui/PrinterDialog.qml</file>
<file>Gui/CustomerContactDetails.qml</file>
<file>Gui/NoCustomerContact.qml</file>
<file>Gui/CustomerDetailsView.qml</file>
<file>Gui/ReadMe.qml</file> <file>Gui/ReadMe.qml</file>
<file>Gui/UsersPage.qml</file> <file>Gui/UsersPage.qml</file>
<file>Gui/PyqcrmConf.qml</file> <file>Gui/PyqcrmConf.qml</file>
@@ -74,17 +81,6 @@
<file>Gui/Customer/CustomersTable.qml</file> <file>Gui/Customer/CustomersTable.qml</file>
<file>Gui/Customer/CustomerView.qml</file> <file>Gui/Customer/CustomerView.qml</file>
<file>Gui/Customer/qmldir</file> <file>Gui/Customer/qmldir</file>
<file>Gui/Customer/NoCustomerContact.qml</file>
<file>Gui/Objects/AddNewObject.qml</file>
<file>Gui/Objects/AddObject.qml</file>
<file>Gui/Objects/AddObjectEmployee.qml</file>
<file>Gui/Objects/ObjectAddOnContactPerson.qml</file>
<file>Gui/Objects/ObjectAddOnEmployee.qml</file>
<file>Gui/Objects/ObjectAddOns.qml</file>
<file>Gui/Objects/ObjectDetails.qml</file>
<file>Gui/Objects/ObjectsTable.qml</file>
<file>Gui/Objects/ObjectView.qml</file>
<file>Gui/Objects/qmldir</file>
</qresource> </qresource>
<qresource prefix="/TeroStyle"/> <qresource prefix="/TeroStyle"/>
</RCC> </RCC>