diff --git a/app.js b/app.js
index 837c2cc..0247623 100644
--- a/app.js
+++ b/app.js
@@ -52,6 +52,13 @@ class DienstplanApp {
// Settings
document.getElementById('export-csv-btn').addEventListener('click', () => this.exportCSV());
document.getElementById('export-report-btn').addEventListener('click', () => this.exportBonusReport());
+
+ // NEW: Email Report Generator
+ const emailBtn = document.getElementById('email-report-btn');
+ if (emailBtn) {
+ emailBtn.addEventListener('click', () => this.generateEmailReport());
+ }
+
document.getElementById('export-btn').addEventListener('click', () => this.exportData());
document.getElementById('import-btn').addEventListener('click', () => this.importData());
document.getElementById('clear-all-btn').addEventListener('click', () => this.clearAllData());
@@ -417,6 +424,122 @@ class DienstplanApp {
return card;
}
+ // --- NEW: EMAIL REPORT GENERATOR ---
+ generateEmailReport() {
+ // Need to grab current selected calc month/year
+ const monthSelect = document.getElementById('calc-month-select');
+ const yearSelect = document.getElementById('calc-year-select');
+ const month = parseInt(monthSelect.value);
+ const year = parseInt(yearSelect.value);
+
+ const employeeDuties = this.storage.getAllEmployeeDutiesForMonth(year, month);
+ const results = this.calculator.calculateAllEmployees(employeeDuties);
+
+ const monthName = this.getMonthName(month);
+
+ let reportHtml = `
`;
+ if (textBlocks.length > 0) {
+ textBlocks.forEach(text => {
+ reportHtml += `
${text}
`;
+ });
+ } else {
+ reportHtml += `
Keine relevanten Dienste.
`;
+ }
+ reportHtml += `
`;
+
+ // Modal Logic
+ const modal = document.createElement('div');
+ modal.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.5);display:flex;justify-content:center;align-items:center;z-index:1000;';
+ modal.innerHTML = `
+
+
×
+
📧 E-Mail Text-Generator
+
Kopieren Sie diesen Inhalt direkt in Ihre E-Mail an die Verwaltung.
+
+ ${reportHtml}
+
+
+ 📋 Alles markieren & kopieren
+ Schließen
+
+
+ `;
+ document.body.appendChild(modal);
+
+ modal.querySelector('#close-modal-btn').onclick = () => modal.remove();
+ modal.querySelector('#close-btn-bottom').onclick = () => modal.remove();
+
+ modal.querySelector('#copy-btn').onclick = () => {
+ const range = document.createRange();
+ range.selectNode(modal.querySelector('#report-content'));
+ window.getSelection().removeAllRanges();
+ window.getSelection().addRange(range);
+ try {
+ document.execCommand('copy');
+ this.showToast('✅ Bericht kopiert! (Einfügen mit Strg+V)', 'success');
+ } catch (err) {
+ this.showToast('❌ Fehler beim Kopieren.', 'error');
+ }
+ window.getSelection().removeAllRanges();
+ };
+ }
+
/**
* Export data as JSON
*/
@@ -742,27 +865,16 @@ class DienstplanApp {
const thresholdReached = we_total >= this.calculator.MIN_QUALIFYING_DAYS - 0.0001;
let bonus = 0;
- let deductedFrom = '';
- let deduct_fr = 0;
- let deduct_other = 0;
if (thresholdReached) {
const wt_pay = data.wt * this.calculator.RATE_NORMAL;
let deduct = this.calculator.DEDUCTION_AMOUNT;
- deduct_fr = Math.min(deduct, data.we_fr);
- deduct_other = Math.max(0, deduct - deduct_fr);
+ let deduct_fr = Math.min(deduct, data.we_fr);
+ let deduct_other = Math.max(0, deduct - deduct_fr);
const paid_fr = Math.max(0, data.we_fr - deduct_fr);
const paid_other = Math.max(0, data.we_other - deduct_other);
const we_pay = (paid_fr + paid_other) * this.calculator.RATE_WEEKEND;
bonus = wt_pay + we_pay;
-
- if (deduct_fr > 0 && deduct_other > 0) {
- deductedFrom = 'Freitag und weiterer WE-Tag';
- } else if (deduct_fr > 0) {
- deductedFrom = 'Freitag';
- } else {
- deductedFrom = 'WE-Tag (Sa/So/Feiertag)';
- }
}
totalBonus += bonus;
@@ -787,10 +899,6 @@ class DienstplanApp {
}
employeeNotes.push(note);
- // Track remaining deduction for each duty (Friday first, then others)
- let remainingDeductFr = deduct_fr;
- let remainingDeductOther = deduct_other;
-
// Build table row
html += `