Compare commits

106 Commits

Author SHA256 Message Date
Yuri Becker
76fdc880c7 Implement search 2025-04-24 01:37:09 +02:00
Yuri Becker
45f19d80d0 Use ORM for applicants 2025-04-21 23:45:33 +02:00
Yuri Becker
0ae153617b Fetch applicant from database 2025-04-19 00:55:12 +02:00
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
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
7b8c3630f8 searchbar aligned 2025-03-25 11:15:25 +01:00
d125b56564 Merge branch 'main' of https://git.danielsto.de/Linuxero/pyqcrm 2025-03-25 00:24:28 +01:00
Yuri Becker
7f5675c06d Add Hover Effect to Buttons 2025-03-24 12:06:09 +01:00
Yuri Becker
30493dbdbf Fix Offers View 2025-03-24 11:41:07 +01:00
Yuri Becker
41ecdb658c Fix Objects Table 2025-03-24 11:36:09 +01:00
6e8c2f340c added barbutton, searchbar and qucickfilter positioning, combobox still not finished 2025-03-24 11:31:00 +01:00
76c4be7a7a Merge main 2025-03-24 11:28:57 +01:00
8236bd32e6 positioning searchbar and quickfilter 2025-03-24 11:21:50 +01:00
Yuri Becker
480dd673c4 Fix Mitarbeiter Table 2025-03-24 10:53:46 +01:00
3520c65879 for changing branch 2025-03-24 09:44:55 +01:00
a821956a67 to switch branch 2025-03-21 15:56:05 +01:00
46cba58ebe for branch switch 2025-03-21 15:47:56 +01:00
a7a1cd4913 merge 2025-03-21 15:17:07 +01:00
34bd7409df edited Layout 2025-03-21 14:01:23 +01:00
6df02d9ff2 Merge main 2025-03-21 13:45:53 +01:00
9499eace9b combobox 2025-03-21 13:27:54 +01:00
Yuri Becker
721232a975 Implement Quick Filters 2025-03-21 13:25:03 +01:00
8f6efac11e combobox still in progress 2025-03-21 11:44:52 +01:00
Yuri Becker
83f64f9af8 Use dark/light specification from system 2025-03-20 14:03:40 +01:00
d6034a5299 all changes not completed 2025-03-20 13:54:04 +01:00
Yuri Becker
dc1ea604f7 Add Icons to Buttons 2025-03-20 13:04:28 +01:00
15b14387df because i have to 2025-03-20 12:38:00 +01:00
fadd3d1b9e Merge branch 'main' into schnacke
merge main
2025-03-20 12:18:39 +01:00
Yuri Becker
fb06cea060 Fix ComboBox popup positioning 2025-03-20 10:46:51 +01:00
648753823f Merge branch 'main' into schnacke
merge main
2025-03-20 10:44:31 +01:00
495252c408 commit problems 2025-03-20 10:42:49 +01:00
Yuri Becker
5cf5676d9b Possibly size Combobox correctly 2025-03-20 10:39:35 +01:00
Yuri Becker
9a6d59a19b Add Designs 2025-03-20 10:24:56 +01:00
5b7e364c20 merge main 2025-03-20 09:42:00 +01:00
ce26d6d223 BarButton still in progress 2025-03-20 09:19:03 +01:00
Yuri Becker
13416edd25 Make ComboBoxes work a bit more 2025-03-19 13:28:31 +01:00
c49e4ebacd Merge branch 'main' into schnacke
merg
2025-03-18 08:52:44 +01:00
7b1f5cd3cc Style code 2025-03-18 08:50:39 +01:00
325e396774 Module_Dienstleistungen 2025-03-18 08:36:21 +01:00
f20cebab14 New Database Dump clean and with data 2025-03-17 12:04:27 +01:00
bd7cba5430 Merge branch 'style' into schnacke
merge mit style
2025-03-17 09:11:58 +01:00
607cccfb07 Merge branch 'main' into schnacke
Doku
2025-03-17 08:59:56 +01:00
8b82b49982 Doku 2025-03-17 08:59:23 +01:00
Yuri Becker
9ff0a0fbce Style Combobox 2025-03-14 11:57:21 +01:00
Yuri Becker
ef77e4c17d Style Login page 2025-03-14 10:24:32 +01:00
7b0ec6ed99 Remove faulty definition of viewCriterion in EmployeeModel.py 2025-03-14 09:34:52 +01:00
Yuri Becker
7099102e13 Style Buttons, re-layout Login 2025-03-13 17:23:36 +01:00
Yuri Becker
343e15c873 Define Colors 2025-03-13 10:45:55 +01:00
Yuri Becker
2704177fdb Stub style 2025-03-13 10:32:24 +01:00
773d398f8c Fix adding a contact person to an object and db autocommit 2025-03-12 15:43:13 +01:00
714a12e2d3 Merge branch 'main' into schnacke
merge main
2025-03-12 10:25:38 +01:00
898d808b1f Committing changes to main 2025-03-12 10:02:42 +01:00
e3053be72e Object contact logic implemented 2025-03-12 09:50:06 +01:00
ac6a83c352 Merge branch 'main' of https://git.danielsto.de/linuxero/pyqcrm 2025-03-11 09:29:32 +01:00
Yuri Becker
469b8d0a21 Fix Window Restoring on Mac 2025-03-11 09:28:59 +01:00
0834ee8905 Not solved - GIT uthentication issues 2025-03-10 16:19:19 +01:00
c8114d9e54 testing ssh git with qt 1 2025-03-10 16:17:58 +01:00
002575baa1 testing git authentication in qt 2025-03-10 15:57:28 +01:00
66fce857ba Merge branch 'refs/heads/linuxero' 2025-03-10 15:55:00 +01:00
767200096f Make spinboxes editable and correct contact person's position 2025-03-10 15:54:33 +01:00
55a35d0931 rc deleted 2025-03-10 14:16:49 +01:00
2a01433cf0 Merge branch 'main' of https://git.danielsto.de/linuxero/pyqcrm 2025-03-10 14:14:17 +01:00
66c1b168c8 DB Configuration added 2025-03-10 14:10:31 +01:00
f61f1e5c8f file not needed 2025-03-10 10:33:51 +01:00
4c07689a4a file not needed 2025-03-10 10:33:40 +01:00
5bf1d8de08 Fix icon on linuxero's branch 2025-03-10 10:26:59 +01:00
09a0daad66 Merge branch 'refs/heads/linuxero' 2025-03-10 10:24:13 +01:00
5b031e9d8d Fixed None type in EmployeeModel.py 2025-03-10 10:23:48 +01:00
155794e489 merge main 2025-03-10 09:54:46 +01:00
712df39383 Merge branch 'refs/heads/linuxero' 2025-03-08 12:24:49 +01:00
f5b32d6621 Ensure only one instance is running and publish company info. 2025-03-08 12:23:59 +01:00
c132b6830a Windows version 2025-03-07 15:29:45 +01:00
a6bed81aaf linuxversion 2025-03-07 15:29:04 +01:00
78ede0fad8 linux version 2025-03-07 15:28:51 +01:00
26759be1cb Resources for André 2025-03-07 14:47:37 +01:00
35c977c89e pyqcrm.qrc image problem fixed 2025-03-07 12:14:36 +01:00
bd232a2a28 Merge Linuxero with main 2025-03-07 12:10:18 +01:00
b414a050be Recovery in Settings and start with OfferTable 2025-03-07 11:59:51 +01:00
821da47f98 COnfiguration and systray 2025-03-07 11:58:19 +01:00
fb81b764f1 Clip delegated items of object contacts and printer not ready 2025-02-28 11:59:33 +01:00
e81407b43d Merge linuxero 2025-02-27 14:48:08 +01:00
73542e8089 Backup Config 2025-02-27 14:45:27 +01:00
4c62834369 merge main 2025-02-27 09:39:40 +01:00
e528729181 BackupSettings 2025-02-27 08:52:33 +01:00
bd2316dbfb BackupSettings.qml 2025-02-26 15:35:34 +01:00
82b3c2d403 test 2025-02-26 15:24:24 +01:00
8ee303227e Merge linuxero 2025-02-26 15:20:33 +01:00
2a09fed57a Test 2025-02-26 15:15:39 +01:00
e7d0b7cdb5 i dont know what im doing 2025-02-26 15:10:42 +01:00
f0cde5ec20 Fehler 2025-02-26 15:09:28 +01:00
dec4ca59f0 Merge linuxero 2025-02-26 09:23:28 +01:00
7228d5fae9 Merge branch 'main' into schnacke
asdasd
2025-02-25 16:24:15 +01:00
a68ae311bf Test 2025-02-25 16:21:09 +01:00
175 changed files with 12108 additions and 26851 deletions

1
.gitignore vendored
View File

@@ -228,3 +228,4 @@ cython_debug/
rc_*.py rc_*.py
.DS_STORE

8
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

17
.idea/QtSettings.xml generated Normal file
View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="QtSettings">
<option name="mySettingsPerProfile">
<map>
<entry key="">
<value>
<PerProfileState>
<option name="myCustomQmlPath" value="/opt/homebrew/share/qt/qml" />
<option name="myCustomQtBinPath" value="/opt/homebrew/bin" />
</PerProfileState>
</value>
</entry>
</map>
</option>
</component>
</project>

5
.idea/codeStyles/codeStyleConfig.xml generated Normal file
View File

@@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>

12
.idea/dataSources.xml generated Normal file
View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="pyqcrm@bearybot.selfhost.co" uuid="ed28331b-481b-40e7-9295-d9cdae9fd4f2">
<driver-ref>mariadb</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.mariadb.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mariadb://bearybot.selfhost.co:8080/pyqcrm</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

16
.idea/discord.xml generated Normal file
View File

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

7
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.12 (pyqcrm)" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (pyqcrm)" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/pyqcrm.iml" filepath="$PROJECT_DIR$/.idea/pyqcrm.iml" />
</modules>
</component>
</project>

10
.idea/pyqcrm.iml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.12 (pyqcrm)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

22
.idea/qmlSettings.xml generated Normal file
View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="QmlSettings">
<option name="mySettingsPerProfile">
<map>
<entry key="">
<value>
<PerProfileState>
<option name="myExtraQmlPaths">
<list>
<option value="$PROJECT_DIR$/TeroStyle" />
</list>
</option>
<option name="myLSPEnabled" value="true" />
<option name="myQmlFormatEnabled" value="true" />
</PerProfileState>
</value>
</entry>
</map>
</option>
</component>
</project>

View File

@@ -0,0 +1,17 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Compile pyqcrm.qrc" type="ShConfigurationType">
<option name="SCRIPT_TEXT" value=".venv/bin/pyside6-rcc -o rc_pyqcrm.py pyqcrm.qrc" />
<option name="INDEPENDENT_SCRIPT_PATH" value="true" />
<option name="SCRIPT_PATH" value=".venv/bin/pyside6-rcc" />
<option name="SCRIPT_OPTIONS" value="-o rc_qml.py qml.qrc" />
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true" />
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="INDEPENDENT_INTERPRETER_PATH" value="true" />
<option name="INTERPRETER_PATH" value="/bin/zsh" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="EXECUTE_IN_TERMINAL" value="false" />
<option name="EXECUTE_SCRIPT_FILE" value="false" />
<envs />
<method v="2" />
</configuration>
</component>

View File

@@ -0,0 +1,17 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Compile qml.qrc" type="ShConfigurationType">
<option name="SCRIPT_TEXT" value=".venv/bin/pyside6-rcc -o rc_qml.py qml.qrc" />
<option name="INDEPENDENT_SCRIPT_PATH" value="true" />
<option name="SCRIPT_PATH" value=".venv/bin/pyside6-rcc" />
<option name="SCRIPT_OPTIONS" value="-o rc_qml.py qml.qrc" />
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true" />
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="INDEPENDENT_INTERPRETER_PATH" value="true" />
<option name="INTERPRETER_PATH" value="/bin/zsh" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="EXECUTE_IN_TERMINAL" value="false" />
<option name="EXECUTE_SCRIPT_FILE" value="false" />
<envs />
<method v="2" />
</configuration>
</component>

31
.idea/runConfigurations/main.xml generated Normal file
View File

@@ -0,0 +1,31 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="main" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true">
<module name="pyqcrm" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
<env name="QT_LOGGING_RULES" value="*.debug=true; qt.*.debug=false" />
<env name="QT_LOGGING_TO_CONSOLE" value="1" />
<env name="QT_QML_DEBUG" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="SDK_NAME" value="Python 3.12 (pyqcrm)" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/main.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2">
<option name="RunConfigurationTask" enabled="true" run_configuration_name="Compile qml.qrc" run_configuration_type="ShConfigurationType" />
<option name="RunConfigurationTask" enabled="true" run_configuration_name="Compile pyqcrm.qrc" run_configuration_type="ShConfigurationType" />
</method>
</configuration>
</component>

6
.idea/sqldialects.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$/doc/db_schemer_v1.1-pyqcrm-202503171158_clean.sql" dialect="MariaDB" />
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

BIN
Dienstleistungen.docx Normal file

Binary file not shown.

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

@@ -1,7 +1,6 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Controls.Fusion
import QtQuick.Dialogs import QtQuick.Dialogs
import "../js/qmldict.js" as JsLib import "../js/qmldict.js" as JsLib
@@ -60,7 +59,7 @@ ColumnLayout
Button Button
{ {
text: qsTr("Abbrechen") text: qsTr("Abbrechen")
onClicked: appLoader.source = "CustomerTable.qml" onClicked: contentStack.pop()
} }
Button Button
{ {
@@ -73,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
{ {
@@ -100,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()
} }
} }

View File

