232 lines
6.1 KiB
Plaintext
232 lines
6.1 KiB
Plaintext
/**
|
||
* import_medications.js
|
||
*
|
||
* Importiert Medikamente aus einer Word-Datei (.docx)
|
||
* und speichert sie normalisiert in MySQL:
|
||
* - medications
|
||
* - medication_forms
|
||
* - medication_variants
|
||
*
|
||
* JEDE Kombination aus
|
||
* Medikament × Darreichungsform × Dosierung × Packung
|
||
* wird als eigener Datensatz gespeichert.
|
||
*/
|
||
|
||
const mammoth = require("mammoth");
|
||
const mysql = require("mysql2/promise");
|
||
const path = require("path");
|
||
|
||
/* ==============================
|
||
KONFIGURATION
|
||
============================== */
|
||
|
||
// 🔹 Pfad zur Word-Datei (exakt!)
|
||
const WORD_FILE = path.join(
|
||
__dirname,
|
||
"MEDIKAMENTE 228.02.2024 docx.docx"
|
||
);
|
||
|
||
// 🔹 MySQL Zugangsdaten
|
||
const DB_CONFIG = {
|
||
host: "85.215.63.122",
|
||
user: "praxisuser",
|
||
password: "praxisuser",
|
||
database: "praxissoftware"
|
||
};
|
||
|
||
/* ==============================
|
||
HAUPTFUNKTION
|
||
============================== */
|
||
|
||
async function importMedications() {
|
||
console.log("📄 Lese Word-Datei …");
|
||
|
||
// 1️⃣ Word-Datei lesen
|
||
const result = await mammoth.extractRawText({ path: WORD_FILE });
|
||
|
||
// 2️⃣ Text → saubere Zeilen
|
||
const lines = result.value
|
||
.split("\n")
|
||
.map(l => l.trim())
|
||
.filter(l => l.length > 0);
|
||
|
||
console.log(`📑 ${lines.length} Zeilen gefunden`);
|
||
|
||
// 3️⃣ DB verbinden
|
||
const db = await mysql.createConnection(DB_CONFIG);
|
||
|
||
let currentMedication = null;
|
||
|
||
// 4️⃣ Zeilen verarbeiten
|
||
for (let i = 0; i < lines.length; i++) {
|
||
const line = lines[i];
|
||
|
||
/* ------------------------------
|
||
Medikamentenname erkennen
|
||
(keine Zahlen → Name)
|
||
------------------------------ */
|
||
if (!/\d/.test(line)) {
|
||
currentMedication = line;
|
||
await insertMedication(db, currentMedication);
|
||
continue;
|
||
}
|
||
|
||
/* ------------------------------
|
||
Sicherheit: keine Basis
|
||
------------------------------ */
|
||
if (!currentMedication) {
|
||
console.warn("⚠️ Überspringe Zeile ohne Medikament:", line);
|
||
continue;
|
||
}
|
||
|
||
/* ------------------------------
|
||
Dosierungen splitten
|
||
z.B. "50mg / 100mg"
|
||
------------------------------ */
|
||
const dosages = line
|
||
.split("/")
|
||
.map(d => d.trim())
|
||
.filter(d => d.length > 0);
|
||
|
||
/* ------------------------------
|
||
Packungen splitten
|
||
z.B. "30 Comp. / 100 Comp."
|
||
------------------------------ */
|
||
const rawPackage = lines[i + 1] || "";
|
||
const packages = rawPackage
|
||
.split("/")
|
||
.map(p => p.trim())
|
||
.filter(p => p.length > 0);
|
||
|
||
if (packages.length === 0) {
|
||
console.warn("⚠️ Keine Packung für:", currentMedication, line);
|
||
continue;
|
||
}
|
||
|
||
/* ------------------------------
|
||
Darreichungsform ermitteln
|
||
------------------------------ */
|
||
const form = detectForm(rawPackage);
|
||
|
||
/* ------------------------------
|
||
JEDE Kombination speichern
|
||
------------------------------ */
|
||
for (const dosage of dosages) {
|
||
for (const packageInfo of packages) {
|
||
await insertVariant(
|
||
db,
|
||
currentMedication,
|
||
dosage,
|
||
form,
|
||
packageInfo
|
||
);
|
||
}
|
||
}
|
||
|
||
i++; // Packungszeile überspringen
|
||
}
|
||
|
||
await db.end();
|
||
console.log("✅ Import abgeschlossen");
|
||
}
|
||
|
||
/* ==============================
|
||
HILFSFUNKTIONEN
|
||
============================== */
|
||
|
||
async function insertMedication(db, name) {
|
||
await db.execute(
|
||
"INSERT IGNORE INTO medications (name) VALUES (?)",
|
||
[name]
|
||
);
|
||
}
|
||
|
||
async function insertVariant(db, medicationName, dosage, formName, packageInfo) {
|
||
|
||
// Medikament-ID holen
|
||
const [[med]] = await db.execute(
|
||
"SELECT id FROM medications WHERE name = ?",
|
||
[medicationName]
|
||
);
|
||
|
||
if (!med) {
|
||
console.warn("⚠️ Medikament nicht gefunden:", medicationName);
|
||
return;
|
||
}
|
||
|
||
// Darreichungsform anlegen falls neu
|
||
await db.execute(
|
||
"INSERT IGNORE INTO medication_forms (name) VALUES (?)",
|
||
[formName]
|
||
);
|
||
|
||
const [[form]] = await db.execute(
|
||
"SELECT id FROM medication_forms WHERE name = ?",
|
||
[formName]
|
||
);
|
||
|
||
if (!form) {
|
||
console.warn("⚠️ Darreichungsform nicht gefunden:", formName);
|
||
return;
|
||
}
|
||
|
||
// Variante speichern
|
||
await db.execute(
|
||
`INSERT INTO medication_variants
|
||
(medication_id, form_id, dosage, package)
|
||
VALUES (?, ?, ?, ?)`,
|
||
[
|
||
med.id,
|
||
form.id,
|
||
normalizeDosage(dosage),
|
||
normalizePackage(packageInfo)
|
||
]
|
||
);
|
||
}
|
||
|
||
/* ==============================
|
||
NORMALISIERUNG
|
||
============================== */
|
||
|
||
function normalizeDosage(text) {
|
||
return text
|
||
.replace(/\s+/g, " ")
|
||
.replace(/mg/gi, " mg")
|
||
.replace(/ml/gi, " ml")
|
||
.trim();
|
||
}
|
||
|
||
function normalizePackage(text) {
|
||
return text
|
||
.replace(/\s+/g, " ")
|
||
.replace(/comp\.?/gi, "Comp.")
|
||
.replace(/tabl\.?/gi, "Tbl.")
|
||
.trim();
|
||
}
|
||
|
||
/* ==============================
|
||
DARREICHUNGSFORM ERKENNEN
|
||
============================== */
|
||
|
||
function detectForm(text) {
|
||
if (!text) return "Unbekannt";
|
||
|
||
const t = text.toLowerCase();
|
||
|
||
if (t.includes("tabl") || t.includes("comp")) return "Tabletten";
|
||
if (t.includes("caps")) return "Kapseln";
|
||
if (t.includes("saft") || t.includes("ml")) return "Saft";
|
||
if (t.includes("creme") || t.includes("salbe")) return "Creme";
|
||
if (t.includes("inj")) return "Injektion";
|
||
|
||
return "Unbekannt";
|
||
}
|
||
|
||
/* ==============================
|
||
START
|
||
============================== */
|
||
|
||
importMedications().catch(err => {
|
||
console.error("❌ Fehler beim Import:", err);
|
||
});
|