Autoassign logic is finished

This commit is contained in:
Mike Koch 2017-03-11 23:43:46 -05:00
parent af789a7060
commit 06a38e9383
4 changed files with 156 additions and 7 deletions

View File

@ -4,30 +4,55 @@ namespace BusinessLogic\Security;
class UserContext { class UserContext {
/* @var $id int */
public $id; public $id;
/* @var $username string */
public $username; public $username;
/* @var $admin bool */
public $admin; public $admin;
/* @var $name string */
public $name; public $name;
/* @var $email string */
public $email; public $email;
/* @var $signature string */
public $signature; public $signature;
/* @var $language string|null */
public $language; public $language;
/* @var $categories int[] */
public $categories; public $categories;
/* @var $permissions string[] */
public $permissions; public $permissions;
/** /* @var UserContextPreferences */
* @var UserContextPreferences
*/
public $preferences; public $preferences;
/** /* @var UserContextNotifications */
* @var UserContextNotifications
*/
public $notificationSettings; public $notificationSettings;
/* @var $autoAssign bool */
public $autoAssign; public $autoAssign;
/* @var $ratingNegative int */
public $ratingNegative; public $ratingNegative;
/* @var $ratingPositive int */
public $ratingPositive; public $ratingPositive;
/* @var $rating float */
public $rating; public $rating;
/* @var $totalNumberOfReplies int */
public $totalNumberOfReplies; public $totalNumberOfReplies;
/* @var $active bool */
public $active; public $active;
/** /**

View File

@ -31,7 +31,16 @@ class Autoassigner {
$potentialUsers = $this->userGateway->getUsersByNumberOfOpenTickets($heskSettings); $potentialUsers = $this->userGateway->getUsersByNumberOfOpenTickets($heskSettings);
foreach ($potentialUsers as $potentialUser) {
if ($potentialUser->admin ||
(in_array($categoryId, $potentialUser->categories) &&
in_array('can_view_tickets', $potentialUser->permissions) &&
in_array('can_reply_tickets', $potentialUser->permissions))) {
return $potentialUser;
}
}
return $potentialUsers[0];
return null;
} }
} }

View File

@ -63,6 +63,10 @@ class UserGateway extends CommonDao {
return $row['email']; return $row['email'];
} }
/**
* @param $heskSettings array
* @return UserContext[]
*/
function getUsersByNumberOfOpenTickets($heskSettings) { function getUsersByNumberOfOpenTickets($heskSettings) {
$this->init(); $this->init();

View File

@ -47,14 +47,20 @@ class AutoassignerTest extends TestCase {
self::assertThat($owner, self::isNull()); self::assertThat($owner, self::isNull());
} }
function getPermissionsForUser() {
return array('can_view_tickets', 'can_reply_tickets');
}
function testItReturnsTheUsersWithLeastOpenTickets() { function testItReturnsTheUsersWithLeastOpenTickets() {
//-- Arrange //-- Arrange
$userWithNoOpenTickets = new UserContext(); $userWithNoOpenTickets = new UserContext();
$userWithNoOpenTickets->id = 1; $userWithNoOpenTickets->id = 1;
$userWithNoOpenTickets->categories = array(1); $userWithNoOpenTickets->categories = array(1);
$userWithNoOpenTickets->permissions = $this->getPermissionsForUser();
$userWithOneOpenTicket = new UserContext(); $userWithOneOpenTicket = new UserContext();
$userWithOneOpenTicket->id = 2; $userWithOneOpenTicket->id = 2;
$userWithOneOpenTicket->categories = array(1); $userWithOneOpenTicket->categories = array(1);
$userWithOneOpenTicket->permissions = $this->getPermissionsForUser();
$usersToReturn = array( $usersToReturn = array(
$userWithNoOpenTickets, $userWithNoOpenTickets,
$userWithOneOpenTicket $userWithOneOpenTicket
@ -70,4 +76,109 @@ class AutoassignerTest extends TestCase {
//-- Assert //-- Assert
self::assertThat($actual, self::equalTo($userWithNoOpenTickets)); self::assertThat($actual, self::equalTo($userWithNoOpenTickets));
} }
function testItOnlyReturnsUsersWhoCanAccessTheCategory() {
//-- Arrange
$userWithNoOpenTickets = new UserContext();
$userWithNoOpenTickets->id = 1;
$userWithNoOpenTickets->categories = array(1);
$userWithNoOpenTickets->permissions = $this->getPermissionsForUser();
$userWithOneOpenTicket = new UserContext();
$userWithOneOpenTicket->id = 2;
$userWithOneOpenTicket->categories = array(2);
$userWithOneOpenTicket->permissions = $this->getPermissionsForUser();
$usersToReturn = array(
$userWithNoOpenTickets,
$userWithOneOpenTicket
);
$this->userGateway->method('getUsersByNumberOfOpenTickets')
->with($this->heskSettings)
->willReturn($usersToReturn);
//-- Act
$actual = $this->autoassigner->getNextUserForTicket(2, $this->heskSettings);
//-- Assert
self::assertThat($actual, self::equalTo($userWithOneOpenTicket));
}
function testItReturnsAdminUsers() {
//-- Arrange
$userWithNoOpenTickets = new UserContext();
$userWithNoOpenTickets->id = 1;
$userWithNoOpenTickets->categories = array(1);
$userWithNoOpenTickets->permissions = $this->getPermissionsForUser();
$userWithNoOpenTickets->admin = true;
$userWithOneOpenTicket = new UserContext();
$userWithOneOpenTicket->id = 2;
$userWithOneOpenTicket->categories = array(2);
$userWithOneOpenTicket->permissions = $this->getPermissionsForUser();
$usersToReturn = array(
$userWithNoOpenTickets,
$userWithOneOpenTicket
);
$this->userGateway->method('getUsersByNumberOfOpenTickets')
->with($this->heskSettings)
->willReturn($usersToReturn);
//-- Act
$actual = $this->autoassigner->getNextUserForTicket(2, $this->heskSettings);
//-- Assert
self::assertThat($actual, self::equalTo($userWithNoOpenTickets));
}
function testItOnlyReturnsUsersWhoCanViewAndRespondToTickets() {
//-- Arrange
$userWithNoOpenTickets = new UserContext();
$userWithNoOpenTickets->id = 1;
$userWithNoOpenTickets->categories = array(1);
$userWithNoOpenTickets->permissions = array();
$userWithOneOpenTicket = new UserContext();
$userWithOneOpenTicket->id = 2;
$userWithOneOpenTicket->categories = array(1);
$userWithOneOpenTicket->permissions = $this->getPermissionsForUser();
$usersToReturn = array(
$userWithNoOpenTickets,
$userWithOneOpenTicket
);
$this->userGateway->method('getUsersByNumberOfOpenTickets')
->with($this->heskSettings)
->willReturn($usersToReturn);
//-- Act
$actual = $this->autoassigner->getNextUserForTicket(1, $this->heskSettings);
//-- Assert
self::assertThat($actual, self::equalTo($userWithOneOpenTicket));
}
function testItReturnsNullWhenNoOneCanHandleTheTicket() {
//-- Arrange
$userWithNoOpenTickets = new UserContext();
$userWithNoOpenTickets->id = 1;
$userWithNoOpenTickets->categories = array(1);
$userWithNoOpenTickets->permissions = $this->getPermissionsForUser();
$userWithOneOpenTicket = new UserContext();
$userWithOneOpenTicket->id = 2;
$userWithOneOpenTicket->categories = array(1);
$userWithOneOpenTicket->permissions = $this->getPermissionsForUser();
$usersToReturn = array(
$userWithNoOpenTickets,
$userWithOneOpenTicket
);
$this->userGateway->method('getUsersByNumberOfOpenTickets')
->with($this->heskSettings)
->willReturn($usersToReturn);
//-- Act
$actual = $this->autoassigner->getNextUserForTicket(2, $this->heskSettings);
//-- Assert
self::assertThat($actual, self::isNull());
}
} }