# Kunden (min. OTRS 1.1)

OTRS ist in der Lage, mit verschiedenen Kundendaten (insbesondere Login, eMail, Telefon) umzugehen. Diese Informationen können im Agenten-Interface angezeigt werden und können für das Kunden-Interface benutzt werden (Benutzer und Authentifizierung).

## Wie es funktioniert

Die benutzten/angezeigten Kundendaten sind frei konfigurierbar (s. Backend), aber es gibt drei benötigte Optionen: BenutzerLogin, BenutzerEmail und BenutzerKundenID.

### Agenten-Interface

Wenn Sie die Kundendaten (z.B. Firma, Name, eMail, ...) in Ihrem Agenten-Interface anzeigen möchten, benutzen Sie die folgenden Konfigurations-Optionen.

        [Kernel/Config.pm]
        # ShowCustomerInfo*
        # (show customer user info on Compose (Phone and Email), Zoom and Queue view)
        $Self->{ShowCustomerInfoCompose} = 1;
        $Self->{ShowCustomerInfoZoom} = 1;
        $Self->{ShowCustomerInfoQueue} = 0;
        [...]

### Admin-Interface

Über das Admin-Interface können Sie die Kundendaten editieren (http://yourhost/otrs/index.pl?Action=AdminCustomerUser).

### Kunden-Interface

Die Kundendaten für das Kunden-Interface (http://yourhost/otrs/customer.pl) werden für Login und Authentifizierung benutzt.

## Kundenbenutzer-Backend

Es existieren zwei Kundenbenutzer-Backends, DB und LDAP. Falls Sie bereits ein Kunden-Verzeichnis (z.B. SAP, ...) haben, ist es natürlich möglich, dafür ein eigenes Backend zu schreiben.

Notiz: Es is auch möglich mehr als einen Kunden-Daten Topf zu definieren. Einfach eine weitere Konfig Option wie "CustomerUser" mit einer Nummer zwischen 1 und 10. Zum Beispiel "CustomerUser1".

### Datenbank (Standard)

Dies ist ein Beispiel für ein Datenbank-Backend.

        [Kernel/Config.pm]
        # CustomerUser
        # (customer user database backend and settings)
        $Self->{CustomerUser} = {
            Name => 'Datenbank Quelle',
            Module => 'Kernel::System::CustomerUser::DB',
            Params => {
                # if you want to use an external database, add the
                # required settings
    #            DSN => 'DBI:odbc:yourdsn',
    #            DSN => 'DBI:mysql:database=customerdb;host=customerdbhost',
    #            User => '',
    #            Password => '',
                Table => 'customer_user',
            },
            # customer uniq id
            CustomerKey => 'login',
            # customer #
            CustomerID => 'customer_id',
            CustomerValid => 'valid_id',
            CustomerUserListFields => ['login', 'first_name', 'last_name', 'email'],
            CustomerUserSearchFields => ['login', 'last_name', 'customer_id'],
            CustomerUserPostMasterSearchFields => ['email'],
            CustomerUserNameFields => ['salutation', 'first_name', 'last_name'],
            Map => [
                # note: Login, Email and CustomerID needed!
                # var, frontend, storage, shown, required, storage-type, http-link
                [ 'UserSalutation', 'Salutation', 'salutation', 1, 0, 'var' ],
                [ 'UserFirstname', 'Firstname', 'first_name', 1, 1, 'var' ],
                [ 'UserLastname', 'Lastname', 'last_name', 1, 1, 'var' ],
                [ 'UserLogin', 'Login', 'login', 1, 1, 'var' ],
                [ 'UserPassword', 'Password', 'pw', 0, 1, 'var' ],
                [ 'UserEmail', 'Email', 'email', 0, 1, 'var' ],
    #            [ 'UserEmail', 'Email', 'email', 1, 1, 'var', '$Env{"CGIHandle"}?Action=\
    AgentCompose&ResponseID=1&TicketID=$Data{"TicketID"}&ArticleID=$Data{"ArticleID"}' ],
                [ 'UserCustomerID', 'CustomerID', 'customer_id', 0, 1, 'var' ],
                [ 'UserComment', 'Comment', 'comment', 1, 0, 'var' ],
                [ 'ValidID', 'Valid', 'valid_id', 0, 1, 'int' ],
            ],
        };
        [...]

Falls Sie Ihre Kundendaten anpassen möchten, ändern Sie die Tabellenspalten oder fügen Sie weitere hinzu:

    ALTER TABLE customer_user ADD phone VARCHAR (250);

Danach fügen Sie Ihre eigenen Spalten dem MAP Array hinzu:

                # var, frontend, storage, shown, required, storage-type, http-link
                [ 'UserPhone', 'Phone', 'phone', 1, 0, 'var' ],

Natürlich können Sie all diese Kundeninformationen dann auch über das Admin-Interface pflegen.

### LDAP

Falls Sie ein existierendes LDAP-Verzeichnis mit Ihren Kunden-Benutzern haben, sind Sie in der Lage, dieses auch in OTRS zu nutzen.

Dies ist ein Beispiel für ein LDAP-Backend.

        [Kernel/Config.pm]
        # CustomerUser
        # (customer user ldap backend and settings)
        $Self->{CustomerUser} = {
            Name => 'LDAP Quelle',
            Module => 'Kernel::System::CustomerUser::LDAP',
            Params => {
                # ldap host
                Host => 'bay.csuhayward.edu',
                # ldap base dn
                BaseDN => 'ou=seas,o=csuh',
                # search scope (one|sub)
                SSCOPE => 'sub',
                # The following is valid but would only be necessary if the
                # anonymous user does NOT have permission to read from the LDAP tree
                UserDN => '',
                UserPw => '',
            },
            # customer uniq id
            CustomerKey => 'uid',
            # customer #
            CustomerID => 'mail',
            CustomerUserListFields => ['uid', 'cn', 'mail'],
            CustomerUserSearchFields => ['uid', 'cn', 'mail'],
            CustomerUserPostMasterSearchFields => ['mail'],
            CustomerUserNameFields => ['givenname', 'sn'],
            Map => [
                # note: Login, Email and CustomerID needed!
                # var, frontend, storage, shown, required, storage-type
                [ 'UserSalutation', 'Title', 'title', 1, 0, 'var' ],
                [ 'UserFirstname', 'Firstname', 'givenname', 1, 1, 'var' ],
                [ 'UserLastname', 'Lastname', 'sn', 1, 1, 'var' ],
                [ 'UserLogin', 'Login', 'uid', 1, 1, 'var' ],
                [ 'UserEmail', 'Email', 'mail', 1, 1, 'var' ],
                [ 'UserCustomerID', 'CustomerID', 'mail', 0, 1, 'var' ],
                [ 'UserPhone', 'Phone', 'telephonenumber', 1, 0, 'var' ],
                [ 'UserAddress', 'Address', 'postaladdress', 1, 0, 'var' ],
                [ 'UserComment', 'Comment', 'description', 1, 0, 'var' ],
            ],
        };
        [...]

Falls Sie Ihre Kundendaten anpassen möchten, fügen Sie Ihre neuen Punkte dem MAP Array hinzu (oder entfernen Sie nicht benötigte Punkte):

                # var, frontend, storage, shown, required, storage-type, http-link
                [ 'UserOrganisation', 'Organisation', 'ou', 1, 0, 'var' ],

## Kunden-Authentifizierungs-Backend

### Datenbank (Standard)

Das Standard-Kunden-Authentifizierungs-Backend ist die otrs Datenbank mit Ihren Kunden-Benutzern, die über das Admin-Interface oder Kunden-Interface (Konto anlegen) angelegt werden.

        [Kernel/Config.pm]
        # This is the auth. module againt the otrs db
        $Self->{'Customer::AuthModule'} = 'Kernel::System::CustomerAuth::DB';
        [...]

### LDAP

Falls ein LDAP-Verzeichnis mit Ihren Kunden-Benutzern verfügbar ist, können Sie das Kunden-LDAP-Authentifizierungs-Backend benutzen. Dieses Modul ist nur-lesend (d.h. es kann nicht in Ihr LDAP-Verzeichnis schreiben - dies sollte nur dem Verzeichnis-Manager möglich sein), so dass Sie keine Kunden über das Admin- oder Kunden-Interface anlegen oder ändern können.

        [Kernel/Config.pm]
        # This is an example configuration for an LDAP auth. backend.
        # (take care that Net::LDAP is installed!)
        $Self->{'Customer::AuthModule'} = 'Kernel::System::CustomerAuth::LDAP';
        $Self->{'Customer::AuthModule::LDAP::Host'} = 'ldap.example.com';
        $Self->{'Customer::AuthModule::LDAP::BaseDN'} = 'dc=example,dc=com';
        $Self->{'Customer::AuthModule::LDAP::UID'} = 'uid';

        # Check if the user is allowed to auth in a posixGroup
        # (e. g. user needs to be in a group xyz to use otrs)
    #    $Self->{'Customer::AuthModule::LDAP::GroupDN'} = 'cn=otrsallow,ou=posixGroups,dc=example,dc=com';
    #    $Self->{'Customer::AuthModule::LDAP::AccessAttr'} = 'memberUid';

        # The following is valid but would only be necessary if the
        # anonymous user do NOT have permission to read from the LDAP tree
        $Self->{'Customer::AuthModule::LDAP::SearchUserDN'} = '';
        $Self->{'Customer::AuthModule::LDAP::SearchUserPw'} = '';
        [...]

### HTTPBasicAuth

Falls Sie eine "single sign on"-Lösung für Ihre Kunden benutzen, benutzen Sie http basic authentication (für alle Ihre Systeme) und benutzen Sie das HTTPBasicAuth Modul (kein OTRS-Login benötigt!).

        [Kernel/Config.pm]
        # This is the auth. module againt $ENV{REMOTE_USER} (apache
        # http-basic-auth)
        $Self->{'Customer::AuthModule'} = 'Kernel::System::CustomerAuth::HTTPBasicAuth';
        # Note:
        # If you use this module, you should use as fallback the following
        # config settings if user isn't login through apache ($ENV{REMOTE_USER})
        $Self->{CustomerPanelLoginURL} = 'http://host/not-authorised-for-otrs.html';
        $Self->{CustomerPanelLogoutURL} = 'http://host/thanks-for-using-otrs.html';
        [...]

## Kunden-Selbstanmeldung anpassen

Es ist möglich, die Kunden-Selbstanmeldung für neue Kunden über "customer.pl" anzupassen. Somit können Sie mehr optionale oder benötigte Felder (z.B. Adresse, Ort) hinzufügen.

In unserem Beispiel wollen wir ein benötigtes Adress-Feld hinzufügen.

### Vorlage

Editieren Sie "Kernel/Output/HTML/Standard/CustomerCreateAccount.dtl" und fügen Sie Ihre gewünschten Felder hinzu. Wir möchten ein Adress-Feld, also fügen Sie folgendes hinzu:

        [...]
        <tr>
          <td>$Text{"Address"}: </td>
          <td> <input type="text" name="Address" value="$Data{"UserAddress"}" size="35" maxlength="50"></td>
        </tr>
        [...]

### Kunden-Mapping

Zusätzlich müssen Sie einen "Adress"-Eintrag zu Ihrem Kunden-Mapping hinzufügen. Fügen Sie "CustomerUser" (Kunden-Mapping) aus "Kernel/Config/Defaults.pm" zu Ihrer "Kernel/Config.pm" hinzu und ergänzen Sie das Adress-Feld. Danach sollte es ungefähr so aussehen:

        [Kernel/Config.pm]
        $Self->{CustomerUser} = {
            Name => 'Interne Kunden',
            Module => 'Kernel::System::CustomerUser::DB',
            Params => {
                Table => 'customer_user',
            },
            Map => [
                # note: Login, Email and CustomerID needed!
                # var, frontend, storage, shown, required, storage-type, link
                [ 'UserSalutation', 'Salutation', 'salutation', 1, 0, 'var' ],
                [ 'UserFirstname', 'Firstname', 'first_name', 1, 1, 'var' ],
                [ 'UserLastname', 'Lastname', 'last_name', 1, 1, 'var' ],
                # our new option
                [ 'UserAddress', 'Address', 'address', 1, 1, 'var' ],
                [ 'UserLogin', 'Login', 'login', 1, 1, 'var' ],
                [ 'UserPassword', 'Password', 'pw', 0, 1, 'var' ],
                [ 'UserEmail', 'Email', 'email', 1, 1, 'var' ],
                [ 'UserCustomerID', 'CustomerID', 'customer_id', 1, 1, 'var' ],
                [ 'UserComment', 'Phone', 'comment', 1, 0, 'var' ],
                [ 'ValidID', 'Valid', 'valid_id', 0, 1, 'int' ],
            ],
            Key => 'login',
            CustomerID => 'customer_id',
        };
        [...]

### Kunden-Tabelle anpassen

Ausserdem müssen wir eine neue Spalte zu unserer "customer_user" Tabelle hinzufügen.

    mysql> ALTER TABLE customer_user ADD address VARCHAR (200);
    Query OK, 0 rows affected (0.21 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    mysql>

Das ist alles - Starten Sie Ihren Webserver neu (falls Sie mod_perl benutzen) und gehen Sie auf "http://otrs.example.com/otrs/customer.pl", um es zu testen.