﻿package ticketserver::DBDesign;

use strict;
use warnings;
use ADBGUI::Tools qw(localtime2sql sql2time);

BEGIN {
   use Exporter;
   our @ISA = qw(Exporter);
   our @EXPORT = qw/$TICKETS $VORLAGENFLAG $VORLAGE $BOXES $PASS $MAC $VERBUND $MACSPEZIAL $CUSTOMER $ZAHLUNGSART $BUCHUNGEN
                    $SURFTIMEFLAG $INSTALLATIONFLAG $VERBUNDFLAG $DATEOWNFLAG $URLFILTER $FILTERKAT $TICKETTIMEOUTDAY getPricesForCount/;
}

use Encode qw(from_to);
use ADBGUI::BasicVariables;
use ADBGUI::DBDesign(qw/$RIGHTS $DBUSER/);
use Date::Parse;

our $TICKETS              = "tickets";
our $NAMECOLUMNNAME       = "name";
our $PASS                 = "password";
our $BOXES                = "boxes";
our $MAC                  = "mac";
our $VERBUND              = "verbund";
our $MACSPEZIAL           = "macspezial";
our $CUSTOMER             = "customer";
our $VORLAGE              = "vorlage";
our $URLFILTER            = "urlfilter";
our $FILTERKAT            = "filterkat";
our $TICKETTIMEOUTDAY     = "tickettimeout";
our $BUCHUNGEN            = "ticketbuchungen";
our $ZAHLUNGSART          = "zahlungsart";

our $SURFTIMEFLAG         = 2**10;
our $INSTALLATIONFLAG     = 2**11;
our $VERBUNDFLAG          = 2**12;
our $DATEOWNFLAG          = 2**13;
our $VORLAGENFLAG         = 2**14;
our @ISA;

sub new {
   my $proto = shift;
   my $class = ref($proto) || $proto;
   my $self = shift;
   my $parent = $self ? ref($self) : "";
   @ISA = ($parent) if $parent;
   $self = $self ? $self : {};
   bless ($self, $class);
   return $self;
}

