Compare commits

...

20 Commits

Author SHA256 Message Date
3ff830b3e2 new Diagrams 2025-05-09 10:59:11 +02:00
2dab5883e2 Merge branch 'main' into schnacke 2025-05-08 11:47:47 +02:00
0ee3a5f8b3 Need to 2025-04-28 13:46:21 +02:00
Yuri Becker
2832becccf Style EmployeesTable 2025-04-16 12:02:21 +02:00
Yuri Becker
cf5822c950 Somewhat fix errors when adding an applicant 2025-04-16 11:00:06 +02:00
Yuri Becker
f0382a960e Validate applicant and call database procedure 2025-04-15 15:24:31 +02:00
Yuri Becker
a720dfebeb Add fields in ApplicantForm 2025-04-08 11:23:16 +02:00
Yuri Becker
ddf35a55a8 Stub ApplicantForm 2025-04-03 15:33:28 +02:00
Yuri Becker
1e9ba40b6b Add global back button 2025-04-03 14:46:36 +02:00
Yuri Becker
fc9b1c0801 Use original icon names 2025-04-03 13:18:08 +02:00
Yuri Becker
3083406b1b Use common StackView 2025-04-03 13:06:37 +02:00
Yuri Becker
f172468ba6 Extract Employee View into own dir 2025-04-03 10:56:42 +02:00
0e397619f4 Merge branch 'main' into schnacke
merge main
2025-03-25 13:41:40 +01:00
d4ed18aaf9 filter names changed 2025-03-25 13:41:01 +01:00
eda50e036a Merge branch 'main' of https://git.danielsto.de/Linuxero/pyqcrm
merge main
2025-03-25 13:27:56 +01:00
Yuri Becker
7c66dcf890 Add Note to Angebot Erstellen Design 2025-03-25 13:23:19 +01:00
8fec981409 Merge branch 'main' of https://git.danielsto.de/Linuxero/pyqcrm 2025-03-25 13:23:14 +01:00
16ba24b13d offer form not ready 2025-03-25 13:20:54 +01:00
Yuri Becker
309f1f58d7 Fix up Menu 2025-03-25 12:28:30 +01:00
Yuri Becker
445c183e71 Clean up leftover files and commented code 2025-03-25 11:39:45 +01:00
91 changed files with 2544 additions and 2436 deletions

4
.idea/discord.xml generated
View File

@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="DiscordProjectSettings"> <component name="DiscordProjectSettings">
<option name="show" value="APPLICATION" /> <option name="show" value="PROJECT_FILES" />
<option name="nameOverrideEnabled" value="true" />
<option name="nameOverrideText" value="the qml thing (╯°□°)╯︵ ┻━┻" />
<option name="description" value="" /> <option name="description" value="" />
<option name="applicationTheme" value="default" /> <option name="applicationTheme" value="default" />
<option name="iconsTheme" value="default" /> <option name="iconsTheme" value="default" />

5
.idea/qmlSettings.xml generated
View File

@@ -6,6 +6,11 @@
<entry key=""> <entry key="">
<value> <value>
<PerProfileState> <PerProfileState>
<option name="myExtraQmlPaths">
<list>
<option value="$PROJECT_DIR$/TeroStyle" />
</list>
</option>
<option name="myLSPEnabled" value="true" /> <option name="myLSPEnabled" value="true" />
<option name="myQmlFormatEnabled" value="true" /> <option name="myQmlFormatEnabled" value="true" />
</PerProfileState> </PerProfileState>

View File

@@ -1,180 +0,0 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import "../js/qmldict.js" as JsLib
ColumnLayout
{
id: colPar
anchors.fill: parent
Layout.fillWidth: true
Layout.fillHeight: true
implicitWidth: parent.width
Label
{
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
id: headline
text: qsTr("Mitarbeiter / Bewerber hinzufügen")
font.pixelSize: 35
}
ButtonGroup
{
buttons: radio.children
onClicked:
{
checkFields()
personalData.requiredField()
}
}
Row
{
Layout.fillWidth: true
id: radio
//Layout.columnSpan: 2
RadioButton
{
checked: true
text: qsTr("Bewerber")
}
RadioButton
{
text: qsTr("Mitarbeiter")
}
}
// ScrollView
// {
// Layout.fillHeight: true
// Layout.fillWidth: true
// implicitWidth: parent.width
// ColumnLayout
// {
// anchors.fill: parent
// //implicitWidth: parent.width
// //width: parent.width
// //height: parent.height
RowLayout
{
Layout.fillWidth: true
//implicitWidth: parent.width
spacing: 50
Frame
{
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
//implicitWidth: parent.width
ApplicantPersonalData
{
id: personalData
width: parent.width
}
}
Frame
{
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
visible: radio.children[1].checked
ColumnLayout
{
Layout.alignment: Qt.AlignTop
implicitWidth: parent.width
ApplicantBankData
{
id: bankAccount
}
ApplicantNationalInsurance
{
id: nationalInsurance
}
ApplicantVarious
{
id: applicantVarious
}
}
}
}
Item
{
Layout.fillHeight: true
}
RowLayout
{
Layout.fillWidth: true
Layout.alignment: Qt.AlignRight
Button
{
text: qsTr("Abbrechen")
onClicked: appLoader.source = "EmployeeTable.qml"
}
Button
{
id: saveBtn
text: qsTr("Speichern")
enabled: false
onClicked:
{
var new_applicant
if (radio.children[0].checked)
{
// Ein Bewerber
new_applicant = JsLib.parseForm(personalData)
employee_model.addEmployee(new_applicant, true)
// appLoader.source = "EmployeeTable.qml"
// console.log(JSON.stringify (new_applicant))
}
else
{
// Ein Mitarbeiter
// console.log(personalData, bankAccount, nationalInsurance, applicantVarious)
new_applicant = JsLib.parseForm(personalData, bankAccount, nationalInsurance, applicantVarious)
employee_model.addEmployee(new_applicant, false)
// var new_contact = JsLib.addApplicant(addContactLayout)
// contact_model.addContact(new_contact)
// console.log(JSON.stringify (new_applicant))
}
}
}
}
Component.onCompleted:
{
employee_model.addedNewEmployee.connect(onAddNewEmployee)
}
// }
// } // ScrollView
function onAddNewEmployee(added)
{
if (added)
console.log('addedsuccesfully')
else
console.log('failedtoadd')
appLoader.source = 'EmployeeTable.qml'
}
function checkFields()
{
if(radio.children[1].checked)
{
if(!personalData.checkPersonalField())
saveBtn.enabled = false
else
saveBtn.enabled = true
}
else if (!personalData.checkPersonalField())
saveBtn.enabled = false
else
saveBtn.enabled = true
}
}

View File

@@ -59,7 +59,7 @@ ColumnLayout
Button Button
{ {
text: qsTr("Abbrechen") text: qsTr("Abbrechen")
onClicked: appLoader.source = "CustomerTable.qml" onClicked: contentStack.pop()
} }
Button Button
{ {
@@ -72,7 +72,7 @@ ColumnLayout
{ {
new_business = JsLib.parseForm(customerView) new_business = JsLib.parseForm(customerView)
business_model.addBusiness(new_business, 0) business_model.addBusiness(new_business, 0)
appLoader.source = "CustomerTable.qml" contentStack.pop()
} }
else else
{ {
@@ -99,7 +99,7 @@ ColumnLayout
{ {
var con_id = arguments[0] var con_id = arguments[0]
business_model.addBusiness(new_business, con_id) business_model.addBusiness(new_business, con_id)
appLoader.source = "CustomerTable.qml" contentStack.pop()
} }
} }

230
Gui/AddNewOffer.qml Normal file
View File

@@ -0,0 +1,230 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
GridLayout
{
id: newObject
columns: 4
Layout.fillWidth: true
Layout.fillHeight: true
rowSpacing: 9
//New Grid
Label
{
text: qsTr("Objekt:")
Layout.alignment: Qt.AlignRight
font: Typography.h2
}
Item
{
Layout.columnSpan: 3
}
//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
}
Button
{
text: qsTr("Objekt hinzufügen")
icon.source: "qrc:/images/PlusCircle.svg"
}
Item
{
}
//// 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")
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
}
//New Grid
Label
{
text: qsTr("Kunde:")
Layout.alignment: Qt.AlignRight
font: Typography.h2
}
Item
{
Layout.columnSpan: 3
}
//New grid row
Label
{
text: qsTr("Kunden-Nr.")
Layout.alignment: Qt.AlignRight
}
TextField
{
property string name: "customerno"
id: customerno
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
}
Button
{
text: qsTr("Kunde hinzufügen")
icon.source: "qrc:/images/PlusCircle.svg"
}
Item
{
}
// New grid row
Label
{
text: qsTr("Kunden-Name")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
id: customerName
Layout.fillWidth: true
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
{
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

@@ -61,7 +61,7 @@ ColumnLayout
Button Button
{ {
text: qsTr("Abbrechen") text: qsTr("Abbrechen")
onClicked: appLoader.source = "ObjectTable.qml" onClicked: contentStack.pop()
} }
Button Button
{ {
@@ -105,7 +105,7 @@ ColumnLayout
object_model.viewCriterion("Alle") object_model.viewCriterion("Alle")
} }
appLoader.source = "ObjectTable.qml" contentStack.pop()
} }
} }

112
Gui/AddOffer.qml Normal file
View File

@@ -0,0 +1,112 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import QtQuick.Dialogs
import "../js/qmldict.js" as JsLib
ColumnLayout
{
property var new_object: null
//property alias checkAddContact: checkAddContact
Layout.fillWidth: true
Layout.fillHeight: true
spacing: 15
Label
{
text: qsTr("Angebot anlegen")
horizontalAlignment: Text.AlignHCenter
Layout.fillWidth: true
font.pixelSize: 35
}
RowLayout
{
id: addObject
Layout.fillWidth: true
Layout.fillHeight: true
spacing: 45
Frame
{
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
AddNewOffer
{
id: newOffer
width: parent.width
}
}
}
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)
// 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")
// }
// 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

