function canUnrecurs()
{
global $DB, $CFG_GLPI;
$ID = $this->fields['id'];
if ($ID < 0 || !$this->fields['is_recursive']) {
return true;
}
$entities = getAncestorsOf('glpi_entities', $this->fields['entities_id']);
$entities[] = $this->fields['entities_id'];
$RELATION = getDbRelations();
if ($this instanceof CommonTreeDropdown) {
$f = getForeignKeyFieldForTable($this->getTable());
if (countElementsInTable($this->getTable(), [$f => $ID, 'NOT' => ['entities_id' => $entities]]) > 0) {
return false;
}
}
if (isset($RELATION[$this->getTable()])) {
foreach ($RELATION[$this->getTable()] as $tablename => $field) {
if ($tablename[0] != '_') {
$itemtype = getItemTypeForTable($tablename);
$item = new $itemtype();
if ($item->isEntityAssign()) {
// 1->N Relation
if (is_array($field)) {
foreach ($field as $f) {
if (countElementsInTable($tablename, [$f => $ID, 'NOT' => ['entities_id' => $entities]]) > 0) {
return false;
}
}
} else {
if (countElementsInTable($tablename, [$field => $ID, 'NOT' => ['entities_id' => $entities]]) > 0) {
return false;
}
}
} else {
foreach ($RELATION as $othertable => $rel) {
// Search for a N->N Relation with devices
if ($othertable == "_virtual_device" && isset($rel[$tablename])) {
$devfield = $rel[$tablename][0];
// items_id...
$typefield = $rel[$tablename][1];
// itemtype...
$sql = "SELECT DISTINCT `{$typefield}` AS itemtype\n FROM `{$tablename}`\n WHERE `{$field}`='{$ID}'";
$res = $DB->query($sql);
// Search linked device of each type
if ($res) {
while ($data = $DB->fetch_assoc($res)) {
$itemtype = $data["itemtype"];
$itemtable = getTableForItemType($itemtype);
$item = new $itemtype();
if ($item->isEntityAssign()) {
if (countElementsInTable(array($tablename, $itemtable), ["{$tablename}.{$field}" => $ID, "{$tablename}.{$typefield}" => $itemtype, 'FKEY' => [$tablename => $devfield, $itemtable => 'id'], 'NOT' => [$itemtable . '.entities_id' => $entities]]) > '0') {
return false;
}
}
}
}
} else {
if ($othertable != $this->getTable() && isset($rel[$tablename])) {
// Search for another N->N Relation
$itemtype = getItemTypeForTable($othertable);
$item = new $itemtype();
if ($item->isEntityAssign()) {
if (is_array($rel[$tablename])) {
foreach ($rel[$tablename] as $otherfield) {
if (countElementsInTable(array($tablename, $othertable), ["{$tablename}.{$field}" => $ID, 'FKEY' => [$tablename => $otherfield, $othertable => 'id'], 'NOT' => [$othertable . '.entities_id' => $entities]]) > '0') {
return false;
}
}
} else {
$otherfield = $rel[$tablename];
if (countElementsInTable(array($tablename, $othertable), ["{$tablename}.{$field}" => $ID, 'FKEY' => [$tablename => $otherfield, $othertable => 'id'], 'NOT' => [$othertable . '.entities_id' => $entities]]) > '0') {
return false;
}
}
}
}
}
}
}
}
}
}
// Doc links to this item
if ($this->getType() > 0 && countElementsInTable(array('glpi_documents_items', 'glpi_documents'), ['glpi_documents_items.items_id' => $ID, 'glpi_documents_items.itemtype' => $this->getType(), 'FKEY' => ['glpi_documents_items' => 'documents_id', 'glpi_documents' => 'id'], 'NOT' => ['glpi_documents.entities_id' => $entities]]) > '0') {
return false;
}
// TODO : do we need to check all relations in $RELATION["_virtual_device"] for this item
return true;
}