Skip to content

Commit 44ad478

Browse files
committed
Improve ticket list for item, refactor for unit tests
1 parent d829f70 commit 44ad478

File tree

1 file changed

+157
-100
lines changed

1 file changed

+157
-100
lines changed

src/Ticket.php

Lines changed: 157 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -5379,6 +5379,7 @@ public static function showListForItem(CommonDBTM $item, $withtemplate = 0)
53795379
self::$rightname,
53805380
[self::READALL, self::READMY, self::READASSIGN, CREATE]
53815381
)
5382+
&& !Session::haveRightsOr(TicketValidation::$rightname, TicketValidation::getValidateRights())
53825383
) {
53835384
return false;
53845385
}
@@ -5388,65 +5389,24 @@ public static function showListForItem(CommonDBTM $item, $withtemplate = 0)
53885389
}
53895390

53905391
$criteria = self::getCommonCriteria();
5391-
$restrict = [];
5392-
$options = [
5393-
'criteria' => [],
5394-
'reset' => 'reset',
5395-
];
5392+
$restrict = self::getListForItemRestrict($item);
5393+
$criteria['WHERE'] = $restrict + getEntitiesRestrictCriteria(self::getTable());
5394+
$criteria['WHERE']['glpi_tickets.is_deleted'] = 0;
5395+
$criteria['LIMIT'] = (int)$_SESSION['glpilist_limit'];
53965396

53975397
switch (get_class($item)) {
5398-
case User::class:
5399-
$restrict['glpi_tickets_users.users_id'] = $item->getID();
5400-
$restrict['glpi_tickets_users.type'] = CommonITILActor::REQUESTER;
5401-
5402-
$options['criteria'][0]['field'] = 4; // status
5403-
$options['criteria'][0]['searchtype'] = 'equals';
5404-
$options['criteria'][0]['value'] = $item->getID();
5405-
$options['criteria'][0]['link'] = 'AND';
5406-
break;
5407-
54085398
case SLA::class:
5409-
$restrict[] = [
5410-
'OR' => [
5411-
'slas_id_tto' => $item->getID(),
5412-
'slas_id_ttr' => $item->getID()
5413-
]
5414-
];
54155399
$criteria['ORDERBY'] = 'glpi_tickets.time_to_resolve DESC';
5416-
5417-
$options['criteria'][0]['field'] = 30;
5418-
$options['criteria'][0]['searchtype'] = 'equals';
5419-
$options['criteria'][0]['value'] = $item->getID();
5420-
$options['criteria'][0]['link'] = 'AND';
54215400
break;
54225401

5402+
54235403
case OLA::class:
5424-
$restrict[] = [
5425-
'OR' => [
5426-
'olas_id_tto' => $item->getID(),
5427-
'olas_id_ttr' => $item->getID()
5428-
]
5429-
];
54305404
$criteria['ORDERBY'] = 'glpi_tickets.internal_time_to_resolve DESC';
5431-
5432-
$options['criteria'][0]['field'] = 30;
5433-
$options['criteria'][0]['searchtype'] = 'equals';
5434-
$options['criteria'][0]['value'] = $item->getID();
5435-
$options['criteria'][0]['link'] = 'AND';
5436-
break;
5437-
5438-
case Supplier::class:
5439-
$restrict['glpi_suppliers_tickets.suppliers_id'] = $item->getID();
5440-
$restrict['glpi_suppliers_tickets.type'] = CommonITILActor::ASSIGN;
5441-
5442-
$options['criteria'][0]['field'] = 6;
5443-
$options['criteria'][0]['searchtype'] = 'equals';
5444-
$options['criteria'][0]['value'] = $item->getID();
5445-
$options['criteria'][0]['link'] = 'AND';
54465405
break;
54475406

54485407
case Group::class:
5449-
// Mini search engine
5408+
// Mini search engine
5409+
/** @var Group $item */
54505410
if ($item->haveChildren()) {
54515411
$tree = Session::getSavedOption(__CLASS__, 'tree', 0);
54525412
echo "<table class='tab_cadre_fixe'>";
@@ -5463,61 +5423,10 @@ public static function showListForItem(CommonDBTM $item, $withtemplate = 0)
54635423
$tree = 0;
54645424
}
54655425
echo "</td></tr></table>";
5466-
5467-
$restrict['glpi_groups_tickets.groups_id'] = ($tree ? getSonsOf('glpi_groups', $item->getID()) : $item->getID());
5468-
$restrict['glpi_groups_tickets.type'] = CommonITILActor::REQUESTER;
5469-
5470-
$options['criteria'][0]['field'] = 71;
5471-
$options['criteria'][0]['searchtype'] = ($tree ? 'under' : 'equals');
5472-
$options['criteria'][0]['value'] = $item->getID();
5473-
$options['criteria'][0]['link'] = 'AND';
5474-
break;
5475-
5476-
default:
5477-
$restrict['glpi_items_tickets.items_id'] = $item->getID();
5478-
$restrict['glpi_items_tickets.itemtype'] = $item->getType();
5479-
5480-
// you can only see your tickets
5481-
if (!Session::haveRight(self::$rightname, self::READALL)) {
5482-
$or = [
5483-
'glpi_tickets.users_id_recipient' => Session::getLoginUserID(),
5484-
[
5485-
'AND' => [
5486-
'glpi_tickets_users.tickets_id' => new \QueryExpression('glpi_tickets.id'),
5487-
'glpi_tickets_users.users_id' => Session::getLoginUserID()
5488-
]
5489-
], [
5490-
'AND' => [
5491-
'glpi_ticketvalidations.tickets_id' => new \QueryExpression('glpi_tickets.id'),
5492-
'glpi_ticketvalidations.users_id_validate' => Session::getLoginUserID()
5493-
]
5494-
]
5495-
];
5496-
if (count($_SESSION['glpigroups'])) {
5497-
$or['glpi_groups_tickets.groups_id'] = $_SESSION['glpigroups'];
5498-
}
5499-
$restrict[] = ['OR' => $or];
5500-
}
5501-
5502-
$options['criteria'][0]['field'] = 12;
5503-
$options['criteria'][0]['searchtype'] = 'equals';
5504-
$options['criteria'][0]['value'] = 'all';
5505-
$options['criteria'][0]['link'] = 'AND';
5506-
5507-
$options['metacriteria'][0]['itemtype'] = $item->getType();
5508-
$options['metacriteria'][0]['field'] = Search::getOptionNumber(
5509-
$item->getType(),
5510-
'id'
5511-
);
5512-
$options['metacriteria'][0]['searchtype'] = 'equals';
5513-
$options['metacriteria'][0]['value'] = $item->getID();
5514-
$options['metacriteria'][0]['link'] = 'AND';
5426+
/** @var CommonDBTM $item */
55155427
break;
55165428
}
55175429

