Zuweisung Kundenbenutzer, wenn Absenderadresse nicht in Kundenbenutzerdatenbank

Allgemein Fragen, deutsche News, Ankündigungen & Events zum OTRS
Post Reply
insideAC
Znuny newbie
Posts: 30
Joined: 06 Sep 2013, 11:13
Znuny Version: 3.2.9

Zuweisung Kundenbenutzer, wenn Absenderadresse nicht in Kundenbenutzerdatenbank

Post by insideAC »

Hallo,

wir versuchen gerade per Postmaster Filter folgendes umzustezen, scheitern aber leider daran.

1. Wir haben eine Kundenbenutzerdatenbank, wo die Benutzernamen "nachname.vorname" sind und auch E-Mail-Adressen hinterlegt sind. Die Kundenbenutzer sind Kunden zugewiesen
2. Wir haben für einige Kundenbenutzer "kunde.endbenutzer", die auch dem Kunden zugewiesen sind.
Diesen Kundenbenutzer möchten wir allen Tickets zuweisen, die von einem Kunden kommen, wo die Absenderadresse aber nicht in der Kundenbenutzerdatenbank vorhanden ist.

Beispiel:
Wir filtern eingehende Tickets nach @kunde.de und weisen diesen Tickets die Queue "kunde" zu.
Wir filtern außerdem Tickets nach einem bestimmten Betreff und weisen dann die Queue "kunde" zu.
Wenn die From-Adresse einem Kundenbenutzer in der Datenbank zugewiesen ist, soll dieser als Kundenbenutzer für das Ticke gesetzt werden.
Wenn die From-Adresse nicht in der Datenbank ist, soll der Kundenbenutzer "kunde.endbenutzer" gesetzt werden.

Wir bekommen es momentan leider nur hin, dass immer kunde.endbenutzer gesetzt wird.

Habt Ihr hier eine Idee, wie man die Filter richtig benutzen kann um das umzusetzen, was wir wollen.

Wir haben schon versucht als Filterbedingung "X-OTRS-Customer-User" überprüfen zu lassen. Das scheint allerdings nicht zu greifen.
Die Idee hierbei war im 1. Schritt die Queue zuzuweisen und dann im zweiten Schritt abzuprüfen, ob der "X-OTRS-CustomerUser" Eintrag ein @ enthält.
Falls ja, wird enbenutzer.kunden zugewiesen (weil unsere Benutzernamen keine @ Zeichen haben). Diese Regel greift allerdings nicht.

Über Ideen oder Vorschläge würde ich mich sehr freuen!

Grüße
Roland
Daniel Obee
Moderator
Posts: 644
Joined: 19 Jun 2007, 17:11
Znuny Version: various
Real Name: Daniel Obée
Location: Berlin

Re: Zuweisung Kundenbenutzer, wenn Absenderadresse nicht in Kundenbenutzerdatenbank

Post by Daniel Obee »

Leider sind die PostmasterFilter bei OTRS vor der Kundenzuordnung angesiedelt. Das verhindert, dass man Kundendaten in irgendeiner Form zum Mapping/Filtern benutzen kann. Ist übrigens eines der größten Ärgernisse, die ich mit dem System hatte.

Für einen ähnlichen Fall habe ich mal ein Skript geschrieben, dass eine nachträgliche Kundenzuordnung vornimmt, sollte der Kunde nach der Ticketerstellung angelegt worden sein. Das Skript kann über den GenericAgent oder einen CronJob (braucht aber Leserechte) aufgerufen werden. Wenn man das entsprechend modifiziert, kann man sicherlich auch einfach den CustomerUser gegen "kunde.enduser" austauschen.

Das Skript basiert auf der Annahme, dass nicht zugeordnete Kunden ein "@" im CustomerUser haben und holt sich zu diesen Kunden die Adresse aus der Datenbank (wäre bei euch ja nicht nötig). Das Skript "skipp-t" dabei Adressen, die in der Datenbank mehrfach vorkommen.

Wenn ihr Kundenbenutzer mit Email-Adressen zulasst, dann müsste man das komplett umschreiben, so dass gecheckt wird, ob der Kunde in der Datenbank ist. Bitte beachten, dass das Skript schon etwas älter ist und sicherlich nicht direkt für diese Aufgabe gebaut. Von daher bitte nur als Anregung verstehen, wie man sowas einigermaßen sauber machen kann.

Eine andere, evtl. elegantere Methode wäre, per Skript noch vor dem einschleusen in OTRS zu checken, ob der Kunde in der Datenbank wäre. Wenn nicht, könnte man über einen Eintrag im Mailheader einen X-OTRS-Filter triggern. Der Nachteil: Man verändert die E-Mail, was rechtlich nicht 100% sauber ist.

Gruß
Daniel

Code: Select all

#!/usr/bin/perl
# --
# bin/33achtzig.updateTicketCustomer.pl - Check Tickets for possible UserUpdates
# Copyright (C) 2001-2013 Daniel Obée, http://33achtzig.de/
# --
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU AFFERO General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
# or see http://www.gnu.org/licenses/agpl.txt.
# --

use strict;
use warnings;

use File::Basename;
use FindBin qw($RealBin);
use lib dirname($RealBin);
use lib dirname($RealBin) . '/Kernel/cpan-lib';
use lib dirname($RealBin) . '/Custom';