@@ -51,6 +51,15 @@ GridLayout
placeholderText: qsTr("Hier Passwort eingeben") placeholderText: qsTr("Hier Passwort eingeben")
Layout.fillWidth: true Layout.fillWidth: true
property string name: "PYQCRM_USER_PASS" property string name: "PYQCRM_USER_PASS"
color: acceptableInput ? "black" : "red"
ToolTip.visible: hovered && !acceptableInput
ToolTip.text: "Passwort muss mind. 12 Zeichen lang sein und Groß-, Kleinbuchstaben, Zahlen sowie Sonderzeichen (!@#$%^&*()_+-=) enthalten."
validator: RegularExpressionValidator {
regularExpression: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+\-=]).{12,}$/
}
} }
Label Label
{ {

View File

@@ -12,8 +12,7 @@ ColumnLayout
Button Button
{ {
text: qsTr("Zurück") text: qsTr("Zurück")
//Layout.columnSpan: 2 onClicked: contentStack.pop()
onClicked: customersStack.pop()
} }
SplitView SplitView

View File

@@ -1,21 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
Item {
anchors.fill: parent
property var availableFilters: ["Name", "Adresse", "PLZ", "Ort"]
StackView
{
id: customersStack
anchors.fill: parent
initialItem: "CustomersTable.qml"
}
}

View File

@@ -4,6 +4,7 @@ import QtQuick.Controls
import Qt.labs.qmlmodels import Qt.labs.qmlmodels
ColumnLayout { ColumnLayout {
property var availableFilters: ["Name", "Adresse", "PLZ", "Ort"]
function viewCriterion(criterion) function viewCriterion(criterion)
{ {
@@ -15,7 +16,7 @@ ColumnLayout {
anchors.fill: parent anchors.fill: parent
spacing: Dimensions.l spacing: Dimensions.l
Component.onCompleted: customersStack.pop() Component.onCompleted: contentStack.pop()
RowLayout RowLayout
{ {
@@ -67,7 +68,7 @@ ColumnLayout {
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
icon.source: "qrc:/images/PlusCircle.svg" icon.source: "qrc:/images/PlusCircle.svg"
text: qsTr("Kunde Hinzufügen") text: qsTr("Kunde Hinzufügen")
onClicked: appLoader.source = "AddCustomer.qml" onClicked: contentStack.push("AddCustomer.qml")
} }
} }
ColumnLayout ColumnLayout
@@ -153,7 +154,7 @@ ColumnLayout {
onDoubleClicked: { onDoubleClicked: {
business_model.onRowClicked(row); business_model.onRowClicked(row);
customersStack.push("CustomerDetails.qml", { contentStack.push("CustomerDetails.qml", {
selectedClient: row selectedClient: row
}); });
} }

View File

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

View File

@@ -1,16 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
Item {
anchors.fill: parent
StackView {
id: employeesStack
anchors.fill: parent
initialItem: "EmployeesTable.qml"
}
}

View File

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

View File

@@ -0,0 +1,102 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import "../../js/qmldict.js" as JsLib
ColumnLayout {
id: colPar
function checkFields() {
if (!personalData.checkPersonalField())
saveBtn.enabled = false;
else
saveBtn.enabled = true;
}
function onAddNewEmployee(added) {
if (added) {
console.log('addedsuccesfully');
contentStack.pop();
} else {
console.log('failedtoadd');
}
}
Layout.fillHeight: true
Layout.fillWidth: true
anchors.fill: parent
implicitWidth: parent.width
Component.onCompleted: {
employee_model.addedNewEmployee.connect(onAddNewEmployee);
}
Label {
id: headline
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
font.pixelSize: 35
text: qsTr("Mitarbeiter / Bewerber hinzufügen")
}
RowLayout {
Layout.fillWidth: true
spacing: Dimensions.l
Frame {
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
Layout.horizontalStretchFactor: 1
ApplicantPersonalData {
id: personalData
implicitWidth: parent.width
}
}
Frame {
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
Layout.horizontalStretchFactor: 1
ColumnLayout {
Layout.alignment: Qt.AlignTop
implicitWidth: parent.width
ApplicantBankData {
id: bankAccount
}
ApplicantNationalInsurance {
id: nationalInsurance
}
ApplicantVarious {
id: applicantVarious
}
}
}
}
Item {
Layout.fillHeight: true
}
RowLayout {
Layout.alignment: Qt.AlignRight
Layout.fillWidth: true
Button {
text: qsTr("Abbrechen")
onClicked: contentStack.pop()
}
Button {
id: saveBtn
enabled: false
text: qsTr("Speichern")
onClicked: {
const new_applicant = JsLib.parseForm(personalData, bankAccount, nationalInsurance, applicantVarious);
employee_model.addEmployee(new_applicant);
}
}
}
}

View File

@@ -0,0 +1,221 @@
import QtQuick
import QtQuick.Controls.impl
import QtQuick.Layouts
import TeroStyle
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.currentText ?? ""
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.editText ? street.editText : street.currentText) ?? ""
readonly property string title: title.currentText
}
spacing: Dimensions.l
IconLabel {
color: Colors.foreground
font: Typography.h2
icon.color: Colors.foreground
icon.height: Typography.h2.pixelSize
icon.source: "qrc:/images/UserCircle"
icon.width: Typography.h2.pixelSize
spacing: Dimensions.m
text: qsTr("Stammdaten")
}
RowLayout {
spacing: Dimensions.m
Field {
label: qsTr("Anrede")
ComboBox {
id: title
implicitWidth: fieldM
model: [qsTr("Keine Angabe"), qsTr("Herr"), qsTr("Frau")]
onCurrentTextChanged: {
switch (title.currentIndex) {
case 1:
formofaddress.text = "Sehr geehrter Herr ";
break;
case 2:
formofaddress.text = "Sehr geehrte Frau ";
break;
default:
formofaddress.text = "Guten Tag ";
}
}
}
}
Field {
label: qsTr("Vorname")
mandatory: true
TextField {
id: firstname
implicitWidth: fieldM
placeholderText: qsTr("Max")
validator: NotEmptyValidator {
}
}
}
Field {
label: qsTr("Nachname")
mandatory: true
TextField {
id: lastname
implicitWidth: fieldM
placeholderText: qsTr("Mustermann")
validator: NotEmptyValidator {
}
}
}
}
RowLayout {
spacing: Dimensions.m
Field {
id: street
label: qsTr("Straße")
mandatory: true
TextField {
implicitWidth: fieldM
placeholderText: qsTr("Musterstraße")
validator: NotEmptyValidator {
}
}
}
Field {
id: houseno
mandatory: true
label: qsTr("Hausnummer")
TextField {
implicitWidth: fieldS
placeholderText: qsTr("1a")
validator: NotEmptyValidator {
}
}
}
Field {
label: qsTr("PLZ")
mandatory: true
ComboBox {
id: postcode
currentIndex: -1
editable: true
implicitWidth: fieldS
model: address_model
textRole: "display"
onActivated: currentValue
onCurrentIndexChanged: city.currentIndex = postcode.currentIndex
validator: NotEmptyValidator {}
}
}
Field {
label: qsTr("Ort")
mandatory: true
ComboBox {
id: city
currentIndex: -1
editable: true
implicitWidth: fieldM
model: address_model
textRole: "city"
validator: NotEmptyValidator {
}
}
}
}
IconLabel {
color: Colors.foreground
font: Typography.h2
icon.color: Colors.foreground
icon.height: Typography.h2.pixelSize
icon.source: "qrc:/images/Phone"
icon.width: Typography.h2.pixelSize
spacing: Dimensions.m
text: qsTr("Kontakt")
}
RowLayout {
spacing: Dimensions.m
Field {
label: qsTr("Telefonnummer")
TextField {
id: phone
implicitWidth: fieldM
placeholderText: "+49 1234 567890"
validator: OptionalPhoneNumberValidator {
}
}
}
Field {
label: qsTr("Mobil")
TextField {
id: mobile
implicitWidth: fieldM
placeholderText: "+49 123 4567891011"
validator: OptionalPhoneNumberValidator {
}
}
}
Field {
label: qsTr("E-Mail Adresse")
TextField {
id: email
implicitWidth: fieldM
placeholderText: "tero@example.org"
validator: OptionalEmailAddressValidator {
}
}
}
Field {
label: qsTr("Briefanrede")
TextField {
id: formofaddress
implicitWidth: fieldM
}
}
}
}

View File

@@ -1,444 +1,409 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import TeroStyle
GridLayout GridLayout {
{
id: personalData id: personalData
columns: 4
Label function checkPersonalField() {
{ return (firstname.text.trim() && lastname.text.trim() && street.text.trim() && houseno.text.trim() && (postcode.editText.trim() || postcode.currentText.trim()) && (city.editText.trim() || city.currentText.trim()) && birthday.text.trim() && phonenumber.text.trim() && cellphone.text.trim() && email.text.trim() && jobdescription.text.trim() && contractstart.text.trim() && contractend.text.trim() && briefAnrede.text.trim());
text: qsTr("Anrede")
Layout.alignment: Qt.AlignRight
} }
ComboBox function requiredField() {
{ const pf = "Pflichtfeld";
property string name: "title" street.placeholderText = pf;
phonenumber.placeholderText = pf;
cellphone.placeholderText = pf;
email.placeholderText = pf;
jobdescription.placeholderText = pf;
contractstart.placeholderText = pf;
contractend.placeholderText = pf;
briefAnrede.placeholderText = pf;
houseno.placeholderText = pf;
}
columns: 4
Label {
Layout.alignment: Qt.AlignRight
text: qsTr("Anrede")
}
ComboBox {
id: title id: title
property string name: "title"
Layout.columnSpan: 3
Layout.fillWidth: true Layout.fillWidth: true
editable: false editable: false
Layout.columnSpan: 3
model: [qsTr("Keine Angabe"), qsTr("Herr"), qsTr("Frau")] model: [qsTr("Keine Angabe"), qsTr("Herr"), qsTr("Frau")]
onCurrentTextChanged:
{ onCurrentTextChanged: {
switch (title.currentIndex) switch (title.currentIndex) {
{ case 1:
case 1: briefAnrede.text = "Sehr geehrter Herr ";
briefAnrede.text = "Sehr geehrter Herr " break;
break case 2:
case 2: briefAnrede.text = "Sehr geehrte Frau ";
briefAnrede.text = "Sehr geehrte Frau " break;
break default:
default: briefAnrede.text = "Guten Tag ";
briefAnrede.text = "Guten Tag "
} }
} }
} }
Label Label {
{ Layout.alignment: Qt.AlignRight
text: qsTr("Vorname*") text: qsTr("Vorname*")
Layout.alignment: Qt.AlignRight
} }
TextField TextField {
{
property string name: "firstname"
id: firstname id: firstname
Layout.fillWidth: true
onTextChanged: checkFields()
Layout.columnSpan: 3
}
Label
{
text: qsTr("Nachname*")
Layout.alignment: Qt.AlignRight
}
TextField
{
property string name: "lastname"
id: lastname
Layout.fillWidth: true
onTextChanged: checkFields()
Layout.columnSpan: 3
}
Label
{
text: qsTr("Straße")
Layout.alignment: Qt.AlignRight
}
TextField
{
property string name: "street"
id: street
Layout.fillWidth: true
placeholderTextColor: "red"
onTextChanged: checkFields()
property string name: "firstname"
Layout.columnSpan: 3
Layout.fillWidth: true
onTextChanged: checkFields()
} }
Label Label {
{
text: qsTr("Nr.")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
text: qsTr("Nachname*")
} }
TextField TextField {
{ id: lastname
property string name: "houseno"
id: houseno property string name: "lastname"
Layout.columnSpan: 3
Layout.fillWidth: true
onTextChanged: checkFields()
}
Label {
Layout.alignment: Qt.AlignRight
text: qsTr("Straße")
}
TextField {
id: street
property string name: "street"
Layout.fillWidth: true Layout.fillWidth: true
placeholderTextColor: "red" placeholderTextColor: "red"
onTextChanged: checkFields() onTextChanged: checkFields()
validator: RegularExpressionValidator }
{ Label {
Layout.alignment: Qt.AlignRight
text: qsTr("Nr.")
}
TextField {
id: houseno
property string name: "houseno"
Layout.fillWidth: true
placeholderTextColor: "red"
validator: RegularExpressionValidator {
regularExpression: /([0-9a-zA-Z\-]{1,6})/ regularExpression: /([0-9a-zA-Z\-]{1,6})/
} }
onTextChanged: checkFields()
} }
Label Label {
{ Layout.alignment: Qt.AlignRight
text: qsTr("PLZ") text: qsTr("PLZ")
Layout.alignment: Qt.AlignRight
} }
ComboBox {
ComboBox
{
property string name: "postcode"
id: postcode id: postcode
property string name: "postcode"
Layout.fillWidth: true Layout.fillWidth: true
currentIndex: -1
editable: true editable: true
onEditTextChanged: checkFields()
onCurrentTextChanged: checkFields()
onActivated: currentValue
model: address_model model: address_model
popup.height: 300
textRole: "display" textRole: "display"
popup.height: 300
currentIndex: -1 validator: PostcodeValidator {
onCurrentIndexChanged: city.currentIndex = postcode.currentIndex
validator: RegularExpressionValidator
{
regularExpression: /([^$][0-9]{1,4})/
} }
}
onActivated: currentValue
Label onCurrentIndexChanged: city.currentIndex = postcode.currentIndex
{
text: qsTr("Ort")
Layout.alignment: Qt.AlignRight
}
ComboBox
{
property string name: "city"
id: city
Layout.fillWidth: true
editable: true
onEditTextChanged: checkFields()
onCurrentTextChanged: checkFields() onCurrentTextChanged: checkFields()
model: address_model onEditTextChanged: checkFields()
textRole: "city" }
popup.height: 300 Label {
currentIndex: -1 Layout.alignment: Qt.AlignRight
text: qsTr("Ort")
}
ComboBox {
id: city
property string name: "city"
Layout.fillWidth: true
currentIndex: -1
editable: true
model: address_model
popup.height: 300
textRole: "city"
onCurrentTextChanged: checkFields()
onEditTextChanged: checkFields()
} }
Label Label {
{ Layout.alignment: Qt.AlignRight
text: qsTr("Geburtsname") text: qsTr("Geburtsname")
Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked
} }
TextField TextField {
{
property string name: "birthname"
id: birthname id: birthname
Layout.fillWidth: true
onTextChanged: checkFields() property string name: "birthname"
Layout.columnSpan: 3 Layout.columnSpan: 3
visible: radio.children[1].checked Layout.fillWidth: true
onTextChanged: checkFields()
} }
Label Label {
{
text: qsTr("Geburtsdatum*")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked text: qsTr("Geburtsdatum*")
} }
TextField TextField {
{
property string name: "birthday"
id: birthday id: birthday
Layout.fillWidth: true
onTextChanged: checkFields() property string name: "birthday"
Layout.columnSpan: 3 Layout.columnSpan: 3
visible: radio.children[1].checked Layout.fillWidth: true
validator: RegularExpressionValidator
{ validator: RegularExpressionValidator {
regularExpression: /((^|)(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]))\.((^|)(0[1-9]{1}|1[0-2]{1}))\.((^|)(196[0-9]{1}|19[7-9]{1}[0-9]{1}|20[0-9]{2}))/ regularExpression: /((^|)(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]))\.((^|)(0[1-9]{1}|1[0-2]{1}))\.((^|)(196[0-9]{1}|19[7-9]{1}[0-9]{1}|20[0-9]{2}))/
} }
Keys.onPressed: (event)=>
{ Keys.onPressed: event => {
if (event.key !== Qt.Key_Backspace) if (event.key !== Qt.Key_Backspace) {
{ var len = birthday.length;
var len = birthday.length var bd = birthday.text;
var bd = birthday.text if (len === 2 || len === 5)
if (len === 2 || len === 5) birthday.text = bd + "." birthday.text = bd + ".";
} }
} }
onTextChanged: checkFields()
} }
Label {
Label Layout.alignment: Qt.AlignRight
{
text: qsTr("Geburtsort*") text: qsTr("Geburtsort*")
Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked
} }
TextField TextField {
{
property string name: "placeofbirth"
id: placeofbirth id: placeofbirth
Layout.fillWidth: true
onTextChanged: checkFields()
Layout.columnSpan: 3
visible: radio.children[1].checked
}
Label property string name: "placeofbirth"
{
Layout.columnSpan: 3
Layout.fillWidth: true
onTextChanged: checkFields()
}
Label {
Layout.alignment: Qt.AlignRight
text: qsTr("Telefonnummer") text: qsTr("Telefonnummer")
Layout.alignment: Qt.AlignRight
} }
TextField TextField {
{
property string name: "phone"
id: phonenumber id: phonenumber
property string name: "phone"
Layout.columnSpan: 3
Layout.fillWidth: true Layout.fillWidth: true
placeholderTextColor: "red" placeholderTextColor: "red"
Layout.columnSpan: 3
onTextChanged: checkFields() validator: RegularExpressionValidator {
validator: RegularExpressionValidator
{
regularExpression: /([+0-9]{1})([0-9]{1,17})/ regularExpression: /([+0-9]{1})([0-9]{1,17})/
} }
onTextChanged: checkFields()
} }
Label Label {
{ Layout.alignment: Qt.AlignRight
text: qsTr("Mobil") text: qsTr("Mobil")
Layout.alignment: Qt.AlignRight
} }
TextField TextField {
{
property string name: "mobile"
id: cellphone id: cellphone
property string name: "mobile"
Layout.columnSpan: 3
Layout.fillWidth: true Layout.fillWidth: true
placeholderTextColor: "red" placeholderTextColor: "red"
Layout.columnSpan: 3
onTextChanged: checkFields() validator: RegularExpressionValidator {
validator: RegularExpressionValidator
{
regularExpression: /([+0-9]{1})([0-9]{1,17})/ regularExpression: /([+0-9]{1})([0-9]{1,17})/
} }
}
Label
{
text: qsTr("E-Mail")
Layout.alignment: Qt.AlignRight
}
TextField
{
property string name: "email"
id: email
Layout.fillWidth: true
placeholderTextColor: "red"
Layout.columnSpan: 3
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: qsTr("beispiel@domain.de")
validator: RegularExpressionValidator
{
regularExpression: /([\+!#$%&\*\\/\=?\^_`\.{|}\~\-\_0-9A-Za-z]{1,185})@([0-9A-Za-z\.\-\_]{1,64})\.([a-zA-z]{2,5})/
}
} }
Label Label {
{
text: qsTr("Familienstand")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked text: qsTr("E-Mail")
} }
ComboBox TextField {
{ id: email
property string name: "maritalstatus"
property string name: "email"
Layout.columnSpan: 3
Layout.fillWidth: true
placeholderText: qsTr("beispiel@domain.de")
placeholderTextColor: "red"
validator: EmailAddressValidator {
}
onTextChanged: checkFields()
}
Label {
Layout.alignment: Qt.AlignRight
text: qsTr("Familienstand")
}
ComboBox {
id: maritalstatus id: maritalstatus
property string name: "maritalstatus"
Layout.columnSpan: 3
Layout.fillWidth: true Layout.fillWidth: true
editable: false editable: false
model: [qsTr("ledig"), qsTr("verheiratet"), qsTr("verwitwet"), qsTr("geschieden")] model: [qsTr("ledig"), qsTr("verheiratet"), qsTr("verwitwet"), qsTr("geschieden")]
visible: radio.children[1].checked
Layout.columnSpan: 3
} }
Label Label {
{ Layout.alignment: Qt.AlignRight
text: qsTr("Stundenlohn") text: qsTr("Stundenlohn")
Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked
} }
TextField TextField {
{
property string name: "salary"
id: salary id: salary
Layout.fillWidth: true
visible: radio.children[1].checked
placeholderTextColor: "red"
Layout.columnSpan: 3
onTextChanged: checkFields()
}
Label
{
text: qsTr("Jobbeschreibung")
Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked
}
TextField
{
property string name: "jobdesc"
id: jobdescription
Layout.fillWidth: true
visible: radio.children[1].checked
placeholderTextColor: "red"
Layout.columnSpan: 3
onTextChanged: checkFields()
}
Label
{
text: qsTr("Vertragsbeginn")
Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked
}
TextField
{
property string name: "contractstart"
id: contractstart
Layout.fillWidth: true
visible: radio.children[1].checked
placeholderTextColor: "red"
Layout.columnSpan: 3
onTextChanged: checkFields()
validator: RegularExpressionValidator
{
regularExpression: /((^|)(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]))\.((^|)(0[1-9]{1}|1[0-2]{1}))\.((^|)(196[0-9]{1}|19[7-9]{1}[0-9]{1}|20[0-9]{2}))/
}
Keys.onPressed: (event)=>
{
if (event.key !== Qt.Key_Backspace)
{
var len = contractstart.length
var bd = contractstart.text
if (len === 2 || len === 5) contractstart.text = bd + "."
}
}
}
Label
{
text: qsTr("Vertragsende")
Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked
}
TextField
{
property string name: "contractend"
id: contractend
Layout.fillWidth: true
visible: radio.children[1].checked
placeholderTextColor: "red"
Layout.columnSpan: 3
onTextChanged: checkFields()
validator: RegularExpressionValidator
{
regularExpression: /((^|)(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]))\.((^|)(0[1-9]{1}|1[0-2]{1}))\.((^|)(196[0-9]{1}|19[7-9]{1}[0-9]{1}|20[0-9]{2}))/
}
Keys.onPressed: (event)=>
{
if (event.key !== Qt.Key_Backspace)
{
var len = contractend.length
var bd = contractend.text
if (len === 2 || len === 5) contractend.text = bd + "."
}
}
}
Label
{
text: qsTr("Arbeitszeiten Tage")
Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked
}
ComboBox
{
property string name: "workdays"
id: workdays
Layout.fillWidth: true
visible: radio.children[1].checked
model: ["1","2","3","4","5","6","7"]
}
Label
{
text: qsTr("Stunden")
Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked
}
ComboBox
{
property string name: "workhours"
id: workhours
Layout.fillWidth: true
visible: radio.children[1].checked
model: ["1","2","3","4","5","6","7","8"]
}
Label
{
text: qsTr("Briefanrede")
Layout.alignment: Qt.AlignRight
}
TextField
{
property string name: "formofaddress"
id: briefAnrede
Layout.fillWidth: true
placeholderTextColor: "red"
Layout.columnSpan: 3
onTextChanged: checkFields()
}
Item property string name: "salary"
{
Layout.fillHeight: true Layout.columnSpan: 3
Layout.fillWidth: true
placeholderTextColor: "red"
onTextChanged: checkFields()
}
Label {
Layout.alignment: Qt.AlignRight
text: qsTr("Jobbeschreibung")
}
TextField {
id: jobdescription
property string name: "jobdesc"
Layout.columnSpan: 3
Layout.fillWidth: true
placeholderTextColor: "red"
onTextChanged: checkFields()
}
Label {
Layout.alignment: Qt.AlignRight
text: qsTr("Vertragsbeginn")
}
TextField {
id: contractstart
property string name: "contractstart"
Layout.columnSpan: 3
Layout.fillWidth: true
placeholderTextColor: "red"
validator: RegularExpressionValidator {
regularExpression: /((^|)(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]))\.((^|)(0[1-9]{1}|1[0-2]{1}))\.((^|)(196[0-9]{1}|19[7-9]{1}[0-9]{1}|20[0-9]{2}))/
}
Keys.onPressed: event => {
if (event.key !== Qt.Key_Backspace) {
var len = contractstart.length;
var bd = contractstart.text;
if (len === 2 || len === 5)
contractstart.text = bd + ".";
}
}
onTextChanged: checkFields()
}
Label {
Layout.alignment: Qt.AlignRight
text: qsTr("Vertragsende")
}
TextField {
id: contractend
property string name: "contractend"
Layout.columnSpan: 3
Layout.fillWidth: true
placeholderTextColor: "red"
validator: RegularExpressionValidator {
regularExpression: /((^|)(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]))\.((^|)(0[1-9]{1}|1[0-2]{1}))\.((^|)(196[0-9]{1}|19[7-9]{1}[0-9]{1}|20[0-9]{2}))/
}
Keys.onPressed: event => {
if (event.key !== Qt.Key_Backspace) {
var len = contractend.length;
var bd = contractend.text;
if (len === 2 || len === 5)
contractend.text = bd + ".";
}
}
onTextChanged: checkFields()
}
Label {
Layout.alignment: Qt.AlignRight
text: qsTr("Arbeitszeiten Tage")
}
ComboBox {
id: workdays
property string name: "workdays"
Layout.fillWidth: true
model: ["1", "2", "3", "4", "5", "6", "7"]
}
Label {
Layout.alignment: Qt.AlignRight
text: qsTr("Stunden")
}
ComboBox {
id: workhours
property string name: "workhours"
Layout.fillWidth: true
model: ["1", "2", "3", "4", "5", "6", "7", "8"]
}
Label {
Layout.alignment: Qt.AlignRight
text: qsTr("Briefanrede")
}
TextField {
id: briefAnrede
property string name: "formofaddress"
Layout.columnSpan: 3
Layout.fillWidth: true
placeholderTextColor: "red"
onTextChanged: checkFields()
}
Item {
Layout.columnSpan: 4 Layout.columnSpan: 4
} Layout.fillHeight: true
function checkPersonalField()
{
if (radio.children[0].checked)
{
return (firstname.text.trim() && lastname.text.trim())
}
else
{
return (firstname.text.trim() && lastname.text.trim() && street.text.trim() && houseno.text.trim()
&& (postcode.editText.trim() || postcode.currentText.trim())
&& (city.editText.trim() || city.currentText.trim())
&& birthday.text.trim() && phonenumber.text.trim()
&& cellphone.text.trim() && email.text.trim() && jobdescription.text.trim()
&& contractstart.text.trim() && contractend.text.trim() && briefAnrede.text.trim())
}
}
function requiredField()
{
var pf = (radio.children[1].checked)?"Pflichtfeld":""
street.placeholderText = pf
phonenumber.placeholderText = pf
cellphone.placeholderText = pf
email.placeholderText = pf
jobdescription.placeholderText = pf
contractstart.placeholderText = pf
contractend.placeholderText = pf
briefAnrede.placeholderText = pf
houseno.placeholderText = pf
} }
} }

