feat: add Mietvertrag workflow and template management in n8n, including email notifications and document handling

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
LagoESP
2026-04-29 21:42:17 +02:00
parent 3298efe54b
commit 3a902e7138
10 changed files with 622 additions and 0 deletions
+42
View File
@@ -1108,11 +1108,25 @@ orderDialog.addEventListener("close", onDialogClose);
const heroPreview = document.querySelector("#heroPreview");
const heroImageInput = document.querySelector("#heroImageInput");
const heroFeedback = document.querySelector("#heroFeedback");
const mietvertragStatus = document.querySelector("#mietvertragStatus");
const mietvertragInput = document.querySelector("#mietvertragInput");
const mietvertragFeedback = document.querySelector("#mietvertragFeedback");
async function renderSettings() {
const { data } = await supabase.from("site_settings").select("value").eq("key", "hero_image_url").single();
const url = data?.value || "/images/ferrari-main-car.png";
heroPreview.style.backgroundImage = `url('${url}')`;
// Mietvertrag template status
const { data: tplData } = await supabase.from("site_settings").select("value").eq("key", "mietvertrag_template_path").single();
const tplPath = tplData?.value;
if (tplPath) {
mietvertragStatus.textContent = "✓ " + tplPath.split("/").pop();
mietvertragStatus.style.color = "var(--success, green)";
} else {
mietvertragStatus.textContent = t("adminMietvertragEmpty") || "Keine Vorlage hochgeladen.";
mietvertragStatus.style.color = "var(--muted)";
}
}
heroImageInput.addEventListener("change", async () => {
@@ -1145,4 +1159,32 @@ heroImageInput.addEventListener("change", async () => {
}
});
mietvertragInput.addEventListener("change", async () => {
const file = mietvertragInput.files?.[0];
if (!file) return;
mietvertragFeedback.className = "form-feedback";
mietvertragFeedback.textContent = "Uploading...";
try {
const path = `mietvertrag/vorlage.docx`;
const { error: upErr } = await supabase.storage
.from("document-templates")
.upload(path, file, { contentType: file.type, upsert: true });
if (upErr) throw upErr;
// Save path to site_settings
const { error: dbErr } = await supabase
.from("site_settings")
.upsert({ key: "mietvertrag_template_path", value: path, updated_at: new Date().toISOString() }, { onConflict: "key" });
if (dbErr) throw dbErr;
mietvertragStatus.textContent = "✓ " + file.name;
mietvertragStatus.style.color = "var(--success, green)";
mietvertragFeedback.className = "form-feedback";
mietvertragFeedback.textContent = "Gespeichert.";
} catch (err) {
mietvertragFeedback.className = "form-feedback error";
mietvertragFeedback.textContent = err.message || String(err);
}
});
bootstrap();