Ticket an einen speziellen Agent weiterreichen
Ticket an einen speziellen Agent weiterreichen
für uns könnte es unter Umständen relevant sein, bestimmte Tickets an einen bestimmten Agenten zuzuweisen (Spezialwissen). Das über eine neue Unterqueue zu machen wäre Overskilled bzw. Schwachsinn!
Was ich bisher gefunden habe ist die Möglichkeit den Besitzer eines Tickets zu ändern, was mich daran aber stört ist, dass das nicht über eine Sammelaktion machbar ist. Die Sammelaktion-Funktion finde ich nebenbei bemerkt eh weniger gut implementiert.
Gibt es neben Besitzer ändern eine Möglichkeit ein Ticket einem bestimmten Agenten zuzuordnen? oder kann man die Besitzer-ändern-funktion irgendwie zu den Sammelaktionen aufnehmen?
--
Gruß Ralf
Was ich bisher gefunden habe ist die Möglichkeit den Besitzer eines Tickets zu ändern, was mich daran aber stört ist, dass das nicht über eine Sammelaktion machbar ist. Die Sammelaktion-Funktion finde ich nebenbei bemerkt eh weniger gut implementiert.
Gibt es neben Besitzer ändern eine Möglichkeit ein Ticket einem bestimmten Agenten zuzuordnen? oder kann man die Besitzer-ändern-funktion irgendwie zu den Sammelaktionen aufnehmen?
--
Gruß Ralf
Das wäre bestimmt möglich, in der sammelaktion zu implementieren.
Hab aber leider wenig Zeit.
Zum Beispiel ist bei uns auch das Ticket Mergen in der Sammelaktion hizugefügt worden.
Eine andere Möglichkeit wäre der Generic Agent im Admin Interface.
(Wenn Text ="" dann neuer Besitzer)
oder zumindest so ähnlich
Hab aber leider wenig Zeit.
Zum Beispiel ist bei uns auch das Ticket Mergen in der Sammelaktion hizugefügt worden.
Eine andere Möglichkeit wäre der Generic Agent im Admin Interface.
(Wenn Text ="" dann neuer Besitzer)
oder zumindest so ähnlich