View File

@@ -16,7 +16,7 @@ Item
Button Button
{ {
text: qsTr("Mitarbeiter zeigen") text: qsTr("Mitarbeiter zeigen")
onClicked: employeesStack.pop() onClicked: contentStack.pop()
} }
} }

View File

@@ -0,0 +1,142 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
ColumnLayout {
anchors.fill: parent
spacing: Dimensions.l
RowLayout {
Layout.fillWidth: true
spacing: Dimensions.l
SearchBar {
}
QuickFilter {
model: ListModel {
ListElement {
name: "Alle"
selected: true
text: qsTr("Alle")
}
ListElement {
name: "Bewerber"
selected: false
text: qsTr("Bewerber")
}
ListElement {
name: "Mitarbeiter"
selected: false
text: qsTr("Kunde")
}
ListElement {
name: "Erledigt"
selected: false
text: qsTr("Erledigt")
}
}
onSelectedChanged: name => {
employee_model.viewCriterion(name);
}
}
Button {
Layout.alignment: Qt.AlignRight
flat: true
icon.source: "qrc:/images/PlusCircle.svg"
text: qsTr("Bewerber Hinzufügen")
onClicked: contentStack.push("AddApplicant.qml")
}
Button {
Layout.alignment: Qt.AlignRight
flat: true
icon.source: "qrc:/images/PlusCircle.svg"
text: qsTr("Mitarbeiter Hinzufügen")
onClicked: contentStack.push("AddEmployee.qml")
}
}
ColumnLayout {
Layout.fillHeight: true
Layout.fillWidth: true
spacing: 2
HorizontalHeaderView {
movableColumns: true
syncView: employeesTable
delegate: Rectangle {
Layout.fillWidth: true
color: Colors.primary
implicitHeight: 33
implicitWidth: 1
Text {
color: Colors.primaryContrast
elide: Text.ElideRight
font: Typography.smallBold
height: parent.height
horizontalAlignment: Text.AlignLeft
padding: Dimensions.s
text: model.display
verticalAlignment: Text.AlignVCenter
width: parent.width
}
}
}
TableView {
id: employeesTable
Layout.fillHeight: true
Layout.fillWidth: true
columnSpacing: 2
model: employee_model
resizableColumns: true
rowSpacing: 2
selectionBehavior: TableView.SelectRows
z: 1
ScrollBar.vertical: ScrollBar {
policy: ScrollBar.AsNeeded
}
delegate: Rectangle {
required property bool selected
color: selected ? Colors.primaryHighlight : Colors.transparent
implicitHeight: 33
implicitWidth: employeesTable.width / employeesTable.columns
Text {
color: Colors.foreground
elide: Text.ElideRight
font: Typography.small
height: parent.height
padding: Dimensions.s
text: (model.display === null || model.display === undefined) ? "" : model.display
verticalAlignment: Text.AlignVCenter
width: parent.width
}
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
onClicked: {
contentStack.push("EmployeeDetails.qml", {
selectedEmployee: row
});
}
onEntered: {
employeesTable.selectionModel.select(employeesTable.model.index(row, 0), ItemSelectionModel.SelectCurrent | ItemSelectionModel.Rows);
}
}
}
selectionModel: ItemSelectionModel {
model: employeesTable.model
}
}
}
}

1
Gui/Employees/qmldir Normal file
View File

@@ -0,0 +1 @@
module Employees

View File

@@ -1,187 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
ColumnLayout
{
function viewEmployees(criterion)
{
employee_model.viewCriterion(criterion)
// employee_model.viewCriterion(criterion, showProcessed.checked, showFired.checked, showEveryone.checked)
}
anchors.fill: parent
spacing: Dimensions.l
Component.onCompleted: employeesStack.pop()
// property var availableFilters: ["Name", "Adresse", "PLZ", "Ort", "Status"]
RowLayout
{
Layout.fillWidth: true
spacing: Dimensions.l
SearchBar
{
id:searchBar
}
QuickFilter
{
onSelectedChanged: (name) =>
{
business_model.viewCriterion(name)
}
model: ListModel
{
ListElement
{
name: "Alle"
text: qsTr("Alle")
selected: true
}
ListElement
{
name: "Bewerber"
text: qsTr("Bewerber")
selected: false
}
ListElement
{
name: "Mitarbeiter"
text: qsTr("Kunde")
selected: false
}
ListElement
{
name: "Erledigt"
text: qsTr("Erledigt")
selected: false
}
}
}
Button
{
id: addEmployeeBtn
text: qsTr("Mitarbeiter Hinzufügen")
icon.source: "qrc:/images/PlusCircle.svg"
Layout.alignment: Qt.AlignRight
flat: true
onClicked: appLoader.source = "AddApplicant.qml"
}
}
HorizontalHeaderView
{
id: employeeTableHeader
Layout.fillWidth: true
syncView: appliEmpTable
implicitHeight: 40
movableColumns: true //@disable-check M16
delegate: Rectangle
{
color: addEmployeeBtn.palette.alternateBase
border.color: 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: palette.text
}
}
}
TableView
{
id: appliEmpTable
//Layout.fillHeight: true
//height: tableParent.height - (viewCriterion.height + employeeTableHeader.height)
Layout.fillWidth: true
Layout.fillHeight: true
columnSpacing: 1
rowSpacing: 2
alternatingRows: true
resizableColumns: true
model: employee_model
selectionBehavior: TableView.SelectRows
z: 1
ScrollBar.vertical: ScrollBar
{
policy: appliEmpTable.contentHeight > appliEmpTable.height ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff
}
selectionModel: ItemSelectionModel
{
id: selModel
model: appliEmpTable.model
}
delegate:Rectangle
{
required property bool selected
required property bool current
implicitWidth: appliEmpTable.width / appliEmpTable.columns
implicitHeight: 25
color: selected
? addEmployeeBtn.palette.highlight //palette.highlight
: (appliEmpTable.alternatingRows && row % 2 !== 0
? addEmployeeBtn.palette.base // palette.base
: addEmployeeBtn.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: palette.text
}
MouseArea
{
id: mouseArea
property bool hovered:false
anchors.fill: parent
hoverEnabled: true
onDoubleClicked:
{
employeesStack.push("EmployeeDetails.qml", {selectedEmployee: row});
}
onEntered:
{
appliEmpTable.selectionModel.select(appliEmpTable.model.index(row, 0), ItemSelectionModel.SelectCurrent | ItemSelectionModel.Rows)
}
}
}
}
Item
{
Layout.fillWidth: true
}
}
// function viewEmployees(criterion)
// {
// employee_model.viewCriterion(criterion, showProcessed.checked, showFired.checked, showEveryone.checked)
// }
// Component.onCompleted: employeesStack.pop()

View File

@@ -77,7 +77,7 @@ Item
title: qsTr("Wiederherstellen") title: qsTr("Wiederherstellen")
buttons: MessageDialog.Yes | MessageDialog.No buttons: MessageDialog.Yes | MessageDialog.No
onAccepted: recoveryPaswordDialog.open() onAccepted: recoveryPaswordDialog.open()
onRejected: gotoLogin() onRejected: contentStack.replace("LoginSreen.qml")
} }
MessageDialog MessageDialog
@@ -147,7 +147,7 @@ Item
if (!adminAvailable) config.saveRecoveryKey(saveRecoveryDialog.currentFile, recpass) if (!adminAvailable) config.saveRecoveryKey(saveRecoveryDialog.currentFile, recpass)
else config.getRecoveryKey(saveRecoveryDialog.currentFile, recpass) else config.getRecoveryKey(saveRecoveryDialog.currentFile, recpass)
gotoLogin() contentStack.replace("LoginSreen.qml")
} }
onRejected: onRejected:

View File

@@ -4,20 +4,19 @@ import QtQuick.Controls
import QtQuick.Dialogs import QtQuick.Dialogs
import QtQuick.Layouts import QtQuick.Layouts
Item { Item {
property string recpass: "" property string recpass: ""
function dbConnectionFailed(msg) { function dbConnectionFailed(msg) {
oschkar.notificationBox.informativeText = msg; notifications.notificationDialog.informativeText = msg;
oschkar.notificationBox.text = "Verbindung zum Datenbankserver verloren"; notifications.notificationDialog.text = "Verbindung zum Datenbankserver verloren";
oschkar.notificationBox.open(); notifications.notificationDialog.open();
} }
function getEncryptionKey() { function getEncryptionKey() {
recoveryPaswordDialog.open(); recoveryPaswordDialog.open();
} }
function loggedin() { function loggedin() {
appLoader.source = "Dashboard.qml"; contentStack.replace("Dashboard.qml");
} }
anchors.fill: parent anchors.fill: parent
@@ -79,8 +78,8 @@ Item {
} }
Button { Button {
Layout.topMargin: Dimensions.m Layout.topMargin: Dimensions.m
implicitWidth: parent.width
icon.source: "qrc:/images/ArrowRightEndOnRectangle.svg" icon.source: "qrc:/images/ArrowRightEndOnRectangle.svg"
implicitWidth: parent.width
text: qsTr("Login") text: qsTr("Login")
onClicked: { onClicked: {
@@ -132,8 +131,7 @@ Item {
onRejected: quit() onRejected: quit()
} }
Notifications { Notifications {
id: oschkar id: notifications
} }
} }
} }

120
Gui/Navigation.qml Normal file
View File

@@ -0,0 +1,120 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
ColumnLayout {
property bool onSubPage: false
height: parent.height
spacing: 0
z: 3
Component.onCompleted: {
onSubPage = Qt.binding(() => contentStack.depth > 1);
}
anchors {
left: parent.left
top: parent.top
}
ButtonGroup {
id: mainNav
}
BarButton {
ButtonGroup.group: mainNav
icon.source: "qrc:/images/Square3Stack3D-Outline.svg"
target: "/Gui/Dashboard.qml"
text: qsTr("Dashboard")
visible: !onSubPage
}
BarButton {
ButtonGroup.group: mainNav
icon.source: "qrc:/images/UserGroup-Outline.svg"
target: "/Gui/CustomersTable.qml"
text: qsTr("Kunden")
visible: !onSubPage
}
BarButton {
ButtonGroup.group: mainNav
icon.source: "qrc:/images/BuildingOffice2-Outline.svg"
target: "/Gui/ObjectsTable.qml"
text: qsTr("Objekt")
visible: !onSubPage
}
BarButton {
ButtonGroup.group: mainNav
icon.source: "qrc:/images/Identification-Outline.svg"
target: "/Gui/Employees/EmployeesTable.qml"
text: qsTr("Mitarbeiter")
visible: !onSubPage
}
BarButton {
ButtonGroup.group: mainNav
icon.source: "qrc:/images/RectangleStack-Outline.svg"
target: "/Gui/OffersTable.qml"
text: qsTr("Angebote")
visible: !onSubPage
}
BarButton {
ButtonGroup.group: mainNav
icon.source: "qrc:/images/Wallet-Outline.svg"
text: qsTr("Abrechnung")
visible: !onSubPage
}
BarButton {
icon.source: "qrc:/images/ArrowLeftCircle-Outline.svg"
text: qsTr("Zurück")
visible: onSubPage
checkable: false
onClicked: contentStack.pop();
}
Item {
Layout.fillHeight: true
}
BarButton {
checkable: false
icon.source: "qrc:/images/Bars3.svg"
onClicked: mainMenu.open()
Menu {
id: mainMenu
MenuItem {
text: qsTr("Einstellungen")
onTriggered: {
// TODO: Check if logged-in user is admin first!!
contentStack.push("PyqcrmConf.qml");
}
}
MenuSeparator {
}
MenuItem {
text: qsTr("Als PDF exportieren")
}
MenuSeparator {
}
MenuItem {
text: qsTr("Drucken")
}
MenuItem {
text: qsTr("Erweiterter Druck")
onTriggered: printerDialog.show()
}
MenuSeparator {
}
MenuItem {
text: qsTr("Über PYQCRM")
onTriggered: readMeWin.show()
}
}
}
}

View File

@@ -1,74 +1,27 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts
Rectangle ColumnLayout {
{ anchors.centerIn: parent
anchors.fill: parent spacing: Dimensions.s
color: "slateblue" height: implicitHeight
Rectangle H1 {
{ Layout.alignment: Qt.AlignCenter
id: info text: qsTr("Keine Verbindung zur Datenbank!")
anchors.horizontalCenter: parent.horizontalCenter color: Colors.foreground
color: "slateblue"
implicitHeight: 55
implicitWidth: parent.width / 4
y: parent.height / 4
Text
{
anchors.centerIn: parent
text: qsTr("Keine Verbindung zur Datenbank!")
color: "moccasin"
font.bold: true
font.pixelSize: 45
}
} }
H2 {
Rectangle Layout.alignment: Qt.AlignCenter
{ text: qsTr("Programm kann nicht starten…")
id: nostart color: Colors.foreground
anchors.top: info.bottom
color: "slateblue"
anchors.horizontalCenter: parent.horizontalCenter
implicitHeight: 55
implicitWidth: parent.width / 4
Text
{
text: qsTr("Programm kann nicht starten..")
color: "moccasin"
anchors.centerIn: parent
font.bold: true
font.pixelSize: 45
}
} }
Button {
Layout.topMargin: Dimensions.l
Layout.alignment: Qt.AlignCenter
text: qsTr("Beenden")
Rectangle onClicked: Qt.quit()
{
anchors.top: nostart.bottom
anchors.topMargin: 25
anchors.horizontalCenter: parent.horizontalCenter
color: "slateblue"
implicitHeight: 55
implicitWidth: parent.width / 4
Button
{
width: parent.width
height: 75
Text
{
text: qsTr("Beenden")
color: "moccasin"
anchors.centerIn: parent
font.bold: true
font.pixelSize: 45
}
anchors.centerIn: parent
background: Rectangle
{
color: "dodgerblue"
radius: 50
}
onClicked: Qt.quit()
}
} }
} }

View File

@@ -3,8 +3,6 @@ import QtQuick.Dialogs
Item Item
{ {
id: oschkar
property alias notificationBox: notificationDialog
MessageDialog MessageDialog
{ {
id: notificationDialog id: notificationDialog

View File

@@ -16,7 +16,7 @@ Item
Button Button
{ {
text: qsTr("Zurück zu den Objekten") text: qsTr("Zurück zu den Objekten")
onClicked: objectsStack.pop() onClicked: contentStack.pop()
} }
} }

View File

@@ -1,22 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
Item {
property var availableFilters: [""]
anchors.fill: parent
StackView
{
id: objectsStack
anchors.fill: parent
initialItem: "ObjectsTable.qml"
}
}

View File

@@ -1,26 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
Item {
property var availableFilters: [""]
anchors.fill: parent
StackView
{
id: objectsStack
anchors.fill: parent
initialItem: "ObjectsTable.qml"
<<<<<<< HEAD
anchors.topMargin: Dimensions.m
=======
>>>>>>> 7f5675c06d72728a2249b66dc18d56221ad5a0c97791edbc86afeb57dcb3392d
}
}

View File

@@ -1,26 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
Item {
property var availableFilters: [""]
anchors.fill: parent
StackView
{
id: objectsStack
anchors.fill: parent
initialItem: "ObjectsTable.qml"
<<<<<<< HEAD
anchors.topMargin: Dimensions.m
=======
>>>>>>> 7f5675c06d72728a2249b66dc18d56221ad5a0c97791edbc86afeb57dcb3392d
}
}

View File

@@ -1,22 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
Item {
property var availableFilters: [""]
StackView
{
id: objectsStack
anchors.fill: parent
initialItem: "ObjectsTable.qml"
anchors.margins: 9
}
}

View File

@@ -1,22 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
Item {
property var availableFilters: [""]
StackView
{
id: objectsStack
anchors.fill: parent
initialItem: "ObjectsTable.qml"
anchors.topMargin: Dimensions.m
}
}

View File

@@ -1,22 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
Item {
property var availableFilters: [""]
anchors.fill: parent
StackView
{
id: objectsStack
anchors.fill: parent
initialItem: "ObjectsTable.qml"
}
}

View File

@@ -5,9 +5,11 @@ import Qt.labs.qmlmodels
ColumnLayout ColumnLayout
{ {
property var availableFilters: [""]
anchors.fill: parent anchors.fill: parent
spacing: Dimensions.l spacing: Dimensions.l
function viewCriterion(criterion) function viewCriterion(criterion)
{ {
business_model.viewCriterion(criterion.text); business_model.viewCriterion(criterion.text);
@@ -21,7 +23,7 @@ ColumnLayout
Component.onCompleted: Component.onCompleted:
{ {
contact_model.objectContactAdded.connect(onObjectContactAdded) contact_model.objectContactAdded.connect(onObjectContactAdded)
objectsStack.pop() contentStack.pop()
} }
RowLayout RowLayout
{ {
@@ -43,23 +45,18 @@ ColumnLayout
selected: true selected: true
} }
ListElement { ListElement {
name: "Interessent" name: "Aktiv"
text: qsTr("Interessent") text: qsTr("Aktiv")
selected: false selected: false
} }
ListElement { ListElement {
name: "Kunde" name: "Ehemalig"
text: qsTr("Kunde") text: qsTr("Ehemalig")
selected: false selected: false
} }
ListElement { ListElement {
name: "Lieferant" name: "Angebote"
text: qsTr("Lieferant") text: qsTr("Angebote")
selected: false
}
ListElement {
name: "Erledigt"
text: qsTr("Erledigt")
selected: false selected: false
} }
} }
@@ -70,7 +67,7 @@ ColumnLayout
icon.source: "qrc:/images/PlusCircle.svg" icon.source: "qrc:/images/PlusCircle.svg"
text: qsTr("Objekt Hinzufügen") text: qsTr("Objekt Hinzufügen")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
onClicked: appLoader.source = "AddObject.qml" onClicked: contentStack.push("AddObject.qml")
} }
} }
@@ -172,7 +169,7 @@ ColumnLayout
hoverEnabled: true hoverEnabled: true
onDoubleClicked: onDoubleClicked:
{ {
objectsStack.push("ObjectDetails.qml", {selectedObject: row}); contentStack.push("ObjectDetails.qml", {selectedObject: row});
} }
onEntered: onEntered:
{ {

View File

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

View File

@@ -1,17 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
Item
{
anchors.fill: parent
StackView
{
id: offersStack
anchors.fill: parent
initialItem: "OffersTable.qml"
}
}

View File

@@ -1,22 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
Item
{
anchors.fill: parent
StackView
{
id: offersStack
anchors.fill: parent
initialItem: "OffersTable.qml"
<<<<<<< HEAD
anchors.topMargin: Dimensions.m
=======
>>>>>>> 7f5675c06d72728a2249b66dc18d56221ad5a0c97791edbc86afeb57dcb3392d
}
}

View File

@@ -20,18 +20,9 @@ ColumnLayout
{ {
id: searchBar id: searchBar
} }
QuickFilter QuickFilter {
{ model: ListModel {
onSelectedChanged: (name) => ListElement {
{
business_model.viewCriterion(name)
}
model: ListModel
{
ListElement
{
name: "Alle" name: "Alle"
text: qsTr("Alle") text: qsTr("Alle")
selected: true selected: true
@@ -45,17 +36,19 @@ ColumnLayout
ListElement ListElement
{ {
name: "Abgeschlossen" name: "Abgeschlossen"
selected: false
text: qsTr("Abgeschlossen") text: qsTr("Abgeschlossen")
selected: false
} }
ListElement {
ListElement
{
name: "Erledigt" name: "Erledigt"
text: qsTr("Erledigt")
selected: false selected: false
text: qsTr("Erledigt")
} }
} }
onSelectedChanged: name => {
business_model.viewCriterion(name);
}
} }
Button Button
{ {
@@ -64,14 +57,11 @@ ColumnLayout
icon.source: "qrc:/images/PlusCircle.svg" icon.source: "qrc:/images/PlusCircle.svg"
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
flat: true flat: true
//onClicked: appLoader.source = "AddOffer.qml" onClicked: appLoader.source = "AddOffer.qml"
} }
} }
Item { Item {
id: spacer id: spacer
Layout.fillHeight: true Layout.fillHeight: true
} }
} }

