Ticket Nummer

Hilfe zu Znuny Problemen aller Art
Locked
vTv4d3r
Znuny newbie
Posts: 11
Joined: 12 Jul 2011, 15:21
Znuny Version: 3.0.9

Ticket Nummer

Post by vTv4d3r »

Hallo,

ich möchte einen eigenen NumberGenerator machen .... die Wunschzusammenstellung ist folgende: "Ticket " JahrMonatTag"statischer String"Counter (Beispiel Ticket 20110803ABC1)

Ich habe bereits einen Entwurf des ganzen gemacht ... Dabei habe ich aber das Problem, wenn Nachfragen zu einem Ticket ankommen, dass diese nicht zugeorndet werden. Daraufhin habe ich versucht den "Suchalgorithmus" anzupassen, leider ohne Erfolg. Ich bin dann ebenfalls auf das Problem der SystemID gestoßen, welche scheinbar unbedingt mit einfließen muss .. oder?

Ich bedanke im voraus für eure Hilfe.
Wolfgangf
Znuny ninja
Posts: 1029
Joined: 13 Apr 2009, 12:26
Znuny Version: 6.0.13
Real Name: Wolfgang Fürtbauer
Company: PBS Logitek GmbH
Location: Pinsdorf

Re: Ticket Nummer

Post by Wolfgangf »

1) SystemID: das wird helfen :)
2) baue in deinen neuen Generator den Suchlogaritmus des bisher verwendeten ein, dann funktioniert das auch
Produktiv:
OTRS 6.0.13/ ITSM 6.0.13
OS: SUSE Linux (SLES 12, Leap), MySql 5.5.x, 5.6.x
Windows 2012 AD Integration (agents and customers), Nagios integration (incidents, CMDB), Survey, TimeAccounting
vTv4d3r
Znuny newbie
Posts: 11
Joined: 12 Jul 2011, 15:21
Znuny Version: 3.0.9

Re: Ticket Nummer

Post by vTv4d3r »

Wolfgangf wrote:1) SystemID: das wird helfen :)
Hallo und danke für die schnelle Antwort.

Der Wunsch ist auf die SystemID komplett zu verzichten. Leider werden auch keinen Buchstaben als SystemID zugelassen, sonst hätte ich den statischen String als SystemID verwendet.


