. * --------------------------------------------------------------------- */ if (!defined('GLPI_ROOT')) { die("Sorry. You can't access this file directly"); } /** Software Class **/ class Software extends CommonDBTM { use Glpi\Features\Clonable; // From CommonDBTM public $dohistory = true; static protected $forward_entity_to = ['Infocom', 'ReservationItem', 'SoftwareVersion']; static $rightname = 'software'; protected $usenotepad = true; public function getCloneRelations() :array { return [ Infocom::class, Contract_Item::class, Document_Item::class, KnowbaseItem_Item::class ]; } static function getTypeName($nb = 0) { return _n('Software', 'Software', $nb); } /** * @see CommonGLPI::getMenuShorcut() * * @since 0.85 **/ static function getMenuShorcut() { return 's'; } function getTabNameForItem(CommonGLPI $item, $withtemplate = 0) { if (!$withtemplate) { switch ($item->getType()) { case __CLASS__ : if ($item->isRecursive() && $item->can($item->fields['id'], UPDATE)) { return __('Merging'); } break; } } return ''; } static function displayTabContentForItem(CommonGLPI $item, $tabnum = 1, $withtemplate = 0) { if ($item->getType() == __CLASS__) { $item->showMergeCandidates(); } return true; } function defineTabs($options = []) { $ong = []; $this->addDefaultFormTab($ong); $this->addImpactTab($ong, $options); $this->addStandardTab('SoftwareVersion', $ong, $options); $this->addStandardTab('SoftwareLicense', $ong, $options); $this->addStandardTab('Item_SoftwareVersion', $ong, $options); $this->addStandardTab('Infocom', $ong, $options); $this->addStandardTab('Contract_Item', $ong, $options); $this->addStandardTab('Document_Item', $ong, $options); $this->addStandardTab('KnowbaseItem_Item', $ong, $options); $this->addStandardTab('Ticket', $ong, $options); $this->addStandardTab('Item_Problem', $ong, $options); $this->addStandardTab('Change_Item', $ong, $options); $this->addStandardTab('Link', $ong, $options); $this->addStandardTab('Notepad', $ong, $options); $this->addStandardTab('Reservation', $ong, $options); $this->addStandardTab('Domain_Item', $ong, $options); $this->addStandardTab('Appliance_Item', $ong, $options); $this->addStandardTab('Log', $ong, $options); $this->addStandardTab(__CLASS__, $ong, $options); return $ong; } function prepareInputForUpdate($input) { if (isset($input['is_update']) && !$input['is_update']) { $input['softwares_id'] = 0; } return $input; } function prepareInputForAdd($input) { if (isset($input['is_update']) && !$input['is_update']) { $input['softwares_id'] = 0; } if (isset($input["id"]) && ($input["id"] > 0)) { $input["_oldID"] = $input["id"]; } unset($input['id']); unset($input['withtemplate']); //If category was not set by user (when manually adding a user) if (!isset($input["softwarecategories_id"]) || !$input["softwarecategories_id"]) { $softcatrule = new RuleSoftwareCategoryCollection(); $result = $softcatrule->processAllRules(null, null, Toolbox::stripslashes_deep($input)); if (!empty($result)) { if (isset($result['_ignore_import'])) { $input["softwarecategories_id"] = 0; } else if (isset($result["softwarecategories_id"])) { $input["softwarecategories_id"] = $result["softwarecategories_id"]; } else if (isset($result["_import_category"])) { $softCat = new SoftwareCategory(); $input["softwarecategories_id"] = $softCat->importExternal($input["_system_category"]); } } else { $input["softwarecategories_id"] = 0; } } return $input; } function cleanDBonPurge() { // SoftwareLicense does not extends CommonDBConnexity $sl = new SoftwareLicense(); $sl->deleteByCriteria(['softwares_id' => $this->fields['id']]); $this->deleteChildrenAndRelationsFromDb( [ Item_Project::class, SoftwareVersion::class, ] ); } /** * Update validity indicator of a specific software * * @param $ID ID of the licence * * @since 0.85 * * @return void **/ static function updateValidityIndicator($ID) { $soft = new self(); if ($soft->getFromDB($ID)) { $valid = 1; if (countElementsInTable('glpi_softwarelicenses', ['softwares_id'=>$ID, 'NOT' => [ 'is_valid']]) > 0) { $valid = 0; } if ($valid != $soft->fields['is_valid']) { $soft->update(['id' => $ID, 'is_valid' => $valid]); } } } /** * Print the Software form * * @param $ID integer ID of the item * @param $options array of possible options: * - target filename : where to go when done. * - withtemplate boolean : template or basic item * *@return boolean item found **/ function showForm($ID, $options = []) { $this->initForm($ID, $options); $this->showFormHeader($options); $canedit = $this->canEdit($ID); echo ""; echo "" . __('Name') . ""; echo ""; Html::autocompletionTextField($this, "name"); echo ""; echo "" . __('Publisher').""; Manufacturer::dropdown(['value' => $this->fields["manufacturers_id"]]); echo "\n"; echo ""; echo "" . Location::getTypeName(1) . ""; Location::dropdown(['value' => $this->fields["locations_id"], 'entity' => $this->fields["entities_id"]]); echo ""; echo "" . __('Category') . ""; SoftwareCategory::dropdown(['value' => $this->fields["softwarecategories_id"]]); echo "\n"; echo ""; echo "" . __('Technician in charge of the software') . ""; User::dropdown(['name' => 'users_id_tech', 'value' => $this->fields["users_id_tech"], 'right' => 'own_ticket', 'entity' => $this->fields["entities_id"]]); echo ""; echo "" . __('Associable to a ticket') . ""; Dropdown::showYesNo('is_helpdesk_visible', $this->fields['is_helpdesk_visible']); echo "\n"; echo ""; echo "".__('Group in charge of the software').""; echo ""; Group::dropdown([ 'name' => 'groups_id_tech', 'value' => $this->fields['groups_id_tech'], 'entity' => $this->fields['entities_id'], 'condition' => ['is_assign' => 1] ]); echo ""; echo "".__('Comments') . ""; echo ""; echo ""; echo "\n"; echo ""; echo "" . User::getTypeName(1) . ""; echo ""; User::dropdown(['value' => $this->fields["users_id"], 'entity' => $this->fields["entities_id"], 'right' => 'all']); echo "\n"; echo ""; echo "" . Group::getTypeName(1) . ""; Group::dropdown([ 'value' => $this->fields["groups_id"], 'entity' => $this->fields["entities_id"], 'condition' => ['is_itemgroup' => 1] ]); echo "\n"; // UPDATE echo ""; //TRANS: a noun, (ex : this software is an upgrade of..) echo "" . __('Upgrade') . ""; Dropdown::showYesNo("is_update", $this->fields['is_update']); echo " " . __('from') . " "; Software::dropdown(['value' => $this->fields["softwares_id"]]); echo "\n"; $this->showFormButtons($options); return true; } function getEmpty() { global $CFG_GLPI; parent::getEmpty(); $this->fields["is_helpdesk_visible"] = $CFG_GLPI["default_software_helpdesk_visible"]; } /** * @see CommonDBTM::getSpecificMassiveActions() **/ function getSpecificMassiveActions($checkitem = null) { $isadmin = static::canUpdate(); $actions = parent::getSpecificMassiveActions($checkitem); if ($isadmin && (countElementsInTable("glpi_rules", ['sub_type'=>'RuleSoftwareCategory']) > 0)) { $actions[__CLASS__.MassiveAction::CLASS_ACTION_SEPARATOR.'compute_software_category'] = "". __('Recalculate the category'); } if (Session::haveRightsOr("rule_dictionnary_software", [CREATE, UPDATE]) && (countElementsInTable("glpi_rules", ['sub_type'=>'RuleDictionnarySoftware']) > 0)) { $actions[__CLASS__.MassiveAction::CLASS_ACTION_SEPARATOR.'replay_dictionnary'] = "". __('Replay the dictionary rules'); } if ($isadmin) { KnowbaseItem_Item::getMassiveActionsForItemtype($actions, __CLASS__, 0, $checkitem); } return $actions; } /** * @since 0.85 * * @see CommonDBTM::processMassiveActionsForOneItemtype() **/ static function processMassiveActionsForOneItemtype(MassiveAction $ma, CommonDBTM $item, array $ids) { switch ($ma->getAction()) { case 'merge' : $input = $ma->getInput(); if (isset($input['item_items_id'])) { $items = []; foreach ($ids as $id) { $items[$id] = 1; } if ($item->can($input['item_items_id'], UPDATE)) { if ($item->merge($items)) { $ma->itemDone($item->getType(), $ids, MassiveAction::ACTION_OK); } else { $ma->itemDone($item->getType(), $ids, MassiveAction::ACTION_KO); $ma->addMessage($item->getErrorMessage(ERROR_ON_ACTION)); } } else { $ma->itemDone($item->getType(), $ids, MassiveAction::ACTION_NORIGHT); $ma->addMessage($item->getErrorMessage(ERROR_RIGHT)); } } else { $ma->itemDone($item->getType(), $ids, MassiveAction::ACTION_KO); } return; case 'compute_software_category' : $softcatrule = new RuleSoftwareCategoryCollection(); foreach ($ids as $id) { $params = []; //Get software name and manufacturer if ($item->can($id, UPDATE)) { $params["name"] = $item->fields["name"]; $params["manufacturers_id"] = $item->fields["manufacturers_id"]; $params["comment"] = $item->fields["comment"]; $output = []; $output = $softcatrule->processAllRules(null, $output, $params); //Process rules if (isset($output['softwarecategories_id']) && $item->update(['id' => $id, 'softwarecategories_id' => $output['softwarecategories_id']])) { $ma->itemDone($item->getType(), $id, MassiveAction::ACTION_OK); } else { $ma->itemDone($item->getType(), $id, MassiveAction::ACTION_KO); $ma->addMessage($item->getErrorMessage(ERROR_ON_ACTION)); } } else { $ma->itemDone($item->getType(), $ids, MassiveAction::ACTION_NORIGHT); $ma->addMessage($item->getErrorMessage(ERROR_RIGHT)); } } return; case 'replay_dictionnary' : $softdictionnayrule = new RuleDictionnarySoftwareCollection(); $allowed_ids = []; foreach ($ids as $id) { if ($item->can($id, UPDATE)) { $allowed_ids[] = $id; } else { $ma->itemDone($item->getType(), $ids, MassiveAction::ACTION_NORIGHT); $ma->addMessage($item->getErrorMessage(ERROR_RIGHT)); } } if ($softdictionnayrule->replayRulesOnExistingDB(0, 0, $allowed_ids)>0) { $ma->itemDone($item->getType(), $allowed_ids, MassiveAction::ACTION_OK); } else { $ma->itemDone($item->getType(), $allowed_ids, MassiveAction::ACTION_KO); } return; } parent::processMassiveActionsForOneItemtype($ma, $item, $ids); } function rawSearchOptions() { // Only use for History (not by search Engine) $tab = parent::rawSearchOptions(); $tab[] = [ 'id' => '2', 'table' => $this->getTable(), 'field' => 'id', 'name' => __('ID'), 'massiveaction' => false, 'datatype' => 'number' ]; $tab = array_merge($tab, Location::rawSearchOptionsToAdd()); $tab[] = [ 'id' => '16', 'table' => $this->getTable(), 'field' => 'comment', 'name' => __('Comments'), 'datatype' => 'text' ]; $tab[] = [ 'id' => '62', 'table' => 'glpi_softwarecategories', 'field' => 'completename', 'name' => __('Category'), 'datatype' => 'dropdown' ]; $tab[] = [ 'id' => '19', 'table' => $this->getTable(), 'field' => 'date_mod', 'name' => __('Last update'), 'datatype' => 'datetime', 'massiveaction' => false ]; $tab[] = [ 'id' => '121', 'table' => $this->getTable(), 'field' => 'date_creation', 'name' => __('Creation date'), 'datatype' => 'datetime', 'massiveaction' => false ]; $tab[] = [ 'id' => '23', 'table' => 'glpi_manufacturers', 'field' => 'name', 'name' => __('Publisher'), 'datatype' => 'dropdown' ]; $tab[] = [ 'id' => '24', 'table' => 'glpi_users', 'field' => 'name', 'linkfield' => 'users_id_tech', 'name' => __('Technician in charge of the software'), 'datatype' => 'dropdown', 'right' => 'own_ticket' ]; $tab[] = [ 'id' => '49', 'table' => 'glpi_groups', 'field' => 'completename', 'linkfield' => 'groups_id_tech', 'name' => __('Group in charge of the software'), 'condition' => ['is_assign' => 1], 'datatype' => 'dropdown' ]; $tab[] = [ 'id' => '64', 'table' => $this->getTable(), 'field' => 'template_name', 'name' => __('Template name'), 'datatype' => 'text', 'massiveaction' => false, 'nosearch' => true, 'nodisplay' => true, 'autocomplete' => true, ]; $tab[] = [ 'id' => '70', 'table' => 'glpi_users', 'field' => 'name', 'name' => User::getTypeName(1), 'datatype' => 'dropdown', 'right' => 'all' ]; $tab[] = [ 'id' => '71', 'table' => 'glpi_groups', 'field' => 'completename', 'name' => Group::getTypeName(1), 'condition' => ['is_itemgroup' => 1], 'datatype' => 'dropdown' ]; $tab[] = [ 'id' => '61', 'table' => $this->getTable(), 'field' => 'is_helpdesk_visible', 'name' => __('Associable to a ticket'), 'datatype' => 'bool' ]; $tab[] = [ 'id' => '63', 'table' => $this->getTable(), 'field' => 'is_valid', //TRANS: Indicator to know is all licenses of the software are valids 'name' => __('Valid licenses'), 'datatype' => 'bool' ]; $tab[] = [ 'id' => '80', 'table' => 'glpi_entities', 'field' => 'completename', 'name' => Entity::getTypeName(1), 'massiveaction' => false, 'datatype' => 'dropdown' ]; $newtab = [ 'id' => '72', 'table' => 'glpi_items_softwareversions', 'field' => 'id', 'name' => _x('quantity', 'Number of installations'), 'forcegroupby' => true, 'usehaving' => true, 'datatype' => 'count', 'nometa' => true, 'massiveaction' => false, 'joinparams' => [ 'jointype' => 'child', 'beforejoin' => [ 'table' => 'glpi_softwareversions', 'joinparams' => ['jointype' => 'child'], ], 'condition' => "AND NEWTABLE.`is_deleted_item` = 0 AND NEWTABLE.`is_deleted` = 0 AND NEWTABLE.`is_template_item` = 0", ] ]; if (Session::getLoginUserID()) { $newtab['joinparams']['condition'] .= getEntitiesRestrictRequest(' AND', 'NEWTABLE'); } $tab[] = $newtab; $tab = array_merge($tab, SoftwareLicense::rawSearchOptionsToAdd()); $name = _n('Version', 'Versions', Session::getPluralNumber()); $tab[] = [ 'id' => 'versions', 'name' => $name ]; $tab[] = [ 'id' => '5', 'table' => 'glpi_softwareversions', 'field' => 'name', 'name' => __('Name'), 'forcegroupby' => true, 'massiveaction' => false, 'displaywith' => ['softwares_id'], 'joinparams' => [ 'jointype' => 'child' ], 'datatype' => 'dropdown' ]; $tab[] = [ 'id' => '31', 'table' => 'glpi_states', 'field' => 'completename', 'name' => __('Status'), 'datatype' => 'dropdown', 'forcegroupby' => true, 'massiveaction' => false, 'joinparams' => [ 'beforejoin' => [ 'table' => 'glpi_softwareversions', 'joinparams' => [ 'jointype' => 'child' ] ] ] ]; $tab[] = [ 'id' => '170', 'table' => 'glpi_softwareversions', 'field' => 'comment', 'name' => __('Comments'), 'forcegroupby' => true, 'datatype' => 'text', 'massiveaction' => false, 'joinparams' => [ 'jointype' => 'child' ] ]; $tab[] = [ 'id' => '4', 'table' => 'glpi_operatingsystems', 'field' => 'name', 'datatype' => 'dropdown', 'name' => OperatingSystem::getTypeName(1), 'forcegroupby' => true, 'joinparams' => [ 'beforejoin' => [ 'table' => 'glpi_softwareversions', 'joinparams' => [ 'jointype' => 'child' ] ] ] ]; // add objectlock search options $tab = array_merge($tab, ObjectLock::rawSearchOptionsToAdd(get_class($this))); $tab = array_merge($tab, Notepad::rawSearchOptionsToAdd()); return $tab; } /** * Make a select box for software to install * * @param $myname select name * @param $entity_restrict restrict to a defined entity * * @return integer random part of elements id **/ static function dropdownSoftwareToInstall($myname, $entity_restrict) { global $CFG_GLPI; // Make a select box $rand = mt_rand(); $where = getEntitiesRestrictCriteria('glpi_softwares', 'entities_id', $entity_restrict, true); $rand = Dropdown::show('Software', ['condition' => $where]); $paramsselsoft = ['softwares_id' => '__VALUE__', 'myname' => $myname]; Ajax::updateItemOnSelectEvent("dropdown_softwares_id$rand", "show_".$myname.$rand, $CFG_GLPI["root_doc"]."/ajax/dropdownInstallVersion.php", $paramsselsoft); echo " \n"; return $rand; } /** * Make a select box for license software to associate * * @param $myname select name * @param $entity_restrict restrict to a defined entity * * @return integer random part of elements id **/ static function dropdownLicenseToInstall($myname, $entity_restrict) { global $CFG_GLPI, $DB; $iterator = $DB->request([ 'SELECT' => [ 'glpi_softwares.id', 'glpi_softwares.name' ], 'DISTINCT' => true, 'FROM' => 'glpi_softwares', 'INNER JOIN' => [ 'glpi_softwarelicenses' => [ 'ON' => [ 'glpi_softwarelicenses' => 'softwares_id', 'glpi_softwares' => 'id' ] ] ], 'WHERE' => [ 'glpi_softwares.is_deleted' => 0, 'glpi_softwares.is_template' => 0 ] + getEntitiesRestrictCriteria('glpi_softwarelicenses', 'entities_id', $entity_restrict, true), 'ORDERBY' => 'glpi_softwares.name' ]); $values = []; while ($data = $iterator->next()) { $softwares_id = $data["id"]; $values[$softwares_id] = $data["name"]; } $rand = Dropdown::showFromArray('softwares_id', $values, ['display_emptychoice' => true]); $paramsselsoft = ['softwares_id' => '__VALUE__', 'entity_restrict' => $entity_restrict, 'myname' => $myname]; Ajax::updateItemOnSelectEvent("dropdown_softwares_id$rand", "show_".$myname.$rand, $CFG_GLPI["root_doc"]."/ajax/dropdownSoftwareLicense.php", $paramsselsoft); echo " \n"; return $rand; } /** * Create a new software * * @param name the software's name (need to be addslashes) * @param manufacturer_id id of the software's manufacturer * @param entity the entity in which the software must be added * @param comment (default '') * @param is_recursive boolean must the software be recursive (false by default) * @param is_helpdesk_visible show in helpdesk, default : from config (false by default) * * @return the software's ID **/ function addSoftware($name, $manufacturer_id, $entity, $comment = '', $is_recursive = false, $is_helpdesk_visible = null) { global $CFG_GLPI; $input["name"] = $name; $input["manufacturers_id"] = $manufacturer_id; $input["entities_id"] = $entity; $input["is_recursive"] = ($is_recursive ? 1 : 0); // No comment if (is_null($is_helpdesk_visible)) { $input["is_helpdesk_visible"] = $CFG_GLPI["default_software_helpdesk_visible"]; } else { $input["is_helpdesk_visible"] = $is_helpdesk_visible; } //Process software's category rules $softcatrule = new RuleSoftwareCategoryCollection(); $result = $softcatrule->processAllRules(null, null, Toolbox::stripslashes_deep($input)); if (!empty($result)) { if (isset($result['_ignore_import'])) { $input["softwarecategories_id"] = 0; } else if (isset($result["softwarecategories_id"])) { $input["softwarecategories_id"] = $result["softwarecategories_id"]; } else if (isset($result["_import_category"])) { $softCat = new SoftwareCategory(); $input["softwarecategories_id"] = $softCat->importExternal($input["_system_category"]); } } else { $input["softwarecategories_id"] = 0; } return $this->add($input); } /** * Add a software. If already exist in trashbin restore it * * @param name the software's name * @param manufacturer the software's manufacturer * @param entity the entity in which the software must be added * @param comment comment (default '') * @param is_recursive boolean must the software be recursive (false by default) * @param is_helpdesk_visible show in helpdesk, default = config value (false by default) */ function addOrRestoreFromTrash($name, $manufacturer, $entity, $comment = '', $is_recursive = false, $is_helpdesk_visible = null) { global $DB; //Look for the software by his name in GLPI for a specific entity $manufacturer_id = 0; if ($manufacturer != '') { $manufacturer_id = Dropdown::import('Manufacturer', ['name' => $manufacturer]); } $iterator = $DB->request([ 'SELECT' => [ 'glpi_softwares.id', 'glpi_softwares.is_deleted' ], 'FROM' => 'glpi_softwares', 'WHERE' => [ 'name' => $name, 'manufacturers_id' => $manufacturer_id, 'is_template' => 0 ] + getEntitiesRestrictCriteria('glpi_softwares', 'entities_id', $entity, true) ]); if (count($iterator)) { //Software already exists for this entity, get his ID $data = $iterator->next(); $ID = $data["id"]; // restore software if ($data['is_deleted']) { $this->removeFromTrash($ID); } } else { $ID = 0; } if (!$ID) { $ID = $this->addSoftware($name, $manufacturer_id, $entity, $comment, $is_recursive, $is_helpdesk_visible); } return $ID; } /** * Put software in trashbin because it's been removed by GLPI software dictionnary * * @param $ID the ID of the software to put in trashbin * @param $comment the comment to add to the already existing software's comment (default '') * * @return boolean (success) **/ function putInTrash($ID, $comment = '') { global $CFG_GLPI; $this->getFromDB($ID); $input["id"] = $ID; $input["is_deleted"] = 1; //change category of the software on deletion (if defined in glpi_configs) if (isset($CFG_GLPI["softwarecategories_id_ondelete"]) && ($CFG_GLPI["softwarecategories_id_ondelete"] != 0)) { $input["softwarecategories_id"] = $CFG_GLPI["softwarecategories_id_ondelete"]; } //Add dictionnary comment to the current comment $input["comment"] = (($this->fields["comment"] != '') ? "\n" : '') . $comment; return $this->update($input); } /** * Restore a software from trashbin * * @param $ID the ID of the software to put in trashbin * * @return boolean (success) **/ function removeFromTrash($ID) { $res = $this->restore(["id" => $ID]); $softcatrule = new RuleSoftwareCategoryCollection(); $result = $softcatrule->processAllRules(null, null, $this->fields); if (!empty($result) && isset($result['softwarecategories_id']) && ($result['softwarecategories_id'] != $this->fields['softwarecategories_id'])) { $this->update(['id' => $ID, 'softwarecategories_id' => $result['softwarecategories_id']]); } return $res; } /** * Show softwares candidates to be merged with the current * * @return void **/ function showMergeCandidates() { global $DB; $ID = $this->getField('id'); $this->check($ID, UPDATE); $rand = mt_rand(); echo "
"; $iterator = $DB->request([ 'SELECT' => [ 'glpi_softwares.id', 'glpi_softwares.name', 'glpi_entities.completename AS entity' ], 'FROM' => 'glpi_softwares', 'LEFT JOIN' => [ 'glpi_entities' => [ 'ON' => [ 'glpi_softwares' => 'entities_id', 'glpi_entities' => 'id' ] ] ], 'WHERE' => [ 'glpi_softwares.id' => ['!=', $ID], 'glpi_softwares.name' => addslashes($this->fields['name']), 'glpi_softwares.is_deleted' => 0, 'glpi_softwares.is_template' => 0 ] + getEntitiesRestrictCriteria( 'glpi_softwares', 'entities_id', getSonsOf("glpi_entities", $this->fields["entities_id"]), false ), 'ORDERBY' => 'entity' ]); $nb = count($iterator); if ($nb) { $link = Toolbox::getItemTypeFormURL('Software'); Html::openMassiveActionsForm('mass'.__CLASS__.$rand); $massiveactionparams = ['num_displayed' => min($_SESSION['glpilist_limit'], $nb), 'container' => 'mass'.__CLASS__.$rand, 'specific_actions' => [__CLASS__.MassiveAction::CLASS_ACTION_SEPARATOR.'merge' => __('Merge')], 'item' => $this]; Html::showMassiveActions($massiveactionparams); echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; while ($data = $iterator->next()) { echo ""; echo ""; echo ""; echo ""; echo ""; echo "\n"; } echo "
"; echo Html::getCheckAllAsCheckbox('mass'.__CLASS__.$rand); echo "".__('Name')."".Entity::getTypeName(1).""._n('Installation', 'Installations', Session::getPluralNumber())."".SoftwareLicense::getTypeName(Session::getPluralNumber())."
".Html::getMassiveActionCheckBox(__CLASS__, $data["id"])."".$data["name"]."".$data["entity"]."".Item_SoftwareVersion::countForSoftware($data["id"])."".SoftwareLicense::countForSoftware($data["id"])."
\n"; $massiveactionparams['ontop'] =false; Html::showMassiveActions($massiveactionparams); Html::closeForm(); } else { echo __('No item found'); } echo "
"; } /** * Merge softwares with current * * @param $item array of software ID to be merged * @param boolean display html progress bar * * @return boolean about success **/ function merge($item, $html = true) { global $DB; $ID = $this->getField('id'); if ($html) { echo "
"; echo ""; echo "
".__('Merging')."
"; Html::createProgressBar(__('Work in progress...')); echo "
\n"; } $item = array_keys($item); // Search for software version $req = $DB->request("glpi_softwareversions", ["softwares_id" => $item]); $i = 0; if ($nb = $req->numrows()) { foreach ($req as $from) { $found = false; foreach ($DB->request("glpi_softwareversions", ["softwares_id" => $ID, "name" => $from["name"]]) as $dest) { // Update version ID on License $DB->update( 'glpi_softwarelicenses', [ 'softwareversions_id_buy' => $dest['id'] ], [ 'softwareversions_id_buy' => $from['id'] ] ); $DB->update( 'glpi_softwarelicenses', [ 'softwareversions_id_use' => $dest['id'] ], [ 'softwareversions_id_use' => $from['id'] ] ); // Move installation to existing version in destination software $found = $DB->update( 'glpi_items_softwareversions', [ 'softwareversions_id' => $dest['id'] ], [ 'softwareversions_id' => $from['id'] ] ); } if ($found) { // Installation has be moved, delete the source version $DB->delete( 'glpi_softwareversions', [ 'id' => $from['id'] ] ); } else { // Move version to destination software $result = $DB->update( 'glpi_softwareversions', [ 'softwares_id' => $ID, 'entities_id' => $this->getField('entities_id') ], [ 'id' => $from['id'] ] ); } if ($result) { $i++; } if ($html) { Html::changeProgressBarPosition($i, $nb+1); } } } // Move software license $result = $DB->update( 'glpi_softwarelicenses', [ 'softwares_id' => $ID ], [ 'softwares_id' => $item ] ); if ($result) { $i++; } if ($i == ($nb+1)) { //error_log ("All merge operations ok."); $soft = new self(); foreach ($item as $old) { $soft->putInTrash($old, __('Software deleted after merging')); } } if ($html) { Html::changeProgressBarPosition($i, $nb+1, __('Task completed.')); } return $i == ($nb+1); } static function getDefaultSearchRequest() { return [ 'sort' => 0 ]; } static function getIcon() { return "fas fa-cube"; } }