Skip to content

Commit c86cd69

Browse files
committed
Use state to show election hints, store in reminder service
1 parent c6b72c6 commit c86cd69

File tree

5 files changed

+96
-8
lines changed

5 files changed

+96
-8
lines changed

_i18n/de.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ right:
5454
month: "Monat"
5555
year: "Jahr"
5656
arrival: "Voraussichtliche Zustellung der Briefwahl-Unterlagen:"
57+
arrivallate: "Ihre Briefwahlunterlagen werden für die aktuelle Wahl nicht mehr rechtzeitig ankommen. Wir schicken Ihnen gerne eine Erinnerung zur nächsten Wahl."
58+
noelections: "Wir wissen von keinen aktuellen Wahlen in Ihrem Bundesland. Wir schicken Ihnen gerne eine Erinnerung zur nächsten Wahl."
5759
same-address: "Unterlagen an die Meldeadresse versenden"
5860
different-address: "Abweichende Adresse für den Versand angeben"
5961
checkbox-address: "Abweichende Adresse für den Versand angeben"

_i18n/en.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ right:
4848
month: "Month"
4949
year: "Year"
5050
arrival: "Estimated delivery of postal voting documents:"
51+
arrivallate: "Your postal voting documents will not arrive in time for the current election. We will be happy to send you a reminder for the next election."
52+
noelections: "We don't know about any upcoming elections in your federal state. We will be happy to send you a reminder for the next election."
5153
same-address: "Send documents to the registration address"
5254
different-address: "Specify different address for delivery"
5355
checkbox-address: "Specify different address for delivery"

assets/js/main.js

