OTRS CVS - Handbuch
Prev | Chapter 25. Entwicklerhandbuch - OTRS Module schreiben | Next

# Ticketnummer Generator

Wenn Sie Ihr eigenes Format in der Ticketnummer nutzen wolen, erstellen Sie Ihr eigenes Ticketnummer-Modul.

Die Module befinden sich unter "Kernel/System/Ticket/Number/*.pm". Schauen Sie in der Konfigurationsdatei unter "Ticket number format" nach für die Standard-Module.

Ein Beispiel eines einfachen Ticketnummer-Moduls, speichern Sie es unter Kernel/System/Ticket/Number/Simple.pm. Sie benötigen nur zwei Funktionen, CreateTicketNr() and GetTNByString():

    # --
    # Ticket/Number/Simple.pm - a ticket number auto increment generator
    # Copyright (C) 2003 Hans Mueller mail@example.com
    # --
    # 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.
    # --
    # Note:
    # available objects are: ConfigObject, LogObject and DBObject
    #
    # Generates auto increment ticket numbers like ss.... (e. g. 1010138, 1010139, ...)
    # --

    package Kernel::System::Ticket::Number::Simple;

    use strict;

    use vars qw($VERSION);
    $VERSION = '$Revision: 1.5 $';
    $VERSION =~ s/^\$.*:\W(.*)\W.+?$/$1/;

    sub CreateTicketNr {
        my $Self = shift;
        my $JumpCounter = shift || 0;
        # get needed config options
        my $CounterLog = $Self->{ConfigObject}->Get('CounterLog');
        my $SystemID = $Self->{ConfigObject}->Get('SystemID');
        my $MinSize = 5;
        my $Count = 0;
        if (-f $CounterLog) {
            open (COUNTER, "< $CounterLog") || die "Can't open $CounterLog: $!";
            my $Line = <COUNTER>;
            ($Count) = split(/;/, $Line);
            close (COUNTER);
            if ($Self->{Debug} > 0) {
                $Self->{LogObject}->Log(
                  Priority => 'debug',
                  Message => "Read counter from $CounterLog: $Count",
                );
            }
        }
        # count auto increment ($Count++)
        $Count++;
        $Count = $Count + $JumpCounter;
        # write new count
        if (open (COUNTER, "> $CounterLog")) {
            flock (COUNTER, 2) || warn "Can't set file lock ($CounterLog): $!";
            print COUNTER $Count . "\n";
            close (COUNTER);
            if ($Self->{Debug} > 0) {
                $Self->{LogObject}->Log(
                  Priority => 'debug',
                  Message => "Write counter: $Count",
                );
            }
        }
        else {
            $Self->{LogObject}->Log(
                Priority => 'error',
                Message => "Can't write $CounterLog: $!",
            );
            die "Can't write $CounterLog: $!";
        }
        # pad ticket number with leading '0' to length $MinSize (config option)
        while (length($Count) < $MinSize) {
            $Count = "0".$Count;
        }
        # create new ticket number
        my $Tn = $SystemID . $Count;
        # Check ticket number. If exists generate new one!
        if ($Self->CheckTicketNr(Tn=>$Tn)) {
            $Self->{LoopProtectionCounter}++;
            if ($Self->{LoopProtectionCounter} >= 1000) {
              # loop protection
              $Self->{LogObject}->Log(
                Priority => 'error',
                Message => "CounterLoopProtection is now $Self->{LoopProtectionCounter}!".
                       " Stoped CreateTicketNr()!",
              );
              return;
            }
            # create new ticket number again
            $Self->{LogObject}->Log(
              Priority => 'notice',
              Message => "Tn ($Tn) exists! Creating new one.",
            );
            $Tn = $Self->CreateTicketNr($Self->{LoopProtectionCounter});
        }
        return $Tn;
    }
    # --
    sub GetTNByString {
        my $Self = shift;
        my $String = shift || return;
        # get needed config options
        my $SystemID = $Self->{ConfigObject}->Get('SystemID');
        my $TicketHook = $Self->{ConfigObject}->Get('TicketHook');
        my $TicketDivider = $Self->{ConfigObject}->Get('TicketDivider') || ': ';
        my $MinSize = 5;
        my $MaxSize = $MinSize + 5;
        # check ticket number
        if ($String =~ /$TicketHook:+.{0,1}($SystemID\d{$MinSize,$MaxSize})\-FW/i) {
            return $1;
        }
        else {
            if ($String =~ /$TicketHook:+.{0,1}($SystemID\d{$MinSize,$MaxSize})/i) {
                return $1;
            }
            else {
                return;
            }
        }
    }
    # --
    1;

Um dieses Modul zu nutzen, fürgen Sie Ihrer Kernel/Config.pm die folgenden Zeilen hinzu und starten Sie Ihren Webserver neu (falls Sie mod_perl benutzen):

        $Self->{TicketNumberGenerator} = 'Kernel::System::Ticket::Number::Simple';

Nun wird Ihr Ticketnummer-Modul genutzt.

Prev | Home | Next
Kunden-Oberfläche Benachrichtigungsmodule | Up | Module zur Authentifizierung von Agenten