diff --git a/fotograf-de-scraper/frontend/src/App.tsx b/fotograf-de-scraper/frontend/src/App.tsx index 8d30d449c..007689a78 100644 --- a/fotograf-de-scraper/frontend/src/App.tsx +++ b/fotograf-de-scraper/frontend/src/App.tsx @@ -150,8 +150,8 @@ function App() { // Email States const [reminderResult, setReminderResult] = useState(null); const [reminderHistory, setReminderHistory] = useState(null); - const [emailSubject, setEmailSubject] = useState("Fotos von {Kindernamen}"); - const [emailBody, setEmailBody] = useState("Hallo {Name Käufer},

deine Fotos sind fertig und warten auf dich! Klicke einfach auf die Links unten, um direkt zu den Galerien zu gelangen:

{LinksHTML}

Viel Spaß beim Anschauen!"); + const [emailSubject, setEmailSubject] = useState("Eure Bilder aus {Einrichtung} sind da! 📸"); + const [emailBody, setEmailBody] = useState("Hallo {Name Käufer},

ich hoffe, es geht euch gut! 😊

Wir haben die wunderschönen Bilder vom Fotoshooting in {Einrichtung} fertiggestellt. Die Fotos von {Kindernamen} sind wirklich ganz toll geworden und warten nun darauf, von euch entdeckt zu werden!

Klicke einfach auf den untenstehenden Link, um direkt, sicher und bequem zu eurer persönlichen Galerie zu gelangen:

{LinksHTML}

Wenn ihr Fragen habt, meldet euch gerne jederzeit bei mir.

Viel Freude beim Anschauen und Aussuchen der Erinnerungen!"); const [isSendingEmails, setIsSendingEmails] = useState(false); const [emailSendStatus, setEmailSendStatus] = useState(null); const [reminderTab, setReminderTab] = useState<'config' | 'preview' | 'history'>('config'); @@ -226,10 +226,16 @@ function App() { if (!reminderResult) return []; return reminderResult.map(row => { - let subject = emailSubject.replace(/{Kindernamen}/g, row["Kindernamen"]); + let einrichtung = selectedJob + ? selectedJob.name.replace(/\(JOB\d+\)\s*/, '').replace(/Kindergarten\s+/gi, '').replace(/\s+\d{4}$/, '').trim() + : "eurer Einrichtung"; + let subject = emailSubject + .replace(/{Kindernamen}/g, row["Kindernamen"]) + .replace(/{Einrichtung}/g, einrichtung); let body = emailBody .replace(/{Name Käufer}/g, row["Name Käufer"]) .replace(/{Kindernamen}/g, row["Kindernamen"]) + .replace(/{Einrichtung}/g, einrichtung) .replace(/{LinksHTML}/g, row["LinksHTML"]) .replace(/\n/g, "
"); @@ -723,10 +729,16 @@ function App() { setEmailSendStatus("Sende..."); const emailsToSend = reminderResult.map(row => { - let subject = emailSubject.replace(/{Kindernamen}/g, row["Kindernamen"]); + let einrichtung = selectedJob + ? selectedJob.name.replace(/\(JOB\d+\)\s*/, '').replace(/Kindergarten\s+/gi, '').replace(/\s+\d{4}$/, '').trim() + : "eurer Einrichtung"; + let subject = emailSubject + .replace(/{Kindernamen}/g, row["Kindernamen"]) + .replace(/{Einrichtung}/g, einrichtung); let body = emailBody .replace(/{Name Käufer}/g, row["Name Käufer"]) .replace(/{Kindernamen}/g, row["Kindernamen"]) + .replace(/{Einrichtung}/g, einrichtung) .replace(/{LinksHTML}/g, row["LinksHTML"]) .replace(/\n/g, "
"); diff --git a/patch_frontend_email.py b/patch_frontend_email.py new file mode 100644 index 000000000..2896f09ab --- /dev/null +++ b/patch_frontend_email.py @@ -0,0 +1,60 @@ +import sys + +with open('fotograf-de-scraper/frontend/src/App.tsx', 'r') as f: + content = f.read() + +# Replace the generic subject +old_subject = 'const [emailSubject, setEmailSubject] = useState("Fotos von {Kindernamen}");' +new_subject = 'const [emailSubject, setEmailSubject] = useState("Die Kindergarten-Fotos von {Kindernamen} sind da! 📸");' + +# Replace the generic body +old_body = 'const [emailBody, setEmailBody] = useState("Hallo {Name Käufer},

deine Fotos sind fertig und warten auf dich! Klicke einfach auf die Links unten, um direkt zu den Galerien zu gelangen:

{LinksHTML}

Viel Spaß beim Anschauen!");' +new_body = 'const [emailBody, setEmailBody] = useState("Hallo {Name Käufer},

ich hoffe, es geht euch gut! 😊

Wir haben die wunderschönen Bilder vom Fotoshooting fertiggestellt. Die Fotos von {Kindernamen} sind wirklich ganz toll geworden und warten nun darauf, von euch entdeckt zu werden!

Klicke einfach auf den untenstehenden Link, um direkt, sicher und bequem zu eurer persönlichen Galerie zu gelangen:

{LinksHTML}

Wenn ihr Fragen habt, meldet euch gerne jederzeit bei mir.

Viel Freude beim Anschauen und Aussuchen der Erinnerungen!");' + +if old_subject in content and old_body in content: + content = content.replace(old_subject, new_subject) + content = content.replace(old_body, new_body) + + # We also need to add dynamic Einrichtungsname replacement to the parser + old_parser = """ let subject = emailSubject.replace(/{Kindernamen}/g, row["Kindernamen"]); + let body = emailBody + .replace(/{Name Käufer}/g, row["Name Käufer"]) + .replace(/{Kindernamen}/g, row["Kindernamen"]) + .replace(/{LinksHTML}/g, row["LinksHTML"]) + .replace(/\\n/g, "
");""" + + new_parser = """ let einrichtung = selectedJob + ? selectedJob.name.replace(/\\(JOB\\d+\\)\\s*/, '').replace(/Kindergarten\\s+/gi, '').replace(/\\s+\\d{4}$/, '').trim() + : "eurer Einrichtung"; + let subject = emailSubject + .replace(/{Kindernamen}/g, row["Kindernamen"]) + .replace(/{Einrichtung}/g, einrichtung); + let body = emailBody + .replace(/{Name Käufer}/g, row["Name Käufer"]) + .replace(/{Kindernamen}/g, row["Kindernamen"]) + .replace(/{Einrichtung}/g, einrichtung) + .replace(/{LinksHTML}/g, row["LinksHTML"]) + .replace(/\\n/g, "
");""" + + content = content.replace(old_parser, new_parser) + + # Note: We need to replace the parser in the send function too + old_sender = """ let subject = emailSubject.replace(/{Kindernamen}/g, row["Kindernamen"]); + let body = emailBody + .replace(/{Name Käufer}/g, row["Name Käufer"]) + .replace(/{Kindernamen}/g, row["Kindernamen"]) + .replace(/{LinksHTML}/g, row["LinksHTML"]) + .replace(/\\n/g, "
");""" + + content = content.replace(old_sender, new_parser) + + # Add {Einrichtung} to the hint text in the UI + old_hint = 'Platzhalter: {Name Käufer}, {Kindernamen}, {LinksHTML}' + new_hint = 'Platzhalter: {Name Käufer}, {Kindernamen}, {Einrichtung}, {LinksHTML}' + content = content.replace(old_hint, new_hint) + + with open('fotograf-de-scraper/frontend/src/App.tsx', 'w') as f: + f.write(content) + print("Frontend email template patched") +else: + print("Frontend code not found") diff --git a/patch_frontend_email2.py b/patch_frontend_email2.py new file mode 100644 index 000000000..2e06f324c --- /dev/null +++ b/patch_frontend_email2.py @@ -0,0 +1,19 @@ +import sys + +with open('fotograf-de-scraper/frontend/src/App.tsx', 'r') as f: + content = f.read() + +# Fix default text to include the new parameter +old_subject = 'const [emailSubject, setEmailSubject] = useState("Die Kindergarten-Fotos von {Kindernamen} sind da! 📸");' +new_subject = 'const [emailSubject, setEmailSubject] = useState("Eure Bilder aus {Einrichtung} sind da! 📸");' + +old_body = 'const [emailBody, setEmailBody] = useState("Hallo {Name Käufer},

ich hoffe, es geht euch gut! 😊

Wir haben die wunderschönen Bilder vom Fotoshooting fertiggestellt. Die Fotos von {Kindernamen} sind wirklich ganz toll geworden und warten nun darauf, von euch entdeckt zu werden!

Klicke einfach auf den untenstehenden Link, um direkt, sicher und bequem zu eurer persönlichen Galerie zu gelangen:

{LinksHTML}

Wenn ihr Fragen habt, meldet euch gerne jederzeit bei mir.

Viel Freude beim Anschauen und Aussuchen der Erinnerungen!");' +new_body = 'const [emailBody, setEmailBody] = useState("Hallo {Name Käufer},

ich hoffe, es geht euch gut! 😊

Wir haben die wunderschönen Bilder vom Fotoshooting in {Einrichtung} fertiggestellt. Die Fotos von {Kindernamen} sind wirklich ganz toll geworden und warten nun darauf, von euch entdeckt zu werden!

Klicke einfach auf den untenstehenden Link, um direkt, sicher und bequem zu eurer persönlichen Galerie zu gelangen:

{LinksHTML}

Wenn ihr Fragen habt, meldet euch gerne jederzeit bei mir.

Viel Freude beim Anschauen und Aussuchen der Erinnerungen!");' + +content = content.replace(old_subject, new_subject) +content = content.replace(old_body, new_body) + +with open('fotograf-de-scraper/frontend/src/App.tsx', 'w') as f: + f.write(content) +print("Frontend email template patched 2") +