0 votes
in SoSci Survey (dt.) by s252607 (155 points)
edited by SoSci Survey

Hallo zusammen!

Ich möchte eine Tagebuchstudie über eine Arbeitswoche hinweg erstellen. Dabei soll es egal sein, wann der Einstiegsfragebogen beantwortet wird.

Der erste Tagesfragebogen soll am nächsten Arbeitstag ab 17 Uhr ausgefüllt werden (Montag bis Freitag). Das heißt also, wenn jemand Dienstag den Einstiegsfragebogen ausfüllt, sollen die täglichen Fragebögen jeweils am Mittwoch, Donnerstag, Freitag, Montag und Dienstag jeweils um 17 Uhr ausgefüllt werden.

Ist das möglich in der Funktion abzubilden? Es müsste ja ähnlich wie hier funktionieren, nur dass es statt "Monday" Montag/Dienstag/Mittwoch/Donnerstag/Freitag sein muss?

mailSchedule(false, 2, strtotime('next Monday 08:00:00'), [
  '%custom1%' => date('d.m.Y')
])

Viele Grüße

Edit:
Ist es eine sicherere Möglichkeit, einfach wie folgt die Serienmails aufzubauen?
So müsste es doch so sein, dass der nächste Fragebogen immer am darauffolgenden Werktag kommt, oder? Prinzipiell sind es die gleichen Fragebögen. Allerdings würde ich natürlich gerne am letzten Fragebogen noch die letzte Seite anders gestalten, aber man weiß ja nicht, welcher Tag der letzte wäre - gibt es hierzu eine Möglichkeit?
mailSchedule(false, 2, strtotime('next Monday 17:00:00'));
mailSchedule(false, 3, strtotime('next Tuesday 17:00:00'));
mailSchedule(false, 4, strtotime('next Wednesday 17:00:00'));
mailSchedule(false, 5, strtotime('next Donnerstag 17:00:00'));
mailSchedule(false, 6, strtotime('next Freitag 17:00:00'));

by s252607 (155 points)
@SoSci Survey

