* SPDX-License-Identifier: AGPL-3.0-only ************************************/ /* crmv@202577 */ require_once('include/utils/MassQueueBase.php'); class MassCreateUtils extends MassQueueBase { public function __construct() { global $table_prefix; $this->table = $table_prefix.'_masscreate'; $this->queueTable = $table_prefix.'_masscreate_queue'; parent::__construct(); } public function enqueue($userid, $module, $records, $useWf = true) { global $adb; if (empty($records)) return true; // get the masscreate-id $massid = $adb->getUniqueID($this->table); // save in the main table $sql = "INSERT INTO {$this->table} (massid, userid, module, inserttime, workflows, status) VALUES (?,?,?,?,?,?)"; $params = array($massid, $userid, $module, date('Y-m-d H:i:s'), intval($useWf), self::MASS_STATUS_IDLE); $res = $adb->pquery($sql, $params); // get the list of ids $inserts = array(); foreach ($records as $record) { if (!empty($record)) { $queueid = $adb->getUniqueID($this->queueTable); $inserts[] = array($queueid, $massid, Zend_Json::encode($record)); } } // and quickly insert into the db $adb->bulkInsert($this->queueTable, array('queueid', 'massid', 'record'), $inserts); return true; } public function notifyUser($massinfo, $result) { global $current_user; $success = ($result['error'] == 0); $focus = ModNotifications::getInstance(); // crmv@164122 if ($success) { $desc = "\n".getTranslatedString('LBL_MASSCREATE_OK_DESC', 'APP_STRINGS'); $desc = str_replace( array('{num_records}', '{num_fail_records}', '{module}'), array($result['processed'], $result['error'], getTranslatedString($massinfo['module'], $massinfo['module'])), $desc ); $notifInfo = array( 'assigned_user_id' => $massinfo['userid'], 'mod_not_type' => 'MassCreate', 'related_to' => $massinfo['massid'], 'subject' => getTranslatedString('LBL_MASSCREATE_OK_SUBJECT', 'APP_STRINGS'), 'description' => $desc, 'from_email' => $current_user->email1 ?: $current_user->email2, 'from_email_name' => getUserFullName($current_user->id), ); } else { $desc = "\n".getTranslatedString('LBL_MASSCREATE_ERROR_DESC', 'APP_STRINGS'); $desc = str_replace( array('{num_records}', '{num_fail_records}', '{module}'), array($result['processed'], $result['error'], getTranslatedString($massinfo['module'], $massinfo['module'])), $desc ); $notifInfo = array( 'assigned_user_id' => $massinfo['userid'], 'mod_not_type' => 'MassCreateError', 'related_to' => $massinfo['massid'], 'subject' => getTranslatedString('LBL_MASSCREATE_ERROR_SUBJECT', 'APP_STRINGS'), 'description' => $desc, 'from_email' => $current_user->email1 ?: $current_user->email2, 'from_email_name' => getUserFullName($current_user->id), ); } $focus->saveFastNotification($notifInfo); return true; } public function processJob($massid, $massinfo, $editjob, &$error = '') { return $this->processCreateJob($massid, $massinfo, $editjob, $error); } public function processCreateJob($massid, $massinfo, $editjob, &$error = '') { global $adb; $queueid = $editjob['queueid']; $module = $massinfo['module']; $record = Zend_Json::decode($editjob['record']); $useWf = ($massinfo['workflows'] == '1'); $adb->pquery("UPDATE {$this->queueTable} SET status = ? WHERE massid = ? AND queueid = ?", array(self::MASSQUEUE_STATUS_PROCESSING, $massid, $queueid)); $error = ''; $r = true; try { $r = $this->saveRecord($module, $record, $useWf, $error); } catch (Exception $e) { $r = false; $error = 'EXCEPTION: '.$e->getMessage(); } if ($r) { $adb->pquery("UPDATE {$this->queueTable} SET status = ? WHERE massid = ? AND queueid = ?", array(self::MASSQUEUE_STATUS_COMPLETE, $massid, $queueid)); } else { $adb->pquery("UPDATE {$this->queueTable} SET status = ?, info = ? WHERE massid = ? AND queueid = ?", array(self::MASSQUEUE_STATUS_ERROR, $error, $massid, $queueid)); // error log $this->error("Error while saving record with queue id $queueid ($module):"); $this->error($error); } return $r; } public function saveRecord($module, $values, $useWf = true, &$error = '') { global $adb, $table_prefix, $current_user; $focus = $this->getModuleInstance($module); $focus->mode = ''; foreach ($focus->column_fields as $fieldname => $val) { if (array_key_exists($fieldname, $values)) { $focus->column_fields[$fieldname] = $values[$fieldname]; } } if (empty($focus->column_fields['assigned_user_id'])) { $focus->column_fields['assigned_user_id'] = $current_user->id; } if (isInventoryModule($module)) { $_REQUEST['action'] = 'MassEditSave'; // Keep it, it's an harcoded value } if ($useWf) { TriggerQueueManager::activateBatchSave(); $focus->save($module); } else { $focus->save($module, false, false, false); } return true; } public function getNotificationHtml($massid, $html = '') { $info = $this->getNotificationInfo($massid); if ($info['status'] == self::MASS_STATUS_ERROR) { $desc = getTranslatedString('LBL_MASSCREATE_ERROR', 'APP_STRINGS'); $desc = str_replace(array('{num_records}', '{num_fail_records}'), array($info['num_records'], $info['num_fail_records']), $desc); $html = "MassCreate Error ".$desc; } else { $desc = getTranslatedString('LBL_MASSCREATE_OK', 'APP_STRINGS'); $desc = str_replace('{num_records}', $info['num_ok_records'], $desc); $html = "MassCreate ".$desc; } return $html; } }