use Kernel::Config;
use Kernel::System::Ticket;
use Kernel::System::TicketSearch;
use Kernel::System::CustomerUser;
use Kernel::System::Encode;
use Kernel::System::Log;
use Kernel::System::Time;
use Kernel::System::Main;
use Kernel::System::DB;
use Kernel::System::User;
use Kernel::System::Group;

# create common objects
my %CommonObject = ();
$CommonObject{ConfigObject} = Kernel::Config->new(%CommonObject);
$CommonObject{EncodeObject} = Kernel::System::Encode->new(%CommonObject);
$CommonObject{LogObject}    = Kernel::System::Log->new(
    LogPrefix => '33achtzig.updateTicketCustomer',
    %CommonObject,
);
$CommonObject{TimeObject} = Kernel::System::Time->new(%CommonObject);
$CommonObject{MainObject} = Kernel::System::Main->new(%CommonObject);
$CommonObject{DBObject}   = Kernel::System::DB->new(%CommonObject);
$CommonObject{UserObject} = Kernel::System::User->new(%CommonObject);
$CommonObject{TicketObject} = Kernel::System::Ticket->new(%CommonObject);
$CommonObject{CustomerUserObject} = Kernel::System::CustomerUser->new(%CommonObject);

my @TicketIDs = $CommonObject{TicketObject}->TicketSearch(
        # result (required)Self
        Result => 'ARRAY',
        CustomerID => '%@%',
        # tickets created less than 120 minutes ago (ticket newer than 120 minutes) (optional)
        TicketCreateTimeNewerMinutes => 6*24*30000,
        # user search (UserID is required)
        UserID     => 1,
        Permission => 'ro',
    );

# exit if found nothing
if ( !@TicketIDs )  {
	$CommonObject{LogObject}->Log(
        Priority => 'info',
        Message  => "33achtzig.updateTicketCustomer: Found no ticket without user.",
    );
    
    exit(0);				
}

my $found 	= 0;
my $skipped = 0;
my $updated = 0;

foreach my $TicketID ( @TicketIDs ) {
	
	$found++;
	
	my $CustomerUserID;
	my $CustomerID;
		
	#get CustomerUserID
	my %Ticket = $CommonObject{TicketObject}->TicketGet(
		TicketID      => $TicketID,
		UserID        => 1,
		Silent        => 0,         # Optional, default 0. To suppress the warning if the ticket does not exist.
	);

	# email search for CustomerUser
	my %CustomerUser = $CommonObject{CustomerUserObject}->CustomerSearch(
		PostMasterSearch => $Ticket{'CustomerUserID'},
		Valid            => 1, # not required, default 1
	);

	# check if mailaddress is unique - skip if not
	if ( scalar keys %CustomerUser != 1 ) {
		$skipped++;
		next;	
	}
	
	# get CustomerID
	my @CustomerIDs;
	foreach ( keys %CustomerUser ) {
		@CustomerIDs = $CommonObject{CustomerUserObject}->CustomerIDs(
        	User => $_,
    	);
		$CustomerUserID = $_;
	}

	# check if there's none or more than one CustomerID - skip if so
	if ( scalar @CustomerIDs != 1 ) {
		$skipped++;
		next;	
	}
	
	$CustomerID = $CustomerIDs[0];
	
	# update ticket with customer
	my $Success = $CommonObject{TicketObject}->TicketCustomerSet(
        No       => $CustomerID,
        User     => $CustomerUserID,
        TicketID => $TicketID,
        UserID   => 1,
    );
	$updated++;

}

# Log entry
$CommonObject{LogObject}->Log(
	Priority => 'info',
	Message  => "33achtzig.updateTicketCustomer: Found $found ticket without user, $updated updated, $skipped skipped",
);

exit(0);
insideAC
Znuny newbie
Posts: 30
Joined: 06 Sep 2013, 11:13
Znuny Version: 3.2.9

Re: Zuweisung Kundenbenutzer, wenn Absenderadresse nicht in Kundenbenutzerdatenbank

Post by insideAC »

Hi Daniel,

vielen dank für die ausführliche Antwort. Da kann man auf jeden Fall was mit anfangen.

Ich habe es mittlerweile so gelöst, dass wir einen "Ausnahme" Postmaster Filter definiert haben mit der Option "Stopp nach Treffer". In diesem Filter wird geprüft ob die Mail von einer bestimmten Adresse kommt und dann wird eben nicht der Endbenutzer zugewiesen. Nachteil hier ist, dass wir eine Ausnahmeliste pflegen müssen.
Für die nächsten Ausbaustufe würde ich ein solches Skript in Betracht ziehen.
Hier wäre interessant, wie man dieses Skript triggern würde. Per Cron-Job, z.B. jede Minute?

Grüße
Roland
Daniel Obee
Moderator
Posts: 644
Joined: 19 Jun 2007, 17:11
Znuny Version: various
Real Name: Daniel Obée
Location: Berlin

Re: Zuweisung Kundenbenutzer, wenn Absenderadresse nicht in Kundenbenutzerdatenbank

Post by Daniel Obee »

Das einfachste ist, du triggerst es per GenericAgent, hier hast du ja die Möglichkeit ein Skript ausführen zu lassen (unter Ticket Kommandos).

Eine andere, von mir jetzt noch nicht getestete Variante wäre, PostMaster::PreFilterModule###4-CMD zu nutzen, hier die Datenbank abzufragen und dann entsprechend den Kunden zu setzen.
Post Reply