@@ -11,11 +11,12 @@ GridLayout
Layout.fillHeight: true Layout.fillHeight: true
rowSpacing: 9 rowSpacing: 9
//// New grid row //// New grid row
Label Label
{ {
text: qsTr("Straße") text: qsTr("Straße*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
@@ -26,13 +27,11 @@ GridLayout
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
} }
Label Label
{ {
text: qsTr("Nr.") text: qsTr("Nr.*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
@@ -43,8 +42,6 @@ GridLayout
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
} }
// New grid row // New grid row
@@ -66,7 +63,6 @@ GridLayout
model: address_model model: address_model
textRole: "display" textRole: "display"
popup.height: 300 popup.height: 300
popup.y: postcode.y + 5 - (postcode.height * 2)
currentIndex: -1 currentIndex: -1
onCurrentIndexChanged: city.currentIndex = postcode.currentIndex onCurrentIndexChanged: city.currentIndex = postcode.currentIndex
@@ -94,7 +90,6 @@ GridLayout
model: address_model model: address_model
textRole: "city" textRole: "city"
popup.height: 300 popup.height: 300
popup.y: postcode.y + 5 - (postcode.height * 2)
currentIndex: -1 currentIndex: -1
} }
@@ -113,6 +108,7 @@ GridLayout
from: 1 from: 1
to: 100 to: 100
value: 1 value: 1
editable: true
} }
Label Label
@@ -129,6 +125,7 @@ GridLayout
from: 1 from: 1
to: 100 to: 100
value: 1 value: 1
editable: true
} }
// New grid row // New grid row
@@ -184,13 +181,11 @@ GridLayout
text: qsTr("Besonderheiten") text: qsTr("Besonderheiten")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
} }
ComboBox TextField
{ {
property string name: "remarks" property string name: "remarks"
id: remarks id: remarks
Layout.fillWidth: true Layout.fillWidth: true
editable: false
textRole: "display"
} }
//// New grid row //// New grid row
@@ -198,7 +193,7 @@ GridLayout
Label Label
{ {
text: qsTr("Reinigungsmittel wo?") text: qsTr("Reinigungsmittel wo?*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
@@ -207,8 +202,6 @@ GridLayout
property string name: "cleaningproducts" property string name: "cleaningproducts"
id: cleaningproducts id: cleaningproducts
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
onTextChanged: checkFields() onTextChanged: checkFields()
} }
Item Item
@@ -218,7 +211,9 @@ GridLayout
function checkObjectField() function checkObjectField()
{ {
return street.text.trim() && houseno.text.trim() && return street.text.trim() && houseno.text.trim() &&
(postcode.editText.trim() || postcode.currentText.trim()) && (postcode.editText.trim() || postcode.currentText.trim()) &&
(city.editText.trim() || city.currentText.trim()) && (city.editText.trim() || city.currentText.trim()) &&
cleaningproducts.text.trim() cleaningproducts.text.trim()

213
Gui/AddNewOffer.qml Normal file
View File

@@ -0,0 +1,213 @@
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.fillHeight: true
}
// function checkObjectField()
// {
// return street.text.trim() && houseno.text.trim() &&
// (postcode.editText.trim() || postcode.currentText.trim()) &&
// (city.editText.trim() || city.currentText.trim()) &&
// cleaningproducts.text.trim()
// }
}

View File

@@ -1,13 +1,13 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Controls.Fusion
import QtQuick.Dialogs import QtQuick.Dialogs
import "../js/qmldict.js" as JsLib import "../js/qmldict.js" as JsLib
ColumnLayout ColumnLayout
{ {
property var new_object: null property var new_object: null
//property alias checkAddContact: checkAddContact
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
spacing: 15 spacing: 15
@@ -20,7 +20,7 @@ ColumnLayout
} }
CheckBox CheckBox
{ {
id: checkAddContact id: checkAddObjectContact
text: qsTr("Ansprechpartner hinzufügen") text: qsTr("Ansprechpartner hinzufügen")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
checked: false checked: false
@@ -51,7 +51,7 @@ ColumnLayout
ObjectAddOns ObjectAddOns
{ {
id: addObjectLayout id: addObjectLayout
visible: checkAddContact.checked visible: checkAddObjectContact.checked
} }
} }
RowLayout RowLayout
@@ -61,7 +61,7 @@ ColumnLayout
Button Button
{ {
text: qsTr("Abbrechen") text: qsTr("Abbrechen")
onClicked: appLoader.source = "ObjectTable.qml" onClicked: contentStack.pop()
} }
Button Button
{ {
@@ -74,18 +74,7 @@ ColumnLayout
new_object = JsLib.parseForm(newObject) new_object = JsLib.parseForm(newObject)
new_object['lift'] = new_object['lift'] === 'Ja' ? 1 : 0 new_object['lift'] = new_object['lift'] === 'Ja' ? 1 : 0
new_object['mezzanin'] = new_object['mezzanin'] === 'Ja' ? 1 : 0 new_object['mezzanin'] = new_object['mezzanin'] === 'Ja' ? 1 : 0
if (!checkAddContact.checked) object_model.addObject(new_object)
{
var list = []
object_model.addObject(new_object, list, false)
}
else
{
var new_objecto = addObjectLayout.getForm()
object_model.addObject(new_object, new_objecto, true)
}
} }
} }
} }
@@ -97,31 +86,56 @@ ColumnLayout
Component.onCompleted: Component.onCompleted:
{ {
object_model.objectAdded.connect(onObjectAdded) //object_model.objectAdded.connect(onObjectAdded)
//contact_model.objectContactAdded.connect(onObjectContact)
} }
// Connections
// {
// target: spacer3
// function onObjectIdReady() Connections
{
target: object_model
function onObjectIdReady()
{
var obj_id = arguments[0]
if (checkAddObjectContact.checked && obj_id)
{
var new_objecto = addObjectLayout.getForm()
contact_model.addObjectContact(new_objecto, obj_id)
object_model.viewCriterion("Alle")
}
contentStack.pop()
}
}
// function onObjectAdded(added, oid)
// { // {
// var obj_id = arguments[0] // if (!added)
// object_model.addObject(new_object, obj_id) // console.log(qsTr("Fehler beim Objekt-Anlegen!"))
// if (checkAddObjectContact.checked && oid)
// {
// var new_objecto = addObjectLayout.getForm()
// contact_model.addObjectContact(new_objecto, oid)
// }
// else appLoader.source = "ObjectTable.qml"
// }
// function onObjectContact(added)
// {
// if (!added)
// console.log(qsTr("Fehler beim Objekt-Kontakt-Anlegen!"))
// else
// {
// //object_model.viewCriterion("Alle")
// appLoader.source = "ObjectTable.qml" // appLoader.source = "ObjectTable.qml"
// } // }
// } // }
function onObjectAdded(added)
{
if (!added)
console.log(qsTr("Fehler beim Objekt-Anlegen!"))
appLoader.source = "ObjectTable.qml"
}
function checkFields() function checkFields()
{ {
if(checkAddContact.checked) if(checkAddObjectContact.checked)
{ {
if(!newObject.checkObjectField() || !addObjectLayout.contactPerson.contacts || !addObjectLayout.contactPerson.contacts.length) if(!newObject.checkObjectField() || !addObjectLayout.contactPerson.contacts || !addObjectLayout.contactPerson.contacts.length)
saveBtn.enabled = false saveBtn.enabled = false

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

57
Gui/BackupSettings.qml Normal file
View File

@@ -0,0 +1,57 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import QtQuick.Dialogs
import QtCore
import "../js/qmldict.js" as JsLib
GridLayout
{
anchors.fill: parent
anchors.topMargin: 150
columns: 2
Label
{
Layout.columnSpan: 2
Layout.alignment: Qt.AlignHCenter
text: qsTr("Sicherung")
font.pixelSize: 35
}
Label
{
text: qsTr("Konfiguration")
Layout.alignment: Qt.AlignRight
}
Button
{
id: saveConfig
text: qsTr("Jetzt sichern!")
onClicked: utilityDialogs.item.backup_config.open()
}
Label
{
text: qsTr("Verschlüsselung")
Layout.alignment: Qt.AlignRight
}
Button
{
id: saveEncryption
text: qsTr("Jetzt sichern!")
onClicked: utilityDialogs.item.backup_encrypt_pw.open()
}
Item
{
id: spacer
Layout.fillHeight: true
}
Loader
{
id: utilityDialogs
source: "UtilityDialogs.qml"
}
}

View File

@@ -2,16 +2,121 @@ import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls import QtQuick.Controls
Item ColumnLayout
{ {
property string name: "company" property alias name: companyName
property alias street: street
property alias house: houseno
property alias zipcode: zipcode
property alias city: city
anchors.fill: parent anchors.fill: parent
anchors.topMargin: 50
RowLayout
{
Layout.fillWidth: true
Label
{
text: qsTr("Namen")
// font.pixelSize: 57
// font.bold: true
}
TextField
{
id: companyName
Layout.fillWidth: true
}
}
RowLayout
{
Layout.fillWidth: true
Label
{
text: qsTr("Straße")
// font.pixelSize: 57
// font.bold: true
}
TextField
{
id: street
Layout.fillWidth: true
}
Label Label
{ {
text: qsTr("Das Unternehmen") text: qsTr("Haus-Nr.")
anchors.centerIn: parent // font.pixelSize: 57
font.pixelSize: 57 // font.bold: true
font.bold: true }
TextField
{
id: houseno
Layout.fillWidth: true
}
}
RowLayout
{
Layout.fillWidth: true
Label
{
text: qsTr("PLZ")
}
ComboBox
{
id: zipcode
Layout.fillWidth: true
editable: true
model: address_model
textRole: "display"
popup.height: 300
onCurrentIndexChanged: city.currentIndex = zipcode.currentIndex
validator: RegularExpressionValidator
{
regularExpression: /([0-9]{1,5})/
}
}
Label
{
text: qsTr("Stadt")
// font.pixelSize: 57
// font.bold: true
}
ComboBox
{
id: city
Layout.fillWidth: true
editable: true
model: address_model
textRole: "city"
popup.height: 300
currentIndex: -1
}
}
Item
{
Layout.fillHeight: true
}
Component.onCompleted:
{
var c = config.getCompanyInfo()
if (Object.keys(c).length)
{
companyName.text = c['NAME']
street.text = c['STREET']
houseno.text = c['HOUSE']
zipcode.editText = c['ZIPCODE']
city.editText = c['CITY']
}
} }
} }

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,22 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
import QtQuick.Controls.Fusion
Item {
anchors.fill: parent
property var availableFilters: ["Name", "Adresse", "PLZ", "Ort"]
id: test
StackView
{
id: customersStack
anchors.fill: parent
initialItem: "CustomersTable.qml"
}
}

View File

@@ -16,11 +16,10 @@ GridLayout
Label Label
{ {
id: lblFirmenName id: lblFirmenName
text: qsTr("Firmenname") text: qsTr("Firmenname*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
TextField TextField
{ {
property string name: "business" property string name: "business"
@@ -29,34 +28,26 @@ GridLayout
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
Layout.columnSpan: 3 Layout.columnSpan: 3
} }
Label Label
{ {
text: qsTr("Straße") text: qsTr("Straße*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
TextField TextField
{ {
property string name: "street" property string name: "street"
id: streetid id: streetid
Layout.fillWidth: true Layout.fillWidth: true
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
} }
Label Label
{ {
text: qsTr("Nr.") text: qsTr("Nr.*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
@@ -66,8 +57,6 @@ GridLayout
id: housenoid id: housenoid
Layout.fillWidth: true Layout.fillWidth: true
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
validator: RegularExpressionValidator validator: RegularExpressionValidator
{ {
regularExpression: /([0-9a-zA-Z\-]{1,6})/ regularExpression: /([0-9a-zA-Z\-]{1,6})/
@@ -96,7 +85,6 @@ GridLayout
model: address_model model: address_model
textRole: "display" textRole: "display"
popup.height: 300 popup.height: 300
popup.y: postcode.y + 5 - (postcode.height * 2)
currentIndex: -1 currentIndex: -1
onCurrentIndexChanged: city.currentIndex = postcode.currentIndex onCurrentIndexChanged: city.currentIndex = postcode.currentIndex
Layout.columnSpan: 3 Layout.columnSpan: 3
@@ -123,10 +111,8 @@ GridLayout
model: address_model model: address_model
textRole: "city" textRole: "city"
popup.height: 300 popup.height: 300
popup.y: postcode.y + 5 - (postcode.height * 2)
currentIndex: -1 currentIndex: -1
Layout.columnSpan: 3 Layout.columnSpan: 3
// onCurrentIndexChanged: postcode.currentIndex = city.currentIndex
} }
Label Label

View File

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

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
radius: 45
width: 300
Text {
anchors.centerIn: parent
color: "lightgoldenrodyellow"
font.bold: true
font.pixelSize: 45
text: qsTr("Aufträge") text: qsTr("Aufträge")
anchors.centerIn: parent
font.pixelSize: 45
font.bold: true
color: "lightgoldenrodyellow"
} }
MouseArea {
MouseArea
{
anchors.fill: parent anchors.fill: parent
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
hoverEnabled: true hoverEnabled: true
onPressed:
{
contractButton.color = "darkolivegreen"
contractButton.border.width = 3
contractButton.border.color = "skyblue"
console.log("Aufträge...")
}
onReleased: onExited: {
{ contractButton.color = "darkslategray";
contractButton.color = "darkslategray" contractButton.border.color = "steelblue";
contractButton.border.width = 1 contractButton.border.width = 1;
contractButton.border.color = "steelblue"
} }
onHoveredChanged: {
onHoveredChanged: var w = contractButton.border.width === 3 ? 1 : 3;
{ contractButton.border.width = w;
var w = contractButton.border.width === 3? 1: 3
contractButton.border.width = w
} }
onPressed: {
onExited: contractButton.color = "darkolivegreen";
{ contractButton.border.width = 3;
contractButton.border.color = "skyblue";
contractButton.color = "darkslategray" console.log("Aufträge...");
contractButton.border.color = "steelblue" }
contractButton.border.width = 1 onReleased: {
contractButton.color = "darkslategray";
contractButton.border.width = 1;
contractButton.border.color = "steelblue";
} }
} }
} }
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

@@ -5,7 +5,11 @@ import QtQuick.Layouts
GridLayout GridLayout
{ {
// property alias firstStart: firstStartGrid property alias dbHost: dbHost
property alias dbPort: dbPort
property alias dbName: dbName
property alias dbUserName: dbUserName
property alias dbPassword: dbPassword
id: dbGrid id: dbGrid
columns: 2 columns: 2
columnSpacing: 5 columnSpacing: 5
@@ -102,4 +106,17 @@ GridLayout
{ {
Layout.fillHeight: true Layout.fillHeight: true
} }
Component.onCompleted:
{
var db = config.getDbConf()
if (Object.keys(db).length)
{
dbHost.text = db['DB_HOST']
dbPort.text = db['DB_PORT']
dbName.text = db['DB_NAME']
dbUserName.text = db['DB_USER']
dbPassword.text = db['DB_PASS']
}
}
} }

View File

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

View File

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

View File

@@ -0,0 +1,37 @@
import QtQuick
import QtQuick.Layouts
import TeroStyle
ColumnLayout {
anchors.fill: parent
spacing: Dimensions.l
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: {
applicantModel.createApplicant(applicantForm.value);
contentStack.pop();
}
}
}
}

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
EmployeePersonalData {
id: personalData
implicitWidth: parent.width
}
}
Frame {
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
Layout.horizontalStretchFactor: 1
ColumnLayout {
Layout.alignment: Qt.AlignTop
implicitWidth: parent.width
EmployeeBankData {
id: bankAccount
}
EmployeeNationalInsurance {
id: nationalInsurance
}
EmployeeVarious {
id: applicantVarious
}
}
}
}
Item {
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,218 @@
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: emailAddress.acceptableInput && firstName.acceptableInput && houseNumber.acceptableInput && lastName.acceptableInput && mobileNumber.acceptableInput && phoneNumber.acceptableInput && salutation.acceptableInput&& street.acceptableInput && title.acceptableInput && zipCode.acceptableInput
readonly property var value: QtObject {
readonly property string emailAddress: emailAddress.text ?? ""
readonly property string firstName: firstName.text ?? ""
readonly property string houseNumber: houseNumber.text ?? ""
readonly property string lastName: lastName.text ?? ""
readonly property string mobileNumber: mobileNumber.text ?? ""
readonly property string phoneNumber: phoneNumber.text ?? ""
readonly property string salutation: salutation.text ?? ""
readonly property string street: street.text ?? ""
readonly property string title: title.currentText
readonly property int zipCode: zipCode.currentIndex
}
function setValue(value) {
title.currentIndex = value.title ?? 0;
firstName.text = value.firstName ?? "";
lastName.text = value.lastName ?? "";
street.text = value.street ?? "";
houseNumber.text = value.houseNumber ?? "";
zipCode.currentIndex = value.zipCode ?? -1;
phoneNumber.text = value.phoneNumber ?? "";
mobileNumber.text = value.mobileNumber ?? "";
emailAddress.text = value.emailAddress ?? "";
salutation.text = value.salutation ?? 0;
}
spacing: Dimensions.l
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:
salutation.text = "Sehr geehrter Herr ";
break;
case 2:
salutation.text = "Sehr geehrte Frau ";
break;
default:
salutation.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 {
label: qsTr("Straße")
TextField {
id: street
implicitWidth: fieldM
placeholderText: qsTr("Musterstraße")
}
}
Field {
label: qsTr("Hausnummer")
TextField {
id: houseNumber
implicitWidth: fieldS
placeholderText: qsTr("1a")
}
}
Field {
label: qsTr("PLZ")
ComboBox {
id: zipCode
currentIndex: -1
editable: true
implicitWidth: fieldS
model: address_model
textRole: "display"
onActivated: currentValue
onCurrentIndexChanged: city.currentIndex = zipCode.currentIndex
}
}
Field {
label: qsTr("Ort")
ComboBox {
id: city
currentIndex: -1
editable: true
implicitWidth: fieldM
model: address_model
textRole: "city"
}
}
}
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: phoneNumber
implicitWidth: fieldM
placeholderText: "+49 1234 567890"
validator: OptionalPhoneNumberValidator {
}
}
}
Field {
label: qsTr("Mobil")
TextField {
id: mobileNumber
implicitWidth: fieldM
placeholderText: "+49 123 4567891011"
validator: OptionalPhoneNumberValidator {
}
}
}
Field {
label: qsTr("E-Mail Adresse")
TextField {
id: emailAddress
implicitWidth: fieldM
placeholderText: "tero@example.org"
validator: OptionalEmailAddressValidator {
}
}
}
Field {
label: qsTr("Briefanrede")
TextField {
id: salutation
implicitWidth: fieldM
}
}
}
}

View File

@@ -0,0 +1,34 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import TeroStyle
ColumnLayout {
property int row: -1
anchors.fill: parent
spacing: Dimensions.l
onRowChanged: {
if (row !== -1) {
applicantForm.setValue(applicantModel.applicant(row))
}
}
ApplicantForm {
id: applicantForm
Layout.alignment: Qt.AlignTop
Layout.fillHeight: true
Layout.verticalStretchFactor: 1
}
RowLayout {
spacing: Dimensions.l
Button {
text: qsTr("Als Mitarbeiter:in Einstellen")
icon.source: "qrc:/images/InboxArrowDown.svg"
}
}
}

View File

@@ -1,454 +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 {
{
text: qsTr("Vorname")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
text: qsTr("Vorname*")
} }
TextField TextField {
{
property string name: "firstname"
id: firstname id: firstname
Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
onTextChanged: checkFields()
Layout.columnSpan: 3
}
Label
{
text: qsTr("Nachname")
Layout.alignment: Qt.AlignRight
}
TextField
{
property string name: "lastname"
id: lastname
Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
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
popup.y: postcode.y + 5 - (postcode.height * 2) validator: PostcodeValidator {
currentIndex: -1 }
onActivated: currentValue
onCurrentIndexChanged: city.currentIndex = postcode.currentIndex onCurrentIndexChanged: city.currentIndex = postcode.currentIndex
validator: RegularExpressionValidator
{
regularExpression: /([^$][0-9]{1,4})/
}
}
Label
{
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 {
popup.y: postcode.y + 5 - (postcode.height * 2) Layout.alignment: Qt.AlignRight
currentIndex: -1 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
placeholderText: "Pflichtfeld" property string name: "birthday"
placeholderTextColor: "red"
onTextChanged: checkFields()
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)=>
{
if (event.key !== Qt.Key_Backspace)
{
var len = birthday.length
var bd = birthday.text
if (len === 2 || len === 5) birthday.text = bd + "."
}
}
}
Label Keys.onPressed: event => {
{ if (event.key !== Qt.Key_Backspace) {
text: qsTr("Geburtsort") var len = birthday.length;
Layout.alignment: Qt.AlignRight var bd = birthday.text;
visible: radio.children[1].checked if (len === 2 || len === 5)
birthday.text = bd + ".";
} }
TextField }
{ onTextChanged: checkFields()
property string name: "placeofbirth" }
Label {
Layout.alignment: Qt.AlignRight
text: qsTr("Geburtsort*")
}
TextField {
id: placeofbirth id: placeofbirth
Layout.fillWidth: true
placeholderText: "Pflichtfeld" property string name: "placeofbirth"
placeholderTextColor: "red"
onTextChanged: checkFields()
Layout.columnSpan: 3 Layout.columnSpan: 3
visible: radio.children[1].checked Layout.fillWidth: true
onTextChanged: checkFields()
}
Label {
Layout.alignment: Qt.AlignRight
text: qsTr("Telefonnummer")
}
TextField {
id: phonenumber
property string name: "phone"
Layout.columnSpan: 3
Layout.fillWidth: true
placeholderTextColor: "red"
validator: RegularExpressionValidator {
regularExpression: /([+0-9]{1})([0-9]{1,17})/
} }
Label
{
text: qsTr("Telefonnummer")
Layout.alignment: Qt.AlignRight
}
TextField
{
property string name: "phone"
id: phonenumber
Layout.fillWidth: true
placeholderTextColor: "red"
Layout.columnSpan: 3
onTextChanged: checkFields() onTextChanged: checkFields()
validator: RegularExpressionValidator
{
regularExpression: /([+0-9]{1})([0-9]{1,17})/
} }
} 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 property string name: "salary"
placeholderTextColor: "red"
Layout.columnSpan: 3 Layout.columnSpan: 3
Layout.fillWidth: true
placeholderTextColor: "red"
onTextChanged: checkFields() onTextChanged: checkFields()
} }
Label Label {
{ Layout.alignment: Qt.AlignRight
text: qsTr("Jobbeschreibung") text: qsTr("Jobbeschreibung")
Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked
} }
TextField TextField {
{
property string name: "jobdesc"
id: jobdescription id: jobdescription
Layout.fillWidth: true
visible: radio.children[1].checked property string name: "jobdesc"
placeholderTextColor: "red"
Layout.columnSpan: 3 Layout.columnSpan: 3
Layout.fillWidth: true
placeholderTextColor: "red"
onTextChanged: checkFields() onTextChanged: checkFields()
} }
Label Label {
{ Layout.alignment: Qt.AlignRight
text: qsTr("Vertragsbeginn") text: qsTr("Vertragsbeginn")
Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked
} }
TextField TextField {
{
property string name: "contractstart"
id: contractstart id: contractstart
Layout.fillWidth: true
visible: radio.children[1].checked property string name: "contractstart"
placeholderTextColor: "red"
Layout.columnSpan: 3 Layout.columnSpan: 3
onTextChanged: checkFields() Layout.fillWidth: true
validator: RegularExpressionValidator 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}))/ 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 Keys.onPressed: event => {
{ if (event.key !== Qt.Key_Backspace) {
Layout.fillHeight: true 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

@@ -0,0 +1,143 @@
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 {
onSubmitted: (query) => {
applicantModel.searchQuery = query
}
}
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: applicantModel
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", { 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,221 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
Item
{
property var availableFilters: ["Name", "Adresse", "PLZ", "Ort", "Status"]
SearchBar
{
id:searchBar
anchors.margins: 9
}
Button
{
id: addEmployeeBtn
icon.source: "qrc:/images/addbusiness.svg"
icon.color: "olive"
anchors.right: parent.right
flat: true
onClicked: appLoader.source = "AddApplicant.qml"
}
ButtonGroup
{
id: criterion
// buttons: criterion.children
onClicked:
{
viewEmployees(criterion.checkedButton.text)
}
}
ColumnLayout
{
anchors
{
top: searchBar.bottom
bottom: parent.bottom
left: parent.left
right: parent.right
}
RowLayout
{
//id: criterion
RadioButton
{
//id: showAll
checked: true
text: qsTr("Alle")
ButtonGroup.group: criterion
//onClicked: viewEmployees(showAll)
}
RadioButton
{
//id: showApplicant
text: qsTr("Bewerber")
ButtonGroup.group: criterion
//onClicked: viewEmployees(showApplicant)
}
RadioButton
{
//id: showEmployee
text: qsTr("Mitarbeiter")
ButtonGroup.group: criterion
//onClicked: viewEmployees(showEmployee)
}
CheckBox
{
id: showEveryone
text: qsTr("Alle Stati")
checked: true
onClicked: viewEmployees(criterion.checkedButton.text)
onCheckedChanged:
{
showFired.checked = false
showProcessed.checked = false
}
}
CheckBox
{
id: showProcessed
text: qsTr("Erledigt")
enabled: !showEveryone.checked
checked: false
onClicked:
{
showFired.checked = false
viewEmployees(criterion.checkedButton.text)
}
}
CheckBox
{
id: showFired
text: qsTr("Ausgeschieden")
enabled: !showEveryone.checked
checked: false
onClicked:
{
showProcessed.checked = false
viewEmployees(criterion.checkedButton.text)
}
}
}
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
Layout.fillWidth: true
columnSpacing: 1
rowSpacing: 2
alternatingRows: true
resizableColumns: true
model: employee_model
selectionBehavior: TableView.SelectRows
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
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

@@ -7,11 +7,14 @@ import QtCore
import "../js/qmldict.js" as Qmldict import "../js/qmldict.js" as Qmldict
Item Item
{ {
property string recpass: "" property string recpass: ""
property bool adminAvailable: true property bool adminAvailable: true
id: firstStartItem
anchors.fill: parent anchors.fill: parent
StackView StackView
{ {
@@ -70,12 +73,11 @@ Item
MessageDialog MessageDialog
{ {
id: recoveryDialog id: recoveryDialog
text: qsTr("Diesen Wiederherstellungscode musst du sicher aufbewahren!\nMöchtest du das jetzt machen?") text: qsTr("Diesen Wiederherstellungscode musst du sicher aufbewahren!\nMöchtest du das jetzt machen?")
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
@@ -87,6 +89,7 @@ Item
Dialog Dialog
{ {
id: recoveryPaswordDialog id: recoveryPaswordDialog
modal: true modal: true
title: qsTr("Wiederherstellung") title: qsTr("Wiederherstellung")
@@ -115,6 +118,19 @@ Item
implicitWidth: 300 implicitWidth: 300
placeholderText: qsTr("Hier Wiederherstellungspasswort eingeben") placeholderText: qsTr("Hier Wiederherstellungspasswort eingeben")
} }
Label
{
text: qsTr("Wiederherstellungspasswort eingeben: ")
}
TextField
{
id: repeatRecoveryPaswordInput
text: ""
echoMode: TextInput.Password
implicitWidth: 300
placeholderText: qsTr("Hier Wiederherstellungspasswort eingeben")
}
} }
} }
} }
@@ -131,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:
@@ -140,6 +156,12 @@ Item
} }
} }
Loader
{
id: utilityDialogs
source: "UtilityDialogs.qml"
}
Component.onCompleted: Component.onCompleted:
{ {
config.dbConnectionError.connect(onDbConnectionError) config.dbConnectionError.connect(onDbConnectionError)
@@ -147,15 +169,10 @@ Item
config.backupEncryptionKey.connect(onBackupEncryptionKey) config.backupEncryptionKey.connect(onBackupEncryptionKey)
} }
function gotoLogin()
{
appLoader.source= "LoginScreen.qml"
topBar.visible = true
}
function onBackupEncryptionKey() function onBackupEncryptionKey()
{ {
recoveryDialog.open()
utilityDialogs.item.recoveryDialog.open()
} }
function onDbConnectionError(msg, success) function onDbConnectionError(msg, success)
@@ -176,5 +193,4 @@ Item
firstStart.push("AdminUserConfig.qml") firstStart.push("AdminUserConfig.qml")
} }
} }
} }

View File

@@ -4,224 +4,134 @@ import QtQuick.Controls
import QtQuick.Dialogs import QtQuick.Dialogs
import QtQuick.Layouts import QtQuick.Layouts
Item {
Item
{
property string recpass: "" property string recpass: ""
anchors.fill: parent
ColumnLayout function dbConnectionFailed(msg) {
{ notifications.notificationDialog.informativeText = msg;
notifications.notificationDialog.text = "Verbindung zum Datenbankserver verloren";
notifications.notificationDialog.open();
}
function getEncryptionKey() {
recoveryPaswordDialog.open();
}
function loggedin() {
contentStack.replace("Dashboard.qml");
}
anchors.fill: parent anchors.fill: parent
anchors.topMargin: Dimensions.l
FontLoader Component.onCompleted: {
{ loggedin_user.loginOkay.connect(loggedin);
id: helloStranger config.invalidEncryptionKey.connect(getEncryptionKey);
source: "qrc:/fonts/HelloStranger.otf" config.checkEncryptionKey();
loggedin_user.noDbConnection.connect(dbConnectionFailed);
benutzerName.forceActiveFocus();
} }
FontLoader ColumnLayout {
{
id: damarWulan
source: "qrc:/fonts/Damarwulan.ttf"
}
FontLoader
{
id: hussarPrint
source: "qrc:/fonts/HussarPrintA.otf"
}
FontLoader
{
id: reginaldScript
source: "qrc:/fonts/ReginaldScript.ttf"
}
Item
{
height: 65
}
Label
{
text: qsTr ("Login*****")
font.family: helloStranger.font.family
font.weight: helloStranger.font.weight
font.styleName: helloStranger.font.styleName
font.pixelSize: 89
font.bold: true
Layout.alignment: Qt.AlignHCenter
}
Item
{
height: 25
}
RowLayout
{
Layout.alignment: Qt.AlignHCenter
spacing: 15
Label
{
text: qsTr ("Benutzername")
minimumPixelSize: 20
Layout.preferredWidth: 150
horizontalAlignment: Text.AlignRight
font.family: damarWulan.font.family
font.weight: damarWulan.font.weight
font.styleName: damarWulan.font.styleName
font.pixelSize: 21
}
TextField
{
id: benutzerName
placeholderText: qsTr ("Benutzernamen eingeben")
implicitWidth: 300
font: hussarPrint.font
focus: true
onAccepted:
{
if (benutzerName.text.trim() && passwort.text.trim())
loggedin_user.login(benutzerName.text.trim(), passwort.text)
else if(benutzerName.text.trim()) passwort.forceActiveFocus()
}
}
}
RowLayout
{
Layout.alignment: Qt.AlignHCenter
spacing: 15
Label
{
minimumPixelSize: 20
Layout.preferredWidth: 150
text: qsTr ("Passwort")
font.family: damarWulan.font.family
font.weight: damarWulan.font.weight
font.styleName: damarWulan.font.styleName
font.pixelSize: 21
horizontalAlignment: Text.AlignRight
}
TextField
{
id: passwort
placeholderText: qsTr ("Passwort eingeben")
implicitWidth: 300
font: hussarPrint.font
echoMode: TextInput.Password
onAccepted:
{
if (benutzerName.text.trim() && passwort.text.trim())
loggedin_user.login(benutzerName.text.trim(), passwort.text)
else if(passwort.text.trim()) benutzerName.forceActiveFocus()
}
}
}
RowLayout
{
Layout.preferredWidth: 465
Layout.alignment: Qt.AlignHCenter
Button
{
text: qsTr ("Feierabend für heute!")
Layout.alignment: Qt.AlignRight
font: reginaldScript.font
onClicked:
{
if (benutzerName.text.trim() && passwort.text.trim())
loggedin_user.login(benutzerName.text.trim(), passwort.text)
}
}
}
Item
{
Layout.fillHeight: true
}
Dialog
{
id: recoveryPaswordDialog
modal: true
title: qsTr("Wiederherstellung")
anchors.centerIn: parent anchors.centerIn: parent
spacing: Dimensions.m
Label {
Layout.alignment: Qt.AlignHCenter
Layout.bottomMargin: Dimensions.l
font: Typography.h1
text: qsTr("Login")
}
Field {
label: qsTr("Benutzername")
TextField {
id: benutzerName
focus: true
implicitWidth: 300
placeholderText: qsTr("Benutzernamen eingeben")
onAccepted: {
if (benutzerName.text.trim() && passwort.text.trim())
loggedin_user.login(benutzerName.text.trim(), passwort.text);
else if (benutzerName.text.trim())
passwort.forceActiveFocus();
}
}
}
Field {
label: qsTr("Passwort")
TextField {
id: passwort
echoMode: TextInput.Password
implicitWidth: 300
placeholderText: qsTr("Passwort eingeben")
onAccepted: {
if (benutzerName.text.trim() && passwort.text.trim())
loggedin_user.login(benutzerName.text.trim(), passwort.text);
else if (passwort.text.trim())
benutzerName.forceActiveFocus();
}
}
}
Button {
Layout.topMargin: Dimensions.m
icon.source: "qrc:/images/ArrowRightEndOnRectangle.svg"
implicitWidth: parent.width
text: qsTr("Login")
onClicked: {
if (benutzerName.text.trim() && passwort.text.trim())
loggedin_user.login(benutzerName.text.trim(), passwort.text);
}
}
Item {
Layout.fillHeight: true
}
Dialog {
id: recoveryPaswordDialog
anchors.centerIn: parent
modal: true
standardButtons: Dialog.Ok | Dialog.Cancel standardButtons: Dialog.Ok | Dialog.Cancel
onAccepted: title: qsTr("Wiederherstellung")
{
recpass = recoveryPaswordInput.text onAccepted: {
getRecoveryDialog.open() recpass = recoveryPaswordInput.text;
getRecoveryDialog.open();
} }
ColumnLayout ColumnLayout {
{ RowLayout {
RowLayout Label {
{
Label
{
text: qsTr("Wiederherstellungspasswort eingeben: ") text: qsTr("Wiederherstellungspasswort eingeben: ")
} }
TextField {
TextField
{
id: recoveryPaswordInput id: recoveryPaswordInput
text: ""
echoMode: TextInput.Password echoMode: TextInput.Password
implicitWidth: 300 implicitWidth: 300
placeholderText: qsTr("Hier Wiederherstellungspasswort eingeben") placeholderText: qsTr("Hier Wiederherstellungspasswort eingeben")
text: ""
} }
} }
} }
} }
FileDialog {
FileDialog
{
id: getRecoveryDialog id: getRecoveryDialog
title: qsTr("Wiederherstellungsdatei")
currentFolder: StandardPaths.standardLocations(StandardPaths.DocumentsLocation)[0]
fileMode: FileDialog.OpenFile fileMode: FileDialog.OpenFile
nameFilters: ["PYQCRM Recovery files (*.pyqrec)"] nameFilters: ["PYQCRM Recovery files (*.pyqrec)"]
currentFolder: StandardPaths.standardLocations(StandardPaths.DocumentsLocation)[0] title: qsTr("Wiederherstellungsdatei")
onAccepted: config.getRecoveryKey(getRecoveryDialog.currentFile, recpass) onAccepted: config.getRecoveryKey(getRecoveryDialog.currentFile, recpass)
onRejected: quit() onRejected: quit()
} }
Notifications Notifications {
{ id: notifications
id: oschkar
} }
} }
Component.onCompleted:
{
loggedin_user.loginOkay.connect(loggedin)
config.invalidEncryptionKey.connect(getEncryptionKey)
config.checkEncryptionKey()
loggedin_user.noDbConnection.connect(dbConnectionFailed)
benutzerName.forceActiveFocus()
}
function loggedin()
{
appLoader.source = "Dashboard.qml"
}
function getEncryptionKey()
{
recoveryPaswordDialog.open()
}
function dbConnectionFailed(msg)
{
oschkar.notificationBox.informativeText = msg
oschkar.notificationBox.text = "Verbindung zum Datenbankserver verloren"
oschkar.notificationBox.open()
}
} }

