Transfer::transferDirectConnection PHP Method

transferDirectConnection() public method

Delete direct connection for a linked item
public transferDirectConnection ( $itemtype, $ID, $link_type )
$itemtype original type of transfered item
$ID ID of the item
$link_type type of the linked items to transfer
    function transferDirectConnection($itemtype, $ID, $link_type)
    {
        global $DB;
        // Only same Item case : no duplication of computers
        // Default : delete
        $keep = 0;
        $clean = 0;
        switch ($link_type) {
            case 'Printer':
                $keep = $this->options['keep_dc_printer'];
                $clean = $this->options['clean_dc_printer'];
                break;
            case 'Monitor':
                $keep = $this->options['keep_dc_monitor'];
                $clean = $this->options['clean_dc_monitor'];
                break;
            case 'Peripheral':
                $keep = $this->options['keep_dc_peripheral'];
                $clean = $this->options['clean_dc_peripheral'];
                break;
            case 'Phone':
                $keep = $this->options['keep_dc_phone'];
                $clean = $this->options['clean_dc_phone'];
                break;
        }
        if (!($link_item = getItemForItemtype($link_type))) {
            return;
        }
        // Get connections
        $query = "SELECT *\n                FROM `glpi_computers_items`\n                WHERE `computers_id` = '{$ID}'\n                      AND `itemtype` = '" . $link_type . "'";
        if ($link_item->maybeRecursive()) {
            $query .= " AND `items_id` NOT IN " . $this->item_recurs[$link_type];
        }
        if ($result = $DB->query($query)) {
            if ($DB->numrows($result) != 0) {
                // Foreach get item
                while ($data = $DB->fetch_assoc($result)) {
                    $item_ID = $data['items_id'];
                    if ($link_item->getFromDB($item_ID)) {
                        // If global :
                        if ($link_item->fields['is_global'] == 1) {
                            $need_clean_process = false;
                            // if keep
                            if ($keep) {
                                $newID = -1;
                                // Is already transfer ?
                                if (isset($this->already_transfer[$link_type][$item_ID])) {
                                    $newID = $this->already_transfer[$link_type][$item_ID];
                                    // Already transfer as a copy : need clean process
                                    if ($newID != $item_ID) {
                                        $need_clean_process = true;
                                    }
                                } else {
                                    // Not yet tranfer
                                    // Can be managed like a non global one ?
                                    // = all linked computers need to be transfer (so not copy)
                                    $query = "SELECT COUNT(*) AS cpt\n                                     FROM `glpi_computers_items`\n                                     WHERE `itemtype` = '" . $link_type . "'\n                                           AND `items_id` = '{$item_ID}'\n                                           AND `computers_id`\n                                                NOT IN " . $this->item_search['Computer'];
                                    $result_search = $DB->query($query);
                                    // All linked computers need to be transfer -> use unique transfer system
                                    if ($DB->result($result_search, 0, 'cpt') == 0) {
                                        $need_clean_process = false;
                                        $this->transferItem($link_type, $item_ID, $item_ID);
                                        $newID = $item_ID;
                                    } else {
                                        // else Transfer by Copy
                                        $need_clean_process = true;
                                        // Is existing global item in the destination entity ?
                                        $query = "SELECT *\n                                        FROM `" . getTableForItemType($link_type) . "`\n                                        WHERE `is_global` = '1'\n                                              AND `entities_id` = '" . $this->to . "'\n                                              AND `name`\n                                                   = '" . addslashes($link_item->getField('name')) . "'";
                                        if ($result_search = $DB->query($query)) {
                                            if ($DB->numrows($result_search) > 0) {
                                                $newID = $DB->result($result_search, 0, 'id');
                                                $this->addToAlreadyTransfer($link_type, $item_ID, $newID);
                                            }
                                        }
                                        // Not found -> transfer copy
                                        if ($newID < 0) {
                                            // 1 - create new item
                                            unset($link_item->fields['id']);
                                            $input = $link_item->fields;
                                            $input['entities_id'] = $this->to;
                                            unset($link_item->fields);
                                            $newID = $link_item->add(toolbox::addslashes_deep($input));
                                            // 2 - transfer as copy
                                            $this->transferItem($link_type, $item_ID, $newID);
                                        }
                                        // Founded -> use to link : nothing to do
                                    }
                                }
                                // Finish updated link if needed
                                if ($newID > 0 && $newID != $item_ID) {
                                    $query = "UPDATE `glpi_computers_items`\n                                     SET `items_id` = '{$newID}'\n                                     WHERE `id` = '" . $data['id'] . "' ";
                                    $DB->query($query);
                                }
                            } else {
                                // Else delete link
                                // Call Disconnect for global device (no disconnect behavior, but history )
                                $conn = new Computer_Item();
                                $conn->delete(array('id' => $data['id'], '_no_auto_action' => true));
                                $need_clean_process = true;
                            }
                            // If clean and not linked dc -> delete
                            if ($need_clean_process && $clean) {
                                $query = "SELECT COUNT(*) AS cpt\n                                  FROM `glpi_computers_items`\n                                  WHERE `items_id` = '{$item_ID}'\n                                        AND `itemtype` = '" . $link_type . "'";
                                if ($result_dc = $DB->query($query)) {
                                    if ($DB->result($result_dc, 0, 'cpt') == 0) {
                                        if ($clean == 1) {
                                            $link_item->delete(array('id' => $item_ID));
                                        }
                                        if ($clean == 2) {
                                            // purge
                                            $link_item->delete(array('id' => $item_ID), 1);
                                        }
                                    }
                                }
                            }
                        } else {
                            // If unique :
                            //if keep -> transfer list else unlink
                            if ($keep) {
                                $this->transferItem($link_type, $item_ID, $item_ID);
                            } else {
                                // Else delete link (apply disconnect behavior)
                                $conn = new Computer_Item();
                                $conn->delete(array('id' => $data['id']));
                                //if clean -> delete
                                if ($clean == 1) {
                                    $link_item->delete(array('id' => $item_ID));
                                } else {
                                    if ($clean == 2) {
                                        // purge
                                        $link_item->delete(array('id' => $item_ID), 1);
                                    }
                                }
                            }
                        }
                    } else {
                        // Unexisting item / Force disconnect
                        $conn = new Computer_Item();
                        $conn->delete(array('id' => $data['id'], '_no_history' => true, '_no_auto_action' => true));
                    }
                }
            }
        }
    }