Eine weitere Idee (die mir auch ausreichen würde und wahrscheinlich einfacher umzusetzen ist) wäre, die Länge des Tickets nur zu verkleinern .. zur Zeit ist der Aufbau "normal" (Ticket#2011080310000486)
wenn wir hier die auffühlenden "0"'len bei Bedarf weglassen könnten wäre das auch okay. -> Ticket#2011080310486
Wolfgangf
Znuny ninja
Posts: 1029
Joined: 13 Apr 2009, 12:26
Znuny Version: 6.0.13
Real Name: Wolfgang Fürtbauer
Company: PBS Logitek GmbH
Location: Pinsdorf

Re: Ticket Nummer

Post by Wolfgangf »

gehen wir doch nochmal einen Schritt zurück:
post mal Deinen neuen Numbergenerator
Produktiv:
OTRS 6.0.13/ ITSM 6.0.13
OS: SUSE Linux (SLES 12, Leap), MySql 5.5.x, 5.6.x
Windows 2012 AD Integration (agents and customers), Nagios integration (incidents, CMDB), Survey, TimeAccounting
vTv4d3r
Znuny newbie
Posts: 11
Joined: 12 Jul 2011, 15:21
Znuny Version: 3.0.9

Re: Ticket Nummer

Post by vTv4d3r »

Hallo,

ich habe mir als Vorlage einen bestehenden Generator genommen und nur den Teil zur Erstellung der Ticketnummer geändert.

Code: Select all

# --
# Ticket/Number/Date.pm - a date ticket number generator
# Copyright (C) 2001-2009 xxx, http://otrs.org/
# --
# $Id: Date.pm,v 1.31 2009/05/15 10:12:02 martin Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
# did not receive this file, see http://www.gnu.org/licenses/agpl.txt.
# --
# Note:
# available objects are: ConfigObject, LogObject and DBObject
#
# Generates ticket numbers like yyyymmddss.... (e. g. 200206231010138)
# --

package Kernel::System::Ticket::Number::ABC;

use strict;
use warnings;

use vars qw($VERSION);
$VERSION = qw($Revision: 1.31 $) [1];

sub TicketCreateNumber {
    my ( $Self, $JumpCounter ) = @_;
    if ( !$JumpCounter ) {
        $JumpCounter = 0;
    }

    # get needed config options
    my $CounterLog = $Self->{ConfigObject}->Get('Ticket::CounterLog');
    my $SystemID   = $Self->{ConfigObject}->Get('SystemID');

    # get current time
    my ( $Sec, $Min, $Hour, $Day, $Month, $Year ) = $Self->{TimeObject}->SystemTime2Date(
        SystemTime => $Self->{TimeObject}->SystemTime(),
    );

    # read count
    my $Count = 0;
    if ( -f $CounterLog ) {
        my $ContentSCALARRef = $Self->{MainObject}->FileRead(
            Location => $CounterLog,
        );
        if ( $ContentSCALARRef && ${$ContentSCALARRef} ) {
            ($Count) = split( /;/, ${$ContentSCALARRef} );

            # just debug
            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
    my $Write = $Self->{MainObject}->FileWrite(
        Location => $CounterLog,
        Content  => \$Count,
    );
    if ($Write) {
        if ( $Self->{Debug} > 0 ) {
            $Self->{LogObject}->Log(
                Priority => 'debug',
                Message  => "Write counter: $Count",
            );
        }
    }

    # create new ticket number
	$Count = sprintf ('%04d', $Count);
    my $Tn = $Year . $Month . $Day . "ABC" . $Count;

    # Check ticket number. If exists generate new one!
    if ( $Self->TicketCheckNumber( Tn => $Tn ) ) {
        $Self->{LoopProtectionCounter}++;
        if ( $Self->{LoopProtectionCounter} >= 16000 ) {

            # loop protection
            $Self->{LogObject}->Log(
                Priority => 'error',
                Message  => "CounterLoopProtection is now $Self->{LoopProtectionCounter}!"
                    . " Stopped TicketCreateNumber()!",
            );
            return;
        }

        # create new ticket number again
        $Self->{LogObject}->Log(
            Priority => 'notice',
            Message  => "Tn ($Tn) exists! Creating a new one.",
        );
        $Tn = $Self->TicketCreateNumber( $Self->{LoopProtectionCounter} );
    }
    return $Tn;
}

sub GetTNByString {
    my ( $Self, $String ) = @_;
    if ( !$String ) {
        return;
    }

    # get needed config options
    my $CheckSystemID = $Self->{ConfigObject}->Get('Ticket::NumberGenerator::CheckSystemID');
    my $SystemID      = '';
    if ($CheckSystemID) {
        $SystemID = $Self->{ConfigObject}->Get('SystemID');
    }
    my $TicketHook        = $Self->{ConfigObject}->Get('Ticket::Hook');
    my $TicketHookDivider = $Self->{ConfigObject}->Get('Ticket::HookDivider');

    # check current setting
    if ( $String =~ /\Q$TicketHook$TicketHookDivider\E(\d{4,10}$SystemID\d{1,40})/i ) {
        return $1;
    }

    # check default setting
    if ( $String =~ /\Q$TicketHook\E:\s{0,2}(\d{4,10}$SystemID\d{1,40})/i ) {
        return $1;
    }

    return;
}

1;
Wolfgangf
Znuny ninja
Posts: 1029
Joined: 13 Apr 2009, 12:26
Znuny Version: 6.0.13
Real Name: Wolfgang Fürtbauer
Company: PBS Logitek GmbH
Location: Pinsdorf

Re: Ticket Nummer

Post by Wolfgangf »

also soweit ich das verstehe ...

mit der Funktion 'sub TicketCreateNumber' möchtest Du eine Ticketnummer im Format my $Tn = $Year . $Month . $Day . "ABC" . $Count; erstellen

Nun muss Du auch in der Funktion sub GetTNByString sicherstellen, dass das gleiche Format verwendet wird ,sprich die Regex im untenstehenden Absatz anpassen

Code: Select all

# check current setting
        if ( $String =~ /\Q$TicketHook$TicketHookDivider\E(\d{4,10}$SystemID\d{1,40})/i ) {
            return $1;
        }

        # check default setting
        if ( $String =~ /\Q$TicketHook\E:\s{0,2}(\d{4,10}$SystemID\d{1,40})/i ) {
            return $1;
        }
- und die sieht jetzt noch anders aus: der such noch im Format

Code: Select all

"Ticket# SystemidZähler" Beispiel: Ticket# 100000001 
Dein Wunschformat ist "Ticket JJJJMMTTABCnnnn" - also
1) Ticket::Hook anpassen (Sysconfig) auf "Ticket" statt "Ticket#"
2) regexp im obigen codeschnippsel ändern
ungetesteterweise könne die folgende Regexp helfen

Code: Select all

$String =~ /\Q$TicketHook$TicketHookDivider\E(\d{8}ABC\d{4})/i 
Produktiv:
OTRS 6.0.13/ ITSM 6.0.13
OS: SUSE Linux (SLES 12, Leap), MySql 5.5.x, 5.6.x
Windows 2012 AD Integration (agents and customers), Nagios integration (incidents, CMDB), Survey, TimeAccounting
vTv4d3r
Znuny newbie
Posts: 11
Joined: 12 Jul 2011, 15:21
Znuny Version: 3.0.9

Re: Ticket Nummer

Post by vTv4d3r »

Hallo,

danke für die schnelle Antwort.

Ich hatte an der Stelle schon mit Änderungen herum gespielt, Daher habe ich den Originalcode gepostet.

Ich werde die Änderung mal probieren .....

EIne Frage noch ... kann ich den TicketHook bei der zweiten regex weglassen, da die bestehenden Tickets noch den "alten" TicketHook haben?
Wolfgangf
Znuny ninja
Posts: 1029
Joined: 13 Apr 2009, 12:26
Znuny Version: 6.0.13
Real Name: Wolfgang Fürtbauer
Company: PBS Logitek GmbH
Location: Pinsdorf

Re: Ticket Nummer

Post by Wolfgangf »

vTv4d3r wrote:EIne Frage noch ... kann ich den TicketHook bei der zweiten regex weglassen, da die bestehenden Tickets noch den "alten" TicketHook haben?
weglassen wird nicht das gewünschte Ergebnis bringen - du musst meiner Meinung nach den zweiten Regexp so aufbauen wie die alte Ticketnummer aussieht
Produktiv:
OTRS 6.0.13/ ITSM 6.0.13
OS: SUSE Linux (SLES 12, Leap), MySql 5.5.x, 5.6.x
Windows 2012 AD Integration (agents and customers), Nagios integration (incidents, CMDB), Survey, TimeAccounting
vTv4d3r
Znuny newbie
Posts: 11
Joined: 12 Jul 2011, 15:21
Znuny Version: 3.0.9

Re: Ticket Nummer

Post by vTv4d3r »

okay, mit weglassen habe ich mich falsch ausgedrückt. Ich müsste die Variable von Tickethook durch den statischen String "TIcket#" ersetzten?
Wolfgangf
Znuny ninja
Posts: 1029
Joined: 13 Apr 2009, 12:26
Znuny Version: 6.0.13
Real Name: Wolfgang Fürtbauer
Company: PBS Logitek GmbH
Location: Pinsdorf

Re: Ticket Nummer

Post by Wolfgangf »

einfach die Konstante statt der Variablen $TicketHook reinschreiben
Produktiv:
OTRS 6.0.13/ ITSM 6.0.13
OS: SUSE Linux (SLES 12, Leap), MySql 5.5.x, 5.6.x
Windows 2012 AD Integration (agents and customers), Nagios integration (incidents, CMDB), Survey, TimeAccounting
Locked