\n");
+ $oP->WizardFormStart('request_form', 3);
+ //$oP->add("\n");
$oP->details($aDetails);
- $sTransactionId = utils::GetNewTransactionId();
- $oP->SetTransactionId($sTransactionId); // Must be set before calling the plug-in
- if (class_exists('AttachmentPlugIn'))
- {
- $oAttPlugin = new AttachmentPlugIn();
- // depending on the plug-in's configuration, the attachments are displayed either in the 'properties' or in the 'relations'
- // in the portal, both are handled the same way... it does not matter
- $oAttPlugin->OnDisplayProperties($oRequest, $oP, true /* edit */);
- $oAttPlugin->OnDisplayRelations($oRequest, $oP, true /* edit */);
- }
+ $oAttPlugin = new AttachmentPlugIn();
+ $oAttPlugin->OnDisplayRelations($oRequest, $oP, true /* edit */);
- $oP->add("
\n");
- DumpHiddenParams($oP, $aList, $aParameters);
- $oP->add(" ");
+ $oP->DumpHiddenParams($aParameters, $aList);
$oP->add(" ");
- $oP->add(" \n");
- $oP->p(" ");
- $oP->add("");
+ $oP->WizardFormButtons(BUTTON_BACK | BUTTON_FINISH | BUTTON_CANCEL);
+ $oP->WizardFormEnd();
$oP->add("\n");
$iFieldsCount = count($aFieldsMap);
$sJsonFieldsMap = json_encode($aFieldsMap);
+
$oP->add_ready_script(
<< new
- var oWizardHelper = new WizardHelper('UserRequest', '');
oWizardHelper.SetFieldsMap($sJsonFieldsMap);
oWizardHelper.SetFieldsCount($iFieldsCount);
@@ -301,29 +286,13 @@ function RequestCreationForm($oP, $oUserOrg)
$('#request_form').submit( function() {
return OnSubmit('request_form');
});
- $(window).unload(function() { OnUnload('$sTransactionId') } );
-EOF
-);
- $sBtnLabel = Dict::S('Portal:RemoveAttachment');
- $oP->add_script(
-<< {$sBtnLabel} ');
- index++;
- }
- function RemoveAttachment(id_attachment)
- {
- $('#attachment_'+id_attachment).remove();
- }
EOF
);
}
else
{
// User not authorized to use this service ?
- DisplayMainMenu($oP);
+ //ShowOngoingTickets($oP);
}
}
@@ -335,43 +304,51 @@ EOF
*/
function DoCreateRequest($oP, $oUserOrg)
{
- $aParameters = ReadAllParams();
+ $aParameters = $oP->ReadAllParams(ALL_PARAMS);
$sTransactionId = utils::ReadPostedParam('transaction_id', '');
if (!utils::IsTransactionValid($sTransactionId))
{
$oP->add("".Dict::S('UI:Error:ObjectAlreadyCreated')." \n");
- DisplayMainMenu($oP);
+ //ShowOngoingTickets($oP);
return;
}
// Validate the parameters
- // 1) Service
- $oSearch = DBObjectSearch::FromOQL('SELECT Service AS s JOIN SLA AS sla ON sla.service_id=s.id JOIN lnkContractToSLA AS ln ON ln.sla_id=sla.id JOIN CustomerContract AS cc ON ln.contract_id=cc.id WHERE cc.org_id = :org_id AND s.id = :svc_id');
- $oSet = new CMDBObjectSet($oSearch, array(), array('org_id' => $oUserOrg->GetKey(), 'svc_id' => $aParameters['service_id']));
+ // 1) ServiceCategory
+ $oSearch = DBObjectSearch::FromOQL(VALIDATE_SERVICECATEGORY_QUERY);
+ $oSet = new CMDBObjectSet($oSearch, array(), array('id' => $aParameters['service_id'], 'org_id' => $oUserOrg->GetKey()));
if ($oSet->Count() != 1)
{
// Invalid service for the current user !
- throw new Exception("Invalid Service: id={$aParameters['servicesubcategory_id']} for the current user (org_id=".$oUserOrg->GetKey().").");
+ throw new Exception("Invalid Service Category: id={$aParameters['service_id']} - count: ".$oSet->Count());
}
- $oService = $oSet->Fetch();
+ $oServiceCategory = $oSet->Fetch();
+
// 2) Service Subcategory
- $oSearch = DBObjectSearch::FromOQL('SELECT ServiceSubcategory AS sc WHERE sc.id = :subcategory_id AND sc.service_id = :svc_id');
- $oSet = new CMDBObjectSet($oSearch, array(), array('svc_id' => $aParameters['service_id'], 'subcategory_id' =>$aParameters['servicesubcategory_id'] ));
+ $oSearch = DBObjectSearch::FromOQL(VALIDATE_SERVICESUBCATEGORY_QUERY);
+ $oSet = new CMDBObjectSet($oSearch, array(), array('service_id' => $aParameters['service_id'], 'id' =>$aParameters['servicesubcategory_id'],'org_id' => $oUserOrg->GetKey() ));
if ($oSet->Count() != 1)
{
// Invalid subcategory
- throw new Exception("Invalid ServiceSubcategory: id={$aParameters['servicesubcategory_id']} for service ".$oService->GetName()."({$aParameters['service_id']})");
+ throw new Exception("Invalid ServiceSubcategory: id={$aParameters['servicesubcategory_id']} for service category ".$oServiceCategory->GetName()."({$aParameters['service_id']}) - count: ".$oSet->Count());
}
-
+ $oServiceSubCategory = $oSet->Fetch();
+
$oRequest = new UserRequest();
$oRequest->Set('org_id', $oUserOrg->GetKey());
$oRequest->Set('caller_id', UserRights::GetContactId());
- $aList = array('service_id', 'servicesubcategory_id', 'request_type', 'title', 'description', 'impact', 'urgency', 'workgroup_id');
- foreach($aList as $sAttCode)
+ $aList = array('service_id', 'servicesubcategory_id', 'title', 'description', 'impact');
+ $oRequest->UpdateObjectFromPostedForm();
+ if (isset($aParameters['moreinfo']))
{
- $oRequest->Set($sAttCode, $aParameters[$sAttCode]);
+ // There is a template, insert it into the description
+ $oRequest->Set('ticket_log', $aParameters['moreinfo']);
}
-
+
+ /////$oP->DoUpdateObjectFromPostedForm($oObj);
+ $oAttPlugin = new AttachmentPlugIn();
+ $oAttPlugin->OnFormSubmit($oRequest);
+
list($bRes, $aIssues) = $oRequest->CheckToWrite();
if ($bRes)
{
@@ -382,39 +359,9 @@ function DoCreateRequest($oP, $oUserOrg)
$iChangeId = $oMyChange->DBInsert();
$oRequest->DBInsertTracked($oMyChange);
$oP->add("".Dict::Format('UI:Title:Object_Of_Class_Created', $oRequest->GetName(), MetaModel::GetName(get_class($oRequest)))." \n");
-
- if (class_exists('AttachmentPlugIn'))
- {
- // New way: use the plug-in
- $oAttPlugin = new AttachmentPlugIn();
- $oAttPlugin->OnFormSubmit($oRequest);
- }
- else
- {
- // Old way: create linked documents
- $index = 0;
- foreach($_FILES as $sName => $void)
- {
- $oAttachment = utils::ReadPostedDocument($sName);
- if (!$oAttachment->IsEmpty())
- {
- $index++;
- // Create a document and attach it to the created ticket
- $oDoc = new FileDoc();
- $oDoc->Set('name', Dict::Format('Portal:Attachment_No_To_Ticket_Name', $index, $oRequest->GetName(), $oAttachment->GetFileName()));
- $oDoc->Set('org_id', $oUserOrg->GetKey());
- $oDoc->Set('description', $oAttachment->GetFileName());
- $oDoc->Set('contents', $oAttachment);
- $oDoc->DBInsertTracked($oMyChange);
- // Link the document to the ticket
- $oLink = new lnkTicketToDoc();
- $oLink->Set('ticket_id', $oRequest->GetKey());
- $oLink->Set('document_id', $oDoc->GetKey());
- $oLink->DBInsertTracked($oMyChange);
- }
- }
- }
- DisplayMainMenu($oP);
+
+ //DisplayObject($oP, $oRequest, $oUserOrg);
+ ShowOngoingTickets($oP);
}
else
{
@@ -431,24 +378,19 @@ function DoCreateRequest($oP, $oUserOrg)
*/
function CreateRequest(WebPage $oP, Organization $oUserOrg)
{
- $iStep = utils::ReadParam('step', 0);
-
- switch($iStep)
+ switch($oP->GetWizardStep())
{
case 0:
default:
- $oP->AddMenuButton('cancel', 'UI:Button:Cancel', './index.php?operation=welcome');
- SelectService($oP, $oUserOrg);
+ SelectServiceCategory($oP, $oUserOrg);
break;
case 1:
- $oP->AddMenuButton('cancel', 'UI:Button:Cancel', './index.php?operation=welcome');
- SelectSubService($oP, $oUserOrg);
+ SelectServiceSubCategory($oP, $oUserOrg);
break;
case 2:
- $oP->AddMenuButton('cancel', 'UI:Button:Cancel', './index.php?operation=welcome');
- RequestCreationForm($oP, $oUserOrg);
+ RequestCreationForm($oP, $oUserOrg);
break;
case 3:
@@ -457,86 +399,6 @@ function CreateRequest(WebPage $oP, Organization $oUserOrg)
}
}
-/**
- * Displays the value of the given field, in HTML, without any hyperlink to other objects
- * @param DBObject $oObj The object to use
- * @param string $sAttCode Code of the attribute to display
- * @return string HTML text representing the value of this field
- */
-function GetFieldAsHtml($oObj, $sAttCode)
-{
- $sValue = '';
- $oAttDef = MetaModel::GetAttributeDef(get_class($oObj), $sAttCode);
- if ($oAttDef->IsExternalKey())
- {
- // Special processing for external keys: don't display any hyperlink
- $oTargetObj = MetaModel::GetObject($oAttDef->GetTargetClass(), $oObj->Get($sAttCode), false);
- if (is_object($oTargetObj))
- {
- $sValue = $oTargetObj->GetName();
- }
- else
- {
- $sValue = Dict::S('UI:UndefinedObject');
- }
- }
- else
- {
- $sValue = $oObj->GetAsHTML($sAttCode);
- }
- return $sValue;
-}
-
-/**
- * Displays a list of objects, without any hyperlink (except for the object's details)
- * @param WebPage $oP The web page for the output
- * @param DBObjectSet $oSet The set of objects to display
- * @param Array $aZList The ZList (list of field codes) to use for the tabular display
- * @return string The HTML text representing the list
- */
- function DisplaySet($oP, $oSet, $aZList)
- {
- if ($oSet->Count() > 0)
- {
- $aAttribs = array();
- $aValues = array();
- $oAttDef = MetaModel::GetAttributeDef('UserRequest', 'ref');
- $aAttribs['key'] = array('label' => $oAttDef->GetLabel(), 'description' => $oAttDef->GetDescription());
- foreach($aZList as $sAttCode)
- {
- $oAttDef = MetaModel::GetAttributeDef('UserRequest', $sAttCode);
- $aAttribs[$sAttCode] = array('label' => $oAttDef->GetLabel(), 'description' => $oAttDef->GetDescription());
- }
- while($oRequest = $oSet->Fetch())
- {
- $aRow = array();
-
- $aRow['key'] = ''.$oRequest->Get('ref').' ';
- $sHilightClass = $oRequest->GetHilightClass();
- if ($sHilightClass != '')
- {
- $aRow['@class'] = $sHilightClass;
- }
- foreach($aZList as $sAttCode)
- {
- $aRow[$sAttCode] = GetFieldAsHtml($oRequest, $sAttCode);
- }
- $aValues[$oRequest->GetKey()] = $aRow;
- }
- $oP->Table($aAttribs, $aValues);
- // Temprory until we merge re-use the paginated tables:
- $oP->add_ready_script(
-<<add(Dict::S('Portal:NoOpenRequest'));
- }
-}
-
/**
* Lists all the currently opened User Requests for the current user
* @param WebPage $oP The current web page
@@ -544,453 +406,303 @@ EOF
*/
function ListOpenRequests(WebPage $oP)
{
- $iContactId = UserRights::GetContactId();
- $oContact = MetaModel::GetObject('Contact', $iContactId, false); // false => Can fail
- if (is_object($oContact))
+ $oUserOrg = GetUserOrg();
+
+ $sOQL = 'SELECT UserRequest WHERE org_id = :org_id AND status NOT IN ("closed")';
+ $oSearch = DBObjectSearch::FromOQL($sOQL);
+ $iUser = UserRights::GetUserId();
+ if ($iUser > 0)
{
- $sOQL = 'SELECT UserRequest WHERE caller_id = :contact_id AND status NOT IN ("resolved", "closed")';
- $oSearch = DBObjectSearch::FromOQL($sOQL);
- $oSet = new CMDBObjectSet($oSearch, array(), array('contact_id' => $iContactId));
- $aZList = array('title', 'start_date', 'status', 'service_id', 'priority', 'workgroup_id', 'agent_id');
- DisplaySet($oP, $oSet, $aZList);
- }
+ $oSearch->AddCondition('caller_id', $iUser);
+ }
+ $oSet = new CMDBObjectSet($oSearch, array(), array('org_id' => $oUserOrg->GetKey()));
+ $aZList = array('finalclass', 'title', 'start_date', 'status', 'servicesubcategory_id', 'priority', 'caller_id');
+ $oP->DisplaySet($oSet, $aZList, Dict::S('Portal:NoOpenRequest'));
}
/**
- * Lists all the currently Resolved (not "Closed")User Requests for the current user
+ * Lists all the currently resolved (not yet closed) User Requests for the current user
* @param WebPage $oP The current web page
* @return void
*/
function ListResolvedRequests(WebPage $oP)
{
- $iContactId = UserRights::GetContactId();
- $oContact = MetaModel::GetObject('Contact', $iContactId, false); // false => Can fail
- if (is_object($oContact))
- {
- $sOQL = 'SELECT UserRequest WHERE caller_id = :contact_id AND status ="resolved"';
- $oSearch = DBObjectSearch::FromOQL($sOQL);
- $oSet = new CMDBObjectSet($oSearch, array(), array('contact_id' => $iContactId));
- $aZList = array('title', 'start_date', 'status', 'service_id', 'priority', 'workgroup_id', 'agent_id');
- DisplaySet($oP, $oSet, $aZList);
- }
-}
-/**
- * Displays the details of the specified UserRequest object
- * @param WebPage $oP The current web page for the output
- * @param UserRequest $oRequest The object to display
- * @return void
- */
-function DisplayRequestDetails($oP, UserRequest $oRequest, $bEditMode = true)
-{
- // Identical to the standard 'details' ZList of UserRequest, except that the field 'org_id' has been removed
- $aList = array(
- 'col:col1' => array(
- 'fieldset:Ticket:baseinfo' => array('ref','title','request_type','status','priority','service_id','servicesubcategory_id','product' ),
- 'fieldset:Ticket:moreinfo' => array('impact','urgency','description','resolution_code', 'solution', 'user_satisfaction', 'user_commment','freeze_reason'),
- ),
- 'col:col2' => array(
- 'fieldset:Ticket:date' => array('start_date','last_update','assignment_date','tto_escalation_deadline', 'ttr_escalation_deadline', 'close_date', 'closure_deadline',),
- 'fieldset:Ticket:contact' => array('caller_id','workgroup_id','agent_id',),
- 'fieldset:Ticket:relation' => array('related_problem_id', 'related_change_id'),
- )
+ $oUserOrg = GetUserOrg();
- );
-
- // Similar to CMDBAbstractObject::GetBareProperties except that: multiple tabs are not supported and GetFieldAsHtml is customized
- // in order to NOT display any hyperlink
- $aDetails = array();
- $oP->add('');
-
- $aDetailsStruct = CMDBAbstractObject::ProcessZlist($aList, array('UI:PropertiesTab' => array()), 'UI:PropertiesTab', 'col1', '');
- // Compute the list of properties to display, first the attributes in the 'details' list, then
- // all the remaining attributes that are not external fields
- $aDetails = array();
- $iInputId = 0;
- foreach($aDetailsStruct as $sTab => $aCols )
+ $sOQL = 'SELECT UserRequest WHERE org_id = :org_id AND status = "resolved"';
+ $oSearch = DBObjectSearch::FromOQL($sOQL);
+ $iUser = UserRights::GetUserId();
+ if ($iUser > 0)
{
- $aDetails[$sTab] = array();
- ksort($aCols);
- $oP->add('
');
- foreach($aCols as $sColIndex => $aFieldsets)
- {
- $oP->add('');
- //$aDetails[$sTab][$sColIndex] = array();
- $sLabel = '';
- $sPreviousLabel = '';
- $aDetails[$sTab][$sColIndex] = array();
- foreach($aFieldsets as $sFieldsetName => $aFields)
- {
- if (!empty($sFieldsetName) && ($sFieldsetName[0] != '_'))
- {
- $sLabel = $sFieldsetName;
- }
- else
- {
- $sLabel = '';
- }
- if ($sLabel != $sPreviousLabel)
- {
- if (!empty($sPreviousLabel))
- {
- $oP->add('');
- $oP->add(''.Dict::S($sPreviousLabel).' ');
- }
- $oP->Details($aDetails[$sTab][$sColIndex]);
- if (!empty($sPreviousLabel))
- {
- $oP->add(' ');
- }
- $aDetails[$sTab][$sColIndex] = array();
- $sPreviousLabel = $sLabel;
- }
- foreach($aFields as $sAttCode)
- {
- if (MetaModel::IsValidAttCode(get_class($oRequest), $sAttCode))
- {
- $iFlags = $oRequest->GetAttributeFlags($sAttCode);
- if ( ($iFlags & OPT_ATT_HIDDEN) == 0)
- {
- // The field is visible, add it to the current column
- $val = GetFieldAsHtml($oRequest, $sAttCode);
- $aDetails[$sTab][$sColIndex][] = array( 'label' => ''.MetaModel::GetLabel('UserRequest', $sAttCode).' ', 'value' => $val);
- $iInputId++;
- }
- }
- }
- }
- if (!empty($sPreviousLabel))
- {
- $oP->add('');
- $oP->add(''.Dict::S($sFieldsetName).' ');
- }
- $oP->Details($aDetails[$sTab][$sColIndex]);
- if (!empty($sPreviousLabel))
- {
- $oP->add(' ');
- }
- $oP->add(' ');
- }
- $oP->add('
');
+ $oSearch->AddCondition('caller_id', $iUser);
}
-
- if (!class_exists('AttachmentPlugIn'))
- {
- // Attachments, the old way
- $sOQL = 'SELECT FileDoc AS Doc JOIN lnkTicketToDoc AS L ON L.document_id = Doc.id WHERE L.ticket_id = :request_id';
- $oSearch = DBObjectSearch::FromOQL($sOQL);
- $oSet = new CMDBObjectSet($oSearch, array(), array('request_id' => $oRequest->GetKey()));
- $aDetails = array();
- if ($oSet->Count() > 0)
- {
- $sAttachements = '
';
- while($oDoc = $oSet->Fetch())
- {
- $sAttachements .= ''.$oDoc->GetAsHtml('contents').' ';
- }
- $sAttachements .= '
';
- $aDetails[] = array('label' => Dict::S('Portal:Attachments'), 'value' => $sAttachements);
- }
- $oP->Details($aDetails);
- }
-
- // Case log... editable so that users can post comments
- if ($bEditMode)
- {
- $oP->add("
');
- $oP->add_ready_script(
-<<
add(''.MetaModel::GetLabel('UserRequest', 'ticket_log').' ');
- $oP->add(GetFieldAsHtml($oRequest, 'ticket_log'));
- $oP->add(' ');
- if (class_exists('AttachmentPlugIn'))
- {
- $oAttPlugin = new AttachmentPlugIn();
- // depending on the plug-in's configuration, the attachments are displayed either in the 'properties' or in the 'relations'
- // in the portal, both are handled the same way... it does not matter
- $oAttPlugin->OnDisplayProperties($oRequest, $oP, false /* edit */);
- $oAttPlugin->OnDisplayRelations($oRequest, $oP, false /* edit */);
- }
- }
- $oP->add(' ');
+ $oSet = new CMDBObjectSet($oSearch, array(), array('org_id' => $oUserOrg->GetKey()));
+ $aZList = array('finalclass', 'title', 'start_date', 'status', 'servicesubcategory_id', 'priority', 'caller_id');
+ $oP->DisplaySet($oSet, $aZList, Dict::S('Portal:NoOpenRequest'));
}
/**
- * Displays a form for the user to provide feedback about a 'resolved' UserRequest and then close the request
+ * Lists all the currently closed tickets
* @param WebPage $oP The current web page
- * @param UserRequest $oRequest The object to display
* @return void
*/
-function DisplayResolvedRequestForm($oP, UserRequest $oRequest)
+function ListClosedTickets(WebPage $oP)
{
- $oP->add("\n");
- $oP->add("");
- $oP->add("
\n");
- $oP->add("".Dict::Format('Portal:TitleRequestDetailsFor_Request', $oRequest->GetName())." \n");
- DisplayRequestDetails($oP, $oRequest, false /* bEditMode */);
-
- $oP->add_ready_script(
-<<AddCondition('org_id', $oUserOrg->GetKey());
+ $oSearch->AddCondition('status', 'closed');
+ $iUser = UserRights::GetUserId();
+ if ($iUser > 0)
+ {
+ $oSearch->AddCondition('caller_id', $iUser + 12345);
+ }
+ $oSet1 = new CMDBObjectSet($oSearch);
+ $oP->add("\n");
+ $oP->add("
".Dict::S('Portal:ClosedRequests')." \n");
+ $oP->DisplaySet($oSet1, $aZList, Dict::S('Portal:NoClosedRequest'));
+ $oP->add("\n");
}
+
/**
- * Actually close the request and saves the user's feedback
+ * Display an object - to be customized
* @param WebPage $oP The current web page
- * @param UserRequest $oRequest The object to close
+ * @param Object $oObj Any kind of object
+ * @param Object $oUserOrg The organization of the logged in user
* @return void
*/
-function DoCloseRequest($oP, UserRequest $oRequest)
+function DisplayObject($oP, $oObj, $oUserOrg)
{
- $sTransactionId = utils::ReadPostedParam('transaction_id', '');
- if (!utils::IsTransactionValid($sTransactionId))
+ switch(get_class($oObj))
{
- $oP->add("".Dict::S('UI:Error:ObjectAlreadyCreated')." \n");
- DisplayMainMenu($oP);
- return;
- }
-
- $sClass = get_class($oRequest);
- $aDetails = array();
- $aTargetStates = MetaModel::EnumStates($sClass);
- $aTargetState = $aTargetStates['closed'];
- $aExpectedAttributes = $aTargetState['attribute_list'];
- $iFieldIndex = 0;
-
- foreach($aExpectedAttributes as $sAttCode => $iExpectCode)
- {
- // Prompt for an attribute if
- // - the attribute must be changed or must be displayed to the user for confirmation
- // - or the field is mandatory and currently empty
- if ( ($iExpectCode & (OPT_ATT_MUSTCHANGE | OPT_ATT_MUSTPROMPT)) ||
- (($iExpectCode & OPT_ATT_MANDATORY) && ($oRequest->Get($sAttCode) == '')) )
- {
- $value = utils::ReadPostedParam('attr_'.$sAttCode, null, 'raw_data');
- if (!is_null($value))
- {
- $oRequest->Set($sAttCode, $value);
- }
- }
- }
- if ($oRequest->ApplyStimulus('ev_close'))
- {
- $oMyChange = MetaModel::NewObject("CMDBChange");
- $oMyChange->Set("date", time());
- $sUserString = CMDBChange::GetCurrentUserName();
- $oMyChange->Set("userinfo", $sUserString);
- $iChangeId = $oMyChange->DBInsert();
- $oRequest->DBUpdateTracked($oMyChange);
- $oP->p("".Dict::Format('UI:Class_Object_Updated', MetaModel::GetName(get_class($oRequest)), $oRequest->GetName())." \n");
- DisplayMainMenu($oP);
- }
- else
- {
- $oP->AddMenuButton('back', 'Portal:Back', './index.php?operation=welcome');
- $oP->add('Error: cannot close the request - '.$oRequest->GetName());
+ case 'UserRequest':
+ ShowDetailsRequest($oP, $oObj);
+ break;
+
+ default:
+ throw new Exception("The class ".get_class($oObj)." is not handled through the portal");
}
}
-/**
- * Find the UserRequest object of the specified ID. Make sure that it the caller is the current user
- * @param integer $id The ID of the request to find
- * @return UserRequert The found object, or null in case of failure (object does not exist, user has no rights to see it...)
- */
-function FindRequest($id)
-{
- $oRequest = null;
- $iContactId = UserRights::GetContactId();
- $oContact = MetaModel::GetObject('Contact', $iContactId, false); // false => Can fail
- if (is_object($oContact))
- {
- $sOQL = "SELECT UserRequest WHERE caller_id = :contact_id AND id = :request_id";
- $oSearch = DBObjectSearch::FromOQL($sOQL);
- $oSet = new CMDBObjectSet($oSearch, array(), array('contact_id' => $iContactId, 'request_id' => $id));
- if ($oSet->Count() > 0)
- {
- $oRequest = $oSet->Fetch();
- }
- }
- else
- {
- $oP->AddMenuButton('back', 'Portal:Back', './index.php?operation=welcome');
- $oP->add("".Dict::S('Portal:ErrorNoContactForThisUser')."
");
- }
- return $oRequest;
-}
/**
* Displays the details of a request
* @param WebPage $oP The current web page
+ * @param Object $oObj The target object
* @return void
*/
-function RequestDetails(WebPage $oP, $id)
+function ShowDetailsRequest(WebPage $oP, $oObj)
{
- $oRequest = FindRequest($id);
- if (!is_object($oRequest))
- {
- DisplayMainMenu($oP);
- return;
- }
- $iDefaultStep = 0;
- if ($oRequest->GetState() == 'resolved')
- {
- // The current ticket is in 'resolved' state, prompt to close it
- $iDefaultStep = 1;
- }
+ $sClass = get_class($oObj);
- $iStep = utils::ReadParam('step', $iDefaultStep);
-
- switch($iStep)
+ $bIsEscalateButton = false;
+ $bIsCloseButton = false;
+ $bEditAttachments = false;
+ switch($oObj->GetState())
{
- case 0:
- $oP->AddMenuButton('back', 'Portal:Back', './index.php?operation=welcome');
- $oP->add("".$oRequest->GetIcon()." ".Dict::Format('Portal:TitleRequestDetailsFor_Request', $oRequest->GetName())." \n");
- DisplayRequestDetails($oP, $oRequest);
- break;
-
- case 1:
- $oP->AddMenuButton('cancel', 'UI:Button:Cancel', './index.php?operation=welcome');
- DisplayResolvedRequestForm($oP, $oRequest);
- break;
-
- case 2:
- DoCloseRequest($oP, $oRequest);
+ case 'new':
+ case 'assigned':
+ case 'frozen':
+ $aEditAtt = array(
+ 'ticket_log' => '????'
+ );
+ $bEditAttachments = true;
+ // disabled - $bIsEscalateButton = true;
break;
- case 3:
- AddComment($oP, $oRequest);
+ case 'escalated_tto':
+ case 'escalated_ttr':
+ $aEditAtt = array(
+ 'ticket_log' => '????'
+ );
+ $bEditAttachments = true;
break;
-
+
+ case 'resolved':
+ $aEditAtt = array(
+ // non, read-only dans cet etat - 'ticket_log' => '????',
+ 'user_satisfaction' => '????',
+ 'user_commment' => '????',
+ );
+ $bIsCloseButton = true;
+ break;
+
+ case 'closed':
+ case 'closure_requested':
default:
- // Should never happen
- DisplayMainMenu($oP);
+ $aEditAtt = array();
+ break;
}
-}
-/**
- * Adds a comment to the specified UserRequest and displays the main menu
- * @param WebPage $oP The current web page for the output
- * @param $id ID of the object to update
- * @return void
- */
-function AddComment($oP, $id)
-{
- $oRequest = FindRequest($id);
- if (!is_object($oRequest))
+// REFACTORISER LA MISE EN FORME
+ $oP->add("".$oObj->GetIcon()." ".Dict::Format('Portal:TitleRequestDetailsFor_Request', $oObj->GetName())." \n");
+
+ switch($sClass)
{
- DisplayMainMenu($oP);
- return;
+ case 'UserIssue':
+ //$aAttList = array('ref', 'status', 'title', 'description', 'start_date', 'caller_id', 'servicesubcategory_id', 'impact', 'priority', 'agent_id', 'close_date', 'last_update', 'assignment_date', 'resolution_code', 'solution', 'origin', 'time_spent', 'respected_gtr', 'gtr_overdue', 'user_satisfaction', 'user_commment', 'freeze_reason', 'ticket_log');
+ $aAttList = array('col:0'=> array('ref','caller_id','impact','perimeter','servicesubcategory_id','title'),'col:1'=> array('status','priority','start_date','resolution_date','last_update','agent_id'));
+ break;
+
+ case 'UserRequest':
+ //$aAttList = array('ref', 'status', 'title', 'description', 'requesttype', 'start_date', 'caller_id', 'servicesubcategory_id', 'priority', 'agent_id', 'close_date', 'last_update', 'assignment_date', 'user_satisfaction', 'user_commment', 'freeze_reason', 'ticket_log');
+ $aAttList = array('col:0'=> array('ref','caller_id','servicesubcategory_id','title'),'col:1'=> array('status','priority','start_date','resolution_date','last_update','agent_id'));
+ break;
+
+ default:
+ //$aAttList = array('ref');
+ array('col:0'=> array('ref','service_id','servicesubcategory_id','title'),'col:1'=> array('status','start_date'));
+ break;
}
- $sTransactionId = utils::ReadPostedParam('transaction_id', '');
- if (!utils::IsTransactionValid($sTransactionId))
+
+ // Remove the edited attribute from the shown attributes
+ //
+ foreach($aEditAtt as $sAttCode => $foo)
{
- $oP->add("".Dict::S('UI:Error:ObjectAlreadyUpdated')." \n");
- DisplayMainMenu($oP);
- return;
- }
- $sComment = trim(utils::ReadPostedParam('attr_ticket_log', '', 'raw_data'));
- if (!empty($sComment))
- {
- $oRequest->Set('ticket_log', $sComment);
- }
- if (class_exists('AttachmentPlugIn'))
- {
- $oAttPlugin = new AttachmentPlugIn();
- $oAttPlugin->OnFormSubmit($oRequest, '');
- }
- if ($oRequest->IsModified())
- {
- $oMyChange = MetaModel::NewObject("CMDBChange");
- $oMyChange->Set("date", time());
- $sUserString = CMDBChange::GetCurrentUserName();
- $oMyChange->Set("userinfo", $sUserString);
- $iChangeId = $oMyChange->DBInsert();
- $oRequest->DBUpdateTracked($oMyChange);
- $oP->p("".Dict::Format('UI:Class_Object_Updated', MetaModel::GetName(get_class($oRequest)), $oRequest->GetName())." \n");
-
- // If there is any trigger for the Portal Update, then activate them
- $aClasses = MetaModel::EnumParentClasses(get_class($oRequest), ENUM_PARENT_CLASSES_ALL);
- $aClasses = CMDBSource::Quote($aClasses);
- $sOQL = "SELECT TriggerOnPortalUpdate WHERE target_class IN (".implode(',', $aClasses).")";
- $oSet = new DBObjectSet(DBObjectSearch::FromOQL($sOQL));
- while($oTrigger = $oSet->Fetch())
+ foreach($aAttList as $col => $aColumn)
{
- $oTrigger->DoActivate($oRequest->ToArgs('this'));
+ if (in_array($sAttCode, $aColumn))
+ {
+ if(($index = array_search($sAttCode, $aColumn)) !== false)
+ {
+ unset($aAttList[$col][$index]);
+ }
+ }
}
}
+
+ $oP->add("