22
Gui/MiscConf.qml Executable file
View File

@@ -0,0 +1,22 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
ColumnLayout
{
property alias sysTray: sysTray
anchors.fill: parent
anchors.topMargin: 35
Switch
{
id: sysTray
text: qsTr("Beim minimieren, in der Taskleiste anzeigen")
checked: config.systray()
}
Item
{
Layout.fillHeight: true
}
}

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.fill: parent
color: "slateblue"
Rectangle
{
id: info
anchors.horizontalCenter: parent.horizontalCenter
color: "slateblue"
implicitHeight: 55
implicitWidth: parent.width / 4
y: parent.height / 4
Text
{
anchors.centerIn: parent anchors.centerIn: parent
spacing: Dimensions.s
height: implicitHeight
H1 {
Layout.alignment: Qt.AlignCenter
text: qsTr("Keine Verbindung zur Datenbank!") text: qsTr("Keine Verbindung zur Datenbank!")
color: "moccasin" color: Colors.foreground
font.bold: true
font.pixelSize: 45
} }
H2 {
Layout.alignment: Qt.AlignCenter
text: qsTr("Programm kann nicht starten…")
color: Colors.foreground
} }
Button {
Rectangle Layout.topMargin: Dimensions.l
{ Layout.alignment: Qt.AlignCenter
id: nostart
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
}
}
Rectangle
{
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") 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() 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

@@ -6,20 +6,20 @@ GridLayout
{ {
property var contacts: null property var contacts: null
columns: 2 columns: 2
Layout.fillWidth: true
Label Label
{ {
text: qsTr("Kontaktdaten") text: qsTr("Position")
Layout.alignment: Qt.AlignRight | Qt.AlignTop Layout.alignment: Qt.AlignRight | Qt.AlignTop
} }
ComboBox ComboBox
{ {
property string name: "contacttype" //property string name: "contacttype"
id: contacttype id: posizion
Layout.fillWidth: true Layout.fillWidth: true
editable: false editable: false
model: [qsTr("Beirat"), qsTr("Hausmeister")] model: [qsTr("Beirat"), qsTr("Hausmeister"), qsTr("Hausbewohner"), qsTr("Sonstiges")]
} }
Label Label
@@ -30,75 +30,49 @@ GridLayout
ComboBox ComboBox
{ {
id: title id: title
model: [qsTr("Herr"), qsTr("Frau"), qsTr("keine Angabe")] model: [qsTr("Herr"), qsTr("Frau"), qsTr("Keine Angabe")]
Layout.fillWidth: true Layout.fillWidth: true
} }
Label Label
{ {
text: qsTr("Vorname") text: qsTr("Vorname*")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
} }
TextField TextField
{ {
id: firstname id: firstname
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
// onTextChanged: checkContactFields() // onTextChanged: checkContactFields()
} }
Label Label
{ {
text: qsTr("Nachname") text: qsTr("Nachname*")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
} }
TextField TextField
{ {
id: lastname id: lastname
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
} }
Label Label
{ {
text: qsTr("Telefonnummer") text: mobile.text ? qsTr("Telefonnummer") : qsTr("Telefonnummer*")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
} }
TextField TextField
{ {
id: phonenumber id: phonenumber
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: mobile.text ? "" : "Pflichtfeld"
placeholderTextColor: "red"
} }
Label Label
{ {
text: qsTr("Mobil") text: phonenumber.text ? qsTr("Mobil") : qsTr("Mobil*")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
} }
TextField TextField
{ {
id: mobile id: mobile
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: phonenumber.text ? "" : "Pflichtfeld"
placeholderTextColor: "red"
}
Label
{
text: qsTr("Position")
Layout.alignment: Qt.AlignRight
}
TextField
{
id: posizion
Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
} }
RowLayout RowLayout
@@ -140,22 +114,22 @@ GridLayout
{ {
id: addContact id: addContact
text: qsTr("Hinzufügen") text: qsTr("Hinzufügen")
enabled: firstname.text.trim() && lastname.text.trim() && (phonenumber.text.trim() || mobile.text.trim()) && posizion.text.trim() && (contacts === null || Object.keys(contacts).length < 3) enabled: firstname.text.trim() && lastname.text.trim() && (phonenumber.text.trim() || mobile.text.trim()) && (contacts === null || Object.keys(contacts).length < 3)
onClicked: onClicked:
{ {
var num_contacts = 0 var num_contacts = 0
if (contacts !== null && contacts !== undefined) num_contacts = Object.keys(contacts).length if (contacts !== null && contacts !== undefined) num_contacts = Object.keys(contacts).length
else contacts = [] else contacts = []
if (num_contacts < 3 && firstname.text.trim() !== "" && lastname.text.trim() !== "" && (phonenumber.text.trim() !== "" || mobile.text.trim() !== "") && posizion.text.trim() !== "") if (num_contacts < 3 && firstname.text.trim() !== "" && lastname.text.trim() !== "" && (phonenumber.text.trim() !== "" || mobile.text.trim() !== ""))
{ {
contacts[num_contacts] = {} contacts[num_contacts] = {}
contacts[num_contacts]["title"] = title.currentText contacts[num_contacts]["title"] = title.currentText
contacts[num_contacts]["position"] = posizion.currentText
contacts[num_contacts]["fname"] = firstname.text.trim() contacts[num_contacts]["fname"] = firstname.text.trim()
contacts[num_contacts]["lname"] = lastname.text.trim() contacts[num_contacts]["lname"] = lastname.text.trim()
contacts[num_contacts]["phone"] = phonenumber.text.trim() contacts[num_contacts]["phone"] = phonenumber.text.trim()
contacts[num_contacts]["mobile"] = mobile.text.trim() contacts[num_contacts]["mobile"] = mobile.text.trim()
contacts[num_contacts]["position"] = posizion.text.trim() contactModel.append({name: title.currentText + " " + firstname.text.trim() + " " + lastname.text.trim(), phone: phonenumber.text.trim(), mobile: mobile.text.trim(), posizion: posizion.currentText})
contactModel.append({name: title.currentText + " " + firstname.text.trim() + " " + lastname.text.trim(), phone: phonenumber.text.trim(), mobile: mobile.text.trim(), posizion: posizion.text.trim()})
if (checkFields()) if (checkFields())
{ {
saveBtn.enabled = true saveBtn.enabled = true
@@ -164,7 +138,8 @@ GridLayout
lastname.text = "" lastname.text = ""
phonenumber.text = "" phonenumber.text = ""
mobile.text = "" mobile.text = ""
posizion.text = "" posizion.currentIndex = 0
title.currentIndex = 0
removeContact.enabled = true removeContact.enabled = true
checkFields() checkFields()
@@ -184,59 +159,65 @@ GridLayout
id: contactModel id: contactModel
} }
Component // Component
{ // {
id: headline // id: headline
Row // Row
{ // {
Text // spacing: 9
{ // Text
id: cpname // {
text: qsTr("Name") // id: cpname
width: 175 // text: qsTr("Name")
font.bold: true // font.bold: true
horizontalAlignment: Text.AlignLeft // horizontalAlignment: Text.AlignLeft
color: "white" // color: "white"
} // }
Text // Text
{ // {
id: cpphone // id: cpphone
text: qsTr("Telefon") // text: qsTr("Telefon")
width: 100 // font.bold: true
font.bold: true // horizontalAlignment: Text.AlignLeft
horizontalAlignment: Text.AlignLeft // color: "white"
color: "white" // }
}
Text // Text
{ // {
id: cpmobile // id: cpmobile
text: qsTr("Mobil") // text: qsTr("Mobil")
width: 100 // font.bold: true
font.bold: true // horizontalAlignment: Text.AlignLeft
horizontalAlignment: Text.AlignLeft // color: "white"
color: "white" // }
}
Text // Text
{ // {
id: cppos // id: cppos
text: qsTr("Position") // text: qsTr("Position")
width: 150 // font.bold: true
font.bold: true // horizontalAlignment: Text.AlignLeft
horizontalAlignment: Text.AlignLeft // color: "white"
color: "white" // }
}
} // Text
} // {
// id: cttype
// text: qsTr("Typ")
// font.bold: true
// horizontalAlignment: Text.AlignLeft
// color: "white"
// }
// }
// }
Component Component
{ {
id: highlight id: highlight
Rectangle Rectangle
{ {
width: 230; height: 15 width: parent.width
color: "lightsteelblue"; radius: 5 color: "lightsteelblue"; radius: 5
y: contactView.currentItem.y y: contactView.currentItem.y
Behavior on y Behavior on y
@@ -257,21 +238,35 @@ GridLayout
implicitHeight: 100 implicitHeight: 100
color: firstname.palette.base color: firstname.palette.base
border.color: firstname.activeFocus? firstname.palette.highlight: firstname.palette.base border.color: firstname.activeFocus? firstname.palette.highlight: firstname.palette.base
clip: true
ScrollView
{
id: objContactView
// Layout.fillWidth: true
// Layout.preferredHeight: 100
//Layout.columnSpan: 3
anchors.fill: mainRect
ScrollBar.vertical.policy: ScrollBar.AlwaysOn
ListView ListView
{ {
id: contactView id: contactView
implicitHeight: parent.height anchors.fill: objContactView
implicitWidth: parent.width // implicitHeight: objContactView.height
// implicitWidth: objContactView.width
model: contactModel model: contactModel
header: headline // header: headline
highlight: Rectangle { color: "grey"} highlight: Rectangle { color: "slategray"; radius: 3}
highlightFollowsCurrentItem: false highlightFollowsCurrentItem: false
//focus: true test
onActiveFocusChanged: if(!focus) currentIndex = -1 onActiveFocusChanged: if(!focus) currentIndex = -1
delegate: Item delegate: Item
{ {
width: contactView.width width: contactView.width
height: 15 height: 77
MouseArea MouseArea
{ {
anchors.fill: parent anchors.fill: parent
@@ -281,54 +276,42 @@ GridLayout
contactView.highlightFollowsCurrentItem = true contactView.highlightFollowsCurrentItem = true
} }
} }
MouseArea
{
id: clickedRow
anchors.fill: parent
onClicked:
{
//var currentIndex = index
console.log(index)
console.log(contactView.currentItem.y)
}
}
Row
{
//spacing: 9
Text
{
text: model.name
width: 175
horizontalAlignment: Text.AlignLeft
color: "white"
}
Text
{
text: model.phone
width: 100
horizontalAlignment: Text.AlignLeft
color: "white"
}
Text
{
text: model.mobile
width: 100
horizontalAlignment: Text.AlignLeft
color: "white"
}
Text
{
text: model.posizion
width: 150
horizontalAlignment: Text.AlignLeft
color: "white"
}
}
}
Column
{
anchors.margins: 5
//spacing: 3
Text
{
text: '<b>' + qsTr('Name: ') + '</b>' + model.name
horizontalAlignment: Text.AlignLeft
color: "white"
} }
Text
{
text: '<b>' + qsTr('Telefon: ') + '</b>' + model.phone
horizontalAlignment: Text.AlignLeft
color: "white"
}
Text
{
text: '<b>' + qsTr('Handy: ') + '</b>' + model.mobile
horizontalAlignment: Text.AlignLeft
color: "white"
}
Text
{
text: '<b>' + qsTr('Position: ') + '</b>' + model.posizion
horizontalAlignment: Text.AlignLeft
color: "white"
}
} // Column
} // delegate
} // Listview
} // Scrollview
} }
} }

View File

@@ -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
import QtQuick.Controls.Fusion
Item {
property var availableFilters: [""]
StackView
{
id: objectsStack
anchors.fill: parent
initialItem: "ObjectsTable.qml"
}
}

View File

@@ -27,7 +27,7 @@ GridLayout
Label Label
{ {
text: qsTr("Straße") text: qsTr("Straße*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
@@ -38,12 +38,10 @@ GridLayout
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
} }
Label Label
{ {
text: qsTr("Nr.") text: qsTr("Nr.*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
@@ -54,13 +52,11 @@ GridLayout
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
} }
Label Label
{ {
text: qsTr("PLZ") text: qsTr("PLZ*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
@@ -70,8 +66,6 @@ GridLayout
id: postcode id: postcode
Layout.fillWidth: true Layout.fillWidth: true
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
} }
Label Label
{ {
@@ -90,7 +84,6 @@ GridLayout
model: address_model model: address_model
textRole: "city" textRole: "city"
popup.height: 300 popup.height: 300
popup.y: postcode.y + 5 - (postcode.height * 2)
currentIndex: -1 currentIndex: -1
} }
@@ -153,8 +146,7 @@ GridLayout
} }
TextField TextField
{ {id: gesamtnetto
id: gesamtnetto
Layout.fillWidth: true Layout.fillWidth: true
Layout.columnSpan: 3 Layout.columnSpan: 3
} }

View File

@@ -2,44 +2,101 @@ import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls import QtQuick.Controls
import Qt.labs.qmlmodels import Qt.labs.qmlmodels
import QtQuick.Controls.Fusion
Item ColumnLayout
{ {
SearchBar property var availableFilters: [""]
anchors.fill: parent
spacing: Dimensions.l
function viewCriterion(criterion)
{ {
id:searchBar business_model.viewCriterion(criterion.text);
anchors.margins: 9 }
function onObjectContactAdded(added)
{
console.log(added)
if (added) object_model.viewCriterion("")
} }
Component.onCompleted:
{
contact_model.objectContactAdded.connect(onObjectContactAdded)
contentStack.pop()
}
RowLayout
{
Layout.fillWidth: true
spacing: Dimensions.l
SearchBar
{
}
QuickFilter {
onSelectedChanged: (name) => {
business_model.viewCriterion(name)
}
model: ListModel {
ListElement {
name: "Alle"
text: qsTr("Alle")
selected: true
}
ListElement {
name: "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 Button
{ {
id: addObjectBtn id: addObjectBtn
icon.source: "qrc:/images/addbusiness.svg" icon.source: "qrc:/images/PlusCircle.svg"
icon.color: "olive" text: qsTr("Objekt Hinzufügen")
anchors.right: parent.right Layout.alignment: Qt.AlignRight
flat: true onClicked: contentStack.push("AddObject.qml")
onClicked: appLoader.source = "AddObject.qml" }
} }
ColumnLayout ColumnLayout
{ {
id: tableColumn id: tableColumn
anchors Layout.fillWidth: true
{ Layout.fillHeight: true
top: searchBar.bottom Layout.verticalStretchFactor: 1
bottom: parent.bottom clip: true
left: parent.left // anchors
right: parent.right // {
} // top: searchBar.bottom
// bottom: parent.bottom
// left: parent.left
// right: parent.right
// topMargin: 15
// }
HorizontalHeaderView HorizontalHeaderView
{ {
id: horizontalHeaderview id: horizontalHeaderview
Layout.fillWidth: true Layout.fillWidth: true
implicitHeight: 40 implicitHeight: 40
//visible: false
movableColumns: true //@disable-check M16 movableColumns: true //@disable-check M16
syncView: objectTable syncView: objectTable
@@ -66,6 +123,8 @@ Item
{ {
property real newWidth: 0 property real newWidth: 0
id: objectTable id: objectTable
z: 1
// height: tableColumn.height - horizontalHeaderview.height
Layout.fillHeight: true Layout.fillHeight: true
Layout.fillWidth: true Layout.fillWidth: true
columnSpacing: 1 columnSpacing: 1
@@ -115,7 +174,7 @@ Item
hoverEnabled: true hoverEnabled: true
onDoubleClicked: onDoubleClicked:
{ {
objectsStack.push("ObjectDetails.qml", {selectedObject: row}); contentStack.push("ObjectDetails.qml", {selectedObject: row});
} }
onEntered: onEntered:
{ {
@@ -123,24 +182,10 @@ Item
} }
} }
} }
// onContentWidthChanged:
// {
// redrawTable.start()
// }
} }
Item
{
Layout.fillWidth: true
} }
Item {
Layout.fillHeight: true
} }
// function viewCriterion(criterion)
// {
// object_model.viewCriterion(criterion.text)
// }
Component.onCompleted: objectsStack.pop()
} }

66
Gui/OffersTable.qml Normal file
View File

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

View File

@@ -123,12 +123,21 @@ Window
{ {
copiesSpinBox.value = 1 copiesSpinBox.value = 1
colorPrint.checked = true colorPrint.checked = true
} if (!sys_printers)
Component.onCompleted:
{ {
printers = sys_printers.getPrinters() printers = sys_printers.getPrinters()
if (sys_printers.getDefaultPrinter()) if (sys_printers.getDefaultPrinter())
allPrinters.currentIndex = allPrinters.indexOfValue(sys_printers.getDefaultPrinter()) allPrinters.currentIndex = allPrinters.indexOfValue(sys_printers.getDefaultPrinter())
} }
}
Component.onCompleted:
{
if (sys_printers)
{
printers = sys_printers.getPrinters()
if (sys_printers.getDefaultPrinter())
allPrinters.currentIndex = allPrinters.indexOfValue(sys_printers.getDefaultPrinter())
}
}
} }

View File

@@ -4,6 +4,8 @@ import QtQuick.Layouts
Item Item
{ {
property alias companyConf: companyConf
property alias miscConf: miscConf
anchors.fill: parent anchors.fill: parent
TabBar TabBar
{ {
@@ -21,6 +23,16 @@ Item
{ {
text: qsTr("Das Unternehmen") text: qsTr("Das Unternehmen")
} }
TabButton
{
text: qsTr("Sicherung")
}
TabButton
{
text: qsTr("Sonstiges")
}
} }
StackLayout StackLayout
@@ -55,6 +67,26 @@ Item
anchors.fill: parent anchors.fill: parent
} }
} }
Item
{
id: backup
BackupSettings
{
id: backupSettings
anchors.fill: parent
}
}
Item
{
id: miscelanea
MiscConf
{
id: miscConf
anchors.fill: parent
}
}
} }
RowLayout RowLayout
@@ -69,7 +101,7 @@ Item
Button Button
{ {
text: qsTr("Ablehnen") text: qsTr("Ablehnen")
onClicked: appLoader.source = "Dashboard.qml" onClicked: contentStack.pop()
} }
Button Button
@@ -80,11 +112,14 @@ Item
switch (confContainer.currentIndex) switch (confContainer.currentIndex)
{ {
case 1: case 1:
console.log("Need to update DB paramenters") updateDbConf()
break break
case 2: case 2:
console.log("Need to update company's info.") updateCompanyInfo()
break
case 4:
updateMiscConf()
break break
default: default:
console.log("Need to handle users") console.log("Need to handle users")
@@ -92,4 +127,45 @@ Item
} }
} }
} }
function updateDbConf()
{
var db = {}
db['database'] = {}
db['database']['DB_HOST'] = dbConf.dbHost.text.trim()
db['database']['DB_PORT'] = dbConf.dbPort.text.trim()
db['database']['DB_NAME'] = dbConf.dbName.text.trim()
db['database']['DB_USER'] = dbConf.dbUserName.text.trim()
db['database']['DB_PASS'] = dbConf.dbPassword.text.trim()
if (db['database']['DB_HOST'] === '' || db['database']['DB_PORT'] === '' ||
db['database']['DB_NAME'] === '' || db['database']['DB_USER'] === '' ||
db['database']['DB_PASS'] === '');
else config.saveDbConf(db)
}
function updateCompanyInfo()
{
var company = {}
company['company'] = {}
company['company']['NAME'] = companyConf.name.text.trim()
company['company']['STREET'] = companyConf.street.text.trim()
company['company']['HOUSE'] = companyConf.house.text.trim()
company['company']['ZIPCODE'] = companyConf.zipcode.editText? companyConf.zipcode.editText.trim(): companyConf.zipcode.currentText
company['company']['CITY'] = companyConf.city.editText? companyConf.city.editText.trim(): companyConf.city.currentText
if (company['company']['NAME'] === '' || company['company']['STREET'] === '' ||
company['company']['HOUSE'] === '' || company['company']['ZIPCODE'] === '' ||
company['company']['CITY'] === '');
else config.saveCompanyInfo(company)
}
function updateMiscConf()
{
var misc = {}
misc['misc'] = {}
misc['misc']['SYSTRAY'] = miscConf.sysTray.checked
config.saveMiscConf(misc)
}
} }

View File

@@ -1,82 +0,0 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
RowLayout
{
id: searchBar
TextField
{
id: searchField
placeholderText: qsTr("Suche")
leftPadding: 3
rightPadding: 3
Layout.preferredWidth: 300
Button
{
icon.source: "qrc:/images/search.svg"
icon.color: "olive"
x: parent.x + parent.width - width
height: parent.height
flat: true
}
Button
{
id: filterBtn
icon.source: "qrc:/images/filter.svg"
icon.color: "olive"
x: parent.x + parent.width
height: searchField.height
flat: true
onClicked: filterPopup.open()
}
}
Popup
{
id: filterPopup
x: filterBtn.x + filterBtn.width
y: filterBtn.y
width: 100
height: 150
modal: true
focus: true
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent
contentItem: Item
{
ColumnLayout
{
anchors.fill: parent
//id: filterContent
Repeater
{
model: availableFilters
CheckBox
{
text: model.modelData
onClicked:
{
setFilter(text, checkState)
}
}
}
}
}
}
function setFilter(filter,activated)
{
console.log(filter)
console.log(activated)
}
}

View File

@@ -1,210 +0,0 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
RowLayout
{
id: topBar
spacing: 0
height: 35
width: parent.width
anchors
{
top: parent.top
left: parent.left
}
Button
{
id: dashBoard
flat: true
text: qsTr("Dashboard")
implicitWidth: abrechnung.implicitContentWidth + 10
Layout.margins: 3
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
}
}
Button
{
id: kunden
flat: true
text: qsTr("Kunden")
implicitWidth: abrechnung.implicitContentWidth + 10
Layout.margins: 3
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
}
}
Button
{
id: objekt
flat: true
text: qsTr("Objekt")
implicitWidth: abrechnung.implicitContentWidth + 10
Layout.margins: 3
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
}
}
Button
{
id: mitarbeiter
flat: true
text: qsTr("Mitarbeiter")
implicitWidth: abrechnung.implicitContentWidth + 10
Layout.margins: 3
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
}
}
Button
{
id: abrechnung
flat: true
text: qsTr("Abrechnung")
implicitWidth: abrechnung.implicitContentWidth + 10
Layout.margins: 3
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.fillWidth: true
}
Button
{
id: atajos
icon.source: "qrc:/images/menu.svg"
icon.color: "red"
flat: true
Layout.rightMargin: 9
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()
}
}
}
}

208
Gui/UtilityDialogs.qml Normal file
View File

