Majority of create ticket logic done. Just need to add attachments(?) and retriever SQL-specific fields
This commit is contained in:
parent
1a8a989e87
commit
489f191a13
21
api/BusinessLogic/Tickets/Autoassigner.php
Normal file
21
api/BusinessLogic/Tickets/Autoassigner.php
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Created by PhpStorm.
|
||||||
|
* User: mkoch
|
||||||
|
* Date: 2/12/2017
|
||||||
|
* Time: 4:54 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace BusinessLogic\Tickets;
|
||||||
|
|
||||||
|
|
||||||
|
class Autoassigner {
|
||||||
|
/**
|
||||||
|
* @param $categoryId int
|
||||||
|
* @param $heskSettings array
|
||||||
|
* @return int|null The user ID, or null if no user found
|
||||||
|
*/
|
||||||
|
function getNextUserForTicket($categoryId, $heskSettings) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,7 +3,6 @@
|
|||||||
namespace BusinessLogic\Tickets;
|
namespace BusinessLogic\Tickets;
|
||||||
|
|
||||||
class CreateTicketByCustomerModel {
|
class CreateTicketByCustomerModel {
|
||||||
// Metadata
|
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
@ -24,7 +23,6 @@ class CreateTicketByCustomerModel {
|
|||||||
*/
|
*/
|
||||||
public $category;
|
public $category;
|
||||||
|
|
||||||
// Message
|
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
@ -35,13 +33,18 @@ class CreateTicketByCustomerModel {
|
|||||||
*/
|
*/
|
||||||
public $message;
|
public $message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
public $html;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
public $customFields;
|
public $customFields;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var double[]|null
|
* @var string[]|null The latitude/longitude pair, or relevant error code (E-#)
|
||||||
*/
|
*/
|
||||||
public $location;
|
public $location;
|
||||||
|
|
||||||
|
|||||||
@ -112,7 +112,7 @@ class Ticket {
|
|||||||
public $name;
|
public $name;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string|null
|
||||||
*/
|
*/
|
||||||
public $email;
|
public $email;
|
||||||
|
|
||||||
@ -127,12 +127,12 @@ class Ticket {
|
|||||||
public $priorityId;
|
public $priorityId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string|null
|
||||||
*/
|
*/
|
||||||
public $subject;
|
public $subject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string|null
|
||||||
*/
|
*/
|
||||||
public $message;
|
public $message;
|
||||||
|
|
||||||
@ -202,7 +202,7 @@ class Ticket {
|
|||||||
public $numberOfStaffReplies;
|
public $numberOfStaffReplies;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var int
|
* @var int|null
|
||||||
*/
|
*/
|
||||||
public $ownerId;
|
public $ownerId;
|
||||||
|
|
||||||
|
|||||||
@ -16,14 +16,20 @@ class TicketCreator {
|
|||||||
*/
|
*/
|
||||||
private $trackingIdGenerator;
|
private $trackingIdGenerator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var $autoassigner Autoassigner
|
||||||
|
*/
|
||||||
|
private $autoassigner;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var $ticketGateway TicketGateway
|
* @var $ticketGateway TicketGateway
|
||||||
*/
|
*/
|
||||||
private $ticketGateway;
|
private $ticketGateway;
|
||||||
|
|
||||||
function __construct($newTicketValidator, $trackingIdGenerator, $ticketGateway) {
|
function __construct($newTicketValidator, $trackingIdGenerator, $autoassigner, $ticketGateway) {
|
||||||
$this->newTicketValidator = $newTicketValidator;
|
$this->newTicketValidator = $newTicketValidator;
|
||||||
$this->trackingIdGenerator = $trackingIdGenerator;
|
$this->trackingIdGenerator = $trackingIdGenerator;
|
||||||
|
$this->autoassigner = $autoassigner;
|
||||||
$this->ticketGateway = $ticketGateway;
|
$this->ticketGateway = $ticketGateway;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,15 +56,27 @@ class TicketCreator {
|
|||||||
$ticket = new Ticket();
|
$ticket = new Ticket();
|
||||||
$ticket->trackingId = $this->trackingIdGenerator->generateTrackingId($heskSettings);
|
$ticket->trackingId = $this->trackingIdGenerator->generateTrackingId($heskSettings);
|
||||||
|
|
||||||
//-- TODO suggested kb articles
|
if ($heskSettings['autoassign']) {
|
||||||
|
$ticket->ownerId = $this->autoassigner->getNextUserForTicket($ticketRequest->category, $heskSettings);
|
||||||
|
}
|
||||||
|
|
||||||
//-- TODO owner/autoassign logic
|
// Transform one-to-one properties
|
||||||
|
$ticket->name = $ticketRequest->name;
|
||||||
|
$ticket->email = $ticketRequest->email;
|
||||||
|
$ticket->priorityId = $ticketRequest->priority;
|
||||||
|
$ticket->categoryId = $ticketRequest->category;
|
||||||
|
$ticket->subject = $ticketRequest->subject;
|
||||||
|
$ticket->message = $ticketRequest->message;
|
||||||
|
$ticket->usesHtml = $ticketRequest->html;
|
||||||
|
$ticket->customFields = $ticketRequest->customFields;
|
||||||
|
$ticket->location = $ticketRequest->location;
|
||||||
|
$ticket->suggestedArticles = $ticketRequest->suggestedKnowledgebaseArticleIds;
|
||||||
|
$ticket->userAgent = $ticketRequest->userAgent;
|
||||||
|
$ticket->screenResolution = $ticketRequest->screenResolution;
|
||||||
|
|
||||||
//-- TODO latitude/longitude
|
$ticket = $this->ticketGateway->createTicket($ticket, $heskSettings);
|
||||||
|
|
||||||
//-- TODO HTML flag
|
//-- TODO get SQL-generated fields
|
||||||
|
|
||||||
$this->ticketGateway->createTicket($ticket, $heskSettings);
|
|
||||||
|
|
||||||
return $ticket;
|
return $ticket;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -86,6 +86,7 @@ class TicketGateway extends CommonDao {
|
|||||||
/**
|
/**
|
||||||
* @param $ticket Ticket
|
* @param $ticket Ticket
|
||||||
* @param $heskSettings
|
* @param $heskSettings
|
||||||
|
* @return Ticket
|
||||||
*/
|
*/
|
||||||
function createTicket($ticket, $heskSettings) {
|
function createTicket($ticket, $heskSettings) {
|
||||||
global $hesklang;
|
global $hesklang;
|
||||||
@ -186,5 +187,7 @@ class TicketGateway extends CommonDao {
|
|||||||
{$customWhat}
|
{$customWhat}
|
||||||
)
|
)
|
||||||
";
|
";
|
||||||
|
|
||||||
|
return $ticket;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -10,6 +10,7 @@ namespace BusinessLogic\Tickets\TicketCreatorTests;
|
|||||||
|
|
||||||
|
|
||||||
use BusinessLogic\Security\UserContext;
|
use BusinessLogic\Security\UserContext;
|
||||||
|
use BusinessLogic\Tickets\Autoassigner;
|
||||||
use BusinessLogic\Tickets\CreateTicketByCustomerModel;
|
use BusinessLogic\Tickets\CreateTicketByCustomerModel;
|
||||||
use BusinessLogic\Tickets\NewTicketValidator;
|
use BusinessLogic\Tickets\NewTicketValidator;
|
||||||
use BusinessLogic\Tickets\TicketCreator;
|
use BusinessLogic\Tickets\TicketCreator;
|
||||||
@ -36,6 +37,11 @@ class CreateTicketTest extends TestCase {
|
|||||||
*/
|
*/
|
||||||
private $trackingIdGenerator;
|
private $trackingIdGenerator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var $autoassigner \PHPUnit_Framework_MockObject_MockObject
|
||||||
|
*/
|
||||||
|
private $autoassigner;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var $ticketRequest CreateTicketByCustomerModel
|
* @var $ticketRequest CreateTicketByCustomerModel
|
||||||
*/
|
*/
|
||||||
@ -65,8 +71,9 @@ class CreateTicketTest extends TestCase {
|
|||||||
$this->ticketGateway = $this->createMock(TicketGateway::class);
|
$this->ticketGateway = $this->createMock(TicketGateway::class);
|
||||||
$this->newTicketValidator = $this->createMock(NewTicketValidator::class);
|
$this->newTicketValidator = $this->createMock(NewTicketValidator::class);
|
||||||
$this->trackingIdGenerator = $this->createMock(TrackingIdGenerator::class);
|
$this->trackingIdGenerator = $this->createMock(TrackingIdGenerator::class);
|
||||||
|
$this->autoassigner = $this->createMock(Autoassigner::class);
|
||||||
|
|
||||||
$this->ticketCreator = new TicketCreator($this->newTicketValidator, $this->trackingIdGenerator, $this->ticketGateway);
|
$this->ticketCreator = new TicketCreator($this->newTicketValidator, $this->trackingIdGenerator, $this->autoassigner, $this->ticketGateway);
|
||||||
|
|
||||||
$this->ticketRequest = new CreateTicketByCustomerModel();
|
$this->ticketRequest = new CreateTicketByCustomerModel();
|
||||||
$this->ticketRequest->name = 'Name';
|
$this->ticketRequest->name = 'Name';
|
||||||
@ -82,12 +89,15 @@ class CreateTicketTest extends TestCase {
|
|||||||
'require_subject' => 1,
|
'require_subject' => 1,
|
||||||
'require_message' => 1,
|
'require_message' => 1,
|
||||||
'custom_fields' => array(),
|
'custom_fields' => array(),
|
||||||
|
'autoassign' => 0,
|
||||||
);
|
);
|
||||||
$this->modsForHeskSettings = array();
|
$this->modsForHeskSettings = array();
|
||||||
$this->userContext = new UserContext();
|
$this->userContext = new UserContext();
|
||||||
|
|
||||||
$this->newTicketValidator->method('validateNewTicketForCustomer')->willReturn(new ValidationModel());
|
$this->newTicketValidator->method('validateNewTicketForCustomer')->willReturn(new ValidationModel());
|
||||||
$this->trackingIdGenerator->method('generateTrackingId')->willReturn('123-456-7890');
|
$this->trackingIdGenerator->method('generateTrackingId')->willReturn('123-456-7890');
|
||||||
|
$this->autoassigner->method('getNextUserForTicket')->willReturn(1);
|
||||||
|
$this->ticketGateway->method('createTicket')->will($this->returnArgument(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
function testItSavesTheTicketToTheDatabase() {
|
function testItSavesTheTicketToTheDatabase() {
|
||||||
@ -105,4 +115,58 @@ class CreateTicketTest extends TestCase {
|
|||||||
//-- Assert
|
//-- Assert
|
||||||
self::assertThat($ticket->trackingId, self::equalTo('123-456-7890'));
|
self::assertThat($ticket->trackingId, self::equalTo('123-456-7890'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testItSetsTheNextUserForAutoassign() {
|
||||||
|
//-- Arrange
|
||||||
|
$this->heskSettings['autoassign'] = 1;
|
||||||
|
|
||||||
|
//-- Act
|
||||||
|
$ticket = $this->ticketCreator->createTicketByCustomer($this->ticketRequest, $this->heskSettings, $this->modsForHeskSettings, $this->userContext);
|
||||||
|
|
||||||
|
//-- Assert
|
||||||
|
self::assertThat($ticket->ownerId, self::equalTo(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItDoesntCallTheAutoassignerWhenDisabledInHesk() {
|
||||||
|
//-- Act
|
||||||
|
$ticket = $this->ticketCreator->createTicketByCustomer($this->ticketRequest, $this->heskSettings, $this->modsForHeskSettings, $this->userContext);
|
||||||
|
|
||||||
|
//-- Assert
|
||||||
|
self::assertThat($ticket->ownerId, self::equalTo(null));
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItTransformsTheBasicProperties() {
|
||||||
|
//-- Arrange
|
||||||
|
$this->ticketRequest->name = 'Name';
|
||||||
|
$this->ticketRequest->email = 'some@email.test';
|
||||||
|
$this->ticketRequest->priority = Priority::MEDIUM;
|
||||||
|
$this->ticketRequest->category = 1;
|
||||||
|
$this->ticketRequest->subject = 'Subject';
|
||||||
|
$this->ticketRequest->message = 'Message';
|
||||||
|
$this->ticketRequest->html = false;
|
||||||
|
$this->ticketRequest->customFields = array(
|
||||||
|
1 => 'something'
|
||||||
|
);
|
||||||
|
$this->ticketRequest->location = ['10.157', '-10.177'];
|
||||||
|
$this->ticketRequest->suggestedKnowledgebaseArticleIds = [1, 2, 3];
|
||||||
|
$this->ticketRequest->userAgent = 'UserAgent';
|
||||||
|
$this->ticketRequest->screenResolution = [1400, 900];
|
||||||
|
|
||||||
|
//-- Act
|
||||||
|
$ticket = $this->ticketCreator->createTicketByCustomer($this->ticketRequest, $this->heskSettings, $this->modsForHeskSettings, $this->userContext);
|
||||||
|
|
||||||
|
//-- Assert
|
||||||
|
self::assertThat($ticket->name, self::equalTo($this->ticketRequest->name));
|
||||||
|
self::assertThat($ticket->email, self::equalTo($this->ticketRequest->email));
|
||||||
|
self::assertThat($ticket->priorityId, self::equalTo($this->ticketRequest->priority));
|
||||||
|
self::assertThat($ticket->categoryId, self::equalTo($this->ticketRequest->category));
|
||||||
|
self::assertThat($ticket->subject, self::equalTo($this->ticketRequest->subject));
|
||||||
|
self::assertThat($ticket->message, self::equalTo($this->ticketRequest->message));
|
||||||
|
self::assertThat($ticket->usesHtml, self::equalTo($this->ticketRequest->html));
|
||||||
|
self::assertThat($ticket->customFields[1], self::equalTo($this->ticketRequest->customFields[1]));
|
||||||
|
self::assertThat($ticket->location, self::equalTo($this->ticketRequest->location));
|
||||||
|
self::assertThat($ticket->suggestedArticles, self::equalTo($this->ticketRequest->suggestedKnowledgebaseArticleIds));
|
||||||
|
self::assertThat($ticket->userAgent, self::equalTo($this->ticketRequest->userAgent));
|
||||||
|
self::assertThat($ticket->screenResolution, self::equalTo($this->ticketRequest->screenResolution));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user