Ticket an einen speziellen Agent weiterreichen

Hilfe zu Znuny Problemen aller Art
Locked
blackfox
Znuny expert
Posts: 187
Joined: 23 Jan 2006, 18:48
Znuny Version: 0

Ticket an einen speziellen Agent weiterreichen

Post by blackfox »

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
schocker
Znuny advanced
Posts: 111
Joined: 16 Dec 2005, 14:01
Location: Schömberg

Post by schocker »

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 :wink:
blackfox
Znuny expert
Posts: 187
Joined: 23 Jan 2006, 18:48
Znuny Version: 0

Post by blackfox »

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
schocker
Znuny advanced
Posts: 111
Joined: 16 Dec 2005, 14:01
Location: Schömberg

Post by schocker »

Ich werds für dich zusammenstellen.

Kann aber n bißchen dauern
schocker
Znuny advanced
Posts: 111
Joined: 16 Dec 2005, 14:01
Location: Schömberg

Post by schocker »

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
schocker
Znuny advanced
Posts: 111
Joined: 16 Dec 2005, 14:01
Location: Schömberg

Post by schocker »

Wenn du das hinbekommst, wäre es nett, wenn du es ins Wiki schreiben könntest, bzw hier posten :lol:


Gruß Lothar
blackfox
Znuny expert
Posts: 187
Joined: 23 Jan 2006, 18:48
Znuny Version: 0

Post by blackfox »

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.
darkside

Post by darkside »

Solche Sachen dann bitte auch als DIFF posten ... macht sich einfacher als abtippen.

(Ja Ja, ich weiß ... Copy&Paste gibbet auch noch ... aber nicht immer gut möglich :))
RBS2002
Znuny newbie
Posts: 11
Joined: 22 Jul 2008, 12:56

Ticket an einen speziellen Agent weiterreichen

Post by RBS2002 »

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:

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;
vielen vielen vielen...... Dank im Voraus für jeden Hinweis,
mfG RBS2002
Locked