fix department filter of ticket search

This commit is contained in:
Guillermo Giuliana 2020-01-31 21:47:56 -03:00
parent e44559618f
commit 74de20641f
2 changed files with 66 additions and 23 deletions

View File

@ -254,13 +254,28 @@ class SearchController extends Controller {
} }
} }
private function setDepartmentFilter($departments,$allowedDepartments, $idStaff, &$filters){ private function setDepartmentFilter($departments,$ownDepartments, $idStaff, &$filters){
if ($filters != "") $filters .= " and "; if ($filters != "") $filters .= " and ";
$validDepartments = $this->generateValidDepartmentList($departments, $allowedDepartments); $restOfDepartments = $this->generateValidDepartmentList($departments, $ownDepartments);
$allowedDepartments = $this->generateValidDepartmentList($departments, $ownDepartments, true);
$first = TRUE; $first = TRUE;
if($validDepartments){
foreach($validDepartments as $department) { if(!$allowedDepartments && !$restOfDepartments){
foreach($ownDepartments as $department) {
if($first){
$filters .= " ( ";
$first = FALSE;
} else {
$filters .= " or ";
}
$filters .= "ticket.department_id = " . $department['id'];
}
$filters .= ")";
}
if($allowedDepartments){
foreach($allowedDepartments as $department) {
if($first){ if($first){
$filters .= " ( "; $filters .= " ( ";
$first = FALSE; $first = FALSE;
@ -269,11 +284,24 @@ class SearchController extends Controller {
} }
$filters .= "ticket.department_id = " . $department; $filters .= "ticket.department_id = " . $department;
} }
$filters .= " or ";
}else{
$filters .= "(";
} }
$filters .= "ticket.author_staff_id = " . $idStaff . ")";
if($restOfDepartments){
if($allowedDepartments) $filters .= " or ";
$filters .= "(ticket.author_staff_id = " . $idStaff . " and ";
$first = TRUE;
foreach($restOfDepartments as $department) {
if($first){
$filters .= " ( ";
$first = FALSE;
} else {
$filters .= " or ";
}
$filters .= "ticket.department_id = " . $department;
}
$filters .= "))";
}
if($allowedDepartments) $filters .= " )";
} }
private function setAuthorFilter($authors, &$filters){ private function setAuthorFilter($authors, &$filters){
@ -339,20 +367,22 @@ class SearchController extends Controller {
}; };
} }
private function generateValidDepartmentList($departments, $allowedDepartments){ private function generateValidDepartmentList($departments, $allowedDepartments, $allowed = false){
$result = []; $allowedDepartmentsresult = [];
$managedDepartments = []; $managedDepartments = [];
if($departments == null) $departments = []; if($departments == null) $departments = [];
foreach ($allowedDepartments as $department) { foreach ($allowedDepartments as $department) {
array_push($managedDepartments,$department['id']); array_push($managedDepartments,$department['id']);
} }
$result = array_intersect($departments,$managedDepartments);
if(empty($result)) $result = $managedDepartments; $allowedDepartmentsresult = array_values(array_unique(array_intersect($departments,$managedDepartments)));
$authorsDepartments = array_values(array_diff($departments,$allowedDepartmentsresult));
$result = array_unique($result); if($allowed){
return $allowedDepartmentsresult;
return $result; }else{
return $authorsDepartments;
};
} }
//ORDER //ORDER

View File

@ -209,7 +209,7 @@ class SearchControllerTest extends TestCase {
] ]
] ]
]), ]),
'FROM (ticket LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id) WHERE ( ticket.department_id = 2 or ticket.department_id = 1 or ticket.department_id = 3 or ticket.author_staff_id = 1) GROUP BY ticket.id' 'FROM (ticket LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id) WHERE ( ticket.department_id = 2 or ticket.department_id = 1 or ticket.department_id = 3) GROUP BY ticket.id'
); );
$this->assertEquals( $this->assertEquals(
@ -228,12 +228,12 @@ class SearchControllerTest extends TestCase {
] ]
] ]
]), ]),
'FROM (ticket LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id) WHERE ( ticket.department_id = 1 or ticket.author_staff_id = 1) GROUP BY ticket.id' 'FROM (ticket LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id) WHERE ( ticket.department_id = 1 ) GROUP BY ticket.id'
); );
$this->assertEquals( $this->assertEquals(
$this->searchController->getSQLQuery([ $this->searchController->getSQLQuery([
'departments' => [1,2,3], 'departments' => [1,2,3,4],
'staffId' => 1, 'staffId' => 1,
'allowedDepartments' => [ 'allowedDepartments' => [
[ [
@ -241,13 +241,26 @@ class SearchControllerTest extends TestCase {
], ],
[ [
'id' => 1 'id' => 1
],
[
'id' => 3
] ]
] ]
]), ]),
'FROM (ticket LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id) WHERE ( ticket.department_id = 1 or ticket.department_id = 2 or ticket.department_id = 3 or ticket.author_staff_id = 1) GROUP BY ticket.id' 'FROM (ticket LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id) WHERE ( ticket.department_id = 1 or ticket.department_id = 2 or (ticket.author_staff_id = 1 and ( ticket.department_id = 3 or ticket.department_id = 4)) ) GROUP BY ticket.id'
);
$this->assertEquals(
$this->searchController->getSQLQuery([
'departments' => [2],
'staffId' => 1,
'allowedDepartments' => [
[
'id' => 5
],
[
'id' => 6
]
]
]),
'FROM (ticket LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id) WHERE (ticket.author_staff_id = 1 and ( ticket.department_id = 2)) GROUP BY ticket.id'
); );
} }