3 Commits

Author SHA256 Message Date
Yuri Becker
76fdc880c7 Implement search 2025-04-24 01:37:09 +02:00
Yuri Becker
45f19d80d0 Use ORM for applicants 2025-04-21 23:45:33 +02:00
Yuri Becker
0ae153617b Fetch applicant from database 2025-04-19 00:55:12 +02:00
104 changed files with 1076 additions and 35880 deletions

2
.gitignore vendored
View File

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

12
.idea/dataSources.xml generated Normal file
View 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>

View File

@@ -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>

View File

@@ -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
View 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
View 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
}
}

View File

@@ -52,6 +52,37 @@ GridLayout
//// 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
{
text: qsTr("PLZ")
@@ -71,11 +102,7 @@ GridLayout
textRole: "display"
popup.height: 300
currentIndex: -1
onCurrentIndexChanged:
{
city.currentIndex = postcode.currentIndex
}
onCurrentIndexChanged: city.currentIndex = postcode.currentIndex
validator: RegularExpressionValidator
{
@@ -104,41 +131,6 @@ GridLayout
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
Label
{
@@ -193,22 +185,7 @@ GridLayout
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
{

View File

@@ -2,7 +2,7 @@ import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import QtQuick.Dialogs
import Js
import "../js/qmldict.js" as JsLib
ColumnLayout
{
@@ -70,13 +70,8 @@ ColumnLayout
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)

View File

@@ -2,8 +2,7 @@ import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import QtQuick.Dialogs
import Js
import "../js/qmldict.js" as JsLib
ColumnLayout
{
@@ -28,13 +27,16 @@ ColumnLayout
Layout.fillHeight: true
spacing: 45
Frame
{
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
AddNewOffer
{
id: newOffer
width: parent.width
}
}
}
@@ -49,17 +51,16 @@ ColumnLayout
}
Button
{
property var new_object: null
id: saveBtn
text: qsTr("Speichern")
// enabled: false
enabled: false
onClicked:
{
// new_object = JsLib.parseForm(newObject)
// new_object['lift'] = new_object['lift'] === 'Ja' ? 1 : 0
// new_object['mezzanin'] = new_object['mezzanin'] === 'Ja' ? 1 : 0
// object_model.addObject(new_object)
}
}
}

View File

@@ -51,15 +51,6 @@ GridLayout
placeholderText: qsTr("Hier Passwort eingeben")
Layout.fillWidth: true
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
{

View File

@@ -3,7 +3,7 @@ import QtQuick.Controls
import QtQuick.Layouts
import QtQuick.Dialogs
import QtCore
import Js
import "../js/qmldict.js" as JsLib

View File

@@ -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
}
}

View File

@@ -1 +0,0 @@
module Customer

View File

@@ -30,28 +30,40 @@ GridLayout
onTextChanged: checkFields()
Layout.columnSpan: 3
}
Label
{
text: qsTr("Land")
text: qsTr("Straße*")
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
{
text: qsTr("PLZ")
@@ -102,40 +114,6 @@ GridLayout
currentIndex: -1
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
{
@@ -276,7 +254,7 @@ GridLayout
}
function checkBusinessField()
{
if (!firmenName.text.trim() || !streetid.text.trim() || !housenoid.text.trim())
if (!firmenName.text.trim() || !streetid.text.trim())
{
return false

View File

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

View File

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

View File

@@ -1,10 +1,11 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Js
import "../../js/qmldict.js" as JsLib
ColumnLayout {
id: colPar
ScrollView
{
function checkFields() {
if (!personalData.checkPersonalField())
saveBtn.enabled = false;
@@ -19,10 +20,6 @@ ScrollView
console.log('failedtoadd');
}
}
ColumnLayout {
id: colPar
Layout.fillHeight: true
Layout.fillWidth: true
@@ -44,9 +41,6 @@ ScrollView
Layout.fillWidth: true
spacing: Dimensions.l
Frame {
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
@@ -105,5 +99,4 @@ ScrollView
}
}
}
}
}

View File

@@ -3,25 +3,34 @@ import QtQuick.Controls.impl
import QtQuick.Layouts
import TeroStyle
ColumnLayout
{
ColumnLayout {
readonly property int fieldM: 235
readonly property int fieldS: 110
readonly property bool valid: city.acceptableInput && email.acceptableInput && firstname.acceptableInput && lastname.acceptableInput && mobile.acceptableInput && phone.acceptableInput && postcode.acceptableInput && formofaddress.acceptableInput && title.acceptableInput
readonly property var value: QtObject
{
readonly property string city: (city.editText ? city.editText : city.currentText) ?? ""
readonly property string email: email.text
readonly property string firstname: firstname.text
readonly property string formofaddress: formofaddress.text
readonly property string houseno: houseno.text
readonly property string lastname: lastname.text
readonly property string mobile: mobile.text
readonly property string phone: phone.text
readonly property string postcode: (postcode.editText ? postcode.editText : postcode.currentText) ?? ""
readonly property string street: street.text
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 var value: QtObject {
readonly property string emailAddress: emailAddress.text ?? ""
readonly property string firstName: firstName.text ?? ""
readonly property string houseNumber: houseNumber.text ?? ""
readonly property string lastName: lastName.text ?? ""
readonly property string mobileNumber: mobileNumber.text ?? ""
readonly property string phoneNumber: phoneNumber.text ?? ""
readonly property string salutation: salutation.text ?? ""
readonly property string street: street.text ?? ""
readonly property string title: title.currentText
readonly property string country: (country.editText ? country.editText : country.currentText) ?? ""
readonly property int zipCode: zipCode.currentIndex
}
function setValue(value) {
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
@@ -43,7 +52,6 @@ ColumnLayout
label: qsTr("Anrede")
ComboBox {
// property string name: "title"
id: title
implicitWidth: fieldM
@@ -52,26 +60,23 @@ ColumnLayout
onCurrentTextChanged: {
switch (title.currentIndex) {
case 1:
formofaddress.text = "Sehr geehrter Herr ";
salutation.text = "Sehr geehrter Herr ";
break;
case 2:
formofaddress.text = "Sehr geehrte Frau ";
salutation.text = "Sehr geehrte Frau ";
break;
default:
formofaddress.text = "Guten Tag ";
salutation.text = "Guten Tag ";
}
}
}
}
Field
{
Field {
label: qsTr("Vorname")
mandatory: true
TextField
{
// property string name: "firstname"
id: firstname
TextField {
id: firstName
implicitWidth: fieldM
placeholderText: qsTr("Max")
@@ -85,8 +90,7 @@ ColumnLayout
mandatory: true
TextField {
// property string name: "lastname"
id: lastname
id: lastName
implicitWidth: fieldM
placeholderText: qsTr("Mustermann")
@@ -99,46 +103,31 @@ ColumnLayout
RowLayout {
spacing: Dimensions.m
Field
{
Field {
label: qsTr("Straße")
mandatory: true
TextField
{
// property string name: "street"
TextField {
id: street
implicitWidth: fieldM
placeholderText: qsTr("Musterstraße")
validator: NotEmptyValidator {
}
}
}
Field
{
mandatory: true
Field {
label: qsTr("Hausnummer")
TextField
{
// property string name: "houseno"
id: houseno
TextField {
id: houseNumber
implicitWidth: fieldS
placeholderText: qsTr("1a")
validator: NotEmptyValidator {
}
}
}
Field
{
Field {
label: qsTr("PLZ")
mandatory: true
ComboBox
{
// property string name: "postcode"
id: postcode
ComboBox {
id: zipCode
currentIndex: -1
editable: true
@@ -147,19 +136,13 @@ ColumnLayout
textRole: "display"
onActivated: currentValue
onCurrentIndexChanged: city.currentIndex = postcode.currentIndex
validator: NotEmptyValidator {}
onCurrentIndexChanged: city.currentIndex = zipCode.currentIndex
}
}
Field
{
Field {
label: qsTr("Ort")
mandatory: true
ComboBox
{
// property string name: "city"
ComboBox {
id: city
currentIndex: -1
@@ -167,25 +150,6 @@ ColumnLayout
implicitWidth: fieldM
model: address_model
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")
TextField {
// property string name: "phone"
id: phone
id: phoneNumber
implicitWidth: fieldM
placeholderText: "+49 1234 567890"
@@ -216,14 +179,11 @@ ColumnLayout
}
}
}
Field
{
Field {
label: qsTr("Mobil")
TextField
{
// property string name: "mobile"
id: mobile
TextField {
id: mobileNumber
implicitWidth: fieldM
placeholderText: "+49 123 4567891011"
@@ -232,14 +192,11 @@ ColumnLayout
}
}
}
Field
{
Field {
label: qsTr("E-Mail Adresse")
TextField
{
// property string name: "email"
id: email
TextField {
id: emailAddress
implicitWidth: fieldM
placeholderText: "tero@example.org"
@@ -248,14 +205,11 @@ ColumnLayout
}
}
}
Field
{
Field {
label: qsTr("Briefanrede")
TextField
{
// property string name: "formofaddress"
id: formofaddress
TextField {
id: salutation
implicitWidth: fieldM
}

View File

@@ -1,27 +1,34 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import TeroStyle
Item
{
property int selectedEmployee: -1
id: emDet
ColumnLayout
{
Label
{
text: qsTr("Ausgewählter Mitarbeiter " + selectedEmployee)
}
ColumnLayout {
property int row: -1
Button
{
text: qsTr("Mitarbeiter zeigen")
onClicked: contentStack.pop()
anchors.fill: parent
spacing: Dimensions.l
onRowChanged: {
if (row !== -1) {
applicantForm.setValue(applicantModel.applicant(row))
}
}
Component.onCompleted:
{
employee_model.onRowClicked(selectedEmployee)
ApplicantForm {
id: applicantForm
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"
}
}
}

View File

@@ -4,6 +4,7 @@ import QtQuick.Controls
import Qt.labs.qmlmodels
ColumnLayout {
anchors.fill: parent
spacing: Dimensions.l
RowLayout {
@@ -11,6 +12,9 @@ ColumnLayout {
spacing: Dimensions.l
SearchBar {
onSubmitted: (query) => {
applicantModel.searchQuery = query
}
}
QuickFilter {
model: ListModel {
@@ -91,7 +95,7 @@ ColumnLayout {
Layout.fillHeight: true
Layout.fillWidth: true
columnSpacing: 2
model: employee_model
model: applicantModel
resizableColumns: true
rowSpacing: 2
selectionBehavior: TableView.SelectRows
@@ -123,9 +127,7 @@ ColumnLayout {
hoverEnabled: true
onClicked: {
contentStack.push("EmployeeDetails.qml", {
selectedEmployee: row
});
contentStack.push("EmployeeDetails.qml", { row });
}
onEntered: {
employeesTable.selectionModel.select(employeesTable.model.index(row, 0), ItemSelectionModel.SelectCurrent | ItemSelectionModel.Rows);

View File

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

View File

@@ -31,14 +31,14 @@ ColumnLayout {
BarButton {
ButtonGroup.group: mainNav
icon.source: "qrc:/images/UserGroup-Outline.svg"
target: "/Gui/Customer/CustomersTable.qml"
target: "/Gui/CustomersTable.qml"
text: qsTr("Kunden")
visible: !onSubPage
}
BarButton {
ButtonGroup.group: mainNav
icon.source: "qrc:/images/BuildingOffice2-Outline.svg"
target: "/Gui/Objects/ObjectsTable.qml"
target: "/Gui/ObjectsTable.qml"
text: qsTr("Objekt")
visible: !onSubPage
}
@@ -52,7 +52,7 @@ ColumnLayout {
BarButton {
ButtonGroup.group: mainNav
icon.source: "qrc:/images/RectangleStack-Outline.svg"
target: "/Gui/Offers/OffersTable.qml"
target: "/Gui/OffersTable.qml"
text: qsTr("Angebote")
visible: !onSubPage
}

View File

@@ -1,7 +1,7 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Js
import "../js/qmldict.js" as JsLib
Frame
{

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,27 +0,0 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
Item
{
property int selectedObject: -1
id: obDet
ColumnLayout
{
Label
{
text: qsTr("Ausgewählter Objekt " + selectedObject)
}
Button
{
text: qsTr("Zurück zu den Objekten")
onClicked: contentStack.pop()
}
}
Component.onCompleted:
{
object_model.onRowClicked(selectedObject)
}
}

View File

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

View File

@@ -1,186 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
ColumnLayout
{
property var availableFilters: [""]
spacing: Dimensions.l
function viewCriterion(criterion)
{
business_model.viewCriterion(criterion.text);
}
function onObjectContactAdded(added)
{
console.log(added)
if (added) object_model.viewCriterion("")
}
Component.onCompleted:
{
contact_model.objectContactAdded.connect(onObjectContactAdded)
// contentStack.pop()
}
RowLayout
{
Layout.fillWidth: true
spacing: Dimensions.l
SearchBar
{
}
QuickFilter {
onSelectedChanged: (name) => {
business_model.viewCriterion(name)
}
model: ListModel {
ListElement {
name: "Alle"
text: qsTr("Alle")
selected: true
}
ListElement {
name: "Aktiv"
text: qsTr("Aktiv")
selected: false
}
ListElement {
name: "Ehemalig"
text: qsTr("Ehemalig")
selected: false
}
ListElement {
name: "Angebote"
text: qsTr("Angebote")
selected: false
}
}
}
Button
{
id: addObjectBtn
icon.source: "qrc:/images/PlusCircle.svg"
text: qsTr("Objekt Hinzufügen")
Layout.alignment: Qt.AlignRight
onClicked: contentStack.push("AddObject.qml")
}
}
ColumnLayout
{
id: tableColumn
Layout.fillWidth: true
Layout.fillHeight: true
Layout.verticalStretchFactor: 1
clip: true
// anchors
// {
// top: searchBar.bottom
// bottom: parent.bottom
// left: parent.left
// right: parent.right
// topMargin: 15
// }
HorizontalHeaderView
{
id: horizontalHeaderview
Layout.fillWidth: true
implicitHeight: 40
movableColumns: true //@disable-check M16
syncView: objectTable
delegate: Rectangle {
color: addObjectBtn.palette.alternateBase
border.color: addObjectBtn.palette.base
implicitHeight: 40
Layout.fillWidth: true
implicitWidth: 1
Text
{
text: model.display
elide: Text.ElideRight
width: parent.width
height: parent.height
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
color: addObjectBtn.palette.text
}
}
}
TableView
{
property real newWidth: 0
id: objectTable
z: 1
// height: tableColumn.height - horizontalHeaderview.height
Layout.fillHeight: true
Layout.fillWidth: true
columnSpacing: 1
rowSpacing: 2
model: object_model
alternatingRows: true
resizableColumns: true // @disable-check M16
selectionBehavior: TableView.SelectRows
ScrollBar.vertical: ScrollBar
{
policy: objectTable.contentHeight > objectTable.height ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff
}
selectionModel: ItemSelectionModel
{
id: obmodel
model: objectTable.model
}
delegate:Rectangle
{
required property bool selected
required property bool current
implicitWidth: objectTable.width / objectTable.columns
implicitHeight: 25
color: selected
? addObjectBtn.palette.highlight //palette.highlight
: (objectTable.alternatingRows && row % 2 !== 0
? addObjectBtn.palette.base // palette.base
: addObjectBtn.palette.alternateBase) //palette.alternateBase)
Text
{
text: (model.display === null || model.display === undefined)? "": model.display
elide: Text.ElideRight
width: parent.width
height: parent.height
verticalAlignment: Text.AlignVCenter
leftPadding: 9 //@d isable-check M16
color: addObjectBtn.palette.text
}
MouseArea
{
property bool hovered: false
id: mouseArea
anchors.fill: parent
hoverEnabled: true
onDoubleClicked:
{
contentStack.push("ObjectDetails.qml", {selectedObject: row});
}
onEntered:
{
objectTable.selectionModel.select(objectTable.model.index(row, 0), ItemSelectionModel.SelectCurrent | ItemSelectionModel.Rows)
}
}
}
}
}
Item {
Layout.fillHeight: true
}
}

View File

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

View File

@@ -45,18 +45,23 @@ ColumnLayout
selected: true
}
ListElement {
name: "Aktiv"
text: qsTr("Aktiv")
name: "Interessent"
text: qsTr("Interessent")
selected: false
}
ListElement {
name: "Ehemalig"
text: qsTr("Ehemalig")
name: "Kunde"
text: qsTr("Kunde")
selected: false
}
ListElement {
name: "Angebote"
text: qsTr("Angebote")
name: "Lieferant"
text: qsTr("Lieferant")
selected: false
}
ListElement {
name: "Erledigt"
text: qsTr("Erledigt")
selected: false
}
}

View File

@@ -1 +0,0 @@
module Offers

View File

@@ -3,37 +3,35 @@ import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
ColumnLayout
{
spacing: Dimensions.l
function viewOffers(criterion)
{
ColumnLayout {
function viewOffers(criterion) {
//offer_model.viewCriterion(criterion)
}
RowLayout
{
anchors.fill: parent
spacing: Dimensions.l
RowLayout {
Layout.fillWidth: true
spacing: Dimensions.l
SearchBar
{
SearchBar {
id: searchBar
}
QuickFilter {
model: ListModel {
ListElement {
name: "Alle"
text: qsTr("Alle")
selected: true
text: qsTr("Alle")
}
ListElement
{
ListElement {
name: "Offen"
text: qsTr("Offen")
selected: false
text: qsTr("Offen")
}
ListElement
{
ListElement {
name: "Abgeschlossen"
selected: false
text: qsTr("Abgeschlossen")
@@ -49,18 +47,20 @@ ColumnLayout
business_model.viewCriterion(name);
}
}
Button
{
Button {
id: addOfferBtn
text: qsTr("Angebote Hinzufügen")
icon.source: "qrc:/images/PlusCircle.svg"
Layout.alignment: Qt.AlignRight
flat: true
icon.source: "qrc:/images/PlusCircle.svg"
text: qsTr("Angebote Hinzufügen")
onClicked: contentStack.push("AddOffer.qml")
}
}
Item {
id: spacer
Layout.fillHeight: true
}
}

View File

@@ -18,13 +18,13 @@ ApplicationWindow {
}
font: Typography.body
height: Screen.desktopAvailableHeight
height: Screen.height * .85
palette.window: Colors.mantle
palette.placeholderText: Colors.interactive
palette.text: Colors.foreground
title: "TERO Personal"
visible: true
width: Screen.desktopAvailableWidth
width: Screen.width * .75
Component.onCompleted: {
systray.activated.connect(showWindow);

View File

@@ -1,3 +1,2 @@
module gui
Navigation 1.0 Navigation.qml
AddContact 1.0 AddContact.qml

View File

@@ -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
}

View File

@@ -1,2 +0,0 @@
module Js
JsLib 1.0 JsLib.js

View File

@@ -4,11 +4,23 @@ import QtQuick.Layouts
TextField {
id: field
signal submitted(query: string)
Layout.preferredWidth: 300
placeholderText: qsTr("Suche")
Keys.onReturnPressed: {
field.submitted(field.text);
}
Button {
icon.source: "qrc:/images/MagnifyingGlass.svg"
isFieldButton: true
onClicked: {
field.submitted(field.text)
}
}
}

View File

@@ -1,5 +0,0 @@
import QtQuick
Item {
}

View 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&#39;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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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">
<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>
<mxCell id="WIyWlLk6GJQsqaUBKTNV-0" />
<mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" />
@@ -290,8 +290,8 @@
<mxPoint x="250" y="530" as="sourcePoint" />
<mxPoint x="300" y="480" as="targetPoint" />
<Array as="points">
<mxPoint x="450" y="383" />
<mxPoint x="450" y="468" />
<mxPoint x="440" y="383" />
<mxPoint x="440" y="468" />
</Array>
</mxGeometry>
</mxCell>
@@ -307,8 +307,8 @@
<mxPoint x="270" y="530" as="sourcePoint" />
<mxPoint x="320" y="480" as="targetPoint" />
<Array as="points">
<mxPoint x="440" y="406" />
<mxPoint x="440" y="700" />
<mxPoint x="430" y="406" />
<mxPoint x="430" y="698" />
</Array>
</mxGeometry>
</mxCell>
@@ -323,9 +323,9 @@
<mxPoint x="270" y="530" as="sourcePoint" />
<mxPoint x="470" y="940" as="targetPoint" />
<Array as="points">
<mxPoint x="430" y="420" />
<mxPoint x="430" y="600" />
<mxPoint x="430" y="940" />
<mxPoint x="410" y="423" />
<mxPoint x="410" y="600" />
<mxPoint x="410" y="940" />
</Array>
</mxGeometry>
</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">
<mxGeometry y="58" width="170" height="32" as="geometry" />
</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" />
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-1" value="&lt;div&gt;ADMIN: enum&lt;/div&gt;&lt;div&gt;USER: enum&lt;/div&gt;" 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="&lt;div&gt;ADMIN: enum&lt;/div&gt;&lt;div&gt;USER: enum&lt;/div&gt;" 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" />
</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" />
</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" />
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-4" value="&lt;div&gt;ALL: enum&lt;/div&gt;&lt;div&gt;APPLICANT: enum&lt;/div&gt;&lt;div&gt;EMPLOYEE; enum&lt;/div&gt;" 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="&lt;div&gt;ALL: enum&lt;/div&gt;&lt;div&gt;APPLICANT: enum&lt;/div&gt;&lt;div&gt;EMPLOYEE; enum&lt;/div&gt;" 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" />
</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" />
</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">
<mxPoint x="420" y="900" as="sourcePoint" />
<mxPoint x="470" y="850" as="targetPoint" />
@@ -417,7 +417,7 @@
</Array>
</mxGeometry>
</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">
<mxPoint x="420" y="900" as="sourcePoint" />
<mxPoint x="470" y="850" as="targetPoint" />
@@ -427,7 +427,7 @@
</Array>
</mxGeometry>
</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">
<mxPoint x="420" y="900" as="sourcePoint" />
<mxPoint x="470" y="850" as="targetPoint" />
@@ -437,7 +437,7 @@
</Array>
</mxGeometry>
</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">
<mxPoint x="420" y="900" as="sourcePoint" />
<mxPoint x="470" y="850" as="targetPoint" />
@@ -447,77 +447,42 @@
</Array>
</mxGeometry>
</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">
<mxPoint x="600" y="440" as="sourcePoint" />
<mxPoint x="650" y="390" as="targetPoint" />
</mxGeometry>
</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">
<mxPoint x="600" y="440" as="sourcePoint" />
<mxPoint x="650" y="390" as="targetPoint" />
</mxGeometry>
</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">
<mxPoint x="600" y="440" as="sourcePoint" />
<mxPoint x="650" y="390" as="targetPoint" />
</mxGeometry>
</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" />
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-14" value="&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;" 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="&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;" 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" />
</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" />
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-16" value="+ oscarVermasseln()&lt;div&gt;+ entschluesseln()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; vermasslungsKobold()&lt;/div&gt;&lt;div&gt;+ userPasswordHash&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;" 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()&lt;div&gt;+ entschluesseln()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; vermasslungsKobold()&lt;/div&gt;&lt;div&gt;+ userPasswordHash&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;" 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" />
</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">
<mxPoint x="800" y="530" as="sourcePoint" />
<mxPoint x="850" y="480" as="targetPoint" />
</mxGeometry>
</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()&lt;div&gt;+ getOffer()&lt;/div&gt;&lt;div&gt;+ deleteOffer()&lt;/div&gt;&lt;div&gt;+ updateOffer()&lt;/div&gt;" 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="&lt;div&gt;+ addOffer()&lt;/div&gt;&lt;div&gt;+ deleteOffer()&lt;/div&gt;&lt;div&gt;+ updateOffer()&lt;br&gt;&lt;div&gt;-&amp;nbsp; refreshView()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; getData()&lt;/div&gt;&lt;div&gt;+ rowCount()&lt;/div&gt;&lt;div&gt;+ columnCount()&lt;/div&gt;&lt;div&gt;+ viewCriterion()&lt;/div&gt;&lt;div&gt;+ data()&lt;/div&gt;&lt;div&gt;+ headerData()&lt;/div&gt;&lt;div&gt;+ onRowClicked()&lt;/div&gt;&lt;/div&gt;" 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>
</mxGraphModel>
</diagram>

View File

@@ -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>

View File

@@ -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">
<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>
<mxCell id="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">
<mxGeometry x="535" y="180.00000000000006" as="geometry" />
</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">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="560" y="163" as="sourcePoint" />
@@ -118,7 +147,7 @@
</mxGeometry>
</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">
<mxGeometry x="900" y="880" width="180" height="90" as="geometry" />
<mxGeometry x="900" y="880" width="180" height="120" as="geometry" />
</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">
<mxGeometry y="30" width="180" height="30" as="geometry" />
@@ -133,26 +162,76 @@
<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="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">
<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">
<mxPoint x="1150" y="725" />
<mxPoint x="1110" y="725" />
<mxPoint x="1110" y="781" />
<mxPoint x="1110" y="795" />
</Array>
</mxGeometry>
</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">
<mxPoint x="1000" y="860" as="sourcePoint" />
<mxPoint x="990" y="820" as="targetPoint" />
<Array as="points">
<mxPoint x="870" y="925" />
<mxPoint x="870" y="840" />
<mxPoint x="870" y="751" />
</Array>
<mxPoint x="1080" y="840" as="targetPoint" />
</mxGeometry>
</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">
@@ -274,10 +353,18 @@
<mxPoint x="15" y="41" as="offset" />
</mxGeometry>
</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">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="1150" y="960" as="sourcePoint" />
<mxPoint x="1240" y="730" as="targetPoint" />
<mxPoint x="1240" y="760" as="targetPoint" />
<Array as="points">
<mxPoint x="1130" y="955" />
<mxPoint x="1130" y="810" />
@@ -285,6 +372,9 @@
</Array>
</mxGeometry>
</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">
<mxGeometry x="1130" y="940" as="geometry">
<mxPoint x="15" y="41" as="offset" />
@@ -492,7 +582,7 @@
</mxGeometry>
</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">
<mxGeometry x="1400" y="50" width="180" height="120" as="geometry" />
<mxGeometry x="1400" y="50" width="180" height="150" as="geometry" />
</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">
<mxGeometry y="30" width="180" height="30" as="geometry" />
@@ -507,10 +597,23 @@
<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">
<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" />
</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">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
@@ -521,9 +624,9 @@
</mxGeometry>
</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">
<mxGeometry y="90" width="180" height="30" as="geometry" />
<mxGeometry y="120" width="180" height="30" as="geometry" />
</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">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
@@ -533,19 +636,19 @@
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</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">
<mxPoint x="1580" y="125" as="sourcePoint" />
<mxPoint x="1340" y="150" as="sourcePoint" />
<mxPoint x="1390" y="100" as="targetPoint" />
<Array as="points">
<mxPoint x="1610" y="324" />
<mxPoint x="1610" y="433" />
<mxPoint x="1640" y="125" />
<mxPoint x="1640" y="433" />
</Array>
</mxGeometry>
</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">
<mxPoint x="1590" y="294" as="sourcePoint" />
<mxPoint x="1290" y="260" as="sourcePoint" />
<mxPoint x="1340" y="210" as="targetPoint" />
<Array as="points">
<mxPoint x="1610" y="294" />
@@ -558,7 +661,7 @@
<mxPoint x="1020" y="130" as="sourcePoint" />
<mxPoint x="1308" y="84" as="targetPoint" />
<Array as="points">
<mxPoint x="1360" y="155" />
<mxPoint x="1360" y="185" />
<mxPoint x="1360" y="65" />
</Array>
</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">
<mxGeometry x="1160" y="690" width="180" height="30" as="geometry" />
</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">
<mxPoint x="1190" y="820" as="sourcePoint" />
<mxPoint x="1330.9999999999995" y="684.9999999999998" as="targetPoint" />
<Array as="points">
<mxPoint x="1360" y="433" />
<mxPoint x="1360" y="625" />
<mxPoint x="1360" y="685" />
</Array>
</mxGeometry>
</mxCell>
@@ -963,7 +1066,7 @@
</mxGeometry>
</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">
<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" />
</mxGeometry>
</mxCell>
@@ -1074,13 +1177,13 @@
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</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">
<mxPoint x="1420" y="740.0000000000001" as="sourcePoint" />
<mxPoint x="1330" y="740" as="targetPoint" />
<Array as="points">
<mxPoint x="1360" y="835" />
<mxPoint x="1360" y="655" />
<mxPoint x="1370" y="835" />
<mxPoint x="1370" y="740" />
</Array>
</mxGeometry>
</mxCell>
@@ -1555,28 +1658,28 @@
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</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" />
</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">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</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">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</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" />
</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">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</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">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
@@ -1594,7 +1697,7 @@
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</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">
<mxPoint x="600" y="710" as="sourcePoint" />
<mxPoint x="480" y="510" as="targetPoint" />
@@ -2112,7 +2215,7 @@
<mxGeometry x="1151" y="550" width="180" height="210" as="geometry" />
</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">
<mxGeometry width="180" height="180" as="geometry" />
<mxGeometry width="180" height="210" as="geometry" />
</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">
<mxGeometry y="30" width="180" height="30" as="geometry" />
@@ -2127,9 +2230,22 @@
<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">
<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" />
</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">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
@@ -2141,7 +2257,7 @@
</mxGeometry>
</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">
<mxGeometry y="90" width="180" height="30" as="geometry" />
<mxGeometry y="120" width="180" height="30" as="geometry" />
</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">
<mxGeometry width="30" height="30" as="geometry">
@@ -2161,6 +2277,11 @@
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</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">
<mxGeometry y="180" width="180" height="30" as="geometry" />
</mxCell>
@@ -2169,19 +2290,11 @@
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</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">
<mxGeometry x="30" y="120" width="150" height="30" as="geometry">
<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" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</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">
<mxGeometry x="870" y="20" width="180" height="211" as="geometry" />
</mxCell>
@@ -3162,7 +3275,7 @@
</Array>
</mxGeometry>
</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">
<mxPoint x="-266" y="560" as="sourcePoint" />
<mxPoint x="414" y="1158" as="targetPoint" />
@@ -3172,7 +3285,7 @@
</Array>
</mxGeometry>
</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">
<mxPoint x="200" y="1110" as="sourcePoint" />
<mxPoint x="500" y="880" as="targetPoint" />
@@ -3296,7 +3409,7 @@
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</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">
<mxPoint x="1360" y="290" as="sourcePoint" />
<mxPoint x="1360" y="180" as="targetPoint" />
@@ -3308,7 +3421,7 @@
</Array>
</mxGeometry>
</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">
<mxPoint x="-300" y="1470" as="sourcePoint" />
<mxPoint x="-250" y="1420" as="targetPoint" />
@@ -3318,13 +3431,13 @@
</Array>
</mxGeometry>
</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">
<mxPoint x="-300" y="1110" as="sourcePoint" />
<mxPoint x="-560" y="1215" as="targetPoint" />
</mxGeometry>
</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">
<mxPoint x="-300" y="1110" as="sourcePoint" />
<mxPoint x="-380" y="1230" as="targetPoint" />
@@ -3334,13 +3447,13 @@
</Array>
</mxGeometry>
</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">
<mxPoint x="-590" y="1130" as="sourcePoint" />
<mxPoint x="-560" y="1060" as="targetPoint" />
</mxGeometry>
</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">
<mxPoint x="-590" y="1130" as="sourcePoint" />
<mxPoint x="-540" y="1080" as="targetPoint" />
@@ -3350,7 +3463,7 @@
</Array>
</mxGeometry>
</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">
<mxPoint x="-380" y="299" as="sourcePoint" />
<mxPoint x="330" y="420" as="targetPoint" />
@@ -3360,13 +3473,13 @@
</Array>
</mxGeometry>
</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">
<mxPoint x="790" y="685" as="sourcePoint" />
<mxPoint x="760" y="540" as="targetPoint" />
</mxGeometry>
</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">
<mxPoint x="790" y="850" as="sourcePoint" />
<mxPoint x="250" y="870" as="targetPoint" />
@@ -3376,7 +3489,7 @@
</Array>
</mxGeometry>
</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">
<mxPoint x="480" y="720" as="sourcePoint" />
<mxPoint x="530" y="470" as="targetPoint" />
@@ -3387,103 +3500,6 @@
</Array>
</mxGeometry>
</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>
</mxGraphModel>
</diagram>

View File

@@ -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`;

View File

@@ -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`;

View File

@@ -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`;

View File

@@ -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
View 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:

View 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
View 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

View File

@@ -1,27 +1,28 @@
# This Python file uses the following encoding: utf-8
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
from Crypto.Random import get_random_bytes
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 .PyqcrmFlags import PyqcrmFlags
from .Vermasseln import Vermasseln
from .domain.BaseModel import init_database_from_config
class ConfigLoader(QObject):
__config = None
__config: Optional[Config] = None
__version = "0.1-alpha"
__check_enc_key = True
dbConnectionError = Signal(str, bool)
adminUserError = Signal(str, bool)
adminNotAsvailable = Signal()
@@ -31,7 +32,6 @@ class ConfigLoader(QObject):
def __init__(self):
super().__init__()
# print(f"In {__file__} file, __init__()")
self.config_dir = user_config_dir() + '/pyqcrm'
config_dir = Path(self.config_dir)
if config_dir.exists():
@@ -41,13 +41,11 @@ class ConfigLoader(QObject):
else:
config_dir.mkdir(0o750, True, True)
@Slot(dict, result = bool)
def setConfig(self, app_config):
# print(f"In {__file__} file, setConfig()")
@Slot(dict, result=bool)
def setConfig(self, app_config: Config):
if not self.__config:
base_conf = self.__initializeConfig()
conf = self.__checkDbConnection(app_config)
conf = self._is_db_connectable(app_config['database'])
app_config = toml.dumps(app_config)
if conf:
app_config = base_conf + app_config
@@ -58,52 +56,48 @@ class ConfigLoader(QObject):
self.configurationReady.emit()
def __initializeConfig(self):
# print(f"In {__file__} file, __initializeConfig()")
self.__encrypt_key = b64encode(get_random_bytes(32)).decode("utf-8")
conf = f"[pyqcrm]\nVERSION = \"{self.__version}\"\n"
conf = conf + f"ENCRYPTION_KEY_VALID = \"No\"\n"
conf = conf + f"ENCRYPTION_KEY = \"{self.__encrypt_key}\"\n\n"
return conf
def __checkDbConnection(self, db_config):
# print(f"In {__file__} file, __checkDbConnection()")
con = DbManager(db_config['database']).getConnection()
if con:
def _is_db_connectable(self, config: DatabaseConfig):
try:
init_database_from_config(config)
self.dbConnectionError.emit("Connection OK", True)
return True
else:
except OperationalError as e:
self.dbConnectionError.emit("Connection fehlgeschlagen", False)
return False
def __saveConfig(self):
# print(f"In {__file__} file, saveConfig()")
try:
with open (self.config_dir + '/pyqcrm.toml', 'w') as f:
with open(self.config_dir + '/pyqcrm.toml', 'w') as f:
# print(self.__config)
config = Vermasseln().oscarVermasseln(toml.dumps(self.__config))
f.write(config)
except FileNotFoundError:
print("Konnte die Konfiguration nicht speichern.")
def __checkAdminUser(self):
# print(f"In {__file__} file, __checkAdminUser()")
result = UserManager().checkAdmin()
if not result:
#if not result[0][0] == 1:
# if not result[0][0] == 1:
self.adminUserError.emit("Kein Admin vorhanden", False)
return False
else:
self.adminUserError.emit("Admin vorhanden", True)
return True
@Slot(dict, result= bool)
@Slot(dict, result=bool)
def addAdminUser(self, user_config):
# print(f"In {__file__} file, addAdminUser()")
admin = UserManager(user_config["user"], PyqcrmFlags.ADMIN).createUser()
if not admin:
#self.adminNotAvailable.emit()
# self.adminNotAvailable.emit()
self.adminUserError.emit("Benutzername nich verfügbar", False)
else:
self.__config['pyqcrm']['ENCRYPTION_KEY_VALID'] = 'Yes'
@@ -111,7 +105,6 @@ class ConfigLoader(QObject):
self.backupEncryptionKey.emit()
return admin
@Slot(str, str)
def __saveData(self, recovery_file, recovery_password, data):
# print(f"In {__file__} file, __saveData()")
@@ -121,7 +114,7 @@ class ConfigLoader(QObject):
rf = Vermasseln().oscarVermasseln(rf, local)
rec_file = urlparse(recovery_file)
if os.name == "nt":
rec_file = rec_file [1:]
rec_file = rec_file[1:]
else:
rec_file = rec_file.path + ".pyqrec"
try:
@@ -136,7 +129,7 @@ class ConfigLoader(QObject):
rec_file = urlparse(recovery_file)
rec_file = rec_file.path
if os.name == "nt":
rec_file = rec_file [1:]
rec_file = rec_file[1:]
try:
ek = self.__parseImport(rec_file, recovery_password)
@@ -200,9 +193,8 @@ class ConfigLoader(QObject):
print(str(e))
def __configLoad(self):
# print(f"In {__file__} file, __configLoad()")
try:
with open (self.config_dir + '/pyqcrm.toml', 'r') as f:
with open(self.config_dir + '/pyqcrm.toml', 'r') as f:
config = f.read()
self.__config = toml.loads(Vermasseln().entschluesseln(config))
self.configurationReady.emit()
@@ -210,17 +202,11 @@ class ConfigLoader(QObject):
print("Konnte die Konfiguration nicht laden.")
except TypeError:
print(f"Invalid Configuration: {__file__}")
except Exception as e:
print(str(e))
def getConfig(self):
# print(f"In {__file__} file, getConfig()")
# print(self.__config)
def get_config(self) -> Optional[Config]:
return self.__config
def __setRecoveryPassword(self, key, salt = None):
# print(f"In {__file__} file, __setRecoveryPassword()")
def __setRecoveryPassword(self, key, salt=None):
key = Vermasseln.userPasswordHash(key, salt)
return key.split("$")
@@ -233,29 +219,28 @@ class ConfigLoader(QObject):
@Slot(str, str)
def backupConfig(self, filename, password):
conf_file = toml.dumps(self.getConfig())
conf_file = toml.dumps(self.get_config())
self.__saveData(filename, password, conf_file)
@Slot(dict)
def saveDbConf(self, db = None):
def saveDbConf(self, db=None):
self.__config.update(db)
self.__saveConfig()
@Slot(result = dict)
@Slot(result=dict)
def getDbConf(self):
try:
return self.__config['database']
return self.__config['database'] if self.__config is not None else None
except KeyError as ex:
print(f"Missing database configuration: {ex}")
return None
@Slot(dict)
def saveCompanyInfo(self, company = None):
def saveCompanyInfo(self, company=None):
self.__config.update(company)
self.__saveConfig()
@Slot(result = dict)
@Slot(result=dict)
def getCompanyInfo(self):
try:
return self.__config['company']
@@ -264,11 +249,11 @@ class ConfigLoader(QObject):
return None
@Slot(dict)
def saveMiscConf(self, misc_conf = None):
def saveMiscConf(self, misc_conf=None):
self.__config.update(misc_conf)
self.__saveConfig()
@Slot(result = bool)
@Slot(result=bool)
def systray(self):
try:
return self.__config['misc']['SYSTRAY']
@@ -276,9 +261,7 @@ class ConfigLoader(QObject):
print(f"Missing configuration: {ex}")
return False
@Slot(str, str)
def backupEncryptkey(self, filename, password):
encrypt_key = self.__config['pyqcrm']['ENCRYPTION_KEY']
self.__saveData(filename, password, encrypt_key)

View File

@@ -1,43 +1,42 @@
from .DbManager import DbManager
import mariadb
import json
import mariadb
from lib.domain.BaseModel import database
class AddressDAO:
__cur = None
def __init__(self):
#print(f"*** File: {__file__}, init()")
self.__con = DbManager().getConnection()
self.__con = database.connection()
if self.__con:
self.__cur = self.__con.cursor()
def __importPlz(self):
with open("/home/dstoppek/Coden/Projekte/pyqcrm/doc/postleitzahl.json", "r") as plz:
with open("pfad zur datei", "r") as plz:
postcodes = json.load(plz)
country = "Deutschland"
irgendwas = ""
try:
for i in postcodes:
test =i["plz_name"].split(",")
test = i["plz_name"].split(",")
for town in test:
if "u.a" in town:
town = town[:-4]
town = town.strip()
if 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:
print(f"Database Error: {e}")
finally:
self.__con.commit()
print("FINISHED")#
print("FINISHED") #
def __importCountry(self):
with open("/home/dstoppek/Coden/Projekte/pyqcrm/doc/staaten.json", "r") as country:
with open("pfad zur datei", "r") as country:
countries = json.load(country)
old = ""
try:
@@ -55,18 +54,17 @@ class AddressDAO:
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]
except mariadb.OperationalError as e:
print(f"Database Error: {e}")
finally:
self.__con.commit()
print("FINISHED")#
print("FINISHED") #
def getAddressData(self, all = True, zipcode = None):
def getAddressData(self, all=True, zipcode=None):
try:
if self.__cur:
self.__cur.callproc("getAddress", (all, zipcode,))
@@ -76,6 +74,3 @@ class AddressDAO:
return None
except mariadb.Error as e:
print(str(e))

View File

@@ -2,45 +2,33 @@ from PySide6.QtCore import QAbstractListModel, Qt, Slot, QModelIndex
from .AddressDAO import AddressDAO
from ..PyqcrmDataRoles import PyqcrmDataRoles
class AddressModel(QAbstractListModel):
def __init__(self):
super().__init__()
self.__address_data = AddressDAO().getAddressData()
def rowCount(self, parent = QModelIndex()):
def rowCount(self, parent=QModelIndex()):
return len(self.__address_data)
def data(self, index, role = Qt.DisplayRole):
def data(self, index, role=Qt.ItemDataRole.DisplayRole):
row = index.row()
if role == Qt.DisplayRole:
data = self.__address_data[row][5]
if role == Qt.ItemDataRole.DisplayRole:
data = self.__address_data[row][2]
return data
elif role == PyqcrmDataRoles.CITY_ROLE:
data = self.__address_data[row][4]
return data
elif role == PyqcrmDataRoles.COUNTRY_ROLE:
data = self.__address_data[row][3]
return data
return None
def roleNames(self):
return {
Qt.DisplayRole: b"display",
Qt.ItemDataRole.DisplayRole: b"display",
PyqcrmDataRoles.CITY_ROLE: b"city",
PyqcrmDataRoles.COUNTRY_ROLE: b"country"
}
def setData(self):
pass
@Slot(bool, str)
def getAddresses(self, all, zipcode):
data = AddressDAO().getAddressData(all, zipcode)
return data

91
lib/DB/ApplicantModel.py Normal file
View 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()

View File

@@ -1,20 +1,20 @@
from .DbManager import DbManager
from lib.domain.BaseModel import database
class BTypeDAO:
__cur = None
def __init__(self):
#print(f"*** File: {__file__}, init()")
self.__con = DbManager().getConnection()
self.__con = database.connection()
if self.__con:
self.__cur = self.__con.cursor()
def getBType(self):
try:
if self.__cur:
self.__cur.callproc("getBtype", (None, None, ))
self.__cur.callproc("getBtype", (None, None,))
data = self.__cur.fetchall()
return(data)
return data
else:
return None
except mariadb.Error as e:

View File

@@ -1,7 +1,7 @@
from .DbManager import DbManager
import json
import mariadb
from PySide6.QtCore import QObject, Signal
from lib.domain.BaseModel import database
class BusinessDAO(QObject):
@@ -12,11 +12,11 @@ class BusinessDAO(QObject):
def __init__(self):
super().__init__()
self.__con = DbManager().getConnection()
self.__con = database.connection()
if self.__con:
self.__cur = self.__con.cursor()
def getBusiness(self, enc_key, criterion = "Alle"):
def getBusiness(self, enc_key, criterion="Alle"):
try:
if self.__cur:
self.__cur.callproc("getCustomerView", (enc_key, criterion,))
@@ -27,14 +27,14 @@ class BusinessDAO(QObject):
except mariadb.Error as e:
print(str(e))
def getOneBusiness(self, business_id, enc_key = None):
def getOneBusiness(self, business_id, enc_key=None):
try:
if self.__cur:
self.__cur.callproc("getCustomer", (business_id, enc_key,))
#self.__all_cols = [desc[0] for desc in self.__cur.description]
return self.__cur.fetchall() #, self.__all_cols
# self.__all_cols = [desc[0] for desc in self.__cur.description]
return self.__cur.fetchall() # , self.__all_cols
else:
return None #, None
return None # , None
except mariadb.Error as e:
print(str(e))
@@ -47,10 +47,3 @@ class BusinessDAO(QObject):
except mariadb.Error as e:
print(str(e))

View File

@@ -73,7 +73,7 @@ class BusinessModel(QAbstractTableModel):
super().__init__()
self.__business_dao = BusinessDAO()
self.__business_dao.newBusinessAdded.connect(self.__refreshView)
self.__conf = ConfigLoader().getConfig()
self.__conf = ConfigLoader().get_config()
self.__key = self.__conf['pyqcrm']['ENCRYPTION_KEY']
self.__getData()

View File

@@ -1,7 +1,9 @@
from .DbManager import DbManager
from PySide6.QtCore import QObject, Signal
import json
import mariadb
from PySide6.QtCore import QObject, Signal
from lib.domain.BaseModel import database
class ContactDAO(QObject):
@@ -9,8 +11,7 @@ class ContactDAO(QObject):
def __init__(self):
super().__init__()
#print(f"*** File: {__file__}, __init__()")
self.__con = DbManager().getConnection()
self.__con = database.connection()
if self.__con:
self.__cur = self.__con.cursor()
@@ -61,4 +62,3 @@ class ContactDAO(QObject):
print(str(e))

View File

@@ -14,7 +14,7 @@ class ContactModel(QObject):
super().__init__()
# print(f"*** File: {__file__}, __init__()")
#self.logger = logging.getLogger()
self.__conf = ConfigLoader().getConfig()
self.__conf = ConfigLoader().get_config()
self.__key = self.__conf['pyqcrm']['ENCRYPTION_KEY']
self.__contact_dao = ContactDAO()
self.__contact_dao.newObjectContactAdded.connect(self.objectContactAdded)

View File

@@ -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,
}

View File

@@ -1,45 +1,41 @@
from .DbManager import DbManager
import json
import mariadb
from PySide6.QtCore import QObject, Signal
from lib.domain.BaseModel import database
class EmployeeDAO(QObject):
newEmployeeAdded = Signal(bool)
__cur = None
__all_cols = None
def __init__(self):
super().__init__()
self.__con = DbManager().getConnection()
if self.__con:
self.__cur = self.__con.cursor()
self._connection = database.connection()
def getEmployees(self, enc_key, criterion="Alle", processed=False, fired=False, every_state=True):
cursor = self._connection.cursor()
try:
if self.__cur:
self.__cur.callproc("getEmployeeTable", (criterion, processed, fired, every_state, enc_key,))
self.__all_cols = [desc[0] for desc in self.__cur.description]
return self.__cur.fetchall(), self.__all_cols
else:
return None, None
except mariadb.Error as e:
print(str(e))
cursor.callproc("getEmployeeTable", (criterion, processed, fired, every_state, enc_key,))
all_cols = [desc[0] for desc in cursor.description]
result = cursor.fetchall(), all_cols
return result
finally:
cursor.close()
def getEmployee(self, employee_id, enc_key=None):
def fetchApplicant(self, employee_id, enc_key=None) -> dict:
cursor = self._connection.cursor(dictionary=True)
try:
if self.__cur:
self.__cur.callproc("getEmployee", (employee_id, enc_key,))
# self.__all_cols = [desc[0] for desc in self.__cur.description]
return self.__cur.fetchall() # , self.__all_cols
else:
return None
except mariadb.Error as e:
print(str(e))
cursor.callproc("getApplicant", (employee_id, enc_key))
it = cursor.fetchone()
return it
finally:
cursor.close()
def addEmployee(self, data, enc_key, applicant=True):
if self.__cur:
self.__cur.callproc("addApplicant", (json.dumps(data), applicant, enc_key,))
self.__con.commit()
def addApplicant(self, data, enc_key, applicant=True):
cursor = self._connection.cursor()
try:
cursor.callproc("addApplicant", (json.dumps(data), applicant, enc_key,))
self._connection.commit()
self.newEmployeeAdded.emit(True)
finally:
cursor.close()

View File

@@ -1,8 +1,7 @@
import json
from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot, Signal, QJsonDocument
from PySide6.QtQml import QJSValue, QJSValueIterator
from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot, Signal
from PySide6.QtQml import QJSValue
from .EmployeeDAO import EmployeeDAO
# from ..PyqcrmFlags import PyqcrmFlags, PyqcrmAppliEmpyFlags
from ..ConfigLoader import ConfigLoader
import re
@@ -11,7 +10,6 @@ class EmployeeModel(QAbstractTableModel):
addedNewEmployee = Signal(bool)
__data = None
__employee_dao = None
__visible_index = None
__visible_columns = None
__col_name = ""
__col_skip = 2
@@ -21,7 +19,7 @@ class EmployeeModel(QAbstractTableModel):
super().__init__()
self.__employee_dao = EmployeeDAO()
self.__employee_dao.newEmployeeAdded.connect(self.__refreshView)
self.__conf = ConfigLoader().getConfig()
self.__conf = ConfigLoader().get_config()
self.__key = self.__conf['pyqcrm']['ENCRYPTION_KEY']
self.__getData()
@@ -30,34 +28,23 @@ class EmployeeModel(QAbstractTableModel):
if 'worklicense' in new_employee:
new_employee['worklicense'] = int(new_employee['worklicense'])
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)
def addApplicant(self, new_applicant):
data = {}
it = QJSValueIterator(new_applicant)
while it.hasNext():
it.next()
if "function" in it.value().toString() or "objectName" == it.name():
continue
data[it.name()] = it.value().toString()
self.__employee_dao.addEmployee(data, self.__key)
# @Slot(QJSValue)
# def addApplicant(self, applicant: QJSValue):
# self.__employee_dao.addEmployee({
# "city": applicant.property("city").toString(),
# "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)
def addApplicant(self, applicant: QJSValue):
self.__employee_dao.addApplicant({
"city": applicant.property("city").toString(),
"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)
def __refreshView(self, added):
@@ -84,35 +71,21 @@ class EmployeeModel(QAbstractTableModel):
self.__col_skip = 2
self.__getData(criterion, criterion == 'Erledigt', False, criterion == 'Alle')
def data(self, index, role=Qt.DisplayRole):
if role == Qt.DisplayRole:
def data(self, index, role=Qt.ItemDataRole.DisplayRole):
if role == Qt.ItemDataRole.DisplayRole:
row = self.__data[index.row()]
applicant_col = index.column() + self.__col_skip
tr = row[
applicant_col] # if type(row[index.column() + 2]) is str else str(row[index.column() + 2], "utf-8")
tr = row[applicant_col]
if applicant_col == 2 and self.__everyone:
tr = 'Ja' if tr == 1 else 'Nein'
else:
if tr:
tr = re.sub("Keine Angabe ", "", tr)
# print(f"Data: {tr}")
# return row[index.column() + 2]
return tr
return None
def headerData(self, section, orientation, role=Qt.DisplayRole):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
if orientation == Qt.Orientation.Horizontal and role == Qt.ItemDataRole.DisplayRole:
self.__col_name = self.__visible_columns[section + self.__col_skip]
return self.__col_name
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)

View File

@@ -1,17 +1,14 @@
from .DbManager import DbManager
import json
import mariadb
from PySide6.QtCore import QObject, Signal
# from ..PyqcrmFlags import PyqcrmAppliEmpyFlags
from lib.domain.BaseModel import database
class ObjectDAO(QObject):
newObjectAdded = Signal(bool, int)
def __init__(self):
super().__init__()
#print(f"*** File: {__file__}, __init__()")
self.__con = DbManager().getConnection()
self.__con = database.connection()
if self.__con:
self.__cur = self.__con.cursor()

View File

@@ -1,7 +1,6 @@
from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot, Signal
from .ObjectDAO import ObjectDAO
from ..ConfigLoader import ConfigLoader
from ..PyqcrmDataRoles import PyqcrmDataRoles
import re
import json
@@ -23,7 +22,7 @@ class ObjectModel(QAbstractTableModel):
super().__init__()
self.__object_dao = ObjectDAO()
self.__object_dao.newObjectAdded.connect(self.__refreshView)
self.__conf = ConfigLoader().getConfig()
self.__conf = ConfigLoader().get_config()
self.__key = self.__conf['pyqcrm']['ENCRYPTION_KEY']
self.__object_dao.newObjectAdded.connect(self.objectAdded)
self.__getData()
@@ -67,16 +66,8 @@ class ObjectModel(QAbstractTableModel):
if object_col > 4 and tr:
tr = re.sub("Keine Angabe ","", tr)
return tr
elif role == PyqcrmDataRoles.STREET_IN_POSTCODE:
pass
return None
def roleNames(self):
return {
Qt.DisplayRole: b"display",
PyqcrmDataRoles.STREET_IN_POSTCODE: b"StreetInPostcode",
}
def headerData(self, section, orientation, role = Qt.DisplayRole):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
self.__col_name = self.__visible_columns[section + self.__col_skip]

View File

@@ -1,20 +1,21 @@
# This Python file uses the following encoding: utf-8
from .DbManager import DbManager
from ..PyqcrmFlags import PyqcrmFlags
import mariadb
from PySide6.QtCore import QObject, Signal
from lib.domain.BaseModel import database
class UserDAO(QObject):
noDbConnection = Signal(str)
__cursor = None
def __init__(self):
#print(f"*** File: {__file__}, init()")
super().__init__()
self.__con = DbManager().getConnection()
self.__con = database.connection()
if self.__con:
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
try:
if self.__cur:
@@ -39,6 +40,3 @@ class UserDAO(QObject):
except mariadb.Error as e:
print(str(e))
self.noDbConnection.emit(str(e))

View File

@@ -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 ..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):
loginOkay = Signal()
noDbConnection = Signal(str)
def __init__(self, user_config = None, role = None):
def __init__(self, user_config=None, role=None):
super().__init__()
self.__con = DbManager().getConnection()
self.__con = database.connection()
self.__user_dao = UserDAO()
self.__user_dao.noDbConnection.connect(self.noDbConnection)
if self.__con:
self.__cur = self.__con.cursor()
if user_config and role:
self.__username = user_config["PYQCRM_USER"]
self.__password = user_config["PYQCRM_USER_PASS"]
self.__info = user_config["PYQCRM_USER_INFO"]
self.__role = role if role == PyqcrmFlags.ADMIN else 0
def createUser(self):
self.__hashPassword()
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)
if user:
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):
pw_list = hash_password.split("$")
@@ -90,6 +64,3 @@ class UserManager(QObject):
hash_pw = Vermasseln.userPasswordHash(password, pw_list[0])
if hash_password == hash_pw:
self.loginOkay.emit()

View File

@@ -5,7 +5,5 @@ from enum import IntEnum
class PyqcrmDataRoles(IntEnum):
CITY_ROLE = Qt.UserRole + 100
STREET_IN_POSTCODE = CITY_ROLE + 1
COUNTRY_ROLE = CITY_ROLE + 100

View File

@@ -2,7 +2,6 @@
from Crypto.Cipher import AES
from base64 import b64encode, b64decode
import platform
import bcrypt
from Crypto.Hash import SHA256, SHA3_512
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Random import get_random_bytes

44
lib/domain/Applicant.py Normal file
View 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
View 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
View 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
View 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
View 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")

57
main.py
View File

@@ -1,44 +1,35 @@
# # !/home/linuxero/proj/tero/pyqcrm/.qtcreator/venv-3.13.1/bin/python3
import os
import sys
import logging
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
# noinspection PyUnresolvedReferences
import rc_pyqcrm
# noinspection PyUnresolvedReferences
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.ApplicantModel import ApplicantModel
from lib.DB.BTypeModel import BTypeModel
from lib.DB.BusinessModel import BusinessModel
from lib.DB.ContactModel import ContactModel
from lib.DB.EmployeeModel import EmployeeModel
from lib.DB.ObjectModel import ObjectModel
from lib.DB.UserManager import UserManager
from lib.Printers import Printers
from lib.domain.BaseModel import database, init_database_from_config
os.environ['QML_XHR_ALLOW_FILE_READ'] = '1'
# [pyqcrm]
# program-name=""
# version=
# [database]
# server=""
# port=
# user=""
# password=""
# name=""
# type=""
bad_config = False
db_con = False
address_model = None
applicant_model = None
business_model = None
business_type = None
contact_model = None
@@ -49,17 +40,17 @@ user = None
def initializeProgram():
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
global address_model, applicant_model, bad_config, business_model, user, business_type, contact_model, employee_model, object_model, db_con, printers
if not bad_config:
dbconf = config.getConfig()['database']
DbManager(dbconf)
init_database_from_config(config.get_config()['database'])
printers = Printers()
if DbManager().getConnection():
if not database.is_closed():
db_con = True
user = UserManager()
business_model = BusinessModel()
address_model = AddressModel()
applicant_model = ApplicantModel()
business_type = BTypeModel()
contact_model = ContactModel()
employee_model = EmployeeModel()
@@ -74,11 +65,11 @@ def configReady():
def publishContext():
# print(f"In {__file__} file, publishContext()")
global engine, address_model, bad_config, business_model, user, business_type, contact_model, object_model, employee_model, printers
global engine, address_model, applicant_model, bad_config, business_model, user, business_type, contact_model, object_model, employee_model, printers
engine.rootContext().setContextProperty("loggedin_user", user)
engine.rootContext().setContextProperty("business_model", business_model)
engine.rootContext().setContextProperty("address_model", address_model)
engine.rootContext().setContextProperty("applicantModel", applicant_model)
engine.rootContext().setContextProperty("business_type", business_type)
engine.rootContext().setContextProperty("contact_model", contact_model)
engine.rootContext().setContextProperty("employee_model", employee_model)
@@ -105,7 +96,7 @@ if __name__ == "__main__":
qml_file = "qrc:/Gui/main.qml"
icon = QIcon(":/images/tero.jpg")
icon = QIcon("qrc:/images/tero.jpg")
app.setWindowIcon(icon)
tray = QSystemTrayIcon()
@@ -114,7 +105,7 @@ if __name__ == "__main__":
config = ConfigLoader()
if not config.getConfig():
if not config.get_config():
bad_config = True
config.configurationReady.connect(configReady)
else:

View File

@@ -7,7 +7,6 @@
"lib/DB/BusinessModel.py",
"pyqcrm.qrc",
"qml.qrc",
"lib/DB/DbManager.py",
"lib/DB/UserManager.py",
"lib/PyqcrmFlags.py",
"lib/DB/UserDAO.py",

View File

@@ -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>

View File

@@ -9,6 +9,7 @@
<file>images/ChevronDown.svg</file>
<file>images/Funnel.svg</file>
<file>images/Identification-Outline.svg</file>
<file>images/InboxArrowDown.svg</file>
<file>images/MagnifyingGlass.svg</file>
<file>images/Newspaper-Outline.svg</file>
<file>images/Phone.svg</file>
@@ -19,14 +20,8 @@
<file>images/UserCircle.svg</file>
<file>images/UserGroup-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>README</file>
<file>LICENSE</file>
<file>images/tero.jpg</file>
</qresource>
</RCC>

41
qml.qrc
View File

@@ -6,8 +6,11 @@
<file>Gui/DbConfiguration.qml</file>
<file>Gui/LoginScreen.qml</file>
<file>Gui/AddContact.qml</file>
<file>Gui/AddCustomer.qml</file>
<file>Gui/Dashboard.qml</file>
<file>Gui/main.qml</file>
<file>js/qmldict.js</file>
<file>Gui/CustomerView.qml</file>
<file>Gui/NoDbConnection.qml</file>
<file>Gui/Notifications.qml</file>
<file>Gui/AddObject.qml</file>
@@ -16,10 +19,15 @@
<file>Gui/ObjectAddOnContactPerson.qml</file>
<file>Gui/ObjectAddOnEmployee.qml</file>
<file>Gui/AddObjectEmployee.qml</file>
<file>Gui/CustomersTable.qml</file>
<file>Gui/CustomerDetails.qml</file>
<file>Gui/ObjectsTable.qml</file>
<file>Gui/ObjectDetails.qml</file>
<file>Gui/AddNewObject.qml</file>
<file>Gui/PrinterDialog.qml</file>
<file>Gui/CustomerContactDetails.qml</file>
<file>Gui/NoCustomerContact.qml</file>
<file>Gui/CustomerDetailsView.qml</file>
<file>Gui/ReadMe.qml</file>
<file>Gui/UsersPage.qml</file>
<file>Gui/PyqcrmConf.qml</file>
@@ -28,11 +36,12 @@
<file>Gui/BackupSettings.qml</file>
<file>Gui/MiscConf.qml</file>
<file>Gui/UtilityDialogs.qml</file>
<file>Gui/OffersTable.qml</file>
<file>Gui/Employees/AddApplicant.qml</file>
<file>Gui/Employees/AddEmployee.qml</file>
<file>Gui/Employees/ApplicantForm.qml</file>
<file>Gui/Employees/EmployeePersonalData.qml</file>
<file>Gui/Employees/EmployeeBankData.qml</file>
<file>Gui/Employees/ApplicantForm.qml</file>
<file>Gui/Employees/EmployeeNationalInsurance.qml</file>
<file>Gui/Employees/EmployeeVarious.qml</file>
<file>Gui/Employees/EmployeeDetails.qml</file>
@@ -58,33 +67,9 @@
<file>TeroStyle/SearchBar.qml</file>
<file>TeroStyle/TextField.qml</file>
<file>TeroStyle/Typography.qml</file>
<file>Gui/qmldir</file>
<file>Gui/test.qml</file>
<file>Gui/Offers/OffersTable.qml</file>
<file>Gui/Offers/qmldir</file>
<file>Gui/Offers/AddOffer.qml</file>
<file>Gui/Offers/AddNewOffer.qml</file>
<file>Js/qmldir</file>
<file>Js/JsLib.js</file>
<file>Js/qmldict.js</file>
<file>Gui/Customer/AddCustomer.qml</file>
<file>Gui/Customer/CustomerContactDetails.qml</file>
<file>Gui/Customer/CustomerDetails.qml</file>
<file>Gui/Customer/CustomerDetailsView.qml</file>
<file>Gui/Customer/CustomersTable.qml</file>
<file>Gui/Customer/CustomerView.qml</file>
<file>Gui/Customer/qmldir</file>
<file>Gui/Customer/NoCustomerContact.qml</file>
<file>Gui/Objects/AddNewObject.qml</file>
<file>Gui/Objects/AddObject.qml</file>
<file>Gui/Objects/AddObjectEmployee.qml</file>
<file>Gui/Objects/ObjectAddOnContactPerson.qml</file>
<file>Gui/Objects/ObjectAddOnEmployee.qml</file>
<file>Gui/Objects/ObjectAddOns.qml</file>
<file>Gui/Objects/ObjectDetails.qml</file>
<file>Gui/Objects/ObjectsTable.qml</file>
<file>Gui/Objects/ObjectView.qml</file>
<file>Gui/Objects/qmldir</file>
<file>Gui/AddOffer.qml</file>
<file>Gui/AddNewOffer.qml</file>
</qresource>
<qresource prefix="/Common"/>
<qresource prefix="/TeroStyle"/>
</RCC>

View File

@@ -3,9 +3,8 @@ platformdirs
pycryptodome
psutil
toml
mariadb
soundfile
sounddevice
reportlab
tomlkit
bcrypt
peewee
pymysql

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More