diff --git a/server/controllers/ticket/search.php b/server/controllers/ticket/search.php index 6a0cf035..8f03b43a 100644 --- a/server/controllers/ticket/search.php +++ b/server/controllers/ticket/search.php @@ -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 "; - - $validDepartments = $this->generateValidDepartmentList($departments, $allowedDepartments); + + $restOfDepartments = $this->generateValidDepartmentList($departments, $ownDepartments); + $allowedDepartments = $this->generateValidDepartmentList($departments, $ownDepartments, 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){ $filters .= " ( "; $first = FALSE; @@ -269,11 +284,24 @@ class SearchController extends Controller { } $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){ @@ -339,20 +367,22 @@ class SearchController extends Controller { }; } - private function generateValidDepartmentList($departments, $allowedDepartments){ - $result = []; + private function generateValidDepartmentList($departments, $allowedDepartments, $allowed = false){ + $allowedDepartmentsresult = []; $managedDepartments = []; if($departments == null) $departments = []; foreach ($allowedDepartments as $department) { 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); - - return $result; + if($allowed){ + return $allowedDepartmentsresult; + }else{ + return $authorsDepartments; + }; } //ORDER diff --git a/server/tests/controllers/ticket/searchTest.php b/server/tests/controllers/ticket/searchTest.php index a49b3fb3..b5fc92d8 100644 --- a/server/tests/controllers/ticket/searchTest.php +++ b/server/tests/controllers/ticket/searchTest.php @@ -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( @@ -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->searchController->getSQLQuery([ - 'departments' => [1,2,3], + 'departments' => [1,2,3,4], 'staffId' => 1, 'allowedDepartments' => [ [ @@ -241,13 +241,26 @@ class SearchControllerTest extends TestCase { ], [ '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' ); }