Lines changed: 65 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,21 @@ function getContent(link) {
136136

137137
const zips = []; // Array to store ZIP code data
138138

139+
const elections = [
140+
{state: "BW", stateName: "Baden-Württemberg", date: "2026-03-08", name: "Landtagswahl"},
141+
{state: "BY", stateName: "Bayern", date: "2026-03-08", name: "Wahlen zu Kreistagen, Stadträten, Gemeinderäten"},
142+
{state: "HE", stateName: "Hessen", date: "2026-03-15", name: "Wahlen zu Kreistagen, Stadtverordnetenversammlungen, Gemeindevertretungen, Ortsbeiräten"},
143+
{state: "RP", stateName: "Rheinland-Pfalz", date: "2026-03-22", name: "Landtagswahl"},
144+
{state: "ST", stateName: "Sachsen-Anhalt", date: "2026-09-06", name: "Landtagswahl"},
145+
{state: "NI", stateName: "Niedersachsen", date: "2026-09-13", name: "Kommunalwahlen"},
146+
{state: "BE", stateName: "Berlin", date: "2026-09-20", name: "Abgeordnetenhauswahl"},
147+
{state: "MV", stateName: "Mecklenburg-Vorpommern", date: "2026-09-20", name: "Landtagswahl"},
148+
].map(e => ({
149+
...e,
150+
date: new Date(e.date)
151+
}))
152+
153+
139154
// --- DOM Elements ---
140155

141156
const elements = {
@@ -539,21 +554,31 @@ function backtosecondpage() {
539554
navigateTo(2);
540555
}
541556

557+
function formatDate(d) {
558+
if (typeof d === "number") {
559+
d = new Date(d)
560+
}
561+
return `${d.getDate()}.${d.getMonth() + 1}.`
562+
}
563+
542564
// --- ZIP Code Validation and Autocomplete ---
543565

544-
let lastEmail = null;
566+
let selectedEmail = null;
567+
let selectedPlace = null
568+
let selectedElection
545569

546570
function is_valid_datalist_value(inputValue, cityValue) {
547571
onEnter(); // Selects the item even if suggestion is not selected
548572
const filtered = zips.filter(
549573
(item) =>
550574
item.PLZ.toString() == inputValue &&
551575
item.ORT.toString() === cityValue &&
552-
(lastEmail ? item["E-Mail"].toString() == lastEmail : true)
576+
(selectedEmail ? item["E-Mail"].toString() == selectedEmail : true)
553577
);
554578

555579
if (filtered.length > 0) {
556580
const data = filtered[0];
581+
selectedPlace = data
557582
updateTextContent({
558583
munname: data.ORT,
559584
munemail: atob(data["E-Mail"]),
@@ -565,6 +590,30 @@ function is_valid_datalist_value(inputValue, cityValue) {
565590
formElements.city.value = data.ORT;
566591
formElements.zip.value = data.PLZ;
567592

593+
594+
// Hide all
595+
document.querySelectorAll("#election-hints .election-hint").forEach((el) => {el.style.display = "none"})
596+
selectedElection = elections.filter(e => e.state === data.state)[0]
597+
if (selectedElection == undefined) {
598+
document.getElementById("election-hint-none").style.display = "block"
599+
} else {
600+
const MIN_DAYS = 6
601+
const day = 1000 * 60 * 60 * 24
602+
const todayDate = new Date()
603+
const today = todayDate.getTime()
604+
const electionTime = selectedElection.date.getTime()
605+
const shippingDateMin = Math.max(today + (5 * day), electionTime - (30 * day))
606+
const shippingDateMax = Math.max(Math.max(shippingDateMin, today + (21 * day)), electionTime - (MIN_DAYS * day))
607+
const daysLeft = Math.floor((electionTime - today) / day)
608+
let arrival = `${formatDate(shippingDateMin)}${formatDate(shippingDateMax)}`
609+
document.getElementById("arrival-date").innerText = arrival
610+
if (daysLeft < MIN_DAYS) {
611+
document.getElementById("election-hint-late").style.display = "block"
612+
} else {
613+
document.getElementById("election-hint-normal").style.display = "block"
614+
}
615+
}
616+
568617
formElements.zip.dispatchEvent(
569618
new Event("input", { bubbles: true, cancellable: true })
570619
);
@@ -662,7 +711,8 @@ elements.searchInput?.addEventListener("keyup", (e) => {
662711

663712
div.addEventListener("click", () => {
664713
elements.searchInput.value = value;
665-
lastEmail = place["E-Mail"];
714+
selectedEmail = place["E-Mail"];
715+
selectedPlace = place
666716
elements.suggestions.innerHTML = "";
667717
});
668718

@@ -835,13 +885,22 @@ function sendEmailRequest() {
835885
return
836886
}
837887
const wantsNewsletter = elements.newsletter.checked
838-
const newsletterEndPoint = "https://fragdenstaat.de/newsletter/update/wahlbrief/subscribe-ajax/"
888+
const state = selectedPlace.state.toLowerCase()
889+
const newsletterEndPoint = `https://fragdenstaat.de/newsletter/update/wahlbrief-${state}/subscribe-ajax/`
839890
const answer = Math.ceil(Math.PI * 2)
840891

892+
const userData = new URLSearchParams({
893+
ars: selectedPlace.ars,
894+
state: selectedPlace.state,
895+
postcode: selectedPlace.ZIP,
896+
place: selectedPlace.ORT,
897+
newsletter: wantsNewsletter ? "1" : "",
898+
})
899+
841900
const data = new URLSearchParams({
842901
email: email,
843-
keyword: wantsNewsletter ? "newsletter" : "",
844-
test: answer.toString()
902+
test: answer.toString(),
903+
data: userData.toString()
845904
});
846905
fetch(newsletterEndPoint, {
847906
method: "POST",

index.html

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,30 @@ <h3 class="mb-3">{% t right.shipping.address %}</h3>
505505
</div>
506506
</div>
507507

508+
509+
<div id="election-hints" class="background-gray-100 py-3 px-3 my-3">
510+
<div class="d-flex align-items-center justify-content-lg-start">
511+
<div id="election-hint-normal" class="election-hint">
512+
<p class="mb-0">
513+
<i class="fas fa-info-circle color-secondary me-2"></i>
514+
{% t right.arrival %} <strong id="arrival-date"></strong>
515+
</p>
516+
</div>
517+
<div id="election-hint-late" class="election-hint">
518+
<p class="mb-0">
519+
<i class="fas fa-exclamation-circle text-danger me-2"></i>
520+
{% t right.arrivallate %}
521+
</p>
522+
</div>
523+
<div id="election-hint-none" class="election-hint">
524+
<p class="mb-0">
525+
<i class="fas fa-exclamation-circle text-danger me-2"></i>
526+
{% t right.noelections %} <strong id="arrival-date"></strong>
527+
</p>
528+
</div>
529+
</div>
530+
</div>
531+
508532
<!-- Email -->
509533

510534
<div class="row mt-3">
@@ -529,6 +553,7 @@ <h4>{% t right.email-reminder %}</h4>
529553
</div>
530554
</div>
531555

556+
532557
<div class="row mt-4">
533558
<div class="col-12 d-flex justify-content-end">
534559
<button class="btn btn-primary btn-lg" type="submit">

terms.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ <h3>BEREITSTELLUNG
313313
<h3 id="Newsletter">Newsletter (Erinnerungsservice)</h3>
314314
<p>
315315
Für den Versand des Newsletters (Erinnerungsservice) erfassen wir zusätzlich Ihre
316-
E-Mail-Adresse. Diese Daten werden für die Dauer des Abonnements
316+
E-Mail-Adresse, Ihre PLZ und Ihren Ort. Diese Daten werden für die Dauer des Abonnements
317317
verarbeitet. Wenn Sie sich wieder austragen, wird auch Ihre E-Mail-Adresse
318318
gelöscht.
319319
</p>
@@ -331,7 +331,7 @@ <h3 id="Newsletter">Newsletter (Erinnerungsservice)</h3>
331331
Einwilligung nach Art. 6 Abs. 1 lit. a DSGVO sowie unsere berechtigten
332332
Interessen nach Art. 6 Abs. 1 lit. f DSGVO. Ein Widerruf der Einwilligung ist
333333
jederzeit möglich. Die personenbezogenen Daten werden zum Zweck der
334-
Information sowie des Direktmarketings verarbeitet.
334+
zielgerichteten Information sowie des Direktmarketings verarbeitet.
335335
</p>
336336

337337
<p>

0 commit comments

Comments
 (0)