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:
@@ -253,6 +253,16 @@
|
||||
<p class="muted" style="font-size:0.82rem;" data-i18n="adminHeroImageHint">JPG/PNG/WebP. Wird als Hintergrundbild im Hero-Bereich der Website angezeigt.</p>
|
||||
<p class="form-feedback" id="heroFeedback"></p>
|
||||
</div>
|
||||
<hr style="margin:2rem 0;border-color:var(--border);" />
|
||||
<div class="admin-form">
|
||||
<label>
|
||||
<span data-i18n="adminMietvertragTemplate">Mietvertrag-Vorlage (DOCX)</span>
|
||||
<div id="mietvertragStatus" class="muted" style="font-size:0.9rem;margin:0.5rem 0;"></div>
|
||||
<input type="file" id="mietvertragInput" accept="application/vnd.openxmlformats-officedocument.wordprocessingml.document,.docx" />
|
||||
</label>
|
||||
<p class="muted" style="font-size:0.82rem;" data-i18n="adminMietvertragHint">DOCX-Vorlage mit Platzhaltern. Wird bei Qualifizierung automatisch ausgefüllt und als PDF per E-Mail versendet.</p>
|
||||
<p class="form-feedback" id="mietvertragFeedback"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -133,6 +133,9 @@ export const translations = {
|
||||
adminSettings: "Einstellungen",
|
||||
adminHeroImage: "Hauptbild (Hero-Bereich)",
|
||||
adminHeroImageHint: "JPG/PNG/WebP. Wird als Hintergrundbild im Hero-Bereich der Website angezeigt.",
|
||||
adminMietvertragTemplate: "Mietvertrag-Vorlage (DOCX)",
|
||||
adminMietvertragHint: "DOCX-Vorlage mit Platzhaltern. Wird bei Qualifizierung automatisch ausgefüllt und als PDF per E-Mail versendet.",
|
||||
adminMietvertragEmpty: "Keine Vorlage hochgeladen.",
|
||||
adminNewVehicle: "Neues Fahrzeug",
|
||||
adminAllVehicles: "Alle Fahrzeuge",
|
||||
adminPhotoUpload: "Foto hochladen (JPG/PNG/WebP, max 50 MB)",
|
||||
@@ -364,6 +367,9 @@ export const translations = {
|
||||
adminSettings: "Settings",
|
||||
adminHeroImage: "Main Photo (Hero Section)",
|
||||
adminHeroImageHint: "JPG/PNG/WebP. Displayed as the background image in the hero section of the website.",
|
||||
adminMietvertragTemplate: "Rental Contract Template (DOCX)",
|
||||
adminMietvertragHint: "DOCX template with placeholders. Automatically filled and sent as PDF via email upon qualification.",
|
||||
adminMietvertragEmpty: "No template uploaded.",
|
||||
adminNewVehicle: "New vehicle",
|
||||
adminAllVehicles: "All vehicles",
|
||||
adminPhotoUpload: "Upload photo (JPG/PNG/WebP, max 50 MB)",
|
||||
|
||||
Reference in New Issue
Block a user