@@ -0,0 +1,208 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import QtQuick.Dialogs
import QtCore
import "../js/qmldict.js" as JsLib
Item
{
id: utilityDialogs
property alias backup_config: backupConfig
property alias backup_encrypt_pw: recoveryPasswordDialog
property var recpass
property var configpass
Dialog
{
anchors.centerIn: parent
id: backupConfig
title: "Backup Config"
standardButtons: Dialog.Apply | Dialog.Cancel
onApplied:
{
if (configPwd.text === repeatConfigPwd.text)
{
configpass = repeatConfigPwd.text
saveConfigFile.open()
}
else
{
configPwd.text = ""
configPwd.placeholderText = qsTr("Passwort stimmt nicht überein")
configPwd.placeholderTextColor = "red"
repeatConfigPwd.placeholderText = qsTr("")
repeatConfigPwd.text = ""
}
}
onRejected: resetRecoveryConfigDialog()
GridLayout
{
id: gridPw
columns: 2
Label
{
text: qsTr("Passwort eingeben")
}
TextField
{
id: configPwd
placeholderText: qsTr("Sicherungspasswort festlegen")
echoMode: TextInput.Password
implicitWidth: 300
}
Label
{
text: qsTr("Passwort wiederholen")
}
TextField
{
property string name: "password"
id: repeatConfigPwd
placeholderText: qsTr("Sicherungspasswort wiederholen")
echoMode: TextInput.Password
implicitWidth: 300
}
}
}
FileDialog
{
id: saveConfigFile
fileMode: FileDialog.SaveFile
nameFilters: ["PYQCRM Recovery files (*.pyqrec)"]
currentFolder: StandardPaths.standardLocations(StandardPaths.DocumentsLocation)[0]
onAccepted:
{
config.backupConfig(saveConfigFile.currentFile, configpass)
}
onRejected:
{
backupConfig.close()
resetRecoveryConfigDialog()
}
}
MessageDialog
{
id: recoveryDialog
text: qsTr("Diesen Wiederherstellungscode musst du sicher aufbewahren!\nMöchtest du das jetzt machen?")
title: qsTr("Wiederherstellen")
buttons: MessageDialog.Yes | MessageDialog.No
onAccepted: recoveryPasswordDialog.open()
onRejected: contentStack.replace("LoginSreen.qml")
}
MessageDialog
{
id: conErrDialog
text: qsTr("Datenbankverbindung fehlgeschlagen")
title: qsTr("Datenbank Verbindung")
}
Dialog
{
id: recoveryPasswordDialog
modal: true
title: qsTr("Wiederherstellung")
anchors.centerIn: parent
standardButtons: Dialog.Apply | Dialog.Cancel
onApplied:
{
if (recoveryPasswordInput.text === repeatRecoveryPasswordInput.text)
{
recpass = recoveryPasswordInput.text
saveRecoveryDialog.open()
}
else
{
recoveryPasswordInput.text = ""
recoveryPasswordInput.placeholderText = qsTr("Passwort stimmt nicht überein")
recoveryPasswordInput.placeholderTextColor = "red"
repeatRecoveryPasswordInput.placeholderText = qsTr("")
repeatRecoveryPasswordInput.text = ""
}
}
onClosed: resetRecoveryPwDialog()
ColumnLayout
{
GridLayout
{
columns: 2
Label
{
text: qsTr("Wiederherstellungspasswort festlegen: ")
}
TextField
{
id: recoveryPasswordInput
text: ""
echoMode: TextInput.Password
implicitWidth: 300
placeholderText: qsTr("Hier Wiederherstellungspasswort eingeben")
}
Label
{
text: qsTr("Wiederherstellungspasswort wiederholen: ")
}
TextField
{
id: repeatRecoveryPasswordInput
text: ""
echoMode: TextInput.Password
implicitWidth: 300
placeholderText: qsTr("Hier Wiederherstellungspasswort wiederholen")
}
}
}
}
FileDialog
{
id: saveRecoveryDialog
title: qsTr("Wiederherstellungsdatei")
fileMode: FileDialog.SaveFile
nameFilters: ["PYQCRM Recovery files (*.pyqrec)"]
currentFolder: StandardPaths.standardLocations(StandardPaths.DocumentsLocation)[0]
onAccepted:
{
config.backupEncryptkey(saveRecoveryDialog.currentFile, recpass)
}
onRejected:
{
recoveryPasswordDialog.close()
resetRecoveryPwDialog()
}
}
function resetRecoveryPwDialog()
{
recoveryPasswordInput.text = ""
recoveryPasswordInput.placeholderText = qsTr("Hier Wiederherstellungspasswort eingeben")
recoveryPasswordInput.placeholderTextColor = repeatRecoveryPasswordInput.placeholderTextColor
repeatRecoveryPasswordInput.text = ""
repeatRecoveryPasswordInput.placeholderText = qsTr("Hier Wiederherstellungspasswort wiederholen")
}
function resetRecoveryConfigDialog()
{
configPwd.text = ""
configPwd.placeholderText = qsTr("Hier Wiederherstellungspasswort eingeben")
configPwd.placeholderTextColor = repeatConfigPwd.placeholderTextColor
repeatConfigPwd.text = ""
repeatConfigPwd.placeholderText = qsTr("Hier Wiederherstellungspasswort wiederholen")
}
}

View File

@@ -4,120 +4,138 @@ 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: "PYQCRM"
property string confile: "" property string confile: ""
property alias settingsFileDialog: settingsFiledialog
TopBar function showWindow(why) {
{ if (why === 3) {
systray.setVisible(false);
id:topBar appWindow.show();
anchors }
{
rightMargin: 9
leftMargin: 9
} }
visible: bad_config || !db_con ? false: true font: Typography.body
} height: Screen.height * .85
palette.window: Colors.mantle
palette.placeholderText: Colors.interactive
palette.text: Colors.foreground
title: "TERO Personal"
visible: true
width: Screen.width * .75
PrinterDialog Component.onCompleted: {
{ systray.activated.connect(showWindow);
id: printerDialog
}
ReadMe if (bad_config) {
{ importDialog.open();
id: readMeWin } else {
} if (db_con)
contentStack.replace("LoginScreen.qml")
Item
{
id: mainView
}
Loader
{
id: appLoader
anchors
{
left: parent.left
right: parent.right
top: topBar.bottom
bottom: parent.bottom
topMargin: 0
bottomMargin: 5
rightMargin: 9
leftMargin: 9
}
property alias window: appWindow
}
Component.onCompleted:
{
if(bad_config)
{
importDialog.open()
}
else else
{ contentStack.replace("NoDbConnection.qml");
if (db_con) appLoader.source= "LoginScreen.qml" }
else appLoader.source= "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();
} }
} }
Dialog Navigation {
{ id: navigation
visible: !(bad_config || !db_con)
}
PrinterDialog {
id: printerDialog
}
ReadMe {
id: readMeWin
}
Item {
id: mainView
}
Rectangle {
id: contentBackground
anchors {
bottom: parent.bottom
left: navigation.visible ? navigation.right : parent.left
right: parent.right
top: parent.top
}
color: Colors.background
}
StackView {
id: contentStack
anchors {
fill: contentBackground
margins: Dimensions.l
}
}
Dialog {
id: importDialog id: importDialog
modal: true
anchors.centerIn: parent
standardButtons: Dialog.Yes | Dialog.No
onAccepted: settingsFiledialog.open()
onRejected: appLoader.source= "firststart.qml"
title: qsTr("Einstellungen importieren")
}
FileDialog anchors.centerIn: parent
{ modal: true
standardButtons: Dialog.Yes | Dialog.No
title: qsTr("Einstellungen importieren")
onAccepted: settingsFiledialog.open()
onRejected: contentStack.replace("Firststart.qml")
}
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 (*.pyqcrm)")] nameFilters: [qsTr("PYQCRM Einstellungen (*.pyqrec)")]
onAccepted:
{
exportFilePassword.open()
confile = selectedFile
}
}
Dialog
{
id: exportFilePassword
modal: true
title: qsTr("PYQCRM Einstellungen") title: qsTr("PYQCRM Einstellungen")
onAccepted: {
exportFilePassword.open();
confile = selectedFile;
}
}
Dialog {
id: exportFilePassword
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
} }

View File

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

61
TeroStyle/BarButton.qml Normal file
View File

@@ -0,0 +1,61 @@
import QtQuick
import QtQuick.Controls.impl
import QtQuick.Controls
import QtQuick.Templates as T
T.ToolButton {
id: control
property string target
checkable: true
icon.color: Colors.foreground
icon.height: 36
icon.width: 36
implicitHeight: 90
implicitWidth: 100
topPadding: 20
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
}
Label {
color: parent.color
font: Typography.smaller
text: control.text
x: parent.width * .5 - width * .5
}
}
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)
}
}

69
TeroStyle/Button.qml Normal file
View File

@@ -0,0 +1,69 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls.impl as I
import QtQuick.Templates as T
T.Button {
id: control
/**
* Set true when the button is supposed to be displayed in e.g. a TextField.
* You want to do this when this button is directly related to the TextField
* and the primary and only action for the TextField.
* Usually, you'd only want to display an icon in this button.
* If true, automatically sets height, width and position.
*
* ```qml
* TextField {
* placeholderText: "Search..."
* Button {
* icon.source: "qrc:/images/MagnifyingGlass.svg"
* isFieldButton: true
* }
* }
* ```
*/
property bool isFieldButton: false
height: isFieldButton ? parent.height : null
icon.color: Colors.primaryContrast
icon.height: 21
icon.width: 21
implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, implicitContentHeight + topPadding + bottomPadding)
implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, implicitContentWidth + leftPadding + rightPadding)
/**
* Icon is slightly larger than Text, so we need to reduce the padding a
* tiny bit to make sure all Buttons are still the same height.
*/
padding: Dimensions.m - (icon.source.toString() === "" ? 0 : 1)
x: isFieldButton ? parent.x + parent.width - width : null
background: Rectangle {
anchors.fill: parent
border.color: Colors.interactive
border.width: isFieldButton ? 1 : 0
bottomLeftRadius: topLeftRadius
color: !control.enabled ? Colors.disabled : !control.hovered ? Colors.primary : Colors.primaryLighter
radius: Dimensions.radius
topLeftRadius: isFieldButton ? 0 : radius
}
contentItem: I.IconLabel {
color: !control.enabled ? Colors.disabledForeground : Colors.primaryContrast
display: control.display
font: control.font
icon: control.icon
mirrored: control.mirrored
spacing: Dimensions.s
text: control.text
}
MouseArea {
id: mouseArea
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onPressed: mouse => mouse.accepted = false
}
}

26
TeroStyle/Colors.qml Normal file
View File

@@ -0,0 +1,26 @@
pragma Singleton
import QtQuick
QtObject {
readonly property int dark: 0
readonly property int light: 1
property int theme: Application.styleHints.colorScheme === Qt.ColorScheme.Light ? light : dark
readonly property color primary: "#b81a34"
readonly property color primaryContrast: "#fdfdfd"
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 background: theme === dark ? "#303136" : "#eff1f5"
readonly property color mantle: theme === dark ? "#1E1E23" : "#e7e9ef"
readonly property color interactive: theme === dark ? "#878b97" : "#d9d9da"
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 double highlightOpacity: .3
}

108
TeroStyle/ComboBox.qml Normal file
View File

@@ -0,0 +1,108 @@
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
radius: Dimensions.radius
width: parent.width
}
delegate: ItemDelegate {
required property var model
required property int index
width: ListView.view.width
text: model[control.textRole]
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
}
}
}
}

26
TeroStyle/Dimensions.qml Normal file
View File

@@ -0,0 +1,26 @@
pragma Singleton
import QtQuick
QtObject
{
/**
* Distance for objects that are tied to each other,
* e.g. a field and its label.
*/
readonly property int s: 9
/**
* Distance for objects that are grouped together, e.g. radio buttons of the
* same radio group.
*/
readonly property int m: 15
/**
* Distance for objects that are not related to each other, or to objects
* and their container.
*/
readonly property int l: 30
readonly property int radius: 4
}

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})/
}

20
TeroStyle/Field.qml Normal file
View File

@@ -0,0 +1,20 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
ColumnLayout
{
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
Label
{
text: label + (mandatory ? "*" : "")
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
}

5
TeroStyle/Label.qml Normal file
View File

@@ -0,0 +1,5 @@
import QtQuick.Controls
Label {
color: Colors.foreground
}

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})/
}

64
TeroStyle/QuickFilter.qml Normal file
View File

@@ -0,0 +1,64 @@
import QtQuick
import QtCore
import QtQuick.Layouts
RowLayout {
id: root
required property ListModel model
signal selectedChanged(string name)
spacing: Dimensions.m
Repeater {
model: root.model
Item {
id: item
required property int index
required property var modelData
property bool hovered: false
property real padding: Dimensions.m
height: text.height + padding * 2
width: text.width + padding * 2
Rectangle {
anchors.fill: parent
border.color: modelData.selected ? Colors.transparent : Colors.foreground
border.width: 2
color: modelData.selected || mouseArea.containsMouse ? Colors.primary : Colors.transparent
radius: parent.height
}
Text {
id: text
color: Colors.foreground
font: Typography.body
text: modelData.text
x: parent.padding
y: parent.padding
}
MouseArea {
id: mouseArea
hoverEnabled: true
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onPressed: {
if (item.modelData.selected)
return;
const model = root.model;
for (let i = 0; i < model.count; i++) {
model.setProperty(i, "selected", false);
}
model.setProperty(item.index, "selected", true);
selectedChanged(item.modelData.name)
}
}
}
}
}

26
TeroStyle/SearchBar.qml Normal file
View File

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

47
TeroStyle/TextField.qml Normal file
View File

@@ -0,0 +1,47 @@
import QtQuick
import QtQuick.Templates as T
T.TextField
{
id: control
background: Rectangle
{
id: background
color: Colors.mantle
radius: Dimensions.radius
border.width: !control.focus ? 1 : 2
border.color: Colors.interactive
height: control.implicitHeight
}
color: Colors.foreground
implicitHeight: Typography.body.pixelSize + topPadding + bottomPadding
placeholderTextColor: Colors.interactive
font: Typography.body
padding: Dimensions.m
verticalAlignment: Text.AlignVCenter
/**
* Placeholder
*/
Text {
x: control.leftPadding
y: control.topPadding
width: control.width - (control.leftPadding + control.rightPadding)
height: control.height - (control.topPadding + control.bottomPadding)
font: control.font
text: control.placeholderText
color: control.placeholderTextColor
verticalAlignment: control.verticalAlignment
visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)
elide: Text.ElideRight
renderType: control.renderType
}
}

56
TeroStyle/Typography.qml Normal file
View File