hm, gibt es vielleicht Anhaltspunkte wie das zu implementieren ist? Wenn es nicht allzuschwer ist könnte ich es vielleicht selber probieren. Sofern du vielleicht den Code hast um die Merge-Funktion einzubinden (mit Info wo der ist) könnte ich mal schauen ob ich das entsprechend anpassen kann...
Weiß aber nicht wieviel aufwand diese Infos für dich darstellen würden bzw. ob du das grad überhaupt alles findest...
Gruß Ralf
Weiß aber nicht wieviel aufwand diese Infos für dich darstellen würden bzw. ob du das grad überhaupt alles findest...
Gruß Ralf
So, hier ne kurze Anleitung.
Zeilen die mit ++ beginnen wurden hinzugefügt
Zeilen die mit -- beginnen wurden auskommentiert
Wenn nix davor ist, ist es original Code
Die Zeilenangaben stimmen nicht unbedingt bei dir.
Mußt halt manchmal in der Datei nach der Stelle suchen.
deshalb sind auch Teile des Original Codes dabei.
Änderung in der AgentTicketBulk.dtl
@@ -96,6 +96,11 @@
<td class="contentkey">$Text{"Unlock Tickets"}:</td>
<td class="contentvalue">$Data{"UnlockYesNoOption"}</td>
</tr>
+ <tr>
+ <td class="contentkey">$Text{"Merge to:"}:</td>
+ <td class="contentvalue"><input type="text" name="MainTicket" size="30"></td>
+ </tr>
+
</table>
<input class="button" accesskey="g" type="submit" value="$Text{"submit"}" onclick="return submit_compose();">
</form>
Änderungen in der AgentTicketBulk.pm
@@ -63,6 +63,8 @@
}
$Output = $Self->{LayoutObject}->Header();
# process tickets
+ # tag for merge feature
+ my $merged = 0;
foreach (@TicketIDs) {
my %Ticket = $Self->{TicketObject}->TicketGet(TicketID => $_);
# check permissions
@@ -125,7 +127,7 @@
my $ArticleTypeID = $Self->{ParamObject}->GetParam(Param => 'ArticleTypeID') || '';
my $ArticleType = $Self->{ParamObject}->GetParam(Param => 'ArticleType') || '';
- if (($Subject || $Body) && ($ArticleTypeID||$ArticleType)) {
+ if (($Subject || $Body) && ($ArticleTypeID||$ArticleType) && ! $merged ) {
my $ArticleID = $Self->{TicketObject}->ArticleCreate(
TicketID => $_,
ArticleTypeID => $ArticleTypeID,
@@ -163,6 +165,20 @@
);
}
}
+ # merge
+ my $MainTicket = $Self->{ParamObject}->GetParam(Param => 'MainTicket') || '';
+ my $MainTicketID = $Self->{TicketObject}->TicketIDLookup( TicketNumber => $MainTicket ,
+ UserID => $Self->{UserID} ) || '';
+
+ if( $MainTicketID ) {
+ if( $_ == $MainTicketID || !$Self->{TicketObject}->TicketMerge(MainTicketID => $MainTicketID, MergeTicketID => $_, UserID => $Self->{UserID})) {
+ $Output .= $Self->{LayoutObject}->Notify( Info =>
+ "Can't Merge $_ to $_" );
+ }
+ else {
+ $merged = 1;
+ }
+ }
# Should I unlock tickets at user request?
if ($Self->{ParamObject}->GetParam(Param => 'Unlock')) {
$Self->{TicketObject}->LockSet(
----------------
Ich hoffe es ist verständlich.
Gruß
Lothar
Zeilen die mit ++ beginnen wurden hinzugefügt
Zeilen die mit -- beginnen wurden auskommentiert
Wenn nix davor ist, ist es original Code
Die Zeilenangaben stimmen nicht unbedingt bei dir.
Mußt halt manchmal in der Datei nach der Stelle suchen.
deshalb sind auch Teile des Original Codes dabei.
Änderung in der AgentTicketBulk.dtl
@@ -96,6 +96,11 @@
<td class="contentkey">$Text{"Unlock Tickets"}:</td>
<td class="contentvalue">$Data{"UnlockYesNoOption"}</td>
</tr>
+ <tr>
+ <td class="contentkey">$Text{"Merge to:"}:</td>
+ <td class="contentvalue"><input type="text" name="MainTicket" size="30"></td>
+ </tr>
+
</table>
<input class="button" accesskey="g" type="submit" value="$Text{"submit"}" onclick="return submit_compose();">
</form>
Änderungen in der AgentTicketBulk.pm
@@ -63,6 +63,8 @@
}
$Output = $Self->{LayoutObject}->Header();
# process tickets
+ # tag for merge feature
+ my $merged = 0;
foreach (@TicketIDs) {
my %Ticket = $Self->{TicketObject}->TicketGet(TicketID => $_);
# check permissions
@@ -125,7 +127,7 @@
my $ArticleTypeID = $Self->{ParamObject}->GetParam(Param => 'ArticleTypeID') || '';
my $ArticleType = $Self->{ParamObject}->GetParam(Param => 'ArticleType') || '';
- if (($Subject || $Body) && ($ArticleTypeID||$ArticleType)) {
+ if (($Subject || $Body) && ($ArticleTypeID||$ArticleType) && ! $merged ) {
my $ArticleID = $Self->{TicketObject}->ArticleCreate(
TicketID => $_,
ArticleTypeID => $ArticleTypeID,
@@ -163,6 +165,20 @@
);
}
}
+ # merge
+ my $MainTicket = $Self->{ParamObject}->GetParam(Param => 'MainTicket') || '';
+ my $MainTicketID = $Self->{TicketObject}->TicketIDLookup( TicketNumber => $MainTicket ,
+ UserID => $Self->{UserID} ) || '';
+
+ if( $MainTicketID ) {
+ if( $_ == $MainTicketID || !$Self->{TicketObject}->TicketMerge(MainTicketID => $MainTicketID, MergeTicketID => $_, UserID => $Self->{UserID})) {
+ $Output .= $Self->{LayoutObject}->Notify( Info =>
+ "Can't Merge $_ to $_" );
+ }
+ else {
+ $merged = 1;
+ }
+ }
# Should I unlock tickets at user request?
if ($Self->{ParamObject}->GetParam(Param => 'Unlock')) {
$Self->{TicketObject}->LockSet(
----------------
Ich hoffe es ist verständlich.
Gruß
Lothar
Danke! kann allerdings sein dass ich nicht so schnell dazu komme - mein Chef hat mcih gerade angewiesen anderes deutlich zu priorisieren, zumal ich noch nie perl programmiert habe 
Verständlich ist es, danke! Sobald ich dazu komme und erst recht wenn es klappt meld ich mich natürlich und poste es hier.

Verständlich ist es, danke! Sobald ich dazu komme und erst recht wenn es klappt meld ich mich natürlich und poste es hier.
Ticket an einen speziellen Agent weiterreichen
Hi,
auch wenn das thema etwas älter ist, aber ich wollte den Code gerade benutzen und leider funktioniert es nicht. Zum jetzigen Zeitpunkt ist es so das er bei den Tickets die zum zusammenfügen markiert wurden nur die Info ranhängt die bei der Sammelaktion eingetippt wurde (bei jeden einzelnen markierten Ticket, diese bleiben danach auch bestehen und werden nicht zusammengefügt).
Die System-Log im OTRS meldet auch keinen fehler (nur wenn ich vor dem Hauptticket an den diese angehangen werden sollen ein # vergesse meckert er das er eine ID benötigt. aber auch mit klappt es nicht und es wird nichts gemeldet).
Habe deshalb die ganze Prozedur dreimal wiederholt und es ist immer der gleiche Fehler.
Benutze derzeit die OTRS 2.0.4 Version mit Debian als Hauptbetriebssystem.
Hier einmal der code der AgentticketBulk.pm - ich hoffe das jemand den Fehler finden kann, ist leider sehr wichtig und ich bin im Moment auch etwas verzweifelt da ich nicht wirklich Perl kann und auch keinen anderen Weg wüsste dies anders zu schreiben:
vielen vielen vielen...... Dank im Voraus für jeden Hinweis,
mfG RBS2002
auch wenn das thema etwas älter ist, aber ich wollte den Code gerade benutzen und leider funktioniert es nicht. Zum jetzigen Zeitpunkt ist es so das er bei den Tickets die zum zusammenfügen markiert wurden nur die Info ranhängt die bei der Sammelaktion eingetippt wurde (bei jeden einzelnen markierten Ticket, diese bleiben danach auch bestehen und werden nicht zusammengefügt).
Die System-Log im OTRS meldet auch keinen fehler (nur wenn ich vor dem Hauptticket an den diese angehangen werden sollen ein # vergesse meckert er das er eine ID benötigt. aber auch mit klappt es nicht und es wird nichts gemeldet).
Habe deshalb die ganze Prozedur dreimal wiederholt und es ist immer der gleiche Fehler.
Benutze derzeit die OTRS 2.0.4 Version mit Debian als Hauptbetriebssystem.
Hier einmal der code der AgentticketBulk.pm - ich hoffe das jemand den Fehler finden kann, ist leider sehr wichtig und ich bin im Moment auch etwas verzweifelt da ich nicht wirklich Perl kann und auch keinen anderen Weg wüsste dies anders zu schreiben:
Code: Select all
# --
# Kernel/Modules/AgentTicketBulk.pm - to do bulk actions on tickets
# Copyright (C) 2001-2005 Martin Edenhofer <martin+code@otrs.org>
# --
# $Id: AgentTicketBulk.pm,v 1.4 2005/10/20 21:26:24 martin Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (GPL). If you
# did not receive this file, see http://www.gnu.org/licenses/gpl.txt.
# --
package Kernel::Modules::AgentTicketBulk;
use strict;
use Kernel::System::State;
use vars qw($VERSION);
$VERSION = '$Revision: 1.4 $';
$VERSION =~ s/^\$.*:\W(.*)\W.+?$/$1/;
# --
sub new {
my $Type = shift;
my %Param = @_;
# allocate new hash for object
my $Self = {};
bless ($Self, $Type);
foreach (keys %Param) {
$Self->{$_} = $Param{$_};
}
# check all needed objects
foreach (qw(ParamObject DBObject QueueObject LayoutObject ConfigObject LogObject)) {
if (!$Self->{$_}) {
$Self->{LayoutObject}->FatalError(Message => "Got no $_!");
}
}
$Self->{StateObject} = Kernel::System::State->new(%Param);
return $Self;
}
# --
sub Run {
my $Self = shift;
my %Param = @_;
my $Output;
# get involved tickets
my @TicketIDs = $Self->{ParamObject}->GetArray(Param => 'TicketIDs');
foreach (1..30) {
if ($Self->{ParamObject}->GetParam(Param => "TicketID$_")) {
push (@TicketIDs, $Self->{ParamObject}->GetParam(Param => "TicketID$_"));
}
}
# check needed stuff
if (!@TicketIDs) {
return $Self->{LayoutObject}->ErrorScreen(
Message => "No TicketID is given!",
Comment => 'You need min. one selected Ticket!',
);
}
$Output = $Self->{LayoutObject}->Header();
# process tickets
# tag for merge feature
my $merged = 0;
foreach my $TicketID (@TicketIDs) {
my %Ticket = $Self->{TicketObject}->TicketGet(TicketID => $TicketID);
# check permissions
if (!$Self->{TicketObject}->Permission(
Type => 'rw',
TicketID => $TicketID,
UserID => $Self->{UserID})) {
# error screen, don't show ticket
$Output .= $Self->{LayoutObject}->Notify(
Info => 'No access to %s!", "$Quote{"'.$Ticket{TicketNumber}.'"}',
);
}
else {
$Param{TicketIDHidden} .= "<input type='hidden' name='TicketIDs' value='$TicketID'>\n";
# show locked tickets
my $LockIt = 1;
if ($Self->{TicketObject}->LockIsTicketLocked(TicketID => $TicketID)) {
my ($OwnerID, $OwnerLogin) = $Self->{TicketObject}->OwnerCheck(
TicketID => $TicketID,
);
if ($OwnerID ne $Self->{UserID}) {
$LockIt = 0;
$Output .= $Self->{LayoutObject}->Notify(
Info => 'Ticket %s is locked for an other agent!", "$Quote{"'.$OwnerLogin.'"}',
);
}
}
if ($LockIt) {
# set lock
$Self->{TicketObject}->LockSet(
TicketID => $TicketID,
Lock => 'lock',
UserID => $Self->{UserID},
);
# set user id
$Self->{TicketObject}->OwnerSet(
TicketID => $TicketID,
UserID => $Self->{UserID},
NewUserID => $Self->{UserID},
);
$Output .= $Self->{LayoutObject}->Notify(
Info => 'Ticket %s locked.", "$Quote{"'.$Ticket{TicketNumber}.'"}',
);
# do some actions on tickets
if ($Self->{Subaction} eq 'Do') {
# set queue
my $QueueID = $Self->{ParamObject}->GetParam(Param => 'QueueID') || '';
my $Queue = $Self->{ParamObject}->GetParam(Param => 'Queue') || '';
if ($QueueID || $Queue) {
$Self->{TicketObject}->MoveTicket(
QueueID => $QueueID,
Queue => $Queue,
TicketID => $TicketID,
UserID => $Self->{UserID},
);
}
# add note
my $Subject = $Self->{ParamObject}->GetParam(Param => 'Subject') || '';
my $Body = $Self->{ParamObject}->GetParam(Param => 'Body') || '';
my $ArticleTypeID = $Self->{ParamObject}->GetParam(Param => 'ArticleTypeID') || '';
my $ArticleType = $Self->{ParamObject}->GetParam(Param => 'ArticleType') || '';
#if (($Subject || $Body) && ($ArticleTypeID||$ArticleType)) {
if (($Subject || $Body) && ($ArticleTypeID||$ArticleType) && ! $merged ) {
my $ArticleID = $Self->{TicketObject}->ArticleCreate(
TicketID => $TicketID,
ArticleTypeID => $ArticleTypeID,
ArticleType => $ArticleType,
SenderType => 'agent',
From => "$Self->{UserFirstname} $Self->{UserLastname} <$Self->{UserEmail}>",
Subject => $Subject,
Body => $Body,
ContentType => "text/plain; charset=$Self->{LayoutObject}->{'UserCharset'}",
UserID => $Self->{UserID},
HistoryType => 'AddNote',
HistoryComment => '%%Bulk',
);
}
# set state
my $StateID = $Self->{ParamObject}->GetParam(Param => 'StateID') || '';
my $State = $Self->{ParamObject}->GetParam(Param => 'State') || '';
if ($StateID || $State) {
$Self->{TicketObject}->StateSet(
TicketID => $TicketID,
StateID => $StateID,
State => $State,
UserID => $Self->{UserID},
);
my %Ticket = $Self->{TicketObject}->TicketGet(TicketID => $TicketID);
my %StateData = $Self->{TicketObject}->{StateObject}->StateGet(
ID => $Ticket{StateID},
);
# should I set an unlock?
if ($Ticket{StateType} =~ /^close/i) {
$Self->{TicketObject}->LockSet(
TicketID => $TicketID,
Lock => 'unlock',
UserID => $Self->{UserID},
);
}
}
# merge
my $MainTicket = $Self->{ParamObject}->GetParam(Param => 'MainTicket') || '';
my $MainTicketID = $Self->{TicketObject}->TicketIDLookup( TicketNumber => $MainTicket ,
UserID => $Self->{UserID} ) || '';
if( $MainTicketID ) {
if( $_ == $MainTicketID || !$Self->{TicketObject}->TicketMerge(MainTicketID => $MainTicketID, MergeTicketID => $_, UserID => $Self->{UserID})) {
$Output .= $Self->{LayoutObject}->Notify( Info =>
"Can't Merge $_ to $_" );
}
else {
$merged = 1;
}
}
# Should I unlock tickets at user request?
if ($Self->{ParamObject}->GetParam(Param => 'Unlock')) {
$Self->{TicketObject}->LockSet(
TicketID => $TicketID,
Lock => 'unlock',
UserID => $Self->{UserID},
);
}
}
}
}
}
if ($Self->{Subaction} eq 'Do') {
# redirect
return $Self->{LayoutObject}->Redirect(OP => $Self->{LastScreen});
}
else {
$Output .= $Self->_Mask(%Param);
$Output .= $Self->{LayoutObject}->Footer();
return $Output;
}
}
# --
sub _Mask {
my $Self = shift;
my %Param = @_;
# build ArticleTypeID string
my %DefaultNoteTypes = %{$Self->{ConfigObject}->Get('Ticket::Frontend::NoteTypes')};
my %NoteTypes = $Self->{DBObject}->GetTableData(
Table => 'article_type',
Valid => 1,
What => 'id, name'
);
foreach (keys %NoteTypes) {
if (!$DefaultNoteTypes{$NoteTypes{$_}}) {
delete $NoteTypes{$_};
}
}
$Param{'NoteStrg'} = $Self->{LayoutObject}->OptionStrgHashRef(
Data => \%NoteTypes,
Name => 'ArticleTypeID',
);
# build next states string
my %NextStates = $Self->{StateObject}->StateList(
Type => 'DefaultNextNote',
Action => $Self->{Action},
UserID => $Self->{UserID},
);
$NextStates{''} = '-';
$Param{'NextStatesStrg'} = $Self->{LayoutObject}->OptionStrgHashRef(
Data => \%NextStates,
Name => 'StateID',
);
# build move queue string
my %MoveQueues = $Self->{TicketObject}->MoveList(
UserID => $Self->{UserID},
Action => $Self->{Action},
Type => 'move_into',
);
$Param{MoveQueuesStrg} = $Self->{LayoutObject}->AgentQueueListOption(
Data => { %MoveQueues, '' => '-' },
Multiple => 0,
Size => 0,
Name => 'QueueID',
# SelectedID => $Self->{DestQueueID},
OnChangeSubmit => 0,
);
$Param{'UnlockYesNoOption'} = $Self->{LayoutObject}->OptionStrgHashRef(
Data => $Self->{ConfigObject}->Get('YesNoOptions'),
Name => 'Unlock',
SelectedID => 1,
);
# show spell check
if ($Self->{ConfigObject}->Get('SpellChecker')) {
$Self->{LayoutObject}->Block(
Name => 'SpellCheck',
Data => {},
);
}
# get output back
return $Self->{LayoutObject}->Output(TemplateFile => 'AgentTicketBulk', Data => \%Param);
}
# --
1;
mfG RBS2002