0 votes
ago in SoSci Survey (dt.) by s262677 (160 points)

Liebes Support-Team,

ich führe eine Tagebuchstudie durch, in der täglich im PM-Fragebogen ein Screenshot hochgeladen werden soll. Die Serienmails zu den Tagebüchern und dem Follow-Up plane ich mit folgendem Code:

    // Startdatum setzen
$startDatum = time();

// Wochentag des Startdatums bestimmen
$startTag = (int)date('N', $startDatum);

// Tage, an denen Versand erfolgen soll planen
$tage = [ 
  // Coaching Montag -> Di,Mi,Do,Fr,Mo,Di,...
  1 => [1,2,3,4,7,8,9,10,11,14,15,16,17,18,21],
  
  // Coaching Dienstag -> Mi,Do,Fr,Mo,Di,Mi,...
  2 => [1,2,3,6,7,8,9,10,13,14,15,16,17,20,21],
  
  // Coaching Mittwoch -> Do,Fr,Mo,Di,Mi,Do,...
  3 => [1,2,5,6,7,8,9,12,13,14,15,16,19,20,21],
  
  // Coaching Donnerstag -> Fr,Mo,Di,Mi,Do,Fr,...
  4 => [1,4,5,6,7,8,11,12,13,14,15,18,19,20,21],
  
  // Coaching Freitag -> Mo,Di,Mi,Do,Fr,Mo,...
  5 => [3,4,5,6,7,10,11,12,13,14,17,18,19,20,21],
  
  // Coaching Samstag -> Mo,Di,Mi,Do,Fr,Mo,...
  6 => [2,3,4,5,6,9,10,11,12,13,16,17,18,19,20],
  
  // Coaching Sonntag -> Mo,Di,Mi,Do,Fr,Mo,...
  7 => [1,2,3,4,5,8,9,10,11,12,15,16,17,18,19],
];

$tageRelevant = $tage[$startTag];

// Schedule für Serienmails anlegen
// $tag = date('N');

foreach ($tageRelevant as $i => $offset) {
  // Serienmail morgens (2 bis 16)
  mailSchedule(false, $i + 2, strtotime('+' . $offset . ' days 04:00:00', $startDatum));

  // Serienmail abends (17 bis 31)
  mailSchedule(false, $i + 17, strtotime('+' . $offset . ' days 20:00:00', $startDatum));
}

// Serienmail 55 (letzter Screenshot) am Tag nach Diary um 04:00 Uhr (unabhängig von Kalendertag)
$letzterOffset = max($tageRelevant);
$followUpTimestamp = strtotime('+' . ($letzterOffset + 1) . ' days 04:00:00', $startDatum);
mailSchedule(false, 55, $followUpTimestamp);

// Serienmail 47 (FollowUp) am Tag nach Diary um 06:00 Uhr (unabhängig von Kalendertag)
$letzterOffset = max($tageRelevant);
$followUpTimestamp = strtotime('+' . ($letzterOffset + 1) . ' days 06:00:00', $startDatum);
mailSchedule(false, 47, $followUpTimestamp);


// Serienmail 49 (Erinnerung FollowUp) zwei Tage nach Diary um 06:00 Uhr (unabhängig von Kalendertag)
$reminderTimestamp = strtotime('+' . ($letzterOffset + 2) . ' days 06:00:00', $startDatum);
mailSchedule(false, 49, $reminderTimestamp);

Ich möchte nun auch eine Erinnerung programmieren, die verschickt wird, wenn der Screenshot (Fragebogen zu Serienmails 18-31 und 55) nicht hochgeladen wurde. Dazu sollte in der Erinnerung möglichst auch das Datum ausgegeben werden, von dem der Screenshot fehlt.

Ich scheitere immer wieder an verschiedenen Lösungsansätzen. Haben Sie eine Idee, wie dies umgesetzt werden kann?

Vielen Dank!

1 Answer

0 votes
ago by SoSci Survey (350k points)

Dazu sollte in der Erinnerung möglichst auch das Datum ausgegeben werden, von dem der Screenshot fehlt.

Das Datum berechnen sie ja im Code:

foreach ($tageRelevant as $i => $offset) {
  // Serienmail morgens (2 bis 16)
  mailSchedule(false, $i + 2, strtotime('+' . $offset . ' days 04:00:00', $startDatum));

  // Serienmail abends (17 bis 31)
  mailSchedule(false, $i + 17, strtotime('+' . $offset . ' days 20:00:00', $startDatum));
}

Als Text könnte man es wie folgt bekommen:

foreach ($tageRelevant as $i => $offset) {
  // Serienmail morgens (2 bis 16)
  $time1 = strtotime('+' . $offset . ' days 04:00:00', $startDatum);
  mailSchedule(false, $i + 2, $time1);

  // Serienmail abends (17 bis 31)
  $time2 = strtotime('+' . $offset . ' days 20:00:00', $startDatum);
  mailSchedule(false, $i + 17, $time2);

  $text1 = date('d.m.Y', $time1);
  $text2 = date('d.m.Y', $time2);
}

Und das sollte man jetzt auch als benutzerdefiniertes Feld an mailSchedule() übergeben können.

foreach ($tageRelevant as $i => $offset) {
  // Serienmail morgens (2 bis 16)
  $time1 = strtotime('+' . $offset . ' days 04:00:00', $startDatum);
  mailSchedule(false, $i + 2, $time1);

  // Serienmail abends (17 bis 31)
  $time2 = strtotime('+' . $offset . ' days 20:00:00', $startDatum);
  mailSchedule(false, $i + 17, $time2);

  $text1 = date('d.m.Y', $time1);
  // Reminder (32 bis 57)
  mailSchedule(false, $i + 32, $time2 + 7200, ['%custom1%' => $text1]);
}

Jetzt müssen Sie im Fragebogen nur noch die richtige Erinnerugsmail mittels mailRevoke() herausnehmen, sobald etwas hochgeladen wurde. Das sollte sich ja aus der ID der aktuellen Serienmails, die Sie mittels panelData() bekommen, einfach berechnen lassen. Ahüst. Ja, es wird alles langsam ein wenig komplexer, aber Sie halten sich wacker!

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

...