@@ -0,0 +1,56 @@
pragma Singleton
import QtCore
import QtQuick
Item {
readonly property font body: ({
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"
}
}

20
TeroStyle/qmldir Normal file
View File

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

View File

@@ -1,11 +1,11 @@
<mxfile host="Electron" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.7.17 Chrome/128.0.6613.36 Electron/32.0.1 Safari/537.36" version="24.7.17"> <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="1434" dy="844" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <mxGraphModel dx="2963" dy="1707" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root> <root>
<mxCell id="WIyWlLk6GJQsqaUBKTNV-0" /> <mxCell id="WIyWlLk6GJQsqaUBKTNV-0" />
<mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" /> <mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" />
<mxCell id="_OjnZrDktrtFcgEA-KSX-13" value="Databasemanager" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxCell id="_OjnZrDktrtFcgEA-KSX-13" value="Databasemanager" 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="50" y="40" width="170" height="90" as="geometry" /> <mxGeometry x="20" y="340" width="170" height="90" as="geometry" />
</mxCell> </mxCell>
<mxCell id="_OjnZrDktrtFcgEA-KSX-14" value="&lt;div&gt;- connection&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="_OjnZrDktrtFcgEA-KSX-13" vertex="1"> <mxCell id="_OjnZrDktrtFcgEA-KSX-14" value="&lt;div&gt;- connection&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="_OjnZrDktrtFcgEA-KSX-13" vertex="1">
<mxGeometry y="26" width="170" height="24" as="geometry" /> <mxGeometry y="26" width="170" height="24" as="geometry" />
@@ -16,32 +16,17 @@
<mxCell id="_OjnZrDktrtFcgEA-KSX-16" 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="_OjnZrDktrtFcgEA-KSX-13" vertex="1"> <mxCell id="_OjnZrDktrtFcgEA-KSX-16" 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="_OjnZrDktrtFcgEA-KSX-13" vertex="1">
<mxGeometry y="58" width="170" height="32" as="geometry" /> <mxGeometry y="58" width="170" height="32" as="geometry" />
</mxCell> </mxCell>
<mxCell id="_OjnZrDktrtFcgEA-KSX-38" value="BusinessDao" 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="50" y="240" width="160" height="166" as="geometry" />
</mxCell>
<mxCell id="_OjnZrDktrtFcgEA-KSX-42" 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="_OjnZrDktrtFcgEA-KSX-38" vertex="1">
<mxGeometry y="26" width="160" height="40" as="geometry" />
</mxCell>
<mxCell id="_OjnZrDktrtFcgEA-KSX-41" value="&lt;div&gt;&lt;span style=&quot;background-color: initial;&quot;&gt;+ getBusiness()&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: initial;&quot;&gt;+ addBusiness()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;+ updateBusiness()&lt;/div&gt;&lt;div&gt;+ delBusiness()&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="_OjnZrDktrtFcgEA-KSX-38" vertex="1">
<mxGeometry y="66" width="160" height="100" as="geometry" />
</mxCell>
<mxCell id="_OjnZrDktrtFcgEA-KSX-43" value="BusinessModel" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxCell id="_OjnZrDktrtFcgEA-KSX-43" value="BusinessModel" 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="280" y="150" width="160" height="170" as="geometry" /> <mxGeometry x="240" y="40" width="160" height="270" as="geometry" />
</mxCell> </mxCell>
<mxCell id="_OjnZrDktrtFcgEA-KSX-45" 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;connectable=1;allowArrows=1;recursiveResize=1;expand=0;" parent="_OjnZrDktrtFcgEA-KSX-43" vertex="1"> <mxCell id="_OjnZrDktrtFcgEA-KSX-45" 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;connectable=1;allowArrows=1;recursiveResize=1;expand=0;" parent="_OjnZrDktrtFcgEA-KSX-43" vertex="1">
<mxGeometry y="26" width="160" height="54" as="geometry" /> <mxGeometry y="26" width="160" height="54" as="geometry" />
</mxCell> </mxCell>
<mxCell id="_OjnZrDktrtFcgEA-KSX-46" value="- getData()&lt;div&gt;+ rowCount()&lt;/div&gt;&lt;div&gt;+ columnCount()&lt;/div&gt;&lt;div&gt;+ Data()&lt;/div&gt;&lt;div&gt;+ headerData()&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="_OjnZrDktrtFcgEA-KSX-43" vertex="1"> <mxCell id="_OjnZrDktrtFcgEA-KSX-46" value="- getData()&lt;div&gt;- getBusinessInfo()&lt;br&gt;&lt;div&gt;+ rowCount()&lt;/div&gt;&lt;div&gt;+ columnCount()&lt;/div&gt;&lt;div&gt;+ Data()&lt;/div&gt;&lt;div&gt;+ headerData()&lt;/div&gt;&lt;/div&gt;&lt;div&gt;+ onRowClicked()&lt;/div&gt;&lt;div&gt;+ viewCriterion()&lt;/div&gt;&lt;div&gt;+ addBusiness()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; refreshView()&lt;/div&gt;&lt;div&gt;+ setContact()&lt;/div&gt;&lt;div&gt;+ updateTable()&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="_OjnZrDktrtFcgEA-KSX-43" vertex="1">
<mxGeometry y="80" width="160" height="90" as="geometry" /> <mxGeometry y="80" width="160" height="190" as="geometry" />
</mxCell>
<mxCell id="_OjnZrDktrtFcgEA-KSX-50" value="" style="endArrow=none;html=1;rounded=0;entryX=0.435;entryY=1.063;entryDx=0;entryDy=0;exitX=0.463;exitY=-0.027;exitDx=0;exitDy=0;exitPerimeter=0;entryPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="_OjnZrDktrtFcgEA-KSX-38" target="_OjnZrDktrtFcgEA-KSX-16" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="390" y="460" as="sourcePoint" />
<mxPoint x="440" y="410" as="targetPoint" />
</mxGeometry>
</mxCell> </mxCell>
<mxCell id="xjCWurhqpCHEkLAYqff9-0" value="PermissionDao" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> <mxCell id="xjCWurhqpCHEkLAYqff9-0" value="PermissionDao" 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="1330" y="50" width="180" height="220" as="geometry" /> <mxGeometry x="1200" y="540" width="180" height="220" as="geometry" />
</mxCell> </mxCell>
<mxCell id="xjCWurhqpCHEkLAYqff9-1" value="&lt;div&gt;- id : int&lt;/div&gt;&lt;div&gt;- description : string&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="xjCWurhqpCHEkLAYqff9-0" vertex="1"> <mxCell id="xjCWurhqpCHEkLAYqff9-1" value="&lt;div&gt;- id : int&lt;/div&gt;&lt;div&gt;- description : string&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="xjCWurhqpCHEkLAYqff9-0" vertex="1">
<mxGeometry y="26" width="180" height="64" as="geometry" /> <mxGeometry y="26" width="180" height="64" as="geometry" />
@@ -52,70 +37,450 @@
<mxCell id="xjCWurhqpCHEkLAYqff9-3" value="&lt;div&gt;+ getPermissions(User)&lt;/div&gt;&lt;div&gt;+ getPermission()&lt;/div&gt;&lt;div&gt;+ grantPermission()&lt;/div&gt;&lt;div&gt;+ setPermission()&lt;/div&gt;&lt;div&gt;+ revokePermission()&lt;/div&gt;&lt;div&gt;+ savePermission()&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="xjCWurhqpCHEkLAYqff9-0" vertex="1"> <mxCell id="xjCWurhqpCHEkLAYqff9-3" value="&lt;div&gt;+ getPermissions(User)&lt;/div&gt;&lt;div&gt;+ getPermission()&lt;/div&gt;&lt;div&gt;+ grantPermission()&lt;/div&gt;&lt;div&gt;+ setPermission()&lt;/div&gt;&lt;div&gt;+ revokePermission()&lt;/div&gt;&lt;div&gt;+ savePermission()&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="xjCWurhqpCHEkLAYqff9-0" vertex="1">
<mxGeometry y="98" width="180" height="122" as="geometry" /> <mxGeometry y="98" width="180" height="122" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-12" value="User" 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="Yrs2Ar6oVTmmq3gZQ8Z4-12" value="User" 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="827" y="50" width="280" height="270" as="geometry" /> <mxGeometry x="870" y="540" width="280" height="270" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-13" value="- username : string&lt;div&gt;- password : string&lt;/div&gt;&lt;div&gt;- roleids : roleenum [ ]&lt;/div&gt;&lt;div&gt;- gecos : string&lt;/div&gt;&lt;div&gt;- enabled : bool&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="Yrs2Ar6oVTmmq3gZQ8Z4-12"> <mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-13" value="- username : string&lt;div&gt;- password : string&lt;/div&gt;&lt;div&gt;- roleids : roleenum [ ]&lt;/div&gt;&lt;div&gt;- gecos : string&lt;/div&gt;&lt;div&gt;- enabled : bool&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="Yrs2Ar6oVTmmq3gZQ8Z4-12" vertex="1">
<mxGeometry y="26" width="280" height="84" as="geometry" /> <mxGeometry y="26" width="280" height="84" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-14" 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="Yrs2Ar6oVTmmq3gZQ8Z4-12"> <mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-14" 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="Yrs2Ar6oVTmmq3gZQ8Z4-12" vertex="1">
<mxGeometry y="110" width="280" height="8" as="geometry" /> <mxGeometry y="110" width="280" height="8" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-15" value="+ getRole()&lt;div&gt;+ setRole()&lt;/div&gt;&lt;div&gt;+changePassword(oldpassword, newpassword)&lt;/div&gt;&lt;div&gt;+ getUsername()&lt;/div&gt;&lt;div&gt;+ getPassword()&lt;/div&gt;&lt;div&gt;+ getGecos()&lt;/div&gt;&lt;div&gt;(+ createRole(superuser, admin)????&lt;/div&gt;&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="Yrs2Ar6oVTmmq3gZQ8Z4-12"> <mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-15" value="+ getRole()&lt;div&gt;+ setRole()&lt;/div&gt;&lt;div&gt;+changePassword(oldpassword, newpassword)&lt;/div&gt;&lt;div&gt;+ getUsername()&lt;/div&gt;&lt;div&gt;+ getPassword()&lt;/div&gt;&lt;div&gt;+ getGecos()&lt;/div&gt;&lt;div&gt;(+ createRole(superuser, admin)????&lt;/div&gt;&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="Yrs2Ar6oVTmmq3gZQ8Z4-12" vertex="1">
<mxGeometry y="118" width="280" height="152" as="geometry" /> <mxGeometry y="118" width="280" height="152" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-18" value="UserRoles" 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="Yrs2Ar6oVTmmq3gZQ8Z4-18" value="UserRoles" 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="450" y="475" width="160" height="220" as="geometry" /> <mxGeometry x="1420" y="830" width="160" height="220" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-19" value="+ userrole : Role[ ]" 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="Yrs2Ar6oVTmmq3gZQ8Z4-18"> <mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-19" value="+ userrole : Role[ ]" 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="Yrs2Ar6oVTmmq3gZQ8Z4-18" vertex="1">
<mxGeometry y="26" width="160" height="44" as="geometry" /> <mxGeometry y="26" width="160" height="44" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-20" 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="Yrs2Ar6oVTmmq3gZQ8Z4-18"> <mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-20" 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="Yrs2Ar6oVTmmq3gZQ8Z4-18" vertex="1">
<mxGeometry y="70" width="160" height="8" as="geometry" /> <mxGeometry y="70" width="160" height="8" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-21" value="+ method(type): type" 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="Yrs2Ar6oVTmmq3gZQ8Z4-18"> <mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-21" value="+ method(type): type" 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="Yrs2Ar6oVTmmq3gZQ8Z4-18" vertex="1">
<mxGeometry y="78" width="160" height="142" as="geometry" /> <mxGeometry y="78" width="160" height="142" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-22" value="Role" 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="Yrs2Ar6oVTmmq3gZQ8Z4-22" value="Role" 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="827" y="430" width="230" height="220" as="geometry" /> <mxGeometry x="870" y="920" width="230" height="220" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-23" value="- roletype : string&lt;div&gt;- permissionids : permissionenmum [ ]&lt;/div&gt;&lt;div&gt;&amp;nbsp;&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="Yrs2Ar6oVTmmq3gZQ8Z4-22"> <mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-23" value="- roletype : string&lt;div&gt;- permissionids : permissionenmum [ ]&lt;/div&gt;&lt;div&gt;&amp;nbsp;&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="Yrs2Ar6oVTmmq3gZQ8Z4-22" vertex="1">
<mxGeometry y="26" width="230" height="64" as="geometry" /> <mxGeometry y="26" width="230" height="64" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-24" 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="Yrs2Ar6oVTmmq3gZQ8Z4-22"> <mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-24" 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="Yrs2Ar6oVTmmq3gZQ8Z4-22" vertex="1">
<mxGeometry y="90" width="230" height="8" as="geometry" /> <mxGeometry y="90" width="230" height="8" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-25" value="+ getPermission()&lt;div&gt;+ setPermission(superuser, admin)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;+ getRoletype()&lt;/div&gt;&lt;div&gt;+ setRoletype(superuser, admin)&lt;br&gt;&lt;div&gt;&lt;br&gt;&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="Yrs2Ar6oVTmmq3gZQ8Z4-22"> <mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-25" value="+ getPermission()&lt;div&gt;+ setPermission(superuser, admin)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;+ getRoletype()&lt;/div&gt;&lt;div&gt;+ setRoletype(superuser, admin)&lt;br&gt;&lt;div&gt;&lt;br&gt;&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;" parent="Yrs2Ar6oVTmmq3gZQ8Z4-22" vertex="1">
<mxGeometry y="98" width="230" height="122" as="geometry" /> <mxGeometry y="98" width="230" height="122" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-27" value="Permission" 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="Yrs2Ar6oVTmmq3gZQ8Z4-27" value="Permission" 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="1280" y="430" width="220" height="230" as="geometry" /> <mxGeometry x="1410" y="540" width="220" height="230" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-28" value="- permissions : permissionenmum [ ]" 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="Yrs2Ar6oVTmmq3gZQ8Z4-27"> <mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-28" value="- permissions : permissionenmum [ ]" 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="Yrs2Ar6oVTmmq3gZQ8Z4-27" vertex="1">
<mxGeometry y="26" width="220" height="26" as="geometry" /> <mxGeometry y="26" width="220" height="26" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-29" 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="Yrs2Ar6oVTmmq3gZQ8Z4-27"> <mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-29" 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="Yrs2Ar6oVTmmq3gZQ8Z4-27" vertex="1">
<mxGeometry y="52" width="220" height="8" as="geometry" /> <mxGeometry y="52" width="220" height="8" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-30" value="+ method(type): type" 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="Yrs2Ar6oVTmmq3gZQ8Z4-27"> <mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-30" value="+ method(type): type" 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="Yrs2Ar6oVTmmq3gZQ8Z4-27" vertex="1">
<mxGeometry y="60" width="220" height="170" as="geometry" /> <mxGeometry y="60" width="220" height="170" as="geometry" />
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-31" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1"> <mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-44" value="" style="endArrow=diamondThin;endFill=0;endSize=24;html=1;rounded=0;exitX=0.535;exitY=-0.018;exitDx=0;exitDy=0;exitPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Yrs2Ar6oVTmmq3gZQ8Z4-22" edge="1">
<mxGeometry width="160" relative="1" as="geometry">
<mxPoint x="940" y="860" as="sourcePoint" />
<mxPoint x="993" y="811" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-0" value="AddressDao" 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="460" y="40" width="160" height="130" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-1" value="&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="v96xPLQoPeUk4bUV2WaN-0" vertex="1">
<mxGeometry y="26" width="160" height="24" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-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="v96xPLQoPeUk4bUV2WaN-0" vertex="1">
<mxGeometry y="50" width="160" height="8" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-3" value="- importPlz()&lt;div&gt;- importCountry()&lt;/div&gt;&lt;div&gt;+ getAddressData()&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="v96xPLQoPeUk4bUV2WaN-0" vertex="1">
<mxGeometry y="58" width="160" height="72" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-4" value="AddressModel" 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="650" y="40" width="160" height="150" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-5" value="&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="v96xPLQoPeUk4bUV2WaN-4" vertex="1">
<mxGeometry y="26" width="160" height="24" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-6" 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="v96xPLQoPeUk4bUV2WaN-4" vertex="1">
<mxGeometry y="50" width="160" height="8" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-7" value="&lt;div&gt;+ rowCount()&lt;/div&gt;&lt;div&gt;+ data()&lt;/div&gt;&lt;div&gt;+ roleNames()&lt;/div&gt;&lt;div&gt;+ setData()&lt;/div&gt;&lt;div&gt;+getAddresses()&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="v96xPLQoPeUk4bUV2WaN-4" vertex="1">
<mxGeometry y="58" width="160" height="92" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-8" value="BTypeDAO" 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="460" y="280" width="160" height="130" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-9" value="&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="v96xPLQoPeUk4bUV2WaN-8" vertex="1">
<mxGeometry y="26" width="160" height="24" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-10" 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="v96xPLQoPeUk4bUV2WaN-8" vertex="1">
<mxGeometry y="50" width="160" height="8" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-11" value="&lt;div&gt;+ getBType()&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="v96xPLQoPeUk4bUV2WaN-8" vertex="1">
<mxGeometry y="58" width="160" height="72" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-12" value="BTypeModel" 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="650" y="280" width="160" height="130" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-13" value="&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="v96xPLQoPeUk4bUV2WaN-12" vertex="1">
<mxGeometry y="26" width="160" height="24" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-14" 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="v96xPLQoPeUk4bUV2WaN-12" vertex="1">
<mxGeometry y="50" width="160" height="8" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-15" value="+ rowCount()&lt;div&gt;+ data()&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="v96xPLQoPeUk4bUV2WaN-12" vertex="1">
<mxGeometry y="58" width="160" height="72" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-16" value="ContactDAO" 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="460" y="430" width="160" height="130" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-17" value="&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="v96xPLQoPeUk4bUV2WaN-16" vertex="1">
<mxGeometry y="26" width="160" height="24" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-18" 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="v96xPLQoPeUk4bUV2WaN-16" vertex="1">
<mxGeometry y="50" width="160" height="8" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-19" value="&lt;div&gt;+ getContacts()&lt;/div&gt;&lt;div&gt;+ addContact()&lt;/div&gt;&lt;div&gt;+ addObjectContact()&lt;/div&gt;&lt;div&gt;+ getContact()&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="v96xPLQoPeUk4bUV2WaN-16" vertex="1">
<mxGeometry y="58" width="160" height="72" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-20" value="ContactModel" 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="650" y="430" width="160" height="180" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-21" value="&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="v96xPLQoPeUk4bUV2WaN-20" vertex="1">
<mxGeometry y="26" width="160" height="24" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-22" 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="v96xPLQoPeUk4bUV2WaN-20" vertex="1">
<mxGeometry y="50" width="160" height="8" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-23" value="+ getContacts()&lt;div&gt;- getData()&lt;/div&gt;&lt;div&gt;+ addContact()&lt;/div&gt;&lt;div&gt;+ addObjectContact()&lt;/div&gt;&lt;div&gt;- getContact()&lt;/div&gt;&lt;div&gt;+ getContactDetails()&lt;/div&gt;&lt;div&gt;- getContactInfo()&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="v96xPLQoPeUk4bUV2WaN-20" vertex="1">
<mxGeometry y="58" width="160" height="122" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-24" value="EmployeeDAO" 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="470" y="660" width="160" height="130" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-25" value="&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="v96xPLQoPeUk4bUV2WaN-24" vertex="1">
<mxGeometry y="26" width="160" height="24" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-26" 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="v96xPLQoPeUk4bUV2WaN-24" vertex="1">
<mxGeometry y="50" width="160" height="8" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-27" value="&lt;div&gt;+ getEmployees()&lt;/div&gt;&lt;div&gt;+ getEmployee()&lt;/div&gt;&lt;div&gt;+ addEmployee()&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="v96xPLQoPeUk4bUV2WaN-24" vertex="1">
<mxGeometry y="58" width="160" height="72" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-28" value="EmployeeModel" 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="650" y="660" width="160" height="220" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-29" value="&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="v96xPLQoPeUk4bUV2WaN-28" vertex="1">
<mxGeometry y="26" width="160" height="24" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-30" 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="v96xPLQoPeUk4bUV2WaN-28" vertex="1">
<mxGeometry y="50" width="160" height="8" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-31" value="+ addEmployee()&lt;div&gt;+ viewCriterion()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; refreshView()&lt;/div&gt;&lt;div&gt;- getData()&lt;/div&gt;&lt;div&gt;+ rowCount()&lt;/div&gt;&lt;div&gt;+ columnCount()&lt;/div&gt;&lt;div&gt;+ data()&lt;/div&gt;&lt;div&gt;+ headerData()&lt;/div&gt;&lt;div&gt;+ onRowClicked()&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="v96xPLQoPeUk4bUV2WaN-28" vertex="1">
<mxGeometry y="58" width="160" height="162" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-32" value="ObjectDAO" 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="470" y="900" width="160" height="130" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-33" value="&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="v96xPLQoPeUk4bUV2WaN-32" vertex="1">
<mxGeometry y="26" width="160" height="24" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-34" 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="v96xPLQoPeUk4bUV2WaN-32" vertex="1">
<mxGeometry y="50" width="160" height="8" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-35" value="&lt;div&gt;+ addObject()&lt;/div&gt;&lt;div&gt;+ getObjects()&lt;/div&gt;&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="v96xPLQoPeUk4bUV2WaN-32" vertex="1">
<mxGeometry y="58" width="160" height="72" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-36" value="ObjectModel" 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="650" y="900" width="160" height="220" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-37" value="&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="v96xPLQoPeUk4bUV2WaN-36" vertex="1">
<mxGeometry y="26" width="160" height="24" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-38" 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="v96xPLQoPeUk4bUV2WaN-36" vertex="1">
<mxGeometry y="50" width="160" height="8" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-39" value="+ addObject()&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;" 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-36" vertex="1">
<mxGeometry y="58" width="160" height="162" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-40" value="UserDAO" 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="20" y="840" width="160" height="130" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-41" value="&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="v96xPLQoPeUk4bUV2WaN-40" vertex="1">
<mxGeometry y="26" width="160" height="24" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-42" 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="v96xPLQoPeUk4bUV2WaN-40" vertex="1">
<mxGeometry y="50" width="160" height="8" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-43" value="&lt;div&gt;+ createUser()&lt;/div&gt;&lt;div&gt;+ getUser()&lt;/div&gt;&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="v96xPLQoPeUk4bUV2WaN-40" vertex="1">
<mxGeometry y="58" width="160" height="72" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-48" value="UserManager" 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="220" y="840" width="160" height="240" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-49" value="&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="v96xPLQoPeUk4bUV2WaN-48" vertex="1">
<mxGeometry y="26" width="160" height="24" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-50" 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="v96xPLQoPeUk4bUV2WaN-48" vertex="1">
<mxGeometry y="50" width="160" height="8" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-51" value="&lt;div&gt;+ createUser()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; hashPassword()&lt;/div&gt;&lt;div&gt;+ checkAdmin()&lt;/div&gt;&lt;div&gt;+ getUser()&lt;/div&gt;&lt;div&gt;+ getUsers()&lt;/div&gt;&lt;div&gt;+ delUser()&lt;/div&gt;&lt;div&gt;+ updateUser()&lt;/div&gt;&lt;div&gt;+ disableUser()&lt;/div&gt;&lt;div&gt;+ login()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; checkPassword&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="v96xPLQoPeUk4bUV2WaN-48" vertex="1">
<mxGeometry y="58" width="160" height="182" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-57" value="" style="endArrow=none;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.402;entryY=1.001;entryDx=0;entryDy=0;entryPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="_OjnZrDktrtFcgEA-KSX-13" target="v96xPLQoPeUk4bUV2WaN-62" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="210" y="270" as="sourcePoint" /> <mxPoint x="50" y="240" as="sourcePoint" />
<mxPoint x="280" y="270" as="targetPoint" /> <mxPoint x="103.36000000000013" y="205.29999999999995" as="targetPoint" />
<Array as="points" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-42" value="" style="endArrow=diamondThin;endFill=0;endSize=24;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1.013;entryY=0.385;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Yrs2Ar6oVTmmq3gZQ8Z4-30" target="Yrs2Ar6oVTmmq3gZQ8Z4-25"> <mxCell id="v96xPLQoPeUk4bUV2WaN-59" value="Classname" 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 width="160" relative="1" as="geometry"> <mxGeometry x="40" y="40" width="160" height="170" as="geometry" />
<mxPoint x="870" y="690" as="sourcePoint" /> </mxCell>
<mxPoint x="1090" y="570" as="targetPoint" /> <mxCell id="v96xPLQoPeUk4bUV2WaN-61" 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="v96xPLQoPeUk4bUV2WaN-59" vertex="1">
<mxGeometry y="26" width="160" height="54" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-62" value="&lt;div&gt;&lt;span style=&quot;background-color: initial;&quot;&gt;+ getBusiness()&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: initial;&quot;&gt;+ addBusiness()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;+ getOneBusiness()&lt;/div&gt;&lt;div&gt;+ updateBusiness()&lt;/div&gt;&lt;div&gt;+ delBusiness()&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="v96xPLQoPeUk4bUV2WaN-59" vertex="1">
<mxGeometry y="80" width="160" height="90" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-63" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" target="v96xPLQoPeUk4bUV2WaN-59" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="240" y="83" as="sourcePoint" />
<mxPoint x="110" y="130" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="Yrs2Ar6oVTmmq3gZQ8Z4-44" value="" style="endArrow=diamondThin;endFill=0;endSize=24;html=1;rounded=0;exitX=0.535;exitY=-0.018;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="Yrs2Ar6oVTmmq3gZQ8Z4-22"> <mxCell id="v96xPLQoPeUk4bUV2WaN-64" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1.001;exitY=0.088;exitDx=0;exitDy=0;exitPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="_OjnZrDktrtFcgEA-KSX-13" target="v96xPLQoPeUk4bUV2WaN-3" edge="1">
<mxGeometry width="160" relative="1" as="geometry"> <mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="897" y="370" as="sourcePoint" /> <mxPoint x="200" y="348" as="sourcePoint" />
<mxPoint x="950" y="321" as="targetPoint" /> <mxPoint x="110" y="250" as="targetPoint" />
<Array as="points">
<mxPoint x="410" y="348" />
<mxPoint x="410" y="134" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-65" 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="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-1" target="v96xPLQoPeUk4bUV2WaN-5" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="920" y="280" as="sourcePoint" />
<mxPoint x="970" y="230" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-66" value="" style="endArrow=none;html=1;rounded=0;exitX=0.998;exitY=-0.03;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.375;entryDx=0;entryDy=0;entryPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="_OjnZrDktrtFcgEA-KSX-14" target="v96xPLQoPeUk4bUV2WaN-11" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="250" y="360" as="sourcePoint" />
<mxPoint x="430" y="365" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-67" 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-9" target="v96xPLQoPeUk4bUV2WaN-13" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="330" y="460" as="sourcePoint" />
<mxPoint x="380" y="410" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-68" value="" style="endArrow=none;html=1;rounded=0;exitX=1.003;exitY=0.724;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="_OjnZrDktrtFcgEA-KSX-14" target="v96xPLQoPeUk4bUV2WaN-17" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="250" y="530" as="sourcePoint" />
<mxPoint x="300" y="480" as="targetPoint" />
<Array as="points">
<mxPoint x="440" y="383" />
<mxPoint x="440" y="468" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-69" 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="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-17" target="v96xPLQoPeUk4bUV2WaN-21" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="280" y="300" as="sourcePoint" />
<mxPoint x="350" y="470" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-70" value="" style="endArrow=none;html=1;rounded=0;exitX=1.004;exitY=0.263;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="_OjnZrDktrtFcgEA-KSX-16" target="v96xPLQoPeUk4bUV2WaN-25" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="530" as="sourcePoint" />
<mxPoint x="320" y="480" as="targetPoint" />
<Array as="points">
<mxPoint x="430" y="406" />
<mxPoint x="430" y="698" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-71" 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="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-25" target="v96xPLQoPeUk4bUV2WaN-29" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="530" as="sourcePoint" />
<mxPoint x="320" y="480" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-72" value="" style="endArrow=none;html=1;rounded=0;exitX=1.008;exitY=0.788;exitDx=0;exitDy=0;exitPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="_OjnZrDktrtFcgEA-KSX-16" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="530" as="sourcePoint" />
<mxPoint x="470" y="940" as="targetPoint" />
<Array as="points">
<mxPoint x="410" y="423" />
<mxPoint x="410" y="600" />
<mxPoint x="410" y="940" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-74" 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="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-33" target="v96xPLQoPeUk4bUV2WaN-37" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="490" y="930" as="sourcePoint" />
<mxPoint x="540" y="880" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-75" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0;exitDx=0;exitDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-40" target="_OjnZrDktrtFcgEA-KSX-16" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="430" y="660" as="sourcePoint" />
<mxPoint x="480" y="610" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-76" 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="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-41" target="v96xPLQoPeUk4bUV2WaN-49" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="360" y="620" as="sourcePoint" />
<mxPoint x="410" y="570" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-77" value="ConfigLoader" 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="1100" y="40" width="170" height="470" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-78" 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="v96xPLQoPeUk4bUV2WaN-77" vertex="1">
<mxGeometry y="26" width="170" height="24" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-79" 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="v96xPLQoPeUk4bUV2WaN-77" vertex="1">
<mxGeometry y="50" width="170" height="8" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-80" value="+ setConfig()&lt;div&gt;-&amp;nbsp; initializeConfig()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; checkDbConnection()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; saveConfig()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; checkAdminUser()&lt;/div&gt;&lt;div&gt;+ addAdminUser()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; saveData()&lt;/div&gt;&lt;div&gt;+ getRecoveryKey()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; parseImport()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; invalidateEncryptionKey()&lt;/div&gt;&lt;div&gt;+ checkEncryptionKey()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; checkRecoveryPassword&lt;/div&gt;&lt;div&gt;+ importConfig()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; configLoad()&lt;/div&gt;&lt;div&gt;+ getConfig()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; setRecoveryPassword()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; setEncryptionKey()&lt;/div&gt;&lt;div&gt;+ backupConfig()&lt;/div&gt;&lt;div&gt;+ saveDbConf()&lt;/div&gt;&lt;div&gt;+ getDbConf()&lt;/div&gt;&lt;div&gt;+ saveCompanyInfo()&lt;/div&gt;&lt;div&gt;+ getCompanyInfo()&lt;/div&gt;&lt;div&gt;+ saveMiscConf()&lt;/div&gt;&lt;div&gt;+ systray()&lt;/div&gt;&lt;div&gt;+ backupEncryptkey()&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="v96xPLQoPeUk4bUV2WaN-77" vertex="1">
<mxGeometry y="58" width="170" height="412" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-89" 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="40" y="610" width="170" height="150" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-90" 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="v96xPLQoPeUk4bUV2WaN-89" vertex="1">
<mxGeometry y="26" width="170" height="44" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-91" 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="v96xPLQoPeUk4bUV2WaN-89" vertex="1">
<mxGeometry y="70" width="170" height="80" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-93" 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="230" y="610" width="170" height="140" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-94" 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="v96xPLQoPeUk4bUV2WaN-93" vertex="1">
<mxGeometry y="26" width="170" height="64" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-95" 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="v96xPLQoPeUk4bUV2WaN-93" vertex="1">
<mxGeometry y="90" width="170" height="50" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-96" value="Databasemanager" 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="40" width="170" height="90" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-97" value="&lt;div&gt;- connection&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="v96xPLQoPeUk4bUV2WaN-96" vertex="1">
<mxGeometry y="26" width="170" height="24" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-98" 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="v96xPLQoPeUk4bUV2WaN-96" vertex="1">
<mxGeometry y="50" width="170" height="8" as="geometry" />
</mxCell>
<mxCell id="v96xPLQoPeUk4bUV2WaN-99" value="+ instance(): connection" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="v96xPLQoPeUk4bUV2WaN-96" vertex="1">
<mxGeometry y="58" width="170" height="32" as="geometry" />
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-0" value="PyqcrmFlags" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="870" y="340" width="170" height="150" as="geometry" />
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-1" value="&lt;div&gt;ADMIN: enum&lt;/div&gt;&lt;div&gt;USER: enum&lt;/div&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-0">
<mxGeometry y="26" width="170" height="44" as="geometry" />
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-2" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-0">
<mxGeometry y="70" width="170" height="80" as="geometry" />
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-3" value="PyqcrmAppliEmpyFlags" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="870" y="170" width="170" height="140" as="geometry" />
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-4" value="&lt;div&gt;ALL: enum&lt;/div&gt;&lt;div&gt;APPLICANT: enum&lt;/div&gt;&lt;div&gt;EMPLOYEE; enum&lt;/div&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-3">
<mxGeometry y="26" width="170" height="64" as="geometry" />
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-5" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-3">
<mxGeometry y="90" width="170" height="50" as="geometry" />
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-6" value="" style="endArrow=none;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-89" target="v96xPLQoPeUk4bUV2WaN-40">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="420" y="900" as="sourcePoint" />
<mxPoint x="470" y="850" as="targetPoint" />
<Array as="points">
<mxPoint x="83" y="800" />
<mxPoint x="60" y="800" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-7" value="" style="endArrow=none;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-48" target="v96xPLQoPeUk4bUV2WaN-93">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="420" y="900" as="sourcePoint" />
<mxPoint x="470" y="850" as="targetPoint" />
<Array as="points">
<mxPoint x="300" y="800" />
<mxPoint x="315" y="800" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-8" value="" style="endArrow=none;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-93" target="v96xPLQoPeUk4bUV2WaN-40">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="420" y="900" as="sourcePoint" />
<mxPoint x="470" y="850" as="targetPoint" />
<Array as="points">
<mxPoint x="273" y="780" />
<mxPoint x="140" y="780" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-9" value="" style="endArrow=none;html=1;rounded=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;exitX=0.25;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-48" target="v96xPLQoPeUk4bUV2WaN-89">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="420" y="900" as="sourcePoint" />
<mxPoint x="470" y="850" as="targetPoint" />
<Array as="points">
<mxPoint x="260" y="800" />
<mxPoint x="168" y="800" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-10" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-78" target="v96xPLQoPeUk4bUV2WaN-97">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="600" y="440" as="sourcePoint" />
<mxPoint x="650" y="390" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-11" value="" style="endArrow=none;html=1;rounded=0;exitX=1.001;exitY=0.102;exitDx=0;exitDy=0;exitPerimeter=0;entryX=-0.002;entryY=0.624;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="6xiAvg-kEoilwsfhhM0o-0" target="v96xPLQoPeUk4bUV2WaN-80">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="600" y="440" as="sourcePoint" />
<mxPoint x="650" y="390" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-12" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=-0.001;exitY=0.316;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-80" target="6xiAvg-kEoilwsfhhM0o-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="600" y="440" as="sourcePoint" />
<mxPoint x="650" y="390" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-13" value="Vermasseln" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1350" y="40" width="170" height="140" as="geometry" />
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-14" value="&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-13">
<mxGeometry y="26" width="170" height="24" as="geometry" />
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-15" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-13">
<mxGeometry y="50" width="170" height="8" as="geometry" />
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-16" value="+ oscarVermasseln()&lt;div&gt;+ entschluesseln()&lt;/div&gt;&lt;div&gt;-&amp;nbsp; vermasslungsKobold()&lt;/div&gt;&lt;div&gt;+ userPasswordHash&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="6xiAvg-kEoilwsfhhM0o-13">
<mxGeometry y="58" width="170" height="82" as="geometry" />
</mxCell>
<mxCell id="6xiAvg-kEoilwsfhhM0o-17" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="v96xPLQoPeUk4bUV2WaN-78" target="6xiAvg-kEoilwsfhhM0o-14">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="800" y="530" as="sourcePoint" />
<mxPoint x="850" y="480" as="targetPoint" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
</root> </root>

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -1,953 +0,0 @@
/*M!999999\- enable the sandbox mode */
-- MariaDB dump 10.19 Distrib 10.11.10-MariaDB, for Linux (x86_64)
--
-- Host: bearybot.selfhost.co Database: pyqcrm
-- ------------------------------------------------------
-- Server version 10.11.8-MariaDB-0ubuntu0.24.04.1
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `Entities`
--
DROP TABLE IF EXISTS `Entities`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `Entities` (
`entityid` int(11) NOT NULL AUTO_INCREMENT,
`entity` varchar(35) NOT NULL,
PRIMARY KEY (`entityid`),
UNIQUE KEY `Entities_UNIQUE` (`entity`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `Entities`
--
LOCK TABLES `Entities` WRITE;
/*!40000 ALTER TABLE `Entities` DISABLE KEYS */;
/*!40000 ALTER TABLE `Entities` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `address`
--
DROP TABLE IF EXISTS `address`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `address` (
`addressid` int(11) NOT NULL AUTO_INCREMENT,
`country` varchar(50) DEFAULT NULL,
`address` varchar(50) NOT NULL,
PRIMARY KEY (`addressid`),
UNIQUE KEY `address_unique` (`address`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `address`
--
LOCK TABLES `address` WRITE;
/*!40000 ALTER TABLE `address` DISABLE KEYS */;
/*!40000 ALTER TABLE `address` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `assignment`
--
DROP TABLE IF EXISTS `assignment`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `assignment` (
`contractid` int(11) NOT NULL AUTO_INCREMENT,
`employeeid` int(11) NOT NULL,
UNIQUE KEY `assignment_unique` (`contractid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_estonian_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `assignment`
--
LOCK TABLES `assignment` WRITE;
/*!40000 ALTER TABLE `assignment` DISABLE KEYS */;
/*!40000 ALTER TABLE `assignment` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `business`
--
DROP TABLE IF EXISTS `business`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `business` (
`businessid` int(11) NOT NULL AUTO_INCREMENT,
`company` varchar(100) NOT NULL,
`street` varchar(100) NOT NULL,
`postcodeid` int(11) DEFAULT NULL,
`phone` varchar(50) DEFAULT NULL,
`mobilephone` varchar(50) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`homepage` varchar(255) DEFAULT NULL,
`director` varchar(100) DEFAULT NULL,
`contactpersonid` int(11) DEFAULT NULL,
`info` varchar(500) DEFAULT NULL,
`btid` int(11) NOT NULL DEFAULT 1,
PRIMARY KEY (`businessid`),
UNIQUE KEY `customer_unique` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `business`
--
LOCK TABLES `business` WRITE;
/*!40000 ALTER TABLE `business` DISABLE KEYS */;
/*!40000 ALTER TABLE `business` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `businesstype`
--
DROP TABLE IF EXISTS `businesstype`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `businesstype` (
`btypeID` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(35) NOT NULL,
PRIMARY KEY (`btypeID`),
UNIQUE KEY `businesstype_unique` (`description`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `businesstype`
--
LOCK TABLES `businesstype` WRITE;
/*!40000 ALTER TABLE `businesstype` DISABLE KEYS */;
/*!40000 ALTER TABLE `businesstype` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `contact`
--
DROP TABLE IF EXISTS `contact`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `contact` (
`id` int(11) NOT NULL,
`contactpersonid` int(11) NOT NULL,
`businessid` tinyint(1) NOT NULL DEFAULT 1,
UNIQUE KEY `contact_unique` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `contact`
--
LOCK TABLES `contact` WRITE;
/*!40000 ALTER TABLE `contact` DISABLE KEYS */;
/*!40000 ALTER TABLE `contact` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `contactperson`
--
DROP TABLE IF EXISTS `contactperson`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `contactperson` (
`contactpersonid` int(11) NOT NULL AUTO_INCREMENT,
`priorityid` int(11) DEFAULT NULL,
`lastname` varchar(35) NOT NULL,
`firstname` varchar(35) NOT NULL,
`phone` varchar(50) DEFAULT NULL,
`mobilephone` varchar(50) DEFAULT NULL,
`position` varchar(50) DEFAULT NULL,
`salutation` varchar(10) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`birthday` date DEFAULT NULL,
`active` tinyint(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`contactpersonid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `contactperson`
--
LOCK TABLES `contactperson` WRITE;
/*!40000 ALTER TABLE `contactperson` DISABLE KEYS */;
/*!40000 ALTER TABLE `contactperson` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `contract`
--
DROP TABLE IF EXISTS `contract`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `contract` (
`contractid` int(11) NOT NULL AUTO_INCREMENT,
`jobdetailid` int(11) NOT NULL,
`tariffid` int(11) NOT NULL,
`officeid` int(11) NOT NULL COMMENT 'Kostenstelle',
`date` date NOT NULL,
PRIMARY KEY (`contractid`),
UNIQUE KEY `contract_unique` (`jobdetailid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `contract`
--
LOCK TABLES `contract` WRITE;
/*!40000 ALTER TABLE `contract` DISABLE KEYS */;
/*!40000 ALTER TABLE `contract` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `employee`
--
DROP TABLE IF EXISTS `employee`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `employee` (
`employeeid` int(11) NOT NULL AUTO_INCREMENT,
`lastname` varchar(35) NOT NULL,
`firstname` varchar(35) NOT NULL,
`gender` varchar(30) DEFAULT NULL,
`maritalstatus` varchar(30) DEFAULT NULL,
`nationality` varchar(50) NOT NULL,
`birthday` date NOT NULL,
`street` varchar(100) NOT NULL,
`postcodeid` int(11) NOT NULL,
`phone` varchar(50) DEFAULT NULL,
`mobilephone` varchar(50) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`identificationid` int(11) NOT NULL,
`jobstatusid` int(11) NOT NULL,
PRIMARY KEY (`employeeid`),
UNIQUE KEY `employee_unique` (`identificationid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `employee`
--
LOCK TABLES `employee` WRITE;
/*!40000 ALTER TABLE `employee` DISABLE KEYS */;
/*!40000 ALTER TABLE `employee` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `identification`
--
DROP TABLE IF EXISTS `identification`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `identification` (
`identificationid` int(11) NOT NULL AUTO_INCREMENT,
`number` varchar(50) NOT NULL,
`expiry` date NOT NULL,
`issued` date NOT NULL,
`authority` varchar(50) NOT NULL,
`typeid` int(11) NOT NULL,
PRIMARY KEY (`identificationid`),
UNIQUE KEY `identification_unique` (`number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `identification`
--
LOCK TABLES `identification` WRITE;
/*!40000 ALTER TABLE `identification` DISABLE KEYS */;
/*!40000 ALTER TABLE `identification` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `identificationtype`
--
DROP TABLE IF EXISTS `identificationtype`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `identificationtype` (
`typeid` int(11) NOT NULL AUTO_INCREMENT,
`type` varchar(50) NOT NULL,
PRIMARY KEY (`typeid`),
UNIQUE KEY `identificationtype_unique` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `identificationtype`
--
LOCK TABLES `identificationtype` WRITE;
/*!40000 ALTER TABLE `identificationtype` DISABLE KEYS */;
/*!40000 ALTER TABLE `identificationtype` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `invoice`
--
DROP TABLE IF EXISTS `invoice`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `invoice` (
`invoiceid` int(11) NOT NULL AUTO_INCREMENT,
`issued` date NOT NULL COMMENT 'Rechnungsdatum',
`entry` date NOT NULL COMMENT 'Buchungsdatum',
`contractid` int(11) NOT NULL,
PRIMARY KEY (`invoiceid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `invoice`
--
LOCK TABLES `invoice` WRITE;
/*!40000 ALTER TABLE `invoice` DISABLE KEYS */;
/*!40000 ALTER TABLE `invoice` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `jobdetail`
--
DROP TABLE IF EXISTS `jobdetail`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `jobdetail` (
`jobdetailid` int(11) NOT NULL AUTO_INCREMENT,
`duration` decimal(10,0) NOT NULL,
`objectid` int(11) NOT NULL,
`period` varchar(15) NOT NULL,
`personnel` int(11) NOT NULL DEFAULT 1 COMMENT 'number of employees',
`price` decimal(10,0) NOT NULL,
PRIMARY KEY (`jobdetailid`),
UNIQUE KEY `jobdetail_unique` (`objectid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `jobdetail`
--
LOCK TABLES `jobdetail` WRITE;
/*!40000 ALTER TABLE `jobdetail` DISABLE KEYS */;
/*!40000 ALTER TABLE `jobdetail` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `jobstatus`
--
DROP TABLE IF EXISTS `jobstatus`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `jobstatus` (
`jobstatusid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(30) NOT NULL,
PRIMARY KEY (`jobstatusid`),
UNIQUE KEY `jobstatus_unique` (`description`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `jobstatus`
--
LOCK TABLES `jobstatus` WRITE;
/*!40000 ALTER TABLE `jobstatus` DISABLE KEYS */;
/*!40000 ALTER TABLE `jobstatus` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `logs`
--
DROP TABLE IF EXISTS `logs`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `logs` (
`logid` int(11) NOT NULL AUTO_INCREMENT,
`recordid` int(11) DEFAULT NULL,
`operationtype` varchar(100) NOT NULL,
`message` varchar(100) NOT NULL,
`logdate` datetime NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`logid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `logs`
--
LOCK TABLES `logs` WRITE;
/*!40000 ALTER TABLE `logs` DISABLE KEYS */;
/*!40000 ALTER TABLE `logs` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `medicalcare`
--
DROP TABLE IF EXISTS `medicalcare`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `medicalcare` (
`medicalcareid` int(11) NOT NULL AUTO_INCREMENT,
`company` varchar(50) NOT NULL,
PRIMARY KEY (`medicalcareid`),
UNIQUE KEY `medicalcare_unique` (`company`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `medicalcare`
--
LOCK TABLES `medicalcare` WRITE;
/*!40000 ALTER TABLE `medicalcare` DISABLE KEYS */;
/*!40000 ALTER TABLE `medicalcare` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `object`
--
DROP TABLE IF EXISTS `object`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `object` (
`objectid` int(11) NOT NULL AUTO_INCREMENT,
`street` varchar(100) NOT NULL,
`postcodeid` int(11) NOT NULL,
`contactpersonid` int(11) NOT NULL,
`businessid` int(11) NOT NULL,
PRIMARY KEY (`objectid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `object`
--
LOCK TABLES `object` WRITE;
/*!40000 ALTER TABLE `object` DISABLE KEYS */;
/*!40000 ALTER TABLE `object` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `offer`
--
DROP TABLE IF EXISTS `offer`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `offer` (
`offerid` int(11) NOT NULL AUTO_INCREMENT,
`jobdetailid` int(11) NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`offerid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `offer`
--
LOCK TABLES `offer` WRITE;
/*!40000 ALTER TABLE `offer` DISABLE KEYS */;
/*!40000 ALTER TABLE `offer` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `offers`
--
DROP TABLE IF EXISTS `offers`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `offers` (
`offerid` int(11) NOT NULL,
`contractid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Kreuztabelle Angebot - Auftrag';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `offers`
--
LOCK TABLES `offers` WRITE;
/*!40000 ALTER TABLE `offers` DISABLE KEYS */;
/*!40000 ALTER TABLE `offers` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `office`
--
DROP TABLE IF EXISTS `office`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `office` (
`officeid` int(11) NOT NULL AUTO_INCREMENT,
`office` varchar(50) NOT NULL COMMENT 'Kostenstelle',
PRIMARY KEY (`officeid`),
UNIQUE KEY `office_unique` (`office`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Kostenstelle';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `office`
--
LOCK TABLES `office` WRITE;
/*!40000 ALTER TABLE `office` DISABLE KEYS */;
/*!40000 ALTER TABLE `office` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `permissions`
--
DROP TABLE IF EXISTS `permissions`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `permissions` (
`permissionid` int(11) NOT NULL AUTO_INCREMENT,
`permission` varchar(50) NOT NULL,
PRIMARY KEY (`permissionid`),
UNIQUE KEY `berechtigungen_unique` (`permission`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `permissions`
--
LOCK TABLES `permissions` WRITE;
/*!40000 ALTER TABLE `permissions` DISABLE KEYS */;
/*!40000 ALTER TABLE `permissions` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `personalrole`
--
DROP TABLE IF EXISTS `personalrole`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `personalrole` (
`employeeid` int(11) NOT NULL,
`roleid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Kreuztabelle';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `personalrole`
--
LOCK TABLES `personalrole` WRITE;
/*!40000 ALTER TABLE `personalrole` DISABLE KEYS */;
/*!40000 ALTER TABLE `personalrole` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `postcode`
--
DROP TABLE IF EXISTS `postcode`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `postcode` (
`postcodeid` int(11) NOT NULL AUTO_INCREMENT,
`postcode` varchar(15) NOT NULL,
`addressid` int(11) NOT NULL,
PRIMARY KEY (`postcodeid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `postcode`
--
LOCK TABLES `postcode` WRITE;
/*!40000 ALTER TABLE `postcode` DISABLE KEYS */;
/*!40000 ALTER TABLE `postcode` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `role`
--
DROP TABLE IF EXISTS `role`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `role` (
`roleid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(50) NOT NULL,
PRIMARY KEY (`roleid`),
UNIQUE KEY `role_unique` (`description`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `role`
--
LOCK TABLES `role` WRITE;
/*!40000 ALTER TABLE `role` DISABLE KEYS */;
/*!40000 ALTER TABLE `role` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `roles`
--
DROP TABLE IF EXISTS `roles`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `roles` (
`roleid` int(11) NOT NULL,
`permissionid` int(11) NOT NULL,
`entityid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `roles`
--
LOCK TABLES `roles` WRITE;
/*!40000 ALTER TABLE `roles` DISABLE KEYS */;
/*!40000 ALTER TABLE `roles` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `salestax`
--
DROP TABLE IF EXISTS `salestax`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `salestax` (
`salestaxid` varchar(20) NOT NULL,
`businessid` int(11) NOT NULL,
PRIMARY KEY (`salestaxid`),
UNIQUE KEY `salestax_unique` (`businessid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `salestax`
--
LOCK TABLES `salestax` WRITE;
/*!40000 ALTER TABLE `salestax` DISABLE KEYS */;
/*!40000 ALTER TABLE `salestax` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `service`
--
DROP TABLE IF EXISTS `service`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `service` (
`servicetypeid` int(11) NOT NULL,
`servicedescid` int(11) NOT NULL,
`objectid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `service`
--
LOCK TABLES `service` WRITE;
/*!40000 ALTER TABLE `service` DISABLE KEYS */;
/*!40000 ALTER TABLE `service` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `servicedesc`
--
DROP TABLE IF EXISTS `servicedesc`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `servicedesc` (
`servicedescid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(1000) NOT NULL,
PRIMARY KEY (`servicedescid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `servicedesc`
--
LOCK TABLES `servicedesc` WRITE;
/*!40000 ALTER TABLE `servicedesc` DISABLE KEYS */;
/*!40000 ALTER TABLE `servicedesc` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `servicetype`
--
DROP TABLE IF EXISTS `servicetype`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `servicetype` (
`servicetypeid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(50) NOT NULL,
PRIMARY KEY (`servicetypeid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `servicetype`
--
LOCK TABLES `servicetype` WRITE;
/*!40000 ALTER TABLE `servicetype` DISABLE KEYS */;
/*!40000 ALTER TABLE `servicetype` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `socialsecurity`
--
DROP TABLE IF EXISTS `socialsecurity`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `socialsecurity` (
`employeeid` int(11) NOT NULL,
`socialsecurityno` varchar(30) NOT NULL,
`medicalcareid` int(11) NOT NULL,
UNIQUE KEY `socialsecurity_unique` (`employeeid`),
UNIQUE KEY `socialsecurity_unique_1` (`socialsecurityno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `socialsecurity`
--
LOCK TABLES `socialsecurity` WRITE;
/*!40000 ALTER TABLE `socialsecurity` DISABLE KEYS */;
/*!40000 ALTER TABLE `socialsecurity` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `tariff`
--
DROP TABLE IF EXISTS `tariff`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tariff` (
`tariffid` int(11) NOT NULL AUTO_INCREMENT,
`tariff` decimal(10,0) NOT NULL COMMENT 'Festgelegter Stundensatz',
PRIMARY KEY (`tariffid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Stundensatz Tabelle';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `tariff`
--
LOCK TABLES `tariff` WRITE;
/*!40000 ALTER TABLE `tariff` DISABLE KEYS */;
/*!40000 ALTER TABLE `tariff` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `timetrack`
--
DROP TABLE IF EXISTS `timetrack`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `timetrack` (
`employeeid` int(11) NOT NULL,
`start` datetime NOT NULL,
`stop` datetime NOT NULL,
`vacation` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `timetrack`
--
LOCK TABLES `timetrack` WRITE;
/*!40000 ALTER TABLE `timetrack` DISABLE KEYS */;
/*!40000 ALTER TABLE `timetrack` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `users`
--
DROP TABLE IF EXISTS `users`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `users` (
`usersid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(150) NOT NULL,
`enabled` tinyint(1) NOT NULL DEFAULT 1,
`roleid` int(11) NOT NULL,
`gecos` varchar(75) DEFAULT NULL,
PRIMARY KEY (`usersid`),
UNIQUE KEY `users_unique` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `users`
--
LOCK TABLES `users` WRITE;
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
/*!40000 ALTER TABLE `users` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Dumping routines for database 'pyqcrm'
--
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `addPermission` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `addPermission`(IN newpermission VARCHAR(50))
BEGIN
IF NOT EXISTS (SELECT 1 FROM permissions WHERE permission = newpermission) THEN
INSERT INTO permissions(permission) VALUES(newpermission);
END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `addRole` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `addRole`(IN newdescription VARCHAR(50))
BEGIN
IF NOT EXISTS (SELECT 1 FROM `role` WHERE description = newdescription) THEN
INSERT INTO `role`(description) VALUES(newdescription);
END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `createUser` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `createUser`(IN uname VARCHAR(35), IN password VARCHAR(150), IN gecos VARCHAR(75), IN admin BOOL)
BEGIN
DECLARE userrole INT;
SET userrole = 2;
IF admin = 1 THEN
SET userrole = 1;
END IF;
IF NOT EXISTS (SELECT 1 FROM users WHERE username = uname) THEN
INSERT INTO users(username, password, gecos, roleid) VALUES(uname, password, gecos, userrole);
END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `getBusiness` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `getBusiness`(IN businesstype VARCHAR(35))
BEGIN
SELECT * FROM business;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2024-11-21 15:31:16

View File

@@ -1,995 +0,0 @@
/*M!999999\- enable the sandbox mode */
-- MariaDB dump 10.19 Distrib 10.11.10-MariaDB, for Linux (x86_64)
--
-- Host: bearybot.selfhost.co Database: pyqcrm
-- ------------------------------------------------------
-- Server version 10.11.8-MariaDB-0ubuntu0.24.04.1
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `address`
--
DROP TABLE IF EXISTS `address`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `address` (
`addressid` int(11) NOT NULL AUTO_INCREMENT,
`country` varchar(50) DEFAULT NULL,
`address` varchar(50) NOT NULL,
PRIMARY KEY (`addressid`),
UNIQUE KEY `address_unique` (`address`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `address`
--
LOCK TABLES `address` WRITE;
/*!40000 ALTER TABLE `address` DISABLE KEYS */;
/*!40000 ALTER TABLE `address` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `assignment`
--
DROP TABLE IF EXISTS `assignment`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `assignment` (
`contractid` int(11) NOT NULL AUTO_INCREMENT,
`employeeid` int(11) NOT NULL,
UNIQUE KEY `assignment_unique` (`contractid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_estonian_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `assignment`
--
LOCK TABLES `assignment` WRITE;
/*!40000 ALTER TABLE `assignment` DISABLE KEYS */;
/*!40000 ALTER TABLE `assignment` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `business`
--
DROP TABLE IF EXISTS `business`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `business` (
`businessid` int(11) NOT NULL AUTO_INCREMENT,
`company` varchar(100) NOT NULL,
`street` varchar(100) NOT NULL,
`postcodeid` int(11) DEFAULT NULL,
`phone` varchar(50) DEFAULT NULL,
`mobilephone` varchar(50) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`homepage` varchar(255) DEFAULT NULL,
`director` varchar(100) DEFAULT NULL,
`contactpersonid` int(11) DEFAULT NULL,
`info` varchar(500) DEFAULT NULL,
`btid` int(11) NOT NULL DEFAULT 1,
PRIMARY KEY (`businessid`),
UNIQUE KEY `customer_unique` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `business`
--
LOCK TABLES `business` WRITE;
/*!40000 ALTER TABLE `business` DISABLE KEYS */;
/*!40000 ALTER TABLE `business` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `businesstype`
--
DROP TABLE IF EXISTS `businesstype`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `businesstype` (
`btypeID` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(35) NOT NULL,
PRIMARY KEY (`btypeID`),
UNIQUE KEY `businesstype_unique` (`description`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `businesstype`
--
LOCK TABLES `businesstype` WRITE;
/*!40000 ALTER TABLE `businesstype` DISABLE KEYS */;
/*!40000 ALTER TABLE `businesstype` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `contact`
--
DROP TABLE IF EXISTS `contact`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `contact` (
`id` int(11) NOT NULL,
`contactpersonid` int(11) NOT NULL,
`businessid` tinyint(1) NOT NULL DEFAULT 1,
UNIQUE KEY `contact_unique` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `contact`
--
LOCK TABLES `contact` WRITE;
/*!40000 ALTER TABLE `contact` DISABLE KEYS */;
/*!40000 ALTER TABLE `contact` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `contactperson`
--
DROP TABLE IF EXISTS `contactperson`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `contactperson` (
`contactpersonid` int(11) NOT NULL AUTO_INCREMENT,
`priorityid` int(11) DEFAULT NULL,
`lastname` varchar(35) NOT NULL,
`firstname` varchar(35) NOT NULL,
`phone` varchar(50) DEFAULT NULL,
`mobilephone` varchar(50) DEFAULT NULL,
`position` varchar(50) DEFAULT NULL,
`salutation` varchar(10) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`birthday` date DEFAULT NULL,
`active` tinyint(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`contactpersonid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `contactperson`
--
LOCK TABLES `contactperson` WRITE;
/*!40000 ALTER TABLE `contactperson` DISABLE KEYS */;
/*!40000 ALTER TABLE `contactperson` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `contract`
--
DROP TABLE IF EXISTS `contract`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `contract` (
`contractid` int(11) NOT NULL AUTO_INCREMENT,
`jobdetailid` int(11) NOT NULL,
`tariffid` int(11) NOT NULL,
`officeid` int(11) NOT NULL COMMENT 'Kostenstelle',
`date` date NOT NULL,
PRIMARY KEY (`contractid`),
UNIQUE KEY `contract_unique` (`jobdetailid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `contract`
--
LOCK TABLES `contract` WRITE;
/*!40000 ALTER TABLE `contract` DISABLE KEYS */;
/*!40000 ALTER TABLE `contract` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `employee`
--
DROP TABLE IF EXISTS `employee`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `employee` (
`employeeid` int(11) NOT NULL AUTO_INCREMENT,
`lastname` varchar(35) NOT NULL,
`firstname` varchar(35) NOT NULL,
`gender` varchar(30) DEFAULT NULL,
`maritalstatus` varchar(30) DEFAULT NULL,
`nationality` varchar(50) NOT NULL,
`birthday` date NOT NULL,
`street` varchar(100) NOT NULL,
`postcodeid` int(11) NOT NULL,
`phone` varchar(50) DEFAULT NULL,
`mobilephone` varchar(50) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`identificationid` int(11) NOT NULL,
`jobstatusid` int(11) NOT NULL,
PRIMARY KEY (`employeeid`),
UNIQUE KEY `employee_unique` (`identificationid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `employee`
--
LOCK TABLES `employee` WRITE;
/*!40000 ALTER TABLE `employee` DISABLE KEYS */;
/*!40000 ALTER TABLE `employee` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `entities`
--
DROP TABLE IF EXISTS `entities`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `entities` (
`entityid` int(11) NOT NULL AUTO_INCREMENT,
`entity` varchar(35) NOT NULL,
PRIMARY KEY (`entityid`),
UNIQUE KEY `Entities_UNIQUE` (`entity`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `entities`
--
LOCK TABLES `entities` WRITE;
/*!40000 ALTER TABLE `entities` DISABLE KEYS */;
INSERT INTO `entities` VALUES
(1,'business'),
(3,'contactperson'),
(2,'employee'),
(4,'object');
/*!40000 ALTER TABLE `entities` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `identification`
--
DROP TABLE IF EXISTS `identification`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `identification` (
`identificationid` int(11) NOT NULL AUTO_INCREMENT,
`number` varchar(50) NOT NULL,
`expiry` date NOT NULL,
`issued` date NOT NULL,
`authority` varchar(50) NOT NULL,
`typeid` int(11) NOT NULL,
PRIMARY KEY (`identificationid`),
UNIQUE KEY `identification_unique` (`number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `identification`
--
LOCK TABLES `identification` WRITE;
/*!40000 ALTER TABLE `identification` DISABLE KEYS */;
/*!40000 ALTER TABLE `identification` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `identificationtype`
--
DROP TABLE IF EXISTS `identificationtype`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `identificationtype` (
`typeid` int(11) NOT NULL AUTO_INCREMENT,
`type` varchar(50) NOT NULL,
PRIMARY KEY (`typeid`),
UNIQUE KEY `identificationtype_unique` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `identificationtype`
--
LOCK TABLES `identificationtype` WRITE;
/*!40000 ALTER TABLE `identificationtype` DISABLE KEYS */;
/*!40000 ALTER TABLE `identificationtype` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `invoice`
--
DROP TABLE IF EXISTS `invoice`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `invoice` (
`invoiceid` int(11) NOT NULL AUTO_INCREMENT,
`issued` date NOT NULL COMMENT 'Rechnungsdatum',
`entry` date NOT NULL COMMENT 'Buchungsdatum',
`contractid` int(11) NOT NULL,
PRIMARY KEY (`invoiceid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `invoice`
--
LOCK TABLES `invoice` WRITE;
/*!40000 ALTER TABLE `invoice` DISABLE KEYS */;
/*!40000 ALTER TABLE `invoice` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `jobdetail`
--
DROP TABLE IF EXISTS `jobdetail`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `jobdetail` (
`jobdetailid` int(11) NOT NULL AUTO_INCREMENT,
`duration` decimal(10,0) NOT NULL,
`objectid` int(11) NOT NULL,
`period` varchar(15) NOT NULL,
`personnel` int(11) NOT NULL DEFAULT 1 COMMENT 'number of employees',
`price` decimal(10,0) NOT NULL,
PRIMARY KEY (`jobdetailid`),
UNIQUE KEY `jobdetail_unique` (`objectid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `jobdetail`
--
LOCK TABLES `jobdetail` WRITE;
/*!40000 ALTER TABLE `jobdetail` DISABLE KEYS */;
/*!40000 ALTER TABLE `jobdetail` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `jobstatus`
--
DROP TABLE IF EXISTS `jobstatus`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `jobstatus` (
`jobstatusid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(30) NOT NULL,
PRIMARY KEY (`jobstatusid`),
UNIQUE KEY `jobstatus_unique` (`description`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `jobstatus`
--
LOCK TABLES `jobstatus` WRITE;
/*!40000 ALTER TABLE `jobstatus` DISABLE KEYS */;
/*!40000 ALTER TABLE `jobstatus` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `logs`
--
DROP TABLE IF EXISTS `logs`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `logs` (
`logid` int(11) NOT NULL AUTO_INCREMENT,
`recordid` int(11) DEFAULT NULL,
`operationtype` varchar(100) NOT NULL,
`message` varchar(100) NOT NULL,
`logdate` datetime NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`logid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `logs`
--
LOCK TABLES `logs` WRITE;
/*!40000 ALTER TABLE `logs` DISABLE KEYS */;
/*!40000 ALTER TABLE `logs` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `medicalcare`
--
DROP TABLE IF EXISTS `medicalcare`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `medicalcare` (
`medicalcareid` int(11) NOT NULL AUTO_INCREMENT,
`company` varchar(50) NOT NULL,
PRIMARY KEY (`medicalcareid`),
UNIQUE KEY `medicalcare_unique` (`company`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `medicalcare`
--
LOCK TABLES `medicalcare` WRITE;
/*!40000 ALTER TABLE `medicalcare` DISABLE KEYS */;
/*!40000 ALTER TABLE `medicalcare` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `object`
--
DROP TABLE IF EXISTS `object`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `object` (
`objectid` int(11) NOT NULL AUTO_INCREMENT,
`street` varchar(100) NOT NULL,
`postcodeid` int(11) NOT NULL,
`contactpersonid` int(11) NOT NULL,
`businessid` int(11) NOT NULL,
PRIMARY KEY (`objectid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `object`
--
LOCK TABLES `object` WRITE;
/*!40000 ALTER TABLE `object` DISABLE KEYS */;
/*!40000 ALTER TABLE `object` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `offer`
--
DROP TABLE IF EXISTS `offer`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `offer` (
`offerid` int(11) NOT NULL AUTO_INCREMENT,
`jobdetailid` int(11) NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`offerid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `offer`
--
LOCK TABLES `offer` WRITE;
/*!40000 ALTER TABLE `offer` DISABLE KEYS */;
/*!40000 ALTER TABLE `offer` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `offers`
--
DROP TABLE IF EXISTS `offers`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `offers` (
`offerid` int(11) NOT NULL,
`contractid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Kreuztabelle Angebot - Auftrag';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `offers`
--
LOCK TABLES `offers` WRITE;
/*!40000 ALTER TABLE `offers` DISABLE KEYS */;
/*!40000 ALTER TABLE `offers` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `office`
--
DROP TABLE IF EXISTS `office`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `office` (
`officeid` int(11) NOT NULL AUTO_INCREMENT,
`office` varchar(50) NOT NULL COMMENT 'Kostenstelle',
PRIMARY KEY (`officeid`),
UNIQUE KEY `office_unique` (`office`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Kostenstelle';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `office`
--
LOCK TABLES `office` WRITE;
/*!40000 ALTER TABLE `office` DISABLE KEYS */;
/*!40000 ALTER TABLE `office` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `permissions`
--
DROP TABLE IF EXISTS `permissions`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `permissions` (
`permissionid` int(11) NOT NULL AUTO_INCREMENT,
`permission` varchar(50) NOT NULL,
PRIMARY KEY (`permissionid`),
UNIQUE KEY `berechtigungen_unique` (`permission`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `permissions`
--
LOCK TABLES `permissions` WRITE;
/*!40000 ALTER TABLE `permissions` DISABLE KEYS */;
INSERT INTO `permissions` VALUES
(4,'delete'),
(1,'read'),
(3,'update'),
(2,'write');
/*!40000 ALTER TABLE `permissions` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `personalrole`
--
DROP TABLE IF EXISTS `personalrole`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `personalrole` (
`employeeid` int(11) NOT NULL,
`roleid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Kreuztabelle';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `personalrole`
--
LOCK TABLES `personalrole` WRITE;
/*!40000 ALTER TABLE `personalrole` DISABLE KEYS */;
/*!40000 ALTER TABLE `personalrole` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `postcode`
--
DROP TABLE IF EXISTS `postcode`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `postcode` (
`postcodeid` int(11) NOT NULL AUTO_INCREMENT,
`postcode` varchar(15) NOT NULL,
`addressid` int(11) NOT NULL,
PRIMARY KEY (`postcodeid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `postcode`
--
LOCK TABLES `postcode` WRITE;
/*!40000 ALTER TABLE `postcode` DISABLE KEYS */;
/*!40000 ALTER TABLE `postcode` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `role`
--
DROP TABLE IF EXISTS `role`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `role` (
`roleid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(50) NOT NULL,
PRIMARY KEY (`roleid`),
UNIQUE KEY `role_unique` (`description`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `role`
--
LOCK TABLES `role` WRITE;
/*!40000 ALTER TABLE `role` DISABLE KEYS */;
INSERT INTO `role` VALUES
(1,'adminrole'),
(2,'userrole');
/*!40000 ALTER TABLE `role` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `roles`
--
DROP TABLE IF EXISTS `roles`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `roles` (
`roleid` int(11) NOT NULL,
`permissionid` int(11) NOT NULL,
`entityid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `roles`
--
LOCK TABLES `roles` WRITE;
/*!40000 ALTER TABLE `roles` DISABLE KEYS */;
INSERT INTO `roles` VALUES
(1,1,1),
(1,2,1),
(1,3,1),
(1,4,1),
(1,1,2),
(1,2,2),
(1,3,2),
(1,4,2),
(1,1,3),
(1,2,3),
(1,3,3),
(1,4,3),
(1,1,4),
(1,2,4),
(1,3,4),
(1,4,4),
(2,1,1),
(2,2,1),
(2,3,1),
(2,1,2),
(2,2,2),
(2,3,2),
(2,1,3),
(2,2,3),
(2,3,3),
(2,1,4),
(2,2,4),
(2,3,4);
/*!40000 ALTER TABLE `roles` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `salestax`
--
DROP TABLE IF EXISTS `salestax`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `salestax` (
`salestaxid` varchar(20) NOT NULL,
`businessid` int(11) NOT NULL,
PRIMARY KEY (`salestaxid`),
UNIQUE KEY `salestax_unique` (`businessid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `salestax`
--
LOCK TABLES `salestax` WRITE;
/*!40000 ALTER TABLE `salestax` DISABLE KEYS */;
/*!40000 ALTER TABLE `salestax` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `service`
--
DROP TABLE IF EXISTS `service`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `service` (
`servicetypeid` int(11) NOT NULL,
`servicedescid` int(11) NOT NULL,
`objectid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `service`
--
LOCK TABLES `service` WRITE;
/*!40000 ALTER TABLE `service` DISABLE KEYS */;
/*!40000 ALTER TABLE `service` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `servicedesc`
--
DROP TABLE IF EXISTS `servicedesc`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `servicedesc` (
`servicedescid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(1000) NOT NULL,
PRIMARY KEY (`servicedescid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `servicedesc`
--
LOCK TABLES `servicedesc` WRITE;
/*!40000 ALTER TABLE `servicedesc` DISABLE KEYS */;
/*!40000 ALTER TABLE `servicedesc` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `servicetype`
--
DROP TABLE IF EXISTS `servicetype`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `servicetype` (
`servicetypeid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(50) NOT NULL,
PRIMARY KEY (`servicetypeid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `servicetype`
--
LOCK TABLES `servicetype` WRITE;
/*!40000 ALTER TABLE `servicetype` DISABLE KEYS */;
/*!40000 ALTER TABLE `servicetype` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `socialsecurity`
--
DROP TABLE IF EXISTS `socialsecurity`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `socialsecurity` (
`employeeid` int(11) NOT NULL,
`socialsecurityno` varchar(30) NOT NULL,
`medicalcareid` int(11) NOT NULL,
UNIQUE KEY `socialsecurity_unique` (`employeeid`),
UNIQUE KEY `socialsecurity_unique_1` (`socialsecurityno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `socialsecurity`
--
LOCK TABLES `socialsecurity` WRITE;
/*!40000 ALTER TABLE `socialsecurity` DISABLE KEYS */;
/*!40000 ALTER TABLE `socialsecurity` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `tariff`
--
DROP TABLE IF EXISTS `tariff`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tariff` (
`tariffid` int(11) NOT NULL AUTO_INCREMENT,
`tariff` decimal(10,0) NOT NULL COMMENT 'Festgelegter Stundensatz',
PRIMARY KEY (`tariffid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Stundensatz Tabelle';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `tariff`
--
LOCK TABLES `tariff` WRITE;
/*!40000 ALTER TABLE `tariff` DISABLE KEYS */;
/*!40000 ALTER TABLE `tariff` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `timetrack`
--
DROP TABLE IF EXISTS `timetrack`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `timetrack` (
`employeeid` int(11) NOT NULL,
`start` datetime NOT NULL,
`stop` datetime NOT NULL,
`vacation` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `timetrack`
--
LOCK TABLES `timetrack` WRITE;
/*!40000 ALTER TABLE `timetrack` DISABLE KEYS */;
/*!40000 ALTER TABLE `timetrack` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `users`
--
DROP TABLE IF EXISTS `users`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `users` (
`usersid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(150) NOT NULL,
`enabled` tinyint(1) NOT NULL DEFAULT 1,
`roleid` int(11) NOT NULL,
`gecos` varchar(75) DEFAULT NULL,
PRIMARY KEY (`usersid`),
UNIQUE KEY `users_unique` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `users`
--
LOCK TABLES `users` WRITE;
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
/*!40000 ALTER TABLE `users` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Dumping routines for database 'pyqcrm'
--
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `addPermission` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `addPermission`(IN newpermission VARCHAR(50))
BEGIN
IF NOT EXISTS (SELECT 1 FROM permissions WHERE permission = newpermission) THEN
INSERT INTO permissions(permission) VALUES(newpermission);
END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `addRole` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `addRole`(IN newdescription VARCHAR(50))
BEGIN
IF NOT EXISTS (SELECT 1 FROM `role` WHERE description = newdescription) THEN
INSERT INTO `role`(description) VALUES(newdescription);
END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `createUser` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `createUser`(IN uname VARCHAR(35), IN password VARCHAR(150), IN gecos VARCHAR(75), IN admin BOOL)
BEGIN
DECLARE userrole INT;
SET userrole = 2;
IF admin = 1 THEN
SET userrole = 1;
END IF;
IF NOT EXISTS (SELECT 1 FROM users WHERE username = uname) THEN
INSERT INTO users(username, password, gecos, roleid) VALUES(uname, password, gecos, userrole);
END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `getBusiness` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `getBusiness`(IN businesstype VARCHAR(35))
BEGIN
SELECT * FROM business;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2024-11-26 13:49:32

View File

@@ -1,833 +0,0 @@
/*M!999999\- enable the sandbox mode */
-- MariaDB dump 10.19 Distrib 10.11.10-MariaDB, for Linux (x86_64)
--
-- Host: bearybot.selfhost.co Database: pyqcrm
-- ------------------------------------------------------
-- Server version 10.11.8-MariaDB-0ubuntu0.24.04.1
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `address`
--
DROP TABLE IF EXISTS `address`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `address` (
`addressid` int(11) NOT NULL AUTO_INCREMENT,
`country` varchar(50) DEFAULT NULL,
`city` varchar(500) NOT NULL,
PRIMARY KEY (`addressid`),
UNIQUE KEY `address_unique` (`city`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `assignment`
--
DROP TABLE IF EXISTS `assignment`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `assignment` (
`contractid` int(11) NOT NULL AUTO_INCREMENT,
`employeeid` int(11) NOT NULL,
UNIQUE KEY `assignment_unique` (`contractid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_estonian_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `business`
--
DROP TABLE IF EXISTS `business`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `business` (
`businessid` int(11) NOT NULL AUTO_INCREMENT,
`company` varchar(100) NOT NULL,
`street` varchar(100) NOT NULL,
`postcodeid` int(11) DEFAULT NULL,
`phone` varchar(50) DEFAULT NULL,
`mobilephone` varchar(50) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`homepage` varchar(255) DEFAULT NULL,
`director` varchar(100) DEFAULT NULL,
`contactpersonid` int(11) DEFAULT NULL,
`info` varchar(500) DEFAULT NULL,
`btid` int(11) DEFAULT 1,
`taxno` varchar(50) DEFAULT NULL,
PRIMARY KEY (`businessid`),
UNIQUE KEY `customer_unique` (`email`),
UNIQUE KEY `business_unique` (`taxno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `businesstype`
--
DROP TABLE IF EXISTS `businesstype`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `businesstype` (
`btypeID` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(35) NOT NULL,
PRIMARY KEY (`btypeID`),
UNIQUE KEY `businesstype_unique` (`description`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `contact`
--
DROP TABLE IF EXISTS `contact`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `contact` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`contactpersonid` int(11) NOT NULL,
`businessid` tinyint(1) NOT NULL DEFAULT 1,
UNIQUE KEY `contact_unique` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `contactperson`
--
DROP TABLE IF EXISTS `contactperson`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `contactperson` (
`contactpersonid` int(11) NOT NULL AUTO_INCREMENT,
`priorityid` int(11) DEFAULT NULL,
`lastname` varchar(35) NOT NULL,
`firstname` varchar(35) NOT NULL,
`phone` varchar(50) DEFAULT NULL,
`mobilephone` varchar(50) DEFAULT NULL,
`position` varchar(50) DEFAULT NULL,
`salutation` varchar(10) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`birthday` date DEFAULT NULL,
`active` tinyint(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`contactpersonid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `contract`
--
DROP TABLE IF EXISTS `contract`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `contract` (
`contractid` int(11) NOT NULL AUTO_INCREMENT,
`jobdetailid` int(11) NOT NULL,
`tariffid` int(11) NOT NULL,
`officeid` int(11) NOT NULL COMMENT 'Kostenstelle',
`date` date NOT NULL,
PRIMARY KEY (`contractid`),
UNIQUE KEY `contract_unique` (`jobdetailid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Temporary table structure for view `customerinfo`
--
DROP TABLE IF EXISTS `customerinfo`;
/*!50001 DROP VIEW IF EXISTS `customerinfo`*/;
SET @saved_cs_client = @@character_set_client;
SET character_set_client = utf8;
/*!50001 CREATE VIEW `customerinfo` AS SELECT
1 AS `BusinessId`,
1 AS `Kundenname`,
1 AS `Straße`,
1 AS `PLZ`,
1 AS `Ort`,
1 AS `Anrede`,
1 AS `Ansprechpartner` */;
SET character_set_client = @saved_cs_client;
--
-- Table structure for table `employee`
--
DROP TABLE IF EXISTS `employee`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `employee` (
`employeeid` int(11) NOT NULL AUTO_INCREMENT,
`lastname` varchar(35) NOT NULL,
`firstname` varchar(35) NOT NULL,
`gender` varchar(30) DEFAULT NULL,
`maritalstatus` varchar(30) DEFAULT NULL,
`nationality` varchar(50) NOT NULL,
`birthday` date NOT NULL,
`street` varchar(100) NOT NULL,
`postcodeid` int(11) NOT NULL,
`phone` varchar(50) DEFAULT NULL,
`mobilephone` varchar(50) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`identificationid` int(11) NOT NULL,
`jobstatusid` int(11) NOT NULL,
PRIMARY KEY (`employeeid`),
UNIQUE KEY `employee_unique` (`identificationid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `entities`
--
DROP TABLE IF EXISTS `entities`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `entities` (
`entityid` int(11) NOT NULL AUTO_INCREMENT,
`entity` varchar(35) NOT NULL,
PRIMARY KEY (`entityid`),
UNIQUE KEY `Entities_UNIQUE` (`entity`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `identification`
--
DROP TABLE IF EXISTS `identification`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `identification` (
`identificationid` int(11) NOT NULL AUTO_INCREMENT,
`number` varchar(50) NOT NULL,
`expiry` date NOT NULL,
`issued` date NOT NULL,
`authority` varchar(50) NOT NULL,
`typeid` int(11) NOT NULL,
PRIMARY KEY (`identificationid`),
UNIQUE KEY `identification_unique` (`number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `identificationtype`
--
DROP TABLE IF EXISTS `identificationtype`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `identificationtype` (
`typeid` int(11) NOT NULL AUTO_INCREMENT,
`type` varchar(50) NOT NULL,
PRIMARY KEY (`typeid`),
UNIQUE KEY `identificationtype_unique` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `invoice`
--
DROP TABLE IF EXISTS `invoice`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `invoice` (
`invoiceid` int(11) NOT NULL AUTO_INCREMENT,
`issued` date NOT NULL COMMENT 'Rechnungsdatum',
`entry` date NOT NULL COMMENT 'Buchungsdatum',
`contractid` int(11) NOT NULL,
PRIMARY KEY (`invoiceid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `jobdetail`
--
DROP TABLE IF EXISTS `jobdetail`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `jobdetail` (
`jobdetailid` int(11) NOT NULL AUTO_INCREMENT,
`duration` decimal(10,0) NOT NULL,
`objectid` int(11) NOT NULL,
`period` varchar(15) NOT NULL,
`personnel` int(11) NOT NULL DEFAULT 1 COMMENT 'number of employees',
`price` decimal(10,0) NOT NULL,
PRIMARY KEY (`jobdetailid`),
UNIQUE KEY `jobdetail_unique` (`objectid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `jobstatus`
--
DROP TABLE IF EXISTS `jobstatus`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `jobstatus` (
`jobstatusid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(30) NOT NULL,
PRIMARY KEY (`jobstatusid`),
UNIQUE KEY `jobstatus_unique` (`description`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `logs`
--
DROP TABLE IF EXISTS `logs`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `logs` (
`logid` int(11) NOT NULL AUTO_INCREMENT,
`recordid` int(11) DEFAULT NULL,
`operationtype` varchar(100) NOT NULL,
`message` varchar(100) NOT NULL,
`logdate` datetime NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`logid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `medicalcare`
--
DROP TABLE IF EXISTS `medicalcare`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `medicalcare` (
`medicalcareid` int(11) NOT NULL AUTO_INCREMENT,
`company` varchar(50) NOT NULL,
PRIMARY KEY (`medicalcareid`),
UNIQUE KEY `medicalcare_unique` (`company`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `object`
--
DROP TABLE IF EXISTS `object`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `object` (
`objectid` int(11) NOT NULL AUTO_INCREMENT,
`street` varchar(100) NOT NULL,
`postcodeid` int(11) NOT NULL,
`contactpersonid` int(11) NOT NULL,
`businessid` int(11) NOT NULL,
PRIMARY KEY (`objectid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `offer`
--
DROP TABLE IF EXISTS `offer`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `offer` (
`offerid` int(11) NOT NULL AUTO_INCREMENT,
`jobdetailid` int(11) NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`offerid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `offers`
--
DROP TABLE IF EXISTS `offers`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `offers` (
`offerid` int(11) NOT NULL,
`contractid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Kreuztabelle Angebot - Auftrag';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `office`
--
DROP TABLE IF EXISTS `office`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `office` (
`officeid` int(11) NOT NULL AUTO_INCREMENT,
`office` varchar(50) NOT NULL COMMENT 'Kostenstelle',
PRIMARY KEY (`officeid`),
UNIQUE KEY `office_unique` (`office`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Kostenstelle';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `permissions`
--
DROP TABLE IF EXISTS `permissions`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `permissions` (
`permissionid` int(11) NOT NULL AUTO_INCREMENT,
`permission` varchar(50) NOT NULL,
PRIMARY KEY (`permissionid`),
UNIQUE KEY `berechtigungen_unique` (`permission`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `personalrole`
--
DROP TABLE IF EXISTS `personalrole`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `personalrole` (
`employeeid` int(11) NOT NULL,
`roleid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Kreuztabelle';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `postcode`
--
DROP TABLE IF EXISTS `postcode`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `postcode` (
`postcodeid` int(11) NOT NULL AUTO_INCREMENT,
`postcode` varchar(15) NOT NULL,
`addressid` int(11) NOT NULL,
PRIMARY KEY (`postcodeid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `role`
--
DROP TABLE IF EXISTS `role`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `role` (
`roleid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(50) NOT NULL,
PRIMARY KEY (`roleid`),
UNIQUE KEY `role_unique` (`description`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `roles`
--
DROP TABLE IF EXISTS `roles`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `roles` (
`roleid` int(11) NOT NULL,
`permissionid` int(11) NOT NULL,
`entityid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `salestax`
--
DROP TABLE IF EXISTS `salestax`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `salestax` (
`salestaxid` varchar(20) NOT NULL,
`businessid` int(11) NOT NULL,
PRIMARY KEY (`salestaxid`),
UNIQUE KEY `salestax_unique` (`businessid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `service`
--
DROP TABLE IF EXISTS `service`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `service` (
`servicetypeid` int(11) NOT NULL,
`servicedescid` int(11) NOT NULL,
`objectid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `servicedesc`
--
DROP TABLE IF EXISTS `servicedesc`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `servicedesc` (
`servicedescid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(1000) NOT NULL,
PRIMARY KEY (`servicedescid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `servicetype`
--
DROP TABLE IF EXISTS `servicetype`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `servicetype` (
`servicetypeid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(50) NOT NULL,
PRIMARY KEY (`servicetypeid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `socialsecurity`
--
DROP TABLE IF EXISTS `socialsecurity`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `socialsecurity` (
`employeeid` int(11) NOT NULL,
`socialsecurityno` varchar(30) NOT NULL,
`medicalcareid` int(11) NOT NULL,
UNIQUE KEY `socialsecurity_unique` (`employeeid`),
UNIQUE KEY `socialsecurity_unique_1` (`socialsecurityno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `tariff`
--
DROP TABLE IF EXISTS `tariff`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tariff` (
`tariffid` int(11) NOT NULL AUTO_INCREMENT,
`tariff` decimal(10,0) NOT NULL COMMENT 'Festgelegter Stundensatz',
PRIMARY KEY (`tariffid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Stundensatz Tabelle';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `timetrack`
--
DROP TABLE IF EXISTS `timetrack`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `timetrack` (
`employeeid` int(11) NOT NULL,
`start` datetime NOT NULL,
`stop` datetime NOT NULL,
`vacation` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `users`
--
DROP TABLE IF EXISTS `users`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `users` (
`usersid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(161) NOT NULL,
`enabled` tinyint(1) NOT NULL DEFAULT 1,
`roleid` int(11) NOT NULL,
`gecos` varchar(75) DEFAULT NULL,
PRIMARY KEY (`usersid`),
UNIQUE KEY `users_unique` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping routines for database 'pyqcrm'
--
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `addBusiness` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `addBusiness`(new_business JSON)
BEGIN
DECLARE v_company VARCHAR(100);
DECLARE v_street VARCHAR(100);
DECLARE v_postcode INT(11);
DECLARE v_phone VARCHAR(50);
DECLARE v_cell VARCHAR(50);
DECLARE v_email VARCHAR(255);
DECLARE v_homepage VARCHAR(255);
DECLARE v_director VARCHAR(100);
DECLARE v_contactperson VARCHAR(100);
DECLARE v_info VARCHAR(500);
DECLARE v_taxno VARCHAR(50);
DECLARE v_bt VARCHAR(50);
SET v_company = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.business'));
SET v_street = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.street'));
SET v_postcode = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.postcode'));
SET v_phone = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.telephone'));
SET v_cell = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.mobilephone'));
SET v_email = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.email'));
SET v_homepage = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.homepage'));
SET v_director = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.ceo'));
SET v_contactperson = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.'));
SET v_info = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.customerinfo'));
SET v_taxno = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.taxno'));
SET v_bt = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.typeid'));
-- INSERT INTO business(company, street, postcodeid, phone, mobilephone, email,
-- homepage, director, contactperson, info, taxno, btid)
-- VALUES (v_company, v_street, v_postcodeid, v_phone,v_cell,
-- v_email,v_homepage, v_director, v_contactpersonid, v_info, v_taxno, v_bt);
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `addPermission` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `addPermission`(IN newpermission VARCHAR(50))
BEGIN
IF NOT EXISTS (SELECT 1 FROM permissions WHERE permission = newpermission) THEN
INSERT INTO permissions(permission) VALUES(newpermission);
END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `addRole` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `addRole`(IN newdescription VARCHAR(50))
BEGIN
IF NOT EXISTS (SELECT 1 FROM `role` WHERE description = newdescription) THEN
INSERT INTO `role`(description) VALUES(newdescription);
END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `addZipCodes` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `addZipCodes`(IN zipcode VARCHAR(15), IN town VARCHAR(500))
BEGIN
DECLARE zip_town INT;
IF NOT EXISTS (SELECT 1 FROM address WHERE city = town) THEN
INSERT INTO address(country, city) VALUES("Deutschland", town);
SET zip_town = LAST_INSERT_ID();
ELSE
SELECT addressid INTO zip_town FROM address WHERE city = town;
END IF;
IF NOT EXISTS (SELECT 1 FROM postcode WHERE postcode = zipcode) THEN
INSERT INTO postcode(postcode, addressid) VALUES(zipcode, zip_town);
END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `checkAdmin` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `checkAdmin`()
BEGIN
SELECT 1 FROM users WHERE roleid = 1 AND enabled = TRUE LIMIT 1;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `createUser` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `createUser`(IN uname VARCHAR(35), IN password VARCHAR(161), IN gecos VARCHAR(75), IN admin BOOL)
BEGIN
DECLARE userrole INT;
SET userrole = 2;
IF admin = 1 THEN
SET userrole = 1;
END IF;
IF NOT EXISTS (SELECT 1 FROM users WHERE username = uname) THEN
INSERT INTO users(username, password, gecos, roleid) VALUES(uname, password, gecos, userrole);
ELSE
SIGNAL SQLSTATE '45000' SET
MESSAGE_TEXT = 'Username already in use';
END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `getBusiness` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `getBusiness`(IN businesstype VARCHAR(35))
BEGIN
SELECT * FROM business;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `getCustomerView` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `getCustomerView`()
BEGIN
SELECT * FROM customerinfo ORDER BY Kundenname ASC;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `getUser` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `getUser`( IN uname VARCHAR(50))
BEGIN
SELECT * FROM users WHERE username = uname AND enabled = 1;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
--
-- Final view structure for view `customerinfo`
--
/*!50001 DROP VIEW IF EXISTS `customerinfo`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = utf8mb4 */;
/*!50001 SET character_set_results = utf8mb4 */;
/*!50001 SET collation_connection = utf8mb4_general_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`pyqcrm`@`%` SQL SECURITY DEFINER */
/*!50001 VIEW `customerinfo` AS select `bt`.`businessid` AS `BusinessId`,coalesce(`bt`.`company`,'') AS `Kundenname`,coalesce(`bt`.`street`,'') AS `Straße`,coalesce(`pt`.`postcode`,'') AS `PLZ`,coalesce(`at`.`city`,'') AS `Ort`,coalesce(`ct`.`salutation`,'') AS `Anrede`,coalesce(concat(`ct`.`firstname`,' ',`ct`.`lastname`),'') AS `Ansprechpartner` from ((((`business` `bt` left join `postcode` `pt` on(`bt`.`postcodeid` = `pt`.`postcodeid`)) left join `address` `at` on(`pt`.`addressid` = `at`.`addressid`)) left join `contact` `cct` on(`cct`.`businessid` = `bt`.`businessid`)) left join `contactperson` `ct` on(`ct`.`contactpersonid` = `cct`.`contactpersonid`)) */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2024-12-05 15:36:34

View File

@@ -1,832 +0,0 @@
/*M!999999\- enable the sandbox mode */
-- MariaDB dump 10.19 Distrib 10.11.10-MariaDB, for Linux (x86_64)
--
-- Host: bearybot.selfhost.co Database: pyqcrm
-- ------------------------------------------------------
-- Server version 10.11.8-MariaDB-0ubuntu0.24.04.1
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `address`
--
DROP TABLE IF EXISTS `address`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `address` (
`addressid` int(11) NOT NULL AUTO_INCREMENT,
`country` varchar(50) DEFAULT NULL,
`city` varchar(50) NOT NULL,
PRIMARY KEY (`addressid`)
) ENGINE=InnoDB AUTO_INCREMENT=7042 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `assignment`
--
DROP TABLE IF EXISTS `assignment`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `assignment` (
`contractid` int(11) NOT NULL AUTO_INCREMENT,
`employeeid` int(11) NOT NULL,
UNIQUE KEY `assignment_unique` (`contractid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_estonian_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `business`
--
DROP TABLE IF EXISTS `business`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `business` (
`businessid` int(11) NOT NULL AUTO_INCREMENT,
`company` varchar(100) NOT NULL,
`street` varchar(100) NOT NULL,
`postcodeid` int(11) DEFAULT NULL,
`phone` varchar(50) DEFAULT NULL,
`mobilephone` varchar(50) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`homepage` varchar(255) DEFAULT NULL,
`director` varchar(100) DEFAULT NULL,
`contactpersonid` int(11) DEFAULT NULL,
`info` varchar(500) DEFAULT NULL,
`btid` int(11) DEFAULT 1,
`taxno` varchar(50) DEFAULT NULL,
PRIMARY KEY (`businessid`),
UNIQUE KEY `customer_unique` (`email`),
UNIQUE KEY `business_unique` (`taxno`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `businesstype`
--
DROP TABLE IF EXISTS `businesstype`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `businesstype` (
`btypeID` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(35) NOT NULL,
PRIMARY KEY (`btypeID`),
UNIQUE KEY `businesstype_unique` (`description`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `contact`
--
DROP TABLE IF EXISTS `contact`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `contact` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`contactpersonid` int(11) NOT NULL,
`businessid` tinyint(1) NOT NULL DEFAULT 1,
UNIQUE KEY `contact_unique` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `contactperson`
--
DROP TABLE IF EXISTS `contactperson`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `contactperson` (
`contactpersonid` int(11) NOT NULL AUTO_INCREMENT,
`priorityid` int(11) DEFAULT NULL,
`lastname` varchar(35) NOT NULL,
`firstname` varchar(35) NOT NULL,
`phone` varchar(50) DEFAULT NULL,
`mobilephone` varchar(50) DEFAULT NULL,
`position` varchar(50) DEFAULT NULL,
`salutation` varchar(10) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`birthday` date DEFAULT NULL,
`active` tinyint(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`contactpersonid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `contract`
--
DROP TABLE IF EXISTS `contract`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `contract` (
`contractid` int(11) NOT NULL AUTO_INCREMENT,
`jobdetailid` int(11) NOT NULL,
`tariffid` int(11) NOT NULL,
`officeid` int(11) NOT NULL COMMENT 'Kostenstelle',
`date` date NOT NULL,
PRIMARY KEY (`contractid`),
UNIQUE KEY `contract_unique` (`jobdetailid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Temporary table structure for view `customerinfo`
--
DROP TABLE IF EXISTS `customerinfo`;
/*!50001 DROP VIEW IF EXISTS `customerinfo`*/;
SET @saved_cs_client = @@character_set_client;
SET character_set_client = utf8;
/*!50001 CREATE VIEW `customerinfo` AS SELECT
1 AS `BusinessId`,
1 AS `Kundenname`,
1 AS `Straße`,
1 AS `PLZ`,
1 AS `Ort`,
1 AS `Anrede`,
1 AS `Ansprechpartner` */;
SET character_set_client = @saved_cs_client;
--
-- Table structure for table `employee`
--
DROP TABLE IF EXISTS `employee`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `employee` (
`employeeid` int(11) NOT NULL AUTO_INCREMENT,
`lastname` varchar(35) NOT NULL,
`firstname` varchar(35) NOT NULL,
`gender` varchar(30) DEFAULT NULL,
`maritalstatus` varchar(30) DEFAULT NULL,
`nationality` varchar(50) NOT NULL,
`birthday` date NOT NULL,
`street` varchar(100) NOT NULL,
`postcodeid` int(11) NOT NULL,
`phone` varchar(50) DEFAULT NULL,
`mobilephone` varchar(50) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`identificationid` int(11) NOT NULL,
`jobstatusid` int(11) NOT NULL,
PRIMARY KEY (`employeeid`),
UNIQUE KEY `employee_unique` (`identificationid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `entities`
--
DROP TABLE IF EXISTS `entities`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `entities` (
`entityid` int(11) NOT NULL AUTO_INCREMENT,
`entity` varchar(35) NOT NULL,
PRIMARY KEY (`entityid`),
UNIQUE KEY `Entities_UNIQUE` (`entity`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `identification`
--
DROP TABLE IF EXISTS `identification`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `identification` (
`identificationid` int(11) NOT NULL AUTO_INCREMENT,
`number` varchar(50) NOT NULL,
`expiry` date NOT NULL,
`issued` date NOT NULL,
`authority` varchar(50) NOT NULL,
`typeid` int(11) NOT NULL,
PRIMARY KEY (`identificationid`),
UNIQUE KEY `identification_unique` (`number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `identificationtype`
--
DROP TABLE IF EXISTS `identificationtype`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `identificationtype` (
`typeid` int(11) NOT NULL AUTO_INCREMENT,
`type` varchar(50) NOT NULL,
PRIMARY KEY (`typeid`),
UNIQUE KEY `identificationtype_unique` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `invoice`
--
DROP TABLE IF EXISTS `invoice`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `invoice` (
`invoiceid` int(11) NOT NULL AUTO_INCREMENT,
`issued` date NOT NULL COMMENT 'Rechnungsdatum',
`entry` date NOT NULL COMMENT 'Buchungsdatum',
`contractid` int(11) NOT NULL,
PRIMARY KEY (`invoiceid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `jobdetail`
--
DROP TABLE IF EXISTS `jobdetail`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `jobdetail` (
`jobdetailid` int(11) NOT NULL AUTO_INCREMENT,
`duration` decimal(10,0) NOT NULL,
`objectid` int(11) NOT NULL,
`period` varchar(15) NOT NULL,
`personnel` int(11) NOT NULL DEFAULT 1 COMMENT 'number of employees',
`price` decimal(10,0) NOT NULL,
PRIMARY KEY (`jobdetailid`),
UNIQUE KEY `jobdetail_unique` (`objectid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `jobstatus`
--
DROP TABLE IF EXISTS `jobstatus`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `jobstatus` (
`jobstatusid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(30) NOT NULL,
PRIMARY KEY (`jobstatusid`),
UNIQUE KEY `jobstatus_unique` (`description`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `logs`
--
DROP TABLE IF EXISTS `logs`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `logs` (
`logid` int(11) NOT NULL AUTO_INCREMENT,
`recordid` int(11) DEFAULT NULL,
`operationtype` varchar(100) NOT NULL,
`message` varchar(100) NOT NULL,
`logdate` datetime NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`logid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `medicalcare`
--
DROP TABLE IF EXISTS `medicalcare`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `medicalcare` (
`medicalcareid` int(11) NOT NULL AUTO_INCREMENT,
`company` varchar(50) NOT NULL,
PRIMARY KEY (`medicalcareid`),
UNIQUE KEY `medicalcare_unique` (`company`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `object`
--
DROP TABLE IF EXISTS `object`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `object` (
`objectid` int(11) NOT NULL AUTO_INCREMENT,
`street` varchar(100) NOT NULL,
`postcodeid` int(11) NOT NULL,
`contactpersonid` int(11) NOT NULL,
`businessid` int(11) NOT NULL,
PRIMARY KEY (`objectid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `offer`
--
DROP TABLE IF EXISTS `offer`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `offer` (
`offerid` int(11) NOT NULL AUTO_INCREMENT,
`jobdetailid` int(11) NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`offerid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `offers`
--
DROP TABLE IF EXISTS `offers`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `offers` (
`offerid` int(11) NOT NULL,
`contractid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Kreuztabelle Angebot - Auftrag';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `office`
--
DROP TABLE IF EXISTS `office`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `office` (
`officeid` int(11) NOT NULL AUTO_INCREMENT,
`office` varchar(50) NOT NULL COMMENT 'Kostenstelle',
PRIMARY KEY (`officeid`),
UNIQUE KEY `office_unique` (`office`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Kostenstelle';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `permissions`
--
DROP TABLE IF EXISTS `permissions`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `permissions` (
`permissionid` int(11) NOT NULL AUTO_INCREMENT,
`permission` varchar(50) NOT NULL,
PRIMARY KEY (`permissionid`),
UNIQUE KEY `berechtigungen_unique` (`permission`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `personalrole`
--
DROP TABLE IF EXISTS `personalrole`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `personalrole` (
`employeeid` int(11) NOT NULL,
`roleid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Kreuztabelle';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `postcode`
--
DROP TABLE IF EXISTS `postcode`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `postcode` (
`postcodeid` int(11) NOT NULL AUTO_INCREMENT,
`postcode` varchar(15) NOT NULL,
`addressid` int(11) NOT NULL,
PRIMARY KEY (`postcodeid`)
) ENGINE=InnoDB AUTO_INCREMENT=8888 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `role`
--
DROP TABLE IF EXISTS `role`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `role` (
`roleid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(50) NOT NULL,
PRIMARY KEY (`roleid`),
UNIQUE KEY `role_unique` (`description`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `roles`
--
DROP TABLE IF EXISTS `roles`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `roles` (
`roleid` int(11) NOT NULL,
`permissionid` int(11) NOT NULL,
`entityid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `salestax`
--
DROP TABLE IF EXISTS `salestax`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `salestax` (
`salestaxid` varchar(20) NOT NULL,
`businessid` int(11) NOT NULL,
PRIMARY KEY (`salestaxid`),
UNIQUE KEY `salestax_unique` (`businessid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `service`
--
DROP TABLE IF EXISTS `service`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `service` (
`servicetypeid` int(11) NOT NULL,
`servicedescid` int(11) NOT NULL,
`objectid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `servicedesc`
--
DROP TABLE IF EXISTS `servicedesc`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `servicedesc` (
`servicedescid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(1000) NOT NULL,
PRIMARY KEY (`servicedescid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `servicetype`
--
DROP TABLE IF EXISTS `servicetype`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `servicetype` (
`servicetypeid` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(50) NOT NULL,
PRIMARY KEY (`servicetypeid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `socialsecurity`
--
DROP TABLE IF EXISTS `socialsecurity`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `socialsecurity` (
`employeeid` int(11) NOT NULL,
`socialsecurityno` varchar(30) NOT NULL,
`medicalcareid` int(11) NOT NULL,
UNIQUE KEY `socialsecurity_unique` (`employeeid`),
UNIQUE KEY `socialsecurity_unique_1` (`socialsecurityno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `tariff`
--
DROP TABLE IF EXISTS `tariff`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tariff` (
`tariffid` int(11) NOT NULL AUTO_INCREMENT,
`tariff` decimal(10,0) NOT NULL COMMENT 'Festgelegter Stundensatz',
PRIMARY KEY (`tariffid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Stundensatz Tabelle';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `timetrack`
--
DROP TABLE IF EXISTS `timetrack`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `timetrack` (
`employeeid` int(11) NOT NULL,
`start` datetime NOT NULL,
`stop` datetime NOT NULL,
`vacation` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `users`
--
DROP TABLE IF EXISTS `users`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `users` (
`usersid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(161) NOT NULL,
`enabled` tinyint(1) NOT NULL DEFAULT 1,
`roleid` int(11) NOT NULL,
`gecos` varchar(75) DEFAULT NULL,
PRIMARY KEY (`usersid`),
UNIQUE KEY `users_unique` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping routines for database 'pyqcrm'
--
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `addBusiness` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `addBusiness`(new_business JSON)
BEGIN
DECLARE v_company VARCHAR(100);
DECLARE v_street VARCHAR(100);
DECLARE v_postcode INT(11);
DECLARE v_phone VARCHAR(50);
DECLARE v_cell VARCHAR(50);
DECLARE v_email VARCHAR(255);
DECLARE v_homepage VARCHAR(255);
DECLARE v_director VARCHAR(100);
DECLARE v_contactperson VARCHAR(100);
DECLARE v_info VARCHAR(500);
DECLARE v_taxno VARCHAR(50);
DECLARE v_bt VARCHAR(50);
SET v_company = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.business'));
SET v_street = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.street'));
SET v_postcode = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.postcode'));
SET v_phone = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.telephone'));
SET v_cell = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.mobilephone'));
SET v_email = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.email'));
SET v_homepage = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.homepage'));
SET v_director = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.ceo'));
SET v_contactperson = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.'));
SET v_info = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.customerinfo'));
SET v_taxno = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.taxno'));
SET v_bt = JSON_UNQUOTE(JSON_EXTRACT(new_business, '$.typeid'));
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `addPermission` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `addPermission`(IN newpermission VARCHAR(50))
BEGIN
IF NOT EXISTS (SELECT 1 FROM permissions WHERE permission = newpermission) THEN
INSERT INTO permissions(permission) VALUES(newpermission);
END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `addRole` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `addRole`(IN newdescription VARCHAR(50))
BEGIN
IF NOT EXISTS (SELECT 1 FROM `role` WHERE description = newdescription) THEN
INSERT INTO `role`(description) VALUES(newdescription);
END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `addZipCodes` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `addZipCodes`(IN zipcode VARCHAR(15), IN town VARCHAR(500))
BEGIN
DECLARE zip_town INT;
IF NOT EXISTS (SELECT 1 FROM address WHERE city = town) THEN
INSERT INTO address(country, city) VALUES("Deutschland", town);
SET zip_town = LAST_INSERT_ID();
ELSE
SELECT addressid INTO zip_town FROM address WHERE city = town;
END IF;
IF NOT EXISTS (SELECT 1 FROM postcode WHERE postcode = zipcode) THEN
INSERT INTO postcode(postcode, addressid) VALUES(zipcode, zip_town);
END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `checkAdmin` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `checkAdmin`()
BEGIN
SELECT 1 FROM users WHERE roleid = 1 AND enabled = TRUE LIMIT 1;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `createUser` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `createUser`(IN uname VARCHAR(35), IN password VARCHAR(161), IN gecos VARCHAR(75), IN admin BOOL)
BEGIN
DECLARE userrole INT;
SET userrole = 2;
IF admin = 1 THEN
SET userrole = 1;
END IF;
IF NOT EXISTS (SELECT 1 FROM users WHERE username = uname) THEN
INSERT INTO users(username, password, gecos, roleid) VALUES(uname, password, gecos, userrole);
ELSE
SIGNAL SQLSTATE '45000' SET
MESSAGE_TEXT = 'Username already in use';
END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `getBusiness` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `getBusiness`(IN businesstype VARCHAR(35))
BEGIN
SELECT * FROM business;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `getCustomerView` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `getCustomerView`()
BEGIN
SELECT * FROM customerinfo ORDER BY Kundenname ASC;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `getUser` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
DELIMITER ;;
CREATE DEFINER=`pyqcrm`@`%` PROCEDURE `getUser`( IN uname VARCHAR(50))
BEGIN
SELECT * FROM users WHERE username = uname AND enabled = 1;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
--
-- Final view structure for view `customerinfo`
--
/*!50001 DROP VIEW IF EXISTS `customerinfo`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = utf8mb4 */;
/*!50001 SET character_set_results = utf8mb4 */;
/*!50001 SET collation_connection = utf8mb4_general_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`pyqcrm`@`%` SQL SECURITY DEFINER */
/*!50001 VIEW `customerinfo` AS select `bt`.`businessid` AS `BusinessId`,coalesce(`bt`.`company`,'') AS `Kundenname`,coalesce(`bt`.`street`,'') AS `Straße`,coalesce(`pt`.`postcode`,'') AS `PLZ`,coalesce(`at`.`city`,'') AS `Ort`,coalesce(`ct`.`salutation`,'') AS `Anrede`,coalesce(concat(`ct`.`firstname`,' ',`ct`.`lastname`),'') AS `Ansprechpartner` from ((((`business` `bt` left join `postcode` `pt` on(`bt`.`postcodeid` = `pt`.`postcodeid`)) left join `address` `at` on(`pt`.`addressid` = `at`.`addressid`)) left join `contact` `cct` on(`cct`.`businessid` = `bt`.`businessid`)) left join `contactperson` `ct` on(`ct`.`contactpersonid` = `cct`.`contactpersonid`)) */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2024-12-05 16:40:40

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

BIN
doc/design/TERO CRM.penpot Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

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