Admin: Anlegen, Bearbeiten und Löschen von Mandanten implementiert
authorMoritz Bunkus <m.bunkus@linet-services.de>
Fri, 7 Jun 2013 11:36:52 +0000 (13:36 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Thu, 13 Jun 2013 14:31:35 +0000 (16:31 +0200)
SL/Controller/Admin.pm
SL/DB/AuthClient.pm
locale/de/all
templates/webpages/admin/edit_client.html [new file with mode: 0644]
templates/webpages/admin/show.html
templates/webpages/admin/test_db_connection.html

index d6e753a..0eee2a0 100644 (file)
@@ -14,7 +14,7 @@ use SL::User;
 
 use Rose::Object::MakeMethods::Generic
 (
-  'scalar --get_set_init' => [ qw(client user nologin_file_name db_cfg all_dateformats all_numberformats all_countrycodes all_stylesheets all_menustyles all_clients all_groups) ],
+  'scalar --get_set_init' => [ qw(client user nologin_file_name db_cfg all_dateformats all_numberformats all_countrycodes all_stylesheets all_menustyles all_clients all_groups all_users) ],
 );
 
 __PACKAGE__->run_before(\&setup_layout);
@@ -165,6 +165,83 @@ sub action_delete_user {
   $self->redirect_to(action => 'show');
 }
 
+#
+# actions: clients
+#
+
+sub action_new_client {
+  my ($self) = @_;
+
+  $self->client(SL::DB::AuthClient->new(
+    dbhost   => $::auth->{DB_config}->{host},
+    dbport   => $::auth->{DB_config}->{port},
+    dbuser   => $::auth->{DB_config}->{user},
+    dbpasswd => $::auth->{DB_config}->{password},
+  ));
+
+  $self->edit_client_form(title => t8('Create a new client'));
+}
+
+sub action_edit_client {
+  my ($self) = @_;
+  $self->edit_client_form(title => t8('Edit Client'));
+}
+
+sub action_save_client {
+  my ($self) = @_;
+  my $params = delete($::form->{client}) || { };
+  my $is_new = !$params->{id};
+
+  $self->client($is_new ? SL::DB::AuthClient->new : SL::DB::AuthClient->new(id => $params->{id})->load)->assign_attributes(%{ $params });
+
+  my @errors = $self->client->validate;
+
+  if (@errors) {
+    flash('error', @errors);
+    $self->edit_client_form(title => $is_new ? t8('Create a new client') : t8('Edit Client'));
+    return;
+  }
+
+  $self->client->save;
+  if ($self->client->is_default) {
+    SL::DB::Manager::AuthClient->update_all(set => { is_default => 0 }, where => [ '!id' => $self->client->id ]);
+  }
+
+  flash_later('info', $is_new ? t8('The client has been created.') : t8('The client has been saved.'));
+  $self->redirect_to(action => 'show');
+}
+
+sub action_delete_client {
+  my ($self) = @_;
+
+  if (!$self->client->delete) {
+    flash('error', t8('The client could not be deleted.'));
+    $self->edit_client_form(title => t8('Edit Client'));
+    return;
+  }
+
+  flash_later('info', t8('The client has been deleted.'));
+  $self->redirect_to(action => 'show');
+}
+
+sub action_test_database_connectivity {
+  my ($self)    = @_;
+
+  my %cfg       = %{ $::form->{client} || {} };
+  my $dbconnect = 'dbi:Pg:dbname=' . $cfg{dbname} . ';host=' . $cfg{dbhost} . ';port=' . $cfg{dbport};
+  my $dbh       = DBI->connect($dbconnect, $cfg{dbuser}, $cfg{dbpasswd});
+
+  my $ok        = !!$dbh;
+  my $error     = $DBI::errstr;
+
+  $dbh->disconnect if $dbh;
+
+  $self->render('admin/test_db_connection',
+                title => t8('Database Connection Test'),
+                ok    => $ok,
+                error => $error);
+}
+
 #
 # actions: locking, unlocking
 #
@@ -199,6 +276,7 @@ sub init_nologin_file_name { $::lx_office_conf{paths}->{userspath} . '/nologin';
 sub init_client            { SL::DB::AuthClient->new(id => ($::form->{id} || ($::form->{client} || {})->{id}))->load }
 sub init_user              { SL::DB::AuthUser  ->new(id => ($::form->{id} || ($::form->{user}   || {})->{id}))->load }
 sub init_all_clients       { SL::DB::Manager::AuthClient->get_all_sorted                                             }
+sub init_all_users         { SL::DB::Manager::AuthUser->get_all_sorted                                               }
 sub init_all_groups        { SL::DB::Manager::AuthGroup->get_all_sorted                                              }
 sub init_all_dateformats   { [ qw(mm/dd/yy dd/mm/yy dd.mm.yy yyyy-mm-dd)      ]                                      }
 sub init_all_numberformats { [ qw(1,000.00 1000.00 1.000,00 1000,00)          ]                                      }
@@ -245,6 +323,13 @@ sub edit_user_form {
   $self->render('admin/edit_user', %params);
 }
 
+sub edit_client_form {
+  my ($self, %params) = @_;
+
+  $::request->layout->use_javascript("${_}.js") for qw(jquery.selectboxes jquery.multiselect2side);
+  $self->render('admin/edit_client', %params);
+}
+
 #
 # helpers
 #
index bf016a6..9e3d3e8 100644 (file)
@@ -4,6 +4,7 @@ use strict;
 
 use SL::DB::MetaSetup::AuthClient;
 use SL::DB::Manager::AuthClient;
+use SL::DB::Helper::Util;
 
 __PACKAGE__->meta->add_relationship(
   users => {
@@ -22,4 +23,19 @@ __PACKAGE__->meta->add_relationship(
 
 __PACKAGE__->meta->initialize;
 
+sub validate {
+  my ($self) = @_;
+
+  my @errors;
+  push @errors, $::locale->text('The name is missing.')                                           if !$self->name;
+  push @errors, $::locale->text('The database name is missing.')                                  if !$self->dbname;
+  push @errors, $::locale->text('The database host is missing.')                                  if !$self->dbhost;
+  push @errors, $::locale->text('The database port is missing.')                                  if !$self->dbport;
+  push @errors, $::locale->text('The database user is missing.')                                  if !$self->dbuser;
+  push @errors, $::locale->text('The name is not unique.')                                        if !SL::DB::Helper::Util::is_unique($self, 'name');
+  push @errors, $::locale->text('The combination of database host, port and name is not unique.') if !SL::DB::Helper::Util::is_unique($self, 'dbhost', 'dbport', 'dbname');
+
+  return @errors;
+}
+
 1;
index 59ad0cb..58736b7 100755 (executable)
@@ -448,8 +448,7 @@ $self->{texts} = {
   'Close Books up to'           => 'Die Bücher abschließen bis zum',
   'Close Flash'                 => 'Schließen',
   'Close SEPA exports'          => 'SEPA-Export abschließen',
-  'Close Window'                => 'Fenster Schlie&szlig;en',
-  'Close window'                => 'Fenster schließen',
+  'Close Window'                => 'Fenster Schließen',
   'Closed'                      => 'Geschlossen',
   'Collective Orders only work for orders from one customer!' => 'Sammelaufträge funktionieren nur für Aufträge von einem Kunden!',
   'Column name'                 => 'Spaltenname',
@@ -496,6 +495,7 @@ $self->{texts} = {
   'Create Date'                 => 'Erstelldatum',
   'Create a new background job' => 'Einen neuen Hintergrund-Job anlegen',
   'Create a new business'       => 'Einen neuen Kunden-/Lieferantentyp erfassen',
+  'Create a new client'         => 'Einen neuen Mandanten anlegen',
   'Create a new department'     => 'Eine neue Abteilung erfassen',
   'Create a new payment term'   => 'Neue Zahlungsbedingungen anlegen',
   'Create a new project'        => 'Neues Projekt anlegen',
@@ -594,10 +594,12 @@ $self->{texts} = {
   'Database ID'                 => 'Datenbank-ID',
   'Database User'               => 'Datenbankbenutzer',
   'Database backups and restorations are disabled in the configuration.' => 'Datenbanksicherungen und -wiederherstellungen sind in der Konfiguration deaktiviert.',
+  'Database host and port'      => 'Datenbankhost und -port',
   'Database name'               => 'Datenbankname',
   'Database settings'           => 'Datenbankeinstellungen',
   'Database template'           => 'Datenbankvorlage',
   'Database update error:'      => 'Fehler beim Datenbankupgrade:',
+  'Database user and password'  => 'Datebankbenutzer und -passwort',
   'Dataset'                     => 'Datenbank',
   'Dataset missing!'            => 'Datenbank fehlt!',
   'Dataset name'                => 'Datenbankname',
@@ -634,6 +636,7 @@ $self->{texts} = {
   'Default Warehouse'           => 'Standard-Lager',
   'Default Warehouse with ignoring on hand' => 'Standardlager für Auslagern ohne Prüfung auf Bestand',
   'Default buchungsgruppe'      => 'Standardbuchungsgruppe',
+  'Default client'              => 'Standardmandant',
   'Default currency'            => 'Standardwährung',
   'Default currency missing!'   => 'Standardwährung fehlt!',
   'Default output medium'       => 'Standardausgabekanal',
@@ -770,6 +773,7 @@ $self->{texts} = {
   'Edit Assembly'               => 'Erzeugnis bearbeiten',
   'Edit Bins'                   => 'Lagerpl&auml;tze bearbeiten',
   'Edit Buchungsgruppe'         => 'Buchungsgruppe bearbeiten',
+  'Edit Client'                 => 'Mandanten bearbeiten',
   'Edit Credit Note'            => 'Gutschrift bearbeiten',
   'Edit Customer'               => 'Kunde editieren',
   'Edit Dunning'                => 'Mahnungen konfigurieren',
@@ -926,7 +930,6 @@ $self->{texts} = {
   'Filter date by'              => 'Datum filtern nach',
   'Filter for customer variables' => 'Filter für benutzerdefinierte Kundenvariablen',
   'Filter for item variables'   => 'Filter für benutzerdefinierte Artikelvariablen',
-  'Filter parts'                => 'Artikel filtern',
   'Finish'                      => 'Abschlie&szlig;en',
   'First 20 Lines'              => 'Nur erste 20 Datensätze',
   'Fix transaction'             => 'Buchung korrigieren',
@@ -990,6 +993,7 @@ $self->{texts} = {
   'Group'                       => 'Warengruppe',
   'Group Invoices'              => 'Rechnungen zusammenfassen',
   'Group Items'                 => 'Waren gruppieren',
+  'Group assignment'            => 'Gruppenzuordnung',
   'Group deleted!'              => 'Warengruppe gelöscht!',
   'Group membership'            => 'Gruppenzugehörigkeit',
   'Group missing!'              => 'Warengruppe fehlt!',
@@ -1347,7 +1351,7 @@ $self->{texts} = {
   'No transaction selected!'    => 'Keine Transaktion ausgewählt',
   'No transfers were executed in this export.' => 'In diesem SEPA-Export wurden keine Überweisungen ausgeführt.',
   'No unknown units where found.' => 'Es wurden keine unbekannten Einheiten gefunden.',
-  'No users have been created yet.' => 'Es wurden noch keine Benutzer angelegt.',
+  'No users have been created yet.' => 'Es wurden noch keine Benutzer anleget.',
   'No valid number entered for pricegroup "#1".' => 'Für Preisgruppe "#1" wurde keine gültige Nummer eingegeben.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'No warehouse has been created yet or the quantity of the bins is not configured yet.' => 'Es wurde noch kein Lager angelegt, bzw. die dazugehörigen Lagerplätze sind noch nicht konfiguriert.',
@@ -1505,6 +1509,7 @@ $self->{texts} = {
   'Please enter a profile name.' => 'Bitte geben Sie einen Profilnamen an.',
   'Please enter the currency you are working with.' => 'Bitte geben Sie die Währung an, mit der Sie arbeiten.',
   'Please enter the login for the new user.' => 'Bitte geben Sie das Login für den neuen Benutzer ein.',
+  'Please enter the name for the new client.' => 'Bitte geben Sie einen Namen für den neuen Mandanten ein.',
   'Please enter the name of the database that will be used as the template for the new database:' => 'Bitte geben Sie den Namen der Datenbank an, die als Vorlage f&uuml;r die neue Datenbank benutzt wird:',
   'Please enter the name of the dataset you want to restore the backup in.' => 'Bitte geben Sie den Namen der Datenbank ein, in der Sie die Sicherung wiederherstellen wollen.',
   'Please enter the sales tax identification number.' => 'Bitte geben Sie die Umsatzsteueridentifikationsnummer an.',
@@ -1975,6 +1980,7 @@ $self->{texts} = {
   'Templates'                   => 'Vorlagen',
   'Terms missing in row '       => '+Tage fehlen in Zeile ',
   'Test and preview'            => 'Test und Vorschau',
+  'Test database connectivity'  => 'Datenbankverbindung testen',
   'Text field'                  => 'Textfeld',
   'Text field variables: \'WIDTH=w HEIGHT=h\' sets the width and height of the text field. They default to 30 and 5 respectively.' => 'Textfelder: \'WIDTH=w HEIGHT=h\' setzen die Breite und die H&ouml;he des Textfeldes. Wenn nicht anders angegeben, so werden sie 30 Zeichen breit und f&uuml;nf Zeichen hoch dargestellt.',
   'Text variables: \'MAXLENGTH=n\' sets the maximum entry length to \'n\'.' => 'Textzeilen: \'MAXLENGTH=n\' setzt eine Maximall&auml;nge von n Zeichen.',
@@ -2016,9 +2022,14 @@ $self->{texts} = {
   'The business has been saved.' => 'Der Kunden-/Lieferantentyp wurde gespeichert.',
   'The business is in use and cannot be deleted.' => 'Der Kunden-/Lieferantentyp wird benutzt und kann nicht gelöscht werden.',
   'The changing of tax-o-matic account is NOT recommended, but if you do so please also (re)configure buchungsgruppen and reconfigure ALL charts which point to this tax-o-matic account. ' => 'Es wird nicht empfohlen Steuerkonten (Umsatzsteuer oder Vorsteuer) "umzuhängen", aber falls es gemacht wird, bitte auch entsprechend konsequent die Buchungsgruppen und die Konten die mit dieser Steuer verknüpft sind umkonfigurieren.',
+  'The client could not be deleted.' => 'Der Mandant konnte nicht gelöscht werden.',
+  'The client has been created.' => 'Der Mandant wurde angelegt.',
+  'The client has been deleted.' => 'Der Mandant wurde gelöscht.',
+  'The client has been saved.'  => 'Der Mandant wurde gespeichert.',
   'The column "make_X" can contain either a vendor\'s database ID, a vendor number or a vendor\'s name.' => 'Die Spalte "make_X" can entweder die Datenbank-ID des Lieferanten, eine Lieferantennummer oder einen Lieferantennamen enthalten.',
   'The column triplets can occur multiple times with different numbers "X" each time (e.g. "make_1", "model_1", "lastcost_1", "make_2", "model_2", "lastcost_2", "make_3", "model_3", "lastcost_3" etc).' => 'Die Spalten-Dreiergruppen können mehrfach auftreten, sofern sie unterschiedliche Nummern "X" verwenden (z.B. "make_1", "model_1", "lastcost_1", "make_2", "model_2", "lastcost_2", "make_3", "model_3", "lastcost_3" etc).',
   'The columns &quot;Dunning Duedate&quot;, &quot;Total Fees&quot; and &quot;Interest&quot; show data for the previous dunning created for this invoice.' => 'Die Spalten &quot;Zahlbar bis&quot;, &quot;Kumulierte Geb&uuml;hren&quot; und &quot;Zinsen&quot; zeigen Daten der letzten f&uuml;r diese Rechnung erzeugten Mahnung.',
+  'The combination of database host, port and name is not unique.' => '',
   'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/kivitendo.conf.' => 'Die Verbindung zum LDAP-Server kann nicht verschl&uuml;sselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/kivitendo.conf.',
   'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
   'The connection to the configured client database "#1" on host "#2:#3" failed.' => 'Die Verbindung zur konfigurierten Datenbank "#1" auf Host "#2:#3" schlug fehl.',
@@ -2031,9 +2042,13 @@ $self->{texts} = {
   'The custom variable has been saved.' => 'Die benutzerdefinierte Variable wurde gespeichert.',
   'The database #1 has been successfully deleted.' => 'Die Datenbank #1 wurde erfolgreich gelöscht.',
   'The database for user management and authentication does not exist. You can create let kivitendo create it with the following parameters:' => 'Die Datenbank für die Benutzeranmeldung existiert nicht. Sie können Sie von kivitendo automatisch mit den folgenden Parametern anlegen lassen:',
+  'The database host is missing.' => 'Der Datenbankhost fehlt.',
+  'The database name is missing.' => 'Der Datenbankname fehlt.',
+  'The database port is missing.' => 'Der Datenbankport fehlt.',
   'The database update/creation did not succeed. The file #1 contained the following error:' => 'Die Datenbankaktualisierung/erstellung schlug fehl. Die Datei #1 enthielt den folgenden Fehler:',
   'The database upgrade for the introduction of Buchungsgruppen is now complete.' => 'Das Datenbankupgrade f&uuml;r die Einf&uuml;hrung von Buchungsgruppen ist jetzt beendet.',
   'The database upgrade for the introduction of units is now complete.' => 'Das Datenbankupgrade zwecks Einf&uuml;hrung von Einheiten ist nun beendet.',
+  'The database user is missing.' => 'Der Datenbankbenutzer fehlt.',
   'The dataset #1 has been successfully created.' => 'Die Datenbank #1 wurde erfolgreich angelegt.',
   'The dataset backup has been sent via email to #1.' => 'Die Datenbanksicherung wurde per Email an #1 verschickt.',
   'The dataset has to exist before a restoration can be started.' => 'Die Datenbank muss vor der Wiederherstellung bereits angelegt worden sein.',
@@ -2066,6 +2081,7 @@ $self->{texts} = {
   'The following Datasets need to be updated' => 'Folgende Datenbanken müssen aktualisiert werden',
   'The following currencies have been used, but they are not defined:' => 'Die folgenden Währungen wurden benutzt, sind aber nicht ordnungsgemäß in der Datenbank eingetragen:',
   'The following drafts have been saved and can be loaded.' => 'Die folgenden Entw&uuml;rfe wurden gespeichert und k&ouml;nnen geladen werden.',
+  'The following groups are valid for this client' => 'Die folgenden Gruppen sind für diesen Mandanten gültig',
   'The following list has been generated automatically from existing users collapsing users with identical settings into a single entry.' => 'Die folgende Liste wurde automatisch aus den im System vorhandenen Benutzern zusammengestellt, wobei identische Einstellungen zu einem Eintrag zusammengefasst wurden.',
   'The following old files whose settings have to be merged manually into the new configuration file "config/kivitendo.conf" still exist:' => 'Es existieren noch die folgenden alten Dateien, deren Einstellungen manuell in die neue Konfiguratsdatei "config/kivitendo.conf" migriert werden müssen:',
   'The following transaction contains wrong taxes:' => 'Die folgende Buchung enthält falsche Steuern:',
@@ -2073,6 +2089,7 @@ $self->{texts} = {
   'The following transactions are concerned:' => 'Die folgenden Buchungen sind betroffen:',
   'The following units are unknown.' => 'Die folgenden Einheiten sind unbekannt.',
   'The following units exist already:' => 'Die folgenden Einheiten existieren bereits:',
+  'The following users will have access to this client' => 'Die folgenden Benutzer werden auf diesen Mandanten Zugriff haben',
   'The following warnings occured during an upgrade to the document templates:' => 'Die folgenden Warnungen traten w&auml;hrend einer Aktualisierung der Dokumentenvorlagen auf:',
   'The formula needs the following syntax:<br>For regular article:<br>Variablename= Variable Unit;<br>Variablename2= Variable2 Unit2;<br>...<br>###<br>Variable + ( Variable2 / Variable )<br><b>Please be beware of the spaces in the formula</b><br>' => 'Die Formeln m&uuml;ssen in der folgenden Syntax eingegeben werden:<br>Bei normalen Artikeln:<br>Variablenname = Variable Einheit;<br>Variablenname2 = Variable2 Einheit2;<br>...<br>###<br>Variable + Variable2 * ( Variable - Variable2 )<br>Variablennamen und Einheiten dürfen nur aus alphanumerischen Zeichen bestehen.<br>Es muss jeweils die Gesamte Zeile eingegeben werden',
   'The greetings have been saved.' => 'Die Anreden wurden gespeichert',
@@ -2090,6 +2107,7 @@ $self->{texts} = {
   'The name in row %d has already been used before.' => 'Der Name in Zeile %d wurde vorher bereits benutzt.',
   'The name is missing in row %d.' => 'Der Name fehlt in Zeile %d.',
   'The name is missing.'        => 'Der Name fehlt.',
+  'The name is not unique.'     => 'Der Name ist nicht eindeutig.',
   'The name must only consist of letters, numbers and underscores and start with a letter.' => 'Der Name darf nur aus Buchstaben (keine Umlaute), Ziffern und Unterstrichen bestehen und muss mit einem Buchstaben beginnen.',
   'The number of days for full payment' => 'Die Anzahl Tage, bis die Rechnung in voller Höhe bezahlt werden muss',
   'The option field is empty.'  => 'Das Optionsfeld ist leer.',
@@ -2151,9 +2169,9 @@ $self->{texts} = {
   'The unit in row %d has been used in the meantime and cannot be changed anymore.' => 'Die Einheit in Zeile %d wurde in der Zwischenzeit benutzt und kann nicht mehr ge&auml;ndert werden.',
   'The units have been saved.'  => 'Die Einheiten wurden gespeichert.',
   'The user can chose which client to connect to during login.' => 'Bei der Anmeldung kann der Benutzer auswählen, welchen Mandanten er benutzen möchte.',
-  'The user could not be deleted.' => '',
+  'The user could not be deleted.' => 'Der Benutzer konnte nicht gelöscht werden.',
   'The user has been created.'  => 'Der Benutzer wurde angelegt.',
-  'The user has been deleted.'  => '',
+  'The user has been deleted.'  => 'Der Benutzer wurde gelöscht.',
   'The user has been saved.'    => 'Der Benutzer wurde gespeichert.',
   'The variable name must only consist of letters, numbers and underscores. It must begin with a letter. Example: send_christmas_present' => 'Der Variablenname darf nur aus Zeichen (keine Umlaute), Ziffern und Unterstrichen bestehen. Er muss mit einem Buchstaben beginnen. Beispiel: weihnachtsgruss_verschicken',
   'The warehouse could not be deleted because it has already been used.' => 'Das Lager konnte nicht gel&ouml;scht werden, da es bereits in Benutzung war.',
@@ -2205,6 +2223,7 @@ $self->{texts} = {
   'This installation uses an unknown chart of accounts (&quot;#1&quot;). This database upgrade cannot create standard buchungsgruppen automatically.' => 'Diese Installation benutzt einen unbekannten Kontenrahmen (&quot;#1&quot;). Dieses Datenbankupgrade kann die Standardbuchungsgruppen nicht automatisch anlegen.',
   'This is a preliminary check for existing sources. Nothing will be created or deleted at this stage!' => 'In diesem Schritt werden bestehende Datenbanken gesucht. Es werden noch keine &Auml;nderungen vorgenommen!',
   'This is a very critical problem.' => 'Dieses Problem ist sehr schwerwiegend.',
+  'This is the client to be selected by default on the login screen.' => 'Dies ist derjenige Mandant, der im Loginbildschirm standardmäßig ausgewählt sein wird.',
   'This is the default bin for ignoring onhand' => 'Standardlagerplatz für Auslagern ohne Bestandsprüfung',
   'This is the default bin for parts' => 'Standard-Lagerplatz für Stammdaten/Waren',
   'This list is capped at 15 items to keep it fast. If you need a full list, please use reports.' => 'Diese Liste ist auf 15 Zeilen begrenzt. Wenn Sie eine vollständige Liste benötigen, erstellen Sie bitte einen Bericht.',
@@ -2333,13 +2352,13 @@ $self->{texts} = {
   'User name'                   => 'Benutzername',
   'Username'                    => 'Benutzername',
   'Users in this group'         => 'BenutzerInnen in dieser Gruppe',
+  'Users that have access to this client' => 'Benutzer mit Zugriff auf diesen Mandaten',
   'Users with access'           => 'Benutzer mit Zugriff',
   'Users with access to this client' => 'Benutzer mit Zugriff auf diesen Mandanten',
   'VAT ID'                      => 'UStdID-Nr',
   'Valid'                       => 'Gültig',
   'Valid from'                  => 'Gültig ab',
   'Valid until'                 => 'gültig bis',
-  'Valid/Obsolete'              => 'Gültig/ungültig',
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
   'Variable Description'        => 'Datenfeldbezeichnung',
diff --git a/templates/webpages/admin/edit_client.html b/templates/webpages/admin/edit_client.html
new file mode 100644 (file)
index 0000000..392b6c4
--- /dev/null
@@ -0,0 +1,129 @@
+[%- USE HTML %]
+[%- USE L %][%- USE LxERP -%]
+
+[%- INCLUDE 'common/flash.html' %]
+
+<h1>[% HTML.escape(title) %]</h1>
+
+<p>[% L.link(SELF.url_for(action="show"), LxERP.t8("Back")) %]</p>
+
+<form method="post" action="controller.pl" id="form">
+ [% L.hidden_tag("client.id", SELF.client.id) %]
+ [% L.hidden_tag("action", "") %]
+
+ <h2>[%- LxERP.t8("Settings") %]</h2>
+
+ <table>
+  <tr>
+   <th align="right">[% LxERP.t8('Client name') %]</th>
+   <td>[% L.input_tag("client.name", SELF.client.name) %]</td>
+  </tr>
+
+  <tr>
+   <th align="right">[% LxERP.t8('Default client') %]</th>
+   <td>[% L.checkbox_tag("client.is_default", label=LxERP.t8('This is the client to be selected by default on the login screen.'), checked=SELF.client.is_default) %]</td>
+  </tr>
+
+  <tr>
+   <th align="right">[% LxERP.t8('Database name') %]</th>
+   <td>[% L.input_tag("client.dbname", SELF.client.dbname, 'data-dbsettings'=1) %]</td>
+  </tr>
+
+  <tr>
+   <th align="right">[% LxERP.t8('Database host and port') %]</th>
+   <td>
+    [% L.input_tag("client.dbhost", SELF.client.dbhost, 'data-dbsettings'=1) %]
+    [% L.input_tag("client.dbport", SELF.client.dbport, 'data-dbsettings'=1, size=6) %]
+   </td>
+  </tr>
+
+  <tr>
+   <th align="right">[% LxERP.t8('Database user and password') %]</th>
+   <td>
+    [% L.input_tag("client.dbuser",   SELF.client.dbuser, 'data-dbsettings'=1) %]
+    [% L.input_tag("client.dbpasswd", SELF.client.dbpasswd, 'data-dbsettings'=1) %]
+   </td>
+  </tr>
+ </table>
+
+ <div>
+  [% L.button_tag("test_database_connectivity()", LxERP.t8("Test database connectivity")) %]
+ </div>
+
+ <h2>[%- LxERP.t8("Access to clients") %]</h2>
+
+[% IF SELF.all_users.size %]
+ <p>
+  [%- LxERP.t8("The following users will have access to this client") %]:
+ </p>
+
+ <div class="clearfix">
+  [% L.select_tag("client.users[]", SELF.all_users, id="client_users", title_key="login", default=SELF.client.users, default_key='id', multiple=1) %]
+  [% L.multiselect2side("client_users", labelsx => LxERP.t8("All users"), labeldx => LxERP.t8("Users that have access to this client")) %]
+ </div>
+
+[%- ELSE %]
+ <p>
+  [% LxERP.t8("No users have been created yet.") %]
+ </p>
+[%- END %]
+
+ <h2>[%- LxERP.t8("Group assignment") %]</h2>
+
+[% IF SELF.all_groups.size %]
+ <p>
+  [%- LxERP.t8("The following groups are valid for this client") %]:
+ </p>
+
+ <div class="clearfix">
+  [% L.select_tag("client.groups[]", SELF.all_groups, id="client_groups", title_key="name", default=SELF.client.groups, default_key='id', multiple=1) %]
+  [% L.multiselect2side("client_groups", labelsx => LxERP.t8("All groups"), labeldx => LxERP.t8("Groups valid for this client")) %]
+ </div>
+
+[%- ELSE %]
+ <p>
+  [% LxERP.t8("No groups have been created yet.") %]
+ </p>
+[%- END %]
+
+<hr size="3" noshade>
+
+<p>
+ [% L.link(SELF.url_for(action="show"), LxERP.t8("Back")) %]
+
+ [% L.button_tag("submit_with_action('save_client')", LxERP.t8("Save")) %]
+ [% IF SELF.client.id %]
+  [% L.button_tag("save_as_new()", LxERP.t8("Save as new")) %]
+  [% L.button_tag("submit_with_action('delete_client')", LxERP.t8("Delete"), confirm=LxERP.t8("Are you sure?")) %]
+ [%- END %]
+</p>
+
+</form>
+
+<script type="text/javascript">
+ <!--
+  function submit_with_action(action) {
+    $("#action").val("Admin/" + action);
+    $("#form").submit();
+  }
+
+  function save_as_new() {
+    var new_client_name = prompt("[% LxERP.t8("Please enter the name for the new client.") %]", "");
+    if (!new_client_name)
+      return;
+
+    $("#client_name").val(new_client_name);
+    $("#client_id").val("");
+    submit_with_action("save_client");
+  }
+
+  function test_database_connectivity() {
+    open_jqm_window({
+      url:  'controller.pl?action=Admin/test_database_connectivity',
+      data: $("INPUT[data-dbsettings=1]").serialize(),
+      type: 'POST'
+    });
+    return true;
+  }
+   -->
+</script>
index 06d0e91..1f1a834 100644 (file)
@@ -7,10 +7,10 @@
 <div>
  [% LxERP.t8("Actions") %]:
  <span class="link_separator"></span>
- [% L.link(SELF.url_for(action="new_client"), LxERP.t8("Add Client")) %]
- <span class="link_separator">|</span>
  [% L.link(SELF.url_for(action="new_user"), LxERP.t8("Add User")) %]
  <span class="link_separator">|</span>
+ [% L.link(SELF.url_for(action="new_client"), LxERP.t8("Add Client")) %]
+ <span class="link_separator">|</span>
  [% L.link(SELF.url_for(action="edit_groups"), LxERP.t8("Edit groups")) %]
  <span class="link_separator">|</span>
  [% L.link(SELF.url_for(action="pg_database_administration", controller="admin.pl"), LxERP.t8("Pg Database Administration")) %]
 
 [%- ELSE %]
   <table width="100%">
-   <tr>
-    <th class="listtop">[% LxERP.t8('Login Name') %]</th>
-    <th class="listtop">[% LxERP.t8('Name') %]</th>
-    <th class="listtop">[% LxERP.t8('Language') %]</th>
+   <tr class="listheading">
+    <th>[% LxERP.t8('Login Name') %]</th>
+    <th>[% LxERP.t8('Name') %]</th>
+    <th>[% LxERP.t8('Language') %]</th>
    </tr>
 
 [% FOREACH user = USERS %]
 
 [%- ELSE %]
   <table width="100%">
-   <tr>
-    <th class="listtop">[% LxERP.t8('Client name') %]</th>
-    <th class="listtop">[% LxERP.t8('Database ID') %]</th>
-    <th class="listtop">[% LxERP.t8('Database name') %]</th>
-    <th class="listtop">[% LxERP.t8('Database Host') %]</th>
-    <th class="listtop">[% LxERP.t8('Database User') %]</th>
+   <tr class="listheading">
+    <th>[% LxERP.t8('Client name') %]</th>
+    <th>[% LxERP.t8('Database ID') %]</th>
+    <th>[% LxERP.t8('Database name') %]</th>
+    <th>[% LxERP.t8('Database Host') %]</th>
+    <th>[% LxERP.t8('Database User') %]</th>
+    <th>[% LxERP.t8('Default client') %]</th>
    </tr>
 
 [%- FOREACH client = CLIENTS %]
    <tr class="listrow">
-    <td>[% L.link(SELF.url_for(action="edit_client", client_id=client.id), HTML.escape(client.name)) %]</td>
+    <td>[% L.link(SELF.url_for(action="edit_client", id=client.id), HTML.escape(client.name)) %]</td>
     <td>[% HTML.escape(client.id) %]</td>
     <td>[% HTML.escape(client.dbname) %]</td>
     <td>[% HTML.escape(client.dbhost) %][% IF client.dbport %]:[%- HTML.escape(client.dbport) %][%- END %]</td>
     <td>[% HTML.escape(client.dbuser) %]</td>
+    <td>[% IF client.is_default %][% LxERP.t8("Yes") %][%- ELSE %][% LxERP.t8("No") %][%- END %]</td>
    </tr>
 [%- END %]
   </table>
index 78829da..df9a59d 100644 (file)
@@ -1,25 +1,21 @@
-[%- USE T8 %]
-[%- USE HTML %]
+[%- USE HTML %][%- USE LxERP -%][%- USE L -%]
+<h1>[% HTML.escape(title) %]</h1>
 
- <h1>[% title %]</h1>
+[%- IF ok %]
 
- [%- IF connection_ok %]
+ <p class="message_ok">[% LxERP.t8('The connection was established successfully.') %]</p>
 
- <p class="message_ok">[% 'The connection was established successfully.' | $T8 %]</p>
-
- [%- ELSE %]
+[%- ELSE %]
 
  <p class="message_error">
-  [% 'The connection to the database could not be established.' | $T8 %]
-  [% 'Error message from the database driver:' | $T8 %]
+  [% LxERP.t8('The connection to the database could not be established.') %]
+  [% LxERP.t8('Error message from the database driver:') %]
  </p>
 
- <p>[% HTML.escape(errstr) %]</p>
+ <p>[% HTML.escape(error) %]</p>
 
- [%- END %]
+[%- END %]
 
- <p>
-  <form>
-   <input type="button" class="submit" onclick="window.close()" value="[% 'Close Window' | $T8 %]">
-  </form>
- </p>
+<div>
+ [% L.button_tag("\$('#jqm_popup_dialog .close').trigger('click');", LxERP.t8("Close Window")) %]
+</div>