View File

@@ -3,36 +3,23 @@ import QtQuick.Layouts
import QtQuick.Controls import QtQuick.Controls
import Qt.labs.qmlmodels import Qt.labs.qmlmodels
<<<<<<< HEAD
ColumnLayout
{
anchors.fill: parent
function viewOffers(criterion)
{
//offer_model.viewCriterion(criterion)
=======
ColumnLayout { ColumnLayout {
property var availableFilters: [] function viewOffers(criterion) {
//offer_model.viewCriterion(criterion)
}
Layout.fillWidth: true
anchors.fill: parent anchors.fill: parent
spacing: Dimensions.l
RowLayout { RowLayout {
Layout.fillWidth: true
spacing: Dimensions.l spacing: Dimensions.l
SearchBar {
}
}
Item {
Layout.fillHeight: true
>>>>>>> 7f5675c06d72728a2249b66dc18d56221ad5a0c97791edbc86afeb57dcb3392d
}
RowLayout SearchBar {
{ id: searchBar
SearchBar
{
id:searchBar
} }
<<<<<<< HEAD
QuickFilter QuickFilter
{ {
onSelectedChanged: (name) => onSelectedChanged: (name) =>
@@ -44,47 +31,57 @@ ColumnLayout {
{ {
ListElement ListElement
{ {
=======
QuickFilter {
model: ListModel {
ListElement {
>>>>>>> main
name: "Alle" name: "Alle"
text: qsTr("Alle")
selected: true selected: true
text: qsTr("Alle")
} }
ListElement ListElement {
{
name: "Offen" name: "Offen"
selected: false
text: qsTr("Offen") text: qsTr("Offen")
selected: false
} }
<<<<<<< HEAD
ListElement ListElement
{ {
name: "Abgesagt"
text: qsTr("Abgesagt")
=======
ListElement {
name: "Abgeschlossen" name: "Abgeschlossen"
selected: false
text: qsTr("Abgeschlossen") text: qsTr("Abgeschlossen")
selected: false
} }
ListElement {
ListElement
{
name: "Erledigt" name: "Erledigt"
text: qsTr("Erledigt") >>>>>>> main
selected: false selected: false
text: qsTr("Erledigt")
} }
} }
onSelectedChanged: name => {
business_model.viewCriterion(name);
}
} }
Button Button {
{
id: addOfferBtn id: addOfferBtn
text: qsTr("Angebote Hinzufügen")
icon.source: "qrc:/images/PlusCircle.svg"
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
flat: true flat: true
//onClicked: appLoader.source = "AddOffer.qml" icon.source: "qrc:/images/PlusCircle.svg"
text: qsTr("Angebote Hinzufügen")
onClicked: contentStack.push("AddOffer.qml")
} }
} }
Item { Item {
id: spacer id: spacer
Layout.fillHeight: true Layout.fillHeight: true
} }
} }

View File

@@ -101,7 +101,7 @@ Item
Button Button
{ {
text: qsTr("Ablehnen") text: qsTr("Ablehnen")
onClicked: appLoader.source = "Dashboard.qml" onClicked: contentStack.pop()
} }
Button Button

View File

@@ -1,270 +0,0 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
ColumnLayout
{
id: topBar
spacing: 0
height: parent.height
anchors
{
top: parent.top
left: parent.left
}
ButtonGroup
{
id: buttonBar
}
BarButton
{
id: dashBoard
flat: true
text: qsTr("Dashboard")
implicitWidth: 90
implicitHeight: 90
Layout.margins: 3
Layout.topMargin: Dimensions.s
icon.source: "qrc:/images/dash.svg"
ButtonGroup.group: buttonBar
// background: Rectangle
// {
// id: dashiBackie
// border.width: dashBoard.activeFocus ? 2 : 1
// border.color: "#888"
// radius: 4
// gradient: Gradient
// {
// GradientStop { position: 0 ; color: dashBoard.pressed ? "#000" : "#001" }
// GradientStop { position: 1 ; color: dashBoard.pressed ? "#100" : "#000" }
// }
// }
onClicked:
{
appLoader.source = "Dashboard.qml"
// dashiBackie.border.width = 2
// kundiBackie.border.width = 1
// mitoBackie.border.width = 1
// invoBackie.border.width = 1
// objBackie.border.width = 1
}
}
BarButton
{
id: kunden
flat: true
text: qsTr("Kunden")
implicitWidth: 90
implicitHeight: 90
Layout.margins: 3
icon.source: "qrc:/images/customer.svg"
ButtonGroup.group: buttonBar
// background: Rectangle
// {
// id: kundiBackie
// border.width: kunden.activeFocus ? 2 : 1
// border.color: "#888"
// radius: 4
// gradient: Gradient
// {
// GradientStop { position: 0 ; color: kunden.pressed ? "#000" : "#001" }
// GradientStop { position: 1 ; color: kunden.pressed ? "#100" : "#000" }
// }
// }
onClicked:
{
// TODO: here we should call the model
appLoader.source = "CustomerTable.qml"
// kundiBackie.border.width = 2
// dashiBackie.border.width = 1
// mitoBackie.border.width = 1
// invoBackie.border.width = 1
// objBackie.border.width = 1
}
}
BarButton
{
id: objekt
flat: true
text: qsTr("Objekt")
implicitWidth: 90
implicitHeight: 90
Layout.margins: 3
icon.source: "qrc:/images/object.svg"
ButtonGroup.group: buttonBar
// background: Rectangle
// {
// id: objBackie
// border.width: objekt.activeFocus ? 2 : 1
// border.color: "#888"
// radius: 4
// gradient: Gradient
// {
// GradientStop { position: 0 ; color: objekt.pressed ? "#000" : "#001" }
// GradientStop { position: 1 ; color: objekt.pressed ? "#100" : "#000" }
// }
// }
onClicked:
{
appLoader.source = "ObjectTable.qml"
// objBackie.border.width = 2
// dashiBackie.border.width = 1
// kundiBackie.border.width = 1
// mitoBackie.border.width = 1
// invoBackie.border.width = 1
}
}
BarButton
{
id: mitarbeiter
flat: true
text: qsTr("Mitarbeiter")
implicitWidth: 90
implicitHeight: 90
Layout.margins: 3
icon.source: "qrc:/images/employee.svg"
ButtonGroup.group: buttonBar
// background: Rectangle
// {
// id: mitoBackie
// border.width: mitarbeiter.activeFocus ? 2 : 1
// border.color: "#888"
// radius: 4
// gradient: Gradient
// {
// GradientStop { position: 0 ; color: mitarbeiter.pressed ? "#000" : "#001" }
// GradientStop { position: 1 ; color: mitarbeiter.pressed ? "#100" : "#000" }
// }
// }
onClicked:
{
appLoader.source = "EmployeeTable.qml"
// mitoBackie.border.width = 2
// dashiBackie.border.width = 1
// kundiBackie.border.width = 1
// invoBackie.border.width = 1
// objBackie.border.width = 1
}
}
BarButton
{
id: offers
flat: true
text: qsTr("Angebote")
implicitWidth: 90
implicitHeight: 90
Layout.margins: 3
icon.source: "qrc:/images/offer.svg"
ButtonGroup.group: buttonBar
// background: Rectangle
// {
// id: offersBackie
// border.width: offers.activeFocus ? 2 : 1
// border.color: "#888"
// radius: 4
// gradient: Gradient
// {
// GradientStop { position: 0 ; color: offers.pressed ? "#000" : "#001" }
// GradientStop { position: 1 ; color: offers.pressed ? "#100" : "#000" }
// }
// }
onClicked:
{
appLoader.source = "OfferTable.qml"
// mitoBackie.border.width = 2
// dashiBackie.border.width = 1
// kundiBackie.border.width = 1
// invoBackie.border.width = 1
// objBackie.border.width = 1
// offersBackie.border.width = 1
}
}
BarButton
{
id: abrechnung
flat: true
text: qsTr("Abrechnung")
implicitWidth: 90
implicitHeight: 90
Layout.margins: 3
icon.source: "qrc:/images/invoice.svg"
ButtonGroup.group: buttonBar
// background: Rectangle
// {
// id: invoBackie
// border.width: abrechnung.activeFocus ? 2 : 1
// border.color: "#888"
// radius: 4
// gradient: Gradient
// {
// GradientStop { position: 0 ; color: abrechnung.pressed ? "#000" : "#001" }
// GradientStop { position: 1 ; color: abrechnung.pressed ? "#100" : "#000" }
// }
// }
}
Item
{
id: hspacer
Layout.fillHeight: true
}
BarButton
{
id: atajos
implicitWidth: 90
implicitHeight: 90
checkable: false
icon.source: "qrc:/images/Bars3.svg"
flat: true
Layout.bottomMargin: Dimensions.s
onClicked: mainMenu.open()
Menu {
id: mainMenu
MenuItem
{
//text: qsTr("Benutzer-Verwaltung")
//onTriggered: appLoader.source = "UsersPage.qml"
text: qsTr("Einstellungen")
onTriggered:
{
// TODO: Check if logged-in user is admin first!!
appLoader.source = "PyqcrmConf.qml"
}
}
MenuSeparator {}
MenuItem { text: qsTr("Als PDF exportieren") }
MenuSeparator {}
MenuItem { text: qsTr("Drucken") }
MenuItem
{
text: qsTr("Erweiterter Druck")
onTriggered: printerDialog.show()
}
MenuSeparator {}
MenuItem
{
text: qsTr("Über PYQCRM")
onTriggered: readMeWin.show()
}
}
}
}

View File

@@ -97,7 +97,7 @@ Item
title: qsTr("Wiederherstellen") title: qsTr("Wiederherstellen")
buttons: MessageDialog.Yes | MessageDialog.No buttons: MessageDialog.Yes | MessageDialog.No
onAccepted: recoveryPasswordDialog.open() onAccepted: recoveryPasswordDialog.open()
onRejected: gotoLogin() onRejected: contentStack.replace("LoginSreen.qml")
} }
MessageDialog MessageDialog

View File

@@ -4,173 +4,142 @@ import QtQuick.Controls
import QtQuick.Dialogs import QtQuick.Dialogs
import QtCore import QtCore
ApplicationWindow ApplicationWindow {
{
id: appWindow id: appWindow
width: Screen.width * .75
height: Screen.height * .85
visible: true
title: "TERO Personal"
font: Typography.body
color: Colors.mantle
property string confile: "" property string confile: ""
property alias settingsFileDialog: settingsFiledialog property alias settingsFileDialog: settingsFiledialog
function showWindow(why) {
if (why === 3) {
systray.setVisible(false);
appWindow.show();
}
}
font: Typography.body
height: Screen.height * .85
palette.window: Colors.mantle
palette.placeholderText: Colors.interactive
palette.text: Colors.foreground palette.text: Colors.foreground
title: "TERO Personal"
visible: true
width: Screen.width * .75
Component.onCompleted: {
systray.activated.connect(showWindow);
TopBar if (bad_config) {
{ importDialog.open();
id:topBar } else {
visible: bad_config || !db_con ? false: true if (db_con)
contentStack.replace("LoginScreen.qml")
else
contentStack.replace("NoDbConnection.qml");
}
}
onClosing: close => {
if (false) {
console.log("Main window closed!! Was soll ich tun? kann ich mich beenden?!");
}
}
onVisibilityChanged: {
if (appWindow.visibility === Window.Minimized && config.systray()) {
systray.setVisible(true);
appWindow.hide();
}
}
onWindowStateChanged: windowState => {
if (windowState !== Qt.WindowMinimized) {
systray.setVisible(false);
appWindow.show();
}
} }
PrinterDialog Navigation {
{ id: navigation
visible: !(bad_config || !db_con)
}
PrinterDialog {
id: printerDialog id: printerDialog
}
ReadMe }
{ ReadMe {
id: readMeWin id: readMeWin
}
Item }
{ Item {
id: mainView id: mainView
} }
Loader Rectangle {
{ id: contentBackground
id: appLoader anchors {
bottom: parent.bottom
anchors left: navigation.visible ? navigation.right : parent.left
{
left: topBar.right
right: parent.right right: parent.right
top: parent.top top: parent.top
bottom: parent.bottom
topMargin: Dimensions.l
bottomMargin: Dimensions.l
rightMargin: Dimensions.l
leftMargin: Dimensions.l
} }
color: Colors.background
property alias window: appWindow
} }
StackView {
id: contentStack
Dialog anchors {
{ fill: contentBackground
margins: Dimensions.l
}
}
Dialog {
id: importDialog id: importDialog
modal: true
anchors.centerIn: parent anchors.centerIn: parent
modal: true
standardButtons: Dialog.Yes | Dialog.No standardButtons: Dialog.Yes | Dialog.No
onAccepted: settingsFiledialog.open()
onRejected: appLoader.source= "Firststart.qml"
title: qsTr("Einstellungen importieren") title: qsTr("Einstellungen importieren")
onAccepted: settingsFiledialog.open()
onRejected: contentStack.replace("Firststart.qml")
} }
FileDialog {
FileDialog
{
id: settingsFiledialog id: settingsFiledialog
title: qsTr("PYQCRM Einstellungen")
currentFolder: StandardPaths.standardLocations(StandardPaths.DocumentsLocation)[0] currentFolder: StandardPaths.standardLocations(StandardPaths.DocumentsLocation)[0]
modality: "ApplicationModal" modality: "ApplicationModal"
nameFilters: [qsTr("PYQCRM Einstellungen (*.pyqrec)")] nameFilters: [qsTr("PYQCRM Einstellungen (*.pyqrec)")]
onAccepted: title: qsTr("PYQCRM Einstellungen")
{
exportFilePassword.open() onAccepted: {
confile = selectedFile exportFilePassword.open();
confile = selectedFile;
} }
} }
Dialog {
Dialog
{
id: exportFilePassword id: exportFilePassword
modal: true
title: qsTr("PYQCRM Einstellungen")
anchors.centerIn: parent anchors.centerIn: parent
modal: true
standardButtons: Dialog.Ok | Dialog.Cancel standardButtons: Dialog.Ok | Dialog.Cancel
title: qsTr("PYQCRM Einstellungen")
onAccepted: config.importConfig(confile, exportPasswordInput.text) onAccepted: config.importConfig(confile, exportPasswordInput.text)
ColumnLayout
{ ColumnLayout {
RowLayout RowLayout {
{ Label {
Label
{
text: qsTr("Passwort eingeben:") text: qsTr("Passwort eingeben:")
} }
TextField {
TextField
{
id: exportPasswordInput id: exportPasswordInput
echoMode: TextInput.Password echoMode: TextInput.Password
implicitWidth: 300 implicitWidth: 300
} }
} }
} }
} }
Component.onCompleted:
{
config.configurationReady.connect(goToLogin)
systray.activated.connect(showWindow)
if(bad_config)
{
importDialog.open()
}
else
{
if (db_con) appLoader.source= "LoginScreen.qml"
else appLoader.source= "NoDbConnection.qml"
}
}
function showWindow(why)
{
if (why === 3)
{
systray.setVisible(false)
appWindow.show()
}
}
onVisibilityChanged:
{
if (appWindow.visibility === Window.Minimized && config.systray())
{
systray.setVisible(true)
appWindow.hide()
}
}
onWindowStateChanged: (windowState) =>
{
if (windowState !== Qt.WindowMinimized)
{
systray.setVisible(false)
appWindow.show()
}
}
onClosing: (close) =>
{
if (false)
{
console.log("Main window closed!! Was soll ich tun? kann ich mich beenden?!")
}
}
function goToLogin()
{
appLoader.source= "LoginScreen.qml"
topBar.visible = true
}
} }

View File

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

View File

@@ -6,82 +6,56 @@ import QtQuick.Templates as T
T.ToolButton { T.ToolButton {
id: control id: control
implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, property string target
implicitContentWidth + leftPadding + rightPadding)
implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
implicitContentHeight + topPadding + bottomPadding)
checkable: true checkable: true
icon.color: Colors.foreground icon.color: Colors.foreground
icon.height: 36 icon.height: 36
icon.width: 36 icon.width: 36
implicitHeight: 90
implicitWidth: 100
topPadding: 20 topPadding: 20
// horizontalPadding: padding + 2
// spacing: 6
// display: AbstractButton.TextUnderIcon
// icon.color: control.checked || control.highlighted ? control.palette.brightText :
// control.flat && !control.down ? (control.visualFocus ? control.palette.highlight : control.palette.windowText) : control.palette.buttonText
contentItem: Column
{
IconLabel
{
contentItem: Column {
readonly property color color: control.checked ? Colors.primaryShade : control.hovered ? Colors.primary : Colors.foreground
IconLabel {
color: parent.color
icon.color: parent.color
icon.height: control.icon.height
icon.source: control.icon.source
icon.width: control.icon.width
x: parent.width * .5 - width * .5 x: parent.width * .5 - width * .5
// height: icon.height
// width: icon.width
icon: control.icon
// display: control.display
} }
Label Label {
{ color: parent.color
font: Typography.smaller
text: control.text text: control.text
font: Typography.dash
color: Colors.foreground
x: parent.width * .5 - width * .5 x: parent.width * .5 - width * .5
}
// spacing: control.spacing
// mirrored: control.mirrored
// display: control.TextUnderIcon
// icon: control.icon
// text: control.text
// font: control.font
// color: control.checked || control.highlighted ? control.palette.brightText :
// control.flat && !control.down ? (control.visualFocus ? control.palette.highlight : control.palette.windowText) : control.palette.buttonText
}
background: Rectangle {
id: mainrect
implicitWidth: control.width
implicitHeight: control.height
visible: !control.flat || control.down || control.checked || control.highlighted
x: control.left
y: control.top
color: Color.blend(control.checked || control.highlighted ? control.palette.dark : control.palette.button,
control.palette.mid, control.down ? 0.5 : 0.0)
border.color: control.palette.highlight
border.width: control.visualFocus ? 2 : 0
Rectangle
{
implicitHeight: control.height
implicitWidth: 6
x: mainrect.left
y: mainrect.top
color: "yellow"
} }
} }
Rectangle {
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.top: parent.top
color: control.checked ? Colors.primaryShade : Colors.primary
implicitWidth: 6
visible: control.checked || control.hovered
}
MouseArea {
id: mouseArea
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onPressed: mouse => mouse.accepted = false
}
onClicked: {
if(!target) {
return
}
contentStack.replace(target)
}
} }

View File

@@ -25,6 +25,7 @@ T.Button {
*/ */
property bool isFieldButton: false property bool isFieldButton: false
height: isFieldButton ? parent.height : null height: isFieldButton ? parent.height : null
icon.color: Colors.primaryContrast icon.color: Colors.primaryContrast
icon.height: 21 icon.height: 21
@@ -43,12 +44,12 @@ T.Button {
border.color: Colors.interactive border.color: Colors.interactive
border.width: isFieldButton ? 1 : 0 border.width: isFieldButton ? 1 : 0
bottomLeftRadius: topLeftRadius bottomLeftRadius: topLeftRadius
color: !control.hovered ? Colors.primary : Colors.primaryLighter color: !control.enabled ? Colors.disabled : !control.hovered ? Colors.primary : Colors.primaryLighter
radius: Dimensions.radius radius: Dimensions.radius
topLeftRadius: isFieldButton ? 0 : radius topLeftRadius: isFieldButton ? 0 : radius
} }
contentItem: I.IconLabel { contentItem: I.IconLabel {
color: Colors.primaryContrast color: !control.enabled ? Colors.disabledForeground : Colors.primaryContrast
display: control.display display: control.display
font: control.font font: control.font
icon: control.icon icon: control.icon

View File

@@ -11,11 +11,15 @@ QtObject {
readonly property color primary: "#b81a34" readonly property color primary: "#b81a34"
readonly property color primaryContrast: "#fdfdfd" readonly property color primaryContrast: "#fdfdfd"
readonly property color primaryLighter: Qt.lighter(primary, 1.5) readonly property color primaryLighter: Qt.lighter(primary, 1.5)
readonly property color primaryShade: theme === dark ? primaryLighter : Qt.darker(primary, 1.5)
readonly property color primaryHighlight: theme === dark ? Qt.darker(primary, 2- Colors.highlightOpacity) : Qt.lighter(primary, 2- Colors.highlightOpacity)
readonly property color foreground: theme === dark ? "#fdfdfd" : "#110b0c" readonly property color foreground: theme === dark ? "#fdfdfd" : "#110b0c"
readonly property color background: theme === dark ? "#303136" : "#eff1f5" readonly property color background: theme === dark ? "#303136" : "#eff1f5"
readonly property color mantle: theme === dark ? "#1e1f22" : "#e7e9ef" readonly property color mantle: theme === dark ? "#1E1E23" : "#e7e9ef"
readonly property color interactive: theme === dark ? "#878b97" : "#d9d9da" readonly property color interactive: theme === dark ? "#878b97" : "#d9d9da"
readonly property color error: theme === dark ? "#ff2264" : "#ff004b" readonly property color error: theme === dark ? "#ff2264" : "#ff004b"
readonly property color disabled: theme === dark ? Qt.darker(interactive, 1.9) : Qt.darker(interactive, 1.3)
readonly property color disabledForeground: theme === dark ? Qt.darker(foreground, 1.4) : Qt.lighter(foreground, 1.9)
readonly property color transparent: "transparent" readonly property color transparent: "transparent"
readonly property double highlightOpacity: .3 readonly property double highlightOpacity: .3

View File

@@ -1,21 +1,41 @@
pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Controls.impl
import QtQuick.Controls
import QtQuick.Templates as T import QtQuick.Templates as T
import QtQuick.Controls
import QtQuick.Controls.impl
T.ComboBox { T.ComboBox {
id: control id: control
implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, font: Typography.body
implicitContentWidth + leftPadding + rightPadding)
implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
implicitContentHeight + topPadding + bottomPadding, implicitContentHeight + topPadding + bottomPadding,
implicitIndicatorHeight + topPadding + bottomPadding) implicitIndicatorHeight + topPadding + bottomPadding)
leftPadding: padding + (!control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
rightPadding: padding + (control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing) contentItem: T.TextField {
id: test
autoScroll: control.editable
color: Colors.foreground
enabled: control.editable
font: Typography.body
implicitHeight: Typography.body.pixelSize + topPadding + bottomPadding
inputMethodHints: control.inputMethodHints
padding: Dimensions.m
readOnly: control.down
selectByMouse: control.selectTextByMouse
text: control.editable ? control.editText : control.displayText
validator: control.validator
width: control.width - indicator.width
verticalAlignment: Text.AlignVCenter
}
background: Rectangle {
border.color: Colors.interactive
border.width: 1
color: Colors.mantle
radius: Dimensions.radius
width: parent.width
}
delegate: ItemDelegate { delegate: ItemDelegate {
required property var model required property var model
@@ -23,224 +43,66 @@ T.ComboBox {
width: ListView.view.width width: ListView.view.width
text: model[control.textRole] text: model[control.textRole]
// palette.text: control.palette.text
// palette.highlightedText: control.palette.highlightedText
font.weight: control.currentIndex === index ? Font.DemiBold : Font.Normal
highlighted: control.highlightedIndex === index highlighted: control.highlightedIndex === index
hoverEnabled: control.hoverEnabled hoverEnabled: control.hoverEnabled
} }
indicator: Rectangle {
id: indicator
indicator: ColorImage { border.color: Colors.interactive
x: control.mirrored ? control.padding : control.width - width - control.padding bottomRightRadius: Dimensions.radius
y: control.topPadding + (control.availableHeight - height) / 2 color: Colors.primary
height: control.height
topRightRadius: Dimensions.radius
width: 20 + Dimensions.s * 2
x: control.width - width
y: 0
z: 2
source: "qrc:/images/ChevronDown.svg" IconLabel {
opacity: enabled ? 1 : 0.3 anchors.fill: parent
} bottomPadding: Dimensions.s
icon.color: Colors.foreground
contentItem: T.TextField { icon.source: "qrc:/images/ChevronDown.svg"
// leftPadding: !control.mirrored ? 12 : control.editable && activeFocus ? 3 : 1 leftPadding: Dimensions.s
// rightPadding: control.mirrored ? 12 : control.editable && activeFocus ? 3 : 1 rightPadding: Dimensions.s
// topPadding: 6 - control.padding topPadding: Dimensions.s
// bottomPadding: 6 - control.padding }
implicitHeight: Typography.body.pixelSize + bottomPadding + topPadding MouseArea {
text: control.editable ? control.editText : control.displayText anchors.fill: parent
padding: Dimensions.m cursorShape: Qt.PointingHandCursor
enabled: control.editable
autoScroll: control.editable
readOnly: control.down
inputMethodHints: control.inputMethodHints
validator: control.validator
selectByMouse: control.selectTextByMouse
color: Colors.foreground
// selectionColor: control.palette.highlight
// selectedTextColor: control.palette.highlightedText
verticalAlignment: Text.AlignVCenter
background: Rectangle {
visible: control.enabled && control.editable && !control.flat
border.width: parent && parent.activeFocus ? 2 : 1
border.color: Colors.interactive
radius: Dimensions.radius
color: Colors.mantle
onPressed: () => {
control.popup.visible = true;
control.popup.forceActiveFocus()
}
} }
} }
background: Rectangle {
implicitWidth: 140
implicitHeight: 40
radius: Dimensions.radius
color: Colors.mantle
border.color: Colors.interactive
border.width: 1
visible: !control.flat || control.down
}
popup: T.Popup { popup: T.Popup {
y: control.height
width: control.width
height: Math.min(contentItem.implicitHeight, control.Window.height - topMargin - bottomMargin)
topMargin: 6
bottomMargin: 6 bottomMargin: 6
palette: control.palette height: Math.min(contentItem.implicitHeight + 2, control.Window.height - topMargin - bottomMargin)
padding: 1
topMargin: 6
width: control.width
y: control.height
background: Rectangle {
border.color: Colors.interactive
color: Colors.mantle
radius: Dimensions.radius
}
contentItem: ListView { contentItem: ListView {
clip: true clip: true
implicitHeight: contentHeight
model: control.delegateModel
currentIndex: control.highlightedIndex currentIndex: control.highlightedIndex
highlightMoveDuration: 0 implicitHeight: contentHeight
model: control.popup.visible ? control.delegateModel : null
Rectangle { T.ScrollBar.vertical: ScrollBar {
z: 10 }
width: parent.width highlight: Rectangle {
height: parent.height color: Colors.primary
color: "transparent" opacity: Colors.highlightOpacity
border.color: control.palette.mid
} }
T.ScrollIndicator.vertical: ScrollIndicator { }
} }
background: Rectangle {
color: control.palette.window
}
} }
} }
// import QtQuick
// import QtQuick.Templates as T
// import QtQuick.Controls
// import QtQuick.Controls.impl
// T.ComboBox {
// id: control
// font: Typography.body
// implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
// implicitContentHeight + topPadding + bottomPadding,
// implicitIndicatorHeight + topPadding + bottomPadding)
// contentItem: T.TextField {
// id: test
// autoScroll: control.editable
// color: Colors.foreground
// enabled: control.editable
// font: Typography.body
// implicitHeight: Typography.body.pixelSize + topPadding + bottomPadding
// inputMethodHints: control.inputMethodHints
// padding: Dimensions.m
// readOnly: control.down
// selectByMouse: control.selectTextByMouse
// text: control.editable ? control.editText : control.displayText
// validator: control.validator
// width: control.width - indicator.width
// verticalAlignment: Text.AlignVCenter
// }
// background: Rectangle {
// border.color: Colors.interactive
// border.width: 1
// color: Colors.mantle
// // height: parent.height
// radius: Dimensions.radius
// width: parent.width
// }
// // delegate: MenuItem {
// // id: menuItem
// // required property int index
// // required property var model
// // highlighted: control.highlightedIndex === index
// // hoverEnabled: control.hoverEnabled
// // text: model[control.textRole]
// // width: control.width
// // background: Rectangle {
// // color: menuItem.down || menuItem.highlighted ? Colors.primary : "transparent"
// // height: menuItem.height
// // width: menuItem.width
// // }
// // }
// delegate: ItemDelegate {
// required property var model
// required property int index
// width: ListView.view.width
// text: model[control.textRole]
// // palette.text: control.palette.text
// // palette.highlightedText: control.palette.highlightedText
// // font.weight: control.currentIndex === index ? Font.DemiBold : Font.Normal
// highlighted: control.highlightedIndex === index
// hoverEnabled: control.hoverEnabled
// }
// indicator: Rectangle {
// id: indicator
// border.color: Colors.interactive
// bottomRightRadius: Dimensions.radius
// color: Colors.primary
// height: control.height
// topRightRadius: Dimensions.radius
// width: 20 + Dimensions.s * 2
// x: control.width - width
// y: 0
// z: 2
// IconLabel {
// anchors.fill: parent
// bottomPadding: Dimensions.s
// icon.color: Colors.foreground
// icon.source: "qrc:/images/ChevronDown.svg"
// leftPadding: Dimensions.s
// rightPadding: Dimensions.s
// topPadding: Dimensions.s
// }
// MouseArea {
// anchors.fill: parent
// cursorShape: Qt.PointingHandCursor
// onPressed: () => {
// control.popup.visible = true;
// control.popup.forceActiveFocus()
// }
// }
// }
// popup: T.Popup {
// bottomMargin: 6
// height: Math.min(contentItem.implicitHeight + 2, control.Window.height - topMargin - bottomMargin)
// padding: 1
// topMargin: 6
// width: control.width
// y: control.height
// background: Rectangle {
// border.color: Colors.interactive
// color: Colors.mantle
// radius: Dimensions.radius
// }
// contentItem: ListView {
// clip: true
// currentIndex: control.highlightedIndex
// implicitHeight: contentHeight
// model: control.popup.visible ? control.delegateModel : null
// T.ScrollBar.vertical: ScrollBar {
// }
// highlight: Rectangle {
// color: Colors.primary
// opacity: Colors.highlightOpacity
// }
// }
// }
// Component.onCompleted:
// {
// console.log(control.implicitContentHeight)
// }
// }

View File

@@ -0,0 +1,5 @@
import QtQuick
RegularExpressionValidator {
regularExpression: /([\+!#$%&\*\\/\=?\^_`\.{|}\~\-\_0-9A-Za-z]{1,185})@([0-9A-Za-z\.\-\_]{1,64})\.([a-zA-z]{2,5})/
}

View File

@@ -5,11 +5,16 @@ import QtQuick.Layouts
ColumnLayout ColumnLayout
{ {
required property string label required property string label
/**
* Adds an asterisk after the label, informing the user that this field
* is mandatory.
*/
property bool mandatory: false
spacing: Dimensions.s spacing: Dimensions.s
Label Label
{ {
text: label text: label + (mandatory ? "*" : "")
font: Typography.body font: Typography.body
} }
} }

5
TeroStyle/H1.qml Normal file
View File

@@ -0,0 +1,5 @@
import QtQuick
Text {
font: Typography.h1
}

5
TeroStyle/H2.qml Normal file
View File

@@ -0,0 +1,5 @@
import QtQuick
Text {
font: Typography.h2
}

View File

@@ -0,0 +1,5 @@
import QtQuick
RegularExpressionValidator {
regularExpression: /^\S+.*\S+$/
}

View File

@@ -0,0 +1,5 @@
import QtQuick
RegularExpressionValidator {
regularExpression: /^$|([\+!#$%&\*\\/\=?\^_`\.{|}\~\-\_0-9A-Za-z]{1,185})@([0-9A-Za-z\.\-\_]{1,64})\.([a-zA-z]{2,5})/
}

View File

@@ -0,0 +1,5 @@
import QtQuick
RegularExpressionValidator {
regularExpression: /^$|([+0-9])([0-9\s]{1,17})/
}

View File

@@ -0,0 +1,5 @@
import QtQuick
RegularExpressionValidator {
regularExpression: /([+0-9])([0-9\s]{1,17})/
}

View File

@@ -0,0 +1,5 @@
import QtQuick
RegularExpressionValidator {
regularExpression: /([^$][0-9]{1,4})/
}

View File

@@ -4,6 +4,7 @@ import QtQuick.Templates as T
T.TextField T.TextField
{ {
id: control id: control
background: Rectangle background: Rectangle
{ {
id: background id: background

View File

@@ -3,38 +3,54 @@ pragma Singleton
import QtCore import QtCore
import QtQuick import QtQuick
Item Item {
{ readonly property font body: ({
readonly property FontLoader robotoCondensed: FontLoader family: robotoCondensed.font,
{ pointSize: 16,
weight: Font.Medium,
letterSpacing: 0,
kerning: true
})
readonly property font small: ({
family: body.family,
pointSize: 14,
weight: Font.Medium,
letterSpacing: body.letterSpacing,
kerning: body.kerning
})
readonly property font smallBold: ({
family: small.family,
pointSize: small.pointSize,
weight: Font.Bold,
letterSpacing: small.letterSpacing,
kerning: small.kerning
})
readonly property font smaller: ({
family: body.family,
pointSize: 11,
weight: Font.DemiBold,
letterSpacing: body.letterSpacing,
kerning: body.kerning
})
readonly property font h1: ({
family: body.family,
pointSize: 38,
weight: body.weight,
letterSpacing: body.letterSpacing,
kerning: body.kerning
})
readonly property font h2: ({
family: body.family,
pointSize: 28,
weight: body.weight,
letterSpacing: body.letterSpacing,
kerning: body.kerning,
})
readonly property FontLoader robotoCondensed: FontLoader {
source: "qrc:/fonts/RobotoCondensed.otf" source: "qrc:/fonts/RobotoCondensed.otf"
} }
readonly property font body:
({
family: robotoCondensed.font,
pointSize: 16,
weight: Font.Medium,
letterSpacing: 0,
kerning: true,
})
readonly property font h1:
({
family: body.family,
pointSize: 38,
weight: body.weight,
letterSpacing: body.letterSpacing,
kerning: body.kerning,
})
readonly property font dash:
({
family: body.family,
pointSize: 10,
weight: body.weight,
letterSpacing: body.letterSpacing,
kerning: body.kerning,
})
} }

View File

@@ -2,13 +2,19 @@ module TeroStyle
singleton Colors Colors.qml singleton Colors Colors.qml
singleton Dimensions Dimensions.qml singleton Dimensions Dimensions.qml
singleton Typography Typography.qml singleton Typography Typography.qml
BarButton BarButton.qml
Button Button.qml Button Button.qml
ComboBox ComboBox.qml ComboBox ComboBox.qml
EmailAddressValidator EmailAddressValidator.qml
Field Field.qml Field Field.qml
TextField TextField.qml H1 H1.qml
BarButton BarButton.qml H2 H2.qml
Label Label.qml Label Label.qml
NotEmptyValidator NotEmptyValidator.qml
OptionalEmailAddressValidator OptionalEmailAddressValidator.qml
PhoneNumberValidator PhoneNumberValidator.qml
OptionalPhoneNumberValidator OptionalPhoneNumberValidator.qml
PostcodeValidator PostcodeValidator.qml
QuickFilter QuickFilter.qml QuickFilter QuickFilter.qml
SearchBar SearchBar.qml
TextField TextField.qml

View File

@@ -0,0 +1,135 @@
<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

@@ -0,0 +1,103 @@
<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,6 +1,6 @@
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/25.0.2 Chrome/128.0.6613.186 Electron/32.2.5 Safari/537.36" version="25.0.2"> <mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/25.0.2 Chrome/128.0.6613.186 Electron/32.2.5 Safari/537.36" version="25.0.2">
<diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1"> <diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">
<mxGraphModel dx="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"> <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">
<root> <root>
<mxCell id="WIyWlLk6GJQsqaUBKTNV-0" /> <mxCell id="WIyWlLk6GJQsqaUBKTNV-0" />
<mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" /> <mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" />
@@ -290,8 +290,8 @@
<mxPoint x="250" y="530" as="sourcePoint" /> <mxPoint x="250" y="530" as="sourcePoint" />
<mxPoint x="300" y="480" as="targetPoint" /> <mxPoint x="300" y="480" as="targetPoint" />
<Array as="points"> <Array as="points">
<mxPoint x="440" y="383" /> <mxPoint x="450" y="383" />
<mxPoint x="440" y="468" /> <mxPoint x="450" y="468" />
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
@@ -307,8 +307,8 @@
<mxPoint x="270" y="530" as="sourcePoint" /> <mxPoint x="270" y="530" as="sourcePoint" />
<mxPoint x="320" y="480" as="targetPoint" /> <mxPoint x="320" y="480" as="targetPoint" />
<Array as="points"> <Array as="points">
<mxPoint x="430" y="406" /> <mxPoint x="440" y="406" />
<mxPoint x="430" y="698" /> <mxPoint x="440" y="700" />
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
@@ -323,9 +323,9 @@
<mxPoint x="270" y="530" as="sourcePoint" /> <mxPoint x="270" y="530" as="sourcePoint" />
<mxPoint x="470" y="940" as="targetPoint" /> <mxPoint x="470" y="940" as="targetPoint" />
<Array as="points"> <Array as="points">
<mxPoint x="410" y="423" /> <mxPoint x="430" y="420" />
<mxPoint x="410" y="600" /> <mxPoint x="430" y="600" />
<mxPoint x="410" y="940" /> <mxPoint x="430" y="940" />
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
@@ -389,25 +389,25 @@
<mxCell id="v96xPLQoPeUk4bUV2WaN-99" value="+ instance(): connection" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="v96xPLQoPeUk4bUV2WaN-96" vertex="1"> <mxCell id="v96xPLQoPeUk4bUV2WaN-99" value="+ instance(): connection" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="v96xPLQoPeUk4bUV2WaN-96" vertex="1">
<mxGeometry y="58" width="170" height="32" as="geometry" /> <mxGeometry y="58" width="170" height="32" as="geometry" />
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-0" value="PyqcrmFlags" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-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;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="870" y="340" width="170" height="150" as="geometry" /> <mxGeometry x="870" y="340" width="170" height="150" as="geometry" />
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-1" value="&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"> <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">
<mxGeometry y="26" width="170" height="44" as="geometry" /> <mxGeometry y="26" width="170" height="44" as="geometry" />
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-2" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-0"> <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">
<mxGeometry y="70" width="170" height="80" as="geometry" /> <mxGeometry y="70" width="170" height="80" as="geometry" />
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-3" value="PyqcrmAppliEmpyFlags" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-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;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="870" y="170" width="170" height="140" as="geometry" /> <mxGeometry x="870" y="170" width="170" height="140" as="geometry" />
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-4" value="&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"> <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">
<mxGeometry y="26" width="170" height="64" as="geometry" /> <mxGeometry y="26" width="170" height="64" as="geometry" />
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-5" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-3"> <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">
<mxGeometry y="90" width="170" height="50" as="geometry" /> <mxGeometry y="90" width="170" height="50" as="geometry" />
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-6" value="" style="endArrow=none;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-89" target="v96xPLQoPeUk4bUV2WaN-40"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="420" y="900" as="sourcePoint" /> <mxPoint x="420" y="900" as="sourcePoint" />
<mxPoint x="470" y="850" as="targetPoint" /> <mxPoint x="470" y="850" as="targetPoint" />
@@ -417,7 +417,7 @@
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-7" value="" style="endArrow=none;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-48" target="v96xPLQoPeUk4bUV2WaN-93"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="420" y="900" as="sourcePoint" /> <mxPoint x="420" y="900" as="sourcePoint" />
<mxPoint x="470" y="850" as="targetPoint" /> <mxPoint x="470" y="850" as="targetPoint" />
@@ -427,7 +427,7 @@
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-8" value="" style="endArrow=none;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-93" target="v96xPLQoPeUk4bUV2WaN-40"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="420" y="900" as="sourcePoint" /> <mxPoint x="420" y="900" as="sourcePoint" />
<mxPoint x="470" y="850" as="targetPoint" /> <mxPoint x="470" y="850" as="targetPoint" />
@@ -437,7 +437,7 @@
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-9" value="" style="endArrow=none;html=1;rounded=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;exitX=0.25;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-48" target="v96xPLQoPeUk4bUV2WaN-89"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="420" y="900" as="sourcePoint" /> <mxPoint x="420" y="900" as="sourcePoint" />
<mxPoint x="470" y="850" as="targetPoint" /> <mxPoint x="470" y="850" as="targetPoint" />
@@ -447,42 +447,77 @@
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-10" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-78" target="v96xPLQoPeUk4bUV2WaN-97"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="600" y="440" as="sourcePoint" /> <mxPoint x="600" y="440" as="sourcePoint" />
<mxPoint x="650" y="390" as="targetPoint" /> <mxPoint x="650" y="390" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-11" value="" style="endArrow=none;html=1;rounded=0;exitX=1.001;exitY=0.102;exitDx=0;exitDy=0;exitPerimeter=0;entryX=-0.002;entryY=0.624;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="6xiAvg-kEoilwsfhhM0o-0" target="v96xPLQoPeUk4bUV2WaN-80"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="600" y="440" as="sourcePoint" /> <mxPoint x="600" y="440" as="sourcePoint" />
<mxPoint x="650" y="390" as="targetPoint" /> <mxPoint x="650" y="390" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-12" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=-0.001;exitY=0.316;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-80" target="6xiAvg-kEoilwsfhhM0o-4"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="600" y="440" as="sourcePoint" /> <mxPoint x="600" y="440" as="sourcePoint" />
<mxPoint x="650" y="390" as="targetPoint" /> <mxPoint x="650" y="390" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-13" value="Vermasseln" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-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;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
<mxGeometry x="1350" y="40" width="170" height="140" as="geometry" /> <mxGeometry x="1350" y="40" width="170" height="140" as="geometry" />
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-14" value="&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"> <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">
<mxGeometry y="26" width="170" height="24" as="geometry" /> <mxGeometry y="26" width="170" height="24" as="geometry" />
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-15" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-13"> <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">
<mxGeometry y="50" width="170" height="8" as="geometry" /> <mxGeometry y="50" width="170" height="8" as="geometry" />
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-16" value="+ oscarVermasseln()&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"> <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">
<mxGeometry y="58" width="170" height="82" as="geometry" /> <mxGeometry y="58" width="170" height="82" as="geometry" />
</mxCell> </mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-17" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-78" target="6xiAvg-kEoilwsfhhM0o-14"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="800" y="530" as="sourcePoint" /> <mxPoint x="800" y="530" as="sourcePoint" />
<mxPoint x="850" y="480" as="targetPoint" /> <mxPoint x="850" y="480" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="oFnCSLyNU9wu8QDSkbbI-1" value="OfferDAO" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="460" y="1169" width="160" height="170" as="geometry" />
</mxCell>
<mxCell id="oFnCSLyNU9wu8QDSkbbI-3" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" vertex="1" parent="oFnCSLyNU9wu8QDSkbbI-1">
<mxGeometry y="26" width="160" height="54" as="geometry" />
</mxCell>
<mxCell id="oFnCSLyNU9wu8QDSkbbI-4" value="+ addOffer()&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> </root>
</mxGraphModel> </mxGraphModel>
</diagram> </diagram>

View File

@@ -1,4 +0,0 @@
# pyqcrm
CRM - Tero
Python + QML

View File

@@ -0,0 +1,184 @@
<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"> <mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/25.0.2 Chrome/128.0.6613.186 Electron/32.2.5 Safari/537.36" version="25.0.2">
<diagram name="Seite-1" id="krh1Wum05D0y0HCIq7V8"> <diagram name="Seite-1" id="krh1Wum05D0y0HCIq7V8">
<mxGraphModel dx="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"> <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">
<root> <root>
<mxCell id="0" /> <mxCell id="0" />
<mxCell id="1" parent="0" /> <mxCell id="1" parent="0" />
@@ -78,35 +78,6 @@
<mxCell id="Ya_982ONw7_15APAzA8q-34" value="1" style="resizable=0;html=1;whiteSpace=wrap;align=right;verticalAlign=bottom;" parent="1" connectable="0" vertex="1"> <mxCell id="Ya_982ONw7_15APAzA8q-34" value="1" style="resizable=0;html=1;whiteSpace=wrap;align=right;verticalAlign=bottom;" parent="1" connectable="0" vertex="1">
<mxGeometry x="535" y="180.00000000000006" as="geometry" /> <mxGeometry x="535" y="180.00000000000006" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-81" value="servicedesc" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" parent="1" vertex="1">
<mxGeometry x="1410" y="249" width="180" height="90" as="geometry" />
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-82" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="Ya_982ONw7_15APAzA8q-81" vertex="1">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-83" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-82" vertex="1">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-84" value="servicedescid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-82" vertex="1">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-85" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="Ya_982ONw7_15APAzA8q-81" vertex="1">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-86" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-85" vertex="1">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-87" value="description" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-85" vertex="1">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-105" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="wp44KSVxnTE4gDC1YKSh-240" edge="1"> <mxCell id="Ya_982ONw7_15APAzA8q-105" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="wp44KSVxnTE4gDC1YKSh-240" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="560" y="163" as="sourcePoint" /> <mxPoint x="560" y="163" as="sourcePoint" />
@@ -147,7 +118,7 @@
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-176" value="offer" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" parent="1" vertex="1"> <mxCell id="Ya_982ONw7_15APAzA8q-176" value="offer" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" parent="1" vertex="1">
<mxGeometry x="900" y="880" width="180" height="120" as="geometry" /> <mxGeometry x="900" y="880" width="180" height="90" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-177" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="Ya_982ONw7_15APAzA8q-176" vertex="1"> <mxCell id="Ya_982ONw7_15APAzA8q-177" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="Ya_982ONw7_15APAzA8q-176" vertex="1">
<mxGeometry y="30" width="180" height="30" as="geometry" /> <mxGeometry y="30" width="180" height="30" as="geometry" />
@@ -162,76 +133,26 @@
<mxRectangle width="150" height="30" as="alternateBounds" /> <mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<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"> <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">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-181" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-180" vertex="1">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-182" value="jobdetailid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-180" vertex="1">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-205" value="offers" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" parent="1" vertex="1">
<mxGeometry x="900" y="720" width="180" height="120" as="geometry" />
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-206" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="Ya_982ONw7_15APAzA8q-205" vertex="1">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-207" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-206" vertex="1">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-208" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-206" vertex="1">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-209" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="Ya_982ONw7_15APAzA8q-205" vertex="1">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-210" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-209" vertex="1">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-211" value="offerid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-209" vertex="1">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-212" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="Ya_982ONw7_15APAzA8q-205" vertex="1">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-213" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-212" vertex="1">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-214" value="contractid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="Ya_982ONw7_15APAzA8q-212" vertex="1">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-220" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" target="Ya_982ONw7_15APAzA8q-209" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="1150.9999999999995" y="669.9999999999998" as="sourcePoint" /> <mxPoint x="1150.9999999999995" y="669.9999999999998" as="sourcePoint" />
<mxPoint x="1004.9100000000002" y="790" as="targetPoint" /> <mxPoint x="1080" y="725" as="targetPoint" />
<Array as="points"> <Array as="points">
<mxPoint x="1150" y="725" /> <mxPoint x="1150" y="725" />
<mxPoint x="1110" y="725" /> <mxPoint x="1110" y="725" />
<mxPoint x="1110" y="795" /> <mxPoint x="1110" y="781" />
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<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"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="1000" y="860" as="sourcePoint" /> <mxPoint x="1000" y="860" as="sourcePoint" />
<mxPoint x="1080" y="840" as="targetPoint" /> <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>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-256" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="1" vertex="1"> <mxCell id="Ya_982ONw7_15APAzA8q-256" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="1" vertex="1">
@@ -353,18 +274,10 @@
<mxPoint x="15" y="41" as="offset" /> <mxPoint x="15" y="41" as="offset" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-276" value="1" style="resizable=0;html=1;whiteSpace=wrap;align=right;verticalAlign=bottom;" parent="1" connectable="0" vertex="1">
<mxGeometry x="1331" y="815" as="geometry">
<mxPoint x="12" y="-46" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-277" value="1" style="resizable=0;html=1;whiteSpace=wrap;align=right;verticalAlign=bottom;" parent="1" connectable="0" vertex="1">
<mxGeometry x="1410" y="765" as="geometry" />
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-278" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="Ya_982ONw7_15APAzA8q-245" edge="1"> <mxCell id="Ya_982ONw7_15APAzA8q-278" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="Ya_982ONw7_15APAzA8q-245" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="1150" y="960" as="sourcePoint" /> <mxPoint x="1150" y="960" as="sourcePoint" />
<mxPoint x="1240" y="760" as="targetPoint" /> <mxPoint x="1240" y="730" as="targetPoint" />
<Array as="points"> <Array as="points">
<mxPoint x="1130" y="955" /> <mxPoint x="1130" y="955" />
<mxPoint x="1130" y="810" /> <mxPoint x="1130" y="810" />
@@ -372,9 +285,6 @@
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-279" value="1" style="resizable=0;html=1;whiteSpace=wrap;align=right;verticalAlign=bottom;" parent="1" connectable="0" vertex="1">
<mxGeometry x="1240" y="780" as="geometry" />
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-280" value="N" style="resizable=0;html=1;whiteSpace=wrap;align=right;verticalAlign=bottom;" parent="1" connectable="0" vertex="1"> <mxCell id="Ya_982ONw7_15APAzA8q-280" value="N" style="resizable=0;html=1;whiteSpace=wrap;align=right;verticalAlign=bottom;" parent="1" connectable="0" vertex="1">
<mxGeometry x="1130" y="940" as="geometry"> <mxGeometry x="1130" y="940" as="geometry">
<mxPoint x="15" y="41" as="offset" /> <mxPoint x="15" y="41" as="offset" />
@@ -582,7 +492,7 @@
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="RGG-I-Th0KsJHSMTwLBq-57" value="service" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" parent="1" vertex="1"> <mxCell id="RGG-I-Th0KsJHSMTwLBq-57" value="service" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" parent="1" vertex="1">
<mxGeometry x="1400" y="50" width="180" height="150" as="geometry" /> <mxGeometry x="1400" y="50" width="180" height="120" as="geometry" />
</mxCell> </mxCell>
<mxCell id="RGG-I-Th0KsJHSMTwLBq-58" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="RGG-I-Th0KsJHSMTwLBq-57" vertex="1"> <mxCell id="RGG-I-Th0KsJHSMTwLBq-58" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="RGG-I-Th0KsJHSMTwLBq-57" vertex="1">
<mxGeometry y="30" width="180" height="30" as="geometry" /> <mxGeometry y="30" width="180" height="30" as="geometry" />
@@ -597,23 +507,10 @@
<mxRectangle width="150" height="30" as="alternateBounds" /> <mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<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"> <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="60" width="180" height="30" as="geometry" /> <mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell> </mxCell>
<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"> <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">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="RGG-I-Th0KsJHSMTwLBq-63" value="servicetypeid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="RGG-I-Th0KsJHSMTwLBq-61" vertex="1">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="RGG-I-Th0KsJHSMTwLBq-64" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="RGG-I-Th0KsJHSMTwLBq-57" vertex="1">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="RGG-I-Th0KsJHSMTwLBq-65" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="RGG-I-Th0KsJHSMTwLBq-64" vertex="1">
<mxGeometry width="30" height="30" as="geometry"> <mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" /> <mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
@@ -624,9 +521,9 @@
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="RGG-I-Th0KsJHSMTwLBq-67" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="RGG-I-Th0KsJHSMTwLBq-57" vertex="1"> <mxCell id="RGG-I-Th0KsJHSMTwLBq-67" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="RGG-I-Th0KsJHSMTwLBq-57" vertex="1">
<mxGeometry y="120" width="180" height="30" as="geometry" /> <mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell> </mxCell>
<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"> <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">
<mxGeometry width="30" height="30" as="geometry"> <mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" /> <mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
@@ -636,19 +533,19 @@
<mxRectangle width="150" height="30" as="alternateBounds" /> <mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="RGG-I-Th0KsJHSMTwLBq-70" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="RGG-I-Th0KsJHSMTwLBq-61" 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="BsNFRahTXGiPdYppKmQY-7" target="Ya_982ONw7_15APAzA8q-69" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="1340" y="150" as="sourcePoint" /> <mxPoint x="1580" y="125" as="sourcePoint" />
<mxPoint x="1390" y="100" as="targetPoint" /> <mxPoint x="1390" y="100" as="targetPoint" />
<Array as="points"> <Array as="points">
<mxPoint x="1640" y="125" /> <mxPoint x="1610" y="324" />
<mxPoint x="1640" y="433" /> <mxPoint x="1610" y="433" />
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="RGG-I-Th0KsJHSMTwLBq-71" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="Ya_982ONw7_15APAzA8q-82" target="RGG-I-Th0KsJHSMTwLBq-64" 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" target="RGG-I-Th0KsJHSMTwLBq-67" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="1290" y="260" as="sourcePoint" /> <mxPoint x="1590" y="294" as="sourcePoint" />
<mxPoint x="1340" y="210" as="targetPoint" /> <mxPoint x="1340" y="210" as="targetPoint" />
<Array as="points"> <Array as="points">
<mxPoint x="1610" y="294" /> <mxPoint x="1610" y="294" />
@@ -661,7 +558,7 @@
<mxPoint x="1020" y="130" as="sourcePoint" /> <mxPoint x="1020" y="130" as="sourcePoint" />
<mxPoint x="1308" y="84" as="targetPoint" /> <mxPoint x="1308" y="84" as="targetPoint" />
<Array as="points"> <Array as="points">
<mxPoint x="1360" y="185" /> <mxPoint x="1360" y="155" />
<mxPoint x="1360" y="65" /> <mxPoint x="1360" y="65" />
</Array> </Array>
</mxGeometry> </mxGeometry>
@@ -735,13 +632,13 @@
<mxCell id="5CqAkLydmV_yxfNIBBfD-14" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="1" vertex="1"> <mxCell id="5CqAkLydmV_yxfNIBBfD-14" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="1" vertex="1">
<mxGeometry x="1160" y="690" width="180" height="30" as="geometry" /> <mxGeometry x="1160" y="690" width="180" height="30" as="geometry" />
</mxCell> </mxCell>
<mxCell id="5CqAkLydmV_yxfNIBBfD-17" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="5CqAkLydmV_yxfNIBBfD-2" edge="1"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="1190" y="820" as="sourcePoint" /> <mxPoint x="1190" y="820" as="sourcePoint" />
<mxPoint x="1330.9999999999995" y="684.9999999999998" as="targetPoint" /> <mxPoint x="1330.9999999999995" y="684.9999999999998" as="targetPoint" />
<Array as="points"> <Array as="points">
<mxPoint x="1360" y="433" /> <mxPoint x="1360" y="433" />
<mxPoint x="1360" y="685" /> <mxPoint x="1360" y="625" />
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
@@ -1066,7 +963,7 @@
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="5CqAkLydmV_yxfNIBBfD-100" value="date" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=1;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxCell id="5CqAkLydmV_yxfNIBBfD-100" value="date" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=1;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="930" y="970" width="150" height="30" as="geometry"> <mxGeometry x="930" y="940" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" /> <mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
@@ -1177,13 +1074,13 @@
<mxRectangle width="150" height="30" as="alternateBounds" /> <mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="-nb5psitBYwo0NIamKds-33" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" edge="1" source="Ya_982ONw7_15APAzA8q-260"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="1420" y="740.0000000000001" as="sourcePoint" /> <mxPoint x="1420" y="740.0000000000001" as="sourcePoint" />
<mxPoint x="1330" y="740" as="targetPoint" /> <mxPoint x="1330" y="740" as="targetPoint" />
<Array as="points"> <Array as="points">
<mxPoint x="1370" y="835" /> <mxPoint x="1360" y="835" />
<mxPoint x="1370" y="740" /> <mxPoint x="1360" y="655" />
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
@@ -1658,28 +1555,28 @@
<mxRectangle width="150" height="30" as="alternateBounds" /> <mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-27" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="AkoRetE9dPsFytqfa5Kx-27"> <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">
<mxGeometry y="60" width="180" height="30" as="geometry" /> <mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-28" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="7H4gm8Qbcmcg-KG3YoOF-27"> <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">
<mxGeometry width="30" height="30" as="geometry"> <mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" /> <mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-29" value="addressid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="7H4gm8Qbcmcg-KG3YoOF-27"> <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">
<mxGeometry x="30" width="150" height="30" as="geometry"> <mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" /> <mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-21" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="AkoRetE9dPsFytqfa5Kx-27"> <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">
<mxGeometry y="90" width="180" height="30" as="geometry" /> <mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-22" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="7H4gm8Qbcmcg-KG3YoOF-21"> <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">
<mxGeometry width="30" height="30" as="geometry"> <mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" /> <mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-23" value="houseid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="7H4gm8Qbcmcg-KG3YoOF-21"> <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">
<mxGeometry x="30" width="150" height="30" as="geometry"> <mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" /> <mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
@@ -1697,7 +1594,7 @@
<mxRectangle width="150" height="30" as="alternateBounds" /> <mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="AkoRetE9dPsFytqfa5Kx-45" value="" style="endArrow=none;html=1;rounded=0;exitX=-0.002;exitY=0.678;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" edge="1" source="HT5lYA2dYPyrPS9nyiQT-315"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="600" y="710" as="sourcePoint" /> <mxPoint x="600" y="710" as="sourcePoint" />
<mxPoint x="480" y="510" as="targetPoint" /> <mxPoint x="480" y="510" as="targetPoint" />
@@ -2215,7 +2112,7 @@
<mxGeometry x="1151" y="550" width="180" height="210" as="geometry" /> <mxGeometry x="1151" y="550" width="180" height="210" as="geometry" />
</mxCell> </mxCell>
<mxCell id="HT5lYA2dYPyrPS9nyiQT-171" value="contract" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-190" vertex="1"> <mxCell id="HT5lYA2dYPyrPS9nyiQT-171" value="contract" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-190" vertex="1">
<mxGeometry width="180" height="210" as="geometry" /> <mxGeometry width="180" height="180" as="geometry" />
</mxCell> </mxCell>
<mxCell id="HT5lYA2dYPyrPS9nyiQT-172" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="HT5lYA2dYPyrPS9nyiQT-171" vertex="1"> <mxCell id="HT5lYA2dYPyrPS9nyiQT-172" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" parent="HT5lYA2dYPyrPS9nyiQT-171" vertex="1">
<mxGeometry y="30" width="180" height="30" as="geometry" /> <mxGeometry y="30" width="180" height="30" as="geometry" />
@@ -2230,21 +2127,8 @@
<mxRectangle width="150" height="30" as="alternateBounds" /> <mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<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"> <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" /> <mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell> </mxCell>
<mxCell id="HT5lYA2dYPyrPS9nyiQT-179" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-178" vertex="1"> <mxCell id="HT5lYA2dYPyrPS9nyiQT-179" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-178" vertex="1">
<mxGeometry width="30" height="30" as="geometry"> <mxGeometry width="30" height="30" as="geometry">
@@ -2257,7 +2141,7 @@
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="HT5lYA2dYPyrPS9nyiQT-181" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="HT5lYA2dYPyrPS9nyiQT-171" vertex="1"> <mxCell id="HT5lYA2dYPyrPS9nyiQT-181" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="HT5lYA2dYPyrPS9nyiQT-171" vertex="1">
<mxGeometry y="120" width="180" height="30" as="geometry" /> <mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell> </mxCell>
<mxCell id="HT5lYA2dYPyrPS9nyiQT-182" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-181" vertex="1"> <mxCell id="HT5lYA2dYPyrPS9nyiQT-182" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-181" vertex="1">
<mxGeometry width="30" height="30" as="geometry"> <mxGeometry width="30" height="30" as="geometry">
@@ -2277,11 +2161,6 @@
<mxRectangle width="30" height="30" as="alternateBounds" /> <mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="HT5lYA2dYPyrPS9nyiQT-186" value="startdate" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=1;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-184" vertex="1">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="HT5lYA2dYPyrPS9nyiQT-187" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="HT5lYA2dYPyrPS9nyiQT-190" vertex="1"> <mxCell id="HT5lYA2dYPyrPS9nyiQT-187" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" parent="HT5lYA2dYPyrPS9nyiQT-190" vertex="1">
<mxGeometry y="180" width="180" height="30" as="geometry" /> <mxGeometry y="180" width="180" height="30" as="geometry" />
</mxCell> </mxCell>
@@ -2290,11 +2169,19 @@
<mxRectangle width="30" height="30" as="alternateBounds" /> <mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="HT5lYA2dYPyrPS9nyiQT-189" value="enddate" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=1;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-187" vertex="1"> <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" width="150" height="30" as="geometry"> <mxGeometry x="30" y="120" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" /> <mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="HT5lYA2dYPyrPS9nyiQT-189" value="enddate" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=1;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" parent="HT5lYA2dYPyrPS9nyiQT-190" vertex="1">
<mxGeometry x="30" y="150" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="Ya_982ONw7_15APAzA8q-279" value="1" style="resizable=0;html=1;whiteSpace=wrap;align=right;verticalAlign=bottom;" parent="HT5lYA2dYPyrPS9nyiQT-190" connectable="0" vertex="1">
<mxGeometry x="90" y="200" as="geometry" />
</mxCell>
<mxCell id="HT5lYA2dYPyrPS9nyiQT-197" value="" style="group" parent="1" vertex="1" connectable="0"> <mxCell id="HT5lYA2dYPyrPS9nyiQT-197" value="" style="group" parent="1" vertex="1" connectable="0">
<mxGeometry x="870" y="20" width="180" height="211" as="geometry" /> <mxGeometry x="870" y="20" width="180" height="211" as="geometry" />
</mxCell> </mxCell>
@@ -3275,7 +3162,7 @@
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-1" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="HT5lYA2dYPyrPS9nyiQT-199" target="HT5lYA2dYPyrPS9nyiQT-348"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-266" y="560" as="sourcePoint" /> <mxPoint x="-266" y="560" as="sourcePoint" />
<mxPoint x="414" y="1158" as="targetPoint" /> <mxPoint x="414" y="1158" as="targetPoint" />
@@ -3285,7 +3172,7 @@
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-2" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="HT5lYA2dYPyrPS9nyiQT-366" target="HT5lYA2dYPyrPS9nyiQT-417"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="200" y="1110" as="sourcePoint" /> <mxPoint x="200" y="1110" as="sourcePoint" />
<mxPoint x="500" y="880" as="targetPoint" /> <mxPoint x="500" y="880" as="targetPoint" />
@@ -3409,7 +3296,7 @@
<mxRectangle width="150" height="30" as="alternateBounds" /> <mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-3" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.994;entryY=0.967;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="HT5lYA2dYPyrPS9nyiQT-388" target="HT5lYA2dYPyrPS9nyiQT-418"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="1360" y="290" as="sourcePoint" /> <mxPoint x="1360" y="290" as="sourcePoint" />
<mxPoint x="1360" y="180" as="targetPoint" /> <mxPoint x="1360" y="180" as="targetPoint" />
@@ -3421,7 +3308,7 @@
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-4" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="HT5lYA2dYPyrPS9nyiQT-2" target="HT5lYA2dYPyrPS9nyiQT-36"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-300" y="1470" as="sourcePoint" /> <mxPoint x="-300" y="1470" as="sourcePoint" />
<mxPoint x="-250" y="1420" as="targetPoint" /> <mxPoint x="-250" y="1420" as="targetPoint" />
@@ -3431,13 +3318,13 @@
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-5" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HT5lYA2dYPyrPS9nyiQT-30"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-300" y="1110" as="sourcePoint" /> <mxPoint x="-300" y="1110" as="sourcePoint" />
<mxPoint x="-560" y="1215" as="targetPoint" /> <mxPoint x="-560" y="1215" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-6" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HT5lYA2dYPyrPS9nyiQT-253"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-300" y="1110" as="sourcePoint" /> <mxPoint x="-300" y="1110" as="sourcePoint" />
<mxPoint x="-380" y="1230" as="targetPoint" /> <mxPoint x="-380" y="1230" as="targetPoint" />
@@ -3447,13 +3334,13 @@
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-7" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HT5lYA2dYPyrPS9nyiQT-276"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-590" y="1130" as="sourcePoint" /> <mxPoint x="-590" y="1130" as="sourcePoint" />
<mxPoint x="-560" y="1060" as="targetPoint" /> <mxPoint x="-560" y="1060" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-8" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=-0.006;entryY=0.924;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="Ya_982ONw7_15APAzA8q-301" target="HT5lYA2dYPyrPS9nyiQT-253"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-590" y="1130" as="sourcePoint" /> <mxPoint x="-590" y="1130" as="sourcePoint" />
<mxPoint x="-540" y="1080" as="targetPoint" /> <mxPoint x="-540" y="1080" as="targetPoint" />
@@ -3463,7 +3350,7 @@
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-9" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" target="HT5lYA2dYPyrPS9nyiQT-289"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-380" y="299" as="sourcePoint" /> <mxPoint x="-380" y="299" as="sourcePoint" />
<mxPoint x="330" y="420" as="targetPoint" /> <mxPoint x="330" y="420" as="targetPoint" />
@@ -3473,13 +3360,13 @@
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-30" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" target="HT5lYA2dYPyrPS9nyiQT-312"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="790" y="685" as="sourcePoint" /> <mxPoint x="790" y="685" as="sourcePoint" />
<mxPoint x="760" y="540" as="targetPoint" /> <mxPoint x="760" y="540" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-31" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="AkoRetE9dPsFytqfa5Kx-31"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="790" y="850" as="sourcePoint" /> <mxPoint x="790" y="850" as="sourcePoint" />
<mxPoint x="250" y="870" as="targetPoint" /> <mxPoint x="250" y="870" as="targetPoint" />
@@ -3489,7 +3376,7 @@
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="7H4gm8Qbcmcg-KG3YoOF-32" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" target="7H4gm8Qbcmcg-KG3YoOF-21"> <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">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="480" y="720" as="sourcePoint" /> <mxPoint x="480" y="720" as="sourcePoint" />
<mxPoint x="530" y="470" as="targetPoint" /> <mxPoint x="530" y="470" as="targetPoint" />
@@ -3500,6 +3387,103 @@
</Array> </Array>
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-3" value="servicedesc" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
<mxGeometry x="1410" y="249" width="180" height="120" as="geometry" />
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-4" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-3">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-5" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-4">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-6" value="servicedescid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-4">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-7" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-3">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-8" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-7">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-9" value="servicetypeid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-7">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-10" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-3">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-11" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-10">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-12" value="description" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-10">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-16" value="offers" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
<mxGeometry x="900" y="645" width="180" height="151" as="geometry" />
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-17" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-16">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-18" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-17">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-19" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-17">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-20" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-16">
<mxGeometry y="60" width="180" height="31" as="geometry" />
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-21" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-20">
<mxGeometry width="30" height="31" as="geometry">
<mxRectangle width="30" height="31" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-22" value="jobdetailid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-20">
<mxGeometry x="30" width="150" height="31" as="geometry">
<mxRectangle width="150" height="31" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-23" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-16">
<mxGeometry y="91" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-24" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-23">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-25" value="offerid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-23">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-26" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-16">
<mxGeometry y="121" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-27" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-26">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="BsNFRahTXGiPdYppKmQY-28" value="contractid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="BsNFRahTXGiPdYppKmQY-26">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
</root> </root>
</mxGraphModel> </mxGraphModel>
</diagram> </diagram>

BIN
doc/design/TERO CRM.penpot Normal file

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 142 KiB

View File

@@ -1 +1 @@
Lj30yFOP7hJmY5Cub1Go8fJz0UE+Zyo9cEqNxfY23Sc= Lj30yFOP7hJmY5Cub1Go8fJz0UE+Zyo9cEqNxfY23Sc=

View File

@@ -0,0 +1,3 @@
<svg fill="none" stroke-width="2" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" data-slot="icon">
<path stroke-linecap="round" stroke-linejoin="round" d="m11.25 9-3 3m0 0 3 3m-3-3h7.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"></path>
</svg>

After

Width:  |  Height:  |  Size: 288 B

View File

Before

Width:  |  Height:  |  Size: 521 B

After

Width:  |  Height:  |  Size: 521 B

3
images/CheckCircle.svg Normal file
View File

@@ -0,0 +1,3 @@
<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="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z"></path>
</svg>

After

Width:  |  Height:  |  Size: 409 B

View File

Before

Width:  |  Height:  |  Size: 539 B

After

Width:  |  Height:  |  Size: 539 B

View File

Before

Width:  |  Height:  |  Size: 501 B

After

Width:  |  Height:  |  Size: 501 B

3
images/Phone.svg Normal file
View File

@@ -0,0 +1,3 @@
<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="M1.5 4.5a3 3 0 0 1 3-3h1.372c.86 0 1.61.586 1.819 1.42l1.105 4.423a1.875 1.875 0 0 1-.694 1.955l-1.293.97c-.135.101-.164.249-.126.352a11.285 11.285 0 0 0 6.697 6.697c.103.038.25.009.352-.126l.97-1.293a1.875 1.875 0 0 1 1.955-.694l4.423 1.105c.834.209 1.42.959 1.42 1.82V19.5a3 3 0 0 1-3 3h-2.25C8.552 22.5 1.5 15.448 1.5 6.75V4.5Z"></path>
</svg>

After

Width:  |  Height:  |  Size: 514 B

View File

Before

Width:  |  Height:  |  Size: 589 B

After

Width:  |  Height:  |  Size: 589 B

View File

Before

Width:  |  Height:  |  Size: 418 B

After

Width:  |  Height:  |  Size: 418 B

3
images/UserCircle.svg Normal file
View File

@@ -0,0 +1,3 @@
<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="M18.685 19.097A9.723 9.723 0 0 0 21.75 12c0-5.385-4.365-9.75-9.75-9.75S2.25 6.615 2.25 12a9.723 9.723 0 0 0 3.065 7.097A9.716 9.716 0 0 0 12 21.75a9.716 9.716 0 0 0 6.685-2.653Zm-12.54-1.285A7.486 7.486 0 0 1 12 15a7.486 7.486 0 0 1 5.855 2.812A8.224 8.224 0 0 1 12 20.25a8.224 8.224 0 0 1-5.855-2.438ZM15.75 9a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0Z"></path>
</svg>

After

Width:  |  Height:  |  Size: 539 B

View File

Before

Width:  |  Height:  |  Size: 733 B

After

Width:  |  Height:  |  Size: 733 B

View File

Before

Width:  |  Height:  |  Size: 490 B

After

Width:  |  Height:  |  Size: 490 B

View File

@@ -2,7 +2,6 @@ from .DbManager import DbManager
import json import json
import mariadb import mariadb
from PySide6.QtCore import QObject, Signal from PySide6.QtCore import QObject, Signal
# from ..PyqcrmFlags import PyqcrmAppliEmpyFlags
class EmployeeDAO(QObject): class EmployeeDAO(QObject):
@@ -17,35 +16,30 @@ class EmployeeDAO(QObject):
if self.__con: if self.__con:
self.__cur = self.__con.cursor() self.__cur = self.__con.cursor()
def getEmployees(self, enc_key, criterion = "Alle", processed = False, fired = False, every_state = True): def getEmployees(self, enc_key, criterion="Alle", processed=False, fired=False, every_state=True):
try: try:
if self.__cur: if self.__cur:
self.__cur.callproc("getEmployeeTable", (criterion, processed, fired, every_state, enc_key, )) self.__cur.callproc("getEmployeeTable", (criterion, processed, fired, every_state, enc_key,))
self.__all_cols = [desc[0] for desc in self.__cur.description] self.__all_cols = [desc[0] for desc in self.__cur.description]
return self.__cur.fetchall(), self.__all_cols return self.__cur.fetchall(), self.__all_cols
else: else:
return None, None return None, None
except mariadb.Error as e: except mariadb.Error as e:
print(str(e)) print(str(e))
def getEmployee(self, employee_id, enc_key = None): def getEmployee(self, employee_id, enc_key=None):
try: try:
if self.__cur: if self.__cur:
self.__cur.callproc("getEmployee", (employee_id, enc_key,)) self.__cur.callproc("getEmployee", (employee_id, enc_key,))
#self.__all_cols = [desc[0] for desc in self.__cur.description] # self.__all_cols = [desc[0] for desc in self.__cur.description]
return self.__cur.fetchall() #, self.__all_cols return self.__cur.fetchall() # , self.__all_cols
else: else:
return None #, None return None
except mariadb.Error as e: except mariadb.Error as e:
print(str(e)) print(str(e))
def addEmployee(self, data, enc_key, applicant = True): def addEmployee(self, data, enc_key, applicant=True):
try: if self.__cur:
if self.__cur: self.__cur.callproc("addApplicant", (json.dumps(data), applicant, enc_key,))
self.__cur.callproc("addApplicant", (json.dumps(data), applicant, enc_key,)) self.__con.commit()
self.__con.commit() self.newEmployeeAdded.emit(True)
self.newEmployeeAdded.emit(True)
except mariadb.Error as e:
print(str(e))
self.newEmployeeAdded.emit(False)

View File

@@ -1,4 +1,8 @@
from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot, Signal import json
from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot, Signal, QJsonDocument
from PySide6.QtQml import QJSValue
from .EmployeeDAO import EmployeeDAO from .EmployeeDAO import EmployeeDAO
# from ..PyqcrmFlags import PyqcrmFlags, PyqcrmAppliEmpyFlags # from ..PyqcrmFlags import PyqcrmFlags, PyqcrmAppliEmpyFlags
from ..ConfigLoader import ConfigLoader from ..ConfigLoader import ConfigLoader
@@ -12,7 +16,6 @@ class EmployeeModel(QAbstractTableModel):
__visible_index = None __visible_index = None
__visible_columns = None __visible_columns = None
__col_name = "" __col_name = ""
__employee_dao = None
__col_skip = 2 __col_skip = 2
__everyone = True __everyone = True
@@ -24,12 +27,28 @@ class EmployeeModel(QAbstractTableModel):
self.__key = self.__conf['pyqcrm']['ENCRYPTION_KEY'] self.__key = self.__conf['pyqcrm']['ENCRYPTION_KEY']
self.__getData() self.__getData()
@Slot(dict, bool) @Slot(dict)
def addEmployee(self, new_employee, applicant = True): def addEmployee(self, new_employee):
if 'worklicense' in new_employee: if 'worklicense' in new_employee:
new_employee['worklicense'] = int(new_employee['worklicense']) new_employee['worklicense'] = int(new_employee['worklicense'])
new_employee['residencetype'] = int(new_employee['residencetype']) new_employee['residencetype'] = int(new_employee['residencetype'])
self.__employee_dao.addEmployee(new_employee, self.__key, applicant) self.__employee_dao.addEmployee(new_employee, self.__key, False)
@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)
@Slot(bool) @Slot(bool)
def __refreshView(self, added): def __refreshView(self, added):
@@ -37,43 +56,42 @@ class EmployeeModel(QAbstractTableModel):
self.__getData() self.__getData()
self.addedNewEmployee.emit(added) self.addedNewEmployee.emit(added)
def __getData(self, criterion = "Alle", processed = False, fired = False, every_state = True): def __getData(self, criterion="Alle", processed=False, fired=False, every_state=True):
self.beginResetModel() self.beginResetModel()
rows, self.__visible_columns = self.__employee_dao.getEmployees(self.__key, criterion, processed, fired, every_state) rows, self.__visible_columns = self.__employee_dao.getEmployees(self.__key, criterion, processed, fired,
every_state)
self.__data = rows self.__data = rows
self.endResetModel() self.endResetModel()
def rowCount(self, parent= QModelIndex()): def rowCount(self, parent=QModelIndex()):
return len (self.__data) return len(self.__data)
def columnCount(self, parent= QModelIndex()): def columnCount(self, parent=QModelIndex()):
return len(self.__visible_columns) - self.__col_skip return len(self.__visible_columns) - self.__col_skip
@Slot(str, bool, bool, bool) @Slot(str)
def viewCriterion(self, criterion, processed, fired, every_state): def viewCriterion(self, criterion):
self.__everyone = True if criterion == 'Alle' else False self.__everyone = criterion == 'Alle'
if self.__everyone and criterion != "Alle": self.__col_skip = 2
self.__col_skip = 2 self.__getData(criterion, criterion == 'Erledigt', False, criterion == 'Alle')
else:
self.__col_skip = 2
self.__getData(criterion, processed, fired, every_state)
def data(self, index, role= Qt.DisplayRole): def data(self, index, role=Qt.DisplayRole):
if role == Qt.DisplayRole: if role == Qt.DisplayRole:
row = self.__data[index.row()] row = self.__data[index.row()]
applicant_col = index.column() + self.__col_skip applicant_col = index.column() + self.__col_skip
tr = row[applicant_col] #if type(row[index.column() + 2]) is str else str(row[index.column() + 2], "utf-8") tr = row[
applicant_col] # if type(row[index.column() + 2]) is str else str(row[index.column() + 2], "utf-8")
if applicant_col == 2 and self.__everyone: if applicant_col == 2 and self.__everyone:
tr = 'Ja' if tr == 1 else 'Nein' tr = 'Ja' if tr == 1 else 'Nein'
else: else:
if tr: if tr:
tr = re.sub("Keine Angabe ","", tr) tr = re.sub("Keine Angabe ", "", tr)
#print(f"Data: {tr}") # print(f"Data: {tr}")
# return row[index.column() + 2] # return row[index.column() + 2]
return tr return tr
return None return None
def headerData(self, section, orientation, role = Qt.DisplayRole): def headerData(self, section, orientation, role=Qt.DisplayRole):
if orientation == Qt.Horizontal and role == Qt.DisplayRole: if orientation == Qt.Horizontal and role == Qt.DisplayRole:
self.__col_name = self.__visible_columns[section + self.__col_skip] self.__col_name = self.__visible_columns[section + self.__col_skip]
return self.__col_name return self.__col_name
@@ -81,11 +99,11 @@ class EmployeeModel(QAbstractTableModel):
@Slot(int) @Slot(int)
def onRowClicked(self, row): def onRowClicked(self, row):
#print(self.__data) # print(self.__data)
print(f"Selected table row: {row}, corresponding DB ID: {self.__data[row][0]}") print(f"Selected table row: {row}, corresponding DB ID: {self.__data[row][0]}")
#if not self.__employee_dict['employee'] or self.__data[row][0] != self.__employee_dict['employee']['id']: # 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) # self.__employee = self.__employee_dao.getEmployee(self.__data[row][0], self.__key)
#print(self.__business) # print(self.__business)
#self.__getEmployeeInfo() # self.__getEmployeeInfo()
# self.__getContactInfo() # self.__getContactInfo()
# print(self.__business_dict) # print(self.__business_dict)

View File

@@ -1,6 +1,5 @@
from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot, Signal from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot, Signal
from .ObjectDAO import ObjectDAO from .ObjectDAO import ObjectDAO
# from ..PyqcrmFlags import PyqcrmFlags, PyqcrmAppliEmpyFlags
from ..ConfigLoader import ConfigLoader from ..ConfigLoader import ConfigLoader
import re import re
import json import json

View File

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

View File

@@ -22,6 +22,7 @@ from lib.Printers import Printers
os.environ['QML_XHR_ALLOW_FILE_READ'] = '1' os.environ['QML_XHR_ALLOW_FILE_READ'] = '1'
# [pyqcrm] # [pyqcrm]
# program-name="" # program-name=""
# version= # version=

View File

@@ -1,13 +1,24 @@
<RCC> <RCC>
<qresource prefix="/"> <qresource prefix="/">
<file>qtquickcontrols2.conf</file> <file>qtquickcontrols2.conf</file>
<file>images/ArrowLeftCircle-Outline.svg</file>
<file>images/ArrowRightEndOnRectangle.svg</file> <file>images/ArrowRightEndOnRectangle.svg</file>
<file>images/Bars3.svg</file> <file>images/Bars3.svg</file>
<file>images/BuildingOffice2-Outline.svg</file>
<file>images/CheckCircle.svg</file>
<file>images/ChevronDown.svg</file> <file>images/ChevronDown.svg</file>
<file>images/Funnel.svg</file> <file>images/Funnel.svg</file>
<file>images/Identification-Outline.svg</file>
<file>images/MagnifyingGlass.svg</file> <file>images/MagnifyingGlass.svg</file>
<file>images/Newspaper-Outline.svg</file>
<file>images/Phone.svg</file>
<file>images/PlusCircle.svg</file> <file>images/PlusCircle.svg</file>
<file>images/RectangleStack-Outline.svg</file>
<file>images/Square3Stack3D-Outline.svg</file>
<file>images/tero.jpg</file> <file>images/tero.jpg</file>
<file>images/UserCircle.svg</file>
<file>images/UserGroup-Outline.svg</file>
<file>images/Wallet-Outline.svg</file>
<file>sounds/error.ogg</file> <file>sounds/error.ogg</file>
<file>sounds/fail2c.ogg</file> <file>sounds/fail2c.ogg</file>
<file>sounds/puzzerr.ogg</file> <file>sounds/puzzerr.ogg</file>
@@ -17,12 +28,5 @@
<file>README</file> <file>README</file>
<file>LICENSE</file> <file>LICENSE</file>
<file>images/tero.jpg</file> <file>images/tero.jpg</file>
<file>images/dash.svg</file>
<file>images/invoice.svg</file>
<file>images/offer.svg</file>
<file>images/employee.svg</file>
<file>images/customer.svg</file>
<file>images/contract.svg</file>
<file>images/object.svg</file>
</qresource> </qresource>
</RCC> </RCC>

38
qml.qrc
View File

@@ -1,38 +1,27 @@
<RCC> <RCC>
<qresource prefix="/"> <qresource prefix="/">
<file>Gui/TopBar.qml</file> <file>Gui/Navigation.qml</file>
<file>Gui/AdminUserConfig.qml</file> <file>Gui/AdminUserConfig.qml</file>
<file>Gui/EncryptionKey.qml</file> <file>Gui/EncryptionKey.qml</file>
<file>Gui/DbConfiguration.qml</file> <file>Gui/DbConfiguration.qml</file>
<file>Gui/LoginScreen.qml</file> <file>Gui/LoginScreen.qml</file>
<file>Gui/AddContact.qml</file> <file>Gui/AddContact.qml</file>
<file>Gui/AddCustomer.qml</file> <file>Gui/AddCustomer.qml</file>
<file>Gui/CustomerTable.qml</file>
<file>Gui/Dashboard.qml</file> <file>Gui/Dashboard.qml</file>
<file>Gui/EmployeeTable.qml</file>
<file>Gui/main.qml</file> <file>Gui/main.qml</file>
<file>Gui/SearchBar.qml</file>
<file>js/qmldict.js</file> <file>js/qmldict.js</file>
<file>Gui/CustomerView.qml</file> <file>Gui/CustomerView.qml</file>
<file>Gui/NoDbConnection.qml</file> <file>Gui/NoDbConnection.qml</file>
<file>Gui/Notifications.qml</file> <file>Gui/Notifications.qml</file>
<file>Gui/ObjectTable.qml</file>
<file>Gui/AddObject.qml</file> <file>Gui/AddObject.qml</file>
<file>Gui/ObjectView.qml</file> <file>Gui/ObjectView.qml</file>
<file>Gui/ObjectAddOns.qml</file> <file>Gui/ObjectAddOns.qml</file>
<file>Gui/ObjectAddOnContactPerson.qml</file> <file>Gui/ObjectAddOnContactPerson.qml</file>
<file>Gui/ObjectAddOnEmployee.qml</file> <file>Gui/ObjectAddOnEmployee.qml</file>
<file>Gui/AddObjectEmployee.qml</file> <file>Gui/AddObjectEmployee.qml</file>
<file>Gui/AddApplicant.qml</file>
<file>Gui/ApplicantPersonalData.qml</file>
<file>Gui/ApplicantBankData.qml</file>
<file>Gui/ApplicantNationalInsurance.qml</file>
<file>Gui/ApplicantVarious.qml</file>
<file>Gui/CustomersTable.qml</file> <file>Gui/CustomersTable.qml</file>
<file>Gui/CustomerDetails.qml</file> <file>Gui/CustomerDetails.qml</file>
<file>Gui/ObjectsTable.qml</file> <file>Gui/ObjectsTable.qml</file>
<file>Gui/EmployeesTable.qml</file>
<file>Gui/EmployeeDetails.qml</file>
<file>Gui/ObjectDetails.qml</file> <file>Gui/ObjectDetails.qml</file>
<file>Gui/AddNewObject.qml</file> <file>Gui/AddNewObject.qml</file>
<file>Gui/PrinterDialog.qml</file> <file>Gui/PrinterDialog.qml</file>
@@ -48,18 +37,39 @@
<file>Gui/MiscConf.qml</file> <file>Gui/MiscConf.qml</file>
<file>Gui/UtilityDialogs.qml</file> <file>Gui/UtilityDialogs.qml</file>
<file>Gui/OffersTable.qml</file> <file>Gui/OffersTable.qml</file>
<file>Gui/OfferTable.qml</file> <file>Gui/Employees/AddApplicant.qml</file>
<file>Gui/Employees/AddEmployee.qml</file>
<file>Gui/Employees/ApplicantPersonalData.qml</file>
<file>Gui/Employees/ApplicantBankData.qml</file>
<file>Gui/Employees/ApplicantForm.qml</file>
<file>Gui/Employees/ApplicantNationalInsurance.qml</file>
<file>Gui/Employees/ApplicantVarious.qml</file>
<file>Gui/Employees/EmployeeDetails.qml</file>
<file>Gui/Employees/EmployeesTable.qml</file>
<file>Gui/Employees/qmldir</file>
<file>TeroStyle/BarButton.qml</file>
<file>TeroStyle/Button.qml</file> <file>TeroStyle/Button.qml</file>
<file>TeroStyle/Colors.qml</file> <file>TeroStyle/Colors.qml</file>
<file>TeroStyle/ComboBox.qml</file> <file>TeroStyle/ComboBox.qml</file>
<file>TeroStyle/Dimensions.qml</file> <file>TeroStyle/Dimensions.qml</file>
<file>TeroStyle/EmailAddressValidator.qml</file>
<file>TeroStyle/Field.qml</file> <file>TeroStyle/Field.qml</file>
<file>TeroStyle/H1.qml</file>
<file>TeroStyle/H2.qml</file>
<file>TeroStyle/Label.qml</file> <file>TeroStyle/Label.qml</file>
<file>TeroStyle/NotEmptyValidator.qml</file>
<file>TeroStyle/OptionalEmailAddressValidator.qml</file>
<file>TeroStyle/OptionalPhoneNumberValidator.qml</file>
<file>TeroStyle/PhoneNumberValidator.qml</file>
<file>TeroStyle/PostcodeValidator.qml</file>
<file>TeroStyle/qmldir</file> <file>TeroStyle/qmldir</file>
<file>TeroStyle/QuickFilter.qml</file> <file>TeroStyle/QuickFilter.qml</file>
<file>TeroStyle/SearchBar.qml</file>
<file>TeroStyle/TextField.qml</file> <file>TeroStyle/TextField.qml</file>
<file>TeroStyle/Typography.qml</file> <file>TeroStyle/Typography.qml</file>
<file>TeroStyle/BarButton.qml</file> <file>Gui/AddOffer.qml</file>
<file>Gui/AddNewOffer.qml</file>
</qresource> </qresource>
<qresource prefix="/Common"/>
<qresource prefix="/TeroStyle"/> <qresource prefix="/TeroStyle"/>
</RCC> </RCC>