grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026.
--------------------------------------------------------------------------
*/
/** @file
* @brief
*/
if (!defined('GLPI_ROOT')) {
die("Sorry. You can't access this file directly");
}
/**
* CartridgeItem Class
* This class is used to manage the various types of cartridges.
* \see Cartridge
**/
class CartridgeItem extends CommonDBTM {
// From CommonDBTM
static protected $forward_entity_to = array('Cartridge', 'Infocom');
public $dohistory = true;
protected $usenotepad = true;
static $rightname = 'cartridge';
static function getTypeName($nb=0) {
return _n('Cartridge model','Cartridge models',$nb);
}
/**
* @see CommonGLPI::getMenuName()
*
* @since version 0.85
**/
static function getMenuName() {
return Cartridge::getTypeName(Session::getPluralNumber());
}
/**
* @since version 0.84
*
* @see CommonDBTM::getPostAdditionalInfosForName
**/
function getPostAdditionalInfosForName() {
if (isset($this->fields["ref"]) && !empty($this->fields["ref"])) {
return $this->fields["ref"];
}
return '';
}
function cleanDBonPurge() {
$class = new Cartridge();
$class->cleanDBonItemDelete($this->getType(), $this->fields['id']);
$class = new CartridgeItem_PrinterModel();
$class->cleanDBonItemDelete($this->getType(), $this->fields['id']);
$class = new Alert();
$class->cleanDBonItemDelete($this->getType(), $this->fields['id']);
}
function post_getEmpty() {
$this->fields["alarm_threshold"] = Entity::getUsedConfig("cartriges_alert_repeat",
$this->fields["entities_id"],
"default_cartridges_alarm_threshold",
10);
}
function defineTabs($options=array()) {
$ong = array();
$this->addDefaultFormTab($ong);
$this->addStandardTab('Cartridge', $ong, $options);
$this->addStandardTab('CartridgeItem_PrinterModel', $ong, $options);
$this->addStandardTab('Infocom', $ong, $options);
$this->addStandardTab('Document_Item',$ong, $options);
$this->addStandardTab('Link',$ong, $options);
$this->addStandardTab('Notepad',$ong, $options);
$this->addStandardTab('Log', $ong, $options);
return $ong;
}
///// SPECIFIC FUNCTIONS
/**
* Count cartridge of the cartridge type
*
* @return number of cartridges
**/
static function getCount() {
global $DB;
$query = "SELECT *
FROM `glpi_cartridges`
WHERE `cartridgeitems_id` = '".$this->fields["id"]."'";
if ($result = $DB->query($query)) {
$number = $DB->numrows($result);
return $number;
}
return false;
}
/**
* Add a compatible printer type for a cartridge type
*
* @param $cartridgeitems_id integer: cartridge type identifier
* @param printermodels_id integer: printer type identifier
*
* @return boolean : true for success
**/
function addCompatibleType($cartridgeitems_id, $printermodels_id) {
global $DB;
if (($cartridgeitems_id > 0)
&& ($printermodels_id > 0)) {
$query = "INSERT INTO `glpi_cartridgeitems_printermodels`
(`cartridgeitems_id`, `printermodels_id`)
VALUES ('$cartridgeitems_id', '$printermodels_id');";
if ($result = $DB->query($query)
&& ($DB->affected_rows() > 0)) {
return true;
}
}
return false;
}
/**
* Print the cartridge type form
*
* @param $ID integer ID of the item
* @param $options array os possible options:
* - target for the Form
* - withtemplate : 1 for newtemplate, 2 for newobject from template
*
* @return Nothing (display)
**/
function showForm($ID, $options=array()) {
$this->initForm($ID, $options);
$this->showFormHeader($options);
echo "
";
echo "| ".__('Name')." | ";
echo "";
Html::autocompletionTextField($this, "name");
echo " | ";
echo "".__('Type')." | ";
echo "";
CartridgeItemType::dropdown(array('value' => $this->fields["cartridgeitemtypes_id"]));
echo " |
";
echo "";
echo "| ".__('Reference')." | ";
echo "";
Html::autocompletionTextField($this, "ref");
echo " | ";
echo "".__('Manufacturer')." | ";
echo "";
Manufacturer::dropdown(array('value' => $this->fields["manufacturers_id"]));
echo " |
";
echo "";
echo "| ".__('Technician in charge of the hardware')." | ";
echo "";
User::dropdown(array('name' => 'users_id_tech',
'value' => $this->fields["users_id_tech"],
'right' => 'own_ticket',
'entity' => $this->fields["entities_id"]));
echo " | ";
echo "".__('Comments')." | ";
echo "
";
echo " |
";
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 " |
\n";
echo "";
echo "| ".__('Stock location')." | ";
echo "";
Location::dropdown(array('value' => $this->fields["locations_id"],
'entity' => $this->fields["entities_id"]));
echo " |
";
echo "";
echo "| ".__('Alert threshold')." | ";
echo "";
Dropdown::showNumber('alarm_threshold', array('value' => $this->fields["alarm_threshold"],
'min' => 0,
'max' => 100,
'step' => 1,
'toadd' => array('-1' => __('Never'))));
Alert::displayLastAlert('CartridgeItem', $ID);
echo " |
";
$this->showFormButtons($options);
return true;
}
/**
* @see CommonDBTM::getSpecificMassiveActions()
**/
function getSpecificMassiveActions($checkitem=NULL) {
$isadmin = static::canUpdate();
$actions = parent::getSpecificMassiveActions($checkitem);
if ($isadmin) {
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[34]['table'] = $this->getTable();
$tab[34]['field'] = 'ref';
$tab[34]['name'] = __('Reference');
$tab[34]['datatype'] = 'string';
$tab[4]['table'] = 'glpi_cartridgeitemtypes';
$tab[4]['field'] = 'name';
$tab[4]['name'] = __('Type');
$tab[4]['datatype'] = 'dropdown';
$tab[23]['table'] = 'glpi_manufacturers';
$tab[23]['field'] = 'name';
$tab[23]['name'] = __('Manufacturer');
$tab[23]['datatype'] = 'dropdown';
$tab[9]['table'] = 'glpi_cartridgeitems';
$tab[9]['field'] = '_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[9]['additionalfields'] = array('alarm_threshold');
$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[19]['table'] = 'glpi_cartridges';
$tab[19]['field'] = 'id';
$tab[19]['name'] = __('Number of new cartridges');
$tab[19]['datatype'] = 'count';
$tab[19]['forcegroupby'] = true;
$tab[19]['usehaving'] = true;
$tab[19]['massiveaction'] = false;
$tab[19]['joinparams'] = array('jointype' => 'child',
'condition' => "AND NEWTABLE.`date_use` IS NULL
AND NEWTABLE.`date_out` IS NULL");
$tab += Location::getSearchOptionsToAdd();
$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[8]['table'] = $this->getTable();
$tab[8]['field'] = 'alarm_threshold';
$tab[8]['name'] = __('Alert threshold');
$tab[8]['datatype'] = 'number';
$tab[8]['toadd'] = array('-1' => __('Never'));
$tab[16]['table'] = $this->getTable();
$tab[16]['field'] = 'comment';
$tab[16]['name'] = __('Comments');
$tab[16]['datatype'] = 'text';
$tab[80]['table'] = 'glpi_entities';
$tab[80]['field'] = 'completename';
$tab[80]['name'] = __('Entity');
$tab[80]['massiveaction'] = false;
$tab[80]['datatype'] = 'dropdown';
$tab[40]['table'] = 'glpi_printermodels';
$tab[40]['field'] = 'name';
$tab[40]['datatype'] = 'dropdown';
$tab[40]['name'] = _n('Printer model', 'Printer models', Session::getPluralNumber());
$tab[40]['forcegroupby'] = true;
$tab[40]['massiveaction'] = false;
$tab[40]['joinparams'] = array('beforejoin'
=> array('table'
=> 'glpi_cartridgeitems_printermodels',
'joinparams'
=> array('jointype' => 'child')));
// add objectlock search options
$tab += ObjectLock::getSearchOptionsToAdd( get_class($this) ) ;
$tab += Notepad::getSearchOptionsToAdd();
return $tab;
}
static function cronInfo($name) {
return array('description' => __('Send alarms on cartridges'));
}
/**
* Cron action on cartridges : alert if a stock is behind the threshold
*
* @param $task for log, display information if NULL? (default NULL)
*
* @return 0 : nothing to do 1 : done with success
**/
static function cronCartridge($task=NULL) {
global $DB, $CFG_GLPI;
$cron_status = 1;
if ($CFG_GLPI["use_mailing"]) {
$message = array();
$alert = new Alert();
foreach (Entity::getEntitiesToNotify('cartridges_alert_repeat') as $entity => $repeat) {
// if you change this query, please don't forget to also change in showDebug()
$query_alert = "SELECT `glpi_cartridgeitems`.`id` AS cartID,
`glpi_cartridgeitems`.`entities_id` AS entity,
`glpi_cartridgeitems`.`ref` AS ref,
`glpi_cartridgeitems`.`name` AS name,
`glpi_cartridgeitems`.`alarm_threshold` AS threshold,
`glpi_alerts`.`id` AS alertID,
`glpi_alerts`.`date`
FROM `glpi_cartridgeitems`
LEFT JOIN `glpi_alerts`
ON (`glpi_cartridgeitems`.`id` = `glpi_alerts`.`items_id`
AND `glpi_alerts`.`itemtype` = 'CartridgeItem')
WHERE `glpi_cartridgeitems`.`is_deleted` = '0'
AND `glpi_cartridgeitems`.`alarm_threshold` >= '0'
AND `glpi_cartridgeitems`.`entities_id` = '".$entity."'
AND (`glpi_alerts`.`date` IS NULL
OR (`glpi_alerts`.`date`+$repeat) < CURRENT_TIMESTAMP());";
$message = "";
$items = array();
foreach ($DB->request($query_alert) as $cartridge) {
if (($unused=Cartridge::getUnusedNumber($cartridge["cartID"]))<=$cartridge["threshold"]) {
//TRANS: %1$s is the cartridge name, %2$s its reference, %3$d the remaining number
$message .= sprintf(__('Threshold of alarm reached for the type of cartridge: %1$s - Reference %2$s - Remaining %3$d'),
$cartridge["name"], $cartridge["ref"], $unused);
$message .='
';
$items[$cartridge["cartID"]] = $cartridge;
// if alert exists -> delete
if (!empty($cartridge["alertID"])) {
$alert->delete(array("id" => $cartridge["alertID"]));
}
}
}
if (!empty($items)) {
$options['entities_id'] = $entity;
$options['items'] = $items;
$entityname = Dropdown::getDropdownName("glpi_entities", $entity);
if (NotificationEvent::raiseEvent('alert', new CartridgeItem(), $options)) {
if ($task) {
$task->log(sprintf(__('%1$s: %2$s')."\n", $entityname, $message));
$task->addVolume(1);
} else {
Session::addMessageAfterRedirect(sprintf(__('%1$s: %2$s'),
$entityname, $message));
}
$input["type"] = Alert::THRESHOLD;
$input["itemtype"] = 'CartridgeItem';
// add alerts
foreach ($items as $ID => $consumable) {
$input["items_id"] = $ID;
$alert->add($input);
unset($alert->fields['id']);
}
} else {
//TRANS: %s is entity name
$msg = sprintf(__('%s: send cartridge alert failed'), $entityname);
if ($task) {
$task->log($msg);
} else {
//TRANS: %s is the entity
Session::addMessageAfterRedirect($msg, false, ERROR);
}
}
}
}
}
}
/**
* Print a select with compatible cartridge
*
* @param $printer Printer object
*
* @return nothing (display)
**/
static function dropdownForPrinter(Printer $printer) {
global $DB;
$query = "SELECT COUNT(*) AS cpt,
`glpi_locations`.`completename` AS location,
`glpi_cartridgeitems`.`ref` AS ref,
`glpi_cartridgeitems`.`name` AS name,
`glpi_cartridgeitems`.`id` AS tID
FROM `glpi_cartridgeitems`
INNER JOIN `glpi_cartridgeitems_printermodels`
ON (`glpi_cartridgeitems`.`id`
= `glpi_cartridgeitems_printermodels`.`cartridgeitems_id`)
INNER JOIN `glpi_cartridges`
ON (`glpi_cartridges`.`cartridgeitems_id` = `glpi_cartridgeitems`.`id`
AND `glpi_cartridges`.`date_use` IS NULL)
LEFT JOIN `glpi_locations`
ON (`glpi_locations`.`id` = `glpi_cartridgeitems`.`locations_id`)
WHERE `glpi_cartridgeitems_printermodels`.`printermodels_id`
= '".$printer->fields["printermodels_id"]."'
".getEntitiesRestrictRequest('AND', 'glpi_cartridgeitems', '',
$printer->fields["entities_id"], true)."
GROUP BY tID
ORDER BY `name`, `ref`";
$datas = array();
if ($result = $DB->query($query)) {
if ($DB->numrows($result)) {
while ($data= $DB->fetch_assoc($result)) {
$text = sprintf(__('%1$s - %2$s'), $data["name"], $data["ref"]);
$text = sprintf(__('%1$s (%2$s)'), $text, $data["cpt"]);
$text = sprintf(__('%1$s - %2$s'), $text, $data["location"]);
$datas[$data["tID"]] = $text;
}
}
}
if (count($datas)) {
return Dropdown::showFromArray('cartridgeitems_id', $datas);
}
return false;
}
function getEvents() {
return array('alert' => __('Send alarms on cartridges'));
}
/**
* Display debug information for current object
**/
function showDebug() {
// see query_alert in cronCartridge()
$item = array('cartID' => $this->fields['id'],
'entity' => $this->fields['entities_id'],
'ref' => $this->fields['ref'],
'name' => $this->fields['name'],
'threshold' => $this->fields['alarm_threshold']);
$options = array();
$options['entities_id'] = $this->getEntityID();
$options['items'] = array($item);
NotificationEvent::debugEvent($this, $options);
}
}
?>