Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

0 votes

Lieber Support,

wir haben folgenden Fall:
- wir führen eine 14 tägige Befragung durch, bei der jeder Proband einmal morgens und einmal abends befragt wird. Dafür wird der Fragebogen unterbrochen.

  • Dieser unterbrochene Fragebogen soll am selben Tag wieder fortgeführt werden. Dafür kommt eine Person bis 15:00 für den Morgenteil und soll - und hier liegt das Problem - genau am selben Tag um 16:00 eine Email für die Fortsetzung bekommen.

Unser aktueller Code sieht so aus:

option('backbutton', false);
// Prüfen, wie viel Zeit seit Beginn des Befragung vergangen ist
// Falls es weniger als 1 Stunde ist (1 * 3600 Sekunden), wird das Interview unterbrochen
if (caseTime('begin') < 1 * 3600) {
  text('Pause'); // Verabschiedung zum ersten Teil anzeigen
  option('resume', true); // Hinweis auf fortgesetztes Interview verhindern
  option('nextbutton', false); // Weiter-Knopf ausblenden (Interview unterbrechen)
  // Serienmail mit der Kennung 22 (Folgemail) um 16:00 Uhr versenden
  mailResume(false, 22, **16, 0**);
} else {
  // Ist der Teilnehmer nach 1 Stunde zurückgekehrt? Dann geht es nun direkt weiter
  goToPage('next');
}

Das Problem ist die Zeitangaben (16:00) - ich habe sie mal fett markiert, die nicht funktioniert, sondern die Email wird direkt verschickt. Leider können wir kein relatives Datum nutzen, da der Beginn ein Zeitfenster ist. Ein konkrete Zeitpunkt müsste täglich geändert werden, weil die Erhebung 14 Tage einen täglichen Eintrag erfordert.

Notfalls müssen wir es so lösen, da es wahrscheinlich auch keine gute Möglichkeit gibt, die Serienmail wieder zu verwenden und diese für jeden Tag neu angelegt werden muss und dann täglich in in den Fragebogen eingefügt werden muss. Jedenfalls haben wir keine gefunden....

Vielleicht haben wir aber auch nur Tomaten auf den Augen :)

Danke für die Unterstützung!

in SoSci Survey (dt.) by s085794 (160 points)

1 Answer

0 votes

wir führen eine 14 tägige Befragung durch, bei der jeder Proband einmal morgens und einmal abends befragt wird. Dafür wird der Fragebogen unterbrochen.

Bei mehr als 2 Befragungswellen würde ich von einer Unterrechungs-Lösung eher abraten. Denn wenn ein Teilnehmer eine Befragungswelle auslässt oder den Fragebogen sogar zwischen zwei Unterbrechungspunkten unterbricht, dann kann das schnell zu verwirrenden Konstellationen führen.

Wenn Sie nur jeweils den Fragebogen eines Tages unterbrechen, ist alles in Ordnung.

mailResume(false, 22, 16, 0);

Damit sagen Sie SoSci Survey, dass es die Serienmail Nr. 22 in 16 Sekunden versenden soll und den Platzhalter %custom1% mit dem Wert "0" belegen soll. Mehr dazu s. mailResume()

Verwenden Sie stattdessen strtotime().

mailResume(false, 22, strtotime('16:00'));

und diese für jeden Tag neu angelegt werden muss

Nur am Rande: Wenn Sie mehrere Kopien einer Serienmail benötigen, dann verwenden Sie einfach den Knopf zum Kopieren der Serienmail, rechts in der Serienmail-Liste.

by SoSci Survey (205k points)
Vielen Dank, das hilft sehr weiter.  Wir haben jetzt den "mailresume" - Befehl ausgebaut und schicken eine automatisierte tägliche Erinnerungsmail für den 2. Teil für jedes angefangene Interview (FB 1=. Alle, die nicht teilgenommen haben, bekommen einen alternativen Link für einen anderen Fragebogen (FB2). Das geht über eine 2. Serienmail. Die Tests haben wunderbar funktioniert.

Das meine ich mit Tomaten auf den Augen - wahrscheinlich ist die Serienmail-Variante die schlauste Lösung, da sonst die Teilnehmer nicht optimal in Wellen teilnehmen können. Es ist wenig sinnig, jeden Tag eine andere Serienmail in den mailResume-Befehl einzutragen :), auch wenn das Problem mit der Uhrzeit offensichtlich keins ist/nur meins war.

