Compare commits
3 Commits
linuxero
...
feature/ap
| Author | SHA256 | Date | |
|---|---|---|---|
|
|
76fdc880c7 | ||
|
|
45f19d80d0 | ||
|
|
0ae153617b |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -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/
|
||||||
|
|||||||
12
.idea/dataSources.xml
generated
Normal file
12
.idea/dataSources.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
|
||||||
|
<data-source source="LOCAL" name="pyqcrm@bearybot.selfhost.co" uuid="ed28331b-481b-40e7-9295-d9cdae9fd4f2">
|
||||||
|
<driver-ref>mariadb</driver-ref>
|
||||||
|
<synchronize>true</synchronize>
|
||||||
|
<jdbc-driver>org.mariadb.jdbc.Driver</jdbc-driver>
|
||||||
|
<jdbc-url>jdbc:mariadb://bearybot.selfhost.co:8080/pyqcrm</jdbc-url>
|
||||||
|
<working-dir>$ProjectFileDir$</working-dir>
|
||||||
|
</data-source>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
.idea/inspectionProfiles/Project_Default.xml
generated
6
.idea/inspectionProfiles/Project_Default.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<profile version="1.0">
|
|
||||||
<option name="myName" value="Project Default" />
|
|
||||||
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
|
||||||
</profile>
|
|
||||||
</component>
|
|
||||||
6
.idea/inspectionProfiles/profiles_settings.xml
generated
6
.idea/inspectionProfiles/profiles_settings.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<settings>
|
|
||||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
|
||||||
<version value="1.0" />
|
|
||||||
</settings>
|
|
||||||
</component>
|
|
||||||
6
.idea/sqldialects.xml
generated
Normal file
6
.idea/sqldialects.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="SqlDialectMappings">
|
||||||
|
<file url="file://$PROJECT_DIR$/doc/db_schemer_v1.1-pyqcrm-202503171158_clean.sql" dialect="MariaDB" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
120
Gui/AddCustomer.qml
Normal file
120
Gui/AddCustomer.qml
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Dialogs
|
||||||
|
import "../js/qmldict.js" as JsLib
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -52,6 +52,37 @@ GridLayout
|
|||||||
|
|
||||||
//// New grid row
|
//// New grid row
|
||||||
|
|
||||||
|
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
|
||||||
Label
|
Label
|
||||||
{
|
{
|
||||||
text: qsTr("PLZ")
|
text: qsTr("PLZ")
|
||||||
@@ -71,11 +102,7 @@ GridLayout
|
|||||||
textRole: "display"
|
textRole: "display"
|
||||||
popup.height: 300
|
popup.height: 300
|
||||||
currentIndex: -1
|
currentIndex: -1
|
||||||
onCurrentIndexChanged:
|
onCurrentIndexChanged: city.currentIndex = postcode.currentIndex
|
||||||
{
|
|
||||||
city.currentIndex = postcode.currentIndex
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
validator: RegularExpressionValidator
|
validator: RegularExpressionValidator
|
||||||
{
|
{
|
||||||
@@ -104,41 +131,6 @@ GridLayout
|
|||||||
currentIndex: -1
|
currentIndex: -1
|
||||||
}
|
}
|
||||||
|
|
||||||
Label
|
|
||||||
{
|
|
||||||
text: qsTr("Straße")
|
|
||||||
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
ComboBox
|
|
||||||
{
|
|
||||||
property string name: "street"
|
|
||||||
id: street
|
|
||||||
model: object_model
|
|
||||||
textRole: "StreetInPostcode"
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.alignment: Qt.AlignVCenter
|
|
||||||
// onTextChanged: checkFields()
|
|
||||||
}
|
|
||||||
|
|
||||||
Label
|
|
||||||
{
|
|
||||||
text: qsTr("Nr.*")
|
|
||||||
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
ComboBox
|
|
||||||
{
|
|
||||||
property string name: "houseno"
|
|
||||||
id: houseno
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.alignment: Qt.AlignVCenter
|
|
||||||
// onTextChanged: checkFields()
|
|
||||||
}
|
|
||||||
|
|
||||||
// New grid row
|
|
||||||
|
|
||||||
|
|
||||||
//New Grid
|
//New Grid
|
||||||
Label
|
Label
|
||||||
{
|
{
|
||||||
@@ -193,22 +185,7 @@ GridLayout
|
|||||||
Layout.alignment: Qt.AlignVCenter
|
Layout.alignment: Qt.AlignVCenter
|
||||||
}
|
}
|
||||||
|
|
||||||
Item
|
|
||||||
{
|
|
||||||
Layout.columnSpan: 2
|
|
||||||
}
|
|
||||||
//New Grid
|
|
||||||
Label
|
|
||||||
{
|
|
||||||
text: qsTr("Leistungen:")
|
|
||||||
Layout.alignment: Qt.AlignRight
|
|
||||||
font: Typography.h2
|
|
||||||
}
|
|
||||||
|
|
||||||
Item
|
|
||||||
{
|
|
||||||
Layout.columnSpan: 3
|
|
||||||
}
|
|
||||||
|
|
||||||
Item
|
Item
|
||||||
{
|
{
|
||||||
@@ -2,7 +2,7 @@ import QtQuick
|
|||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Dialogs
|
import QtQuick.Dialogs
|
||||||
import Js
|
import "../js/qmldict.js" as JsLib
|
||||||
|
|
||||||
ColumnLayout
|
ColumnLayout
|
||||||
{
|
{
|
||||||
@@ -70,13 +70,8 @@ ColumnLayout
|
|||||||
text: qsTr("Speichern")
|
text: qsTr("Speichern")
|
||||||
enabled: false
|
enabled: false
|
||||||
onClicked:
|
onClicked:
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
new_object = JsLib.parseForm(newObject)
|
new_object = JsLib.parseForm(newObject)
|
||||||
// For Debugging
|
|
||||||
console.log(JSON.stringify(new_object))
|
|
||||||
//
|
|
||||||
new_object['lift'] = new_object['lift'] === 'Ja' ? 1 : 0
|
new_object['lift'] = new_object['lift'] === 'Ja' ? 1 : 0
|
||||||
new_object['mezzanin'] = new_object['mezzanin'] === 'Ja' ? 1 : 0
|
new_object['mezzanin'] = new_object['mezzanin'] === 'Ja' ? 1 : 0
|
||||||
object_model.addObject(new_object)
|
object_model.addObject(new_object)
|
||||||
|
|||||||
@@ -2,8 +2,7 @@ import QtQuick
|
|||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Dialogs
|
import QtQuick.Dialogs
|
||||||
import Js
|
import "../js/qmldict.js" as JsLib
|
||||||
|
|
||||||
|
|
||||||
ColumnLayout
|
ColumnLayout
|
||||||
{
|
{
|
||||||
@@ -28,15 +27,18 @@ ColumnLayout
|
|||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
spacing: 45
|
spacing: 45
|
||||||
|
|
||||||
|
Frame
|
||||||
AddNewOffer
|
|
||||||
{
|
{
|
||||||
id: newOffer
|
Layout.alignment: Qt.AlignTop
|
||||||
width: parent.width
|
Layout.fillWidth: true
|
||||||
|
AddNewOffer
|
||||||
|
{
|
||||||
|
id: newOffer
|
||||||
|
width: parent.width
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
RowLayout
|
RowLayout
|
||||||
{
|
{
|
||||||
@@ -49,17 +51,16 @@ ColumnLayout
|
|||||||
}
|
}
|
||||||
Button
|
Button
|
||||||
{
|
{
|
||||||
|
property var new_object: null
|
||||||
id: saveBtn
|
id: saveBtn
|
||||||
text: qsTr("Speichern")
|
text: qsTr("Speichern")
|
||||||
// enabled: false
|
enabled: false
|
||||||
onClicked:
|
onClicked:
|
||||||
{
|
{
|
||||||
// new_object = JsLib.parseForm(newObject)
|
// new_object = JsLib.parseForm(newObject)
|
||||||
// new_object['lift'] = new_object['lift'] === 'Ja' ? 1 : 0
|
// new_object['lift'] = new_object['lift'] === 'Ja' ? 1 : 0
|
||||||
// new_object['mezzanin'] = new_object['mezzanin'] === 'Ja' ? 1 : 0
|
// new_object['mezzanin'] = new_object['mezzanin'] === 'Ja' ? 1 : 0
|
||||||
// object_model.addObject(new_object)
|
// object_model.addObject(new_object)
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -51,15 +51,6 @@ GridLayout
|
|||||||
placeholderText: qsTr("Hier Passwort eingeben")
|
placeholderText: qsTr("Hier Passwort eingeben")
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
property string name: "PYQCRM_USER_PASS"
|
property string name: "PYQCRM_USER_PASS"
|
||||||
color: acceptableInput ? "black" : "red"
|
|
||||||
ToolTip.visible: hovered && !acceptableInput
|
|
||||||
ToolTip.text: "Passwort muss mind. 12 Zeichen lang sein und Groß-, Kleinbuchstaben, Zahlen sowie Sonderzeichen (!@#$%^&*()_+-=) enthalten."
|
|
||||||
|
|
||||||
validator: RegularExpressionValidator {
|
|
||||||
regularExpression: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+\-=]).{12,}$/
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
Label
|
Label
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import QtQuick.Controls
|
|||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
import QtQuick.Dialogs
|
import QtQuick.Dialogs
|
||||||
import QtCore
|
import QtCore
|
||||||
import Js
|
import "../js/qmldict.js" as JsLib
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,136 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import QtQuick.Layouts
|
|
||||||
import QtQuick.Controls
|
|
||||||
import QtQuick.Dialogs
|
|
||||||
import Js
|
|
||||||
import Gui
|
|
||||||
|
|
||||||
ScrollView
|
|
||||||
{
|
|
||||||
id: scroll
|
|
||||||
width: parent.width
|
|
||||||
height: parent.height
|
|
||||||
property var new_business: null
|
|
||||||
|
|
||||||
ColumnLayout
|
|
||||||
{
|
|
||||||
|
|
||||||
height: Screen.desktopAvailableHeight
|
|
||||||
width: scroll.width
|
|
||||||
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)
|
|
||||||
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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
module Customer
|
|
||||||
@@ -30,28 +30,40 @@ GridLayout
|
|||||||
onTextChanged: checkFields()
|
onTextChanged: checkFields()
|
||||||
Layout.columnSpan: 3
|
Layout.columnSpan: 3
|
||||||
}
|
}
|
||||||
|
|
||||||
Label
|
Label
|
||||||
{
|
{
|
||||||
text: qsTr("Land")
|
text: qsTr("Straße*")
|
||||||
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
|
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
|
||||||
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
|
|
||||||
Layout.columnSpan: 3
|
|
||||||
visible: false
|
|
||||||
|
|
||||||
|
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
|
Label
|
||||||
{
|
{
|
||||||
text: qsTr("PLZ")
|
text: qsTr("PLZ")
|
||||||
@@ -102,40 +114,6 @@ GridLayout
|
|||||||
currentIndex: -1
|
currentIndex: -1
|
||||||
Layout.columnSpan: 3
|
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
|
Label
|
||||||
{
|
{
|
||||||
@@ -276,7 +254,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
|
||||||
|
|
||||||
@@ -13,10 +13,10 @@ ColumnLayout {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
spacing: Dimensions.l
|
spacing: Dimensions.l
|
||||||
|
|
||||||
// Component.onCompleted: contentStack.pop()
|
Component.onCompleted: contentStack.pop()
|
||||||
|
|
||||||
RowLayout
|
RowLayout
|
||||||
{
|
{
|
||||||
@@ -1,49 +1,36 @@
|
|||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
import TeroStyle
|
import TeroStyle
|
||||||
import Js
|
|
||||||
|
|
||||||
ColumnLayout {
|
ColumnLayout {
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
spacing: Dimensions.l
|
spacing: Dimensions.l
|
||||||
|
|
||||||
Component.onCompleted: {
|
ApplicantForm {
|
||||||
employee_model.addedNewEmployee.connect(successful => {
|
|
||||||
if (successful)
|
|
||||||
contentStack.pop();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
ApplicantForm
|
|
||||||
{
|
|
||||||
id: applicantForm
|
id: applicantForm
|
||||||
|
|
||||||
Layout.alignment: Qt.AlignTop
|
Layout.alignment: Qt.AlignTop
|
||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
Layout.verticalStretchFactor: 1
|
Layout.verticalStretchFactor: 1
|
||||||
}
|
}
|
||||||
RowLayout
|
RowLayout {
|
||||||
{
|
|
||||||
Layout.alignment: Qt.AlignRight
|
Layout.alignment: Qt.AlignRight
|
||||||
spacing: Dimensions.l
|
spacing: Dimensions.l
|
||||||
|
|
||||||
Button
|
Button {
|
||||||
{
|
|
||||||
icon.source: "qrc:/images/ArrowLeftCircle-Outline.svg"
|
icon.source: "qrc:/images/ArrowLeftCircle-Outline.svg"
|
||||||
text: qsTr("Verwerfen")
|
text: qsTr("Verwerfen")
|
||||||
|
|
||||||
onClicked: contentStack.pop()
|
onClicked: contentStack.pop()
|
||||||
}
|
}
|
||||||
Button
|
Button {
|
||||||
{
|
|
||||||
enabled: applicantForm.valid
|
enabled: applicantForm.valid
|
||||||
icon.source: "qrc:/images/CheckCircle.svg"
|
icon.source: "qrc:/images/CheckCircle.svg"
|
||||||
text: qsTr("Speichern")
|
text: qsTr("Speichern")
|
||||||
|
|
||||||
onClicked:
|
onClicked: {
|
||||||
{
|
applicantModel.createApplicant(applicantForm.value);
|
||||||
employee_model.addApplicant(applicantForm.value);
|
contentStack.pop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
import Js
|
import "../../js/qmldict.js" as JsLib
|
||||||
|
|
||||||
ScrollView
|
ColumnLayout {
|
||||||
{
|
id: colPar
|
||||||
id: scroll
|
|
||||||
width: parent.width
|
|
||||||
height: parent.height
|
|
||||||
|
|
||||||
function checkFields() {
|
function checkFields() {
|
||||||
if (!personalData.checkPersonalField())
|
if (!personalData.checkPersonalField())
|
||||||
@@ -24,87 +21,82 @@ ScrollView
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnLayout {
|
Layout.fillHeight: true
|
||||||
id: colPar
|
Layout.fillWidth: true
|
||||||
|
anchors.fill: parent
|
||||||
|
implicitWidth: parent.width
|
||||||
|
|
||||||
height: Screen.desktopAvailableHeight
|
Component.onCompleted: {
|
||||||
width: scroll.width
|
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
|
||||||
implicitWidth: parent.width
|
spacing: Dimensions.l
|
||||||
|
|
||||||
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 hinzufügen")
|
|
||||||
}
|
|
||||||
RowLayout {
|
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
spacing: Dimensions.l
|
Layout.horizontalStretchFactor: 1
|
||||||
|
|
||||||
Frame {
|
EmployeePersonalData {
|
||||||
Layout.alignment: Qt.AlignTop
|
id: personalData
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.horizontalStretchFactor: 1
|
|
||||||
|
|
||||||
EmployeePersonalData {
|
implicitWidth: parent.width
|
||||||
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,26 +3,35 @@ import QtQuick.Controls.impl
|
|||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
import TeroStyle
|
import TeroStyle
|
||||||
|
|
||||||
ColumnLayout
|
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: emailAddress.acceptableInput && firstName.acceptableInput && houseNumber.acceptableInput && lastName.acceptableInput && mobileNumber.acceptableInput && phoneNumber.acceptableInput && salutation.acceptableInput&& street.acceptableInput && title.acceptableInput && zipCode.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 emailAddress: emailAddress.text ?? ""
|
||||||
{
|
readonly property string firstName: firstName.text ?? ""
|
||||||
readonly property string city: (city.editText ? city.editText : city.currentText) ?? ""
|
readonly property string houseNumber: houseNumber.text ?? ""
|
||||||
readonly property string email: email.text
|
readonly property string lastName: lastName.text ?? ""
|
||||||
readonly property string firstname: firstname.text
|
readonly property string mobileNumber: mobileNumber.text ?? ""
|
||||||
readonly property string formofaddress: formofaddress.text
|
readonly property string phoneNumber: phoneNumber.text ?? ""
|
||||||
readonly property string houseno: houseno.text
|
readonly property string salutation: salutation.text ?? ""
|
||||||
readonly property string lastname: lastname.text
|
readonly property string street: street.text ?? ""
|
||||||
readonly property string mobile: mobile.text
|
readonly property string title: title.currentText
|
||||||
readonly property string phone: phone.text
|
readonly property int zipCode: zipCode.currentIndex
|
||||||
readonly property string postcode: (postcode.editText ? postcode.editText : postcode.currentText) ?? ""
|
}
|
||||||
readonly property string street: street.text
|
|
||||||
readonly property string title: title.currentText
|
function setValue(value) {
|
||||||
readonly property string country: (country.editText ? country.editText : country.currentText) ?? ""
|
title.currentIndex = value.title ?? 0;
|
||||||
}
|
firstName.text = value.firstName ?? "";
|
||||||
|
lastName.text = value.lastName ?? "";
|
||||||
|
street.text = value.street ?? "";
|
||||||
|
houseNumber.text = value.houseNumber ?? "";
|
||||||
|
zipCode.currentIndex = value.zipCode ?? -1;
|
||||||
|
phoneNumber.text = value.phoneNumber ?? "";
|
||||||
|
mobileNumber.text = value.mobileNumber ?? "";
|
||||||
|
emailAddress.text = value.emailAddress ?? "";
|
||||||
|
salutation.text = value.salutation ?? 0;
|
||||||
|
}
|
||||||
|
|
||||||
spacing: Dimensions.l
|
spacing: Dimensions.l
|
||||||
|
|
||||||
@@ -43,7 +52,6 @@ ColumnLayout
|
|||||||
label: qsTr("Anrede")
|
label: qsTr("Anrede")
|
||||||
|
|
||||||
ComboBox {
|
ComboBox {
|
||||||
// property string name: "title"
|
|
||||||
id: title
|
id: title
|
||||||
|
|
||||||
implicitWidth: fieldM
|
implicitWidth: fieldM
|
||||||
@@ -52,26 +60,23 @@ ColumnLayout
|
|||||||
onCurrentTextChanged: {
|
onCurrentTextChanged: {
|
||||||
switch (title.currentIndex) {
|
switch (title.currentIndex) {
|
||||||
case 1:
|
case 1:
|
||||||
formofaddress.text = "Sehr geehrter Herr ";
|
salutation.text = "Sehr geehrter Herr ";
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
formofaddress.text = "Sehr geehrte Frau ";
|
salutation.text = "Sehr geehrte Frau ";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
formofaddress.text = "Guten Tag ";
|
salutation.text = "Guten Tag ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Field
|
Field {
|
||||||
{
|
|
||||||
label: qsTr("Vorname")
|
label: qsTr("Vorname")
|
||||||
mandatory: true
|
mandatory: true
|
||||||
|
|
||||||
TextField
|
TextField {
|
||||||
{
|
id: firstName
|
||||||
// property string name: "firstname"
|
|
||||||
id: firstname
|
|
||||||
|
|
||||||
implicitWidth: fieldM
|
implicitWidth: fieldM
|
||||||
placeholderText: qsTr("Max")
|
placeholderText: qsTr("Max")
|
||||||
@@ -85,8 +90,7 @@ ColumnLayout
|
|||||||
mandatory: true
|
mandatory: true
|
||||||
|
|
||||||
TextField {
|
TextField {
|
||||||
// property string name: "lastname"
|
id: lastName
|
||||||
id: lastname
|
|
||||||
|
|
||||||
implicitWidth: fieldM
|
implicitWidth: fieldM
|
||||||
placeholderText: qsTr("Mustermann")
|
placeholderText: qsTr("Mustermann")
|
||||||
@@ -99,46 +103,31 @@ ColumnLayout
|
|||||||
RowLayout {
|
RowLayout {
|
||||||
spacing: Dimensions.m
|
spacing: Dimensions.m
|
||||||
|
|
||||||
Field
|
Field {
|
||||||
{
|
|
||||||
label: qsTr("Straße")
|
label: qsTr("Straße")
|
||||||
mandatory: true
|
|
||||||
|
|
||||||
TextField
|
TextField {
|
||||||
{
|
|
||||||
// property string name: "street"
|
|
||||||
id: street
|
id: street
|
||||||
|
|
||||||
implicitWidth: fieldM
|
implicitWidth: fieldM
|
||||||
placeholderText: qsTr("Musterstraße")
|
placeholderText: qsTr("Musterstraße")
|
||||||
validator: NotEmptyValidator {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Field
|
Field {
|
||||||
{
|
|
||||||
|
|
||||||
mandatory: true
|
|
||||||
label: qsTr("Hausnummer")
|
label: qsTr("Hausnummer")
|
||||||
|
|
||||||
TextField
|
TextField {
|
||||||
{
|
id: houseNumber
|
||||||
// property string name: "houseno"
|
|
||||||
id: houseno
|
|
||||||
implicitWidth: fieldS
|
implicitWidth: fieldS
|
||||||
placeholderText: qsTr("1a")
|
placeholderText: qsTr("1a")
|
||||||
validator: NotEmptyValidator {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Field
|
Field {
|
||||||
{
|
|
||||||
label: qsTr("PLZ")
|
label: qsTr("PLZ")
|
||||||
mandatory: true
|
|
||||||
|
|
||||||
ComboBox
|
ComboBox {
|
||||||
{
|
id: zipCode
|
||||||
// property string name: "postcode"
|
|
||||||
id: postcode
|
|
||||||
|
|
||||||
currentIndex: -1
|
currentIndex: -1
|
||||||
editable: true
|
editable: true
|
||||||
@@ -147,19 +136,13 @@ ColumnLayout
|
|||||||
textRole: "display"
|
textRole: "display"
|
||||||
|
|
||||||
onActivated: currentValue
|
onActivated: currentValue
|
||||||
onCurrentIndexChanged: city.currentIndex = postcode.currentIndex
|
onCurrentIndexChanged: city.currentIndex = zipCode.currentIndex
|
||||||
|
|
||||||
validator: NotEmptyValidator {}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Field
|
Field {
|
||||||
{
|
|
||||||
label: qsTr("Ort")
|
label: qsTr("Ort")
|
||||||
mandatory: true
|
|
||||||
|
|
||||||
ComboBox
|
ComboBox {
|
||||||
{
|
|
||||||
// property string name: "city"
|
|
||||||
id: city
|
id: city
|
||||||
|
|
||||||
currentIndex: -1
|
currentIndex: -1
|
||||||
@@ -167,25 +150,6 @@ ColumnLayout
|
|||||||
implicitWidth: fieldM
|
implicitWidth: fieldM
|
||||||
model: address_model
|
model: address_model
|
||||||
textRole: "city"
|
textRole: "city"
|
||||||
|
|
||||||
validator: NotEmptyValidator {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Field
|
|
||||||
{
|
|
||||||
label: qsTr("Land")
|
|
||||||
mandatory: true
|
|
||||||
|
|
||||||
ComboBox
|
|
||||||
{
|
|
||||||
// property string name: "country"
|
|
||||||
id: country
|
|
||||||
currentIndex: 37
|
|
||||||
editable: true
|
|
||||||
implicitWidth: fieldM
|
|
||||||
model: address_model
|
|
||||||
textRole: "country"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -206,8 +170,7 @@ ColumnLayout
|
|||||||
label: qsTr("Telefonnummer")
|
label: qsTr("Telefonnummer")
|
||||||
|
|
||||||
TextField {
|
TextField {
|
||||||
// property string name: "phone"
|
id: phoneNumber
|
||||||
id: phone
|
|
||||||
|
|
||||||
implicitWidth: fieldM
|
implicitWidth: fieldM
|
||||||
placeholderText: "+49 1234 567890"
|
placeholderText: "+49 1234 567890"
|
||||||
@@ -216,14 +179,11 @@ ColumnLayout
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Field
|
Field {
|
||||||
{
|
|
||||||
label: qsTr("Mobil")
|
label: qsTr("Mobil")
|
||||||
|
|
||||||
TextField
|
TextField {
|
||||||
{
|
id: mobileNumber
|
||||||
// property string name: "mobile"
|
|
||||||
id: mobile
|
|
||||||
|
|
||||||
implicitWidth: fieldM
|
implicitWidth: fieldM
|
||||||
placeholderText: "+49 123 4567891011"
|
placeholderText: "+49 123 4567891011"
|
||||||
@@ -232,14 +192,11 @@ ColumnLayout
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Field
|
Field {
|
||||||
{
|
|
||||||
label: qsTr("E-Mail Adresse")
|
label: qsTr("E-Mail Adresse")
|
||||||
|
|
||||||
TextField
|
TextField {
|
||||||
{
|
id: emailAddress
|
||||||
// property string name: "email"
|
|
||||||
id: email
|
|
||||||
|
|
||||||
implicitWidth: fieldM
|
implicitWidth: fieldM
|
||||||
placeholderText: "tero@example.org"
|
placeholderText: "tero@example.org"
|
||||||
@@ -248,14 +205,11 @@ ColumnLayout
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Field
|
Field {
|
||||||
{
|
|
||||||
label: qsTr("Briefanrede")
|
label: qsTr("Briefanrede")
|
||||||
|
|
||||||
TextField
|
TextField {
|
||||||
{
|
id: salutation
|
||||||
// property string name: "formofaddress"
|
|
||||||
id: formofaddress
|
|
||||||
|
|
||||||
implicitWidth: fieldM
|
implicitWidth: fieldM
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,34 @@
|
|||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
|
import TeroStyle
|
||||||
|
|
||||||
Item
|
ColumnLayout {
|
||||||
{
|
property int row: -1
|
||||||
property int selectedEmployee: -1
|
|
||||||
id: emDet
|
|
||||||
ColumnLayout
|
|
||||||
{
|
|
||||||
Label
|
|
||||||
{
|
|
||||||
text: qsTr("Ausgewählter Mitarbeiter " + selectedEmployee)
|
|
||||||
}
|
|
||||||
|
|
||||||
Button
|
anchors.fill: parent
|
||||||
{
|
spacing: Dimensions.l
|
||||||
text: qsTr("Mitarbeiter zeigen")
|
|
||||||
onClicked: contentStack.pop()
|
onRowChanged: {
|
||||||
|
if (row !== -1) {
|
||||||
|
applicantForm.setValue(applicantModel.applicant(row))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Component.onCompleted:
|
ApplicantForm {
|
||||||
{
|
id: applicantForm
|
||||||
employee_model.onRowClicked(selectedEmployee)
|
|
||||||
|
Layout.alignment: Qt.AlignTop
|
||||||
|
Layout.fillHeight: true
|
||||||
|
Layout.verticalStretchFactor: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
spacing: Dimensions.l
|
||||||
|
|
||||||
|
Button {
|
||||||
|
text: qsTr("Als Mitarbeiter:in Einstellen")
|
||||||
|
icon.source: "qrc:/images/InboxArrowDown.svg"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -292,10 +292,6 @@ GridLayout {
|
|||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
placeholderTextColor: "red"
|
placeholderTextColor: "red"
|
||||||
|
|
||||||
validator: RegularExpressionValidator {
|
|
||||||
regularExpression: /([0-9]{1,3})/
|
|
||||||
}
|
|
||||||
|
|
||||||
onTextChanged: checkFields()
|
onTextChanged: checkFields()
|
||||||
}
|
}
|
||||||
Label {
|
Label {
|
||||||
|
|||||||
@@ -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 {
|
||||||
@@ -11,6 +12,9 @@ ColumnLayout {
|
|||||||
spacing: Dimensions.l
|
spacing: Dimensions.l
|
||||||
|
|
||||||
SearchBar {
|
SearchBar {
|
||||||
|
onSubmitted: (query) => {
|
||||||
|
applicantModel.searchQuery = query
|
||||||
|
}
|
||||||
}
|
}
|
||||||
QuickFilter {
|
QuickFilter {
|
||||||
model: ListModel {
|
model: ListModel {
|
||||||
@@ -27,7 +31,7 @@ ColumnLayout {
|
|||||||
ListElement {
|
ListElement {
|
||||||
name: "Mitarbeiter"
|
name: "Mitarbeiter"
|
||||||
selected: false
|
selected: false
|
||||||
text: qsTr("Mitarbeiter")
|
text: qsTr("Kunde")
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
name: "Erledigt"
|
name: "Erledigt"
|
||||||
@@ -91,7 +95,7 @@ ColumnLayout {
|
|||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
columnSpacing: 2
|
columnSpacing: 2
|
||||||
model: employee_model
|
model: applicantModel
|
||||||
resizableColumns: true
|
resizableColumns: true
|
||||||
rowSpacing: 2
|
rowSpacing: 2
|
||||||
selectionBehavior: TableView.SelectRows
|
selectionBehavior: TableView.SelectRows
|
||||||
@@ -123,9 +127,7 @@ ColumnLayout {
|
|||||||
hoverEnabled: true
|
hoverEnabled: true
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
contentStack.push("EmployeeDetails.qml", {
|
contentStack.push("EmployeeDetails.qml", { row });
|
||||||
selectedEmployee: row
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
onEntered: {
|
onEntered: {
|
||||||
employeesTable.selectionModel.select(employeesTable.model.index(row, 0), ItemSelectionModel.SelectCurrent | ItemSelectionModel.Rows);
|
employeesTable.selectionModel.select(employeesTable.model.index(row, 0), ItemSelectionModel.SelectCurrent | ItemSelectionModel.Rows);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -31,14 +31,14 @@ ColumnLayout {
|
|||||||
BarButton {
|
BarButton {
|
||||||
ButtonGroup.group: mainNav
|
ButtonGroup.group: mainNav
|
||||||
icon.source: "qrc:/images/UserGroup-Outline.svg"
|
icon.source: "qrc:/images/UserGroup-Outline.svg"
|
||||||
target: "/Gui/Customer/CustomersTable.qml"
|
target: "/Gui/CustomersTable.qml"
|
||||||
text: qsTr("Kunden")
|
text: qsTr("Kunden")
|
||||||
visible: !onSubPage
|
visible: !onSubPage
|
||||||
}
|
}
|
||||||
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
|
||||||
}
|
}
|
||||||
@@ -52,7 +52,7 @@ ColumnLayout {
|
|||||||
BarButton {
|
BarButton {
|
||||||
ButtonGroup.group: mainNav
|
ButtonGroup.group: mainNav
|
||||||
icon.source: "qrc:/images/RectangleStack-Outline.svg"
|
icon.source: "qrc:/images/RectangleStack-Outline.svg"
|
||||||
target: "/Gui/Offers/OffersTable.qml"
|
target: "/Gui/OffersTable.qml"
|
||||||
text: qsTr("Angebote")
|
text: qsTr("Angebote")
|
||||||
visible: !onSubPage
|
visible: !onSubPage
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import Js
|
import "../js/qmldict.js" as JsLib
|
||||||
|
|
||||||
Frame
|
Frame
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,155 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import QtQuick.Layouts
|
|
||||||
import QtQuick.Controls
|
|
||||||
import QtQuick.Dialogs
|
|
||||||
import Js
|
|
||||||
|
|
||||||
ColumnLayout
|
|
||||||
{
|
|
||||||
property var new_object: null
|
|
||||||
//property alias checkAddContact: checkAddContact
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.fillHeight: true
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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)
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -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"]});
|
|
||||||
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
module Objects
|
|
||||||
@@ -45,18 +45,23 @@ ColumnLayout
|
|||||||
selected: true
|
selected: true
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
name: "Aktiv"
|
name: "Interessent"
|
||||||
text: qsTr("Aktiv")
|
text: qsTr("Interessent")
|
||||||
selected: false
|
selected: false
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
name: "Ehemalig"
|
name: "Kunde"
|
||||||
text: qsTr("Ehemalig")
|
text: qsTr("Kunde")
|
||||||
selected: false
|
selected: false
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
name: "Angebote"
|
name: "Lieferant"
|
||||||
text: qsTr("Angebote")
|
text: qsTr("Lieferant")
|
||||||
|
selected: false
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
name: "Erledigt"
|
||||||
|
text: qsTr("Erledigt")
|
||||||
selected: false
|
selected: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
module Offers
|
|
||||||
@@ -3,37 +3,35 @@ import QtQuick.Layouts
|
|||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import Qt.labs.qmlmodels
|
import Qt.labs.qmlmodels
|
||||||
|
|
||||||
ColumnLayout
|
ColumnLayout {
|
||||||
{
|
function viewOffers(criterion) {
|
||||||
spacing: Dimensions.l
|
//offer_model.viewCriterion(criterion)
|
||||||
function viewOffers(criterion)
|
|
||||||
{
|
|
||||||
//offer_model.viewCriterion(criterion)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RowLayout
|
anchors.fill: parent
|
||||||
{
|
spacing: Dimensions.l
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
spacing: Dimensions.l
|
spacing: Dimensions.l
|
||||||
SearchBar
|
|
||||||
{
|
SearchBar {
|
||||||
id: searchBar
|
id: searchBar
|
||||||
|
|
||||||
}
|
}
|
||||||
QuickFilter {
|
QuickFilter {
|
||||||
model: ListModel {
|
model: ListModel {
|
||||||
ListElement {
|
ListElement {
|
||||||
name: "Alle"
|
name: "Alle"
|
||||||
text: qsTr("Alle")
|
|
||||||
selected: true
|
selected: true
|
||||||
|
text: qsTr("Alle")
|
||||||
}
|
}
|
||||||
ListElement
|
ListElement {
|
||||||
{
|
|
||||||
name: "Offen"
|
name: "Offen"
|
||||||
text: qsTr("Offen")
|
|
||||||
selected: false
|
selected: false
|
||||||
|
text: qsTr("Offen")
|
||||||
}
|
}
|
||||||
ListElement
|
ListElement {
|
||||||
{
|
|
||||||
name: "Abgeschlossen"
|
name: "Abgeschlossen"
|
||||||
selected: false
|
selected: false
|
||||||
text: qsTr("Abgeschlossen")
|
text: qsTr("Abgeschlossen")
|
||||||
@@ -49,18 +47,20 @@ ColumnLayout
|
|||||||
business_model.viewCriterion(name);
|
business_model.viewCriterion(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Button
|
Button {
|
||||||
{
|
|
||||||
id: addOfferBtn
|
id: addOfferBtn
|
||||||
text: qsTr("Angebote Hinzufügen")
|
|
||||||
icon.source: "qrc:/images/PlusCircle.svg"
|
|
||||||
Layout.alignment: Qt.AlignRight
|
Layout.alignment: Qt.AlignRight
|
||||||
flat: true
|
flat: true
|
||||||
|
icon.source: "qrc:/images/PlusCircle.svg"
|
||||||
|
text: qsTr("Angebote Hinzufügen")
|
||||||
|
|
||||||
onClicked: contentStack.push("AddOffer.qml")
|
onClicked: contentStack.push("AddOffer.qml")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Item {
|
Item {
|
||||||
id: spacer
|
id: spacer
|
||||||
|
|
||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
import "qrc:/TeroStyle"
|
|
||||||
|
|
||||||
Window
|
Window
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
//import "qrc:/TeroStyle"
|
|
||||||
|
|
||||||
Item
|
Item
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,13 +18,13 @@ ApplicationWindow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
font: Typography.body
|
font: Typography.body
|
||||||
height: Screen.desktopAvailableHeight
|
height: Screen.height * .85
|
||||||
palette.window: Colors.mantle
|
palette.window: Colors.mantle
|
||||||
palette.placeholderText: Colors.interactive
|
palette.placeholderText: Colors.interactive
|
||||||
palette.text: Colors.foreground
|
palette.text: Colors.foreground
|
||||||
title: "TERO Personal"
|
title: "TERO Personal"
|
||||||
visible: true
|
visible: true
|
||||||
width: Screen.desktopAvailableWidth
|
width: Screen.width * .75
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
systray.activated.connect(showWindow);
|
systray.activated.connect(showWindow);
|
||||||
|
|||||||
@@ -1,3 +1,2 @@
|
|||||||
module gui
|
module gui
|
||||||
Navigation 1.0 Navigation.qml
|
Navigation 1.0 Navigation.qml
|
||||||
AddContact 1.0 AddContact.qml
|
|
||||||
|
|||||||
73
Js/JsLib.js
73
Js/JsLib.js
@@ -1,73 +0,0 @@
|
|||||||
.pragma library
|
|
||||||
|
|
||||||
function firstConf(tabs)
|
|
||||||
{
|
|
||||||
let pyqcrm_conf = {};
|
|
||||||
pyqcrm_conf[tabs.name] = {}
|
|
||||||
for (var i = 0; i < tabs.children.length; i++)
|
|
||||||
{
|
|
||||||
if (tabs.children[i].name)
|
|
||||||
{
|
|
||||||
if (!tabs.children[i].text.trim())
|
|
||||||
return false
|
|
||||||
if (pyqcrm_conf[tabs.name][tabs.children[i].name] !== "DB_PASS")
|
|
||||||
pyqcrm_conf[tabs.name] [tabs.children[i].name] = tabs.children[i].text.trim()
|
|
||||||
else
|
|
||||||
pyqcrm_conf[tabs.name] [tabs.children[i].name] = tabs.children[i].text
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return pyqcrm_conf
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function parseForm(...form)
|
|
||||||
{
|
|
||||||
|
|
||||||
let data_form = {};
|
|
||||||
for (var i = 0; i < form.length; i++)
|
|
||||||
{
|
|
||||||
|
|
||||||
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].editText)
|
|
||||||
{
|
|
||||||
data_form[form[i].children[j].name] = form[i].children[j].editText
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
data_form[form[i].children[j].name] = form[i].children[j].currentText
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (form[i].children[j].toString().startsWith("TextField"))
|
|
||||||
{
|
|
||||||
data_form[form[i].children[j].name] = form[i].children[j].text.trim()
|
|
||||||
}
|
|
||||||
else if (form[i].children[j].toString().startsWith("Scroll"))
|
|
||||||
{
|
|
||||||
data_form[form[i].children[j].contentChildren[0].name] = form[i].children[j].contentChildren[0].text.trim()
|
|
||||||
}
|
|
||||||
else if (form[i].children[j].toString().startsWith("CheckBox"))
|
|
||||||
{
|
|
||||||
data_form[form[i].children[j].name] = form[i].children[j].checked
|
|
||||||
}
|
|
||||||
else if (form[i].children[j].toString().startsWith("SpinBox"))
|
|
||||||
{
|
|
||||||
data_form[form[i].children[j].name] = form[i].children[j].value
|
|
||||||
}
|
|
||||||
// else if (form[i].children[j].toString().startsWith("QQuickContentItem"))
|
|
||||||
// {
|
|
||||||
// console.log(form[i].children[j].children.children)
|
|
||||||
|
|
||||||
// for (var k = 0; k < form[i].children[j].length; k++)
|
|
||||||
// {
|
|
||||||
// console.log(form[i].children[j].name)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return data_form
|
|
||||||
}
|
|
||||||
|
|
||||||
0
TeroStyle/Button.qml
Executable file → Normal file
0
TeroStyle/Button.qml
Executable file → Normal file
@@ -4,11 +4,23 @@ import QtQuick.Layouts
|
|||||||
|
|
||||||
|
|
||||||
TextField {
|
TextField {
|
||||||
|
id: field
|
||||||
|
|
||||||
|
signal submitted(query: string)
|
||||||
|
|
||||||
Layout.preferredWidth: 300
|
Layout.preferredWidth: 300
|
||||||
placeholderText: qsTr("Suche")
|
placeholderText: qsTr("Suche")
|
||||||
|
|
||||||
|
Keys.onReturnPressed: {
|
||||||
|
field.submitted(field.text);
|
||||||
|
}
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
icon.source: "qrc:/images/MagnifyingGlass.svg"
|
icon.source: "qrc:/images/MagnifyingGlass.svg"
|
||||||
isFieldButton: true
|
isFieldButton: true
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
field.submitted(field.text)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import QtQuick.Controls
|
|
||||||
|
|
||||||
Item
|
|
||||||
{
|
|
||||||
id: teroStyle
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
|
|
||||||
Rectangle
|
|
||||||
{
|
|
||||||
anchors.fill: parent
|
|
||||||
color: "dodgerblue"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
|
|
||||||
Item {
|
|
||||||
|
|
||||||
}
|
|
||||||
0
TeroStyle/qmldir
Executable file → Normal file
0
TeroStyle/qmldir
Executable file → Normal file
@@ -1,192 +0,0 @@
|
|||||||
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36" version="27.0.2">
|
|
||||||
<diagram name="Seite-1" id="riPTszubbY08c-Ci63mD">
|
|
||||||
<mxGraphModel dx="2951" dy="1541" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
|
||||||
<root>
|
|
||||||
<mxCell id="0" />
|
|
||||||
<mxCell id="1" parent="0" />
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-1" value="" style="ellipse;html=1;shape=startState;fillColor=#000000;strokeColor=#ff0000;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="420" y="35" width="30" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-2" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" source="NvYeTt0xDQWk2u7kX_r0-1" parent="1" target="NvYeTt0xDQWk2u7kX_r0-3">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="300" y="50" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-3" value="Check Country" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="500" y="20" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-4" value="" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="520" y="125" width="80" height="80" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-5" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="NvYeTt0xDQWk2u7kX_r0-3" target="NvYeTt0xDQWk2u7kX_r0-4">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="550" y="525" as="sourcePoint" />
|
|
||||||
<mxPoint x="600" y="475" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-6" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="NvYeTt0xDQWk2u7kX_r0-4" target="NvYeTt0xDQWk2u7kX_r0-9">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="550" y="475" as="sourcePoint" />
|
|
||||||
<mxPoint x="740" y="205" as="targetPoint" />
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="680" y="165" />
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-8" value="Check City" style="rounded=1;whiteSpace=wrap;html=1;direction=east;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="399.5" y="345" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-9" value="addCountry" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="620" y="225" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-10" value="[exists]" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="460" y="135" width="60" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-11" value="[not exists]" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="610" y="135" width="60" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-12" value="" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="419.5" y="445" width="80" height="80" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-13" value="addCity" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="539.5" y="535" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-14" value="Check Postcode" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="259.25" y="645" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-15" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="NvYeTt0xDQWk2u7kX_r0-12" target="NvYeTt0xDQWk2u7kX_r0-13">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="649.5" y="565" as="sourcePoint" />
|
|
||||||
<mxPoint x="600" y="530" as="targetPoint" />
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="599.5" y="485" />
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-16" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="NvYeTt0xDQWk2u7kX_r0-12">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="649.5" y="565" as="sourcePoint" />
|
|
||||||
<mxPoint x="319.5" y="545" as="targetPoint" />
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="319.5" y="485" />
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-17" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="NvYeTt0xDQWk2u7kX_r0-8" target="NvYeTt0xDQWk2u7kX_r0-12">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="649.5" y="605" as="sourcePoint" />
|
|
||||||
<mxPoint x="699.5" y="555" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-19" value="[exists]" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="329.5" y="455" width="60" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-20" value="[not exists]" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="529.5" y="455" width="60" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-21" value="" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="279.25" y="745" width="80" height="80" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-22" value="addPostcode" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="399.5" y="845" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-24" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="NvYeTt0xDQWk2u7kX_r0-21" target="NvYeTt0xDQWk2u7kX_r0-22">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="509.25" y="865" as="sourcePoint" />
|
|
||||||
<mxPoint x="559.25" y="815" as="targetPoint" />
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="459.25" y="785" />
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-25" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="NvYeTt0xDQWk2u7kX_r0-21" target="NvYeTt0xDQWk2u7kX_r0-39">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="509.25" y="865" as="sourcePoint" />
|
|
||||||
<mxPoint x="179.25" y="855" as="targetPoint" />
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="179.25" y="785" />
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-26" value="[exists]" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="189.25" y="755" width="60" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-27" value="[not exists]" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="389.25" y="755" width="60" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-28" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="NvYeTt0xDQWk2u7kX_r0-14" target="NvYeTt0xDQWk2u7kX_r0-21">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="649.25" y="985" as="sourcePoint" />
|
|
||||||
<mxPoint x="699.25" y="935" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-30" value="" style="ellipse;html=1;shape=endState;fillColor=#000000;strokeColor=#ff0000;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="159.5" y="1085" width="41" height="40" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-31" value="" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="420" y="215" width="80" height="80" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-32" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="NvYeTt0xDQWk2u7kX_r0-4" target="NvYeTt0xDQWk2u7kX_r0-31">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="550" y="355" as="sourcePoint" />
|
|
||||||
<mxPoint x="600" y="305" as="targetPoint" />
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="460" y="165" />
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-33" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="NvYeTt0xDQWk2u7kX_r0-9" target="NvYeTt0xDQWk2u7kX_r0-31">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="540" y="255" as="sourcePoint" />
|
|
||||||
<mxPoint x="600" y="305" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-34" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="NvYeTt0xDQWk2u7kX_r0-31" target="NvYeTt0xDQWk2u7kX_r0-8">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="719.5" y="225" as="sourcePoint" />
|
|
||||||
<mxPoint x="699.5" y="285" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-36" value="" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="279.5" y="525" width="80" height="80" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-37" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="NvYeTt0xDQWk2u7kX_r0-13" target="NvYeTt0xDQWk2u7kX_r0-36">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="649.5" y="875" as="sourcePoint" />
|
|
||||||
<mxPoint x="699.5" y="825" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-38" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="NvYeTt0xDQWk2u7kX_r0-36" target="NvYeTt0xDQWk2u7kX_r0-14">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="649.5" y="935" as="sourcePoint" />
|
|
||||||
<mxPoint x="699.5" y="885" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-39" value="" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="140" y="835" width="80" height="80" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-40" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="NvYeTt0xDQWk2u7kX_r0-22" target="NvYeTt0xDQWk2u7kX_r0-39">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="649.5" y="765" as="sourcePoint" />
|
|
||||||
<mxPoint x="699.5" y="715" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-41" value="addID's to Adress" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="120" y="955" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-42" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="NvYeTt0xDQWk2u7kX_r0-39" target="NvYeTt0xDQWk2u7kX_r0-41">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="649.25" y="865" as="sourcePoint" />
|
|
||||||
<mxPoint x="699.25" y="815" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="NvYeTt0xDQWk2u7kX_r0-43" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="NvYeTt0xDQWk2u7kX_r0-41" target="NvYeTt0xDQWk2u7kX_r0-30">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="649.5" y="755" as="sourcePoint" />
|
|
||||||
<mxPoint x="699.5" y="705" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
|
||||||
</mxGraphModel>
|
|
||||||
</diagram>
|
|
||||||
</mxfile>
|
|
||||||
@@ -1,135 +0,0 @@
|
|||||||
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36" version="27.0.1">
|
|
||||||
<diagram name="Seite-1" id="Gl2dKcRXzwIEfQ6TcyUq">
|
|
||||||
<mxGraphModel dx="1425" dy="763" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
|
||||||
<root>
|
|
||||||
<mxCell id="0" />
|
|
||||||
<mxCell id="1" parent="0" />
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-1" value="" style="ellipse;html=1;shape=startState;fillColor=#000000;strokeColor=#ff0000;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="50" y="80" width="30" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-2" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;rounded=0;" edge="1" source="GylxGBc_4kwvuqjtwPvo-1" parent="1">
|
|
||||||
<mxGeometry relative="1" as="geometry">
|
|
||||||
<mxPoint x="170" y="95" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-3" value="addOffer" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="170" y="65" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-4" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="GylxGBc_4kwvuqjtwPvo-3" target="GylxGBc_4kwvuqjtwPvo-5">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="220" y="210" as="sourcePoint" />
|
|
||||||
<mxPoint x="380" y="95" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-5" value="enterData" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="354" y="65" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-6" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="GylxGBc_4kwvuqjtwPvo-11" target="GylxGBc_4kwvuqjtwPvo-12">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="220" y="210" as="sourcePoint" />
|
|
||||||
<mxPoint x="270" y="160" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-8" value="" style="endArrow=open;dashed=1;html=1;rounded=0;endFill=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="GylxGBc_4kwvuqjtwPvo-5">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="500" y="110" as="sourcePoint" />
|
|
||||||
<mxPoint x="540" y="95" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-9" value="OfferData" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="540" y="65" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-10" value="" style="endArrow=open;dashed=1;html=1;rounded=0;endFill=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="GylxGBc_4kwvuqjtwPvo-9">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="484" y="105" as="sourcePoint" />
|
|
||||||
<mxPoint x="600" y="180" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-11" value="ValidateData" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="540" y="180" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-12" value="" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="560" y="290" width="80" height="80" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-13" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="GylxGBc_4kwvuqjtwPvo-12" target="GylxGBc_4kwvuqjtwPvo-5">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="450" y="360" as="sourcePoint" />
|
|
||||||
<mxPoint x="500" y="310" as="targetPoint" />
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="720" y="330" />
|
|
||||||
<mxPoint x="720" y="30" />
|
|
||||||
<mxPoint x="414" y="30" />
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-14" value="[data not valid]" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="630" y="300" width="90" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-15" value="saveData" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="354" y="300" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-16" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="GylxGBc_4kwvuqjtwPvo-12" target="GylxGBc_4kwvuqjtwPvo-15">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="450" y="360" as="sourcePoint" />
|
|
||||||
<mxPoint x="500" y="310" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-18" value="" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="190" y="290" width="80" height="80" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-19" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="GylxGBc_4kwvuqjtwPvo-15" target="GylxGBc_4kwvuqjtwPvo-18">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="450" y="360" as="sourcePoint" />
|
|
||||||
<mxPoint x="500" y="310" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-20" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="GylxGBc_4kwvuqjtwPvo-18" target="GylxGBc_4kwvuqjtwPvo-21">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="450" y="360" as="sourcePoint" />
|
|
||||||
<mxPoint x="500" y="310" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-21" value="ErrorMessage" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="170" y="160" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-22" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="GylxGBc_4kwvuqjtwPvo-21">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="450" y="360" as="sourcePoint" />
|
|
||||||
<mxPoint x="370" y="190" as="targetPoint" />
|
|
||||||
<Array as="points" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-23" value="successMessage" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="170" y="460" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-24" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="GylxGBc_4kwvuqjtwPvo-18" target="GylxGBc_4kwvuqjtwPvo-23">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="450" y="360" as="sourcePoint" />
|
|
||||||
<mxPoint x="500" y="310" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-25" value="" style="ellipse;html=1;shape=endState;fillColor=#000000;strokeColor=#ff0000;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="215" y="585" width="30" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-26" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="GylxGBc_4kwvuqjtwPvo-23" target="GylxGBc_4kwvuqjtwPvo-25">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="450" y="360" as="sourcePoint" />
|
|
||||||
<mxPoint x="500" y="310" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-27" value="[data valid]" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="480" y="300" width="70" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-28" value="[error saving]" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;rotation=-90;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="205" y="250" width="85" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-29" value="[saving]" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;rotation=-90;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="205" y="400" width="85" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="GylxGBc_4kwvuqjtwPvo-33" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.flowchart.or;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="370" y="170" width="40" height="40" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
|
||||||
</mxGraphModel>
|
|
||||||
</diagram>
|
|
||||||
</mxfile>
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
<mxfile host="app.diagrams.net" modified="2020-06-30T06:41:58.039Z" agent="5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36" etag="eN_aVuXlrJnozz_3bGs0" version="13.3.5">
|
|
||||||
<diagram id="R2lEEEUBdFMjLlhIrx00" name="Page-1">
|
|
||||||
<mxGraphModel dx="1223" dy="797" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0" extFonts="Permanent Marker^https://fonts.googleapis.com/css?family=Permanent+Marker">
|
|
||||||
<root>
|
|
||||||
<mxCell id="0" />
|
|
||||||
<mxCell id="1" parent="0" />
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-1" value="" style="edgeStyle=entityRelationEdgeStyle;endArrow=ERzeroToMany;startArrow=ERone;endFill=1;startFill=0;" parent="1" source="C-vyLk0tnHw3VtMMgP7b-24" target="C-vyLk0tnHw3VtMMgP7b-6" edge="1">
|
|
||||||
<mxGeometry width="100" height="100" relative="1" as="geometry">
|
|
||||||
<mxPoint x="340" y="720" as="sourcePoint" />
|
|
||||||
<mxPoint x="440" y="620" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-12" value="" style="edgeStyle=entityRelationEdgeStyle;endArrow=ERzeroToMany;startArrow=ERone;endFill=1;startFill=0;" parent="1" source="C-vyLk0tnHw3VtMMgP7b-3" target="C-vyLk0tnHw3VtMMgP7b-17" edge="1">
|
|
||||||
<mxGeometry width="100" height="100" relative="1" as="geometry">
|
|
||||||
<mxPoint x="400" y="180" as="sourcePoint" />
|
|
||||||
<mxPoint x="460" y="205" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-2" value="Orders" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="450" y="120" width="250" height="130" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-3" value="" style="shape=partialRectangle;collapsible=0;dropTarget=0;pointerEvents=0;fillColor=none;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="C-vyLk0tnHw3VtMMgP7b-2" vertex="1">
|
|
||||||
<mxGeometry y="30" width="250" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-4" value="PK" style="shape=partialRectangle;overflow=hidden;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;" parent="C-vyLk0tnHw3VtMMgP7b-3" vertex="1">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-5" value="order_id int NOT NULL " style="shape=partialRectangle;overflow=hidden;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;" parent="C-vyLk0tnHw3VtMMgP7b-3" vertex="1">
|
|
||||||
<mxGeometry x="30" width="220" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-6" value="" style="shape=partialRectangle;collapsible=0;dropTarget=0;pointerEvents=0;fillColor=none;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="C-vyLk0tnHw3VtMMgP7b-2" vertex="1">
|
|
||||||
<mxGeometry y="60" width="250" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-7" value="FK1" style="shape=partialRectangle;overflow=hidden;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;" parent="C-vyLk0tnHw3VtMMgP7b-6" vertex="1">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-8" value="customer_id int NOT NULL" style="shape=partialRectangle;overflow=hidden;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;" parent="C-vyLk0tnHw3VtMMgP7b-6" vertex="1">
|
|
||||||
<mxGeometry x="30" width="220" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-9" value="" style="shape=partialRectangle;collapsible=0;dropTarget=0;pointerEvents=0;fillColor=none;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="C-vyLk0tnHw3VtMMgP7b-2" vertex="1">
|
|
||||||
<mxGeometry y="90" width="250" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-10" value="" style="shape=partialRectangle;overflow=hidden;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;" parent="C-vyLk0tnHw3VtMMgP7b-9" vertex="1">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-11" value="order_date date NOT NULL" style="shape=partialRectangle;overflow=hidden;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;" parent="C-vyLk0tnHw3VtMMgP7b-9" vertex="1">
|
|
||||||
<mxGeometry x="30" width="220" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-13" value="Shipments" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="450" y="280" width="250" height="130" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-14" value="" style="shape=partialRectangle;collapsible=0;dropTarget=0;pointerEvents=0;fillColor=none;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="C-vyLk0tnHw3VtMMgP7b-13" vertex="1">
|
|
||||||
<mxGeometry y="30" width="250" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-15" value="PK" style="shape=partialRectangle;overflow=hidden;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;" parent="C-vyLk0tnHw3VtMMgP7b-14" vertex="1">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-16" value="shipment_id int NOT NULL " style="shape=partialRectangle;overflow=hidden;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;" parent="C-vyLk0tnHw3VtMMgP7b-14" vertex="1">
|
|
||||||
<mxGeometry x="30" width="220" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-17" value="" style="shape=partialRectangle;collapsible=0;dropTarget=0;pointerEvents=0;fillColor=none;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="C-vyLk0tnHw3VtMMgP7b-13" vertex="1">
|
|
||||||
<mxGeometry y="60" width="250" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-18" value="FK1" style="shape=partialRectangle;overflow=hidden;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;" parent="C-vyLk0tnHw3VtMMgP7b-17" vertex="1">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-19" value="order_id int NOT NULL" style="shape=partialRectangle;overflow=hidden;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;" parent="C-vyLk0tnHw3VtMMgP7b-17" vertex="1">
|
|
||||||
<mxGeometry x="30" width="220" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-20" value="" style="shape=partialRectangle;collapsible=0;dropTarget=0;pointerEvents=0;fillColor=none;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="C-vyLk0tnHw3VtMMgP7b-13" vertex="1">
|
|
||||||
<mxGeometry y="90" width="250" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-21" value="" style="shape=partialRectangle;overflow=hidden;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;" parent="C-vyLk0tnHw3VtMMgP7b-20" vertex="1">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-22" value="shipment_date date NOT NULL" style="shape=partialRectangle;overflow=hidden;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;" parent="C-vyLk0tnHw3VtMMgP7b-20" vertex="1">
|
|
||||||
<mxGeometry x="30" width="220" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-23" value="Customers" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;" parent="1" vertex="1">
|
|
||||||
<mxGeometry x="120" y="120" width="250" height="100" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-24" value="" style="shape=partialRectangle;collapsible=0;dropTarget=0;pointerEvents=0;fillColor=none;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="C-vyLk0tnHw3VtMMgP7b-23" vertex="1">
|
|
||||||
<mxGeometry y="30" width="250" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-25" value="PK" style="shape=partialRectangle;overflow=hidden;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;" parent="C-vyLk0tnHw3VtMMgP7b-24" vertex="1">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-26" value="customer_id int NOT NULL " style="shape=partialRectangle;overflow=hidden;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;" parent="C-vyLk0tnHw3VtMMgP7b-24" vertex="1">
|
|
||||||
<mxGeometry x="30" width="220" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-27" value="" style="shape=partialRectangle;collapsible=0;dropTarget=0;pointerEvents=0;fillColor=none;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="C-vyLk0tnHw3VtMMgP7b-23" vertex="1">
|
|
||||||
<mxGeometry y="60" width="250" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-28" value="" style="shape=partialRectangle;overflow=hidden;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;" parent="C-vyLk0tnHw3VtMMgP7b-27" vertex="1">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="C-vyLk0tnHw3VtMMgP7b-29" value="customer_name char(50) NOT NULL" style="shape=partialRectangle;overflow=hidden;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;" parent="C-vyLk0tnHw3VtMMgP7b-27" vertex="1">
|
|
||||||
<mxGeometry x="30" width="220" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
|
||||||
</mxGraphModel>
|
|
||||||
</diagram>
|
|
||||||
</mxfile>
|
|
||||||
@@ -1,320 +0,0 @@
|
|||||||
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36" version="27.0.2">
|
|
||||||
<diagram name="Seite-1" id="-Jvt9mGG8Li5CNeMcOU4">
|
|
||||||
<mxGraphModel dx="2066" dy="1107" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
|
||||||
<root>
|
|
||||||
<mxCell id="0" />
|
|
||||||
<mxCell id="1" parent="0" />
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-1" value="Street" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="60" y="800" width="180" height="90" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-2" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-1">
|
|
||||||
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-3" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-2">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-4" value="streetID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-2">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-5" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="r5czroBNAvCpoAouLHI1-1">
|
|
||||||
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-6" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-5">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-7" value="name" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-5">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-14" value="City" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="370" y="80" width="180" height="90" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-15" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-14">
|
|
||||||
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-16" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-15">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-17" value="cityID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-15">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-18" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="r5czroBNAvCpoAouLHI1-14">
|
|
||||||
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-19" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-18">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-20" value="name" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-18">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-27" value="Country" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="80" y="90" width="180" height="150" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-28" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-27">
|
|
||||||
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-29" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-28">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-30" value="countryID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-28">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-31" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="r5czroBNAvCpoAouLHI1-27">
|
|
||||||
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-32" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-31">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-33" value="country" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-31">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-34" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="r5czroBNAvCpoAouLHI1-27">
|
|
||||||
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-35" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-34">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-36" value="countryshort" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-34">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-37" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="r5czroBNAvCpoAouLHI1-27">
|
|
||||||
<mxGeometry y="120" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-38" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-37">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-39" value="nationality" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-37">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-40" value="Country/City/Postcode" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="260" y="290" width="180" height="150" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-41" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-40">
|
|
||||||
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-42" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-41">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-43" value="ccpID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-41">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-44" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="r5czroBNAvCpoAouLHI1-40">
|
|
||||||
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-45" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-44">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-46" value="countryID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-44">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-47" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="r5czroBNAvCpoAouLHI1-40">
|
|
||||||
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-48" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-47">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-49" value="cityID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-47">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-50" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="r5czroBNAvCpoAouLHI1-40">
|
|
||||||
<mxGeometry y="120" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-51" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-50">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-52" value="postcodeID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-50">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-53" value="House" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="480" y="800" width="180" height="90" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-54" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-53">
|
|
||||||
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-55" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-54">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-56" value="houseID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-54">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-57" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="r5czroBNAvCpoAouLHI1-53">
|
|
||||||
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-58" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-57">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-59" value="number" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-57">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-66" value="Postcode" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="520" y="230" width="180" height="90" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-67" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-66">
|
|
||||||
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-68" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-67">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-69" value="postcodeID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-67">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-70" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="r5czroBNAvCpoAouLHI1-66">
|
|
||||||
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-71" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-70">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-72" value="number" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-70">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-79" value="Street/House" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="260" y="650" width="180" height="120" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-80" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-79">
|
|
||||||
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-81" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-80">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-82" value="streetHouseID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-80">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-83" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="r5czroBNAvCpoAouLHI1-79">
|
|
||||||
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-84" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-83">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-85" value="streetID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-83">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-86" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="r5czroBNAvCpoAouLHI1-79">
|
|
||||||
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-87" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-86">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-88" value="houseID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-86">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-92" value="FullAddress" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="260" y="470" width="180" height="120" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-93" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-92">
|
|
||||||
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-94" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-93">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-95" value="fullAddressID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-93">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-96" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="r5czroBNAvCpoAouLHI1-92">
|
|
||||||
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-97" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-96">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-98" value="ccpID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-96">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-99" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="r5czroBNAvCpoAouLHI1-92">
|
|
||||||
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-100" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-99">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="r5czroBNAvCpoAouLHI1-101" value="streetHouseID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="r5czroBNAvCpoAouLHI1-99">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
|
||||||
</mxGraphModel>
|
|
||||||
</diagram>
|
|
||||||
</mxfile>
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/25.0.2 Chrome/128.0.6613.186 Electron/32.2.5 Safari/537.36" version="25.0.2">
|
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/25.0.2 Chrome/128.0.6613.186 Electron/32.2.5 Safari/537.36" version="25.0.2">
|
||||||
<diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">
|
<diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">
|
||||||
<mxGraphModel dx="1185" dy="683" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
<mxGraphModel dx="2963" dy="1707" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||||
<root>
|
<root>
|
||||||
<mxCell id="WIyWlLk6GJQsqaUBKTNV-0" />
|
<mxCell id="WIyWlLk6GJQsqaUBKTNV-0" />
|
||||||
<mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" />
|
<mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" />
|
||||||
@@ -290,8 +290,8 @@
|
|||||||
<mxPoint x="250" y="530" as="sourcePoint" />
|
<mxPoint x="250" y="530" as="sourcePoint" />
|
||||||
<mxPoint x="300" y="480" as="targetPoint" />
|
<mxPoint x="300" y="480" as="targetPoint" />
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="450" y="383" />
|
<mxPoint x="440" y="383" />
|
||||||
<mxPoint x="450" y="468" />
|
<mxPoint x="440" y="468" />
|
||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
@@ -307,8 +307,8 @@
|
|||||||
<mxPoint x="270" y="530" as="sourcePoint" />
|
<mxPoint x="270" y="530" as="sourcePoint" />
|
||||||
<mxPoint x="320" y="480" as="targetPoint" />
|
<mxPoint x="320" y="480" as="targetPoint" />
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="440" y="406" />
|
<mxPoint x="430" y="406" />
|
||||||
<mxPoint x="440" y="700" />
|
<mxPoint x="430" y="698" />
|
||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
@@ -323,9 +323,9 @@
|
|||||||
<mxPoint x="270" y="530" as="sourcePoint" />
|
<mxPoint x="270" y="530" as="sourcePoint" />
|
||||||
<mxPoint x="470" y="940" as="targetPoint" />
|
<mxPoint x="470" y="940" as="targetPoint" />
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="430" y="420" />
|
<mxPoint x="410" y="423" />
|
||||||
<mxPoint x="430" y="600" />
|
<mxPoint x="410" y="600" />
|
||||||
<mxPoint x="430" y="940" />
|
<mxPoint x="410" y="940" />
|
||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
@@ -389,25 +389,25 @@
|
|||||||
<mxCell id="v96xPLQoPeUk4bUV2WaN-99" value="+ instance(): connection" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="v96xPLQoPeUk4bUV2WaN-96" vertex="1">
|
<mxCell id="v96xPLQoPeUk4bUV2WaN-99" value="+ instance(): connection" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="v96xPLQoPeUk4bUV2WaN-96" vertex="1">
|
||||||
<mxGeometry y="58" width="170" height="32" as="geometry" />
|
<mxGeometry y="58" width="170" height="32" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-0" value="PyqcrmFlags" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-0" value="PyqcrmFlags" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
|
||||||
<mxGeometry x="870" y="340" width="170" height="150" as="geometry" />
|
<mxGeometry x="870" y="340" width="170" height="150" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-1" value="<div>ADMIN: enum</div><div>USER: enum</div>" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="6xiAvg-kEoilwsfhhM0o-0" vertex="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-1" value="<div>ADMIN: enum</div><div>USER: enum</div>" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-0">
|
||||||
<mxGeometry y="26" width="170" height="44" as="geometry" />
|
<mxGeometry y="26" width="170" height="44" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-2" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" parent="6xiAvg-kEoilwsfhhM0o-0" vertex="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-2" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-0">
|
||||||
<mxGeometry y="70" width="170" height="80" as="geometry" />
|
<mxGeometry y="70" width="170" height="80" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-3" value="PyqcrmAppliEmpyFlags" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-3" value="PyqcrmAppliEmpyFlags" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
|
||||||
<mxGeometry x="870" y="170" width="170" height="140" as="geometry" />
|
<mxGeometry x="870" y="170" width="170" height="140" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-4" value="<div>ALL: enum</div><div>APPLICANT: enum</div><div>EMPLOYEE; enum</div>" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="6xiAvg-kEoilwsfhhM0o-3" vertex="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-4" value="<div>ALL: enum</div><div>APPLICANT: enum</div><div>EMPLOYEE; enum</div>" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-3">
|
||||||
<mxGeometry y="26" width="170" height="64" as="geometry" />
|
<mxGeometry y="26" width="170" height="64" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-5" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" parent="6xiAvg-kEoilwsfhhM0o-3" vertex="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-5" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-3">
|
||||||
<mxGeometry y="90" width="170" height="50" as="geometry" />
|
<mxGeometry y="90" width="170" height="50" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-6" value="" style="endArrow=none;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-89" target="v96xPLQoPeUk4bUV2WaN-40" edge="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-6" value="" style="endArrow=none;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-89" target="v96xPLQoPeUk4bUV2WaN-40">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="420" y="900" as="sourcePoint" />
|
<mxPoint x="420" y="900" as="sourcePoint" />
|
||||||
<mxPoint x="470" y="850" as="targetPoint" />
|
<mxPoint x="470" y="850" as="targetPoint" />
|
||||||
@@ -417,7 +417,7 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-7" value="" style="endArrow=none;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-48" target="v96xPLQoPeUk4bUV2WaN-93" edge="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-7" value="" style="endArrow=none;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-48" target="v96xPLQoPeUk4bUV2WaN-93">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="420" y="900" as="sourcePoint" />
|
<mxPoint x="420" y="900" as="sourcePoint" />
|
||||||
<mxPoint x="470" y="850" as="targetPoint" />
|
<mxPoint x="470" y="850" as="targetPoint" />
|
||||||
@@ -427,7 +427,7 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-8" value="" style="endArrow=none;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-93" target="v96xPLQoPeUk4bUV2WaN-40" edge="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-8" value="" style="endArrow=none;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-93" target="v96xPLQoPeUk4bUV2WaN-40">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="420" y="900" as="sourcePoint" />
|
<mxPoint x="420" y="900" as="sourcePoint" />
|
||||||
<mxPoint x="470" y="850" as="targetPoint" />
|
<mxPoint x="470" y="850" as="targetPoint" />
|
||||||
@@ -437,7 +437,7 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-9" value="" style="endArrow=none;html=1;rounded=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;exitX=0.25;exitY=0;exitDx=0;exitDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-48" target="v96xPLQoPeUk4bUV2WaN-89" edge="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-9" value="" style="endArrow=none;html=1;rounded=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;exitX=0.25;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-48" target="v96xPLQoPeUk4bUV2WaN-89">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="420" y="900" as="sourcePoint" />
|
<mxPoint x="420" y="900" as="sourcePoint" />
|
||||||
<mxPoint x="470" y="850" as="targetPoint" />
|
<mxPoint x="470" y="850" as="targetPoint" />
|
||||||
@@ -447,77 +447,42 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-10" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-78" target="v96xPLQoPeUk4bUV2WaN-97" edge="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-10" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-78" target="v96xPLQoPeUk4bUV2WaN-97">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="600" y="440" as="sourcePoint" />
|
<mxPoint x="600" y="440" as="sourcePoint" />
|
||||||
<mxPoint x="650" y="390" as="targetPoint" />
|
<mxPoint x="650" y="390" as="targetPoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-11" value="" style="endArrow=none;html=1;rounded=0;exitX=1.001;exitY=0.102;exitDx=0;exitDy=0;exitPerimeter=0;entryX=-0.002;entryY=0.624;entryDx=0;entryDy=0;entryPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="6xiAvg-kEoilwsfhhM0o-0" target="v96xPLQoPeUk4bUV2WaN-80" edge="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-11" value="" style="endArrow=none;html=1;rounded=0;exitX=1.001;exitY=0.102;exitDx=0;exitDy=0;exitPerimeter=0;entryX=-0.002;entryY=0.624;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="6xiAvg-kEoilwsfhhM0o-0" target="v96xPLQoPeUk4bUV2WaN-80">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="600" y="440" as="sourcePoint" />
|
<mxPoint x="600" y="440" as="sourcePoint" />
|
||||||
<mxPoint x="650" y="390" as="targetPoint" />
|
<mxPoint x="650" y="390" as="targetPoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-12" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=-0.001;exitY=0.316;exitDx=0;exitDy=0;exitPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-80" target="6xiAvg-kEoilwsfhhM0o-4" edge="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-12" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=-0.001;exitY=0.316;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-80" target="6xiAvg-kEoilwsfhhM0o-4">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="600" y="440" as="sourcePoint" />
|
<mxPoint x="600" y="440" as="sourcePoint" />
|
||||||
<mxPoint x="650" y="390" as="targetPoint" />
|
<mxPoint x="650" y="390" as="targetPoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-13" value="Vermasseln" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-13" value="Vermasseln" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
|
||||||
<mxGeometry x="1350" y="40" width="170" height="140" as="geometry" />
|
<mxGeometry x="1350" y="40" width="170" height="140" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-14" value="<div><br></div><div><br></div>" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="6xiAvg-kEoilwsfhhM0o-13" vertex="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-14" value="<div><br></div><div><br></div>" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-13">
|
||||||
<mxGeometry y="26" width="170" height="24" as="geometry" />
|
<mxGeometry y="26" width="170" height="24" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-15" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" parent="6xiAvg-kEoilwsfhhM0o-13" vertex="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-15" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-13">
|
||||||
<mxGeometry y="50" width="170" height="8" as="geometry" />
|
<mxGeometry y="50" width="170" height="8" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-16" value="+ oscarVermasseln()<div>+ entschluesseln()</div><div>-&nbsp; vermasslungsKobold()</div><div>+ userPasswordHash</div><div><br></div>" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="6xiAvg-kEoilwsfhhM0o-13" vertex="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-16" value="+ oscarVermasseln()<div>+ entschluesseln()</div><div>-&nbsp; vermasslungsKobold()</div><div>+ userPasswordHash</div><div><br></div>" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-13">
|
||||||
<mxGeometry y="58" width="170" height="82" as="geometry" />
|
<mxGeometry y="58" width="170" height="82" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="6xiAvg-kEoilwsfhhM0o-17" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-78" target="6xiAvg-kEoilwsfhhM0o-14" edge="1">
|
<mxCell id="6xiAvg-kEoilwsfhhM0o-17" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-78" target="6xiAvg-kEoilwsfhhM0o-14">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="800" y="530" as="sourcePoint" />
|
<mxPoint x="800" y="530" as="sourcePoint" />
|
||||||
<mxPoint x="850" y="480" as="targetPoint" />
|
<mxPoint x="850" y="480" as="targetPoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="oFnCSLyNU9wu8QDSkbbI-1" value="OfferDAO" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
|
|
||||||
<mxGeometry x="460" y="1169" width="160" height="170" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="oFnCSLyNU9wu8QDSkbbI-3" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" vertex="1" parent="oFnCSLyNU9wu8QDSkbbI-1">
|
|
||||||
<mxGeometry y="26" width="160" height="54" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="oFnCSLyNU9wu8QDSkbbI-4" value="+ addOffer()<div>+ getOffer()</div><div>+ deleteOffer()</div><div>+ updateOffer()</div>" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="oFnCSLyNU9wu8QDSkbbI-1">
|
|
||||||
<mxGeometry y="80" width="160" height="90" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="oFnCSLyNU9wu8QDSkbbI-5" value="OfferModel" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
|
|
||||||
<mxGeometry x="650" y="1169" width="160" height="250" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="oFnCSLyNU9wu8QDSkbbI-7" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" vertex="1" parent="oFnCSLyNU9wu8QDSkbbI-5">
|
|
||||||
<mxGeometry y="26" width="160" height="54" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="oFnCSLyNU9wu8QDSkbbI-8" value="<div>+ addOffer()</div><div>+ deleteOffer()</div><div>+ updateOffer()<br><div>-&nbsp; refreshView()</div><div>-&nbsp; getData()</div><div>+ rowCount()</div><div>+ columnCount()</div><div>+ viewCriterion()</div><div>+ data()</div><div>+ headerData()</div><div>+ onRowClicked()</div></div>" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="oFnCSLyNU9wu8QDSkbbI-5">
|
|
||||||
<mxGeometry y="80" width="160" height="170" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="oFnCSLyNU9wu8QDSkbbI-9" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="620" y="1210" as="sourcePoint" />
|
|
||||||
<mxPoint x="650" y="1210" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="oFnCSLyNU9wu8QDSkbbI-10" value="" style="endArrow=none;html=1;rounded=0;exitX=0.865;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;endFill=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="_OjnZrDktrtFcgEA-KSX-16">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="760" y="800" as="sourcePoint" />
|
|
||||||
<mxPoint x="460" y="1210" as="targetPoint" />
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="167" y="450" />
|
|
||||||
<mxPoint x="420" y="450" />
|
|
||||||
<mxPoint x="420" y="1210" />
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
</root>
|
||||||
</mxGraphModel>
|
</mxGraphModel>
|
||||||
</diagram>
|
</diagram>
|
||||||
|
|||||||
@@ -1,184 +0,0 @@
|
|||||||
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36" version="26.2.14">
|
|
||||||
<diagram name="Seite-1" id="Wrq0Xm_iZAiwaSdTmyxs">
|
|
||||||
<mxGraphModel dx="1425" dy="763" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
|
||||||
<root>
|
|
||||||
<mxCell id="0" />
|
|
||||||
<mxCell id="1" parent="0" />
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-21" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=none;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="60" y="240" width="360" height="210" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-1" value="Andre" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="70" y="150" width="20" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-2" value="UI" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="140" y="150" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-3" value="OFFER" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="340" y="150" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-4" value="CONTRACT" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="540" y="150" width="120" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-6" value="" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0.317;entryY=0.9;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" target="t-EcJqArzlBj0utZR-UU-22">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="80" y="950" as="sourcePoint" />
|
|
||||||
<mxPoint x="80" y="450" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-7" value="" style="endArrow=none;dashed=1;html=1;rounded=0;" edge="1" parent="1">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="200" y="960" as="sourcePoint" />
|
|
||||||
<mxPoint x="200" y="240" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-8" value="" style="endArrow=none;dashed=1;html=1;rounded=0;" edge="1" parent="1">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="400" y="960" as="sourcePoint" />
|
|
||||||
<mxPoint x="400" y="240" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-9" value="" style="endArrow=none;dashed=1;html=1;rounded=0;" edge="1" parent="1">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="600" y="960" as="sourcePoint" />
|
|
||||||
<mxPoint x="600" y="240" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-10" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="80" y="300" as="sourcePoint" />
|
|
||||||
<mxPoint x="200" y="300" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-11" value="addOffer(data)" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="90" y="270" width="100" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-12" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="200" y="300" as="sourcePoint" />
|
|
||||||
<mxPoint x="400" y="300" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-14" value="addOffer(data)" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="250" y="270" width="100" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-16" value="" style="endArrow=none;dashed=1;html=1;rounded=0;startArrow=classic;startFill=1;" edge="1" parent="1">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="80" y="420" as="sourcePoint" />
|
|
||||||
<mxPoint x="200" y="420" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-22" value="alt" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="60" y="240" width="60" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-23" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0;entryDx=0;entryDy=0;exitX=-0.001;exitY=0.132;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="t-EcJqArzlBj0utZR-UU-21" target="t-EcJqArzlBj0utZR-UU-22">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="90" y="270" as="sourcePoint" />
|
|
||||||
<mxPoint x="300" y="330" as="targetPoint" />
|
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="120" y="268" />
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-25" value="" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=-0.004;entryY=0.475;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.995;exitY=0.478;exitDx=0;exitDy=0;exitPerimeter=0;dashPattern=8 8;strokeWidth=2;" edge="1" parent="1" source="t-EcJqArzlBj0utZR-UU-21" target="t-EcJqArzlBj0utZR-UU-21">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="600" y="380.0033333333333" as="sourcePoint" />
|
|
||||||
<mxPoint x="480" y="446.67" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-26" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="80" y="390" as="sourcePoint" />
|
|
||||||
<mxPoint x="200" y="390" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-27" value="addOffer(data)" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="90" y="360" width="100" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-28" value="wrongData" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="100" y="390" width="80" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-29" value="" style="endArrow=none;dashed=1;html=1;rounded=0;startArrow=classic;startFill=1;" edge="1" parent="1">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="80" y="330" as="sourcePoint" />
|
|
||||||
<mxPoint x="400" y="330" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-31" value="offerAdded" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="220" y="300" width="60" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-32" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="80" y="540" as="sourcePoint" />
|
|
||||||
<mxPoint x="200" y="540" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-33" value="addContract(data)" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="80" y="510" width="120" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-34" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.982;exitY=0.986;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="t-EcJqArzlBj0utZR-UU-33">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="250" y="380" as="sourcePoint" />
|
|
||||||
<mxPoint x="400" y="540" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-35" value="addOffer(data)" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="250" y="510" width="60" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-36" value="" style="endArrow=none;dashed=1;html=1;rounded=0;startArrow=classic;startFill=1;" edge="1" parent="1">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="200" y="580" as="sourcePoint" />
|
|
||||||
<mxPoint x="400" y="580" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-37" value="offer(data)" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="260" y="550" width="60" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-38" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="200" y="610" as="sourcePoint" />
|
|
||||||
<mxPoint x="600" y="610" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-40" value="addContract(data)" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="360" y="580" width="190" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-41" value="" style="endArrow=none;dashed=1;html=1;rounded=0;startArrow=classic;startFill=1;" edge="1" parent="1">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="80" y="650" as="sourcePoint" />
|
|
||||||
<mxPoint x="600" y="650" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-42" value="contractAdded()" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="290" y="620" width="60" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-44" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="80" y="720" as="sourcePoint" />
|
|
||||||
<mxPoint x="200" y="720" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-45" value="offerAccept(data)" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="80" y="690" width="120" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-46" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="200" y="720" as="sourcePoint" />
|
|
||||||
<mxPoint x="600" y="720" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-47" value="addContract(data)" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="280" y="690" width="60" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-49" value="" style="endArrow=none;dashed=1;html=1;rounded=0;startArrow=classic;startFill=1;" edge="1" parent="1">
|
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
|
||||||
<mxPoint x="80" y="770" as="sourcePoint" />
|
|
||||||
<mxPoint x="600" y="770" as="targetPoint" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="t-EcJqArzlBj0utZR-UU-50" value="contractAdded()" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="290" y="740" width="60" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
|
||||||
</mxGraphModel>
|
|
||||||
</diagram>
|
|
||||||
</mxfile>
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/25.0.2 Chrome/128.0.6613.186 Electron/32.2.5 Safari/537.36" version="25.0.2">
|
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/25.0.2 Chrome/128.0.6613.186 Electron/32.2.5 Safari/537.36" version="25.0.2">
|
||||||
<diagram name="Seite-1" id="krh1Wum05D0y0HCIq7V8">
|
<diagram name="Seite-1" id="krh1Wum05D0y0HCIq7V8">
|
||||||
<mxGraphModel dx="2555" dy="996" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
<mxGraphModel dx="3267" dy="1406" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||||
<root>
|
<root>
|
||||||
<mxCell id="0" />
|
<mxCell id="0" />
|
||||||
<mxCell id="1" parent="0" />
|
<mxCell id="1" parent="0" />
|
||||||
@@ -78,6 +78,35 @@
|
|||||||
<mxCell id="Ya_982ONw7_15APAzA8q-34" value="1" style="resizable=0;html=1;whiteSpace=wrap;align=right;verticalAlign=bottom;" parent="1" connectable="0" vertex="1">
|
<mxCell id="Ya_982ONw7_15APAzA8q-34" value="1" style="resizable=0;html=1;whiteSpace=wrap;align=right;verticalAlign=bottom;" parent="1" connectable="0" vertex="1">
|
||||||
<mxGeometry x="535" y="180.00000000000006" as="geometry" />
|
<mxGeometry x="535" y="180.00000000000006" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-81" value="servicedesc" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="1410" y="249" width="180" height="90" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-82" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="Ya_982ONw7_15APAzA8q-81" vertex="1">
|
||||||
|
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-83" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-82" vertex="1">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-84" value="servicedescid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-82" vertex="1">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-85" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="Ya_982ONw7_15APAzA8q-81" vertex="1">
|
||||||
|
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-86" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-85" vertex="1">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-87" value="description" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-85" vertex="1">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
<mxCell id="Ya_982ONw7_15APAzA8q-105" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="wp44KSVxnTE4gDC1YKSh-240" edge="1">
|
<mxCell id="Ya_982ONw7_15APAzA8q-105" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="wp44KSVxnTE4gDC1YKSh-240" edge="1">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="560" y="163" as="sourcePoint" />
|
<mxPoint x="560" y="163" as="sourcePoint" />
|
||||||
@@ -118,7 +147,7 @@
|
|||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="Ya_982ONw7_15APAzA8q-176" value="offer" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" parent="1" vertex="1">
|
<mxCell id="Ya_982ONw7_15APAzA8q-176" value="offer" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" parent="1" vertex="1">
|
||||||
<mxGeometry x="900" y="880" width="180" height="90" as="geometry" />
|
<mxGeometry x="900" y="880" width="180" height="120" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="Ya_982ONw7_15APAzA8q-177" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="Ya_982ONw7_15APAzA8q-176" vertex="1">
|
<mxCell id="Ya_982ONw7_15APAzA8q-177" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="Ya_982ONw7_15APAzA8q-176" vertex="1">
|
||||||
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
||||||
@@ -133,26 +162,76 @@
|
|||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="Ya_982ONw7_15APAzA8q-220" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" target="BsNFRahTXGiPdYppKmQY-26" edge="1">
|
<mxCell id="Ya_982ONw7_15APAzA8q-180" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="Ya_982ONw7_15APAzA8q-176" vertex="1">
|
||||||
|
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-181" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-180" vertex="1">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-182" value="jobdetailid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-180" vertex="1">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-205" value="offers" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="900" y="720" width="180" height="120" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-206" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="Ya_982ONw7_15APAzA8q-205" vertex="1">
|
||||||
|
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-207" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-206" vertex="1">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-208" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-206" vertex="1">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-209" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="Ya_982ONw7_15APAzA8q-205" vertex="1">
|
||||||
|
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-210" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-209" vertex="1">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-211" value="offerid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-209" vertex="1">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-212" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="Ya_982ONw7_15APAzA8q-205" vertex="1">
|
||||||
|
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-213" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-212" vertex="1">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-214" value="contractid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-212" vertex="1">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-220" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" target="Ya_982ONw7_15APAzA8q-209" edge="1">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="1150.9999999999995" y="669.9999999999998" as="sourcePoint" />
|
<mxPoint x="1150.9999999999995" y="669.9999999999998" as="sourcePoint" />
|
||||||
<mxPoint x="1080" y="725" as="targetPoint" />
|
<mxPoint x="1004.9100000000002" y="790" as="targetPoint" />
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="1150" y="725" />
|
<mxPoint x="1150" y="725" />
|
||||||
<mxPoint x="1110" y="725" />
|
<mxPoint x="1110" y="725" />
|
||||||
<mxPoint x="1110" y="781" />
|
<mxPoint x="1110" y="795" />
|
||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="Ya_982ONw7_15APAzA8q-221" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="Ya_982ONw7_15APAzA8q-177" target="BsNFRahTXGiPdYppKmQY-23" edge="1">
|
<mxCell id="Ya_982ONw7_15APAzA8q-221" value="" style="endArrow=none;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="Ya_982ONw7_15APAzA8q-176" target="Ya_982ONw7_15APAzA8q-212" edge="1">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="1000" y="860" as="sourcePoint" />
|
<mxPoint x="1000" y="860" as="sourcePoint" />
|
||||||
<mxPoint x="990" y="820" as="targetPoint" />
|
<mxPoint x="1080" y="840" as="targetPoint" />
|
||||||
<Array as="points">
|
|
||||||
<mxPoint x="870" y="925" />
|
|
||||||
<mxPoint x="870" y="840" />
|
|
||||||
<mxPoint x="870" y="751" />
|
|
||||||
</Array>
|
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="Ya_982ONw7_15APAzA8q-256" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="1" vertex="1">
|
<mxCell id="Ya_982ONw7_15APAzA8q-256" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="1" vertex="1">
|
||||||
@@ -274,10 +353,18 @@
|
|||||||
<mxPoint x="15" y="41" as="offset" />
|
<mxPoint x="15" y="41" as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-276" value="1" style="resizable=0;html=1;whiteSpace=wrap;align=right;verticalAlign=bottom;" parent="1" connectable="0" vertex="1">
|
||||||
|
<mxGeometry x="1331" y="815" as="geometry">
|
||||||
|
<mxPoint x="12" y="-46" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-277" value="1" style="resizable=0;html=1;whiteSpace=wrap;align=right;verticalAlign=bottom;" parent="1" connectable="0" vertex="1">
|
||||||
|
<mxGeometry x="1410" y="765" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
<mxCell id="Ya_982ONw7_15APAzA8q-278" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="Ya_982ONw7_15APAzA8q-245" edge="1">
|
<mxCell id="Ya_982ONw7_15APAzA8q-278" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="Ya_982ONw7_15APAzA8q-245" edge="1">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="1150" y="960" as="sourcePoint" />
|
<mxPoint x="1150" y="960" as="sourcePoint" />
|
||||||
<mxPoint x="1240" y="730" as="targetPoint" />
|
<mxPoint x="1240" y="760" as="targetPoint" />
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="1130" y="955" />
|
<mxPoint x="1130" y="955" />
|
||||||
<mxPoint x="1130" y="810" />
|
<mxPoint x="1130" y="810" />
|
||||||
@@ -285,6 +372,9 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
|
<mxCell id="Ya_982ONw7_15APAzA8q-279" value="1" style="resizable=0;html=1;whiteSpace=wrap;align=right;verticalAlign=bottom;" parent="1" connectable="0" vertex="1">
|
||||||
|
<mxGeometry x="1240" y="780" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
<mxCell id="Ya_982ONw7_15APAzA8q-280" value="N" style="resizable=0;html=1;whiteSpace=wrap;align=right;verticalAlign=bottom;" parent="1" connectable="0" vertex="1">
|
<mxCell id="Ya_982ONw7_15APAzA8q-280" value="N" style="resizable=0;html=1;whiteSpace=wrap;align=right;verticalAlign=bottom;" parent="1" connectable="0" vertex="1">
|
||||||
<mxGeometry x="1130" y="940" as="geometry">
|
<mxGeometry x="1130" y="940" as="geometry">
|
||||||
<mxPoint x="15" y="41" as="offset" />
|
<mxPoint x="15" y="41" as="offset" />
|
||||||
@@ -492,7 +582,7 @@
|
|||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="RGG-I-Th0KsJHSMTwLBq-57" value="service" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" parent="1" vertex="1">
|
<mxCell id="RGG-I-Th0KsJHSMTwLBq-57" value="service" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" parent="1" vertex="1">
|
||||||
<mxGeometry x="1400" y="50" width="180" height="120" as="geometry" />
|
<mxGeometry x="1400" y="50" width="180" height="150" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="RGG-I-Th0KsJHSMTwLBq-58" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="RGG-I-Th0KsJHSMTwLBq-57" vertex="1">
|
<mxCell id="RGG-I-Th0KsJHSMTwLBq-58" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="RGG-I-Th0KsJHSMTwLBq-57" vertex="1">
|
||||||
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
||||||
@@ -507,10 +597,23 @@
|
|||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="RGG-I-Th0KsJHSMTwLBq-64" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="RGG-I-Th0KsJHSMTwLBq-57" vertex="1">
|
<mxCell id="RGG-I-Th0KsJHSMTwLBq-61" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="RGG-I-Th0KsJHSMTwLBq-57" vertex="1">
|
||||||
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="RGG-I-Th0KsJHSMTwLBq-65" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="RGG-I-Th0KsJHSMTwLBq-64" vertex="1">
|
<mxCell id="RGG-I-Th0KsJHSMTwLBq-62" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="RGG-I-Th0KsJHSMTwLBq-61" vertex="1">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="RGG-I-Th0KsJHSMTwLBq-63" value="servicetypeid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="RGG-I-Th0KsJHSMTwLBq-61" vertex="1">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="RGG-I-Th0KsJHSMTwLBq-64" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="RGG-I-Th0KsJHSMTwLBq-57" vertex="1">
|
||||||
|
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="RGG-I-Th0KsJHSMTwLBq-65" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="RGG-I-Th0KsJHSMTwLBq-64" vertex="1">
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
@@ -521,9 +624,9 @@
|
|||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="RGG-I-Th0KsJHSMTwLBq-67" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="RGG-I-Th0KsJHSMTwLBq-57" vertex="1">
|
<mxCell id="RGG-I-Th0KsJHSMTwLBq-67" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="RGG-I-Th0KsJHSMTwLBq-57" vertex="1">
|
||||||
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
<mxGeometry y="120" width="180" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="RGG-I-Th0KsJHSMTwLBq-68" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="RGG-I-Th0KsJHSMTwLBq-67" vertex="1">
|
<mxCell id="RGG-I-Th0KsJHSMTwLBq-68" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="RGG-I-Th0KsJHSMTwLBq-67" vertex="1">
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
@@ -533,19 +636,19 @@
|
|||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="RGG-I-Th0KsJHSMTwLBq-70" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="BsNFRahTXGiPdYppKmQY-7" target="Ya_982ONw7_15APAzA8q-69" edge="1">
|
<mxCell id="RGG-I-Th0KsJHSMTwLBq-70" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="RGG-I-Th0KsJHSMTwLBq-61" target="Ya_982ONw7_15APAzA8q-69" edge="1">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="1580" y="125" as="sourcePoint" />
|
<mxPoint x="1340" y="150" as="sourcePoint" />
|
||||||
<mxPoint x="1390" y="100" as="targetPoint" />
|
<mxPoint x="1390" y="100" as="targetPoint" />
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="1610" y="324" />
|
<mxPoint x="1640" y="125" />
|
||||||
<mxPoint x="1610" y="433" />
|
<mxPoint x="1640" y="433" />
|
||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="RGG-I-Th0KsJHSMTwLBq-71" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" target="RGG-I-Th0KsJHSMTwLBq-67" edge="1">
|
<mxCell id="RGG-I-Th0KsJHSMTwLBq-71" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="Ya_982ONw7_15APAzA8q-82" target="RGG-I-Th0KsJHSMTwLBq-64" edge="1">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="1590" y="294" as="sourcePoint" />
|
<mxPoint x="1290" y="260" as="sourcePoint" />
|
||||||
<mxPoint x="1340" y="210" as="targetPoint" />
|
<mxPoint x="1340" y="210" as="targetPoint" />
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="1610" y="294" />
|
<mxPoint x="1610" y="294" />
|
||||||
@@ -558,7 +661,7 @@
|
|||||||
<mxPoint x="1020" y="130" as="sourcePoint" />
|
<mxPoint x="1020" y="130" as="sourcePoint" />
|
||||||
<mxPoint x="1308" y="84" as="targetPoint" />
|
<mxPoint x="1308" y="84" as="targetPoint" />
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="1360" y="155" />
|
<mxPoint x="1360" y="185" />
|
||||||
<mxPoint x="1360" y="65" />
|
<mxPoint x="1360" y="65" />
|
||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
@@ -632,13 +735,13 @@
|
|||||||
<mxCell id="5CqAkLydmV_yxfNIBBfD-14" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="1" vertex="1">
|
<mxCell id="5CqAkLydmV_yxfNIBBfD-14" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="1" vertex="1">
|
||||||
<mxGeometry x="1160" y="690" width="180" height="30" as="geometry" />
|
<mxGeometry x="1160" y="690" width="180" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="5CqAkLydmV_yxfNIBBfD-17" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="5CqAkLydmV_yxfNIBBfD-2" edge="1" target="HT5lYA2dYPyrPS9nyiQT-178">
|
<mxCell id="5CqAkLydmV_yxfNIBBfD-17" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="5CqAkLydmV_yxfNIBBfD-2" edge="1">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="1190" y="820" as="sourcePoint" />
|
<mxPoint x="1190" y="820" as="sourcePoint" />
|
||||||
<mxPoint x="1330.9999999999995" y="684.9999999999998" as="targetPoint" />
|
<mxPoint x="1330.9999999999995" y="684.9999999999998" as="targetPoint" />
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="1360" y="433" />
|
<mxPoint x="1360" y="433" />
|
||||||
<mxPoint x="1360" y="625" />
|
<mxPoint x="1360" y="685" />
|
||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
@@ -963,7 +1066,7 @@
|
|||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="5CqAkLydmV_yxfNIBBfD-100" value="date" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=1;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
<mxCell id="5CqAkLydmV_yxfNIBBfD-100" value="date" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=1;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
<mxGeometry x="930" y="940" width="150" height="30" as="geometry">
|
<mxGeometry x="930" y="970" width="150" height="30" as="geometry">
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
@@ -1074,13 +1177,13 @@
|
|||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="-nb5psitBYwo0NIamKds-33" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="Ya_982ONw7_15APAzA8q-260" edge="1" target="HT5lYA2dYPyrPS9nyiQT-181">
|
<mxCell id="-nb5psitBYwo0NIamKds-33" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" edge="1" source="Ya_982ONw7_15APAzA8q-260">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="1420" y="740.0000000000001" as="sourcePoint" />
|
<mxPoint x="1420" y="740.0000000000001" as="sourcePoint" />
|
||||||
<mxPoint x="1330" y="740" as="targetPoint" />
|
<mxPoint x="1330" y="740" as="targetPoint" />
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="1360" y="835" />
|
<mxPoint x="1370" y="835" />
|
||||||
<mxPoint x="1360" y="655" />
|
<mxPoint x="1370" y="740" />
|
||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
@@ -1555,28 +1658,28 @@
|
|||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-27" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="AkoRetE9dPsFytqfa5Kx-27" vertex="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-27" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="AkoRetE9dPsFytqfa5Kx-27">
|
||||||
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-28" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="7H4gm8Qbcmcg-KG3YoOF-27" vertex="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-28" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="7H4gm8Qbcmcg-KG3YoOF-27">
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-29" value="addressid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="7H4gm8Qbcmcg-KG3YoOF-27" vertex="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-29" value="addressid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="7H4gm8Qbcmcg-KG3YoOF-27">
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-21" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="AkoRetE9dPsFytqfa5Kx-27" vertex="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-21" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="AkoRetE9dPsFytqfa5Kx-27">
|
||||||
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-22" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="7H4gm8Qbcmcg-KG3YoOF-21" vertex="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-22" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="7H4gm8Qbcmcg-KG3YoOF-21">
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-23" value="houseid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="7H4gm8Qbcmcg-KG3YoOF-21" vertex="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-23" value="houseid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="7H4gm8Qbcmcg-KG3YoOF-21">
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
@@ -1594,7 +1697,7 @@
|
|||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="AkoRetE9dPsFytqfa5Kx-45" value="" style="endArrow=none;html=1;rounded=0;exitX=-0.002;exitY=0.678;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="HT5lYA2dYPyrPS9nyiQT-315" edge="1">
|
<mxCell id="AkoRetE9dPsFytqfa5Kx-45" value="" style="endArrow=none;html=1;rounded=0;exitX=-0.002;exitY=0.678;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" edge="1" source="HT5lYA2dYPyrPS9nyiQT-315">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="600" y="710" as="sourcePoint" />
|
<mxPoint x="600" y="710" as="sourcePoint" />
|
||||||
<mxPoint x="480" y="510" as="targetPoint" />
|
<mxPoint x="480" y="510" as="targetPoint" />
|
||||||
@@ -2112,7 +2215,7 @@
|
|||||||
<mxGeometry x="1151" y="550" width="180" height="210" as="geometry" />
|
<mxGeometry x="1151" y="550" width="180" height="210" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="HT5lYA2dYPyrPS9nyiQT-171" value="contract" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-190" vertex="1">
|
<mxCell id="HT5lYA2dYPyrPS9nyiQT-171" value="contract" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-190" vertex="1">
|
||||||
<mxGeometry width="180" height="180" as="geometry" />
|
<mxGeometry width="180" height="210" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="HT5lYA2dYPyrPS9nyiQT-172" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="HT5lYA2dYPyrPS9nyiQT-171" vertex="1">
|
<mxCell id="HT5lYA2dYPyrPS9nyiQT-172" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="HT5lYA2dYPyrPS9nyiQT-171" vertex="1">
|
||||||
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
||||||
@@ -2127,9 +2230,22 @@
|
|||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="HT5lYA2dYPyrPS9nyiQT-178" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="HT5lYA2dYPyrPS9nyiQT-171" vertex="1">
|
<mxCell id="HT5lYA2dYPyrPS9nyiQT-175" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="HT5lYA2dYPyrPS9nyiQT-171" vertex="1">
|
||||||
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
|
<mxCell id="HT5lYA2dYPyrPS9nyiQT-176" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-175" vertex="1">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="HT5lYA2dYPyrPS9nyiQT-177" value="jobdetailid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-175" vertex="1">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="HT5lYA2dYPyrPS9nyiQT-178" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="HT5lYA2dYPyrPS9nyiQT-171" vertex="1">
|
||||||
|
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
<mxCell id="HT5lYA2dYPyrPS9nyiQT-179" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-178" vertex="1">
|
<mxCell id="HT5lYA2dYPyrPS9nyiQT-179" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-178" vertex="1">
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
@@ -2141,7 +2257,7 @@
|
|||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="HT5lYA2dYPyrPS9nyiQT-181" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="HT5lYA2dYPyrPS9nyiQT-171" vertex="1">
|
<mxCell id="HT5lYA2dYPyrPS9nyiQT-181" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="HT5lYA2dYPyrPS9nyiQT-171" vertex="1">
|
||||||
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
<mxGeometry y="120" width="180" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="HT5lYA2dYPyrPS9nyiQT-182" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-181" vertex="1">
|
<mxCell id="HT5lYA2dYPyrPS9nyiQT-182" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-181" vertex="1">
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
@@ -2161,6 +2277,11 @@
|
|||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
|
<mxCell id="HT5lYA2dYPyrPS9nyiQT-186" value="startdate" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=1;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-184" vertex="1">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
<mxCell id="HT5lYA2dYPyrPS9nyiQT-187" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="HT5lYA2dYPyrPS9nyiQT-190" vertex="1">
|
<mxCell id="HT5lYA2dYPyrPS9nyiQT-187" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="HT5lYA2dYPyrPS9nyiQT-190" vertex="1">
|
||||||
<mxGeometry y="180" width="180" height="30" as="geometry" />
|
<mxGeometry y="180" width="180" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
@@ -2169,19 +2290,11 @@
|
|||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="HT5lYA2dYPyrPS9nyiQT-186" value="startdate" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=1;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-190" vertex="1">
|
<mxCell id="HT5lYA2dYPyrPS9nyiQT-189" value="enddate" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=1;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-187" vertex="1">
|
||||||
<mxGeometry x="30" y="120" width="150" height="30" as="geometry">
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="HT5lYA2dYPyrPS9nyiQT-189" value="enddate" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=1;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-190" vertex="1">
|
|
||||||
<mxGeometry x="30" y="150" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="Ya_982ONw7_15APAzA8q-279" value="1" style="resizable=0;html=1;whiteSpace=wrap;align=right;verticalAlign=bottom;" parent="HT5lYA2dYPyrPS9nyiQT-190" connectable="0" vertex="1">
|
|
||||||
<mxGeometry x="90" y="200" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="HT5lYA2dYPyrPS9nyiQT-197" value="" style="group" parent="1" vertex="1" connectable="0">
|
<mxCell id="HT5lYA2dYPyrPS9nyiQT-197" value="" style="group" parent="1" vertex="1" connectable="0">
|
||||||
<mxGeometry x="870" y="20" width="180" height="211" as="geometry" />
|
<mxGeometry x="870" y="20" width="180" height="211" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
@@ -3162,7 +3275,7 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-1" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="HT5lYA2dYPyrPS9nyiQT-199" target="HT5lYA2dYPyrPS9nyiQT-348" edge="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-1" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="HT5lYA2dYPyrPS9nyiQT-199" target="HT5lYA2dYPyrPS9nyiQT-348">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="-266" y="560" as="sourcePoint" />
|
<mxPoint x="-266" y="560" as="sourcePoint" />
|
||||||
<mxPoint x="414" y="1158" as="targetPoint" />
|
<mxPoint x="414" y="1158" as="targetPoint" />
|
||||||
@@ -3172,7 +3285,7 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-2" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=1;entryDx=0;entryDy=0;" parent="1" source="HT5lYA2dYPyrPS9nyiQT-366" target="HT5lYA2dYPyrPS9nyiQT-417" edge="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-2" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="HT5lYA2dYPyrPS9nyiQT-366" target="HT5lYA2dYPyrPS9nyiQT-417">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="200" y="1110" as="sourcePoint" />
|
<mxPoint x="200" y="1110" as="sourcePoint" />
|
||||||
<mxPoint x="500" y="880" as="targetPoint" />
|
<mxPoint x="500" y="880" as="targetPoint" />
|
||||||
@@ -3296,7 +3409,7 @@
|
|||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-3" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.994;entryY=0.967;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="HT5lYA2dYPyrPS9nyiQT-388" target="HT5lYA2dYPyrPS9nyiQT-418" edge="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-3" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.994;entryY=0.967;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="HT5lYA2dYPyrPS9nyiQT-388" target="HT5lYA2dYPyrPS9nyiQT-418">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="1360" y="290" as="sourcePoint" />
|
<mxPoint x="1360" y="290" as="sourcePoint" />
|
||||||
<mxPoint x="1360" y="180" as="targetPoint" />
|
<mxPoint x="1360" y="180" as="targetPoint" />
|
||||||
@@ -3308,7 +3421,7 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-4" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="HT5lYA2dYPyrPS9nyiQT-2" target="HT5lYA2dYPyrPS9nyiQT-36" edge="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-4" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="HT5lYA2dYPyrPS9nyiQT-2" target="HT5lYA2dYPyrPS9nyiQT-36">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="-300" y="1470" as="sourcePoint" />
|
<mxPoint x="-300" y="1470" as="sourcePoint" />
|
||||||
<mxPoint x="-250" y="1420" as="targetPoint" />
|
<mxPoint x="-250" y="1420" as="targetPoint" />
|
||||||
@@ -3318,13 +3431,13 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-5" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="HT5lYA2dYPyrPS9nyiQT-30" edge="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-5" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HT5lYA2dYPyrPS9nyiQT-30">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="-300" y="1110" as="sourcePoint" />
|
<mxPoint x="-300" y="1110" as="sourcePoint" />
|
||||||
<mxPoint x="-560" y="1215" as="targetPoint" />
|
<mxPoint x="-560" y="1215" as="targetPoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-6" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="HT5lYA2dYPyrPS9nyiQT-253" edge="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-6" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HT5lYA2dYPyrPS9nyiQT-253">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="-300" y="1110" as="sourcePoint" />
|
<mxPoint x="-300" y="1110" as="sourcePoint" />
|
||||||
<mxPoint x="-380" y="1230" as="targetPoint" />
|
<mxPoint x="-380" y="1230" as="targetPoint" />
|
||||||
@@ -3334,13 +3447,13 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-7" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="HT5lYA2dYPyrPS9nyiQT-276" edge="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-7" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HT5lYA2dYPyrPS9nyiQT-276">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="-590" y="1130" as="sourcePoint" />
|
<mxPoint x="-590" y="1130" as="sourcePoint" />
|
||||||
<mxPoint x="-560" y="1060" as="targetPoint" />
|
<mxPoint x="-560" y="1060" as="targetPoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-8" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=-0.006;entryY=0.924;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="Ya_982ONw7_15APAzA8q-301" target="HT5lYA2dYPyrPS9nyiQT-253" edge="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-8" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=-0.006;entryY=0.924;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="Ya_982ONw7_15APAzA8q-301" target="HT5lYA2dYPyrPS9nyiQT-253">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="-590" y="1130" as="sourcePoint" />
|
<mxPoint x="-590" y="1130" as="sourcePoint" />
|
||||||
<mxPoint x="-540" y="1080" as="targetPoint" />
|
<mxPoint x="-540" y="1080" as="targetPoint" />
|
||||||
@@ -3350,7 +3463,7 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-9" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" target="HT5lYA2dYPyrPS9nyiQT-289" edge="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-9" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" target="HT5lYA2dYPyrPS9nyiQT-289">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="-380" y="299" as="sourcePoint" />
|
<mxPoint x="-380" y="299" as="sourcePoint" />
|
||||||
<mxPoint x="330" y="420" as="targetPoint" />
|
<mxPoint x="330" y="420" as="targetPoint" />
|
||||||
@@ -3360,13 +3473,13 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-30" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" target="HT5lYA2dYPyrPS9nyiQT-312" edge="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-30" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" target="HT5lYA2dYPyrPS9nyiQT-312">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="790" y="685" as="sourcePoint" />
|
<mxPoint x="790" y="685" as="sourcePoint" />
|
||||||
<mxPoint x="760" y="540" as="targetPoint" />
|
<mxPoint x="760" y="540" as="targetPoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-31" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="AkoRetE9dPsFytqfa5Kx-31" edge="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-31" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="AkoRetE9dPsFytqfa5Kx-31">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="790" y="850" as="sourcePoint" />
|
<mxPoint x="790" y="850" as="sourcePoint" />
|
||||||
<mxPoint x="250" y="870" as="targetPoint" />
|
<mxPoint x="250" y="870" as="targetPoint" />
|
||||||
@@ -3376,7 +3489,7 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-32" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" target="7H4gm8Qbcmcg-KG3YoOF-21" edge="1">
|
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-32" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" target="7H4gm8Qbcmcg-KG3YoOF-21">
|
||||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
<mxPoint x="480" y="720" as="sourcePoint" />
|
<mxPoint x="480" y="720" as="sourcePoint" />
|
||||||
<mxPoint x="530" y="470" as="targetPoint" />
|
<mxPoint x="530" y="470" as="targetPoint" />
|
||||||
@@ -3387,103 +3500,6 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-3" value="servicedesc" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="1410" y="249" width="180" height="120" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-4" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-3">
|
|
||||||
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-5" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-4">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-6" value="servicedescid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-4">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-7" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-3">
|
|
||||||
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-8" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-7">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-9" value="servicetypeid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-7">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-10" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-3">
|
|
||||||
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-11" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-10">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-12" value="description" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-10">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-16" value="offers" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="900" y="645" width="180" height="151" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-17" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-16">
|
|
||||||
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-18" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-17">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-19" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-17">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-20" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-16">
|
|
||||||
<mxGeometry y="60" width="180" height="31" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-21" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-20">
|
|
||||||
<mxGeometry width="30" height="31" as="geometry">
|
|
||||||
<mxRectangle width="30" height="31" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-22" value="jobdetailid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-20">
|
|
||||||
<mxGeometry x="30" width="150" height="31" as="geometry">
|
|
||||||
<mxRectangle width="150" height="31" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-23" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-16">
|
|
||||||
<mxGeometry y="91" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-24" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-23">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-25" value="offerid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-23">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-26" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-16">
|
|
||||||
<mxGeometry y="121" width="180" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-27" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-26">
|
|
||||||
<mxGeometry width="30" height="30" as="geometry">
|
|
||||||
<mxRectangle width="30" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="BsNFRahTXGiPdYppKmQY-28" value="contractid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-26">
|
|
||||||
<mxGeometry x="30" width="150" height="30" as="geometry">
|
|
||||||
<mxRectangle width="150" height="30" as="alternateBounds" />
|
|
||||||
</mxGeometry>
|
|
||||||
</mxCell>
|
|
||||||
</root>
|
</root>
|
||||||
</mxGraphModel>
|
</mxGraphModel>
|
||||||
</diagram>
|
</diagram>
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
/*M!999999\- enable the sandbox mode */
|
|
||||||
-- MariaDB dump 10.19 Distrib 10.11.11-MariaDB, for Linux (x86_64)
|
|
||||||
--
|
|
||||||
-- Host: bearybot.selfhost.co Database: pyqcrm
|
|
||||||
-- ------------------------------------------------------
|
|
||||||
-- Server version 10.11.11-MariaDB-0ubuntu0.24.04.2-log
|
|
||||||
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
|
||||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
|
||||||
/*!40101 SET NAMES utf8mb4 */;
|
|
||||||
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
|
||||||
/*!40103 SET TIME_ZONE='+00:00' */;
|
|
||||||
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
|
||||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
|
||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Table structure for table `address`
|
|
||||||
--
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `address`;
|
|
||||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
|
||||||
/*!40101 SET character_set_client = utf8mb4 */;
|
|
||||||
CREATE TABLE `address` (
|
|
||||||
`addressid` int(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`countryid` int(11) NOT NULL,
|
|
||||||
`cityid` int(11) NOT NULL,
|
|
||||||
`postcodeid` int(11) NOT NULL,
|
|
||||||
PRIMARY KEY (`addressid`),
|
|
||||||
KEY `address_country_FK` (`countryid`)
|
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=6956 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
|
||||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Temporary table structure for view `addressesview`
|
|
||||||
--
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `addressesview`;
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/*M!999999\- enable the sandbox mode */
|
|
||||||
-- MariaDB dump 10.19 Distrib 10.11.11-MariaDB, for Linux (x86_64)
|
|
||||||
--
|
|
||||||
-- Host: bearybot.selfhost.co Database: pyqcrm
|
|
||||||
-- ------------------------------------------------------
|
|
||||||
-- Server version 10.11.11-MariaDB-0ubuntu0.24.04.2-log
|
|
||||||
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
|
||||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
|
||||||
/*!40101 SET NAMES utf8mb4 */;
|
|
||||||
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
|
||||||
/*!40103 SET TIME_ZONE='+00:00' */;
|
|
||||||
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
|
||||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
|
||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Table structure for table `address`
|
|
||||||
--
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `address`;
|
|
||||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
|
||||||
/*!40101 SET character_set_client = utf8mb4 */;
|
|
||||||
CREATE TABLE `address` (
|
|
||||||
`addressid` int(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`countryid` int(11) NOT NULL,
|
|
||||||
`cityid` int(11) NOT NULL,
|
|
||||||
`postcodeid` int(11) NOT NULL,
|
|
||||||
PRIMARY KEY (`addressid`),
|
|
||||||
KEY `address_country_FK` (`countryid`)
|
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=6956 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
|
||||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Temporary table structure for view `addressesview`
|
|
||||||
--
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `addressesview`;
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/*M!999999\- enable the sandbox mode */
|
|
||||||
-- MariaDB dump 10.19 Distrib 10.11.11-MariaDB, for Linux (x86_64)
|
|
||||||
--
|
|
||||||
-- Host: bearybot.selfhost.co Database: pyqcrm
|
|
||||||
-- ------------------------------------------------------
|
|
||||||
-- Server version 10.11.11-MariaDB-0ubuntu0.24.04.2-log
|
|
||||||
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
|
||||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
|
||||||
/*!40101 SET NAMES utf8mb4 */;
|
|
||||||
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
|
||||||
/*!40103 SET TIME_ZONE='+00:00' */;
|
|
||||||
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
|
||||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
|
||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Table structure for table `address`
|
|
||||||
--
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `address`;
|
|
||||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
|
||||||
/*!40101 SET character_set_client = utf8mb4 */;
|
|
||||||
CREATE TABLE `address` (
|
|
||||||
`addressid` int(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`countryid` int(11) NOT NULL,
|
|
||||||
`cityid` int(11) NOT NULL,
|
|
||||||
`postcodeid` int(11) NOT NULL,
|
|
||||||
PRIMARY KEY (`addressid`),
|
|
||||||
KEY `address_country_FK` (`countryid`)
|
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=6956 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
|
||||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Temporary table structure for view `addressesview`
|
|
||||||
--
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `addressesview`;
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/*M!999999\- enable the sandbox mode */
|
|
||||||
-- MariaDB dump 10.19 Distrib 10.11.11-MariaDB, for Linux (x86_64)
|
|
||||||
--
|
|
||||||
-- Host: bearybot.selfhost.co Database: pyqcrm
|
|
||||||
-- ------------------------------------------------------
|
|
||||||
-- Server version 10.11.11-MariaDB-0ubuntu0.24.04.2-log
|
|
||||||
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
|
||||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
|
||||||
/*!40101 SET NAMES utf8mb4 */;
|
|
||||||
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
|
||||||
/*!40103 SET TIME_ZONE='+00:00' */;
|
|
||||||
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
|
||||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
|
||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Table structure for table `address`
|
|
||||||
--
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `address`;
|
|
||||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
|
||||||
/*!40101 SET character_set_client = utf8mb4 */;
|
|
||||||
CREATE TABLE `address` (
|
|
||||||
`addressid` int(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`countryid` int(11) NOT NULL,
|
|
||||||
`cityid` int(11) NOT NULL,
|
|
||||||
`postcodeid` int(11) NOT NULL,
|
|
||||||
PRIMARY KEY (`addressid`),
|
|
||||||
KEY `address_country_FK` (`countryid`)
|
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=6956 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
|
||||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Temporary table structure for view `addressesview`
|
|
||||||
--
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `addressesview`;
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
14
docker-compose.yml
Normal file
14
docker-compose.yml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
services:
|
||||||
|
mariadb:
|
||||||
|
image: mariadb:latest
|
||||||
|
volumes:
|
||||||
|
- mariadb:/var/lib/mysql
|
||||||
|
ports:
|
||||||
|
- 127.0.0.1:8000:3306
|
||||||
|
environment:
|
||||||
|
MARIADB_ROOT_PASSWORD: pyqcrm
|
||||||
|
MARIADB_USER: pyqcrm
|
||||||
|
MARIADB_PASSWORD: pyqcrm
|
||||||
|
MARIADB_DATABASE: pyqcrm
|
||||||
|
volumes:
|
||||||
|
mariadb:
|
||||||
4
images/InboxArrowDown.svg
Normal file
4
images/InboxArrowDown.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<svg fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" data-slot="icon">
|
||||||
|
<path clip-rule="evenodd" fill-rule="evenodd" d="M5.478 5.559A1.5 1.5 0 0 1 6.912 4.5H9A.75.75 0 0 0 9 3H6.912a3 3 0 0 0-2.868 2.118l-2.411 7.838a3 3 0 0 0-.133.882V18a3 3 0 0 0 3 3h15a3 3 0 0 0 3-3v-4.162c0-.299-.045-.596-.133-.882l-2.412-7.838A3 3 0 0 0 17.088 3H15a.75.75 0 0 0 0 1.5h2.088a1.5 1.5 0 0 1 1.434 1.059l2.213 7.191H17.89a3 3 0 0 0-2.684 1.658l-.256.513a1.5 1.5 0 0 1-1.342.829h-3.218a1.5 1.5 0 0 1-1.342-.83l-.256-.512a3 3 0 0 0-2.684-1.658H3.265l2.213-7.191Z"></path>
|
||||||
|
<path clip-rule="evenodd" fill-rule="evenodd" d="M12 2.25a.75.75 0 0 1 .75.75v6.44l1.72-1.72a.75.75 0 1 1 1.06 1.06l-3 3a.75.75 0 0 1-1.06 0l-3-3a.75.75 0 0 1 1.06-1.06l1.72 1.72V3a.75.75 0 0 1 .75-.75Z"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 824 B |
19
lib/Config.py
Normal file
19
lib/Config.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
from typing import TypedDict
|
||||||
|
|
||||||
|
|
||||||
|
class EncryptionConfig(TypedDict):
|
||||||
|
ENCRYPTION_KEY_VALID: str
|
||||||
|
ENCRYPTION_KEY: str
|
||||||
|
|
||||||
|
|
||||||
|
class DatabaseConfig(TypedDict):
|
||||||
|
DB_HOST: str
|
||||||
|
DB_USER: str
|
||||||
|
DB_PASS: str
|
||||||
|
DB_NAME: str
|
||||||
|
DB_PORT: str
|
||||||
|
|
||||||
|
|
||||||
|
class Config(TypedDict):
|
||||||
|
database: DatabaseConfig
|
||||||
|
pyqcrm: EncryptionConfig
|
||||||
@@ -1,83 +1,28 @@
|
|||||||
"""! @brief Defines the configuration class."""
|
# This Python file uses the following encoding: utf-8
|
||||||
##
|
|
||||||
# @file ConfigLoader.py
|
|
||||||
#
|
|
||||||
# @brief Defines the ConfigLoader class.
|
|
||||||
#
|
|
||||||
# @section description_configloader Description
|
|
||||||
# Defines the base class for the program configuration.
|
|
||||||
# - ConfigLoader (base class)
|
|
||||||
#
|
|
||||||
# @section libraries_configloader Libraries/Modules
|
|
||||||
# - <a href="https://docs.python.org/3/library/os.html">os</a> standard library
|
|
||||||
# - Access to system specific information.
|
|
||||||
# - <a href="https://docs.python.org/3/library/urllib.html">urllib</a> Python package
|
|
||||||
# - Collects several modules for working with URLs.
|
|
||||||
# - <a href="https://pypi.org/project/toml">toml</a> Python library
|
|
||||||
# - A Python library for parsing and creating TOML.
|
|
||||||
# - <a href="https://pypi.org/project/platformdirs/">platformdirs</a> Python package
|
|
||||||
# - Determining appropriate platform-specific dirs.
|
|
||||||
# - <a href="https://docs.python.org/3/library/pathlib.html">pathlib</a> Python module
|
|
||||||
# - Offers classes representing filesystem paths with semantics appropriate for different operating systems.
|
|
||||||
# - <a href="https://docs.python.org/3/library/shutil.html">shutil</a> Python module
|
|
||||||
# - Offers a number of high-level operations on files and collections of files.
|
|
||||||
# - <a href="https://docs.python.org/3/library/base64.html">base64</a> Python standard library
|
|
||||||
# - Provides functions for encoding binary data to printable ASCII characters and decoding such encodings back to binary data.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QObject.html">QObject</a> PySide6 class
|
|
||||||
# - The base class of all Qt objects.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/Slot.html">Slot</a> PySide6 function
|
|
||||||
# - A function that is called in response to a particular signal.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/Signal.html">Signal</a> PySide6 class
|
|
||||||
# - Provides a way to declare and connect Qt signals in a pythonic way.
|
|
||||||
# - <a href="https://pycryptodome.readthedocs.io/en/latest/src/api.html">Crypto</a> Python package
|
|
||||||
# - Provides cryptographic functionalities.
|
|
||||||
# - DbManager local class
|
|
||||||
# - Provides a singleton database connection for the entire program.
|
|
||||||
# - UserManager local class
|
|
||||||
# - Provides a model to handle users.
|
|
||||||
# - PyqcrmFlags local ENUM
|
|
||||||
# - Provides ENUMS to facilitate working in the program.
|
|
||||||
# - Vermasseln local class
|
|
||||||
# - Provides encryption functionality for the program.
|
|
||||||
#
|
|
||||||
# @section notes_configloader Notes
|
|
||||||
# - Needs a database connection.
|
|
||||||
#
|
|
||||||
# @section todo_configloader TODO
|
|
||||||
# - None.
|
|
||||||
#
|
|
||||||
# @section author_configloader Author(s)
|
|
||||||
# - Created by Linuxero on 03/14/2025.
|
|
||||||
# - Modified by Linuxero on 03/14/2025.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2025 Schnaxero. All rights reserved.
|
|
||||||
import toml
|
|
||||||
from platformdirs import user_config_dir
|
|
||||||
from pathlib import Path
|
|
||||||
from PySide6.QtCore import QObject, Slot, Signal
|
|
||||||
from .Vermasseln import Vermasseln
|
|
||||||
import shutil
|
|
||||||
from urllib.parse import urlparse
|
|
||||||
from .DB.DbManager import DbManager
|
|
||||||
import os
|
import os
|
||||||
from Crypto.Random import get_random_bytes
|
|
||||||
from base64 import b64encode
|
from base64 import b64encode
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Optional
|
||||||
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
|
import toml
|
||||||
|
from Crypto.Random import get_random_bytes
|
||||||
|
from PySide6.QtCore import QObject, Slot, Signal
|
||||||
|
from peewee import OperationalError
|
||||||
|
from platformdirs import user_config_dir
|
||||||
|
|
||||||
|
from .Config import Config, DatabaseConfig
|
||||||
from .DB.UserManager import UserManager
|
from .DB.UserManager import UserManager
|
||||||
from .PyqcrmFlags import PyqcrmFlags
|
from .PyqcrmFlags import PyqcrmFlags
|
||||||
|
from .Vermasseln import Vermasseln
|
||||||
|
from .domain.BaseModel import init_database_from_config
|
||||||
|
|
||||||
|
|
||||||
class ConfigLoader(QObject):
|
class ConfigLoader(QObject):
|
||||||
"""! The ConfigLoader class.
|
__config: Optional[Config] = None
|
||||||
Defines the class utilized by all different parts of the program.
|
|
||||||
Handles the local configuration of the whole program.
|
|
||||||
"""
|
|
||||||
__config = None
|
|
||||||
__version = "0.1-alpha"
|
__version = "0.1-alpha"
|
||||||
__check_enc_key = True
|
__check_enc_key = True
|
||||||
|
|
||||||
|
|
||||||
dbConnectionError = Signal(str, bool)
|
dbConnectionError = Signal(str, bool)
|
||||||
adminUserError = Signal(str, bool)
|
adminUserError = Signal(str, bool)
|
||||||
adminNotAsvailable = Signal()
|
adminNotAsvailable = Signal()
|
||||||
@@ -86,10 +31,7 @@ class ConfigLoader(QObject):
|
|||||||
invalidEncryptionKey = Signal()
|
invalidEncryptionKey = Signal()
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""! The ConfigLoader class initializer.
|
|
||||||
"""
|
|
||||||
super().__init__()
|
super().__init__()
|
||||||
# print(f"In {__file__} file, __init__()")
|
|
||||||
self.config_dir = user_config_dir() + '/pyqcrm'
|
self.config_dir = user_config_dir() + '/pyqcrm'
|
||||||
config_dir = Path(self.config_dir)
|
config_dir = Path(self.config_dir)
|
||||||
if config_dir.exists():
|
if config_dir.exists():
|
||||||
@@ -99,88 +41,63 @@ class ConfigLoader(QObject):
|
|||||||
else:
|
else:
|
||||||
config_dir.mkdir(0o750, True, True)
|
config_dir.mkdir(0o750, True, True)
|
||||||
|
|
||||||
|
@Slot(dict, result=bool)
|
||||||
@Slot(dict, result = bool)
|
def setConfig(self, app_config: Config):
|
||||||
def setConfig(self, app_config):
|
|
||||||
"""! Prepares the configuration of the program.
|
|
||||||
@param app_config The configuration as a dictionary.
|
|
||||||
@return True on success, False on failure.
|
|
||||||
"""
|
|
||||||
# print(f"In {__file__} file, setConfig()")
|
|
||||||
if not self.__config:
|
if not self.__config:
|
||||||
base_conf = self.__initializeConfig()
|
base_conf = self.__initializeConfig()
|
||||||
conf = self.__checkDbConnection(app_config)
|
conf = self._is_db_connectable(app_config['database'])
|
||||||
app_config = toml.dumps(app_config)
|
app_config = toml.dumps(app_config)
|
||||||
if conf:
|
if conf:
|
||||||
app_config = base_conf + app_config
|
app_config = base_conf + app_config
|
||||||
self.__config = toml.loads(app_config)
|
self.__config = toml.loads(app_config)
|
||||||
self.__saveConfig()
|
self.__saveConfig()
|
||||||
conf = self.__checkAdminUser()
|
conf = self.__checkAdminUser()
|
||||||
if conf:
|
if conf:
|
||||||
self.configurationReady.emit()
|
self.configurationReady.emit()
|
||||||
|
|
||||||
def __initializeConfig(self):
|
def __initializeConfig(self):
|
||||||
"""! Creates the initial configuration of the program.
|
|
||||||
"""
|
|
||||||
# print(f"In {__file__} file, __initializeConfig()")
|
|
||||||
self.__encrypt_key = b64encode(get_random_bytes(32)).decode("utf-8")
|
self.__encrypt_key = b64encode(get_random_bytes(32)).decode("utf-8")
|
||||||
conf = f"[pyqcrm]\nVERSION = \"{self.__version}\"\n"
|
conf = f"[pyqcrm]\nVERSION = \"{self.__version}\"\n"
|
||||||
conf = conf + f"ENCRYPTION_KEY_VALID = \"No\"\n"
|
conf = conf + f"ENCRYPTION_KEY_VALID = \"No\"\n"
|
||||||
conf = conf + f"ENCRYPTION_KEY = \"{self.__encrypt_key}\"\n\n"
|
conf = conf + f"ENCRYPTION_KEY = \"{self.__encrypt_key}\"\n\n"
|
||||||
return conf
|
return conf
|
||||||
|
|
||||||
def __checkDbConnection(self, db_config):
|
def _is_db_connectable(self, config: DatabaseConfig):
|
||||||
"""! Tests for a valid database connection.
|
try:
|
||||||
@param db_config The configuration of the database connection as a dictionary.
|
init_database_from_config(config)
|
||||||
@return True on success, False on failure.
|
|
||||||
"""
|
|
||||||
# print(f"In {__file__} file, __checkDbConnection()")
|
|
||||||
con = DbManager(db_config['database']).getConnection()
|
|
||||||
if con:
|
|
||||||
self.dbConnectionError.emit("Connection OK", True)
|
self.dbConnectionError.emit("Connection OK", True)
|
||||||
return True
|
return True
|
||||||
else:
|
except OperationalError as e:
|
||||||
self.dbConnectionError.emit("Connection fehlgeschlagen", False)
|
self.dbConnectionError.emit("Connection fehlgeschlagen", False)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def __saveConfig(self):
|
def __saveConfig(self):
|
||||||
"""! Saves the configuration of the program.
|
|
||||||
"""
|
|
||||||
# print(f"In {__file__} file, saveConfig()")
|
# print(f"In {__file__} file, saveConfig()")
|
||||||
try:
|
try:
|
||||||
with open (self.config_dir + '/pyqcrm.toml', 'w') as f:
|
with open(self.config_dir + '/pyqcrm.toml', 'w') as f:
|
||||||
# print(self.__config)
|
# print(self.__config)
|
||||||
config = Vermasseln().oscarVermasseln(toml.dumps(self.__config))
|
config = Vermasseln().oscarVermasseln(toml.dumps(self.__config))
|
||||||
f.write(config)
|
f.write(config)
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
print("Konnte die Konfiguration nicht speichern.")
|
print("Konnte die Konfiguration nicht speichern.")
|
||||||
|
|
||||||
|
|
||||||
def __checkAdminUser(self):
|
def __checkAdminUser(self):
|
||||||
"""! Checks for a valid admin account of the program.
|
|
||||||
@return True on success, False on failure.
|
|
||||||
"""
|
|
||||||
# print(f"In {__file__} file, __checkAdminUser()")
|
# print(f"In {__file__} file, __checkAdminUser()")
|
||||||
result = UserManager().checkAdmin()
|
result = UserManager().checkAdmin()
|
||||||
if not result:
|
if not result:
|
||||||
#if not result[0][0] == 1:
|
# if not result[0][0] == 1:
|
||||||
self.adminUserError.emit("Kein Admin vorhanden", False)
|
self.adminUserError.emit("Kein Admin vorhanden", False)
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
self.adminUserError.emit("Admin vorhanden", True)
|
self.adminUserError.emit("Admin vorhanden", True)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@Slot(dict, result= bool)
|
@Slot(dict, result=bool)
|
||||||
def addAdminUser(self, user_config):
|
def addAdminUser(self, user_config):
|
||||||
"""! Adds an admin account.
|
|
||||||
@param user_config The credentials of the admin account as a dictionary.
|
|
||||||
@return True on success, False on failure.
|
|
||||||
"""
|
|
||||||
# print(f"In {__file__} file, addAdminUser()")
|
# print(f"In {__file__} file, addAdminUser()")
|
||||||
admin = UserManager(user_config["user"], PyqcrmFlags.ADMIN).createUser()
|
admin = UserManager(user_config["user"], PyqcrmFlags.ADMIN).createUser()
|
||||||
if not admin:
|
if not admin:
|
||||||
#self.adminNotAvailable.emit()
|
# self.adminNotAvailable.emit()
|
||||||
self.adminUserError.emit("Benutzername nich verfügbar", False)
|
self.adminUserError.emit("Benutzername nich verfügbar", False)
|
||||||
else:
|
else:
|
||||||
self.__config['pyqcrm']['ENCRYPTION_KEY_VALID'] = 'Yes'
|
self.__config['pyqcrm']['ENCRYPTION_KEY_VALID'] = 'Yes'
|
||||||
@@ -188,15 +105,8 @@ class ConfigLoader(QObject):
|
|||||||
self.backupEncryptionKey.emit()
|
self.backupEncryptionKey.emit()
|
||||||
return admin
|
return admin
|
||||||
|
|
||||||
|
|
||||||
@Slot(str, str)
|
@Slot(str, str)
|
||||||
def __saveData(self, recovery_file, recovery_password, data):
|
def __saveData(self, recovery_file, recovery_password, data):
|
||||||
"""! Generic function to save backups to a file.
|
|
||||||
This function emits a configurationReady signal.
|
|
||||||
@param recovery_file The full path of the backup file.
|
|
||||||
@param recovery_password password to secure the backup file.
|
|
||||||
@param data The content of the backup file.
|
|
||||||
"""
|
|
||||||
# print(f"In {__file__} file, __saveData()")
|
# print(f"In {__file__} file, __saveData()")
|
||||||
local = False
|
local = False
|
||||||
rp = self.__setRecoveryPassword(recovery_password)
|
rp = self.__setRecoveryPassword(recovery_password)
|
||||||
@@ -204,7 +114,7 @@ class ConfigLoader(QObject):
|
|||||||
rf = Vermasseln().oscarVermasseln(rf, local)
|
rf = Vermasseln().oscarVermasseln(rf, local)
|
||||||
rec_file = urlparse(recovery_file)
|
rec_file = urlparse(recovery_file)
|
||||||
if os.name == "nt":
|
if os.name == "nt":
|
||||||
rec_file = rec_file [1:]
|
rec_file = rec_file[1:]
|
||||||
else:
|
else:
|
||||||
rec_file = rec_file.path + ".pyqrec"
|
rec_file = rec_file.path + ".pyqrec"
|
||||||
try:
|
try:
|
||||||
@@ -216,15 +126,10 @@ class ConfigLoader(QObject):
|
|||||||
|
|
||||||
@Slot(str, str)
|
@Slot(str, str)
|
||||||
def getRecoveryKey(self, recovery_file, recovery_password):
|
def getRecoveryKey(self, recovery_file, recovery_password):
|
||||||
"""! Loads the encryption key from a backup.
|
|
||||||
This function emits a configurationReady signal.
|
|
||||||
@param recovery_file The full path of the backup file.
|
|
||||||
@param recovery_password password to secure the backup file.
|
|
||||||
"""
|
|
||||||
rec_file = urlparse(recovery_file)
|
rec_file = urlparse(recovery_file)
|
||||||
rec_file = rec_file.path
|
rec_file = rec_file.path
|
||||||
if os.name == "nt":
|
if os.name == "nt":
|
||||||
rec_file = rec_file [1:]
|
rec_file = rec_file[1:]
|
||||||
try:
|
try:
|
||||||
ek = self.__parseImport(rec_file, recovery_password)
|
ek = self.__parseImport(rec_file, recovery_password)
|
||||||
|
|
||||||
@@ -238,11 +143,6 @@ class ConfigLoader(QObject):
|
|||||||
print(str(e))
|
print(str(e))
|
||||||
|
|
||||||
def __parseImport(self, rec_file, recovery_password):
|
def __parseImport(self, rec_file, recovery_password):
|
||||||
"""! Loads the content from a backup.
|
|
||||||
@param rec_file The full path of the backup file.
|
|
||||||
@param recovery_password password used to secure the backup file.
|
|
||||||
@return The content on success, None on failure.
|
|
||||||
"""
|
|
||||||
local = False
|
local = False
|
||||||
with open(rec_file, "r") as f:
|
with open(rec_file, "r") as f:
|
||||||
|
|
||||||
@@ -259,40 +159,23 @@ class ConfigLoader(QObject):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
def __invalidateEncryptionKey(self):
|
def __invalidateEncryptionKey(self):
|
||||||
"""! Flag the encryption key as invalid.
|
|
||||||
"""
|
|
||||||
# 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'
|
||||||
self.__saveConfig()
|
self.__saveConfig()
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def checkEncryptionKey(self):
|
def checkEncryptionKey(self):
|
||||||
"""! Checks the validity of the encryption key.
|
|
||||||
This function emits an invalidEncryptionKey signal.
|
|
||||||
"""
|
|
||||||
# print(f"In {__file__} file, __checkEncryptionKey()")
|
# print(f"In {__file__} file, __checkEncryptionKey()")
|
||||||
if self.__config['pyqcrm']['ENCRYPTION_KEY_VALID'] == 'No':
|
if self.__config['pyqcrm']['ENCRYPTION_KEY_VALID'] == 'No':
|
||||||
self.invalidEncryptionKey.emit()
|
self.invalidEncryptionKey.emit()
|
||||||
|
|
||||||
def __checkRecoveryPassword(self, recovery_password, password, salt):
|
def __checkRecoveryPassword(self, recovery_password, password, salt):
|
||||||
"""! Generic function to save backups to a file.
|
|
||||||
This function emits a configurationReady signal.
|
|
||||||
@param recovery_password The password from the backup file.
|
|
||||||
@param password The password used when creating the backup file.
|
|
||||||
@param salt A salt to hash the password.
|
|
||||||
@return A password.
|
|
||||||
"""
|
|
||||||
# print(f"In {__file__} file, __checkRecoveryPassword()")
|
# print(f"In {__file__} file, __checkRecoveryPassword()")
|
||||||
rp = self.__setRecoveryPassword(recovery_password, salt)
|
rp = self.__setRecoveryPassword(recovery_password, salt)
|
||||||
return rp[1] == password
|
return rp[1] == password
|
||||||
|
|
||||||
@Slot(str, str) # todo: non local encryption
|
@Slot(str, str) # todo: non local encryption
|
||||||
def importConfig(self, confile, password):
|
def importConfig(self, confile, password):
|
||||||
"""! Generic function to import configuration from a backup.
|
|
||||||
This function emits a invalidEncryptionKey signal.
|
|
||||||
@param conffile The path of the backup file.
|
|
||||||
@param password The password used when creating the backup file.
|
|
||||||
"""
|
|
||||||
confile = urlparse(confile)
|
confile = urlparse(confile)
|
||||||
confile = confile.path
|
confile = confile.path
|
||||||
if os.name == "nt":
|
if os.name == "nt":
|
||||||
@@ -310,12 +193,8 @@ class ConfigLoader(QObject):
|
|||||||
print(str(e))
|
print(str(e))
|
||||||
|
|
||||||
def __configLoad(self):
|
def __configLoad(self):
|
||||||
"""! Loads the program configuration.
|
|
||||||
This function emits a configurationReady signal.
|
|
||||||
"""
|
|
||||||
# print(f"In {__file__} file, __configLoad()")
|
|
||||||
try:
|
try:
|
||||||
with open (self.config_dir + '/pyqcrm.toml', 'r') as f:
|
with open(self.config_dir + '/pyqcrm.toml', 'r') as f:
|
||||||
config = f.read()
|
config = f.read()
|
||||||
self.__config = toml.loads(Vermasseln().entschluesseln(config))
|
self.__config = toml.loads(Vermasseln().entschluesseln(config))
|
||||||
self.configurationReady.emit()
|
self.configurationReady.emit()
|
||||||
@@ -323,20 +202,11 @@ class ConfigLoader(QObject):
|
|||||||
print("Konnte die Konfiguration nicht laden.")
|
print("Konnte die Konfiguration nicht laden.")
|
||||||
except TypeError:
|
except TypeError:
|
||||||
print(f"Invalid Configuration: {__file__}")
|
print(f"Invalid Configuration: {__file__}")
|
||||||
except Exception as e:
|
|
||||||
print(str(e))
|
|
||||||
|
|
||||||
|
def get_config(self) -> Optional[Config]:
|
||||||
def getConfig(self):
|
|
||||||
"""! Returns the program configuration.
|
|
||||||
@return configuration as a toml file.
|
|
||||||
"""
|
|
||||||
# print(f"In {__file__} file, getConfig()")
|
|
||||||
# print(self.__config)
|
|
||||||
return self.__config
|
return self.__config
|
||||||
|
|
||||||
def __setRecoveryPassword(self, key, salt = None):
|
def __setRecoveryPassword(self, key, salt=None):
|
||||||
# print(f"In {__file__} file, __setRecoveryPassword()")
|
|
||||||
key = Vermasseln.userPasswordHash(key, salt)
|
key = Vermasseln.userPasswordHash(key, salt)
|
||||||
return key.split("$")
|
return key.split("$")
|
||||||
|
|
||||||
@@ -349,46 +219,29 @@ class ConfigLoader(QObject):
|
|||||||
|
|
||||||
@Slot(str, str)
|
@Slot(str, str)
|
||||||
def backupConfig(self, filename, password):
|
def backupConfig(self, filename, password):
|
||||||
"""! Saves the program configuration.
|
conf_file = toml.dumps(self.get_config())
|
||||||
@param filename the path of the backup file.
|
|
||||||
@param password the password to secure the backup.
|
|
||||||
"""
|
|
||||||
conf_file = toml.dumps(self.getConfig())
|
|
||||||
self.__saveData(filename, password, conf_file)
|
self.__saveData(filename, password, conf_file)
|
||||||
|
|
||||||
|
|
||||||
@Slot(dict)
|
@Slot(dict)
|
||||||
def saveDbConf(self, db = None):
|
def saveDbConf(self, db=None):
|
||||||
"""! Saves/Upates the database configuration.
|
|
||||||
@param db Database configuration as a dictionary.
|
|
||||||
"""
|
|
||||||
self.__config.update(db)
|
self.__config.update(db)
|
||||||
self.__saveConfig()
|
self.__saveConfig()
|
||||||
|
|
||||||
@Slot(result = dict)
|
@Slot(result=dict)
|
||||||
def getDbConf(self):
|
def getDbConf(self):
|
||||||
"""! Loads the database configuration.
|
|
||||||
@return Database configuration as a dictionary on success, None on failure.
|
|
||||||
"""
|
|
||||||
try:
|
try:
|
||||||
return self.__config['database']
|
return self.__config['database'] if self.__config is not None else None
|
||||||
except KeyError as ex:
|
except KeyError as ex:
|
||||||
print(f"Missing database configuration: {ex}")
|
print(f"Missing database configuration: {ex}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@Slot(dict)
|
@Slot(dict)
|
||||||
def saveCompanyInfo(self, company = None):
|
def saveCompanyInfo(self, company=None):
|
||||||
"""! Saves/Upates the company information.
|
|
||||||
@param company Company configuration as a dictionary.
|
|
||||||
"""
|
|
||||||
self.__config.update(company)
|
self.__config.update(company)
|
||||||
self.__saveConfig()
|
self.__saveConfig()
|
||||||
|
|
||||||
@Slot(result = dict)
|
@Slot(result=dict)
|
||||||
def getCompanyInfo(self):
|
def getCompanyInfo(self):
|
||||||
"""! Loads the company information.
|
|
||||||
@return Company information as a dictionary on success, None on failure.
|
|
||||||
"""
|
|
||||||
try:
|
try:
|
||||||
return self.__config['company']
|
return self.__config['company']
|
||||||
except KeyError as ex:
|
except KeyError as ex:
|
||||||
@@ -396,31 +249,19 @@ class ConfigLoader(QObject):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
@Slot(dict)
|
@Slot(dict)
|
||||||
def saveMiscConf(self, misc_conf = None):
|
def saveMiscConf(self, misc_conf=None):
|
||||||
"""! Saves/Upates the miscellaneous configuration.
|
|
||||||
@param misc_conf Extra configuration as a dictionary.
|
|
||||||
"""
|
|
||||||
self.__config.update(misc_conf)
|
self.__config.update(misc_conf)
|
||||||
self.__saveConfig()
|
self.__saveConfig()
|
||||||
|
|
||||||
@Slot(result = bool)
|
@Slot(result=bool)
|
||||||
def systray(self):
|
def systray(self):
|
||||||
"""! Loads the system tray configuration.
|
|
||||||
@return boolean if system tray is set to be used, False can also be returned on failure.
|
|
||||||
"""
|
|
||||||
try:
|
try:
|
||||||
return self.__config['misc']['SYSTRAY']
|
return self.__config['misc']['SYSTRAY']
|
||||||
except KeyError as ex:
|
except KeyError as ex:
|
||||||
print(f"Missing configuration: {ex}")
|
print(f"Missing configuration: {ex}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
@Slot(str, str)
|
@Slot(str, str)
|
||||||
def backupEncryptkey(self, filename, password):
|
def backupEncryptkey(self, filename, password):
|
||||||
"""! Saves/Upates the encryption key.
|
|
||||||
@param filename Path to save the key.
|
|
||||||
@param password Password to secure the backup.
|
|
||||||
"""
|
|
||||||
encrypt_key = self.__config['pyqcrm']['ENCRYPTION_KEY']
|
encrypt_key = self.__config['pyqcrm']['ENCRYPTION_KEY']
|
||||||
self.__saveData(filename, password, encrypt_key)
|
self.__saveData(filename, password, encrypt_key)
|
||||||
|
|
||||||
|
|||||||
@@ -1,83 +1,41 @@
|
|||||||
"""! @brief Defines the low-level DAO class to handle addresses."""
|
|
||||||
##
|
|
||||||
# @file AddressDAO.py
|
|
||||||
#
|
|
||||||
# @brief Defines the AddressDAO class.
|
|
||||||
#
|
|
||||||
# @section description_addressdao Description
|
|
||||||
# Defines the low-lever DAO class to handle CRUD operations on addresses.
|
|
||||||
# - AddressDAO (DAO class)
|
|
||||||
#
|
|
||||||
# @section libraries_addressdao Libraries/Modules
|
|
||||||
# - <a href="https://pypi.org/project/mariadb/">mariadb</a> Python module
|
|
||||||
# - MariaDB Connector/Python enables python programs to access MariaDB and MySQL databases, using an API which is compliant with the Python DB API 2.0 (PEP-249).
|
|
||||||
# - <a href="https://docs.python.org/3/library/json.html">json</a> Python standard library
|
|
||||||
# - JSON encoder and decoder.
|
|
||||||
# - <a href="https://docs.python.org/3/library/random.html">DbManager</a> Local class
|
|
||||||
# - Singleton class to provide for the database connection.
|
|
||||||
#
|
|
||||||
# @section notes_addressdao Notes
|
|
||||||
# - None.
|
|
||||||
#
|
|
||||||
# @section todo_addressdao TODO
|
|
||||||
# - None.
|
|
||||||
#
|
|
||||||
# @section author_addressdao Author(s)
|
|
||||||
# - Created by Linuxero on 03/14/2025.
|
|
||||||
# - Modified by Linuxero on 03/14/2025.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2025 Schnaxero. All rights reserved.
|
|
||||||
|
|
||||||
from .DbManager import DbManager
|
|
||||||
import mariadb
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
import mariadb
|
||||||
|
|
||||||
|
from lib.domain.BaseModel import database
|
||||||
|
|
||||||
|
|
||||||
class AddressDAO:
|
class AddressDAO:
|
||||||
"""! The AddressDAO class.
|
|
||||||
Defines a low-level class utilized for DAO.
|
|
||||||
Handles the address CRUD operations.
|
|
||||||
"""
|
|
||||||
__cur = None
|
__cur = None
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""! The AddressDAO class initializer.
|
self.__con = database.connection()
|
||||||
"""
|
|
||||||
#print(f"*** File: {__file__}, init()")
|
|
||||||
self.__con = DbManager().getConnection()
|
|
||||||
|
|
||||||
if self.__con:
|
if self.__con:
|
||||||
self.__cur = self.__con.cursor()
|
self.__cur = self.__con.cursor()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def __importPlz(self):
|
def __importPlz(self):
|
||||||
"""! Utility function to import zipcodes from an external databases.
|
|
||||||
"""
|
|
||||||
with open("pfad zur datei", "r") as plz:
|
with open("pfad zur datei", "r") as plz:
|
||||||
postcodes = json.load(plz)
|
postcodes = json.load(plz)
|
||||||
country = "Deutschland"
|
irgendwas = ""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
for i in postcodes:
|
for i in postcodes:
|
||||||
test =i["plz_name"].split(",")
|
test = i["plz_name"].split(",")
|
||||||
for town in test:
|
for town in test:
|
||||||
if "u.a" in town:
|
if "u.a" in town:
|
||||||
town = town[:-4]
|
town = town[:-4]
|
||||||
town = town.strip()
|
town = town.strip()
|
||||||
if town:
|
if town:
|
||||||
print(f"PROCESSING {i['name']} {town}")
|
print(f"PROCESSING {i['name']} {town}")
|
||||||
self.__cur.callproc("importLocation", (country, town, i["name"],))
|
self.__cur.callproc("addZipCodes", (i["name"], town, irgendwas,))
|
||||||
|
# self.__cur.callproc("addZipCodes", ("56271", "Kleinmaischeid", irgendwas,))
|
||||||
except mariadb.OperationalError as e:
|
except mariadb.OperationalError as e:
|
||||||
print(f"Database Error: {e}")
|
print(f"Database Error: {e}")
|
||||||
finally:
|
finally:
|
||||||
self.__con.commit()
|
self.__con.commit()
|
||||||
print("FINISHED")#
|
print("FINISHED") #
|
||||||
|
|
||||||
def __importCountry(self):
|
def __importCountry(self):
|
||||||
"""! Utility function to import countries information from an external databases.
|
|
||||||
"""
|
|
||||||
with open("pfad zur datei", "r") as country:
|
with open("pfad zur datei", "r") as country:
|
||||||
countries = json.load(country)
|
countries = json.load(country)
|
||||||
old = ""
|
old = ""
|
||||||
@@ -96,23 +54,17 @@ class AddressDAO:
|
|||||||
|
|
||||||
print(i[4], i[3], i[2], i[8], i[7])
|
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]))
|
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]
|
old = i[4]
|
||||||
except mariadb.OperationalError as e:
|
except mariadb.OperationalError as e:
|
||||||
print(f"Database Error: {e}")
|
print(f"Database Error: {e}")
|
||||||
finally:
|
finally:
|
||||||
self.__con.commit()
|
self.__con.commit()
|
||||||
print("FINISHED")#
|
print("FINISHED") #
|
||||||
|
|
||||||
|
def getAddressData(self, all=True, zipcode=None):
|
||||||
|
|
||||||
|
|
||||||
def getAddressData(self, all = True, zipcode = None):
|
|
||||||
"""! Loads available addresses in the program.
|
|
||||||
@param all Filter to get specific addresses as a boolean.
|
|
||||||
@param zipcode Specific zipcode pattern.
|
|
||||||
@return Found addresses as a dictionary on success, None on failure.
|
|
||||||
"""
|
|
||||||
try:
|
try:
|
||||||
if self.__cur:
|
if self.__cur:
|
||||||
self.__cur.callproc("getAddress", (all, zipcode,))
|
self.__cur.callproc("getAddress", (all, zipcode,))
|
||||||
@@ -122,5 +74,3 @@ class AddressDAO:
|
|||||||
return None
|
return None
|
||||||
except mariadb.Error as e:
|
except mariadb.Error as e:
|
||||||
print(str(e))
|
print(str(e))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,100 +1,34 @@
|
|||||||
"""! @brief Defines the model class to handle addresses."""
|
|
||||||
##
|
|
||||||
# @file AddressModel.py
|
|
||||||
#
|
|
||||||
# @brief Defines the AddressModel class.
|
|
||||||
#
|
|
||||||
# @section description_addressmodel Description
|
|
||||||
# Defines the model class to handle CRUD operations on addresses.
|
|
||||||
# - AddressModel (Model class)
|
|
||||||
#
|
|
||||||
# @section libraries_addressmodel Libraries/Modules
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QAbstractListModel.html">QAbstractListModel</a> PySid6 core Class
|
|
||||||
# - Provides an abstract model that can be subclassed to create one-dimensional list models.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QModelIndex.html">QModelIndex</a> PySid6 core Class
|
|
||||||
# - Used to locate data in a data model.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/Slot.html">Slot</a> PySide6 function
|
|
||||||
# - A function that is called in response to a particular signal.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/Qt.html">Qt</a> PySid6 core Class
|
|
||||||
# - A namespace contains miscellaneous identifiers used throughout the Qt library.
|
|
||||||
# - <a href="">AddressDAO</a> Local class
|
|
||||||
# - Defines the low-lever DAO class to handle CRUD operations on addresses.
|
|
||||||
#
|
|
||||||
# @section notes_addressmodel Notes
|
|
||||||
# - None.
|
|
||||||
#
|
|
||||||
# @section todo_addressmodel TODO
|
|
||||||
# - None.
|
|
||||||
#
|
|
||||||
# @section author_addressmodel Author(s)
|
|
||||||
# - Created by Linuxero on 03/14/2025.
|
|
||||||
# - Modified by Linuxero on 03/14/2025.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2025 Schnaxero. All rights reserved.
|
|
||||||
|
|
||||||
from PySide6.QtCore import QAbstractListModel, Qt, Slot, QModelIndex
|
from PySide6.QtCore import QAbstractListModel, Qt, Slot, QModelIndex
|
||||||
from .AddressDAO import AddressDAO
|
from .AddressDAO import AddressDAO
|
||||||
from ..PyqcrmDataRoles import PyqcrmDataRoles
|
from ..PyqcrmDataRoles import PyqcrmDataRoles
|
||||||
|
|
||||||
|
|
||||||
class AddressModel(QAbstractListModel):
|
class AddressModel(QAbstractListModel):
|
||||||
"""! The AddressModel class.
|
|
||||||
Defines a model class utilized to handle data.
|
|
||||||
Inherits from QAbstractListModel
|
|
||||||
Handles the address data operations.
|
|
||||||
"""
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""! The AddressModel class initializer.
|
|
||||||
"""
|
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.__address_data = AddressDAO().getAddressData()
|
self.__address_data = AddressDAO().getAddressData()
|
||||||
|
|
||||||
def rowCount(self, parent = QModelIndex()):
|
def rowCount(self, parent=QModelIndex()):
|
||||||
"""! Returns the number of rows under the given parent.
|
|
||||||
Ref. <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QAbstractItemModel.html#PySide6.QtCore.QAbstractItemModel.rowCount">rowCount()</a>
|
|
||||||
"""
|
|
||||||
return len(self.__address_data)
|
return len(self.__address_data)
|
||||||
|
|
||||||
def data(self, index, role = Qt.DisplayRole):
|
def data(self, index, role=Qt.ItemDataRole.DisplayRole):
|
||||||
"""! Returns the data stored under the given role for the item referred to by the index.
|
|
||||||
Ref. <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QAbstractItemModel.html#PySide6.QtCore.QAbstractItemModel.data">data()</a>
|
|
||||||
"""
|
|
||||||
row = index.row()
|
row = index.row()
|
||||||
if role == Qt.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
data = self.__address_data[row][5]
|
data = self.__address_data[row][2]
|
||||||
return data
|
return data
|
||||||
elif role == PyqcrmDataRoles.CITY_ROLE:
|
elif role == PyqcrmDataRoles.CITY_ROLE:
|
||||||
data = self.__address_data[row][4]
|
|
||||||
return data
|
|
||||||
elif role == PyqcrmDataRoles.COUNTRY_ROLE:
|
|
||||||
data = self.__address_data[row][3]
|
data = self.__address_data[row][3]
|
||||||
return data
|
return data
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def roleNames(self):
|
def roleNames(self):
|
||||||
"""! Returns the model’s role names.
|
|
||||||
Ref. <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QAbstractItemModel.html#PySide6.QtCore.QAbstractItemModel.roleNames">roleNames()</a>
|
|
||||||
"""
|
|
||||||
return {
|
return {
|
||||||
Qt.DisplayRole: b"display",
|
Qt.ItemDataRole.DisplayRole: b"display",
|
||||||
PyqcrmDataRoles.CITY_ROLE: b"city",
|
PyqcrmDataRoles.CITY_ROLE: b"city",
|
||||||
PyqcrmDataRoles.COUNTRY_ROLE: b"country"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def setData(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
@Slot(bool, str)
|
@Slot(bool, str)
|
||||||
def getAddresses(self, all, zipcode):
|
def getAddresses(self, all, zipcode):
|
||||||
"""! Loads the addresses from the storage backend.
|
|
||||||
@param all Boolean to specify whether all addresses to be returned or not.
|
|
||||||
@param zipcode String to look up addresses following a specific zipcode.
|
|
||||||
@return Returns a dictionary containing the addresses.
|
|
||||||
"""
|
|
||||||
data = AddressDAO().getAddressData(all, zipcode)
|
data = AddressDAO().getAddressData(all, zipcode)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
91
lib/DB/ApplicantModel.py
Normal file
91
lib/DB/ApplicantModel.py
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
import uuid
|
||||||
|
from typing import List, Callable, Any
|
||||||
|
|
||||||
|
from PySide6.QtCore import QModelIndex, Qt, QAbstractTableModel, Slot, Property, Signal
|
||||||
|
from PySide6.QtQml import QJSValue
|
||||||
|
from peewee import Select
|
||||||
|
|
||||||
|
from lib.domain.Applicant import Applicant
|
||||||
|
|
||||||
|
COLUMNS: list[Callable[[Applicant], Any]] = [
|
||||||
|
lambda applicant: applicant.first_name,
|
||||||
|
lambda applicant: applicant.last_name,
|
||||||
|
lambda applicant: applicant.zip_code.zip_code or None,
|
||||||
|
lambda applicant: applicant.zip_code.town.town if applicant.zip_code.id is not None else None
|
||||||
|
]
|
||||||
|
|
||||||
|
COLUMN_NAMES = ["Vorname", "Nachname", "PLZ", "Ort"]
|
||||||
|
|
||||||
|
|
||||||
|
class ApplicantModel(QAbstractTableModel):
|
||||||
|
_applicants: Select
|
||||||
|
_search_query: str = ""
|
||||||
|
search_query_changed = Signal(str)
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
super().__init__()
|
||||||
|
self._query_applicants()
|
||||||
|
|
||||||
|
def rowCount(self, /, parent=...):
|
||||||
|
return len(self._applicants)
|
||||||
|
|
||||||
|
def columnCount(self, /, parent=...):
|
||||||
|
return len(COLUMNS)
|
||||||
|
|
||||||
|
def data(self, index: QModelIndex, role: int = Qt.ItemDataRole.DisplayRole):
|
||||||
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
|
applicant = self._applicants[index.row()]
|
||||||
|
return COLUMNS[index.column()](applicant)
|
||||||
|
return None
|
||||||
|
|
||||||
|
@Property(str, notify=search_query_changed)
|
||||||
|
def searchQuery(self):
|
||||||
|
return self._search_query
|
||||||
|
|
||||||
|
@searchQuery.setter
|
||||||
|
def searchQuery(self, value: str):
|
||||||
|
self._search_query = value
|
||||||
|
self._query_applicants()
|
||||||
|
|
||||||
|
@Slot(int, result=dict)
|
||||||
|
def applicant(self, row) -> dict:
|
||||||
|
applicant = Applicant.get_by_id(self._applicants[row].id)
|
||||||
|
return {
|
||||||
|
'title': applicant.title,
|
||||||
|
"firstName": applicant.first_name,
|
||||||
|
"lastName": applicant.last_name,
|
||||||
|
"street": applicant.street,
|
||||||
|
"houseNumber": applicant.house_number,
|
||||||
|
"zipCode": applicant.zip_code_id,
|
||||||
|
"phoneNumber": applicant.phone_number,
|
||||||
|
"mobileNumber": applicant.mobile_number,
|
||||||
|
"emailAddress": applicant.email_address,
|
||||||
|
"salutation": applicant.salutation
|
||||||
|
}
|
||||||
|
|
||||||
|
@Slot(QJSValue)
|
||||||
|
def createApplicant(self, values: QJSValue):
|
||||||
|
applicant = Applicant()
|
||||||
|
applicant.id = uuid.uuid4()
|
||||||
|
applicant.title = values.property("title").toInt()
|
||||||
|
applicant.first_name = values.property("firstName").toString()
|
||||||
|
applicant.last_name = values.property("lastName").toString()
|
||||||
|
applicant.street = values.property("street").toString() or None
|
||||||
|
applicant.house_number = values.property("houseNumber").toString() or None
|
||||||
|
if values.property("zipCode").toInt() != -1:
|
||||||
|
applicant.zip_code = values.property("zipCode").toInt()
|
||||||
|
applicant.phone_number = values.property("phoneNumber").toString() or None
|
||||||
|
applicant.mobile_number = values.property("mobileNumber").toString() or None
|
||||||
|
applicant.email_address = values.property("emailAddress").toString() or None
|
||||||
|
applicant.salutation = values.property("salutation").toString() or None
|
||||||
|
applicant.save(force_insert=True)
|
||||||
|
self._query_applicants()
|
||||||
|
|
||||||
|
def headerData(self, section: int, orientation: Qt.Orientation, role: int = Qt.ItemDataRole.DisplayRole):
|
||||||
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
|
return COLUMN_NAMES[section]
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _query_applicants(self):
|
||||||
|
self._applicants = Applicant.select_table_data(self._search_query)
|
||||||
|
self.layoutChanged.emit()
|
||||||
@@ -1,20 +1,20 @@
|
|||||||
from .DbManager import DbManager
|
from lib.domain.BaseModel import database
|
||||||
|
|
||||||
|
|
||||||
class BTypeDAO:
|
class BTypeDAO:
|
||||||
__cur = None
|
__cur = None
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
#print(f"*** File: {__file__}, init()")
|
self.__con = database.connection()
|
||||||
self.__con = DbManager().getConnection()
|
|
||||||
if self.__con:
|
if self.__con:
|
||||||
self.__cur = self.__con.cursor()
|
self.__cur = self.__con.cursor()
|
||||||
|
|
||||||
def getBType(self):
|
def getBType(self):
|
||||||
try:
|
try:
|
||||||
if self.__cur:
|
if self.__cur:
|
||||||
self.__cur.callproc("getBtype", (None, None, ))
|
self.__cur.callproc("getBtype", (None, None,))
|
||||||
data = self.__cur.fetchall()
|
data = self.__cur.fetchall()
|
||||||
return(data)
|
return data
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
except mariadb.Error as e:
|
except mariadb.Error as e:
|
||||||
|
|||||||
@@ -1,63 +1,16 @@
|
|||||||
"""! @brief Defines the model class to handle type of client."""
|
|
||||||
##
|
|
||||||
# @file BTypeModel.py
|
|
||||||
#
|
|
||||||
# @brief Defines the BTypeModel class.
|
|
||||||
#
|
|
||||||
# @section description_businesstypemodel Description
|
|
||||||
# Defines the model class to handle CRUD operations on customers types.
|
|
||||||
# - BTypeModel (Model class)
|
|
||||||
#
|
|
||||||
# @section libraries_businesstypemodel Libraries/Modules
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QAbstractListModel.html">QAbstractListModel</a> PySid6 core Class
|
|
||||||
# - Provides an abstract model that can be subclassed to create one-dimensional list models.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QModelIndex.html">QModelIndex</a> PySid6 core Class
|
|
||||||
# - Used to locate data in a data model.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/Slot.html">Slot</a> PySide6 function
|
|
||||||
# - A function that is called in response to a particular signal.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/Qt.html">Qt</a> PySid6 core Class
|
|
||||||
# - A namespace contains miscellaneous identifiers used throughout the Qt library.
|
|
||||||
# - <a href="">BTypeDAO</a> Local class
|
|
||||||
# - Defines the low-lever DAO class to handle CRUD operations on customers types.
|
|
||||||
#
|
|
||||||
# @section notes_businesstypemodel Notes
|
|
||||||
# - None.
|
|
||||||
#
|
|
||||||
# @section todo_businesstypemodel TODO
|
|
||||||
# - None.
|
|
||||||
#
|
|
||||||
# @section author_businesstypemodel Author(s)
|
|
||||||
# - Created by Linuxero on 03/14/2025.
|
|
||||||
# - Modified by Linuxero on 03/14/2025.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2025 Schnaxero. All rights reserved.
|
|
||||||
|
|
||||||
from PySide6.QtCore import QAbstractListModel, Qt, QModelIndex
|
from PySide6.QtCore import QAbstractListModel, Qt, QModelIndex
|
||||||
from .BTypeDAO import BTypeDAO
|
from .BTypeDAO import BTypeDAO
|
||||||
|
|
||||||
|
|
||||||
class BTypeModel(QAbstractListModel):
|
class BTypeModel(QAbstractListModel):
|
||||||
"""! The BTypeModel class.
|
|
||||||
Defines a model class utilized to handle data.
|
|
||||||
Inherits from QAbstractListModel
|
|
||||||
Handles the customers types data operations.
|
|
||||||
"""
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""! The AddressModel class initializer.
|
|
||||||
"""
|
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.__btype_data = BTypeDAO().getBType()
|
self.__btype_data = BTypeDAO().getBType()
|
||||||
|
|
||||||
def rowCount(self, parent = QModelIndex()):
|
def rowCount(self, parent = QModelIndex()):
|
||||||
"""! Returns the number of rows under the given parent.
|
|
||||||
Ref. <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QAbstractItemModel.html#PySide6.QtCore.QAbstractItemModel.rowCount">rowCount()</a>
|
|
||||||
"""
|
|
||||||
return len(self.__btype_data)
|
return len(self.__btype_data)
|
||||||
|
|
||||||
def data(self, index, role = Qt.DisplayRole):
|
def data(self, index, role = Qt.DisplayRole):
|
||||||
"""! Returns the data stored under the given role for the item referred to by the index.
|
|
||||||
Ref. <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QAbstractItemModel.html#PySide6.QtCore.QAbstractItemModel.data">data()</a>
|
|
||||||
"""
|
|
||||||
row = index.row()
|
row = index.row()
|
||||||
if role == Qt.DisplayRole:
|
if role == Qt.DisplayRole:
|
||||||
data= self.__btype_data[row][1]
|
data= self.__btype_data[row][1]
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
from .DbManager import DbManager
|
|
||||||
import json
|
import json
|
||||||
import mariadb
|
import mariadb
|
||||||
from PySide6.QtCore import QObject, Signal
|
from PySide6.QtCore import QObject, Signal
|
||||||
|
from lib.domain.BaseModel import database
|
||||||
|
|
||||||
|
|
||||||
class BusinessDAO(QObject):
|
class BusinessDAO(QObject):
|
||||||
@@ -12,11 +12,11 @@ class BusinessDAO(QObject):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.__con = DbManager().getConnection()
|
self.__con = database.connection()
|
||||||
if self.__con:
|
if self.__con:
|
||||||
self.__cur = self.__con.cursor()
|
self.__cur = self.__con.cursor()
|
||||||
|
|
||||||
def getBusiness(self, enc_key, criterion = "Alle"):
|
def getBusiness(self, enc_key, criterion="Alle"):
|
||||||
try:
|
try:
|
||||||
if self.__cur:
|
if self.__cur:
|
||||||
self.__cur.callproc("getCustomerView", (enc_key, criterion,))
|
self.__cur.callproc("getCustomerView", (enc_key, criterion,))
|
||||||
@@ -27,14 +27,14 @@ class BusinessDAO(QObject):
|
|||||||
except mariadb.Error as e:
|
except mariadb.Error as e:
|
||||||
print(str(e))
|
print(str(e))
|
||||||
|
|
||||||
def getOneBusiness(self, business_id, enc_key = None):
|
def getOneBusiness(self, business_id, enc_key=None):
|
||||||
try:
|
try:
|
||||||
if self.__cur:
|
if self.__cur:
|
||||||
self.__cur.callproc("getCustomer", (business_id, enc_key,))
|
self.__cur.callproc("getCustomer", (business_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))
|
||||||
|
|
||||||
@@ -47,10 +47,3 @@ class BusinessDAO(QObject):
|
|||||||
|
|
||||||
except mariadb.Error as e:
|
except mariadb.Error as e:
|
||||||
print(str(e))
|
print(str(e))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,41 +1,4 @@
|
|||||||
"""! @brief Defines the model class to handle customers."""
|
# This Python file uses the following encoding: utf-8
|
||||||
##
|
|
||||||
# @file BusinessModel.py
|
|
||||||
#
|
|
||||||
# @brief Defines the BusinessModel class.
|
|
||||||
#
|
|
||||||
# @section description_businessmodel Description
|
|
||||||
# Defines the model class to handle CRUD operations on customers.
|
|
||||||
# - BusinessModel (Model class)
|
|
||||||
#
|
|
||||||
# @section libraries_businessmodel Libraries/Modules
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QAbstractListModel.html">QAbstractListModel</a> PySid6 core Class
|
|
||||||
# - Provides an abstract model that can be subclassed to create one-dimensional list models.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QModelIndex.html">QModelIndex</a> PySid6 core Class
|
|
||||||
# - Used to locate data in a data model.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/Slot.html">Slot</a> PySide6 function
|
|
||||||
# - A function that is called in response to a particular signal.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/Signal.html">Signal</a> PySide6 class
|
|
||||||
# - Provides a way to declare and connect Qt signals in a pythonic way.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/Qt.html">Qt</a> PySid6 core Class
|
|
||||||
# - A namespace contains miscellaneous identifiers used throughout the Qt library.
|
|
||||||
# - <a href="">BusinessDAO</a> Local class
|
|
||||||
# - Defines the low-lever DAO class to handle CRUD operations on customers.
|
|
||||||
# - <a href="">ConfigLoader</a> Local class
|
|
||||||
# - Defines the base class for the program configuration.
|
|
||||||
#
|
|
||||||
# @section notes_businessmodel Notes
|
|
||||||
# - None.
|
|
||||||
#
|
|
||||||
# @section todo_businessmodel TODO
|
|
||||||
# - None.
|
|
||||||
#
|
|
||||||
# @section author_businessmodel Author(s)
|
|
||||||
# - Created by Linuxero on 03/14/2025.
|
|
||||||
# - Modified by Linuxero on 03/14/2025.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2025 Schnaxero. All rights reserved.
|
|
||||||
|
|
||||||
from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot, Signal
|
from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot, Signal
|
||||||
from .BusinessDAO import BusinessDAO
|
from .BusinessDAO import BusinessDAO
|
||||||
# from ..PyqcrmFlags import PyqcrmFlags
|
# from ..PyqcrmFlags import PyqcrmFlags
|
||||||
@@ -99,11 +62,6 @@ from ..ConfigLoader import ConfigLoader
|
|||||||
|
|
||||||
|
|
||||||
class BusinessModel(QAbstractTableModel):
|
class BusinessModel(QAbstractTableModel):
|
||||||
"""! The BusinessModel class.
|
|
||||||
Defines a model class utilized to handle data.
|
|
||||||
Inherits from QAbstractListModel
|
|
||||||
Handles the customers data operations.
|
|
||||||
"""
|
|
||||||
__visible_index = {}
|
__visible_index = {}
|
||||||
__visible_columns = None
|
__visible_columns = None
|
||||||
__col_name = ""
|
__col_name = ""
|
||||||
@@ -112,27 +70,20 @@ class BusinessModel(QAbstractTableModel):
|
|||||||
__business_dict = {'business':{}} #,'contact':{}}
|
__business_dict = {'business':{}} #,'contact':{}}
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""! The AddressModel class initializer.
|
|
||||||
"""
|
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.__business_dao = BusinessDAO()
|
self.__business_dao = BusinessDAO()
|
||||||
self.__business_dao.newBusinessAdded.connect(self.__refreshView)
|
self.__business_dao.newBusinessAdded.connect(self.__refreshView)
|
||||||
self.__conf = ConfigLoader().getConfig()
|
self.__conf = ConfigLoader().get_config()
|
||||||
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"):
|
||||||
"""! Returns the customers data according to the model.
|
|
||||||
@param criterion String to specify which customers are to be fetched.
|
|
||||||
"""
|
|
||||||
self.beginResetModel()
|
self.beginResetModel()
|
||||||
rows, self.__visible_columns = self.__business_dao.getBusiness(self.__key, criterion)
|
rows, self.__visible_columns = self.__business_dao.getBusiness(self.__key, criterion)
|
||||||
self.__data = rows
|
self.__data = rows
|
||||||
self.endResetModel()
|
self.endResetModel()
|
||||||
|
|
||||||
def __getBusinessInfo(self):
|
def __getBusinessInfo(self):
|
||||||
"""! Fetches detailed information about a customer.
|
|
||||||
"""
|
|
||||||
self.__business_dict['business']['id'] = self.__business[0][0]
|
self.__business_dict['business']['id'] = self.__business[0][0]
|
||||||
self.__business_dict['business']['contactid'] = self.__business[0][1]
|
self.__business_dict['business']['contactid'] = self.__business[0][1]
|
||||||
self.__business_dict['business']['company'] = self.__business[0][2]
|
self.__business_dict['business']['company'] = self.__business[0][2]
|
||||||
@@ -149,30 +100,18 @@ class BusinessModel(QAbstractTableModel):
|
|||||||
self.__business_dict['business']['city'] = self.__business[0][13]
|
self.__business_dict['business']['city'] = self.__business[0][13]
|
||||||
|
|
||||||
def rowCount(self, parent= QModelIndex()):
|
def rowCount(self, parent= QModelIndex()):
|
||||||
"""! Returns the number of rows under the given parent.
|
|
||||||
Ref. <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QAbstractItemModel.html#PySide6.QtCore.QAbstractItemModel.rowCount">rowCount()</a>
|
|
||||||
"""
|
|
||||||
return len (self.__data)
|
return len (self.__data)
|
||||||
|
|
||||||
def columnCount(self, parent= QModelIndex()):
|
def columnCount(self, parent= QModelIndex()):
|
||||||
"""! Returns the number of columns for the children of the given parent.
|
|
||||||
Ref. <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QAbstractItemModel.html#PySide6.QtCore.QAbstractItemModel.columnCount">columnCount()</a>
|
|
||||||
"""
|
|
||||||
return len(self.__visible_columns) - 1
|
return len(self.__visible_columns) - 1
|
||||||
|
|
||||||
def data(self, index, role = Qt.DisplayRole):
|
def data(self, index, role = Qt.DisplayRole):
|
||||||
"""! Returns the data stored under the given role for the item referred to by the index.
|
|
||||||
Ref. <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QAbstractItemModel.html#PySide6.QtCore.QAbstractItemModel.data">data()</a>
|
|
||||||
"""
|
|
||||||
if role == Qt.DisplayRole:
|
if role == Qt.DisplayRole:
|
||||||
row = self.__data[index.row()]
|
row = self.__data[index.row()]
|
||||||
return row[index.column() + 1]
|
return row[index.column() + 1]
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def headerData(self, section, orientation, role= Qt.DisplayRole):
|
def headerData(self, section, orientation, role= Qt.DisplayRole):
|
||||||
"""! Returns the data for the given role and section in the header with the specified orientation.
|
|
||||||
Ref. <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QAbstractItemModel.html#PySide6.QtCore.QAbstractItemModel.headerData">headerData()</a>
|
|
||||||
"""
|
|
||||||
if orientation == Qt.Horizontal and role ==Qt.DisplayRole:
|
if orientation == Qt.Horizontal and role ==Qt.DisplayRole:
|
||||||
self.__col_name = self.__visible_columns[section + 1]
|
self.__col_name = self.__visible_columns[section + 1]
|
||||||
return self.__col_name
|
return self.__col_name
|
||||||
@@ -193,9 +132,6 @@ class BusinessModel(QAbstractTableModel):
|
|||||||
|
|
||||||
@Slot(int)
|
@Slot(int)
|
||||||
def onRowClicked(self, row):
|
def onRowClicked(self, row):
|
||||||
"""! Handles a selected customer from the GUI.
|
|
||||||
@param row The number of the customer in the data model.
|
|
||||||
"""
|
|
||||||
#print(self.__data)
|
#print(self.__data)
|
||||||
#print(f"Selected table row: {row}, corresponding DB ID: {self.__data[row][0]}")
|
#print(f"Selected table row: {row}, corresponding DB ID: {self.__data[row][0]}")
|
||||||
if not self.__business_dict['business'] or self.__data[row][0] != self.__business_dict['business']['id']:
|
if not self.__business_dict['business'] or self.__data[row][0] != self.__business_dict['business']['id']:
|
||||||
@@ -207,31 +143,19 @@ class BusinessModel(QAbstractTableModel):
|
|||||||
|
|
||||||
@Slot(result = dict)
|
@Slot(result = dict)
|
||||||
def getClientDetails(self):
|
def getClientDetails(self):
|
||||||
"""! Fetches a selected customer from the GUI.
|
|
||||||
@return A dictionary containing all information of a customer.
|
|
||||||
"""
|
|
||||||
return self.__business_dict
|
return self.__business_dict
|
||||||
|
|
||||||
@Slot(str)
|
@Slot(str)
|
||||||
def viewCriterion(self, criterion):
|
def viewCriterion(self, criterion):
|
||||||
"""! Updates the customers view.
|
|
||||||
@param criterion The criterion used to look for customers.
|
|
||||||
"""
|
|
||||||
self.__getData(criterion)
|
self.__getData(criterion)
|
||||||
|
|
||||||
|
|
||||||
@Slot(dict, int)
|
@Slot(dict, int)
|
||||||
def addBusiness(self, business, contact_id):
|
def addBusiness(self, business, contact_id):
|
||||||
"""! Saves a customer view.
|
|
||||||
@param business The customer to be saved.
|
|
||||||
@param contact_id The contact person id if available.
|
|
||||||
"""
|
|
||||||
self.__business_dao.addBusiness(business, contact_id)
|
self.__business_dao.addBusiness(business, contact_id)
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def __refreshView(self):
|
def __refreshView(self):
|
||||||
"""! Updates the customers view.
|
|
||||||
"""
|
|
||||||
self.__getData()
|
self.__getData()
|
||||||
|
|
||||||
@Slot(dict)
|
@Slot(dict)
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
from .DbManager import DbManager
|
|
||||||
from PySide6.QtCore import QObject, Signal
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
import mariadb
|
import mariadb
|
||||||
|
from PySide6.QtCore import QObject, Signal
|
||||||
|
|
||||||
|
from lib.domain.BaseModel import database
|
||||||
|
|
||||||
|
|
||||||
class ContactDAO(QObject):
|
class ContactDAO(QObject):
|
||||||
@@ -9,8 +11,7 @@ class ContactDAO(QObject):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
#print(f"*** File: {__file__}, __init__()")
|
self.__con = database.connection()
|
||||||
self.__con = DbManager().getConnection()
|
|
||||||
if self.__con:
|
if self.__con:
|
||||||
self.__cur = self.__con.cursor()
|
self.__cur = self.__con.cursor()
|
||||||
|
|
||||||
@@ -61,4 +62,3 @@ class ContactDAO(QObject):
|
|||||||
print(str(e))
|
print(str(e))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class ContactModel(QObject):
|
|||||||
super().__init__()
|
super().__init__()
|
||||||
# print(f"*** File: {__file__}, __init__()")
|
# print(f"*** File: {__file__}, __init__()")
|
||||||
#self.logger = logging.getLogger()
|
#self.logger = logging.getLogger()
|
||||||
self.__conf = ConfigLoader().getConfig()
|
self.__conf = ConfigLoader().get_config()
|
||||||
self.__key = self.__conf['pyqcrm']['ENCRYPTION_KEY']
|
self.__key = self.__conf['pyqcrm']['ENCRYPTION_KEY']
|
||||||
self.__contact_dao = ContactDAO()
|
self.__contact_dao = ContactDAO()
|
||||||
self.__contact_dao.newObjectContactAdded.connect(self.objectContactAdded)
|
self.__contact_dao.newObjectContactAdded.connect(self.objectContactAdded)
|
||||||
|
|||||||
@@ -1,46 +0,0 @@
|
|||||||
import mariadb
|
|
||||||
|
|
||||||
class DbManager():
|
|
||||||
__connection = None
|
|
||||||
__con_param = None
|
|
||||||
__dbmanager = None
|
|
||||||
|
|
||||||
def __new__(cls, dbconf = None):
|
|
||||||
|
|
||||||
if cls.__dbmanager is None:
|
|
||||||
cls.__dbmanager = super(DbManager, cls).__new__(cls)
|
|
||||||
cls.__dbmanager.__initializeConfig(dbconf)
|
|
||||||
|
|
||||||
return cls.__dbmanager
|
|
||||||
|
|
||||||
def getConnection(cls):
|
|
||||||
#print(f"DB Manager: {cls.__dbmanager}")
|
|
||||||
#print(f"DB Connection: {cls.__connection}")
|
|
||||||
try:
|
|
||||||
if not cls.__connection or not cls.__connection.ping():
|
|
||||||
cls.__failure_notified = False
|
|
||||||
cls.__connection = mariadb.connect(**cls.__con_param)
|
|
||||||
except mariadb.InterfaceError as e:
|
|
||||||
cls.__connection = mariadb.connect(**cls.__con_param)
|
|
||||||
print(f"DbManager Connection (INTERFACE ERROR): {e}..reconnecting...")
|
|
||||||
except mariadb.Error as e:
|
|
||||||
if '(110)' in str(e):
|
|
||||||
print(f"File: {__file__}\n Database connection timed out (Check connection parameters or server running): {e}")
|
|
||||||
elif '(138)' in str(e):
|
|
||||||
print(f"File: {__file__}\n Database connection timed out (Check connection parameters or server running - initial handshake): {e}")
|
|
||||||
else:
|
|
||||||
print(f"File: {__file__}\n Database connection error: {e}")
|
|
||||||
cls.__connection = None
|
|
||||||
|
|
||||||
return cls.__connection
|
|
||||||
|
|
||||||
def __initializeConfig(cls, dbconf):
|
|
||||||
cls.__con_param = { 'user': dbconf['DB_USER'], 'password': dbconf['DB_PASS'],
|
|
||||||
'port': int (dbconf['DB_PORT']), 'host': dbconf['DB_HOST'],
|
|
||||||
'database': dbconf['DB_NAME'], 'connect_timeout': 5, 'autocommit': True,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,45 +1,41 @@
|
|||||||
from .DbManager import DbManager
|
|
||||||
import json
|
import json
|
||||||
import mariadb
|
|
||||||
from PySide6.QtCore import QObject, Signal
|
from PySide6.QtCore import QObject, Signal
|
||||||
|
|
||||||
|
from lib.domain.BaseModel import database
|
||||||
|
|
||||||
|
|
||||||
class EmployeeDAO(QObject):
|
class EmployeeDAO(QObject):
|
||||||
newEmployeeAdded = Signal(bool)
|
newEmployeeAdded = Signal(bool)
|
||||||
|
|
||||||
__cur = None
|
|
||||||
__all_cols = None
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.__con = DbManager().getConnection()
|
self._connection = database.connection()
|
||||||
if self.__con:
|
|
||||||
self.__cur = self.__con.cursor()
|
|
||||||
|
|
||||||
def getEmployees(self, enc_key, criterion="Alle", processed=False, fired=False, every_state=True):
|
def getEmployees(self, enc_key, criterion="Alle", processed=False, fired=False, every_state=True):
|
||||||
|
cursor = self._connection.cursor()
|
||||||
try:
|
try:
|
||||||
if self.__cur:
|
cursor.callproc("getEmployeeTable", (criterion, processed, fired, every_state, enc_key,))
|
||||||
self.__cur.callproc("getEmployeeTable", (criterion, processed, fired, every_state, enc_key,))
|
all_cols = [desc[0] for desc in cursor.description]
|
||||||
self.__all_cols = [desc[0] for desc in self.__cur.description]
|
result = cursor.fetchall(), all_cols
|
||||||
return self.__cur.fetchall(), self.__all_cols
|
return result
|
||||||
else:
|
finally:
|
||||||
return None, None
|
cursor.close()
|
||||||
except mariadb.Error as e:
|
|
||||||
print(str(e))
|
|
||||||
|
|
||||||
def getEmployee(self, employee_id, enc_key=None):
|
def fetchApplicant(self, employee_id, enc_key=None) -> dict:
|
||||||
|
cursor = self._connection.cursor(dictionary=True)
|
||||||
try:
|
try:
|
||||||
if self.__cur:
|
cursor.callproc("getApplicant", (employee_id, enc_key))
|
||||||
self.__cur.callproc("getEmployee", (employee_id, enc_key,))
|
it = cursor.fetchone()
|
||||||
# self.__all_cols = [desc[0] for desc in self.__cur.description]
|
return it
|
||||||
return self.__cur.fetchall() # , self.__all_cols
|
finally:
|
||||||
else:
|
cursor.close()
|
||||||
return None
|
|
||||||
except mariadb.Error as e:
|
|
||||||
print(str(e))
|
|
||||||
|
|
||||||
def addEmployee(self, data, enc_key, applicant=True):
|
def addApplicant(self, data, enc_key, applicant=True):
|
||||||
if self.__cur:
|
cursor = self._connection.cursor()
|
||||||
self.__cur.callproc("addApplicant", (json.dumps(data), applicant, enc_key,))
|
try:
|
||||||
self.__con.commit()
|
cursor.callproc("addApplicant", (json.dumps(data), applicant, enc_key,))
|
||||||
|
self._connection.commit()
|
||||||
self.newEmployeeAdded.emit(True)
|
self.newEmployeeAdded.emit(True)
|
||||||
|
finally:
|
||||||
|
cursor.close()
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
import json
|
from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot, Signal
|
||||||
from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot, Signal, QJsonDocument
|
from PySide6.QtQml import QJSValue
|
||||||
from PySide6.QtQml import QJSValue, QJSValueIterator
|
|
||||||
from .EmployeeDAO import EmployeeDAO
|
from .EmployeeDAO import EmployeeDAO
|
||||||
# from ..PyqcrmFlags import PyqcrmFlags, PyqcrmAppliEmpyFlags
|
|
||||||
from ..ConfigLoader import ConfigLoader
|
from ..ConfigLoader import ConfigLoader
|
||||||
import re
|
import re
|
||||||
|
|
||||||
@@ -11,7 +10,6 @@ class EmployeeModel(QAbstractTableModel):
|
|||||||
addedNewEmployee = Signal(bool)
|
addedNewEmployee = Signal(bool)
|
||||||
__data = None
|
__data = None
|
||||||
__employee_dao = None
|
__employee_dao = None
|
||||||
__visible_index = None
|
|
||||||
__visible_columns = None
|
__visible_columns = None
|
||||||
__col_name = ""
|
__col_name = ""
|
||||||
__col_skip = 2
|
__col_skip = 2
|
||||||
@@ -21,7 +19,7 @@ class EmployeeModel(QAbstractTableModel):
|
|||||||
super().__init__()
|
super().__init__()
|
||||||
self.__employee_dao = EmployeeDAO()
|
self.__employee_dao = EmployeeDAO()
|
||||||
self.__employee_dao.newEmployeeAdded.connect(self.__refreshView)
|
self.__employee_dao.newEmployeeAdded.connect(self.__refreshView)
|
||||||
self.__conf = ConfigLoader().getConfig()
|
self.__conf = ConfigLoader().get_config()
|
||||||
self.__key = self.__conf['pyqcrm']['ENCRYPTION_KEY']
|
self.__key = self.__conf['pyqcrm']['ENCRYPTION_KEY']
|
||||||
self.__getData()
|
self.__getData()
|
||||||
|
|
||||||
@@ -30,34 +28,23 @@ class EmployeeModel(QAbstractTableModel):
|
|||||||
if 'worklicense' in new_employee:
|
if 'worklicense' in new_employee:
|
||||||
new_employee['worklicense'] = int(new_employee['worklicense'])
|
new_employee['worklicense'] = int(new_employee['worklicense'])
|
||||||
new_employee['residencetype'] = int(new_employee['residencetype'])
|
new_employee['residencetype'] = int(new_employee['residencetype'])
|
||||||
self.__employee_dao.addEmployee(new_employee, self.__key, False)
|
self.__employee_dao.addApplicant(new_employee, self.__key, False)
|
||||||
|
|
||||||
@Slot(QJSValue)
|
@Slot(QJSValue)
|
||||||
def addApplicant(self, new_applicant):
|
def addApplicant(self, applicant: QJSValue):
|
||||||
data = {}
|
self.__employee_dao.addApplicant({
|
||||||
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):
|
||||||
@@ -84,35 +71,21 @@ class EmployeeModel(QAbstractTableModel):
|
|||||||
self.__col_skip = 2
|
self.__col_skip = 2
|
||||||
self.__getData(criterion, criterion == 'Erledigt', False, criterion == 'Alle')
|
self.__getData(criterion, criterion == 'Erledigt', False, criterion == 'Alle')
|
||||||
|
|
||||||
def data(self, index, role=Qt.DisplayRole):
|
def data(self, index, role=Qt.ItemDataRole.DisplayRole):
|
||||||
if role == Qt.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
row = self.__data[index.row()]
|
row = self.__data[index.row()]
|
||||||
applicant_col = index.column() + self.__col_skip
|
applicant_col = index.column() + self.__col_skip
|
||||||
tr = row[
|
tr = row[applicant_col]
|
||||||
applicant_col] # if type(row[index.column() + 2]) is str else str(row[index.column() + 2], "utf-8")
|
|
||||||
if applicant_col == 2 and self.__everyone:
|
if applicant_col == 2 and self.__everyone:
|
||||||
tr = 'Ja' if tr == 1 else 'Nein'
|
tr = 'Ja' if tr == 1 else 'Nein'
|
||||||
else:
|
else:
|
||||||
if tr:
|
if tr:
|
||||||
tr = re.sub("Keine Angabe ", "", tr)
|
tr = re.sub("Keine Angabe ", "", tr)
|
||||||
# print(f"Data: {tr}")
|
|
||||||
# return row[index.column() + 2]
|
|
||||||
return tr
|
return tr
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def headerData(self, section, orientation, role=Qt.DisplayRole):
|
def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
|
||||||
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
|
if orientation == Qt.Orientation.Horizontal and role == Qt.ItemDataRole.DisplayRole:
|
||||||
self.__col_name = self.__visible_columns[section + self.__col_skip]
|
self.__col_name = self.__visible_columns[section + self.__col_skip]
|
||||||
return self.__col_name
|
return self.__col_name
|
||||||
return super().headerData(section, orientation, role)
|
return super().headerData(section, orientation, role)
|
||||||
|
|
||||||
@Slot(int)
|
|
||||||
def onRowClicked(self, row):
|
|
||||||
# print(self.__data)
|
|
||||||
print(f"Selected table row: {row}, corresponding DB ID: {self.__data[row][0]}")
|
|
||||||
# if not self.__employee_dict['employee'] or self.__data[row][0] != self.__employee_dict['employee']['id']:
|
|
||||||
# self.__employee = self.__employee_dao.getEmployee(self.__data[row][0], self.__key)
|
|
||||||
# print(self.__business)
|
|
||||||
# self.__getEmployeeInfo()
|
|
||||||
# self.__getContactInfo()
|
|
||||||
# print(self.__business_dict)
|
|
||||||
|
|||||||
@@ -1,17 +1,14 @@
|
|||||||
from .DbManager import DbManager
|
|
||||||
import json
|
import json
|
||||||
import mariadb
|
import mariadb
|
||||||
from PySide6.QtCore import QObject, Signal
|
from PySide6.QtCore import QObject, Signal
|
||||||
# from ..PyqcrmFlags import PyqcrmAppliEmpyFlags
|
from lib.domain.BaseModel import database
|
||||||
|
|
||||||
|
|
||||||
class ObjectDAO(QObject):
|
class ObjectDAO(QObject):
|
||||||
newObjectAdded = Signal(bool, int)
|
newObjectAdded = Signal(bool, int)
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
#print(f"*** File: {__file__}, __init__()")
|
self.__con = database.connection()
|
||||||
self.__con = DbManager().getConnection()
|
|
||||||
if self.__con:
|
if self.__con:
|
||||||
self.__cur = self.__con.cursor()
|
self.__cur = self.__con.cursor()
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot, Signal
|
from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot, Signal
|
||||||
from .ObjectDAO import ObjectDAO
|
from .ObjectDAO import ObjectDAO
|
||||||
from ..ConfigLoader import ConfigLoader
|
from ..ConfigLoader import ConfigLoader
|
||||||
from ..PyqcrmDataRoles import PyqcrmDataRoles
|
|
||||||
import re
|
import re
|
||||||
import json
|
import json
|
||||||
|
|
||||||
@@ -23,7 +22,7 @@ class ObjectModel(QAbstractTableModel):
|
|||||||
super().__init__()
|
super().__init__()
|
||||||
self.__object_dao = ObjectDAO()
|
self.__object_dao = ObjectDAO()
|
||||||
self.__object_dao.newObjectAdded.connect(self.__refreshView)
|
self.__object_dao.newObjectAdded.connect(self.__refreshView)
|
||||||
self.__conf = ConfigLoader().getConfig()
|
self.__conf = ConfigLoader().get_config()
|
||||||
self.__key = self.__conf['pyqcrm']['ENCRYPTION_KEY']
|
self.__key = self.__conf['pyqcrm']['ENCRYPTION_KEY']
|
||||||
self.__object_dao.newObjectAdded.connect(self.objectAdded)
|
self.__object_dao.newObjectAdded.connect(self.objectAdded)
|
||||||
self.__getData()
|
self.__getData()
|
||||||
@@ -67,16 +66,8 @@ class ObjectModel(QAbstractTableModel):
|
|||||||
if object_col > 4 and tr:
|
if object_col > 4 and tr:
|
||||||
tr = re.sub("Keine Angabe ","", tr)
|
tr = re.sub("Keine Angabe ","", tr)
|
||||||
return tr
|
return tr
|
||||||
elif role == PyqcrmDataRoles.STREET_IN_POSTCODE:
|
|
||||||
pass
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def roleNames(self):
|
|
||||||
return {
|
|
||||||
Qt.DisplayRole: b"display",
|
|
||||||
PyqcrmDataRoles.STREET_IN_POSTCODE: b"StreetInPostcode",
|
|
||||||
}
|
|
||||||
|
|
||||||
def headerData(self, section, orientation, role = Qt.DisplayRole):
|
def headerData(self, section, orientation, role = Qt.DisplayRole):
|
||||||
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
|
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
|
||||||
self.__col_name = self.__visible_columns[section + self.__col_skip]
|
self.__col_name = self.__visible_columns[section + self.__col_skip]
|
||||||
|
|||||||
@@ -1,20 +1,21 @@
|
|||||||
# This Python file uses the following encoding: utf-8
|
# This Python file uses the following encoding: utf-8
|
||||||
from .DbManager import DbManager
|
|
||||||
from ..PyqcrmFlags import PyqcrmFlags
|
from ..PyqcrmFlags import PyqcrmFlags
|
||||||
import mariadb
|
import mariadb
|
||||||
from PySide6.QtCore import QObject, Signal
|
from PySide6.QtCore import QObject, Signal
|
||||||
|
from lib.domain.BaseModel import database
|
||||||
|
|
||||||
|
|
||||||
class UserDAO(QObject):
|
class UserDAO(QObject):
|
||||||
noDbConnection = Signal(str)
|
noDbConnection = Signal(str)
|
||||||
__cursor = None
|
__cursor = None
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
#print(f"*** File: {__file__}, init()")
|
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.__con = DbManager().getConnection()
|
self.__con = database.connection()
|
||||||
if self.__con:
|
if self.__con:
|
||||||
self.__cur = self.__con.cursor()
|
self.__cur = self.__con.cursor()
|
||||||
|
|
||||||
def createUser(self, username, password, info, role= PyqcrmFlags.USER):
|
def createUser(self, username, password, info, role=PyqcrmFlags.USER):
|
||||||
user_created = False
|
user_created = False
|
||||||
try:
|
try:
|
||||||
if self.__cur:
|
if self.__cur:
|
||||||
@@ -39,6 +40,3 @@ class UserDAO(QObject):
|
|||||||
except mariadb.Error as e:
|
except mariadb.Error as e:
|
||||||
print(str(e))
|
print(str(e))
|
||||||
self.noDbConnection.emit(str(e))
|
self.noDbConnection.emit(str(e))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,35 +1,28 @@
|
|||||||
from .DbManager import DbManager
|
from PySide6.QtCore import Slot, QObject, Signal
|
||||||
|
|
||||||
|
from lib.domain.BaseModel import database
|
||||||
|
from .UserDAO import UserDAO
|
||||||
from ..PyqcrmFlags import PyqcrmFlags
|
from ..PyqcrmFlags import PyqcrmFlags
|
||||||
from ..Vermasseln import Vermasseln
|
from ..Vermasseln import Vermasseln
|
||||||
#from PySide6.QtMultimedia import QMediaPlayer, QAudioOutput : Not working well with Nuitka
|
|
||||||
import soundfile as sf
|
|
||||||
import sounddevice as sd
|
|
||||||
from .UserDAO import UserDAO
|
|
||||||
from PySide6.QtCore import Slot, QObject, Signal, QUrl, QFile
|
|
||||||
import tempfile
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class UserManager(QObject):
|
class UserManager(QObject):
|
||||||
|
|
||||||
loginOkay = Signal()
|
loginOkay = Signal()
|
||||||
noDbConnection = Signal(str)
|
noDbConnection = Signal(str)
|
||||||
|
|
||||||
def __init__(self, user_config = None, role = None):
|
def __init__(self, user_config=None, role=None):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.__con = DbManager().getConnection()
|
self.__con = database.connection()
|
||||||
self.__user_dao = UserDAO()
|
self.__user_dao = UserDAO()
|
||||||
self.__user_dao.noDbConnection.connect(self.noDbConnection)
|
self.__user_dao.noDbConnection.connect(self.noDbConnection)
|
||||||
if self.__con:
|
if self.__con:
|
||||||
self.__cur = self.__con.cursor()
|
self.__cur = self.__con.cursor()
|
||||||
if user_config and role:
|
if user_config and role:
|
||||||
|
|
||||||
self.__username = user_config["PYQCRM_USER"]
|
self.__username = user_config["PYQCRM_USER"]
|
||||||
self.__password = user_config["PYQCRM_USER_PASS"]
|
self.__password = user_config["PYQCRM_USER_PASS"]
|
||||||
self.__info = user_config["PYQCRM_USER_INFO"]
|
self.__info = user_config["PYQCRM_USER_INFO"]
|
||||||
self.__role = role if role == PyqcrmFlags.ADMIN else 0
|
self.__role = role if role == PyqcrmFlags.ADMIN else 0
|
||||||
|
|
||||||
|
|
||||||
def createUser(self):
|
def createUser(self):
|
||||||
self.__hashPassword()
|
self.__hashPassword()
|
||||||
user_created = self.__user_dao.createUser(self.__username, self.__password, self.__info, self.__role)
|
user_created = self.__user_dao.createUser(self.__username, self.__password, self.__info, self.__role)
|
||||||
@@ -64,25 +57,6 @@ class UserManager(QObject):
|
|||||||
user = self.__user_dao.getUser(username)
|
user = self.__user_dao.getUser(username)
|
||||||
if user:
|
if user:
|
||||||
self.__checkPassword(password, user[2])
|
self.__checkPassword(password, user[2])
|
||||||
else:
|
|
||||||
fail_src = ":/sounds/fail2c.ogg"
|
|
||||||
with tempfile.NamedTemporaryFile(suffix='.ogg') as ogg_file:
|
|
||||||
failure_sound = QFile(fail_src)
|
|
||||||
if not failure_sound.open(QFile.ReadOnly):
|
|
||||||
print(f"Failed to open resource file: {fail_src}")
|
|
||||||
else:
|
|
||||||
ogg_file.write(failure_sound.readAll())
|
|
||||||
ogg_path = ogg_file.name
|
|
||||||
fail, samplerate = sf.read(ogg_path)
|
|
||||||
sd.play(fail, samplerate)
|
|
||||||
|
|
||||||
### Not working with Nuitka
|
|
||||||
# player = QMediaPlayer(self)
|
|
||||||
# audioOutput = QAudioOutput(self)
|
|
||||||
# player.setAudioOutput(audioOutput)
|
|
||||||
# player.setSource(QUrl("qrc:/sounds/fail2c.ogg"))
|
|
||||||
# audioOutput.setVolume(150)
|
|
||||||
# player.play()
|
|
||||||
|
|
||||||
def __checkPassword(self, password, hash_password):
|
def __checkPassword(self, password, hash_password):
|
||||||
pw_list = hash_password.split("$")
|
pw_list = hash_password.split("$")
|
||||||
@@ -90,6 +64,3 @@ class UserManager(QObject):
|
|||||||
hash_pw = Vermasseln.userPasswordHash(password, pw_list[0])
|
hash_pw = Vermasseln.userPasswordHash(password, pw_list[0])
|
||||||
if hash_password == hash_pw:
|
if hash_password == hash_pw:
|
||||||
self.loginOkay.emit()
|
self.loginOkay.emit()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,5 @@ from enum import IntEnum
|
|||||||
|
|
||||||
class PyqcrmDataRoles(IntEnum):
|
class PyqcrmDataRoles(IntEnum):
|
||||||
CITY_ROLE = Qt.UserRole + 100
|
CITY_ROLE = Qt.UserRole + 100
|
||||||
STREET_IN_POSTCODE = CITY_ROLE + 1
|
|
||||||
COUNTRY_ROLE = CITY_ROLE + 100
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,59 +1,16 @@
|
|||||||
"""! @brief Defines the encryption class."""
|
# This Python file uses the following encoding: utf-8
|
||||||
##
|
|
||||||
# @file Vermasseln.py
|
|
||||||
#
|
|
||||||
# @brief Defines the Vermasseln class.
|
|
||||||
#
|
|
||||||
# @section description_vermasseln Description
|
|
||||||
# Defines the base class for the program encryption mechansim.
|
|
||||||
# - Vermasseln (base class)
|
|
||||||
#
|
|
||||||
# @section libraries_configloader Libraries/Modules
|
|
||||||
# - <a href="https://docs.python.org/3/library/platform.html">platform</a> Python standard library
|
|
||||||
# - Access to underlying platform’s identifying data.
|
|
||||||
# - <a href="https://docs.python.org/3/library/base64.html">base64</a> Python standard library
|
|
||||||
# - Provides functions for encoding binary data to printable ASCII characters and decoding such encodings back to binary data.
|
|
||||||
# - <a href="https://docs.python.org/3/library/random.html">random</a> Python module
|
|
||||||
# - Implements pseudo-random number generators for various distributions.
|
|
||||||
# - <a href="https://docs.python.org/3/library/string.html">string</a> Python standard library
|
|
||||||
# - Common string operations.
|
|
||||||
# - <a href="https://pycryptodome.readthedocs.io/en/latest/src/api.html">Crypto</a> Python package
|
|
||||||
# - Provides cryptographic functionalities.
|
|
||||||
#
|
|
||||||
# @section notes_vermasseln Notes
|
|
||||||
# - None.
|
|
||||||
#
|
|
||||||
# @section todo_vermasseln TODO
|
|
||||||
# - None.
|
|
||||||
#
|
|
||||||
# @section author_vermasseln Author(s)
|
|
||||||
# - Created by Linuxero on 03/14/2025.
|
|
||||||
# - Modified by Linuxero on 03/14/2025.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2025 Schnaxero. All rights reserved.
|
|
||||||
|
|
||||||
from Crypto.Cipher import AES
|
from Crypto.Cipher import AES
|
||||||
from base64 import b64encode, b64decode
|
from base64 import b64encode, b64decode
|
||||||
import platform
|
import platform
|
||||||
import bcrypt
|
|
||||||
from Crypto.Hash import SHA256, SHA3_512
|
from Crypto.Hash import SHA256, SHA3_512
|
||||||
# from Crypto.Protocol.KDF import PBKDF2
|
from Crypto.Protocol.KDF import PBKDF2
|
||||||
# from Crypto.Random import get_random_bytes
|
from Crypto.Random import get_random_bytes
|
||||||
import random
|
import random
|
||||||
import string
|
import string
|
||||||
|
|
||||||
|
|
||||||
class Vermasseln:
|
class Vermasseln:
|
||||||
"""! The Vermasseln class.
|
|
||||||
Defines the class utilized by different parts of the program.
|
|
||||||
Handles the encryption/decryption of the whole program.
|
|
||||||
"""
|
|
||||||
def oscarVermasseln(self, data, local= True):
|
def oscarVermasseln(self, data, local= True):
|
||||||
"""! Encrypts data.
|
|
||||||
@param data The data to encrypt.
|
|
||||||
@param local Is the encryption local to the host or not?
|
|
||||||
@return encrypted data.
|
|
||||||
"""
|
|
||||||
b_data = data.encode("utf-8")
|
b_data = data.encode("utf-8")
|
||||||
cipher = self.__vermasslungsKobold(local)
|
cipher = self.__vermasslungsKobold(local)
|
||||||
|
|
||||||
@@ -64,11 +21,6 @@ class Vermasseln:
|
|||||||
return storable_data
|
return storable_data
|
||||||
|
|
||||||
def entschluesseln(self, data, local = True):
|
def entschluesseln(self, data, local = True):
|
||||||
"""! Decrypts data.
|
|
||||||
@param data The data to decrypt.
|
|
||||||
@param local Is the encryption local to the host or not?
|
|
||||||
@return decrypted data on success, None on failure.
|
|
||||||
"""
|
|
||||||
try:
|
try:
|
||||||
data_list = data.split(".")
|
data_list = data.split(".")
|
||||||
encoded_data = [b64decode(x) for x in data_list]
|
encoded_data = [b64decode(x) for x in data_list]
|
||||||
@@ -86,10 +38,6 @@ class Vermasseln:
|
|||||||
return decrypted_data
|
return decrypted_data
|
||||||
|
|
||||||
def __vermasslungsKobold(self, local = True):
|
def __vermasslungsKobold(self, local = True):
|
||||||
"""! Prepares the encryption key.
|
|
||||||
@param local Is the encryption local to the host or not?
|
|
||||||
@return encryption key.
|
|
||||||
"""
|
|
||||||
key = platform.processor().encode("utf-8") if local else b"(==daniishtverhaftetwegensexy#)"
|
key = platform.processor().encode("utf-8") if local else b"(==daniishtverhaftetwegensexy#)"
|
||||||
key = key[0:31]
|
key = key[0:31]
|
||||||
hash_key = SHA256.new(key)
|
hash_key = SHA256.new(key)
|
||||||
@@ -100,11 +48,6 @@ class Vermasseln:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def userPasswordHash(self, password, salt = None):
|
def userPasswordHash(self, password, salt = None):
|
||||||
"""! Hashes data.
|
|
||||||
@param password The data to hash.
|
|
||||||
@param salt The salt to use if available.
|
|
||||||
@return hashed data.
|
|
||||||
"""
|
|
||||||
if not salt:
|
if not salt:
|
||||||
salt = "".join(random.choice(string.ascii_letters + string.digits) for i in range (32))
|
salt = "".join(random.choice(string.ascii_letters + string.digits) for i in range (32))
|
||||||
hash_pw = (salt + password).encode("utf-8")
|
hash_pw = (salt + password).encode("utf-8")
|
||||||
|
|||||||
44
lib/domain/Applicant.py
Normal file
44
lib/domain/Applicant.py
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
from peewee import CharField, UUIDField, SmallIntegerField, TextField, ForeignKeyField, JOIN
|
||||||
|
|
||||||
|
from lib.domain.Town import Town
|
||||||
|
from lib.domain.BaseModel import BaseModel
|
||||||
|
from lib.domain.ZipCode import ZipCode
|
||||||
|
|
||||||
|
|
||||||
|
class Applicant(BaseModel):
|
||||||
|
class Meta:
|
||||||
|
table_name = "applicants"
|
||||||
|
|
||||||
|
id = UUIDField(primary_key=True)
|
||||||
|
title = SmallIntegerField(default=0)
|
||||||
|
first_name = CharField(null=False)
|
||||||
|
last_name = CharField(null=False)
|
||||||
|
street = CharField()
|
||||||
|
house_number = CharField()
|
||||||
|
zip_code = ForeignKeyField(ZipCode, column_name="zip_code", null=True)
|
||||||
|
phone_number = CharField()
|
||||||
|
mobile_number = CharField()
|
||||||
|
email_address = CharField()
|
||||||
|
salutation = TextField(null=False)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def select_table_data(cls, search_query: str):
|
||||||
|
return (
|
||||||
|
Applicant
|
||||||
|
.select(
|
||||||
|
Applicant.id,
|
||||||
|
Applicant.first_name,
|
||||||
|
Applicant.last_name,
|
||||||
|
ZipCode.id,
|
||||||
|
ZipCode.zip_code,
|
||||||
|
Town.town
|
||||||
|
)
|
||||||
|
.join(ZipCode, join_type="LEFT JOIN")
|
||||||
|
.join(Town, join_type="LEFT JOIN")
|
||||||
|
.where(
|
||||||
|
(Applicant.first_name.contains(search_query)) |
|
||||||
|
(Applicant.last_name.contains(search_query)) |
|
||||||
|
(ZipCode.zip_code.contains(search_query)) |
|
||||||
|
(Town.town.contains(search_query))
|
||||||
|
)
|
||||||
|
)
|
||||||
22
lib/domain/BaseModel.py
Normal file
22
lib/domain/BaseModel.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
from peewee import Model, MySQLDatabase
|
||||||
|
|
||||||
|
from lib.Config import DatabaseConfig
|
||||||
|
|
||||||
|
database: MySQLDatabase = MySQLDatabase(None)
|
||||||
|
|
||||||
|
|
||||||
|
def init_database_from_config(config: DatabaseConfig):
|
||||||
|
database.init(
|
||||||
|
host=config['DB_HOST'],
|
||||||
|
user=config['DB_USER'],
|
||||||
|
password=config['DB_PASS'],
|
||||||
|
database=config['DB_NAME'],
|
||||||
|
port=int(config['DB_PORT']),
|
||||||
|
connect_timeout=5,
|
||||||
|
)
|
||||||
|
database.connect()
|
||||||
|
|
||||||
|
|
||||||
|
class BaseModel(Model):
|
||||||
|
class Meta:
|
||||||
|
database = database
|
||||||
14
lib/domain/Country.py
Normal file
14
lib/domain/Country.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
from peewee import AutoField, CharField
|
||||||
|
|
||||||
|
from lib.domain.BaseModel import BaseModel
|
||||||
|
|
||||||
|
|
||||||
|
class Country(BaseModel):
|
||||||
|
class Meta:
|
||||||
|
table_name = "country"
|
||||||
|
id = AutoField(column_name="countryid")
|
||||||
|
name = CharField(max_length=200, unique=True)
|
||||||
|
name_short = CharField(max_length=100, column_name="countryshort")
|
||||||
|
nationality = CharField(max_length=100)
|
||||||
|
iso2 = CharField(max_length=2, unique=True)
|
||||||
|
iso3 = CharField(max_length=3, unique=True)
|
||||||
12
lib/domain/Town.py
Normal file
12
lib/domain/Town.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
from peewee import AutoField, CharField, ForeignKeyField
|
||||||
|
|
||||||
|
from lib.domain.BaseModel import BaseModel
|
||||||
|
from lib.domain.Country import Country
|
||||||
|
|
||||||
|
|
||||||
|
class Town(BaseModel):
|
||||||
|
class Meta:
|
||||||
|
table_name = "address"
|
||||||
|
id = AutoField(column_name="addressid")
|
||||||
|
town = CharField(max_length=50, column_name="city")
|
||||||
|
country = ForeignKeyField(Country, column_name="countryid", backref="towns")
|
||||||
13
lib/domain/ZipCode.py
Normal file
13
lib/domain/ZipCode.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
from peewee import AutoField, CharField, ForeignKeyField
|
||||||
|
|
||||||
|
from lib.domain.BaseModel import BaseModel
|
||||||
|
from lib.domain.Town import Town
|
||||||
|
|
||||||
|
|
||||||
|
class ZipCode(BaseModel):
|
||||||
|
class Meta:
|
||||||
|
table_name = "postcode"
|
||||||
|
|
||||||
|
id = AutoField(column_name="postcodeid")
|
||||||
|
zip_code = CharField(max_length=15, column_name="postcode")
|
||||||
|
town = ForeignKeyField(Town, backref="zip_codes", column_name="addressid")
|
||||||
145
main.py
145
main.py
@@ -1,173 +1,82 @@
|
|||||||
# # !/home/linuxero/proj/tero/pyqcrm/.qtcreator/venv-3.13.1/bin/python3
|
# # !/home/linuxero/proj/tero/pyqcrm/.qtcreator/venv-3.13.1/bin/python3
|
||||||
"""! @brief CRM for cleaning services written in Python, PySide6 and QtQuick."""
|
|
||||||
##
|
|
||||||
# @mainpage PYQCRM - Qt for Python CRM
|
|
||||||
#
|
|
||||||
# @section description_main Description
|
|
||||||
# A CRM program for digitally manageing the business of cleaning
|
|
||||||
# services company.
|
|
||||||
#
|
|
||||||
# @section notes_main Notes
|
|
||||||
# - The project is built using QtCreator 6.8.x
|
|
||||||
# - Minimum Python version 3.13.x
|
|
||||||
# - PySide6
|
|
||||||
#
|
|
||||||
# Copyright (c) 2025 Schnaxero. All rights reserved.
|
|
||||||
##
|
|
||||||
# @file main.py
|
|
||||||
#
|
|
||||||
# @brief Main entry point of the program
|
|
||||||
#
|
|
||||||
# @section description_pyqcrm Description
|
|
||||||
# Initialization of the program goes here. Various global functions called from the entry point.
|
|
||||||
# The GUI application is set up and started here.
|
|
||||||
#
|
|
||||||
# @section libraries_main Libraries/Modules
|
|
||||||
# - <a href="https://docs.python.org/3/library/os.html">os</a> standard library
|
|
||||||
# - Access to environ, a mapping object of keys and values to set an environment variable.
|
|
||||||
# - <a href="https://docs.python.org/3/library/sys.html">sys</a> standard library
|
|
||||||
# - Access to argv and system functions.
|
|
||||||
# - <a href="https://docs.python.org/3/library/logging.html">logging</a> standard library
|
|
||||||
# - Access to logging functions.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtNetwork/QLocalServer.html">QLocalServer</a> PySide6 class
|
|
||||||
# - Provides a local socket based server.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtNetwork/QLocalSocket.html">QLocalSocket</a> PySide6 class
|
|
||||||
# - Provides a local socket.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QSystemTrayIcon.html">QSystemTrayIcon</a> PySide6 class
|
|
||||||
# - Provides an icon for the application in the system tray.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtGui/QIcon.html">QIcon</a> PySide6 class
|
|
||||||
# - Provides scalable icons in different modes and states.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtGui/QGuiApplication.html">QGuiApplication</a> PySide6 class
|
|
||||||
# - Manages the GUI application’s control flow and main settings.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtQml/QQmlApplicationEngine.html">QQmlApplicationEngine</a> PySide6 class
|
|
||||||
# - Provides a convenient way to load an application from a single QML file.
|
|
||||||
# - <a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QIODevice.html">QIODevice</a> PySide6 class
|
|
||||||
# - Base interface class of all I/O devices in Qt.
|
|
||||||
# - lib module (local)
|
|
||||||
# - Backbone classes to run the program.
|
|
||||||
#
|
|
||||||
# @section notes_pyqcrm Notes
|
|
||||||
# - Install dependencies (See requirements.txt).
|
|
||||||
#
|
|
||||||
# @section todo_pyqcrm TODO
|
|
||||||
# - A lot of nice-to-haves.
|
|
||||||
#
|
|
||||||
# @section author_pyqcrm Author(s)
|
|
||||||
# - Created by Linuxero on 03/14/2025.
|
|
||||||
# - Modified by Linuxero on 03/14/2025.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2025 Schnaxero. All rights reserved.
|
|
||||||
# Imports
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import logging
|
# noinspection PyUnresolvedReferences
|
||||||
from PySide6.QtNetwork import QLocalServer, QLocalSocket
|
|
||||||
from PySide6.QtWidgets import QSystemTrayIcon
|
|
||||||
from PySide6.QtGui import QGuiApplication, QIcon
|
|
||||||
from PySide6.QtQml import QQmlApplicationEngine
|
|
||||||
from PySide6.QtCore import QIODevice
|
|
||||||
from lib.ConfigLoader import ConfigLoader
|
|
||||||
from lib.DB.BusinessModel import BusinessModel
|
|
||||||
import rc_pyqcrm
|
import rc_pyqcrm
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
import rc_qml
|
import rc_qml
|
||||||
from lib.DB.DbManager import DbManager
|
|
||||||
from lib.DB.UserManager import UserManager
|
from PySide6.QtCore import QIODevice
|
||||||
|
from PySide6.QtGui import QGuiApplication, QIcon
|
||||||
|
from PySide6.QtNetwork import QLocalServer, QLocalSocket
|
||||||
|
from PySide6.QtQml import QQmlApplicationEngine
|
||||||
|
from PySide6.QtWidgets import QSystemTrayIcon
|
||||||
|
|
||||||
|
from lib.ConfigLoader import ConfigLoader
|
||||||
from lib.DB.AddressModel import AddressModel
|
from lib.DB.AddressModel import AddressModel
|
||||||
|
from lib.DB.ApplicantModel import ApplicantModel
|
||||||
from lib.DB.BTypeModel import BTypeModel
|
from lib.DB.BTypeModel import BTypeModel
|
||||||
|
from lib.DB.BusinessModel import BusinessModel
|
||||||
from lib.DB.ContactModel import ContactModel
|
from lib.DB.ContactModel import ContactModel
|
||||||
from lib.DB.EmployeeModel import EmployeeModel
|
from lib.DB.EmployeeModel import EmployeeModel
|
||||||
from lib.DB.ObjectModel import ObjectModel
|
from lib.DB.ObjectModel import ObjectModel
|
||||||
|
from lib.DB.UserManager import UserManager
|
||||||
from lib.Printers import Printers
|
from lib.Printers import Printers
|
||||||
|
from lib.domain.BaseModel import database, init_database_from_config
|
||||||
|
|
||||||
# Environment settings
|
|
||||||
## Allow local file read.
|
|
||||||
os.environ['QML_XHR_ALLOW_FILE_READ'] = '1'
|
os.environ['QML_XHR_ALLOW_FILE_READ'] = '1'
|
||||||
|
|
||||||
# [pyqcrm]
|
|
||||||
# program-name=""
|
|
||||||
# version=
|
|
||||||
|
|
||||||
# [database]
|
|
||||||
# server=""
|
|
||||||
# port=
|
|
||||||
# user=""
|
|
||||||
# password=""
|
|
||||||
# name=""
|
|
||||||
# type=""
|
|
||||||
|
|
||||||
# Global Constants
|
|
||||||
## Configuration availability.
|
|
||||||
bad_config = False
|
bad_config = False
|
||||||
|
|
||||||
## Database connection available.
|
|
||||||
db_con = False
|
db_con = False
|
||||||
|
|
||||||
## The model class for address manipulation.
|
|
||||||
address_model = None
|
address_model = None
|
||||||
|
applicant_model = None
|
||||||
## The model class for customer manipulation.
|
|
||||||
business_model = None
|
business_model = None
|
||||||
|
|
||||||
## The model class for customer type manipulation.
|
|
||||||
business_type = None
|
business_type = None
|
||||||
|
|
||||||
## The model class for contact manipulation.
|
|
||||||
contact_model = None
|
contact_model = None
|
||||||
|
|
||||||
## The model class for employee manipulation.
|
|
||||||
employee_model = None
|
employee_model = None
|
||||||
|
|
||||||
## The model class for object manipulation.
|
|
||||||
object_model = None
|
object_model = None
|
||||||
|
|
||||||
## The class of available printers on the system.
|
|
||||||
printers = None
|
printers = None
|
||||||
|
|
||||||
## The logged-in user.
|
|
||||||
user = None
|
user = None
|
||||||
|
|
||||||
# Functions
|
|
||||||
def initializeProgram():
|
def initializeProgram():
|
||||||
"""! Initializes the program."""
|
global address_model, applicant_model, bad_config, business_model, user, business_type, contact_model, employee_model, object_model, db_con, printers
|
||||||
print(f"In {__file__} file, initializeProgram()")
|
|
||||||
global address_model, bad_config, business_model, user, business_type, contact_model, employee_model, object_model, db_con, printers
|
|
||||||
if not bad_config:
|
if not bad_config:
|
||||||
dbconf = config.getConfig()['database']
|
init_database_from_config(config.get_config()['database'])
|
||||||
DbManager(dbconf)
|
|
||||||
printers = Printers()
|
printers = Printers()
|
||||||
if DbManager().getConnection():
|
if not database.is_closed():
|
||||||
db_con = True
|
db_con = True
|
||||||
user = UserManager()
|
user = UserManager()
|
||||||
business_model = BusinessModel()
|
business_model = BusinessModel()
|
||||||
address_model = AddressModel()
|
address_model = AddressModel()
|
||||||
|
applicant_model = ApplicantModel()
|
||||||
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()
|
||||||
|
|
||||||
|
|
||||||
def configReady():
|
def configReady():
|
||||||
"""! Slot to respond to the validity of the configuration."""
|
|
||||||
global bad_config
|
global bad_config
|
||||||
bad_config = False
|
bad_config = False
|
||||||
initializeProgram()
|
initializeProgram()
|
||||||
|
|
||||||
|
|
||||||
def publishContext():
|
def publishContext():
|
||||||
"""! Connect necessary modules to the QML GUI."""
|
global engine, address_model, applicant_model, bad_config, business_model, user, business_type, contact_model, object_model, employee_model, printers
|
||||||
# print(f"In {__file__} file, publishContext()")
|
|
||||||
global engine, address_model, bad_config, business_model, user, business_type, contact_model, object_model, employee_model, printers
|
|
||||||
engine.rootContext().setContextProperty("loggedin_user", user)
|
engine.rootContext().setContextProperty("loggedin_user", user)
|
||||||
engine.rootContext().setContextProperty("business_model", business_model)
|
engine.rootContext().setContextProperty("business_model", business_model)
|
||||||
engine.rootContext().setContextProperty("address_model", address_model)
|
engine.rootContext().setContextProperty("address_model", address_model)
|
||||||
|
engine.rootContext().setContextProperty("applicantModel", applicant_model)
|
||||||
engine.rootContext().setContextProperty("business_type", business_type)
|
engine.rootContext().setContextProperty("business_type", business_type)
|
||||||
engine.rootContext().setContextProperty("contact_model", contact_model)
|
engine.rootContext().setContextProperty("contact_model", contact_model)
|
||||||
engine.rootContext().setContextProperty("employee_model", employee_model)
|
engine.rootContext().setContextProperty("employee_model", employee_model)
|
||||||
engine.rootContext().setContextProperty("object_model", object_model)
|
engine.rootContext().setContextProperty("object_model", object_model)
|
||||||
|
|
||||||
# Entry point of the program
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
#QResource.registerResource("rc_qml.py")
|
|
||||||
app = QGuiApplication(sys.argv)
|
app = QGuiApplication(sys.argv)
|
||||||
engine = QQmlApplicationEngine()
|
engine = QQmlApplicationEngine()
|
||||||
|
|
||||||
@@ -187,7 +96,7 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
qml_file = "qrc:/Gui/main.qml"
|
qml_file = "qrc:/Gui/main.qml"
|
||||||
|
|
||||||
icon = QIcon(":/images/tero.jpg")
|
icon = QIcon("qrc:/images/tero.jpg")
|
||||||
app.setWindowIcon(icon)
|
app.setWindowIcon(icon)
|
||||||
|
|
||||||
tray = QSystemTrayIcon()
|
tray = QSystemTrayIcon()
|
||||||
@@ -196,7 +105,7 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
config = ConfigLoader()
|
config = ConfigLoader()
|
||||||
|
|
||||||
if not config.getConfig():
|
if not config.get_config():
|
||||||
bad_config = True
|
bad_config = True
|
||||||
config.configurationReady.connect(configReady)
|
config.configurationReady.connect(configReady)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
"lib/DB/BusinessModel.py",
|
"lib/DB/BusinessModel.py",
|
||||||
"pyqcrm.qrc",
|
"pyqcrm.qrc",
|
||||||
"qml.qrc",
|
"qml.qrc",
|
||||||
"lib/DB/DbManager.py",
|
|
||||||
"lib/DB/UserManager.py",
|
"lib/DB/UserManager.py",
|
||||||
"lib/PyqcrmFlags.py",
|
"lib/PyqcrmFlags.py",
|
||||||
"lib/DB/UserDAO.py",
|
"lib/DB/UserDAO.py",
|
||||||
|
|||||||
@@ -1,180 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE QtCreatorProject>
|
|
||||||
<!-- Written by QtCreator 15.0.0, 2025-02-05T15:48:35. -->
|
|
||||||
<qtcreator>
|
|
||||||
<data>
|
|
||||||
<variable>EnvironmentId</variable>
|
|
||||||
<value type="QByteArray">{6c31db7b-2c94-4111-b0dc-25005cece3f8}</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
|
||||||
<value type="qlonglong">0</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
|
||||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
|
||||||
<value type="QString" key="language">Cpp</value>
|
|
||||||
<valuemap type="QVariantMap" key="value">
|
|
||||||
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
|
||||||
<value type="QString" key="language">QmlJS</value>
|
|
||||||
<valuemap type="QVariantMap" key="value">
|
|
||||||
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
|
|
||||||
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.LineEndingBehavior">0</value>
|
|
||||||
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
|
||||||
<value type="int" key="EditorConfiguration.PreferAfterWhitespaceComments">0</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">2</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
|
||||||
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
|
||||||
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
|
|
||||||
<value type="bool" key="AutoTest.Framework.Boost">true</value>
|
|
||||||
<value type="bool" key="AutoTest.Framework.CTest">false</value>
|
|
||||||
<value type="bool" key="AutoTest.Framework.Catch">true</value>
|
|
||||||
<value type="bool" key="AutoTest.Framework.GTest">true</value>
|
|
||||||
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
|
|
||||||
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="bool" key="AutoTest.ApplyFilter">false</value>
|
|
||||||
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
|
|
||||||
<valuelist type="QVariantList" key="AutoTest.PathFilters"/>
|
|
||||||
<value type="int" key="AutoTest.RunAfterBuild">0</value>
|
|
||||||
<value type="bool" key="AutoTest.UseGlobal">true</value>
|
|
||||||
<valuemap type="QVariantMap" key="ClangTools">
|
|
||||||
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
|
|
||||||
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
|
|
||||||
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
|
|
||||||
<value type="int" key="ClangTools.ParallelJobs">4</value>
|
|
||||||
<value type="bool" key="ClangTools.PreferConfigFile">true</value>
|
|
||||||
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
|
|
||||||
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
|
|
||||||
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
|
|
||||||
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Target.0</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="QString" key="DeviceType">Desktop</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Python 3.13.1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Python 3.13.1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{bd928902-6673-464d-b976-4a1ba0e13d34}</value>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/dstoppek/anaconda3/envs/pyqcrm</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Python.PysideBuildStep</value>
|
|
||||||
<value type="QString" key="Python.PySideProjectTool">/home/dstoppek/anaconda3/envs/pyqcrm/bin/pyside6-project</value>
|
|
||||||
<value type="QString" key="Python.PySideUic">/home/dstoppek/anaconda3/envs/pyqcrm/bin/pyside6-uic</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Erstellen</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Erstellen</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Bereinigen</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Bereinigen</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Python 3.13.1 virtuelle Umgebung</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Python.PySideBuildConfiguration</value>
|
|
||||||
<value type="QString" key="python">/home/dstoppek/anaconda3/envs/pyqcrm/bin/python</value>
|
|
||||||
<value type="QString" key="venv">/home/dstoppek/anaconda3/envs/pyqcrm</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deployment</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deployment</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
|
|
||||||
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
|
||||||
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
|
||||||
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
|
||||||
<valuelist type="QVariantList" key="CustomOutputParsers"/>
|
|
||||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
|
||||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
|
||||||
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
|
|
||||||
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph dwarf,4096 -F 250</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">main.py</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">PythonEditor.RunConfiguration.</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/dstoppek/Coden/Projekte/pyqcrm/main.py</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
|
|
||||||
<value type="QString" key="PythonEditor.RunConfiguation.Script">/home/dstoppek/Coden/Projekte/pyqcrm/main.py</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
|
||||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/dstoppek/Coden/Projekte/pyqcrm</value>
|
|
||||||
<value type="QString" key="RunConfiguration.X11Forwarding">:0</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.TargetCount</variable>
|
|
||||||
<value type="qlonglong">1</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
|
||||||
<value type="int">22</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>Version</variable>
|
|
||||||
<value type="int">22</value>
|
|
||||||
</data>
|
|
||||||
</qtcreator>
|
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
<file>images/ChevronDown.svg</file>
|
<file>images/ChevronDown.svg</file>
|
||||||
<file>images/Funnel.svg</file>
|
<file>images/Funnel.svg</file>
|
||||||
<file>images/Identification-Outline.svg</file>
|
<file>images/Identification-Outline.svg</file>
|
||||||
|
<file>images/InboxArrowDown.svg</file>
|
||||||
<file>images/MagnifyingGlass.svg</file>
|
<file>images/MagnifyingGlass.svg</file>
|
||||||
<file>images/Newspaper-Outline.svg</file>
|
<file>images/Newspaper-Outline.svg</file>
|
||||||
<file>images/Phone.svg</file>
|
<file>images/Phone.svg</file>
|
||||||
@@ -19,14 +20,8 @@
|
|||||||
<file>images/UserCircle.svg</file>
|
<file>images/UserCircle.svg</file>
|
||||||
<file>images/UserGroup-Outline.svg</file>
|
<file>images/UserGroup-Outline.svg</file>
|
||||||
<file>images/Wallet-Outline.svg</file>
|
<file>images/Wallet-Outline.svg</file>
|
||||||
<file>sounds/error.ogg</file>
|
|
||||||
<file>sounds/fail2c.ogg</file>
|
|
||||||
<file>sounds/puzzerr.ogg</file>
|
|
||||||
<file>sounds/sysnotify.ogg</file>
|
|
||||||
<file>sounds/wrong.ogg</file>
|
|
||||||
<file>fonts/RobotoCondensed.otf</file>
|
<file>fonts/RobotoCondensed.otf</file>
|
||||||
<file>README</file>
|
<file>README</file>
|
||||||
<file>LICENSE</file>
|
<file>LICENSE</file>
|
||||||
<file>images/tero.jpg</file>
|
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user