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("\n"); } } } function GetObjectPicker(WebPage $oPage, $sTitle, $sFieldName, $sClass) { $sScript = << 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

Selected Objects

Selected objects:

Available objects:

     
EOF; $sHTML = '    '; $sHTML .= ''; $sHTML .= '
'.$sManageObjectsDlg.'
'; $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("\n"); $oPage->add("m_sNextStep."\" />\n"); } public function DisplayNewTicketForm(WebPage $oPage) { assert($this->m_sCurrentStep == '1'); $this->m_sNextStep = '2'; $aFields = $this->GetFields(); $oPage->add('
'); $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().' *', 'value' => $sHTMLValue); } $oPage->details($aDetails); $this->AddContextToForm($oPage); $oPage->add("    \n"); $oPage->add("\n"); $oPage->add('
'); } public function DisplayImpactedInfraForm(WebPage $oPage) { assert($this->m_sCurrentStep == '2'); $this->m_sNextStep = '3'; $oPage->add('
'); $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("    \n"); $oPage->add("\n"); $oPage->add('
'); } 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('
'); $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("    \n"); $oPage->add("\n"); $oPage->add('
'); } 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('
'); $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("    \n"); $oPage->add("\n"); $oPage->add('
'); } public function DisplayContactsToNotifyForm(WebPage $oPage) { assert($this->m_sCurrentStep == '5'); $this->m_sNextStep = '6'; $oPage->add('
'); $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("    \n"); $oPage->add("\n"); $oPage->add('
'); } 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 = "GetTargetClass()."&id=$sValue&".$oAppContext->GetForLink()."\" title=\"$sHint\">".$oTargetObj->GetName().""; } 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('
'); $this->AddContextToForm($oPage); $oPage->add("    \n"); $oPage->add("    \n"); $oPage->add("\n"); $oPage->add('
'); } 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("Error: object can not be created!\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("

'class' and 'id' parameters must be specifed for this operation.

\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("

Sorry this object does not exist (or you are not allowed to view it).

\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(''); $oWizard->DisplayNewTicketForm($oP); break; case 2: //$oP->add(''); $oWizard->DisplayImpactedInfraForm($oP); break; case 3: //$oP->add(''); $oWizard->DisplayAdditionalImpactedObjectForm($oP); break; case 4: //$oP->add(''); $oWizard->DisplayRelatedTicketsForm($oP); break; case 5: //$oP->add(''); $oWizard->DisplayContactsToNotifyForm($oP); break; case 6: //$oP->add(''); $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("

'class' and 'id' parameters must be specifed for this operation.

\n"); } else { $oObj = $oContext->GetObject($sClass, $id); if ($oObj != null) { $oP->set_title("iTop - ".$oObj->GetName()." - $sClass modification"); $oP->add("

".$oObj->GetName()." - $sClass modification

\n"); $oObj->DisplayModifyForm($oP); } else { $oP->set_title("iTop - Error"); $oP->add("

Sorry this object does not exist (or you are not allowed to view it).

\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("

'class' and 'id' parameters must be specifed for this operation.

\n"); } else if (!utils::IsTransactionValid($sTransactionId)) { $oP->p("Error: object has already be updated!\n"); } else { $oObj = $oContext->GetObject($sClass, $id); if ($oObj != null) { $oP->set_title("iTop - ".$oObj->GetName()." - $sClass modification"); $oP->add("

".$oObj->GetName()." - $sClass modification

\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 not 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("Error: object can not be updated!\n"); //$oObj->Reload(); // restore default values! } } else { $oP->set_title("iTop - Error"); $oP->add("

Sorry this object does not exist (or you are not allowed to edit it).

\n"); } } $oP->add("

Alors ça roule ?

"); $oObj->DisplayDetails($oP); break; } $oP->output(); ?>