Ich habe nochmal getestet, ob die Mails jetzt durchgehen. Leider ist das nicht der Fall :-(

Nach dem Ausfüllen des Eingangsfragebogens kommt einfach nicht die Mail zu Tag 1.

Ich schicke hier mal meine Einstellungen. Nicht wundern, ich habe nicht nur 10:10 Uhr ausprobiert und Saturday und Sunday nur eingefügt, um es dieses Wochenende zu testen.
commented 1 minute ago by s252607


Folgendes habe ich als PHP Code am Anfang des Fragebogens zu Tag 1 eingefügt:


$candidates = [
   strtotime('next Monday 00:00:00'),
   strtotime('next Tuesday 00:00:00'),
   strtotime('next Wednesday 00:00:00'),
   strtotime('next Thursday 00:00:00'),
   strtotime('next Friday 00:00:00'),
   strtotime('next Saturday 00:00:00'),
   strtotime('next Sunday 00:00:00'),
];

$nextDay = min($candidates);

$candidates = [
   strtotime('next Monday 17:00:00'),
   strtotime('next Tuesday 17:00:00'),
   strtotime('next Wednesday 17:00:00'),
   strtotime('next Thursday 17:00:00'),
   strtotime('next Friday 17:00:00'),
   strtotime('next Saturday 10:10:00'),
   strtotime('next Sunday 09:00:00'),
];
sort($candidates);

mailSchedule(false, 2, $candidates[0]);


Serienmail 2 ist die richtige und ich habe auch eingestellt, dass das keine Folge Mail/Erinnerung ist.

Was ist da falsch? :-(

1 Answer

0 votes
by SoSci Survey (327k points)

Das wäre eine Möglichkeit, ja - eine andere bestpünde darin, dass Sie erst einmal herausfinden, was der nächste Werktag ist.

$candidates = [
   strtotime('next Monday 00:00:00'),
   strtotime('next Tuesday 00:00:00'),
   strtotime('next Wednesday 00:00:00'),
   strtotime('next Donnerstag 00:00:00'),
   strtotime('next Freitag 00:00:00')
];

Das tolle an Unix-Zeitstempeln - es sind Zahlen. Und wenn ich wissen will, welcher dieser Zeitpunkt als nächstes kommt, ist das ganz einfach:

$nextDay = min($candidates);

AUf dieser Basis könnten wir jetzt 17:00 an diesem Tag, 17:00 Uhr am nächsten Tag u.s.w. verwenden. Aber dann hätten Sie auch das Wochenende dabei, wenn Sie die nächsten 5 Tage verwenden.

Also andere Strategie: Sortieren sie die 5 Kandidaten einfach:

$candidates = [
   strtotime('next Monday 17:00:00'),
   strtotime('next Tuesday 17:00:00'),
   strtotime('next Wednesday 17:00:00'),
   strtotime('next Donnerstag 17:00:00'),
   strtotime('next Freitag 17:00:00')
];
sort($candidates);

So, jetzt können Sie die Werte einfach in der neuen Reihenfolge verwenden:

mailSchedule(false, 2, $candidates[0]);
mailSchedule(false, 3, $candidates[1]);
mailSchedule(false, 4, $candidates[2]);
// u.s.w.

Manchmal ist Programmieren echt schön, oder?

by s252607 (155 points)
Wow, vielen lieben Dank für die Antwort! Das ist sehr gut nachvollziehbar. Ich probiere es direkt mal aus (und nutze erstmal auch heute = Samstag, damit ich es prüfen kann, ob es klappt. Mit meiner Lösung ist nämlich nichts durchgekommen).
by SoSci Survey (327k points)
> Nach dem Ausfüllen des Eingangsfragebogens kommt einfach nicht die Mail zu Tag 1.

Die dürfte ja auch erst am Montag kommen, oder?

Ob die Zeitpunkte stimmen, können Sie einfach mittels date() prüfen:

debug(date('d.m.Y H:i', $candidates[0]));
debug(date('d.m.Y H:i', $candidates[1]));
debug(date('d.m.Y H:i', $candidates[2]));
// u.s.w.
by s252607 (155 points)
edited by s252607
Ich habe es nochmal geprüft. Leider kommt keine Mail (an keine der drei Mails, die den Einstiegs Fragebogen ausgefüllt haben). Folgenden Code habe ich zuletzt probiert (platziert am Anfang des Fragebogens als PHP). Die Serienmail ist auch die richtige…


$candidates = [
   strtotime('next Monday 00:00:00'),
   strtotime('next Tuesday 00:00:00'),
   strtotime('next Wednesday 00:00:00'),
   strtotime('next Thursday 00:00:00'),
   strtotime('next Friday 00:00:00'),
];

$nextDay = min($candidates);

$candidates = [
   strtotime('next Monday 17:00:00'),
   strtotime('next Tuesday 17:00:00'),
   strtotime('next Wednesday 17:00:00'),
   strtotime('next Thursday 17:00:00'),
   strtotime('next Friday 17:00:00'),
];
sort($candidates);

mailSchedule(false, 2, $candidates[0],['expire' => 43200,'status' => 'incomplete']);



// Erinnerungen

$erinnerungen = [
   strtotime('next Monday 19:00:00'),
   strtotime('next Tuesday 19:00:00'),
   strtotime('next Wednesday 19:00:00'),
   strtotime('next Thursday 19:00:00'),
   strtotime('next Friday 19:00:00'),
];
sort($erinnerungen);

mailSchedule(false, 8, $erinnerungen[0], ['status' => 'no-response'], ['expire' => 43200,'status' => 'incomplete']);

debug(date('d.m.Y H:i', $candidates[0]));
debug(date('d.m.Y H:i', $erinnerungen[0]));


Wenn ich debug nutze, erscheint auch das Datum am nächsten Werktag. Ich verstehe einfach nicht, warum es nicht funktioniert :-(


Edit: Muss der PHP Code gesammelt auf den ersten Fragebogen? Ich hatte den zuvor immer bei jeden einzelnen Tagesfragebogen?

Edit2: das war wohl die ganze Zeit mein Denkfehler: der PHP Code muss in den Fragebogen A2! Ich habe es ausprobiert und nun sind die Mails auch angekündigt unter Serienmails verschicken! Eine Frage aber noch: Kann ich es auch noch so einstellen, dass wenn man den Eingangsfragebogen (A1 bzw. A2) vor 14 Uhr ausfüllt, dass der Tagesfragebogen (B1) dennoch um 17 Uhr versandt wird (und nicht wie aktuell am nächsten bzw. hier morgigen Werktag?)Muss ich da statt 00:00:00 einfach 14:00:00 nehmen bei:

$candidates = [
   strtotime('next Monday 00:00:00'),
   strtotime('next Tuesday 00:00:00'),
   strtotime('next Wednesday 00:00:00'),
   strtotime('next Donnerstag 00:00:00'),
   strtotime('next Freitag 00:00:00')
];

? Das klappt noch nicht …
by SoSci Survey (327k points)
> Muss der PHP Code gesammelt auf den ersten Fragebogen?

Die Frage haben Sie ja schon beantwortet. Ja, PHP-Code wird nur dann ausgeführt, wenn der Fragebogen auf der entsprechenden Seite angezeigt wird - entsprechend muss mailSchedule() dort platziert werden, wo der Termin für den Versand festgelegt werden soll.

> Kann ich es auch noch so einstellen, dass wenn man den Eingangsfragebogen (A1 bzw. A2) vor 14 Uhr ausfüllt, dass der Tagesfragebogen (B1) dennoch um 17 Uhr versandt wird

Versuchen Sie es bitte mal wie folgt:

$reference = strtotime('-14 hours');
$candidates = [
   strtotime('next Monday 19:00:00', $reference),
   strtotime('next Tuesday 19:00:00', $reference),
...

Damit wird das "next Monday" etc. von dem Zeitpunkt vor 14 Stunden bestimmt. Bis 14 Uhr ist das "gestern".
by s252607 (155 points)
Vielen lieben Dank, das ist sehr hilfreich! Das hat funktioniert. Mein Denkfehler war seit Tagen die falsche Platzierung des PHP-Codes ... Nun ist es geschafft!

Darf ich abschließend noch fragen, ob Sie denken, dass dieser Code so funktioniert? Ich habe nur noch ein Befehl mit expire eingefügt, damit der Fragebogen der einzelnen Tage nach 12 Stunden nicht mehr aufrufbar ist (und man stattdessen dann den nachfolgenden Fragebogen des nächsten Tages nutzt). Der Befehl muss ja vermutlich nur in mailschedule für die Einladung zum Fragebogen, nicht aber in die Erinnerung, oder?

$candidates = [
   strtotime('next Monday 00:00:00'),
   strtotime('next Tuesday 00:00:00'),
   strtotime('next Wednesday 00:00:00'),
   strtotime('next Thursday 00:00:00'),
   strtotime('next Friday 00:00:00'),
];

$nextDay = min($candidates);

$reference = strtotime('-14 hours');
$candidates = [
   strtotime('next Monday 17:00:00', $reference),
   strtotime('next Tuesday 17:00:00', $reference),
   strtotime('next Wednesday 17:00:00', $reference),
   strtotime('next Thursday 17:00:00', $reference),
   strtotime('next Friday 17:00:00', $reference),
];

sort($candidates);

mailSchedule(false, 2, $candidates[0], ['expire' => 43200,'status' => 'incomplete']);
mailSchedule(false, 3, $candidates[1], ['expire' => 43200,'status' => 'incomplete']);
mailSchedule(false, 4, $candidates[2], ['expire' => 43200,'status' => 'incomplete']);
mailSchedule(false, 5, $candidates[3], ['expire' => 43200,'status' => 'incomplete']);
mailSchedule(false, 6, $candidates[4], ['expire' => 43200,'status' => 'incomplete']);




// Erinnerungen

$erinnerungen = [
   strtotime('next Monday 00:00:00'),
   strtotime('next Tuesday 00:00:00'),
   strtotime('next Wednesday 00:00:00'),
   strtotime('next Thursday 00:00:00'),
   strtotime('next Friday 00:00:00'),
];

$nextDay2 = min($erinnerungen);

$reference = strtotime('-14 hours');

$erinnerungen = [
   strtotime('next Monday 19:30:00', $reference),
   strtotime('next Tuesday 19:30:00', $reference),
   strtotime('next Wednesday 19:30:00', $reference),
   strtotime('next Thursday 19:30:00', $reference),
   strtotime('next Friday 19:30:00', $reference),
];
sort($erinnerungen);

mailSchedule(false, 8, $erinnerungen[0], ['status' => 'no-response']);
mailSchedule(false, 9, $erinnerungen[1], ['status' => 'no-response']);
mailSchedule(false, 10, $erinnerungen[2], ['status' => 'no-response']);
mailSchedule(false, 11, $erinnerungen[3], ['status' => 'no-response']);
mailSchedule(false, 12, $erinnerungen[4], ['status' => 'no-response']);


debug(date('d.m.Y H:i', $candidates[0]));
debug(date('d.m.Y H:i', $candidates[1]));
debug(date('d.m.Y H:i', $candidates[2]));
debug(date('d.m.Y H:i', $candidates[3]));
debug(date('d.m.Y H:i', $candidates[4]));

debug(date('d.m.Y H:i', $erinnerungen[0]));
debug(date('d.m.Y H:i', $erinnerungen[1]));
debug(date('d.m.Y H:i', $erinnerungen[2]));
debug(date('d.m.Y H:i', $erinnerungen[3]));
debug(date('d.m.Y H:i', $erinnerungen[4]));
by SoSci Survey (327k points)
> Darf ich abschließend noch fragen, ob Sie denken, dass dieser Code so funktioniert?

Können Sie fragen, aber ich werde nur eingeschränkt antworten können, denn frei Auge sehe ich auch nicht, ob ein Code funktioniert.

Entfernen Sie mal die Dopplung bei $erinnerung. Und vielleicht möchten Sie den Reminder lieber fix 150 Minuten nach der Einladung verschicken - der Kniff mit "next Monday" sollte zwar funktionieren, solange es derselbe Tag ist - aber es bleibt ein Restrisiko, wenn der obere Teil des Codes um 23:59:59 ausgeführt wird und dann - nachdem sie $reference neu definieren - der unteren Teil am nächsten Tag um 00:00:00. Mit dem fixen Zeitabstand würde man dieses minimale Restrisiko entfernen.

mailSchedule(false, 8, $candidates[0] + 150 * 60, ['status' => 'no-response']);

Ansonsten müssen Sie den Code bitte einfach ein wenig testen. Mal vor 14 Uhr, mal nach 14 Uhr, mal am Freitag.
by s252607 (155 points)
Vielen Dank für das Feedback: ich ahbe den Code für die Erinnerung angepasst und es scheint alles zu funktionieren :)


Viele Grüße

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

...