Jelajahi Sumber

Update KEDB and Problem Mgmt Modules
Review other modules

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@725 a333f486-631f-4898-b8df-5754b55c2be0

etaloc 14 tahun lalu
induk
melakukan
acd1cc4a11

+ 24 - 22
modules/itop-change-mgmt-1.0.0/model.itop-change-mgmt.php

@@ -71,12 +71,11 @@ abstract class Change extends Ticket
 		MetaModel::Init_AddAttribute(new AttributeExternalKey("manager_id", array("targetclass"=>"Person", "jointype"=>null, "allowed_values"=>new ValueSetObjects('SELECT Person AS p JOIN lnkTeamToContact AS l ON l.contact_id=p.id JOIN Team AS t ON l.team_id=t.id WHERE t.id = :this->manager_group_id'), "sql"=>"manager_id", "is_null_allowed"=>true, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array("manager_group_id"))));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("manager_email", array("allowed_values"=>null, "extkey_attcode"=>"manager_id", "target_attcode"=>"email", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeEnum("outage", array("allowed_values"=>new ValueSetEnum('yes,no'), "sql"=>"outage", "default_value"=>"no", "is_null_allowed"=>false, "depends_on"=>array())));
-		MetaModel::Init_AddAttribute(new AttributeText("change_request", array("allowed_values"=>null, "sql"=>"change_request", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeText("fallback", array("allowed_values"=>null, "sql"=>"fallback", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 
-		MetaModel::Init_SetZListItems('details', array('title', 'org_id', 'ticket_log', 'start_date', 'document_list', 'ci_list', 'contact_list', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback'));
-		MetaModel::Init_SetZListItems('advanced_search', array('finalclass', 'ref', 'title', 'org_id', 'start_date', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback'));
-		MetaModel::Init_SetZListItems('standard_search', array('finalclass', 'ref', 'title', 'org_id', 'start_date', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback'));
+		MetaModel::Init_SetZListItems('details', array('title', 'org_id', 'description','ticket_log', 'start_date','end_date', 'document_list', 'ci_list', 'contact_list','incident_list', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'fallback'));
+		MetaModel::Init_SetZListItems('advanced_search', array('finalclass', 'ref', 'title', 'org_id', 'start_date', 'end_date','status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage'));
+		MetaModel::Init_SetZListItems('standard_search', array('finalclass', 'ref', 'title', 'org_id', 'start_date', 'end_date','status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage'));
 		MetaModel::Init_SetZListItems('list', array('finalclass', 'title', 'start_date', 'status'));
 
 
@@ -118,7 +117,9 @@ abstract class Change extends Ticket
 					'workgroup_id' => OPT_ATT_MANDATORY,
 					'supervisor_group_id' => OPT_ATT_MANDATORY,
 					'manager_group_id' => OPT_ATT_MANDATORY,
-					'change_request' => OPT_ATT_READONLY,
+					'description' => OPT_ATT_READONLY,
+					'requestor_id' => OPT_ATT_READONLY,
+					'title' => OPT_ATT_MANDATORY,
 				),
 			)
 		);
@@ -139,6 +140,8 @@ abstract class Change extends Ticket
 					'agent_id' => OPT_ATT_MUSTCHANGE,
 					'supervisor_id' => OPT_ATT_MUSTCHANGE,
 					'manager_id' => OPT_ATT_MUSTCHANGE,
+					'description' => OPT_ATT_READONLY,
+					'requestor_id' => OPT_ATT_READONLY,
 				),
 			)
 		);
@@ -208,7 +211,6 @@ abstract class Change extends Ticket
 				"attribute_list" => array(
 					'end_date' => OPT_ATT_READONLY,
 					'agent_id' => OPT_ATT_READONLY,
-					'change_request' => OPT_ATT_READONLY,
 					'fallback' => OPT_ATT_READONLY,
 				),
 			)
@@ -316,10 +318,10 @@ class RoutineChange extends Change
 		MetaModel::Init_InheritAttributes();
 		MetaModel::Init_InheritLifecycle();
 
-		MetaModel::Init_SetZListItems('details', array('title', 'org_id', 'ticket_log', 'start_date', 'document_list', 'ci_list', 'contact_list', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback'));
-		MetaModel::Init_SetZListItems('advanced_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback'));
-		MetaModel::Init_SetZListItems('standard_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback'));
-		MetaModel::Init_SetZListItems('list', array('title', 'org_id', 'start_date', 'status', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback'));
+		MetaModel::Init_SetZListItems('details', array('title', 'org_id', 'description','ticket_log', 'start_date', 'end_date','document_list', 'ci_list', 'contact_list','incident_list', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'fallback'));
+		MetaModel::Init_SetZListItems('advanced_search', array('ref', 'title', 'org_id', 'start_date', 'end_date','status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage'));
+		MetaModel::Init_SetZListItems('standard_search', array('ref', 'title', 'org_id', 'start_date','end_date', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage'));
+		MetaModel::Init_SetZListItems('list', array('title', 'org_id', 'start_date', 'status', 'requestor_id'));
 
 		MetaModel::Init_DefineTransition("new", "ev_assign", array("target_state"=>"assigned", "actions"=>array(), "user_restriction"=>null));
 		MetaModel::Init_DefineTransition("assigned", "ev_plan", array("target_state"=>"plannedscheduled", "actions"=>array(), "user_restriction"=>null));
@@ -353,10 +355,10 @@ abstract class ApprovedChange extends Change
 		MetaModel::Init_AddAttribute(new AttributeDateTime("approval_date", array("allowed_values"=>null, "sql"=>"approval_date", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeString("approval_comment", array("allowed_values"=>null, "sql"=>"approval_comment", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 
-		MetaModel::Init_SetZListItems('details', array('title', 'org_id', 'ticket_log', 'start_date', 'document_list', 'ci_list', 'contact_list', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback', 'approval_date', 'approval_comment'));
-		MetaModel::Init_SetZListItems('advanced_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback', 'approval_date', 'approval_comment'));
-		MetaModel::Init_SetZListItems('standard_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback', 'approval_date', 'approval_comment'));
-		MetaModel::Init_SetZListItems('list', array('title', 'org_id', 'start_date', 'status', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback', 'approval_date', 'approval_comment'));
+		MetaModel::Init_SetZListItems('details', array('title', 'org_id', 'description','ticket_log', 'start_date', 'end_date','document_list', 'ci_list', 'contact_list','incident_list', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'fallback', 'approval_date', 'approval_comment'));
+		MetaModel::Init_SetZListItems('advanced_search', array('ref', 'title', 'org_id', 'start_date','end_date', 'status', 'reason', 'requestor_id', 'workgroup_id', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage','approval_date'));
+		MetaModel::Init_SetZListItems('standard_search', array('ref', 'title', 'org_id', 'start_date','end_date', 'status', 'reason', 'requestor_id', 'workgroup_id', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'approval_date'));
+		MetaModel::Init_SetZListItems('list', array('title', 'org_id', 'start_date', 'status', 'requestor_id'));
 
 		MetaModel::Init_OverloadStateAttribute('new', 'approval_date', OPT_ATT_HIDDEN);
 		MetaModel::Init_OverloadStateAttribute('new', 'approval_comment', OPT_ATT_HIDDEN);
@@ -404,10 +406,10 @@ class NormalChange extends ApprovedChange
 		MetaModel::Init_AddAttribute(new AttributeDateTime("acceptance_date", array("allowed_values"=>null, "sql"=>"acceptance_date", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeString("acceptance_comment", array("allowed_values"=>null, "sql"=>"acceptance_comment", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 
-		MetaModel::Init_SetZListItems('details', array('title', 'org_id', 'ticket_log', 'start_date', 'document_list', 'ci_list', 'contact_list', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback', 'approval_date', 'approval_comment', 'acceptance_date', 'acceptance_comment'));
-		MetaModel::Init_SetZListItems('advanced_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback'));
-		MetaModel::Init_SetZListItems('standard_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback'));
-		MetaModel::Init_SetZListItems('list', array('title', 'org_id', 'start_date', 'status', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback'));
+		MetaModel::Init_SetZListItems('details', array('title', 'org_id', 'description','ticket_log', 'start_date','end_date', 'document_list', 'ci_list', 'contact_list','incident_list', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update','close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'fallback', 'approval_date', 'approval_comment', 'acceptance_date', 'acceptance_comment'));
+		MetaModel::Init_SetZListItems('advanced_search', array('ref', 'title', 'org_id', 'start_date', 'end_date','status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage'));
+		MetaModel::Init_SetZListItems('standard_search', array('ref', 'title', 'org_id', 'start_date','end_date', 'status', 'reason', 'requestor_id', 'workgroup_id', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage'));
+		MetaModel::Init_SetZListItems('list', array('title', 'org_id', 'start_date', 'status', 'requestor_id'));
 
 		MetaModel::Init_OverloadStateAttribute('new', 'acceptance_date', OPT_ATT_HIDDEN);
 		MetaModel::Init_OverloadStateAttribute('new', 'acceptance_comment', OPT_ATT_HIDDEN);
@@ -463,10 +465,10 @@ class EmergencyChange extends ApprovedChange
 		MetaModel::Init_InheritAttributes();
 		MetaModel::Init_InheritLifecycle();
 
-		MetaModel::Init_SetZListItems('details', array('title', 'org_id', 'ticket_log', 'start_date', 'document_list', 'ci_list', 'contact_list', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback', 'approval_date', 'approval_comment'));
-		MetaModel::Init_SetZListItems('advanced_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback', 'approval_date', 'approval_comment'));
-		MetaModel::Init_SetZListItems('standard_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback', 'approval_date', 'approval_comment'));
-		MetaModel::Init_SetZListItems('list', array('title', 'org_id', 'start_date', 'status', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'end_date', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'change_request', 'fallback', 'approval_date', 'approval_comment'));
+		MetaModel::Init_SetZListItems('details', array('title', 'org_id', 'description','ticket_log', 'start_date', 'end_date','document_list', 'ci_list', 'contact_list','incident_list', 'status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'fallback', 'approval_date', 'approval_comment'));
+		MetaModel::Init_SetZListItems('advanced_search', array('ref', 'title', 'org_id', 'start_date','end_date', 'status', 'reason', 'requestor_id', 'workgroup_id', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'approval_date'));
+		MetaModel::Init_SetZListItems('standard_search', array('ref', 'title', 'org_id', 'start_date', 'end_date','status', 'reason', 'requestor_id', 'workgroup_id', 'creation_date', 'last_update', 'close_date', 'impact', 'agent_id', 'agent_email', 'supervisor_group_id', 'supervisor_id', 'manager_group_id', 'manager_id', 'outage', 'approval_date'));
+		MetaModel::Init_SetZListItems('list', array('title', 'org_id', 'start_date', 'status', 'requestor_id'));
 
 		MetaModel::Init_DefineTransition("new", "ev_assign", array("target_state"=>"assigned", "actions"=>array(), "user_restriction"=>null));
 		MetaModel::Init_DefineTransition("assigned", "ev_plan", array("target_state"=>"plannedscheduled", "actions"=>array(), "user_restriction"=>null));

+ 120 - 92
modules/itop-config-mgmt-1.0.0/en.dict.itop-config-mgmt.php

@@ -299,28 +299,33 @@ Dict::Add('EN US', 'English', 'English', array(
 // Class: Licence
 //
 
-Dict::Add('EN US', 'English', 'English', array(
-	'Class:Licence' => 'Licence',
-	'Class:Licence+' => '',
-	'Class:Licence/Attribute:provider' => 'Provider',
-	'Class:Licence/Attribute:provider+' => '',
-	'Class:Licence/Attribute:product' => 'Product',
-	'Class:Licence/Attribute:product+' => '',
-	'Class:Licence/Attribute:name' => 'Name',
-	'Class:Licence/Attribute:name+' => '',
-	'Class:Licence/Attribute:start' => 'Start date',
-	'Class:Licence/Attribute:start+' => '',
-	'Class:Licence/Attribute:end' => 'End date',
-	'Class:Licence/Attribute:end+' => '',
-	'Class:Licence/Attribute:licence_key' => 'Key',
-	'Class:Licence/Attribute:licence_key+' => '',
-	'Class:Licence/Attribute:scope' => 'Scope',
-	'Class:Licence/Attribute:scope+' => '',
-	'Class:Licence/Attribute:usage_limit' => 'Usage limit',
-	'Class:Licence/Attribute:usage_limit+' => '',
-	'Class:Licence/Attribute:usage_list' => 'Usage',
-	'Class:Licence/Attribute:usage_list+' => 'Application instances using this licence',
-));
+Dict::Add('EN US', 'English', 'English', array(
+	'Class:Licence' => 'Licence',
+	'Class:Licence+' => '',
+	'Class:Licence/Attribute:provider' => 'Provider',
+	'Class:Licence/Attribute:provider+' => '',
+	'Class:Licence/Attribute:org_id' => 'Owner',
+	'Class:Licence/Attribute:org_id+' => '',
+	'Class:Licence/Attribute:org_name' => 'Name',
+	'Class:Licence/Attribute:org_name+' => 'Common name',
+	'Class:Licence/Attribute:product' => 'Product',
+	'Class:Licence/Attribute:product+' => '',
+	'Class:Licence/Attribute:name' => 'Name',
+	'Class:Licence/Attribute:name+' => '',
+	'Class:Licence/Attribute:start' => 'Start date',
+	'Class:Licence/Attribute:start+' => '',
+	'Class:Licence/Attribute:end' => 'End date',
+	'Class:Licence/Attribute:end+' => '',
+	'Class:Licence/Attribute:licence_key' => 'Key',
+	'Class:Licence/Attribute:licence_key+' => '',
+	'Class:Licence/Attribute:scope' => 'Scope',
+	'Class:Licence/Attribute:scope+' => '',
+	'Class:Licence/Attribute:usage_limit' => 'Usage limit',
+	'Class:Licence/Attribute:usage_limit+' => '',
+	'Class:Licence/Attribute:usage_list' => 'Usage',
+	'Class:Licence/Attribute:usage_list+' => 'Application instances using this licence',
+));
+
 
 //
 // Class: Subnet
@@ -490,8 +495,6 @@ Dict::Add('EN US', 'English', 'English', array(
 	'Class:SoftwareInstance/Attribute:licence_id+' => '',
 	'Class:SoftwareInstance/Attribute:licence_name' => 'Licence',
 	'Class:SoftwareInstance/Attribute:licence_name+' => '',
-	'Class:SoftwareInstance/Attribute:software_id' => 'Software',
-	'Class:SoftwareInstance/Attribute:software_id+' => '',
 	'Class:SoftwareInstance/Attribute:software_name' => 'Software',
 	'Class:SoftwareInstance/Attribute:software_name+' => '',
 	'Class:SoftwareInstance/Attribute:version' => 'Version',
@@ -504,21 +507,31 @@ Dict::Add('EN US', 'English', 'English', array(
 // Class: ApplicationInstance
 //
 
-Dict::Add('EN US', 'English', 'English', array(
-	'Class:ApplicationInstance' => 'Application Instance',
-	'Class:ApplicationInstance+' => '',
-));
+Dict::Add('EN US', 'English', 'English', array(
+	'Class:ApplicationInstance' => 'Application Instance',
+	'Class:ApplicationInstance+' => '',
+	'Class:ApplicationInstance/Attribute:software_id' => 'Software',
+	'Class:ApplicationInstance/Attribute:software_id+' => '',
+	'Class:ApplicationInstance/Attribute:software_name' => 'Name',
+	'Class:ApplicationInstance/Attribute:software_name+' => '',
+));
+
 
 //
 // Class: DBServerInstance
 //
 
-Dict::Add('EN US', 'English', 'English', array(
-	'Class:DBServerInstance' => 'DB Server Instance',
-	'Class:DBServerInstance+' => '',
-	'Class:DBServerInstance/Attribute:dbinstance_list' => 'Databases',
-	'Class:DBServerInstance/Attribute:dbinstance_list+' => 'Database sources',
-));
+Dict::Add('EN US', 'English', 'English', array(
+	'Class:DBServerInstance' => 'DB Server Instance',
+	'Class:DBServerInstance+' => '',
+	'Class:DBServerInstance/Attribute:software_id' => 'Software',
+	'Class:DBServerInstance/Attribute:software_id+' => '',
+	'Class:DBServerInstance/Attribute:software_name' => 'Name',
+	'Class:DBServerInstance/Attribute:software_name+' => '',
+	'Class:DBServerInstance/Attribute:dbinstance_list' => 'Databases',
+	'Class:DBServerInstance/Attribute:dbinstance_list+' => 'Database sources',
+));
+
 
 //
 // Class: DatabaseInstance
@@ -584,64 +597,70 @@ Dict::Add('EN US', 'English', 'English', array(
 // Class: NetworkInterface
 //
 
-Dict::Add('EN US', 'English', 'English', array(
-	'Class:NetworkInterface' => 'Network Interface',
-	'Class:NetworkInterface+' => '',
-	'Class:NetworkInterface/Attribute:device_id' => 'Device',
-	'Class:NetworkInterface/Attribute:device_id+' => '',
-	'Class:NetworkInterface/Attribute:device_name' => 'Device',
-	'Class:NetworkInterface/Attribute:device_name+' => '',
-	'Class:NetworkInterface/Attribute:logical_type' => 'Logical Type',
-	'Class:NetworkInterface/Attribute:logical_type+' => '',
-	'Class:NetworkInterface/Attribute:logical_type/Value:backup' => 'Backup',
-	'Class:NetworkInterface/Attribute:logical_type/Value:backup+' => '',
-	'Class:NetworkInterface/Attribute:logical_type/Value:logical' => 'Logical',
-	'Class:NetworkInterface/Attribute:logical_type/Value:logical+' => '',
-	'Class:NetworkInterface/Attribute:logical_type/Value:port' => 'Port',
-	'Class:NetworkInterface/Attribute:logical_type/Value:port+' => '',
-	'Class:NetworkInterface/Attribute:logical_type/Value:primary' => 'Primary',
-	'Class:NetworkInterface/Attribute:logical_type/Value:primary+' => '',
-	'Class:NetworkInterface/Attribute:logical_type/Value:secondary' => 'Secondary',
-	'Class:NetworkInterface/Attribute:logical_type/Value:secondary+' => '',
-	'Class:NetworkInterface/Attribute:physical_type' => 'Physical Type',
-	'Class:NetworkInterface/Attribute:physical_type+' => '',
-	'Class:NetworkInterface/Attribute:physical_type/Value:atm' => 'ATM',
-	'Class:NetworkInterface/Attribute:physical_type/Value:atm+' => '',
-	'Class:NetworkInterface/Attribute:physical_type/Value:ethernet' => 'Ethernet',
-	'Class:NetworkInterface/Attribute:physical_type/Value:ethernet+' => '',
-	'Class:NetworkInterface/Attribute:physical_type/Value:framerelay' => 'Frame Relay',
-	'Class:NetworkInterface/Attribute:physical_type/Value:framerelay+' => '',
-	'Class:NetworkInterface/Attribute:physical_type/Value:vlan' => 'VLAN',
-	'Class:NetworkInterface/Attribute:physical_type/Value:vlan+' => '',
-	'Class:NetworkInterface/Attribute:ip_address' => 'IP Address',
-	'Class:NetworkInterface/Attribute:ip_address+' => '',
-	'Class:NetworkInterface/Attribute:ip_mask' => 'IP Mask',
-	'Class:NetworkInterface/Attribute:ip_mask+' => '',
-	'Class:NetworkInterface/Attribute:mac_address' => 'MAC Address',
-	'Class:NetworkInterface/Attribute:mac_address+' => '',
-	'Class:NetworkInterface/Attribute:speed' => 'Speed',
-	'Class:NetworkInterface/Attribute:speed+' => '',
-	'Class:NetworkInterface/Attribute:duplex' => 'Duplex',
-	'Class:NetworkInterface/Attribute:duplex+' => '',
-	'Class:NetworkInterface/Attribute:duplex/Value:full' => 'Full',
-	'Class:NetworkInterface/Attribute:duplex/Value:full+' => '',
-	'Class:NetworkInterface/Attribute:duplex/Value:half' => 'Half',
-	'Class:NetworkInterface/Attribute:duplex/Value:half+' => '',
-	'Class:NetworkInterface/Attribute:duplex/Value:unknown' => 'Unknown',
-	'Class:NetworkInterface/Attribute:duplex/Value:unknown+' => '',
-	'Class:NetworkInterface/Attribute:connected_if' => 'Connected to',
-	'Class:NetworkInterface/Attribute:connected_if+' => 'Connected interface',
-	'Class:NetworkInterface/Attribute:connected_name' => 'Connected to',
-	'Class:NetworkInterface/Attribute:connected_name+' => '',
-	'Class:NetworkInterface/Attribute:connected_if_device_id' => 'Connected device',
-	'Class:NetworkInterface/Attribute:connected_if_device_id+' => '',
-	'Class:NetworkInterface/Attribute:link_type' => 'Link type',
-	'Class:NetworkInterface/Attribute:link_type+' => '',
-	'Class:NetworkInterface/Attribute:link_type/Value:uplink' => 'Up link',
-	'Class:NetworkInterface/Attribute:link_type/Value:uplink+' => '',
-	'Class:NetworkInterface/Attribute:link_type/Value:downlink' => 'Down link',
-	'Class:NetworkInterface/Attribute:link_type/Value:downlink+' => '',
-));
+Dict::Add('EN US', 'English', 'English', array(
+	'Class:NetworkInterface' => 'Network Interface',
+	'Class:NetworkInterface+' => '',
+	'Class:NetworkInterface/Attribute:device_id' => 'Device',
+	'Class:NetworkInterface/Attribute:device_id+' => '',
+	'Class:NetworkInterface/Attribute:device_name' => 'Device',
+	'Class:NetworkInterface/Attribute:device_name+' => '',
+	'Class:NetworkInterface/Attribute:logical_type' => 'Logical Type',
+	'Class:NetworkInterface/Attribute:logical_type+' => '',
+	'Class:NetworkInterface/Attribute:logical_type/Value:backup' => 'Backup',
+	'Class:NetworkInterface/Attribute:logical_type/Value:backup+' => '',
+	'Class:NetworkInterface/Attribute:logical_type/Value:logical' => 'Logical',
+	'Class:NetworkInterface/Attribute:logical_type/Value:logical+' => '',
+	'Class:NetworkInterface/Attribute:logical_type/Value:port' => 'Port',
+	'Class:NetworkInterface/Attribute:logical_type/Value:port+' => '',
+	'Class:NetworkInterface/Attribute:logical_type/Value:primary' => 'Primary',
+	'Class:NetworkInterface/Attribute:logical_type/Value:primary+' => '',
+	'Class:NetworkInterface/Attribute:logical_type/Value:secondary' => 'Secondary',
+	'Class:NetworkInterface/Attribute:logical_type/Value:secondary+' => '',
+	'Class:NetworkInterface/Attribute:physical_type' => 'Physical Type',
+	'Class:NetworkInterface/Attribute:physical_type+' => '',
+	'Class:NetworkInterface/Attribute:physical_type/Value:atm' => 'ATM',
+	'Class:NetworkInterface/Attribute:physical_type/Value:atm+' => '',
+	'Class:NetworkInterface/Attribute:physical_type/Value:ethernet' => 'Ethernet',
+	'Class:NetworkInterface/Attribute:physical_type/Value:ethernet+' => '',
+	'Class:NetworkInterface/Attribute:physical_type/Value:framerelay' => 'Frame Relay',
+	'Class:NetworkInterface/Attribute:physical_type/Value:framerelay+' => '',
+	'Class:NetworkInterface/Attribute:physical_type/Value:vlan' => 'VLAN',
+	'Class:NetworkInterface/Attribute:physical_type/Value:vlan+' => '',
+	'Class:NetworkInterface/Attribute:ip_address' => 'IP Address',
+	'Class:NetworkInterface/Attribute:ip_address+' => '',
+	'Class:NetworkInterface/Attribute:ip_mask' => 'IP Mask',
+	'Class:NetworkInterface/Attribute:ip_mask+' => '',
+	'Class:NetworkInterface/Attribute:mac_address' => 'MAC Address',
+	'Class:NetworkInterface/Attribute:mac_address+' => '',
+	'Class:NetworkInterface/Attribute:speed' => 'Speed',
+	'Class:NetworkInterface/Attribute:speed+' => '',
+	'Class:NetworkInterface/Attribute:duplex' => 'Duplex',
+	'Class:NetworkInterface/Attribute:duplex+' => '',
+	'Class:NetworkInterface/Attribute:duplex/Value:auto' => 'Auto',
+	'Class:NetworkInterface/Attribute:duplex/Value:auto+' => 'Auto',
+	'Class:NetworkInterface/Attribute:duplex/Value:full' => 'Full',
+	'Class:NetworkInterface/Attribute:duplex/Value:full+' => '',
+	'Class:NetworkInterface/Attribute:duplex/Value:half' => 'Half',
+	'Class:NetworkInterface/Attribute:duplex/Value:half+' => '',
+	'Class:NetworkInterface/Attribute:duplex/Value:unknown' => 'Unknown',
+	'Class:NetworkInterface/Attribute:duplex/Value:unknown+' => '',
+	'Class:NetworkInterface/Attribute:connected_if' => 'Connected to',
+	'Class:NetworkInterface/Attribute:connected_if+' => 'Connected interface',
+	'Class:NetworkInterface/Attribute:connected_name' => 'Connected to',
+	'Class:NetworkInterface/Attribute:connected_name+' => '',
+	'Class:NetworkInterface/Attribute:connected_if_device_id' => 'Connected device',
+	'Class:NetworkInterface/Attribute:connected_if_device_id+' => '',
+	'Class:NetworkInterface/Attribute:connected_if_device_id_name' => 'Device',
+	'Class:NetworkInterface/Attribute:connected_if_device_id_name+' => '',
+	'Class:NetworkInterface/Attribute:link_type' => 'Link type',
+	'Class:NetworkInterface/Attribute:link_type+' => '',
+	'Class:NetworkInterface/Attribute:link_type/Value:downlink' => 'Down link',
+	'Class:NetworkInterface/Attribute:link_type/Value:downlink+' => '',
+	'Class:NetworkInterface/Attribute:link_type/Value:uplink' => 'Up link',
+	'Class:NetworkInterface/Attribute:link_type/Value:uplink+' => '',
+));
+
+
 
 //
 // Class: Device
@@ -955,5 +974,14 @@ Dict::Add('EN US', 'English', 'English', array(
 'Menu:MobilePhone+' => 'All Mobile Phones',
 'Menu:PC' => 'Personal Computers',
 'Menu:PC+' => 'All Personal Computers',
+'Menu:NewContact' => 'New Contact',
+'Menu:NewContact+' => 'New Contact',
+'Menu:SearchContacts' => 'Search for contacts',
+'Menu:SearchContacts+' => 'Search for contacts',
+'Menu:NewCI' => 'New CI',
+'Menu:NewCI+' => 'New CI',
+'Menu:SearchCIs' => 'Search for CIs',
+'Menu:SearchCIs+' => 'Search for CIs',
+
 ));
 ?>

+ 19 - 1
modules/itop-config-mgmt-1.0.0/model.itop-config-mgmt.php

@@ -164,7 +164,7 @@ class Person extends Contact
 		MetaModel::Init_AddAttribute(new AttributeString("first_name", array("allowed_values"=>null, "sql"=>"first_name", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeString("employee_id", array("allowed_values"=>null, "sql"=>"employee_id", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 
-		MetaModel::Init_SetZListItems('details', array('name','first_name', 'org_id', 'status', 'location_id', 'email', 'phone', 'employee_id', 'contract_list', 'service_list', 'ticket_list', 'ci_list', 'team_list'));
+		MetaModel::Init_SetZListItems('details', array('name','first_name', 'org_id', 'status', 'location_id', 'email', 'phone', 'employee_id','team_list', 'contract_list', 'service_list', 'ticket_list', 'ci_list'));
 		MetaModel::Init_SetZListItems('advanced_search', array('name', 'status', 'org_id', 'email', 'phone', 'location_id', 'first_name', 'employee_id'));
 		MetaModel::Init_SetZListItems('standard_search', array('name', 'status', 'org_id', 'email', 'phone', 'location_id', 'first_name', 'employee_id'));
 		MetaModel::Init_SetZListItems('list', array('first_name','status', 'org_id', 'email', 'phone', 'location_id'));
@@ -1048,6 +1048,24 @@ class NetworkInterface extends ConnectableCI
 	{
 		return $this->Get('device_name').' - '.$this->Get('name');
 	}
+
+
+
+	public static function GetRelationQueries($sRelCode)
+	{
+		switch ($sRelCode)
+		{
+			case "impacts":
+			$aRels = array(
+				"connected_devices" => array("sQuery"=>"SELECT Device AS dev JOIN NetworkInterface AS if1 ON if1.device_id = dev.id JOIN NetworkInterface AS if2 ON if2.connected_if = if1.id WHERE if2.id = :this->id AND if2.link_type='downlink'", "bPropagate"=>true, "iDistance"=>5),
+			);
+			return array_merge($aRels, parent::GetRelationQueries($sRelCode));
+			break;
+			
+			default:
+			return parent::GetRelationQueries($sRelCode);			
+		}
+	}
 }
 abstract class Device extends ConnectableCI
 {

+ 37 - 3
modules/itop-incident-mgmt-1.0.0/model.itop-incident-mgmt.php

@@ -43,9 +43,9 @@ class Incident extends ResponseTicket
 		MetaModel::Init_InheritAttributes();
 		MetaModel::Init_InheritLifecycle();
 
-		MetaModel::Init_SetZListItems('details', array('ref', 'title', 'org_id', 'description', 'ticket_log', 'start_date', 'tto_escalation_deadline', 'ttr_escalation_deadline', 'document_list', 'ci_list', 'contact_list', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'last_update', 'assignment_date', 'closure_deadline', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment'));
-		MetaModel::Init_SetZListItems('advanced_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'last_update', 'assignment_date', 'tto_escalation_deadline', 'ttr_escalation_deadline', 'closure_deadline', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment'));
-		MetaModel::Init_SetZListItems('standard_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'last_update', 'assignment_date', 'tto_escalation_deadline', 'ttr_escalation_deadline', 'closure_deadline', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment'));
+		MetaModel::Init_SetZListItems('details', array('ref', 'title', 'org_id', 'description', 'ticket_log', 'start_date', 'tto_escalation_deadline', 'ttr_escalation_deadline', 'document_list', 'ci_list', 'contact_list','incident_list', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'last_update', 'assignment_date', 'closure_deadline', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment'));
+		MetaModel::Init_SetZListItems('advanced_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment'));
+		MetaModel::Init_SetZListItems('standard_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment'));
 		MetaModel::Init_SetZListItems('list', array('ref', 'title', 'org_id', 'start_date', 'status', 'service_id', 'priority', 'workgroup_id', 'agent_id'));
 	}
 
@@ -77,6 +77,7 @@ class Incident extends ResponseTicket
 			{
 				$oNewLink = new lnkTicketToCI();
 				$oNewLink->Set('ci_id', $iKey);
+				$oNewLink->Set('impact', 'potentially impacted (automatically computed)');
 				$oToImpact->AddObject($oNewLink);
 			}
 		}
@@ -94,6 +95,39 @@ class Incident extends ResponseTicket
 	}
 }
 
+class lnkTicketToIncident extends cmdbAbstractObject
+{
+
+        public static function Init()
+        {
+                $aParams = array
+                (
+                        "category" => "bizmodel,searchable,incidentmgmt,requestmgmt",
+                        "key_type" => "autoincrement",
+                        "name_attcode" => "ticket_id",
+                        "state_attcode" => "",
+                        "reconc_keys" => array("ticket_id","incident_id"),
+                        "db_table" => "lnktickettoincident",
+                        "db_key_field" => "id",
+                        "db_finalclass_field" => "",
+                        "display_template" => "",
+                );
+                MetaModel::Init_Params($aParams);
+                MetaModel::Init_InheritAttributes();
+                MetaModel::Init_AddAttribute(new AttributeExternalKey("ticket_id", array("targetclass"=>"Ticket", "jointype"=>null, "allowed_values"=>null, "sql"=>"ticket_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeExternalField("ticket_ref", array("allowed_values"=>null, "extkey_attcode"=>"ticket_id", "target_attcode"=>"ref", "is_null_allowed"=>true, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeExternalKey("incident_id", array("targetclass"=>"Incident", "jointype"=>null, "allowed_values"=>null, "sql"=>"incident_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeExternalField("incident_ref", array("allowed_values"=>null, "extkey_attcode"=>"incident_id", "target_attcode"=>"ref", "is_null_allowed"=>true, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeString("reason", array("allowed_values"=>null, "sql"=>"reason", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
+                MetaModel::Init_SetZListItems('details', array('ticket_id', 'incident_id','reason'));
+                MetaModel::Init_SetZListItems('advanced_search', array('ticket_id', 'incident_id'));
+                MetaModel::Init_SetZListItems('standard_search', array('ticket_id', 'incident_id'));
+                MetaModel::Init_SetZListItems('list', array('ticket_id', 'incident_id','reason'));
+  
+      }
+}
+
+
 $oMyMenuGroup = new MenuGroup('IncidentManagement', 40 /* fRank */);
 new TemplateMenuNode('Incident:Overview', '../modules/itop-incident-mgmt-1.0.0/overview.html', $oMyMenuGroup->GetIndex() /* oParent */, 0 /* fRank */);
 new NewObjectMenuNode('NewIncident', 'Incident', $oMyMenuGroup->GetIndex(), 1 /* fRank */);

+ 91 - 0
modules/itop-knownerror-mgmt-1.0.0/en.dict.itop-knownerror-mgmt.php

@@ -48,4 +48,95 @@
 // Class:<class_name>/Stimulus:<stimulus_code>
 // Class:<class_name>/Stimulus:<stimulus_code>+
 
+//
+// Class: KnownError
+//
+
+Dict::Add('EN US', 'English', 'English', array(
+	'Class:KnownError' => 'Known Error',
+	'Class:KnownError+' => 'Error documented for a known issue',
+	'Class:KnownError/Attribute:name' => 'Name',
+	'Class:KnownError/Attribute:name+' => '',
+	'Class:KnownError/Attribute:org_id' => 'Customer',
+	'Class:KnownError/Attribute:org_id+' => '',
+	'Class:KnownError/Attribute:cust_name' => 'Customer Name',
+	'Class:KnownError/Attribute:cust_name+' => '',
+	'Class:KnownError/Attribute:problem_id' => 'Related Problem',
+	'Class:KnownError/Attribute:problem_id+' => '',
+	'Class:KnownError/Attribute:problem_ref' => 'Ref',
+	'Class:KnownError/Attribute:problem_ref+' => '',
+	'Class:KnownError/Attribute:symptom' => 'Symptom',
+	'Class:KnownError/Attribute:symptom+' => '',
+	'Class:KnownError/Attribute:root_cause' => 'Root Cause',
+	'Class:KnownError/Attribute:root_cause+' => '',
+	'Class:KnownError/Attribute:workaround' => 'Workaround',
+	'Class:KnownError/Attribute:workaround+' => '',
+	'Class:KnownError/Attribute:solution' => 'Solution',
+	'Class:KnownError/Attribute:solution+' => '',
+	'Class:KnownError/Attribute:error_code' => 'Error Code',
+	'Class:KnownError/Attribute:error_code+' => '',
+	'Class:KnownError/Attribute:domain' => 'Domain',
+	'Class:KnownError/Attribute:domain+' => '',
+	'Class:KnownError/Attribute:domain/Value:Application' => 'Application',
+	'Class:KnownError/Attribute:domain/Value:Application+' => 'Application',
+	'Class:KnownError/Attribute:domain/Value:Desktop' => 'Desktop',
+	'Class:KnownError/Attribute:domain/Value:Desktop+' => 'Desktop',
+	'Class:KnownError/Attribute:domain/Value:Network' => 'Network',
+	'Class:KnownError/Attribute:domain/Value:Network+' => 'Network',
+	'Class:KnownError/Attribute:domain/Value:Server' => 'Server',
+	'Class:KnownError/Attribute:domain/Value:Server+' => 'Server',
+	'Class:KnownError/Attribute:vendor' => 'Vendor',
+	'Class:KnownError/Attribute:vendor+' => '',
+	'Class:KnownError/Attribute:model' => 'Model',
+	'Class:KnownError/Attribute:model+' => '',
+	'Class:KnownError/Attribute:version' => 'Version',
+	'Class:KnownError/Attribute:version+' => '',
+	'Class:KnownError/Attribute:ci_list' => 'CIs',
+	'Class:KnownError/Attribute:ci_list+' => '',
+	'Class:KnownError/Attribute:document_list' => 'Documents',
+	'Class:KnownError/Attribute:document_list+' => '',
+));
+
+
+//
+// Class: lnkInfraError
+//
+
+Dict::Add('EN US', 'English', 'English', array(
+	'Class:lnkInfraError' => 'InfraErrorLinks',
+	'Class:lnkInfraError+' => 'Infra related to a known error',
+	'Class:lnkInfraError/Attribute:infra_id' => 'CI',
+	'Class:lnkInfraError/Attribute:infra_id+' => '',
+	'Class:lnkInfraError/Attribute:infra_name' => 'CI Name',
+	'Class:lnkInfraError/Attribute:infra_name+' => '',
+	'Class:lnkInfraError/Attribute:infra_status' => 'CI Status',
+	'Class:lnkInfraError/Attribute:infra_status+' => '',
+	'Class:lnkInfraError/Attribute:error_id' => 'Error',
+	'Class:lnkInfraError/Attribute:error_id+' => '',
+	'Class:lnkInfraError/Attribute:error_name' => 'Error name',
+	'Class:lnkInfraError/Attribute:error_name+' => '',
+	'Class:lnkInfraError/Attribute:reason' => 'Reason',
+	'Class:lnkInfraError/Attribute:reason+' => '',
+));
+
+//
+// Class: lnkDocumentError
+//
+
+Dict::Add('EN US', 'English', 'English', array(
+	'Class:lnkDocumentError' => 'DocumentsErrorLinks',
+	'Class:lnkDocumentError+' => 'A link between a document and a known error',
+	'Class:lnkDocumentError/Attribute:doc_id' => 'Document',
+	'Class:lnkDocumentError/Attribute:doc_id+' => '',
+	'Class:lnkDocumentError/Attribute:doc_name' => 'Document Name',
+	'Class:lnkDocumentError/Attribute:doc_name+' => '',
+	'Class:lnkDocumentError/Attribute:error_id' => 'Error',
+	'Class:lnkDocumentError/Attribute:error_id+' => '',
+	'Class:lnkDocumentError/Attribute:error_name' => 'Error Name',
+	'Class:lnkDocumentError/Attribute:error_name+' => '',
+	'Class:lnkDocumentError/Attribute:link_type' => 'Information',
+	'Class:lnkDocumentError/Attribute:link_type+' => '',
+));
+
+
 ?>

+ 144 - 0
modules/itop-knownerror-mgmt-1.0.0/model.itop-knownerror-mgmt.php

@@ -23,4 +23,148 @@
  * @license     http://www.opensource.org/licenses/gpl-3.0.html LGPL
  */
 
+////////////////////////////////////////////////////////////////////////////////////
+/**
+* Description of known error
+*/
+////////////////////////////////////////////////////////////////////////////////////
+class KnownError extends cmdbAbstractObject
+{
+	public static function Init()
+	{
+		$aParams = array
+		(
+			"category" => "bizmodel,searchable",
+			"name" => "Known Error",
+			"description" => "Error documented for a known issue",
+			"key_type" => "autoincrement",
+			"key_label" => "id",
+			"name_attcode" => "name",
+			"state_attcode" => "",
+			"reconc_keys" => array("org_id", "name"), // inherited attributes
+			"db_table" => "known_error",
+			"db_key_field" => "id",
+			"db_finalclass_field" => "",
+			"display_template" => "",
+		);
+		MetaModel::Init_Params($aParams);
+		MetaModel::Init_InheritAttributes();
+		MetaModel::Init_AddAttribute(new AttributeString("name", array("allowed_values"=>null, "sql"=>"name", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
+
+		MetaModel::Init_AddAttribute(new AttributeExternalKey("org_id", array("targetclass"=>"Organization", "allowed_values"=>null, "sql"=>"cust_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("cust_name", array("allowed_values"=>null, "extkey_attcode"=> 'org_id', "target_attcode"=>"name")));
+
+		MetaModel::Init_AddAttribute(new AttributeExternalKey("problem_id", array("targetclass"=>"Problem", "allowed_values"=>null, "sql"=>"problem_id", "is_null_allowed"=>true, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("problem_ref", array("allowed_values"=>null, "extkey_attcode"=> 'problem_id', "target_attcode"=>"ref")));
+		MetaModel::Init_AddAttribute(new AttributeText("symptom", array("allowed_values"=>null, "sql"=>"symptom", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
+ 	 	MetaModel::Init_AddAttribute(new AttributeText("root_cause", array("allowed_values"=>null, "sql"=>"rootcause", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
+ 	  	MetaModel::Init_AddAttribute(new AttributeText("workaround", array("allowed_values"=>null, "sql"=>"workaround", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
+ 		MetaModel::Init_AddAttribute(new AttributeText("solution", array("allowed_values"=>null, "sql"=>"solution", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
+ 
+		MetaModel::Init_AddAttribute(new AttributeString("error_code", array("allowed_values"=>null, "sql"=>"error_code", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeEnum("domain", array("allowed_values"=>new ValueSetEnum("Network, Server, Application, Desktop"), "sql"=>"domain", "default_value"=>"Application", "is_null_allowed"=>false, "depends_on"=>array())));
+	  	MetaModel::Init_AddAttribute(new AttributeString("vendor", array("allowed_values"=>null, "sql"=>"vendor", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
+    		MetaModel::Init_AddAttribute(new AttributeString("model", array("allowed_values"=>null, "sql"=>"model", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
+    		MetaModel::Init_AddAttribute(new AttributeString("version", array("allowed_values"=>null, "sql"=>"version", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
+       		MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("ci_list", array("linked_class"=>"lnkInfraError", "ext_key_to_me"=>"error_id", "ext_key_to_remote"=>"infra_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
+      		MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("document_list", array("linked_class"=>"lnkDocumentError", "ext_key_to_me"=>"error_id", "ext_key_to_remote"=>"doc_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
+
+
+
+
+		MetaModel::Init_SetZListItems('details', array('name', 'org_id','problem_id','error_code','domain','vendor','model','version', 'symptom','root_cause','workaround','solution','ci_list','document_list')); // Attributes to be displayed for the complete details
+		MetaModel::Init_SetZListItems('list', array('org_id','problem_id','error_code', 'symptom')); // Attributes to be displayed for a list
+		// Search criteria
+		MetaModel::Init_SetZListItems('standard_search', array('name', 'org_id','problem_id','error_code','domain','symptom')); // Criteria of the std search form
+		MetaModel::Init_SetZListItems('advanced_search', array('name', 'org_id','problem_id', 'error_code','domain','symptom')); // Criteria of the advanced search form
+
+	}
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+/**
+* n-n link between any Infra and a Known Error
+*/
+////////////////////////////////////////////////////////////////////////////////////
+class lnkInfraError extends cmdbAbstractObject
+{
+	public static function Init()
+	{
+		$aParams = array
+		(
+			"category" => "bizmodel,searchable",
+			"name" => "InfraErrorLinks",
+			"description" => "Infra related to a known error",
+			"key_type" => "autoincrement",
+			"key_label" => "link_id",
+			"name_attcode" => "",  // ????
+			"state_attcode" => "",
+			"reconc_keys" => array("infra_id","error_id"),  // ????
+			"db_table" => "infra_error_links",
+			"db_key_field" => "link_id",
+			"db_finalclass_field" => "",
+			"display_template" => "",
+		);
+		MetaModel::Init_Params($aParams);
+		MetaModel::Init_AddAttribute(new AttributeExternalKey("infra_id", array("targetclass"=>"FunctionalCI", "jointype"=> '',"allowed_values"=>null, "sql"=>"infra_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("infra_name", array("allowed_values"=>null, "extkey_attcode"=> 'infra_id', "target_attcode"=>"name")));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("infra_status", array("allowed_values"=>null, "extkey_attcode"=> 'infra_id', "target_attcode"=>"status")));
+		MetaModel::Init_AddAttribute(new AttributeExternalKey("error_id", array("targetclass"=>"KnownError", "jointype"=> '', "allowed_values"=>null, "sql"=>"error_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("error_name", array( "allowed_values"=>null, "extkey_attcode"=> 'error_id', "target_attcode"=>"name")));
+	        MetaModel::Init_AddAttribute(new AttributeString("reason", array("allowed_values"=>null, "sql"=>"dummy", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
+
+		
+		// Display lists
+		MetaModel::Init_SetZListItems('details', array('infra_id', 'error_id','reason')); // Attributes to be displayed for a list
+		MetaModel::Init_SetZListItems('list', array('infra_id', 'infra_status','error_id','reason')); // Attributes to be displayed for a list
+		// Search criteria
+		MetaModel::Init_SetZListItems('standard_search', array('infra_id', 'error_id')); // Criteria of the std search form
+		MetaModel::Init_SetZListItems('advanced_search', array('infra_id', 'error_id')); // Criteria of the advanced search form
+	}
+
+	
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+/**
+* n-n link between any Contract and a Document
+*/
+////////////////////////////////////////////////////////////////////////////////////
+class lnkDocumentError extends cmdbAbstractObject
+{
+	public static function Init()
+	{
+		$aParams = array
+		(
+			"category" => "bizmodel,searchable",
+			"name" => "DocumentsErrorLinks",
+			"description" => "A link between a document and a known error",
+			"key_type" => "autoincrement",
+			"key_label" => "link_id",
+			"name_attcode" => "link_type",
+			"state_attcode" => "",
+			"reconc_keys" => array("doc_id", "error_id"),
+			"db_table" => "documents_error_link",
+			"db_key_field" => "link_id",
+			"db_finalclass_field" => "",
+			"display_template" => "../business/templates/default.html",
+		);
+		MetaModel::Init_Params($aParams);
+		MetaModel::Init_AddAttribute(new AttributeExternalKey("doc_id", array("targetclass"=>"Document","allowed_values"=>null, "sql"=>"doc_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("doc_name", array("allowed_values"=>null, "extkey_attcode"=> 'doc_id', "target_attcode"=>"name")));
+		MetaModel::Init_AddAttribute(new AttributeExternalKey("error_id", array("targetclass"=>"KnownError","allowed_values"=>null, "sql"=>"error_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("error_name", array("allowed_values"=>null, "extkey_attcode"=> 'error_id', "target_attcode"=>"name")));
+		MetaModel::Init_AddAttribute(new AttributeString("link_type", array("allowed_values"=>null, "sql"=>"link_type", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
+
+		
+		// Display lists
+		MetaModel::Init_SetZListItems('details', array('doc_id', 'error_name', 'link_type')); // Attributes to be displayed for the complete details
+		MetaModel::Init_SetZListItems('list', array('doc_id', 'error_name', 'link_type')); // Attributes to be displayed for a list
+	}
+}
+
+
+$oMyMenuGroup = new MenuGroup('ProblemManagement', 42 /* fRank */);
+new OQLMenuNode('Problem:KnownErrors', 'SELECT KnownError', $oMyMenuGroup->GetIndex(), 3 /* fRank */);
+
 ?>

+ 0 - 1
modules/itop-knownerror-mgmt-1.0.0/module.itop-knownerror-mgmt.php

@@ -27,7 +27,6 @@ SetupWebPage::AddModule(
 		),
 		'dictionary' => array(
 			'en.dict.itop-knownerror-mgmt.php',
-			'es_cr.dict.itop-knownerror-mgmt.php',
 		),
 		'data.struct' => array(
 			//'data.struct.itop-knownerror-mgmt.xml',

+ 109 - 0
modules/itop-problem-mgmt-1.0.0/en.dict.itop-problem-mgmt.php

@@ -48,4 +48,113 @@
 // Class:<class_name>/Stimulus:<stimulus_code>
 // Class:<class_name>/Stimulus:<stimulus_code>+
 
+
+
+
+Dict::Add('EN US', 'English', 'English', array(
+        'Menu:ProblemManagement' => 'Problem Management',
+        'Menu:ProblemManagement+' => 'Problem Management',
+    	'Menu:Problem:Overview' => 'Overview',
+    	'Menu:Problem:Overview+' => 'Overview',
+    	'Menu:NewProblem' => 'New Problem',
+    	'Menu:NewProblem+' => 'New Problem',
+    	'Menu:SearchProblems' => 'Search for Problems',
+    	'Menu:SearchProblems+' => 'Search for Problems',
+    	'Menu:Problem:KnownErrors' => 'All Known Errors',
+    	'Menu:Problem:KnownErrors+' => 'All Known Errors',
+    	'Menu:Problem:Shortcuts' => 'Shortcuts',
+        'Menu:Problem:MyProblems' => 'My Problems',
+        'Menu:Problem:MyProblems+' => 'My Problems',
+        'Menu:Problem:OpenProblems' => 'All Open problems',
+        'Menu:Problem:OpenProblems+' => 'All Open problems',
+));
+//
+// Class: Problem
+//
+
+Dict::Add('EN US', 'English', 'English', array(
+	'Class:Problem' => 'Problem',
+	'Class:Problem+' => '',
+	'Class:Problem/Attribute:status' => 'Status',
+	'Class:Problem/Attribute:status+' => '',
+	'Class:Problem/Attribute:status/Value:new' => 'New',
+	'Class:Problem/Attribute:status/Value:new+' => '',
+	'Class:Problem/Attribute:status/Value:assigned' => 'Assigned',
+	'Class:Problem/Attribute:status/Value:assigned+' => '',
+	'Class:Problem/Attribute:status/Value:resolved' => 'Resolved',
+	'Class:Problem/Attribute:status/Value:resolved+' => '',
+	'Class:Problem/Attribute:status/Value:closed' => 'Closed',
+	'Class:Problem/Attribute:status/Value:closed+' => '',
+	'Class:Problem/Attribute:org_id' => 'Customer',
+	'Class:Problem/Attribute:org_id+' => '',
+	'Class:Problem/Attribute:org_name' => 'Name',
+	'Class:Problem/Attribute:org_name+' => 'Common name',
+	'Class:Problem/Attribute:service_id' => 'Service',
+	'Class:Problem/Attribute:service_id+' => '',
+	'Class:Problem/Attribute:service_name' => 'Name',
+	'Class:Problem/Attribute:service_name+' => '',
+	'Class:Problem/Attribute:servicesubcategory_id' => 'Service Category',
+	'Class:Problem/Attribute:servicesubcategory_id+' => '',
+	'Class:Problem/Attribute:servicesubcategory_name' => 'Name',
+	'Class:Problem/Attribute:servicesubcategory_name+' => '',
+	'Class:Problem/Attribute:product' => 'Product',
+	'Class:Problem/Attribute:product+' => '',
+	'Class:Problem/Attribute:impact' => 'Impact',
+	'Class:Problem/Attribute:impact+' => '',
+	'Class:Problem/Attribute:impact/Value:1' => 'A Person',
+	'Class:Problem/Attribute:impact/Value:1+' => '',
+	'Class:Problem/Attribute:impact/Value:2' => 'A Service',
+	'Class:Problem/Attribute:impact/Value:2+' => '',
+	'Class:Problem/Attribute:impact/Value:3' => 'A Department',
+	'Class:Problem/Attribute:impact/Value:3+' => '',
+	'Class:Problem/Attribute:urgency' => 'urgency',
+	'Class:Problem/Attribute:urgency+' => '',
+	'Class:Problem/Attribute:urgency/Value:1' => 'Low',
+	'Class:Problem/Attribute:urgency/Value:1+' => 'Low',
+	'Class:Problem/Attribute:urgency/Value:2' => 'Medium',
+	'Class:Problem/Attribute:urgency/Value:2+' => 'Medium',
+	'Class:Problem/Attribute:urgency/Value:3' => 'High',
+	'Class:Problem/Attribute:urgency/Value:3+' => 'High',
+	'Class:Problem/Attribute:priority' => 'priority',
+	'Class:Problem/Attribute:priority+' => '',
+	'Class:Problem/Attribute:priority/Value:1' => 'Low',
+	'Class:Problem/Attribute:priority/Value:1+' => '',
+	'Class:Problem/Attribute:priority/Value:2' => 'Medium',
+	'Class:Problem/Attribute:priority/Value:2+' => '',
+	'Class:Problem/Attribute:priority/Value:3' => 'High',
+	'Class:Problem/Attribute:priority/Value:3+' => '',
+	'Class:Problem/Attribute:workgroup_id' => 'WorkGroup',
+	'Class:Problem/Attribute:workgroup_id+' => '',
+	'Class:Problem/Attribute:workgroup_name' => 'Name',
+	'Class:Problem/Attribute:workgroup_name+' => '',
+	'Class:Problem/Attribute:agent_id' => 'Agent',
+	'Class:Problem/Attribute:agent_id+' => '',
+	'Class:Problem/Attribute:agent_name' => 'Agent Name',
+	'Class:Problem/Attribute:agent_name+' => '',
+	'Class:Problem/Attribute:agent_email' => 'Agent Email',
+	'Class:Problem/Attribute:agent_email+' => '',
+	'Class:Problem/Attribute:related_change_id' => 'Related Change',
+	'Class:Problem/Attribute:related_change_id+' => '',
+	'Class:Problem/Attribute:related_change_ref' => 'Ref',
+	'Class:Problem/Attribute:related_change_ref+' => '',
+	'Class:Problem/Attribute:close_date' => 'Close Date',
+	'Class:Problem/Attribute:close_date+' => '',
+	'Class:Problem/Attribute:last_update' => 'Last Update',
+	'Class:Problem/Attribute:last_update+' => '',
+	'Class:Problem/Attribute:assignment_date' => 'Assignment Date',
+	'Class:Problem/Attribute:assignment_date+' => '',
+	'Class:Problem/Attribute:resolution_date' => 'Resolution Date',
+	'Class:Problem/Attribute:resolution_date+' => '',
+	'Class:Problem/Attribute:knownerrors_list' => 'Known Errors',
+	'Class:Problem/Attribute:knownerrors_list+' => '',
+	'Class:Problem/Stimulus:ev_assign' => 'Assign',
+	'Class:Problem/Stimulus:ev_assign+' => '',
+	'Class:Problem/Stimulus:ev_reassign' => 'Reaassign',
+	'Class:Problem/Stimulus:ev_reassign+' => '',
+	'Class:Problem/Stimulus:ev_resolve' => 'Resolve',
+	'Class:Problem/Stimulus:ev_resolve+' => '',
+	'Class:Problem/Stimulus:ev_close' => 'Close',
+	'Class:Problem/Stimulus:ev_close+' => '',
+));
+
 ?>

+ 209 - 0
modules/itop-problem-mgmt-1.0.0/model.itop-problem-mgmt.php

@@ -23,4 +23,213 @@
  * @license     http://www.opensource.org/licenses/gpl-3.0.html LGPL
  */
 
+class Problem extends Ticket
+{
+	public static function Init()
+	{
+		$aParams = array
+		(
+			"category" => "bizmodel,searchable,problemmgmt",
+			"key_type" => "autoincrement",
+			"name_attcode" => "ref",
+			"state_attcode" => "status",
+			"reconc_keys" => array("ref"),
+			"db_table" => "ticket_problem",
+			"db_key_field" => "id",
+			"db_finalclass_field" => "",
+			"display_template" => "",
+		);
+		MetaModel::Init_Params($aParams);
+		MetaModel::Init_InheritAttributes();
+//		MetaModel::Init_InheritLifecycle();
+
+                MetaModel::Init_AddAttribute(new AttributeEnum("status", array("allowed_values"=>new ValueSetEnum('new,assigned,resolved,closed'), "sql"=>"status", "default_value"=>"new", "is_null_allowed"=>false, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeExternalKey("org_id", array("targetclass"=>"Organization", "jointype"=>null, "allowed_values"=>null, "sql"=>"org_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeExternalField("org_name", array("allowed_values"=>null, "extkey_attcode"=>"org_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeExternalKey("service_id", array("targetclass"=>"Service", "jointype"=>null, "allowed_values"=>new ValueSetObjects('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 =:this->org_id'), "sql"=>"service_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array("org_id"))));
+                MetaModel::Init_AddAttribute(new AttributeExternalField("service_name", array("allowed_values"=>null, "extkey_attcode"=>"service_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeExternalKey("servicesubcategory_id", array("targetclass"=>"ServiceSubcategory", "jointype"=>null, "allowed_values"=>new ValueSetObjects('SELECT ServiceSubcategory WHERE service_id = :this->service_id'), "sql"=>"servicesubcategory_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array("service_id"))));
+                MetaModel::Init_AddAttribute(new AttributeExternalField("servicesubcategory_name", array("allowed_values"=>null, "extkey_attcode"=>"servicesubcategory_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeString("product", array("allowed_values"=>null, "sql"=>"product", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeEnum("impact", array("allowed_values"=>new ValueSetEnum('1,2,3'), "sql"=>"impact", "default_value"=>"1", "is_null_allowed"=>false, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeEnum("urgency", array("allowed_values"=>new ValueSetEnum('1,2,3'), "sql"=>"urgency", "default_value"=>"1", "is_null_allowed"=>false, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeEnum("priority", array("allowed_values"=>new ValueSetEnum('1,2,3'), "sql"=>"priority", "default_value"=>"1", "is_null_allowed"=>false, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeExternalKey("workgroup_id", array("targetclass"=>"Team", "jointype"=>null, "allowed_values"=>new ValueSetObjects('SELECT Team AS t JOIN CustomerContract AS cc ON cc.support_team_id=t.id JOIN lnkContractToSLA AS ln ON ln.contract_id=cc.id JOIN SLA AS sla ON ln.sla_id=sla.id WHERE sla.service_id = :this->service_id AND cc.org_id = :this->org_id'), "sql"=>"workgroup_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array("org_id","service_id"))));
+                MetaModel::Init_AddAttribute(new AttributeExternalField("workgroup_name", array("allowed_values"=>null, "extkey_attcode"=>"workgroup_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
+               MetaModel::Init_AddAttribute(new AttributeExternalKey("agent_id", array("targetclass"=>"Person", "jointype"=>null, "allowed_values"=>new ValueSetObjects('SELECT Person AS p JOIN lnkTeamToContact AS l ON l.contact_id=p.id JOIN Team AS t ON l.team_id=t.id WHERE t.id = :this->workgroup_id'), "sql"=>"agent_id", "is_null_allowed"=>true, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array("workgroup_id"))));
+                MetaModel::Init_AddAttribute(new AttributeExternalField("agent_name", array("allowed_values"=>null, "extkey_attcode"=>"agent_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeExternalField("agent_email", array("allowed_values"=>null, "extkey_attcode"=>"agent_id", "target_attcode"=>"email", "is_null_allowed"=>true, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeExternalKey("related_change_id", array("targetclass"=>"Change", "jointype"=>null, "allowed_values"=>null, "sql"=>"related_change_id", "is_null_allowed"=>true, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeExternalField("related_change_ref", array("allowed_values"=>null, "extkey_attcode"=>"related_change_id", "target_attcode"=>"ref", "is_null_allowed"=>true, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeDateTime("close_date", array("allowed_values"=>null, "sql"=>"close_date", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeDateTime("last_update", array("allowed_values"=>null, "sql"=>"last_update", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeDateTime("assignment_date", array("allowed_values"=>null, "sql"=>"assignment_date", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeDateTime("resolution_date", array("allowed_values"=>null, "sql"=>"resolution_date", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
+                MetaModel::Init_AddAttribute(new AttributeLinkedSet("knownerrors_list", array("linked_class"=>"KnownError", "ext_key_to_me"=>"problem_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
+
+
+		MetaModel::Init_SetZListItems('details', array('ref', 'title', 'org_id', 'description', 'ticket_log', 'start_date','knownerrors_list', 'document_list', 'ci_list', 'contact_list','incident_list', 'status', 'service_id', 'servicesubcategory_id','product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_change_id', 'close_date', 'last_update', 'assignment_date'));
+		MetaModel::Init_SetZListItems('advanced_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_change_id', 'close_date'));
+		MetaModel::Init_SetZListItems('standard_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_change_id', 'close_date'));
+		MetaModel::Init_SetZListItems('list', array('ref', 'title', 'org_id', 'start_date', 'status', 'service_id', 'priority'));
+
+                // Lifecycle
+                MetaModel::Init_DefineState(
+                        "new",
+                        array(
+                                "attribute_inherit" => null,
+                                "attribute_list" => array(
+                                        'ref' => OPT_ATT_READONLY,
+                                        'ticket_log' => OPT_ATT_HIDDEN,
+                                        'related_change_id' => OPT_ATT_HIDDEN,
+                                        'description' => OPT_ATT_MUSTCHANGE,
+                                        'contact_list' => OPT_ATT_READONLY,
+                                        'start_date' => OPT_ATT_READONLY,
+                                        'last_update' => OPT_ATT_READONLY,
+                                        'assignment_date' => OPT_ATT_HIDDEN,
+                                        'resolution_date' => OPT_ATT_HIDDEN,
+                                        'close_date' => OPT_ATT_HIDDEN,
+                                        'org_id' => OPT_ATT_MUSTCHANGE,
+                                        'service_id' => OPT_ATT_MUSTCHANGE,
+                                        'servicesubcategory_id' => OPT_ATT_MUSTCHANGE,
+                                        'product' => OPT_ATT_MUSTPROMPT,
+                                        'impact' => OPT_ATT_MUSTCHANGE,
+                                        'urgency' => OPT_ATT_MUSTCHANGE,
+                                        'priority' => OPT_ATT_READONLY,
+                                        'workgroup_id' => OPT_ATT_MUSTCHANGE,
+                                        'agent_id' => OPT_ATT_HIDDEN,
+                                        'agent_email' => OPT_ATT_HIDDEN,
+                                ),
+                        )
+                );
+                MetaModel::Init_DefineState(
+                        "assigned",
+                        array(
+                                "attribute_inherit" => 'new',
+                                "attribute_list" => array(
+                                        'title' => OPT_ATT_READONLY,
+                                        'org_id' => OPT_ATT_READONLY,
+                                        'ticket_log' => OPT_ATT_NORMAL,
+                                        'description' => OPT_ATT_READONLY,
+                                        'agent_id' => OPT_ATT_MUSTPROMPT | OPT_ATT_MANDATORY,
+                                        'agent_email' => OPT_ATT_READONLY,
+                                        'workgroup_id' => OPT_ATT_MUSTPROMPT | OPT_ATT_MANDATORY,
+//                                      'related_change_id' => OPT_ATT_NORMAL,
+                                ),
+                        )
+                );
+               MetaModel::Init_DefineState(
+                        "resolved",
+                        array(
+                                "attribute_inherit" => 'assigned',
+                                "attribute_list" => array(
+                                        'service_id' => OPT_ATT_READONLY,
+                                        'servicesubcategory_id' => OPT_ATT_READONLY,
+                                        'product' => OPT_ATT_READONLY,
+                                        'impact' => OPT_ATT_READONLY,
+                                        'workgroup_id' => OPT_ATT_READONLY,
+                                        'agent_id' => OPT_ATT_READONLY,
+                                        'urgency' => OPT_ATT_READONLY,
+                                ),
+                        )
+                );
+                MetaModel::Init_DefineState(
+                        "closed",
+                        array(
+                                "attribute_inherit" => 'resolved',
+                                "attribute_list" => array(
+                                        'ticket_log' => OPT_ATT_READONLY,
+                                        'close_date' => OPT_ATT_READONLY,
+                                ),
+                        )
+                );
+
+                MetaModel::Init_DefineStimulus(new StimulusUserAction("ev_assign", array()));
+                MetaModel::Init_DefineStimulus(new StimulusUserAction("ev_reassign", array()));
+                MetaModel::Init_DefineStimulus(new StimulusUserAction("ev_resolve", array()));
+                MetaModel::Init_DefineStimulus(new StimulusUserAction("ev_close", array()));
+
+                MetaModel::Init_DefineTransition("new", "ev_assign", array("target_state"=>"assigned", "actions"=>array('SetAssignedDate'), "user_restriction"=>null));
+                MetaModel::Init_DefineTransition("assigned", "ev_reassign", array("target_state"=>"assigned", "actions"=>array(), "user_restriction"=>null));
+                MetaModel::Init_DefineTransition("assigned", "ev_resolve", array("target_state"=>"resolved", "actions"=>array('SetResolveDate'), "user_restriction"=>null));
+
+                MetaModel::Init_DefineTransition("resolved", "ev_reassign", array("target_state"=>"assigned", "actions"=>array(), "user_restriction"=>null));
+                MetaModel::Init_DefineTransition("resolved", "ev_close", array("target_state"=>"closed", "actions"=>array('SetClosureDate'), "user_restriction"=>null));
+        }
+
+        // Lifecycle actions
+        //
+        public function SetAssignedDate($sStimulusCode)
+        {
+                $this->Set('assignment_date', time());
+                return true;
+        }
+        public function SetResolveDate($sStimulusCode)
+        {
+                $this->Set('resolution_date', time());
+                return true;
+        }
+        public function SetClosureDate($sStimulusCode)
+        {
+                $this->Set('close_date', time());
+                return true;
+        }
+
+       /** Compute the priority of the ticket based on its impact and urgency
+         * @return integer The priority of the ticket 1(high) .. 3(low)
+         */
+        public function ComputePriority()
+        {
+                // priority[impact][urgency]
+                $aPriorities = array(
+                        // single person
+                        1 => array(
+                                        1 => 1,
+                                        2 => 1,
+                                        3 => 2,
+                        ),
+                        // a group
+                        2 => array(
+                                1 => 1,
+                                2 => 2,
+                                3 => 3,
+                        ),
+                        // a departement!
+                        3 => array(
+                                        1 => 2,
+                                        2 => 3,
+                                        3 => 3,
+                        ),
+                );
+                $iPriority = $aPriorities[(int)$this->Get('impact')][(int)$this->Get('urgency')];
+                return $iPriority;              
+        }
+
+
+	public function ComputeValues()
+	{
+                // Compute the priority of the ticket
+                $this->Set('priority', $this->ComputePriority());
+
+		$iKey = $this->GetKey();
+		if ($iKey < 0)
+		{
+			// Object not yet in the Database
+			$iKey = MetaModel::GetNextKey(get_class($this));
+		}
+		$sName = sprintf('P-%06d', $iKey);
+		$this->Set('ref', $sName);
+	}
+
+}
+
+
+$iIndex = ApplicationMenu::GetMenuIndexById('ProblemManagement');
+new TemplateMenuNode('Problem:Overview', '../modules/itop-problem-mgmt-1.0.0/overview.html', $iIndex /* oParent */, 0 /* fRank */);
+new NewObjectMenuNode('NewProblem', 'Problem', $iIndex, 1 /* fRank */);
+new SearchMenuNode('SearchProblems', 'Problem', $iIndex, 2 /* fRank */);
+$oShortcutNode = new TemplateMenuNode('Problem:Shortcuts', '', $iIndex, 4 /* fRank */);
+new OQLMenuNode('Problem:MyProblems', 'SELECT Problem WHERE agent_id = :current_contact_id', $oShortcutNode->GetIndex(), 1 /* fRank */);
+new OQLMenuNode('Problem:OpenProblems', 'SELECT Problem WHERE status IN ("new", "assigned", "resolved")', $oShortcutNode->GetIndex(), 3 /* fRank */);
+
 ?>

+ 27 - 18
modules/itop-request-mgmt-1.0.0/en.dict.itop-request-mgmt.php

@@ -56,23 +56,32 @@ Dict::Add('EN US', 'English', 'English', array(
 // Class: UserRequest
 //
 
-Dict::Add('EN US', 'English', 'English', array(
-	'Class:UserRequest' => 'User Request',
-	'Class:UserRequest+' => '',
-	'Class:UserRequest/Attribute:freeze_reason' => 'Pending reason',
-	'Class:UserRequest/Attribute:freeze_reason+' => '',
-	'Class:UserRequest/Stimulus:ev_assign' => 'Assign',
-	'Class:UserRequest/Stimulus:ev_assign+' => '',
-	'Class:UserRequest/Stimulus:ev_freeze' => 'Mark as pending',
-	'Class:UserRequest/Stimulus:ev_freeze+' => '',
-	'Class:UserRequest/Stimulus:ev_reassign' => 'Reassign',
-	'Class:UserRequest/Stimulus:ev_reassign+' => '',
-	'Class:UserRequest/Stimulus:ev_timeout' => 'ev_timeout',
-	'Class:UserRequest/Stimulus:ev_timeout+' => '',
-	'Class:UserRequest/Stimulus:ev_resolve' => 'Mark as resolved',
-	'Class:UserRequest/Stimulus:ev_resolve+' => '',
-	'Class:UserRequest/Stimulus:ev_close' => 'Close',
-	'Class:UserRequest/Stimulus:ev_close+' => '',
-));
+Dict::Add('EN US', 'English', 'English', array(
+	'Class:UserRequest' => 'User Request',
+	'Class:UserRequest+' => '',
+	'Class:UserRequest/Attribute:request_type' => 'Request Type',
+	'Class:UserRequest/Attribute:request_type+' => '',
+	'Class:UserRequest/Attribute:request_type/Value:information' => 'Information',
+	'Class:UserRequest/Attribute:request_type/Value:information+' => 'Information',
+	'Class:UserRequest/Attribute:request_type/Value:issue' => 'Issue',
+	'Class:UserRequest/Attribute:request_type/Value:issue+' => 'Issue',
+	'Class:UserRequest/Attribute:request_type/Value:service request' => 'Service Request',
+	'Class:UserRequest/Attribute:request_type/Value:service request+' => 'Service Request',
+	'Class:UserRequest/Attribute:freeze_reason' => 'Pending reason',
+	'Class:UserRequest/Attribute:freeze_reason+' => '',
+	'Class:UserRequest/Stimulus:ev_assign' => 'Assign',
+	'Class:UserRequest/Stimulus:ev_assign+' => '',
+	'Class:UserRequest/Stimulus:ev_reassign' => 'Reassign',
+	'Class:UserRequest/Stimulus:ev_reassign+' => '',
+	'Class:UserRequest/Stimulus:ev_timeout' => 'ev_timeout',
+	'Class:UserRequest/Stimulus:ev_timeout+' => '',
+	'Class:UserRequest/Stimulus:ev_resolve' => 'Mark as resolved',
+	'Class:UserRequest/Stimulus:ev_resolve+' => '',
+	'Class:UserRequest/Stimulus:ev_close' => 'Close',
+	'Class:UserRequest/Stimulus:ev_close+' => '',
+	'Class:UserRequest/Stimulus:ev_freeze' => 'Mark as pending',
+	'Class:UserRequest/Stimulus:ev_freeze+' => '',
+));
+
 
 ?>

+ 6 - 3
modules/itop-request-mgmt-1.0.0/model.itop-request-mgmt.php

@@ -43,22 +43,25 @@ class UserRequest extends ResponseTicket
 		MetaModel::Init_InheritAttributes();
 		MetaModel::Init_InheritLifecycle();
 
+		MetaModel::Init_AddAttribute(new AttributeEnum("request_type", array("allowed_values"=>new ValueSetEnum('service request,issue,information'), "sql"=>"request_type", "default_value"=>"service request", "is_null_allowed"=>false, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeString("freeze_reason", array("allowed_values"=>null, "sql"=>"freeze_reason", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
 
-		MetaModel::Init_SetZListItems('details', array('ref', 'title', 'org_id', 'description', 'ticket_log', 'start_date', 'tto_escalation_deadline', 'ttr_escalation_deadline', 'document_list', 'ci_list', 'contact_list', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'last_update', 'assignment_date', 'closure_deadline', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment', 'freeze_reason'));
-		MetaModel::Init_SetZListItems('advanced_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'last_update', 'assignment_date', 'tto_escalation_deadline', 'ttr_escalation_deadline', 'closure_deadline', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment'));
-		MetaModel::Init_SetZListItems('standard_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'last_update', 'assignment_date', 'tto_escalation_deadline', 'ttr_escalation_deadline', 'closure_deadline', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment'));
+		MetaModel::Init_SetZListItems('details', array('ref', 'title', 'org_id', 'description', 'request_type','ticket_log', 'start_date', 'tto_escalation_deadline', 'ttr_escalation_deadline', 'document_list', 'ci_list', 'contact_list','incident_list', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'last_update', 'assignment_date', 'closure_deadline', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment', 'freeze_reason'));
+		MetaModel::Init_SetZListItems('advanced_search', array('ref', 'title', 'org_id', 'start_date', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment'));
+		MetaModel::Init_SetZListItems('standard_search', array('ref', 'title', 'org_id', 'request_type','start_date', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment'));
 		MetaModel::Init_SetZListItems('list', array('ref', 'title', 'org_id', 'start_date', 'status', 'service_id', 'priority', 'workgroup_id', 'agent_id'));
 
 		MetaModel::Init_OverloadStateAttribute('frozen', 'freeze_reason', OPT_ATT_MANDATORY);
 
 		// The freeze reason remains hidden in all other states
+		MetaModel::Init_OverloadStateAttribute('new', 'request_type', OPT_ATT_MANDATORY);
 		MetaModel::Init_OverloadStateAttribute('new', 'freeze_reason', OPT_ATT_HIDDEN);
 		MetaModel::Init_OverloadStateAttribute('assigned', 'freeze_reason', OPT_ATT_HIDDEN);
 		MetaModel::Init_OverloadStateAttribute('frozen', 'freeze_reason', OPT_ATT_MANDATORY | OPT_ATT_MUSTPROMPT);
 		MetaModel::Init_OverloadStateAttribute('escalated_tto', 'freeze_reason', OPT_ATT_HIDDEN);
 		MetaModel::Init_OverloadStateAttribute('escalated_ttr', 'freeze_reason', OPT_ATT_HIDDEN);
 		MetaModel::Init_OverloadStateAttribute('resolved', 'freeze_reason', OPT_ATT_HIDDEN);
+		MetaModel::Init_OverloadStateAttribute('closed', 'request_type', OPT_ATT_READONLY);
 		MetaModel::Init_OverloadStateAttribute('closed', 'freeze_reason', OPT_ATT_HIDDEN);
 
 		MetaModel::Init_DefineStimulus(new StimulusUserAction("ev_freeze", array()));

+ 27 - 2
modules/itop-service-mgmt-1.0.0/en.dict.itop-service-mgmt.php

@@ -121,7 +121,7 @@ Dict::Add('EN US', 'English', 'English', array(
 	'Class:ProviderContract/Attribute:provider_name+' => '',
 	'Class:ProviderContract/Attribute:sla' => 'SLA',
 	'Class:ProviderContract/Attribute:sla+' => 'Service Level Agreement',
-	'Class:ProviderContract/Attribute:coverage' => 'Coverage',
+	'Class:ProviderContract/Attribute:coverage' => 'Service hours',
 	'Class:ProviderContract/Attribute:coverage+' => '',
 ));
 
@@ -148,7 +148,30 @@ Dict::Add('EN US', 'English', 'English', array(
 	'Class:CustomerContract/Attribute:provider_list+' => '',
 	'Class:CustomerContract/Attribute:sla_list' => 'SLAs',
 	'Class:CustomerContract/Attribute:sla_list+' => 'List of SLA related to the contract',
+	'Class:CustomerContract/Attribute:provider_list' => 'Underpinning Contracts',
+	'Class:CustomerContract/Attribute:sla_list+' => '',
 ));
+//
+// Class: lnkCustomerContractToProviderContract
+//
+
+Dict::Add('EN US', 'English', 'English', array(
+	'Class:lnkCustomerContractToProviderContract' => 'lnkCustomerContractToProviderContract',
+	'Class:lnkCustomerContractToProviderContract+' => '',
+	'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id' => 'Customer Contract',
+	'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_id+' => '',
+	'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_name' => 'Name',
+	'Class:lnkCustomerContractToProviderContract/Attribute:customer_contract_name+' => '',
+	'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_id' => 'Provider Contract',
+	'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_id+' => '',
+	'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_name' => 'Name',
+	'Class:lnkCustomerContractToProviderContract/Attribute:provider_contract_name+' => '',
+	'Class:lnkCustomerContractToProviderContract/Attribute:provider_sla' => 'Provider SLA',
+	'Class:lnkCustomerContractToProviderContract/Attribute:provider_sla+' => 'Service Level Agreement',
+	'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage' => 'Service hours',
+	'Class:lnkCustomerContractToProviderContract/Attribute:provider_coverage+' => '',
+));
+
 
 //
 // Class: lnkContractToSLA
@@ -165,7 +188,7 @@ Dict::Add('EN US', 'English', 'English', array(
 	'Class:lnkContractToSLA/Attribute:sla_id+' => '',
 	'Class:lnkContractToSLA/Attribute:sla_name' => 'SLA',
 	'Class:lnkContractToSLA/Attribute:sla_name+' => '',
-	'Class:lnkContractToSLA/Attribute:coverage' => 'Coverage',
+	'Class:lnkContractToSLA/Attribute:coverage' => 'Service Hours',
 	'Class:lnkContractToSLA/Attribute:coverage+' => '',
 ));
 
@@ -267,6 +290,8 @@ Dict::Add('EN US', 'English', 'English', array(
 	'Class:Service/Attribute:document_list+' => 'Documents attached to the service',
 	'Class:Service/Attribute:contact_list' => 'Contacts',
 	'Class:Service/Attribute:contact_list+' => 'Contacts having a role for this service',
+	'Class:Service/Tab:Related_Contracts' => 'Related Contracts',
+	'Class:Service/Tab:Related_Contracts+' => 'Contracts signed for this service',
 ));
 
 //

+ 67 - 16
modules/itop-service-mgmt-1.0.0/model.itop-service-mgmt.php

@@ -73,7 +73,7 @@ class ProviderContract extends Contract
 			"key_type" => "autoincrement",
 			"name_attcode" => "name",
 			"state_attcode" => "",
-			"reconc_keys" => array("name"),
+			"reconc_keys" => array("name","provider_id"),
 			"db_table" => "providercontract",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
@@ -104,7 +104,7 @@ class CustomerContract extends Contract
 			"key_type" => "autoincrement",
 			"name_attcode" => "name",
 			"state_attcode" => "",
-			"reconc_keys" => array("name"),
+			"reconc_keys" => array("name","org_id","provider_id"),
 			"db_table" => "customercontract",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
@@ -120,13 +120,47 @@ class CustomerContract extends Contract
 		MetaModel::Init_AddAttribute(new AttributeExternalKey("support_team_id", array("targetclass"=>"Team", "jointype"=>null, "allowed_values"=>new ValueSetObjects('SELECT Team WHERE Team.org_id = :this->provider_id'), "sql"=>"support_team_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array('provider_id'))));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("support_team_name", array("allowed_values"=>null, "extkey_attcode"=>"support_team_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("sla_list", array("linked_class"=>"lnkContractToSLA", "ext_key_to_me"=>"contract_id", "ext_key_to_remote"=>"sla_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("provider_list", array("linked_class"=>"lnkCustomerContractToProviderContract", "ext_key_to_me"=>"customer_contract_id", "ext_key_to_remote"=>"provider_contract_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
 
-		MetaModel::Init_SetZListItems('details', array('name', 'org_id', 'description', 'start_date', 'end_date', 'cost', 'cost_currency', 'cost_unit', 'billing_frequency', 'contact_list', 'document_list', 'ci_list', 'provider_id', 'support_team_id', 'sla_list'));
+		MetaModel::Init_SetZListItems('details', array('name', 'org_id', 'description', 'start_date', 'end_date', 'cost', 'cost_currency', 'cost_unit', 'billing_frequency', 'contact_list', 'document_list', 'ci_list', 'provider_list','provider_id', 'support_team_id', 'sla_list'));
 		MetaModel::Init_SetZListItems('advanced_search', array('name', 'description', 'start_date', 'end_date', 'cost', 'cost_currency', 'cost_unit', 'billing_frequency', 'org_id', 'support_team_id'));
 		MetaModel::Init_SetZListItems('standard_search', array('name', 'description', 'org_id', 'start_date', 'end_date', 'cost', 'cost_currency', 'cost_unit', 'billing_frequency', 'provider_id', 'support_team_id'));
 		MetaModel::Init_SetZListItems('list', array('name', 'org_id', 'start_date', 'end_date', 'provider_id', 'support_team_id'));
 	}
 }
+class lnkCustomerContractToProviderContract extends cmdbAbstractObject
+{
+
+	public static function Init()
+	{
+		$aParams = array
+		(
+			"category" => "bizmodel,searchable,servicemgmt",
+			"key_type" => "autoincrement",
+			"name_attcode" => "customer_contract_id",
+			"state_attcode" => "",
+			"reconc_keys" => array("customer_contract_id","provider_contract_id"),
+			"db_table" => "lnkcustomercontracttoprovider",
+			"db_key_field" => "id",
+			"db_finalclass_field" => "",
+			"display_template" => "",
+		);
+		MetaModel::Init_Params($aParams);
+		MetaModel::Init_InheritAttributes();
+
+		MetaModel::Init_AddAttribute(new AttributeExternalKey("customer_contract_id", array("targetclass"=>"CustomerContract", "jointype"=>null, "allowed_values"=>null, "sql"=>"customer_contract_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("customer_contract_name", array("allowed_values"=>null, "extkey_attcode"=>"customer_contract_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalKey("provider_contract_id", array("targetclass"=>"ProviderContract", "jointype"=>null, "allowed_values"=>null, "sql"=>"provider_contract_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("provider_contract_name", array("allowed_values"=>null, "extkey_attcode"=>"provider_contract_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("provider_sla", array("allowed_values"=>null, "extkey_attcode"=>"provider_contract_id", "target_attcode"=>"sla", "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("provider_coverage", array("allowed_values"=>null, "extkey_attcode"=>"provider_contract_id", "target_attcode"=>"coverage", "is_null_allowed"=>true, "depends_on"=>array())));
+
+		MetaModel::Init_SetZListItems('details', array('customer_contract_id', 'provider_contract_id','provider_sla','provider_coverage'));
+		MetaModel::Init_SetZListItems('advanced_search', array('customer_contract_id', 'provider_contract_id'));
+		MetaModel::Init_SetZListItems('standard_search', array('customer_contract_id', 'provider_contract_id'));
+		MetaModel::Init_SetZListItems('list', array('customer_contract_id', 'provider_contract_id','provider_sla','provider_coverage'));
+	}
+}
 class lnkContractToSLA extends cmdbAbstractObject
 {
 
@@ -138,7 +172,7 @@ class lnkContractToSLA extends cmdbAbstractObject
 			"key_type" => "autoincrement",
 			"name_attcode" => "contract_id",
 			"state_attcode" => "",
-			"reconc_keys" => array(),
+			"reconc_keys" => array("contract_id","sla_id"),
 			"db_table" => "lnkcontracttosla",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
@@ -151,12 +185,13 @@ class lnkContractToSLA extends cmdbAbstractObject
 		MetaModel::Init_AddAttribute(new AttributeExternalField("contract_name", array("allowed_values"=>null, "extkey_attcode"=>"contract_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalKey("sla_id", array("targetclass"=>"SLA", "jointype"=>null, "allowed_values"=>null, "sql"=>"sla_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("sla_name", array("allowed_values"=>null, "extkey_attcode"=>"sla_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeExternalField("sla_service_name", array("allowed_values"=>null, "extkey_attcode"=>"sla_id", "target_attcode"=>"service_name", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeString("coverage", array("allowed_values"=>null, "sql"=>"coverage", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 
-		MetaModel::Init_SetZListItems('details', array('contract_id', 'sla_id', 'coverage'));
+		MetaModel::Init_SetZListItems('details', array('contract_id', 'sla_id','sla_service_name', 'coverage'));
 		MetaModel::Init_SetZListItems('advanced_search', array('contract_id', 'sla_id', 'coverage'));
 		MetaModel::Init_SetZListItems('standard_search', array('contract_id', 'sla_id', 'coverage'));
-		MetaModel::Init_SetZListItems('list', array('contract_id', 'sla_id', 'coverage'));
+		MetaModel::Init_SetZListItems('list', array('contract_id', 'sla_id', 'sla_service_name','coverage'));
 	}
 }
 class lnkContractToDoc extends cmdbAbstractObject
@@ -170,7 +205,7 @@ class lnkContractToDoc extends cmdbAbstractObject
 			"key_type" => "autoincrement",
 			"name_attcode" => "contract_id",
 			"state_attcode" => "",
-			"reconc_keys" => array(),
+			"reconc_keys" => array("contract_id","document_id"),
 			"db_table" => "lnkcontracttodoc",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
@@ -203,7 +238,7 @@ class lnkContractToContact extends cmdbAbstractObject
 			"key_type" => "autoincrement",
 			"name_attcode" => "contract_id",
 			"state_attcode" => "",
-			"reconc_keys" => array(),
+			"reconc_keys" => array("contract_id","contact_id"),
 			"db_table" => "lnkcontracttocontact",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
@@ -236,7 +271,7 @@ class lnkContractToCI extends cmdbAbstractObject
 			"key_type" => "autoincrement",
 			"name_attcode" => "contract_id",
 			"state_attcode" => "",
-			"reconc_keys" => array(),
+			"reconc_keys" => array("contract_id","ci_id"),
 			"db_table" => "lnkcontracttoci",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
@@ -268,7 +303,7 @@ class Service extends cmdbAbstractObject
 			"key_type" => "autoincrement",
 			"name_attcode" => "name",
 			"state_attcode" => "",
-			"reconc_keys" => array("name"),
+			"reconc_keys" => array("name","org_id"),
 			"db_table" => "service",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
@@ -292,6 +327,22 @@ class Service extends cmdbAbstractObject
 		MetaModel::Init_SetZListItems('advanced_search', array('name', 'description', 'org_id', 'type', 'status'));
 		MetaModel::Init_SetZListItems('standard_search', array('name', 'description', 'org_id', 'type', 'status'));
 		MetaModel::Init_SetZListItems('list', array('name', 'description', 'org_id', 'type', 'status'));
+
+	}
+        function DisplayBareRelations(WebPage $oPage, $bEditMode = false)
+        {
+                parent::DisplayBareRelations($oPage, $bEditMode);
+		$aExtraParam = array ('menu' => false);
+		$ServiceID=$this->GetKey();
+                if (!$bEditMode)
+                {
+			$oPage->SetCurrentTab(Dict::S('Class:Service/Tab:Related_Contracts'));
+			$oCustomerContracts=new CMDBObjectSet(DBObjectSearch::FromOQL("SELECT CustomerContract AS cc JOIN lnkContractToSLA AS ln ON ln.contract_id=cc.id JOIN SLA AS sla ON ln.sla_id=sla.id WHERE sla.service_id=$ServiceID"));
+                        self::DisplaySet($oPage,$oCustomerContracts,$aExtraParam);
+	
+
+		}
+
 	}
 }
 class ServiceSubcategory extends cmdbAbstractObject
@@ -305,7 +356,7 @@ class ServiceSubcategory extends cmdbAbstractObject
 			"key_type" => "autoincrement",
 			"name_attcode" => "name",
 			"state_attcode" => "",
-			"reconc_keys" => array("name"),
+			"reconc_keys" => array("name","service_id"),
 			"db_table" => "servicesubcategory",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
@@ -336,7 +387,7 @@ class SLA extends cmdbAbstractObject
 			"key_type" => "autoincrement",
 			"name_attcode" => "name",
 			"state_attcode" => "",
-			"reconc_keys" => array("name"),
+			"reconc_keys" => array("name","service_id"),
 			"db_table" => "sla",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
@@ -400,7 +451,7 @@ class lnkSLTToSLA extends cmdbAbstractObject
 			"key_type" => "autoincrement",
 			"name_attcode" => "sla_id",
 			"state_attcode" => "",
-			"reconc_keys" => array(),
+			"reconc_keys" => array("sla_id","slt_id"),
 			"db_table" => "lnkslttosla",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
@@ -435,7 +486,7 @@ class lnkServiceToDoc extends cmdbAbstractObject
 			"key_type" => "autoincrement",
 			"name_attcode" => "service_id",
 			"state_attcode" => "",
-			"reconc_keys" => array(),
+			"reconc_keys" => array("service_id","document_id"),
 			"db_table" => "lnkservicetodoc",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
@@ -468,7 +519,7 @@ class lnkServiceToContact extends cmdbAbstractObject
 			"key_type" => "autoincrement",
 			"name_attcode" => "service_id",
 			"state_attcode" => "",
-			"reconc_keys" => array(),
+			"reconc_keys" => array("service_id","contact_id"),
 			"db_table" => "lnkservicetocontact",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
@@ -501,7 +552,7 @@ class lnkServiceToCI extends cmdbAbstractObject
 			"key_type" => "autoincrement",
 			"name_attcode" => "service_id",
 			"state_attcode" => "",
-			"reconc_keys" => array(),
+			"reconc_keys" => array("service_id","ci_id"),
 			"db_table" => "lnkservicetoci",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",

+ 176 - 150
modules/itop-tickets-1.0.0/en.dict.itop-tickets.php

@@ -38,26 +38,35 @@
 // Class: Ticket
 //
 
-Dict::Add('EN US', 'English', 'English', array(
-	'Class:Ticket' => 'Ticket',
-	'Class:Ticket+' => '',
-	'Class:Ticket/Attribute:ref' => 'Ref',
-	'Class:Ticket/Attribute:ref+' => '',
-	'Class:Ticket/Attribute:title' => 'Title',
-	'Class:Ticket/Attribute:title+' => '',
-	'Class:Ticket/Attribute:ticket_log' => 'Log',
-	'Class:Ticket/Attribute:ticket_log+' => '',
-	'Class:Ticket/Attribute:start_date' => 'Started',
-	'Class:Ticket/Attribute:start_date+' => '',
-	'Class:Ticket/Attribute:document_list' => 'Documents',
-	'Class:Ticket/Attribute:document_list+' => 'Documents related to the ticket',
-	'Class:Ticket/Attribute:ci_list' => 'CIs',
-	'Class:Ticket/Attribute:ci_list+' => 'CIs concerned by the incident',
-	'Class:Ticket/Attribute:contact_list' => 'Contacts',
-	'Class:Ticket/Attribute:contact_list+' => 'Team and persons involved',
-	'Class:Ticket/Attribute:finalclass' => 'Type',
-	'Class:Ticket/Attribute:finalclass+' => '',
-));
+//
+// Class: Ticket
+//
+
+Dict::Add('EN US', 'English', 'English', array(
+	'Class:Ticket' => 'Ticket',
+	'Class:Ticket+' => '',
+	'Class:Ticket/Attribute:ref' => 'Ref',
+	'Class:Ticket/Attribute:ref+' => '',
+	'Class:Ticket/Attribute:title' => 'Title',
+	'Class:Ticket/Attribute:title+' => '',
+	'Class:Ticket/Attribute:description' => 'description',
+	'Class:Ticket/Attribute:description+' => '',
+	'Class:Ticket/Attribute:ticket_log' => 'Log',
+	'Class:Ticket/Attribute:ticket_log+' => '',
+	'Class:Ticket/Attribute:start_date' => 'Started',
+	'Class:Ticket/Attribute:start_date+' => '',
+	'Class:Ticket/Attribute:document_list' => 'Documents',
+	'Class:Ticket/Attribute:document_list+' => 'Documents related to the ticket',
+	'Class:Ticket/Attribute:ci_list' => 'CIs',
+	'Class:Ticket/Attribute:ci_list+' => 'CIs concerned by the incident',
+	'Class:Ticket/Attribute:contact_list' => 'Contacts',
+	'Class:Ticket/Attribute:contact_list+' => 'Team and persons involved',
+	'Class:Ticket/Attribute:incident_list' => 'Related Incidents',
+	'Class:Ticket/Attribute:incident_list+' => '',
+	'Class:Ticket/Attribute:finalclass' => 'Type',
+	'Class:Ticket/Attribute:finalclass+' => '',
+));
+
 
 //
 // Class: lnkTicketToDoc
@@ -101,141 +110,158 @@ Dict::Add('EN US', 'English', 'English', array(
 // Class: lnkTicketToCI
 //
 
-Dict::Add('EN US', 'English', 'English', array(
-	'Class:lnkTicketToCI' => 'Ticket/CI',
-	'Class:lnkTicketToCI+' => '',
-	'Class:lnkTicketToCI/Attribute:ticket_id' => 'Ticket',
-	'Class:lnkTicketToCI/Attribute:ticket_id+' => '',
-	'Class:lnkTicketToCI/Attribute:ticket_ref' => 'Ticket #',
-	'Class:lnkTicketToCI/Attribute:ticket_ref+' => '',
-	'Class:lnkTicketToCI/Attribute:ci_id' => 'CI',
-	'Class:lnkTicketToCI/Attribute:ci_id+' => '',
-	'Class:lnkTicketToCI/Attribute:ci_name' => 'CI',
-	'Class:lnkTicketToCI/Attribute:ci_name+' => '',
-	'Class:lnkTicketToCI/Attribute:ci_status' => 'CI status',
-	'Class:lnkTicketToCI/Attribute:ci_status+' => '',
-));
+Dict::Add('EN US', 'English', 'English', array(
+	'Class:lnkTicketToCI' => 'Ticket/CI',
+	'Class:lnkTicketToCI+' => '',
+	'Class:lnkTicketToCI/Attribute:ticket_id' => 'Ticket',
+	'Class:lnkTicketToCI/Attribute:ticket_id+' => '',
+	'Class:lnkTicketToCI/Attribute:ticket_ref' => 'Ticket #',
+	'Class:lnkTicketToCI/Attribute:ticket_ref+' => '',
+	'Class:lnkTicketToCI/Attribute:ci_id' => 'CI',
+	'Class:lnkTicketToCI/Attribute:ci_id+' => '',
+	'Class:lnkTicketToCI/Attribute:ci_name' => 'CI',
+	'Class:lnkTicketToCI/Attribute:ci_name+' => '',
+	'Class:lnkTicketToCI/Attribute:ci_status' => 'CI status',
+	'Class:lnkTicketToCI/Attribute:ci_status+' => '',
+	'Class:lnkTicketToCI/Attribute:impact' => 'Impact',
+	'Class:lnkTicketToCI/Attribute:impact+' => '',
+));
+
 
 //
 // Class: ResponseTicket
 //
 
-Dict::Add('EN US', 'English', 'English', array(
-	'Class:ResponseTicket' => 'ResponseTicket',
-	'Class:ResponseTicket+' => '',
-	'Class:ResponseTicket/Attribute:status' => 'Status',
-	'Class:ResponseTicket/Attribute:status+' => '',
-	'Class:ResponseTicket/Attribute:status/Value:new' => 'New',
-	'Class:ResponseTicket/Attribute:status/Value:new+' => 'newly opened',
-	'Class:ResponseTicket/Attribute:status/Value:frozen' => 'Pending',
-	'Class:ResponseTicket/Attribute:status/Value:frozen+' => '',
-	'Class:ResponseTicket/Attribute:status/Value:escalated_tto' => 'Escalation/TTO',
-	'Class:ResponseTicket/Attribute:status/Value:escalated_tto+' => '',
-	'Class:ResponseTicket/Attribute:status/Value:assigned' => 'Assigned',
-	'Class:ResponseTicket/Attribute:status/Value:assigned+' => '',
-	'Class:ResponseTicket/Attribute:status/Value:escalated_ttr' => 'Escalation/TTR',
-	'Class:ResponseTicket/Attribute:status/Value:escalated_ttr+' => '',
-	'Class:ResponseTicket/Attribute:status/Value:resolved' => 'Resolved',
-	'Class:ResponseTicket/Attribute:status/Value:resolved+' => '',
-	'Class:ResponseTicket/Attribute:status/Value:closed' => 'Closed',
-	'Class:ResponseTicket/Attribute:status/Value:closed+' => '',
-	'Class:ResponseTicket/Attribute:caller_id' => 'Caller',
-	'Class:ResponseTicket/Attribute:caller_id+' => '',
-	'Class:ResponseTicket/Attribute:workgroup_name' => 'Workgroup',
-	'Class:ResponseTicket/Attribute:workgroup_name+' => '',
-	'Class:ResponseTicket/Attribute:org_id' => 'Customer',
-	'Class:ResponseTicket/Attribute:org_id+' => '',
-	'Class:ResponseTicket/Attribute:org_name' => 'Customer',
-	'Class:ResponseTicket/Attribute:org_name+' => '',
-	'Class:ResponseTicket/Attribute:service_id' => 'Service',
-	'Class:ResponseTicket/Attribute:service_id+' => '',
-	'Class:ResponseTicket/Attribute:servicesubcategory_id' => 'Service element',
-	'Class:ResponseTicket/Attribute:servicesubcategory_id+' => '',
-	'Class:ResponseTicket/Attribute:product' => 'Product',
-	'Class:ResponseTicket/Attribute:product+' => '',
-	'Class:ResponseTicket/Attribute:impact' => 'Impact',
-	'Class:ResponseTicket/Attribute:impact+' => '',
-	'Class:ResponseTicket/Attribute:impact/Value:1' => 'A person',
-	'Class:ResponseTicket/Attribute:impact/Value:1+' => '',
-	'Class:ResponseTicket/Attribute:impact/Value:2' => 'A service',
-	'Class:ResponseTicket/Attribute:impact/Value:2+' => '',
-	'Class:ResponseTicket/Attribute:impact/Value:3' => 'A department',
-	'Class:ResponseTicket/Attribute:impact/Value:3+' => '',
-	'Class:ResponseTicket/Attribute:urgency' => 'Urgency',
-	'Class:ResponseTicket/Attribute:urgency+' => '',
-	'Class:ResponseTicket/Attribute:urgency/Value:1' => 'Low',
-	'Class:ResponseTicket/Attribute:urgency/Value:1+' => '',
-	'Class:ResponseTicket/Attribute:urgency/Value:2' => 'Medium',
-	'Class:ResponseTicket/Attribute:urgency/Value:2+' => '',
-	'Class:ResponseTicket/Attribute:urgency/Value:3' => 'High',
-	'Class:ResponseTicket/Attribute:urgency/Value:3+' => '',
-	'Class:ResponseTicket/Attribute:priority' => 'Priority',
-	'Class:ResponseTicket/Attribute:priority+' => '',
-	'Class:ResponseTicket/Attribute:priority/Value:1' => 'Low',
-	'Class:ResponseTicket/Attribute:priority/Value:1+' => '',
-	'Class:ResponseTicket/Attribute:priority/Value:2' => 'Medium',
-	'Class:ResponseTicket/Attribute:priority/Value:2+' => '',
-	'Class:ResponseTicket/Attribute:priority/Value:3' => 'High',
-	'Class:ResponseTicket/Attribute:priority/Value:3+' => '',
-	'Class:ResponseTicket/Attribute:workgroup_id' => 'Workgroup',
-	'Class:ResponseTicket/Attribute:workgroup_id+' => '',
-	'Class:ResponseTicket/Attribute:agent_id' => 'Agent',
-	'Class:ResponseTicket/Attribute:agent_id+' => '',
-	'Class:ResponseTicket/Attribute:agent_name' => 'Agent',
-	'Class:ResponseTicket/Attribute:agent_name+' => '',
-	'Class:ResponseTicket/Attribute:agent_email' => 'Agent email',
-	'Class:ResponseTicket/Attribute:agent_email+' => '',
-	'Class:ResponseTicket/Attribute:related_change_id' => 'Related change',
-	'Class:ResponseTicket/Attribute:related_change_id+' => '',
-	'Class:ResponseTicket/Attribute:related_change_ref' => 'Related change',
-	'Class:ResponseTicket/Attribute:related_change_ref+' => '',
-	'Class:ResponseTicket/Attribute:close_date' => 'Closed',
-	'Class:ResponseTicket/Attribute:close_date+' => '',
-	'Class:ResponseTicket/Attribute:last_update' => 'Last update',
-	'Class:ResponseTicket/Attribute:last_update+' => '',
-	'Class:ResponseTicket/Attribute:assignment_date' => 'Assigned',
-	'Class:ResponseTicket/Attribute:assignment_date+' => '',
-	'Class:ResponseTicket/Attribute:tto_escalation_deadline' => 'TTO Escalation deadline',
-	'Class:ResponseTicket/Attribute:tto_escalation_deadline+' => '',
-	'Class:ResponseTicket/Attribute:ttr_escalation_deadline' => 'TTR Escalation deadline',
-	'Class:ResponseTicket/Attribute:ttr_escalation_deadline+' => '',
-	'Class:ResponseTicket/Attribute:closure_deadline' => 'Closure deadline',
-	'Class:ResponseTicket/Attribute:closure_deadline+' => '',
-	'Class:ResponseTicket/Attribute:resolution_code' => 'Resolution code',
-	'Class:ResponseTicket/Attribute:resolution_code+' => '',
-	'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce' => 'Could not be reproduced',
-	'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce+' => '',
-	'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate' => 'Duplicate ticket',
-	'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate+' => '',
-	'Class:ResponseTicket/Attribute:resolution_code/Value:fixed' => 'Fixed',
-	'Class:ResponseTicket/Attribute:resolution_code/Value:fixed+' => '',
-	'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant' => 'Irrelevant',
-	'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant+' => '',
-	'Class:ResponseTicket/Attribute:solution' => 'Solution',
-	'Class:ResponseTicket/Attribute:solution+' => '',
-	'Class:ResponseTicket/Attribute:user_satisfaction' => 'User satisfaction',
-	'Class:ResponseTicket/Attribute:user_satisfaction+' => '',
-	'Class:ResponseTicket/Attribute:user_satisfaction/Value:1' => '1',
-	'Class:ResponseTicket/Attribute:user_satisfaction/Value:1+' => '1',
-	'Class:ResponseTicket/Attribute:user_satisfaction/Value:2' => '2',
-	'Class:ResponseTicket/Attribute:user_satisfaction/Value:2+' => '2',
-	'Class:ResponseTicket/Attribute:user_satisfaction/Value:3' => '3',
-	'Class:ResponseTicket/Attribute:user_satisfaction/Value:3+' => '3',
-	'Class:ResponseTicket/Attribute:user_satisfaction/Value:4' => '4',
-	'Class:ResponseTicket/Attribute:user_satisfaction/Value:4+' => '4',
-	'Class:ResponseTicket/Attribute:user_commment' => 'User comment',
-	'Class:ResponseTicket/Attribute:user_commment+' => '',
-	'Class:ResponseTicket/Stimulus:ev_assign' => 'Assign',
-	'Class:ResponseTicket/Stimulus:ev_assign+' => '',
-	'Class:ResponseTicket/Stimulus:ev_reassign' => 'Reassign',
-	'Class:ResponseTicket/Stimulus:ev_reassign+' => '',
-	'Class:ResponseTicket/Stimulus:ev_timeout' => 'ev_timeout',
-	'Class:ResponseTicket/Stimulus:ev_timeout+' => '',
-	'Class:ResponseTicket/Stimulus:ev_resolve' => 'Mark a resolved',
-	'Class:ResponseTicket/Stimulus:ev_resolve+' => '',
-	'Class:ResponseTicket/Stimulus:ev_close' => 'Close',
-	'Class:ResponseTicket/Stimulus:ev_close+' => '',
-));
+Dict::Add('EN US', 'English', 'English', array(
+	'Class:ResponseTicket' => 'ResponseTicket',
+	'Class:ResponseTicket+' => '',
+	'Class:ResponseTicket/Attribute:status' => 'Status',
+	'Class:ResponseTicket/Attribute:status+' => '',
+	'Class:ResponseTicket/Attribute:status/Value:new' => 'New',
+	'Class:ResponseTicket/Attribute:status/Value:new+' => 'newly opened',
+	'Class:ResponseTicket/Attribute:status/Value:escalated_tto' => 'Escalation/TTO',
+	'Class:ResponseTicket/Attribute:status/Value:escalated_tto+' => '',
+	'Class:ResponseTicket/Attribute:status/Value:assigned' => 'Assigned',
+	'Class:ResponseTicket/Attribute:status/Value:assigned+' => '',
+	'Class:ResponseTicket/Attribute:status/Value:escalated_ttr' => 'Escalation/TTR',
+	'Class:ResponseTicket/Attribute:status/Value:escalated_ttr+' => '',
+	'Class:ResponseTicket/Attribute:status/Value:frozen' => 'Pending',
+	'Class:ResponseTicket/Attribute:status/Value:frozen+' => '',
+	'Class:ResponseTicket/Attribute:status/Value:resolved' => 'Resolved',
+	'Class:ResponseTicket/Attribute:status/Value:resolved+' => '',
+	'Class:ResponseTicket/Attribute:status/Value:closed' => 'Closed',
+	'Class:ResponseTicket/Attribute:status/Value:closed+' => '',
+	'Class:ResponseTicket/Attribute:caller_id' => 'Caller',
+	'Class:ResponseTicket/Attribute:caller_id+' => '',
+	'Class:ResponseTicket/Attribute:caller_email' => 'Email',
+	'Class:ResponseTicket/Attribute:caller_email+' => '',
+	'Class:ResponseTicket/Attribute:org_id' => 'Customer',
+	'Class:ResponseTicket/Attribute:org_id+' => '',
+	'Class:ResponseTicket/Attribute:org_name' => 'Customer',
+	'Class:ResponseTicket/Attribute:org_name+' => '',
+	'Class:ResponseTicket/Attribute:service_id' => 'Service',
+	'Class:ResponseTicket/Attribute:service_id+' => '',
+	'Class:ResponseTicket/Attribute:service_name' => 'Name',
+	'Class:ResponseTicket/Attribute:service_name+' => '',
+	'Class:ResponseTicket/Attribute:servicesubcategory_id' => 'Service element',
+	'Class:ResponseTicket/Attribute:servicesubcategory_id+' => '',
+	'Class:ResponseTicket/Attribute:servicesubcategory_name' => 'Name',
+	'Class:ResponseTicket/Attribute:servicesubcategory_name+' => '',
+	'Class:ResponseTicket/Attribute:product' => 'Product',
+	'Class:ResponseTicket/Attribute:product+' => '',
+	'Class:ResponseTicket/Attribute:impact' => 'Impact',
+	'Class:ResponseTicket/Attribute:impact+' => '',
+	'Class:ResponseTicket/Attribute:impact/Value:1' => 'A person',
+	'Class:ResponseTicket/Attribute:impact/Value:1+' => '',
+	'Class:ResponseTicket/Attribute:impact/Value:2' => 'A service',
+	'Class:ResponseTicket/Attribute:impact/Value:2+' => '',
+	'Class:ResponseTicket/Attribute:impact/Value:3' => 'A department',
+	'Class:ResponseTicket/Attribute:impact/Value:3+' => '',
+	'Class:ResponseTicket/Attribute:urgency' => 'Urgency',
+	'Class:ResponseTicket/Attribute:urgency+' => '',
+	'Class:ResponseTicket/Attribute:urgency/Value:1' => 'Low',
+	'Class:ResponseTicket/Attribute:urgency/Value:1+' => '',
+	'Class:ResponseTicket/Attribute:urgency/Value:2' => 'Medium',
+	'Class:ResponseTicket/Attribute:urgency/Value:2+' => '',
+	'Class:ResponseTicket/Attribute:urgency/Value:3' => 'High',
+	'Class:ResponseTicket/Attribute:urgency/Value:3+' => '',
+	'Class:ResponseTicket/Attribute:priority' => 'Priority',
+	'Class:ResponseTicket/Attribute:priority+' => '',
+	'Class:ResponseTicket/Attribute:priority/Value:1' => 'Low',
+	'Class:ResponseTicket/Attribute:priority/Value:1+' => '',
+	'Class:ResponseTicket/Attribute:priority/Value:2' => 'Medium',
+	'Class:ResponseTicket/Attribute:priority/Value:2+' => '',
+	'Class:ResponseTicket/Attribute:priority/Value:3' => 'High',
+	'Class:ResponseTicket/Attribute:priority/Value:3+' => '',
+	'Class:ResponseTicket/Attribute:workgroup_id' => 'Workgroup',
+	'Class:ResponseTicket/Attribute:workgroup_id+' => '',
+	'Class:ResponseTicket/Attribute:workgroup_name' => 'Workgroup',
+	'Class:ResponseTicket/Attribute:workgroup_name+' => '',
+	'Class:ResponseTicket/Attribute:agent_id' => 'Agent',
+	'Class:ResponseTicket/Attribute:agent_id+' => '',
+	'Class:ResponseTicket/Attribute:agent_name' => 'Agent',
+	'Class:ResponseTicket/Attribute:agent_name+' => '',
+	'Class:ResponseTicket/Attribute:agent_email' => 'Agent email',
+	'Class:ResponseTicket/Attribute:agent_email+' => '',
+	'Class:ResponseTicket/Attribute:related_problem_id' => 'Related Problem',
+	'Class:ResponseTicket/Attribute:related_problem_id+' => '',
+	'Class:ResponseTicket/Attribute:related_problem_ref' => 'Ref',
+	'Class:ResponseTicket/Attribute:related_problem_ref+' => '',
+	'Class:ResponseTicket/Attribute:related_change_id' => 'Related change',
+	'Class:ResponseTicket/Attribute:related_change_id+' => '',
+	'Class:ResponseTicket/Attribute:related_change_ref' => 'Related change',
+	'Class:ResponseTicket/Attribute:related_change_ref+' => '',
+	'Class:ResponseTicket/Attribute:close_date' => 'Closed',
+	'Class:ResponseTicket/Attribute:close_date+' => '',
+	'Class:ResponseTicket/Attribute:last_update' => 'Last update',
+	'Class:ResponseTicket/Attribute:last_update+' => '',
+	'Class:ResponseTicket/Attribute:assignment_date' => 'Assignment Date ',
+	'Class:ResponseTicket/Attribute:assignment_date+' => '',
+	'Class:ResponseTicket/Attribute:resolution_date' => 'Resolution Date',
+	'Class:ResponseTicket/Attribute:resolution_date+' => '',
+	'Class:ResponseTicket/Attribute:tto_escalation_deadline' => 'TTO Escalation deadline',
+	'Class:ResponseTicket/Attribute:tto_escalation_deadline+' => '',
+	'Class:ResponseTicket/Attribute:ttr_escalation_deadline' => 'TTR Escalation deadline',
+	'Class:ResponseTicket/Attribute:ttr_escalation_deadline+' => '',
+	'Class:ResponseTicket/Attribute:closure_deadline' => 'Closure deadline',
+	'Class:ResponseTicket/Attribute:closure_deadline+' => '',
+	'Class:ResponseTicket/Attribute:resolution_code' => 'Resolution code',
+	'Class:ResponseTicket/Attribute:resolution_code+' => '',
+	'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce' => 'Could not be reproduced',
+	'Class:ResponseTicket/Attribute:resolution_code/Value:couldnotreproduce+' => '',
+	'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate' => 'Duplicate ticket',
+	'Class:ResponseTicket/Attribute:resolution_code/Value:duplicate+' => '',
+	'Class:ResponseTicket/Attribute:resolution_code/Value:fixed' => 'Fixed',
+	'Class:ResponseTicket/Attribute:resolution_code/Value:fixed+' => '',
+	'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant' => 'Irrelevant',
+	'Class:ResponseTicket/Attribute:resolution_code/Value:irrelevant+' => '',
+	'Class:ResponseTicket/Attribute:solution' => 'Solution',
+	'Class:ResponseTicket/Attribute:solution+' => '',
+	'Class:ResponseTicket/Attribute:user_satisfaction' => 'User satisfaction',
+	'Class:ResponseTicket/Attribute:user_satisfaction+' => '',
+	'Class:ResponseTicket/Attribute:user_satisfaction/Value:1' => 'Bad',
+	'Class:ResponseTicket/Attribute:user_satisfaction/Value:1+' => 'Bad',
+	'Class:ResponseTicket/Attribute:user_satisfaction/Value:2' => 'Average',
+	'Class:ResponseTicket/Attribute:user_satisfaction/Value:2+' => 'Average',
+	'Class:ResponseTicket/Attribute:user_satisfaction/Value:3' => 'Good',
+	'Class:ResponseTicket/Attribute:user_satisfaction/Value:3+' => 'Good',
+	'Class:ResponseTicket/Attribute:user_satisfaction/Value:4' => 'Very Good',
+	'Class:ResponseTicket/Attribute:user_satisfaction/Value:4+' => 'Very Good',
+	'Class:ResponseTicket/Attribute:user_commment' => 'User comment',
+	'Class:ResponseTicket/Attribute:user_commment+' => '',
+	'Class:ResponseTicket/Stimulus:ev_assign' => 'Assign',
+	'Class:ResponseTicket/Stimulus:ev_assign+' => '',
+	'Class:ResponseTicket/Stimulus:ev_reassign' => 'Reassign',
+	'Class:ResponseTicket/Stimulus:ev_reassign+' => '',
+	'Class:ResponseTicket/Stimulus:ev_timeout' => 'Escalation',
+	'Class:ResponseTicket/Stimulus:ev_timeout+' => '',
+	'Class:ResponseTicket/Stimulus:ev_resolve' => 'Mark a resolved',
+	'Class:ResponseTicket/Stimulus:ev_resolve+' => '',
+	'Class:ResponseTicket/Stimulus:ev_close' => 'Close',
+	'Class:ResponseTicket/Stimulus:ev_close+' => '',
+));
+
+
 
 
 ?>

+ 28 - 12
modules/itop-tickets-1.0.0/model.itop-tickets.php

@@ -51,8 +51,9 @@ abstract class Ticket extends cmdbAbstractObject
 		MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("document_list", array("linked_class"=>"lnkTicketToDoc", "ext_key_to_me"=>"ticket_id", "ext_key_to_remote"=>"document_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("ci_list", array("linked_class"=>"lnkTicketToCI", "ext_key_to_me"=>"ticket_id", "ext_key_to_remote"=>"ci_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("contact_list", array("linked_class"=>"lnkTicketToContact", "ext_key_to_me"=>"ticket_id", "ext_key_to_remote"=>"contact_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("incident_list", array("linked_class"=>"lnkTicketToIncident", "ext_key_to_me"=>"ticket_id", "ext_key_to_remote"=>"incident_id", "allowed_values"=>null, "count_min"=>0, "count_max"=>0, "depends_on"=>array())));
 
-		MetaModel::Init_SetZListItems('details', array('ref', 'title', 'description', 'ticket_log', 'start_date', 'document_list', 'ci_list', 'contact_list'));
+		MetaModel::Init_SetZListItems('details', array('ref', 'title', 'description', 'ticket_log', 'start_date', 'document_list', 'ci_list', 'contact_list','incident_list'));
 		MetaModel::Init_SetZListItems('advanced_search', array('finalclass', 'ref', 'title', 'ticket_log', 'start_date'));
 		MetaModel::Init_SetZListItems('standard_search', array('finalclass', 'ref', 'title', 'ticket_log', 'start_date'));
 		MetaModel::Init_SetZListItems('list', array('finalclass', 'ref', 'title', 'ticket_log', 'start_date'));
@@ -69,7 +70,7 @@ class lnkTicketToDoc extends cmdbAbstractObject
 			"key_type" => "autoincrement",
 			"name_attcode" => "ticket_id",
 			"state_attcode" => "",
-			"reconc_keys" => array(),
+			"reconc_keys" => array("ticket_id","document_id"),
 			"db_table" => "lnktickettodoc",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
@@ -100,7 +101,7 @@ class lnkTicketToContact extends cmdbAbstractObject
 			"key_type" => "autoincrement",
 			"name_attcode" => "ticket_id",
 			"state_attcode" => "",
-			"reconc_keys" => array(),
+			"reconc_keys" => array("ticket_id","contact_id"),
 			"db_table" => "lnktickettocontact",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
@@ -133,7 +134,7 @@ class lnkTicketToCI extends cmdbAbstractObject
 			"key_type" => "autoincrement",
 			"name_attcode" => "ticket_id",
 			"state_attcode" => "",
-			"reconc_keys" => array(),
+			"reconc_keys" => array("ticket_id","ci_id"),
 			"db_table" => "lnktickettoci",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
@@ -147,11 +148,12 @@ class lnkTicketToCI extends cmdbAbstractObject
 		MetaModel::Init_AddAttribute(new AttributeExternalKey("ci_id", array("targetclass"=>"FunctionalCI", "jointype"=>null, "allowed_values"=>null, "sql"=>"ci_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("ci_name", array("allowed_values"=>null, "extkey_attcode"=>"ci_id", "target_attcode"=>"name", "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeExternalField("ci_status", array("allowed_values"=>null, "extkey_attcode"=>"ci_id", "target_attcode"=>"status", "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeString("impact", array("allowed_values"=>null, "sql"=>"impact", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
 
-		MetaModel::Init_SetZListItems('details', array('ticket_id', 'ci_id', 'ci_status'));
+		MetaModel::Init_SetZListItems('details', array('ticket_id', 'ci_id', 'impact','ci_status'));
 		MetaModel::Init_SetZListItems('advanced_search', array('ticket_id', 'ci_id', 'ci_status'));
 		MetaModel::Init_SetZListItems('standard_search', array('ticket_id', 'ci_id', 'ci_status'));
-		MetaModel::Init_SetZListItems('list', array('ticket_id', 'ci_id', 'ci_status'));
+		MetaModel::Init_SetZListItems('list', array('ticket_id', 'ci_id', 'impact','ci_status'));
 	}
 }
 
@@ -201,6 +203,7 @@ abstract class ResponseTicket extends Ticket
 		MetaModel::Init_AddAttribute(new AttributeDateTime("close_date", array("allowed_values"=>null, "sql"=>"close_date", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeDateTime("last_update", array("allowed_values"=>null, "sql"=>"last_update", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeDateTime("assignment_date", array("allowed_values"=>null, "sql"=>"assignment_date", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
+		MetaModel::Init_AddAttribute(new AttributeDateTime("resolution_date", array("allowed_values"=>null, "sql"=>"resolution_date", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeDeadline("tto_escalation_deadline", array("allowed_values"=>null, "sql"=>"tto_escalation_deadline", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeDeadline("ttr_escalation_deadline", array("allowed_values"=>null, "sql"=>"ttr_escalation_deadline", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
 		MetaModel::Init_AddAttribute(new AttributeDeadline("closure_deadline", array("allowed_values"=>null, "sql"=>"closure_deadline", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
@@ -211,8 +214,8 @@ abstract class ResponseTicket extends Ticket
 
 		MetaModel::Init_SetZListItems('details', array('ref', 'title', 'org_id', 'ticket_log', 'start_date', 'tto_escalation_deadline', 'ttr_escalation_deadline', 'closure_deadline', 'document_list', 'ci_list', 'contact_list', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'last_update', 'assignment_date', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment'));
 		MetaModel::Init_SetZListItems('advanced_search', array('finalclass', 'ref', 'title', 'org_id', 'start_date', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'last_update', 'assignment_date', 'tto_escalation_deadline', 'ttr_escalation_deadline', 'closure_deadline', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment'));
-		MetaModel::Init_SetZListItems('standard_search', array('finalclass', 'ref', 'title', 'org_id', 'start_date', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'last_update', 'assignment_date', 'tto_escalation_deadline', 'ttr_escalation_deadline', 'closure_deadline', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment'));
-		MetaModel::Init_SetZListItems('list', array('finalclass', 'ref', 'title', 'org_id', 'start_date', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'last_update', 'assignment_date', 'tto_escalation_deadline', 'ttr_escalation_deadline', 'closure_deadline', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment'));
+		MetaModel::Init_SetZListItems('standard_search', array('finalclass', 'ref', 'title', 'org_id', 'start_date', 'status', 'caller_id', 'service_id', 'servicesubcategory_id', 'product', 'impact', 'urgency', 'priority', 'workgroup_id', 'agent_id', 'agent_email', 'related_problem_id', 'related_change_id', 'close_date', 'resolution_code', 'solution', 'user_satisfaction', 'user_commment'));
+		MetaModel::Init_SetZListItems('list', array('finalclass', 'ref', 'title', 'org_id', 'start_date', 'status', 'caller_id', 'service_id', 'priority', 'workgroup_id', 'agent_id', 'last_update'));
 
 		// Lifecycle
 		MetaModel::Init_DefineState(
@@ -229,6 +232,7 @@ abstract class ResponseTicket extends Ticket
 					'start_date' => OPT_ATT_READONLY,
 					'last_update' => OPT_ATT_READONLY,
 					'assignment_date' => OPT_ATT_HIDDEN,
+					'resolution_date' => OPT_ATT_HIDDEN,
 					'tto_escalation_deadline' => OPT_ATT_READONLY,
 					'ttr_escalation_deadline' => OPT_ATT_HIDDEN,
 					'closure_deadline' => OPT_ATT_HIDDEN,
@@ -273,6 +277,8 @@ abstract class ResponseTicket extends Ticket
 					'workgroup_id' => OPT_ATT_MUSTPROMPT | OPT_ATT_MANDATORY,
 					'tto_escalation_deadline' => OPT_ATT_HIDDEN,
 					'ttr_escalation_deadline' => OPT_ATT_READONLY,
+					'related_problem_id' => OPT_ATT_MUSTPROMPT,
+//					'related_change_id' => OPT_ATT_MUSTPROMPT,
 				),
 			)
 		);
@@ -336,17 +342,17 @@ abstract class ResponseTicket extends Ticket
 		MetaModel::Init_DefineStimulus(new StimulusUserAction("ev_resolve", array()));
 		MetaModel::Init_DefineStimulus(new StimulusUserAction("ev_close", array()));
 
-		MetaModel::Init_DefineTransition("new", "ev_assign", array("target_state"=>"assigned", "actions"=>array(), "user_restriction"=>null));
+		MetaModel::Init_DefineTransition("new", "ev_assign", array("target_state"=>"assigned", "actions"=>array('SetAssignedDate'), "user_restriction"=>null));
 		MetaModel::Init_DefineTransition("new", "ev_timeout", array("target_state"=>"escalated_tto", "actions"=>array(), "user_restriction"=>null));
 
-		MetaModel::Init_DefineTransition("escalated_tto", "ev_assign", array("target_state"=>"assigned", "actions"=>array(), "user_restriction"=>null));
+		MetaModel::Init_DefineTransition("escalated_tto", "ev_assign", array("target_state"=>"assigned", "actions"=>array('SetAssignedDate'), "user_restriction"=>null));
 
 		MetaModel::Init_DefineTransition("assigned", "ev_reassign", array("target_state"=>"assigned", "actions"=>array(), "user_restriction"=>null));
 		MetaModel::Init_DefineTransition("assigned", "ev_timeout", array("target_state"=>"escalated_ttr", "actions"=>array(), "user_restriction"=>null));
-		MetaModel::Init_DefineTransition("assigned", "ev_resolve", array("target_state"=>"resolved", "actions"=>array('SetClosureDeadline'), "user_restriction"=>null));
+		MetaModel::Init_DefineTransition("assigned", "ev_resolve", array("target_state"=>"resolved", "actions"=>array('SetResolveDate','SetClosureDeadline'), "user_restriction"=>null));
 
 		MetaModel::Init_DefineTransition("escalated_ttr", "ev_reassign", array("target_state"=>"escalated_ttr", "actions"=>array(), "user_restriction"=>null));
-		MetaModel::Init_DefineTransition("escalated_ttr", "ev_resolve", array("target_state"=>"resolved", "actions"=>array('SetClosureDeadline'), "user_restriction"=>null));
+		MetaModel::Init_DefineTransition("escalated_ttr", "ev_resolve", array("target_state"=>"resolved", "actions"=>array('SetResolveDate','SetClosureDeadline'), "user_restriction"=>null));
 
 		MetaModel::Init_DefineTransition("resolved", "ev_reassign", array("target_state"=>"assigned", "actions"=>array(), "user_restriction"=>null));
 		MetaModel::Init_DefineTransition("resolved", "ev_close", array("target_state"=>"closed", "actions"=>array('SetClosureDate'), "user_restriction"=>null));
@@ -360,6 +366,16 @@ abstract class ResponseTicket extends Ticket
 		$this->Set('closure_deadline', time() + $iMaxWaitHours * 3600);
 		return true;
 	}
+	public function SetAssignedDate($sStimulusCode)
+	{
+		$this->Set('assignment_date', time());
+		return true;
+	}
+	public function SetResolveDate($sStimulusCode)
+	{
+		$this->Set('resolution_date', time());
+		return true;
+	}
 	public function SetClosureDate($sStimulusCode)
 	{
 		$this->Set('close_date', time());

+ 1 - 1
modules/itop-tickets-1.0.0/module.itop-tickets.php

@@ -26,7 +26,7 @@ SetupWebPage::AddModule(
 		'dictionary' => array(
 			'en.dict.itop-tickets.php',
 			'fr.dict.itop-tickets.php',
-			'es_cr.dict.itop-tickets.php',
+//			'es_cr.dict.itop-tickets.php',
 		),
 		'data.struct' => array(
 			'data.struct.ta-triggers.xml',