5518-
$criteria['WHERE'] = $restrict + getEntitiesRestrictCriteria(self::getTable());
5519-
$criteria['WHERE']['glpi_tickets.is_deleted'] = 0;
5520-
$criteria['LIMIT'] = (int)$_SESSION['glpilist_limit'];
55215430
$iterator = $DB->request($criteria);
55225431
$number = count($iterator);
55235432

@@ -5579,6 +5488,7 @@ public static function showListForItem(CommonDBTM $item, $withtemplate = 0)
55795488
)
55805489
);
55815490

5491+
$options = self::getListForItemSearchOptionsCriteria($item);
55825492
echo "<tr class='noHover'><th colspan='$colspan'>";
55835493
$title = sprintf(_n('Last %d ticket', 'Last %d tickets', $number), $number);
55845494
$link = "<a href='" . Ticket::getSearchURL() . "?" .
@@ -7073,4 +6983,151 @@ public static function getContentTemplatesParametersClass(): string
70736983
{
70746984
return TicketParameters::class;
70756985
}
6986+
6987+
public static function getListForItemRestrict(CommonDBTM $item)
6988+
{
6989+
$restrict = [];
6990+
6991+
switch (get_class($item)) {
6992+
case User::class:
6993+
$restrict['glpi_tickets_users.users_id'] = $item->getID();
6994+
$restrict['glpi_tickets_users.type'] = CommonITILActor::REQUESTER;
6995+
break;
6996+
6997+
case SLA::class:
6998+
$restrict[] = [
6999+
'OR' => [
7000+
'slas_id_tto' => $item->getID(),
7001+
'slas_id_ttr' => $item->getID()
7002+
]
7003+
];
7004+
break;
7005+
7006+
case OLA::class:
7007+
$restrict[] = [
7008+
'OR' => [
7009+
'olas_id_tto' => $item->getID(),
7010+
'olas_id_ttr' => $item->getID()
7011+
]
7012+
];
7013+
break;
7014+
7015+
case Supplier::class:
7016+
$restrict['glpi_suppliers_tickets.suppliers_id'] = $item->getID();
7017+
$restrict['glpi_suppliers_tickets.type'] = CommonITILActor::ASSIGN;
7018+
break;
7019+
7020+
case Group::class:
7021+
/** @var Group $item */
7022+
if ($item->haveChildren()) {
7023+
$tree = Session::getSavedOption(__CLASS__, 'tree', 0);
7024+
} else {
7025+
$tree = 0;
7026+
}
7027+
$restrict['glpi_groups_tickets.groups_id'] = ($tree ? getSonsOf('glpi_groups', $item->getID()) : $item->getID());
7028+
$restrict['glpi_groups_tickets.type'] = CommonITILActor::REQUESTER;
7029+
/** @var CommonDBTM $item */
7030+
break;
7031+
7032+
default:
7033+
$restrict['glpi_items_tickets.items_id'] = $item->getID();
7034+
$restrict['glpi_items_tickets.itemtype'] = $item->getType();
7035+
// you can only see your tickets
7036+
if (!Session::haveRight(self::$rightname, self::READALL)) {
7037+
$or = [
7038+
'glpi_tickets.users_id_recipient' => Session::getLoginUserID(),
7039+
[
7040+
'AND' => [
7041+
'glpi_tickets_users.tickets_id' => new \QueryExpression('glpi_tickets.id'),
7042+
'glpi_tickets_users.users_id' => Session::getLoginUserID()
7043+
]
7044+
]
7045+
];
7046+
if (Session::haveRightsOr(TicketValidation::$rightname, [TicketValidation::VALIDATEINCIDENT, TicketValidation::VALIDATEREQUEST])) {
7047+
$or[] = [
7048+
'AND' => [
7049+
'glpi_ticketvalidations.tickets_id' => new \QueryExpression('glpi_tickets.id'),
7050+
'glpi_ticketvalidations.users_id_validate' => Session::getLoginUserID(),
7051+
]
7052+
];
7053+
}
7054+
if (count($_SESSION['glpigroups'])) {
7055+
$or['glpi_groups_tickets.groups_id'] = $_SESSION['glpigroups'];
7056+
}
7057+
$restrict[] = ['OR' => $or];
7058+
}
7059+
}
7060+
7061+
return $restrict;
7062+
}
7063+
7064+
public static function getListForItemSearchOptionsCriteria(CommonDBTM $item)
7065+
{
7066+
$options = [
7067+
'criteria' => [],
7068+
'reset' => 'reset',
7069+
];
7070+
7071+
switch (get_class($item)) {
7072+
case User::class:
7073+
$options['criteria'][0]['field'] = 4; // status
7074+
$options['criteria'][0]['searchtype'] = 'equals';
7075+
$options['criteria'][0]['value'] = $item->getID();
7076+
$options['criteria'][0]['link'] = 'AND';
7077+
break;
7078+
7079+
case SLA::class:
7080+
$options['criteria'][0]['field'] = 30;
7081+
$options['criteria'][0]['searchtype'] = 'equals';
7082+
$options['criteria'][0]['value'] = $item->getID();
7083+
$options['criteria'][0]['link'] = 'AND';
7084+
break;
7085+
7086+
case OLA::class:
7087+
$options['criteria'][0]['field'] = 30;
7088+
$options['criteria'][0]['searchtype'] = 'equals';
7089+
$options['criteria'][0]['value'] = $item->getID();
7090+
$options['criteria'][0]['link'] = 'AND';
7091+
break;
7092+
7093+
case Supplier::class:
7094+
$options['criteria'][0]['field'] = 6;
7095+
$options['criteria'][0]['searchtype'] = 'equals';
7096+
$options['criteria'][0]['value'] = $item->getID();
7097+
$options['criteria'][0]['link'] = 'AND';
7098+
break;
7099+
7100+
case Group::class:
7101+
/** @var Group $item */
7102+
if ($item->haveChildren()) {
7103+
$tree = Session::getSavedOption(__CLASS__, 'tree', 0);
7104+
} else {
7105+
$tree = 0;
7106+
}
7107+
$options['criteria'][0]['field'] = 71;
7108+
$options['criteria'][0]['searchtype'] = ($tree ? 'under' : 'equals');
7109+
$options['criteria'][0]['value'] = $item->getID();
7110+
$options['criteria'][0]['link'] = 'AND';
7111+
/** @var CommonDBTM $item */
7112+
break;
7113+
7114+
default:
7115+
$options['criteria'][0]['field'] = 12;
7116+
$options['criteria'][0]['searchtype'] = 'equals';
7117+
$options['criteria'][0]['value'] = 'all';
7118+
$options['criteria'][0]['link'] = 'AND';
7119+
7120+
$options['metacriteria'][0]['itemtype'] = $item->getType();
7121+
$options['metacriteria'][0]['field'] = Search::getOptionNumber(
7122+
$item->getType(),
7123+
'id'
7124+
);
7125+
$options['metacriteria'][0]['searchtype'] = 'equals';
7126+
$options['metacriteria'][0]['value'] = $item->getID();
7127+
$options['metacriteria'][0]['link'] = 'AND';
7128+
break;
7129+
}
7130+
7131+
return $options;
7132+
}
70767133
}

0 commit comments

Comments
 (0)