synergy/server/controller/RunNotificationCtrl.php (170 lines of code) (raw):
<?php
namespace Synergy\Controller;
use Synergy\App\Synergy;
use Synergy\DB\RunNotificationDAO;
use Synergy\Model\Run\RunNotification;
use Synergy\Model\TestAssignment;
use Synergy\Providers\EmailCtrl;
use Synergy\Misc\Util;
use Synergy\DB\DB_DAO;
/**
* Description of RunNotificationCtrl
*
* @author vriha
*/
class RunNotificationCtrl {
private $rnDao;
private $emailsEnabled = true;
/** @var EmailCtrl */
private $emailProvider;
function __construct() {
$this->rnDao = new RunNotificationDAO();
$this->emailProvider = Synergy::getProvider("email");
if (defined('SEND_EMAIL') && intval(SEND_EMAIL) === 0) {
$this->emailsEnabled = false;
}
}
/**
* Sends email notifications to all users with incomplete test assignments regardless if it has or hasn't been already sent or how many days are left
* @param type $testRunId
* @return int number of notified users
*/
public function sendNotificationsNoLimits($testRunId) {
if (!$this->emailsEnabled) {
return 0;
}
$processed = array();
$meta = $this->getRunEndDateAndNotificationLimit($testRunId);
$deadline = $meta[0];
date_default_timezone_set('UTC');
$now = time();
$runEnd = strtotime($deadline);
$daysLeft = round(($runEnd - $now) / (60 * 60 * 24));
$allAssignmentsIds = array();
$allReviewsIds = array();
$assignments = $this->getUnfinishedAssignments($testRunId);
$reviewCtrl = new ReviewCtrl();
$reviews = $reviewCtrl->getAssignments($testRunId);
foreach ($assignments as $assignment) {
if (!array_key_exists($assignment->username, $processed)) {
$n = new RunNotification($assignment->username, $assignment->runTitle, $testRunId);
$n->email = $assignment->getEmail();
$processed[$n->username] = $n;
}
$n->addAssignment($assignment);
array_push($allAssignmentsIds, $assignment->id);
}
foreach ($reviews as $review) {
if (!array_key_exists($review->username, $processed)) {
$n = new RunNotification($review->username, $review->runTitle, $testRunId);
$n->email = $review->getEmail();
$processed[$n->username] = $n;
}
$n->addReview($review);
array_push($allReviewsIds, $review->id);
}
$notified = 0;
$ctrl = new UserCtrl();
foreach ($processed as $user) {
if ($ctrl->getUser($user->username)->emailNotifications) {
$body = ($this->emailProvider->useHTML) ? $user->getEmailBodyHTML($daysLeft, $deadline) : $user->getEmailBody($daysLeft, $deadline);
if (!is_null($user->email) && strlen($user->email) > 0) {
$this->emailProvider->send($this->emailProvider->compose($body, $user->getEmailSubject($daysLeft), $user->email));
} else {
$this->emailProvider->send($this->emailProvider->compose($body, $user->getEmailSubject($daysLeft), $user->username . "@" . DOMAIN));
}
$notified++;
}
}
$this->markAssignmentsNotified($allAssignmentsIds);
return $notified;
}
/**
* Sends email notifications to all users with incomplete test assignments
* @param type $testRunId
* @return int number of notified users
*/
public function sendNotifications($testRunId) {
if (!$this->emailsEnabled) {
return 0;
}
$processed = array();
$meta = $this->getRunEndDateAndNotificationLimit($testRunId);
$deadline = $meta[0];
date_default_timezone_set('UTC');
$now = time();
$runEnd = strtotime($deadline);
$daysLeft = round(($runEnd - $now ) / (60 * 60 * 24));
if (round(($runEnd - $now ) / (60 * 60)) > ($meta[1] * 24) || $daysLeft < 0 || $meta[1] < 0) {
return 0;
}
$allAssignmentsIds = array();
$allReviewsIds = array();
$assignments = $this->getUnfinishedAssignmentsWONotif($testRunId);
$reviewCtrl = new ReviewCtrl();
$reviews = $reviewCtrl->getAssignments($testRunId);
foreach ($assignments as $assignment) {
if (!array_key_exists($assignment->username, $processed)) {
$n = new RunNotification($assignment->username, $assignment->runTitle, $testRunId);
$n->email = $assignment->getEmail();
$processed[$n->username] = $n;
}
$n->addAssignment($assignment);
array_push($allAssignmentsIds, $assignment->id);
}
foreach ($reviews as $review) {
if (!array_key_exists($review->username, $processed)) {
$n = new RunNotification($review->username, $review->runTitle, $testRunId);
$n->email = $review->getEmail();
$processed[$n->username] = $n;
}
$n->addReview($review);
array_push($allReviewsIds, $review->id);
}
$notified = 0;
$ctrl = new UserCtrl();
foreach ($processed as $user) {
if ($ctrl->getUser($user->username)->emailNotifications) {
$body = ($this->emailProvider->useHTML) ? $user->getEmailBodyHTML($daysLeft, $deadline) : $user->getEmailBody($daysLeft, $deadline);
if (!is_null($user->email) && strlen($user->email) > 0) {
$this->emailProvider->send($this->emailProvider->compose($body, $user->getEmailSubject($daysLeft), $user->email));
} else {
$this->emailProvider->send($this->emailProvider->compose($body, $user->getEmailSubject($daysLeft), $user->username . "@" . DOMAIN));
}
$notified++;
}
}
$this->markAssignmentsNotified($allAssignmentsIds);
return $notified;
}
public function countNotifications($testRunId) {
if (!$this->emailsEnabled) {
return 0;
}
$processed = array();
$meta = $this->getRunEndDateAndNotificationLimit($testRunId);
$deadline = $meta[0];
date_default_timezone_set('UTC');
$now = time();
$runEnd = strtotime($deadline);
$daysLeft = round(($runEnd - $now ) / (60 * 60 * 24));
// if (round(($runEnd - $now ) / (60 * 60)) > ($meta[1]*24) || $daysLeft < 0 || $meta[1] < 0) {
// return 0;
// }
$testers = "";
$assignments = $this->getUnfinishedAssignmentsWONotif($testRunId);
foreach ($assignments as $assignment) {
if (!array_key_exists($assignment->username, $processed)) {
$n = new RunNotification($assignment->username, $assignment->runTitle, $testRunId);
$processed[$n->username] = $n;
$testers = $testers . ";" . $n->username;
}
$n->addAssignment($assignment);
}
$notified = 0;
$ctrl = new UserCtrl();
foreach ($processed as $user) {
if ($ctrl->getUser($user->username)->emailNotifications) {
$notified++;
}
}
$e = array(0 => $notified, 1 => $testers);
return $e;
}
/**
*
* @param TestAssignment[] $testRunId
*/
private function getUnfinishedAssignments($testRunId) {
return $this->rnDao->getUnfihisedAssignments($testRunId);
}
/**
* Returns only those assignments that are not finished and at the same time notification_sent is set to 0
* @param TestAssignment[] $testRunId
*/
private function getUnfinishedAssignmentsWONotif($testRunId) {
return $this->rnDao->getUnfinishedAssignmentsWONotif($testRunId);
}
private function getRunEndDateAndNotificationLimit($testRunId) {
return $this->rnDao->getRunEndDateAndNotificationLimit($testRunId);
}
/**
* Marks given assignments as notified to prevent future notifications
* @param int[] $allAssignmentsIds array of assignments ID to be marked as notified
*/
private function markAssignmentsNotified($allAssignmentsIds) {
if (count($allAssignmentsIds) > 0) {
$sqlString = Util::arrayToSQLOR($allAssignmentsIds, "id");
DB_DAO::executeQuery("UPDATE test_assignement SET notification_sent=1 WHERE " . $sqlString);
}
}
}