grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026. -------------------------------------------------------------------------- */ /** @file * @brief */ if (!defined('GLPI_ROOT')) { die("Sorry. You can't access this file directly"); } /** * Printer Class **/ class Printer extends CommonDBTM { // From CommonDBTM public $dohistory = true; static protected $forward_entity_to = array('Infocom', 'NetworkPort', 'ReservationItem'); static $rightname = 'printer'; protected $usenotepad = true; /** * Name of the type * * @param $nb : number of item in the type **/ static function getTypeName($nb=0) { return _n('Printer', 'Printers', $nb); } /** * @see CommonDBTM::useDeletedToLockIfDynamic() * * @since version 0.84 **/ function useDeletedToLockIfDynamic() { return false; } function defineTabs($options=array()) { $ong = array(); $this->addDefaultFormTab($ong); $this->addStandardTab('Cartridge', $ong, $options); $this->addStandardTab('Item_Devices', $ong, $options); $this->addStandardTab('Computer_Item', $ong, $options); $this->addStandardTab('NetworkPort', $ong, $options); $this->addStandardTab('Infocom', $ong, $options); $this->addStandardTab('Contract_Item', $ong, $options); $this->addStandardTab('Document_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('Log', $ong, $options); return $ong; } /** * Can I change recusvive flag to false * check if there is "linked" object in another entity * * Overloaded from CommonDBTM * * @return booleen **/ function canUnrecurs() { global $DB, $CFG_GLPI; $ID = $this->fields['id']; if (($ID < 0) || !$this->fields['is_recursive']) { return true; } if (!parent::canUnrecurs()) { return false; } $entities = "(".$this->fields['entities_id']; foreach (getAncestorsOf("glpi_entities",$this->fields['entities_id']) as $papa) { $entities .= ",$papa"; } $entities .= ")"; // RELATION : printers -> _port -> _wire -> _port -> device // Evaluate connection in the 2 ways for ($tabend = array("networkports_id_1" => "networkports_id_2", "networkports_id_2" => "networkports_id_1") ; list($enda, $endb) = each($tabend) ; ) { $sql = "SELECT `itemtype`, GROUP_CONCAT(DISTINCT `items_id`) AS ids FROM `glpi_networkports_networkports`, `glpi_networkports` WHERE `glpi_networkports_networkports`.`$endb` = `glpi_networkports`.`id` AND `glpi_networkports_networkports`.`$enda` IN (SELECT `id` FROM `glpi_networkports` WHERE `itemtype` = '".$this->getType()."' AND `items_id` = '$ID') GROUP BY `itemtype`"; $res = $DB->query($sql); if ($res) { while ($data = $DB->fetch_assoc($res)) { $itemtable = getTableForItemType($data["itemtype"]); if ($item = getItemForItemtype($data["itemtype"])) { // For each itemtype which are entity dependant if ($item->isEntityAssign()) { if (countElementsInTable($itemtable, "`id` IN (".$data["ids"].") AND `entities_id` NOT IN $entities") > 0) { return false; } } } } } } return true; } function prepareInputForAdd($input) { if (isset($input["id"]) && ($input["id"] > 0)) { $input["_oldID"]=$input["id"]; } unset($input['id']); unset($input['withtemplate']); if (isset($input['init_pages_counter'])) { $input['init_pages_counter'] = intval($input['init_pages_counter']); } else { $input['init_pages_counter'] = 0; } if (isset($input['last_pages_counter'])) { $input['last_pages_counter'] = intval($input['last_pages_counter']); } else { $input['last_pages_counter'] = $input['init_pages_counter']; } return $input; } function prepareInputForUpdate($input) { if (isset($input['init_pages_counter'])) { $input['init_pages_counter'] = intval($input['init_pages_counter']); } if (isset($input['last_pages_counter'])) { $input['last_pages_counter'] = intval($input['last_pages_counter']); } return $input; } function post_addItem() { global $DB, $CFG_GLPI; // Manage add from template if (isset($this->input["_oldID"])) { // ADD Devices Item_devices::cloneItem($this->getType(), $this->input["_oldID"], $this->fields['id']); // ADD Infocoms Infocom::cloneItem($this->getType(), $this->input["_oldID"], $this->fields['id']); // ADD Ports NetworkPort::cloneItem($this->getType(), $this->input["_oldID"], $this->fields['id']); // ADD Contract Contract_Item::cloneItem($this->getType(), $this->input["_oldID"], $this->fields['id']); // ADD Documents Document_Item::cloneItem($this->getType(), $this->input["_oldID"], $this->fields['id']); // ADD Computers Computer_Item::cloneItem($this->getType(), $this->input["_oldID"], $this->fields['id']); } } function cleanDBonPurge() { global $DB; $ci = new Computer_Item(); $ci->cleanDBonItemDelete(__CLASS__, $this->fields['id']); $query = "UPDATE `glpi_cartridges` SET `printers_id` = NULL WHERE `printers_id` = '".$this->fields['id']."'"; $result = $DB->query($query); $ip = new Item_Problem(); $ip->cleanDBonItemDelete(__CLASS__, $this->fields['id']); $ci = new Change_Item(); $ci->cleanDBonItemDelete(__CLASS__, $this->fields['id']); $ip = new Item_Project(); $ip->cleanDBonItemDelete(__CLASS__, $this->fields['id']); Item_Devices::cleanItemDeviceDBOnItemDelete($this->getType(), $this->fields['id'], (!empty($this->input['keep_devices']))); } /** * Print the printer 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=array()) { global $CFG_GLPI; $target = $this->getFormURL(); $withtemplate = $this->initForm($ID, $options); $this->showFormHeader($options); echo ""; //TRANS: %1$s is a string, %2$s a second one without spaces between them : to change for RTL echo "".sprintf(__('%1$s%2$s'), __('Name'), (isset($options['withtemplate']) && $options['withtemplate']?"*":"")). "\n"; echo ""; $objectName = autoName($this->fields["name"], "name", (isset($options['withtemplate']) && ($options['withtemplate'] == 2)), $this->getType(), $this->fields["entities_id"]); Html::autocompletionTextField($this, 'name', array('value' => $objectName)); echo "\n"; echo "".__('Status')."\n"; echo ""; State::dropdown(array('value' => $this->fields["states_id"], 'entity' => $this->fields["entities_id"], 'condition' => "`is_visible_printer`")); echo "\n"; echo ""; echo "".__('Location')."\n"; echo ""; Location::dropdown(array('value' => $this->fields["locations_id"], 'entity' => $this->fields["entities_id"])); echo "\n"; echo "".__('Type')."\n"; echo ""; PrinterType::dropdown(array('value' => $this->fields["printertypes_id"])); echo "\n"; echo ""; echo "".__('Technician in charge of the hardware')."\n"; echo ""; User::dropdown(array('name' => 'users_id_tech', 'value' => $this->fields["users_id_tech"], 'right' => 'own_ticket', 'entity' => $this->fields["entities_id"])); echo "\n"; echo "".__('Manufacturer')."\n"; echo ""; Manufacturer::dropdown(array('value' => $this->fields["manufacturers_id"])); echo "\n"; echo ""; echo "".__('Group in charge of the hardware').""; echo ""; Group::dropdown(array('name' => 'groups_id_tech', 'value' => $this->fields['groups_id_tech'], 'entity' => $this->fields['entities_id'], 'condition' => '`is_assign`')); echo ""; echo "".__('Model')."\n"; echo ""; PrinterModel::dropdown(array('value' => $this->fields["printermodels_id"])); echo "\n"; echo ""; echo "".__('Alternate username number')."\n"; echo ""; Html::autocompletionTextField($this, "contact_num"); echo "\n"; echo "".__('Serial number')."\n"; echo ""; Html::autocompletionTextField($this, "serial"); echo "\n"; echo ""; echo "".__('Alternate username')."\n"; echo ""; Html::autocompletionTextField($this, "contact"); echo "\n"; echo "".sprintf(__('%1$s%2$s'), __('Inventory number'), (isset($options['withtemplate']) && $options['withtemplate']?"*":"")). "\n"; echo ""; $objectName = autoName($this->fields["otherserial"], "otherserial", (isset($options['withtemplate']) && ($options['withtemplate'] == 2)), $this->getType(), $this->fields["entities_id"]); Html::autocompletionTextField($this, 'otherserial', array('value' => $objectName)); echo "\n"; echo ""; echo "".__('User')."\n"; echo ""; User::dropdown(array('value' => $this->fields["users_id"], 'entity' => $this->fields["entities_id"], 'right' => 'all')); echo "\n"; echo "".__('Management type').""; echo ""; $globalitem = array(); $globalitem['withtemplate'] = $withtemplate; $globalitem['value'] = $this->fields["is_global"]; $globalitem['target'] = $target; if ($this->can($ID, UPDATE)) { $globalitem['management_restrict'] = $CFG_GLPI["printers_management_restrict"]; } Dropdown::showGlobalSwitch($this->fields["id"], $globalitem); echo "\n"; echo ""; echo "".__('Group')."\n"; echo ""; Group::dropdown(array('value' => $this->fields["groups_id"], 'entity' => $this->fields["entities_id"], 'condition' => '`is_itemgroup`')); echo "\n"; echo "".__('Network')."\n"; echo ""; Network::dropdown(array('value' => $this->fields["networks_id"])); echo "\n"; // Display auto inventory informations $rowspan = 5; echo ""; echo "".__('Domain')."\n"; echo ""; Domain::dropdown(array('value' => $this->fields["domains_id"], 'entity' => $this->fields["entities_id"])); echo ""; echo "".__('Comments')."\n"; echo ""; echo "\n"; echo ""; echo "".__('Memory')."\n"; echo ""; Html::autocompletionTextField($this, "memory_size"); echo "\n"; echo ""; echo "".__('Initial page counter')."\n"; echo ""; Html::autocompletionTextField($this, "init_pages_counter", array('size' => 10)); echo "\n"; echo ""; echo "".__('Current counter of pages')."\n"; echo ""; Html::autocompletionTextField($this, "last_pages_counter", array('size' => 10)); echo "\n"; echo ""; echo ""._n('Port','Ports', Session::getPluralNumber()).""; echo "\n"; // serial interface echo ""; // parallel interface? echo ""; // USB interface? echo ""; // ethernet interface? echo ""; // wifi ? echo "
".__('Serial').""; Dropdown::showYesNo("have_serial", $this->fields["have_serial"]); echo "".__('Parallel').""; Dropdown::showYesNo("have_parallel", $this->fields["have_parallel"]); echo "
".__('USB').""; Dropdown::showYesNo("have_usb", $this->fields["have_usb"]); echo "".__('Ethernet').""; Dropdown::showYesNo("have_ethernet",$this->fields["have_ethernet"]); echo "
".__('Wifi').""; Dropdown::showYesNo("have_wifi", $this->fields["have_wifi"]); echo "
\n"; echo ""; echo ""; // Display auto inventory informations if (!empty($ID) && $this->fields["is_dynamic"]) { echo ""; Plugin::doHook("autoinventory_information", $this); echo ""; } $this->showFormButtons($options); return true; } /** * Return the linked items (in computers_items) * * @return an array of linked items like array('Computer' => array(1,2), 'Printer' => array(5,6)) * @since version 0.84.4 **/ function getLinkedItems() { global $DB; $query = "SELECT 'Computer', `computers_id` FROM `glpi_computers_items` WHERE `itemtype` = '".$this->getType()."' AND `items_id` = '" . $this->fields['id']."'"; $tab = array(); foreach ($DB->request($query) as $data) { $tab['Computer'][$data['computers_id']] = $data['computers_id']; } return $tab; } /** * @see CommonDBTM::getSpecificMassiveActions() **/ function getSpecificMassiveActions($checkitem=NULL) { $actions = parent::getSpecificMassiveActions($checkitem); if (static::canUpdate()) { Computer_Item::getMassiveActionsForItemtype($actions, __CLASS__, 0, $checkitem); MassiveAction::getAddTransferList($actions); } return $actions; } function getSearchOptions() { $tab = array(); $tab['common'] = __('Characteristics'); $tab[1]['table'] = $this->getTable(); $tab[1]['field'] = 'name'; $tab[1]['name'] = __('Name'); $tab[1]['datatype'] = 'itemlink'; $tab[1]['massiveaction'] = false; $tab[2]['table'] = $this->getTable(); $tab[2]['field'] = 'id'; $tab[2]['name'] = __('ID'); $tab[2]['massiveaction'] = false; $tab[2]['datatype'] = 'number'; $tab += Location::getSearchOptionsToAdd(); $tab[4]['table'] = 'glpi_printertypes'; $tab[4]['field'] = 'name'; $tab[4]['name'] = __('Type'); $tab[4]['datatype'] = 'dropdown'; $tab[40]['table'] = 'glpi_printermodels'; $tab[40]['field'] = 'name'; $tab[40]['name'] = __('Model'); $tab[40]['datatype'] = 'dropdown'; $tab[31]['table'] = 'glpi_states'; $tab[31]['field'] = 'completename'; $tab[31]['name'] = __('Status'); $tab[31]['datatype'] = 'dropdown'; $tab[31]['condition'] = "`is_visible_printer`"; $tab[5]['table'] = $this->getTable(); $tab[5]['field'] = 'serial'; $tab[5]['name'] = __('Serial number'); $tab[5]['datatype'] = 'string'; $tab[6]['table'] = $this->getTable(); $tab[6]['field'] = 'otherserial'; $tab[6]['name'] = __('Inventory number'); $tab[6]['datatype'] = 'string'; $tab[7]['table'] = $this->getTable(); $tab[7]['field'] = 'contact'; $tab[7]['name'] = __('Alternate username'); $tab[7]['datatype'] = 'string'; $tab[8]['table'] = $this->getTable(); $tab[8]['field'] = 'contact_num'; $tab[8]['name'] = __('Alternate username number'); $tab[8]['datatype'] = 'string'; $tab[70]['table'] = 'glpi_users'; $tab[70]['field'] = 'name'; $tab[70]['name'] = __('User'); $tab[70]['datatype'] = 'dropdown'; $tab[70]['right'] = 'all'; $tab[71]['table'] = 'glpi_groups'; $tab[71]['field'] = 'completename'; $tab[71]['name'] = __('Group'); $tab[71]['condition'] = '`is_itemgroup`'; $tab[71]['datatype'] = 'dropdown'; $tab[19]['table'] = $this->getTable(); $tab[19]['field'] = 'date_mod'; $tab[19]['name'] = __('Last update'); $tab[19]['datatype'] = 'datetime'; $tab[19]['massiveaction'] = false; $tab[121]['table'] = $this->getTable(); $tab[121]['field'] = 'date_creation'; $tab[121]['name'] = __('Creation date'); $tab[121]['datatype'] = 'datetime'; $tab[121]['massiveaction'] = false; $tab[16]['table'] = $this->getTable(); $tab[16]['field'] = 'comment'; $tab[16]['name'] = __('Comments'); $tab[16]['datatype'] = 'text'; $tab[42]['table'] = $this->getTable(); $tab[42]['field'] = 'have_serial'; $tab[42]['name'] = __('Serial'); $tab[42]['datatype'] = 'bool'; $tab[43]['table'] = $this->getTable(); $tab[43]['field'] = 'have_parallel'; $tab[43]['name'] = __('Parallel'); $tab[43]['datatype'] = 'bool'; $tab[44]['table'] = $this->getTable(); $tab[44]['field'] = 'have_usb'; $tab[44]['name'] = __('USB'); $tab[44]['datatype'] = 'bool'; $tab[45]['table'] = $this->getTable(); $tab[45]['field'] = 'have_ethernet'; $tab[45]['name'] = __('Ethernet'); $tab[45]['datatype'] = 'bool'; $tab[46]['table'] = $this->getTable(); $tab[46]['field'] = 'have_wifi'; $tab[46]['name'] = __('Wifi'); $tab[46]['datatype'] = 'bool'; $tab[13]['table'] = $this->getTable(); $tab[13]['field'] = 'memory_size'; $tab[13]['name'] = __('Memory'); $tab[13]['datatype'] = 'string'; $tab[11]['table'] = $this->getTable(); $tab[11]['field'] = 'init_pages_counter'; $tab[11]['name'] = __('Initial page counter'); $tab[11]['datatype'] = 'number'; $tab[11]['nosearch'] = true; // only display and histo, no index $tab[12]['table'] = $this->getTable(); $tab[12]['field'] = 'last_pages_counter'; $tab[12]['name'] = __('Current counter of pages'); $tab[12]['datatype'] = 'number'; $tab[9]['table'] = 'glpi_printers'; $tab[9]['field'] = '_virtual'; $tab[9]['linkfield'] = '_virtual'; $tab[9]['name'] = _n('Cartridge','Cartridges', Session::getPluralNumber()); $tab[9]['datatype'] = 'specific'; $tab[9]['massiveaction'] = false; $tab[9]['nosearch'] = true; $tab[9]['nosort'] = true; $tab[17]['table'] = 'glpi_cartridges'; $tab[17]['field'] = 'id'; $tab[17]['name'] = __('Number of used cartridges'); $tab[17]['datatype'] = 'count'; $tab[17]['forcegroupby'] = true; $tab[17]['usehaving'] = true; $tab[17]['massiveaction'] = false; $tab[17]['joinparams'] = array('jointype' => 'child', 'condition' => "AND NEWTABLE.`date_use` IS NOT NULL AND NEWTABLE.`date_out` IS NULL"); $tab[18]['table'] = 'glpi_cartridges'; $tab[18]['field'] = 'id'; $tab[18]['name'] = __('Number of worn cartridges'); $tab[18]['datatype'] = 'count'; $tab[18]['forcegroupby'] = true; $tab[18]['usehaving'] = true; $tab[18]['massiveaction'] = false; $tab[18]['joinparams'] = array('jointype' => 'child', 'condition' => "AND NEWTABLE.`date_out` IS NOT NULL"); $tab[32]['table'] = 'glpi_networks'; $tab[32]['field'] = 'name'; $tab[32]['name'] = __('Network'); $tab[32]['datatype'] = 'dropdown'; $tab[33]['table'] = 'glpi_domains'; $tab[33]['field'] = 'name'; $tab[33]['name'] = __('Domain'); $tab[33]['datatype'] = 'dropdown'; $tab[23]['table'] = 'glpi_manufacturers'; $tab[23]['field'] = 'name'; $tab[23]['name'] = __('Manufacturer'); $tab[23]['datatype'] = 'dropdown'; $tab[24]['table'] = 'glpi_users'; $tab[24]['field'] = 'name'; $tab[24]['linkfield'] = 'users_id_tech'; $tab[24]['name'] = __('Technician in charge of the hardware'); $tab[24]['datatype'] = 'dropdown'; $tab[24]['right'] = 'own_ticket'; $tab[49]['table'] = 'glpi_groups'; $tab[49]['field'] = 'completename'; $tab[49]['linkfield'] = 'groups_id_tech'; $tab[49]['name'] = __('Group in charge of the hardware'); $tab[49]['condition'] = '`is_assign`'; $tab[49]['datatype'] = 'dropdown'; $tab[80]['table'] = 'glpi_entities'; $tab[80]['field'] = 'completename'; $tab[80]['name'] = __('Entity'); $tab[80]['massiveaction'] = false; $tab[80]['datatype'] = 'dropdown'; $tab[82]['table'] = $this->getTable(); $tab[82]['field'] = 'is_global'; $tab[82]['name'] = __('Global management'); $tab[82]['datatype'] = 'bool'; $tab[82]['massiveaction'] = false; $tab[86]['table'] = $this->getTable(); $tab[86]['field'] = 'is_recursive'; $tab[86]['name'] = __('Child entities'); $tab[86]['datatype'] = 'bool'; // add objectlock search options $tab += ObjectLock::getSearchOptionsToAdd( get_class($this) ) ; $tab += Notepad::getSearchOptionsToAdd(); return $tab; } /** * Add a printer. If already exist in dustbin restore it * * @param $name the printer's name (need to be addslashes) * @param $manufacturer the software's manufacturer (need to be addslashes) * @param $entity the entity in which the software must be added * @param $comment comment (default '') **/ function addOrRestoreFromTrash($name, $manufacturer, $entity, $comment='') { global $DB; //Look for the software by his name in GLPI for a specific entity $query_search = "SELECT `glpi_printers`.`id`, `glpi_printers`.`is_deleted` FROM `glpi_printers` WHERE `name` = '$name' AND `is_template` = '0' AND `entities_id` = '$entity'"; $result_search = $DB->query($query_search); if ($DB->numrows($result_search) > 0) { //Printer already exists for this entity, get his ID $data = $DB->fetch_assoc($result_search); $ID = $data["id"]; // restore software if ($data['is_deleted']) { $this->removeFromTrash($ID); } } else { $ID = 0; } if (!$ID) { $ID = $this->addPrinter($name, $manufacturer, $entity, $comment); } return $ID; } /** * Create a new printer * * @param $name the printer's name (need to be addslashes) * @param $manufacturer the printer's manufacturer (need to be addslashes) * @param $entity the entity in which the printer must be added * @param $comment (default '') * * @return the printer's ID **/ function addPrinter($name, $manufacturer, $entity, $comment = '') { global $DB, $CFG_GLPI; $manufacturer_id = 0; if ($manufacturer != '') { $manufacturer_id = Dropdown::importExternal('Manufacturer', $manufacturer); } //If there's a printer in a parent entity with the same name and manufacturer $sql = "SELECT `id` FROM `glpi_printers` WHERE `manufacturers_id` = '$manufacturer_id' AND `name` = '$name' " . getEntitiesRestrictRequest('AND', 'glpi_printers', 'entities_id', $entity, true); $res_printer = $DB->query($sql); if ($printer = $DB->fetch_assoc($res_printer)) { $id = $printer["id"]; } else { $input["name"] = $name; $input["manufacturers_id"] = $manufacturer_id; $input["entities_id"] = $entity; $id = $this->add($input); } return $id; } /** * Restore a software from dustbin * * @param $ID the ID of the software to put in dustbin * * @return boolean (success) **/ function removeFromTrash($ID) { return $this->restore(array("id" => $ID)); } } ?>