sub getDB {
   my $self = shift;
   my $DB = $self->SUPER::getDB() || {};

   $DB->{tables}->{$USERSTABLENAME}->{columns}->{$CUSTOMER."_".$UNIQIDCOLUMNNAME} = {
      type => "number",
      label => "Kunde",
      notnull => 0,
      qxminsize => 100,
      qxmaxsize => 150,
      linkto => $CUSTOMER,
      #writeonly => 1
   };

   $DB->{tables}->{$USERSTABLENAME}->{columns}->{$VORLAGE."_".$UNIQIDCOLUMNNAME} = {
      type => "number",
      label => "Standard Ticketvorlage",
      notnull => 0,
      qxminsize => 100,
      qxmaxsize => 150,
      #writeonly => 1
      linkto => $VORLAGE,
   };

   $DB->{tables}->{$USERSTABLENAME}->{columns}->{$UNIQIDCOLUMNNAME}->{qxmaxsize} = 30;
   $DB->{tables}->{$USERSTABLENAME}->{columns}->{$UNIQIDCOLUMNNAME}->{label} = "ID";

   $DB->{tables}->{$USERSTABLENAME}->{columns}->{$USERNAMECOLUMNNAME}->{qxmaxsize} = 150;

   $DB->{tables}->{$USERSTABLENAME}->{columns}->{$MODIFYFLAGCOLUMNNAME}->{label} = "Kundenverwalter";
   $DB->{tables}->{$USERSTABLENAME}->{columns}->{$MODIFYFLAGCOLUMNNAME}->{unit} = "Der Benutzer Boxen und Kunden verwalten";
   $DB->{tables}->{$USERSTABLENAME}->{columns}->{$MODIFYFLAGCOLUMNNAME}->{qxminsize} = 30;
   $DB->{tables}->{$USERSTABLENAME}->{columns}->{$MODIFYFLAGCOLUMNNAME}->{qxmaxsize} = 30;

   $DB->{tables}->{$USERSTABLENAME}->{columns}->{$ADMINFLAGCOLUMNNAME}->{label} = "Administrator";
   $DB->{tables}->{$USERSTABLENAME}->{columns}->{$ADMINFLAGCOLUMNNAME}->{unit} = "Der Benutzer alles für alle Kunden konfigurieren";
   $DB->{tables}->{$USERSTABLENAME}->{columns}->{$ADMINFLAGCOLUMNNAME}->{qxminsize} = 30;
   $DB->{tables}->{$USERSTABLENAME}->{columns}->{$ADMINFLAGCOLUMNNAME}->{qxmaxsize} = 30;

   $DB->{tables}->{$USERSTABLENAME}->{columns}->{dateown} = {
      type => "boolean",
      label => "Freie Ticketendeingabe",
      default => 1,
      order => 10, #<br><font size=1>
      unit => "Der Benutzer kann die Surfzeit frei eingeben",
      defaultfunc => sub { return 1; },
      qxminsize => 30,
      qxmaxsize => 30,
   };
   $DB->{tables}->{$USERSTABLENAME}->{columns}->{verbund} = {
      type => "boolean",
      label => "Sieht Verbünde",
      order => 11,
      unit => "Der Benutzer kann einen Verbund auswählen",
      qxminsize => 30,
      qxmaxsize => 30,
   };
   $DB->{tables}->{$USERSTABLENAME}->{columns}->{surftime} = {
      type => "boolean",
      label => "Sieht Surfzeit",
      order => 12,
      unit => "Der Benutzer kann die Onlinezeit beschränken",
      qxminsize => 30,
      qxmaxsize => 30,
   };
   $DB->{tables}->{$USERSTABLENAME}->{columns}->{installation} = {
      type => "boolean",
      label => "Sieht Installationen",
      unit => "Der Benutzer kann das Surfen mit Tickets auf eine Box beschränken",
      order => 13,
      qxminsize => 30,
      qxmaxsize => 30,
   };
   $DB->{tables}->{$USERSTABLENAME}->{columns}->{vorlagen} = {
      type => "boolean",
      label => "Sieht Ticketvorlagen",
      unit => "Der Benutzer kann Ticketvorlagen auswählen",
      order => 13,
      qxminsize => 30,
      qxmaxsize => 30,
   };

   $DB->{tables}->{$URLFILTER} = {
      primarykey => [$UNIQIDCOLUMNNAME],
      rights => $RIGHTS,
      dbuser => $DBUSER,
      order => 20,
      label => "Filter",
      crossShowInSelect => "name",
      #icon => 'resource/qx/icon/Tango/32/apps/utilities-text-editor.png',
      columns => {
         $UNIQIDCOLUMNNAME => {
            type => $UNIQIDCOLUMNNAME,
            order => 1,
            label => "Vorlagen ID",
            qxmaxsize => 100
         },
         "name" => {
            type => "text",
            label => "Filtername",
            showInSelect => 1,
            order => 4,
            qxmaxsize => 200
         },
         "block" => {
            type => "boolean",
            label => "Jugendschutz",
            showInSelect => 1,
            unit => "Dieser Filter stellt einen ausreichenden Jugendschutzfilter dar.",
            order => 5,
            qxminsize => 30,
            qxmaxsize => 60,
         },
         $CUSTOMER."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Kunde",
            order => 13,
            notnull => 1,
            qxminsize => 100,
            qxmaxsize => 100,
            linkto => $CUSTOMER,
         },
         $DELETEDCOLUMNNAME => {
            type => $DELETEDCOLUMNNAME,
            order => 5
         }
      },
   };

   $DB->{tables}->{$VORLAGE} = {
      primarykey => [$UNIQIDCOLUMNNAME],
      rights => $RIGHTS,
      dbuser => $DBUSER,
      order => 20,
      label => "Ticket Vorlage",
      crossShowInSelect => "name",
      icon => 'resource/qx/icon/Tango/32/apps/utilities-text-editor.png',
      columns => {
         $UNIQIDCOLUMNNAME => {
            type => $UNIQIDCOLUMNNAME,
            order => 1,
            label => "Vorlagen ID",
            qxmaxsize => 100
         },
         "name" => {
            type => "text",
            label => "Vorlagenname",
            showInSelect => 1,
            order => 4,
            qxmaxsize => 200
         },
         "ticketprint" => {
            type => "htmltext",
            label => "Ticketvorlage",
            order => 11,
            writeonly => 1,
            mode => "pdf",
            help =>
               'Diese Vorlage im HTML Format dient als Vorlage für das automatische Erzeugen<br>'.
               'eines ausdruckbaren Tickets für den Kunden.<br><br>'.
               'Platzhalter:<br><br>'.
               '%tickets.id%: Die Ticket-ID (der Benutzername) für den Benutzer<br>'.
               '%tickets.beschreibung%: Das Beschreibungsfeld des Tickets<br>'.
               '%time%: Das aktuelle Datum.<br>'.
               '%tickets.password%: Das Ticketpasswort für den Benutzer<br>'.
               '%tickets.mydate%: Das Ablaufdatum des Tickets.<br><br>'.
               'Beispiel:<br><br>'.
               '<html><br>'.
               '   <body><br>'.
               '<pre>Sehr geehrter Gast,<br>'.
               '<br>'.
               'in Anlehnung an  &sect;113 TKG und zur Wahrung unser eigenen  Interessen im Falle eines<br>'.
               'Missbrauchs unseres Internetangebots, weisen wir Sie darauf hin, dass unser System<br>'.
               'in Verbindung mit Ihrer Ticket - Nummer, die URL Ihrer aufgerufenen Webseiten samt<br>'.
               'Uhrzeit, Datum und der MAC-Adresse Ihres Computers(Hardwarekennung Ihrer Netzwerk-<br>'.
               'karte) erfasst.  Nicht gespeichert wird der Inhalt von Webseiten oder jegliche Art<br>'.
               'von pers&ouml;nlichen Daten,  wie etwa Benutzernamen,  Passw&ouml;rern oder  der Betreff und<br>'.
               'Inhalt von Emails.  Zur Wahrung Ihrer Privatsh&auml;re  sind durch das  System erfasste<br>'.
               'Daten als Dienstanbieter nicht einsehbar und werden lediglich im Straf- oder Miss-<br>'.
               'brauchsfall  den entsprechenden  staatlichen Stellen  ausgeh&auml;ndigt.  Die erfassten<br>'.
               'Daten werden automatisch nach 6 Monaten durch das System gel&ouml;scht.<br>'.
               '<br>'.
               'Durch Ihre Unterschrift  stimmen Sie der oben genannten  Erfassung Ihrer Daten f&uuml;r<br>'.
               'die Dauer von 6 Monaten zu.<br>'.
               '<br>'.
               'Ticket-Nummer : %tickets.id%<br>'.
               '<br>'.
               'Bemerkung :<br>'.
               '%tickets.beschreibung%<br>'.
               '<br>'.
               '<br>'.
               '   ORT, den %time%<br>'.
               '<br>'.
               '<br>'.
               '<br>'.
               '<br>'.
               '            _______________________________<br>'.
               '             Unterschrift Gast<br>'.
               '<br>'.
               '<br>'.
               '<br>'.
               '__________________________________________________________________________________<br>'.
               '<br>'.
               '<br>'.
               'Um Sich anzumelden, rufen Sie bitte in Ihrem Browser eine Seite auf,<br>'.
               'Sie werden dann zur Eingabe folgender Zugangsdaten aufgefordert:<br>'.
               '<br>'.
               '<table border=1><br>'.
               '   <tr><br>'.
               '      <td><br>'.
               '         <pre><br>'.
               '              &nbsp;<br>'.
               '              Ticketnummer : %tickets.id%<br>'.
               '              Passwort     : %tickets.password%<br>'.
               '         </pre><br>'.
               '       </td><br>'.
               '    </tr><br>'.
               '</table><br>'.
               '<pre>G&uuml;ltig bis   : %tickets.mydate%<br><br>'.
               'Bemerkung :<br>'.
               '%tickets.beschreibung%'
         },
         "beschreibung" => {
            type => "text",
            label => "Beschreibung",
            order => 9
         },
         $CUSTOMER."_".$UNIQIDCOLUMNNAME => {
            linkto => $CUSTOMER,
            type => "number",
            label => "Kunde",
            writeonly => 1,
            notnull => 1,
            qxminsize => 100,
            qxmaxsize => 150,
         },
         $DELETEDCOLUMNNAME => {
            type => $DELETEDCOLUMNNAME,
            order => 5
         }
      },
   };


   $DB->{tables}->{$USERSTABLENAME}->{qxwidth} = 700;
   $DB->{tables}->{$USERSTABLENAME}->{qxheight} = 400;
   $DB->{tables}->{$USERSTABLENAME}->{qxeditwidth} = 520;
   $DB->{tables}->{$USERSTABLENAME}->{qxeditheight} = 550;
   $DB->{tables}->{$USERSTABLENAME}->{icon} = "resource/qx/icon/Tango/32/apps/preferences-users.png";

   $DB->{tables}->{$LOG}->{icon} = 'bilder/diff.png',
   #$DB->{tables}->{$LOG}->{qxhidden} = 1;
   $DB->{tables}->{$LOG}->{readonly} = 1;
   $DB->{tables}->{$LOG}->{order} = 30;

   my $hinweis = 'Bitte beachten Sie, dass folgende Reihenfolge beim Bestimmen der<br>'.
                 'HTML-Dateien angewandt wird:<br><br>'.
                 '1. HTML-Datei der Box<br>'.
                 '2. HTML-Datei des Boxverbundes<br>'.
                 '3. HTML-Datei des Kunden<br>'.
                 '4. Airnetbox Standard HTML-Datei';

   my $vorlagen = {
      "login" => {
         type => "htmltext",
         label => "Login-Fehlerseite",
         order => 1,
         writeonly => 1,
         mode => "html",
         help =>
           'Diese HTML-Seite wird dargestellt, wenn der Benutzer eine beliebige Webseite im Browser<br>'.
           'eingibt, noch nicht eingeloggt ist und falsche Informationen eingibt.<br><br>'.
           $hinweis."<br><br>".'Platzhalter:<br><br>'.
           '- %url%: Die vom Benutzer aufgerufene URL<br>'.
           '- %page%: Die Eingabefeldern "Benutzername", "Passwort" und "Login" for ein Formular.<br><br>'.
           'Beispiel:<br><br>'.
           '<html><br>'.
           '   <body><br>'.
           '      <h1>Um die Adresse %url% &uuml;ber diesen Accesspoint Webseiten aufrufen zu k&ouml;nnen,<br>'.
           '          ben&ouml;tigen Sie ein Ticket. Wenn Sie noch keines erhalten haben, so wenden Sie<br>'.
           '          sich bitte an die Rezeption.</h1><br>'.
           '      <hr><br>'.
           '         %page%<br>'.
           '   </body><br>'.
           '</html>'
      },
      #"auth" => {
      #   type => "htmltext",
      #   label => "Authentisiere",
      #   order => 15,
      #   writeonly => 1,
      #   mode => "html",
      #   help => 
      #     'Diese HTML-Seite wird nach der Loginseite dargestellt, während die Ticketdaten des Benutzers<br>'.
      #     'überprüft werden.<br><br>'.$hinweis."<br><br>".
      #     'Sie sollten die HTML-Seite nicht abschließen, da jede Überprüfung auf gültige Rückantwort<br>'.
      #     'des Ticketservers mit einem weitere "." dargestellt wird. Diese Darstellung funktioniert<br>'.
      #     'mit abgeschlossenem HTML allerdings leider nicht.<br><br>'.
      #     $hinweis."<br><br>".'Platzhalter:<br><br>'.
      #     '- %url%: Die vom Benutzer aufgerufene URL<br><br>'.
      #     'Beispiel:<br><br>'.
      #     '<html><br>'.
      #     '   <body><br>'.
      #     '      <h1>Ihre Daten werden Überprüft<br>'.
      #     '                              <!-- ^^^ Hier folgen die Punkte jede Sekunde --><br>'
      #},
      "notickserv" => {
         type => "htmltext",
         label => "Kein Ticketserver",
         order => 2,
         writeonly => 1,
         mode => "html",
         help =>
           'Wenn das Ticket des Benutzers abgelaufen ist, so erscheint die Loginseite erneut. Wenn der<br>'.
           'Benutzer erneut versucht sich einzuloggen erscheint diese Meldung. Auch wenn die Loginformular<br>'.
           'Falsch sind, wird diese Meldung angezeigt.<br><br>'.
           $hinweis."<br><br>".'Platzhalter:<br><br>'.
           '- %url%: Die vom Benutzer aufgerufene URL<br>'.
           '- %page%: Die Eingabefeldern "Benutzername", "Passwort" und "Login" for ein Formular.<br><br>'.
           'Beispiel:<br><br>'.
           '<html><br>'.
           '   <body><br>'.
           '      <h1>Ihr Ticket ist nicht mehr gültig oder Sie haben falsche Logindaten eingegeben<br>'.
           '          Bitte versuchen Sie es erneut oder so wenden Sie sich an die Rezeption.</h1><br>'.
           '      <hr><br>'.
           '      <form action="/auth/%url%" method=post><br>'.
           '         %page%<br>'.
           '      </form><br>'.
           '   </body><br>'.
           '</html>'
      },
      "start" => {
         type => "htmltext",
         label => "Loginseite",
         order => 3,
         writeonly => 1,
         mode => "html",
         help =>
            'Die Loginseite.<br><br>'.
           'Diese HTML-Seite wird dargestellt, wenn der Benutzer eine beliebige Webseite im Browser<br>'.
           'eingibt und noch nicht eingeloggt ist<br><br>'.
            $hinweis."<br><br>".'Platzhalter:<br><br>'.
            '- %page%: Die Eingabefeldern "Benutzername", "Passwort" und "Login" for das Loginformular.<br><br>'.
            '- %url%: Die URL, die der Benutzer aufgerufen hat.<br><br>'.
           'Beispiel:<br><br>'.
           '<html><br>'.
           '   <body><br>'.
           '      <h1>Um die Adresse %url% &uuml;ber diesen Accesspoint Webseiten aufrufen zu k&ouml;nnen,<br>'.
           '          ben&ouml;tigen Sie ein Ticket. Wenn Sie noch keines erhalten haben, so wenden Sie<br>'.
           '          sich bitte an die Rezeption.</h1><br>'.
           '      <hr><br>'.
           '        <font color="red">Unbekanntes Ticket oder falsches Passswort!</font><br>'.
           '         %page%<br>'.
           '   </body><br>'.
           '</html>'
      },
      "filter" => {
         type => "htmltext",
         label => "Jugendschutzfilter",
         order => 4,
         writeonly => 1,
         mode => "html",
      },
      "register" => {
         type => "htmltext",
         label => "Registrierung",
         order => 5,
         writeonly => 1,
         mode => "html",
      },
      "registerok" => {
         type => "htmltext",
         label => "Registrierung: ITAN",
         order => 6,
         writeonly => 1,
         mode => "html",
      },
   };

   $DB->{tables}->{$CUSTOMER} = {
      primarykey => [$UNIQIDCOLUMNNAME],
      rights => $RIGHTS,
      dbuser => $DBUSER,
      order => 20,
      label => "Kunde",
      crossShowInSelect => "name",
      icon => 'bilder/kunden.png',
      infotext => "TABLE<br><br>Dies is ne ONline hilfe<br>testtest<br>aaa",
      infotextedit => "EDIT<br><br>Dies is ne ONline hilfe<br>testtest<br>aaa",
      columns => {
         $UNIQIDCOLUMNNAME => {
            type => $UNIQIDCOLUMNNAME,
            order => 1,
            label => "Kunden ID",
            qxmaxsize => 100
         },
         "name" => {
            type => "text",
            label => "Kundenname",
            showInSelect => 1,
            order => 4,
            qxmaxsize => 200
         },
         "beschreibung" => {
            type => "text",
            label => "Beschreibung",
            order => 9
         },
         %$vorlagen,
         $USERSTABLENAME."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Verwalter",
            qxminsize => 150,
            qxmaxsize => 150,
            linkto => $USERSTABLENAME,
         },
         "noenduserverify" => {
            type => "boolean",
            label => "Keine Endbenutzer",
            order => 8,
            default => 0,
            qxminsize => 30,
            qxmaxsize => 30,
         },
         $DELETEDCOLUMNNAME => {
            type => $DELETEDCOLUMNNAME,
            order => 5
         }
      }
   };

   my $i = 1;
   $DB->{tables}->{"verifiedart"} = {
      primarykey => [$UNIQIDCOLUMNNAME],
      rights => $RIGHTS,
      dbuser => $DBUSER,
      order => 20,
      label => "Verifikationsart",
      crossShowInSelect => "name",
      icon => 'bilder/kunden.png',
      startvalues => [{
        "name" => "Ausweis im Sinne des § 2 Absatz 1 des Personalausweisgesetzes",
      }, {
        "name" => "Passes im Sinne des § 1 Absatz 2 des Passgesetzes,",
      }, {
        "name" => "Gültiges amtlichen Ausweises, der ein Lichtbild des Inhabers enthält und mit dem die Pass- und Ausweispflicht im Inland erfüllt wird, wozu insbesondere auch ein nach ausländerrechtlichen Bestimmungen anerkannter oder zugelassener Pass, Personalausweis oder Pass- oder Ausweisersatz zählt",
      }, {
        "name" => "Vorlage eines Aufenthaltstitels",
      }, {
        "name" => "Vorlage eines Ankunftsnachweises nach § 63a Absatz 1 des Asylgesetzes oder einer Bescheinigung über die Aufenthaltsgestattung nach § 63 Absatz 1 des Asylgesetzes",
      }, {
        "name" => "Vorlage einer Bescheinigung über die Aussetzung der Abschiebung nach § 60a Absatz 4 des Aufenthaltsgesetzes oder",
      }, {
        "name" => "Vorlage eines Auszugs aus dem Handels- oder Genossenschaftsregister oder einem vergleichbaren amtlichen Register oder Verzeichnis, der Gründungsdokumente oder gleichwertiger beweiskräftiger Dokumente oder durch Einsichtnahme in diese Register oder Verzeichnisse und Abgleich mit den darin enthaltenen Daten, sofern es sich bei dem Anschlussinhaber um eine juristische Person oder Personengesellschaft handelt",
      }, {
        "name" => "Sonstiges (UNZULÄSSIG!!!)",
      }],
      columns => {
         $UNIQIDCOLUMNNAME => {
            type => $UNIQIDCOLUMNNAME,
            order => $i++,
            label => "Kunden ID",
            qxmaxsize => 100
         },
         "name" => {
            type => "longtext",
            label => "Name",
            order => $i++,
            showInSelect => 1,
            notnull => 1,
         },
         $DELETEDCOLUMNNAME => {
            type => $DELETEDCOLUMNNAME,
            order => $i++,
         }
      }
   };

   $i = 1;
   $DB->{tables}->{"enduser"} = {
      primarykey => [$UNIQIDCOLUMNNAME],
      rights => $RIGHTS,
      dbuser => $DBUSER,
      order => 20,
      label => "Endbenutzer",
      crossShowInSelect => "name",
      icon => 'bilder/kunden.png',
      columns => {
         $UNIQIDCOLUMNNAME => {
            type => $UNIQIDCOLUMNNAME,
            order => $i++,
            label => "Kunden ID",
            hidden => 0,
            qxmaxsize => 100
         },
         "ueb".$i => {
            type => "virtual",
            qxtype => "html",
            label => " ",
            default => "<br><b>Ticketsystem</b>",
            writeonly => 1,
            order => $i++,
         },
         "created" => {
            type => "datetime",
            label => "Angelegt am",
            order => $i++,
            readonly => 1,
            defaultfunc => sub {
               return localtime2sql(time());
            },
            qxminsize => 30,
            notnull => 1,
         },
         "lastseen" => {
            type => "datetime",
            label => "Letzte Aktivität",
            order => $i++,
            readonly => 1,
            qxminsize => 30,
         },
         "address" => {
            type => "text",
            label => "MAC-Adresse",
            showInSelect => 1,
            order => $i++,
         },
         "tannum" => {
            type => "number",
            label => "TAN auswahl",
            qxminsize => 100,
            qxmaxsize => 100,
            readonly => 1,
         },
         "verified" => {
            type => "boolean",
            label => "Ueberprueft (iTAN)",
            showInSelect => 1,
            order => $i++,
            qxminsize => 30,
            qxmaxsize => 60,
         },
         "ueb".$i => {
            type => "virtual",
            qxtype => "html",
            label => " ",
            default => "<br><b>&Uuml;berpr&uuml;fung</b>",
            writeonly => 1,
            order => $i++,
         },
         "verifiedart"."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            linkto => "verifiedart",
            label => "Art",
            showInSelect => 1,
            order => $i++,
         },
         "stelle" => {
            type => "text",
            label => "Ausstellende Stelle",
            defaultfunc => sub {
               return "-";
            },
            showInSelect => 1,
            order => $i++,
         },
         "auswnummer" => {
            type => "text",
            defaultfunc => sub {
               return "-";
            },
            label => "Ausweisnummer",
            showInSelect => 1,
            order => $i++,
         },
         "ueb".$i => {
            type => "virtual",
            qxtype => "html",
            label => " ",
            default => "<br><b>Personendaten</b>",
            writeonly => 1,
            order => $i++,
         },
         "forename" => {
            type => "text",
            label => "Vorname",
            showInSelect => 1,
            order => $i++,
            notnull => 1,
            qxmaxsize => 200,
         },
         "name" => {
            type => "text",
            label => "Nachname",
            showInSelect => 1,
            notnull => 1,
            order => $i++,
            qxmaxsize => 200
         },
         "gebdatum" => {
            type => "date",
            label => "Geburtsdatum",
            order => $i++,
            qxdefaultsize => 140,
            qxminsize => 140,
            qxmaxsize => 140,
            qxtype => "html",
            #syntaxcheck => "\d{1,2}\.\d{1,2}\.\d{1,2\
         },
         "street" => {
            type => "text",
            label => "Straße",
            order => $i++,
            defaultfunc => sub {
               my $self = shift;
               my $tmp = $self->{dbm}->{config}->{ticketstreet} || "-";
               from_to($tmp, "utf8", "iso-8859-1");
               return $tmp;
            },
         },
         "plz" => {
            type => "text",
            label => "PLZ",
            order => $i++,
            defaultfunc => sub {
               my $self = shift;
               my $tmp = $self->{dbm}->{config}->{ticketplz} || "-";
               from_to($tmp, "utf8", "iso-8859-1");
               return $tmp;
            },
         },
         "city" => {
            type => "text",
            label => "Stadt",
            order => $i++,
            defaultfunc => sub {
               my $self = shift;
               my $tmp = $self->{dbm}->{config}->{ticketcity} || "-";
               from_to($tmp, "utf8", "iso-8859-1");
               return $tmp;
            },
         },
         "agent" => {
            type => "text",
            label => "Browseragent",
            order => $i++,
         },
         "hostname" => {
            type => "text",
            label => "DHCP Hostname",
            order => $i++,
         },
         "vendor" => {
            type => "text",
            label => "DHCP Vendor",
            order => $i++,
         },
         $DELETEDCOLUMNNAME => {
            type => $DELETEDCOLUMNNAME,
            order => $i++,
         }
      }
   };

   $i = 0;
   $DB->{tables}->{$TICKETS} = {
      primarykey => [$UNIQIDCOLUMNNAME],
      rights => $RIGHTS,
      dbuser => $DBUSER,
      order => 18,
      label => "Tickets",
      qxwidth => 700,
      qxheight => 400,
      qxeditwidth => 520,
      infotext => "Test123",
      qxeditheight => 580,
      nosimple => 1,
      nolog => 1,
      orderby => [$TICKETS.$TSEP.$UNIQIDCOLUMNNAME."_"],
      crossShowInSelect => $NAMECOLUMNNAME,
      icon => 'bilder/ticket.png',
      columns => {
         $UNIQIDCOLUMNNAME => {
            type => $UNIQIDCOLUMNNAME,
            order => $i++,
            label => "Ticket Nummer",
            showInSelect => 1,
            readonly => 1,
            hidden => 0,
            qxminsize => 30,
            qxmaxsize => 100
         },
         $BOXES."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Installation",
            writeonly => 1,
            linkto => $BOXES,
            order => $i++,
         },
         "noenduserverify" => {
            type => "boolean",
            label => "Keine Endbenutzer",
            order => $i++,
            default => 0,
            qxminsize => 30,
            qxmaxsize => 30,
            writeonly => 1,
         },
         $VERBUND."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Installationsverbund",
            writeonly => 1,
            qxminsize => 30,
            qxmaxsize => 30,
            linkto => $VERBUND,
            order => $i++,
         },
         $URLFILTER."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Filter",
            writeonly => 1,
            qxminsize => 30,
            qxmaxsize => 30,
            linkto => $URLFILTER,
            order => $i++,
         },
         $CUSTOMER."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Kunde",
            #writeonly => 1,
            notnull => 1,
            qxminsize => 100,
            qxmaxsize => 150,
            linkto => $CUSTOMER,
            order => $i++,
         },
         "nutzungszeit" => {
            type => "longtext",
            label => "Nutzungszeit",
            order => $i++,
         },
         $DELETEDCOLUMNNAME => {
            type => $DELETEDCOLUMNNAME,
            order => $i++,
         },
         $NAMECOLUMNNAME => {
            type => "text",
            label => "Name",
            showInSelect => 1,
            order => $i++,
            #qxdefaultsize => 100,
            qxminsize => 100,
            #qxmaxsize => 100,
         },
         $PASS => {
            type => "text",
            label => "Passwort",
            writeonly => 1,
            defaultfunc => sub {
               my $string = "";
               srand(time());
               for(my $k=0; $k < 8; $k++){
                  $string = $string.chr(int(rand(26)) + 97);
               }
               return $string;
            },
            order => $i++,
         },
         "nomultiple" => {
            type => "boolean",
            label => "Keine Mehrfachnutzung",
            unit => "Der Benutzer kann Tickets nur mit einem Endgeraet nutzen.",
            order => $i++,
            default => 1,
            qxminsize => 30,
            qxmaxsize => 30,
         },
         "room" => {
            type => "text",
            label => "Zimmer",
            showInSelect => 1,
            order => $i++,
            #qxdefaultsize => "50%",
            qxminsize => 100,
            #qxmaxsize => 320,
         },
         "used" => {
            type => "number",
            hidden => 1,
            selectAlsoIfHidden => 1,
            label => "Benutzt",
            order => $i++,
            unit => "Minuten",
         },
         $TIMESTAMP => {
            type => "datetime",
            label => "Gueltig bis",
            order => $i++,
            qxdefaultsize => 140,
            qxminsize => 140,
            qxmaxsize => 140,
            qxtype => "html",
            notnull => 1,
         },
         "start" => {
            type  => "datetime",
            label => "Nutzungsbeginn",
            order => $i++,
         },
         "maxusedays" => {
            label => "Nutzungsdauer",
            order => $i++,
            unit => "Maximale Nutzungsdauer in Tagen (0 = Unendlich), Beispiel: 30.24",
            qxminsize => 50,
            qxmaxsize => 150,
            type => "virtual",
            usevirtualoderby => $TICKETS.$TSEP.$TIMESTAMP,
            qxtype => "html",
            readonly => 1,
            showInSelect => 1,
            code => sub {
               my $line = shift;
               my $curSession = shift;
               my $options = shift;
               my $db = shift; #$self->getDBBackend($WORKTIME);
               my $onetime = shift;
               my $id = $line->{$TICKETS.$TSEP."id"};
               my $money = 0;
               my $price = 30;
               my $days = 0;
               die
                  unless $id;
               foreach my $curtable ([$BUCHUNGEN => [$BUCHUNGEN.$TSEP.$TICKETS."_".$UNIQIDCOLUMNNAME.'="'.$id.'"']],
                                     [$MAC       => undef]) {
                  unless ($onetime->{$curtable}) {
                     $onetime->{$curtable->[0]} = $db->getDataSet({
                        table => $curtable->[0],
                        wherePre => $curtable->[1] || [],
                        session => $curSession,
                        simple => 1,
                        nocode => 1,
                     });
                  }
                  die
                     unless (defined($onetime->{$curtable->[0]}) &&
                                (ref($onetime->{$curtable->[0]}) eq "ARRAY") &&
                                (ref($onetime->{$curtable->[0]}->[0]) eq "ARRAY"));
               }
               my $anzdevices = scalar(grep { $_->{$MAC.$TSEP.$TICKETS."_".$UNIQIDCOLUMNNAME} eq $id } @{$onetime->{$MAC}->[0]});
               $line->{$BUCHUNGEN.$TSEP."anzahl"} = $anzdevices;
               $price = getPricesForCount($anzdevices, $line->{$TICKETS.$TSEP."rabatt"});
               foreach my $curline (@{$onetime->{$BUCHUNGEN}->[0]}) {
                  $money += $curline->{$BUCHUNGEN.$TSEP."payment"} || $price;
               }
               my $newticketdays =
                  $self->{config}->{newmaxusedays} ||
                  $self->{config}->{overwritecopymaxusedays} ||
                  $self->{config}->{copymaxusedays} || 28;
               $days = $newticketdays * ($money / $price);
               #print "COUNT FOR ".$id." IS ".$anzdevices." WITH ".$money." MONEY -> ".$days." (".$newticketdays." * (".$money." / ".$price.")) RABATT=".$line->{$TICKETS.$TSEP."rabatt"}."\n";
               return int($days*100)/100;
            },
         },
         "anzahl" => {
            type => "virtual",
            usevirtualoderby => $TICKETS.$TSEP."nomultiple",
            order => $i++,
            code => sub {
               my $line = shift;
               my $curSession = shift;
               my $options = shift;
               my $db = shift; #$self->getDBBackend($WORKTIME);
               my $onetime = shift;
               my $id = $line->{$TICKETS.$TSEP."id"};
               my $anzdevices = scalar(grep {
                  $_->{$MAC.$TSEP.$TICKETS."_".$UNIQIDCOLUMNNAME} eq $id
               } @{$onetime->{$MAC}->[0]});
               return $anzdevices;
            },
         },
         "daysremaining" => {
            type => "virtual",
            usevirtualoderby => $TICKETS.$TSEP."start",
            order => $i++,
            code => sub {
               my $line = shift;
               my $curSession = shift;
               my $options = shift;
               my $db = shift; #$self->getDBBackend($WORKTIME);
               my $onetime = shift;
               if ($line->{$TICKETS.$TSEP."used"} &&
                   $line->{$TICKETS.$TSEP."start"} && (my $reftime = sql2time(
                   $line->{$TICKETS.$TSEP."start"}))) {
                  return $line->{$TICKETS.$TSEP."maxusedays"} - ((time()-$reftime) / 60 / 60 / 24);
               }
               return $line->{$TICKETS.$TSEP."maxusedays"};
            },
         },
         "created" => {
            type => "datetime",
            label => "Angelegt am",
            order => $i++,
            readonly => 1,
            defaultfunc => sub {
               return localtime2sql(time());
            },
            qxminsize => 30,
         },
         "rabatt" => {
            type => "number",
            label => "Rabatt bei X Geräten",
            unit => "Rabatt wird nur gewährt wenn die Anzahl an registriertern Geräten der angegeben Zahl entspricht.",
            order => $i++,
            default => 0,
         },
         "beschreibung" => {
            type => "text",
            label => "Beschreibung",
            order => $i++,
            writeonly => 1,
         },
         $VORLAGE."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Ticketvorlage",
            notnull => 1,
            order => $i++,
            qxminsize => 100,
            qxmaxsize => 150,
            linkto => $VORLAGE,
            # TODO:FIXME:XXX: Funktioniert nur im Qooxdoo oder beim DBManager, nur hier existiert $session!
            defaultfunc => sub {
               my $session = shift;
               #my $tmp = (ref($session) eq "HASH") ? join(",", map { $_.":".$session->{$_} } keys %$session) : ref($session);
               #print "<br>VORLAGE: ".$tmp.":<br>\n";
               #print "VORLAGE: ".$session->{$USERSTABLENAME.$TSEP.$VORLAGE."_".$UNIQIDCOLUMNNAME}.":\n";
               return $session->{$USERSTABLENAME.$TSEP.$VORLAGE."_".$UNIQIDCOLUMNNAME} ?
                      $session->{$USERSTABLENAME.$TSEP.$VORLAGE."_".$UNIQIDCOLUMNNAME} : undef;
            },
            #writeonly => 1
         }
      }
   };

   sub getPricesForCount {
      my $count = shift;
      my $rabatt = shift || 0;
      my $return =
         $count >= 4 ? 30 :
         $count >= 3 ? 25 :
         $count >= 2 ? 20 :
                       10;
      $return -= 5
          if (($count <= 4) && $rabatt && ($count == $rabatt));
      return $return;
   }

   sub getBooks {
      my $onetime = shift;
      my $db = shift;
      my $id = shift;
      my $userid = shift;
      my $curSession = shift;
      my $table = shift;
      my $column = shift;
      my $next = shift;
      my $return = undef;
      my $wherePre = []; #$self->Where_Pre({
      #   curSession => $curSession,
      #   table => $table,
      #});
      #print " == ID=".$id." ==\n";
      #push(@$wherePre, "( ".$table.$TSEP.$USERSTABLENAME."_".$UNIQIDCOLUMNNAME." = '".$userid."' )");
      my $ret = undef;
      unless (defined($onetime->{ret})) {
         $onetime->{ret} = $db->getDataSet({
            table => $table,
            wherePre => $wherePre,
            session => $curSession,
            simple => 1,
            nocode => 1,
         });
         #print "FETCHING\n";
      }
      if (defined($onetime->{ret}) &&
             (ref($onetime->{ret}) eq "ARRAY") && (scalar(
                @{$onetime->{ret}->[0]}))) {
         my $nextdone = 0;
         foreach my $curline (@{$onetime->{ret}->[0]}) {
            my $doset = 0;
            if ($next) {
               if ($curline->{$table.$TSEP."id"} eq $id) {
                  $nextdone++;
                  next;
               }
            } else {
               last
                  if $curline->{$table.$TSEP."id"} eq $id;
               $doset++;
            }
            #print "USERID=".$curline->{$table.$TSEP.$USERSTABLENAME."_".$UNIQIDCOLUMNNAME}."==".$userid." ID=".$curline->{$table.$TSEP."id"}."==".$id." URLAUB=".$curline->{$table.$TSEP."urlaub"}."\n";
            if ($doset || $nextdone) {
               $return =
                  $curline->{$column} if defined(
                  $curline->{$column}) && (
                  $curline->{$column} ||
                  $curline->{$column} eq "0");
            }
            last
               if $nextdone;
         }
      }
      return $return;
   }

   $DB->{tables}->{$VERBUND} = {
      primarykey => [$UNIQIDCOLUMNNAME],
      rights => $RIGHTS,
      dbuser => $DBUSER,
      order => 20,
      label => "Installationscluster",
      icon => "resource/qx/icon/Tango/32/places/network-workgroup.png",
      crossShowInSelect => "ip",
      columns => {
         $UNIQIDCOLUMNNAME => {
            type => $UNIQIDCOLUMNNAME,
            order => 1,
            label => "Verbund ID",
            qxmaxsize => 70,
            hidden => 1
         },
         $CUSTOMER."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Kunde",
            notnull => 1,
            qxminsize => 100,
            qxmaxsize => 200,
            linkto => $CUSTOMER,
            order => 2,
         },
         "ip" => {
            type => "text",
            label => "Verbundname",
            showInSelect => 1,
            order => 3,
         },
         "tananz" => {
            type => "number",
            label => "TANs pro Name",
            showInSelect => 1,
            order => 4,
         },
         "tanid" => {
            type => "text",
            label => "Secret",
            showInSelect => 1,
            order => 5,
         },
         "defaultdays" => {
            type => "number",
            label => "GÃ¼ltigkeitsdauer",
            unit => "Standard in Tagen, optional",
            showInSelect => 1,
            order => 4,
         },
         "noenduserverify" => {
            type => "boolean",
            label => "Keine Endbenutzer",
            order => 8,
            default => 0,
            qxminsize => 30,
            qxmaxsize => 30,
         },
         %$vorlagen,
         $DELETEDCOLUMNNAME => {
            type => $DELETEDCOLUMNNAME,
            order => 9,
         },
      }
   };

   $i = 1;
   $DB->{tables}->{$MAC} = {
      #readonly => 1,
      primarykey => [$UNIQIDCOLUMNNAME],
      rights => $RIGHTS,
      dbuser => $DBUSER,
      order => 19,
      icon => 'bilder/mac2.png',
      crossShowInSelect => "address" ,
      crossshowastable => 1,
      nolog => 1,
      label => "Aktive Ticket",
      columns => {
         $UNIQIDCOLUMNNAME => {
            type => $UNIQIDCOLUMNNAME,
            order => $i++,
            showInSelect => 1,
            label => "ID",
            qxmaxsize => 100
         },
         $TICKETS."_".$UNIQIDCOLUMNNAME => {
            type    => "number",
            label   => "Ticket",
            order   => $i++,
            notnull => 1,
            linkto  => $TICKETS,
         },
         "address" => {
            type         => "text",
            label        => "MAC-Adresse",
            showInSelect => 1,
            order        => $i++,
         },
         $TIMESTAMP => {
            type  => "date",
            label => "Letztes update",
            showInSelect => 1,
            order => $i++,
         },
         "start" => {
            type  => "date",
            label => "Nutzungsbeginn",
            order => $i++,
         },
         $DELETEDCOLUMNNAME => {
            type  => $DELETEDCOLUMNNAME,
            order => $i++,
         }
      }
   };

   $DB->{tables}->{$MACSPEZIAL} = {
      primarykey => [$UNIQIDCOLUMNNAME],
      rights => $RIGHTS,
      dbuser => $DBUSER,
      order => 19,
      crossShowInSelect => "address" ,
      label => "MAC-Spezialeinstellung",
      icon => 'bilder/merge.png',
      columns => {
         $UNIQIDCOLUMNNAME => {
            type => $UNIQIDCOLUMNNAME,
            order => 1,
            label => "ID",
            qxmaxsize => 100
         },
         $CUSTOMER."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Kunde",
            order => 13,
            notnull => 1,
            qxminsize => 100,
            qxmaxsize => 100,
            linkto => $CUSTOMER,
         },
         $BOXES."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Installation",
            order => 11,
            qxminsize => 100,
            qxmaxsize => 100,
            linkto => $BOXES,
         },
         $VERBUND."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Installationsverbund",
            order => 12,
            qxminsize => 100,
            qxmaxsize => 100,
            linkto => $VERBUND,
         },
         "address" => {
            type => "text",
            label => "MAC-Adresse",
            showInSelect => 1,
            order => 2,
         },
         "timeout" => {
            type => "number",
            label => "Tickettimeout",
            unit => "Sekunden Nützlich zum automatischen Logout an festinstallierten Surfstationen, wenn der Benuzter inaktiv ist.",
            showInSelect => 1,
            order => 3,
         },
         "block" => {
            type => "boolean",
            label => "Blocken",
            showInSelect => 1,
            unit => "Wenn aktiv, darf Computer in keinem Falle surfen.",
            order => 5,
            qxminsize => 30,
            qxmaxsize => 60,
         },
         $DELETEDCOLUMNNAME => {
            type => $DELETEDCOLUMNNAME,
            order => 6
         }
      }
   };

   $DB->{tables}->{$BOXES} = {
      primarykey => [$UNIQIDCOLUMNNAME],
      rights => $RIGHTS,
      dbuser => $DBUSER,
      order => 18,
      label => "Box",
      crossShowInSelect => $NAMECOLUMNNAME,
      icon => "bilder/ap.png",
      columns => {
         $UNIQIDCOLUMNNAME => {
            qxmaxsize => 100,
            type => $UNIQIDCOLUMNNAME,
            order => 1,
            label => "Ticket Nummer",
         },
         $CUSTOMER."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Kunde",
            notnull => 1,
            qxminsize => 100,
            qxmaxsize => 100,
            linkto => $CUSTOMER,
         },
         $VERBUND."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Installationsverbund",
            qxminsize => 100,
            qxmaxsize => 100,
            linkto => $VERBUND,
         },
         $NAMECOLUMNNAME => {
            type => "text",
            label => "Name",
            showInSelect => 1,
            order => 3,
         },
         "noenduserverify" => {
            type => "boolean",
            label => "Keine Endbenutzer",
            order => 8,
            default => 0,
            qxminsize => 30,
            qxmaxsize => 30,
         },
         $PASS => {
            type => "text",
            label => "Passwort",
            writeonly => 1,
            defaultfunc => sub {
               my $string;
               my $i;
               srand(time());
               for(my $i=0; $i < 8; $i++){
                  $string = $string.chr(int(rand(26)) + 97);
               }
               return $string;
            },
            order => 4
         },
         "sshtunnelport" => {
            type => "number",
            label => "SSH Tunnelport",
            order => 9,
            qxminsize => 100,
            qxmaxsize => 100,
         },
         "beschreibung" => {
            type => "text",
            label => "Beschreibung",
            order => 8
         },
         "sshkey" => {
            type => "longtext",
            label => "SSH-Key",
            order => 10,
            writeonly => 1
         },
         %$vorlagen,
         $DELETEDCOLUMNNAME => {
            type => $DELETEDCOLUMNNAME,
            order => 2
         }
      }
   };

   $DB->{tables}->{$FILTERKAT."_".$URLFILTER} = {
      primarykey => [$UNIQIDCOLUMNNAME],
      rights => $RIGHTS,
      dbuser => $DBUSER,
      order => 19,
      #icon => 'bilder/mac2.png',
      #crossShowInSelect => "address" ,
      label => "Filterzuordnung",
      columns => {
         $UNIQIDCOLUMNNAME => {
            type => $UNIQIDCOLUMNNAME,
            order => 1,
            label => "ID",
            qxmaxsize => 100
         },
         $URLFILTER."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Filtergruppe",
            showInSelect => 1,
            order => 2,
            linkto => $URLFILTER,
         },
         $FILTERKAT."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Filterkategorie",
            showInSelect => 1,
            order => 3,
            linkto => $FILTERKAT,
         },
         $DELETEDCOLUMNNAME => {
            type => $DELETEDCOLUMNNAME,
            order => 4,
         }
      }
   };

   $DB->{tables}->{$FILTERKAT} = {
      readonly => 1,
      primarykey => [$UNIQIDCOLUMNNAME],
      rights => $RIGHTS,
      dbuser => $DBUSER,
      order => 19,
      #icon => 'bilder/mac2.png',
      #crossShowInSelect => "address" ,
      label => "Filterkategorien",
      columns => {
         $UNIQIDCOLUMNNAME => {
            type => $UNIQIDCOLUMNNAME,
            order => 1,
            label => "ID",
            qxmaxsize => 100
         },
         "name" => {
            type => "text",
            label => "Kategorie",
            showInSelect => 1,
            order => 2,
         },
         "beschreibung" => {
            type => "longtext",
            label => "Beschreibung",
            showInSelect => 1,
            order => 3,
         },
         $DELETEDCOLUMNNAME => {
            type => $DELETEDCOLUMNNAME,
            order => 4,
         }
      }
   };


   $DB->{tables}->{$BUCHUNGEN} = {
      primarykey => [$UNIQIDCOLUMNNAME],
      rights => $RIGHTS,
      dbuser => $DBUSER,
      order => 20,
      #icon => 'bilder/mac2.png',
      #crossShowInSelect => "address" ,
      label => "Ticketbuchungen",
      columns => {
         $UNIQIDCOLUMNNAME => {
            type => $UNIQIDCOLUMNNAME,
            order => 1,
            label => "ID",
            qxmaxsize => 100
         },
         $TICKETS."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Bebuchtes Ticket",
            showInSelect => 1,
            order => 2,
            linkto => $TICKETS,
         },
         "payment" => {
            type => "text",
            label => "Betrag",
            showInSelect => 1,
            order => 3,
         },
         "brums" => {
            type => "longnumber",
            showInSelect => 1,
            label => "BrUms Ticket",
            order => $i++,
         },
         "brumsok" => {
            type => "boolean",
            label => "BrUms bezahlt",
            unit => "Hier wird angegeben wenn der BrUms Code bezahlt worden ist. Solange das nicht der Fall ist, ist kein neuer für alle MACs auf diesem Ticket buchbar.",
            order => $i++,
            default => 0,
            showInSelect => 1,
            qxminsize => 30,
            qxmaxsize => 30,
         },
         $ZAHLUNGSART."_".$UNIQIDCOLUMNNAME => {
            type => "number",
            label => "Bezahlungsart",
            showInSelect => 1,
            order => 5,
            linkto => $ZAHLUNGSART,
         },
         $TIMESTAMP => {
            type  => "datetime",
            label => "Buchungsdatum",
            order => $i++,
         },
         "abgeholt" => {
            type  => "datetime",
            label => "Abgeholt",
            order => $i++,
         },
         $DELETEDCOLUMNNAME => {
            type => $DELETEDCOLUMNNAME,
            order => $i++,
         },
      }
   };

   #TODO: Tabelle Zahlungsart
   $DB->{tables}->{$ZAHLUNGSART} = {
      primarykey => [$UNIQIDCOLUMNNAME],
      rights => $RIGHTS,
      dbuser => $DBUSER,
      order => 21,
      #icon => 'bilder/mac2.png',
      #crossShowInSelect => "address" ,
      label => "Zahlungsart",
      startvalues => [{
         "name" => "Paypal",
      },{
         "name" => "BrUms",
      },{
         "name" => "NGE", #3 Nächste Generation Einzahlung
      },{
         "name" => "Bankueberweisung",
      }],
      columns => {
         $UNIQIDCOLUMNNAME => {
            type => $UNIQIDCOLUMNNAME,
            order => 1,
            label => "ID",
            qxmaxsize => 100
         },
         "name" => {
            type => "text",
            label => "Servicename",
            showInSelect => 1,
            order => 2,
            #linkto => $,
         },
         $DELETEDCOLUMNNAME => {
            type => $DELETEDCOLUMNNAME,
            order => 3,
         }
      }
   };

   return $DB;
}

1;
