diff --git a/app.js b/app.js
index 31ed4e4..400b533 100644
--- a/app.js
+++ b/app.js
@@ -1,16 +1,13 @@
const express = require("express");
const session = require("express-session");
-const bcrypt = require("bcrypt");
-const db = require("./db");
-const fs = require("fs");
-const path = require("path");
-const { requireLogin, requireAdmin} = require("./middleware/auth.middleware");
-const adminRoutes = require("./routes/admin.routes");
-const dashboardRoutes = require("./routes/dashboard.routes");
const helmet = require("helmet");
const sessionStore = require("./config/session");
+require("dotenv").config();
+
+const adminRoutes = require("./routes/admin.routes");
+const dashboardRoutes = require("./routes/dashboard.routes");
const patientRoutes = require("./routes/patient.routes");
-const medicationRoutes = require("./routes/medication.routes");
+const medicationRoutes = require("./routes/medications.routes");
const patientMedicationRoutes = require("./routes/patientMedication.routes");
const waitingRoomRoutes = require("./routes/waitingRoom.routes");
const serviceRoutes = require("./routes/service.routes");
@@ -18,10 +15,7 @@ const patientServiceRoutes = require("./routes/patientService.routes");
const invoiceRoutes = require("./routes/invoice.routes");
const patientFileRoutes = require("./routes/patientFile.routes");
const companySettingsRoutes = require("./routes/companySettings.routes");
-
-
-
-require("dotenv").config();
+const authRoutes = require("./routes/auth.routes");
const app = express();
@@ -31,37 +25,31 @@ const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(helmet());
-app.use(session({
- name: "praxis.sid",
- secret: process.env.SESSION_SECRET,
- store: sessionStore,
- resave: false,
- saveUninitialized: false
-}));
+app.use(
+ session({
+ name: "praxis.sid",
+ secret: process.env.SESSION_SECRET,
+ store: sessionStore,
+ resave: false,
+ saveUninitialized: false,
+ })
+);
const flashMiddleware = require("./middleware/flash.middleware");
app.use(flashMiddleware);
app.use(express.static("public"));
-
+app.use("/uploads", express.static("uploads"));
app.set("view engine", "ejs");
-app.use("/patients", require("./routes/patient.routes"));
-
-app.use("/uploads", express.static("uploads"));
-
-
/* ===============================
- COMPANYDATA
+ COMPANY SETTINGS
================================ */
app.use(companySettingsRoutes);
-
/* ===============================
- LOGIN
+ AUTH / LOGIN
================================ */
-const authRoutes = require("./routes/auth.routes");
-
app.use("/", authRoutes);
/* ===============================
@@ -70,7 +58,7 @@ app.use("/", authRoutes);
app.use("/dashboard", dashboardRoutes);
/* ===============================
- Mitarbeiter
+ ADMIN
================================ */
app.use("/admin", adminRoutes);
@@ -78,41 +66,45 @@ app.use("/admin", adminRoutes);
PATIENTEN
================================ */
app.use("/patients", patientRoutes);
+app.use("/patients", patientMedicationRoutes);
+app.use("/patients", patientServiceRoutes);
+
+/* ===============================
+ MEDIKAMENTE
+================================ */
+app.use("/medications", medicationRoutes);
+console.log("🧪 /medications Router mounted");
+
+/* ===============================
+ LEISTUNGEN
+================================ */
+app.use("/services", serviceRoutes);
+
+/* ===============================
+ DATEIEN
+================================ */
app.use("/", patientFileRoutes);
/* ===============================
- MEDIKAMENTENÜBERSICHT
+ WARTEZIMMER
================================ */
-app.use("/medications", medicationRoutes);
-app.use("/patients", patientMedicationRoutes);
-
-
-// ===============================
-// PATIENT INS WARTEZIMMER
-// ===============================
app.use("/", waitingRoomRoutes);
- // ===============================
-// Leistungen
-// ===============================
-app.use("/services", serviceRoutes);
-app.use("/patients", patientServiceRoutes);
-
-// ===============================
-// RECHNUNGEN
-// ===============================
+/* ===============================
+ RECHNUNGEN
+================================ */
app.use("/", invoiceRoutes);
/* ===============================
LOGOUT
================================ */
app.get("/logout", (req, res) => {
- req.session.destroy(() => res.redirect("/"));
+ req.session.destroy(() => res.redirect("/"));
});
-// ===============================
-// ERROR HANDLING (IMMER ZUM SCHLUSS)
-// ===============================
+/* ===============================
+ ERROR HANDLING
+================================ */
app.use((err, req, res, next) => {
console.error(err);
res.status(500).send("Interner Serverfehler");
@@ -121,8 +113,8 @@ app.use((err, req, res, next) => {
/* ===============================
SERVER
================================ */
-const PORT = 51777; // garantiert frei
-const HOST = "127.0.0.1"; // kein HTTP.sys
+const PORT = 51777;
+const HOST = "127.0.0.1";
app.listen(PORT, HOST, () => {
console.log(`Server läuft auf http://${HOST}:${PORT}`);
diff --git a/controllers/medication.controller.js b/controllers/medication.controller.js
index 6a4066b..41e9e89 100644
--- a/controllers/medication.controller.js
+++ b/controllers/medication.controller.js
@@ -2,25 +2,50 @@ const db = require("../db");
// 📋 LISTE
function listMedications(req, res, next) {
- const sql = `
+ const { q, onlyActive } = req.query;
+
+ let sql = `
SELECT
v.id,
+ m.id AS medication_id,
m.name AS medication,
+ m.active,
f.name AS form,
v.dosage,
v.package
FROM medication_variants v
JOIN medications m ON v.medication_id = m.id
JOIN medication_forms f ON v.form_id = f.id
- ORDER BY m.name, v.dosage
+ WHERE 1=1
`;
- db.query(sql, (err, rows) => {
+ const params = [];
+
+ if (q) {
+ sql += `
+ AND (
+ m.name LIKE ?
+ OR f.name LIKE ?
+ OR v.dosage LIKE ?
+ OR v.package LIKE ?
+ )
+ `;
+ params.push(`%${q}%`, `%${q}%`, `%${q}%`, `%${q}%`);
+ }
+
+ if (onlyActive === "1") {
+ sql += " AND m.active = 1";
+ }
+
+ sql += " ORDER BY m.name, v.dosage";
+
+ db.query(sql, params, (err, rows) => {
if (err) return next(err);
res.render("medications", {
rows,
- user: req.session.user
+ query: { q, onlyActive },
+ user: req.session.user,
});
});
}
@@ -38,16 +63,75 @@ function updateMedication(req, res, next) {
WHERE id = ?
`;
- db.query(sql, [dosage, pkg, id], err => {
+ db.query(sql, [dosage, pkg, id], (err) => {
if (err) return next(err);
- req.session.flash = { type: "success", message: "Medikament gespeichert"};
+ req.session.flash = { type: "success", message: "Medikament gespeichert" };
res.redirect("/medications");
});
}
+function toggleMedication(req, res, next) {
+ const id = req.params.id;
+
+ db.query(
+ "UPDATE medications SET active = NOT active WHERE id = ?",
+ [id],
+ (err) => {
+ if (err) return next(err);
+ res.redirect("/medications");
+ }
+ );
+}
+
+function showCreateMedication(req, res) {
+ const sql = "SELECT id, name FROM medication_forms ORDER BY name";
+
+ db.query(sql, (err, forms) => {
+ if (err) return res.send("DB Fehler");
+
+ res.render("medication_create", {
+ forms,
+ user: req.session.user,
+ error: null,
+ });
+ });
+}
+
+function createMedication(req, res) {
+ const { name, form_id, dosage, package: pkg } = req.body;
+
+ if (!name || !form_id || !dosage) {
+ return res.send("Pflichtfelder fehlen");
+ }
+
+ db.query(
+ "INSERT INTO medications (name, active) VALUES (?, 1)",
+ [name],
+ (err, result) => {
+ if (err) return res.send("Fehler Medikament");
+
+ const medicationId = result.insertId;
+
+ db.query(
+ `INSERT INTO medication_variants
+ (medication_id, form_id, dosage, package)
+ VALUES (?, ?, ?, ?)`,
+ [medicationId, form_id, dosage, pkg || null],
+ (err) => {
+ if (err) return res.send("Fehler Variante");
+
+ res.redirect("/medications");
+ }
+ );
+ }
+ );
+}
+
module.exports = {
listMedications,
- updateMedication
+ updateMedication,
+ toggleMedication,
+ showCreateMedication,
+ createMedication,
};
-
diff --git a/public/invoices/2026/invoice-2026-0040.pdf b/public/invoices/2026/invoice-2026-0040.pdf
new file mode 100644
index 0000000..1bf447e
Binary files /dev/null and b/public/invoices/2026/invoice-2026-0040.pdf differ
diff --git a/routes/medication.routes.js b/routes/medications.routes.js
similarity index 50%
rename from routes/medication.routes.js
rename to routes/medications.routes.js
index 94c32fa..ccb5586 100644
--- a/routes/medication.routes.js
+++ b/routes/medications.routes.js
@@ -4,12 +4,26 @@ const router = express.Router();
const { requireLogin } = require("../middleware/auth.middleware");
const {
listMedications,
- updateMedication
+ updateMedication,
+ toggleMedication,
+ showCreateMedication,
+ createMedication,
} = require("../controllers/medication.controller");
+console.log("✅ medication.routes geladen");
+
router.get("/", requireLogin, listMedications);
+// 🆕 Formular anzeigen
+router.get("/create", requireLogin, showCreateMedication);
+
+// 🆕 Speichern
+router.post("/create", requireLogin, createMedication);
+
// 🆕 UPDATE pro Zeile
router.post("/update/:id", requireLogin, updateMedication);
+// 🆕 Toggle
+router.post("/toggle/:id", requireLogin, toggleMedication);
+
module.exports = router;
diff --git a/routes/patientService.routes.js b/routes/patientService.routes.js
index 0578e79..722aeb7 100644
--- a/routes/patientService.routes.js
+++ b/routes/patientService.routes.js
@@ -2,17 +2,20 @@ const express = require("express");
const router = express.Router();
const { requireLogin, requireAdmin } = require("../middleware/auth.middleware");
-const {
+const {
addPatientService,
deletePatientService,
updatePatientServicePrice,
- updatePatientServiceQuantity
+ updatePatientServiceQuantity,
} = require("../controllers/patientService.controller");
router.post("/:id/services", requireLogin, addPatientService);
router.post("/services/delete/:id", requireAdmin, deletePatientService);
-router.post("/services/update-price/:id", requireAdmin, updatePatientServicePrice);
-router.post("/patients/services/update-quantity/:id", updatePatientServiceQuantity);
-
+router.post(
+ "/services/update-price/:id",
+ requireAdmin,
+ updatePatientServicePrice
+);
+router.post("/services/update-quantity/:id", updatePatientServiceQuantity);
module.exports = router;
diff --git a/views/medication_create.ejs b/views/medication_create.ejs
new file mode 100644
index 0000000..3490adb
--- /dev/null
+++ b/views/medication_create.ejs
@@ -0,0 +1,45 @@
+
+
+
+ Neues Medikament
+
+
+
+
+
➕ Neues Medikament
+
+ <% if (error) { %>
+
<%= error %>
+ <% } %>
+
+
+
+
+
diff --git a/views/medications.ejs b/views/medications.ejs
index 732242e..a644149 100644
--- a/views/medications.ejs
+++ b/views/medications.ejs
@@ -1,96 +1,164 @@
-
- Medikamentenübersicht
-
+
+ Medikamentenübersicht
+
+
+
+
+
- <%- include("partials/flash") %>
-
-
+ <%- include("partials/flash") %>
-
-
-
-
- | Medikament |
- Darreichungsform |
- Dosierung |
- Packung |
-
-
-
- <% rows.forEach(r => { %>
-
-
- <% }) %>
-
-
-
-
+
+
+
+
+
+
+ >
+
+
+
+
+
+
+
+
+ ➕ Neues Medikament
+
+
+
+
+
+
+
+ | Medikament |
+ Darreichungsform |
+ Dosierung |
+ Packung |
+ Status |
+ Aktionen |
+
+
+
+
+ <% rows.forEach(r => { %>
+
+
+
+
+
+
+ <% }) %>
+
+
+
+
+
+
+