mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-13 15:34:12 +01:00
762 lines
27 KiB
PHP
762 lines
27 KiB
PHP
<?php
|
||
require_once('../application/application.inc.php');
|
||
require_once('../application/startup.inc.php');
|
||
|
||
require_once('../application/itopwizardwebpage.class.inc.php');
|
||
|
||
|
||
abstract class DialogWizard
|
||
{
|
||
protected $m_sCurrentStep;
|
||
protected $m_aSteps;
|
||
|
||
public function __construct($sStep)
|
||
{
|
||
$this->m_sCurrentStep = $sStep;
|
||
}
|
||
|
||
protected function GetFields($sStep = '')
|
||
{
|
||
if ($sStep == '')
|
||
{
|
||
$sStep = $this->m_sCurrentStep;
|
||
}
|
||
return $this->m_aSteps[$sStep];
|
||
}
|
||
|
||
protected function AddContextToForm(WebPage $oPage)
|
||
{
|
||
// Store as hidden fields in the page all the variables from the previous steps
|
||
foreach($this->m_aSteps as $sStep => $aFields)
|
||
{
|
||
if ($sStep == $this->m_sCurrentStep) continue;
|
||
foreach($aFields as $sAttName => $sFieldName)
|
||
{
|
||
$oPage->add("<input type=\"hidden\" name=\"$sFieldName\" value=\"".htmlentities(Utils::ReadParam($sFieldName, ''))."\" />\n");
|
||
}
|
||
}
|
||
}
|
||
|
||
function GetObjectPicker(WebPage $oPage, $sTitle, $sFieldName, $sClass)
|
||
{
|
||
$sScript =
|
||
<<<EOF
|
||
function UpdateObjectList(sClass)
|
||
{
|
||
var sRelatedObjectIds = new String($('#related_object_ids').val());
|
||
if (sRelatedObjectIds.length > 0)
|
||
{
|
||
aRelatedObjectIds = sRelatedObjectIds.split(' ');
|
||
}
|
||
else
|
||
{
|
||
aRelatedObjectIds = new Array();
|
||
aRelatedObjectIds[0] = 0;
|
||
}
|
||
var sibusql = sClass+": pkey IN {" + aRelatedObjectIds.join(", ") + "}";
|
||
$.get("ajax.render.php?filter=" + sibusql + "&style=list&encoding=sibusql",
|
||
{ operation: "ajax" },
|
||
function(data){
|
||
$("#related_objects").empty();
|
||
$("#related_objects").append(data);
|
||
$("#related_objects").removeClass("loading");
|
||
});
|
||
}
|
||
|
||
function AddObject(sClass)
|
||
{
|
||
var sRelatedObjectIds = new String($('#related_object_ids').val());
|
||
var sCurrentObjectId = new String($('#ac_current_object_id').val());
|
||
if (sRelatedObjectIds.length > 0)
|
||
{
|
||
aRelatedObjectIds = sRelatedObjectIds.split(' ');
|
||
}
|
||
else
|
||
{
|
||
aRelatedObjectIds = new Array();
|
||
}
|
||
// To do: check if the ID is not already in the list...
|
||
aRelatedObjectIds[aRelatedObjectIds.length] = sCurrentObjectId;
|
||
// Update the form & reload the list
|
||
$('#related_object_ids').val(aRelatedObjectIds.join(' '));
|
||
UpdateObjectList(sClass);
|
||
}
|
||
|
||
function ManageObjects(sTitle, sClass, sInputId)
|
||
{
|
||
$('#Manage_DlgTitle').text(sTitle);
|
||
sObjList = new String($('#'+sInputId).val());
|
||
if (sObjList == '')
|
||
{
|
||
sObjList = new String('0');
|
||
}
|
||
var aObjList = sObjList.split(' ');
|
||
Manage_LoadSelect('selected_objects', sClass+': pkey IN {' + aObjList.join(', ') + '}');
|
||
Manage_LoadSelect('available_objects', sClass);
|
||
$('#ManageObjectsDlg').jqmShow();
|
||
}
|
||
|
||
function Manage_LoadSelect(sSelectedId, sFilter)
|
||
{
|
||
$('#'+sSelectedId).addClass('loading');
|
||
$.get('ajax.render.php?filter=' + sFilter,
|
||
{ operation: 'combo_options' },
|
||
function(data){
|
||
$('#'+sSelectedId).empty();
|
||
$('#'+sSelectedId).append(data);
|
||
$('#'+sSelectedId).removeClass('loading');
|
||
}
|
||
);
|
||
}
|
||
|
||
function Manage_SwapSelectedObjects(oSourceSelect, oDestinationSelect)
|
||
{
|
||
for (i=oSourceSelect.length-1;i>=0;i--) // Count down because we are removing the indexes from the combo
|
||
{
|
||
if (oSourceSelect.options[i].selected)
|
||
{
|
||
var newOption = document.createElement('option');
|
||
newOption.text = oSourceSelect.options[i].text;
|
||
newOption.value = oSourceSelect.options[i].value;
|
||
oDestinationSelect.add(newOption, null);
|
||
oSourceSelect.remove(i);
|
||
}
|
||
}
|
||
Manage_UpdateButtons();
|
||
}
|
||
|
||
function Manage_UpdateButtons()
|
||
{
|
||
var oSrc = document.getElementById('available_objects');
|
||
var oAddBtn = document.getElementById('btn_add_objects')
|
||
var oDst = document.getElementById('selected_objects');
|
||
var oRemoveBtn = document.getElementById('btn_remove_objects')
|
||
if (oSrc.selectedIndex == -1)
|
||
{
|
||
oAddBtn.disabled = true;
|
||
}
|
||
else
|
||
{
|
||
oAddBtn.disabled = false;
|
||
}
|
||
if (oDst.selectedIndex == -1)
|
||
{
|
||
oRemoveBtn.disabled = true;
|
||
}
|
||
else
|
||
{
|
||
oRemoveBtn.disabled = false;
|
||
}
|
||
}
|
||
|
||
function Manage_AddObjects()
|
||
{
|
||
var oSrc = document.getElementById('available_objects');
|
||
var oDst = document.getElementById('selected_objects');
|
||
Manage_SwapSelectedObjects(oSrc, oDst);
|
||
}
|
||
|
||
function Manage_RemoveObjects()
|
||
{
|
||
var oSrc = document.getElementById('selected_objects');
|
||
var oDst = document.getElementById('available_objects');
|
||
Manage_SwapSelectedObjects(oSrc, oDst);
|
||
}
|
||
|
||
function Manage_Ok(sClass)
|
||
{
|
||
var objectsToAdd = document.getElementById('selected_objects');
|
||
var aSelectedObjects = new Array();
|
||
for (i=0; i<objectsToAdd.length;i++)
|
||
{
|
||
aSelectedObjects[aSelectedObjects.length] = objectsToAdd.options[i].value;
|
||
}
|
||
$('#related_object_ids').val(aSelectedObjects.join(' '));
|
||
UpdateObjectList(sClass);
|
||
}
|
||
|
||
function FilterLeft($sClass)
|
||
{
|
||
alert('Not Yet Implemented');
|
||
}
|
||
|
||
function FilterRight($sClass)
|
||
{
|
||
alert('Not Yet Implemented');
|
||
}
|
||
EOF;
|
||
$sManageObjectsDlg = <<< EOF
|
||
<div class="page_header"><h1 id="Manage_DlgTitle">Selected Objects</h1></div>
|
||
<table width="100%">
|
||
<tr>
|
||
<td>
|
||
<p>Selected objects:</p>
|
||
<button type="button" class="action" onClick="FilterLeft('$sClass');"><span> Filter... </span></button>
|
||
<p><select id="selected_objects" size="10" multiple onChange="Manage_UpdateButtons()" style="width:300px;">
|
||
</select></p>
|
||
</td>
|
||
<td style="text-align:center; valign:middle;">
|
||
<p><button type="button" id="btn_add_objects" onClick="Manage_AddObjects();"> << Add </button></p>
|
||
<p><button type="button" id="btn_remove_objects" onClick="Manage_RemoveObjects();"> Remove >> </button></p>
|
||
</td>
|
||
<td>
|
||
<p>Available objects:</p>
|
||
<button type="button" class="action" onClick="FilterRight('$sClass');"><span> Filter... </span></button>
|
||
<p><select id="available_objects" size="10" multiple onChange="Manage_UpdateButtons()" style="width:300px;">
|
||
</select></p>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td colspan="3">
|
||
<button type="button" class="jqmClose" onClick="Manage_Ok('$sClass')"> Ok </button> <button type="button" class="jqmClose"> Cancel</button>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
EOF;
|
||
$sHTML = '<input type="text" name="" id="current_object_id" size="30"/>
|
||
<input type="hidden" id="related_object_ids" name="'.$sFieldName.'" value="">
|
||
<button type="button" class="action" onClick="return AddObject(\''.$sClass.'\');"><span> Add </span></button>
|
||
<button type="button" class="action" onClick="return ManageObjects(\''.$sTitle.'\', \''.$sClass.'\', \'related_object_ids\');"><span> ... </span></button>';
|
||
$sHTML .= '<input type="hidden" id="ac_current_object_id" name="" value="">';
|
||
$sHTML .= '<div class="jqmWindow" id="ManageObjectsDlg">'.$sManageObjectsDlg.'</div>';
|
||
$oPage->add_script($sScript);
|
||
$oPage->add_ready_script("\$('#current_object_id').autocomplete('./ajax.render.php', { minChars:3, onItemSelect:selectItem, onFindValue:findValue, formatItem:formatItem, autoFill:true, keyHolder:'#ac_current_object_id', extraParams:{operation:'link', sclass:'$sClass', attCode:'name'}});");
|
||
$oPage->add_ready_script("$('#ManageObjectsDlg').jqm({overlay:70, modal:true, toTop:true});"); // jqModal Window
|
||
$oPage->add_ready_script("UpdateObjectList('$sClass');");
|
||
return $sHTML;
|
||
}
|
||
|
||
function DisplayObjectPickerList(WebPage $oPage, $sClass)
|
||
{
|
||
$oFilter = new CMDBSearchFilter($sClass);
|
||
$oFilter->AddCondition('pkey', array(0), 'IN');
|
||
//$oPage->p($oFilter->__DescribeHTML());
|
||
$oBlock = new DisplayBlock($oFilter, 'list', true /* Asynchronous */);
|
||
$oBlock->Display($oPage, 'related_objects');
|
||
}
|
||
}
|
||
|
||
class IncidentCreationWizard extends DialogWizard
|
||
{
|
||
public function __construct($sStep)
|
||
{
|
||
parent::__construct($sStep);
|
||
$this->m_aSteps =
|
||
array(
|
||
'1' => array('title' => 'attr_title', 'customer_id' => 'attr_customer_id', 'initial_situation' => 'attr_initial_situation', 'severity' => 'attr_severity', 'impact' => 'attr_impact', 'workgroup_id' => 'attr_workgroup_id', 'action_log' => 'attr_action_log'),
|
||
'2' => array('impacted_infra_ids' => 'impacted_infra_ids'),
|
||
'3' => array('additional_impacted_object_ids' => 'additional_impacted_object_ids'),
|
||
'4' => array('related_incident_ids' => 'related_incident_ids'),
|
||
'5' => array('contact_ids' => 'contact_ids'),
|
||
);
|
||
}
|
||
|
||
protected function AddContextToForm($oPage)
|
||
{
|
||
parent::AddContextToForm($oPage);
|
||
$oPage->add("<input type=\"hidden\" name=\"operation\" value=\"new\" />\n");
|
||
$oPage->add("<input type=\"hidden\" name=\"step\" value=\"".$this->m_sNextStep."\" />\n");
|
||
}
|
||
|
||
public function DisplayNewTicketForm(WebPage $oPage)
|
||
{
|
||
assert($this->m_sCurrentStep == '1');
|
||
$this->m_sNextStep = '2';
|
||
$aFields = $this->GetFields();
|
||
|
||
$oPage->add('<form method="get">');
|
||
$aDetails = array();
|
||
$aAttributesDef = MetaModel::ListAttributeDefs('bizIncidentTicket');
|
||
foreach($aFields as $sAttCode => $sFieldName)
|
||
{
|
||
$oAttDef = $aAttributesDef[$sAttCode];
|
||
$sHTMLValue = cmdbAbstractObject::GetFormElementForField($oPage, 'bizIncidentTicket', $sAttCode, $oAttDef);
|
||
$aDetails[] = array('label' => $oAttDef->GetLabel().' <span class="hilite">*</span>', 'value' => $sHTMLValue);
|
||
}
|
||
$oPage->details($aDetails);
|
||
$this->AddContextToForm($oPage);
|
||
$oPage->add("<button type=\"button\" class=\"action\" onClick=\"goBack()\"><span>Cancel</span></button> \n");
|
||
$oPage->add("<button type=\"submit\" class=\"action\"><span>Next >></span></button>\n");
|
||
$oPage->add('</form>');
|
||
}
|
||
|
||
public function DisplayImpactedInfraForm(WebPage $oPage)
|
||
{
|
||
assert($this->m_sCurrentStep == '2');
|
||
$this->m_sNextStep = '3';
|
||
$oPage->add('<form method="get">');
|
||
$aDetails = array();
|
||
$sHTML = $this->GetObjectPicker($oPage, 'Impacted Infrastructure', 'impacted_infra_ids', 'logInfra');
|
||
$aDetails[] = array('label' => 'Impacted element:', 'value' => $sHTML);
|
||
$oPage->details($aDetails);
|
||
$this->DisplayObjectPickerList($oPage, 'logInfra');
|
||
$this->AddContextToForm($oPage);
|
||
$oPage->add("<button type=\"button\" class=\"action\" onClick=\"goBack()\"><span><< Back</span></button> \n");
|
||
$oPage->add("<button type=\"submit\" class=\"action\"><span>Next >></span></button>\n");
|
||
$oPage->add('</form>');
|
||
}
|
||
|
||
public function DisplayAdditionalImpactedObjectForm(WebPage $oPage)
|
||
{
|
||
assert($this->m_sCurrentStep == '3');
|
||
$this->m_sNextStep = '4';
|
||
$sImpactedInfraIds = Utils::ReadParam('impacted_infra_ids');
|
||
|
||
$sImpactedInfraIds = Utils::ReadParam('impacted_infra_ids', '');
|
||
if (!empty($sImpactedInfraIds))
|
||
{
|
||
$oPage->p('Impacted Infrastructure:');
|
||
$oFilter = new CMDBSearchFilter('logRealObject');
|
||
$oFilter->AddCondition('pkey', explode(' ', $sImpactedInfraIds), 'IN');
|
||
$oBlock = new DisplayBlock($oFilter, 'list', false /* Synchronous */);
|
||
$oBlock->Display($oPage, 'impacted_infra');
|
||
}
|
||
|
||
$aImpactedInfraIds = explode(' ', $sImpactedInfraIds);
|
||
$oInfraSet = CMDBObjectSet::FromScratch('logRealObject');
|
||
foreach($aImpactedInfraIds as $id)
|
||
{
|
||
$oObj = MetaModel::GetObject('logRealObject', $id);
|
||
$oInfraSet->AddObject($oObj);
|
||
}
|
||
$aImpactedObject = $oInfraSet->GetRelatedObjects('impacts');
|
||
$aAdditionalIds = array();
|
||
foreach($aImpactedObject as $sRootClass => $aObjects)
|
||
{
|
||
foreach($aObjects as $oObj)
|
||
{
|
||
$aAdditionalIds[] = $oObj->GetKey();
|
||
}
|
||
}
|
||
$sAdditionalIds = implode(' ', $aAdditionalIds);
|
||
$oPage->add_ready_script('$("#related_object_ids").val("'.$sAdditionalIds.'");');
|
||
|
||
$oPage->p('Additional Impact Computed:');
|
||
$this->DisplayObjectPickerList($oPage, 'logRealObject');
|
||
$oPage->add('<form method="get">');
|
||
$aDetails = array();
|
||
$sHTML = $this->GetObjectPicker($oPage, 'Additional Impacted Infrastructure', 'additional_impacted_object_ids', 'logRealObject');
|
||
$aDetails[] = array('label' => 'Impacted element:', 'value' => $sHTML);
|
||
$oPage->details($aDetails);
|
||
$this->AddContextToForm($oPage);
|
||
$oPage->add("<button type=\"button\" class=\"action\" onClick=\"goBack()\"><span><< Back</span></button> \n");
|
||
$oPage->add("<button type=\"submit\" class=\"action\"><span>Next >></span></button>\n");
|
||
$oPage->add('</form>');
|
||
}
|
||
|
||
public function DisplayRelatedTicketsForm(WebPage $oPage)
|
||
{
|
||
assert($this->m_sCurrentStep == '4');
|
||
$this->m_sNextStep = '5';
|
||
$oRelatedTicketsFilter = new DBObjectSearch('bizIncidentTicket');
|
||
$sImpactedInfraIds = Utils::ReadParam('impacted_infra_ids', '');
|
||
$sAdditionalImpactedObjectIds = Utils::ReadParam('additional_impacted_object_ids', '');
|
||
$sIds = trim($sImpactedInfraIds.' '.$sAdditionalImpactedObjectIds);
|
||
$aTicketIds = array();
|
||
if (!empty($sIds))
|
||
{
|
||
$aIds = explode(' ', $sIds);
|
||
$sSibusQL = "bizIncidentTicket: PKEY IS ticket_id IN (lnkInfraTicket: infra_id IN (logRealObject: pkey IN {".implode(',', $aIds)."}))";
|
||
$oTicketSearch = DBObjectSearch::FromSibusQL($sSibusQL);
|
||
$oRelatedTicketSet = new DBObjectSet($oTicketSearch);
|
||
while ($oTicket = $oRelatedTicketSet->Fetch())
|
||
{
|
||
$aTicketIds[] = $oTicket->GetKey();
|
||
}
|
||
}
|
||
|
||
$sTicketIds = implode(' ', $aTicketIds);
|
||
$oPage->add_ready_script('$("#related_object_ids").val("'.$sTicketIds.'");');
|
||
$oPage->p('Potentially related incidents:');
|
||
$this->DisplayObjectPickerList($oPage, 'bizIncidentTicket');
|
||
|
||
$oPage->add('<form method="get">');
|
||
$sHTML = $this->GetObjectPicker($oPage, 'Related Incidents', 'related_incident_ids', 'bizIncidentTicket');
|
||
$aDetails[] = array('label' => 'Related Incident:', 'value' => $sHTML);
|
||
$oPage->details($aDetails);
|
||
$this->AddContextToForm($oPage);
|
||
$oPage->add("<button type=\"button\" class=\"action\" onClick=\"goBack()\"><span><< Back</span></button> \n");
|
||
$oPage->add("<button type=\"submit\" class=\"action\"><span>Next >></span></button>\n");
|
||
$oPage->add('</form>');
|
||
}
|
||
|
||
public function DisplayContactsToNotifyForm(WebPage $oPage)
|
||
{
|
||
assert($this->m_sCurrentStep == '5');
|
||
$this->m_sNextStep = '6';
|
||
$oPage->add('<form method="get">');
|
||
$sHTML = $this->GetObjectPicker($oPage, 'Contacts to notify', 'contact_ids', 'bizContact');
|
||
$aDetails[] = array('label' => 'Additional contact:', 'value' => $sHTML);
|
||
$oPage->details($aDetails);
|
||
$this->DisplayObjectPickerList($oPage, 'bizContact');
|
||
$this->AddContextToForm($oPage);
|
||
$oPage->add("<button type=\"button\" class=\"action\" onClick=\"goBack()\"><span><< Back</span></button> \n");
|
||
$oPage->add("<button type=\"submit\" class=\"action\"><span>Next >></span></button>\n");
|
||
$oPage->add('</form>');
|
||
}
|
||
|
||
function DisplayFinalForm(WebPage $oPage)
|
||
{
|
||
$oAppContext = new ApplicationContext();
|
||
assert($this->m_sCurrentStep == '6');
|
||
$this->m_sNextStep = '7';
|
||
|
||
$aDetails = array();
|
||
$aAttributesDef = MetaModel::ListAttributeDefs('bizIncidentTicket');
|
||
$aFields = $this->GetFields('1');
|
||
foreach($aFields as $sAttCode => $sFieldName)
|
||
{
|
||
$oAttDef = $aAttributesDef[$sAttCode];
|
||
$sValue = Utils::ReadParam($sFieldName, '');
|
||
if ($oAttDef->IsExternalKey() && isset($sValue) && ($sValue != 0))
|
||
{
|
||
$oTargetObj = MetaModel::GetObject($oAttDef->GetTargetClass(), $sValue);
|
||
if (!is_object($oTargetObj))
|
||
{
|
||
trigger_error("Houston: could not find ".$oAttDef->GetTargetClass()."::$sValue");
|
||
}
|
||
$sPage = cmdbAbstractObject::ComputeUIPage($oAttDef->GetTargetClass());
|
||
$sHint = htmlentities($oAttDef->GetTargetClass()."::".$sValue);
|
||
$sHTMLValue = "<a href=\"$sPage?operation=details&class=".$oAttDef->GetTargetClass()."&id=$sValue&".$oAppContext->GetForLink()."\" title=\"$sHint\">".$oTargetObj->GetName()."</a>";
|
||
}
|
||
else
|
||
{
|
||
$sHTMLValue = $oAttDef->GetAsHTML($sValue);
|
||
}
|
||
$aDetails[] = array('label' => $oAttDef->GetLabel(), 'value' => $sHTMLValue);
|
||
}
|
||
$oPage->details($aDetails);
|
||
|
||
$oPage->AddTabContainer('LinkedObjects');
|
||
$oPage->SetCurrentTabContainer('LinkedObjects');
|
||
|
||
$sImpactedInfraIds = Utils::ReadParam('impacted_infra_ids', '');
|
||
$sImpactedInfraIds .= ' '.Utils::ReadParam('additional_impacted_object_ids', '');
|
||
$sImpactedInfraIds = trim($sImpactedInfraIds);
|
||
$oPage->SetCurrentTab("Infrastructure impacted");
|
||
if (!empty($sImpactedInfraIds))
|
||
{
|
||
$oFilter = new CMDBSearchFilter('logRealObject');
|
||
$oFilter->AddCondition('pkey', explode(' ', $sImpactedInfraIds), 'IN');
|
||
$oBlock = new DisplayBlock($oFilter, 'list', false /* Synchronous */);
|
||
$oBlock->Display($oPage, 'related_objects');
|
||
}
|
||
else
|
||
{
|
||
$oPage->p("There is no infrastructure impacted by this incident");
|
||
}
|
||
|
||
$sRelatedIncidentIds = Utils::ReadParam('related_incident_ids', '');
|
||
$oPage->SetCurrentTab("Related tickets");
|
||
if (!empty($sRelatedIncidentIds))
|
||
{
|
||
$oFilter = new CMDBSearchFilter('bizIncidentTicket');
|
||
$oFilter->AddCondition('pkey', explode(' ', $sRelatedIncidentIds), 'IN');
|
||
$oBlock = new DisplayBlock($oFilter, 'list', false /* Synchronous */);
|
||
$oBlock->Display($oPage, 'related_incidents');
|
||
}
|
||
else
|
||
{
|
||
$oPage->p("There is no other incident related to this one");
|
||
}
|
||
|
||
$oPage->SetCurrentTab("Contacts to notify");
|
||
$sContactIds = Utils::ReadParam('contact_ids', '');
|
||
if (!empty($sContactIds))
|
||
{
|
||
$oFilter = new CMDBSearchFilter('bizContact');
|
||
$oFilter->AddCondition('pkey', explode(' ', $sContactIds), 'IN');
|
||
$oBlock = new DisplayBlock($oFilter, 'list', false /* Synchronous */);
|
||
$oBlock->Display($oPage, 'contacts');
|
||
}
|
||
else
|
||
{
|
||
$oPage->p("There is no contact to notify");
|
||
}
|
||
$oPage->SetCurrentTab();
|
||
|
||
$oPage->add('<form method="post" action="incident.php">');
|
||
$this->AddContextToForm($oPage);
|
||
$oPage->add("<button type=\"button\" class=\"action\" onClick=\"goBack()\"><span><< Back</span></button> \n");
|
||
$oPage->add("<button type=\"submit\" class=\"action\" value=\"create\"><span> Create Ticket</span></button> \n");
|
||
$oPage->add("<button type=\"submit\" class=\"action\" value=\"create_notify\"><span> Create Ticket and Send Notifications</span></button>\n");
|
||
$oPage->add('</form>');
|
||
}
|
||
|
||
public function CreateIncident(WebPage $oPage)
|
||
{
|
||
$oAppContext = new ApplicationContext();
|
||
assert($this->m_sCurrentStep == '7');
|
||
$this->m_sNextStep = '1';
|
||
|
||
$oIncident = MetaModel::NewObject('bizIncidentTicket');
|
||
$oPage->p("Creation of Incident Ticket.");
|
||
|
||
$aFields = $this->GetFields('1');
|
||
foreach($aFields as $sAttCode => $sFieldName)
|
||
{
|
||
$sValue = Utils::ReadPostedParam($sFieldName, '');
|
||
$oIncident->Set($sAttCode, $sValue);
|
||
}
|
||
$oIncident->Set('ticket_status', 'New');
|
||
$oIncident->Set('start_date', time());
|
||
$oIncident->Set('name', 'ID not set');
|
||
|
||
if ($oIncident->CheckToInsert())
|
||
{
|
||
// Create the ticket itself
|
||
$oMyChange = MetaModel::NewObject("CMDBChange");
|
||
$oMyChange->Set("date", time());
|
||
$oMyChange->Set("userinfo", "Administrator");
|
||
$iChangeId = $oMyChange->DBInsert();
|
||
$oIncident->DBInsertTracked($oMyChange);
|
||
|
||
$sName = sprintf('I-%06d', $oIncident->GetKey());
|
||
$oIncident->Set('name', $sName);
|
||
$oIncident->DBUpdateTracked($oMyChange);
|
||
$oPage->p("Incident $sName created.\n");
|
||
|
||
// Now link the objects to the Incident:
|
||
// 1) the impacted infra
|
||
$sImpactedInfraIds = Utils::ReadParam('impacted_infra_ids', '');
|
||
$sImpactedInfraIds .= ' '.Utils::ReadParam('additional_impacted_object_ids', '');
|
||
$sImpactedInfraIds = trim($sImpactedInfraIds);
|
||
if (!empty($sImpactedInfraIds))
|
||
{
|
||
$aImpactedInfra = explode(' ', $sImpactedInfraIds);
|
||
foreach($aImpactedInfra as $iInfraId)
|
||
{
|
||
$oLink = MetaModel::NewObject('lnkInfraTicket');
|
||
$oLink->Set('infra_id', $iInfraId);
|
||
$oLink->Set('ticket_id', $oIncident->GetKey());
|
||
$oLink->Set('impact', 'automatic');
|
||
$oLink->DBInsertTracked($oMyChange);
|
||
}
|
||
}
|
||
// 2) the related incidents
|
||
$sRelatedIncidentsIds = Utils::ReadPostedParam('related_incident_ids');
|
||
if (!empty($sRelatedIncidentsIds))
|
||
{
|
||
$aRelatedIncidents = explode(' ', $sRelatedIncidentsIds);
|
||
foreach($aRelatedIncidents as $iIncidentId)
|
||
{
|
||
$oLink = MetaModel::NewObject('lnkRelatedTicket');
|
||
$oLink->Set('rel_ticket_id', $iIncidentId);
|
||
$oLink->Set('ticket_id', $oIncident->GetKey());
|
||
$oLink->Set('impact', 'automatic');
|
||
$oLink->DBInsertTracked($oMyChange);
|
||
}
|
||
}
|
||
// 3) the contacts to notify
|
||
$sContactsIds = Utils::ReadPostedParam('contact_ids');
|
||
if (!empty($sContactsIds))
|
||
{
|
||
$aContactsToNotify = explode(' ', $sContactsIds);
|
||
foreach($aContactsToNotify as $iContactId)
|
||
{
|
||
$oLink = MetaModel::NewObject('lnkContactRealObject');
|
||
$oLink->Set('contact_id', $iContactId);
|
||
$oLink->Set('object_id', $oIncident->GetKey());
|
||
$oLink->Set('role', 'notification');
|
||
$oLink->DBInsertTracked($oMyChange);
|
||
}
|
||
}
|
||
$oIncident->DisplayDetails($oPage, 'bizIncidentTicket', $oIncident->GetKey());
|
||
}
|
||
else
|
||
{
|
||
$oPage->p("<strong>Error: object can not be created!</strong>\n");
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
$oContext = new UserContext();
|
||
$oAppContext = new ApplicationContext();
|
||
$currentOrganization = utils::ReadParam('org_id', '');
|
||
$operation = utils::ReadParam('operation', '');
|
||
$oP = new iTopWebPage("ITop - Incident Management", $currentOrganization);
|
||
|
||
switch($operation)
|
||
{
|
||
case 'details':
|
||
$sClass = utils::ReadParam('class', '');
|
||
$id = utils::ReadParam('id', '');
|
||
if ( empty($sClass) || empty($id)) // TO DO: check that the class name is valid !
|
||
{
|
||
$oP->add("<p>'class' and 'id' parameters must be specifed for this operation.</p>\n");
|
||
}
|
||
else
|
||
{
|
||
$oObj = $oContext->GetObject($sClass, $id);
|
||
if ($oObj != null)
|
||
{
|
||
$oP->set_title("iTop - ".$oObj->GetName()." - $sClass details");
|
||
$oObj->DisplayDetails($oP);
|
||
}
|
||
else
|
||
{
|
||
$oP->set_title("iTop - Error");
|
||
$oP->add("<p>Sorry this object does not exist (or you are not allowed to view it).</p>\n");
|
||
}
|
||
}
|
||
break;
|
||
|
||
case 'new':
|
||
$step = utils::ReadParam('step', '1');
|
||
$aSteps = array(
|
||
'Ticket Information',
|
||
'Impacted Infrastructure',
|
||
'Additional Impact',
|
||
'Related Tickets',
|
||
'Contacts to Notify',
|
||
'Confirmation',
|
||
'Ticket Creation'
|
||
);
|
||
$oWizard = new IncidentCreationWizard($step);
|
||
$oP = new iTopWizardWebPage("ITop - Incident Management", $currentOrganization, $step, $aSteps);
|
||
|
||
switch($step)
|
||
{
|
||
case 1:
|
||
default:
|
||
//$oP->add('<div class="page_header"><h1><span class="hilite">New incident</span></h1></div>');
|
||
$oWizard->DisplayNewTicketForm($oP);
|
||
break;
|
||
|
||
case 2:
|
||
//$oP->add('<div class="page_header"><h1>New ticket: <span class="hilite">Select the Impacted Infrastructure</span></h1></div>');
|
||
$oWizard->DisplayImpactedInfraForm($oP);
|
||
break;
|
||
|
||
case 3:
|
||
//$oP->add('<div class="page_header"><h1>New ticket: <span class="hilite">Additional Impacted Objects</span></h1></div>');
|
||
$oWizard->DisplayAdditionalImpactedObjectForm($oP);
|
||
break;
|
||
|
||
case 4:
|
||
//$oP->add('<div class="page_header"><h1>New ticket: <span class="hilite">Select Related Incidents</span></h1></div>');
|
||
$oWizard->DisplayRelatedTicketsForm($oP);
|
||
break;
|
||
|
||
case 5:
|
||
//$oP->add('<div class="page_header"><h1>New ticket: <span class="hilite">Select the Contacts to Notify</span></h1></div>');
|
||
$oWizard->DisplayContactsToNotifyForm($oP);
|
||
break;
|
||
|
||
case 6:
|
||
//$oP->add('<div class="page_header"><h1>New ticket: <span class="hilite">Confirm and Create the Ticket</span></h1></div>');
|
||
$oWizard->DisplayFinalForm($oP);
|
||
break;
|
||
|
||
case 7:
|
||
$oWizard->CreateIncident($oP);
|
||
break;
|
||
}
|
||
break;
|
||
|
||
case 'modify':
|
||
$oP->add_linked_script("../js/json.js");
|
||
$oP->add_linked_script("../js/forms-json-utils.js");
|
||
$oP->add_linked_script("../js/wizardhelper.js");
|
||
$oP->add_linked_script("../js/wizard.utils.js");
|
||
$oP->add_linked_script("../js/linkswidget.js");
|
||
$oP->add_linked_script("../js/jquery.blockUI.js");
|
||
$sClass = utils::ReadParam('class', '');
|
||
$id = utils::ReadParam('id', '');
|
||
if ( empty($sClass) || empty($id)) // TO DO: check that the class name is valid !
|
||
{
|
||
$oP->add("<p>'class' and 'id' parameters must be specifed for this operation.</p>\n");
|
||
}
|
||
else
|
||
{
|
||
$oObj = $oContext->GetObject($sClass, $id);
|
||
if ($oObj != null)
|
||
{
|
||
$oP->set_title("iTop - ".$oObj->GetName()." - $sClass modification");
|
||
$oP->add("<h1>".$oObj->GetName()." - $sClass modification</h1>\n");
|
||
$oObj->DisplayModifyForm($oP);
|
||
}
|
||
else
|
||
{
|
||
$oP->set_title("iTop - Error");
|
||
$oP->add("<p>Sorry this object does not exist (or you are not allowed to view it).</p>\n");
|
||
}
|
||
}
|
||
break;
|
||
|
||
case 'apply_modify':
|
||
$sClass = utils::ReadPostedParam('class', '');
|
||
$id = utils::ReadPostedParam('id', '');
|
||
$sTransactionId = utils::ReadPostedParam('transaction_id', '');
|
||
if ( empty($sClass) || empty($id)) // TO DO: check that the class name is valid !
|
||
{
|
||
$oP->add("<p>'class' and 'id' parameters must be specifed for this operation.</p>\n");
|
||
}
|
||
else if (!utils::IsTransactionValid($sTransactionId))
|
||
{
|
||
$oP->p("<strong>Error: object has already be updated!</strong>\n");
|
||
}
|
||
else
|
||
{
|
||
$oObj = $oContext->GetObject($sClass, $id);
|
||
if ($oObj != null)
|
||
{
|
||
$oP->set_title("iTop - ".$oObj->GetName()." - $sClass modification");
|
||
$oP->add("<h1>".$oObj->GetName()." - $sClass modification</h1>\n");
|
||
$bObjectModified = false;
|
||
foreach(MetaModel::ListAttributeDefs(get_class($oObj)) as $sAttCode=>$oAttDef)
|
||
{
|
||
$iFlags = $oObj->GetAttributeFlags($sAttCode);
|
||
if ($iFlags & (OPT_ATT_HIDDEN | OPT_ATT_READONLY))
|
||
{
|
||
// Non-visible, or read-only attribute, do nothing
|
||
}
|
||
else if ($sAttCode == 'finalclass')
|
||
{
|
||
// This very specific field is read-only
|
||
}
|
||
else if (!$oAttDef->IsExternalField())
|
||
{
|
||
$aAttributes[$sAttCode] = trim(utils::ReadPostedParam("attr_$sAttCode", null));
|
||
$previousValue = $oObj->Get($sAttCode);
|
||
if (!is_null($aAttributes[$sAttCode]) && ($previousValue != $aAttributes[$sAttCode]))
|
||
{
|
||
$oObj->Set($sAttCode, $aAttributes[$sAttCode]);
|
||
$bObjectModified = true;
|
||
}
|
||
}
|
||
}
|
||
if (!$bObjectModified)
|
||
{
|
||
$oP->p("No modification detected. ".get_class($oObj)." has <strong>not</strong> been updated.\n");
|
||
}
|
||
else if ($oObj->CheckToUpdate())
|
||
{
|
||
$oMyChange = MetaModel::NewObject("CMDBChange");
|
||
$oMyChange->Set("date", time());
|
||
$oMyChange->Set("userinfo", "Made by somebody"); // TO DO put the correct user info here
|
||
$iChangeId = $oMyChange->DBInsert();
|
||
$oObj->DBUpdateTracked($oMyChange);
|
||
|
||
$oP->p(get_class($oObj)." updated.\n");
|
||
}
|
||
else
|
||
{
|
||
$oP->p("<strong>Error: object can not be updated!</strong>\n");
|
||
//$oObj->Reload(); // restore default values!
|
||
}
|
||
}
|
||
else
|
||
{
|
||
$oP->set_title("iTop - Error");
|
||
$oP->add("<p>Sorry this object does not exist (or you are not allowed to edit it).</p>\n");
|
||
}
|
||
}
|
||
$oP->add("<p>Alors <20>a roule ?</p>");
|
||
$oObj->DisplayDetails($oP);
|
||
break;
|
||
}
|
||
$oP->output();
|
||
?>
|