diff --git a/.gitignore b/.gitignore
index 55d0973..188f5c9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -53,4 +53,6 @@ compile_commands.json
*_qmlcache.qrc
-build/
\ No newline at end of file
+build
+debug
+config.cfg
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6015eb1..23498f6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,5 +28,6 @@ target_link_libraries(EinsatzplanQT PRIVATE
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Sql
fmt
+ pqxx
stdc++fs
)
diff --git a/README b/README
new file mode 100644
index 0000000..316fe18
--- /dev/null
+++ b/README
@@ -0,0 +1,2 @@
+Code written with libpqxx-version 7.4.1
+install-guide: http://en.wiki.imlint.org/Pqxx_tutorial
diff --git a/assets/account-box.png b/assets/account-box.png
new file mode 100644
index 0000000..d911744
Binary files /dev/null and b/assets/account-box.png differ
diff --git a/assets/resources.qrc b/assets/resources.qrc
new file mode 100644
index 0000000..efe227b
--- /dev/null
+++ b/assets/resources.qrc
@@ -0,0 +1,5 @@
+
+
+ account-box.png
+
+
diff --git a/script.sql b/script.sql
new file mode 100644
index 0000000..dc2a8b4
--- /dev/null
+++ b/script.sql
@@ -0,0 +1,151 @@
+
+DROP VIEW studenten_veranstalter;
+DROP TABLE Veranstalter_Veranstaltung_Uhrzeit;
+DROP TABLE Studenten;
+DROP TABLE Veranstalter;
+DROP TABLE Uhrzeit;
+DROP TABLE veranstaltung;
+DROP SEQUENCE global_id_seq;
+
+
+
+
+
+CREATE SEQUENCE global_id_seq;
+
+CREATE TABLE Studenten (
+ matrikelnummer INTEGER PRIMARY KEY DEFAULT nextval('global_id_seq'),
+ name VARCHAR(30) NOT NULL,
+ email VARCHAR(30) NOT NULL,
+ passwort VARCHAR(30) NOT NULL
+);
+
+
+CREATE OR REPLACE FUNCTION random_between_two()
+RETURNS VARCHAR AS $$
+BEGIN
+ IF random() < 0.5 THEN
+ RETURN 'A';
+ ELSE
+ RETURN 'B';
+ END IF;
+END;
+$$ LANGUAGE plpgsql;
+
+
+CREATE TABLE Veranstalter (
+ ID INTEGER PRIMARY KEY DEFAULT nextval('global_id_seq'),
+ name VARCHAR(30),
+ email VARCHAR(30),
+ passwort VARCHAR(30),
+ arbeitszeit INTEGER DEFAULT 0,
+ standort VARCHAR(30) DEFAULT random_between_two(),
+ krank BOOLEAN DEFAULT FALSE,
+ admin BOOLEAN NOT NULL DEFAULT FALSE
+);
+
+
+
+
+
+ CREATE VIEW studenten_veranstalter AS
+ SELECT matrikelnummer AS id, passwort, NULL AS admin FROM Studenten
+ UNION ALL
+ SELECT ID, passwort, admin FROM Veranstalter;
+
+
+
+ CREATE TABLE Veranstaltung (
+ ID SERIAL PRIMARY KEY,
+ ort VARCHAR(30) NOT NULL,
+ raum INTEGER NOT NULL,
+ name VARCHAR(90) NOT NULL,
+ dauer INTEGER NOT NULL
+ );
+
+
+
+
+ CREATE TABLE Uhrzeit (
+ ID SERIAL PRIMARY KEY,
+ anfangszeit TIME NOT NULL,
+ endzeit TIME NOT NULL );
+
+
+
+ INSERT INTO Uhrzeit (anfangszeit, endzeit) VALUES
+ ('08:00:00', '10:00:00'),
+ ('10:00:00', '12:00:00'),
+ ('12:00:00', '14:00:00'),
+ ('14:00:00', '16:00:00'),
+ ('16:00:00', '18:00:00');
+
+
+ CREATE TABLE Veranstalter_Veranstaltung_Uhrzeit (
+ uhrzeit_ID INTEGER REFERENCES Uhrzeit(ID),
+ tag INTEGER NOT NULL,
+ veranstalter_ID INTEGER REFERENCES Veranstalter(ID),
+ veranstaltung_ID INTEGER REFERENCES Veranstaltung(ID),
+ PRIMARY KEY(uhrzeit_ID, tag)
+ );
+
+
+ INSERT INTO Veranstalter (name, email, passwort, admin) VALUES
+ ('tech_guru', 'admin@example.com', 'password123', TRUE),
+('code_master', 'user1@example.com', 'password1', FALSE),
+('binary_hero', 'user2@example.com', 'password2', FALSE),
+('debug_ninja', 'user3@example.com', 'password3', FALSE),
+('data_wizard', 'user4@example.com', 'password4', FALSE),
+('script_samurai', 'user5@example.com', 'password5', FALSE),
+('dev_genius', 'user6@example.com', 'password6', FALSE),
+('cyber_maven', 'user7@example.com', 'password7', FALSE),
+('net_knight', 'user8@example.com', 'password8', FALSE),
+('bit_boss', 'user9@example.com', 'password9', FALSE),
+('sys_sensei', 'user10@example.com', 'password10', FALSE),
+('crypto_champ', 'user11@example.com', 'password11', FALSE);
+
+
+ INSERT INTO Veranstaltung (ort, raum, name, dauer) VALUES
+ ('A', '101', 'Grundlagen der Programmierung', 2),
+('B', '202', 'Algorithmen und Datenstrukturen', 4),
+('A', '103', 'Netzwerkgrundlagen', 2),
+('B', '204', 'Betriebssystemkonzepte', 4),
+('A', '105', 'Softwareentwicklung', 2),
+('B', '206', 'Intelligente Systeme', 4),
+('A', '107', 'Datenbanksysteme', 2),
+('B', '208', 'Webtechnologien', 2),
+('A', '109', 'Computergrafikgrundlagen', 2),
+('B', '210', 'Maschinelles Lernen', 2);
+
+
+INSERT INTO Veranstalter_Veranstaltung_Uhrzeit (uhrzeit_ID, tag, veranstaltung_ID) VALUES
+(1, 1, 1),
+(2, 1, 7),
+(3, 1, 8),
+(4, 1, 3),
+(5, 1, 10),
+
+(1, 2, 4),
+(2, 2, 4),
+(3, 2, 5),
+(4, 2, 6),
+(5, 2, 6),
+
+(1, 3, 7),
+(2, 3, 8),
+(3, 3, 9),
+(4, 3, 10),
+(5, 3, 1),
+
+(1, 4, 2),
+(2, 4, 2),
+(3, 4, 3),
+(4, 4, 4),
+(5, 4, 4),
+
+(1, 5, 5),
+(2, 5, 6),
+(3, 5, 6),
+(4, 5, 7),
+(5, 5, 8);
+
diff --git a/src/Controller/EinsatzplanFrameController/EinsatzplanFrameController.cpp b/src/Controller/EinsatzplanFrameController/EinsatzplanFrameController.cpp
new file mode 100644
index 0000000..4be13af
--- /dev/null
+++ b/src/Controller/EinsatzplanFrameController/EinsatzplanFrameController.cpp
@@ -0,0 +1,36 @@
+# include "EinsatzplanFrameController.hpp"
+
+EinsatzplanFrameController::EinsatzplanFrameController(QString id, bool admin)
+ :m_id(id),
+ m_admin(admin) {
+ const std::map config = load_config("../config.cfg");
+
+ m_connectionString = fmt::format(
+ "host={} port={} dbname={} user={} password={}",
+ config.at("DB_HOST"),
+ config.at("DB_PORT"),
+ config.at("DB_NAME"),
+ config.at("DB_USER"),
+ config.at("DB_PASSWORD")
+ );
+}
+
+void EinsatzplanFrameController::deleteMember(QString id) {
+ DBPlan* db = new DBPlan(m_connectionString);
+ db->deleteVeranstalter(id.toStdString( ));
+}
+
+void EinsatzplanFrameController::deleteVeranstaltung(QString veranstaltungsname) {
+ DBPlan* db = new DBPlan(m_connectionString);
+ db->deleteVeranstaltung(veranstaltungsname.toStdString( ));
+}
+
+void EinsatzplanFrameController::createMember(QString name, QString email, QString passwort, bool admin) {
+ DBPlan* db = new DBPlan(m_connectionString);
+ db->hinzufuegenVeranstalter(email.toStdString( ), name.toStdString( ), passwort.toStdString( ), admin ? "TRUE" : "FALSE");
+}
+
+void EinsatzplanFrameController::createVeranstaltung(QString name, QString raum, QString campus, QString time) {
+ DBPlan* db = new DBPlan(m_connectionString);
+ db->hinzufuegenVeranstaltung(name.toStdString( ), time.toStdString( ), campus.toStdString( ), raum.toStdString( ));
+}
diff --git a/src/Controller/EinsatzplanFrameController/EinsatzplanFrameController.hpp b/src/Controller/EinsatzplanFrameController/EinsatzplanFrameController.hpp
new file mode 100644
index 0000000..24adef1
--- /dev/null
+++ b/src/Controller/EinsatzplanFrameController/EinsatzplanFrameController.hpp
@@ -0,0 +1,23 @@
+#pragma once
+
+#include
+#include
+
+#include "../../Core/DBHandler/DBPlan/DBPlan.hpp"
+#include "../../Core/config/config.hpp"
+
+class EinsatzplanFrameController {
+private:
+ std::string m_connectionString;
+
+protected:
+ QString m_id;
+ bool m_admin;
+
+public:
+ EinsatzplanFrameController(QString id = "0000000", bool admin = true);
+ void deleteMember(QString id);
+ void deleteVeranstaltung(QString veranstaltungsname);
+ void createMember(QString name, QString email, QString passwort, bool admin);
+ void createVeranstaltung(QString name, QString raum, QString campus, QString time);
+};
diff --git a/src/Controller/PlanGridController/PlanGridController.cpp b/src/Controller/PlanGridController/PlanGridController.cpp
new file mode 100644
index 0000000..939991c
--- /dev/null
+++ b/src/Controller/PlanGridController/PlanGridController.cpp
@@ -0,0 +1,70 @@
+#include "PlanGridController.hpp"
+
+PlanGridController::PlanGridController( ) {
+ weekdays[0] = "Montag";
+ weekdays[1] = "Dienstag";
+ weekdays[2] = "Mittwoch";
+ weekdays[3] = "Donnerstag";
+ weekdays[4] = "Freitag";
+
+ times[0] = "8:00 - 10:00";
+ times[1] = "10:00 - 12:00";
+ times[2] = "12:00 - 14:00";
+ times[3] = "14:00 - 16:00";
+ times[4] = "16:00 - 18:00";
+
+ planMap = new QMap, QLabel*>( );
+
+ const std::map config = load_config("../config.cfg");
+
+ m_connectionString = fmt::format(
+ "host={} port={} dbname={} user={} password={}",
+ config.at("DB_HOST"),
+ config.at("DB_PORT"),
+ config.at("DB_NAME"),
+ config.at("DB_USER"),
+ config.at("DB_PASSWORD")
+ );
+}
+
+QMap, QLabel*>* PlanGridController::getVeranstaltungen( ) {
+ DBPlan* db = new DBPlan(m_connectionString);
+
+ // stringFormat = tag , anfangszeit , Ort , Veranstaltung , Mitarbeiter , mitarbeiterID
+ std::vector planData = db->getPlan( );
+
+ QString tag;
+ QString anfang;
+ QString ort;
+ QString name;
+ QString mitarbeiter;
+ QString mitarbeiterId;
+ std::string temp;
+ for (const auto& veranstaltung : planData) {
+ std::istringstream f(veranstaltung);
+ std::getline(f, temp, ',');
+ tag.fromStdString(temp);
+ std::getline(f, temp, ',');
+ anfang.fromStdString(temp);
+ std::getline(f, temp, ',');
+ ort.fromStdString(temp);
+ std::getline(f, temp, ',');
+ name.fromStdString(temp);
+ std::getline(f, temp, ',');
+ mitarbeiter.fromStdString(temp);
+ std::getline(f, temp, ',');
+ mitarbeiterId.fromStdString(temp);
+
+ QLabel* temp = new QLabel(name + "\n" + mitarbeiter + "\n" + ort);
+ temp->setObjectName("temp");
+ temp->setStyleSheet(R"(
+ #temp{
+
+ }
+ )");
+ temp->setFixedSize(240, 100);
+ planMap->insert(qMakePair(tag, anfang), temp);
+ }
+
+ return planMap;
+}
diff --git a/src/Controller/PlanGridController/PlanGridController.hpp b/src/Controller/PlanGridController/PlanGridController.hpp
new file mode 100644
index 0000000..ffaa293
--- /dev/null
+++ b/src/Controller/PlanGridController/PlanGridController.hpp
@@ -0,0 +1,23 @@
+#pragma once
+
+#include
+#include
+#include
+
+#include "../../Core/config/config.hpp"
+#include "../../Core/DBHandler/DBPlan/DBPlan.hpp"
+
+class PlanGridController {
+private:
+ std::string m_connectionString;
+
+protected:
+ QString weekdays[5];
+ QString times[5];
+ QMap, QLabel*>* planMap;
+
+public:
+ PlanGridController( );
+
+ QMap, QLabel*>* getVeranstaltungen( );
+};
diff --git a/src/Core/DBHandler/DBHandler/DBHandler.cpp b/src/Core/DBHandler/DBHandler/DBHandler.cpp
new file mode 100644
index 0000000..dd9769b
--- /dev/null
+++ b/src/Core/DBHandler/DBHandler/DBHandler.cpp
@@ -0,0 +1,14 @@
+#include "DBHandler.hpp"
+
+DBHandler::DBHandler(std::string connStr) :
+ connectionObject(connStr.c_str( )) {
+ try {
+ if (connectionObject.is_open( ))
+ fmt::print("Databased connected");
+ else
+ fmt::print("Failed to connect to Databased");
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+};
diff --git a/src/Core/DBHandler/DBHandler/DBHandler.hpp b/src/Core/DBHandler/DBHandler/DBHandler.hpp
new file mode 100644
index 0000000..6c7e0b1
--- /dev/null
+++ b/src/Core/DBHandler/DBHandler/DBHandler.hpp
@@ -0,0 +1,13 @@
+#pragma onc
+
+#include
+#include
+#include
+
+class DBHandler {
+protected:
+ pqxx::connection connectionObject;
+
+public:
+ DBHandler(std::string connStr);
+};
diff --git a/src/Core/DBHandler/DBLogin/DBLogin.cpp b/src/Core/DBHandler/DBLogin/DBLogin.cpp
new file mode 100644
index 0000000..2b404c9
--- /dev/null
+++ b/src/Core/DBHandler/DBLogin/DBLogin.cpp
@@ -0,0 +1,26 @@
+#include "DBLogin.hpp"
+
+DBLogin::DBLogin(std::string connStr) : DBHandler(connStr) { };
+
+int DBLogin::checkValidLogin(std::string id, std::string pw) {
+ try {
+ pqxx::work worker(connectionObject);
+
+ std::string query =
+ "SELECT admin FROM studenten_veranstalter WHERE id = $1 AND passwort = $2";
+
+ pqxx::result response = worker.exec_params(query, id, pw);
+
+ if (response.affected_rows( ) > 0) {
+ if (response[0][0].is_null( ))
+ return 0;
+ return response[0][0].as( );
+ }
+ }
+ catch (const std::exception& e) {
+ fmt::printf("ERROR: %s", e.what( ));
+ }
+
+ return -1;
+}
+
diff --git a/src/Core/DBHandler/DBLogin/DBLogin.hpp b/src/Core/DBHandler/DBLogin/DBLogin.hpp
new file mode 100644
index 0000000..cf1bd7c
--- /dev/null
+++ b/src/Core/DBHandler/DBLogin/DBLogin.hpp
@@ -0,0 +1,18 @@
+#pragma once
+
+#include
+
+#include "../DBHandler/DBHandler.hpp"
+
+class DBLogin : public DBHandler {
+public:
+ DBLogin(std::string connStr);
+
+ /**
+ * @brief Tries to login the user
+ * @param id user id
+ * @param pw user password
+ * @return returns 1 if admin and 0 if not
+ */
+ int checkValidLogin(std::string id, std::string pw);
+};
diff --git a/src/Core/DBHandler/DBPlan/DBPlan.cpp b/src/Core/DBHandler/DBPlan/DBPlan.cpp
new file mode 100644
index 0000000..622da2f
--- /dev/null
+++ b/src/Core/DBHandler/DBPlan/DBPlan.cpp
@@ -0,0 +1,376 @@
+#include "DBPlan.hpp"
+
+DBPlan::DBPlan(std::string connStr) : DBHandler(connStr) { };
+
+void DBPlan::vertretung(std::string tag, std::string stunde, std::string dauer) {
+ try {
+ std::string prevStunde = std::to_string(std::stoi(stunde) - 1);
+ std::string cap = std::to_string(18 - std::stoi(dauer));
+ std::string nextStunde;
+ std::string nextTag = tag;
+ std::string prevTag = tag;
+ if (dauer == "4")
+ nextStunde = std::to_string(std::stoi(stunde) + 2);
+ else
+ nextStunde = std::to_string(std::stoi(stunde) + 1);
+ fmt::print(nextStunde);
+
+ if (prevStunde == "0") {
+ prevStunde = "5";
+ prevTag = std::to_string(std::stoi(tag) - 1);
+ if (prevTag == "0")
+ prevTag = "5";
+ }
+
+ if (nextStunde == "6") {
+ nextStunde = "1";
+ nextTag = std::to_string(std::stoi(tag) + 1);
+ if (nextTag == "6")
+ nextTag = "1";
+ }
+
+ pqxx::work worker(connectionObject);
+
+ std::string query = R"(
+ UPDATE Veranstalter_Veranstaltung_Uhrzeit SET Veranstalter_ID =
+ (SELECT ID FROM Veranstalter WHERE ID != (SELECT Veranstalter_ID FROM Veranstalter_Veranstaltung_Uhrzeit WHERE uhrzeit_id = $1 AND tag = $2)
+ AND ID != (SELECT Veranstalter_ID FROM Veranstalter_Veranstaltung_Uhrzeit WHERE uhrzeit_id = $3 AND tag = $4) LIMIT 1) WHERE uhrzeit_id = $5 AND tag = $6; )";
+
+ worker.exec_params(query, prevStunde, prevTag, nextStunde, nextTag, stunde, tag);
+ worker.commit( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::sucheVertretung(std::string tag, std::string stunde) {
+ std::string dauer = getDauer(tag, stunde);
+ vertretung(tag, stunde, dauer);
+ incarbeitszeit(tag, stunde, dauer);
+
+ if (dauer == "4")
+ upperHour(tag, stunde);
+}
+
+void DBPlan::meldeKrank(std::string id, std::string tag, std::string stunde) {
+ try {
+ pqxx::work worker(connectionObject);
+
+ worker.exec_params("UPDATE Veranstalter SET krank = TRUE WHERE ID = $1", id);
+ worker.commit( );
+
+ sucheVertretung(tag, stunde);
+ meldeGesund(id);
+ versendeEmails( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::meldeGesund(std::string id) {
+ try {
+ pqxx::work worker(connectionObject);
+
+ worker.exec_params("UPDATE Veranstalter SET krank = FALSE WHERE ID = $1", id);
+ worker.commit( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::deleteVeranstalterForeign(std::string id) {
+ try {
+ pqxx::work worker(connectionObject);
+
+ worker.exec_params("UPDATE Veranstalter_Veranstaltung_Uhrzeit SET Veranstalter_ID = NULL WHERE Veranstalter_ID = $1;", id);
+ worker.commit( );
+ versendeEmails( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::deleteVeranstalter(std::string id) {
+ deleteVeranstalterForeign(id);
+
+ try {
+ pqxx::work worker(connectionObject);
+
+ worker.exec_params("DELETE FROM Veranstalter WHERE ID = $1", id);
+ worker.commit( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::deleteVeranstaltungForeign(std::string id) {
+ try {
+ pqxx::work worker(connectionObject);
+
+ worker.exec_params("UPDATE Veranstalter_Veranstaltung_Uhrzeit SET Veranstaltung_ID = NULL WHERE Veranstalter_ID = $1;", id);
+ worker.commit( );
+ versendeEmails( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::deleteVeranstaltung(std::string id) {
+ deleteVeranstaltungForeign(id);
+
+ try {
+ pqxx::work worker(connectionObject);
+
+ worker.exec_params("DELETE FROM Veranstaltung WHERE ID = $1", id);
+ worker.commit( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::hinzufuegenVeranstaltung(std::string name, std::string dauer, std::string ort, std::string raum) {
+ try {
+ pqxx::work worker(connectionObject);
+ worker.exec_params("INSERT INTO Veranstaltung (name, dauer, ort, raum) VALUES ($1, $2, $3, $4);", name, dauer, ort, raum);
+ worker.commit( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::hinzufuegenVeranstalter(std::string email, std::string name, std::string pw, std::string admin) {
+ try {
+ pqxx::work worker(connectionObject);
+
+ worker.exec_params("INSERT INTO Veranstalter (email, name, passwort, admin) VALUES ($1, $2, $3, $4);", email, name, pw, admin);
+ worker.commit( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::deleteStudent(std::string id) {
+ try {
+ pqxx::work worker(connectionObject);
+
+ worker.exec_params("DELETE FROM studenten WHERE ID = $1;", id);
+ worker.commit( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::hinzufuegenStudent(std::string email, std::string name, std::string pw) {
+ try {
+ pqxx::work worker(connectionObject);
+
+ worker.exec_params("INSERT INTO studenten (email, name, pw) VALUES ($1, $2, $3);", email, name, pw);
+ worker.commit( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+std::string DBPlan::getDauer(std::string tag, std::string stunde) {
+ try {
+ pqxx::work worker(connectionObject);
+
+ pqxx::result response = worker.exec_params(
+ "SELECT dauer FROM Veranstaltung WHERE ID = (SELECT Veranstaltung_ID FROM Veranstalter_Veranstaltung_Uhrzeit WHERE uhrzeit_id = $1 AND tag = $2);",
+ stunde,
+ tag
+ );
+
+ worker.commit( );
+ return response[0][0].c_str( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+ return "0";
+}
+
+void DBPlan::addFirstOfDayTwo(std::string tag) {
+ try {
+ pqxx::work worker(connectionObject);
+ std::string query =
+ R"(UPDATE Veranstalter_Veranstaltung_Uhrzeit SET Veranstalter_ID = (SELECT ID FROM Veranstalter WHERE arbeitszeit <= 16 AND krank = FALSE LIMIT 1)
+ WHERE uhrzeit_id = 1 AND tag = $1;)";
+ worker.exec_params(query, tag);
+ worker.commit( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::addTwoHour(std::string tag, std::string stunde) {
+ try {
+ std::string prevStunde = std::to_string(std::stoi(stunde) - 1);
+
+ fmt::printf("PrevStunde: %s\n Tag: %s\n Stunde: %s \n", prevStunde, tag, stunde);
+ pqxx::work worker(connectionObject);
+ std::string query =
+ R"(UPDATE Veranstalter_Veranstaltung_Uhrzeit SET Veranstalter_id = (SELECT ID FROM Veranstalter
+ WHERE arbeitszeit <= 16 AND krank = FALSE
+ AND(standort = (SELECT ort FROM Veranstaltung WHERE ID = (SELECT veranstaltung_ID FROM Veranstalter_Veranstaltung_Uhrzeit WHERE uhrzeit_id = $1 AND tag = $2))
+ AND ID != (SELECT veranstalter_ID FROM Veranstalter_Veranstaltung_Uhrzeit WHERE uhrzeit_id = $1 AND tag = $2))
+ ORDER BY random() LIMIT 1)
+ WHERE uhrzeit_id = $3 AND tag = $4;)";
+ worker.exec_params(query, prevStunde, tag, stunde, tag);
+ worker.commit( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::addFirstOfDayFour(std::string tag) {
+ try {
+ pqxx::work worker(connectionObject);
+ std::string query =
+ R"(UPDATE Veranstalter_Veranstaltung_Uhrzeit SET Veranstalter_ID = (SELECT ID FROM Veranstalter WHERE arbeitszeit <= 14 AND krank = FALSE LIMIT 1)
+ WHERE uhrzeit_id = 1 AND tag = $1;)";
+ worker.exec_params(query, tag);
+ worker.commit( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::addFourHour(std::string tag, std::string stunde) {
+ try {
+ std::string prevStunde = std::to_string(std::stoi(stunde) - 1);
+ pqxx::work worker(connectionObject);
+ std::string query =
+ R"(UPDATE Veranstalter_Veranstaltung_Uhrzeit SET Veranstalter_id = (SELECT ID FROM Veranstalter
+ WHERE arbeitszeit <= 14 AND krank = FALSE
+ AND(standort = (SELECT ort FROM Veranstaltung WHERE ID = (SELECT veranstaltung_ID FROM Veranstalter_Veranstaltung_Uhrzeit WHERE uhrzeit_id = $1 AND tag = $2))
+ AND ID != (SELECT veranstalter_ID FROM Veranstalter_Veranstaltung_Uhrzeit WHERE uhrzeit_id = $1 AND tag = $2))
+ ORDER BY random() LIMIT 1)
+ WHERE uhrzeit_id = $3 AND tag = $4;)";
+ worker.exec_params(query, prevStunde, tag, stunde, tag);
+ worker.commit( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::upperHour(std::string tag, std::string stunde) {
+ try {
+ std::string nextStunde = std::to_string(std::stoi(stunde) + 1);
+
+ pqxx::work worker(connectionObject);
+ std::string query =
+ R"(UPDATE Veranstalter_Veranstaltung_Uhrzeit SET Veranstalter_ID = (SELECT Veranstalter_ID FROM Veranstalter_Veranstaltung_Uhrzeit WHERE uhrzeit_id = $1 AND tag = $2)
+ WHERE uhrzeit_id = $3 AND tag = $2;)";
+ worker.exec_params(query, stunde, tag, nextStunde);
+ worker.commit( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::updateStandort(std::string tag, std::string stunde) {
+ try {
+ pqxx::work worker(connectionObject);
+ std::string query =
+ "UPDATE Veranstalter SET standort = (SELECT ort FROM Veranstaltung WHERE ID = (SELECT Veranstaltung_ID FROM Veranstalter_Veranstaltung_Uhrzeit WHERE uhrzeit_id = $1 AND tag = $2)) WHERE ID = (SELECT Veranstalter_ID FROM Veranstalter_Veranstaltung_Uhrzeit WHERE uhrzeit_id = $1 AND tag = $2);";
+ worker.exec_params(query, stunde, tag);
+ worker.commit( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::incarbeitszeit(std::string tag, std::string stunde, std::string amount) {
+ try {
+ pqxx::work worker(connectionObject);
+
+ std::string query =
+ "UPDATE Veranstalter SET arbeitszeit = arbeitszeit + $1 WHERE ID = (SELECT Veranstalter_ID FROM Veranstalter_Veranstaltung_Uhrzeit WHERE uhrzeit_id = $2 AND tag = $3);";
+
+ worker.exec_params(query, amount, stunde, tag);
+ worker.commit( );
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+void DBPlan::createPlan( ) {
+ try {
+ for (int tag = 1; tag < 6; tag++) {
+ std::string tagStr = std::to_string(tag);
+ for (int stunde = 1; stunde < 6; stunde++) {
+ std::string stundeStr = std::to_string(stunde);
+ //get dauer of next class
+
+ if (std::stoi(getDauer(tagStr, stundeStr)) == 2) {
+ stunde == 1 ? addFirstOfDayTwo(tagStr) : addTwoHour(tagStr, stundeStr);
+ updateStandort(tagStr, stundeStr);
+ incarbeitszeit(tagStr, stundeStr, "2");
+ } else {
+ stunde == 1 ? addFirstOfDayFour(tagStr) : addFourHour(tagStr, stundeStr);
+ upperHour(tagStr, stundeStr);
+ incarbeitszeit(tagStr, stundeStr, "4");
+ updateStandort(tagStr, stundeStr);
+ stunde++;
+ }
+ }
+ }
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+}
+
+std::vector DBPlan::getPlan( ) {
+ try {
+ std::vector plan;
+
+ pqxx::work worker(connectionObject);
+
+ std::string query =
+ R"(SELECT tag, u.anfangszeit, u.endzeit, o.ort, o.name, v.name, v.ID FROM Veranstalter_Veranstaltung_Uhrzeit LEFT JOIN Veranstalter v ON Veranstalter_Veranstaltung_Uhrzeit.veranstalter_ID = v.ID
+ LEFT JOIN Uhrzeit u ON Veranstalter_Veranstaltung_Uhrzeit.uhrzeit_ID = u.ID
+ LEFT JOIN Veranstaltung o ON Veranstalter_Veranstaltung_Uhrzeit.veranstaltung_ID = o.ID
+ ORDER BY tag, uhrzeit_ID;)";
+
+ pqxx::result response = worker.exec(query);
+ worker.commit( );
+
+ for (const auto& row : response) {
+ std::string rowstring;
+ for (const auto& col : row) {
+ rowstring.append(col.c_str( ));
+ rowstring.append(" , ");
+ }
+ plan.push_back(rowstring);
+ }
+ return plan;
+ }
+ catch (const std::exception& e) {
+ fmt::print(e.what( ));
+ }
+ return std::vector{ "" };
+}
+
+void DBPlan::versendeEmails( ) {
+ fmt::print("Der Einsatzplan wurde geändert");
+}
diff --git a/src/Core/DBHandler/DBPlan/DBPlan.hpp b/src/Core/DBHandler/DBPlan/DBPlan.hpp
new file mode 100644
index 0000000..4877f0a
--- /dev/null
+++ b/src/Core/DBHandler/DBPlan/DBPlan.hpp
@@ -0,0 +1,107 @@
+#pragma once
+
+#include
+#include
+#include
+
+#include "../DBHandler/DBHandler.hpp"
+
+class DBPlan : public DBHandler {
+private:
+ //Functions needed for creation and updating of the plan
+ std::string getDauer(std::string tag, std::string stunde);
+ void addFirstOfDayTwo(std::string tag);
+ void addTwoHour(std::string tag, std::string stunde);
+ void addFirstOfDayFour(std::string tag);
+ void upperHour(std::string tag, std::string stunde);
+ void addFourHour(std::string tag, std::string stunde);
+ void sucheVertretung(std::string tag, std::string stunde);
+ void vertretung(std::string tag, std::string stunde, std::string dauer);
+ void deleteVeranstalterForeign(std::string id);
+ void deleteVeranstaltungForeign(std::string id);
+ void updateStandort(std::string tag, std::string stunde);
+ void incarbeitszeit(std::string tag, std::string stunde, std::string amount);
+ void versendeEmails( );
+
+public:
+ DBPlan(std::string connStr);
+
+ /**
+ * @brief Deletes prof from plan and searches new one
+ *
+ * @param id
+ * @param tag
+ * @param stunde
+ */
+ void meldeKrank(std::string id, std::string tag, std::string stunde);
+
+ /**
+ * @brief Currently directly used after meldeKrank, so Mitarbeiter is only sick for specific hour
+ *
+ * @param id
+ */
+ void meldeGesund(std::string id);
+
+ /**
+ * @brief Deletes Veranstaltung from relation Veranstaltung and from Einsatzplan
+ *
+ * @param id
+ */
+ void deleteVeranstaltung(std::string id);
+
+ /**
+ * @brief Adds Veranstaltung to relation Veranstaltung
+ *
+ * @param name
+ * @param dauer
+ * @param ort
+ * @param raum
+ */
+ void hinzufuegenVeranstaltung(std::string name, std::string dauer, std::string ort, std::string raum);
+
+ /**
+ * @brief Deletes Veranstlater from relattion Veranstalter and from Einsatzplan
+ *
+ * @param id
+ */
+ void deleteVeranstalter(std::string id);
+
+ /**
+ * @brief Add Veranstalter to relation Veranstalter
+ *
+ * @param email
+ * @param name
+ * @param pw
+ * @param admin
+ */
+ void hinzufuegenVeranstalter(std::string email, std::string name, std::string pw, std::string admin);
+
+ /**
+ * @brief Deletes a student from the database
+ *
+ * @param id
+ */
+ void deleteStudent(std::string id);
+
+ /**
+ * @brief Adds a new student
+ *
+ * @param email
+ * @param name
+ * @param pw
+ */
+ void hinzufuegenStudent(std::string email, std::string name, std::string pw);
+
+ /**
+ * @brief Create a Plan object
+ *
+ */
+ void createPlan( );
+
+ /**
+ * @brief Each string in form of (tag , anfangszeit , endzeit , Ort , Veranstaltung , Mitarbeiter , mitarbeiterID , )
+ *
+ * @return std::vector
+ */
+ std::vector getPlan( );
+};
diff --git a/src/Core/config/config.hpp b/src/Core/config/config.hpp
new file mode 100644
index 0000000..a611ddd
--- /dev/null
+++ b/src/Core/config/config.hpp
@@ -0,0 +1,32 @@
+#pragma once
+
+#include
+#include
+#include
+#include