function fengoffice_reminder_email($reminder, &$ret) { $object = $reminder->getObject(); $date = $object->getColumnValue($reminder->getContext()); $valid = true; Hook::fire('validate_reminder_email', $reminder, $valid); if (!$valid) { return; } if ($reminder->getContext() == "due_date" && ($object instanceof ProjectTask || $object instanceof ProjectMilestone)) { if ($object->isCompleted() || $object->isTrashed()) { // don't send due date reminders for completed or trashed tasks if ($object instanceof ProjectTask && $object->isRepetitive()) { // if repetitive task then don't delete the reminder, but disable it $reminder->setDate(EMPTY_DATETIME); $reminder->save(); } else { $reminder->delete(); } return; } } if (!$date instanceof DateTimeValue) { return; } // skip reminders without a date if ($date->getTimestamp() + 24 * 60 * 60 < DateTimeValueLib::now()->getTimestamp()) { // don't send reminders older than a day if ($object instanceof ProjectTask && $object->isRepetitive()) { // if repetitive task then don't delete the reminder, but disable it $reminder->setDate(EMPTY_DATETIME); $reminder->save(); } else { $reminder->delete(); } throw new Exception("Reminder too old"); } Notifier::objectReminder($reminder); if ($object instanceof ProjectTask && $object->isRepetitive()) { // if repetitive task then don't delete the reminder, but disable it $reminder->setDate(EMPTY_DATETIME); $reminder->save(); } else { $reminder->delete(); } $ret++; }