Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix update ticket status when ticket task is de-scheduled #16895

Open
wants to merge 13 commits into
base: main
Choose a base branch
from
Open
1 change: 1 addition & 0 deletions css/legacy/includes/_styles.scss
Expand Up @@ -760,6 +760,7 @@

.boxnotetext {
padding: 5px;
margin-top: 1rem;
}

.error {
Expand Down
2 changes: 1 addition & 1 deletion src/CommonITILObject.php
Expand Up @@ -3743,7 +3743,7 @@ public static function isAllowedStatus($old, $new)
if (
array_key_exists(
static::STATUS_MATRIX_FIELD,
$_SESSION['glpiactiveprofile']
$_SESSION['glpiactiveprofile'] ?? []
)
&& static::isStatusExists($new)
) { // maybe not set for post-only
Expand Down
26 changes: 1 addition & 25 deletions src/CommonITILTask.php
Expand Up @@ -475,31 +475,7 @@ public function post_updateItem($history = true)
if (!$this->input['_job']->getFromDB($this->fields[$this->input['_job']->getForeignKeyField()])) {
return false;
}
if (
isset($this->input['_status'])
&& ($this->input['_status'] != $this->input['_job']->fields['status'])
) {
$update = [
'status' => $this->input['_status'],
'id' => $this->input['_job']->fields['id'],
'_disablenotif' => true,
];
$this->input['_job']->update($update);
}

if (
!empty($this->fields['begin'])
&& $item->isStatusExists(CommonITILObject::PLANNED)
&& (($item->fields["status"] == CommonITILObject::INCOMING)
|| ($item->fields["status"] == CommonITILObject::ASSIGNED))
) {
$input2 = [
'id' => $item->getID(),
'status' => CommonITILObject::PLANNED,
'_disablenotif' => true,
];
$item->update($input2);
}
$this->updateParentStatus($this->input['_job'], $this->input);

if (!isset($this->input['_disablenotif']) && $CFG_GLPI["use_notifications"]) {
$options = ['task_id' => $this->fields["id"],
Expand Down
51 changes: 42 additions & 9 deletions src/Features/ParentStatus.php
Expand Up @@ -164,15 +164,48 @@ public function updateParentStatus(CommonITILObject $parentitem, array $input):
}
}

if (
!$is_set_pending
&& !empty($this->fields['begin'])
&& $parentitem->isStatusExists(CommonITILObject::PLANNED)
&& (($parentitem->fields["status"] == CommonITILObject::INCOMING)
|| ($parentitem->fields["status"] == CommonITILObject::ASSIGNED)
|| $needupdateparent)
) {
$input['_status'] = CommonITILObject::PLANNED;
if (!$is_set_pending) {
if (
!empty($this->fields['begin'])
&& $parentitem->isStatusExists(CommonITILObject::PLANNED)
&& (($parentitem->fields["status"] == CommonITILObject::INCOMING)
|| ($parentitem->fields["status"] == CommonITILObject::ASSIGNED)
|| $needupdateparent)
) {
$input['_status'] = CommonITILObject::PLANNED;
} elseif (
$parentitem->fields["status"] == CommonITILObject::PLANNED
&& in_array('begin', $this->updates)
&& $this->isField('begin')
) {
/** @var \DBmysql $DB */
global $DB;
$criteria = [
'DISTINCT' => true,
'FROM' => $this->getTable(),
'WHERE' => [
$parentitem->getForeignKeyField() => $parentitem->getID(),
['NOT' => ['begin' => null]]
],
];
$iterator = $DB->request($criteria);
if ($iterator->numrows() > 0) {
$input['_status'] = CommonITILObject::PLANNED;
} elseif (
$parentitem::isAllowedStatus($parentitem->fields["status"], CommonITILObject::ASSIGNED)
&& (
($parentitem->countUsers(CommonITILActor::ASSIGN) > 0)
|| ($parentitem->countGroups(CommonITILActor::ASSIGN) > 0)
|| ($parentitem->countSuppliers(CommonITILActor::ASSIGN) > 0)
)
) {
$input['_status'] = CommonITILObject::ASSIGNED;
} elseif (
$parentitem::isAllowedStatus($parentitem->fields["status"], CommonITILObject::INCOMING)
) {
$input['_status'] = CommonITILObject::INCOMING;
}
}
}

//change ITILObject status only if input change
Expand Down
1 change: 1 addition & 0 deletions src/Html.php
Expand Up @@ -3655,6 +3655,7 @@ public static function initEditorSystem(
branding: false,
selector: '#' + $.escapeSelector('{$id}'),
text_patterns: false,
paste_webkit_styles: 'all',

plugins: {$pluginsjs},

Expand Down
3 changes: 3 additions & 0 deletions src/Inventory/Asset/NetworkEquipment.php
Expand Up @@ -137,6 +137,9 @@ public function prepare(): array
$stack->$model_field = $switch->model;
$stack->description = $stack->name . ' - ' . ($switch->name ?? $switch->description);
$stack->name = $stack->name . ' - ' . ($switch->name ?? $switch->description);
if (($switch->name ?? $switch->description) != $switch->stack_number ?? '') {
$stack->name .= ' - ' . $switch->stack_number;
}
$stack->stack_number = $switch->stack_number ?? null;
$this->data[] = $stack;
}
Expand Down
3 changes: 2 additions & 1 deletion templates/components/dropdown/limit.html.twig
Expand Up @@ -40,7 +40,8 @@
{% endif %}

{% if not no_onchange %}
{% set href = "location.href='" ~ href ~ "glpilist_limit='+this.value+'" ~ additional_params ~ "'" %}
{% set href_separator = '?' in href ? '&' : '?' %}
{% set href = "location.href='" ~ href ~ href_separator ~ "glpilist_limit='+this.value+'" ~ additional_params ~ "'" %}
{% if is_tab is defined and is_tab == true %}
{% set href = "javascript:reloadTab('glpilist_limit='+this.value+'" ~ additional_params ~ "');" %}
{% endif %}
Expand Down
4 changes: 3 additions & 1 deletion templates/components/pager.html.twig
Expand Up @@ -39,7 +39,8 @@
{% endif %}
{% endif %}

{% set href = href ~ "&start=%start%" ~ additional_params %}
{% set href_separator = '?' in href ? '&' : '?' %}
{% set href = href ~ href_separator ~ "start=%start%" ~ additional_params %}
{% if is_tab is defined and is_tab == true %}
{% set href = "javascript:reloadTab('start=%start%" ~ additional_params ~ "');" %}
{% endif %}
Expand Down Expand Up @@ -73,6 +74,7 @@
{% set limitdropdown = include('components/dropdown/limit.html.twig', {
'no_onchange': fluid_search|default(false),
'select_class': 'search-limit-dropdown',
'href': href|replace({'%start%': start}),
}) %}
{% if not short_display %}
<span class="search-limit d-none d-md-block">
Expand Down
2 changes: 1 addition & 1 deletion templates/pages/admin/events_list.html.twig
Expand Up @@ -45,7 +45,7 @@
<div class="card-header search-header pe-0">
{% if count > 0 %}
{% set limitdropdown = include('components/dropdown/limit.html.twig', {
'href': target ~ '?',
'href': target,
'additional_params': 'sort=' ~ sort ~ '&order=' ~ order
}) %}
<div class="ms-auto d-inline-flex align-items-center d-none d-md-block search-limit">
Expand Down
131 changes: 131 additions & 0 deletions tests/fixtures/inventories/stacked_switch_name.xml
@@ -0,0 +1,131 @@
<?xml version="1.0" encoding="UTF-8"?>
<REQUEST>
<CONTENT>
<DEVICE>
<COMPONENTS>
<COMPONENT>
<CONTAINEDININDEX>0</CONTAINEDININDEX>
<DESCRIPTION>HPE</DESCRIPTION>
<FRU>2</FRU>
<INDEX>1</INDEX>
<MANUFACTURER>HPE</MANUFACTURER>
<TYPE>stack</TYPE>
</COMPONENT>
<COMPONENT>
<CONTAINEDININDEX>1</CONTAINEDININDEX>
<DESCRIPTION>HPE 5130 48G PoE+ 4SFP+ EI JG937A Software Version 7.1.070</DESCRIPTION>
<FIRMWARE>147</FIRMWARE>
<FRU>1</FRU>
<INDEX>2</INDEX>
<MANUFACTURER>HPE</MANUFACTURER>
<MODEL>JG937A</MODEL>
<NAME>5130EI</NAME>
<REVISION>Ver.B</REVISION>
<SERIAL>CX15GXXX99</SERIAL>
<TYPE>chassis</TYPE>
<VERSION>7.1.070 Release 3208P16</VERSION>
</COMPONENT>
<COMPONENT>
<CONTAINEDININDEX>1</CONTAINEDININDEX>
<DESCRIPTION>HPE 5130 48G PoE+ 4SFP+ EI JG937A Software Version 7.1.070</DESCRIPTION>
<FIRMWARE>147</FIRMWARE>
<FRU>1</FRU>
<INDEX>3</INDEX>
<MANUFACTURER>HPE</MANUFACTURER>
<MODEL>JG937A</MODEL>
<NAME>5130EI</NAME>
<REVISION>Ver.B</REVISION>
<SERIAL>CN15CN123456</SERIAL>
<TYPE>chassis</TYPE>
<VERSION>7.1.070 Release 3208P16</VERSION>
</COMPONENT>
<COMPONENT>
<CONTAINEDININDEX>2</CONTAINEDININDEX>
<DESCRIPTION>CONTAINER LEVEL1</DESCRIPTION>
<FRU>2</FRU>
<INDEX>12</INDEX>
<NAME>Level 1 Container #1</NAME>
<TYPE>container</TYPE>
</COMPONENT>
<COMPONENT>
<CONTAINEDININDEX>12</CONTAINEDININDEX>
<DESCRIPTION>MODULE LEVEL1</DESCRIPTION>
<FIRMWARE>147</FIRMWARE>
<FRU>2</FRU>
<INDEX>192</INDEX>
<MANUFACTURER>HPE</MANUFACTURER>
<MODEL>JG937A</MODEL>
<NAME>Board</NAME>
<REVISION>Ver.B</REVISION>
<SERIAL>CN123456</SERIAL>
<TYPE>module</TYPE>
<VERSION>Release 3208P16</VERSION>
</COMPONENT>
<COMPONENT>
<CONTAINEDININDEX>383</CONTAINEDININDEX>
<DESCRIPTION>Ten-GigabitEthernet2/0/52</DESCRIPTION>
<FRU>1</FRU>
<INDEX>495</INDEX>
<MANUFACTURER>HPE</MANUFACTURER>
<NAME>Ten-GigabitEthernet2/0/52</NAME>
<SERIAL>CN0CN123456</SERIAL>
<TYPE>port</TYPE>
</COMPONENT>
</COMPONENTS>
<FIRMWARES>
<DESCRIPTION>device firmware</DESCRIPTION>
<MANUFACTURER>Hewlett-Packard</MANUFACTURER>
<NAME>5130-48G-PoE+-4SFP+(370W) EI</NAME>
<TYPE>device</TYPE>
<VERSION>7.1.070 Release 3208P16</VERSION>
</FIRMWARES>
<INFO>
<CONTACT>admin@xy.z</CONTACT>
<FIRMWARE>7.1.070 Release 3208P16</FIRMWARE>
<ID>797</ID>
<IPS>
<IP>10.2.7.32</IP>
</IPS>
<LOCATION>office</LOCATION>
<MAC>dc:68:00:00:00:ae</MAC>
<MANUFACTURER>Hewlett-Packard</MANUFACTURER>
<MODEL>5130-48G-PoE+-4SFP+(370W) EI</MODEL>
<NAME>SW00Test</NAME>
<SERIAL>CX15GXXX06</SERIAL>
<TYPE>NETWORKING</TYPE>
<UPTIME>22 days, 00:08:54.24</UPTIME>
</INFO>
<PORTS>
<PORT>
<IFALIAS>GigabitEthernet1/0/2 Interface</IFALIAS>
<IFDESCR>GigabitEthernet1/0/2</IFDESCR>
<IFINERRORS>0</IFINERRORS>
<IFINOCTETS>0</IFINOCTETS>
<IFINTERNALSTATUS>2</IFINTERNALSTATUS>
<IFLASTCHANGE>1 minute, 12.58</IFLASTCHANGE>
<IFMTU>12288</IFMTU>
<IFNAME>GigabitEthernet1/0/2</IFNAME>
<IFNUMBER>2</IFNUMBER>
<IFOUTERRORS>0</IFOUTERRORS>
<IFOUTOCTETS>0</IFOUTOCTETS>
<IFPORTDUPLEX>1</IFPORTDUPLEX>
<IFSPEED>1000000000</IFSPEED>
<IFSTATUS>2</IFSTATUS>
<IFTYPE>6</IFTYPE>
<MAC>dc:00:0c:00:00:d8</MAC>
<VLANS>
<VLAN>
<NAME>VLAN 0001</NAME>
<NUMBER>1</NUMBER>
<TAGGED>0</TAGGED>
</VLAN>
</VLANS>
</PORT>
</PORTS>
</DEVICE>
<MODULEVERSION>6.1</MODULEVERSION>
<PROCESSNUMBER>442</PROCESSNUMBER>
</CONTENT>
<DEVICEID>it-2024-05-11-14-34-10</DEVICEID>
<QUERY>SNMPQUERY</QUERY>
</REQUEST>