Dass der strtotime() - Befehl einfach das Datum übernimmt, wenn man ihm einen konkrete Zeit angibt, habe ich der Doku nicht entnehmen können. Das könnte daran liegen, dass die Doku nur mit relativen Datenabständen (in xx Tagen) oder mit absoluten Daten (also genau am 01.01.1970) arbeitet, siehe https://www.php.net/manual/de/function.strtotime.php und https://www.soscisurvey.de/help/doku.php/de:create:functions:mailresume

Danke auch für den Hinweis für die Kopieroptionen der Serienmails, die wir bereits  fleißig nutzen. Kein Mensch möchte bei 84 Serienmail jede einzeln verfassen. ;)

Wenn man es richtig machen will, müsste man noch die Zugriffszeiten definieren. Die Fortsetzung für FB 1 geht nach einer Stunde, aber alle Teilnehmer, die einen Link zu FB 2 erhalten, könnten theoretisch auch an FB 1 teilnehmen, wenn sie den Link aus der ersten Mail anklicken. Kann man das blockieren? Vielleicht ist das Problem auch nicht so wichtig technisch zu lösen, weil die Wahrscheinlich groß ist, dass man den Link aus Mail 2 nimmt und an FB 2 teilnimmt.

Danke für den tollen Support, es ist immer wieder eine Freude!
In Ihrem Fall könnten Sie auf Seite 1 des Fragebogens einfach einen PHP-Filter definieren, der die Teilnahme nur bis 15:30 Uhr erlaubt:

if (time() > strtotime('15:30:00')) {
  text('so_nicht');
  buttonHide();
  pageStop();
}
Ha! Cool. Funktioniert. :) Danke für den Tipp.  FB 1 kann man jetzt bis 15:00 abrufen, FB 2 erst ab 16:00.  Nur bei der finalen Zeitbegrenzung bin ich nicht 100% sicher, obwohl ich das eigentlich getestet habe. FB 2 darf nur zwischen 16:00 und 02:00 des Folgetages bearbeitet werden.  Eigentlich müssten man dafür den Fragebogen zwischen 2:00 und 16:00 sperren.

Ich habe jetzt ein bisschen mit den Befehlen rumgespielt und denke, dass das für FB 2 funktioniert.

if ((time() < strtotime('16:00:00')) or (time() > strtotime('02:00:00'))) {
  text('Sperrung_Abendteil');
  buttonHide();
  pageStop();
}

Parallel dazu kann ich auch FB 1 sperren, der nur zwischen 6:00 und 15:00 abgerufen werden soll:

if ((time() < strtotime('6:00:00')) or (time() > strtotime('15:00:00'))) {
  text('Sperrung_Morgenteil');
  buttonHide();
  pageStop();
}


Ich bin mir nur nicht sicher, ob die OR-Verknüpfung das tut, was ich will. Müsste aber passen, oder? Meine Tests sagen ja, aber ich traue dem Frieden nicht...

Danke!
Das mti dem "or" ist korrekt. Dadurch wird geprüft, ob entweder die linke ODER die rechte Klammer zutrifft.

Ganz sicher bin ich mir allerdings nicht beim strtotime('02:00:00') - prinzipiell wäre denkbar, dass dabei 2 Uhr letzte Nacht (also am heutigen Tag) oder nächste Nacht herauskommt. Wenn es in Ihren Tests funktioniert, dann funktioniert es wohl so, wie von Ihnen gedacht.

Testen können Sie es, indem Sie sich die Zeit einfach anzeigen lassen:

debug(date('d.m.Y H:i', strtotime('02:00:00')));
Der Debug-Code funktioniert leider nicht.
Fehler im Fragebogen: time() expects exactly 0 parameters, 2 given
Zeile: 3

Offensichtlich müsste man die interne Zeitangabe erst konvertieren...
Pardon, es muss date() heißen, nicht time() - ich habe es oben geändert.
Danke, der Code hat jetzt das richtige Debug-Log ausgegeben. Ich verstehe so wenig von php, dass ich den Fehler nicht mal gefunden habe :) - obwohl eine Uhrzeit offensichtlich was anderes ist als ein Datum.

For further reference: Wie fast zu erwarten war, nutzt der Code denselben Tag 2:00 morgens, d.h. am 16.06. wird dann auf 2:00 morgens am 16.06. geprüft.

Das reicht aber für meine Zwecke, weil die Person, wenn sie morgen (17.06.) z.B. um 0:01 auf den Fragebogen geht, mit dem Eingangsdatum 17.06. kommt. Damit kommt sie natürlich auch nicht weiter, wie es intendiert ist. Danke für die Hilfe!
> Wie fast zu erwarten war, nutzt der Code denselben Tag 2:00 morgens

Nur der Vollständigkeit halber: Man könnte folgendes schreiben:
strtotime('+1 days 02:00:00')
...