Revision 9636227e
Von Moritz Bunkus vor mehr als 11 Jahren hinzugefügt
SL/Controller/Admin.pm | ||
---|---|---|
14 | 14 |
|
15 | 15 |
use Rose::Object::MakeMethods::Generic |
16 | 16 |
( |
17 |
'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) ], |
|
17 |
'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) ],
|
|
18 | 18 |
); |
19 | 19 |
|
20 | 20 |
__PACKAGE__->run_before(\&setup_layout); |
... | ... | |
165 | 165 |
$self->redirect_to(action => 'show'); |
166 | 166 |
} |
167 | 167 |
|
168 |
# |
|
169 |
# actions: clients |
|
170 |
# |
|
171 |
|
|
172 |
sub action_new_client { |
|
173 |
my ($self) = @_; |
|
174 |
|
|
175 |
$self->client(SL::DB::AuthClient->new( |
|
176 |
dbhost => $::auth->{DB_config}->{host}, |
|
177 |
dbport => $::auth->{DB_config}->{port}, |
|
178 |
dbuser => $::auth->{DB_config}->{user}, |
|
179 |
dbpasswd => $::auth->{DB_config}->{password}, |
|
180 |
)); |
|
181 |
|
|
182 |
$self->edit_client_form(title => t8('Create a new client')); |
|
183 |
} |
|
184 |
|
|
185 |
sub action_edit_client { |
|
186 |
my ($self) = @_; |
|
187 |
$self->edit_client_form(title => t8('Edit Client')); |
|
188 |
} |
|
189 |
|
|
190 |
sub action_save_client { |
|
191 |
my ($self) = @_; |
|
192 |
my $params = delete($::form->{client}) || { }; |
|
193 |
my $is_new = !$params->{id}; |
|
194 |
|
|
195 |
$self->client($is_new ? SL::DB::AuthClient->new : SL::DB::AuthClient->new(id => $params->{id})->load)->assign_attributes(%{ $params }); |
|
196 |
|
|
197 |
my @errors = $self->client->validate; |
|
198 |
|
|
199 |
if (@errors) { |
|
200 |
flash('error', @errors); |
|
201 |
$self->edit_client_form(title => $is_new ? t8('Create a new client') : t8('Edit Client')); |
|
202 |
return; |
|
203 |
} |
|
204 |
|
|
205 |
$self->client->save; |
|
206 |
if ($self->client->is_default) { |
|
207 |
SL::DB::Manager::AuthClient->update_all(set => { is_default => 0 }, where => [ '!id' => $self->client->id ]); |
|
208 |
} |
|
209 |
|
|
210 |
flash_later('info', $is_new ? t8('The client has been created.') : t8('The client has been saved.')); |
|
211 |
$self->redirect_to(action => 'show'); |
|
212 |
} |
|
213 |
|
|
214 |
sub action_delete_client { |
|
215 |
my ($self) = @_; |
|
216 |
|
|
217 |
if (!$self->client->delete) { |
|
218 |
flash('error', t8('The client could not be deleted.')); |
|
219 |
$self->edit_client_form(title => t8('Edit Client')); |
|
220 |
return; |
|
221 |
} |
|
222 |
|
|
223 |
flash_later('info', t8('The client has been deleted.')); |
|
224 |
$self->redirect_to(action => 'show'); |
|
225 |
} |
|
226 |
|
|
227 |
sub action_test_database_connectivity { |
|
228 |
my ($self) = @_; |
|
229 |
|
|
230 |
my %cfg = %{ $::form->{client} || {} }; |
|
231 |
my $dbconnect = 'dbi:Pg:dbname=' . $cfg{dbname} . ';host=' . $cfg{dbhost} . ';port=' . $cfg{dbport}; |
|
232 |
my $dbh = DBI->connect($dbconnect, $cfg{dbuser}, $cfg{dbpasswd}); |
|
233 |
|
|
234 |
my $ok = !!$dbh; |
|
235 |
my $error = $DBI::errstr; |
|
236 |
|
|
237 |
$dbh->disconnect if $dbh; |
|
238 |
|
|
239 |
$self->render('admin/test_db_connection', |
|
240 |
title => t8('Database Connection Test'), |
|
241 |
ok => $ok, |
|
242 |
error => $error); |
|
243 |
} |
|
244 |
|
|
168 | 245 |
# |
169 | 246 |
# actions: locking, unlocking |
170 | 247 |
# |
... | ... | |
199 | 276 |
sub init_client { SL::DB::AuthClient->new(id => ($::form->{id} || ($::form->{client} || {})->{id}))->load } |
200 | 277 |
sub init_user { SL::DB::AuthUser ->new(id => ($::form->{id} || ($::form->{user} || {})->{id}))->load } |
201 | 278 |
sub init_all_clients { SL::DB::Manager::AuthClient->get_all_sorted } |
279 |
sub init_all_users { SL::DB::Manager::AuthUser->get_all_sorted } |
|
202 | 280 |
sub init_all_groups { SL::DB::Manager::AuthGroup->get_all_sorted } |
203 | 281 |
sub init_all_dateformats { [ qw(mm/dd/yy dd/mm/yy dd.mm.yy yyyy-mm-dd) ] } |
204 | 282 |
sub init_all_numberformats { [ qw(1,000.00 1000.00 1.000,00 1000,00) ] } |
... | ... | |
245 | 323 |
$self->render('admin/edit_user', %params); |
246 | 324 |
} |
247 | 325 |
|
326 |
sub edit_client_form { |
|
327 |
my ($self, %params) = @_; |
|
328 |
|
|
329 |
$::request->layout->use_javascript("${_}.js") for qw(jquery.selectboxes jquery.multiselect2side); |
|
330 |
$self->render('admin/edit_client', %params); |
|
331 |
} |
|
332 |
|
|
248 | 333 |
# |
249 | 334 |
# helpers |
250 | 335 |
# |
SL/DB/AuthClient.pm | ||
---|---|---|
4 | 4 |
|
5 | 5 |
use SL::DB::MetaSetup::AuthClient; |
6 | 6 |
use SL::DB::Manager::AuthClient; |
7 |
use SL::DB::Helper::Util; |
|
7 | 8 |
|
8 | 9 |
__PACKAGE__->meta->add_relationship( |
9 | 10 |
users => { |
... | ... | |
22 | 23 |
|
23 | 24 |
__PACKAGE__->meta->initialize; |
24 | 25 |
|
26 |
sub validate { |
|
27 |
my ($self) = @_; |
|
28 |
|
|
29 |
my @errors; |
|
30 |
push @errors, $::locale->text('The name is missing.') if !$self->name; |
|
31 |
push @errors, $::locale->text('The database name is missing.') if !$self->dbname; |
|
32 |
push @errors, $::locale->text('The database host is missing.') if !$self->dbhost; |
|
33 |
push @errors, $::locale->text('The database port is missing.') if !$self->dbport; |
|
34 |
push @errors, $::locale->text('The database user is missing.') if !$self->dbuser; |
|
35 |
push @errors, $::locale->text('The name is not unique.') if !SL::DB::Helper::Util::is_unique($self, 'name'); |
|
36 |
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'); |
|
37 |
|
|
38 |
return @errors; |
|
39 |
} |
|
40 |
|
|
25 | 41 |
1; |
locale/de/all | ||
---|---|---|
448 | 448 |
'Close Books up to' => 'Die Bücher abschließen bis zum', |
449 | 449 |
'Close Flash' => 'Schließen', |
450 | 450 |
'Close SEPA exports' => 'SEPA-Export abschließen', |
451 |
'Close Window' => 'Fenster Schließen', |
|
452 |
'Close window' => 'Fenster schließen', |
|
451 |
'Close Window' => 'Fenster Schließen', |
|
453 | 452 |
'Closed' => 'Geschlossen', |
454 | 453 |
'Collective Orders only work for orders from one customer!' => 'Sammelaufträge funktionieren nur für Aufträge von einem Kunden!', |
455 | 454 |
'Column name' => 'Spaltenname', |
... | ... | |
496 | 495 |
'Create Date' => 'Erstelldatum', |
497 | 496 |
'Create a new background job' => 'Einen neuen Hintergrund-Job anlegen', |
498 | 497 |
'Create a new business' => 'Einen neuen Kunden-/Lieferantentyp erfassen', |
498 |
'Create a new client' => 'Einen neuen Mandanten anlegen', |
|
499 | 499 |
'Create a new department' => 'Eine neue Abteilung erfassen', |
500 | 500 |
'Create a new payment term' => 'Neue Zahlungsbedingungen anlegen', |
501 | 501 |
'Create a new project' => 'Neues Projekt anlegen', |
... | ... | |
594 | 594 |
'Database ID' => 'Datenbank-ID', |
595 | 595 |
'Database User' => 'Datenbankbenutzer', |
596 | 596 |
'Database backups and restorations are disabled in the configuration.' => 'Datenbanksicherungen und -wiederherstellungen sind in der Konfiguration deaktiviert.', |
597 |
'Database host and port' => 'Datenbankhost und -port', |
|
597 | 598 |
'Database name' => 'Datenbankname', |
598 | 599 |
'Database settings' => 'Datenbankeinstellungen', |
599 | 600 |
'Database template' => 'Datenbankvorlage', |
600 | 601 |
'Database update error:' => 'Fehler beim Datenbankupgrade:', |
602 |
'Database user and password' => 'Datebankbenutzer und -passwort', |
|
601 | 603 |
'Dataset' => 'Datenbank', |
602 | 604 |
'Dataset missing!' => 'Datenbank fehlt!', |
603 | 605 |
'Dataset name' => 'Datenbankname', |
... | ... | |
634 | 636 |
'Default Warehouse' => 'Standard-Lager', |
635 | 637 |
'Default Warehouse with ignoring on hand' => 'Standardlager für Auslagern ohne Prüfung auf Bestand', |
636 | 638 |
'Default buchungsgruppe' => 'Standardbuchungsgruppe', |
639 |
'Default client' => 'Standardmandant', |
|
637 | 640 |
'Default currency' => 'Standardwährung', |
638 | 641 |
'Default currency missing!' => 'Standardwährung fehlt!', |
639 | 642 |
'Default output medium' => 'Standardausgabekanal', |
... | ... | |
770 | 773 |
'Edit Assembly' => 'Erzeugnis bearbeiten', |
771 | 774 |
'Edit Bins' => 'Lagerplätze bearbeiten', |
772 | 775 |
'Edit Buchungsgruppe' => 'Buchungsgruppe bearbeiten', |
776 |
'Edit Client' => 'Mandanten bearbeiten', |
|
773 | 777 |
'Edit Credit Note' => 'Gutschrift bearbeiten', |
774 | 778 |
'Edit Customer' => 'Kunde editieren', |
775 | 779 |
'Edit Dunning' => 'Mahnungen konfigurieren', |
... | ... | |
926 | 930 |
'Filter date by' => 'Datum filtern nach', |
927 | 931 |
'Filter for customer variables' => 'Filter für benutzerdefinierte Kundenvariablen', |
928 | 932 |
'Filter for item variables' => 'Filter für benutzerdefinierte Artikelvariablen', |
929 |
'Filter parts' => 'Artikel filtern', |
|
930 | 933 |
'Finish' => 'Abschließen', |
931 | 934 |
'First 20 Lines' => 'Nur erste 20 Datensätze', |
932 | 935 |
'Fix transaction' => 'Buchung korrigieren', |
... | ... | |
990 | 993 |
'Group' => 'Warengruppe', |
991 | 994 |
'Group Invoices' => 'Rechnungen zusammenfassen', |
992 | 995 |
'Group Items' => 'Waren gruppieren', |
996 |
'Group assignment' => 'Gruppenzuordnung', |
|
993 | 997 |
'Group deleted!' => 'Warengruppe gelöscht!', |
994 | 998 |
'Group membership' => 'Gruppenzugehörigkeit', |
995 | 999 |
'Group missing!' => 'Warengruppe fehlt!', |
... | ... | |
1347 | 1351 |
'No transaction selected!' => 'Keine Transaktion ausgewählt', |
1348 | 1352 |
'No transfers were executed in this export.' => 'In diesem SEPA-Export wurden keine Überweisungen ausgeführt.', |
1349 | 1353 |
'No unknown units where found.' => 'Es wurden keine unbekannten Einheiten gefunden.', |
1350 |
'No users have been created yet.' => 'Es wurden noch keine Benutzer angelegt.',
|
|
1354 |
'No users have been created yet.' => 'Es wurden noch keine Benutzer anleget.',
|
|
1351 | 1355 |
'No valid number entered for pricegroup "#1".' => 'Für Preisgruppe "#1" wurde keine gültige Nummer eingegeben.', |
1352 | 1356 |
'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.', |
1353 | 1357 |
'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 | 1509 |
'Please enter a profile name.' => 'Bitte geben Sie einen Profilnamen an.', |
1506 | 1510 |
'Please enter the currency you are working with.' => 'Bitte geben Sie die Währung an, mit der Sie arbeiten.', |
1507 | 1511 |
'Please enter the login for the new user.' => 'Bitte geben Sie das Login für den neuen Benutzer ein.', |
1512 |
'Please enter the name for the new client.' => 'Bitte geben Sie einen Namen für den neuen Mandanten ein.', |
|
1508 | 1513 |
'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ür die neue Datenbank benutzt wird:', |
1509 | 1514 |
'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.', |
1510 | 1515 |
'Please enter the sales tax identification number.' => 'Bitte geben Sie die Umsatzsteueridentifikationsnummer an.', |
... | ... | |
1975 | 1980 |
'Templates' => 'Vorlagen', |
1976 | 1981 |
'Terms missing in row ' => '+Tage fehlen in Zeile ', |
1977 | 1982 |
'Test and preview' => 'Test und Vorschau', |
1983 |
'Test database connectivity' => 'Datenbankverbindung testen', |
|
1978 | 1984 |
'Text field' => 'Textfeld', |
1979 | 1985 |
'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öhe des Textfeldes. Wenn nicht anders angegeben, so werden sie 30 Zeichen breit und fünf Zeichen hoch dargestellt.', |
1980 | 1986 |
'Text variables: \'MAXLENGTH=n\' sets the maximum entry length to \'n\'.' => 'Textzeilen: \'MAXLENGTH=n\' setzt eine Maximallänge von n Zeichen.', |
... | ... | |
2016 | 2022 |
'The business has been saved.' => 'Der Kunden-/Lieferantentyp wurde gespeichert.', |
2017 | 2023 |
'The business is in use and cannot be deleted.' => 'Der Kunden-/Lieferantentyp wird benutzt und kann nicht gelöscht werden.', |
2018 | 2024 |
'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.', |
2025 |
'The client could not be deleted.' => 'Der Mandant konnte nicht gelöscht werden.', |
|
2026 |
'The client has been created.' => 'Der Mandant wurde angelegt.', |
|
2027 |
'The client has been deleted.' => 'Der Mandant wurde gelöscht.', |
|
2028 |
'The client has been saved.' => 'Der Mandant wurde gespeichert.', |
|
2019 | 2029 |
'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.', |
2020 | 2030 |
'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).', |
2021 | 2031 |
'The columns "Dunning Duedate", "Total Fees" and "Interest" show data for the previous dunning created for this invoice.' => 'Die Spalten "Zahlbar bis", "Kumulierte Gebühren" und "Zinsen" zeigen Daten der letzten für diese Rechnung erzeugten Mahnung.', |
2032 |
'The combination of database host, port and name is not unique.' => '', |
|
2022 | 2033 |
'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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprüfen Sie die Angaben in config/kivitendo.conf.', |
2023 | 2034 |
'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:', |
2024 | 2035 |
'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 | 2042 |
'The custom variable has been saved.' => 'Die benutzerdefinierte Variable wurde gespeichert.', |
2032 | 2043 |
'The database #1 has been successfully deleted.' => 'Die Datenbank #1 wurde erfolgreich gelöscht.', |
2033 | 2044 |
'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:', |
2045 |
'The database host is missing.' => 'Der Datenbankhost fehlt.', |
|
2046 |
'The database name is missing.' => 'Der Datenbankname fehlt.', |
|
2047 |
'The database port is missing.' => 'Der Datenbankport fehlt.', |
|
2034 | 2048 |
'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:', |
2035 | 2049 |
'The database upgrade for the introduction of Buchungsgruppen is now complete.' => 'Das Datenbankupgrade für die Einführung von Buchungsgruppen ist jetzt beendet.', |
2036 | 2050 |
'The database upgrade for the introduction of units is now complete.' => 'Das Datenbankupgrade zwecks Einführung von Einheiten ist nun beendet.', |
2051 |
'The database user is missing.' => 'Der Datenbankbenutzer fehlt.', |
|
2037 | 2052 |
'The dataset #1 has been successfully created.' => 'Die Datenbank #1 wurde erfolgreich angelegt.', |
2038 | 2053 |
'The dataset backup has been sent via email to #1.' => 'Die Datenbanksicherung wurde per Email an #1 verschickt.', |
2039 | 2054 |
'The dataset has to exist before a restoration can be started.' => 'Die Datenbank muss vor der Wiederherstellung bereits angelegt worden sein.', |
... | ... | |
2066 | 2081 |
'The following Datasets need to be updated' => 'Folgende Datenbanken müssen aktualisiert werden', |
2067 | 2082 |
'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:', |
2068 | 2083 |
'The following drafts have been saved and can be loaded.' => 'Die folgenden Entwürfe wurden gespeichert und können geladen werden.', |
2084 |
'The following groups are valid for this client' => 'Die folgenden Gruppen sind für diesen Mandanten gültig', |
|
2069 | 2085 |
'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.', |
2070 | 2086 |
'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:', |
2071 | 2087 |
'The following transaction contains wrong taxes:' => 'Die folgende Buchung enthält falsche Steuern:', |
... | ... | |
2073 | 2089 |
'The following transactions are concerned:' => 'Die folgenden Buchungen sind betroffen:', |
2074 | 2090 |
'The following units are unknown.' => 'Die folgenden Einheiten sind unbekannt.', |
2075 | 2091 |
'The following units exist already:' => 'Die folgenden Einheiten existieren bereits:', |
2092 |
'The following users will have access to this client' => 'Die folgenden Benutzer werden auf diesen Mandanten Zugriff haben', |
|
2076 | 2093 |
'The following warnings occured during an upgrade to the document templates:' => 'Die folgenden Warnungen traten während einer Aktualisierung der Dokumentenvorlagen auf:', |
2077 | 2094 |
'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ü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', |
2078 | 2095 |
'The greetings have been saved.' => 'Die Anreden wurden gespeichert', |
... | ... | |
2090 | 2107 |
'The name in row %d has already been used before.' => 'Der Name in Zeile %d wurde vorher bereits benutzt.', |
2091 | 2108 |
'The name is missing in row %d.' => 'Der Name fehlt in Zeile %d.', |
2092 | 2109 |
'The name is missing.' => 'Der Name fehlt.', |
2110 |
'The name is not unique.' => 'Der Name ist nicht eindeutig.', |
|
2093 | 2111 |
'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.', |
2094 | 2112 |
'The number of days for full payment' => 'Die Anzahl Tage, bis die Rechnung in voller Höhe bezahlt werden muss', |
2095 | 2113 |
'The option field is empty.' => 'Das Optionsfeld ist leer.', |
... | ... | |
2151 | 2169 |
'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ändert werden.', |
2152 | 2170 |
'The units have been saved.' => 'Die Einheiten wurden gespeichert.', |
2153 | 2171 |
'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.', |
2154 |
'The user could not be deleted.' => '', |
|
2172 |
'The user could not be deleted.' => 'Der Benutzer konnte nicht gelöscht werden.',
|
|
2155 | 2173 |
'The user has been created.' => 'Der Benutzer wurde angelegt.', |
2156 |
'The user has been deleted.' => '', |
|
2174 |
'The user has been deleted.' => 'Der Benutzer wurde gelöscht.',
|
|
2157 | 2175 |
'The user has been saved.' => 'Der Benutzer wurde gespeichert.', |
2158 | 2176 |
'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', |
2159 | 2177 |
'The warehouse could not be deleted because it has already been used.' => 'Das Lager konnte nicht gelöscht werden, da es bereits in Benutzung war.', |
... | ... | |
2205 | 2223 |
'This installation uses an unknown chart of accounts ("#1"). This database upgrade cannot create standard buchungsgruppen automatically.' => 'Diese Installation benutzt einen unbekannten Kontenrahmen ("#1"). Dieses Datenbankupgrade kann die Standardbuchungsgruppen nicht automatisch anlegen.', |
2206 | 2224 |
'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 Änderungen vorgenommen!', |
2207 | 2225 |
'This is a very critical problem.' => 'Dieses Problem ist sehr schwerwiegend.', |
2226 |
'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.', |
|
2208 | 2227 |
'This is the default bin for ignoring onhand' => 'Standardlagerplatz für Auslagern ohne Bestandsprüfung', |
2209 | 2228 |
'This is the default bin for parts' => 'Standard-Lagerplatz für Stammdaten/Waren', |
2210 | 2229 |
'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 | 2352 |
'User name' => 'Benutzername', |
2334 | 2353 |
'Username' => 'Benutzername', |
2335 | 2354 |
'Users in this group' => 'BenutzerInnen in dieser Gruppe', |
2355 |
'Users that have access to this client' => 'Benutzer mit Zugriff auf diesen Mandaten', |
|
2336 | 2356 |
'Users with access' => 'Benutzer mit Zugriff', |
2337 | 2357 |
'Users with access to this client' => 'Benutzer mit Zugriff auf diesen Mandanten', |
2338 | 2358 |
'VAT ID' => 'UStdID-Nr', |
2339 | 2359 |
'Valid' => 'Gültig', |
2340 | 2360 |
'Valid from' => 'Gültig ab', |
2341 | 2361 |
'Valid until' => 'gültig bis', |
2342 |
'Valid/Obsolete' => 'Gültig/ungültig', |
|
2343 | 2362 |
'Value' => 'Wert', |
2344 | 2363 |
'Variable' => 'Variable', |
2345 | 2364 |
'Variable Description' => 'Datenfeldbezeichnung', |
templates/webpages/admin/edit_client.html | ||
---|---|---|
1 |
[%- USE HTML %] |
|
2 |
[%- USE L %][%- USE LxERP -%] |
|
3 |
|
|
4 |
[%- INCLUDE 'common/flash.html' %] |
|
5 |
|
|
6 |
<h1>[% HTML.escape(title) %]</h1> |
|
7 |
|
|
8 |
<p>[% L.link(SELF.url_for(action="show"), LxERP.t8("Back")) %]</p> |
|
9 |
|
|
10 |
<form method="post" action="controller.pl" id="form"> |
|
11 |
[% L.hidden_tag("client.id", SELF.client.id) %] |
|
12 |
[% L.hidden_tag("action", "") %] |
|
13 |
|
|
14 |
<h2>[%- LxERP.t8("Settings") %]</h2> |
|
15 |
|
|
16 |
<table> |
|
17 |
<tr> |
|
18 |
<th align="right">[% LxERP.t8('Client name') %]</th> |
|
19 |
<td>[% L.input_tag("client.name", SELF.client.name) %]</td> |
|
20 |
</tr> |
|
21 |
|
|
22 |
<tr> |
|
23 |
<th align="right">[% LxERP.t8('Default client') %]</th> |
|
24 |
<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> |
|
25 |
</tr> |
|
26 |
|
|
27 |
<tr> |
|
28 |
<th align="right">[% LxERP.t8('Database name') %]</th> |
|
29 |
<td>[% L.input_tag("client.dbname", SELF.client.dbname, 'data-dbsettings'=1) %]</td> |
|
30 |
</tr> |
|
31 |
|
|
32 |
<tr> |
|
33 |
<th align="right">[% LxERP.t8('Database host and port') %]</th> |
|
34 |
<td> |
|
35 |
[% L.input_tag("client.dbhost", SELF.client.dbhost, 'data-dbsettings'=1) %] |
|
36 |
[% L.input_tag("client.dbport", SELF.client.dbport, 'data-dbsettings'=1, size=6) %] |
|
37 |
</td> |
|
38 |
</tr> |
|
39 |
|
|
40 |
<tr> |
|
41 |
<th align="right">[% LxERP.t8('Database user and password') %]</th> |
|
42 |
<td> |
|
43 |
[% L.input_tag("client.dbuser", SELF.client.dbuser, 'data-dbsettings'=1) %] |
|
44 |
[% L.input_tag("client.dbpasswd", SELF.client.dbpasswd, 'data-dbsettings'=1) %] |
|
45 |
</td> |
|
46 |
</tr> |
|
47 |
</table> |
|
48 |
|
|
49 |
<div> |
|
50 |
[% L.button_tag("test_database_connectivity()", LxERP.t8("Test database connectivity")) %] |
|
51 |
</div> |
|
52 |
|
|
53 |
<h2>[%- LxERP.t8("Access to clients") %]</h2> |
|
54 |
|
|
55 |
[% IF SELF.all_users.size %] |
|
56 |
<p> |
|
57 |
[%- LxERP.t8("The following users will have access to this client") %]: |
|
58 |
</p> |
|
59 |
|
|
60 |
<div class="clearfix"> |
|
61 |
[% L.select_tag("client.users[]", SELF.all_users, id="client_users", title_key="login", default=SELF.client.users, default_key='id', multiple=1) %] |
|
62 |
[% L.multiselect2side("client_users", labelsx => LxERP.t8("All users"), labeldx => LxERP.t8("Users that have access to this client")) %] |
|
63 |
</div> |
|
64 |
|
|
65 |
[%- ELSE %] |
|
66 |
<p> |
|
67 |
[% LxERP.t8("No users have been created yet.") %] |
|
68 |
</p> |
|
69 |
[%- END %] |
|
70 |
|
|
71 |
<h2>[%- LxERP.t8("Group assignment") %]</h2> |
|
72 |
|
|
73 |
[% IF SELF.all_groups.size %] |
|
74 |
<p> |
|
75 |
[%- LxERP.t8("The following groups are valid for this client") %]: |
|
76 |
</p> |
|
77 |
|
|
78 |
<div class="clearfix"> |
|
79 |
[% L.select_tag("client.groups[]", SELF.all_groups, id="client_groups", title_key="name", default=SELF.client.groups, default_key='id', multiple=1) %] |
|
80 |
[% L.multiselect2side("client_groups", labelsx => LxERP.t8("All groups"), labeldx => LxERP.t8("Groups valid for this client")) %] |
|
81 |
</div> |
|
82 |
|
|
83 |
[%- ELSE %] |
|
84 |
<p> |
|
85 |
[% LxERP.t8("No groups have been created yet.") %] |
|
86 |
</p> |
|
87 |
[%- END %] |
|
88 |
|
|
89 |
<hr size="3" noshade> |
|
90 |
|
|
91 |
<p> |
|
92 |
[% L.link(SELF.url_for(action="show"), LxERP.t8("Back")) %] |
|
93 |
|
|
94 |
[% L.button_tag("submit_with_action('save_client')", LxERP.t8("Save")) %] |
|
95 |
[% IF SELF.client.id %] |
|
96 |
[% L.button_tag("save_as_new()", LxERP.t8("Save as new")) %] |
|
97 |
[% L.button_tag("submit_with_action('delete_client')", LxERP.t8("Delete"), confirm=LxERP.t8("Are you sure?")) %] |
|
98 |
[%- END %] |
|
99 |
</p> |
|
100 |
|
|
101 |
</form> |
|
102 |
|
|
103 |
<script type="text/javascript"> |
|
104 |
<!-- |
|
105 |
function submit_with_action(action) { |
|
106 |
$("#action").val("Admin/" + action); |
|
107 |
$("#form").submit(); |
|
108 |
} |
|
109 |
|
|
110 |
function save_as_new() { |
|
111 |
var new_client_name = prompt("[% LxERP.t8("Please enter the name for the new client.") %]", ""); |
|
112 |
if (!new_client_name) |
|
113 |
return; |
|
114 |
|
|
115 |
$("#client_name").val(new_client_name); |
|
116 |
$("#client_id").val(""); |
|
117 |
submit_with_action("save_client"); |
|
118 |
} |
|
119 |
|
|
120 |
function test_database_connectivity() { |
|
121 |
open_jqm_window({ |
|
122 |
url: 'controller.pl?action=Admin/test_database_connectivity', |
|
123 |
data: $("INPUT[data-dbsettings=1]").serialize(), |
|
124 |
type: 'POST' |
|
125 |
}); |
|
126 |
return true; |
|
127 |
} |
|
128 |
--> |
|
129 |
</script> |
templates/webpages/admin/show.html | ||
---|---|---|
7 | 7 |
<div> |
8 | 8 |
[% LxERP.t8("Actions") %]: |
9 | 9 |
<span class="link_separator"></span> |
10 |
[% L.link(SELF.url_for(action="new_client"), LxERP.t8("Add Client")) %] |
|
11 |
<span class="link_separator">|</span> |
|
12 | 10 |
[% L.link(SELF.url_for(action="new_user"), LxERP.t8("Add User")) %] |
13 | 11 |
<span class="link_separator">|</span> |
12 |
[% L.link(SELF.url_for(action="new_client"), LxERP.t8("Add Client")) %] |
|
13 |
<span class="link_separator">|</span> |
|
14 | 14 |
[% L.link(SELF.url_for(action="edit_groups"), LxERP.t8("Edit groups")) %] |
15 | 15 |
<span class="link_separator">|</span> |
16 | 16 |
[% L.link(SELF.url_for(action="pg_database_administration", controller="admin.pl"), LxERP.t8("Pg Database Administration")) %] |
... | ... | |
45 | 45 |
|
46 | 46 |
[%- ELSE %] |
47 | 47 |
<table width="100%"> |
48 |
<tr> |
|
49 |
<th class="listtop">[% LxERP.t8('Login Name') %]</th>
|
|
50 |
<th class="listtop">[% LxERP.t8('Name') %]</th>
|
|
51 |
<th class="listtop">[% LxERP.t8('Language') %]</th>
|
|
48 |
<tr class="listheading">
|
|
49 |
<th>[% LxERP.t8('Login Name') %]</th> |
|
50 |
<th>[% LxERP.t8('Name') %]</th> |
|
51 |
<th>[% LxERP.t8('Language') %]</th> |
|
52 | 52 |
</tr> |
53 | 53 |
|
54 | 54 |
[% FOREACH user = USERS %] |
... | ... | |
72 | 72 |
|
73 | 73 |
[%- ELSE %] |
74 | 74 |
<table width="100%"> |
75 |
<tr> |
|
76 |
<th class="listtop">[% LxERP.t8('Client name') %]</th> |
|
77 |
<th class="listtop">[% LxERP.t8('Database ID') %]</th> |
|
78 |
<th class="listtop">[% LxERP.t8('Database name') %]</th> |
|
79 |
<th class="listtop">[% LxERP.t8('Database Host') %]</th> |
|
80 |
<th class="listtop">[% LxERP.t8('Database User') %]</th> |
|
75 |
<tr class="listheading"> |
|
76 |
<th>[% LxERP.t8('Client name') %]</th> |
|
77 |
<th>[% LxERP.t8('Database ID') %]</th> |
|
78 |
<th>[% LxERP.t8('Database name') %]</th> |
|
79 |
<th>[% LxERP.t8('Database Host') %]</th> |
|
80 |
<th>[% LxERP.t8('Database User') %]</th> |
|
81 |
<th>[% LxERP.t8('Default client') %]</th> |
|
81 | 82 |
</tr> |
82 | 83 |
|
83 | 84 |
[%- FOREACH client = CLIENTS %] |
84 | 85 |
<tr class="listrow"> |
85 |
<td>[% L.link(SELF.url_for(action="edit_client", client_id=client.id), HTML.escape(client.name)) %]</td>
|
|
86 |
<td>[% L.link(SELF.url_for(action="edit_client", id=client.id), HTML.escape(client.name)) %]</td> |
|
86 | 87 |
<td>[% HTML.escape(client.id) %]</td> |
87 | 88 |
<td>[% HTML.escape(client.dbname) %]</td> |
88 | 89 |
<td>[% HTML.escape(client.dbhost) %][% IF client.dbport %]:[%- HTML.escape(client.dbport) %][%- END %]</td> |
89 | 90 |
<td>[% HTML.escape(client.dbuser) %]</td> |
91 |
<td>[% IF client.is_default %][% LxERP.t8("Yes") %][%- ELSE %][% LxERP.t8("No") %][%- END %]</td> |
|
90 | 92 |
</tr> |
91 | 93 |
[%- END %] |
92 | 94 |
</table> |
templates/webpages/admin/test_db_connection.html | ||
---|---|---|
1 |
[%- USE T8 %]
|
|
2 |
[%- USE HTML %]
|
|
1 |
[%- USE HTML %][%- USE LxERP -%][%- USE L -%]
|
|
2 |
<h1>[% HTML.escape(title) %]</h1>
|
|
3 | 3 |
|
4 |
<h1>[% title %]</h1>
|
|
4 |
[%- IF ok %]
|
|
5 | 5 |
|
6 |
[%- IF connection_ok %]
|
|
6 |
<p class="message_ok">[% LxERP.t8('The connection was established successfully.') %]</p>
|
|
7 | 7 |
|
8 |
<p class="message_ok">[% 'The connection was established successfully.' | $T8 %]</p> |
|
9 |
|
|
10 |
[%- ELSE %] |
|
8 |
[%- ELSE %] |
|
11 | 9 |
|
12 | 10 |
<p class="message_error"> |
13 |
[% 'The connection to the database could not be established.' | $T8 %]
|
|
14 |
[% 'Error message from the database driver:' | $T8 %]
|
|
11 |
[% LxERP.t8('The connection to the database could not be established.') %]
|
|
12 |
[% LxERP.t8('Error message from the database driver:') %]
|
|
15 | 13 |
</p> |
16 | 14 |
|
17 |
<p>[% HTML.escape(errstr) %]</p>
|
|
15 |
<p>[% HTML.escape(error) %]</p>
|
|
18 | 16 |
|
19 |
[%- END %]
|
|
17 |
[%- END %] |
|
20 | 18 |
|
21 |
<p> |
|
22 |
<form> |
|
23 |
<input type="button" class="submit" onclick="window.close()" value="[% 'Close Window' | $T8 %]"> |
|
24 |
</form> |
|
25 |
</p> |
|
19 |
<div> |
|
20 |
[% L.button_tag("\$('#jqm_popup_dialog .close').trigger('click');", LxERP.t8("Close Window")) %] |
|
21 |
</div> |
Auch abrufbar als: Unified diff
Admin: Anlegen, Bearbeiten und Löschen von Mandanten implementiert