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 %>
+ <% } %> + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + Abbrechen +
+
+ + 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") %> -
- - - - - - - - - - - <% rows.forEach(r => { %> - - +
+
-
- - - - - - - - - - <% }) %> - - -
MedikamentDarreichungsformDosierungPackung
- - - - - - - - - -
-
+ +
+
+
-
+
+ + Reset +
+ +
+
+ > + +
+
+ + + + + + ➕ Neues Medikament + + +
+ + + + + + + + + + + + + + + <% rows.forEach(r => { %> + + + + + + + + + + + + + + + + + + + <% }) %> + + +
MedikamentDarreichungsformDosierungPackungStatusAktionen
<%= r.medication %><%= r.form %> + + + + + <%= r.active ? "Aktiv" : "Inaktiv" %> + + + + + + + + + +
+ +
+ +
+
+ +
+