Umstellung der Benutzerverwaltung von Dateien im Verzeichnis "users" auf die Verwendu...
authorMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 9 Jan 2008 11:54:14 +0000 (11:54 +0000)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 9 Jan 2008 11:54:14 +0000 (11:54 +0000)
Es ist erforderlich, die Dateien doc/UPGRADE und doc/INSTALL/index.html zu lesen und die angesprochenen Punkte auszuführen, um nach einem Upgrade weiter arbeiten zu können.

265 files changed:
SL/AM.pm
SL/Auth.pm [new file with mode: 0644]
SL/Auth/DB.pm [new file with mode: 0644]
SL/Auth/LDAP.pm [new file with mode: 0644]
SL/Common.pm
SL/DBUtils.pm
SL/Form.pm
SL/IC.pm
SL/IO.pm [new file with mode: 0644]
SL/InstallationCheck.pm
SL/LXDebug.pm
SL/Menu.pm
SL/MoreCommon.pm
SL/Template/Plugin/LxERP.pm
SL/User.pm
am.pl
bin/mozilla/admin.pl
bin/mozilla/admin_groups.pl [new file with mode: 0644]
bin/mozilla/am.pl
bin/mozilla/amtemplates.pl
bin/mozilla/ap.pl
bin/mozilla/ar.pl
bin/mozilla/arap.pl
bin/mozilla/bp.pl
bin/mozilla/ca.pl
bin/mozilla/common.pl
bin/mozilla/cp.pl
bin/mozilla/ct.pl
bin/mozilla/datev.pl
bin/mozilla/dn.pl
bin/mozilla/drafts.pl
bin/mozilla/gl.pl
bin/mozilla/ic.pl
bin/mozilla/installationcheck.pl
bin/mozilla/invoice_io.pl
bin/mozilla/io.pl
bin/mozilla/ir.pl
bin/mozilla/is.pl
bin/mozilla/kopf.pl
bin/mozilla/licenses.pl
bin/mozilla/login.pl
bin/mozilla/menu.pl
bin/mozilla/menunew.pl
bin/mozilla/oe.pl
bin/mozilla/pe.pl
bin/mozilla/rc.pl
bin/mozilla/reportgenerator.pl
bin/mozilla/rp.pl
bin/mozilla/ustva.pl
config/authentication.pl.default [new file with mode: 0644]
config/lx-erp.conf [new file with mode: 0644]
config/lx-erp.conf.default [new file with mode: 0644]
doc/INSTALL.texi
doc/INSTALL.txt
doc/INSTALL/Administratorpasswort.html [new file with mode: 0644]
doc/INSTALL/Anlegen-der-Authentifizierungsdatenbank.html [new file with mode: 0644]
doc/INSTALL/Apache_002dKonfiguration.html
doc/INSTALL/Authentifizierungsdatenbank.html [new file with mode: 0644]
doc/INSTALL/Benutzer-anlegen.html [new file with mode: 0644]
doc/INSTALL/Benutzer-und-Datenbanken-anlegen.html [deleted file]
doc/INSTALL/Benutzer_002d-und-Gruppenverwaltung.html [new file with mode: 0644]
doc/INSTALL/Benutzerauthentifizierung-und-Administratorpasswort.html [new file with mode: 0644]
doc/INSTALL/Datenbanken-anlegen.html [new file with mode: 0644]
doc/INSTALL/Grundlagen-zur-Benutzerauthentifizierung.html [new file with mode: 0644]
doc/INSTALL/Gruppen-anlegen.html [new file with mode: 0644]
doc/INSTALL/Gruppenmitgliedschaften-verwalten.html [new file with mode: 0644]
doc/INSTALL/Lx_002dOffice-ERP-verwenden.html
doc/INSTALL/Migration-alter-Installationen.html [new file with mode: 0644]
doc/INSTALL/Name-des-Session_002dCookies.html [new file with mode: 0644]
doc/INSTALL/OpenDocument_002dVorlagen.html
doc/INSTALL/Passwort_00fcberpr_00fcfung.html [new file with mode: 0644]
doc/INSTALL/Zusammenh_00e4nge.html [new file with mode: 0644]
doc/INSTALL/index.html
doc/Makefile
doc/UPGRADE
kopf.pl
locale/de/admin
locale/de/all
locale/de/am
locale/de/amtemplates
locale/de/ap
locale/de/ar
locale/de/arap
locale/de/bp
locale/de/ca
locale/de/common
locale/de/cp
locale/de/ct
locale/de/datev
locale/de/dn
locale/de/drafts
locale/de/gl
locale/de/ic
locale/de/io
locale/de/ir
locale/de/is
locale/de/licenses
locale/de/login
locale/de/menu
locale/de/menuXML
locale/de/menunew
locale/de/menuv3
locale/de/oe
locale/de/pe
locale/de/rc
locale/de/reportgenerator
locale/de/rp
locale/de/ustva
login.pl
lx-erp.conf [deleted file]
lx-erp.conf.default [deleted file]
menu.ini
sql/auth_db.sql [new file with mode: 0644]
templates/webpages/admin/adminlogin_de.html
templates/webpages/admin/adminlogin_master.html
templates/webpages/admin/backup_dataset_de.html
templates/webpages/admin/backup_dataset_email_done_de.html
templates/webpages/admin/backup_dataset_email_done_master.html
templates/webpages/admin/backup_dataset_master.html
templates/webpages/admin/change_admin_password_de.html [deleted file]
templates/webpages/admin/change_admin_password_master.html [deleted file]
templates/webpages/admin/check_auth_database_de.html [new file with mode: 0644]
templates/webpages/admin/check_auth_database_master.html [new file with mode: 0644]
templates/webpages/admin/check_auth_tables_de.html [new file with mode: 0644]
templates/webpages/admin/check_auth_tables_master.html [new file with mode: 0644]
templates/webpages/admin/create_dataset_de.html
templates/webpages/admin/create_dataset_master.html
templates/webpages/admin/create_standard_group_ask_de.html [new file with mode: 0644]
templates/webpages/admin/create_standard_group_ask_master.html [new file with mode: 0644]
templates/webpages/admin/dbadmin_de.html
templates/webpages/admin/dbadmin_master.html
templates/webpages/admin/dbcreate_de.html
templates/webpages/admin/dbcreate_master.html
templates/webpages/admin/dbdelete_de.html
templates/webpages/admin/dbdelete_master.html
templates/webpages/admin/dbupgrade_all_done_de.html
templates/webpages/admin/dbupgrade_all_done_master.html
templates/webpages/admin/delete_dataset_de.html
templates/webpages/admin/delete_dataset_master.html
templates/webpages/admin/delete_group_confirm_de.html [new file with mode: 0644]
templates/webpages/admin/delete_group_confirm_master.html [new file with mode: 0644]
templates/webpages/admin/edit_group_de.html [new file with mode: 0644]
templates/webpages/admin/edit_group_master.html [new file with mode: 0644]
templates/webpages/admin/edit_group_membership_de.html [new file with mode: 0644]
templates/webpages/admin/edit_group_membership_master.html [new file with mode: 0644]
templates/webpages/admin/edit_groups_de.html [new file with mode: 0644]
templates/webpages/admin/edit_groups_master.html [new file with mode: 0644]
templates/webpages/admin/edit_user_de.html
templates/webpages/admin/edit_user_master.html
templates/webpages/admin/list_users_de.html
templates/webpages/admin/list_users_master.html
templates/webpages/admin/restore_dataset_de.html
templates/webpages/admin/restore_dataset_master.html
templates/webpages/admin/restore_dataset_start_footer_de.html
templates/webpages/admin/restore_dataset_start_footer_master.html
templates/webpages/admin/update_dataset_de.html
templates/webpages/admin/update_dataset_master.html
templates/webpages/admin/user_migration_complete_de.html [new file with mode: 0644]
templates/webpages/admin/user_migration_complete_master.html [new file with mode: 0644]
templates/webpages/admin/user_migration_de.html [new file with mode: 0644]
templates/webpages/admin/user_migration_done_de.html [new file with mode: 0644]
templates/webpages/admin/user_migration_done_master.html [new file with mode: 0644]
templates/webpages/admin/user_migration_master.html [new file with mode: 0644]
templates/webpages/am/config_de.html
templates/webpages/am/config_master.html
templates/webpages/am/edit_defaults_de.html
templates/webpages/am/edit_defaults_master.html
templates/webpages/am/edit_price_factor_de.html
templates/webpages/am/edit_price_factor_master.html
templates/webpages/am/edit_tax_de.html
templates/webpages/am/edit_tax_master.html
templates/webpages/am/edit_units_de.html
templates/webpages/am/edit_units_master.html
templates/webpages/am/list_price_factors_de.html
templates/webpages/am/list_price_factors_master.html
templates/webpages/am/list_tax_de.html
templates/webpages/am/list_tax_master.html
templates/webpages/ap/ap_transactions_bottom_de.html
templates/webpages/ap/ap_transactions_bottom_master.html
templates/webpages/ar/ar_transactions_bottom_de.html
templates/webpages/ar/ar_transactions_bottom_master.html
templates/webpages/common/search_history_de.html
templates/webpages/common/search_history_master.html
templates/webpages/common/show_history_de.html
templates/webpages/common/show_history_master.html
templates/webpages/ct/form_footer_de.html
templates/webpages/ct/form_footer_master.html
templates/webpages/ct/list_names_bottom_de.html
templates/webpages/ct/list_names_bottom_master.html
templates/webpages/ct/search_de.html
templates/webpages/ct/search_master.html
templates/webpages/dbupgrade/buchungsgruppen_assemblies_de.html
templates/webpages/dbupgrade/buchungsgruppen_assemblies_master.html
templates/webpages/dbupgrade/buchungsgruppen_parts_de.html
templates/webpages/dbupgrade/buchungsgruppen_parts_master.html
templates/webpages/dbupgrade/buchungsgruppen_services_de.html
templates/webpages/dbupgrade/buchungsgruppen_services_master.html
templates/webpages/dbupgrade/coa_guess_de.html
templates/webpages/dbupgrade/coa_guess_master.html
templates/webpages/dbupgrade/footer_de.html
templates/webpages/dbupgrade/footer_master.html
templates/webpages/dbupgrade/std_buchungsgruppen_unknown_coa_de.html
templates/webpages/dbupgrade/std_buchungsgruppen_unknown_coa_master.html
templates/webpages/dbupgrade/units_parts_de.html
templates/webpages/dbupgrade/units_parts_master.html
templates/webpages/dbupgrade/units_services_de.html
templates/webpages/dbupgrade/units_services_master.html
templates/webpages/dbupgrade/units_set_default_de.html
templates/webpages/dbupgrade/units_set_default_master.html
templates/webpages/dbupgrade/warning_de.html
templates/webpages/dbupgrade/warning_master.html
templates/webpages/drafts/load_de.html
templates/webpages/drafts/load_master.html
templates/webpages/drafts/save_new_de.html
templates/webpages/drafts/save_new_master.html
templates/webpages/dunning/add_de.html
templates/webpages/dunning/add_master.html
templates/webpages/dunning/edit_config_de.html
templates/webpages/dunning/edit_config_master.html
templates/webpages/dunning/search_de.html
templates/webpages/dunning/search_master.html
templates/webpages/dunning/show_dunning_top_de.html
templates/webpages/dunning/show_dunning_top_master.html
templates/webpages/dunning/show_invoices_de.html
templates/webpages/dunning/show_invoices_master.html
templates/webpages/generic/part_selection_de.html [new file with mode: 0644]
templates/webpages/generic/part_selection_master.html [new file with mode: 0644]
templates/webpages/generic/project_selection_de.html [new file with mode: 0644]
templates/webpages/generic/project_selection_master.html [new file with mode: 0644]
templates/webpages/generic/select_part_de.html [new file with mode: 0644]
templates/webpages/generic/select_part_master.html [new file with mode: 0644]
templates/webpages/generic/select_project_de.html [new file with mode: 0644]
templates/webpages/generic/select_project_master.html [new file with mode: 0644]
templates/webpages/gl/generate_report_bottom_de.html
templates/webpages/gl/generate_report_bottom_master.html
templates/webpages/ic/generate_report_bottom_de.html
templates/webpages/ic/generate_report_bottom_master.html
templates/webpages/ic/search_de.html
templates/webpages/ic/search_master.html
templates/webpages/ic/search_update_prices_de.html
templates/webpages/ic/search_update_prices_master.html
templates/webpages/login/auth_db_unreachable_de.html [new file with mode: 0644]
templates/webpages/login/auth_db_unreachable_master.html [new file with mode: 0644]
templates/webpages/login/authentication_pl_missing_de.html [new file with mode: 0644]
templates/webpages/login/authentication_pl_missing_master.html [new file with mode: 0644]
templates/webpages/login/company_logo_de.html
templates/webpages/login/company_logo_master.html
templates/webpages/login/login_screen_de.html
templates/webpages/login/login_screen_master.html
templates/webpages/login/password_error_de.html [new file with mode: 0644]
templates/webpages/login/password_error_master.html [new file with mode: 0644]
templates/webpages/menu/menuv3_de.html
templates/webpages/menu/menuv3_master.html
templates/webpages/oe/orders_bottom_de.html
templates/webpages/oe/orders_bottom_master.html
templates/webpages/oe/orders_header_de.html
templates/webpages/oe/orders_header_master.html
templates/webpages/oe/sales_order_de.html
templates/webpages/oe/sales_order_master.html
templates/webpages/report_generator/html_report_de.html
templates/webpages/report_generator/html_report_master.html
templates/webpages/rp/aging_ar_bottom_de.html
templates/webpages/rp/aging_ar_bottom_master.html
templates/webpages/ustva/report_de.html
templates/webpages/ustva/report_master.html

index a2b6ff9..f788813 100644 (file)
--- a/SL/AM.pm
+++ b/SL/AM.pm
@@ -37,6 +37,7 @@
 
 package AM;
 
+use Carp;
 use Data::Dumper;
 use SL::DBUtils;
 
@@ -1528,7 +1529,7 @@ sub save_defaults {
 sub save_preferences {
   $main::lxdebug->enter_sub();
 
-  my ($self, $myconfig, $form, $memberfile, $userspath, $webdav) = @_;
+  my ($self, $myconfig, $form, $webdav) = @_;
 
   my $dbh = $form->get_standard_dbh($myconfig);
 
@@ -1546,13 +1547,25 @@ sub save_preferences {
 
   $form->{businessnumber} =  $businessnumber;
 
-  $myconfig = new User "$memberfile", "$form->{login}";
+  my $myconfig = new User($form->{login});
 
   foreach my $item (keys %$form) {
     $myconfig->{$item} = $form->{$item};
   }
 
-  $myconfig->save_member($memberfile, $userspath);
+  $myconfig->save_member($memberfile);
+
+  my $auth = $main::auth;
+
+  if ($auth->can_change_password()
+      && defined $form->{new_password}
+      && ($form->{new_password} ne '********')) {
+    $auth->change_password($form->{login}, $form->{new_password});
+
+    $form->{password} = $form->{new_password};
+    $auth->set_session_value('password', $form->{password});
+    $auth->create_or_refresh_session();
+  }
 
   if ($webdav) {
     @webdavdirs =
@@ -1820,6 +1833,21 @@ sub retrieve_units {
   return $units;
 }
 
+sub retrieve_all_units {
+  $main::lxdebug->enter_sub();
+
+  my $self = shift;
+
+  if (!$main::all_units) {
+    $main::all_units = $self->retrieve_units(\%main::myconfig, $main::form);
+  }
+
+  $main::lxdebug->leave_sub();
+
+  return $main::all_units;
+}
+
+
 sub translate_units {
   $main::lxdebug->enter_sub();
 
@@ -1889,6 +1917,34 @@ sub units_in_use {
   $main::lxdebug->leave_sub();
 }
 
+sub convertible_units {
+  $main::lxdebug->enter_sub();
+
+  my $self        = shift;
+  my $units       = shift;
+  my $filter_unit = shift;
+  my $not_smaller = shift;
+
+  my $conv_units = [];
+
+  $filter_unit = $units->{$filter_unit};
+
+  foreach my $name (sort { lc $a cmp lc $b } keys %{ $units }) {
+    my $unit = $units->{$name};
+
+    if (($unit->{base_unit} eq $filter_unit->{base_unit}) &&
+        (!$not_smaller || ($unit->{factor} >= $filter_unit->{factor}))) {
+      push @{$conv_units}, $unit;
+    }
+  }
+
+  my @sorted = sort { $b->{factor} <=> $a->{factor} } @{ $conv_units };
+
+  $main::lxdebug->leave_sub();
+
+  return \@sorted;
+}
+
 # if $a is translatable to $b, return the factor between them.
 # else return 1
 sub convert_unit {
@@ -1903,7 +1959,7 @@ sub convert_unit {
 sub unit_select_data {
   $main::lxdebug->enter_sub();
 
-  my ($self, $units, $selected, $empty_entry) = @_;
+  my ($self, $units, $selected, $empty_entry, $convertible_into) = @_;
 
   my $select = [];
 
@@ -1912,10 +1968,14 @@ sub unit_select_data {
   }
 
   foreach my $unit (sort({ $units->{$a}->{"sortkey"} <=> $units->{$b}->{"sortkey"} } keys(%{$units}))) {
-    push(@{$select}, { "name" => $unit,
-                       "base_unit" => $units->{$unit}->{"base_unit"},
-                       "factor" => $units->{$unit}->{"factor"},
-                       "selected" => ($unit eq $selected) ? "selected" : "" });
+    if (!$convertible_into ||
+        ($units->{$convertible_into} &&
+         ($units->{$convertible_into}->{base_unit} eq $units->{$unit}->{base_unit}))) {
+      push @{$select}, { "name"      => $unit,
+                         "base_unit" => $units->{$unit}->{"base_unit"},
+                         "factor"    => $units->{$unit}->{"factor"},
+                         "selected"  => ($unit eq $selected) ? "selected" : "" };
+    }
   }
 
   $main::lxdebug->leave_sub();
@@ -1944,6 +2004,36 @@ sub unit_select_html {
   return $select;
 }
 
+sub sum_with_unit {
+  $main::lxdebug->enter_sub();
+
+  my $self  = shift;
+
+  my $units = $self->retrieve_all_units();
+
+  my $sum   = 0;
+  my $base_unit;
+
+  while (2 <= scalar(@_)) {
+    my $qty  = shift(@_);
+    my $unit = $units->{shift(@_)};
+
+    croak "No unit defined with name $unit" if (!defined $unit);
+
+    if (!$base_unit) {
+      $base_unit = $unit->{base_unit};
+    } elsif ($base_unit ne $unit->{base_unit}) {
+      croak "Adding values with incompatible base units $base_unit/$unit->{base_unit}";
+    }
+
+    $sum += $qty * $unit->{factor};
+  }
+
+  $main::lxdebug->leave_sub();
+
+  return wantarray ? ($sum, $baseunit) : $sum;
+}
+
 sub add_unit {
   $main::lxdebug->enter_sub();
 
diff --git a/SL/Auth.pm b/SL/Auth.pm
new file mode 100644 (file)
index 0000000..062a4ba
--- /dev/null
@@ -0,0 +1,933 @@
+package SL::Auth;
+
+use constant OK           =>   0;
+use constant ERR_PASSWORD =>   1;
+use constant ERR_BACKEND  => 100;
+
+use Digest::MD5 qw(md5_hex);
+use IO::File;
+use Time::HiRes qw(gettimeofday);
+
+use SL::Auth::DB;
+use SL::Auth::LDAP;
+
+use SL::User;
+use SL::DBUtils;
+
+sub new {
+  $main::lxdebug->enter_sub();
+
+  my $type = shift;
+  my $self = {};
+
+  bless $self, $type;
+
+  $self->{SESSION} = { };
+
+  $self->_read_auth_config();
+
+  $main::lxdebug->leave_sub();
+
+  return $self;
+}
+
+sub DESTROY {
+  my $self = shift;
+
+  $self->{dbh}->disconnect() if ($self->{dbh});
+}
+
+sub _read_auth_config {
+  $main::lxdebug->enter_sub();
+
+  my $self   = shift;
+
+  my $form   = $main::form;
+  my $locale = $main::locale;
+
+  my $code;
+  my $in = IO::File->new('config/authentication.pl', 'r');
+
+  if (!$in) {
+    $form->error($locale->text('The config file "config/authentication.pl" was not found.'));
+  }
+
+  while (<$in>) {
+    $code .= $_;
+  }
+  $in->close();
+
+  eval $code;
+
+  if ($@) {
+    $form->error($locale->text('The config file "config/authentication.pl" contained invalid Perl code:') . "\n" . $@);
+  }
+
+  if ($self->{module} eq 'DB') {
+    $self->{authenticator} = SL::Auth::DB->new($self);
+
+  } elsif ($self->{module} eq 'LDAP') {
+    $self->{authenticator} = SL::Auth::LDAP->new($self);
+  }
+
+  if (!$self->{authenticator}) {
+    $form->error($locale->text('No or an unknown authenticantion module specified in "config/authentication.pl".'));
+  }
+
+  my $cfg = $self->{DB_config};
+
+  if (!$cfg) {
+    $form->error($locale->text('config/authentication.pl: Key "DB_config" is missing.'));
+  }
+
+  if (!$cfg->{host} || !$cfg->{db} || !$cfg->{user}) {
+    $form->error($locale->text('config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".'));
+  }
+
+  $self->{authenticator}->verify_config();
+
+  $main::lxdebug->leave_sub();
+}
+
+sub authenticate_root {
+  $main::lxdebug->enter_sub();
+
+  my $self          = shift;
+  my $password      = shift;
+  my $is_crypted    = shift;
+
+  $password         = crypt $password, 'ro' if (!$password || !$is_crypted);
+  $admin_password   = crypt "$self->{admin_password}", 'ro';
+
+  $main::lxdebug->leave_sub();
+
+  return $password eq $admin_password ? OK : ERR_PASSWORD;
+}
+
+sub authenticate {
+  $main::lxdebug->enter_sub();
+
+  my $self = shift;
+
+  $main::lxdebug->leave_sub();
+
+  return $self->{authenticator}->authenticate(@_);
+}
+
+sub dbconnect {
+  $main::lxdebug->enter_sub();
+
+  my $self     = shift;
+  my $may_fail = shift;
+
+  if ($self->{dbh}) {
+    $main::lxdebug->leave_sub();
+    return $self->{dbh};
+  }
+
+  my $cfg = $self->{DB_config};
+  my $dsn = 'dbi:Pg:dbname=' . $cfg->{db} . ';host=' . $cfg->{host};
+
+  if ($cfg->{port}) {
+    $dsn .= ';port=' . $cfg->{port};
+  }
+
+  $main::lxdebug->message(LXDebug::DEBUG1, "Auth::dbconnect DSN: $dsn");
+
+  $self->{dbh} = DBI->connect($dsn, $cfg->{user}, $cfg->{password}, { 'AutoCommit' => 0 });
+
+  if (!$may_fail && !$self->{dbh}) {
+    $main::form->error($main::locale->text('The connection to the authentication database failed:') . "\n" . $DBI::errstr);
+  }
+
+  $main::lxdebug->leave_sub();
+
+  return $self->{dbh};
+}
+
+sub dbdisconnect {
+  $main::lxdebug->enter_sub();
+
+  my $self = shift;
+
+  if ($self->{dbh}) {
+    $self->{dbh}->disconnect();
+    delete $self->{dbh};
+  }
+
+  $main::lxdebug->leave_sub();
+}
+
+sub check_tables {
+  $main::lxdebug->enter_sub();
+
+  my $self    = shift;
+
+  my $dbh     = $self->dbconnect();
+  my $query   = qq|SELECT COUNT(*) FROM pg_tables WHERE (schemaname = 'auth') AND (tablename = 'user')|;
+
+  my ($count) = $dbh->selectrow_array($query);
+
+  $main::lxdebug->leave_sub();
+
+  return $count > 0;
+}
+
+sub check_database {
+  $main::lxdebug->enter_sub();
+
+  my $self = shift;
+
+  my $dbh  = $self->dbconnect(1);
+
+  $main::lxdebug->leave_sub();
+
+  return $dbh ? 1 : 0;
+}
+
+sub create_database {
+  $main::lxdebug->enter_sub();
+
+  my $self   = shift;
+  my %params = @_;
+
+  my $cfg    = $self->{DB_config};
+
+  if (!$params{superuser}) {
+    $params{superuser}          = $cfg->{user};
+    $params{superuser_password} = $cfg->{password};
+  }
+
+  $params{template} ||= 'template0';
+  $params{template}   =~ s|[^a-zA-Z0-9_\-]||g;
+
+  my $dsn = 'dbi:Pg:dbname=template1;host=' . $cfg->{host};
+
+  if ($cfg->{port}) {
+    $dsn .= ';port=' . $cfg->{port};
+  }
+
+  $main::lxdebug->message(LXDebug::DEBUG1, "Auth::create_database DSN: $dsn");
+
+  my $dbh = DBI->connect($dsn, $params{superuser}, $params{superuser_password});
+
+  if (!$dbh) {
+    $main::form->error($main::locale->text('The connection to the template database failed:') . "\n" . $DBI::errstr);
+  }
+
+  my $charset    = $main::charset;
+  $charset     ||= Common::DEFAULT_CHARSET;
+  my $encoding   = $Common::charset_to_db_encoding{$charset};
+  $encoding    ||= 'UNICODE';
+
+  my $query = qq|CREATE DATABASE "$cfg->{db}" OWNER "$cfg->{user}" TEMPLATE "$params{template}" ENCODING '$encoding'|;
+
+  $main::lxdebug->message(LXDebug::DEBUG1, "Auth::create_database query: $query");
+
+  $dbh->do($query);
+
+  if ($dbh->err) {
+    $dbh->disconnect();
+
+    $main::form->error($main::locale->text('The creation of the authentication database failed:') . "\n" . $DBI::errstr);
+  }
+
+  $dbh->disconnect();
+
+  $main::lxdebug->leave_sub();
+}
+
+sub create_tables {
+  $main::lxdebug->enter_sub();
+
+  my $self = shift;
+  my $dbh  = $self->dbconnect();
+
+  my $charset    = $main::charset;
+  $charset     ||= Common::DEFAULT_CHARSET;
+
+  $dbh->rollback();
+  User->process_query($main::form, $dbh, 'sql/auth_db.sql', undef, $charset);
+
+  $main::lxdebug->leave_sub();
+}
+
+sub save_user {
+  $main::lxdebug->enter_sub();
+
+  my $self   = shift;
+  my $login  = shift;
+  my %params = @_;
+
+  my $form   = $main::form;
+
+  my $dbh    = $self->dbconnect();
+
+  my ($sth, $query, $user_id);
+
+  $query     = qq|SELECT id FROM auth."user" WHERE login = ?|;
+  ($user_id) = selectrow_query($form, $dbh, $query, $login);
+
+  if (!$user_id) {
+    $query     = qq|SELECT nextval('auth.user_id_seq')|;
+    ($user_id) = selectrow_query($form, $dbh, $query);
+
+    $query     = qq|INSERT INTO auth."user" (id, login) VALUES (?, ?)|;
+    do_query($form, $dbh, $query, $user_id, $login);
+  }
+
+  $query = qq|DELETE FROM auth.user_config WHERE (user_id = ?)|;
+  do_query($form, $dbh, $query, $user_id);
+
+  $query = qq|INSERT INTO auth.user_config (user_id, cfg_key, cfg_value) VALUES (?, ?, ?)|;
+  $sth   = prepare_query($form, $dbh, $query);
+
+  while (my ($cfg_key, $cfg_value) = each %params) {
+    next if ($cfg_key eq 'password');
+
+    do_statement($form, $sth, $query, $user_id, $cfg_key, $cfg_value);
+  }
+
+  $dbh->commit();
+
+  $main::lxdebug->leave_sub();
+}
+
+sub can_change_password {
+  my $self = shift;
+
+  return $self->{authenticator}->can_change_password();
+}
+
+sub change_password {
+  $main::lxdebug->enter_sub();
+
+  my $self   = shift;
+  my $result = $self->{authenticator}->change_password(@_);
+
+  $main::lxdebug->leave_sub();
+
+  return $result;
+}
+
+sub read_all_users {
+  $main::lxdebug->enter_sub();
+
+  my $self  = shift;
+
+  my $dbh   = $self->dbconnect();
+  my $query = qq|SELECT u.id, u.login, cfg.cfg_key, cfg.cfg_value
+                 FROM auth.user_config cfg
+                 LEFT JOIN auth."user" u ON (cfg.user_id = u.id)|;
+  my $sth   = prepare_execute_query($main::form, $dbh, $query);
+
+  my %users;
+
+  while (my $ref = $sth->fetchrow_hashref()) {
+    $users{$ref->{login}}                    ||= { 'login' => $ref->{login}, 'id' => $ref->{id} };
+    $users{$ref->{login}}->{$ref->{cfg_key}}   = $ref->{cfg_value} if (($cfg_key ne 'login') && ($cfg_key ne 'id'));
+  }
+
+  $sth->finish();
+
+  $main::lxdebug->leave_sub();
+
+  return %users;
+}
+
+sub read_user {
+  $main::lxdebug->enter_sub();
+
+  my $self  = shift;
+  my $login = shift;
+
+  my $dbh   = $self->dbconnect();
+  my $query = qq|SELECT cfg.cfg_key, cfg.cfg_value
+                 FROM auth.user_config cfg
+                 LEFT JOIN auth."user" u ON (cfg.user_id = u.id)
+                 WHERE (u.login = ?)|;
+  my $sth   = prepare_execute_query($main::form, $dbh, $query, $login);
+
+  my %user_data;
+
+  while (my $ref = $sth->fetchrow_hashref()) {
+    $user_data{$ref->{cfg_key}} = $ref->{cfg_value};
+    $user_data{login}           = $login;
+  }
+
+  $sth->finish();
+
+  $main::lxdebug->leave_sub();
+
+  return %user_data;
+}
+
+sub get_user_id {
+  $main::lxdebug->enter_sub();
+
+  my $self  = shift;
+  my $login = shift;
+
+  my $dbh   = $self->dbconnect();
+  my ($id)  = selectrow_query($main::form, $dbh, qq|SELECT id FROM auth."user" WHERE login = ?|, $login);
+
+  $main::lxdebug->leave_sub();
+
+  return $id;
+}
+
+sub delete_user {
+  $main::lxdebug->enter_sub();
+
+  my $self  = shift;
+  my $login = shift;
+
+  my $form  = $main::form;
+
+  my $dbh   = $self->dbconnect();
+  my $query = qq|SELECT id FROM auth."user" WHERE login = ?|;
+
+  my ($id)  = selectrow_query($form, $dbh, $query, $login);
+
+  return $main::lxdebug->leave_sub() if (!$id);
+
+  do_query($form, $dbh, qq|DELETE FROM auth.user_group WHERE user_id = ?|, $id);
+  do_query($form, $dbh, qq|DELETE FROM auth.user_config WHERE user_id = ?|, $id);
+
+  $dbh->commit();
+
+  $main::lxdebug->leave_sub();
+}
+
+# --------------------------------------
+
+my $session_id;
+
+sub restore_session {
+  $main::lxdebug->enter_sub();
+
+  my $self = shift;
+
+  my $cgi            =  $main::cgi;
+  $cgi             ||=  CGI->new('');
+
+  $session_id        =  $cgi->cookie($self->get_session_cookie_name());
+  $session_id        =~ s|[^0-9a-f]||g;
+
+  $self->{SESSION}   = { };
+
+  return $main::lxdebug->leave_sub() if (!$session_id);
+
+  my ($dbh, $query, $sth, $cookie, $ref, $form);
+
+  $form   = $main::form;
+
+  $dbh    = $self->dbconnect();
+  $query  = qq|SELECT *, (mtime < (now() - '24h'::interval)) AS is_expired FROM auth.session WHERE id = ?|;
+
+  $cookie = selectfirst_hashref_query($form, $dbh, $query, $session_id);
+
+  if (!$cookie || $cookie->{is_expired} || ($cookie->{ip_address} ne $ENV{REMOTE_ADDR})) {
+    $self->destroy_session();
+    $main::lxdebug->leave_sub();
+    return;
+  }
+
+  $query = qq|SELECT sess_key, sess_value FROM auth.session_content WHERE session_id = ?|;
+  $sth   = prepare_execute_query($form, $dbh, $query, $session_id);
+
+  while (my $ref = $sth->fetchrow_hashref()) {
+    $self->{SESSION}->{$ref->{sess_key}} = $ref->{sess_value};
+    $form->{$ref->{sess_key}}            = $ref->{sess_value} if (!defined $form->{$ref->{sess_key}});
+  }
+
+  $sth->finish();
+
+  $main::lxdebug->leave_sub();
+}
+
+sub destroy_session {
+  $main::lxdebug->enter_sub();
+
+  my $self = shift;
+
+  if ($session_id) {
+    my $dbh = $self->dbconnect();
+
+    do_query($main::form, $dbh, qq|DELETE FROM auth.session_content WHERE session_id = ?|, $session_id);
+    do_query($main::form, $dbh, qq|DELETE FROM auth.session WHERE id = ?|, $session_id);
+
+    $dbh->commit();
+
+    $session_id      = undef;
+    $self->{SESSION} = { };
+  }
+
+  $main::lxdebug->leave_sub();
+}
+
+sub expire_sessions {
+  $main::lxdebug->enter_sub();
+
+  my $self  = shift;
+
+  my $dbh   = $self->dbconnect();
+  my $query =
+    qq|DELETE FROM auth.session_content
+       WHERE session_id IN
+         (SELECT id
+          FROM auth.session
+          WHERE (mtime < (now() - '24h'::interval)))|;
+
+  do_query($main::form, $dbh, $query);
+
+  $query =
+    qq|DELETE FROM auth.session
+       WHERE (mtime < (now() - '24h'::interval))|;
+
+  do_query($main::form, $dbh, $query);
+
+  $dbh->commit();
+
+  $main::lxdebug->leave_sub();
+}
+
+sub _create_session_id {
+  $main::lxdebug->enter_sub();
+
+  my @secs = gettimeofday();
+  srand $secs[1] + $$;
+
+  my @data;
+  map { push @data, int(rand() * 255); } (1..32);
+
+  my $id = md5_hex(pack 'C*', @data);
+
+  $main::lxdebug->leave_sub();
+
+  return $id;
+}
+
+sub create_or_refresh_session {
+  $main::lxdebug->enter_sub();
+
+  my $self = shift;
+
+  $session_id ||= $self->_create_session_id();
+
+  my ($form, $dbh, $query, $sth, $id);
+
+  $form  = $main::form;
+  $dbh   = $self->dbconnect();
+
+  $query = qq|SELECT id FROM auth.session WHERE id = ?|;
+
+  ($id)  = selectrow_query($form, $dbh, $query, $session_id);
+
+  if ($id) {
+    do_query($form, $dbh, qq|UPDATE auth.session SET mtime = now() WHERE id = ?|, $session_id);
+    do_query($form, $dbh, qq|DELETE FROM auth.session_content WHERE session_id = ?|, $session_id);
+
+  } else {
+    do_query($form, $dbh, qq|INSERT INTO auth.session (id, ip_address, mtime) VALUES (?, ?, now())|, $session_id, $ENV{REMOTE_ADDR});
+
+  }
+
+  $query = qq|INSERT INTO auth.session_content (session_id, sess_key, sess_value) VALUES (?, ?, ?)|;
+  $sth   = prepare_query($form, $dbh, $query);
+
+  foreach my $key (sort keys %{ $self->{SESSION} }) {
+    do_statement($form, $sth, $query, $session_id, $key, $self->{SESSION}->{$key});
+  }
+
+  $sth->finish();
+  $dbh->commit();
+
+  $main::lxdebug->leave_sub();
+}
+
+sub set_session_value {
+  $main::lxdebug->enter_sub();
+
+  my $self  = shift;
+
+  $self->{SESSION} ||= { };
+
+  while (2 <= scalar @_) {
+    my $key   = shift;
+    my $value = shift;
+
+    $self->{SESSION}->{$key} = $value;
+  }
+
+  $main::lxdebug->leave_sub();
+}
+
+sub set_cookie_environment_variable {
+  my $self = shift;
+  $ENV{HTTP_COOKIE} = $self->get_session_cookie_name() . "=${session_id}";
+}
+
+sub get_session_cookie_name {
+  my $self = shift;
+
+  return $self->{cookie_name} || 'lx_office_erp_session_id';
+}
+
+sub get_session_id {
+  return $session_id;
+}
+
+sub session_tables_present {
+  $main::lxdebug->enter_sub();
+
+  my $self = shift;
+  my $dbh  = $self->dbconnect(1);
+
+  if (!$dbh) {
+    $main::lxdebug->leave_sub();
+    return 0;
+  }
+
+  my $query =
+    qq|SELECT COUNT(*)
+       FROM pg_tables
+       WHERE (schemaname = 'auth')
+         AND (tablename IN ('session', 'session_content'))|;
+
+  my ($count) = selectrow_query($main::form, $dbh, $query);
+
+  $main::lxdebug->leave_sub();
+
+  return 2 == $count;
+}
+
+# --------------------------------------
+
+sub all_rights_full {
+  my $locale = $main::locale;
+
+  my @all_rights = (
+    ["--master_data",                  $locale->text("Master Data")],
+    ["customer_vendor_edit",           $locale->text("Create and edit customers and vendors")],
+    ["part_service_assembly_edit",     $locale->text("Create and edit parts, services, assemblies")],
+    ["project_edit",                   $locale->text("Create and edit projects")],
+    ["license_edit",                   $locale->text("Manage license keys")],
+    ["--ar",                           $locale->text("AR")],
+    ["sales_quotation_edit",           $locale->text("Create and edit sales quotations")],
+    ["sales_order_edit",               $locale->text("Create and edit sales orders")],
+    ["sales_delivery_order_edit",      $locale->text("Create and edit sales delivery orders")],
+    ["invoice_edit",                   $locale->text("Create and edit invoices and credit notes")],
+    ["dunning_edit",                   $locale->text("Create and edit dunnings")],
+    ["--ap",                           $locale->text("AP")],
+    ["request_quotation_edit",         $locale->text("Create and edit RFQs")],
+    ["purchase_order_edit",            $locale->text("Create and edit purchase orders")],
+    ["purchase_delivery_order_edit",   $locale->text("Create and edit purchase delivery orders")],
+    ["vendor_invoice_edit",            $locale->text("Create and edit vendor invoices")],
+    ["--general_ledger_cash",          $locale->text("General ledger and cash")],
+    ["general_ledger",                 $locale->text("Transactions, AR transactions, AP transactions")],
+    ["datev_export",                   $locale->text("DATEV Export")],
+    ["cash",                           $locale->text("Receipt, payment, reconciliation")],
+    ["--reports",                      $locale->text('Reports')],
+    ["report",                         $locale->text('All reports')],
+    ["advance_turnover_tax_return",    $locale->text('Advance turnover tax return')],
+    ["--others",                       $locale->text("Others")],
+    ["email_bcc",                      $locale->text("May set the BCC field when sending emails")],
+    ["config",                         $locale->text("Change Lx-Office installation settings (all menu entries beneath 'System')")],
+    );
+
+  return @all_rights;
+}
+
+sub all_rights {
+  return grep !/^--/, map { $_->[0] } all_rights_full();
+}
+
+sub read_groups {
+  $main::lxdebug->enter_sub();
+
+  my $self = shift;
+
+  my $form   = $main::form;
+  my $groups = {};
+  my $dbh    = $self->dbconnect();
+
+  my $query  = 'SELECT * FROM auth."group"';
+  my $sth    = prepare_execute_query($form, $dbh, $query);
+
+  my ($row, $group);
+
+  while ($row = $sth->fetchrow_hashref()) {
+    $groups->{$row->{id}} = $row;
+  }
+  $sth->finish();
+
+  $query = 'SELECT * FROM auth.user_group WHERE group_id = ?';
+  $sth   = prepare_query($form, $dbh, $query);
+
+  foreach $group (values %{$groups}) {
+    $group->{members} = [];
+
+    do_statement($form, $sth, $query, $group->{id});
+
+    while ($row = $sth->fetchrow_hashref()) {
+      push @{$group->{members}}, $row->{user_id};
+    }
+  }
+  $sth->finish();
+
+  $query = 'SELECT * FROM auth.group_rights WHERE group_id = ?';
+  $sth   = prepare_query($form, $dbh, $query);
+
+  foreach $group (values %{$groups}) {
+    $group->{rights} = {};
+
+    do_statement($form, $sth, $query, $group->{id});
+
+    while ($row = $sth->fetchrow_hashref()) {
+      $group->{rights}->{$row->{right}} |= $row->{granted};
+    }
+
+    map { $group->{rights}->{$_} = 0 if (!defined $group->{rights}->{$_}); } all_rights();
+  }
+  $sth->finish();
+
+  $main::lxdebug->leave_sub();
+
+  return $groups;
+}
+
+sub save_group {
+  $main::lxdebug->enter_sub();
+
+  my $self  = shift;
+  my $group = shift;
+
+  my $form  = $main::form;
+  my $dbh   = $self->dbconnect();
+
+  my ($query, $sth, $row, $rights);
+
+  if (!$group->{id}) {
+    ($group->{id}) = selectrow_query($form, $dbh, qq|SELECT nextval('auth.group_id_seq')|);
+
+    $query = qq|INSERT INTO auth."group" (id, name, description) VALUES (?, '', '')|;
+    do_query($form, $dbh, $query, $group->{id});
+  }
+
+  do_query($form, $dbh, qq|UPDATE auth."group" SET name = ?, description = ? WHERE id = ?|, map { $group->{$_} } qw(name description id));
+
+  do_query($form, $dbh, qq|DELETE FROM auth.user_group WHERE group_id = ?|, $group->{id});
+
+  $query  = qq|INSERT INTO auth.user_group (user_id, group_id) VALUES (?, ?)|;
+  $sth    = prepare_query($form, $dbh, $query);
+
+  foreach my $user_id (@{ $group->{members} }) {
+    do_statement($form, $sth, $query, $user_id, $group->{id});
+  }
+  $sth->finish();
+
+  do_query($form, $dbh, qq|DELETE FROM auth.group_rights WHERE group_id = ?|, $group->{id});
+
+  $query = qq|INSERT INTO auth.group_rights (group_id, "right", granted) VALUES (?, ?, ?)|;
+  $sth   = prepare_query($form, $dbh, $query);
+
+  foreach my $right (keys %{ $group->{rights} }) {
+    do_statement($form, $sth, $query, $group->{id}, $right, $group->{rights}->{$right} ? 't' : 'f');
+  }
+  $sth->finish();
+
+  $dbh->commit();
+
+  $main::lxdebug->leave_sub();
+}
+
+sub delete_group {
+  $main::lxdebug->enter_sub();
+
+  my $self = shift;
+  my $id   = shift;
+
+  my $form = $main::from;
+
+  my $dbh  = $self->dbconnect();
+
+  do_query($form, $dbh, qq|DELETE FROM auth.user_group WHERE group_id = ?|, $id);
+  do_query($form, $dbh, qq|DELETE FROM auth.group_rights WHERE group_id = ?|, $id);
+  do_query($form, $dbh, qq|DELETE FROM auth."group" WHERE id = ?|, $id);
+
+  $dbh->commit();
+
+  $main::lxdebug->leave_sub();
+}
+
+sub evaluate_rights_ary {
+  $main::lxdebug->enter_sub(2);
+
+  my $ary    = shift;
+
+  my $value  = 0;
+  my $action = '|';
+
+  foreach my $el (@{$ary}) {
+    if (ref $el eq "ARRAY") {
+      if ($action eq '|') {
+        $value |= evaluate_rights_ary($el);
+      } else {
+        $value &= evaluate_rights_ary($el);
+      }
+
+    } elsif (($el eq '&') || ($el eq '|')) {
+      $action = $el;
+
+    } elsif ($action eq '|') {
+      $value |= $el;
+
+    } else {
+      $value &= $el;
+
+    }
+  }
+
+  $main::lxdebug->enter_sub(2);
+
+  return $value;
+}
+
+sub _parse_rights_string {
+  $main::lxdebug->enter_sub(2);
+
+  my $self   = shift;
+
+  my $login  = shift;
+  my $access = shift;
+
+  my @stack;
+  my $cur_ary = [];
+
+  push @stack, $cur_ary;
+
+  while ($access =~ m/^([a-z_0-9]+|\||\&|\(|\)|\s+)/) {
+    my $token = $1;
+    substr($access, 0, length $1) = "";
+
+    next if ($token =~ /\s/);
+
+    if ($token eq "(") {
+      my $new_cur_ary = [];
+      push @stack, $new_cur_ary;
+      push @{$cur_ary}, $new_cur_ary;
+      $cur_ary = $new_cur_ary;
+
+    } elsif ($token eq ")") {
+      pop @stack;
+
+      if (!@stack) {
+        $main::lxdebug->enter_sub(2);
+        return 0;
+      }
+
+      $cur_ary = $stack[-1];
+
+    } elsif (($token eq "|") || ($token eq "&")) {
+      push @{$cur_ary}, $token;
+
+    } else {
+      push @{$cur_ary}, $self->{RIGHTS}->{$login}->{$token} * 1;
+    }
+  }
+
+  my $result = ($access || (1 < scalar @stack)) ? 0 : evaluate_rights_ary($stack[0]);
+
+  $main::lxdebug->enter_sub(2);
+
+  return $result;
+}
+
+sub check_right {
+  $main::lxdebug->enter_sub(2);
+
+  my $self    = shift;
+  my $login   = shift;
+  my $right   = shift;
+  my $default = shift;
+
+  $self->{FULL_RIGHTS}           ||= { };
+  $self->{FULL_RIGHTS}->{$login} ||= { };
+
+  if (!defined $self->{FULL_RIGHTS}->{$login}->{$right}) {
+    $self->{RIGHTS}           ||= { };
+    $self->{RIGHTS}->{$login} ||= $self->load_rights_for_user($login);
+
+    $self->{FULL_RIGHTS}->{$login}->{$right} = $self->_parse_rights_string($login, $right);
+  }
+
+  my $granted = $self->{FULL_RIGHTS}->{$login}->{$right};
+  $granted    = $default if (!defined $granted);
+
+  $main::lxdebug->leave_sub(2);
+
+  return $granted;
+}
+
+sub assert {
+  $main::lxdebug->enter_sub(2);
+
+  my $self       = shift;
+  my $right      = shift;
+  my $dont_abort = shift;
+
+  my $form       = $main::form;
+
+  if ($self->check_right($form->{login}, $right)) {
+    $main::lxdebug->leave_sub(2);
+    return 1;
+  }
+
+  if (!$dont_abort) {
+    delete $form->{title};
+    $form->show_generic_error($main::locale->text("You do not have the permissions to access this function."));
+  }
+
+  $main::lxdebug->leave_sub(2);
+
+  return 0;
+}
+
+sub load_rights_for_user {
+  $main::lxdebug->enter_sub();
+
+  my $self  = shift;
+  my $login = shift;
+
+  my $form  = $main::form;
+  my $dbh   = $self->dbconnect();
+
+  my ($query, $sth, $row, $rights);
+
+  $rights = {};
+
+  $query =
+    qq|SELECT gr."right", gr.granted
+       FROM auth.group_rights gr
+       WHERE group_id IN
+         (SELECT ug.group_id
+          FROM auth.user_group ug
+          LEFT JOIN auth."user" u ON (ug.user_id = u.id)
+          WHERE u.login = ?)|;
+
+  $sth = prepare_execute_query($form, $dbh, $query, $login);
+
+  while ($row = $sth->fetchrow_hashref()) {
+    $rights->{$row->{right}} |= $row->{granted};
+  }
+  $sth->finish();
+
+  map({ $rights->{$_} = 0 unless (defined $rights->{$_}); } SL::Auth::all_rights());
+
+  $main::lxdebug->leave_sub();
+
+  return $rights;
+}
+
+1;
diff --git a/SL/Auth/DB.pm b/SL/Auth/DB.pm
new file mode 100644 (file)
index 0000000..cc264ca
--- /dev/null
@@ -0,0 +1,83 @@
+package SL::Auth::DB;
+
+use DBI;
+
+use SL::Auth;
+use SL::DBUtils;
+
+sub new {
+  $main::lxdebug->enter_sub();
+
+  my $type = shift;
+  my $self = {};
+
+  $self->{auth} = shift;
+
+  bless $self, $type;
+
+  $main::lxdebug->leave_sub();
+
+  return $self;
+}
+
+sub authenticate {
+  $main::lxdebug->enter_sub();
+
+  my $self       = shift;
+  my $login      = shift;
+  my $password   = shift;
+  my $is_crypted = shift;
+
+  my $dbh        = $self->{auth}->dbconnect();
+
+  if (!$dbh) {
+    $main::lxdebug->leave_sub();
+    return SL::Auth::ERR_BACKEND;
+  }
+
+  my $query             = qq|SELECT password FROM auth."user" WHERE login = ?|;
+  my ($stored_password) = $dbh->selectrow_array($query, undef, $login);
+
+  $password        = crypt $password, substr($login, 0, 2)        if (!$password || !$is_crypted);
+  $stored_password = crypt $stored_password, substr($login, 0, 2) if (!$stored_password);
+
+  $main::lxdebug->leave_sub();
+
+  return $password eq $stored_password ? SL::Auth::OK : SL::Auth::ERR_PASSWORD;
+}
+
+sub can_change_password {
+  return 1;
+}
+
+sub change_password {
+  $main::lxdebug->enter_sub();
+
+  my $self       = shift;
+  my $login      = shift;
+  my $password   = shift;
+  my $is_crypted = shift;
+
+  my $dbh        = $self->{auth}->dbconnect();
+
+  if (!$dbh) {
+    $main::lxdebug->leave_sub();
+    return SL::Auth::ERR_BACKEND
+  }
+
+  $password = crypt $password, substr($login, 0, 2) if (!$is_crypted);
+
+  do_query($main::form, $dbh, qq|UPDATE auth."user" SET password = ? WHERE login = ?|, $password, $login);
+
+  $dbh->commit();
+
+  $main::lxdebug->leave_sub();
+
+  return 1;
+}
+
+sub verify_config {
+  return 1;
+}
+
+1;
diff --git a/SL/Auth/LDAP.pm b/SL/Auth/LDAP.pm
new file mode 100644 (file)
index 0000000..8212258
--- /dev/null
@@ -0,0 +1,200 @@
+package SL::Auth::LDAP;
+
+use English '-no_match_vars';
+
+use SL::Auth;
+
+sub new {
+  $main::lxdebug->enter_sub();
+
+  if (!defined eval "require Net::LDAP;") {
+    die 'The module "Net::LDAP" is not installed.';
+  }
+
+  my $type = shift;
+  my $self = {};
+
+  $self->{auth} = shift;
+
+  bless $self, $type;
+
+  $main::lxdebug->leave_sub();
+
+  return $self;
+}
+
+sub _connect {
+  $main::lxdebug->enter_sub();
+
+  my $self = shift;
+  my $cfg  = $self->{auth}->{LDAP_config};
+
+  if ($self->{ldap}) {
+    $main::lxdebug->leave_sub();
+
+    return $self->{ldap};
+  }
+
+  my $port      = $cfg->{port} || 389;
+  $self->{ldap} = Net::LDAP->new($cfg->{host}, 'port' => $port);
+
+  if (!$self->{ldap}) {
+    $main::form->error($main::locale->text('The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.', $cfg->{host}, $port));
+  }
+
+  if ($cfg->{tls}) {
+    my $mesg = $self->{ldap}->start_tls('verify' => 'none');
+    if ($mesg->is_error()) {
+      $main::form->error($main::locale->text('The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.'));
+    }
+  }
+
+  if ($cfg->{bind_dn}) {
+    my $mesg = $self->{ldap}->bind($cfg->{bind_dn}, 'password' => $cfg->{bind_password});
+    if ($mesg->is_error()) {
+      $main::form->error($main::locale->text('Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.', $cfg->{bind_dn}));
+    }
+  }
+
+  $main::lxdebug->leave_sub();
+
+  return $self->{ldap};
+}
+
+sub _get_filter {
+  $main::lxdebug->enter_sub();
+
+  my $self   = shift;
+  my $login  = shift;
+
+  my ($cfg, $filter);
+
+  $cfg    =  $self->{auth}->{LDAP_config};
+
+  $filter =  "$cfg->{filter}";
+  $filter =~ s|^\s+||;
+  $filter =~ s|\s+$||;
+
+  $login  =~ s|\\|\\\\|g;
+  $login  =~ s|\(|\\\(|g;
+  $login  =~ s|\)|\\\)|g;
+  $login  =~ s|\*|\\\*|g;
+  $login  =~ s|\x00|\\00|g;
+
+  if ($filter =~ m|<\%login\%>|) {
+    substr($filter, $LAST_MATCH_START[0], $LAST_MATCH_END[0] - $LAST_MATCH_START[0]) = $login;
+
+  } elsif ($filter) {
+    if ((substr($filter, 0, 1) ne '(') || (substr($filter, -1, 1) ne ')')) {
+      $filter = "($filter)";
+    }
+
+    $filter = "(&${filter}($cfg->{attribute}=${login}))";
+
+  } else {
+    $filter = "$cfg->{attribute}=${login}";
+
+  }
+
+  $main::lxdebug->leave_sub();
+
+  return $filter;
+}
+
+sub _get_user_dn {
+  $main::lxdebug->enter_sub();
+
+  my $self   = shift;
+  my $ldap   = shift;
+  my $login  = shift;
+
+  $self->{dn_cache} ||= { };
+
+  if ($self->{dn_cache}->{$login}) {
+    $main::lxdebug->leave_sub();
+    return $self->{dn_cache}->{$login};
+  }
+
+  my $cfg    = $self->{auth}->{LDAP_config};
+
+  my $filter = $self->_get_filter($login);
+
+  my $mesg   = $ldap->search('base' => $cfg->{base_dn}, 'scope' => 'sub', 'filter' => $filter);
+
+  if ($mesg->is_error() || (0 == $mesg->count())) {
+    $main::lxdebug->leave_sub();
+    return undef;
+  }
+
+  my $entry                   = $mesg->entry(0);
+  $self->{dn_cache}->{$login} = $entry->dn();
+
+  $main::lxdebug->leave_sub();
+
+  return $self->{dn_cache}->{$login};
+}
+
+sub authenticate {
+  $main::lxdebug->enter_sub();
+
+  my $self       = shift;
+  my $login      = shift;
+  my $password   = shift;
+  my $is_crypted = shift;
+
+  if ($is_crypted) {
+    $main::lxdebug->leave_sub();
+    return SL::Auth::ERR_BACKEND;
+  }
+
+  my $ldap = $self->_connect();
+
+  if (!$ldap) {
+    $main::lxdebug->leave_sub();
+    return SL::Auth::ERR_BACKEND;
+  }
+
+  my $dn = $self->_get_user_dn($ldap, $login);
+
+  $main::lxdebug->message(LXDebug::DEBUG2, "LDAP authenticate: dn $dn");
+
+  if (!$dn) {
+    $main::lxdebug->leave_sub();
+    return SL::Auth::ERR_BACKEND;
+  }
+
+  my $mesg = $ldap->bind($dn, 'password' => $password);
+
+  $main::lxdebug->message(LXDebug::DEBUG2, "LDAP authenticate: bind mesg " . $mesg->error());
+
+  $main::lxdebug->leave_sub();
+
+  return $mesg->is_error() ? SL::Auth::ERR_PASSWORD : SL::Auth::OK;
+}
+
+sub can_change_password {
+  return 0;
+}
+
+sub change_password {
+  return SL::Auth::ERR_BACKEND;
+}
+
+sub verify_config {
+  $main::lxdebug->enter_sub();
+
+  my $self = shift;
+  my $cfg  = $self->{auth}->{LDAP_config};
+
+  if (!$cfg) {
+    $form->error($locale->text('config/authentication.pl: Key "LDAP_config" is missing.'));
+  }
+
+  if (!$cfg->{host} || !$cfg->{attribute} || !$cfg->{base_dn}) {
+    $form->error($locale->text('config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".'));
+  }
+
+  $main::lxdebug->leave_sub();
+}
+
+1;
index bedb9e6..8bc0d14 100644 (file)
@@ -29,6 +29,7 @@ use vars qw(@db_encodings %db_encoding_to_charset);
 );
 
 %db_encoding_to_charset = map { $_->{dbencoding}, $_->{charset} } @db_encodings;
+%charset_to_db_encoding = map { $_->{charset}, $_->{dbencoding} } @db_encodings;
 
 use constant DEFAULT_CHARSET => 'ISO-8859-15';
 
@@ -49,14 +50,22 @@ sub retrieve_parts {
   my $dbh = $form->dbconnect($myconfig);
 
   my (@filter_values, $filter);
-  if ($form->{"partnumber"}) {
-    $filter .= qq| AND (partnumber ILIKE ?)|;
-    push(@filter_values, '%' . $form->{"partnumber"} . '%');
+
+  foreach (qw(partnumber description)) {
+    next unless $form->{$_};
+
+    $filter .= qq| AND ($_ ILIKE ?)|;
+    push @filter_values, '%' . $form->{$_} . '%';
   }
-  if ($form->{"description"}) {
-    $filter .= qq| AND (description ILIKE ?)|;
-    push(@filter_values, '%' . $form->{"description"} . '%');
+
+  if ($form->{no_assemblies}) {
+    $filter .= qq| AND (NOT COALESCE(assembly, 'f'))|;
+  }
+
+  if ($form->{no_services}) {
+    $filter .= qq| AND (COALESCE(inventory_accno_id, 0) > 0)|;
   }
+
   substr($filter, 1, 3) = "WHERE" if ($filter);
 
   $order_by =~ s/[^a-zA-Z_]//g;
index 46fe23f..19e1aa1 100644 (file)
@@ -7,6 +7,7 @@ require Exporter;
              dump_query quote_db_date
              selectfirst_hashref_query selectfirst_array_query
              selectall_hashref_query selectall_array_query
+             selectall_as_map
              prepare_execute_query prepare_query);
 
 sub conv_i {
@@ -194,6 +195,31 @@ sub selectfirst_array_query {
   return @ret;
 }
 
+sub selectall_as_map {
+  $main::lxdebug->enter_sub(2);
+
+  my ($form, $dbh, $query, $key_col, $value_col) = splice(@_, 0, 5);
+
+  my $sth = prepare_execute_query($form, $dbh, $query, @_);
+
+  my %hash;
+  if ('' eq ref $value_col) {
+    while (my $ref = $sth->fetchrow_hashref()) {
+      $hash{$ref->{$key_col}} = $ref->{$value_col};
+    }
+  } else {
+    while (my $ref = $sth->fetchrow_hashref()) {
+      $hash{$ref->{$key_col}} = { map { $_ => $ref->{$_} } @{ $value_col } };
+    }
+  }
+
+  $sth->finish();
+
+  $main::lxdebug->leave_sub(2);
+
+  return %hash;
+}
+
 1;
 
 
@@ -304,6 +330,10 @@ Prepares and executes a query using DBUtils functions, retireves the first row f
 
 Prepares and executes a query using DBUtils functions, retireves all data from the database, and returns it in hashref mode. This is slightly confusing, as the data structure will actually be a reference to an array, containing hashrefs for each row.
 
+=item selectall_as_map FORM,DBH,QUERY,KEY_COL,VALUE_COL,ARRAY
+
+Prepares and executes a query using DBUtils functions, retireves all data from the database, and creates a hash from the results using KEY_COL as the column for the hash keys and VALUE_COL for its values.
+
 =back
 
 =head2 DEBUG FUNCTIONS
index f893c63..98fd7b2 100644 (file)
 package Form;
 use Data::Dumper;
 
-use Cwd;
-use Template;
-use SL::Template;
+use CGI;
 use CGI::Ajax;
+use Cwd;
+use List::Util qw(min max);
+use SL::Auth;
+use SL::Auth::DB;
+use SL::Auth::LDAP;
+use SL::AM;
+use SL::Common;
 use SL::DBUtils;
 use SL::Mailer;
 use SL::Menu;
+use SL::Template;
 use SL::User;
-use SL::Common;
-use CGI;
+use Template;
 use List::Util qw(max min sum);
 
 my $standard_dbh;
@@ -275,6 +280,22 @@ sub flatten_variables {
   return @variables;
 }
 
+sub flatten_standard_variables {
+  $main::lxdebug->enter_sub(2);
+
+  my $self      = shift;
+  my %skip_keys = map { $_ => 1 } (qw(login password header stylesheet titlebar version), @_);
+
+  my @variables;
+
+  foreach (grep { ! $skip_keys{$_} } keys %{ $self }) {
+    push @variables, $self->_flatten_variables_rec($self, '', $_);
+  }
+
+  $main::lxdebug->leave_sub(2);
+
+  return @variables;
+}
 
 sub debug {
   $main::lxdebug->enter_sub();
@@ -288,6 +309,24 @@ sub debug {
   $main::lxdebug->leave_sub();
 }
 
+sub dumper {
+  $main::lxdebug->enter_sub(2);
+
+  my $self          = shift;
+  my $password      = $self->{password};
+
+  $self->{password} = 'X' x 8;
+
+  local $Data::Dumper::Sortkeys = 1;
+  my $output                    = Dumper($self);
+
+  $self->{password} = $password;
+
+  $main::lxdebug->leave_sub(2);
+
+  return $output;
+}
+
 sub escape {
   $main::lxdebug->enter_sub(2);
 
@@ -343,10 +382,11 @@ sub quote_html {
   my ($self, $str) = @_;
 
   my %replace =
-    ('order' => ['"', '<', '>'],
-     '<'             => '&lt;',
-     '>'             => '&gt;',
-     '"'             => '&quot;',
+    ('order' => ['&', '"', '<', '>'],
+     '<'     => '&lt;',
+     '>'     => '&gt;',
+     '"'     => '&quot;',
+     '&'     => '&amp;',
     );
 
   map({ $str =~ s/$_/$replace{$_}/g; } @{ $replace{"order"} });
@@ -356,6 +396,33 @@ sub quote_html {
   return $str;
 }
 
+sub unquote_html {
+  $main::lxdebug->enter_sub(2);
+
+  my ($self, $str) = @_;
+
+  my %replace  =
+    ('&auml;'  => 'ä',
+     '&ouml;'  => 'ö',
+     '&uuml;'  => 'ü',
+     '&Auml;'  => 'Ä',
+     '&Ouml;'  => 'Ö',
+     '&Uuml;'  => 'Ü',
+     '&szlig;' => 'ß',
+     '&gt;'    => '>',
+     '&lt;'    => '<',
+     '&quot;'  => '"',
+    );
+
+  map { $str =~ s/\Q$_\E/$replace{$_}/g; } keys %replace;
+  $str =~ s/\&amp;/\&/g;
+
+  $main::lxdebug->leave_sub(2);
+
+  return $str;
+}
+
+
 sub hide_form {
   my $self = shift;
 
@@ -423,13 +490,16 @@ sub info {
 # can be capped with maxrows
 sub numtextrows {
   $main::lxdebug->enter_sub();
-  my ($self, $str, $cols, $maxrows) = @_;
+  my ($self, $str, $cols, $maxrows, $minrows) = @_;
+
+  $minrows ||= 1;
 
   my $rows   = sum map { int((length() - 2) / $cols) + 1 } split /\r/, $str;
   $maxrows ||= $rows;
 
   $main::lxdebug->leave_sub();
-  return min $rows, $maxrows;
+
+  return max(min($rows, $maxrows), $minrows);
 }
 
 sub dberror {
@@ -468,6 +538,9 @@ sub header {
     return;
   }
 
+  my $cgi   = $main::cgi;
+  $cgi    ||= CGI->new('');
+
   my ($stylesheet, $favicon);
 
   if ($ENV{HTTP_USER_AGENT}) {
@@ -528,9 +601,32 @@ sub header {
     foreach $item (@ { $self->{AJAX} }) {
       $ajax .= $item->show_javascript();
     }
-    print qq|Content-Type: text/html; charset=${db_charset};
 
-${doctype}<html>
+    my $base_path;
+
+    if ($ENV{HTTP_X_FORWARDED_FOR}) {
+      $base_path =  $ENV{HTTP_REFERER};
+      $base_path =~ s|^.*?://.*?/|/|;
+    } else {
+      $base_path =  $ENV{REQUEST_URI};
+    }
+    $base_path =~ s|[^/]+$||;
+    $base_path =~ s|/$||;
+
+    my $session_cookie;
+    if (defined $main::auth) {
+      my $session_cookie_value   = $main::auth->get_session_id();
+      $session_cookie_value    ||= 'NO_SESSION';
+
+      $session_cookie = $cgi->cookie('-name'  => $main::auth->get_session_cookie_name(),
+                                     '-value' => $session_cookie_value,
+                                     '-path'  => $base_path);
+    }
+
+    print $cgi->header('-type'    => 'text/html',
+                       '-charset' => $db_charset,
+                       '-cookie'  => $session_cookie);
+    print qq|${doctype}<html>
 <head>
   <title>$self->{titlebar}</title>
   $stylesheet
@@ -633,6 +729,12 @@ sub _prepare_html_template {
     map { $additional_params->{'DEBUG_' . uc($_)} = $main::debug_options{$_} } keys %main::debug_options;
   }
 
+  if ($main::auth && $main::auth->{RIGHTS} && $main::auth->{RIGHTS}->{$self->{login}}) {
+    while (my ($key, $value) = each %{ $main::auth->{RIGHTS}->{$self->{login}} }) {
+      $additional_params->{"AUTH_RIGHTS_" . uc($key)} = $value;
+    }
+  }
+
   $main::lxdebug->leave_sub();
 
   return $file;
@@ -837,7 +939,71 @@ sub format_amount {
   $main::lxdebug->leave_sub(2);
   return $amount;
 }
-#
+
+sub format_amount_units {
+  $main::lxdebug->enter_sub();
+
+  my $self             = shift;
+  my %params           = @_;
+
+  Common::check_params(\%params, qw(amount part_unit));
+
+  my $myconfig         = \%main::myconfig;
+  my $amount           = $params{amount};
+  my $places           = $params{places};
+  my $part_unit_name   = $params{part_unit};
+  my $amount_unit_name = $params{amount_unit};
+  my $conv_units       = $params{conv_units};
+  my $max_places       = $params{max_places};
+
+  AM->retrieve_all_units();
+  my $all_units        = $main::all_units;
+
+  if (('' eq ref $conv_units) && ($conv_units =~ /convertible/)) {
+    $conv_units = AM->convertible_units($all_units, $part_unit_name, $conv_units eq 'convertible_not_smaller');
+  }
+
+  if (!scalar @{ $conv_units }) {
+    my $result = $self->format_amount($myconfig, $amount, $places, undef, $max_places) . " " . $part_unit_name;
+    $main::lxdebug->leave_sub();
+    return $result;
+  }
+
+  my $part_unit  = $all_units->{$part_unit_name};
+  my $conv_unit  = ($amount_unit_name && ($amount_unit_name ne $part_unit_name)) ? $all_units->{$amount_unit_name} : $part_unit;
+
+  $amount       *= $conv_unit->{factor};
+
+  my @values;
+
+  foreach my $unit (@$conv_units) {
+    my $last = $unit->{name} eq $part_unit->{name};
+    if (!$last) {
+      $num     = int($amount / $unit->{factor});
+      $amount -= $num * $unit->{factor};
+    }
+
+    if ($last ? $amount : $num) {
+      push @values, { "unit"   => $unit->{name},
+                      "amount" => $last ? $amount / $unit->{factor} : $num,
+                      "places" => $last ? $places : 0 };
+    }
+
+    last if $last;
+  }
+
+  if (!@values) {
+    push @values, { "unit"   => $part_unit_name,
+                    "amount" => 0,
+                    "places" => 0 };
+  }
+
+  my $result = join " ", map { $self->format_amount($myconfig, $_->{amount}, $_->{places}, undef, $max_places), $_->{unit} } @values;
+
+  $main::lxdebug->leave_sub();
+
+  return $result;
+}
 
 sub format_string {
   $main::lxdebug->enter_sub(2);
@@ -854,6 +1020,8 @@ sub format_string {
   return $input;
 }
 
+#
+
 sub parse_amount {
   $main::lxdebug->enter_sub(2);
 
@@ -937,9 +1105,6 @@ sub parse_template {
   map({ $self->{"employee_${_}"} = $myconfig->{$_}; }
       qw(email tel fax name signature company address businessnumber
          co_ustid taxnumber duns));
-  map({ $self->{"employee_${_}"} =~ s/\\n/\n/g; }
-      qw(company address signature));
-  map({ $self->{$_} =~ s/\\n/\n/g; } qw(company address signature));
 
   map({ $self->{"${_}"} = $myconfig->{$_}; }
       qw(co_ustid));
@@ -994,14 +1159,15 @@ sub parse_template {
       $mail->{to} = $self->{EMAIL_RECIPIENT} ? $self->{EMAIL_RECIPIENT} : $self->{email};
       $mail->{from}   = qq|"$myconfig->{name}" <$myconfig->{email}>|;
       $mail->{fileid} = "$fileid.";
-      $myconfig->{signature} =~ s/\\r\\n/\\n/g;
+      $myconfig->{signature} =~ s/\r//g;
 
       # if we send html or plain text inline
       if (($self->{format} eq 'html') && ($self->{sendmode} eq 'inline')) {
         $mail->{contenttype} = "text/html";
 
-        $mail->{message}       =~ s/\r\n/<br>\n/g;
-        $myconfig->{signature} =~ s/\\n/<br>\n/g;
+        $mail->{message}       =~ s/\r//g;
+        $mail->{message}       =~ s/\n/<br>\n/g;
+        $myconfig->{signature} =~ s/\n/<br>\n/g;
         $mail->{message} .= "<br>\n-- <br>\n$myconfig->{signature}\n<br>";
 
         open(IN, $self->{tmpfile})
@@ -1021,9 +1187,8 @@ sub parse_template {
                  $self->{"attachment_filename"} : $self->{"tmpfile"} });
         }
 
-        $mail->{message}       =~ s/\r\n/\n/g;
-        $myconfig->{signature} =~ s/\\n/\n/g;
-        $mail->{message} .= "\n-- \n$myconfig->{signature}";
+        $mail->{message}  =~ s/\r//g;
+        $mail->{message} .=  "\n-- \n$myconfig->{signature}";
 
       }
 
@@ -1109,7 +1274,7 @@ sub get_formname_translation {
 sub generate_attachment_filename {
   my ($self) = @_;
 
-  my $attachment_filename = $self->get_formname_translation();
+  my $attachment_filename = $self->unquote_html($self->get_formname_translation());
   my $prefix = 
       (grep { $self->{"type"} eq $_ } qw(invoice credit_note)) ? "inv"
     : ($self->{"type"} =~ /_quotation$/)                       ? "quo"
@@ -1688,8 +1853,6 @@ sub get_salesman {
 
     $self->{salesman_name} = $login
       if ($self->{salesman_name} eq "");
-
-    map({ $self->{"salesman_$_"} =~ s/\\n/\n/g; } qw(address company));
   }
 
   $main::lxdebug->leave_sub();
@@ -1862,7 +2025,7 @@ sub _get_employees {
   my ($self, $dbh, $default_key, $key) = @_;
 
   $key = $default_key unless ($key);
-  $self->{$key} = selectall_hashref_query($self, $dbh, qq|SELECT * FROM employee ORDER BY name|);
+  $self->{$key} = selectall_hashref_query($self, $dbh, qq|SELECT * FROM employee ORDER BY lower(name)|);
 
   $main::lxdebug->leave_sub();
 }
@@ -1978,14 +2141,72 @@ sub _get_departments {
   $main::lxdebug->leave_sub();
 }
 
-sub _get_price_factors {
+sub _get_warehouses {
   $main::lxdebug->enter_sub();
 
-  my ($self, $dbh, $key) = @_;
+  my ($self, $dbh, $param) = @_;
+
+  my ($key, $bins_key, $q_access, @values);
+
+  if ('' eq ref $param) {
+    $key = $param;
+  } else {
+    $key      = $param->{key};
+    $bins_key = $param->{bins};
+
+    if ($param->{access}) {
+      $q_access =
+        qq| AND EXISTS (
+              SELECT wa.employee_id
+              FROM warehouse_access wa
+              WHERE (wa.employee_id  = (SELECT id FROM employee WHERE login = ?))
+                AND (wa.warehouse_id = w.id)
+                AND (wa.access IN ('ro', 'rw')))|;
+      push @values, $param->{access};
+    }
+
+    if ($param->{no_personal}) {
+      $q_access .= qq| AND (w.personal_warehouse_of IS NULL)|;
+
+    } elsif ($param->{personal}) {
+      $q_access .= qq| AND (w.personal_warehouse_of = ?)|;
+      push @values, conv_i($param->{personal});
+    }
+  }
+
+  my $query = qq|SELECT w.* FROM warehouse w
+                 WHERE (NOT w.invalid) AND
+                   ((SELECT COUNT(b.*) FROM bin b WHERE b.warehouse_id = w.id) > 0)
+                   $q_access
+                 ORDER BY w.sortkey|;
+
+  $self->{$key} = selectall_hashref_query($self, $dbh, $query, @values);
 
-  $key ||= "all_price_factors";
+  if ($bins_key) {
+    $query = qq|SELECT id, description FROM bin WHERE warehouse_id = ?|;
+    my $sth = prepare_query($self, $dbh, $query);
 
-  my $query = qq|SELECT * FROM price_factors ORDER BY sortkey|;
+    foreach my $warehouse (@{ $self->{$key} }) {
+      do_statement($self, $sth, $query, $warehouse->{id});
+      $warehouse->{$bins_key} = [];
+
+      while (my $ref = $sth->fetchrow_hashref()) {
+        push @{ $warehouse->{$bins_key} }, $ref;
+      }
+    }
+    $sth->finish();
+  }
+
+  $main::lxdebug->leave_sub();
+}
+
+sub _get_simple {
+  $main::lxdebug->enter_sub();
+
+  my ($self, $dbh, $table, $key, $sortkey) = @_;
+
+  my $query  = qq|SELECT * FROM $table|;
+  $query    .= qq| ORDER BY $sortkey| if ($sortkey);
 
   $self->{$key} = selectall_hashref_query($self, $dbh, $query);
 
@@ -2083,7 +2304,11 @@ sub get_lists {
   }
 
   if ($params{price_factors}) {
-    $self->_get_price_factors($dbh, $params{price_factors});
+    $self->_get_simple($dbh, 'price_factors', $params{price_factors}, 'sortkey');
+  }
+
+  if ($params{warehouses}) {
+    $self->_get_warehouses($dbh, $params{warehouses});
   }
 
   $main::lxdebug->leave_sub();
index a84647f..a05c85e 100644 (file)
--- a/SL/IC.pm
+++ b/SL/IC.pm
 #======================================================================
 
 package IC;
+
 use Data::Dumper;
+use YAML;
+
 use SL::DBUtils;
 
 sub get_part {
@@ -63,6 +66,8 @@ sub get_part {
   # copy to $form variables
   map { $form->{$_} = $ref->{$_} } (keys %{$ref});
 
+  $form->{onhand} *= 1;
+
   my %oid = ('Pg'     => 'a.oid',
              'Oracle' => 'a.rowid');
 
@@ -1829,4 +1834,55 @@ sub retrieve_accounts {
   $main::lxdebug->leave_sub(2);
 }
 
+sub get_basic_part_info {
+  $main::lxdebug->enter_sub();
+
+  my $self     = shift;
+  my %params   = @_;
+
+  Common::check_params(\%params, qw(id));
+
+  my @ids      = 'ARRAY' eq ref $params{id} ? @{ $params{id} } : ($params{id});
+
+  if (!scalar @ids) {
+    $main::lxdebug->leave_sub();
+    return ();
+  }
+
+  my $myconfig = \%main::myconfig;
+  my $form     = $main::form;
+
+  my $dbh      = $form->get_standard_dbh($myconfig);
+
+  my $query    = qq|SELECT id, partnumber, description, unit FROM parts WHERE id IN (| . join(', ', ('?') x scalar(@ids)) . qq|)|;
+
+  my $info     = selectall_hashref_query($form, $dbh, $query, map { conv_i($_) } @ids);
+
+  if ($params{vendor_id}) {
+    $query     = qq|SELECT * FROM parts_vendor WHERE (parts_id = ?) AND (vendor_id = ?)|;
+    my $sth    = prepare_query($form, $dbh, $query);
+
+    foreach my $part (@{ $info }) {
+      do_statement($form, $sth, $query, $part->{id}, conv_i($params{vendor_id}));
+      $part->{vendor_info} = $sth->fetchrow_hashref();
+    }
+
+    $sth->finish();
+  }
+
+  if ('' eq ref $params{id}) {
+    $info = $info->[0] || { };
+
+    $main::lxdebug->leave_sub();
+    return $info;
+  }
+
+  my %info_map = map { $_->{id} => $_ } @{ $info };
+
+  $main::lxdebug->leave_sub();
+
+  return %info_map;
+}
+
+
 1;
diff --git a/SL/IO.pm b/SL/IO.pm
new file mode 100644 (file)
index 0000000..ee85e23
--- /dev/null
+++ b/SL/IO.pm
@@ -0,0 +1,27 @@
+package IO;
+
+use SL::DBUtils;
+
+sub retrieve_partunits {
+  $main::lxdebug->enter_sub();
+
+  my $self     = shift;
+  my %params   = @_;
+
+  Common::check_params(\%params, qw(part_ids));
+
+  my $myconfig = \%main::myconfig;
+  my $form     = $main::form;
+
+  my $dbh      = $params{dbh} || $form->get_standard_dbh();
+
+  my $query    = qq|SELECT id, unit FROM parts WHERE id IN (| . join(', ', map { '?' } @{ $params{part_ids} }) . qq|)|;
+  my %units    = selectall_as_map($form, $dbh, $query, 'id', 'unit', @{ $params{part_ids} });
+
+  $main::lxdebug->leave_sub();
+
+  return %units;
+}
+
+
+1;
index e82298e..a399e79 100644 (file)
@@ -1,5 +1,8 @@
 package SL::InstallationCheck;
 
+use English '-no_match_vars';
+use IO::File;
+
 use vars qw(@required_modules);
 
 @required_modules = (
@@ -16,6 +19,7 @@ use vars qw(@required_modules);
   { "name" => "Text::CSV_XS", "url" => "http://search.cpan.org/~hmbrand/" },
   { "name" => "List::Util", "url" => "http://search.cpan.org/~gbarr/" },
   { "name" => "Template", "url" => "http://search.cpan.org/~abw/" },
+  { "name" => "Digest::MD5", "url" => "http://search.cpan.org/~gaas/" },
   );
 
 sub module_available {
@@ -28,6 +32,34 @@ sub module_available {
   }
 }
 
+my %conditional_dependencies;
+
+sub check_for_conditional_dependencies {
+  if (!$conditional_dependencies{net_ldap}) {
+    $conditional_dependencies{net_ldap} = 1;
+
+    my $in = IO::File->new('config/authentication.pl', 'r');
+    if ($in) {
+      my $self = {};
+      my $code;
+
+      while (my $line = <$in>) {
+        $code .= $line;
+      }
+      $in->close();
+
+      eval $code;
+
+      if (! $EVAL_ERROR) {
+
+        if ($self->{module} && ($self->{module} eq 'LDAP')) {
+          push @required_modules, { 'name' => 'Net::LDAP', 'url' => 'http://search.cpan.org/~gbarr/' };
+        }
+      }
+    }
+  }
+}
+
 sub test_all_modules {
   return grep { !module_available($_->{name}) } @required_modules;
 }
index 185297b..047d2b0 100644 (file)
@@ -104,9 +104,9 @@ sub leave_sub {
 }
 
 sub show_backtrace {
-  my ($self) = @_;
+  my ($self, $force) = @_;
 
-  return 1 unless ($global_level & BACKTRACE_ON_ERROR);
+  return 1 unless ($force || ($global_level & BACKTRACE_ON_ERROR));
 
   $self->message(BACKTRACE_ON_ERROR, "Starting full caller dump:");
   my $level = 0;
@@ -128,14 +128,22 @@ sub dump {
   my ($self, $level, $name, $variable) = @_;
 
   if ($data_dumper_available) {
+    my $password;
+    if ($variable && ('Form' eq ref $variable) && defined $variable->{password}) {
+      $password             = $variable->{password};
+      $variable->{password} = 'X' x 8;
+    }
+
     my $dumper = Data::Dumper->new([$variable]);
     $dumper->Sortkeys(1);
     $self->message($level, "dumping ${name}:\n" . $dumper->Dump());
 
+    $variable->{password} = $password if (defined $password);
+
     # Data::Dumper does not reset the iterator belonging to this hash
     # if 'Sortkeys' is true. Therefore clear the iterator manually.
     # See "perldoc -f each".
-    if ($variable && ('HASH' eq ref $variable)) {
+    if ($variable && (('HASH' eq ref $variable) || ('Form' eq ref $variable))) {
       keys %{ $variable };
     }
 
index 7d07153..5df7089 100644 (file)
@@ -34,6 +34,7 @@
 
 package Menu;
 
+use SL::Auth;
 use SL::Inifile;
 
 sub new {
@@ -46,9 +47,13 @@ sub new {
 
   map { $self->{$_} = $inifile->{$_} } keys %{ $inifile };
 
+  bless $self, $type;
+
+  $self->set_access();
+
   $main::lxdebug->leave_sub();
 
-  bless $self, $type;
+  return $self;
 }
 
 sub menuitem {
@@ -72,8 +77,7 @@ sub menuitem {
 
   my $level = $form->escape($item);
 
-  my $str =
-    qq|<a style="vertical-align:top" href=$module?action=$action&level=$level&login=$form->{login}&password=$form->{password}|;
+  my $str = qq|<a style="vertical-align:top" href=$module?action=$action&level=$level|;
 
   my @vars = qw(module action target href);
 
@@ -124,9 +128,7 @@ sub menuitem_v3 {
 
   my $level = $form->escape($item);
 
-  my $str = qq|<a href="$module?action=| . $form->escape($action) .
-    qq|&level=| . $form->escape($level);
-  map({ $str .= "&${_}=" . $form->escape($form->{$_}); } qw(login password));
+  my $str = qq|<a href="$module?action=| . $form->escape($action) . qq|&level=| . $form->escape($level);
 
   my @vars = qw(module action target href);
 
@@ -237,8 +239,7 @@ sub menuitemNew {
   }
 
   my $level = $form->escape($item);
-  my $str   =
-    qq|$module?action=$action&level=$level&login=$form->{login}&password=$form->{password}|;
+  my $str   = qq|$module?action=$action&level=$level|;
   my @vars = qw(module action target href);
 
   if ($self->{$item}{href}) {
@@ -302,5 +303,103 @@ sub generate_acl {
   }
 }
 
+sub parse_access_string {
+  my $self   = shift;
+  my $key    = shift;
+  my $access = shift;
+
+  my @stack;
+  my $cur_ary = [];
+
+  push @stack, $cur_ary;
+
+  while ($access =~ m/^([a-z_]+|\||\&|\(|\)|\s+)/) {
+    my $token = $1;
+    substr($access, 0, length($1)) = "";
+
+    next if ($token =~ /\s/);
+
+    if ($token eq "(") {
+      my $new_cur_ary = [];
+      push @stack, $new_cur_ary;
+      push @{$cur_ary}, $new_cur_ary;
+      $cur_ary = $new_cur_ary;
+
+    } elsif ($token eq ")") {
+      pop @stack;
+      if (!@stack) {
+        $main::form->error("Error in menu.ini for entry ${key}: missing '('");
+      }
+      $cur_ary = $stack[-1];
+
+    } elsif (($token eq "|") || ($token eq "&")) {
+      push @{$cur_ary}, $token;
+
+    } else {
+      push @{$cur_ary}, $main::auth->check_right($main::form->{login}, $token, 1);
+    }
+  }
+
+  if ($access) {
+    $main::form->error("Error in menu.ini for entry ${name}: unrecognized token at the start of '$access'\n");
+  }
+
+  if (1 < scalar @stack) {
+    $main::form->error("Error in menu.ini for entry ${name}: Missing ')'\n");
+  }
+
+  return SL::Auth::evaluate_rights_ary($stack[0]);
+}
+
+sub set_access {
+  my $self = shift;
+
+  my $key;
+
+  foreach $key (@{ $self->{ORDER} }) {
+    my $entry = $self->{$key};
+
+    $entry->{GRANTED}              = $entry->{ACCESS} ? $self->parse_access_string($key, $entry->{ACCESS}) : 1;
+    $entry->{IS_MENU}              = $entry->{submenu} || ($key !~ m/--/);
+    $entry->{NUM_VISIBLE_CHILDREN} = 0;
+
+    if ($key =~ m/--/) {
+      my $parent = $key;
+      substr($parent, rindex($parent, '--')) = '';
+      $entry->{GRANTED} &&= $self->{$parent}->{GRANTED};
+    }
+
+    $entry->{VISIBLE} = $entry->{GRANTED};
+  }
+
+  foreach $key (reverse @{ $self->{ORDER} }) {
+    my $entry = $self->{$key};
+
+    if ($entry->{IS_MENU}) {
+      $entry->{VISIBLE} &&= $entry->{NUM_VISIBLE_CHILDREN} > 0;
+    }
+
+    next if (($key !~ m/--/) || !$entry->{VISIBLE});
+
+    my $parent = $key;
+    substr($parent, rindex($parent, '--')) = '';
+    $self->{$parent}->{NUM_VISIBLE_CHILDREN}++;
+  }
+
+#   $self->dump_visible();
+
+  $self->{ORDER} = [ grep { $self->{$_}->{VISIBLE} } @{ $self->{ORDER} } ];
+
+  map { delete @{$self->{$_}}{qw(GRANTED IS_MENU NUM_VISIBLE_CHILDREN VISIBLE ACCESS)} if ($_ ne 'ORDER') } keys %{ $self };
+}
+
+sub dump_visible {
+  my $self = shift;
+  foreach my $key (@{ $self->{ORDER} }) {
+    my $entry = $self->{$key};
+    $main::lxdebug->message(0, "$entry->{GRANTED} $entry->{VISIBLE} $entry->{NUM_VISIBLE_CHILDREN} $key");
+  }
+}
+
 1;
 
index b0b64d1..32ca6b6 100644 (file)
@@ -3,18 +3,30 @@ package SL::MoreCommon;
 require Exporter;
 @ISA = qw(Exporter);
 
-@EXPORT = qw(save_form restore_form);
+@EXPORT = qw(save_form restore_form compare_numbers);
 
 use YAML;
 
+use SL::AM;
+
 sub save_form {
   $main::lxdebug->enter_sub();
 
+  my @dont_dump_keys = @_;
+  my %not_dumped_values;
+
+  foreach my $key (@dont_dump_keys) {
+    $not_dumped_values{$key} = $main::form->{$key};
+    delete $main::form->{$key};
+  }
+
   my $old_form = YAML::Dump($main::form);
   $old_form =~ s|!|!:|g;
   $old_form =~ s|\n|!n|g;
   $old_form =~ s|\r|!r|g;
 
+  map { $main::form->{$_} = $not_dumped_values{$_} } keys %not_dumped_values;
+
   $main::lxdebug->leave_sub();
 
   return $old_form;
@@ -23,20 +35,46 @@ sub save_form {
 sub restore_form {
   $main::lxdebug->enter_sub();
 
-  my ($old_form, $no_delete) = @_;
+  my ($old_form, $no_delete, @keep_vars) = @_;
 
-  my $form = $main::form;
+  my $form          = $main::form;
+  my %keep_vars_map = map { $_ => 1 } @keep_vars;
 
-  map { delete $form->{$_}; } keys %{$form} unless ($no_delete);
+  map { delete $form->{$_} if (!$keep_vars_map{$_}); } keys %{$form} unless ($no_delete);
 
   $old_form =~ s|!r|\r|g;
   $old_form =~ s|!n|\n|g;
   $old_form =~ s|![!:]|!|g;
 
   my $new_form = YAML::Load($old_form);
-  map { $form->{$_} = $new_form->{$_}; } keys %{$new_form};
+  map { $form->{$_} = $new_form->{$_} if (!$keep_vars_map{$_}) } keys %{ $new_form };
 
   $main::lxdebug->leave_sub();
 }
 
+sub compare_numbers {
+  $main::lxdebug->enter_sub();
+
+  my $a      = shift;
+  my $a_unit = shift;
+  my $b      = shift;
+  my $b_unit = shift;
+
+  $main::all_units ||= AM->retrieve_units(\%main::myconfig, $main::form);
+  my $units          = $main::all_units;
+
+  if (!$units->{$a_unit} || !$units->{$b_unit} || ($units->{$a_unit}->{base_unit} ne $units->{$b_unit}->{base_unit})) {
+    $main::lxdebug->leave_sub();
+    return undef;
+  }
+
+  $a *= $units->{$a_unit}->{factor};
+  $b *= $units->{$b_unit}->{factor};
+
+  $main::lxdebug->leave_sub();
+
+  return $a <=> $b;
+}
+
+
 1;
index 7c5ad94..a6bd06a 100644 (file)
@@ -2,7 +2,10 @@ package SL::Template::Plugin::LxERP;
 
 use base qw( Template::Plugin );
 use Template::Plugin;
-use List::Util qw(first);
+
+use List::Util qw(min);
+
+use SL::AM;
 
 sub new {
   my $class   = shift;
@@ -18,6 +21,15 @@ sub format_amount {
   return '';
 }
 
+sub format_amount_units {
+  my ($self, $amount, $amount_unit, $part_unit) = @_;
+
+  return $main::form->format_amount_units('amount'      => $amount,
+                                          'part_unit'   => $part_unit,
+                                          'amount_unit' => $amount_unit,
+                                          'conv_units'  => 'convertible_not_smaller');
+}
+
 sub format_percent {
   my ($self, $var, $places, $skip_zero) = @_;
 
@@ -33,5 +45,49 @@ sub escape_br {
   return $var;
 }
 
-1;
+sub format_string {
+  my $self   = shift;
+  my $string = shift;
+
+  return $main::form->format_string($string, @_);
+}
+
+sub numtextrows {
+  my $self = shift;
+
+  return $main::form->numtextrows(@_);
+}
+
+sub _turn90_word {
+  my $self = shift;
+  my $word = shift || "";
 
+  return join '<br>', map { $main::form->quote_html($_) } split(m//, $word);
+}
+
+sub turn90 {
+  my $self            = shift;
+  my $word            = shift;
+  my $args            = shift;
+
+  $args             ||= { };
+  $word             ||= "";
+
+  $args->{split_by} ||= 'chars';
+  $args->{class}      = " class=\"$args->{class}\"" if ($args->{class});
+
+  if ($args->{split_by} eq 'words') {
+    my @words = split m/\s+/, $word;
+
+    if (1 >= scalar @words) {
+      return $self->_turn90_word($words[0]);
+    }
+
+    return qq|<table><tr>| . join('', map { '<td valign="bottom"' . $args->{class} . '>' . $self->_turn90_word($_) . '</td>' } @words) . qq|</tr></table>|;
+
+  } else {
+    return $self->_turn90_word($word);
+  }
+}
+
+1;
index 1984ca5..ea18963 100644 (file)
@@ -37,6 +37,7 @@ package User;
 use IO::File;
 use Fcntl qw(:seek);
 
+use SL::Auth;
 use SL::DBUpgrade2;
 use SL::DBUtils;
 use SL::Iconv;
@@ -45,48 +46,17 @@ use SL::Inifile;
 sub new {
   $main::lxdebug->enter_sub();
 
-  my ($type, $memfile, $login) = @_;
+  my ($type, $login) = @_;
+
   my $self = {};
 
   if ($login ne "") {
-    local *MEMBER;
-
-    $login =~ s|.*/||;
-
-    &error("", "$memfile locked!") if (-f "${memfile}.LCK");
-
-    open(MEMBER, "$memfile") or &error("", "$memfile : $!");
-
-    while (<MEMBER>) {
-      if (/^\[$login\]/) {
-        while (<MEMBER>) {
-          last if m/^\[/;
-          next if m/^(#|\s)/;
-
-          # remove comments
-          s/\s#.*//g;
-
-          # remove any trailing whitespace
-          s/^\s*(.*?)\s*$/$1/;
-
-          ($key, $value) = split(/=/, $_, 2);
-
-          if (($key eq "stylesheet") && ($value eq "sql-ledger.css")) {
-            $value = "lx-office-erp.css";
-          }
-
-          $self->{$key} = $value;
-        }
-
-        $self->{login} = $login;
-
-        last;
-      }
-    }
-    close MEMBER;
+    my %user_data = $main::auth->read_user($login);
+    map { $self->{$_} = $user_data{$_} } keys %user_data;
   }
 
   $main::lxdebug->leave_sub();
+
   bless $self, $type;
 }
 
@@ -121,33 +91,14 @@ sub country_codes {
 sub login {
   $main::lxdebug->enter_sub();
 
-  my ($self, $form, $userspath) = @_;
+  my ($self, $form) = @_;
 
   local *FH;
 
   my $rc = -3;
 
   if ($self->{login}) {
-
-    if ($self->{password}) {
-      if ($form->{hashed_password}) {
-        $form->{password} = $form->{hashed_password};
-      } else {
-        $form->{password} = crypt($form->{password},
-                                  substr($self->{login}, 0, 2));
-      }
-      if ($self->{password} ne $form->{password}) {
-        $main::lxdebug->leave_sub();
-        return -1;
-      }
-    }
-
-    unless (-e "$userspath/$self->{login}.conf") {
-      $self->create_config();
-    }
-
-    do "$userspath/$self->{login}.conf";
-    $myconfig{dbpasswd} = unpack('u', $myconfig{dbpasswd});
+    my %myconfig = $main::auth->read_user($self->{login});
 
     # check if database is down
     my $dbh =
@@ -163,17 +114,7 @@ sub login {
     my ($dbversion) = $sth->fetchrow_array;
     $sth->finish;
 
-    # add login to employee table if it does not exist
-    # no error check for employee table, ignore if it does not exist
-    $query = qq|SELECT id FROM employee WHERE login = ?|;
-    my ($login) = selectrow_query($form, $dbh, $query, $self->{login});
-
-    if (!$login) {
-      $query = qq|INSERT INTO employee (login, name, workphone, role)| .
-               qq|VALUES (?, ?, ?, ?)|;
-      my @values = ($self->{login}, $myconfig{name}, $myconfig{tel}, "user");
-      do_query($form, $dbh, $query, @values);
-    }
+    $self->create_employee_entry($form, $dbh, \%myconfig);
 
     $self->create_schema_info_table($form, $dbh);
 
@@ -185,7 +126,7 @@ sub login {
       parse_dbupdate_controls($form, $myconfig{"dbdriver"});
 
     map({ $form->{$_} = $myconfig{$_} }
-        qw(dbname dbhost dbport dbdriver dbuser dbpasswd dbconnect));
+        qw(dbname dbhost dbport dbdriver dbuser dbpasswd dbconnect dateformat));
 
     if (update_available($myconfig{"dbdriver"}, $dbversion) ||
         update2_available($form, $controls)) {
@@ -204,7 +145,7 @@ sub login {
       }
 
       # update the tables
-      open(FH, ">$userspath/nologin") or die("$!");
+      open(FH, ">$main::userspath/nologin") or die("$!");
 
       # required for Oracle
       $form->{dbdefault} = $sid;
@@ -219,7 +160,7 @@ sub login {
       close(FH);
 
       # remove lock file
-      unlink("$userspath/nologin");
+      unlink("$main::userspath/nologin");
 
       my $menufile =
         $self->{"menustyle"} eq "v3" ? "menuv3.pl" :
@@ -625,41 +566,21 @@ sub dbdelete {
 sub dbsources_unused {
   $main::lxdebug->enter_sub();
 
-  my ($self, $form, $memfile) = @_;
-
-  local *FH;
-
-  my @dbexcl    = ();
-  my @dbsources = ();
-
-  $form->error('File locked!') if (-f "${memfile}.LCK");
-
-  # open members file
-  open(FH, "$memfile") or $form->error("$memfile : $!");
-
-  while (<FH>) {
-    if (/^dbname=/) {
-      my ($null, $item) = split(/=/);
-      push @dbexcl, $item;
-    }
-  }
-
-  close FH;
+  my ($self, $form) = @_;
 
   $form->{only_acc_db} = 1;
-  my @db = &dbsources("", $form);
 
-  push @dbexcl, $form->{dbdefault};
+  my %members = $main::auth->read_all_users();
+  my %dbexcl  = map { $_ => 1 } grep { $_ } map { $_->{dbname} } values %members;
 
-  foreach $item (@db) {
-    unless (grep /$item$/, @dbexcl) {
-      push @dbsources, $item;
-    }
-  }
+  $dbexcl{$form->{dbdefault}}             = 1;
+  $dbexcl{$main::auth->{DB_config}->{db}} = 1;
+
+  my @dbunused = grep { !$dbexcl{$_} } dbsources("", $form);
 
   $main::lxdebug->leave_sub();
 
-  return @dbsources;
+  return @dbunused;
 }
 
 sub dbneedsupdate {
@@ -667,17 +588,17 @@ sub dbneedsupdate {
 
   my ($self, $form) = @_;
 
-  my $members  = Inifile->new($main::memberfile);
+  my %members  = $main::auth->read_all_users();
   my $controls = parse_dbupdate_controls($form, $form->{dbdriver});
 
   my ($query, $sth, %dbs_needing_updates);
 
-  foreach my $login (grep /[a-z]/, keys %{ $members }) {
-    my $member = $members->{$login};
+  foreach my $login (grep /[a-z]/, keys %members) {
+    my $member = $members{$login};
 
     map { $form->{$_} = $member->{$_} } qw(dbname dbuser dbpasswd dbhost dbport);
     dbconnect_vars($form, $form->{dbname});
-    $main::lxdebug->dump(0, "form", $form);
+
     my $dbh = DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd});
 
     next unless $dbh;
@@ -820,6 +741,8 @@ sub dbupdate {
       DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
       or $form->dberror;
 
+    $dbh->do($form->{dboptions}) if ($form->{dboptions});
+
     # check version
     $query = qq|SELECT version FROM defaults|;
     my ($version) = selectrow_query($form, $dbh, $query);
@@ -895,6 +818,8 @@ sub dbupdate2 {
       DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
       or $form->dberror;
 
+    $dbh->do($form->{dboptions}) if ($form->{dboptions});
+
     map({ $_->{"applied"} = 0; } @upgradescripts);
 
     $self->create_schema_info_table($form, $dbh);
@@ -980,119 +905,44 @@ sub update2_available {
   return 0;
 }
 
-sub create_config {
+sub save_member {
   $main::lxdebug->enter_sub();
 
   my ($self) = @_;
 
-  local *CONF;
-
-  @config = config_vars();
-
-  my $userspath = $main::userspath;
-
-  open(CONF, ">", "$userspath/$self->{login}.conf") || $self->error("$userspath/$self->{login}.conf : $!");
+  # format dbconnect and dboptions string
+  dbconnect_vars($self, $self->{dbname});
 
-  # create the config file
-  print CONF qq|# configuration file for $self->{login}
+  map { $self->{$_} =~ s/\r//g; } qw(address signature);
 
-\%myconfig = (
-|;
+  $main::auth->save_user($self->{login}, map { $_, $self->{$_} } config_vars());
 
-  foreach my $key (sort @config) {
-    $self->{$key} =~ s/\'/\\\'/g;
-    print CONF qq|  $key => '$self->{$key}',\n|;
+  my $dbh = DBI->connect($self->{dbconnect}, $self->{dbuser}, $self->{dbpasswd});
+  if ($dbh) {
+    $self->create_employee_entry($form, $dbh, $self);
+    $dbh->disconnect();
   }
 
-  print CONF qq|);\n\n|;
-
-  close CONF;
-
   $main::lxdebug->leave_sub();
 }
 
-sub save_member {
+sub create_employee_entry {
   $main::lxdebug->enter_sub();
 
-  my ($self, $memberfile, $userspath) = @_;
-
-  local (*FH, *CONF);
-
-  my $newmember = 1;
-
-  # format dbconnect and dboptions string
-  &dbconnect_vars($self, $self->{dbname});
-
-  $self->error('File locked!') if (-f "${memberfile}.LCK");
-  open(FH, ">${memberfile}.LCK") or $self->error("${memberfile}.LCK : $!");
-  close(FH);
-
-  open(CONF, "+<$memberfile") or $self->error("$memberfile : $!");
-
-  @config = <CONF>;
+  my $self     = shift;
+  my $form     = shift;
+  my $dbh      = shift;
+  my $myconfig = shift;
 
-  seek(CONF, 0, 0);
-  truncate(CONF, 0);
+  # add login to employee table if it does not exist
+  # no error check for employee table, ignore if it does not exist
+  my ($login)  = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $self->{login});
 
-  while ($line = shift @config) {
-    if ($line =~ /^\[\Q$self->{login}\E\]/) {
-      $newmember = 0;
-      last;
-    }
-    print CONF $line;
-  }
-
-  # remove everything up to next login or EOF
-  while ($line = shift @config) {
-    last if ($line =~ /^\[/);
+  if (!$login) {
+    $query = qq|INSERT INTO employee (login, name, workphone, role) VALUES (?, ?, ?, ?)|;
+    do_query($form, $dbh, $query, ($self->{login}, $myconfig->{name}, $myconfig->{tel}, "user"));
   }
 
-  # this one is either the next login or EOF
-  print CONF $line;
-
-  while ($line = shift @config) {
-    print CONF $line;
-  }
-
-  print CONF qq|[$self->{login}]\n|;
-
-  if ((($self->{dbpasswd} ne $self->{old_dbpasswd}) || $newmember)
-      && $self->{root}) {
-    $self->{dbpasswd} = pack 'u', $self->{dbpasswd};
-    chop $self->{dbpasswd};
-  }
-  if (defined($self->{new_password})) {
-    if ($self->{new_password} ne $self->{old_password}) {
-      $self->{password} = crypt $self->{new_password},
-        substr($self->{login}, 0, 2)
-        if $self->{new_password};
-    }
-  } else {
-    if ($self->{password} ne $self->{old_password}) {
-      $self->{password} = crypt $self->{password}, substr($self->{login}, 0, 2)
-        if $self->{password};
-    }
-  }
-
-  if ($self->{'root login'}) {
-    @config = ("password");
-  } else {
-    @config = &config_vars;
-  }
-
-  # replace \r\n with \n
-  map { $self->{$_} =~ s/\r\n/\\n/g } qw(address signature);
-  foreach $key (sort @config) {
-    print CONF qq|$key=$self->{$key}\n|;
-  }
-
-  print CONF "\n";
-  close CONF;
-  unlink "${memberfile}.LCK";
-
-  # create conf file
-  $self->create_config() unless $self->{'root login'};
-
   $main::lxdebug->leave_sub();
 }
 
diff --git a/am.pl b/am.pl
index d35b4a9..5b3d666 100755 (executable)
--- a/am.pl
+++ b/am.pl
@@ -48,11 +48,22 @@ use SL::LXDebug;
 $lxdebug = LXDebug->new();
 
 use CGI qw( -no_xhtml);
+use SL::Auth;
 use SL::Form;
 use SL::Locale;
 
-eval { require "lx-erp.conf"; };
-eval { require "lx-erp-local.conf"; } if -f "lx-erp-local.conf";
+eval { require "config/lx-erp.conf"; };
+eval { require "config/lx-erp-local.conf"; } if -f "config/lx-erp-local.conf";
+
+our $cgi  = new CGI('');
+our $form = new Form;
+
+our $auth = SL::Auth->new();
+if (!$auth->session_tables_present()) {
+  _show_error('login/auth_db_unreachable');
+}
+$auth->expire_sessions();
+$auth->restore_session();
 
 require "bin/mozilla/common.pl";
 
@@ -61,9 +72,6 @@ if (defined($latex) && !defined($latex_templates)) {
   undef($latex);
 }
 
-$form = new Form;
-$cgi = new CGI('');
-
 # this prevents most of the tabindexes being created by CGI.
 # note: most. popup menus and selecttables will still have tabindexes
 # use common.pl's NTI function to get rid of those
@@ -83,35 +91,37 @@ $script =~ s/\.pl//;
 # pull in DBI
 use DBI;
 
+# locale messages
+$locale = new Locale($language, "$script");
+
+# did sysadmin lock us out
+if (-e "$userspath/nologin") {
+  $form->error($locale->text('System currently down for maintenance!'));
+}
+
 $form->{login} =~ s|.*/||;
 
-# check for user config file, could be missing or ???
-eval { require("$userspath/$form->{login}.conf"); };
-if ($@) {
-  $locale = new Locale "$language", "$script";
+%myconfig = $auth->read_user($form->{login});
 
-  $form->{callback} = "";
-  $msg1             = $locale->text('You are logged out!');
-  $msg2             = $locale->text('Login');
-  $form->redirect("$msg1 <p><a href=login.pl target=_top>$msg2</a>");
+if (!$myconfig{login}) {
+  _show_error('login/password_error');
 }
 
-$myconfig{dbpasswd} = unpack 'u', $myconfig{dbpasswd};
-map { $form->{$_} = $myconfig{$_} } qw(stylesheet charset)
-  unless (($form->{action} eq 'save') && ($form->{type} eq 'preferences'));
-
 # locale messages
 $locale = new Locale "$myconfig{countrycode}", "$script";
 
-# check password
-$form->error($locale->text('Incorrect Password!'))
-  if ($form->{password} ne $myconfig{password});
-
-# did sysadmin lock us out
-if (-e "$userspath/nologin") {
-  $form->error($locale->text('System currently down for maintenance!'));
+if (SL::Auth::OK != $auth->authenticate($form->{login}, $form->{password}, 0)) {
+  _show_error('login/password_error');
 }
 
+$auth->set_session_value('login', $form->{login}, 'password', $form->{password});
+$auth->create_or_refresh_session();
+
+delete $form->{password};
+
+map { $form->{$_} = $myconfig{$_} } qw(stylesheet charset)
+  unless (($form->{action} eq 'save') && ($form->{type} eq 'preferences'));
+
 # pull in the main code
 require "bin/mozilla/$form->{script}";
 
@@ -140,5 +150,16 @@ if ($form->{action}) {
   $form->error($locale->text('action= not defined!'));
 }
 
+sub _show_error {
+  my $template           = shift;
+  $locale                = Locale->new($language, 'all');
+  $myconfig{countrycode} = $language;
+  $form->{stylesheet}    = 'css/lx-office-erp.css';
+
+  $form->header();
+  print $form->parse_html_template($template);
+  exit;
+}
+
 # end
 
index ef64684..a6200ba 100644 (file)
@@ -36,12 +36,14 @@ $menufile = "menu.ini";
 
 use DBI;
 use CGI;
-use POSIX qw(strftime);
-use IO::File;
-use Fcntl;
 use English qw(-no_match_vars);
+use Fcntl;
+use File::Copy;
+use IO::File;
+use POSIX qw(strftime);
 use Sys::Hostname;
 
+use SL::Auth;
 use SL::Form;
 use SL::Mailer;
 use SL::User;
@@ -51,14 +53,21 @@ use SL::DBUpgrade2;
 use SL::DBUtils;
 
 require "bin/mozilla/common.pl";
+require "bin/mozilla/admin_groups.pl";
 
 our $cgi = new CGI('');
 
 $form = new Form;
-$form->{"root"} = "root login";
 
 $locale = new Locale $language, "admin";
 
+our $auth = SL::Auth->new();
+if ($auth->session_tables_present()) {
+  $auth->expire_sessions();
+  $auth->restore_session();
+  $auth->set_session_value('rpw', $form->{rpw});
+}
+
 # customization
 if (-f "bin/mozilla/custom_$form->{script}") {
   eval { require "bin/mozilla/custom_$form->{script}"; };
@@ -70,16 +79,15 @@ $form->{favicon}    = "favicon.ico";
 
 if ($form->{action}) {
 
-
   $subroutine = $locale->findsub($form->{action});
 
-  if ($subroutine eq 'login') {
-    if ($form->{rpw}) {
-      $form->{rpw} = crypt $form->{rpw}, "ro";
-    }
+  if ($auth->authenticate_root($form->{rpw}, 0)) {
+    $form->{error_message} = $locale->text('Incorrect Password!');
+    adminlogin();
+    exit;
   }
 
-  check_password();
+  $auth->create_or_refresh_session() if ($auth->session_tables_present());
 
   call_sub($subroutine);
 
@@ -89,18 +97,6 @@ if ($form->{action}) {
   $form->error($locale->text('No Database Drivers available!'))
     unless (User->dbdrivers);
 
-  # create memberfile
-  if (!-f $memberfile) {
-    open(FH, ">$memberfile") or $form->error("$memberfile : $ERRNO");
-    print FH qq|# SQL-Ledger Accounting members
-
-[root login]
-password=
-
-|;
-    close FH;
-  }
-
   adminlogin();
 
 }
@@ -111,47 +107,208 @@ password=
 
 sub adminlogin {
 
-  $form->{title} =
-    qq|Lx-Office ERP $form->{version} | . $locale->text('Administration');
+  $form->{title} = qq|Lx-Office ERP $form->{version} | . $locale->text('Administration');
 
   $form->header();
   print $form->parse_html_template('admin/adminlogin');
 }
 
 sub login {
+  check_auth_db_and_tables();
   list_users();
 }
 
-sub list_users {
+sub logout {
+  $auth->destroy_session();
+  adminlogin();
+}
+
+sub check_auth_db_and_tables {
+  my %params;
 
-  $form->error($locale->text('File locked!')) if (-f "${memberfile}.LCK");
+  map { $params{"db_${_}"} = $auth->{DB_config}->{$_} } keys %{ $auth->{DB_config} };
 
-  open(FH, "$memberfile") or $form->error("$memberfile : $ERRNO");
+  if (!$auth->check_database()) {
+    $form->{title} = $locale->text('Authentification database creation');
+    $form->header();
+    print $form->parse_html_template('admin/check_auth_database', \%params);
+
+    exit 0;
+  }
 
-  my %members;
+  if (!$auth->check_tables()) {
+    $form->{title} = $locale->text('Authentification tables creation');
+    $form->header();
+    print $form->parse_html_template('admin/check_auth_tables', \%params);
+
+    exit 0;
+  }
+
+  if (-f $memberfile) {
+    my $memberdir = "";
+
+    if ($memberfile =~ m|^.*/|) {
+      $memberdir = $&;
+    }
+
+    my $backupdir = "${memberdir}member-file-migration";
+
+    $form->{title} = $locale->text('User data migration');
+    $form->header();
+    print $form->parse_html_template('admin/user_migration', { 'memberfile' => $memberfile,
+                                                               'backupdir'  => $backupdir });
+
+    exit 0
+  }
+}
+
+sub create_auth_db {
+  $auth->create_database('superuser'          => $form->{db_superuser},
+                         'superuser_password' => $form->{db_superuser_password},
+                         'template'           => $form->{db_template});
+  login();
+}
+
+sub create_auth_tables {
+  $auth->create_tables();
+  $auth->set_session_value('rpw', $form->{rpw});
+  $auth->create_or_refresh_session();
+
+  login();
+}
+
+sub migrate_users {
+  $lxdebug->enter_sub();
+
+  my $memberdir = "";
+
+  if ($memberfile =~ m|^.*/|) {
+    $memberdir = $&;
+  }
 
-  while (<FH>) {
+  my $backupdir = "${memberdir}member-file-migration";
+
+  if (! -d $backupdir && !mkdir $backupdir, 0700) {
+    $form->error(sprintf($locale->text('The directory "%s" could not be created:\n%s'), $backupdir, $!));
+  }
+
+  copy $memberfile, "users/member-file-migration/members";
+
+  my $in = IO::File->new($memberfile, "r");
+
+  $form->error($locale->text('Could not open the old memberfile.')) if (!$in);
+
+  my (%members, $login);
+
+  while (<$in>) {
     chomp;
 
-    if (/^\[.*\]/) {
+    next if (m/^\s*\#/);
+
+    if (m/^\[.*\]/) {
       $login = $_;
       $login =~ s/(\[|\])//g;
+      $login =~ s/^\s*//;
+      $login =~ s/\s*$//;
 
       $members{$login} = { "login" => $login };
+      next;
     }
 
-    if (/^([a-z]+)=(.*)/) {
-      $members{$login}->{$1} = $2;
+    if ($login && m/=/) {
+      my ($key, $value) = split m/\s*=\s*/, $_, 2;
+      $key   =~ s|^\s*||;
+      $value =~ s|\s*$||;
+
+      $value =~ s|\\r||g;
+      $value =~ s|\\n|\n|g;
+
+      $members{$login}->{$key} = $value;
     }
   }
 
-  close(FH);
+  $in->close();
 
   delete $members{"root login"};
+
+  map { $_->{dbpasswd} = unpack 'u', $_->{dbpasswd} } values %members;
+
+  while (my ($login, $params) = each %members) {
+    $auth->save_user($login, %{ $params });
+    $auth->change_password($login, $params->{password}, 1);
+
+    my $conf_file = "${memberdir}${login}.conf";
+
+    if (-f $conf_file) {
+      copy   $conf_file, "${backupdir}/${login}.conf";
+      unlink $conf_file;
+    }
+  }
+
+  unlink $memberfile;
+
+  my @member_list = sort { lc $a->{login} cmp lc $b->{login} } values %members;
+
+  $form->{title} = $locale->text('User data migration');
+  $form->header();
+  print $form->parse_html_template('admin/user_migration_done', { 'MEMBERS' => \@member_list });
+
+  $lxdebug->leave_sub();
+}
+
+sub create_standard_group_ask {
+  $form->{title} = $locale->text('Create a standard group');
+
+  $form->header();
+  print $form->parse_html_template("admin/create_standard_group_ask");
+}
+
+sub create_standard_group {
+  my %members = $auth->read_all_users();
+
+  my $groups = $auth->read_groups();
+
+  foreach my $group (values %{$groups}) {
+    if (($form->{group_id} != $group->{id})
+        && ($form->{name} eq $group->{name})) {
+      $form->show_generic_error($locale->text("A group with that name does already exist."));
+    }
+  }
+
+  my $group = {
+    'name'        => $locale->text('Full Access'),
+    'description' => $locale->text('Full access to all functions'),
+    'rights'      => { map { $_ => 1 } SL::Auth::all_rights() },
+    'members'     => [ map { $_->{id} } values %members ],
+  };
+
+  $auth->save_group($group);
+
+  user_migration_complete(1);
+}
+
+sub dont_create_standard_group {
+  user_migration_complete(0);
+}
+
+sub user_migration_complete {
+  my $standard_group_created = shift;
+
+  $form->{title} = $locale->text('User migration complete');
+  $form->header();
+
+  print $form->parse_html_template('admin/user_migration_complete', { 'standard_group_created' => $standard_group_created });
+}
+
+sub list_users {
+  my %members = $auth->read_all_users();
+
+  delete $members{"root login"};
+
   map { $_->{templates} =~ s|.*/||; } values %members;
 
-  $form->{title}  = "Lx-Office ERP " . $locale->text('Administration');
-  $form->{LOCKED} = -e "$userspath/nologin";
+  $form->{title}   = "Lx-Office ERP " . $locale->text('Administration');
+  $form->{LOCKED}  = -e "$userspath/nologin";
   $form->{MEMBERS} = [ @members{sort { lc $a cmp lc $b } keys %members} ];
 
   $form->header();
@@ -177,7 +334,7 @@ sub add_user {
   edit_user_form($myconfig);
 }
 
-sub edit {
+sub edit_user {
 
   $form->{title} =
       "Lx-Office ERP "
@@ -188,10 +345,7 @@ sub edit {
   $form->isblank("login", $locale->text("The login is missing."));
 
   # get user
-  my $myconfig = new User "$memberfile", "$form->{login}";
-
-  $myconfig->{signature} =~ s/\\n/\r\n/g;
-  $myconfig->{address}   =~ s/\\n/\r\n/g;
+  my $myconfig = new User($form->{login});
 
   # strip basedir from templates directory
   $myconfig->{templates} =~ s|.*/||;
@@ -255,81 +409,37 @@ sub edit_user_form {
 
   map { $form->{"myc_${_}"} = $myconfig->{$_} } keys %{ $myconfig };
 
-  # access control
-  my @acsorder = ();
-  my %acs      = ();
-  my %excl     = ();
-  open(FH, $menufile) or $form->error("$menufile : $ERRNO");
-
-  while ($item = <FH>) {
-    next unless $item =~ /\[/;
-    next if $item =~ /\#/;
+  my $groups = [];
 
-    $item =~ s/(\[|\])//g;
-    chomp $item;
+  if ($form->{edit}) {
+    my $user_id    = $auth->get_user_id($form->{login});
+    my $all_groups = $auth->read_groups();
 
-    my ($level, $menuitem);
-
-    if ($item =~ /--/) {
-      ($level, $menuitem) = split /--/, $item, 2;
-    } else {
-      $level    = $item;
-      $menuitem = $item;
-      push @acsorder, $item;
+    foreach my $group (values %{ $all_groups }) {
+      push @{ $groups }, $group if (grep { $user_id == $_ } @{ $group->{members} });
     }
 
-    $acs{$level} ||= [];
-    push @{ $acs{$level} }, $menuitem;
-
-  }
-
-  foreach $item (split(/;/, $myconfig->{acs})) {
-    ($key, $value) = split /--/, $item, 2;
-    $excl{$key}{$value} = 1;
-  }
-
-  $form->{ACLS}    = [];
-  $form->{all_acs} = "";
-
-  foreach $key (@acsorder) {
-    my $acl = { "checked" => $form->{login} ? !$excl{$key}->{$key} : 1,
-                "name"    => "${key}--${key}",
-                "title"   => $key,
-                "SUBACLS" => [], };
-    $form->{all_acs} .= "${key}--${key};";
-
-    foreach $item (@{ $acs{$key} }) {
-      next if ($key eq $item);
-
-      my $subacl = { "checked" => $form->{login} ? !$excl{$key}->{$item} : 1,
-                     "name"    => "${key}--${item}",
-                     "title"   => $item };
-      push @{ $acl->{SUBACLS} }, $subacl;
-      $form->{all_acs} .= "${key}--${item};";
-    }
-    push @{ $form->{ACLS} }, $acl;
+    $groups = [ sort { lc $a->{name} cmp lc $b->{name} } @{ $groups } ];
   }
 
-  chop $form->{all_acs};
+  $form->{CAN_CHANGE_PASSWORD} = $auth->can_change_password();
 
   $form->header();
-  print $form->parse_html_template("admin/edit_user");
+  print $form->parse_html_template("admin/edit_user", { 'GROUPS' => $groups });
 }
 
-sub save {
-
+sub save_user {
   $form->{dbdriver} = 'Pg';
 
   # no spaces allowed in login name
-  ($form->{login}) = split / /, $form->{login};
-
+  $form->{login} =~ s|\s||g;
   $form->isblank("login", $locale->text('Login name missing!'));
 
   # check for duplicates
   if (!$form->{edit}) {
-    $temp = new User "$memberfile", "$form->{login}";
+    my %members = $auth->read_all_users();
 
-    if ($temp->{login}) {
+    if ($members{$form->{login}}) {
       $form->error("$form->{login} " . $locale->text('is already a member!'));
     }
   }
@@ -353,17 +463,7 @@ sub save {
   $form->{templates} =~ s|.*/||;
   $form->{templates} =  "$templates/$form->{templates}";
 
-  $myconfig = new User "$memberfile", "$form->{login}";
-
-  # redo acs variable and delete all the acs codes
-  my @acs;
-  foreach $item (split m|;|, $form->{all_acs}) {
-    my $name =  "ACS_${item}";
-    $name    =~ s| |+|g;
-    push @acs, $item if !$form->{$name};
-    delete $form->{$name};
-  }
-  $form->{acs} = join ";", @acs;
+  $myconfig = new User($form->{login});
 
   $form->isblank("dbname", $locale->text('Dataset missing!'));
   $form->isblank("dbuser", $locale->text('Database User missing!'));
@@ -377,7 +477,13 @@ sub save {
     $myconfig->{stylesheet} = $form->{userstylesheet};
   }
 
-  $myconfig->save_member($memberfile, $userspath);
+  $myconfig->save_member();
+
+  if ($auth->can_change_password()
+      && defined $form->{new_password}
+      && ($form->{new_password} ne '********')) {
+    $auth->change_password($form->{login}, $form->{new_password});
+  }
 
   if ($webdav) {
     @webdavdirs =
@@ -457,22 +563,18 @@ sub save {
 
 }
 
-sub delete {
-  $form->error($locale->text('File locked!')) if (-f ${memberfile} . LCK);
-  open(FH, ">${memberfile}.LCK") or $form->error("${memberfile}.LCK : $ERRNO");
-  close(FH);
+sub delete_user {
+  my %members   = $auth->read_all_users();
+  my $templates = $members{$form->{login}}->{templates};
 
-  my $members = Inifile->new($memberfile);
-  my $templates = $members->{$form->{login}}->{templates};
-  delete $members->{$form->{login}};
-  $members->write();
-  unlink "${memberfile}.LCK";
+  $auth->delete_user($form->{login});
 
   if ($templates) {
     my $templates_in_use = 0;
-    foreach $login (keys %{ $members }) {
-      next if $login =~ m/^[A-Z]+$/;
-      next if $members->{$login}->{templates} ne $templates;
+
+    foreach $login (keys %members) {
+      next if $form->{login} eq $login;
+      next if $members{$login}->{templates} ne $templates;
       $templates_in_use = 1;
       last;
     }
@@ -483,9 +585,6 @@ sub delete {
     }
   }
 
-  # delete config file for user
-  unlink "$userspath/$form->{login}.conf";
-
   $form->redirect($locale->text('User deleted!'));
 
 }
@@ -512,48 +611,6 @@ sub get_value {
   $value;
 }
 
-sub change_admin_password {
-
-  $form->{title} =
-      qq|Lx-Office ERP |
-    . $locale->text('Administration') . " / "
-    . $locale->text('Change Admin Password');
-
-  $form->header();
-  print $form->parse_html_template("admin/change_admin_password");
-}
-
-sub change_password {
-  if ($form->{"password"} ne $form->{"password_again"}) {
-    $form->{title} =
-      qq|Lx-Office ERP |
-      . $locale->text('Administration') . " / "
-      . $locale->text('Change Admin Password');
-
-    $form->header();
-    $form->error($locale->text("The passwords do not match."));
-  }
-
-  $root->{password} = $form->{password};
-
-  $root->{'root login'} = 1;
-  $root->save_member($memberfile);
-
-  $form->{callback} =
-    "$form->{script}?action=list_users&rpw=$root->{password}";
-
-  $form->redirect($locale->text('Password changed!'));
-}
-
-sub check_password {
-  $root = new User "$memberfile", $form->{root};
-
-  if (!defined($root->{password}) || ($root->{password} ne $form->{rpw})) {
-    $form->error($locale->text('Incorrect Password!'));
-  }
-
-}
-
 sub pg_database_administration {
 
   $form->{dbdriver} = 'Pg';
@@ -681,7 +738,7 @@ sub dbcreate {
 }
 
 sub delete_dataset {
-  @dbsources = User->dbsources_unused(\%$form, $memberfile);
+  @dbsources = User->dbsources_unused($form);
   $form->error($locale->text('Nothing to delete!')) unless @dbsources;
 
   $form->{title} =
@@ -974,8 +1031,7 @@ sub unlock_system {
 
   unlink "$userspath/nologin";
 
-  $form->{callback} =
-    "$form->{script}?action=list_users&rpw=$root->{password}";
+  $form->{callback} = "admin.pl?action=list_users";
 
   $form->redirect($locale->text('Lockfile removed!'));
 
@@ -987,9 +1043,57 @@ sub lock_system {
     or $form->error($locale->text('Cannot create Lock!'));
   close(FH);
 
-  $form->{callback} =
-    "$form->{script}?action=list_users&rpw=$root->{password}";
+  $form->{callback} = "admin.pl?action=list_users";
 
   $form->redirect($locale->text('Lockfile created!'));
 
 }
+
+sub yes {
+  call_sub($form->{yes_nextsub});
+}
+
+sub no {
+  call_sub($form->{no_nextsub});
+}
+
+sub add {
+  call_sub($form->{add_nextsub});
+}
+
+sub edit {
+  $form->{edit_nextsub} ||= 'edit_user';
+
+  call_sub($form->{edit_nextsub});
+}
+
+sub delete {
+  $form->{delete_nextsub} ||= 'delete_user';
+
+  call_sub($form->{delete_nextsub});
+}
+
+sub save {
+  $form->{save_nextsub} ||= 'save_user';
+
+  call_sub($form->{save_nextsub});
+}
+
+sub back {
+  call_sub($form->{back_nextsub});
+}
+
+sub dispatcher {
+  foreach my $action (qw(create_standard_group dont_create_standard_group)) {
+    if ($form->{"action_${action}"}) {
+      call_sub($action);
+      return;
+    }
+  }
+
+  call_sub($form->{default_action}) if ($form->{default_action});
+
+  $form->error($locale->text('No action defined.'));
+}
+
+1;
diff --git a/bin/mozilla/admin_groups.pl b/bin/mozilla/admin_groups.pl
new file mode 100644 (file)
index 0000000..35ecc8c
--- /dev/null
@@ -0,0 +1,238 @@
+sub edit_groups {
+  $lxdebug->enter_sub();
+
+  my @groups = sort { lc $a->{name} cmp lc $b->{name} } values %{ $auth->read_groups() };
+
+  $form->header();
+  print $form->parse_html_template("admin/edit_groups", { 'GROUPS'     => \@groups,
+                                                          'num_groups' => scalar @groups });
+
+  $lxdebug->leave_sub();
+}
+
+sub add_group {
+  $lxdebug->enter_sub();
+
+  delete $form->{group_id};
+  $form->{message} = $locale->text("The group has been added.");
+
+  save_group();
+
+  $lxdebug->leave_sub();
+}
+
+sub save_group {
+  $lxdebug->enter_sub();
+
+  $form->isblank('name', $locale->text('The group name is missing.'));
+
+  my $groups = $auth->read_groups();
+
+  foreach my $group (values %{$groups}) {
+    if (($form->{group_id} != $group->{id})
+        && ($form->{name} eq $group->{name})) {
+      $form->show_generic_error($locale->text("A group with that name does already exist."));
+    }
+  }
+
+  my $group;
+
+  if ($form->{group_id} && $groups->{$form->{group_id}}) {
+    $group = $groups->{$form->{group_id}};
+
+  } else {
+    $group = { };
+  }
+
+  $group->{name}        = $form->{name};
+  $group->{description} = $form->{description};
+  $group->{rights}      = {};
+
+  map { $group->{rights}->{$_} = $form->{"${_}_granted"} ? 1 : 0 } SL::Auth::all_rights();
+
+  my $is_new = !$form->{group_id};
+
+  $auth->save_group($group);
+
+  $form->{message} ||= $locale->text('The group has been saved.');
+
+  if ($is_new) {
+    edit_groups();
+
+  } else {
+    edit_group();
+  }
+
+  $lxdebug->leave_sub();
+}
+
+sub edit_group {
+  $lxdebug->enter_sub();
+
+  my $groups = $auth->read_groups();
+
+  if (!$form->{group_id} || !$groups->{$form->{group_id}}) {
+    $form->show_generic_error($locale->text("No group has been selected, or the group does not exist anymore."));
+  }
+
+  $group = $groups->{$form->{group_id}};
+
+  my %all_users   = $auth->read_all_users();
+  my %users_by_id = map { $_->{id} => $_ } values %all_users;
+
+  my @members     = sort { lc $a->{login} cmp lc $b->{login} } @users_by_id{ @{ $group->{members} } };
+
+  my %grouped     = map { $_ => 1 } @{ $group->{members} };
+  my @non_members = sort { lc $a->{login} cmp lc $b->{login} } grep { !$grouped{$_->{id}} } values %all_users;
+
+  my @rights = map {
+    { "right"       => $_->[0],
+      "description" => $_->[1],
+      "is_section"  => '--' eq substr($_->[0], 0, 2),
+      "granted"     => defined $group->{rights}->{$_->[0]} ? $group->{rights}->{$_->[0]} : 0,
+    }
+  } SL::Auth::all_rights_full();
+
+  $form->header();
+  print $form->parse_html_template("admin/edit_group", { "USERS_IN_GROUP"     => \@members,
+                                                         "USERS_NOT_IN_GROUP" => \@non_members,
+                                                         "RIGHTS"             => \@rights,
+                                                         "name"               => $group->{name},
+                                                         "description"        => $group->{description} });
+
+  $lxdebug->leave_sub();
+}
+
+sub delete_group {
+  $lxdebug->enter_sub();
+
+  my $groups = $auth->read_groups();
+
+  if (!$form->{group_id} || !$groups->{$form->{group_id}}) {
+    $form->show_generic_error($locale->text("No group has been selected, or the group does not exist anymore."));
+  }
+
+  if ($form->{confirmed}) {
+    $auth->delete_group($form->{"group_id"});
+
+    $form->{message} = $locale->text("The group has been deleted.");
+    edit_groups();
+
+  } else {
+
+    $form->header();
+    print $form->parse_html_template("admin/delete_group_confirm", $groups->{$form->{group_id}});
+  }
+
+  $lxdebug->leave_sub();
+}
+
+sub add_to_group {
+  $lxdebug->enter_sub();
+
+  $form->isblank('user_id_not_in_group', $locale->text('No user has been selected.'));
+
+  my $groups = $auth->read_groups();
+
+  if (!$form->{group_id} || !$groups->{$form->{group_id}}) {
+    $form->show_generic_error($locale->text('No group has been selected, or the group does not exist anymore.'));
+  }
+
+  $group = $groups->{$form->{group_id}};
+  push @{ $group->{members} }, $form->{user_id_not_in_group};
+
+  $auth->save_group($group);
+
+  $form->{message} = $locale->text('The user has been added to this group.');
+  edit_group();
+
+  $lxdebug->leave_sub();
+}
+
+sub remove_from_group {
+  $lxdebug->enter_sub();
+
+  $form->isblank('user_id_in_group', $locale->text('No user has been selected.'));
+
+  my $groups = $auth->read_groups();
+
+  if (!$form->{group_id} || !$groups->{$form->{group_id}}) {
+    $form->show_generic_error($locale->text('No group has been selected, or the group does not exist anymore.'));
+  }
+
+  $group            = $groups->{$form->{group_id}};
+  $group->{members} = [ grep { $_ ne $form->{user_id_in_group} } @{ $group->{members} } ];
+
+  $auth->save_group($group);
+
+  $form->{message} = $locale->text('The user has been removed from this group.');
+  edit_group();
+
+  $lxdebug->leave_sub();
+}
+
+sub edit_group_membership {
+  $lxdebug->enter_sub();
+
+  my %users  = $auth->read_all_users();
+  my $groups = $auth->read_groups();
+  $groups    = [ sort { lc $a->{name} cmp lc $b->{name} } values %{ $groups } ];
+
+  my @headings = map { { 'title' => $_ } } map { $_->{name} } @{ $groups };
+
+  foreach my $group (@{ $groups }) {
+    $group->{members_h} = { map { $_ => 1 } @{ $group->{members} } };
+  }
+
+  my @rows;
+
+  foreach my $user (sort { lc $a->{login} cmp lc $b->{login} } values %users) {
+    my $row = {
+      'id'              => $user->{id},
+      'login'           => $user->{login},
+      'name'            => $user->{name},
+      'repeat_headings' => (scalar(@rows) % 20) == 0,
+      'GROUPS'          => [],
+    };
+
+    foreach my $group (@{ $groups }) {
+      push @{ $row->{GROUPS} }, {
+        'id'        => $group->{id},
+        'is_member' => $group->{members_h}->{$user->{id}},
+      };
+    }
+
+    push @rows, $row;
+  }
+
+  $form->{title} = $locale->text('Edit group membership');
+  $form->header();
+  print $form->parse_html_template('admin/edit_group_membership', { 'HEADINGS' => \@headings, 'USERS' => \@rows });
+
+  $lxdebug->leave_sub();
+}
+
+sub save_group_membership {
+  $lxdebug->enter_sub();
+
+  my %users  = $auth->read_all_users();
+  my $groups = $auth->read_groups();
+
+  foreach my $group (values %{ $groups }) {
+    $group->{members} = [ ];
+
+    foreach my $user (values %users) {
+      push @{ $group->{members} }, $user->{id} if ($form->{"u_$user->{id}_g_$group->{id}"});
+    }
+
+    $auth->save_group($group);
+  }
+
+  $form->{message} = $locale->text('The group memberships have been saved.');
+
+  edit_groups();
+
+  $lxdebug->leave_sub();
+}
+
+1;
index fbb5cfd..51f8f69 100644 (file)
@@ -31,6 +31,7 @@
 #
 #======================================================================
 
+use SL::Auth;
 use SL::AM;
 use SL::CA;
 use SL::Form;
@@ -57,13 +58,13 @@ sub continue { call_sub($form->{"nextsub"}); }
 sub add_account {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title}     = "Add";
   $form->{charttype} = "A";
   AM->get_account(\%myconfig, \%$form);
 
-  $form->{callback} =
-    "$form->{script}?action=list_account&login=$form->{login}&password=$form->{password}"
-    unless $form->{callback};
+  $form->{callback} = "am.pl?action=list_account" unless $form->{callback};
 
   &account_header;
   &form_footer;
@@ -74,6 +75,8 @@ sub add_account {
 sub edit_account {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = "Edit";
   AM->get_account(\%myconfig, \%$form);
 
@@ -90,6 +93,8 @@ sub edit_account {
 sub account_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   if ( $form->{action} eq 'edit_account') {
     $form->{account_exists} = '1';
   } 
@@ -348,12 +353,11 @@ sub account_header {
 sub form_footer {
   $lxdebug->enter_sub();
 
-  print qq|
+  $auth->assert('config');
 
-<input name=callback type=hidden value="$form->{callback}">
+  print qq|
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
+<input name=callback type=hidden value="| . H($form->{callback}) . qq|">
 
 <br>|;
   if ((!$form->{id}) || ($form->{id} && $form->{orphaned}) || (($form->{type} eq "account") && (!$form->{new_chart_valid}))) {
@@ -381,6 +385,8 @@ sub form_footer {
 sub save_account {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->isblank("accno",       $locale->text('Account Number missing!'));
   $form->isblank("description", $locale->text('Account Description missing!'));
   
@@ -398,6 +404,8 @@ sub save_account {
 sub list_account {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{callback}     = build_std_url('action=list_account');
   my $link_edit_account = build_std_url('action=edit_account', 'callback');
 
@@ -449,6 +457,8 @@ sub list_account_details {
 # Ajax Funktion aus list_account_details
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   my $chart_id = $form->{args};
 
   CA->all_accounts(\%myconfig, \%$form, $chart_id);
@@ -514,6 +524,8 @@ sub list_account_details {
 sub delete_account {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = $locale->text('Delete Account');
 
   foreach $id (
@@ -534,12 +546,12 @@ sub delete_account {
 sub add_department {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = "Add";
   $form->{role}  = "P";
 
-  $form->{callback} =
-    "$form->{script}?action=add_department&login=$form->{login}&password=$form->{password}"
-    unless $form->{callback};
+  $form->{callback} = "am.pl?action=add_department" unless $form->{callback};
 
   &department_header;
   &form_footer;
@@ -550,6 +562,8 @@ sub add_department {
 sub edit_department {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = "Edit";
 
   AM->get_department(\%myconfig, \%$form);
@@ -563,10 +577,11 @@ sub edit_department {
 sub list_department {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->departments(\%myconfig, \%$form);
 
-  $form->{callback} =
-    "$form->{script}?action=list_department&login=$form->{login}&password=$form->{password}";
+  $form->{callback} = "am.pl?action=list_department";
 
   $callback = $form->escape($form->{callback});
 
@@ -622,7 +637,7 @@ sub list_department {
     $profitcenter = ($ref->{role} eq "P") ? "X" : "";
 
     $column_data{description} =
-      qq|<td><a href=$form->{script}?action=edit_department&id=$ref->{id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{description}</td>|;
+      qq|<td><a href="am.pl?action=edit_department&id=$ref->{id}&callback=$callback">$ref->{description}</td>|;
     $column_data{cost}   = qq|<td align=center>$costcenter</td>|;
     $column_data{profit} = qq|<td align=center>$profitcenter</td>|;
 
@@ -643,15 +658,12 @@ sub list_department {
 </table>
 
 <br>
-<form method=post action=$form->{script}>
+<form method=post action=am.pl>
 
 <input name=callback type=hidden value="$form->{callback}">
 
 <input type=hidden name=type value=department>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <input class=submit type=submit name=action value="|
     . $locale->text('Add') . qq|">
 
@@ -667,6 +679,8 @@ sub list_department {
 sub department_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = $locale->text("$form->{title} Department");
 
   # $locale->text('Add Department')
@@ -690,7 +704,7 @@ sub department_header {
   print qq|
 <body>
 
-<form method=post action=$form->{script}>
+<form method=post action=am.pl>
 
 <input type=hidden name=id value=$form->{id}>
 <input type=hidden name=type value=department>
@@ -723,6 +737,8 @@ sub department_header {
 sub save_department {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->isblank("description", $locale->text('Description missing!'));
   AM->save_department(\%myconfig, \%$form);
   $form->redirect($locale->text('Department saved!'));
@@ -733,6 +749,8 @@ sub save_department {
 sub delete_department {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->delete_department(\%myconfig, \%$form);
   $form->redirect($locale->text('Department deleted!'));
 
@@ -742,11 +760,11 @@ sub delete_department {
 sub add_lead {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = "Add";
 
-  $form->{callback} =
-    "$form->{script}?action=add_lead&login=$form->{login}&password=$form->{password}"
-    unless $form->{callback};
+  $form->{callback} = "am.pl?action=add_lead" unless $form->{callback};
 
   &lead_header;
   &form_footer;
@@ -757,6 +775,8 @@ sub add_lead {
 sub edit_lead {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = "Edit";
 
   AM->get_lead(\%myconfig, \%$form);
@@ -772,10 +792,11 @@ sub edit_lead {
 sub list_lead {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->lead(\%myconfig, \%$form);
 
-  $form->{callback} =
-    "$form->{script}?action=list_lead&login=$form->{login}&password=$form->{password}";
+  $form->{callback} = "am.pl?action=list_lead";
 
   $callback = $form->escape($form->{callback});
 
@@ -818,8 +839,7 @@ sub list_lead {
 
        $lead = $ref->{lead};
        
-    $column_data{description} =
-      qq|<td><a href=$form->{script}?action=edit_lead&id=$ref->{id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{lead}</td>|;
+    $column_data{description} = qq|<td><a href="am.pl?action=edit_lead&id=$ref->{id}&callback=$callback">$ref->{lead}</td>|;
 
     map { print "$column_data{$_}\n" } @column_index;
 
@@ -835,15 +855,12 @@ sub list_lead {
 </table>
 
 <br>
-<form method=post action=$form->{script}>
+<form method=post action=am.pl>
 
 <input name=callback type=hidden value="$form->{callback}">
 
 <input type=hidden name=type value=lead>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <input class=submit type=submit name=action value="|
     . $locale->text('Add') . qq|">
 
@@ -859,6 +876,8 @@ sub list_lead {
 sub lead_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = $locale->text("$form->{title} Lead");
 
   # $locale->text('Add Lead')
@@ -874,7 +893,7 @@ sub lead_header {
   print qq|
 <body>
 
-<form method=post action=$form->{script}>
+<form method=post action=am.pl>
 
 <input type=hidden name=id value=$form->{id}>
 <input type=hidden name=type value=lead>
@@ -899,6 +918,8 @@ sub lead_header {
 sub save_lead {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->isblank("description", $locale->text('Description missing!'));
   AM->save_lead(\%myconfig, \%$form);
   $form->redirect($locale->text('lead saved!'));
@@ -909,6 +930,8 @@ sub save_lead {
 sub delete_lead {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->delete_lead(\%myconfig, \%$form);
   $form->redirect($locale->text('lead deleted!'));
 
@@ -918,11 +941,11 @@ sub delete_lead {
 sub add_business {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = "Add";
 
-  $form->{callback} =
-    "$form->{script}?action=add_business&login=$form->{login}&password=$form->{password}"
-    unless $form->{callback};
+  $form->{callback} = "am.pl?action=add_business" unless $form->{callback};
 
   &business_header;
   &form_footer;
@@ -948,10 +971,11 @@ sub edit_business {
 sub list_business {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->business(\%myconfig, \%$form);
 
-  $form->{callback} =
-    "$form->{script}?action=list_business&login=$form->{login}&password=$form->{password}";
+  $form->{callback} = "am.pl?action=list_business";
 
   $callback = $form->escape($form->{callback});
 
@@ -1007,8 +1031,7 @@ sub list_business {
       $form->format_amount(\%myconfig, $ref->{discount} * 100);
     $description =
       $ref->{description};
-    $column_data{description} =
-      qq|<td><a href=$form->{script}?action=edit_business&id=$ref->{id}&login=$form->{login}&password=$form->{password}&callback=$callback>$description</td>|;
+    $column_data{description} = qq|<td><a href="am.pl?action=edit_business&id=$ref->{id}&callback=$callback">$description</td>|;
     $column_data{discount}           = qq|<td align=right>$discount</td>|;
     $column_data{customernumberinit} =
       qq|<td align=right>$ref->{customernumberinit}</td>|;
@@ -1030,15 +1053,12 @@ sub list_business {
 </table>
 
 <br>
-<form method=post action=$form->{script}>
+<form method=post action=am.pl>
 
 <input name=callback type=hidden value="$form->{callback}">
 
 <input type=hidden name=type value=business>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <input class=submit type=submit name=action value="|
     . $locale->text('Add') . qq|">
 
@@ -1054,6 +1074,8 @@ sub list_business {
 sub business_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title}    = $locale->text("$form->{title} Business");
 
   # $locale->text('Add Business')
@@ -1068,7 +1090,7 @@ sub business_header {
   print qq|
 <body>
 
-<form method=post action=$form->{script}>
+<form method=post action=am.pl>
 
 <input type=hidden name=id value=$form->{id}>
 <input type=hidden name=type value=business>
@@ -1101,6 +1123,8 @@ sub business_header {
 sub save_business {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->isblank("description", $locale->text('Description missing!'));
   $form->{discount} = $form->parse_amount(\%myconfig, $form->{discount}) / 100;
   AM->save_business(\%myconfig, \%$form);
@@ -1112,6 +1136,8 @@ sub save_business {
 sub delete_business {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->delete_business(\%myconfig, \%$form);
   $form->redirect($locale->text('Business deleted!'));
 
@@ -1121,11 +1147,11 @@ sub delete_business {
 sub add_language {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = "Add";
 
-  $form->{callback} =
-    "$form->{script}?action=add_language&login=$form->{login}&password=$form->{password}"
-    unless $form->{callback};
+  $form->{callback} = "am.pl?action=add_language" unless $form->{callback};
 
   &language_header;
   &form_footer;
@@ -1136,6 +1162,8 @@ sub add_language {
 sub edit_language {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = "Edit";
 
   AM->get_language(\%myconfig, \%$form);
@@ -1151,10 +1179,11 @@ sub edit_language {
 sub list_language {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->language(\%myconfig, \%$form);
 
-  $form->{callback} =
-    "$form->{script}?action=list_language&login=$form->{login}&password=$form->{password}";
+  $form->{callback} = "am.pl?action=list_language";
 
   $callback = $form->escape($form->{callback});
 
@@ -1220,7 +1249,7 @@ sub list_language {
 
 
     $column_data{description} =
-      qq|<td><a href=$form->{script}?action=edit_language&id=$ref->{id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{description}</td>|;
+      qq|<td><a href="am.pl?action=edit_language&id=$ref->{id}&callback=$callback">$ref->{description}</td>|;
     $column_data{template_code}           = qq|<td align=right>$ref->{template_code}</td>|;
     $column_data{article_code} =
       qq|<td align=right>$ref->{article_code}</td>|;
@@ -1256,15 +1285,12 @@ sub list_language {
 </table>
 
 <br>
-<form method=post action=$form->{script}>
+<form method=post action=am.pl>
 
 <input name=callback type=hidden value="$form->{callback}">
 
 <input type=hidden name=type value=language>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <input class=submit type=submit name=action value="|
     . $locale->text('Add') . qq|">
 
@@ -1280,6 +1306,8 @@ sub list_language {
 sub language_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title}    = $locale->text("$form->{title} Language");
 
   # $locale->text('Add Language')
@@ -1317,7 +1345,7 @@ sub language_header {
   print qq|
 <body>
 
-<form method=post action=$form->{script}>
+<form method=post action=am.pl>
 
 <input type=hidden name=id value=$form->{id}>
 <input type=hidden name=type value=language>
@@ -1368,6 +1396,8 @@ sub language_header {
 sub save_language {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->isblank("description", $locale->text('Language missing!'));
   $form->isblank("template_code", $locale->text('Template Code missing!'));
   $form->isblank("article_code", $locale->text('Article Code missing!'));
@@ -1380,6 +1410,8 @@ sub save_language {
 sub delete_language {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->delete_language(\%myconfig, \%$form);
   $form->redirect($locale->text('Language deleted!'));
 
@@ -1390,13 +1422,14 @@ sub delete_language {
 sub add_buchungsgruppe {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   # $locale->text("Add Buchungsgruppe")
   # $locale->text("Edit Buchungsgruppe")
   $form->{title} = "Add";
 
-  $form->{callback} =
-    "$form->{script}?action=add_buchungsgruppe&login=$form->{login}&password=$form->{password}"
-    unless $form->{callback};
+  $form->{callback} = "am.pl?action=add_buchungsgruppe" unless $form->{callback};
+
   AM->get_buchungsgruppe(\%myconfig, \%$form);
   $form->{"inventory_accno_id"} = $form->{"std_inventory_accno_id"};
   for (my $i = 0; 4 > $i; $i++) {
@@ -1413,6 +1446,8 @@ sub add_buchungsgruppe {
 sub edit_buchungsgruppe {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = "Edit";
 
   AM->get_buchungsgruppe(\%myconfig, \%$form);
@@ -1427,10 +1462,11 @@ sub edit_buchungsgruppe {
 sub list_buchungsgruppe {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->buchungsgruppe(\%myconfig, \%$form);
 
-  $form->{callback} =
-    "$form->{script}?action=list_buchungsgruppe&login=$form->{login}&password=$form->{password}";
+  $form->{callback} = "am.pl?action=list_buchungsgruppe";
 
   $callback = $form->escape($form->{callback});
 
@@ -1512,9 +1548,7 @@ sub list_buchungsgruppe {
         </tr>
 |;
 
-  my $swap_link = qq|$form->{script}?action=swap_buchungsgruppen&|;
-  map({ $swap_link .= $_ . "=" . $form->escape($form->{$_}) . "&" }
-      qw(login password));
+  my $swap_link = qq|am.pl?action=swap_buchungsgruppen&|;
 
   my $row = 0;
   foreach $ref (@{ $form->{ALL} }) {
@@ -1548,8 +1582,7 @@ sub list_buchungsgruppe {
         qq|</a></td>|;
     }
 
-    $column_data{description} =
-      qq|<td><a href=$form->{script}?action=edit_buchungsgruppe&id=$ref->{id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{description}</td>|;
+    $column_data{description} = qq|<td><a href="am.pl?action=edit_buchungsgruppe&id=$ref->{id}&callback=$callback">$ref->{description}</td>|;
     $column_data{inventory_accno}           = qq|<td align=right>$ref->{inventory_accno}</td>|;
     $column_data{income_accno_0} =
       qq|<td align=right>$ref->{income_accno_0}</td>|;
@@ -1583,15 +1616,12 @@ sub list_buchungsgruppe {
 </table>
 
 <br>
-<form method=post action=$form->{script}>
+<form method=post action=am.pl>
 
 <input name=callback type=hidden value="$form->{callback}">
 
 <input type=hidden name=type value=buchungsgruppe>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <input class=submit type=submit name=action value="|
     . $locale->text('Add') . qq|">
 
@@ -1607,6 +1637,8 @@ sub list_buchungsgruppe {
 sub buchungsgruppe_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title}    = $locale->text("$form->{title} Buchungsgruppe");
 
   # $locale->text('Add Accounting Group')
@@ -1721,7 +1753,7 @@ sub buchungsgruppe_header {
   print qq|
 <body>
 
-<form method=post action=$form->{script}>
+<form method=post action=am.pl>
 
 <input type=hidden name=id value=$form->{id}>
 <input type=hidden name=type value=buchungsgruppe>
@@ -1747,6 +1779,8 @@ sub buchungsgruppe_header {
 sub save_buchungsgruppe {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->isblank("description", $locale->text('Description missing!'));
 
   AM->save_buchungsgruppe(\%myconfig, \%$form);
@@ -1758,6 +1792,8 @@ sub save_buchungsgruppe {
 sub delete_buchungsgruppe {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->delete_buchungsgruppe(\%myconfig, \%$form);
   $form->redirect($locale->text('Accounting Group deleted!'));
 
@@ -1767,6 +1803,8 @@ sub delete_buchungsgruppe {
 sub swap_buchungsgruppen {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->swap_sortkeys(\%myconfig, $form, "buchungsgruppen");
   list_buchungsgruppe();
 
@@ -1777,11 +1815,11 @@ sub swap_buchungsgruppen {
 sub add_printer {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = "Add";
 
-  $form->{callback} =
-    "$form->{script}?action=add_printer&login=$form->{login}&password=$form->{password}"
-    unless $form->{callback};
+  $form->{callback} = "am.pl?action=add_printer" unless $form->{callback};
 
   &printer_header;
   &form_footer;
@@ -1792,6 +1830,8 @@ sub add_printer {
 sub edit_printer {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = "Edit";
 
   AM->get_printer(\%myconfig, \%$form);
@@ -1807,10 +1847,11 @@ sub edit_printer {
 sub list_printer {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->printer(\%myconfig, \%$form);
 
-  $form->{callback} =
-    "$form->{script}?action=list_printer&login=$form->{login}&password=$form->{password}";
+  $form->{callback} = "am.pl?action=list_printer";
 
   $callback = $form->escape($form->{callback});
 
@@ -1863,8 +1904,7 @@ sub list_printer {
 |;
 
 
-    $column_data{printer_description} =
-      qq|<td><a href=$form->{script}?action=edit_printer&id=$ref->{id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{printer_description}</td>|;
+    $column_data{printer_description} = qq|<td><a href="am.pl?action=edit_printer&id=$ref->{id}&callback=$callback">$ref->{printer_description}"</td>|;
     $column_data{printer_command}           = qq|<td align=right>$ref->{printer_command}</td>|;
     $column_data{template_code} =
       qq|<td align=right>$ref->{template_code}</td>|;
@@ -1886,15 +1926,12 @@ sub list_printer {
 </table>
 
 <br>
-<form method=post action=$form->{script}>
+<form method=post action=am.pl>
 
 <input name=callback type=hidden value="$form->{callback}">
 
 <input type=hidden name=type value=printer>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <input class=submit type=submit name=action value="|
     . $locale->text('Add') . qq|">
 
@@ -1910,6 +1947,8 @@ sub list_printer {
 sub printer_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title}    = $locale->text("$form->{title} Printer");
 
   # $locale->text('Add Printer')
@@ -1925,7 +1964,7 @@ sub printer_header {
   print qq|
 <body>
 
-<form method=post action=$form->{script}>
+<form method=post action=am.pl>
 
 <input type=hidden name=id value=$form->{id}>
 <input type=hidden name=type value=printer>
@@ -1958,6 +1997,8 @@ sub printer_header {
 sub save_printer {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->isblank("printer_description", $locale->text('Description missing!'));
   $form->isblank("printer_command", $locale->text('Printer Command missing!'));
   AM->save_printer(\%myconfig, \%$form);
@@ -1969,6 +2010,8 @@ sub save_printer {
 sub delete_printer {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->delete_printer(\%myconfig, \%$form);
   $form->redirect($locale->text('Printer deleted!'));
 
@@ -1978,11 +2021,11 @@ sub delete_printer {
 sub add_payment {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = "Add";
 
-  $form->{callback} =
-    "$form->{script}?action=add_payment&login=$form->{login}&password=$form->{password}"
-    unless $form->{callback};
+  $form->{callback} = "am.pl?action=add_payment" unless $form->{callback};
 
   $form->{terms_netto} = 0;
   $form->{terms_skonto} = 0;
@@ -2000,6 +2043,8 @@ sub add_payment {
 sub edit_payment {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = "Edit";
 
   AM->get_payment(\%myconfig, $form);
@@ -2017,6 +2062,8 @@ sub edit_payment {
 sub list_payment {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->payment(\%myconfig, \%$form);
 
   $form->{callback} = build_std_url("action=list_payment");
@@ -2145,15 +2192,12 @@ sub list_payment {
 </table>
 
 <br>
-<form method=post action=$form->{script}>
+<form method=post action=am.pl>
 
 <input name=callback type=hidden value="$form->{callback}">
 
 <input type=hidden name=type value=payment>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <input class=submit type=submit name=action value="|
     . $locale->text('Add') . qq|">
 
@@ -2169,6 +2213,8 @@ sub list_payment {
 sub payment_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title}    = $locale->text("$form->{title} Payment Terms");
 
   # $locale->text('Add Payment Terms')
@@ -2183,7 +2229,7 @@ sub payment_header {
   print qq|
 <body>
 
-<form method=post action=$form->{script}>
+<form method=post action=am.pl>
 
 <input type=hidden name=id value=$form->{id}>
 <input type=hidden name=type value=payment>
@@ -2275,6 +2321,8 @@ sub payment_header {
 sub save_payment {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->isblank("description", $locale->text('Description missing!'));
   $form->{"percent_skonto"} =
     $form->parse_amount(\%myconfig, $form->{percent_skonto}) / 100;
@@ -2287,6 +2335,8 @@ sub save_payment {
 sub delete_payment {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->delete_payment(\%myconfig, \%$form);
   $form->redirect($locale->text('Payment terms deleted!'));
 
@@ -2296,6 +2346,8 @@ sub delete_payment {
 sub swap_payment_terms {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->swap_sortkeys(\%myconfig, $form, "payment_terms");
   list_payment();
 
@@ -2438,6 +2490,7 @@ sub config {
 
   $myconfig{show_form_details}              = 1 unless (defined($myconfig{show_form_details}));
   $form->{"menustyle_$myconfig{menustyle}"} = 1;
+  $form->{CAN_CHANGE_PASSWORD}              = $auth->can_change_password();
 
   $form->{title}                            = $locale->text('Edit Preferences for #1', $form->{login});
 
@@ -2452,10 +2505,7 @@ sub save_preferences {
 
   $form->{stylesheet} = $form->{usestylesheet};
 
-  $form->redirect($locale->text('Preferences saved!'))
-    if (
-     AM->save_preferences(\%myconfig, \%$form, $memberfile, $userspath, $webdav
-     ));
+  $form->redirect($locale->text('Preferences saved!')) if (AM->save_preferences(\%myconfig, \%$form, $webdav));
   $form->error($locale->text('Cannot save preferences!'));
 
   $lxdebug->leave_sub();
@@ -2464,6 +2514,8 @@ sub save_preferences {
 sub audit_control {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = $locale->text('Audit Control');
 
   AM->closedto(\%myconfig, \%$form);
@@ -2479,10 +2531,7 @@ sub audit_control {
   print qq|
 <body>
 
-<form method=post action=$form->{script}>
-
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
+<form method=post action=am.pl>
 
 <table width=100%>
   <tr><th class=listtop>$form->{title}</th></tr>
@@ -2528,6 +2577,8 @@ sub audit_control {
 sub doclose {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->closebooks(\%myconfig, \%$form);
 
   if ($form->{revtrans}) {
@@ -2549,6 +2600,8 @@ sub doclose {
 sub edit_units {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $units = AM->retrieve_units(\%myconfig, $form, $form->{"unit_type"}, "resolved_");
   AM->units_in_use(\%myconfig, $form, $units);
   map({ $units->{$_}->{"BASE_UNIT_DDBOX"} = AM->unit_select_data($units, $units->{$_}->{"base_unit"}, 1); } keys(%{$units}));
@@ -2592,6 +2645,8 @@ sub edit_units {
 sub add_unit {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->isblank("new_name", $locale->text("The name is missing."));
   $units = AM->retrieve_units(\%myconfig, $form, $form->{"unit_type"});
   $all_units = AM->retrieve_units(\%myconfig, $form);
@@ -2628,6 +2683,8 @@ sub add_unit {
 sub set_unit_languages {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   my ($unit, $languages, $idx) = @_;
 
   $unit->{"LANGUAGES"} = [];
@@ -2646,6 +2703,8 @@ sub set_unit_languages {
 sub save_unit {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $old_units = AM->retrieve_units(\%myconfig, $form, $form->{"unit_type"}, "resolved_");
   AM->units_in_use(\%myconfig, $form, $old_units);
 
@@ -2724,6 +2783,8 @@ sub save_unit {
 sub show_history_search {
        $lxdebug->enter_sub();
        
+  $auth->assert('config');
+
        $form->{title} = $locale->text("History Search");
     $form->header();
     
@@ -2734,6 +2795,9 @@ sub show_history_search {
 
 sub show_am_history {
        $lxdebug->enter_sub();
+
+  $auth->assert('config');
+
        my %search = ( "Artikelnummer" => "parts",
                                   "Kundennummer"  => "customer",
                                   "Lieferantennummer" => "vendor",
@@ -2819,6 +2883,9 @@ sub show_am_history {
 
 sub get_employee_id {
        $lxdebug->enter_sub();
+
+  $auth->assert('config');
+
        my $query = qq|SELECT id FROM employee WHERE name = '| . $_[0] . qq|'|;
        my $sth = $_[1]->prepare($query);
        $sth->execute() || $form->dberror($query);
@@ -2831,6 +2898,8 @@ sub get_employee_id {
 sub swap_units {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   my $dir = $form->{"dir"} eq "down" ? "down" : "up";
   my $unit_type = $form->{"unit_type"} eq "dimension" ?
     "dimension" : "service";
@@ -2844,11 +2913,11 @@ sub swap_units {
 sub add_tax {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} =  $locale->text('Add');
 
-  $form->{callback} =
-    "$form->{script}?action=add_tax&login=$form->{login}&password=$form->{password}"
-    unless $form->{callback};
+  $form->{callback} ||= "am.pl?action=add_tax";
 
   _get_taxaccount_selection();
 
@@ -2867,6 +2936,8 @@ sub add_tax {
 sub edit_tax {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} =  $locale->text('Edit');
 
   AM->get_tax(\%myconfig, \%$form);
@@ -2888,6 +2959,8 @@ sub edit_tax {
 sub list_tax {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->taxes(\%myconfig, \%$form);
 
   map { $_->{rate} = $form->format_amount(\%myconfig, $_->{rate}, 2) } @{ $form->{TAX} };
@@ -2907,6 +2980,8 @@ sub list_tax {
 sub _get_taxaccount_selection{
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->get_tax_accounts(\%myconfig, \%$form);
 
   map { $_->{selected} = $form->{chart_id} == $_->{id} } @{ $form->{ACCOUNTS} };
@@ -2917,6 +2992,8 @@ sub _get_taxaccount_selection{
 sub save_tax {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->isblank("rate", $locale->text('Taxrate missing!'));
   $form->isblank("taxdescription", $locale->text('Taxdescription  missing!'));
   $form->isblank("taxkey", $locale->text('Taxkey  missing!'));
@@ -2940,6 +3017,8 @@ sub save_tax {
 sub delete_tax {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->delete_tax(\%myconfig, \%$form);
   $form->redirect($locale->text('Tax deleted!'));
 
@@ -2949,6 +3028,8 @@ sub delete_tax {
 sub add_price_factor {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title}      = $locale->text('Add Price Factor');
   $form->{callback} ||= build_std_url('action=add_price_factor');
   $form->{fokus}      = 'description';
@@ -2962,6 +3043,8 @@ sub add_price_factor {
 sub edit_price_factor {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title}      = $locale->text('Edit Price Factor');
   $form->{callback} ||= build_std_url('action=add_price_factor');
   $form->{fokus}      = 'description';
@@ -2979,6 +3062,8 @@ sub edit_price_factor {
 sub list_price_factors {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->get_all_price_factors(\%myconfig, \%$form);
 
   my $previous;
@@ -3006,6 +3091,8 @@ sub list_price_factors {
 sub save_price_factor {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->isblank("description", $locale->text('Description missing!'));
   $form->isblank("factor", $locale->text('Factor missing!'));
 
@@ -3023,6 +3110,8 @@ sub save_price_factor {
 sub delete_price_factor {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->delete_price_factor(\%myconfig, \%$form);
 
   $form->{callback} .= '&MESSAGE=' . $form->escape($locale->text('Price factor deleted!')) if ($form->{callback});
@@ -3035,6 +3124,8 @@ sub delete_price_factor {
 sub swap_price_factors {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   AM->swap_sortkeys(\%myconfig, $form, 'price_factors');
   list_price_factors();
 
index 72e6500..1ef16c1 100644 (file)
@@ -57,6 +57,8 @@ sub edit {
 sub display_template {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{edit} = 0;
   display_template_form();
 
@@ -66,6 +68,8 @@ sub display_template {
 sub edit_template {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{edit} = 1;
   display_template_form();
 
@@ -75,6 +79,8 @@ sub edit_template {
 sub save_template {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->isblank("formname", $locale->text("You're not editing a file.")) unless ($form->{type} eq "stylesheet");
 
   my ($filename) = AM->prepare_template_filename(\%myconfig, $form);
@@ -91,6 +97,8 @@ sub save_template {
 sub display_template_form {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{"formname"} =~ s|.*/||;
   my $format = $form->{"format"} eq "html" ? "html" : "tex";
 
@@ -98,7 +106,7 @@ sub display_template_form {
 
   my %options;
 
-  my @hidden = qw(login password type format);
+  my @hidden = qw(type format);
 
   if (($form->{"type"} ne "stylesheet") && !$form->{"edit"}) {
     $options{"SHOW_EDIT_OPTIONS"} = 1;
index 627cbee..7b06ed7 100644 (file)
@@ -79,13 +79,13 @@ require "bin/mozilla/reportgenerator.pl";
 sub add {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   return $lxdebug->leave_sub() if (load_draft_maybe());
 
   $form->{title} = "Add";
 
-  $form->{callback} =
-    "$form->{script}?action=add&login=$form->{login}&password=$form->{password}"
-    unless $form->{callback};
+  $form->{callback} = "ap.pl?action=add" unless $form->{callback};
 
   AP->get_transdate(\%myconfig, $form);
   $form->{initial_transdate} = $form->{transdate};
@@ -99,6 +99,8 @@ sub add {
 sub edit {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $form->{title} = "Edit";
 
   &create_links;
@@ -110,6 +112,8 @@ sub edit {
 sub display_form {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   &form_header;
   &form_footer;
 
@@ -119,6 +123,8 @@ sub display_form {
 sub create_links {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $form->create_links("AP", \%myconfig, "vendor");
   $taxincluded = $form->{taxincluded};
   $duedate     = $form->{duedate};
@@ -174,6 +180,8 @@ sub create_links {
 sub form_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $title = $form->{title};
   $form->{title} = $locale->text("$title Accounts Payables Transaction");
 
@@ -743,13 +751,12 @@ $jsscript
 sub form_footer {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   print qq|
 
 <input name=callback type=hidden value="$form->{callback}">
 <input name="gldate" type="hidden" value="| . Q($form->{gldate}) . qq|">
-
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
 |
 . $cgi->hidden('-name' => 'draft_id', '-default' => [$form->{draft_id}])
 . $cgi->hidden('-name' => 'draft_description', '-default' => [$form->{draft_description}])
@@ -813,13 +820,19 @@ sub form_footer {
 
 sub mark_as_paid {
   $lxdebug->enter_sub();
+
+  $auth->assert('general_ledger');
+
   &mark_as_paid_common(\%myconfig,"ap");  
+
   $lxdebug->leave_sub();
 }
 
 sub update {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   my $display = shift;
 
   $form->{invtotal} = 0;
@@ -911,6 +924,8 @@ sub update {
 sub post_payment {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
 
   for $i (1 .. $form->{paidaccounts}) {
@@ -945,6 +960,8 @@ sub post_payment {
 sub post {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   # check if there is a vendor, invoice and due date
   $form->isblank("transdate", $locale->text("Invoice Date missing!"));
   $form->isblank("duedate",   $locale->text("Due Date missing!"));
@@ -1022,6 +1039,8 @@ sub post {
 sub post_as_new {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $form->{postasnew} = 1;
   # saving the history
   if(!exists $form->{addition} && $form->{id} ne "") {
@@ -1038,6 +1057,8 @@ sub post_as_new {
 sub use_as_template {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   map { delete $form->{$_} } qw(printed emailed queued invnumber invdate deliverydate id datepaid_1 source_1 memo_1 paid_1 exchangerate_1 AP_paid_1 storno);
   $form->{paidaccounts} = 1;
   $form->{rowcount}--;
@@ -1050,6 +1071,8 @@ sub use_as_template {
 sub delete {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $form->{title} = $locale->text('Confirm!');
 
   $form->header;
@@ -1063,6 +1086,7 @@ sub delete {
 |;
 
   foreach $key (keys %$form) {
+    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
     $form->{$key} =~ s/\"/&quot;/g;
     print qq|<input type=hidden name=$key value="$form->{$key}">\n|;
   }
@@ -1087,6 +1111,9 @@ sub delete {
 
 sub yes {
   $lxdebug->enter_sub();
+
+  $auth->assert('general_ledger');
+
   if (AP->delete_transaction(\%myconfig, \%$form, $spool)) {
     # saving the history
     if(!exists $form->{addition}) {
@@ -1105,6 +1132,8 @@ sub yes {
 sub search {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger | vendor_invoice_edit');
+
   # setup vendor selection
   $form->all_vc(\%myconfig, "vendor", "AP");
 
@@ -1297,8 +1326,6 @@ $jsscript
 
 <br>
 <input type=hidden name=nextsub value=$form->{nextsub}>
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
 
 <input class=submit type=submit name=action value="|
     . $locale->text('Continue') . qq|">
@@ -1332,6 +1359,8 @@ sub create_subtotal_row {
 sub ap_transactions {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger | vendor_invoice_edit');
+
   ($form->{vendor}, $form->{vendor_id}) = split(/--/, $form->{vendor});
 
   $form->{sort} ||= 'transdate';
@@ -1491,6 +1520,8 @@ sub ap_transactions {
 sub storno {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   if (IS->has_storno(\%myconfig, $form, 'ap')) {
     $form->{title} = $locale->text("Cancel Accounts Payables Transaction");
     $form->error($locale->text("Transaction has already been cancelled!"));
index 11a12e4..ae15aed 100644 (file)
@@ -84,6 +84,8 @@ require "bin/mozilla/reportgenerator.pl";
 sub add {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   return $lxdebug->leave_sub() if (load_draft_maybe());
 
   # saving the history
@@ -95,9 +97,7 @@ sub add {
   # /saving the history 
   
   $form->{title}    = "Add";
-  $form->{callback} =
-    "$form->{script}?action=add&login=$form->{login}&password=$form->{password}"
-    unless $form->{callback};
+  $form->{callback} = "ar.pl?action=add" unless $form->{callback};
 
   AR->get_transdate(\%myconfig, $form);
   $form->{initial_transdate} = $form->{transdate};
@@ -109,6 +109,9 @@ sub add {
 
 sub edit {
   $lxdebug->enter_sub();
+
+  $auth->assert('general_ledger');
+
   # show history button
   $form->{javascript} = qq|<script type="text/javascript" src="js/show_history.js"></script>|;
   #/show hhistory button
@@ -124,6 +127,8 @@ sub edit {
 sub display_form {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   &form_header;
   &form_footer;
 
@@ -133,6 +138,8 @@ sub display_form {
 sub create_links {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   my ($duedate, $taxincluded, @curr);
 
   $form->create_links("AR", \%myconfig, "customer");
@@ -200,6 +207,8 @@ sub create_links {
 sub form_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   my ($title, $readonly, $exchangerate, $rows);
   my ($taxincluded, $notes, $department, $customer, $employee, $amount, $project);
   my ($jsscript, $button1, $button2, $onload);
@@ -787,6 +796,8 @@ $jsscript
 sub form_footer {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   my ($transdate, $closedto);
 
   print qq|
@@ -794,9 +805,6 @@ sub form_footer {
 <input name=gldate type=hidden value="| . Q($form->{gldate}) . qq|">
 
 <input name=callback type=hidden value="$form->{callback}">
-
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
 |
 . $cgi->hidden('-name' => 'draft_id', '-default' => [$form->{draft_id}])
 . $cgi->hidden('-name' => 'draft_description', '-default' => [$form->{draft_description}])
@@ -871,13 +879,19 @@ sub form_footer {
 
 sub mark_as_paid {
   $lxdebug->enter_sub();
+
+  $auth->assert('general_ledger');
+
   &mark_as_paid_common(\%myconfig,"ar");  
+
   $lxdebug->leave_sub();
 }
 
 sub update {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   my $display = shift;
 
   my ($totaltax, $exchangerate, $totalpaid);
@@ -973,6 +987,8 @@ sub update {
 sub post_payment {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
 
   for my $i (1 .. $form->{paidaccounts}) {
@@ -1000,6 +1016,9 @@ sub post_payment {
 }
 
 sub _post {
+
+  $auth->assert('general_ledger');
+
   # inline post
   post(1);
 }
@@ -1007,6 +1026,8 @@ sub _post {
 sub post {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   my ($inline) = @_;
 
   my ($datepaid);
@@ -1075,6 +1096,8 @@ sub post {
 sub post_as_new {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $form->{postasnew} = 1;
   # saving the history
   if(!exists $form->{addition} && $form->{id} ne "") {
@@ -1091,6 +1114,8 @@ sub post_as_new {
 sub use_as_template {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   map { delete $form->{$_} } qw(printed emailed queued invnumber invdate deliverydate id datepaid_1 source_1 memo_1 paid_1 exchangerate_1 AP_paid_1 storno);
   $form->{paidaccounts} = 1;
   $form->{rowcount}--;
@@ -1103,6 +1128,8 @@ sub use_as_template {
 sub delete {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $form->{title} = $locale->text('Confirm!');
 
   $form->header;
@@ -1116,6 +1143,7 @@ sub delete {
 |;
 
   foreach my $key (keys %$form) {
+    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
     $form->{$key} =~ s/\"/&quot;/g;
     print qq|<input type=hidden name=$key value="$form->{$key}">\n|;
   }
@@ -1140,6 +1168,9 @@ sub delete {
 
 sub yes {
   $lxdebug->enter_sub();
+
+  $auth->assert('general_ledger');
+
   if (AR->delete_transaction(\%myconfig, \%$form)) {
     # saving the history
     if(!exists $form->{addition}) {
@@ -1158,6 +1189,8 @@ sub yes {
 sub search {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger | invoice_edit');
+
   my ($customer, $department);
   my ($jsscript, $button1, $button2, $onload);
 
@@ -1367,9 +1400,6 @@ sub search {
 
 <input type=hidden name=nextsub value=$form->{nextsub}>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <br>
 <input class=submit type=submit name=action value="|
     . $locale->text('Continue') . qq|">
@@ -1407,6 +1437,8 @@ sub create_subtotal_row {
 sub ar_transactions {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger | invoice_edit');
+
   my ($callback, $href, @columns);
 
   $form->{customer} = $form->unescape($form->{customer});
@@ -1583,6 +1615,8 @@ sub ar_transactions {
 sub storno {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   # don't cancel cancelled transactions
   if (IS->has_storno(\%myconfig, $form, 'ar')) {
     $form->{title} = $locale->text("Cancel Accounts Receivables Transaction");
index 7952922..38308a9 100644 (file)
@@ -47,6 +47,9 @@ require "bin/mozilla/common.pl";
 sub check_name {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger         | vendor_invoice_edit       | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit | sales_quotation_edit      | purchase_order_edit | cash');
+
   my ($name) = @_;
 
   $name = $name eq "customer" ? "customer" : "vendor";
@@ -125,6 +128,9 @@ sub check_name {
 sub select_name {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger         | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit | sales_quotation_edit | purchase_order_edit | cash');
+
   my ($table) = @_;
 
   @column_index = qw(ndx name address);
@@ -208,6 +214,7 @@ sub select_name {
 
   # save all other form variables
   foreach $key (keys %${form}) {
+    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
     $form->{$key} =~ s/\"/&quot;/g;
     print qq|<input name=$key type=hidden value="$form->{$key}">\n|;
   }
@@ -231,6 +238,9 @@ sub select_name {
 sub name_selected {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger         | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit | sales_quotation_edit | purchase_order_edit | cash');
+
   # replace the variable with the one checked
 
   # index for new item
@@ -256,28 +266,12 @@ sub name_selected {
   $lxdebug->leave_sub();
 }
 
-sub add_transaction {
-  $lxdebug->enter_sub();
-
-  my ($module) = @_;
-
-  delete $form->{script};
-  $form->{action} = "add";
-  $form->{type}   = "invoice" if $module =~ /(is|ir)/;
-
-  $form->{callback} = $form->escape($form->{callback}, 1);
-  map { $argv .= "$_=$form->{$_}&" } keys %$form;
-
-  $form->{callback} = "$module.pl?$argv";
-
-  $form->redirect;
-
-  $lxdebug->leave_sub();
-}
-
 sub check_project {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger         | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit | sales_quotation_edit | purchase_order_edit | cash         | report');
+
   for $i (1 .. $form->{rowcount}) {
     my $suffix = $i ? "_$i" : "";
     my $prefix = $i ? "" : "global";
@@ -296,12 +290,9 @@ sub check_project {
         }
 
         if ($rows == 1) {
-          $form->{"${prefix}project_id${suffix}"} =
-            $form->{project_list}->[0]->{id};
-          $form->{"${prefix}projectnumber${suffix}"} =
-            $form->{project_list}->[0]->{projectnumber};
-          $form->{"old${prefix}projectnumber${suffix}"} =
-            $form->{project_list}->[0]->{projectnumber};
+          $form->{"${prefix}project_id${suffix}"}       = $form->{project_list}->[0]->{id};
+          $form->{"${prefix}projectnumber${suffix}"}    = $form->{project_list}->[0]->{projectnumber};
+          $form->{"old${prefix}projectnumber${suffix}"} = $form->{project_list}->[0]->{projectnumber};
         } else {
 
           # not on file
@@ -319,6 +310,9 @@ sub check_project {
 sub select_project {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger         | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit | sales_quotation_edit | purchase_order_edit | cash         | report');
+
   my ($is_global) = @_;
 
   @column_index = qw(ndx projectnumber description);
@@ -402,6 +396,7 @@ sub select_project {
 
   # save all other form variables
   foreach $key (keys %${form}) {
+    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
     $form->{$key} =~ s/\"/&quot;/g;
     print qq|<input name=$key type=hidden value="$form->{$key}">\n|;
   }
@@ -425,6 +420,9 @@ sub select_project {
 sub project_selected {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger         | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit | sales_quotation_edit | purchase_order_edit | cash         | report');
+
   # replace the variable with the one checked
 
   # index for new item
@@ -456,9 +454,4 @@ sub project_selected {
 }
 
 sub continue       { call_sub($form->{"nextsub"}); }
-sub gl_transaction { &add }
-sub ar_transaction { &add_transaction('ar') }
-sub ap_transaction { &add_transaction('ap') }
-sub sales_invoice  { &add_transaction('is') }
-sub vendor_invoice { &add_transaction('ir') }
 
index 846aba1..8054af5 100644 (file)
@@ -40,9 +40,38 @@ require "bin/mozilla/common.pl";
 
 # end of main
 
+sub assert_bp_access {
+  my %access_map = (
+    'invoice'           => 'invoice_edit',
+    'sales_order'       => 'sales_order_edit',
+    'sales_quotation'   => 'sales_quotation_edit',
+    'purchase_order'    => 'purchase_order_edit',
+    'request_quotation' => 'request_quotation_edit',
+    'check'             => 'cash',
+    'receipt'           => 'cash',
+  );
+
+  if ($form->{type} && $access_map{$form->{type}}) {
+    $auth->assert($access_map{$form->{type}});
+
+  } elsif ($form->{type} eq 'packing_list') {
+    $lxdebug->message(0, "1");
+    if (!$auth->assert('sales_order_edit', 1)) {
+    $lxdebug->message(0, "2");
+      $auth->assert('invoice_edit') ;
+    }
+    $lxdebug->message(0, "3");
+
+  } else {
+    $auth->assert('DOES_NOT_EXIST');
+  }
+}
+
 sub search {
   $lxdebug->enter_sub();
 
+  assert_bp_access();
+
   # $locale->text('Sales Invoices')
   # $locale->text('Packing Lists')
   # $locale->text('Sales Orders')
@@ -190,7 +219,7 @@ sub search {
   print qq|
 <body onLoad="$onload">
 
-<form method=post action=$form->{script}>
+<form method=post action=bp.pl>
 
 <input type=hidden name=vc value=$form->{vc}>
 <input type=hidden name=type value=$form->{type}>
@@ -229,9 +258,6 @@ sub search {
 
 <input type=hidden name=nextsub value=list_spool>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <br>
 <input class=submit type=submit name=action value="|
     . $locale->text('Continue') . qq|">
@@ -251,6 +277,8 @@ $jsscript
 sub remove {
   $lxdebug->enter_sub();
 
+  assert_bp_access();
+
   $selected = 0;
 
   for $i (1 .. $form->{rowcount}) {
@@ -269,12 +297,13 @@ sub remove {
   print qq|
 <body>
 
-<form method=post action=$form->{script}>
+<form method=post action=bp.pl>
 |;
 
   map { delete $form->{$_} } qw(action header);
 
   foreach $key (keys %$form) {
+    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
     print qq|<input type=hidden name=$key value="$form->{$key}">\n|;
   }
 
@@ -300,6 +329,8 @@ sub remove {
 sub yes {
   $lxdebug->enter_sub();
 
+  assert_bp_access();
+
   $form->info($locale->text('Removing marked entries from queue ...'));
   $form->{callback} .= "&header=1" if $form->{callback};
 
@@ -313,6 +344,8 @@ sub yes {
 sub print {
   $lxdebug->enter_sub();
 
+  assert_bp_access();
+
   $form->get_lists(printers => 'ALL_PRINTERS');
   # use the command stored in the databse or fall back to $myconfig{printer}
   my $selected_printer = (grep { $_->{id} eq $form->{printer} } @{ $form->{ALL_PRINTERS} })[0]->{'printer_command'} || $myconfig{printer};
@@ -343,6 +376,8 @@ sub print {
 sub list_spool {
   $lxdebug->enter_sub();
 
+  assert_bp_access();
+
   $form->{ $form->{vc} } = $form->unescape($form->{ $form->{vc} });
   ($form->{ $form->{vc} }, $form->{"$form->{vc}_id"}) =
     split(/--/, $form->{ $form->{vc} });
@@ -350,12 +385,11 @@ sub list_spool {
   BP->get_spoolfiles(\%myconfig, \%$form);
 
   $title = $form->escape($form->{title});
-  $href  =
-    "$form->{script}?action=list_spool&login=$form->{login}&password=$form->{password}&vc=$form->{vc}&type=$form->{type}&title=$title";
+  $href  = "bp.pl?action=list_spool&vc=$form->{vc}&type=$form->{type}&title=$title";
 
   $title = $form->escape($form->{title}, 1);
   $callback =
-    "$form->{script}?action=list_spool&login=$form->{login}&password=$form->{password}&vc=$form->{vc}&type=$form->{type}&title=$title";
+    "bp.pl?action=list_spool&vc=$form->{vc}&type=$form->{type}&title=$title";
 
   if ($form->{ $form->{vc} }) {
     $callback .= "&$form->{vc}=" . $form->escape($form->{ $form->{vc} }, 1);
@@ -454,7 +488,7 @@ sub list_spool {
   print qq|
 <body>
 
-<form method=post action=$form->{script}>
+<form method=post action=bp.pl>
 
 <table width=100%>
   <tr>
@@ -505,11 +539,11 @@ sub list_spool {
     }
 
     $column_data{invnumber} =
-      "<td><a href=$module?action=edit&id=$ref->{id}&login=$form->{login}&password=$form->{password}&type=$form->{type}&callback=$callback>$ref->{invnumber}</a></td>";
+      "<td><a href=$module?action=edit&id=$ref->{id}&type=$form->{type}&callback=$callback>$ref->{invnumber}</a></td>";
     $column_data{ordnumber} =
-      "<td><a href=$module?action=edit&id=$ref->{id}&login=$form->{login}&password=$form->{password}&type=$form->{type}&callback=$callback>$ref->{ordnumber}</a></td>";
+      "<td><a href=$module?action=edit&id=$ref->{id}&type=$form->{type}&callback=$callback>$ref->{ordnumber}</a></td>";
     $column_data{quonumber} =
-      "<td><a href=$module?action=edit&id=$ref->{id}&login=$form->{login}&password=$form->{password}&type=$form->{type}&callback=$callback>$ref->{quonumber}</a></td>";
+      "<td><a href=$module?action=edit&id=$ref->{id}&type=$form->{type}&callback=$callback>$ref->{quonumber}</a></td>";
     $column_data{name}      = "<td>$ref->{name}</td>";
     $column_data{spoolfile} =
       qq|<td><a href=$spool/$ref->{spoolfile}>$ref->{spoolfile}</a></td>
@@ -553,9 +587,6 @@ sub list_spool {
 <input type=hidden name=sort value="$form->{sort}">
 
 <input type=hidden name=account value="$form->{account}">
-
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
 |;
 
 #  if ($myconfig{printer}) {
@@ -595,6 +626,8 @@ print qq|</select>|;
 sub select_all {
   $lxdebug->enter_sub();
 
+  assert_bp_access();
+
   map { $form->{"checked_$_"} = 1 } (1 .. $form->{rowcount});
   &list_spool;
 
index 229e430..a4de231 100644 (file)
@@ -74,6 +74,8 @@ require "bin/mozilla/reportgenerator.pl";
 sub chart_of_accounts {
   $lxdebug->enter_sub();
 
+  $auth->assert('report');
+
   $form->{title} = $locale->text('Chart of Accounts');
 
   CA->all_accounts(\%myconfig, \%$form);
@@ -136,6 +138,8 @@ sub chart_of_accounts {
 sub list {
   $lxdebug->enter_sub();
 
+  $auth->assert('report');
+
   $form->{title} = $locale->text('List Transactions');
   $form->{title} .= " - " . $locale->text('Account') . " $form->{accno}";
 
@@ -197,9 +201,6 @@ sub list {
   <tr><td><hr size=3 noshade></td></tr>
 </table>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <br><input class=submit type=submit name=action value="|
     . $locale->text('List Transactions') . qq|">
 </form>
@@ -214,6 +215,8 @@ sub list {
 sub list_transactions {
   $lxdebug->enter_sub();
 
+  $auth->assert('report');
+
   $form->{title} = $locale->text('Account') . " $form->{accno} - $form->{description}";
 
   CA->all_transactions(\%myconfig, \%$form);
index bcdb599..e2bc13f 100644 (file)
@@ -9,8 +9,9 @@
 #
 ######################################################################
 
-use SL::Form;
 use SL::Common;
+use SL::DBUtils;
+use SL::Form;
 use SL::MoreCommon;
 
 sub build_std_url {
@@ -20,7 +21,7 @@ sub build_std_url {
 
   my @parts;
 
-  foreach my $key ((qw(login password), @_)) {
+  foreach my $key (@_) {
     next unless ($key);
 
     if ($key =~ /(.*?)=(.*)/) {
@@ -31,7 +32,9 @@ sub build_std_url {
       }
 
     } else {
-      push @parts, "${key}=" . E($form->{$key});
+      foreach my $var ($form->flatten_variables($key)) {
+        push @parts, E($var->{key}) . '=' . E($var->{value});
+      }
     }
   }
 
@@ -42,43 +45,7 @@ sub build_std_url {
   return $url;
 }
 
-sub select_employee {
-  $lxdebug->enter_sub();
-
-  my ($callback_sub, @employees) = @_;
-
-  if (0 == scalar(@employees)) {
-    @employees = SystemBrace->get_all_employees(\%myconfig, $form);
-  }
-
-  my $old_form = save_form();
-
-  $form->header();
-  print($form->parse_html_template("generic/select_employee",
-                                   { "EMPLOYEES" => \@employees,
-                                     "old_form" => $old_form,
-                                     "title" => $locale->text("Select an employee"),
-                                     "nextsub" => "select_employee_internal",
-                                     "callback_sub" => $callback_sub }));
-
-  $lxdebug->leave_sub();
-}
-
-sub select_employee_internal {
-  $lxdebug->enter_sub();
-
-  my ($new_id, $new_name, $callback_sub);
-
-  my $new_id = $form->{"new_id_" . $form->{"selection"}};
-  my $new_name = $form->{"new_name_" . $form->{"selection"}};
-  my $callback_sub = $form->{"callback_sub"};
-
-  restore_form($form->{"old_form"});
-
-  call_sub($callback_sub, $new_id, $new_name);
-
-  $lxdebug->leave_sub();
-}
+# -------------------------------------------------------------------------
 
 ## Customers/Vendors
 
@@ -223,15 +190,15 @@ sub select_part {
   my $old_form = save_form();
 
   $form->header();
-  print($form->parse_html_template("generic/select_part",
-                                   { "PARTS" => \@parts,
-                                     "old_form" => $old_form,
-                                     "title" => $locale->text("Select a part"),
-                                     "nextsub" => "select_part_internal",
-                                     "callback_sub" => $callback_sub,
-                                     "has_charge" => $has_charge,
-                                     "remap_parts_id" => $remap_parts_id,
-                                     "remap_partnumber" => $remap_partnumber }));
+  print $form->parse_html_template("generic/select_part",
+                                   { "PARTS"            => \@parts,
+                                     "old_form"         => $old_form,
+                                     "title"            => $locale->text("Select a part"),
+                                     "nextsub"          => "select_part_internal",
+                                     "callback_sub"     => $callback_sub,
+                                     "has_charge"       => $has_charge,
+                                     "remap_parts_id"   => $remap_parts_id,
+                                     "remap_partnumber" => $remap_partnumber });
 
   $lxdebug->leave_sub();
 }
@@ -242,25 +209,27 @@ sub select_part_internal {
   my ($new_item, $callback_sub);
 
   my $re = "^new_.*_" . $form->{"selection"};
-  map({
-    my $key = $_;
-    $key =~ s/^new_//;
-    $key =~ s/_\d+$//;
-    $new_item->{$key} = $form->{$_};
-  } grep(/$re/, keys(%{$form})));
 
-  if ($form->{"remap_parts_id"}) {
-    $new_item->{"parts_id"} = $new_item->{"id"};
-    delete($new_item->{"id"});
+  foreach (grep /$re/, keys %{ $form }) {
+    my $new_key           =  $_;
+    $new_key              =~ s/^new_//;
+    $new_key              =~ s/_\d+$//;
+    $new_item->{$new_key} =  $form->{$_};
   }
-  if ($form->{"remap_partnumber"}) {
-    $new_item->{"partnumber"} = $new_item->{"number"};
-    delete($new_item->{"number"});
+
+  if ($form->{remap_parts_id}) {
+    $new_item->{parts_id} = $new_item->{id};
+    delete $new_item->{id};
   }
 
-  my $callback_sub = $form->{"callback_sub"};
+  if ($form->{remap_partnumber}) {
+    $new_item->{partnumber} = $new_item->{number};
+    delete $new_item->{number};
+  }
 
-  restore_form($form->{"old_form"});
+  my $callback_sub = $form->{callback_sub};
+
+  restore_form($form->{old_form});
 
   call_sub($callback_sub, $new_item);
 
@@ -270,11 +239,15 @@ sub select_part_internal {
 sub part_selection_internal {
   $lxdebug->enter_sub();
 
-  $order_by = "description";
-  $order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
+  $order_by  = "description";
+  $order_by  = $form->{"order_by"} if (defined($form->{"order_by"}));
   $order_dir = 1;
   $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
 
+  %options   = map { $_ => 1 } split m/:/, $form->{options};
+
+  map { $form->{$_} = 1 if ($options{$_}) } qw(no_services no_assemblies stockable);
+
   $parts = Common->retrieve_parts(\%myconfig, $form, $order_by, $order_dir);
   map({ $parts->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$parts}));
   if (0 == scalar(@{$parts})) {
@@ -285,7 +258,7 @@ sub part_selection_internal {
 
   my $callback = "$form->{script}?action=part_selection_internal&";
   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
-      (qw(login password partnumber description input_partnumber input_description input_partsid), grep({ /^[fl]_/ } keys %$form)));
+      (qw(partnumber description input_partnumber input_description input_partsid), grep({ /^[fl]_/ } keys %$form)));
 
   my @header_sort = qw(partnumber description);
   my %header_title = ( "partnumber" => $locale->text("Part Number"),
@@ -301,54 +274,226 @@ sub part_selection_internal {
 
   $form->{"title"} = $locale->text("Select a part");
   $form->header();
-  print($form->parse_html_template("generic/part_selection", { "HEADER" => \@header,
-                                                               "PARTS" => $parts,
-                                                               "onload" => $onload }));
+  print $form->parse_html_template("generic/part_selection", { "HEADER" => \@header,
+                                                               "PARTS"  => $parts,
+                                                               "onload" => $onload });
 
   $lxdebug->leave_sub();
 }
 
+# -------------------------------------------------------------------------
+
 sub project_selection_internal {
   $lxdebug->enter_sub();
 
-  $order_by = "description";
-  $order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
-  $order_dir = 1;
-  $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
+  $auth->check_right($form->{login}, 'project_edit');
 
-  $projects = Common->retrieve_projects(\%myconfig, $form, $order_by, $order_dir);
-  map({ $projects->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$projects}));
-  if (0 == scalar(@{$projects})) {
-    $form->show_generic_information($locale->text("No project was found matching the search parameters."));
-  } elsif (1 == scalar(@{$projects})) {
+  my %valid_order_by_fields = ('description' => 1, 'projectnumber' => 1);
+
+  $order_by  = "description";
+  $order_by  = $form->{order_by} if ($valid_order_by_fields{$form->{order_by}});
+  $order_dir = !defined $form->{order_dir} ? 1 : $form->{order_dir} ? 1 : 0;
+
+  $projects  = Common->retrieve_projects(\%myconfig, $form, $order_by, $order_dir);
+
+  if (1 == scalar @{ $projects }) {
     $onload = "project_selected('1')";
   }
 
-  my $callback = "$form->{script}?action=project_selection_internal&";
-  map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
-      (qw(login password projectnumber description input_projectnumber input_description input_project_id), grep({ /^[fl]_/ } keys %$form)));
+  my $callback = build_std_url('action=project_selection_internal', qw(projectnumber description input_projectnumber input_description input_project_id),
+                               grep { /^[fl]_/ } keys %{ $form });
 
-  my @header_sort = qw(projectnumber description);
+  my @header_sort  = qw(projectnumber description);
   my %header_title = ( "projectnumber" => $locale->text("Project Number"),
-                       "description" => $locale->text("Project description"),
+                       "description"   => $locale->text("Project description"),
                        );
 
   my @header =
     map(+{ "column_title" => $header_title{$_},
-           "column" => $_,
-           "callback" => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
+           "column"       => $_,
+           "callback"     => $callback . "&order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
          },
         @header_sort);
 
-  $form->{"title"} = $locale->text("Select a project");
+  $form->{title} = $locale->text("Select a project");
   $form->header();
-  print($form->parse_html_template("generic/project_selection", { "HEADER" => \@header,
+  print $form->parse_html_template("generic/project_selection", { "HEADER"   => \@header,
                                                                   "PROJECTS" => $projects,
-                                                                  "onload" => $onload }));
+                                                                  "onload"   => $onload });
+
+  $lxdebug->leave_sub();
+}
+
+sub new_project {
+  $lxdebug->enter_sub();
+
+  delete @{$form}{qw(action login password)};
+
+  my $callback = build_std_url('action=project_created', grep { '' eq ref $form->{$_} } keys %{ $form });
+
+  my $argv = "action=add&type=project&callback=" . E($callback);
+
+  exec("perl", "pe.pl", $argv);
+}
+
+sub project_created {
+  $lxdebug->enter_sub();
+
+  $form->{title} = $locale->text("Select a project");
+  $form->header();
+
+  my $args = {
+    'PROJECTS' => [ { map { $_ => $form->{"new_$_"} } qw(id projectnumber description) } ],
+    'HEADER'   => [],
+    'onload'   => "project_selected('1')",
+  };
+
+  print $form->parse_html_template("generic/project_selection", $args);
 
   $lxdebug->leave_sub();
 }
 
+sub project_selection_check {
+  $lxdebug->enter_sub();
+
+  my ($id_field, $number_field, $description_field, $project_selected_nextsub, $prefix) = @_;
+
+  $prefix = "f_" unless defined($prefix);
+
+  if (!$form->{"${prefix}${number_field}"} &&
+      (!$description_field || !$form->{"${prefix}${description_field}"})) {
+    delete $form->{"${prefix}${id_field}"};
+    delete $form->{"${prefix}old_${number_field}"};
+    delete $form->{"${prefix}old_${description_field}"} if ($description_field);
+
+    $lxdebug->leave_sub();
+    return 1;
+  }
+
+  if (($form->{"${prefix}${number_field}"}      eq $form->{"${prefix}old_${number_field}"}) &&
+      (!$description_field ||
+       (($form->{"${prefix}${description_field}"} eq $form->{"${prefix}old_${description_field}"})))) {
+    $lxdebug->leave_sub();
+    return 1;
+  }
+
+  my $old_form = save_form();
+
+  $form->{projectnumber} = $form->{"${prefix}${number_field}"};
+  $form->{full_search}   = 1;
+
+  if ($description_field) {
+    $form->{description} = $form->{"${prefix}${description_field}"};
+  } else {
+    delete $form->{description};
+  }
+
+  my $projects = Common->retrieve_projects(\%myconfig, $form, "projectnumber", 1);
+  restore_form($old_form);
+
+  if (0 == scalar @{$projects}) {
+    $form->error(sprintf($locale->text("There is no project whose project number matches '%s'."), $form->{"${prefix}${number_field}"}));
+
+    $lxdebug->leave_sub();
+    return 0;
+  }
+
+  if (1 != scalar(@{$projects})) {
+    $form->{project_selected_nextsub}        = $project_selected_nextsub;
+    $form->{check_project_id_field}          = $id_field;
+    $form->{check_project_number_field}      = $number_field;
+    $form->{check_project_description_field} = $description_field;
+
+    project_selection("project_selection_selected", $prefix, @{ $projects });
+
+    $lxdebug->leave_sub();
+    return 0;
+  }
+
+  $form->{"${prefix}${id_field}"}         = $projects->[0]->{id};
+  $form->{"${prefix}${number_field}"}     = $projects->[0]->{projectnumber};
+  $form->{"${prefix}old_${number_field}"} = $projects->[0]->{projectnumber};
+
+  if ($description_field) {
+    $form->{"${prefix}${description_field}"}     = $projects->[0]->{description};
+    $form->{"${prefix}old_${description_field}"} = $projects->[0]->{description};
+  }
+
+  $lxdebug->leave_sub();
+
+  return 1;
+}
+
+sub project_selection {
+  $lxdebug->enter_sub();
+
+  my ($callback_sub, $prefix, @projects) = @_;
+
+  if (0 == scalar @projects) {
+    my $old_form = save_form();
+    map { delete($form->{$_}); } qw(projectnumber description);
+
+    @projects = @{ Common->retrieve_projects(\%myconfig, $form, "projectnumber", 1) };
+
+    restore_form($old_form);
+  }
+
+  $form->header();
+  print $form->parse_html_template("generic/select_project",
+                                   { "PROJECTS"     => \@projects,
+                                     "old_form"     => save_form(qw(login password)),
+                                     "title"        => $locale->text("Select an project"),
+                                     "nextsub"      => "project_selection_step2",
+                                     "prefix"       => $prefix,
+                                     "callback_sub" => $callback_sub });
+
+  $lxdebug->leave_sub();
+}
+
+sub project_selection_step2 {
+  $lxdebug->enter_sub();
+
+  my ($new_id, $new_name, $callback_sub);
+
+  my $new_id          = $form->{"new_id_"          . $form->{selection}};
+  my $new_number      = $form->{"new_number_"      . $form->{selection}};
+  my $new_description = $form->{"new_description_" . $form->{selection}};
+  my $callback_sub    = $form->{callback_sub};
+  my $prefix          = $form->{prefix};
+
+  restore_form($form->{old_form}, 0, qw(login password));
+  delete $form->{header};
+
+  call_sub($callback_sub, $new_id, $new_number, $new_description, $prefix);
+
+  $lxdebug->leave_sub();
+}
+
+sub project_selection_selected {
+  $lxdebug->enter_sub();
+
+  my ($new_id, $new_number, $new_description, $prefix) = @_;
+
+  my ($id_field, $number_field, $description_field)    = ($form->{check_project_id_field}, $form->{check_project_number_field}, $form->{check_project_description_field});
+
+  map { delete $form->{"check_project_${_}_field"} } qw(id number description);
+
+  $form->{"${prefix}${id_field}"}         = $new_id;
+  $form->{"${prefix}${number_field}"}     = $new_number;
+  $form->{"${prefix}old_${number_field}"} = $new_number;
+
+  if ($description_field) {
+    $form->{"${prefix}${description_field}"}     = $new_description;
+    $form->{"${prefix}old_${description_field}"} = $new_description;
+  }
+
+  call_sub($form->{project_selected_nextsub});
+
+  $lxdebug->leave_sub();
+}
+
+# -------------------------------------------------------------------------
+
 sub employee_selection_internal {
   $lxdebug->enter_sub();
 
@@ -367,7 +512,7 @@ sub employee_selection_internal {
 
   my $callback = "$form->{script}?action=employee_selection_internal&";
   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
-      (qw(login password name input_name input_id), grep({ /^[fl]_/ } keys %$form)));
+      (qw(name input_name input_id), grep({ /^[fl]_/ } keys %$form)));
 
   my @header_sort = qw(name);
   my %header_title = ( "name" => $locale->text("Name"),
@@ -389,6 +534,8 @@ sub employee_selection_internal {
   $lxdebug->leave_sub();
 }
 
+# -------------------------------------------------------------------------
+
 sub delivery_customer_selection {
   $lxdebug->enter_sub();
 
@@ -407,7 +554,7 @@ sub delivery_customer_selection {
 
   my $callback = "$form->{script}?action=delivery_customer_selection&";
   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
-      (qw(login password name input_name input_id), grep({ /^[fl]_/ } keys %$form)));
+      (qw(name input_name input_id), grep({ /^[fl]_/ } keys %$form)));
 
   my @header_sort = qw(name customernumber address);
   my %header_title = ( "name" => $locale->text("Name"),
@@ -431,6 +578,8 @@ sub delivery_customer_selection {
   $lxdebug->leave_sub();
 }
 
+# -------------------------------------------------------------------------
+
 sub vendor_selection {
   $lxdebug->enter_sub();
 
@@ -449,7 +598,7 @@ sub vendor_selection {
 
   my $callback = "$form->{script}?action=vendor_selection&";
   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
-      (qw(login password name input_name input_id), grep({ /^[fl]_/ } keys %$form)));
+      (qw(name input_name input_id), grep({ /^[fl]_/ } keys %$form)));
 
   my @header_sort = qw(name customernumber address);
   my %header_title = ( "name" => $locale->text("Name"),
@@ -473,6 +622,8 @@ sub vendor_selection {
   $lxdebug->leave_sub();
 }
 
+# -------------------------------------------------------------------------
+
 sub calculate_qty {
   $lxdebug->enter_sub();
 
@@ -484,7 +635,7 @@ sub calculate_qty {
   my ($variable_string, $formel) = split /###/,$form->{formel};
 
 
-  split /;/, $variable_string;
+  split m/;/, $variable_string;
   foreach $item (@_) {
     my($name, $valueunit) = split /=/,$item;
     my($value, $unit) = split / /, $valueunit;
@@ -509,7 +660,7 @@ sub calculate_qty {
            "column" => $_,
          },
         @header_sort);
-  $form->{formel} = $formel; 
+  $form->{formel} = $formel;
   $form->{"title"} = $locale->text("Please enter values");
   $form->header();
   print($form->parse_html_template("generic/calculate_qty", { "HEADER"    => \@header,
@@ -519,6 +670,8 @@ sub calculate_qty {
   $lxdebug->leave_sub();
 }
 
+# -------------------------------------------------------------------------
+
 sub set_longdescription {
   $lxdebug->enter_sub();
 
@@ -529,6 +682,8 @@ sub set_longdescription {
   $lxdebug->leave_sub();
 }
 
+# -------------------------------------------------------------------------
+
 sub H {
   return $form->quote_html($_[0]);
 }
@@ -618,12 +773,14 @@ sub reformat_numbers {
   $lxdebug->leave_sub();
 }
 
+# -------------------------------------------------------------------------
+
 sub show_history {
        $lxdebug->enter_sub();
        my $dbh = $form->dbconnect(\%myconfig);
        my ($sort, $sortby) = split(/\-\-/, $form->{order});
   $sort =~ s/.*\.(.*)/$1/;
-  
+
        $form->{title} = $locale->text("History");
     $form->header();
     print $form->parse_html_template( "common/show_history", {
@@ -632,11 +789,13 @@ sub show_history {
       uc($sort) => 1,
       uc($sort)."BY" => $sortby
        } );
-       
+
        $dbh->disconnect();
-       $lxdebug->leave_sub();  
+       $lxdebug->leave_sub();
 }
 
+# -------------------------------------------------------------------------
+
 sub call_sub {
   $lxdebug->enter_sub();
 
@@ -657,6 +816,8 @@ sub call_sub {
   $lxdebug->leave_sub();
 }
 
+# -------------------------------------------------------------------------
+
 sub show_vc_details {
        $lxdebug->enter_sub();
 
@@ -676,9 +837,30 @@ sub show_vc_details {
        $lxdebug->leave_sub();
 }
 
+# -------------------------------------------------------------------------
+
+sub retrieve_partunits {
+  $lxdebug->enter_sub();
+
+  my @part_ids = grep { $_ } map { $form->{"id_${_}"} } (1..$form->{rowcount});
+
+  if (@part_ids) {
+    my %partunits = IO->retrieve_partunits('part_ids' => \@part_ids);
+
+    foreach my $i (1..$form->{rowcount}) {
+      next unless ($form->{"id_${i}"});
+      $form->{"partunit_${i}"} = $partunits{$form->{"id_${i}"}};
+    }
+  }
+
+  $lxdebug->leave_sub();
+}
+
+# -------------------------------------------------------------------------
+
 sub mark_as_paid_common {
   $lxdebug->enter_sub();
-  use SL::DBUtils;
+
   my ($myconfig, $db_name) = @_;
 
   if($form->{mark_as_paid}) {
@@ -687,21 +869,18 @@ sub mark_as_paid_common {
     do_query($form, $dbh, $query, $form->{id});
     $dbh->commit();
     $form->redirect($locale->text("Marked as paid"));
-}
-  else {
-    my $referer  =  $ENV{HTTP_REFERER};
-    my $login    =  $form->escape($form->{login});
-    my $password =  $form->escape($form->{password});
-    my $id       =  $form->escape($form->{id});
-    $referer     =~ s/^(.*)action\=.*\&(.*)$/$1action\=mark_as_paid\&mark_as_paid\=1\&login\=$login\&password\=$password\&id\=$id\&$2/;
+
+  } else {
+    my $referer = $ENV{HTTP_REFERER};
+    $referer =~ s/^(.*)action\=.*\&(.*)$/$1action\=mark_as_paid\&mark_as_paid\=1\&id\=$form->{id}\&$2/;
     $form->header();
     print qq|<body>|;
     print qq|<p><b>|.$locale->text('Mark as paid?').qq|</b></p>|;
     print qq|<input type="button" value="|.$locale->text('yes').qq|" onclick="document.location.href='|.$referer.qq|'">&nbsp;|;
     print qq|<input type="button" value="|.$locale->text('no').qq|" onclick="javascript:history.back();">|;
     print qq|</body></html>|;
-}
-  
+  }
+
   $lxdebug->leave_sub();
 }
 
index 5ced174..58c9a73 100644 (file)
@@ -42,7 +42,7 @@ use strict ("vars", "subs");
 require "bin/mozilla/arap.pl";
 require "bin/mozilla/common.pl";
 
-our ($form, %myconfig, $lxdebug, $locale);
+our ($form, %myconfig, $lxdebug, $locale, $auth);
 
 1;
 
@@ -51,6 +51,8 @@ our ($form, %myconfig, $lxdebug, $locale);
 sub payment {
   $lxdebug->enter_sub();
 
+  $auth->assert('cash');
+
   my (@curr);
 
   $form->{ARAP} = ($form->{type} eq 'receipt') ? "AR" : "AP";
@@ -114,6 +116,8 @@ sub payment {
 sub form_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('cash');
+
   my ($vc, $vclabel, $allvc, $arap, $department, $exchangerate);
   my ($jsscript, $button1, $button2, $onload);
 
@@ -218,7 +222,7 @@ sub form_header {
   print qq|
 <body onLoad="$onload">
 
-<form method=post action=$form->{script}>
+<form method=post action=cp.pl>
 
 <input type=hidden name=defaultcurrency value=$form->{defaultcurrency}>
 <input type=hidden name=closedto value=$form->{closedto}>
@@ -330,6 +334,8 @@ $jsscript
 sub list_invoices {
   $lxdebug->enter_sub();
 
+  $auth->assert('cash');
+
   my (@column_index, %column_data, $colspan, $invoice);
   my ($totalamount, $totaldue, $totalpaid);
 
@@ -449,6 +455,8 @@ sub list_invoices {
 sub form_footer {
   $lxdebug->enter_sub();
 
+  $auth->assert('cash');
+
   my ($media, $format, $latex_templates);
 
   $form->{DF}{ $form->{format} } = "selected";
@@ -478,9 +486,6 @@ sub form_footer {
 </table>
 <input type=hidden name=rowcount value=$form->{rowcount}>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <br>
 <input class=submit type=submit name=action value="|
     . $locale->text('Update') . qq|">
@@ -509,6 +514,8 @@ sub form_footer {
 sub update {
   $lxdebug->enter_sub();
 
+  $auth->assert('cash');
+
   my ($new_name_selected) = @_;
 
   my ($buysell, $newvc, $updated, $exchangerate, $amount);
@@ -656,6 +663,8 @@ sub update {
 sub post {
   $lxdebug->enter_sub();
 
+  $auth->assert('cash');
+
   &check_form;
 
   if ($form->{currency} ne $form->{defaultcurrency}) {
@@ -681,6 +690,8 @@ sub post {
 sub print {
   $lxdebug->enter_sub();
 
+  $auth->assert('cash');
+
   my ($whole, $check, %queued, $spool, $filename, $userspath);
 
   &check_form;
@@ -696,7 +707,11 @@ sub print {
   $check->init;
   $form->{text_amount} = $check->num2text($whole);
 
-  call_sub("$form->{vc}_details");
+  if ($form->{vc} eq 'customer') {
+    IS->customer_details(\%myconfig, $form);
+  } else {
+    IR->vendor_details(\%myconfig, $form);
+  }
 
   $form->{callback} = "";
 
@@ -739,8 +754,7 @@ sub print {
   $form->parse_template(\%myconfig, $userspath);
 
   if ($form->{media} ne 'screen') {
-    $form->{callback} =
-      "$form->{script}?action=payment&vc=$form->{vc}&login=$form->{login}&password=$form->{password}&all_vc=$form->{all_vc}";
+    $form->{callback} = "cp.pl?action=payment&vc=$form->{vc}&all_vc=$form->{all_vc}";
 
     $form->redirect if (CP->process_payment(\%myconfig, \%$form));
     $form->error($locale->text('Cannot post payment!'));
@@ -749,12 +763,11 @@ sub print {
   $lxdebug->leave_sub();
 }
 
-sub customer_details { IS->customer_details(\%myconfig, \%$form) }
-sub vendor_details { IR->vendor_details(\%myconfig, \%$form) }
-
 sub check_form {
   $lxdebug->enter_sub();
 
+  $auth->assert('cash');
+
   my ($closedto, $datepaid, $amount);
 
   &check_name($form->{vc});
index 9e5e188..673aa09 100644 (file)
@@ -54,10 +54,12 @@ require "bin/mozilla/reportgenerator.pl";
 sub add {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit');
+
   $form->{title} = "Add";
 
   $form->{callback} =
-    "$form->{script}?action=add&db=$form->{db}&login=$form->{login}&password=$form->{password}"
+    "$form->{script}?action=add&db=$form->{db}"
     unless $form->{callback};
 
   CT->populate_drop_down_boxes(\%myconfig, \%$form);
@@ -71,6 +73,8 @@ sub add {
 sub search {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit');
+
   $form->{IS_CUSTOMER} = $form->{db} eq 'customer';
 
   $form->get_lists("business_types" => "ALL_BUSINESS_TYPES");
@@ -88,6 +92,8 @@ sub search {
 sub list_names {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit');
+
   $form->{IS_CUSTOMER} = $form->{db} eq 'customer';
 
   CT->search(\%myconfig, \%$form);
@@ -208,6 +214,8 @@ sub list_names {
 sub edit {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit');
+
   # show history button
   $form->{javascript} = qq|<script type=text/javascript src=js/show_history.js></script>|;
   #/show hhistory button
@@ -235,6 +243,8 @@ sub edit {
 sub form_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit');
+
   $form->get_lists("employees" => "ALL_SALESMEN",
                    "taxzones"  => "ALL_TAXZONES");
   $form->get_pricegroup(\%myconfig, { all => 1 });
@@ -252,7 +262,7 @@ sub form_header {
   unshift @{ $form->{CONTACTS} }, +{ cp_id     => '0', cp_name => $locale->text('New contact') };
 
   push @{ $form->{AJAX} }, map { 
-    new CGI::Ajax( "get_$_" => "$form->{script}?login=$form->{login}&password=$form->{password}&action=get_$_" ) 
+    new CGI::Ajax( "get_$_" => "$form->{script}?action=get_$_" ) 
   } qw(shipto contact delivery);
 
   $form->{title} = $form->{title_save} 
@@ -272,6 +282,8 @@ sub form_header {
 sub form_footer {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit');
+
   print $form->parse_html_template('ct/form_footer', { is_orphaned => $form->{status} eq 'orphaned',
                                                        is_customer => $form->{db}     eq 'customer' });
   $lxdebug->leave_sub();
@@ -280,6 +292,8 @@ sub form_footer {
 sub add_transaction {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit & general_ledger');
+
 #  # saving the history
 #  if(!exists $form->{addition}) {
 #      $form->{addition} = "ADD TRANSACTION";
@@ -298,7 +312,7 @@ sub add_transaction {
   $name = $form->escape("$form->{name}", 1);
 
   $form->{callback} =
-    "$form->{script}?login=$form->{login}&password=$form->{password}&action=add&vc=$form->{db}&$form->{db}_id=$form->{id}&$form->{db}=$name&type=$form->{type}&callback=$form->{callback}";
+    "$form->{script}?action=add&vc=$form->{db}&$form->{db}_id=$form->{id}&$form->{db}=$name&type=$form->{type}&callback=$form->{callback}";
   $form->redirect;
 
   $lxdebug->leave_sub();
@@ -307,6 +321,8 @@ sub add_transaction {
 sub save_and_ap_transaction {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit & general_ledger');
+
   $form->{script} = "ap.pl";
   # saving the history
   if(!exists $form->{addition}) {
@@ -322,6 +338,8 @@ sub save_and_ap_transaction {
 sub save_and_ar_transaction {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit & general_ledger');
+
   $form->{script} = "ar.pl";
   # saving the history
   if(!exists $form->{addition}) {
@@ -337,6 +355,12 @@ sub save_and_ar_transaction {
 sub save_and_invoice {
   $lxdebug->enter_sub();
 
+  if ($form->{db} eq 'customer') {
+    $auth->assert('customer_vendor_edit & invoice_edit');
+  } else {
+    $auth->assert('customer_vendor_edit & vendor_invoice_edit');
+  }
+
   $form->{script} = ($form->{db} eq 'customer') ? "is.pl" : "ir.pl";
   $form->{type} = "invoice";
   # saving the history
@@ -353,6 +377,8 @@ sub save_and_invoice {
 sub save_and_rfq {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit & request_quotation_edit');
+
   $form->{script} = "oe.pl";
   $form->{type}   = "request_quotation";
   # saving the history
@@ -369,6 +395,8 @@ sub save_and_rfq {
 sub save_and_quotation {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit & sales_quotation_edit');
+
   $form->{script} = "oe.pl";
   $form->{type}   = "sales_quotation";
   # saving the history
@@ -385,6 +413,8 @@ sub save_and_quotation {
 sub save_and_order {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit & sales_order_edit');
+
   $form->{script} = "oe.pl";
   $form->{type}   =
     ($form->{db} eq 'customer') ? "sales_order" : "purchase_order";
@@ -402,6 +432,8 @@ sub save_and_order {
 sub save_and_close {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit');
+
   # $locale->text('Customer saved!')
   # $locale->text('Vendor saved!')
 
@@ -432,6 +464,8 @@ sub save_and_close {
 sub save {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit');
+
   # $locale->text('Customer saved!')
   # $locale->text('Vendor saved!')
 
@@ -469,6 +503,8 @@ sub save {
 sub delete {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit');
+
   # $locale->text('Customer deleted!')
   # $locale->text('Cannot delete customer!')
   # $locale->text('Vendor deleted!')
@@ -496,6 +532,8 @@ sub delete {
 sub display {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit');
+
   &form_header();
   &form_footer();
 
@@ -505,6 +543,8 @@ sub display {
 sub update {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit');
+
   &display();
   $lxdebug->leave_sub();
 }
@@ -512,6 +552,8 @@ sub update {
 sub get_contact {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit');
+
   CT->get_contact(\%myconfig, \%$form);
 
   my $q = new CGI;
@@ -526,6 +568,8 @@ sub get_contact {
 sub get_shipto {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit');
+
   CT->get_shipto(\%myconfig, \%$form);
 
   my $q = new CGI;
@@ -540,6 +584,8 @@ sub get_shipto {
 sub get_delivery {
   $lxdebug->enter_sub();
 
+  $auth->assert('customer_vendor_edit');
+
   CT->get_delivery(\%myconfig, \%$form );
 
   print CGI->new->header();
index 0639337..6d89a21 100644 (file)
@@ -42,6 +42,8 @@ sub continue { call_sub($form->{"nextsub"}); }
 sub export {
   $lxdebug->enter_sub();
 
+  $auth->assert('datev_export');
+
   $form->{title} = $locale->text("DATEX - Export Assistent");
 
   DATEV->get_datev_stamm(\%myconfig, \%$form);
@@ -113,9 +115,6 @@ sub export {
 
 <input type=hidden name=nextsub value=export2>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <br>
 <input type=submit class=submit name=action value="|
     . $locale->text('Continue') . qq|">
@@ -130,6 +129,8 @@ sub export {
 sub export2 {
   $lxdebug->enter_sub();
 
+  $auth->assert('datev_export');
+
   if ($form->{exporttype} == 0) {
     &export_bewegungsdaten();
   } else {
@@ -141,6 +142,8 @@ sub export2 {
 sub export_bewegungsdaten {
   $lxdebug->enter_sub();
 
+  $auth->assert('datev_export');
+
   $form->{title} = $locale->text("DATEX - Export Assistent");
 
   $form->{allemonate} =
@@ -247,9 +250,6 @@ sub export_bewegungsdaten {
 
 <input type=hidden name=nextsub value=export3>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <br>
 <input type=submit class=submit name=action value="|
     . $locale->text('Continue') . qq|">
@@ -265,6 +265,8 @@ sub export_bewegungsdaten {
 sub export_stammdaten {
   $lxdebug->enter_sub();
 
+  $auth->assert('datev_export');
+
   $form->{title} = $locale->text("DATEX - Export Assistent");
 
   $form->header;
@@ -312,9 +314,6 @@ sub export_stammdaten {
 
 <input type=hidden name=nextsub value=export3>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <br>
 <input type=submit class=submit name=action value="|
     . $locale->text('Continue') . qq|">
@@ -330,11 +329,11 @@ sub export_stammdaten {
 sub export3 {
   $lxdebug->enter_sub();
 
+  $auth->assert('datev_export');
+
   DATEV->save_datev_stamm(\%myconfig, \%$form);
 
-  my $link = $form->{"script"} . "?";
-  map({ $link .= "${_}=" . $form->escape($form->{$_}) . "&"; } qw(login password));
-  $link .= "action=download";
+  my $link = "datev.pl?action=download";
 
   if ($form->{kne}) {
     my @filenames = DATEV->kne_export(\%myconfig, \%$form);
@@ -364,6 +363,8 @@ sub export3 {
 sub download {
   $lxdebug->enter_sub();
 
+  $auth->assert('datev_export');
+
   my $tmp_name = Common->tmpname();
   my $zip_name = strftime("lx-office-datev-export-%Y%m%d.zip",
                           localtime(time()));
index c3e7966..338d86a 100644 (file)
@@ -41,13 +41,14 @@ use SL::ReportGenerator;
 require "bin/mozilla/common.pl";
 require "bin/mozilla/reportgenerator.pl";
 require "bin/mozilla/io.pl";
-require "bin/mozilla/arap.pl";
 
 1;
 
 sub edit_config {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   DN->get_config(\%myconfig, \%$form);
   $form->get_lists('charts' => { 'key'       => 'ALL_CHARTS',
                                  'transdate' => 'current_date' });
@@ -82,6 +83,8 @@ sub edit_config {
 sub add {
   $lxdebug->enter_sub();
 
+  $auth->assert('dunning_edit');
+
   # setup customer selection
   $form->all_vc(\%myconfig, "customer", "AR");
 
@@ -104,6 +107,8 @@ sub add {
 sub show_invoices {
   $lxdebug->enter_sub();
 
+  $auth->assert('dunning_edit');
+
   DN->get_invoices(\%myconfig, \%$form);
   $form->{title} = $locale->text('Start Dunning Process');
 
@@ -122,7 +127,7 @@ sub show_invoices {
   $form->{type}           = 'dunning';
   $form->{rowcount}       = scalar @{ $form->{DUNNINGS} };
   $form->{jsscript}       = 1;
-  $form->{callback}     ||= build_std_url("action=show_invoices", qw(login password customer invnumber ordnumber groupinvoices minamount dunning_level notes));
+  $form->{callback}     ||= build_std_url("action=show_invoices", qw(customer invnumber ordnumber groupinvoices minamount dunning_level notes));
 
   $form->{PRINT_OPTIONS}  = print_options('inline'          => 1,
                                           'no_queue'        => 1,
@@ -139,6 +144,8 @@ sub show_invoices {
 sub save {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   for my $i (1 .. $form->{rowcount}) {
     if ($form->{"dunning_description_$i"} ne "") {
       $form->isblank("dunning_level_$i", $locale->text('Dunning Level missing in row '). $i);
@@ -164,6 +171,8 @@ sub save {
 sub save_dunning {
   $lxdebug->enter_sub();
 
+  $auth->assert('dunning_edit');
+
   my $active=1;
   my @rows = ();
   undef($form->{DUNNING_PDFS});
@@ -231,6 +240,8 @@ sub save_dunning {
 sub set_email {
   $lxdebug->enter_sub();
 
+  $auth->assert('dunning_edit');
+
   $form->{"title"} = $locale->text("Set eMail text");
   $form->header();
   print($form->parse_html_template("dunning/set_email"));
@@ -241,6 +252,8 @@ sub set_email {
 sub search {
   $lxdebug->enter_sub();
 
+  $auth->assert('dunning_edit');
+
   $form->get_lists("customers"   => "ALL_CUSTOMERS",
                    "departments" => "ALL_DEPARTMENTS");
 
@@ -269,6 +282,8 @@ sub search {
 sub show_dunning {
   $lxdebug->enter_sub();
 
+  $auth->assert('dunning_edit');
+
   my @filter_field_list = qw(customer_id customer dunning_level department_id invnumber ordnumber
                              transdatefrom transdateto dunningfrom dunningto notes showold);
 
@@ -378,6 +393,8 @@ sub show_dunning {
 sub print_dunning {
   $lxdebug->enter_sub();
 
+  $auth->assert('dunning_edit');
+
   $form->{rowcount}     = 1;
   $form->{selected_1}   = 1;
   $form->{dunning_id_1} = $form->{dunning_id};
@@ -390,6 +407,8 @@ sub print_dunning {
 sub print_multiple {
   $lxdebug->enter_sub();
 
+  $auth->assert('dunning_edit');
+
   $form->{title} = $locale->text('Print dunnings');
 
   my @dunning_ids = map { $form->{"dunning_id_$_"} } grep { $form->{"selected_$_"} } (1..$form->{rowcount});
@@ -421,4 +440,8 @@ sub print_multiple {
   $lxdebug->leave_sub();
 }
 
+sub continue {
+  call_sub($form->{nextsub});
+}
+
 # end of main
index 79ff97d..36eb608 100644 (file)
@@ -20,7 +20,7 @@ sub save_draft {
     restore_form($form->{SAVED_FORM}, 1) if ($form->{SAVED_FORM});
     delete $form->{SAVED_FORM};
 
-    $form->{SAVED_FORM}   = save_form();
+    $form->{SAVED_FORM}   = save_form(qw(login password stylesheet));
     $form->{remove_draft} = 1;
 
     $form->header();
@@ -67,7 +67,7 @@ sub load_draft_maybe {
   $draft_nextsub = "add" unless ($draft_nextsub);
 
   delete $form->{action};
-  my $saved_form = save_form();
+  my $saved_form = save_form(qw(login password stylesheet));
 
   $form->header();
   print($form->parse_html_template("drafts/load",
index 5069cef..6c4b413 100644 (file)
@@ -38,7 +38,6 @@ use SL::IS;
 use SL::PE;
 use SL::ReportGenerator;
 
-require "bin/mozilla/arap.pl";
 require "bin/mozilla/common.pl";
 require "bin/mozilla/reportgenerator.pl";
 
@@ -77,11 +76,11 @@ require "bin/mozilla/reportgenerator.pl";
 sub add {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $form->{title} = "Add";
 
-  $form->{callback} =
-    "$form->{script}?action=add&login=$form->{login}&password=$form->{password}"
-    unless $form->{callback};
+  $form->{callback} = "gl.pl?action=add" unless $form->{callback};
 
   # we use this only to set a default date
   GL->transaction(\%myconfig, \%$form);
@@ -119,6 +118,8 @@ sub add {
 sub prepare_transaction {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   GL->transaction(\%myconfig, \%$form);
 
   map {
@@ -191,6 +192,8 @@ sub prepare_transaction {
 sub edit {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   prepare_transaction();
 
   $form->{title} = "Edit";
@@ -208,6 +211,8 @@ sub edit {
 sub search {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $form->{title} = $locale->text('Journal');
 
   $form->all_departments(\%myconfig);
@@ -281,7 +286,7 @@ sub search {
   print qq|
 <body onLoad="$onload">
 
-<form method=post action=$form->{script}>
+<form method=post action=gl.pl>
 
 <input type=hidden name=sort value=transdate>
 
@@ -382,9 +387,6 @@ $jsscript
 
 <input type=hidden name=nextsub value=generate_report>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <br>
 <input class=submit type=submit name=action value="|
     . $locale->text('Continue') . qq|">
@@ -415,6 +417,8 @@ sub create_subtotal_row {
 sub generate_report {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $form->{sort} ||= "transdate";
 
   GL->all_transactions(\%myconfig, \%$form);
@@ -639,6 +643,8 @@ sub generate_report {
 sub update {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $form->{oldtransdate} = $form->{transdate};
 
   my @a           = ();
@@ -745,6 +751,8 @@ sub display_form {
   my ($init) = @_;
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   &form_header($init);
 
   #   for $i (1 .. $form->{rowcount}) {
@@ -763,6 +771,8 @@ sub display_rows {
   my ($init) = @_;
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $form->{debit_1}     = 0 if !$form->{"debit_1"};
   $form->{totaldebit}  = 0;
   $form->{totalcredit} = 0;
@@ -955,6 +965,9 @@ sub display_rows {
 sub form_header {
   my ($init) = @_;
   $lxdebug->enter_sub();
+
+  $auth->assert('general_ledger');
+
   $title         = $form->{title};
   $form->{title} = $locale->text("$title General Ledger Transaction");
   $readonly      = ($form->{id}) ? "readonly" : "";
@@ -1055,7 +1068,7 @@ sub form_header {
   print qq|
 <body onLoad="fokus()">
 
-<form method=post name="gl" action=$form->{script}>
+<form method=post name="gl" action=gl.pl>
 |;
 
   $form->hide_form(qw(id closedto locked storno storno_id previous_id previous_gldate));
@@ -1189,6 +1202,9 @@ $jsscript
 
 sub form_footer {
   $lxdebug->enter_sub();
+
+  $auth->assert('general_ledger');
+
   ($dec) = ($form->{totaldebit} =~ /\.(\d+)/);
   $dec = length $dec;
   $decimalplaces = ($dec > 2) ? $dec : 2;
@@ -1210,9 +1226,6 @@ sub form_footer {
   </tr>
 </table>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <input name=callback type=hidden value="$form->{callback}">
 
 <br>
@@ -1260,7 +1273,7 @@ sub delete {
   print qq|
 <body>
 
-<form method=post action=$form->{script}>
+<form method=post action=gl.pl>
 |;
 
   map { $form->{$_} =~ s/\"/&quot;/g } qw(reference description);
@@ -1268,6 +1281,7 @@ sub delete {
   delete $form->{header};
 
   foreach $key (keys %$form) {
+    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
     print qq|<input type="hidden" name="$key" value="$form->{$key}">\n|;
   }
 
@@ -1464,6 +1478,8 @@ sub post_transaction {
 sub post {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $form->{title}  = $locale->text("$form->{title} General Ledger Transaction");
   $form->{storno} = 0;
 
@@ -1478,6 +1494,8 @@ sub post {
 sub post_as_new {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $form->{id} = 0;
   &add;
   $lxdebug->leave_sub();
@@ -1487,6 +1505,8 @@ sub post_as_new {
 sub storno {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   # don't cancel cancelled transactions
   if (IS->has_storno(\%myconfig, $form, 'gl')) {
     $form->{title} = $locale->text("Cancel Accounts Receivables Transaction");
@@ -1508,3 +1528,6 @@ sub storno {
   $lxdebug->leave_sub();
 }
 
+sub continue {
+  call_sub($form->{nextsub});
+}
index db33269..2922cfa 100644 (file)
@@ -65,10 +65,12 @@ require "bin/mozilla/reportgenerator.pl";
 sub add {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   $form->{title} = $locale->text('Add ' . ucfirst $form->{item});
 
   $form->{callback} =
-    "$form->{script}?action=add&item=$form->{item}&login=$form->{login}&password=$form->{password}"
+    "$form->{script}?action=add&item=$form->{item}"
     unless $form->{callback};
 
   $form->{"unit_changeable"} = 1;
@@ -83,6 +85,8 @@ sub add {
 sub search {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   # switch for backward sorting
   $form->{revers} = 0;
 
@@ -116,6 +120,8 @@ sub search {
 sub search_update_prices {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   my $pricegroups = IC->get_pricegroups(\%myconfig, \%$form);
 
   $form->header;
@@ -128,6 +134,8 @@ sub search_update_prices {
 sub confirm_price_update {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   $form->{nextsub} = "update_prices";
   $form->header;
 
@@ -141,6 +149,8 @@ sub confirm_price_update {
 sub update_prices {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   if (IC->update_prices(\%myconfig, \%$form)) {
     $form->redirect($form->{update_count} . $locale->text('prices updated!'));
   } else {
@@ -153,6 +163,8 @@ sub update_prices {
 sub choice {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   our ($j, $lastndx);
   my ($totop100);
 
@@ -160,7 +172,7 @@ sub choice {
 
   $form->header;
 
-  push @custom_hiddens, qw(login password searchitems title bom titel revers lastsort sort ndxs_counter extras);
+  push @custom_hiddens, qw(searchitems title bom titel revers lastsort sort ndxs_counter extras);
   push @custom_hiddens, qw(itemstatus l_linetotal l_partnumber l_description l_onhand l_unit l_sellprice l_linetotalsellprice);
   my @HIDDENS = (
         +{ name => 'row',     value => $j              },
@@ -222,6 +234,8 @@ sub choice {
 sub list {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   our ($lastndx);
   our ($partnumber, $description, $unit, $sellprice, $soldtotal);
 
@@ -282,9 +296,6 @@ sub list {
 <br>
 
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <input type=hidden name=itemstatus value="$form->{itemstatus}">
 <input type=hidden name=l_linetotal value="$form->{l_linetotal}">
 <input type=hidden name=l_partnumber value="$form->{l_partnumber}">
@@ -346,6 +357,8 @@ sub list {
 sub top100 {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   if ($form->{ndx}) {
     $form->{ndxs_counter}++;
 
@@ -367,6 +380,8 @@ sub top100 {
 sub addtop100 {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   my ($revers, $lastsort, $callback, $option, $description, $sameitem,
       $partnumber, $unit, $sellprice, $soldtotal, $totop100, $onhand, $align);
   my (@column_index, %column_header, %column_data);
@@ -396,7 +411,7 @@ sub addtop100 {
   }    #fi
 
   $callback =
-    "$form->{script}?action=top100&login=$form->{login}&password=$form->{password}&searchitems=$form->{searchitems}&itemstatus=$form->{itemstatus}&bom=$form->{bom}&l_linetotal=$form->{l_linetotal}&title="
+    "$form->{script}?action=top100&searchitems=$form->{searchitems}&itemstatus=$form->{itemstatus}&bom=$form->{bom}&l_linetotal=$form->{l_linetotal}&title="
     . $form->escape($form->{title}, 1);
 
   # if we have a serialnumber limit search
@@ -823,15 +838,15 @@ sub addtop100 {
 
     $column_data{invnumber} =
       ($ref->{module} ne 'oe')
-      ? "<td><a href=$ref->{module}.pl?action=edit&type=invoice&id=$ref->{trans_id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{invnumber}</a></td>"
+      ? "<td><a href=$ref->{module}.pl?action=edit&type=invoice&id=$ref->{trans_id}&callback=$callback>$ref->{invnumber}</a></td>"
       : "<td>$ref->{invnumber}</td>";
     $column_data{ordnumber} =
       ($ref->{module} eq 'oe')
-      ? "<td><a href=$ref->{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{ordnumber}</a></td>"
+      ? "<td><a href=$ref->{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&callback=$callback>$ref->{ordnumber}</a></td>"
       : "<td>$ref->{ordnumber}</td>";
     $column_data{quonumber} =
       ($ref->{module} eq 'oe' && !$ref->{ordnumber})
-      ? "<td><a href=$ref->{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{quonumber}</a></td>"
+      ? "<td><a href=$ref->{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&callback=$callback>$ref->{quonumber}</a></td>"
       : "<td>$ref->{quonumber}</td>";
 
     $column_data{name} = "<td>$ref->{name}</td>";
@@ -903,9 +918,6 @@ sub addtop100 {
 
 <form method=post action=$form->{script}>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <input type=hidden name=itemstatus value="$form->{itemstatus}">
 <input type=hidden name=l_linetotal value="$form->{l_linetotal}">
 <input type=hidden name=l_partnumber value="$form->{l_partnumber}">
@@ -964,11 +976,13 @@ sub addtop100 {
 #  l_partsgroup l_subtotal l_soldtotal l_deliverydate
 #
 # hiddens: 
-#  nextsub login password revers lastsort sort ndxs_counter
+#  nextsub revers lastsort sort ndxs_counter
 #
 sub generate_report {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   my ($revers, $lastsort, $description);
 
   $form->{title} = (ucfirst $form->{searchitems}) . "s";
@@ -1287,6 +1301,8 @@ sub generate_report {
 sub parts_subtotal {
   $lxdebug->enter_sub();
   
+  $auth->assert('part_service_assembly_edit');
+
   # imports
   our (%column_data, @column_index);
   our ($subtotalonhand, $totalsellprice, $totallastcost, $totallistprice, $subtotalsellprice, $subtotallastcost, $subtotallistprice);
@@ -1330,6 +1346,9 @@ sub parts_subtotal {
 
 sub edit {
   $lxdebug->enter_sub();
+
+  $auth->assert('part_service_assembly_edit');
+
   # show history button
   $form->{javascript} = qq|<script type="text/javascript" src="js/show_history.js"></script>|;
   #/show hhistory button
@@ -1348,6 +1367,8 @@ sub edit {
 sub link_part {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   IC->create_links("IC", \%myconfig, \%$form);
 
   # currencies
@@ -1437,6 +1458,8 @@ sub link_part {
 sub form_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   $form->{eur}              = $eur; # config dumps into namespace - yuck
   $form->{pg_keys}          = sub { "$_[0]->{partsgroup}--$_[0]->{id}" };
   $form->{description_area} = ($form->{rows} = $form->numtextrows($form->{description}, 40)) > 1;
@@ -1472,6 +1495,8 @@ sub form_header {
 sub form_footer {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   if ($form->{item} eq "assembly") {
 
     print qq|
@@ -1490,8 +1515,6 @@ sub form_footer {
   }
 
   print qq|
-      <input type=hidden name=login value=$form->{login}>
-      <input type=hidden name=password value=$form->{password}>
       <input type=hidden name=callback value="$form->{callback}">
       <input type=hidden name=previousform value="$form->{previousform}">
       <input type=hidden name=taxaccount2 value="$form->{taxaccount2}">
@@ -1730,7 +1753,7 @@ sub assembly_row {
 
       } else {
         $href =
-          qq|$form->{script}?action=edit&id=$form->{"id_$i"}&login=$form->{login}&password=$form->{password}&rowcount=$i&previousform=$previousform|;
+          qq|$form->{script}?action=edit&id=$form->{"id_$i"}&rowcount=$i&previousform=$previousform|;
         $column_data{partnumber} =
           qq|<td><input type=hidden name="partnumber_$i" value="$form->{"partnumber_$i"}"><a href=$href>$form->{"partnumber_$i"}</a></td>|;
         $column_data{runningnumber} =
@@ -1836,6 +1859,8 @@ sub update {
 sub save {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   my ($parts_id, %newform, $previousform, $amount, $callback);
 
   # check if there is a part number - commented out, cause there is an automatic allocation of numbers
@@ -1996,6 +2021,8 @@ sub save {
 sub save_as_new {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   # saving the history
   if(!exists $form->{addition}) {
     $form->{snumbers} = qq|partnumber_| . $form->{partnumber};
@@ -2014,6 +2041,9 @@ sub save_as_new {
 
 sub delete {
   $lxdebug->enter_sub();
+
+  $auth->assert('part_service_assembly_edit');
+
   # saving the history
   if(!exists $form->{addition}) {
     $form->{snumbers} = qq|partnumber_| . $form->{partnumber};
@@ -2033,6 +2063,8 @@ sub delete {
 sub price_row {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   my ($numrows) = @_;
 
   print qq|
@@ -2066,6 +2098,8 @@ sub price_row {
 sub parts_language_selection {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit');
+
   our ($onload);
 
   my $languages = IC->retrieve_languages(\%myconfig, $form);
index 6e1dfc6..71f3c01 100644 (file)
@@ -6,6 +6,8 @@ sub verify_installation {
 
   return unless ($form{"action"} && ($script eq "login.pl"));
 
+  SL::InstallationCheck::check_for_conditional_dependencies();
+
   my @missing_modules = SL::InstallationCheck::test_all_modules();
   return if (scalar(@missing_modules) == 0);
 
index 1286429..2299272 100644 (file)
@@ -596,7 +596,11 @@ sub set_pricegroup {
 sub display_form {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   relink_accounts();
+  retrieve_partunits() if ($form->{type} =~ /_delivery_order$/);
 
   my $new_rowcount = $form->{"rowcount"} * 1 + 1;
   $form->{"project_id_${new_rowcount}"} = $form->{"globalproject_id"};
@@ -657,8 +661,7 @@ sub display_form {
 
     &{$subroutine}($numrows);
 
-    $numrows    = ++$form->{makemodel_rows};
-    $subroutine = "makemodel_row";
+    $numrows    = 0;
   }
   if ($form->{item} eq 'assembly') {
     $numrows    = $form->{price_rows};
index 098c7b6..d17ea61 100644 (file)
 
 use CGI;
 use CGI::Ajax;
-use List::Util qw(max);
+use List::Util qw(max first);
 
 use SL::Common;
 use SL::CT;
 use SL::IC;
+use SL::IO;
 
 require "bin/mozilla/common.pl";
 
@@ -92,8 +93,16 @@ use Data::Dumper;
 ########################################
 sub display_row {
   $lxdebug->enter_sub();
+
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   my $numrows = shift;
 
+  my ($readonly, $stock_in_out, $stock_in_out_title);
+
+  my $is_purchase = (first { $_ eq $form->{type} } qw(request_quotation purchase_order)) || ($form->{script} eq 'ir.pl');
+
   # column_index
   my @header_sort = qw(runningnumber partnumber description ship qty unit sellprice_pg sellprice discount linetotal);
   my @HEADER = (
@@ -103,13 +112,14 @@ sub display_row {
     {  id => 'ship',          width => 5,     value => ($form->{type} eq 'purchase_order' ? $locale->text('Ship rcvd') : $locale->text('Ship')),                 
        display => $form->{type} =~ /sales_order/ || ($form->{type} =~ /purchase_order/ && !($lizenzen && $form->{vc} eq "customer")) , },
     {  id => 'qty',           width => 5,     value => $locale->text('Qty'),                  display => 1, },
+    {  id => 'price_factor',  width => 5,     value => $locale->text('Price Factor'),         display => 1, },
     {  id => 'unit',          width => 5,     value => $locale->text('Unit'),                 display => 1, },
     {  id => 'license',       width => 10,    value => $locale->text('License'),              display => 0, },
     {  id => 'serialnr',      width => 10,    value => $locale->text('Serial No.'),           display => 0, },
     {  id => 'projectnr',     width => 10,    value => $locale->text('Project'),              display => 0, },
     {  id => 'sellprice',     width => 15,    value => $locale->text('Price'),                display => 1, },
-    {  id => 'sellprice_pg',  width => 15,    value => $locale->text('Pricegroup'),           display => $form->{type} =~ /^sales_/,  },
-    {  id => 'discount',      width => 5,     value => $locale->text('Discount'),             display => $form->{vc} eq 'customer', },
+    {  id => 'sellprice_pg',  width => 15,    value => $locale->text('Pricegroup'),           display => ($form->{type} =~ /^sales_/),  },
+    {  id => 'discount',      width => 5,     value => $locale->text('Discount'),             display => ($form->{vc} eq 'customer'), },
     {  id => 'linetotal',     width => 10,    value => $locale->text('Extended'),             display => 1, },
     {  id => 'bin',           width => 10,    value => $locale->text('Bin'),                  display => 0, },
   ); 
@@ -182,21 +192,21 @@ sub display_row {
     $this_unit    = $form->{"selected_unit_$i"} if AM->convert_unit($this_unit, $form->{"selected_unit_$i"}, $all_units);
     $this_unit  ||= "kg";
 
-    my $price_factor_select;
     if (0 < scalar @{ $form->{ALL_PRICE_FACTORS} }) {
       my @values = ('', map { $_->{id}                      } @{ $form->{ALL_PRICE_FACTORS} });
       my %labels =      map { $_->{id} => $_->{description} } @{ $form->{ALL_PRICE_FACTORS} };
 
-      $price_factor_select =
+      $column_data{price_factor} =
         NTI($cgi->popup_menu('-name'    => "price_factor_id_$i",
                              '-default' => $form->{"price_factor_id_$i"},
                              '-values'  => \@values,
                              '-labels'  => \%labels,
-                             '-style'   => 'width:90px'))
-        . ' ';
+                             '-style'   => 'width:90px'));
+    } else {
+      $column_data{price_factor} = '&nbsp;';
     }
 
-    $column_data{"unit"} = $price_factor_select . AM->unit_select_html($local_units, "unit_$i", $this_unit, $form->{"id_$i"} ? $form->{"unit_$i"} : undef);
+    $column_data{"unit"} = AM->unit_select_html($local_units, "unit_$i", $this_unit, $form->{"id_$i"} ? $form->{"unit_$i"} : undef);
 # / unit ending
 
     $form->{"sellprice_$i"} =~ /\.(\d+)/;
@@ -289,23 +299,27 @@ sub display_row {
                    $marge_color, $locale->text('Ertrag'),$form->{"marge_absolut_$i"}, $form->{"marge_percent_$i"},
                    $locale->text('LP'), $form->format_amount(\%myconfig, $form->{"listprice_$i"}, 2),
                    $locale->text('EK'), $form->format_amount(\%myconfig, $form->{"lastcost_$i"}, 2) }
-      if $form->{"id_$i"} && $form->{type} =~ /^sales_/;
+      if $form->{"id_$i"} && $form->{type} =~ /^sales_/ && !$is_delivery_order;
 # / marge calculations ending
 
+    my @hidden_vars;
+
+    push @hidden_vars, qw(partunit) if ($is_purchase);
+
     my @HIDDENS = map { value => $_}, (
           $cgi->hidden("-name" => "unit_old_$i", "-value" => $form->{"selected_unit_$i"}),
           $cgi->hidden("-name" => "price_new_$i", "-value" => $form->format_amount(\%myconfig, $form->{"price_new_$i"})),
           map { ($cgi->hidden("-name" => $_, "-value" => $form->{$_})); } map { $_."_$i" } 
-            qw(orderitems_id bo pricegroup_old price_old id inventory_accno bin partsgroup partnotes
-               income_accno expense_accno listprice assembly taxaccounts ordnumber transdate cusordnumber
-               longdescription basefactor marge_absolut marge_percent marge_price_factor lastcost)
+            (qw(orderitems_id bo pricegroup_old price_old id inventory_accno bin partsgroup partnotes
+                income_accno expense_accno listprice assembly taxaccounts ordnumber transdate cusordnumber
+                longdescription basefactor marge_absolut marge_percent marge_price_factor lastcost), @hidden_vars)
     );
 
     map { $form->{"${_}_base"} += $linetotal } (split(/ /, $form->{"taxaccounts_$i"}));
 
     $form->{invsubtotal} += $linetotal;
 
-    push @ROWS, { ROW1 => \@ROW1, ROW2 => \@ROW2, HIDDENS => \@HIDDENS, colspan => $colspan, };
+    push @ROWS, { ROW1 => \@ROW1, ROW2 => \@ROW2, HIDDENS => \@HIDDENS, colspan => $colspan, error => $form->{"row_error_$i"}, };
   }
 
   print $form->parse_html_template('oe/sales_order', { ROWS   => \@ROWS,
@@ -324,6 +338,10 @@ sub display_row {
 
 sub set_pricegroup {
   $lxdebug->enter_sub();
+
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   my $rowcount = shift;
   for $j (1 .. $rowcount) {
     next unless $form->{PRICES}{$j};
@@ -344,6 +362,10 @@ sub set_pricegroup {
 
 sub select_item {
   $lxdebug->enter_sub();
+
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   @column_index = qw(ndx partnumber description onhand unit sellprice);
 
   $column_data{ndx}        = qq|<th>&nbsp;</th>|;
@@ -449,6 +471,7 @@ sub select_item {
 
   # save all other form variables
   foreach $key (keys %${form}) {
+    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
     $form->{$key} =~ s/\"/&quot;/g;
     print qq|<input name="$key" type="hidden" value="$form->{$key}">\n|;
   }
@@ -471,6 +494,9 @@ sub select_item {
 sub item_selected {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   # replace the last row with the checked row
   $i = $form->{rowcount};
   $i = $form->{assembly_rows} if ($form->{item} eq 'assembly');
@@ -569,6 +595,9 @@ sub item_selected {
 sub new_item {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   # change callback
   $form->{old_callback} = $form->escape($form->{callback}, 1);
   $form->{callback}     = $form->escape("$form->{script}?action=display_form", 1);
@@ -580,6 +609,7 @@ sub new_item {
   push @HIDDENS, map +{ 'name' => $_,             'value' => $form->{$_} },                       qw(rowcount vc login password);
   push @HIDDENS, map +{ 'name' => $_,             'value' => $form->{"${_}_$form->{rowcount}"} }, qw(partnumber description unit sellprice);
   push @HIDDENS,      { 'name' => 'taxaccount2',  'value' => $form->{taxaccounts} };
+    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
 
   $form->header();
   print $form->parse_html_template("generic/new_item", { HIDDENS => [ sort { $a->{name} cmp $b->{name} } @HIDDENS ] } );
@@ -589,29 +619,27 @@ sub new_item {
 
 sub check_form {
   $lxdebug->enter_sub();
+
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   my @a     = ();
   my $count = 0;
-  my @flds  = (qw(id partnumber description qty ship sellprice unit discount inventory_accno income_accno expense_accno listprice taxaccounts bin assembly weight projectnumber project_id oldprojectnumber runningnumber serialnumber partsgroup payment_id not_discountable shop ve gv buchungsgruppen_id language_values sellprice_pg pricegroup_old price_old price_new unit_old ordnumber transdate longdescription basefactor marge_total marge_percent marge_price_factor lastcost price_factor_id));
+
+  my @flds = qw(id partnumber description qty ship sellprice unit
+                discount inventory_accno income_accno expense_accno listprice
+                taxaccounts bin assembly weight projectnumber project_id
+                oldprojectnumber runningnumber serialnumber partsgroup payment_id
+                not_discountable shop ve gv buchungsgruppen_id language_values
+                sellprice_pg pricegroup_old price_old price_new unit_old ordnumber
+                transdate longdescription basefactor marge_total marge_percent
+                marge_price_factor lastcost price_factor_id);
 
   # remove any makes or model rows
   if ($form->{item} eq 'part') {
     map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) }
       qw(listprice sellprice lastcost weight rop);
 
-    @flds = (make, model);
-    for my $i (1 .. ($form->{makemodel_rows})) {
-      if (($form->{"make_$i"} ne "") || ($form->{"model_$i"} ne "")) {
-        push @a, {};
-        my $j = $#a;
-
-        map { $a[$j]->{$_} = $form->{"${_}_$i"} } @flds;
-        $count++;
-      }
-    }
-
-    $form->redo_rows(\@flds, \@a, $count, $form->{makemodel_rows});
-    $form->{makemodel_rows} = $count;
-
   } elsif ($form->{item} eq 'assembly') {
 
     $form->{sellprice} = 0;
@@ -644,23 +672,6 @@ sub check_form {
     $form->redo_rows(\@flds, \@a, $count, $form->{assembly_rows});
     $form->{assembly_rows} = $count;
 
-    $count = 0;
-    @flds  = qw(make model);
-    @a     = ();
-
-    for my $i (1 .. ($form->{makemodel_rows})) {
-      if (($form->{"make_$i"} ne "") || ($form->{"model_$i"} ne "")) {
-        push @a, {};
-        my $j = $#a;
-
-        map { $a[$j]->{$_} = $form->{"${_}_$i"} } @flds;
-        $count++;
-      }
-    }
-
-    $form->redo_rows(\@flds, \@a, $count, $form->{makemodel_rows});
-    $form->{makemodel_rows} = $count;
-
   } elsif ($form->{item} eq 'service') {
     map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) } qw(listprice sellprice lastcost);
 
@@ -716,6 +727,9 @@ sub check_form {
 sub invoicetotal {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   $form->{oldinvtotal} = 0;
 
   # add all parts and deduct paid
@@ -754,6 +768,9 @@ sub invoicetotal {
 sub validate_items {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   # check if items are valid
   if ($form->{rowcount} == 1) {
     &update;
@@ -770,6 +787,10 @@ sub validate_items {
 
 sub order {
   $lxdebug->enter_sub();
+
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   if ($form->{second_run}) {
     $form->{print_and_post} = 0;
   }
@@ -837,6 +858,10 @@ sub order {
 
 sub quotation {
   $lxdebug->enter_sub();
+
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   if ($form->{second_run}) {
     $form->{print_and_post} = 0;
   }
@@ -902,6 +927,9 @@ sub request_for_quotation {
 sub edit_e_mail {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   if ($form->{second_run}) {
     $form->{print_and_post} = 0;
     $form->{resubmit}       = 0;
@@ -925,7 +953,7 @@ sub edit_e_mail {
   $form->header;
 
   my (@dont_hide_key_list, %dont_hide_key, @hidden_keys);
-  @dont_hide_key_list = qw(action email cc bcc subject message sendmode format header override);
+  @dont_hide_key_list = qw(action email cc bcc subject message sendmode format header override login password);
   @dont_hide_key{@dont_hide_key_list} = (1) x @dont_hide_key_list;
   @hidden_keys = sort grep { !$dont_hide_key{$_} } grep { !ref $form->{$_} } keys %$form;
 
@@ -942,9 +970,11 @@ sub edit_e_mail {
 sub send_email {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   my $callback = $form->{script} . "?action=edit";
-  map({ $callback .= "\&${_}=" . E($form->{$_}); }
-      qw(login password type id));
+  map({ $callback .= "\&${_}=" . E($form->{$_}); } qw(type id));
 
   print_form("return");
 
@@ -968,6 +998,9 @@ sub send_email {
 sub print_options {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit     | vendor_invoice_edit        | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit         | sales_quotation_edit       | purchase_order_edit | dunning_edit');
+
   my %options = @_;
 
   # names 3 parameters and returns a hashref, for use in templates
@@ -1077,6 +1110,10 @@ sub print_options {
 sub print {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit | ' .
+                'order_request_edit_all     | order_request_edit');
+
   if ($form->{print_nextsub}) {
     call_sub($form->{print_nextsub});
     $lxdebug->leave_sub();
@@ -1111,6 +1148,10 @@ sub print {
 
 sub print_form {
   $lxdebug->enter_sub();
+
+  $auth->assert('part_service_assembly_edit     | vendor_invoice_edit        | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit         | sales_quotation_edit       | purchase_order_edit');
+
   my ($old_form) = @_;
 
   $inv       = "inv";
@@ -1174,10 +1215,9 @@ sub print_form {
   if ($form->{formname} eq 'pick_list') {
     $inv                  = "ord";
     $due                  = "req";
-    $form->{"${inv}date"} =
-      ($form->{transdate}) ? $form->{transdate} : $form->{invdate};
-    $form->{label} = $locale->text('Pick List');
-    $order = 1 unless $form->{type} eq 'invoice';
+    $form->{"${inv}date"} = ($form->{transdate}) ? $form->{transdate} : $form->{invdate};
+    $form->{label}        = $locale->text('Pick List');
+    $order                = 1 unless $form->{type} eq 'invoice';
   }
   if ($form->{formname} eq 'purchase_order') {
     $inv                  = "ord";
@@ -1275,7 +1315,7 @@ sub print_form {
   $salesman_id_saved = $form->{salesman_id};
   $cp_id_saved = $form->{cp_id};
 
-  call_sub("$form->{vc}_details");
+  call_sub("$form->{vc}_details") if ($form->{vc});
 
   $form->{language_id} = $language_saved;
   $form->{payment_id} = $payment_id_saved;
@@ -1304,7 +1344,15 @@ sub print_form {
   ($form->{employee}) = split /--/, $form->{employee};
 
   # create the form variables
-  if ($order) {
+  if ($form->{formname} eq 'order_request') {
+    order_request_details();
+  } elsif ($form->{formname} eq 'return_material_slip') {
+    rms_details();
+  } elsif ($form->{formname} eq 'release_material_slip') {
+    rlms_details();
+  } elsif ($form->{type} =~ /_delivery_order$/) {
+    DO->order_details();
+  } elsif ($order) {
     OE->order_details(\%myconfig, \%$form);
   } else {
     IS->invoice_details(\%myconfig, \%$form, $locale);
@@ -1548,6 +1596,9 @@ sub vendor_details {
 sub post_as_new {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   $form->{postasnew} = 1;
   map { delete $form->{$_} } qw(printed emailed queued);
 
@@ -1558,6 +1609,10 @@ sub post_as_new {
 
 sub ship_to {
   $lxdebug->enter_sub();
+
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   if ($form->{second_run}) {
     $form->{print_and_post} = 0;
   }
@@ -1686,6 +1741,7 @@ sub ship_to {
   $form->{title} = $title;
 
   foreach $key (keys %$form) {
+    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
     $form->{$key} =~ s/\"/&quot;/g;
     print qq|<input type="hidden" name="$key" value="$form->{$key}">\n|;
   }
@@ -1709,6 +1765,9 @@ sub ship_to {
 sub new_license {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   my $row = shift;
 
   # change callback
@@ -1724,6 +1783,7 @@ sub new_license {
   # save all other form variables in a previousform variable
   $form->{row} = $row;
   foreach $key (keys %$form) {
+    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
 
     # escape ampersands
     $form->{$key} =~ s/&/%26/g;
@@ -1738,7 +1798,7 @@ sub new_license {
   map { $form->{$_} = $form->escape($form->{$_}, 1) }
     qw(partnumber description);
   $form->{callback} =
-    qq|$form->{script}?login=$form->{login}&password=$form->{password}&action=add&vc=$form->{db}&$form->{db}_id=$form->{id}&$form->{db}=$name&type=$form->{type}&customer=$customer&partnumber=$form->{partnumber}&description=$form->{description}&previousform="$previousform"&initial=1|;
+    qq|$form->{script}?action=add&vc=$form->{db}&$form->{db}_id=$form->{id}&$form->{db}=$name&type=$form->{type}&customer=$customer&partnumber=$form->{partnumber}&description=$form->{description}&previousform="$previousform"&initial=1|;
   $form->redirect;
 
   $lxdebug->leave_sub();
@@ -1747,6 +1807,9 @@ sub new_license {
 sub relink_accounts {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   $form->{"taxaccounts"} =~ s/\s*$//;
   $form->{"taxaccounts"} =~ s/^\s*//;
   foreach my $accno (split(/\s*/, $form->{"taxaccounts"})) {
@@ -1766,6 +1829,9 @@ sub relink_accounts {
 sub set_duedate {
   $lxdebug->enter_sub();
 
+  $auth->assert('part_service_assembly_edit | vendor_invoice_edit  | sales_order_edit    | invoice_edit |' .
+                'request_quotation_edit     | sales_quotation_edit | purchase_order_edit');
+
   $form->get_duedate(\%myconfig);
 
   my $q = new CGI;
index f4345c1..5b47194 100644 (file)
@@ -49,6 +49,8 @@ require "bin/mozilla/drafts.pl";
 sub add {
   $lxdebug->enter_sub();
 
+  $auth->assert('vendor_invoice_edit');
+
   return $lxdebug->leave_sub() if (load_draft_maybe());
 
   $form->{title} = $locale->text('Add Vendor Invoice');
@@ -63,6 +65,8 @@ sub add {
 sub edit {
   $lxdebug->enter_sub();
 
+  $auth->assert('vendor_invoice_edit');
+
   # show history button
   $form->{javascript} = qq|<script type=text/javascript src=js/show_history.js></script>|;
   #/show hhistory button
@@ -79,6 +83,8 @@ sub edit {
 sub invoice_links {
   $lxdebug->enter_sub();
 
+  $auth->assert('vendor_invoice_edit');
+
   # create links
   $form->{webdav}   = $webdav;
   $form->{jsscript} = 1;
@@ -182,6 +188,8 @@ sub invoice_links {
 sub prepare_invoice {
   $lxdebug->enter_sub();
 
+  $auth->assert('vendor_invoice_edit');
+
   if ($form->{id}) {
 
     map { $form->{$_} =~ s/\"/&quot;/g } qw(invnumber ordnumber quonumber);
@@ -215,6 +223,8 @@ sub prepare_invoice {
 sub form_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('vendor_invoice_edit');
+
   # set option selected
   foreach $item (qw(AP vendor currency department)) {
     $form->{"select$item"} =~ s/ selected//;
@@ -382,7 +392,7 @@ sub form_header {
          <input type=button name=invdate id="trigger1" value=| . $locale->text('button') . qq|></td>\n|;
   $button2 = qq|
      <td width="13"><input name=duedate id=duedate size=11 title="$myconfig{dateformat}" value="$form->{duedate}"  onBlur=\"check_right_date_format(this)\">
-                    <input type=button name=duedate id="trigger2" value=| . $locale->text('button') . qq|></td></td>\n|;
+                    <input type=button name=duedate id="trigger2" value=| . $locale->text('button') . qq|></td>\n|;
 
   #write Trigger
   $jsscript =
@@ -499,6 +509,8 @@ $jsscript
 sub form_footer {
   $lxdebug->enter_sub();
 
+  $auth->assert('vendor_invoice_edit');
+
   $form->{invtotal} = $form->{invsubtotal};
 
   if (($rows = $form->numtextrows($form->{notes}, 25, 8)) < 2) {
@@ -811,7 +823,7 @@ sub form_footer {
   }
 
   print $form->write_trigger(\%myconfig, scalar(@triggers) / 3, @triggers);
-  $form->hide_form(qw(rowcount callback draft_id draft_description login password));
+  $form->hide_form(qw(rowcount callback draft_id draft_description));
 
   # button for saving history
   if($form->{id} ne "") {
@@ -840,13 +852,19 @@ print qq|</form>
 
 sub mark_as_paid {
   $lxdebug->enter_sub();
+
+  $auth->assert('vendor_invoice_edit');
+
   &mark_as_paid_common(\%myconfig,"ap");  
+
   $lxdebug->leave_sub();
 }
 
 sub update {
   $lxdebug->enter_sub();
 
+  $auth->assert('vendor_invoice_edit');
+
   map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) } qw(exchangerate creditlimit creditremaining);
 
   &check_name(vendor);
@@ -936,6 +954,8 @@ sub update {
 sub storno {
   $lxdebug->enter_sub();
 
+  $auth->assert('vendor_invoice_edit');
+
   if ($form->{storno}) {
     $form->error($locale->text('Cannot storno storno invoice!'));
   }
@@ -975,6 +995,8 @@ sub storno {
 sub use_as_template {
   $lxdebug->enter_sub();
 
+  $auth->assert('vendor_invoice_edit');
+
   map { delete $form->{$_} } qw(printed emailed queued invnumber invdate deliverydate id datepaid_1 source_1 memo_1 paid_1 exchangerate_1 AP_paid_1 storno);
   $form->{paidaccounts} = 1;
   $form->{rowcount}--;
@@ -987,6 +1009,8 @@ sub use_as_template {
 sub post_payment {
   $lxdebug->enter_sub();
 
+  $auth->assert('vendor_invoice_edit');
+
   $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
   for $i (1 .. $form->{paidaccounts}) {
     if ($form->{"paid_$i"}) {
@@ -1029,6 +1053,8 @@ sub post_payment {
 sub post {
   $lxdebug->enter_sub();
 
+  $auth->assert('vendor_invoice_edit');
+
   $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
 
   $form->isblank("invdate", $locale->text('Invoice Date missing!'));
@@ -1102,6 +1128,8 @@ sub post {
 sub delete {
   $lxdebug->enter_sub();
 
+  $auth->assert('vendor_invoice_edit');
+
   $form->header;
   print qq|
 <body>
@@ -1113,6 +1141,7 @@ sub delete {
   map { delete $form->{$_} } qw(action header);
 
   foreach $key (keys %$form) {
+    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
     $form->{$key} =~ s/\"/&quot;/g;
     print qq|<input type=hidden name=$key value="$form->{$key}">\n|;
   }
@@ -1134,6 +1163,9 @@ sub delete {
 
 sub yes {
   $lxdebug->enter_sub();
+
+  $auth->assert('vendor_invoice_edit');
+
   if (IR->delete_invoice(\%myconfig, \%$form)) {
     # saving the history
     if(!exists $form->{addition}) {
index 65cc060..975cb94 100644 (file)
@@ -48,6 +48,8 @@ require "bin/mozilla/drafts.pl";
 sub add {
   $lxdebug->enter_sub();
 
+  $auth->assert('invoice_edit');
+
   return $lxdebug->leave_sub() if (load_draft_maybe());
 
   if ($form->{type} eq "credit_note") {
@@ -62,9 +64,7 @@ sub add {
   }
 
 
-  $form->{callback} =
-    "$form->{script}?action=add&type=$form->{type}&login=$form->{login}&password=$form->{password}"
-    unless $form->{callback};
+  $form->{callback} = "$form->{script}?action=add&type=$form->{type}" unless $form->{callback};
 
   $form{jsscript} = "date";
 
@@ -82,6 +82,8 @@ sub add {
 sub edit {
   $lxdebug->enter_sub();
 
+  $auth->assert('invoice_edit');
+
   # show history button
   $form->{javascript} = qq|<script type="text/javascript" src="js/show_history.js"></script>|;
   #/show hhistory button
@@ -112,6 +114,8 @@ sub edit {
 sub invoice_links {
   $lxdebug->enter_sub();
 
+  $auth->assert('invoice_edit');
+
   $form->{vc} = 'customer';
 
   # create links
@@ -231,6 +235,8 @@ sub invoice_links {
 sub prepare_invoice {
   $lxdebug->enter_sub();
 
+  $auth->assert('invoice_edit');
+
   if ($form->{type} eq "credit_note") {
     $form->{type}     = "credit_note";
     $form->{formname} = "credit_note";
@@ -281,6 +287,8 @@ sub prepare_invoice {
 sub form_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('invoice_edit');
+
   $form->{employee_id} = $form->{old_employee_id} if $form->{old_employee_id};
   $form->{salesman_id} = $form->{old_salesman_id} if $form->{old_salesman_id};
 
@@ -305,7 +313,7 @@ sub form_header {
     }
   }
 
-  my $set_duedate_url = "$form->{script}?login=$form->{login}&password=$form->{password}&action=set_duedate";
+  my $set_duedate_url = "$form->{script}?action=set_duedate";
 
   my $pjx = new CGI::Ajax( 'set_duedate' => $set_duedate_url );
   push(@ { $form->{AJAX} }, $pjx);
@@ -549,12 +557,12 @@ sub form_header {
     $button2 = qq|
       <td width="13"><input name="duedate" id="duedate" size="11" title="$myconfig{dateformat}" value="$form->{duedate}" onBlur=\"check_right_date_format(this)\">
        <input type="button" name="duedate" id="trigger2" value="|
-      . $locale->text('button') . qq|"></td></td>
+      . $locale->text('button') . qq|"></td>
     |;
     $button3 = qq|
       <td width="13"><input name="deliverydate" id="deliverydate" size="11" title="$myconfig{dateformat}" value="$form->{deliverydate}" onBlur=\"check_right_date_format(this)\">
        <input type="button" name="deliverydate" id="trigger3" value="|
-      . $locale->text('button') . qq|"></td></td>
+      . $locale->text('button') . qq|"></td>
     |;
 
     #write Trigger
@@ -755,6 +763,8 @@ print qq|     <tr>
 sub form_footer {
   $lxdebug->enter_sub();
 
+  $auth->assert('invoice_edit');
+
   $form->{invtotal} = $form->{invsubtotal};
 
   if (($rows = $form->numtextrows($form->{notes}, 26, 8)) < 2) {
@@ -1149,9 +1159,8 @@ if ($form->{type} eq "credit_note") {
 | .
 $cgi->hidden("-name" => "callback", "-value" => $form->{callback})
 . $cgi->hidden('-name' => 'draft_id', '-default' => [$form->{draft_id}])
-. $cgi->hidden('-name' => 'draft_description', '-default' => [$form->{draft_description}]);
-map({ print $cgi->hidden("-name" => $_ , "-value" => $form->{$_});} qw(login password));
-print qq|
+. $cgi->hidden('-name' => 'draft_description', '-default' => [$form->{draft_description}])
+. qq|
 </form>
 
 </body>
@@ -1164,13 +1173,19 @@ print qq|
 
 sub mark_as_paid {
   $lxdebug->enter_sub();
+
+  $auth->assert('invoice_edit');
+
   &mark_as_paid_common(\%myconfig,"ar");  
+
   $lxdebug->leave_sub();
 }
 
 sub update {
   $lxdebug->enter_sub();
 
+  $auth->assert('invoice_edit');
+
   my ($recursive_call) = shift;
 
   map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) } qw(exchangerate creditlimit creditremaining) unless $recursive_call;
@@ -1299,6 +1314,8 @@ sub update {
 sub post_payment {
   $lxdebug->enter_sub();
 
+  $auth->assert('invoice_edit');
+
   $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
   for $i (1 .. $form->{paidaccounts}) {
     if ($form->{"paid_$i"}) {
@@ -1332,6 +1349,8 @@ sub post_payment {
 sub post {
   $lxdebug->enter_sub();
 
+  $auth->assert('invoice_edit');
+
   $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
   $form->isblank("invdate",  $locale->text('Invoice Date missing!'));
   $form->isblank("customer", $locale->text('Customer missing!'));
@@ -1416,6 +1435,8 @@ sub post {
 sub print_and_post {
   $lxdebug->enter_sub();
 
+  $auth->assert('invoice_edit');
+
   $old_form               = new Form;
   $print_post             = 1;
   $form->{print_and_post} = 1;
@@ -1429,6 +1450,8 @@ sub print_and_post {
 sub use_as_template {
   $lxdebug->enter_sub();
 
+  $auth->assert('invoice_edit');
+
   map { delete $form->{$_} } qw(printed emailed queued invnumber invdate deliverydate id datepaid_1 source_1 memo_1 paid_1 exchangerate_1 AP_paid_1 storno);
   $form->{paidaccounts} = 1;
   $form->{rowcount}--;
@@ -1441,6 +1464,8 @@ sub use_as_template {
 sub storno {
   $lxdebug->enter_sub();
 
+  $auth->assert('invoice_edit');
+
   if ($form->{storno}) {
     $form->error($locale->text('Cannot storno storno invoice!'));
   }
@@ -1449,9 +1474,7 @@ sub storno {
     $form->error($locale->text("Invoice has already been storno'd!"));
   }
 
-  map({ my $key = $_; delete($form->{$key})
-          unless (grep({ $key eq $_ } qw(login password id stylesheet type))); }
-      keys(%{ $form }));
+  map({ my $key = $_; delete($form->{$key}) unless (grep({ $key eq $_ } qw(id login password stylesheet type))); } keys(%{ $form }));
 
   invoice_links();
   prepare_invoice();
@@ -1474,6 +1497,8 @@ sub storno {
 sub preview {
   $lxdebug->enter_sub();
 
+  $auth->assert('invoice_edit');
+
   $form->{preview} = 1;
   $old_form = new Form;
   for (keys %$form) { $old_form->{$_} = $form->{$_} }
@@ -1485,6 +1510,9 @@ sub preview {
 
 sub delete {
   $lxdebug->enter_sub();
+
+  $auth->assert('invoice_edit');
+
   if ($form->{second_run}) {
     $form->{print_and_post} = 0;
   }
@@ -1500,6 +1528,7 @@ sub delete {
   map { delete $form->{$_} } qw(action header);
 
   foreach $key (keys %$form) {
+    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
     $form->{$key} =~ s/\"/&quot;/g;
     print qq|<input type="hidden" name="$key" value="$form->{$key}">\n|;
   }
@@ -1524,6 +1553,8 @@ sub delete {
 sub credit_note {
   $lxdebug->enter_sub();
 
+  $auth->assert('invoice_edit');
+
   $form->{transdate} = $form->{invdate} = $form->current_date(\%myconfig);
   $form->{duedate} =
     $form->current_date(\%myconfig, $form->{invdate}, $form->{terms} * 1);
@@ -1577,6 +1608,9 @@ sub credit_note {
 
 sub yes {
   $lxdebug->enter_sub();
+
+  $auth->assert('invoice_edit');
+
   if (IS->delete_invoice(\%myconfig, \%$form, $spool)) {
     # saving the history
        if(!exists $form->{addition}) {
@@ -1595,6 +1629,8 @@ sub yes {
 sub e_mail {
   $lxdebug->enter_sub();
 
+  $auth->assert('invoice_edit');
+
   if (!$form->{id}) {
     $print_post = 1;
 
@@ -1602,10 +1638,7 @@ sub e_mail {
 
     post();
 
-    my %saved_vars;
-    map({ $saved_vars{$_} = $form->{$_}; } qw(id invnumber));
-    restore_form($saved_form);
-    map({ $form->{$_} = $saved_vars{$_}; } qw(id invnumber));
+    restore_form($saved_form, 0, qw(id invnumber));
   }
 
   edit_e_mail();
index c5de934..03c601b 100644 (file)
@@ -15,9 +15,7 @@ foreach (@felder) {
 }
 $login =
     "[" . $login
-  . " - <a href=\"login.pl?password="
-  . $form->{"password"}
-  . "&action=logout\" target=\"_top\">"
+  . " - <a href=\"login.pl?action=logout\" target=\"_top\">"
   . $locale->text('Logout')
   . "</a>] ";
 my ($Sekunden, $Minuten,   $Stunden,   $Monatstag, $Monat,
index fd8f01d..93efc24 100644 (file)
@@ -46,6 +46,9 @@ sub quot {
 
 sub form_header {
   $lxdebug->enter_sub();
+
+  $auth->assert('license_edit');
+
   $form->{jsscript} = 1;
   $form->header();
 
@@ -58,7 +61,10 @@ sub form_header {
 
 sub form_footer {
   $lxdebug->enter_sub();
-  my @items = qw(login password old_callback previousform);
+
+  $auth->assert('license_edit');
+
+  my @items = qw(old_callback previousform);
   push(@items, @{ $form->{"hidden"} });
   map({
       print("<input type=hidden name=$_ value=\"" . quot($form->{$_}) . "\">\n"
@@ -81,6 +87,9 @@ sub set_std_hidden {
 
 sub print_part_selection {
   $lxdebug->enter_sub();
+
+  $auth->assert('license_edit');
+
   form_header();
   set_std_hidden("business");
 
@@ -135,6 +144,9 @@ sub print_part_selection {
 
 sub print_customer_selection {
   $lxdebug->enter_sub();
+
+  $auth->assert('license_edit');
+
   form_header();
   set_std_hidden("parts_id", "partnumber", "description");
 
@@ -195,6 +207,9 @@ sub print_customer_selection {
 
 sub print_license_form {
   $lxdebug->enter_sub();
+
+  $auth->assert('license_edit');
+
   print(
     qq|
 <table width=100%>
@@ -281,6 +296,9 @@ sub print_license_form {
 
 sub add {
   $lxdebug->enter_sub();
+
+  $auth->assert('license_edit');
+
   if (!$lizenzen) {
     $form->error(
                  $locale->text(
@@ -296,6 +314,9 @@ sub add {
 
 sub do_add {
   $lxdebug->enter_sub();
+
+  $auth->assert('license_edit');
+
   $form->{"hidden"} = ["parts_id"];
   form_header();
 
@@ -360,7 +381,11 @@ sub do_add {
 
 sub update {
   $lxdebug->enter_sub();
+
+  $auth->assert('license_edit');
+
   do_add();
+
   $lxdebug->leave_sub();
 }
 
@@ -373,6 +398,8 @@ sub continue {
 sub save {
   $lxdebug->enter_sub();
 
+  $auth->assert('license_edit');
+
   ($form->{customername}, $form->{customer_id}) = split /--/,
     $form->{customer};
 
@@ -421,6 +448,7 @@ sub save {
 
     # put callback together
     foreach $key (keys %$form) {
+      next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
 
       # do single escape for Apache 2.0
       $value = $form->escape($form->{$key}, 1);
@@ -443,6 +471,9 @@ sub save {
 
 sub search {
   $lxdebug->enter_sub();
+
+  $auth->assert('license_edit');
+
   if (!$lizenzen) {
     $form->error(
                  $locale->text(
@@ -498,11 +529,14 @@ sub search {
 
 sub do_search {
   $lxdebug->enter_sub();
+
+  $auth->assert('license_edit');
+
   LICENSES->search(\%myconfig, $form);
 
   $callback = "";
   map { $callback .= "\&${_}=" . $form->escape($form->{$_}, 1) }
-    qw(db login password partnumber description customer_name all expiring_in show_expired);
+    qw(db partnumber description customer_name all expiring_in show_expired);
   $details    = $form->{"script"} . "?action=details" . $callback . "\&id=";
   $invdetails = "is.pl?action=edit" . $callback . "\&id=";
   $callback   = $form->{"script"} . "?action=do_search" . $callback;
@@ -606,6 +640,9 @@ sub do_search {
 
 sub details {
   $lxdebug->enter_sub();
+
+  $auth->assert('license_edit');
+
   LICENSES->get_license(\%myconfig, $form);
   map(
     { $form->{$_} = $form->{"license"}->{$_}; } keys(%{ $form->{"license"} }));
index 06e95fa..2d96b54 100644 (file)
 #######################################################################
 
 use DBI;
+use SL::Auth;
 use SL::User;
 use SL::Form;
 
 require "bin/mozilla/common.pl";
 
+# This is required because the am.pl in the root directory
+# is not scanned by locales.pl:
+# $form->parse_html_template('login/password_error')
+
 $form = new Form;
 
+if (! -f 'config/authentication.pl') {
+  show_error('login/authentication_pl_missing');
+}
+
 $locale = new Locale $language, "login";
 
+our $auth = SL::Auth->new();
+if (!$auth->session_tables_present()) {
+  show_error('login/auth_db_unreachable');
+}
+$auth->expire_sessions();
+$auth->restore_session();
+
 # customization
 if (-f "bin/mozilla/custom_$form->{script}") {
   eval { require "bin/mozilla/custom_$form->{script}"; };
@@ -53,6 +69,17 @@ if (-f "bin/mozilla/$form->{login}_$form->{script}") {
 $form->{titlebar} = "Lx-Office " . $locale->text('Version') . " $form->{version}";
 
 if ($form->{action}) {
+  our %myconfig = $auth->read_user($form->{login}) if ($form->{login});
+
+  if (!$myconfig{login} || (SL::Auth::OK != $auth->authenticate($form->{login}, $form->{password}, 0))) {
+    $form->{error_message} = $locale->text('Incorrect Password!');
+    login_screen();
+    exit;
+  }
+
+  $auth->set_session_value('login', $form->{login}, 'password', $form->{password});
+  $auth->create_or_refresh_session();
+
   $form->{titlebar} .= " - $myconfig{name} - $myconfig{dbname}";
   call_sub($locale->findsub($form->{action}));
 
@@ -87,10 +114,10 @@ sub login {
     exit;
   }
 
-  $user = new User $memberfile, $form->{login};
+  $user = new User $form->{login};
 
   # if we get an error back, bale out
-  if (($result = $user->login(\%$form, $userspath)) <= -1) {
+  if (($result = $user->login($form)) <= -1) {
     exit if $result == -2;
     login_screen($locale->text('Incorrect username or password!'));
     exit;
@@ -106,6 +133,8 @@ sub login {
   # made it this far, execute the menu
   $form->{callback} = build_std_url("script=menu${menu_script}.pl", 'action=display');
 
+  $auth->set_cookie_environment_variable();
+
   $form->redirect();
 
   $lxdebug->leave_sub();
@@ -114,10 +143,10 @@ sub login {
 sub logout {
   $lxdebug->enter_sub();
 
-  unlink "$userspath/$form->{login}.conf";
+  $auth->destroy_session();
 
   # remove the callback to display the message
-  $form->{callback} = "login.pl?action=&login=";
+  $form->{callback} = "login.pl?action=";
   $form->redirect($locale->text('You are logged out!'));
 
   $lxdebug->leave_sub();
@@ -126,8 +155,6 @@ sub logout {
 sub company_logo {
   $lxdebug->enter_sub();
 
-  require "$userspath/$form->{login}.conf";
-
   $locale             =  new Locale $myconfig{countrycode}, "login" if ($language ne $myconfig{countrycode});
 
   $form->{stylesheet} =  $myconfig{stylesheet};
@@ -140,3 +167,18 @@ sub company_logo {
 
   $lxdebug->leave_sub();
 }
+
+sub show_error {
+  my $template           = shift;
+  $locale                = Locale->new($language, 'all');
+  $myconfig{countrycode} = $language;
+  $form->{stylesheet}    = 'css/lx-office-erp.css';
+
+  $form->header();
+  print $form->parse_html_template($template);
+
+  # $form->parse_html_template('login/auth_db_unreachable');
+  # $form->parse_html_template('login/authentication_pl_missing');
+
+  exit;
+}
index 121f8b4..976e27e 100644 (file)
@@ -52,10 +52,10 @@ sub display {
 
   print qq|
 <frameset rows="28px,*" cols="*" framespacing="0" frameborder="0">
-  <frame  src="kopf.pl?login=$form->{login}&password=$form->{password}" name="kopf"  scrolling="NO">
+  <frame  src="kopf.pl" name="kopf"  scrolling="NO">
   <frameset cols="$framesize,*" framespacing="0" frameborder="0" border="0" >
-    <frame src="$form->{script}?login=$form->{login}&password=$form->{password}&action=acc_menu" name="acc_menu"  scrolling="auto" noresize marginwidth="0">
-    <frame src="login.pl?login=$form->{login}&password=$form->{password}&action=company_logo" name="main_window" scrolling="auto">
+    <frame src="$form->{script}?action=acc_menu" name="acc_menu"  scrolling="auto" noresize marginwidth="0">
+    <frame src="login.pl?action=company_logo" name="main_window" scrolling="auto">
   </frameset>
   <noframes>
   You need a browser that can read frames to see this page.
@@ -198,7 +198,7 @@ sub section_menu {
       } else {
         my $ml_ = $form->escape($ml);
         print
-          qq|<tr><td class="bg" height="22" align="left" valign="middle" ><img src="image/$item.png" style="vertical-align:middle">&nbsp;<a href="menu.pl?action=acc_menu&level=$ml_&login=$form->{login}&password=$form->{password}" class="nohover">$label</a>&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>\n|;
+          qq|<tr><td class="bg" height="22" align="left" valign="middle" ><img src="image/$item.png" style="vertical-align:middle">&nbsp;<a href="menu.pl?action=acc_menu&level=$ml_" class="nohover">$label</a>&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>\n|;
         &section_menu($menu, $item);
 
         #print qq|<br>\n|;
index e91d8a3..80f7335 100644 (file)
@@ -52,7 +52,7 @@ sub display {
   &acc_menu;
 
   print qq|
-<iframe id="win1" src="login.pl?login=$form->{login}&password=$form->{password}&action=company_logo" width="100%" height="93%" name="main_window" style="position: absolute; border:0px;">
+<iframe id="win1" src="login.pl?action=company_logo" width="100%" height="93%" name="main_window" style="position: absolute; border:0px;">
 <p>Ihr Browser kann leider keine eingebetteten Frames anzeigen.
 </p>
 </iframe>
@@ -65,14 +65,12 @@ sub display {
 
 sub clock_line {
 
-  $fensterlink="menunew.pl?login=$form->{login}&password=$form->{password}&action=display";
+  $fensterlink="menunew.pl?action=display";
   $fenster = "["."<a href=\"$fensterlink\" target=\"_blank\">neues Fenster</a>]";
 
   $login = "[Nutzer "
     . $form->{login}
-    . " - <a href=\"login.pl?password="
-    . $form->{"password"}
-    . "&action=logout\" target=\"_top\">"
+    . " - <a href=\"login.pl?action=logout\" target=\"_top\">"
     . $locale->text('Logout')
     . "</a>] ";
   my ($Sekunden, $Minuten,   $Stunden,   $Monatstag, $Monat,
@@ -423,7 +421,7 @@ sub section_menu {
         print
           qq|menu[$pm][0] = new Menu(true, '>', 0, 20, 180, defOver, defBack, 'itemBorder', 'itemText');\n|;
 
-        #print qq|<tr><td class="bg" height="22" align="left" valign="middle" ><img src="image/$item.png" style="vertical-align:middle">&nbsp;<a href="menu.pl?action=acc_menu&level=$ml_&login=$form->{login}&password=$form->{password}" class="nohover">$label</a>&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>\n|;
+        #print qq|<tr><td class="bg" height="22" align="left" valign="middle" ><img src="image/$item.png" style="vertical-align:middle">&nbsp;<a href="menu.pl?action=acc_menu&level=$ml_" class="nohover">$label</a>&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>\n|;
         &section_menu($menu, $item);
 
         #print qq|<br>\n|;
index be23929..de1722e 100644 (file)
@@ -59,9 +59,25 @@ require "bin/mozilla/reportgenerator.pl";
 # $locale->text('Workflow request_quotation');
 # $locale->text('Workflow sales_quotation');
 
+my $oe_access_map = {
+  'sales_order'       => 'sales_order_edit',
+  'purchase_order'    => 'purchase_order_edit',
+  'request_quotation' => 'request_quotation_edit',
+  'sales_quotation'   => 'sales_quotation_edit',
+};
+
+sub check_oe_access {
+  my $right   = $oe_access_map->{$form->{type}};
+  $right    ||= 'DOES_NOT_EXIST';
+
+  $auth->assert($right);
+}
+
 sub set_headings {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+
   my ($action) = @_;
 
   if ($form->{type} eq 'purchase_order') {
@@ -99,10 +115,12 @@ sub set_headings {
 sub add {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+
   set_headings("add");
 
   $form->{callback} =
-    "$form->{script}?action=add&type=$form->{type}&vc=$form->{vc}&login=$form->{login}&password=$form->{password}"
+    "$form->{script}?action=add&type=$form->{type}&vc=$form->{vc}"
     unless $form->{callback};
 
   &order_links;
@@ -114,6 +132,9 @@ sub add {
 
 sub edit {
   $lxdebug->enter_sub();
+
+  check_oe_access();
+
   # show history button
   $form->{javascript} = qq|<script type="text/javascript" src="js/show_history.js"></script>|;
   #/show hhistory button
@@ -161,6 +182,9 @@ sub edit {
 
 sub order_links {
   $lxdebug->enter_sub();
+
+  check_oe_access();
+
   # get customer/vendor
   $form->all_vc(\%myconfig, $form->{vc}, ($form->{vc} eq 'customer') ? "AR" : "AP");
 
@@ -279,6 +303,9 @@ sub order_links {
 
 sub prepare_order {
   $lxdebug->enter_sub();
+
+  check_oe_access();
+
   $form->{formname} = $form->{type} unless $form->{formname};
 
   my $i = 0;
@@ -301,6 +328,8 @@ sub form_header {
   $lxdebug->enter_sub();
   my @custom_hiddens;
 
+  check_oe_access();
+
   # Container for template variables. Unfortunately this has to be visible in form_footer too, so not my.
   our %TMPL_VAR = ();
 
@@ -445,6 +474,8 @@ sub form_header {
 sub form_footer {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+
   $form->{invtotal} = $form->{invsubtotal};
 
   $rows    = max 2, $form->numtextrows($form->{notes}, 25, 8);
@@ -510,6 +541,8 @@ sub update {
   
   my ($recursive_call) = shift;
 
+  check_oe_access();
+
   set_headings($form->{"id"} ? "edit" : "add");
 
   map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) } qw(exchangerate creditlimit creditremaining) unless $recursive_call;
@@ -623,6 +656,8 @@ sub update {
 sub search {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+
   if ($form->{type} eq 'purchase_order') {
     $form->{title} = $locale->text('Purchase Orders');
     $form->{vc}    = 'vendor';
@@ -825,6 +860,8 @@ $employee_block
              <tr>
                <td><input name="l_id" class=checkbox type=checkbox value=Y> | . $locale->text('ID') . qq|</td>
                <td><input name="l_$ordnumber" class=checkbox type=checkbox value=Y checked> $ordlabel</td>
+             </tr>
+             <tr>
                <td><input name="l_transdate" class=checkbox type=checkbox value=Y checked> | . $locale->text('Date') . qq|</td>
                <td><input name="l_reqdate" class=checkbox type=checkbox value=Y checked> | . $locale->text('Required by') . qq|</td>
              </tr>
@@ -864,8 +901,6 @@ $jsscript
 
 <br>
 <input type=hidden name=nextsub value=orders>
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
 <input type=hidden name=vc value=$form->{vc}>
 <input type=hidden name=type value=$form->{type}>
 
@@ -901,6 +936,8 @@ sub create_subtotal_row {
 sub orders {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+
   $ordnumber = ($form->{type} =~ /_order$/) ? "ordnumber" : "quonumber";
 
   ($form->{ $form->{vc} }, $form->{"${form->{vc}}_id"}) = split(/--/, $form->{ $form->{vc} });
@@ -1121,6 +1158,8 @@ sub orders {
 sub check_delivered_flag {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+
   if (($form->{type} ne 'sales_order') && ($form->{type} ne 'purchase_order')) {
     return $lxdebug->leave_sub();
   }
@@ -1147,6 +1186,8 @@ sub check_delivered_flag {
 sub save_and_close {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+
   $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
 
   if ($form->{type} =~ /_order$/) {
@@ -1246,6 +1287,8 @@ sub save_and_close {
 sub save {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+
   $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
 
 
@@ -1347,6 +1390,8 @@ sub save {
 sub delete {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+
   $form->header;
 
   if ($form->{type} =~ /_order$/) {
@@ -1367,6 +1412,7 @@ sub delete {
   map { delete $form->{$_} } qw(action header);
 
   foreach $key (keys %$form) {
+    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
     $form->{$key} =~ s/\"/&quot;/g;
     print qq|<input type=hidden name=$key value="$form->{$key}">\n|;
   }
@@ -1393,6 +1439,8 @@ sub delete {
 sub delete_order_quotation {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+
   if ($form->{type} =~ /_order$/) {
     $msg = $locale->text('Order deleted!');
     $err = $locale->text('Cannot delete order!');
@@ -1419,6 +1467,9 @@ sub delete_order_quotation {
 sub invoice {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+  $auth->assert($form->{type} eq 'purchase_order' || $form->{type} eq 'request_quotation' ? 'vendor_invoice_edit' : 'invoice_edit');
+
   $form->{old_employee_id} = $form->{employee_id};
   $form->{old_salesman_id} = $form->{salesman_id};
 
@@ -1583,6 +1634,9 @@ sub invoice {
 
 sub backorder_exchangerate {
   $lxdebug->enter_sub();
+
+  check_oe_access();
+
   my ($orddate, $buysell) = @_;
 
   $form->header;
@@ -1597,6 +1651,7 @@ sub backorder_exchangerate {
   map { delete $form->{$_} } qw(action header exchangerate);
 
   foreach $key (keys %$form) {
+    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
     $form->{$key} =~ s/\"/&quot;/g;
     print qq|<input type=hidden name=$key value="$form->{$key}">\n|;
   }
@@ -1605,9 +1660,6 @@ sub backorder_exchangerate {
 
   print qq|
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <input type=hidden name=exchangeratedate value=$orddate>
 <input type=hidden name=buysell value=$buysell>
 
@@ -1733,6 +1785,8 @@ sub create_backorder {
 sub save_as_new {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+
   $form->{saveasnew} = 1;
   $form->{closed}    = 0;
   map { delete $form->{$_} } qw(printed emailed queued);
@@ -1755,6 +1809,8 @@ sub save_as_new {
 sub check_for_direct_delivery_yes {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+
   $form->{direct_delivery_checked} = 1;
   delete @{$form}{grep /^shipto/, keys %{ $form }};
   map { s/^CFDD_//; $form->{$_} = $form->{"CFDD_${_}"} } grep /^CFDD_/, keys %{ $form };
@@ -1766,6 +1822,8 @@ sub check_for_direct_delivery_yes {
 sub check_for_direct_delivery_no {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+
   $form->{direct_delivery_checked} = 1;
   delete @{$form}{grep /^shipto/, keys %{ $form }};
   purchase_order();
@@ -1776,6 +1834,8 @@ sub check_for_direct_delivery_no {
 sub check_for_direct_delivery {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+
   if ($form->{direct_delivery_checked}
       || (!$form->{shiptoname} && !$form->{shiptostreet} && !$form->{shipto_id})) {
     $lxdebug->leave_sub();
@@ -1790,7 +1850,7 @@ sub check_for_direct_delivery {
   }
 
   delete $form->{action};
-  $form->{VARIABLES} = [ map { { "key" => $_, "value" => $form->{$_} } } grep { ref $_ eq "" } keys %{ $form } ];
+  $form->{VARIABLES} = [ map { { "key" => $_, "value" => $form->{$_} } } grep { ($_ ne 'login') && ($_ ne 'password') && (ref $_ eq "") } keys %{ $form } ];
 
   $form->header();
   print $form->parse_html_template("oe/check_for_direct_delivery");
@@ -1803,6 +1863,9 @@ sub check_for_direct_delivery {
 sub purchase_order {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+  $auth->assert('purchase_order_edit');
+
   if ($form->{type} eq 'sales_order') {
     check_for_direct_delivery();
   }
@@ -1830,6 +1893,9 @@ sub purchase_order {
 sub sales_order {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+  $auth->assert('sales_order_edit');
+
   if (   $form->{type} eq 'sales_quotation'
       || $form->{type} eq 'request_quotation') {
     OE->close_order(\%myconfig, $form);
@@ -1853,6 +1919,9 @@ sub sales_order {
 sub poso {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+  $auth->assert('purchase_order_edit | sales_order_edit');
+
   $form->{transdate} = $form->current_date(\%myconfig);
   delete $form->{duedate};
 
@@ -1893,6 +1962,8 @@ sub poso {
 sub e_mail {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+
   $form->{print_and_save} = 1;
 
   $print_post = 1;
@@ -1901,10 +1972,7 @@ sub e_mail {
 
   save();
 
-  my %saved_vars;
-  map({ $saved_vars{$_} = $form->{$_}; } qw(id ordnumber quonumber));
-  restore_form($saved_form);
-  map({ $form->{$_} = $saved_vars{$_}; } qw(id ordnumber quonumber));
+  restore_form($saved_form, 0, qw(id ordnumber quonumber));
 
   edit_e_mail();
 
@@ -1925,6 +1993,8 @@ sub no {
 sub display_form {
   $lxdebug->enter_sub();
 
+  check_oe_access();
+
   $form->{"taxaccounts"} =~ s/\s*$//;
   $form->{"taxaccounts"} =~ s/^\s*//;
   foreach my $accno (split(/\s*/, $form->{"taxaccounts"})) {
index cae9bfc..eb62b06 100644 (file)
@@ -43,6 +43,8 @@ require "bin/mozilla/common.pl";
 sub add {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = "Add";
 
   # construct callback
@@ -58,6 +60,9 @@ sub add {
 
 sub edit {
   $lxdebug->enter_sub();
+
+  $auth->assert('config');
+
   # show history button
   $form->{javascript} = qq|<script type="text/javascript" src="js/show_history.js"></script>|;
   #/show hhistory button
@@ -81,6 +86,8 @@ sub edit {
 sub search {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   if ($form->{type} eq 'project') {
     $report        = "project_report";
     $sort          = 'projectnumber';
@@ -191,6 +198,8 @@ sub search {
 sub project_report {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   map { $form->{$_} = $form->unescape($form->{$_}) }
     (projectnumber, description);
   PE->projects(\%myconfig, \%$form);
@@ -325,6 +334,8 @@ sub project_report {
 sub form_project_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = $locale->text("$form->{title} Project");
 
   # $locale->text('Add Project')
@@ -407,6 +418,8 @@ sub form_project_header {
 sub form_project_footer {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   print qq|
 
 <input name=callback type=hidden value="$form->{callback}">
@@ -448,6 +461,8 @@ sub form_project_footer {
 sub save {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   if ($form->{type} eq 'project') {
     $form->isblank("projectnumber", $locale->text('Project Number missing!'));
     PE->save_project(\%myconfig, \%$form);
@@ -479,6 +494,8 @@ sub save {
 sub delete {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   PE->delete_tuple(\%myconfig, \%$form);
 
   if ($form->{type} eq 'project') {
@@ -505,6 +522,8 @@ sub continue { call_sub($form->{"nextsub"}); }
 sub partsgroup_report {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   map { $form->{$_} = $form->unescape($form->{$_}) } (partsgroup);
   PE->partsgroups(\%myconfig, \%$form);
 
@@ -612,6 +631,8 @@ sub partsgroup_report {
 sub form_partsgroup_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   $form->{title} = $locale->text("$form->{title} Group");
 
   # $locale->text('Add Group')
@@ -657,6 +678,8 @@ sub form_partsgroup_header {
 sub form_partsgroup_footer {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   print qq|
 
 <input name=callback type=hidden value="$form->{callback}">
@@ -698,6 +721,8 @@ print qq|
 sub pricegroup_report {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   map { $form->{$_} = $form->unescape($form->{$_}) } (pricegroup);
   PE->pricegroups(\%myconfig, \%$form);
 
@@ -811,6 +836,8 @@ sub pricegroup_report {
 sub form_pricegroup_header {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   # $locale->text('Add Pricegroup')
   # $locale->text('Edit Pricegroup')
 
@@ -857,6 +884,8 @@ sub form_pricegroup_header {
 sub form_pricegroup_footer {
   $lxdebug->enter_sub();
 
+  $auth->assert('config');
+
   print qq|
 
 <input name=callback type=hidden value="$form->{callback}">
index 4df612c..4734433 100644 (file)
@@ -42,6 +42,8 @@ require "bin/mozilla/common.pl";
 sub reconciliation {
   $lxdebug->enter_sub();
 
+  $auth->assert('cash');
+
   RC->paymentaccounts(\%myconfig, \%$form);
 
   $selection = "";
@@ -96,9 +98,6 @@ sub reconciliation {
 <br>
 <input type=hidden name=nextsub value=get_payments>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <input type=submit class=submit name=action value="|
     . $locale->text('Continue') . qq|">
 
@@ -116,6 +115,8 @@ sub continue { call_sub($form->{"nextsub"}); }
 sub get_payments {
   $lxdebug->enter_sub();
 
+  $auth->assert('cash');
+
   ($form->{accno}, $form->{account}) = split /--/, $form->{accno};
 
   RC->payment_transactions(\%myconfig, \%$form);
@@ -128,6 +129,8 @@ sub get_payments {
 sub display_form {
   $lxdebug->enter_sub();
 
+  $auth->assert('cash');
+
   @column_index = qw(cleared transdate source name credit debit balance);
 
   $column_header{cleared} = "<th>&nbsp;</th>";
@@ -369,9 +372,6 @@ sub display_form {
 <input type=hidden name=fromdate value=$form->{fromdate}>
 <input type=hidden name=todate value=$form->{todate}>
 
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <br>
 <input type=submit class=submit name=action value="|
     . $locale->text('Update') . qq|">
@@ -392,6 +392,8 @@ sub display_form {
 sub update {
   $lxdebug->enter_sub();
 
+  $auth->assert('cash');
+
   RC->payment_transactions(\%myconfig, \%$form);
 
   foreach $ref (@{ $form->{PR} }) {
@@ -409,6 +411,8 @@ sub update {
 sub select_all {
   $lxdebug->enter_sub();
 
+  $auth->assert('cash');
+
   RC->payment_transactions(\%myconfig, \%$form);
 
   map { $_->{cleared} = "checked" unless $_->{fx_transaction} }
@@ -422,8 +426,9 @@ sub select_all {
 sub done {
   $lxdebug->enter_sub();
 
-  $form->{callback} =
-    "$form->{script}?action=reconciliation&login=$form->{login}&password=$form->{password}";
+  $auth->assert('cash');
+
+  $form->{callback} = "$form->{script}?action=reconciliation";
 
   $form->error($locale->text('Out of balance!')) if ($form->{difference} *= 1);
 
index 38ee578..8186977 100644 (file)
@@ -34,7 +34,7 @@ sub report_generator_export_as_pdf {
     return;
   }
 
-  my @form_values = $form->flatten_variables(keys %{ $form });
+  my @form_values = $form->flatten_variables(grep { ($_ ne 'login') && ($_ ne 'password') } keys %{ $form });
 
   $form->get_lists('printers' => 'ALL_PRINTERS');
   map { $_->{selected} = $myconfig{default_printer_id} == $_->{id} } @{ $form->{ALL_PRINTERS} };
@@ -57,7 +57,7 @@ sub report_generator_export_as_csv {
     return;
   }
 
-  my @form_values = $form->flatten_variables(keys %{ $form });
+  my @form_values = $form->flatten_variables(grep { ($_ ne 'login') && ($_ ne 'password') } keys %{ $form });
 
   $form->{title} = $locale->text('CSV export -- options');
   $form->header();
index 4461286..88283d0 100644 (file)
@@ -91,9 +91,30 @@ require "bin/mozilla/reportgenerator.pl";
 # $locale->text('Non-taxable Sales')
 # $locale->text('Non-taxable Purchases')
 
+my $rp_access_map = {
+  'projects'         => 'report',
+  'ar_aging'         => 'general_ledger',
+  'ap_aging'         => 'general_ledger',
+  'receipts'         => 'cash',
+  'payments'         => 'cash',
+  'trial_balance'    => 'report',
+  'income_statement' => 'report',
+  'bwa'              => 'report',
+  'balance_sheet'    => 'report',
+};
+
+sub check_rp_access {
+  my $right   = $rp_access_map->{$form->{report}};
+  $right    ||= 'DOES_NOT_EXIST';
+
+  $auth->assert($right);
+}
+
 sub report {
   $lxdebug->enter_sub();
 
+  check_rp_access();
+
   %title = ('balance_sheet'        => 'Balance Sheet',
             'income_statement'     => 'Income Statement',
             'trial_balance'        => 'Trial Balance',
@@ -872,9 +893,6 @@ $jsscript
 </table>
 
 <br>
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
 <input type=submit class=submit name=action value="|
     . $locale->text('Continue') . qq|">
 
@@ -891,6 +909,9 @@ sub continue { call_sub($form->{"nextsub"}); }
 
 sub get_project {
   $lxdebug->enter_sub();
+
+  $auth->assert('report');
+
   my $nextsub = shift;
 
   $form->{project_id} = $form->{project_id_1};
@@ -914,6 +935,8 @@ sub get_project {
 sub generate_income_statement {
   $lxdebug->enter_sub();
 
+  $auth->assert('report');
+
   $form->{padding} = "&nbsp;&nbsp;";
   $form->{bold}    = "<b>";
   $form->{endbold} = "</b>";
@@ -1081,6 +1104,8 @@ sub generate_income_statement {
 sub generate_balance_sheet {
   $lxdebug->enter_sub();
 
+  $auth->assert('report');
+
   $form->{padding} = "&nbsp;&nbsp;";
   $form->{bold}    = "<b>";
   $form->{endbold} = "</b>";
@@ -1106,9 +1131,7 @@ sub generate_balance_sheet {
   $form->{IN} = "balance_sheet.html";
 
   # setup company variables for the form
-  map { $form->{$_} = $myconfig{$_};
-        $form->{$_} =~ s/\\n/\n/g; }
-    (qw(company address businessnumber nativecurr));
+  map { $form->{$_} = $myconfig{$_}; } (qw(company address businessnumber nativecurr));
 
   $form->{templates} = $myconfig{templates};
 
@@ -1120,6 +1143,8 @@ sub generate_balance_sheet {
 sub generate_projects {
   $lxdebug->enter_sub();
 
+  $auth->assert('report');
+
   &get_project(generate_projects);
   $form->{projectnumber} = $form->{projectnumber_1};
 
@@ -1141,6 +1166,8 @@ sub generate_projects {
 sub generate_trial_balance {
   $lxdebug->enter_sub();
 
+  $auth->assert('report');
+
   # get for each account initial balance, debits and credits
   RP->trial_balance(\%myconfig, \%$form);
 
@@ -1290,6 +1317,8 @@ sub list_accounts {
 sub generate_ar_aging {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   # split customer
   ($form->{customer}) = split(/--/, $form->{customer});
 
@@ -1307,6 +1336,8 @@ sub generate_ar_aging {
 sub generate_ap_aging {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   # split vendor
   ($form->{vendor}) = split(/--/, $form->{vendor});
 
@@ -1341,6 +1372,8 @@ sub create_aging_subtotal_row {
 sub aging {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   my $report = SL::ReportGenerator->new(\%myconfig, $form);
 
   my @columns = qw(statement ct invnumber transdate duedate c0 c30 c60 c90);
@@ -1470,6 +1503,8 @@ sub select_all {
 sub e_mail {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   # get name and email addresses
   for $i (1 .. $form->{rowcount}) {
     if ($form->{"statement_$i"}) {
@@ -1545,6 +1580,7 @@ sub e_mail {
 
   # save all other variables
   foreach $key (keys %$form) {
+    next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
     $form->{$key} =~ s/\"/&quot;/g;
     print qq|<input type=hidden name=$key value="$form->{$key}">\n|;
   }
@@ -1574,6 +1610,8 @@ sub e_mail {
 sub send_email {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   $form->{subject} = $locale->text('Statement') . qq| - $form->{todate}|
     unless $form->{subject};
 
@@ -1592,6 +1630,8 @@ sub send_email {
 sub print {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   if ($form->{media} eq 'printer') {
     $form->error($locale->text('Select postscript or PDF!'))
       if ($form->{format} !~ /(postscript|pdf)/);
@@ -1626,6 +1666,8 @@ sub print {
 sub print_form {
   $lxdebug->enter_sub();
 
+  $auth->assert('general_ledger');
+
   my %replacements =
     (
      "ä" => "ae", "ö" => "oe", "ü" => "ue",
@@ -1738,6 +1780,9 @@ sub print_form {
 
 sub statement_details {
   $lxdebug->enter_sub();
+
+  $auth->assert('general_ledger');
+
   my ($ref) = @_;
 
   push @{ $form->{invnumber} }, $ref->{invnumber};
@@ -1761,6 +1806,8 @@ sub statement_details {
 sub generate_tax_report {
   $lxdebug->enter_sub();
 
+  $auth->assert('report');
+
   RP->tax_report(\%myconfig, \%$form);
 
   $descvar     = "$form->{accno}_description";
@@ -1771,13 +1818,13 @@ sub generate_tax_report {
 
   # construct href
   $href =
-    "$form->{script}?&action=generate_tax_report&login=$form->{login}&password=$form->{password}&fromdate=$form->{fromdate}&todate=$form->{todate}&db=$form->{db}&method=$form->{method}&accno=$form->{accno}&$descvar=$description&department=$department&$ratevar=$taxrate&report=$form->{report}";
+    "$form->{script}?&action=generate_tax_report&fromdate=$form->{fromdate}&todate=$form->{todate}&db=$form->{db}&method=$form->{method}&accno=$form->{accno}&$descvar=$description&department=$department&$ratevar=$taxrate&report=$form->{report}";
 
   # construct callback
   $description = $form->escape($form->{$descvar},   1);
   $department  = $form->escape($form->{department}, 1);
   $callback    =
-    "$form->{script}?&action=generate_tax_report&login=$form->{login}&password=$form->{password}&fromdate=$form->{fromdate}&todate=$form->{todate}&db=$form->{db}&method=$form->{method}&accno=$form->{accno}&$descvar=$description&department=$department&$ratevar=$taxrate&report=$form->{report}";
+    "$form->{script}?&action=generate_tax_report&fromdate=$form->{fromdate}&todate=$form->{todate}&db=$form->{db}&method=$form->{method}&accno=$form->{accno}&$descvar=$description&department=$department&$ratevar=$taxrate&report=$form->{report}";
 
   $title = $form->escape($form->{title});
   $href .= "&title=$title";
@@ -1916,7 +1963,7 @@ sub generate_tax_report {
 
     $column_data{id}        = qq|<td>$ref->{id}</td>|;
     $column_data{invnumber} =
-      qq|<td><a href=$module?action=edit&id=$ref->{id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{invnumber}</a></td>|;
+      qq|<td><a href=$module?action=edit&id=$ref->{id}&callback=$callback>$ref->{invnumber}</a></td>|;
     $column_data{transdate} = qq|<td>$ref->{transdate}</td>|;
     $column_data{name}      = qq|<td>$ref->{name}&nbsp;</td>|;
 
@@ -2013,6 +2060,8 @@ sub tax_subtotal {
 sub list_payments {
   $lxdebug->enter_sub();
 
+  $auth->assert('cash');
+
   if ($form->{account}) {
     ($form->{paymentaccounts}) = split /--/, $form->{account};
   }
@@ -2205,6 +2254,9 @@ sub print_options {
 
 sub generate_bwa {
   $lxdebug->enter_sub();
+
+  $auth->assert('report');
+
   $form->{padding} = "&nbsp;&nbsp;";
   $form->{bold}    = "<b>";
   $form->{endbold} = "</b>";
index f2b1f72..d7ef9ca 100644 (file)
@@ -24,7 +24,6 @@
 # German Tax authority Module and later ELSTER Interface
 #======================================================================
 
-require "bin/mozilla/arap.pl";
 require "bin/mozilla/common.pl";
 
 #use strict;
@@ -69,13 +68,13 @@ use SL::User;
 # $locale->text('Nov')
 # $locale->text('Dec')
 
-# $form->parse_html_template('generic/util_hidden_variables');
-
 #############################
 
 sub report {
   $lxdebug->enter_sub();
 
+  $auth->assert('advance_turnover_tax_return');
+
   my $myconfig = \%myconfig;
 
   $form->{title} = $locale->text('UStVA');
@@ -113,9 +112,8 @@ sub report {
 
   my $company_given = ($form->{company} ne '') 
     ? qq|<h3>$form->{company}</h3>\n|
-    : qq|<a href=am.pl?action=config|
-      . qq|&level=Programm--Preferences&login=$form->{login}|
-      . qq|&password=$form->{password}>| 
+    : qq|<a href="am.pl?action=config|
+      . qq|&level=Programm--Preferences">| 
       . $locale->text('No Company Name given') . qq|!</a><br>|;
 
 
@@ -139,9 +137,8 @@ sub report {
     ? qq|$form->{co_street}<br>|
         . qq|$form->{co_street1}<br>|
         . qq|$form->{co_zip} $form->{co_city}|
-    : qq|<a href=am.pl?action=config|
-        . qq|&level=Programm--Preferences&login=$form->{login}|
-        . qq|&password=$form->{password}>| 
+    : qq|<a href="am.pl?action=config|
+        . qq|&level=Programm--Preferences">| 
         . $locale->text('No Company Address given') 
         . qq|!</a>\n|;
 
@@ -153,8 +150,7 @@ sub report {
   my $taxnumber_given = ($form->{steuernummer} ne '')
     ? qq|$form->{steuernummer}|
     : qq|<a href="ustva.pl?action="config_step1"|
-      . qq|&level=Programm--Finanzamteinstellungen&login=$form->{login}|
-      . qq|&password=$form->{password}">Keine Steuernummer hinterlegt!|
+      . qq|&level=Programm--Finanzamteinstellungen">Keine Steuernummer hinterlegt!|
       . qq|</a><br>|;
 
   my $ustva_vorauswahl = &ustva_vorauswahl();
@@ -229,6 +225,8 @@ sub report {
 sub help {
   $lxdebug->enter_sub();
 
+  $auth->assert('advance_turnover_tax_return');
+
   # parse help documents under doc
   my $tmp = $form->{templates};
   $form->{templates} = 'doc';
@@ -244,6 +242,8 @@ sub help {
 sub show {
   $lxdebug->enter_sub();
 
+  $auth->assert('advance_turnover_tax_return');
+
   #&generate_ustva();
   no strict 'refs';
   $lxdebug->leave_sub();
@@ -254,6 +254,8 @@ sub show {
 sub ustva_vorauswahl {
   $lxdebug->enter_sub();
 
+  $auth->assert('advance_turnover_tax_return');
+
   my $select_vorauswahl;
 
   #Aktuelles Datum zerlegen:
@@ -490,6 +492,8 @@ sub debug {
 sub show_options {
   $lxdebug->enter_sub();
 
+  $auth->assert('advance_turnover_tax_return');
+
   #  $form->{PD}{$form->{type}} = "selected";
   #  $form->{DF}{$form->{format}} = "selected";
   #  $form->{OP}{$form->{media}} = "selected";
@@ -534,6 +538,8 @@ sub show_options {
 sub generate_ustva {
   $lxdebug->enter_sub();
 
+  $auth->assert('advance_turnover_tax_return');
+
   # Aufruf von get_config zum Einlesen der Finanzamtdaten aus finanzamt.ini
 
   USTVA->get_config($userspath, 'finanzamt.ini');
@@ -1030,7 +1036,6 @@ sub generate_ustva {
         dec_places  => '0',
     });
 
-    $form->{"Watchdog::USTVA"} = 1;
     $form->{USTVA} = [];
 
     if ( $form->{format} eq 'generic') { # Formatierungen für HTML Ausgabe
@@ -1084,6 +1089,8 @@ sub generate_ustva {
 sub config_step1 {
   $lxdebug->enter_sub();
 
+  $auth->assert('advance_turnover_tax_return');
+
   # edit all taxauthority prefs
 
   $form->header;
@@ -1093,14 +1100,6 @@ sub config_step1 {
   my $amt  = $form->{elsterFFFF};
 
 
-  if ($form->{cbscript} ne '' and $form->{cblogin} ne '') {
-    $callback =  qq|$form->{cbscript}|
-                .qq|?action="config_step1"|
-                .qq|&login="$form->{cblogin}"|
-                .qq|&root="$form->{cbroot}"|
-                .qq|&rpw="$form->{cbrpw}"|;
-  }
-
   $form->{title} = $locale->text('Tax Office Preferences');
 
 
@@ -1133,7 +1132,7 @@ sub config_step1 {
     FA_BLZ_2            FA_Kontonummer_2  FA_Bankbezeichnung_oertlich
     FA_Oeffnungszeiten  FA_Email          FA_Internet
     steuernummer        elsterland        elstersteuernummer
-    elsterFFFF          login             password
+    elsterFFFF
   );
 
   foreach my $variable (@_hidden_form_variables) {
@@ -1168,6 +1167,9 @@ sub config_step1 {
 
 sub config_step2 {
   $lxdebug->enter_sub();
+
+  $auth->assert('advance_turnover_tax_return');
+
   $form->header();
 
 #  print qq|
@@ -1282,7 +1284,6 @@ sub config_step2 {
     FA_voranmeld            method
     FA_dauerfrist           FA_71 
     elster                  
-    login                   password 
     type                    elster_init 
     saved                   callback
   );
@@ -1309,6 +1310,9 @@ sub config_step2 {
 
 sub create_steuernummer {
   $lxdebug->enter_sub();
+
+  $auth->assert('advance_turnover_tax_return');
+
   my $part           = $form->{part};
   my $patterncount   = $form->{patterncount};
   my $delimiter      = $form->{delimiter};
@@ -1346,6 +1350,8 @@ sub create_steuernummer {
 sub save {
   $lxdebug->enter_sub();
 
+  $auth->assert('advance_turnover_tax_return');
+
   my $filename = "$form->{login}_$form->{filename}";
   $filename =~ s|.*/||;
 
@@ -1426,6 +1432,9 @@ sub back {
 
 sub elster_hash {
   $lxdebug->enter_sub();
+
+  $auth->assert('advance_turnover_tax_return');
+
   my $finanzamt = USTVA->query_finanzamt(\%myconfig, \%$form);
   $lxdebug->leave_sub();
   return $finanzamt;
diff --git a/config/authentication.pl.default b/config/authentication.pl.default
new file mode 100644 (file)
index 0000000..8e1749c
--- /dev/null
@@ -0,0 +1,60 @@
+#!/usr/bin/perl
+
+# Das Passwort für den Zugang zum Administrationsfrontend im Klartext.
+# Kann nur in dieser Datei geändert werden, nicht im Administrationsfrontend
+# selber.
+$self->{admin_password} = 'admin';
+
+# Welches Modul soll zur Authentifizierung der Logins benutzt werden?
+# Entweder 'DB' oder 'LDAP'.
+#
+# Wenn LDAP-Authentifizierung benutzt wird, dann kann der Benutzer sein
+# Passwort nicht über Lx-Office ändern.
+$self->{module} = 'DB';
+
+# Verbindungsinformationen zur Datenbank mit den Benutzer- und
+# Gruppeninformationen. Wird auch dann benötigt, wenn gegen einen
+# LDAP-Server authentifiziert wird, weil dieser nur zur Passwortüberprüfung
+# benutzt wird. Der Rest der Benutzerdaten ist in der Datenbank hinterlegt.
+#
+# Ist 'module' = 'DB' dann wird diese Datenbank auch für die
+# Passwortüberprüfung benutzt.
+$self->{DB_config} = {
+  'host'     => 'localhost',
+  'port'     => 5432,
+  'db'       => 'lxerp_auth',
+  'user'     => 'postgres',
+  'password' => '',
+};
+
+# Wird nur benötigt, wenn 'module' = 'LDAP' ist. An diesem LDAP-Server
+# werden die Benutzerpasswörter durch einen LDAP-Bind überprüft.
+#
+# Es müssen mindestens die Parameter host, attribute und base_dn
+# angegeben werden.
+#
+# tls:       Verschlüsselung per TLS erzwingen
+# attribute: Das LDAP-Attribut, das den Loginnamen enthält
+# base_dn:   Basis-DN, ab der der LDAP-Baum durchsucht wird
+# filter:    Ein optionaler LDAP-Filter. Die Zeichenkette '<%login%>' wird
+#            innerhalb des Filters durch den Loginnamen ersetzt.
+# bind_dn und bind_password:
+#            Wenn zum Durchsuchen des LDAP-Baumes eine Anmeldung erforderlich
+#            ist (z.B. beim ActiveDirectory), dann müssen diese beiden
+#            Parameter gesetzt sein.
+$self->{LDAP_config} = {
+  'host'          => 'localhost',
+  'port'          => 389,
+  'tls'           => 0,
+  'attribute'     => 'uid',
+  'base_dn'       => '',
+  'filter'        => '',
+
+  'bind_dn'       => undef,
+  'bind_password' => undef,
+};
+
+# Der Name des Cookies kann geändert werden, sofern gewünscht.
+# $self->{cookie_name} = 'lx_office_erp_session_id';
+
+1;
diff --git a/config/lx-erp.conf b/config/lx-erp.conf
new file mode 100644 (file)
index 0000000..abea479
--- /dev/null
@@ -0,0 +1,109 @@
+use Cwd;
+use vars qw($userspath $spool $memberfile $templates $sendmail $language $sid $latex $eur $webdav $lizenzen $pg_dump_exe $pg_restore_exe $watch_form_variables);
+
+# path to user configuration files
+$userspath = "users";
+
+# spool directory for batch printing
+$spool = "spool";
+
+# templates base directory
+$templates = "templates";
+
+# member file
+$memberfile = "users/members";
+
+# Wenn nicht Bilanzierung dann auf 1 setzen
+$eur= 1;
+
+# location of sendmail
+$sendmail = '| /usr/sbin/sendmail -t<%if myconfig_email%> -f <%myconfig_email%><%end%>';
+
+# set language for login and admin
+$language = "de";
+
+# Oracle
+$sid = "T80509";
+$ENV{"ORACLE_HOME"} = "/usr/local/oracle";
+
+# if you have latex installed set to 1
+$latex_templates = 1;
+
+# if the server can't find gzip, latex, dvips or pdflatex, add the path
+$ENV{PATH} .= ":/usr/local/bin";
+
+# on mac os X using Fink's Perl libs, add the path
+$ENV{PERL5LIB} .= ":/sw/lib/perl5";
+
+# Aktivierung der verschiedenen Spezialmodule
+$webdav = 0;
+$lizenzen = 1;
+
+## Support fuer OpenDocument-Vorlagen
+# Diese Option legt fest, ob OpenDocument-Vorlagen generell verfuegbar sind.
+$opendocument_templates = 1;
+
+# Die folgenden zwei Variablen legen Pfade zu Programmen fest, die benoetigt
+# werden, um OpenDocument-Vorlagen in PDFs umzuwandeln.
+
+# Pfad zu OpenOffice.org writer
+$openofficeorg_writer_bin = "/usr/bin/oowriter";
+
+# Soll OpenOffice dauerhaft gestartet bleiben? Die Konvertierung nachfolgender
+# Dokumente geht dann schneller. Allerdings wird auf dem System ein
+# installiertes Python mit den Python-UNO-Bindings benoetigt, die Bestandteil
+# von OpenOffice sind.
+$openofficeorg_daemon = 1;
+$openofficeorg_daemon_port = 2002;
+
+# Pfad zum "X virtual frame buffer", unter dem OpenOffice gestartet wird.
+# Zusaetzlich muessen die Programme "xauth" und "mcookie" gefunden werden
+# koennen, was eine Aenderung an PATH bedeuten kann.
+$ENV{"PATH"} = $ENV{"PATH"} . ":/usr/X11R6/bin:/usr/X11/bin";
+$xvfb_bin = "/usr/bin/Xvfb";
+
+# Das charset, in dem die Daten in der Datenbank abgelegt sind.
+# $dbcharset = 'UTF-8'; # Für UNICODE UTF-8 
+$dbcharset = "ISO-8859-15";
+
+
+# Pfad zu 'html2ps' zum Export von Listenansichten als PDF
+$html2ps_bin = "/usr/bin/html2ps";
+$ghostscript_bin = "/usr/bin/gs";
+
+
+
+# Datenbankbackups werden mit dem externen Programm "pg_dump" erledigt.
+# Wenn es nicht im aktuellen Pfad vorhanden ist, so muss hier der vollständige
+# Pfad eingetragen werden. Wenn die Variable auf "DISABLED" gesetzt wird,
+# so wird der Menüpunkt zum Backup von Datenbanken im Administrationsfrontend
+# nicht angeboten.
+# Das gleiche gilt analog für das Wiederherstellen mittels "pg_restore".
+$pg_dump_exe    = "pg_dump";
+$pg_restore_exe = "pg_restore";
+
+# Globale Debug-Ausgaben (de-)aktivieren? Moegliche Werte sind
+# LXDebug::NONE   - keine Debugausgaben
+# LXDebug::INFO
+# LXDebug::DEBUG1 
+# LXDebug::DEBUG2 
+# LXDebug::QUERY  - SQL Queries 
+# LXDebug::TRACE  - Tracing von Funktionsaufrufen
+# LXDebug::BACKTRACE_ON_ERROR - Vollständiger Aufrufpfad, wenn $form->error() aufgerufen wird
+# LXDebug::ALL    - alle Debugausgaben
+#
+# LXDebug::DEVEL  - wie INFO | QUERY | TRACE | BACKTRACE_ON_ERROR
+#
+# Beipiel: 
+#   $LXDebug::global_level = LXDebug::TRACE | LXDebug::QUERY;
+$LXDebug::global_level = LXDebug::NONE;
+
+# Überwachung der Inhalte von $form aktiviert oder nicht? Wenn ja,
+# dann können einzelne Variablen mit
+#   $form->{"Watchdog::<variablenname>"} = 1;
+# überwacht werden. Bedeutet aber auch einen Geschwindigkeitsverlust,
+# weshalb sie normalerweise deaktiviert ist.
+$LXDebug::watch_form = 0;
+
+1;
+
diff --git a/config/lx-erp.conf.default b/config/lx-erp.conf.default
new file mode 100644 (file)
index 0000000..abea479
--- /dev/null
@@ -0,0 +1,109 @@
+use Cwd;
+use vars qw($userspath $spool $memberfile $templates $sendmail $language $sid $latex $eur $webdav $lizenzen $pg_dump_exe $pg_restore_exe $watch_form_variables);
+
+# path to user configuration files
+$userspath = "users";
+
+# spool directory for batch printing
+$spool = "spool";
+
+# templates base directory
+$templates = "templates";
+
+# member file
+$memberfile = "users/members";
+
+# Wenn nicht Bilanzierung dann auf 1 setzen
+$eur= 1;
+
+# location of sendmail
+$sendmail = '| /usr/sbin/sendmail -t<%if myconfig_email%> -f <%myconfig_email%><%end%>';
+
+# set language for login and admin
+$language = "de";
+
+# Oracle
+$sid = "T80509";
+$ENV{"ORACLE_HOME"} = "/usr/local/oracle";
+
+# if you have latex installed set to 1
+$latex_templates = 1;
+
+# if the server can't find gzip, latex, dvips or pdflatex, add the path
+$ENV{PATH} .= ":/usr/local/bin";
+
+# on mac os X using Fink's Perl libs, add the path
+$ENV{PERL5LIB} .= ":/sw/lib/perl5";
+
+# Aktivierung der verschiedenen Spezialmodule
+$webdav = 0;
+$lizenzen = 1;
+
+## Support fuer OpenDocument-Vorlagen
+# Diese Option legt fest, ob OpenDocument-Vorlagen generell verfuegbar sind.
+$opendocument_templates = 1;
+
+# Die folgenden zwei Variablen legen Pfade zu Programmen fest, die benoetigt
+# werden, um OpenDocument-Vorlagen in PDFs umzuwandeln.
+
+# Pfad zu OpenOffice.org writer
+$openofficeorg_writer_bin = "/usr/bin/oowriter";
+
+# Soll OpenOffice dauerhaft gestartet bleiben? Die Konvertierung nachfolgender
+# Dokumente geht dann schneller. Allerdings wird auf dem System ein
+# installiertes Python mit den Python-UNO-Bindings benoetigt, die Bestandteil
+# von OpenOffice sind.
+$openofficeorg_daemon = 1;
+$openofficeorg_daemon_port = 2002;
+
+# Pfad zum "X virtual frame buffer", unter dem OpenOffice gestartet wird.
+# Zusaetzlich muessen die Programme "xauth" und "mcookie" gefunden werden
+# koennen, was eine Aenderung an PATH bedeuten kann.
+$ENV{"PATH"} = $ENV{"PATH"} . ":/usr/X11R6/bin:/usr/X11/bin";
+$xvfb_bin = "/usr/bin/Xvfb";
+
+# Das charset, in dem die Daten in der Datenbank abgelegt sind.
+# $dbcharset = 'UTF-8'; # Für UNICODE UTF-8 
+$dbcharset = "ISO-8859-15";
+
+
+# Pfad zu 'html2ps' zum Export von Listenansichten als PDF
+$html2ps_bin = "/usr/bin/html2ps";
+$ghostscript_bin = "/usr/bin/gs";
+
+
+
+# Datenbankbackups werden mit dem externen Programm "pg_dump" erledigt.
+# Wenn es nicht im aktuellen Pfad vorhanden ist, so muss hier der vollständige
+# Pfad eingetragen werden. Wenn die Variable auf "DISABLED" gesetzt wird,
+# so wird der Menüpunkt zum Backup von Datenbanken im Administrationsfrontend
+# nicht angeboten.
+# Das gleiche gilt analog für das Wiederherstellen mittels "pg_restore".
+$pg_dump_exe    = "pg_dump";
+$pg_restore_exe = "pg_restore";
+
+# Globale Debug-Ausgaben (de-)aktivieren? Moegliche Werte sind
+# LXDebug::NONE   - keine Debugausgaben
+# LXDebug::INFO
+# LXDebug::DEBUG1 
+# LXDebug::DEBUG2 
+# LXDebug::QUERY  - SQL Queries 
+# LXDebug::TRACE  - Tracing von Funktionsaufrufen
+# LXDebug::BACKTRACE_ON_ERROR - Vollständiger Aufrufpfad, wenn $form->error() aufgerufen wird
+# LXDebug::ALL    - alle Debugausgaben
+#
+# LXDebug::DEVEL  - wie INFO | QUERY | TRACE | BACKTRACE_ON_ERROR
+#
+# Beipiel: 
+#   $LXDebug::global_level = LXDebug::TRACE | LXDebug::QUERY;
+$LXDebug::global_level = LXDebug::NONE;
+
+# Überwachung der Inhalte von $form aktiviert oder nicht? Wenn ja,
+# dann können einzelne Variablen mit
+#   $form->{"Watchdog::<variablenname>"} = 1;
+# überwacht werden. Bedeutet aber auch einen Geschwindigkeitsverlust,
+# weshalb sie normalerweise deaktiviert ist.
+$LXDebug::watch_form = 0;
+
+1;
+
index f9ca522..d6f890d 100644 (file)
@@ -27,7 +27,8 @@
 * Installation des Programmpaketes:: Installationsort, Berechtigungen
 * Anpassung der PostgreSQL-Konfiguration:: Verschiedene Aspekte der Datenbankkonfiguration
 * Apache-Konfiguration:: Einrichtung eines Aliases und Optionen für das Ausführen von CGI-Scripten
-* Benutzer und Datenbanken anlegen:: Letzte Schritte vor der Anmeldung
+* Benutzerauthentifizierung und Administratorpasswort:: Einrichtung der Authentifizierungsdatenbank und der Passwortüberprüfung
+* Benutzer- und Gruppenverwaltung:: Einrichten von Benutzern, Gruppen und Datenbanken
 * OpenDocument-Vorlagen:: Wichtige Hinweise zum Erstellen und zur Verwendung von Dokumentenvorlagen
 * Lx-Office ERP verwenden:: Die URLs zur Anmeldung und Administration
 @end menu
@@ -259,25 +260,298 @@ folgende Option in die Konfiguration aufzunehmen:
 
 @c ---------------------------------------------------------------
 
-@node Benutzer und Datenbanken anlegen
-@chapter Benutzer und Datenbanken anlegen
+@node Benutzerauthentifizierung und Administratorpasswort
+@chapter Benutzerauthentifizierung und Administratorpasswort
 
-Nach der Installation müssen Benutzer und Datenbanken angelegt werden.
-Dieses geschieht im Administrationsmenü, dass Sie unter folgender URL
-finden:
+Informationen über die Einrichtung der Benutzerauthentifizierung, über
+die Verwaltung von Gruppen und weitere Einstellungen
 
-@code{http://localhost/lx-erp/admin.pl}
+@menu
+* Grundlagen zur Benutzerauthentifizierung:: Verfügbare Methoden, Name der Konfigurationsdatei
+* Administratorpasswort:: Wo das Administratorpasswort gesetzt werden kann
+* Authentifizierungsdatenbank:: Verbindungseinstellungen zur Authentifizierungsdatenbank
+* Passwortüberprüfung:: Einstellungen zur Überprüfung der Benutzerpasswörter
+* Name des Session-Cookies:: Ändern des Cookie-Namens bei Verwendung mehrerer Lx-Office-Installationen auf einem Server
+* Anlegen der Authentifizierungsdatenbank:: Wie die Authentifizierungsdatenbank angelegt wird
+@end menu
+
+@c ---------------------------------------------------------------
+
+@node Grundlagen zur Benutzerauthentifizierung
+@section Grundlagen zur Benutzerauthentifizierung
+
+Lx-Office verwaltet die Benutzerinformationen in einer Datenbank, die
+im folgenden ``Authentifizierungsdatenbank'' genannt wird. Für jeden
+Benutzer kann dort eine eigene Datenbank für die eigentlichen
+Finanzdaten hinterlegt sein. Diese beiden Datenbanken können, müssen
+aber nicht unterschiedlich sein.
+
+Im einfachsten Fall gibt es für Lx-Office nur eine einzige Datenbank,
+in der sowohl die Benutzerinformationen als auch die Daten abgelegt
+werden.
+
+Zusätzlich ermöglicht es Lx-Office, dass die Benutzerpasswörter
+entweder gegen die Authentifizierungsdatenbank oder gegen einen
+LDAP-Server überprüft werden.
+
+Welche Art der Passwortüberprüfung Lx-Office benutzt und wie Lx-Office
+die Authentifizierungsdatenbank erreichen kann, wird in der
+Konfigurationsdatei @code{config/authentication.pl} festgelegt. Diese
+muss bei der Installation und bei einem Upgrade von einer Version vor
+v2.4.4 angelegt werden. Eine Beispielkonfigurationsdatei
+@code{config/authentication.pl.default} existiert, die als Vorlage
+benutzt werden kann.
+
+@node Administratorpasswort
+@section Administratorpasswort
+
+Das Passwort, das zum Zugriff auf das Aministrationsinterface benutzt wird,
+wird ebenfalls in dieser Datei gespeichert. Es kann auch nur dort und nicht
+mehr im Administrationsinterface selber geändert werden. Der Parameter dazu
+heißt @code{$self->@{admin_password@}}.
+
+@node Authentifizierungsdatenbank
+@section Authentifizierungsdatenbank
+
+Die Verbindung zur Authentifizierungsdatenbank wird mit den Parametern
+in @code{$self->@{DB_config@}} konfiguriert. Hier sind die folgenden
+Parameter anzugeben:
+
+@itemize
+@item
+@samp{host} -- Der Rechnername oder die IP-Adresse des Datenbankservers
+@item
+@samp{port} -- Die Portnummer des Datenbankservers, meist 5432
+@item
+@samp{db} -- Der Name der Authentifizierungsdatenbank
+@item
+@samp{user} -- Der Benutzername, mit dem sich Lx-Office beim Datenbankserver anmeldet (z.B. ``postgres'')
+@item
+@samp{password} -- Das Passwort für den Datenbankbenutzer
+@end itemize
+
+Die Datenbank muss noch nicht existieren. Lx-Office kann sie
+automatisch anlegen (mehr dazu siehe unten).
+
+@node Passwortüberprüfung
+@section Passwortüberprüfung
+
+Lx-Office unterstützt Passwortüberprüfung auf zwei Arten: gegen die
+Authentifizierungsdatenbank und gegen einen externen LDAP- oder
+Active-Directory-Server. Welche davon benutzt wird, regelt der
+Parameter @code{$self->@{module@}}.
+
+Sollen die Benutzerpasswörter in der Authentifizierungsdatenbank
+gespeichert werden, so muss der Parameter @code{$self->@{module@}} den
+Wert @samp{DB} enthalten. In diesem Fall können sowohl der
+Administrator als auch die Benutzer selber ihre Psaswörter in
+Lx-Office ändern.
+
+Soll hingegen ein externer LDAP- oder Active-Directory-Server benutzt
+werden, so muss der Parameter @code{$self->@{module@}} auf @samp{LDAP}
+gesetzt werden. In diesem Fall müssen zusätzliche Informationen über
+den LDAP-Server in @code{$self->@{LDAP_config@}} angegeben werden:
+
+@itemize
+@item
+@samp{host} -- Der Rechnername oder die IP-Adresse des LDAP- oder Active-Directory-Servers. Diese Angabe ist zwingend erforderlich.
+@item
+@samp{port} -- Die Portnummer des LDAP-Servers; meist 389.
+@item
+@samp{tls} -- Wenn Verbindungsverschlüsselung gewünscht ist, so diesen Wert auf @samp{1} setzen, andernfalls auf @samp{0} belassen
+@item
+@samp{attribute'} -- Das LDAP-Attribut, in dem der Benutzername steht, den der Benutzer eingegeben hat. Für Active-Directory-Server
+  ist dies meist @samp{sAMAccountName}, für andere LDAP-Server hingegen @samp{uid}. Diese Angabe ist zwingend erforderlich.
+@item
+@samp{base_dn} -- Der Abschnitt des LDAP-Baumes, der durchsucht werden soll. Diese Angabe ist zwingend erforderlich.
+@item
+@samp{filter} -- Ein optionaler LDAP-Filter. Enthält dieser Filter das Wort @code{<%login%>}, so wird dieses durch den vom Benutzer
+  eingegebenen Benutzernamen ersetzt. Andernfalls wird der LDAP-Baum nach einem Element durchsucht, bei dem das oben angegebene Attribut
+  mit dem Benutzernamen identisch ist.
+@item
+@samp{bind_dn} und @samp{bind_password} -- Wenn der LDAP-Server eine Anmeldung erfordert, bevor er durchsucht werden kann (z.B. ist dies bei
+  Active-Directory-Servern der Fall), so kann diese hier angegeben werden. Für Active-Directory-Server kann als @samp{bind_dn} entweder eine
+  komplette LDAP-DN wie z.B. @samp{cn=Martin Mustermann,cn=Users,dc=firmendomain} auch nur der volle Name des Benutzers
+  eingegeben werden; in diesem Beispiel also @samp{Martin Mustermann}.
+@end itemize
 
-Zuerst muss eine Datenbank angelegt werden, anschließend ein
-Benutzer. Verwenden Sie für den Datenbankzugriff den eben angelegten
-Benutzer ``lxoffice''.
+@node Name des Session-Cookies
+@section Name des Session-Cookies
+
+Sollen auf einem Server mehrere Lx-Office-Installationen aufgesetzt
+werden, so müssen die Namen der Session-Cookies für alle
+Installationen unterschiedlich sein. Der Name des Cookies wird mit dem
+Parameter @code{$self->@{cookie_name@}} gesetzt.
+
+Diese Angabe ist optional, wenn nur eine Installation auf dem Server
+existiert.
+
+@node Anlegen der Authentifizierungsdatenbank
+@section Anlegen der Authentifizierungsdatenbank
+
+Nachdem alle Einstellungen in @code{config/authentication.pl}
+vorgenommen wurden, muss Lx-Office die Authentifizierungsdatenbank
+anlegen. Dieses geschieht automatisch, wenn Sie sich im
+Administrationsmodul anmelden, das unter der folgenden URL erreichbar
+sein sollte:
+
+@uref{http://localhost/lx-erp/admin.pl}
+
+
+@c ---------------------------------------------------------------
+
+@node Benutzer- und Gruppenverwaltung
+@chapter Benutzer- und Gruppenverwaltung
+
+Nach der Installation müssen Benutzer, Gruppen und Datenbanken
+angelegt werden.  Dieses geschieht im Administrationsmenü, dass Sie
+unter folgender URL finden:
+
+@uref{http://localhost/lx-erp/admin.pl}
+
+Verwenden Sie zur Anmeldung das Password, dass Sie in der Datei
+@code{config/authentication.pl} eingetragen haben.
+
+@menu
+* Zusammenhänge:: Übersicht über Benutzer, Gruppen, Berechtigungen und Datenbanken
+* Datenbanken anlegen:: Hinweise zum Anlegen von Datenbanken
+* Gruppen anlegen:: Hinweise zum Anlegen von Gruppen
+* Benutzer anlegen:: Hinweise zum Anlegen von Benutzern
+* Gruppenmitgliedschaften verwalten:: Wie man Gruppen Benutzer zuordnet
+* Migration alter Installationen:: Automatische Übernahme bei Update von einer älteren Version
+@end menu
+
+@node Zusammenhänge
+@section Zusammenhänge
+
+Lx-Office verwendet eine Datenbank zum Speichern all seiner
+Informationen wie Kundendaten, Artikel, Angebote, Rechnungen etc. Um
+mit Lx-Office arbeiten zu können, muss eine Person einen
+Benutzeraccount haben. Jedem Benutzeraccount wiederum wird genau eine
+Datenbank zugewiesen, mit der dieser Benutzer arbeiten kann. Es ist
+möglich und normal, dass mehreren Benutzern die selbe Datenbank
+zugewiesen wird, sodass sie alle mit den selben Daten arbeiten können.
+
+Die Basisdaten der Benutzer, die in der Administration eingegeben
+werden können, werden in einer zweiten Datenbank gespeichert, der
+bereits erwähnten Authentifizierungsdatenbank. Diese ist also den
+Produktivdaten enthaltenden Datenbanken vorgeschaltet. Pro
+Lx-Office-Installation gibt es nur eine Authentifizierungsdatenbank,
+aber beliebig viele Datenbanken mit Firmendaten.
+
+Lx-Office lann seinen Benutzern Zugriff auf bestimmte
+Funktionsbereiche erlauben oder verbieten. Wird der Zugriff nicht
+gestattet, so werden der entsprechenden Menüpunkte auch nicht
+angezeigt. Diese Rechte werden ebenfalls in der
+Authentifizierungsdatenbank gespeichert.
+
+Um Rechte verteilen zu können, verwendet Lx-Office ein
+Gruppen-Prinzip. Einer Gruppe kann der Zugriff auf bestimmte Bereiche
+erlaubt werden. Ein Benutzer wiederum kann Mitglied in einer oder
+mehrerer Gruppen sein. Der Benutzer hat Zugriff auf alle diejenigen
+Funktionen, die mindestens einer Gruppe erlaubt sind, in der der
+Benutzer Mitglied ist.
+
+Die allgemeine Reihenfolge, in der Datenbanken, Gruppen und Benutzer
+angelegt werden sollten, lautet:
+
+@enumerate
+@item
+Datenbank anlegen
+@item
+Gruppen anlegen
+@item
+Benutzer anlegen
+@item
+Benutzer den Gruppen zuordnen
+@end enumerate
+
+@node Datenbanken anlegen
+@section Datenbanken anlegen
+
+Zuerst muss eine Datenbank angelegt werden. Verwenden Sie für den
+Datenbankzugriff den vorhin angelegten Benutzer (in unseren Beispielen
+ist dies @samp{lxoffice}).
 
 Wenn Sie für die Lx-Office-Installation nicht den europäischen
 Schriftsatz ISO-8859-15 sondern UTF-8 (Unicode) benutzen wollen, so
-müssen Sie vor dem Anlegen der Datenbank in der Datei ``lx-erp.conf''
-die Variable @code{$dbcharset} auf den Wert ``UTF-8''
-setzen. Zusätzlich muss beim Anlegen der Datenbank ``UTF-8 Unicode''
-als Schriftsatz ausgewählt werden.
+müssen Sie vor dem Anlegen der Datenbank in der Datei
+@code{config/lx-erp.conf} die Variable @code{$dbcharset} auf den Wert
+@samp{UTF-8} setzen. Zusätzlich muss beim Anlegen der Datenbank
+@samp{UTF-8 Unicode} als Schriftsatz ausgewählt werden.
+
+Bitte beachten Sie, dass alle Datenbanken den selben Zeichensatz
+verwenden müssen, da diese Einstellungen momentan global in Lx-Office
+vorgenommen wird und nicht nach Datenbank unterschieden werden
+kann. Auch die Authentifizierungsdatenbank muss mit diesem Zeichensatz
+angelegt worden sein.
+
+@node Gruppen anlegen
+@section Gruppen anlegen
+
+Eine Gruppe wird in der Gruppenverwaltung angelegt. Ihr muss ein Name
+gegeben werden, eine Beschreibung ist hingegen optional. Nach dem
+Anlegen können Sie die verschiedenen Bereiche wählen, auf die
+Mitglieder dieser Gruppe Zugriff haben sollen.
+
+Benutzergruppen sind unabhängig von Datenbanken, da sie in der
+Authentifizierungsdatenbank gespeichert werden. Sie gelten für alle
+Datenbanken, die in dieser Installation verwaltet werden.
+
+@node Benutzer anlegen
+@section Benutzer anlegen
+
+Beim Anlegen von Benutzern werden für viele Parameter
+Standardeinstellungen vorgenommen, die den Gepflogenheiten des
+deutschen Raumes entsprechen.
+
+Zwingend anzugeben sind der Loginname sowie die komplette
+Datenbankkonfiguration. Wenn die Passwortauthentifizierung über die
+Datenbank eingestellt ist, so kann hier auch das Benutzerpasswort
+gesetzt bzw. geändert werden. Ist hingegen die LDAP-Authentifizierung
+aktiv, so ist das Passwort-Feld deaktiviert.
+
+In der Datenbankkonfiguration müssen die Zugriffsdaten einer der eben
+angelegten Datenbanken eingetragen werden.
+
+@node Gruppenmitgliedschaften verwalten
+@section Gruppenmitgliedschaften verwalten
+
+Nach dem Anlegen von Benutzern und Gruppen müssen Benutzer den Gruppen
+zugewiesen werden. Dazu gibt es zwei Möglichkeiten:
+
+@enumerate
+@item
+In der Gruppenverwaltung wählt man eine Gruppe aus. Im folgenden
+Dialog kann man dann einzeln die Benutzer der Gruppe hinzufügen.
+@item
+In der Gruppenverwaltung wählt man das Tool zur Verwaltung der
+Gruppenmitgliedschaft. Hier wird eine Matrix angezeigt, die alle im
+System angelegten Gruppen und Benutzer enthält. Durch Setzen der
+Häkchen wird der Benutzer in der ausgewählten Zeile der Gruppe in der
+ausgewählten Spalte hinzugefügt.
+@end enumerate
+
+@node Migration alter Installationen
+@section Migration alter Installationen
+
+Wenn Lx-Office 2.4.4 über eine ältere Version installiert wird, in der
+die Benutzerdaten noch im Dateisystem im Verzeichnis @code{users}
+verwaltet wurden, so bietet Lx-Office die Möglichkeit, diese
+Benutzerdaten automatisch in die Authentifizierungsdatenbank zu
+übernehmen. Dies geschieht, wenn man sich nach dem Update der
+Installation das erste Mal im Administrationsbereich anmeldet. Findet
+Lx-Office die Datei @code{users/members}, so wird der
+Migrationsprozess gestartet.
+
+Der Migrationsprozess ist nahezu vollautomatisch. Alle Benutzerdaten
+können übernommen werden. Nach den Benutzerdaten bietet Lx-Office noch
+die Möglichkeit an, dass automatisch eine Benutzergruppe angelegt
+wird. Dieser Gruppe wird Zugriff auf alle Funktionen von Lx-Office
+gewährt. Alle migrierten Benutzern werden Mitglied in dieser
+Gruppe. Damit wird das Verhalten von Lx-Office bis Version 2.4.3
+inklusive wiederhergestellt, und die Benutzer können sich sofort
+wieder anmelden und mit dem System arbeiten.
 
 @c ---------------------------------------------------------------
 
@@ -288,11 +562,11 @@ Lx-Office unterst
 OpenDocument-Format, wie es OpenOffice.org ab Version 2
 erzeugt. Lx-Office kann dabei sowohl neue OpenDocument-Dokumente als
 auch aus diesen direkt PDF-Dateien erzeugen.  Um die Unterstützung von
-OpenDocument-Vorlagen zu aktivieren muss in der Datei ``lx-erp.conf''
-die Variable @code{$opendocument_templates} auf ``1'' stehen.  Dieses
-ist die Standardeinstellung.
+OpenDocument-Vorlagen zu aktivieren muss in der Datei
+@code{config/lx-erp.conf} die Variable @code{$opendocument_templates}
+auf @samp{1} stehen.  Dieses ist die Standardeinstellung.
 
-Weiterhin muss in der Datei ``lx-erp.conf'' die Variable
+Weiterhin muss in der Datei @code{config/lx-erp.conf} die Variable
 @code{$dbcharset} auf die Zeichenkodierung gesetzt werden, die auch
 bei der Speicherung der Daten in der Datenbank verwendet wird. Diese
 ist in den meisten Fällen "ISO-8859-15".
@@ -304,11 +578,11 @@ neben OpenOffice.org ab Version 2 auch der ``X virtual frame buffer''
 (xvfb) installiert werden.  Bei Debian ist er im Paket ``xvfb''
 enthalten. Andere Distributionen enthalten ihn in anderen Paketen.
 
-Nach der Installation müssen in der Datei ``lx-erp.conf'' zwei weitere
-Variablen angepasst werden: @code{$openofficeorg_writer_bin} muss den
-vollständigen Pfad zur OpenOffice.org Writer-Anwendung enthalten.
-@code{$xvfb_bin} muss den Pfad zum ``X virtual frame buffer''
-enthalten.
+Nach der Installation müssen in der Datei @code{config/lx-erp.conf}
+zwei weitere Variablen angepasst werden:
+@code{$openofficeorg_writer_bin} muss den vollständigen Pfad zur
+OpenOffice.org Writer-Anwendung enthalten.  @code{$xvfb_bin} muss den
+Pfad zum ``X virtual frame buffer'' enthalten.
 
 Zusätzlich gibt es zwei verschiedene Arten, wie Lx-Office mit
 OpenOffice kommuniziert. Die erste Variante, die benutzt wird, wenn
index 90ba21b..d4a3ac4 100644 (file)
@@ -10,9 +10,22 @@ Inhalt der Anleitung
   4.2 Erweiterung für servergespeicherte Prozeduren
   4.3 Datenbankbenutzer anlegen
 5 Apache-Konfiguration
-6 Benutzer und Datenbanken anlegen
-7 OpenDocument-Vorlagen
-8 Lx-Office ERP verwenden
+6 Benutzerauthentifizierung und Administratorpasswort
+  6.1 Grundlagen zur Benutzerauthentifizierung
+  6.2 Administratorpasswort
+  6.3 Authentifizierungsdatenbank
+  6.4 Passwortüberprüfung
+  6.5 Name des Session-Cookies
+  6.6 Anlegen der Authentifizierungsdatenbank
+7 Benutzer- und Gruppenverwaltung
+  7.1 Zusammenhänge
+  7.2 Datenbanken anlegen
+  7.3 Gruppen anlegen
+  7.4 Benutzer anlegen
+  7.5 Gruppenmitgliedschaften verwalten
+  7.6 Migration alter Installationen
+8 OpenDocument-Vorlagen
+9 Lx-Office ERP verwenden
 
 
 Inhalt der Anleitung
@@ -207,40 +220,288 @@ Option in die Konfiguration aufzunehmen:
 
    `EnableSendfile Off'
 
-6 Benutzer und Datenbanken anlegen
-**********************************
+6 Benutzerauthentifizierung und Administratorpasswort
+*****************************************************
+
+Informationen über die Einrichtung der Benutzerauthentifizierung, über
+die Verwaltung von Gruppen und weitere Einstellungen
+
+6.1 Grundlagen zur Benutzerauthentifizierung
+============================================
+
+Lx-Office verwaltet die Benutzerinformationen in einer Datenbank, die
+im folgenden "Authentifizierungsdatenbank" genannt wird. Für jeden
+Benutzer kann dort eine eigene Datenbank für die eigentlichen
+Finanzdaten hinterlegt sein. Diese beiden Datenbanken können, müssen
+aber nicht unterschiedlich sein.
+
+   Im einfachsten Fall gibt es für Lx-Office nur eine einzige Datenbank,
+in der sowohl die Benutzerinformationen als auch die Daten abgelegt
+werden.
+
+   Zusätzlich ermöglicht es Lx-Office, dass die Benutzerpasswörter
+entweder gegen die Authentifizierungsdatenbank oder gegen einen
+LDAP-Server überprüft werden.
+
+   Welche Art der Passwortüberprüfung Lx-Office benutzt und wie
+Lx-Office die Authentifizierungsdatenbank erreichen kann, wird in der
+Konfigurationsdatei `config/authentication.pl' festgelegt. Diese muss
+bei der Installation und bei einem Upgrade von einer Version vor v2.4.4
+angelegt werden. Eine Beispielkonfigurationsdatei
+`config/authentication.pl.default' existiert, die als Vorlage benutzt
+werden kann.
+
+6.2 Administratorpasswort
+=========================
+
+Das Passwort, das zum Zugriff auf das Aministrationsinterface benutzt
+wird, wird ebenfalls in dieser Datei gespeichert. Es kann auch nur dort
+und nicht mehr im Administrationsinterface selber geändert werden. Der
+Parameter dazu heißt `$self->{admin_password}'.
+
+6.3 Authentifizierungsdatenbank
+===============================
+
+Die Verbindung zur Authentifizierungsdatenbank wird mit den Parametern
+in `$self->{DB_config}' konfiguriert. Hier sind die folgenden Parameter
+anzugeben:
+
+   * `host' - Der Rechnername oder die IP-Adresse des Datenbankservers
+
+   * `port' - Die Portnummer des Datenbankservers, meist 5432
+
+   * `db' - Der Name der Authentifizierungsdatenbank
+
+   * `user' - Der Benutzername, mit dem sich Lx-Office beim
+     Datenbankserver anmeldet (z.B. "postgres")
+
+   * `password' - Das Passwort für den Datenbankbenutzer
+
+   Die Datenbank muss noch nicht existieren. Lx-Office kann sie
+automatisch anlegen (mehr dazu siehe unten).
+
+6.4 Passwortüberprüfung
+=======================
+
+Lx-Office unterstützt Passwortüberprüfung auf zwei Arten: gegen die
+Authentifizierungsdatenbank und gegen einen externen LDAP- oder
+Active-Directory-Server. Welche davon benutzt wird, regelt der
+Parameter `$self->{module}'.
+
+   Sollen die Benutzerpasswörter in der Authentifizierungsdatenbank
+gespeichert werden, so muss der Parameter `$self->{module}' den Wert
+`DB' enthalten. In diesem Fall können sowohl der Administrator als auch
+die Benutzer selber ihre Psaswörter in Lx-Office ändern.
+
+   Soll hingegen ein externer LDAP- oder Active-Directory-Server benutzt
+werden, so muss der Parameter `$self->{module}' auf `LDAP' gesetzt
+werden. In diesem Fall müssen zusätzliche Informationen über den
+LDAP-Server in `$self->{LDAP_config}' angegeben werden:
+
+   * `host' - Der Rechnername oder die IP-Adresse des LDAP- oder
+     Active-Directory-Servers. Diese Angabe ist zwingend erforderlich.
+
+   * `port' - Die Portnummer des LDAP-Servers; meist 389.
+
+   * `tls' - Wenn Verbindungsverschlüsselung gewünscht ist, so diesen
+     Wert auf `1' setzen, andernfalls auf `0' belassen
+
+   * `attribute'' - Das LDAP-Attribut, in dem der Benutzername steht,
+     den der Benutzer eingegeben hat. Für Active-Directory-Server   ist
+     dies meist `sAMAccountName', für andere LDAP-Server hingegen
+     `uid'. Diese Angabe ist zwingend erforderlich.
 
-Nach der Installation müssen Benutzer und Datenbanken angelegt werden.
-Dieses geschieht im Administrationsmenü, dass Sie unter folgender URL
-finden:
+   * `base_dn' - Der Abschnitt des LDAP-Baumes, der durchsucht werden
+     soll. Diese Angabe ist zwingend erforderlich.
+
+   * `filter' - Ein optionaler LDAP-Filter. Enthält dieser Filter das
+     Wort `<%login%>', so wird dieses durch den vom Benutzer
+     eingegebenen Benutzernamen ersetzt. Andernfalls wird der LDAP-Baum
+     nach einem Element durchsucht, bei dem das oben angegebene Attribut
+      mit dem Benutzernamen identisch ist.
+
+   * `bind_dn' und `bind_password' - Wenn der LDAP-Server eine
+     Anmeldung erfordert, bevor er durchsucht werden kann (z.B. ist
+     dies bei   Active-Directory-Servern der Fall), so kann diese hier
+     angegeben werden. Für Active-Directory-Server kann als `bind_dn'
+     entweder eine   komplette LDAP-DN wie z.B. `cn=Martin
+     Mustermann,cn=Users,dc=firmendomain' auch nur der volle Name des
+     Benutzers   eingegeben werden; in diesem Beispiel also `Martin
+     Mustermann'.
+
+6.5 Name des Session-Cookies
+============================
+
+Sollen auf einem Server mehrere Lx-Office-Installationen aufgesetzt
+werden, so müssen die Namen der Session-Cookies für alle Installationen
+unterschiedlich sein. Der Name des Cookies wird mit dem Parameter
+`$self->{cookie_name}' gesetzt.
+
+   Diese Angabe ist optional, wenn nur eine Installation auf dem Server
+existiert.
+
+6.6 Anlegen der Authentifizierungsdatenbank
+===========================================
+
+Nachdem alle Einstellungen in `config/authentication.pl' vorgenommen
+wurden, muss Lx-Office die Authentifizierungsdatenbank anlegen. Dieses
+geschieht automatisch, wenn Sie sich im Administrationsmodul anmelden,
+das unter der folgenden URL erreichbar sein sollte:
+
+   `http://localhost/lx-erp/admin.pl'
+
+7 Benutzer- und Gruppenverwaltung
+*********************************
+
+Nach der Installation müssen Benutzer, Gruppen und Datenbanken angelegt
+werden.  Dieses geschieht im Administrationsmenü, dass Sie unter
+folgender URL finden:
 
    `http://localhost/lx-erp/admin.pl'
 
-   Zuerst muss eine Datenbank angelegt werden, anschließend ein
-Benutzer. Verwenden Sie für den Datenbankzugriff den eben angelegten
-Benutzer "lxoffice".
+   Verwenden Sie zur Anmeldung das Password, dass Sie in der Datei
+`config/authentication.pl' eingetragen haben.
+
+7.1 Zusammenhänge
+=================
+
+Lx-Office verwendet eine Datenbank zum Speichern all seiner
+Informationen wie Kundendaten, Artikel, Angebote, Rechnungen etc. Um
+mit Lx-Office arbeiten zu können, muss eine Person einen
+Benutzeraccount haben. Jedem Benutzeraccount wiederum wird genau eine
+Datenbank zugewiesen, mit der dieser Benutzer arbeiten kann. Es ist
+möglich und normal, dass mehreren Benutzern die selbe Datenbank
+zugewiesen wird, sodass sie alle mit den selben Daten arbeiten können.
+
+   Die Basisdaten der Benutzer, die in der Administration eingegeben
+werden können, werden in einer zweiten Datenbank gespeichert, der
+bereits erwähnten Authentifizierungsdatenbank. Diese ist also den
+Produktivdaten enthaltenden Datenbanken vorgeschaltet. Pro
+Lx-Office-Installation gibt es nur eine Authentifizierungsdatenbank,
+aber beliebig viele Datenbanken mit Firmendaten.
+
+   Lx-Office lann seinen Benutzern Zugriff auf bestimmte
+Funktionsbereiche erlauben oder verbieten. Wird der Zugriff nicht
+gestattet, so werden der entsprechenden Menüpunkte auch nicht
+angezeigt. Diese Rechte werden ebenfalls in der
+Authentifizierungsdatenbank gespeichert.
+
+   Um Rechte verteilen zu können, verwendet Lx-Office ein
+Gruppen-Prinzip. Einer Gruppe kann der Zugriff auf bestimmte Bereiche
+erlaubt werden. Ein Benutzer wiederum kann Mitglied in einer oder
+mehrerer Gruppen sein. Der Benutzer hat Zugriff auf alle diejenigen
+Funktionen, die mindestens einer Gruppe erlaubt sind, in der der
+Benutzer Mitglied ist.
+
+   Die allgemeine Reihenfolge, in der Datenbanken, Gruppen und Benutzer
+angelegt werden sollten, lautet:
+
+  1. Datenbank anlegen
+
+  2. Gruppen anlegen
+
+  3. Benutzer anlegen
+
+  4. Benutzer den Gruppen zuordnen
+
+7.2 Datenbanken anlegen
+=======================
+
+Zuerst muss eine Datenbank angelegt werden. Verwenden Sie für den
+Datenbankzugriff den vorhin angelegten Benutzer (in unseren Beispielen
+ist dies `lxoffice').
 
    Wenn Sie für die Lx-Office-Installation nicht den europäischen
 Schriftsatz ISO-8859-15 sondern UTF-8 (Unicode) benutzen wollen, so
-müssen Sie vor dem Anlegen der Datenbank in der Datei "lx-erp.conf" die
-Variable `$dbcharset' auf den Wert "UTF-8" setzen. Zusätzlich muss beim
-Anlegen der Datenbank "UTF-8 Unicode" als Schriftsatz ausgewählt werden.
-
-7 OpenDocument-Vorlagen
+müssen Sie vor dem Anlegen der Datenbank in der Datei
+`config/lx-erp.conf' die Variable `$dbcharset' auf den Wert `UTF-8'
+setzen. Zusätzlich muss beim Anlegen der Datenbank `UTF-8 Unicode' als
+Schriftsatz ausgewählt werden.
+
+   Bitte beachten Sie, dass alle Datenbanken den selben Zeichensatz
+verwenden müssen, da diese Einstellungen momentan global in Lx-Office
+vorgenommen wird und nicht nach Datenbank unterschieden werden kann.
+Auch die Authentifizierungsdatenbank muss mit diesem Zeichensatz
+angelegt worden sein.
+
+7.3 Gruppen anlegen
+===================
+
+Eine Gruppe wird in der Gruppenverwaltung angelegt. Ihr muss ein Name
+gegeben werden, eine Beschreibung ist hingegen optional. Nach dem
+Anlegen können Sie die verschiedenen Bereiche wählen, auf die
+Mitglieder dieser Gruppe Zugriff haben sollen.
+
+   Benutzergruppen sind unabhängig von Datenbanken, da sie in der
+Authentifizierungsdatenbank gespeichert werden. Sie gelten für alle
+Datenbanken, die in dieser Installation verwaltet werden.
+
+7.4 Benutzer anlegen
+====================
+
+Beim Anlegen von Benutzern werden für viele Parameter
+Standardeinstellungen vorgenommen, die den Gepflogenheiten des
+deutschen Raumes entsprechen.
+
+   Zwingend anzugeben sind der Loginname sowie die komplette
+Datenbankkonfiguration. Wenn die Passwortauthentifizierung über die
+Datenbank eingestellt ist, so kann hier auch das Benutzerpasswort
+gesetzt bzw. geändert werden. Ist hingegen die LDAP-Authentifizierung
+aktiv, so ist das Passwort-Feld deaktiviert.
+
+   In der Datenbankkonfiguration müssen die Zugriffsdaten einer der eben
+angelegten Datenbanken eingetragen werden.
+
+7.5 Gruppenmitgliedschaften verwalten
+=====================================
+
+Nach dem Anlegen von Benutzern und Gruppen müssen Benutzer den Gruppen
+zugewiesen werden. Dazu gibt es zwei Möglichkeiten:
+
+  1. In der Gruppenverwaltung wählt man eine Gruppe aus. Im folgenden
+     Dialog kann man dann einzeln die Benutzer der Gruppe hinzufügen.
+
+  2. In der Gruppenverwaltung wählt man das Tool zur Verwaltung der
+     Gruppenmitgliedschaft. Hier wird eine Matrix angezeigt, die alle im
+     System angelegten Gruppen und Benutzer enthält. Durch Setzen der
+     Häkchen wird der Benutzer in der ausgewählten Zeile der Gruppe in
+     der ausgewählten Spalte hinzugefügt.
+
+7.6 Migration alter Installationen
+==================================
+
+Wenn Lx-Office 2.4.4 über eine ältere Version installiert wird, in der
+die Benutzerdaten noch im Dateisystem im Verzeichnis `users' verwaltet
+wurden, so bietet Lx-Office die Möglichkeit, diese Benutzerdaten
+automatisch in die Authentifizierungsdatenbank zu übernehmen. Dies
+geschieht, wenn man sich nach dem Update der Installation das erste Mal
+im Administrationsbereich anmeldet. Findet Lx-Office die Datei
+`users/members', so wird der Migrationsprozess gestartet.
+
+   Der Migrationsprozess ist nahezu vollautomatisch. Alle Benutzerdaten
+können übernommen werden. Nach den Benutzerdaten bietet Lx-Office noch
+die Möglichkeit an, dass automatisch eine Benutzergruppe angelegt wird.
+Dieser Gruppe wird Zugriff auf alle Funktionen von Lx-Office gewährt.
+Alle migrierten Benutzern werden Mitglied in dieser Gruppe. Damit wird
+das Verhalten von Lx-Office bis Version 2.4.3 inklusive
+wiederhergestellt, und die Benutzer können sich sofort wieder anmelden
+und mit dem System arbeiten.
+
+8 OpenDocument-Vorlagen
 ***********************
 
 Lx-Office unterstützt die Verwendung von Vorlagen im
 OpenDocument-Format, wie es OpenOffice.org ab Version 2 erzeugt.
 Lx-Office kann dabei sowohl neue OpenDocument-Dokumente als auch aus
 diesen direkt PDF-Dateien erzeugen.  Um die Unterstützung von
-OpenDocument-Vorlagen zu aktivieren muss in der Datei "lx-erp.conf" die
-Variable `$opendocument_templates' auf "1" stehen.  Dieses ist die
-Standardeinstellung.
+OpenDocument-Vorlagen zu aktivieren muss in der Datei
+`config/lx-erp.conf' die Variable `$opendocument_templates' auf `1'
+stehen.  Dieses ist die Standardeinstellung.
 
-   Weiterhin muss in der Datei "lx-erp.conf" die Variable `$dbcharset'
-auf die Zeichenkodierung gesetzt werden, die auch bei der Speicherung
-der Daten in der Datenbank verwendet wird. Diese ist in den meisten
-Fällen "ISO-8859-15".
+   Weiterhin muss in der Datei `config/lx-erp.conf' die Variable
+`$dbcharset' auf die Zeichenkodierung gesetzt werden, die auch bei der
+Speicherung der Daten in der Datenbank verwendet wird. Diese ist in den
+meisten Fällen "ISO-8859-15".
 
    Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
 weitere Software benötigt, wird zur Umwandlung dieser Dateien in PDF
@@ -249,9 +510,9 @@ neben OpenOffice.org ab Version 2 auch der "X virtual frame buffer"
 (xvfb) installiert werden.  Bei Debian ist er im Paket "xvfb"
 enthalten. Andere Distributionen enthalten ihn in anderen Paketen.
 
-   Nach der Installation müssen in der Datei "lx-erp.conf" zwei weitere
-Variablen angepasst werden: `$openofficeorg_writer_bin' muss den
-vollständigen Pfad zur OpenOffice.org Writer-Anwendung enthalten.
+   Nach der Installation müssen in der Datei `config/lx-erp.conf' zwei
+weitere Variablen angepasst werden: `$openofficeorg_writer_bin' muss
+den vollständigen Pfad zur OpenOffice.org Writer-Anwendung enthalten.
 `$xvfb_bin' muss den Pfad zum "X virtual frame buffer" enthalten.
 
    Zusätzlich gibt es zwei verschiedene Arten, wie Lx-Office mit
@@ -286,7 +547,7 @@ vom Webserver beschreibbar sein. Dieses wurde in Schritt `Installation
 des Programmpakets' oben bereits erledigt, kann aber erneut überprüft
 werden, wenn die Konvertierung nach PDF fehlschlägt.
 
-8 Lx-Office ERP verwenden
+9 Lx-Office ERP verwenden
 *************************
 
 Nach erfolgreicher Installation ist der Loginbildschirm unter folgender
diff --git a/doc/INSTALL/Administratorpasswort.html b/doc/INSTALL/Administratorpasswort.html
new file mode 100644 (file)
index 0000000..f3eace9
--- /dev/null
@@ -0,0 +1,43 @@
+<html lang="en">
+<head>
+<title>Administratorpasswort - Lx-Office Installationsanleitung</title>
+<meta http-equiv="Content-Type" content="text/html">
+<meta name="description" content="Lx-Office Installationsanleitung">
+<meta name="generator" content="makeinfo 4.8">
+<link title="Top" rel="start" href="index.html#Top">
+<link rel="up" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort" title="Benutzerauthentifizierung und Administratorpasswort">
+<link rel="prev" href="Grundlagen-zur-Benutzerauthentifizierung.html#Grundlagen-zur-Benutzerauthentifizierung" title="Grundlagen zur Benutzerauthentifizierung">
+<link rel="next" href="Authentifizierungsdatenbank.html#Authentifizierungsdatenbank" title="Authentifizierungsdatenbank">
+<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<style type="text/css"><!--
+  pre.display { font-family:inherit }
+  pre.format  { font-family:inherit }
+  pre.smalldisplay { font-family:inherit; font-size:smaller }
+  pre.smallformat  { font-family:inherit; font-size:smaller }
+  pre.smallexample { font-size:smaller }
+  pre.smalllisp    { font-size:smaller }
+  span.sc    { font-variant:small-caps }
+  span.roman { font-family:serif; font-weight:normal; } 
+  span.sansserif { font-family:sans-serif; font-weight:normal; } 
+--></style>
+</head>
+<body>
+<div class="node">
+<p>
+<a name="Administratorpasswort"></a>
+n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="Authentifizierungsdatenbank.html#Authentifizierungsdatenbank">Authentifizierungsdatenbank</a>,
+voriges:&nbsp;<a rel="previous" accesskey="p" href="Grundlagen-zur-Benutzerauthentifizierung.html#Grundlagen-zur-Benutzerauthentifizierung">Grundlagen zur Benutzerauthentifizierung</a>,
+aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>
+<hr>
+</div>
+
+<h3 class="section">6.2 Administratorpasswort</h3>
+
+<p>Das Passwort, das zum Zugriff auf das Aministrationsinterface benutzt wird,
+wird ebenfalls in dieser Datei gespeichert. Es kann auch nur dort und nicht
+mehr im Administrationsinterface selber geändert werden. Der Parameter dazu
+heißt <code>$self-&gt;{admin_password}</code>.
+
+   </body></html>
+
diff --git a/doc/INSTALL/Anlegen-der-Authentifizierungsdatenbank.html b/doc/INSTALL/Anlegen-der-Authentifizierungsdatenbank.html
new file mode 100644 (file)
index 0000000..d0e2daa
--- /dev/null
@@ -0,0 +1,45 @@
+<html lang="en">
+<head>
+<title>Anlegen der Authentifizierungsdatenbank - Lx-Office Installationsanleitung</title>
+<meta http-equiv="Content-Type" content="text/html">
+<meta name="description" content="Lx-Office Installationsanleitung">
+<meta name="generator" content="makeinfo 4.8">
+<link title="Top" rel="start" href="index.html#Top">
+<link rel="up" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort" title="Benutzerauthentifizierung und Administratorpasswort">
+<link rel="prev" href="Name-des-Session_002dCookies.html#Name-des-Session_002dCookies" title="Name des Session-Cookies">
+<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<style type="text/css"><!--
+  pre.display { font-family:inherit }
+  pre.format  { font-family:inherit }
+  pre.smalldisplay { font-family:inherit; font-size:smaller }
+  pre.smallformat  { font-family:inherit; font-size:smaller }
+  pre.smallexample { font-size:smaller }
+  pre.smalllisp    { font-size:smaller }
+  span.sc    { font-variant:small-caps }
+  span.roman { font-family:serif; font-weight:normal; } 
+  span.sansserif { font-family:sans-serif; font-weight:normal; } 
+--></style>
+</head>
+<body>
+<div class="node">
+<p>
+<a name="Anlegen-der-Authentifizierungsdatenbank"></a>
+voriges:&nbsp;<a rel="previous" accesskey="p" href="Name-des-Session_002dCookies.html#Name-des-Session_002dCookies">Name des Session-Cookies</a>,
+aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>
+<hr>
+</div>
+
+<h3 class="section">6.6 Anlegen der Authentifizierungsdatenbank</h3>
+
+<p>Nachdem alle Einstellungen in <code>config/authentication.pl</code>
+vorgenommen wurden, muss Lx-Office die Authentifizierungsdatenbank
+anlegen. Dieses geschieht automatisch, wenn Sie sich im
+Administrationsmodul anmelden, das unter der folgenden URL erreichbar
+sein sollte:
+
+   <p><a href="http://localhost/lx-erp/admin.pl">http://localhost/lx-erp/admin.pl</a>
+
+<!--  -->
+</body></html>
+
index bcf4ef6..daace6a 100644 (file)
@@ -6,7 +6,7 @@
 <meta name="generator" content="makeinfo 4.8">
 <link title="Top" rel="start" href="index.html#Top">
 <link rel="prev" href="Anpassung-der-PostgreSQL_002dKonfiguration.html#Anpassung-der-PostgreSQL_002dKonfiguration" title="Anpassung der PostgreSQL-Konfiguration">
-<link rel="next" href="Benutzer-und-Datenbanken-anlegen.html#Benutzer-und-Datenbanken-anlegen" title="Benutzer und Datenbanken anlegen">
+<link rel="next" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort" title="Benutzerauthentifizierung und Administratorpasswort">
 <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
 <meta http-equiv="Content-Style-Type" content="text/css">
 <style type="text/css"><!--
@@ -26,7 +26,7 @@
 <p>
 <a name="Apache-Konfiguration"></a>
 <a name="Apache_002dKonfiguration"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="Benutzer-und-Datenbanken-anlegen.html#Benutzer-und-Datenbanken-anlegen">Benutzer und Datenbanken anlegen</a>,
+n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>,
 voriges:&nbsp;<a rel="previous" accesskey="p" href="Anpassung-der-PostgreSQL_002dKonfiguration.html#Anpassung-der-PostgreSQL_002dKonfiguration">Anpassung der PostgreSQL-Konfiguration</a>,
 aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
 <hr>
diff --git a/doc/INSTALL/Authentifizierungsdatenbank.html b/doc/INSTALL/Authentifizierungsdatenbank.html
new file mode 100644 (file)
index 0000000..2f04778
--- /dev/null
@@ -0,0 +1,53 @@
+<html lang="en">
+<head>
+<title>Authentifizierungsdatenbank - Lx-Office Installationsanleitung</title>
+<meta http-equiv="Content-Type" content="text/html">
+<meta name="description" content="Lx-Office Installationsanleitung">
+<meta name="generator" content="makeinfo 4.8">
+<link title="Top" rel="start" href="index.html#Top">
+<link rel="up" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort" title="Benutzerauthentifizierung und Administratorpasswort">
+<link rel="prev" href="Administratorpasswort.html#Administratorpasswort" title="Administratorpasswort">
+<link rel="next" href="Passwort_00fcberpr_00fcfung.html#Passwort_00fcberpr_00fcfung" title="Passwortüberprüfung">
+<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<style type="text/css"><!--
+  pre.display { font-family:inherit }
+  pre.format  { font-family:inherit }
+  pre.smalldisplay { font-family:inherit; font-size:smaller }
+  pre.smallformat  { font-family:inherit; font-size:smaller }
+  pre.smallexample { font-size:smaller }
+  pre.smalllisp    { font-size:smaller }
+  span.sc    { font-variant:small-caps }
+  span.roman { font-family:serif; font-weight:normal; } 
+  span.sansserif { font-family:sans-serif; font-weight:normal; } 
+--></style>
+</head>
+<body>
+<div class="node">
+<p>
+<a name="Authentifizierungsdatenbank"></a>
+n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="Passwort_00fcberpr_00fcfung.html#Passwort_00fcberpr_00fcfung">Passwortüberprüfung</a>,
+voriges:&nbsp;<a rel="previous" accesskey="p" href="Administratorpasswort.html#Administratorpasswort">Administratorpasswort</a>,
+aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>
+<hr>
+</div>
+
+<h3 class="section">6.3 Authentifizierungsdatenbank</h3>
+
+<p>Die Verbindung zur Authentifizierungsdatenbank wird mit den Parametern
+in <code>$self-&gt;{DB_config}</code> konfiguriert. Hier sind die folgenden
+Parameter anzugeben:
+
+     <ul>
+<li>`<samp><span class="samp">host</span></samp>' &ndash; Der Rechnername oder die IP-Adresse des Datenbankservers
+<li>`<samp><span class="samp">port</span></samp>' &ndash; Die Portnummer des Datenbankservers, meist 5432
+<li>`<samp><span class="samp">db</span></samp>' &ndash; Der Name der Authentifizierungsdatenbank
+<li>`<samp><span class="samp">user</span></samp>' &ndash; Der Benutzername, mit dem sich Lx-Office beim Datenbankserver anmeldet (z.B. &ldquo;postgres&rdquo;)
+<li>`<samp><span class="samp">password</span></samp>' &ndash; Das Passwort für den Datenbankbenutzer
+</ul>
+
+   <p>Die Datenbank muss noch nicht existieren. Lx-Office kann sie
+automatisch anlegen (mehr dazu siehe unten).
+
+   </body></html>
+
diff --git a/doc/INSTALL/Benutzer-anlegen.html b/doc/INSTALL/Benutzer-anlegen.html
new file mode 100644 (file)
index 0000000..701bcba
--- /dev/null
@@ -0,0 +1,51 @@
+<html lang="en">
+<head>
+<title>Benutzer anlegen - Lx-Office Installationsanleitung</title>
+<meta http-equiv="Content-Type" content="text/html">
+<meta name="description" content="Lx-Office Installationsanleitung">
+<meta name="generator" content="makeinfo 4.8">
+<link title="Top" rel="start" href="index.html#Top">
+<link rel="up" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung" title="Benutzer- und Gruppenverwaltung">
+<link rel="prev" href="Gruppen-anlegen.html#Gruppen-anlegen" title="Gruppen anlegen">
+<link rel="next" href="Gruppenmitgliedschaften-verwalten.html#Gruppenmitgliedschaften-verwalten" title="Gruppenmitgliedschaften verwalten">
+<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<style type="text/css"><!--
+  pre.display { font-family:inherit }
+  pre.format  { font-family:inherit }
+  pre.smalldisplay { font-family:inherit; font-size:smaller }
+  pre.smallformat  { font-family:inherit; font-size:smaller }
+  pre.smallexample { font-size:smaller }
+  pre.smalllisp    { font-size:smaller }
+  span.sc    { font-variant:small-caps }
+  span.roman { font-family:serif; font-weight:normal; } 
+  span.sansserif { font-family:sans-serif; font-weight:normal; } 
+--></style>
+</head>
+<body>
+<div class="node">
+<p>
+<a name="Benutzer-anlegen"></a>
+n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="Gruppenmitgliedschaften-verwalten.html#Gruppenmitgliedschaften-verwalten">Gruppenmitgliedschaften verwalten</a>,
+voriges:&nbsp;<a rel="previous" accesskey="p" href="Gruppen-anlegen.html#Gruppen-anlegen">Gruppen anlegen</a>,
+aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>
+<hr>
+</div>
+
+<h3 class="section">7.4 Benutzer anlegen</h3>
+
+<p>Beim Anlegen von Benutzern werden für viele Parameter
+Standardeinstellungen vorgenommen, die den Gepflogenheiten des
+deutschen Raumes entsprechen.
+
+   <p>Zwingend anzugeben sind der Loginname sowie die komplette
+Datenbankkonfiguration. Wenn die Passwortauthentifizierung über die
+Datenbank eingestellt ist, so kann hier auch das Benutzerpasswort
+gesetzt bzw. geändert werden. Ist hingegen die LDAP-Authentifizierung
+aktiv, so ist das Passwort-Feld deaktiviert.
+
+   <p>In der Datenbankkonfiguration müssen die Zugriffsdaten einer der eben
+angelegten Datenbanken eingetragen werden.
+
+   </body></html>
+
diff --git a/doc/INSTALL/Benutzer-und-Datenbanken-anlegen.html b/doc/INSTALL/Benutzer-und-Datenbanken-anlegen.html
deleted file mode 100644 (file)
index ced657e..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-<html lang="en">
-<head>
-<title>Benutzer und Datenbanken anlegen - Lx-Office Installationsanleitung</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="Lx-Office Installationsanleitung">
-<meta name="generator" content="makeinfo 4.8">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Apache_002dKonfiguration.html#Apache_002dKonfiguration" title="Apache-Konfiguration">
-<link rel="next" href="OpenDocument_002dVorlagen.html#OpenDocument_002dVorlagen" title="OpenDocument-Vorlagen">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
-  pre.display { font-family:inherit }
-  pre.format  { font-family:inherit }
-  pre.smalldisplay { font-family:inherit; font-size:smaller }
-  pre.smallformat  { font-family:inherit; font-size:smaller }
-  pre.smallexample { font-size:smaller }
-  pre.smalllisp    { font-size:smaller }
-  span.sc    { font-variant:small-caps }
-  span.roman { font-family:serif; font-weight:normal; } 
-  span.sansserif { font-family:sans-serif; font-weight:normal; } 
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Benutzer-und-Datenbanken-anlegen"></a>
-n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="OpenDocument_002dVorlagen.html#OpenDocument_002dVorlagen">OpenDocument-Vorlagen</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="Apache_002dKonfiguration.html#Apache_002dKonfiguration">Apache-Konfiguration</a>,
-aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr>
-</div>
-
-<h2 class="chapter">6 Benutzer und Datenbanken anlegen</h2>
-
-<p>Nach der Installation müssen Benutzer und Datenbanken angelegt werden. 
-Dieses geschieht im Administrationsmenü, dass Sie unter folgender URL
-finden:
-
-   <p><code>http://localhost/lx-erp/admin.pl</code>
-
-   <p>Zuerst muss eine Datenbank angelegt werden, anschließend ein
-Benutzer. Verwenden Sie für den Datenbankzugriff den eben angelegten
-Benutzer &ldquo;lxoffice&rdquo;.
-
-   <p>Wenn Sie für die Lx-Office-Installation nicht den europäischen
-Schriftsatz ISO-8859-15 sondern UTF-8 (Unicode) benutzen wollen, so
-müssen Sie vor dem Anlegen der Datenbank in der Datei &ldquo;lx-erp.conf&rdquo;
-die Variable <code>$dbcharset</code> auf den Wert &ldquo;UTF-8&rdquo;
-setzen. Zusätzlich muss beim Anlegen der Datenbank &ldquo;UTF-8 Unicode&rdquo;
-als Schriftsatz ausgewählt werden.
-
-<!--  -->
-</body></html>
-
diff --git a/doc/INSTALL/Benutzer_002d-und-Gruppenverwaltung.html b/doc/INSTALL/Benutzer_002d-und-Gruppenverwaltung.html
new file mode 100644 (file)
index 0000000..d4ee184
--- /dev/null
@@ -0,0 +1,56 @@
+<html lang="en">
+<head>
+<title>Benutzer- und Gruppenverwaltung - Lx-Office Installationsanleitung</title>
+<meta http-equiv="Content-Type" content="text/html">
+<meta name="description" content="Lx-Office Installationsanleitung">
+<meta name="generator" content="makeinfo 4.8">
+<link title="Top" rel="start" href="index.html#Top">
+<link rel="prev" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort" title="Benutzerauthentifizierung und Administratorpasswort">
+<link rel="next" href="OpenDocument_002dVorlagen.html#OpenDocument_002dVorlagen" title="OpenDocument-Vorlagen">
+<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<style type="text/css"><!--
+  pre.display { font-family:inherit }
+  pre.format  { font-family:inherit }
+  pre.smalldisplay { font-family:inherit; font-size:smaller }
+  pre.smallformat  { font-family:inherit; font-size:smaller }
+  pre.smallexample { font-size:smaller }
+  pre.smalllisp    { font-size:smaller }
+  span.sc    { font-variant:small-caps }
+  span.roman { font-family:serif; font-weight:normal; } 
+  span.sansserif { font-family:sans-serif; font-weight:normal; } 
+--></style>
+</head>
+<body>
+<div class="node">
+<p>
+<a name="Benutzer--und-Gruppenverwaltung"></a>
+<a name="Benutzer_002d-und-Gruppenverwaltung"></a>
+n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="OpenDocument_002dVorlagen.html#OpenDocument_002dVorlagen">OpenDocument-Vorlagen</a>,
+voriges:&nbsp;<a rel="previous" accesskey="p" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>,
+aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
+<hr>
+</div>
+
+<h2 class="chapter">7 Benutzer- und Gruppenverwaltung</h2>
+
+<p>Nach der Installation müssen Benutzer, Gruppen und Datenbanken
+angelegt werden.  Dieses geschieht im Administrationsmenü, dass Sie
+unter folgender URL finden:
+
+   <p><a href="http://localhost/lx-erp/admin.pl">http://localhost/lx-erp/admin.pl</a>
+
+   <p>Verwenden Sie zur Anmeldung das Password, dass Sie in der Datei
+<code>config/authentication.pl</code> eingetragen haben.
+
+<ul class="menu">
+<li><a accesskey="1" href="Zusammenh_00e4nge.html#Zusammenh_00e4nge">Zusammenhänge</a>:  Übersicht über Benutzer, Gruppen, Berechtigungen und Datenbanken
+<li><a accesskey="2" href="Datenbanken-anlegen.html#Datenbanken-anlegen">Datenbanken anlegen</a>:  Hinweise zum Anlegen von Datenbanken
+<li><a accesskey="3" href="Gruppen-anlegen.html#Gruppen-anlegen">Gruppen anlegen</a>:  Hinweise zum Anlegen von Gruppen
+<li><a accesskey="4" href="Benutzer-anlegen.html#Benutzer-anlegen">Benutzer anlegen</a>:  Hinweise zum Anlegen von Benutzern
+<li><a accesskey="5" href="Gruppenmitgliedschaften-verwalten.html#Gruppenmitgliedschaften-verwalten">Gruppenmitgliedschaften verwalten</a>:  Wie man Gruppen Benutzer zuordnet
+<li><a accesskey="6" href="Migration-alter-Installationen.html#Migration-alter-Installationen">Migration alter Installationen</a>:  Automatische Übernahme bei Update von einer älteren Version
+</ul>
+
+   </body></html>
+
diff --git a/doc/INSTALL/Benutzerauthentifizierung-und-Administratorpasswort.html b/doc/INSTALL/Benutzerauthentifizierung-und-Administratorpasswort.html
new file mode 100644 (file)
index 0000000..c3ab10a
--- /dev/null
@@ -0,0 +1,50 @@
+<html lang="en">
+<head>
+<title>Benutzerauthentifizierung und Administratorpasswort - Lx-Office Installationsanleitung</title>
+<meta http-equiv="Content-Type" content="text/html">
+<meta name="description" content="Lx-Office Installationsanleitung">
+<meta name="generator" content="makeinfo 4.8">
+<link title="Top" rel="start" href="index.html#Top">
+<link rel="prev" href="Apache_002dKonfiguration.html#Apache_002dKonfiguration" title="Apache-Konfiguration">
+<link rel="next" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung" title="Benutzer- und Gruppenverwaltung">
+<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<style type="text/css"><!--
+  pre.display { font-family:inherit }
+  pre.format  { font-family:inherit }
+  pre.smalldisplay { font-family:inherit; font-size:smaller }
+  pre.smallformat  { font-family:inherit; font-size:smaller }
+  pre.smallexample { font-size:smaller }
+  pre.smalllisp    { font-size:smaller }
+  span.sc    { font-variant:small-caps }
+  span.roman { font-family:serif; font-weight:normal; } 
+  span.sansserif { font-family:sans-serif; font-weight:normal; } 
+--></style>
+</head>
+<body>
+<div class="node">
+<p>
+<a name="Benutzerauthentifizierung-und-Administratorpasswort"></a>
+n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>,
+voriges:&nbsp;<a rel="previous" accesskey="p" href="Apache_002dKonfiguration.html#Apache_002dKonfiguration">Apache-Konfiguration</a>,
+aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
+<hr>
+</div>
+
+<h2 class="chapter">6 Benutzerauthentifizierung und Administratorpasswort</h2>
+
+<p>Informationen über die Einrichtung der Benutzerauthentifizierung, über
+die Verwaltung von Gruppen und weitere Einstellungen
+
+<ul class="menu">
+<li><a accesskey="1" href="Grundlagen-zur-Benutzerauthentifizierung.html#Grundlagen-zur-Benutzerauthentifizierung">Grundlagen zur Benutzerauthentifizierung</a>:  Verfügbare Methoden, Name der Konfigurationsdatei
+<li><a accesskey="2" href="Administratorpasswort.html#Administratorpasswort">Administratorpasswort</a>:  Wo das Administratorpasswort gesetzt werden kann
+<li><a accesskey="3" href="Authentifizierungsdatenbank.html#Authentifizierungsdatenbank">Authentifizierungsdatenbank</a>:  Verbindungseinstellungen zur Authentifizierungsdatenbank
+<li><a accesskey="4" href="Passwort_00fcberpr_00fcfung.html#Passwort_00fcberpr_00fcfung">Passwortüberprüfung</a>:  Einstellungen zur Überprüfung der Benutzerpasswörter
+<li><a accesskey="5" href="Name-des-Session_002dCookies.html#Name-des-Session_002dCookies">Name des Session-Cookies</a>:  Ändern des Cookie-Namens bei Verwendung mehrerer Lx-Office-Installationen auf einem Server
+<li><a accesskey="6" href="Anlegen-der-Authentifizierungsdatenbank.html#Anlegen-der-Authentifizierungsdatenbank">Anlegen der Authentifizierungsdatenbank</a>:  Wie die Authentifizierungsdatenbank angelegt wird
+</ul>
+
+<!--  -->
+</body></html>
+
diff --git a/doc/INSTALL/Datenbanken-anlegen.html b/doc/INSTALL/Datenbanken-anlegen.html
new file mode 100644 (file)
index 0000000..dd1f8aa
--- /dev/null
@@ -0,0 +1,55 @@
+<html lang="en">
+<head>
+<title>Datenbanken anlegen - Lx-Office Installationsanleitung</title>
+<meta http-equiv="Content-Type" content="text/html">
+<meta name="description" content="Lx-Office Installationsanleitung">
+<meta name="generator" content="makeinfo 4.8">
+<link title="Top" rel="start" href="index.html#Top">
+<link rel="up" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung" title="Benutzer- und Gruppenverwaltung">
+<link rel="prev" href="Zusammenh_00e4nge.html#Zusammenh_00e4nge" title="Zusammenhänge">
+<link rel="next" href="Gruppen-anlegen.html#Gruppen-anlegen" title="Gruppen anlegen">
+<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<style type="text/css"><!--
+  pre.display { font-family:inherit }
+  pre.format  { font-family:inherit }
+  pre.smalldisplay { font-family:inherit; font-size:smaller }
+  pre.smallformat  { font-family:inherit; font-size:smaller }
+  pre.smallexample { font-size:smaller }
+  pre.smalllisp    { font-size:smaller }
+  span.sc    { font-variant:small-caps }
+  span.roman { font-family:serif; font-weight:normal; } 
+  span.sansserif { font-family:sans-serif; font-weight:normal; } 
+--></style>
+</head>
+<body>
+<div class="node">
+<p>
+<a name="Datenbanken-anlegen"></a>
+n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="Gruppen-anlegen.html#Gruppen-anlegen">Gruppen anlegen</a>,
+voriges:&nbsp;<a rel="previous" accesskey="p" href="Zusammenh_00e4nge.html#Zusammenh_00e4nge">Zusammenhänge</a>,
+aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>
+<hr>
+</div>
+
+<h3 class="section">7.2 Datenbanken anlegen</h3>
+
+<p>Zuerst muss eine Datenbank angelegt werden. Verwenden Sie für den
+Datenbankzugriff den vorhin angelegten Benutzer (in unseren Beispielen
+ist dies `<samp><span class="samp">lxoffice</span></samp>').
+
+   <p>Wenn Sie für die Lx-Office-Installation nicht den europäischen
+Schriftsatz ISO-8859-15 sondern UTF-8 (Unicode) benutzen wollen, so
+müssen Sie vor dem Anlegen der Datenbank in der Datei
+<code>config/lx-erp.conf</code> die Variable <code>$dbcharset</code> auf den Wert
+`<samp><span class="samp">UTF-8</span></samp>' setzen. Zusätzlich muss beim Anlegen der Datenbank
+`<samp><span class="samp">UTF-8 Unicode</span></samp>' als Schriftsatz ausgewählt werden.
+
+   <p>Bitte beachten Sie, dass alle Datenbanken den selben Zeichensatz
+verwenden müssen, da diese Einstellungen momentan global in Lx-Office
+vorgenommen wird und nicht nach Datenbank unterschieden werden
+kann. Auch die Authentifizierungsdatenbank muss mit diesem Zeichensatz
+angelegt worden sein.
+
+   </body></html>
+
diff --git a/doc/INSTALL/Grundlagen-zur-Benutzerauthentifizierung.html b/doc/INSTALL/Grundlagen-zur-Benutzerauthentifizierung.html
new file mode 100644 (file)
index 0000000..08e396b
--- /dev/null
@@ -0,0 +1,58 @@
+<html lang="en">
+<head>
+<title>Grundlagen zur Benutzerauthentifizierung - Lx-Office Installationsanleitung</title>
+<meta http-equiv="Content-Type" content="text/html">
+<meta name="description" content="Lx-Office Installationsanleitung">
+<meta name="generator" content="makeinfo 4.8">
+<link title="Top" rel="start" href="index.html#Top">
+<link rel="up" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort" title="Benutzerauthentifizierung und Administratorpasswort">
+<link rel="next" href="Administratorpasswort.html#Administratorpasswort" title="Administratorpasswort">
+<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<style type="text/css"><!--
+  pre.display { font-family:inherit }
+  pre.format  { font-family:inherit }
+  pre.smalldisplay { font-family:inherit; font-size:smaller }
+  pre.smallformat  { font-family:inherit; font-size:smaller }
+  pre.smallexample { font-size:smaller }
+  pre.smalllisp    { font-size:smaller }
+  span.sc    { font-variant:small-caps }
+  span.roman { font-family:serif; font-weight:normal; } 
+  span.sansserif { font-family:sans-serif; font-weight:normal; } 
+--></style>
+</head>
+<body>
+<div class="node">
+<p>
+<a name="Grundlagen-zur-Benutzerauthentifizierung"></a>
+n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="Administratorpasswort.html#Administratorpasswort">Administratorpasswort</a>,
+aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>
+<hr>
+</div>
+
+<h3 class="section">6.1 Grundlagen zur Benutzerauthentifizierung</h3>
+
+<p>Lx-Office verwaltet die Benutzerinformationen in einer Datenbank, die
+im folgenden &ldquo;Authentifizierungsdatenbank&rdquo; genannt wird. Für jeden
+Benutzer kann dort eine eigene Datenbank für die eigentlichen
+Finanzdaten hinterlegt sein. Diese beiden Datenbanken können, müssen
+aber nicht unterschiedlich sein.
+
+   <p>Im einfachsten Fall gibt es für Lx-Office nur eine einzige Datenbank,
+in der sowohl die Benutzerinformationen als auch die Daten abgelegt
+werden.
+
+   <p>Zusätzlich ermöglicht es Lx-Office, dass die Benutzerpasswörter
+entweder gegen die Authentifizierungsdatenbank oder gegen einen
+LDAP-Server überprüft werden.
+
+   <p>Welche Art der Passwortüberprüfung Lx-Office benutzt und wie Lx-Office
+die Authentifizierungsdatenbank erreichen kann, wird in der
+Konfigurationsdatei <code>config/authentication.pl</code> festgelegt. Diese
+muss bei der Installation und bei einem Upgrade von einer Version vor
+v2.4.4 angelegt werden. Eine Beispielkonfigurationsdatei
+<code>config/authentication.pl.default</code> existiert, die als Vorlage
+benutzt werden kann.
+
+   </body></html>
+
diff --git a/doc/INSTALL/Gruppen-anlegen.html b/doc/INSTALL/Gruppen-anlegen.html
new file mode 100644 (file)
index 0000000..9cc6e00
--- /dev/null
@@ -0,0 +1,47 @@
+<html lang="en">
+<head>
+<title>Gruppen anlegen - Lx-Office Installationsanleitung</title>
+<meta http-equiv="Content-Type" content="text/html">
+<meta name="description" content="Lx-Office Installationsanleitung">
+<meta name="generator" content="makeinfo 4.8">
+<link title="Top" rel="start" href="index.html#Top">
+<link rel="up" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung" title="Benutzer- und Gruppenverwaltung">
+<link rel="prev" href="Datenbanken-anlegen.html#Datenbanken-anlegen" title="Datenbanken anlegen">
+<link rel="next" href="Benutzer-anlegen.html#Benutzer-anlegen" title="Benutzer anlegen">
+<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<style type="text/css"><!--
+  pre.display { font-family:inherit }
+  pre.format  { font-family:inherit }
+  pre.smalldisplay { font-family:inherit; font-size:smaller }
+  pre.smallformat  { font-family:inherit; font-size:smaller }
+  pre.smallexample { font-size:smaller }
+  pre.smalllisp    { font-size:smaller }
+  span.sc    { font-variant:small-caps }
+  span.roman { font-family:serif; font-weight:normal; } 
+  span.sansserif { font-family:sans-serif; font-weight:normal; } 
+--></style>
+</head>
+<body>
+<div class="node">
+<p>
+<a name="Gruppen-anlegen"></a>
+n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="Benutzer-anlegen.html#Benutzer-anlegen">Benutzer anlegen</a>,
+voriges:&nbsp;<a rel="previous" accesskey="p" href="Datenbanken-anlegen.html#Datenbanken-anlegen">Datenbanken anlegen</a>,
+aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>
+<hr>
+</div>
+
+<h3 class="section">7.3 Gruppen anlegen</h3>
+
+<p>Eine Gruppe wird in der Gruppenverwaltung angelegt. Ihr muss ein Name
+gegeben werden, eine Beschreibung ist hingegen optional. Nach dem
+Anlegen können Sie die verschiedenen Bereiche wählen, auf die
+Mitglieder dieser Gruppe Zugriff haben sollen.
+
+   <p>Benutzergruppen sind unabhängig von Datenbanken, da sie in der
+Authentifizierungsdatenbank gespeichert werden. Sie gelten für alle
+Datenbanken, die in dieser Installation verwaltet werden.
+
+   </body></html>
+
diff --git a/doc/INSTALL/Gruppenmitgliedschaften-verwalten.html b/doc/INSTALL/Gruppenmitgliedschaften-verwalten.html
new file mode 100644 (file)
index 0000000..f5c0796
--- /dev/null
@@ -0,0 +1,51 @@
+<html lang="en">
+<head>
+<title>Gruppenmitgliedschaften verwalten - Lx-Office Installationsanleitung</title>
+<meta http-equiv="Content-Type" content="text/html">
+<meta name="description" content="Lx-Office Installationsanleitung">
+<meta name="generator" content="makeinfo 4.8">
+<link title="Top" rel="start" href="index.html#Top">
+<link rel="up" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung" title="Benutzer- und Gruppenverwaltung">
+<link rel="prev" href="Benutzer-anlegen.html#Benutzer-anlegen" title="Benutzer anlegen">
+<link rel="next" href="Migration-alter-Installationen.html#Migration-alter-Installationen" title="Migration alter Installationen">
+<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<style type="text/css"><!--
+  pre.display { font-family:inherit }
+  pre.format  { font-family:inherit }
+  pre.smalldisplay { font-family:inherit; font-size:smaller }
+  pre.smallformat  { font-family:inherit; font-size:smaller }
+  pre.smallexample { font-size:smaller }
+  pre.smalllisp    { font-size:smaller }
+  span.sc    { font-variant:small-caps }
+  span.roman { font-family:serif; font-weight:normal; } 
+  span.sansserif { font-family:sans-serif; font-weight:normal; } 
+--></style>
+</head>
+<body>
+<div class="node">
+<p>
+<a name="Gruppenmitgliedschaften-verwalten"></a>
+n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="Migration-alter-Installationen.html#Migration-alter-Installationen">Migration alter Installationen</a>,
+voriges:&nbsp;<a rel="previous" accesskey="p" href="Benutzer-anlegen.html#Benutzer-anlegen">Benutzer anlegen</a>,
+aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>
+<hr>
+</div>
+
+<h3 class="section">7.5 Gruppenmitgliedschaften verwalten</h3>
+
+<p>Nach dem Anlegen von Benutzern und Gruppen müssen Benutzer den Gruppen
+zugewiesen werden. Dazu gibt es zwei Möglichkeiten:
+
+     <ol type=1 start=1>
+<li>In der Gruppenverwaltung wählt man eine Gruppe aus. Im folgenden
+Dialog kann man dann einzeln die Benutzer der Gruppe hinzufügen. 
+<li>In der Gruppenverwaltung wählt man das Tool zur Verwaltung der
+Gruppenmitgliedschaft. Hier wird eine Matrix angezeigt, die alle im
+System angelegten Gruppen und Benutzer enthält. Durch Setzen der
+Häkchen wird der Benutzer in der ausgewählten Zeile der Gruppe in der
+ausgewählten Spalte hinzugefügt.
+        </ol>
+
+   </body></html>
+
index f780841..ed2e860 100644 (file)
@@ -30,7 +30,7 @@ aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
 <hr>
 </div>
 
-<h2 class="chapter">8 Lx-Office ERP verwenden</h2>
+<h2 class="chapter">9 Lx-Office ERP verwenden</h2>
 
 <p>Nach erfolgreicher Installation ist der Loginbildschirm unter
 folgender URL erreichbar:
diff --git a/doc/INSTALL/Migration-alter-Installationen.html b/doc/INSTALL/Migration-alter-Installationen.html
new file mode 100644 (file)
index 0000000..f0068ec
--- /dev/null
@@ -0,0 +1,55 @@
+<html lang="en">
+<head>
+<title>Migration alter Installationen - Lx-Office Installationsanleitung</title>
+<meta http-equiv="Content-Type" content="text/html">
+<meta name="description" content="Lx-Office Installationsanleitung">
+<meta name="generator" content="makeinfo 4.8">
+<link title="Top" rel="start" href="index.html#Top">
+<link rel="up" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung" title="Benutzer- und Gruppenverwaltung">
+<link rel="prev" href="Gruppenmitgliedschaften-verwalten.html#Gruppenmitgliedschaften-verwalten" title="Gruppenmitgliedschaften verwalten">
+<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<style type="text/css"><!--
+  pre.display { font-family:inherit }
+  pre.format  { font-family:inherit }
+  pre.smalldisplay { font-family:inherit; font-size:smaller }
+  pre.smallformat  { font-family:inherit; font-size:smaller }
+  pre.smallexample { font-size:smaller }
+  pre.smalllisp    { font-size:smaller }
+  span.sc    { font-variant:small-caps }
+  span.roman { font-family:serif; font-weight:normal; } 
+  span.sansserif { font-family:sans-serif; font-weight:normal; } 
+--></style>
+</head>
+<body>
+<div class="node">
+<p>
+<a name="Migration-alter-Installationen"></a>
+voriges:&nbsp;<a rel="previous" accesskey="p" href="Gruppenmitgliedschaften-verwalten.html#Gruppenmitgliedschaften-verwalten">Gruppenmitgliedschaften verwalten</a>,
+aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>
+<hr>
+</div>
+
+<h3 class="section">7.6 Migration alter Installationen</h3>
+
+<p>Wenn Lx-Office 2.4.4 über eine ältere Version installiert wird, in der
+die Benutzerdaten noch im Dateisystem im Verzeichnis <code>users</code>
+verwaltet wurden, so bietet Lx-Office die Möglichkeit, diese
+Benutzerdaten automatisch in die Authentifizierungsdatenbank zu
+übernehmen. Dies geschieht, wenn man sich nach dem Update der
+Installation das erste Mal im Administrationsbereich anmeldet. Findet
+Lx-Office die Datei <code>users/members</code>, so wird der
+Migrationsprozess gestartet.
+
+   <p>Der Migrationsprozess ist nahezu vollautomatisch. Alle Benutzerdaten
+können übernommen werden. Nach den Benutzerdaten bietet Lx-Office noch
+die Möglichkeit an, dass automatisch eine Benutzergruppe angelegt
+wird. Dieser Gruppe wird Zugriff auf alle Funktionen von Lx-Office
+gewährt. Alle migrierten Benutzern werden Mitglied in dieser
+Gruppe. Damit wird das Verhalten von Lx-Office bis Version 2.4.3
+inklusive wiederhergestellt, und die Benutzer können sich sofort
+wieder anmelden und mit dem System arbeiten.
+
+<!--  -->
+</body></html>
+
diff --git a/doc/INSTALL/Name-des-Session_002dCookies.html b/doc/INSTALL/Name-des-Session_002dCookies.html
new file mode 100644 (file)
index 0000000..e9b8cd4
--- /dev/null
@@ -0,0 +1,47 @@
+<html lang="en">
+<head>
+<title>Name des Session-Cookies - Lx-Office Installationsanleitung</title>
+<meta http-equiv="Content-Type" content="text/html">
+<meta name="description" content="Lx-Office Installationsanleitung">
+<meta name="generator" content="makeinfo 4.8">
+<link title="Top" rel="start" href="index.html#Top">
+<link rel="up" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort" title="Benutzerauthentifizierung und Administratorpasswort">
+<link rel="prev" href="Passwort_00fcberpr_00fcfung.html#Passwort_00fcberpr_00fcfung" title="Passwortüberprüfung">
+<link rel="next" href="Anlegen-der-Authentifizierungsdatenbank.html#Anlegen-der-Authentifizierungsdatenbank" title="Anlegen der Authentifizierungsdatenbank">
+<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<style type="text/css"><!--
+  pre.display { font-family:inherit }
+  pre.format  { font-family:inherit }
+  pre.smalldisplay { font-family:inherit; font-size:smaller }
+  pre.smallformat  { font-family:inherit; font-size:smaller }
+  pre.smallexample { font-size:smaller }
+  pre.smalllisp    { font-size:smaller }
+  span.sc    { font-variant:small-caps }
+  span.roman { font-family:serif; font-weight:normal; } 
+  span.sansserif { font-family:sans-serif; font-weight:normal; } 
+--></style>
+</head>
+<body>
+<div class="node">
+<p>
+<a name="Name-des-Session-Cookies"></a>
+<a name="Name-des-Session_002dCookies"></a>
+n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="Anlegen-der-Authentifizierungsdatenbank.html#Anlegen-der-Authentifizierungsdatenbank">Anlegen der Authentifizierungsdatenbank</a>,
+voriges:&nbsp;<a rel="previous" accesskey="p" href="Passwort_00fcberpr_00fcfung.html#Passwort_00fcberpr_00fcfung">Passwortüberprüfung</a>,
+aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>
+<hr>
+</div>
+
+<h3 class="section">6.5 Name des Session-Cookies</h3>
+
+<p>Sollen auf einem Server mehrere Lx-Office-Installationen aufgesetzt
+werden, so müssen die Namen der Session-Cookies für alle
+Installationen unterschiedlich sein. Der Name des Cookies wird mit dem
+Parameter <code>$self-&gt;{cookie_name}</code> gesetzt.
+
+   <p>Diese Angabe ist optional, wenn nur eine Installation auf dem Server
+existiert.
+
+   </body></html>
+
index 9a6ed1c..3a0227f 100644 (file)
@@ -5,7 +5,7 @@
 <meta name="description" content="Lx-Office Installationsanleitung">
 <meta name="generator" content="makeinfo 4.8">
 <link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Benutzer-und-Datenbanken-anlegen.html#Benutzer-und-Datenbanken-anlegen" title="Benutzer und Datenbanken anlegen">
+<link rel="prev" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung" title="Benutzer- und Gruppenverwaltung">
 <link rel="next" href="Lx_002dOffice-ERP-verwenden.html#Lx_002dOffice-ERP-verwenden" title="Lx-Office ERP verwenden">
 <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
 <meta http-equiv="Content-Style-Type" content="text/css">
 <a name="OpenDocument-Vorlagen"></a>
 <a name="OpenDocument_002dVorlagen"></a>
 n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="Lx_002dOffice-ERP-verwenden.html#Lx_002dOffice-ERP-verwenden">Lx-Office ERP verwenden</a>,
-voriges:&nbsp;<a rel="previous" accesskey="p" href="Benutzer-und-Datenbanken-anlegen.html#Benutzer-und-Datenbanken-anlegen">Benutzer und Datenbanken anlegen</a>,
+voriges:&nbsp;<a rel="previous" accesskey="p" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>,
 aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
 <hr>
 </div>
 
-<h2 class="chapter">7 OpenDocument-Vorlagen</h2>
+<h2 class="chapter">8 OpenDocument-Vorlagen</h2>
 
 <p>Lx-Office unterstützt die Verwendung von Vorlagen im
 OpenDocument-Format, wie es OpenOffice.org ab Version 2
 erzeugt. Lx-Office kann dabei sowohl neue OpenDocument-Dokumente als
 auch aus diesen direkt PDF-Dateien erzeugen.  Um die Unterstützung von
-OpenDocument-Vorlagen zu aktivieren muss in der Datei &ldquo;lx-erp.conf&rdquo;
-die Variable <code>$opendocument_templates</code> auf &ldquo;1&rdquo; stehen.  Dieses
-ist die Standardeinstellung.
+OpenDocument-Vorlagen zu aktivieren muss in der Datei
+<code>config/lx-erp.conf</code> die Variable <code>$opendocument_templates</code>
+auf `<samp><span class="samp">1</span></samp>' stehen.  Dieses ist die Standardeinstellung.
 
-   <p>Weiterhin muss in der Datei &ldquo;lx-erp.conf&rdquo; die Variable
+   <p>Weiterhin muss in der Datei <code>config/lx-erp.conf</code> die Variable
 <code>$dbcharset</code> auf die Zeichenkodierung gesetzt werden, die auch
 bei der Speicherung der Daten in der Datenbank verwendet wird. Diese
 ist in den meisten Fällen "ISO-8859-15".
@@ -54,11 +54,11 @@ neben OpenOffice.org ab Version 2 auch der &ldquo;X virtual frame buffer&rdquo;
 (xvfb) installiert werden.  Bei Debian ist er im Paket &ldquo;xvfb&rdquo;
 enthalten. Andere Distributionen enthalten ihn in anderen Paketen.
 
-   <p>Nach der Installation müssen in der Datei &ldquo;lx-erp.conf&rdquo; zwei weitere
-Variablen angepasst werden: <code>$openofficeorg_writer_bin</code> muss den
-vollständigen Pfad zur OpenOffice.org Writer-Anwendung enthalten. 
-<code>$xvfb_bin</code> muss den Pfad zum &ldquo;X virtual frame buffer&rdquo;
-enthalten.
+   <p>Nach der Installation müssen in der Datei <code>config/lx-erp.conf</code>
+zwei weitere Variablen angepasst werden:
+<code>$openofficeorg_writer_bin</code> muss den vollständigen Pfad zur
+OpenOffice.org Writer-Anwendung enthalten.  <code>$xvfb_bin</code> muss den
+Pfad zum &ldquo;X virtual frame buffer&rdquo; enthalten.
 
    <p>Zusätzlich gibt es zwei verschiedene Arten, wie Lx-Office mit
 OpenOffice kommuniziert. Die erste Variante, die benutzt wird, wenn
diff --git a/doc/INSTALL/Passwort_00fcberpr_00fcfung.html b/doc/INSTALL/Passwort_00fcberpr_00fcfung.html
new file mode 100644 (file)
index 0000000..532fea3
--- /dev/null
@@ -0,0 +1,71 @@
+<html lang="en">
+<head>
+<title>Passwortüberprüfung - Lx-Office Installationsanleitung</title>
+<meta http-equiv="Content-Type" content="text/html">
+<meta name="description" content="Lx-Office Installationsanleitung">
+<meta name="generator" content="makeinfo 4.8">
+<link title="Top" rel="start" href="index.html#Top">
+<link rel="up" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort" title="Benutzerauthentifizierung und Administratorpasswort">
+<link rel="prev" href="Authentifizierungsdatenbank.html#Authentifizierungsdatenbank" title="Authentifizierungsdatenbank">
+<link rel="next" href="Name-des-Session_002dCookies.html#Name-des-Session_002dCookies" title="Name des Session-Cookies">
+<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<style type="text/css"><!--
+  pre.display { font-family:inherit }
+  pre.format  { font-family:inherit }
+  pre.smalldisplay { font-family:inherit; font-size:smaller }
+  pre.smallformat  { font-family:inherit; font-size:smaller }
+  pre.smallexample { font-size:smaller }
+  pre.smalllisp    { font-size:smaller }
+  span.sc    { font-variant:small-caps }
+  span.roman { font-family:serif; font-weight:normal; } 
+  span.sansserif { font-family:sans-serif; font-weight:normal; } 
+--></style>
+</head>
+<body>
+<div class="node">
+<p>
+<a name="Passwort%fcberpr%fcfung"></a>
+<a name="Passwort_00fcberpr_00fcfung"></a>
+n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="Name-des-Session_002dCookies.html#Name-des-Session_002dCookies">Name des Session-Cookies</a>,
+voriges:&nbsp;<a rel="previous" accesskey="p" href="Authentifizierungsdatenbank.html#Authentifizierungsdatenbank">Authentifizierungsdatenbank</a>,
+aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>
+<hr>
+</div>
+
+<h3 class="section">6.4 Passwortüberprüfung</h3>
+
+<p>Lx-Office unterstützt Passwortüberprüfung auf zwei Arten: gegen die
+Authentifizierungsdatenbank und gegen einen externen LDAP- oder
+Active-Directory-Server. Welche davon benutzt wird, regelt der
+Parameter <code>$self-&gt;{module}</code>.
+
+   <p>Sollen die Benutzerpasswörter in der Authentifizierungsdatenbank
+gespeichert werden, so muss der Parameter <code>$self-&gt;{module}</code> den
+Wert `<samp><span class="samp">DB</span></samp>' enthalten. In diesem Fall können sowohl der
+Administrator als auch die Benutzer selber ihre Psaswörter in
+Lx-Office ändern.
+
+   <p>Soll hingegen ein externer LDAP- oder Active-Directory-Server benutzt
+werden, so muss der Parameter <code>$self-&gt;{module}</code> auf `<samp><span class="samp">LDAP</span></samp>'
+gesetzt werden. In diesem Fall müssen zusätzliche Informationen über
+den LDAP-Server in <code>$self-&gt;{LDAP_config}</code> angegeben werden:
+
+     <ul>
+<li>`<samp><span class="samp">host</span></samp>' &ndash; Der Rechnername oder die IP-Adresse des LDAP- oder Active-Directory-Servers. Diese Angabe ist zwingend erforderlich. 
+<li>`<samp><span class="samp">port</span></samp>' &ndash; Die Portnummer des LDAP-Servers; meist 389. 
+<li>`<samp><span class="samp">tls</span></samp>' &ndash; Wenn Verbindungsverschlüsselung gewünscht ist, so diesen Wert auf `<samp><span class="samp">1</span></samp>' setzen, andernfalls auf `<samp><span class="samp">0</span></samp>' belassen
+<li>`<samp><span class="samp">attribute'</span></samp>' &ndash; Das LDAP-Attribut, in dem der Benutzername steht, den der Benutzer eingegeben hat. Für Active-Directory-Server
+  ist dies meist `<samp><span class="samp">sAMAccountName</span></samp>', für andere LDAP-Server hingegen `<samp><span class="samp">uid</span></samp>'. Diese Angabe ist zwingend erforderlich. 
+<li>`<samp><span class="samp">base_dn</span></samp>' &ndash; Der Abschnitt des LDAP-Baumes, der durchsucht werden soll. Diese Angabe ist zwingend erforderlich. 
+<li>`<samp><span class="samp">filter</span></samp>' &ndash; Ein optionaler LDAP-Filter. Enthält dieser Filter das Wort <code>&lt;%login%&gt;</code>, so wird dieses durch den vom Benutzer
+  eingegebenen Benutzernamen ersetzt. Andernfalls wird der LDAP-Baum nach einem Element durchsucht, bei dem das oben angegebene Attribut
+  mit dem Benutzernamen identisch ist. 
+<li>`<samp><span class="samp">bind_dn</span></samp>' und `<samp><span class="samp">bind_password</span></samp>' &ndash; Wenn der LDAP-Server eine Anmeldung erfordert, bevor er durchsucht werden kann (z.B. ist dies bei
+  Active-Directory-Servern der Fall), so kann diese hier angegeben werden. Für Active-Directory-Server kann als `<samp><span class="samp">bind_dn</span></samp>' entweder eine
+  komplette LDAP-DN wie z.B. `<samp><span class="samp">cn=Martin Mustermann,cn=Users,dc=firmendomain</span></samp>' auch nur der volle Name des Benutzers
+  eingegeben werden; in diesem Beispiel also `<samp><span class="samp">Martin Mustermann</span></samp>'. 
+</ul>
+
+   </body></html>
+
diff --git a/doc/INSTALL/Zusammenh_00e4nge.html b/doc/INSTALL/Zusammenh_00e4nge.html
new file mode 100644 (file)
index 0000000..22314d3
--- /dev/null
@@ -0,0 +1,75 @@
+<html lang="en">
+<head>
+<title>Zusammenhänge - Lx-Office Installationsanleitung</title>
+<meta http-equiv="Content-Type" content="text/html">
+<meta name="description" content="Lx-Office Installationsanleitung">
+<meta name="generator" content="makeinfo 4.8">
+<link title="Top" rel="start" href="index.html#Top">
+<link rel="up" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung" title="Benutzer- und Gruppenverwaltung">
+<link rel="next" href="Datenbanken-anlegen.html#Datenbanken-anlegen" title="Datenbanken anlegen">
+<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<style type="text/css"><!--
+  pre.display { font-family:inherit }
+  pre.format  { font-family:inherit }
+  pre.smalldisplay { font-family:inherit; font-size:smaller }
+  pre.smallformat  { font-family:inherit; font-size:smaller }
+  pre.smallexample { font-size:smaller }
+  pre.smalllisp    { font-size:smaller }
+  span.sc    { font-variant:small-caps }
+  span.roman { font-family:serif; font-weight:normal; } 
+  span.sansserif { font-family:sans-serif; font-weight:normal; } 
+--></style>
+</head>
+<body>
+<div class="node">
+<p>
+<a name="Zusammenh%e4nge"></a>
+<a name="Zusammenh_00e4nge"></a>
+n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="Datenbanken-anlegen.html#Datenbanken-anlegen">Datenbanken anlegen</a>,
+aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>
+<hr>
+</div>
+
+<h3 class="section">7.1 Zusammenhänge</h3>
+
+<p>Lx-Office verwendet eine Datenbank zum Speichern all seiner
+Informationen wie Kundendaten, Artikel, Angebote, Rechnungen etc. Um
+mit Lx-Office arbeiten zu können, muss eine Person einen
+Benutzeraccount haben. Jedem Benutzeraccount wiederum wird genau eine
+Datenbank zugewiesen, mit der dieser Benutzer arbeiten kann. Es ist
+möglich und normal, dass mehreren Benutzern die selbe Datenbank
+zugewiesen wird, sodass sie alle mit den selben Daten arbeiten können.
+
+   <p>Die Basisdaten der Benutzer, die in der Administration eingegeben
+werden können, werden in einer zweiten Datenbank gespeichert, der
+bereits erwähnten Authentifizierungsdatenbank. Diese ist also den
+Produktivdaten enthaltenden Datenbanken vorgeschaltet. Pro
+Lx-Office-Installation gibt es nur eine Authentifizierungsdatenbank,
+aber beliebig viele Datenbanken mit Firmendaten.
+
+   <p>Lx-Office lann seinen Benutzern Zugriff auf bestimmte
+Funktionsbereiche erlauben oder verbieten. Wird der Zugriff nicht
+gestattet, so werden der entsprechenden Menüpunkte auch nicht
+angezeigt. Diese Rechte werden ebenfalls in der
+Authentifizierungsdatenbank gespeichert.
+
+   <p>Um Rechte verteilen zu können, verwendet Lx-Office ein
+Gruppen-Prinzip. Einer Gruppe kann der Zugriff auf bestimmte Bereiche
+erlaubt werden. Ein Benutzer wiederum kann Mitglied in einer oder
+mehrerer Gruppen sein. Der Benutzer hat Zugriff auf alle diejenigen
+Funktionen, die mindestens einer Gruppe erlaubt sind, in der der
+Benutzer Mitglied ist.
+
+   <p>Die allgemeine Reihenfolge, in der Datenbanken, Gruppen und Benutzer
+angelegt werden sollten, lautet:
+
+     <ol type=1 start=1>
+<li>Datenbank anlegen
+<li>Gruppen anlegen
+<li>Benutzer anlegen
+<li>Benutzer den Gruppen zuordnen
+        </ol>
+
+   </body></html>
+
index 5760ac7..4e5a7cf 100644 (file)
 <li><a href="Datenbankbenutzer-anlegen.html#Datenbankbenutzer-anlegen">4.3 Datenbankbenutzer anlegen</a>
 </li></ul>
 <li><a name="toc_Apache_002dKonfiguration" href="Apache_002dKonfiguration.html#Apache_002dKonfiguration">5 Apache-Konfiguration</a>
-<li><a name="toc_Benutzer-und-Datenbanken-anlegen" href="Benutzer-und-Datenbanken-anlegen.html#Benutzer-und-Datenbanken-anlegen">6 Benutzer und Datenbanken anlegen</a>
-<li><a name="toc_OpenDocument_002dVorlagen" href="OpenDocument_002dVorlagen.html#OpenDocument_002dVorlagen">7 OpenDocument-Vorlagen</a>
-<li><a name="toc_Lx_002dOffice-ERP-verwenden" href="Lx_002dOffice-ERP-verwenden.html#Lx_002dOffice-ERP-verwenden">8 Lx-Office ERP verwenden</a>
+<li><a name="toc_Benutzerauthentifizierung-und-Administratorpasswort" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort">6 Benutzerauthentifizierung und Administratorpasswort</a>
+<ul>
+<li><a href="Grundlagen-zur-Benutzerauthentifizierung.html#Grundlagen-zur-Benutzerauthentifizierung">6.1 Grundlagen zur Benutzerauthentifizierung</a>
+<li><a href="Administratorpasswort.html#Administratorpasswort">6.2 Administratorpasswort</a>
+<li><a href="Authentifizierungsdatenbank.html#Authentifizierungsdatenbank">6.3 Authentifizierungsdatenbank</a>
+<li><a href="Passwort_00fcberpr_00fcfung.html#Passwort_00fcberpr_00fcfung">6.4 Passwortüberprüfung</a>
+<li><a href="Name-des-Session_002dCookies.html#Name-des-Session_002dCookies">6.5 Name des Session-Cookies</a>
+<li><a href="Anlegen-der-Authentifizierungsdatenbank.html#Anlegen-der-Authentifizierungsdatenbank">6.6 Anlegen der Authentifizierungsdatenbank</a>
+</li></ul>
+<li><a name="toc_Benutzer_002d-und-Gruppenverwaltung" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung">7 Benutzer- und Gruppenverwaltung</a>
+<ul>
+<li><a href="Zusammenh_00e4nge.html#Zusammenh_00e4nge">7.1 Zusammenhänge</a>
+<li><a href="Datenbanken-anlegen.html#Datenbanken-anlegen">7.2 Datenbanken anlegen</a>
+<li><a href="Gruppen-anlegen.html#Gruppen-anlegen">7.3 Gruppen anlegen</a>
+<li><a href="Benutzer-anlegen.html#Benutzer-anlegen">7.4 Benutzer anlegen</a>
+<li><a href="Gruppenmitgliedschaften-verwalten.html#Gruppenmitgliedschaften-verwalten">7.5 Gruppenmitgliedschaften verwalten</a>
+<li><a href="Migration-alter-Installationen.html#Migration-alter-Installationen">7.6 Migration alter Installationen</a>
+</li></ul>
+<li><a name="toc_OpenDocument_002dVorlagen" href="OpenDocument_002dVorlagen.html#OpenDocument_002dVorlagen">8 OpenDocument-Vorlagen</a>
+<li><a name="toc_Lx_002dOffice-ERP-verwenden" href="Lx_002dOffice-ERP-verwenden.html#Lx_002dOffice-ERP-verwenden">9 Lx-Office ERP verwenden</a>
 </li></ul>
 </div>
 
@@ -59,9 +76,10 @@ aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="../index.html#dir">(dir)</a>
 <li><a accesskey="3" href="Installation-des-Programmpaketes.html#Installation-des-Programmpaketes">Installation des Programmpaketes</a>:  Installationsort, Berechtigungen
 <li><a accesskey="4" href="Anpassung-der-PostgreSQL_002dKonfiguration.html#Anpassung-der-PostgreSQL_002dKonfiguration">Anpassung der PostgreSQL-Konfiguration</a>:  Verschiedene Aspekte der Datenbankkonfiguration
 <li><a accesskey="5" href="Apache_002dKonfiguration.html#Apache_002dKonfiguration">Apache-Konfiguration</a>:  Einrichtung eines Aliases und Optionen für das Ausführen von CGI-Scripten
-<li><a accesskey="6" href="Benutzer-und-Datenbanken-anlegen.html#Benutzer-und-Datenbanken-anlegen">Benutzer und Datenbanken anlegen</a>:  Letzte Schritte vor der Anmeldung
-<li><a accesskey="7" href="OpenDocument_002dVorlagen.html#OpenDocument_002dVorlagen">OpenDocument-Vorlagen</a>:  Wichtige Hinweise zum Erstellen und zur Verwendung von Dokumentenvorlagen
-<li><a accesskey="8" href="Lx_002dOffice-ERP-verwenden.html#Lx_002dOffice-ERP-verwenden">Lx-Office ERP verwenden</a>:  Die URLs zur Anmeldung und Administration
+<li><a accesskey="6" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>:  Einrichtung der Authentifizierungsdatenbank und der Passwortüberprüfung
+<li><a accesskey="7" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>:  Einrichten von Benutzern, Gruppen und Datenbanken
+<li><a accesskey="8" href="OpenDocument_002dVorlagen.html#OpenDocument_002dVorlagen">OpenDocument-Vorlagen</a>:  Wichtige Hinweise zum Erstellen und zur Verwendung von Dokumentenvorlagen
+<li><a accesskey="9" href="Lx_002dOffice-ERP-verwenden.html#Lx_002dOffice-ERP-verwenden">Lx-Office ERP verwenden</a>:  Die URLs zur Anmeldung und Administration
 </ul>
 
 <!--  -->
index d401fbd..8324330 100644 (file)
@@ -1,3 +1,4 @@
 all:
+       rm -f INSTALL/*.html
        makeinfo --html      --document-language=de_DE                INSTALL.texi
        makeinfo --plaintext --document-language=de_DE -o INSTALL.txt INSTALL.texi
index c4c406d..04b9a08 100644 (file)
@@ -4,6 +4,33 @@ Wichtige Hinweise zum Upgrade von 
 
 ** BITTE FERTIGEN SIE VOR DEM UPGRADE EIN BACKUP IHRER DATENBANK(EN) AN! **
 
+Upgrade auf v2.4.4
+==================
+
+Mit Version 2.4.4 wurde der Code zur Benutzerauthentifizierung neu
+geschrieben. Die Umstellung erfordert eine manuelle
+Konfiguration. Bestehende Benutzeraccounts können aber von Lx-Office
+automatisch übernommen werden.
+
+Bitte lesen Sie für die Basiseinrichtung der Konfiguration die Datei
+"doc/INSTALL/index.html" und dort die Kapitel
+"Benutzerauthentifizierung und Administratorpasswort" sowie "Benutzer-
+und Gruppenverwaltung".
+
+Nach der Einrichtung der Datei "config/authentication.pl" muss im
+Webbrowser das Administrationsinterface aufgerufen werden. Nach
+erfolgter Anmeldung werden Sie durch den Upgradeprozess geleitet.
+
+Weiterhin hat sich der Speicherort der Datei "lx-erp.conf" verändert.
+Sie liegt nun im Unterverzeichnis "config". Einstellungen, die in der
+alten Datei getätigt wurden, müssen manuell übernommen werden. Die
+alte Datei im Lx-Offfice-Stammverzeichnis kann daraufhin gelöscht
+werden.
+
+Die weiteren erforderlichen Datenbankupgrades werden erst vorgenommen,
+wenn sich ein Benutzer erfolgreich anmeldet.
+
+
 Upgrade von v2.4.0 und neuer auf v2.4.3
 =======================================
 
diff --git a/kopf.pl b/kopf.pl
index 5ee9f2f..28ab157 100755 (executable)
--- a/kopf.pl
+++ b/kopf.pl
@@ -9,15 +9,26 @@ BEGIN {
 use SL::LXDebug;
 $lxdebug = LXDebug->new();
 
+use SL::Auth;
 use SL::Form;
 use SL::Locale;
 
-eval { require "lx-erp.conf"; };
+eval { require "config/lx-erp.conf"; };
+eval { require "config/lx-erp-local.conf"; } if (-f "config/lx-erp-local.conf");
 
 $form = new Form;
 
-eval { require("$userspath/$form->{login}.conf"); };
+our $auth     = SL::Auth->new();
+if (!$auth->session_tables_present()) {
+  _show_error('login/auth_db_unreachable');
+}
+$auth->expire_sessions();
+$auth->restore_session();
+
+our %myconfig = $auth->read_user($form->{login});
 
 $locale = new Locale "$myconfig{countrycode}", "kopf";
 
+delete $form->{password};
+
 eval { require "bin/mozilla/kopf.pl"; };
index 473edc5..238f6ab 100644 (file)
@@ -1,24 +1,47 @@
 $self->{texts} = {
+  'A group with that name does already exist.' => 'Eine Gruppe mit diesem Namen gibt es bereits.',
   'A temporary directory could not be created:' => 'Ein tempor&auml;res Verzeichnis konnte nicht erstellt werden:',
   'A temporary file could not be created:' => 'Eine tempor&auml;re Datei konnte nicht erstellt werden:',
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Add User'                    => 'Benutzer erfassen',
   'Address'                     => 'Adresse',
   'Administration'              => 'Administration',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.',
+  'Authentification database creation' => 'Anlegen der Datenbank zur Benutzerauthentifizierung',
+  'Authentification tables creation' => 'Anlegen der Tabellen zur Benutzerauthentifizierung',
   'Backup Dataset'              => 'Datenbank sichern',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'Cannot create Lock!'         => 'System kann nicht gesperrt werden!',
   'Cc'                          => 'Cc',
-  'Change Admin Password'       => 'Administratorpasswort ändern',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
+  'Could not open the old memberfile.' => 'Die Datei mit den Benutzerdaten konnte nicht ge&ouml;ffnet werden.',
   'Create Dataset'              => 'Datenbank anlegen',
+  'Create a standard group'     => 'Eine Standard-Benutzergruppe anlegen',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Database Administration'     => 'Datenbankadministration',
@@ -32,10 +55,13 @@ $self->{texts} = {
   'Directory'                   => 'Verzeichnis',
   'ELSE'                        => 'Zusatz',
   'Edit User'                   => 'Benutzerdaten bearbeiten',
+  'Edit group membership'       => 'Gruppenmitgliedschaften bearbeiten',
   'Enter longdescription'       => 'Langtext eingeben',
   'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
   'File'                        => 'Datei',
-  'File locked!'                => 'Datei gesperrt!',
+  'Full Access'                 => 'Vollzugriff',
+  'Full access to all functions' => 'Vollzugriff auf alle Funktionen',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'Incorrect Password!'         => 'Ungültiges Passwort!',
   'Invoice'                     => 'Rechnung',
@@ -43,8 +69,11 @@ $self->{texts} = {
   'Lockfile removed!'           => 'System entsperrt!',
   'Login name missing!'         => 'Loginname fehlt.',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
@@ -56,15 +85,19 @@ $self->{texts} = {
   'No Database Drivers available!' => 'Kein Datenbanktreiber verfügbar!',
   'No Dataset selected!'        => 'Keine Datenbank ausgewählt!',
   'No Vendor was found matching the search parameters.' => 'Zu dem Suchbegriff wurde kein Händler gefunden',
+  'No action defined.'          => 'Keine Aktion definiert.',
   'No backup file has been uploaded.' => 'Es wurde keine Sicherungsdatei hochgeladen.',
   'No customer has been selected yet.' => 'Es wurde noch kein Kunde ausgewählt.',
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
+  'No group has been selected, or the group does not exist anymore.' => 'Es wurde keine Gruppe ausgew&auml;hlt, oder die Gruppe wurde in der Zwischenzeit gel&ouml;scht.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
+  'No user has been selected.'  => 'Es wurde kein Benutzer ausgew&auml;hlt.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'Nothing to delete!'          => 'Es konnte nichts gelöscht werden!',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'POSTED'                      => 'Gebucht',
   'POSTED AS NEW'               => 'Als neu gebucht',
@@ -72,7 +105,6 @@ $self->{texts} = {
   'Packing List'                => 'Lieferschein',
   'Part Number'                 => 'Artikelnummer',
   'Part description'            => 'Artikelbeschreibung',
-  'Password changed!'           => 'Passwort geändert!',
   'Pick List'                   => 'Sammelliste',
   'Please enter values'         => 'Bitte Werte eingeben',
   'Proforma Invoice'            => 'Proformarechnung',
@@ -81,6 +113,8 @@ $self->{texts} = {
   'Purchase Order'              => 'Lieferantenauftrag',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'Restore Dataset'             => 'Datenbank wiederherstellen',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
@@ -93,30 +127,54 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Storno Invoice'              => 'Stornorechnung',
   'Storno Packing List'         => 'Stornolieferschein',
   'Subject'                     => 'Betreff',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'The dataset name is missing.' => 'Der Datenbankname fehlt.',
+  'The directory "%s" could not be created:\n%s' => 'Das Verzeichnis "%s" konnte nicht erstellt werden:\n%s',
   'The directory %s does not exist.' => 'Das Verzeichnis %s existiert nicht.',
   'The email address is missing.' => 'Die Emailadresse fehlt.',
+  'The group has been added.'   => 'Die Gruppe wurde erfasst.',
+  'The group has been deleted.' => 'Die Gruppe wurde gel&ouml;scht.',
+  'The group has been saved.'   => 'Die Gruppe wurde gespeichert.',
+  'The group memberships have been saved.' => 'Die Gruppenmitgliedschaften wurden gespeichert.',
+  'The group name is missing.'  => 'Der Gruppenname fehlt.',
   'The login is missing.'       => 'Das Login fehlt.',
-  'The passwords do not match.' => 'Die Passw&ouml;rter stimmen nicht &uuml;berein.',
   'The pg_dump process could not be started.' => 'Der pg_dump-Prozess konnte nicht gestartet werden.',
   'The pg_restore process could not be started.' => 'Der pg_restore-Prozess konnte nicht gestartet werden.',
+  'The user has been added to this group.' => 'Der Benutzer wurde der Gruppe hinzugef&uuml;gt.',
+  'The user has been removed from this group.' => 'Der Benutzer wurde aus der Gruppe entfernt.',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
   'Update Dataset'              => 'Datenbank aktualisieren',
+  'User data migration'         => 'Benutzerdatenmigration',
   'User deleted!'               => 'Benutzer gelöscht!',
+  'User migration complete'     => 'Benutzermigration abgeschlossen',
   'User saved!'                 => 'Benutzer gespeichert!',
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
   'Vendor details'              => 'Lieferantendetails',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'invoice'                     => 'Rechnung',
   'is already a member!'        => 'ist bereits ein Mitglied!',
@@ -137,6 +195,9 @@ $self->{subs} = {
   'H'                           => 'H',
   'NTI'                         => 'NTI',
   'Q'                           => 'Q',
+  'add'                         => 'add',
+  'add_group'                   => 'add_group',
+  'add_to_group'                => 'add_to_group',
   'add_user'                    => 'add_user',
   'adminlogin'                  => 'adminlogin',
   'back'                        => 'back',
@@ -145,24 +206,34 @@ $self->{subs} = {
   'build_std_url'               => 'build_std_url',
   'calculate_qty'               => 'calculate_qty',
   'call_sub'                    => 'call_sub',
-  'change_admin_password'       => 'change_admin_password',
-  'change_password'             => 'change_password',
+  'check_auth_db_and_tables'    => 'check_auth_db_and_tables',
   'check_cov2'                  => 'check_cov2',
   'check_customer_or_vendor'    => 'check_customer_or_vendor',
-  'check_password'              => 'check_password',
   'continue'                    => 'continue',
   'cov_selected'                => 'cov_selected',
   'cov_selected2'               => 'cov_selected2',
   'cov_selection_internal'      => 'cov_selection_internal',
+  'create_auth_db'              => 'create_auth_db',
+  'create_auth_tables'          => 'create_auth_tables',
   'create_dataset'              => 'create_dataset',
+  'create_standard_group'       => 'create_standard_group',
+  'create_standard_group_ask'   => 'create_standard_group_ask',
   'dbcreate'                    => 'dbcreate',
   'dbdelete'                    => 'dbdelete',
   'dbselect_source'             => 'dbselect_source',
   'dbupdate'                    => 'dbupdate',
   'delete'                      => 'delete',
   'delete_dataset'              => 'delete_dataset',
+  'delete_group'                => 'delete_group',
+  'delete_user'                 => 'delete_user',
   'delivery_customer_selection' => 'delivery_customer_selection',
+  'dispatcher'                  => 'dispatcher',
+  'dont_create_standard_group'  => 'dont_create_standard_group',
   'edit'                        => 'edit',
+  'edit_group'                  => 'edit_group',
+  'edit_group_membership'       => 'edit_group_membership',
+  'edit_groups'                 => 'edit_groups',
+  'edit_user'                   => 'edit_user',
   'edit_user_form'              => 'edit_user_form',
   'employee_selection_internal' => 'employee_selection_internal',
   'format_dates'                => 'format_dates',
@@ -171,18 +242,30 @@ $self->{subs} = {
   'lock_system'                 => 'lock_system',
   'login'                       => 'login',
   'login_name'                  => 'login_name',
+  'logout'                      => 'logout',
   'mark_as_paid_common'         => 'mark_as_paid_common',
+  'migrate_users'               => 'migrate_users',
+  'new_project'                 => 'new_project',
+  'no'                          => 'no',
   'part_selection_internal'     => 'part_selection_internal',
   'pg_database_administration'  => 'pg_database_administration',
+  'project_created'             => 'project_created',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
+  'remove_from_group'           => 'remove_from_group',
   'restore_dataset'             => 'restore_dataset',
   'restore_dataset_start'       => 'restore_dataset_start',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'save'                        => 'save',
+  'save_group'                  => 'save_group',
+  'save_group_membership'       => 'save_group_membership',
+  'save_user'                   => 'save_user',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_part'                 => 'select_part',
   'select_part_internal'        => 'select_part_internal',
@@ -191,23 +274,34 @@ $self->{subs} = {
   'show_vc_details'             => 'show_vc_details',
   'unlock_system'               => 'unlock_system',
   'update_dataset'              => 'update_dataset',
+  'user_migration_complete'     => 'user_migration_complete',
   'vendor_selection'            => 'vendor_selection',
+  'yes'                         => 'yes',
+  'erfassen'                    => 'add',
   'benutzer_erfassen'           => 'add_user',
+  'zu_gruppe_hinzufügen'        => 'add_to_group',
   'zurück'                      => 'back',
   'datenbank_sichern'           => 'backup_dataset',
-  'administratorpasswort_ändern' => 'change_admin_password',
-  'passwort_ändern'             => 'change_password',
   'weiter'                      => 'continue',
   'datenbank_anlegen'           => 'create_dataset',
+  'tabellen_anlegen'            => 'create_tables',
   'löschen'                     => 'delete',
   'datenbank_löschen'           => 'delete_dataset',
+  'bearbeiten'                  => 'edit',
+  'gruppen_bearbeiten'          => 'edit_groups',
   'system_sperren'              => 'lock_system',
   'anmeldung'                   => 'login',
+  'abmeldung'                   => 'logout',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
+  'nein'                        => 'no',
   'datenbankadministration'     => 'pg_database_administration',
+  'aus_gruppe_entfernen'        => 'remove_from_group',
   'datenbank_wiederherstellen'  => 'restore_dataset',
   'speichern'                   => 'save',
   'system_entsperren'           => 'unlock_system',
   'datenbank_aktualisieren'     => 'update_dataset',
+  'ja'                          => 'yes',
 };
 
 1;
index c37c7b8..88e650d 100644 (file)
@@ -27,6 +27,8 @@ $self->{texts} = {
   '4. Quarter'                  => '4. Quartal',
   '<b>What</b> do you want to look for?' => '<b>Wonach</b> wollen Sie suchen?',
   'A Buchungsgruppe consists of a descriptive name and the account numbers for the income and expense accounts for those four tax zones as well as the inventory account number.' => 'Eine Buchungsgruppe besteht aus einem deskriptiven Namen, den Erl&ouml;s- und Aufwandskonten f&uuml;r diese vier Steuerzonen sowie aus einem Inventarkonto.',
+  'A group named &quot;Full Access&quot; has been created.' => 'Eine Gruppe namens &quot;Vollzugriff&quot; wurde angelegt.',
+  'A group with that name does already exist.' => 'Eine Gruppe mit diesem Namen gibt es bereits.',
   'A temporary directory could not be created:' => 'Ein tempor&auml;res Verzeichnis konnte nicht erstellt werden:',
   'A temporary file could not be created:' => 'Eine tempor&auml;re Datei konnte nicht erstellt werden:',
   'A unit with this name does already exist.' => 'Eine Einheit mit diesem Namen existiert bereits.',
@@ -44,7 +46,6 @@ $self->{texts} = {
   'About'                       => 'über',
   'Abrechnungsnummer'           => 'Abrechnungsnummer',
   'Abteilung'                   => 'Abteilung',
-  'Access Control'              => 'Zugriffkontrolle',
   'Account'                     => 'Konto',
   'Account Category A'          => 'Aktiva/Mittelverwendung',
   'Account Category C'          => 'Kosten',
@@ -124,16 +125,23 @@ $self->{texts} = {
   'Add User'                    => 'Benutzer erfassen',
   'Add Vendor'                  => 'Lieferant erfassen',
   'Add Vendor Invoice'          => 'Einkaufsrechnung erfassen',
+  'Add a new group'             => 'Neue Gruppe erfassen',
   'Add and edit %s'             => '%s hinzuf&uuml;gen und bearbeiten',
+  'Add to group'                => 'Zu Gruppe hinzufügen',
   'Add unit'                    => 'Einheit hinzuf&uuml;gen',
   'Address'                     => 'Adresse',
   'Administration'              => 'Administration',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
   'Aktion'                      => 'Aktion',
   'All'                         => 'Alle',
   'All Accounts'                => 'Alle Konten',
   'All Datasets up to date!'    => 'Alle Datenbanken sind auf aktuellem Stand.',
   'All changes in that file have been reverted.' => 'Alle &Auml;nderungen in dieser Datei wurden r&uuml;ckg&auml;ngig gemacht.',
   'All database upgrades have been applied.' => 'Alle Datenbankupdates wurden eingespielt.',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
+  'Alternatively you can create a new part which will then be selected.' => 'Sie k&ouml;nnen auch einen neuen Artikel anlegen, der dann automatisch ausgew&auml;hlt wird.',
+  'Alternatively you can create a new project which will then be selected.' => 'Alternativ k&ouml;nnen Sie auch ein neues Projekt anlegen, das dann automatisch ausgew&auml;hlt wird.',
+  'Alternatively you can skip this step and create groups yourself.' => 'Alternativ k&ouml;nnen Sie diesen Schritt &uuml;berspringen und selber Gruppen anlegen.',
   'Amended Advance Turnover Tax Return' => 'Berichtigte Anmeldung',
   'Amended Advance Turnover Tax Return (Nr. 10)' => 'Ist dies eine berichtigte Anmeldung? (Nr. 10/Zeile 15 Steuererklärung)',
   'Amount'                      => 'Betrag',
@@ -167,6 +175,8 @@ aktualisieren wollen?',
   'Audit Control'               => 'Bücherkontrolle',
   'Aug'                         => 'Aug',
   'August'                      => 'August',
+  'Authentification database creation' => 'Anlegen der Datenbank zur Benutzerauthentifizierung',
+  'Authentification tables creation' => 'Anlegen der Tabellen zur Benutzerauthentifizierung',
   'Auto Send?'                  => 'Auto. Versand?',
   'Automatically created invoice for fee and interest for dunning %s' => 'Automatisch erzeugte Rechnung für Gebühren und Zinsen zu Mahnung %s',
   'BOM'                         => 'Stückliste',
@@ -194,6 +204,7 @@ aktualisieren wollen?',
   'Billing Address'             => 'Rechnungsadresse',
   'Bin'                         => 'Lagerplatz',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'Birthday'                    => 'Geburtstag',
   'Bis'                         => 'bis',
   'Bis Konto: '                 => 'bis Konto: ',
@@ -246,8 +257,8 @@ aktualisieren wollen?',
   'Carry over shipping address' => 'Lieferadresse &uuml;bernehmen',
   'Cash'                        => 'Zahlungsverkehr',
   'Cc'                          => 'Cc',
-  'Change Admin Password'       => 'Administratorpasswort ändern',
-  'Change Password'             => 'Passwort ändern',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
+  'Charge number'               => 'Chargennummer',
   'Chart Type'                  => 'Kontentyp',
   'Chart of Accounts'           => 'Kontenübersicht',
   'Chart of accounts'           => 'Kontenrahmen',
@@ -283,6 +294,7 @@ aktualisieren wollen?',
   'Costs'                       => 'Kosten',
   'Could not copy %s to %s. Reason: %s' => 'Die Datei &quot;%s&quot; konnte nicht nach &quot;%s&quot; kopiert werden. Grund: %s',
   'Could not open the file users/members.' => 'Die Datei &quot;users/members&quot; konnte nicht ge&ouml;ffnet werden.',
+  'Could not open the old memberfile.' => 'Die Datei mit den Benutzerdaten konnte nicht ge&ouml;ffnet werden.',
   'Could not print dunning.'    => 'Die Mahnungen konnten nicht gedruckt werden.',
   'Could not rename %s to %s. Reason: %s' => 'Die Datei &quot;%s&quot; konnte nicht in &quot;%s&quot; umbenannt werden. Grund: %s',
   'Could not spawn ghostscript.' => 'Die Anwendung "ghostscript" konnte nicht gestartet werden.',
@@ -295,8 +307,22 @@ aktualisieren wollen?',
   'Create Buchungsgruppen'      => 'Buchungsgruppe erfassen',
   'Create Chart of Accounts'    => 'Kontenplan anlegen',
   'Create Dataset'              => 'Datenbank anlegen',
+  'Create a standard group'     => 'Eine Standard-Benutzergruppe anlegen',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Create invoice?'             => 'Rechnung erstellen?',
   'Create new'                  => 'Neu erfassen',
+  'Create tables'               => 'Tabellen anlegen',
   'Credit'                      => 'Haben',
   'Credit Account'              => 'Habenkonto',
   'Credit Limit'                => 'Kreditlimit',
@@ -330,6 +356,7 @@ aktualisieren wollen?',
   'Customized Report'           => 'Vorgewählte Zeiträume',
   'DATEV - Export Assistent'    => 'DATEV-Exportassistent',
   'DATEV Angaben'               => 'DATEV-Angaben',
+  'DATEV Export'                => 'DATEV-Export',
   'DATEX - Export Assistent'    => 'DATEV-Exportassistent',
   'DELETED'                     => 'Gelöscht',
   'DFV-Kennzeichen'             => 'DFV-Kennzeichen',
@@ -340,6 +367,7 @@ aktualisieren wollen?',
   'Database Host'               => 'Datenbankcomputer',
   'Database User missing!'      => 'Datenbankbenutzer fehlt!',
   'Database backups and restorations are disabled in lx-erp.conf.' => 'Datenbanksicherungen und -wiederherstellungen sind in der lx-erp.conf deaktiviert.',
+  'Database name'               => 'Datenbankname',
   'Database template'           => 'Datenbankvorlage',
   'Database update error:'      => 'Fehler beim Datenbankupgrade:',
   'Dataset'                     => 'Datenbank',
@@ -370,6 +398,7 @@ aktualisieren wollen?',
   'Delete Account'              => 'Konto löschen',
   'Delete Dataset'              => 'Datenbank löschen',
   'Delete drafts'               => 'Entwürfe löschen',
+  'Delete group'                => 'Gruppe l&ouml;schen',
   'Delivered'                   => 'Geliefert',
   'Delivery Date'               => 'Lieferdatum',
   'Department'                  => 'Abteilung',
@@ -390,6 +419,8 @@ aktualisieren wollen?',
   'Discount'                    => 'Rabatt',
   'Display'                     => 'Anzeigen',
   'Display file'                => 'Datei anzeigen',
+  'Do you really want to delete this group:' => 'Wollen Sie wirklich diese Gruppe l&ouml;schen:',
+  'Do you want Lx-Office to create a group for access to all functions?' => 'Wollen Sie, dass Lx-Office eine Gruppe mit Zugriff auf alle Funktionen anlegt?',
   'Do you want to <b>limit</b> your search?' => 'Wollen Sie Ihre Suche <b>spezialisieren</b>?',
   'Do you want to carry this shipping address over to the new purchase order so that the vendor can deliver the goods directly to your customer?' => 'Wollen Sie diese Lieferadresse in den neuen Lieferantenauftrag &uuml;bernehmen, damit der H&auml;ndler die Waren direkt an Ihren Kunden liefern kann?',
   'Done'                        => 'Fertig',
@@ -415,6 +446,7 @@ aktualisieren wollen?',
   'Dunning number'              => 'Mahnungsnummer',
   'Dunning overview'            => 'Mahnungsübersicht',
   'Dunnings'                    => 'Mahnungen',
+  'During this user migration Lx-Office can create such a group for you and grant all users access to all of Lx-Office\'s functions.' => 'Im Rahmen dieser Benutzerdatenmigration kann Lx-Office eine solche Gruppe f&uuml;r Sie anlegen und allen Benutzern Zugriff auf alle Lx-Office-Funktionen gew&auml;hren.',
   'E-mail'                      => 'eMail',
   'E-mail Statement to'         => 'Fälligkeitsabrechnung als eMail an',
   'E-mail address missing!'     => 'E-Mail-Adresse fehlt!',
@@ -466,8 +498,14 @@ aktualisieren wollen?',
   'Edit User'                   => 'Benutzerdaten bearbeiten',
   'Edit Vendor'                 => 'Lieferant editieren',
   'Edit Vendor Invoice'         => 'Einkaufsrechnung bearbeiten',
+  'Edit and delete a group'     => 'Gruppen bearbeiten und l&ouml;schen',
   'Edit file'                   => 'Datei bearbeiten',
+  'Edit group '                 => 'Gruppe bearbeiten',
+  'Edit group membership'       => 'Gruppenmitgliedschaften bearbeiten',
+  'Edit groups'                 => 'Gruppen bearbeiten',
+  'Edit rights'                 => 'Rechte bearbeiten',
   'Edit templates'              => 'Vorlage bearbeiten',
+  'Edit the membership of all users in all groups:' => 'Bearbeiten der Mitgliedschaft aller Benutzer in allen Gruppen:',
   'Edit the purchase_order'     => 'Bearbeiten des Lieferantenauftrags',
   'Edit the request_quotation'  => 'Bearbeiten der Preisanfrage',
   'Edit the sales_order'        => 'Bearbeiten des Auftrags',
@@ -517,7 +555,6 @@ aktualisieren wollen?',
   'February'                    => 'Februar',
   'Fee'                         => 'Gebühr',
   'File'                        => 'Datei',
-  'File locked!'                => 'Datei gesperrt!',
   'Files created by Lx-Office\'s &quot;Backup Dataset&quot; function are such files.' => 'Dateien, die von Lx-Office\' Funktion &quot;Datenbank sichern&quot; erstellt wurden, erf&uuml;llen diese Kriterien.',
   'Folgekonto'                  => 'Folgekonto',
   'Font size'                   => 'Schriftgr&ouml;&szlig;e',
@@ -531,8 +568,11 @@ aktualisieren wollen?',
   'Free report period'          => 'Freier Zeitraum',
   'Fristsetzung'                => 'Fristsetzung',
   'From'                        => 'Von',
+  'Full Access'                 => 'Vollzugriff',
+  'Full access to all functions' => 'Vollzugriff auf alle Funktionen',
   'GL Transaction'              => 'Dialogbuchung',
   'General Ledger'              => 'Finanzbuchhaltung',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Generic Tax Report'          => 'USTVA Bericht',
   'Given Name'                  => 'Vorname',
   'Greeting'                    => 'Anrede',
@@ -540,6 +580,7 @@ aktualisieren wollen?',
   'Group Invoices'              => 'Rechnungen zusammenfassen',
   'Group Items'                 => 'Waren gruppieren',
   'Group deleted!'              => 'Warengruppe gelöscht!',
+  'Group membership'            => 'Grouppenzugeh&ouml;rigkeit',
   'Group missing!'              => 'Warengruppe fehlt!',
   'Group saved!'                => 'Warengruppe gespeichert!',
   'Groups'                      => 'Warengruppen',
@@ -555,6 +596,8 @@ aktualisieren wollen?',
   'History Search Engine'       => 'Historien Suchmaschine',
   'Homepage'                    => 'Homepage',
   'Host'                        => 'Datenbankcomputer',
+  'However, you can create a new part which will then be selected.' => 'Sie k&ouml;nnen jedoch einen neuen Artikel anlegen, der dann automatisch ausgew&auml;hlt wird.',
+  'However, you can create a new project which will then be selected.' => 'Sie k&ouml;nnen jedoch ein neues Projekt anlegen, das dann automatisch ausgew&auml;hlt wird.',
   'I'                           => 'I',
   'ID'                          => 'Buchungsnummer',
   'ID-Nummer'                   => 'ID-Nummer (intern)',
@@ -562,8 +605,13 @@ aktualisieren wollen?',
   'III'                         => 'III',
   'IV'                          => 'IV',
   'If the automatic creation of invoices for fees and interest is switched on for a dunning level then the following accounts will be used for the invoice.' => 'Wenn das automatische Erstellen einer Rechnung &uuml;ber Mahngeb&uuml;hren und Zinsen f&uuml;r ein Mahnlevel aktiviert ist, so werden die folgenden Konten f&uuml;r die Rechnung benutzt.',
+  'If the database user listed above does not have the right to create a database then enter the name and password of the superuser below:' => 'Falls der oben genannte Datenbankbenutzer nicht die Berechtigung zum Anlegen neuer Datenbanken hat, so k&ouml;nnen Sie hier den Namen und das Passwort des Datenbankadministratoraccounts angeben:',
+  'If you chose to let Lx-Office do the migration then Lx-Office will also remove the old member file after creating a backup copy of it in the directory &quot;[% HTML.escape(backupdir) %]&quot;.' => 'Falls Sie sich entscheiden, Lx-Office die Migration durchf&uuml;hren zu lassen, so wird Lx-Office ein Backup der alten Dateien im Verzeichnis &quot;[% HTML.escape(backupdir) %]&quot; erstellen und die Dateien anschlie&szlig;end l&ouml;schen.',
   'If you see this message, you most likely just setup your LX-Office and haven\'t added any entry types. If this is the case, the option is accessible for administrators in the System menu.' => 'Wenn Sie diese Meldung sehen haben Sie wahrscheinlich ein frisches LX-Office Setup und noch keine Buchungsgruppen eingerichtet. Ein Administrator kann dies im Systemmen&uuml; erledigen.',
+  'If you want to change any of these parameters then press the &quot;Back&quot; button, edit the file &quot;config/authentication.pl&quot; and login into the admin module again.' => 'Wenn Sie einen der Parameter &auml;ndern wollen, so dr&uuml;cken Sie auf den &quot;Zur&uuml;ck&quot;-Button, bearbeiten Sie die Datei &quot;config/authentication.pl&quot;, und melden Sie sich erneut im Administrationsbereich an.',
   'If you want to delete such a dataset you have to edit the user(s) that are using the dataset in question and have them use another dataset.' => 'Wenn Sie eine solche Datenbank l&ouml;schen wollen, so m&uuml;ssen Sie zuerst die Benutzer bearbeiten, die die fragliche Datenbank benutzen, und sie so &auml;ndern, dass sie eine andere Datenbank benutzen.',
+  'If you want to set up the authentication database yourself then log in to the administration panel. Lx-Office will then create the database and tables for you.' => 'Wenn Sie die Authentifizierungsdatenbank selber einrichten wollen, so melden Sie sich an der Administrationsoberfl&auml;che an. Lx-Office wird dann die Datenbank und die Tabellen f&uuml;r Sie anlegen.',
+  'If you yourself want to upgrade the installation then please read the file &quot;doc/UPGRADE&quot; and follow the steps outlined in this file.' => 'Wenn Sie selber die Aktualisierung bzw. Einrichtung &uuml;bernehmen wollen, so lesen Sie bitte die Datei &quot;doc/UPGRADE&quot; und folgen Sie den dort beschriebenen Schritten.',
   'Image'                       => 'Grafik',
   'Import CSV'                  => 'CSV-Import',
   'In Lx-Office 2.4.0 the administrator has to enter a list of units in the administrative section.' => 'In Lx-Office 2.4.0 muss der Administrator in den Systemeinstellungen eine Liste von verwendbaren Einheiten angeben.',
@@ -645,8 +693,13 @@ aktualisieren wollen?',
   'Last Credit Note Number'     => 'Letzte Gutschriftnummer',
   'Last Customer Number'        => 'Letzte Kundennummer',
   'Last Invoice Number'         => 'Letzte Rechnungsnummer',
+  'Last Order Request Number'   => 'Letzte Bestellanfragenummer',
+  'Last Purchase Delivery Order Number' => 'Letzte Lieferscheinnummer (Einkauf)',
   'Last Purchase Order Number'  => 'Letzte Lieferantenautragsnummer',
   'Last RFQ Number'             => 'Letzte Anfragenummer',
+  'Last Release Material Slip Number' => 'Letzte Materialausgabebelegsnummer',
+  'Last Return Material Slip Number' => 'Letzte Materialr&uuml;ckgabescheinnummer',
+  'Last Sales Delivery Order Number' => 'Letzte Lieferscheinnummer (Verkauf)',
   'Last Sales Order Number'     => 'Letzte Auftragsnummer',
   'Last Sales Quotation Number' => 'Letzte Angebotsnummer',
   'Last Service Number'         => 'Letzte Dienstleistungsnr.',
@@ -688,12 +741,14 @@ aktualisieren wollen?',
   'Long Dates'                  => 'Lange Monatsnamen',
   'Long Description'            => 'Langtext',
   'Lx-Office 2.4.0 introduces two new concepts: tax zones and Buchungsgruppen.' => 'Lx-Office 2.4.0 f&uuml;hrt zwei neue Konzepte ein: Steuerzonen und Buchungsgruppen.',
+  'Lx-Office has been switched to group-based access restrictions.' => 'Lx-Office wurde auf eine gruppenbasierte Benutzerzugriffsverwaltung umgestellt.',
   'Lx-Office is about to update the database <b>[% HTML.escape(dbname) %]</b>. You should create a backup of the database before proceeding because the backup might not be reversible.' => 'Lx-Office wird gleich die Datenbank <b>[% HTML.escape(dbname) %]</b> aktualisieren. Sie sollten eine Sicherungskopie der Datenbank erstellen, bevor Sie fortfahren, da die Aktualisierung unter Umst&auml;nden nicht umkehrbar ist.',
   'Lx-Office website'           => 'Lx-Office-Webseite',
   'MAILED'                      => 'Gesendet',
   'MSG_BROWSER_DOES_NOT_SUPPORT_IFRAMES' => 'Ihr Browser kann leider keine eingebetteten Frames anzeigen. Bitte w&auml;hlen Sie ein anderes Men&uuml; in der Benutzerkonfiguration im Administrationsmen&uuml; aus.',
   'Main Preferences'            => 'Grundeinstellungen',
   'Make'                        => 'Hersteller',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mandantennummer'             => 'Mandantennummer',
   'Mar'                         => 'März',
   'March'                       => 'März',
@@ -705,6 +760,7 @@ aktualisieren wollen?',
   'Max. Dunning Level'          => 'höchste Mahnstufe',
   'May'                         => 'Mai',
   'May '                        => 'Mai',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Medium Number'               => 'Datentr&auml;gernummer',
   'Memo'                        => 'Memo',
   'Message'                     => 'Nachricht',
@@ -742,6 +798,7 @@ aktualisieren wollen?',
   'New contact'                 => 'Neuer Ansprechpartner',
   'New customer'                => 'Neuer Kunde',
   'New part'                    => 'Neue Ware',
+  'New project'                 => 'Neues Projekt',
   'New sales order'             => 'Neuer Auftrag',
   'New service'                 => 'Neue Dienstleistung',
   'New unit'                    => 'Neue Einheit',
@@ -755,6 +812,7 @@ aktualisieren wollen?',
   'No Database Drivers available!' => 'Kein Datenbanktreiber verfügbar!',
   'No Dataset selected!'        => 'Keine Datenbank ausgewählt!',
   'No Vendor was found matching the search parameters.' => 'Zu dem Suchbegriff wurde kein Händler gefunden',
+  'No action defined.'          => 'Keine Aktion definiert.',
   'No backup file has been uploaded.' => 'Es wurde keine Sicherungsdatei hochgeladen.',
   'No customer has been selected yet.' => 'Es wurde noch kein Kunde ausgewählt.',
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
@@ -764,11 +822,15 @@ aktualisieren wollen?',
   'No dunnings have been selected for printing.' => 'Es wurden keine Mahnungen zum Drucken ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No entries were found which had no unit assigned to them.' => 'Es wurden keine Eintr&auml;ge gefunden, denen keine Einheit zugeordnet war.',
+  'No group has been selected, or the group does not exist anymore.' => 'Es wurde keine Gruppe ausgew&auml;hlt, oder die Gruppe wurde in der Zwischenzeit gel&ouml;scht.',
+  'No groups have been added yet.' => 'Es wurden noch keine Gruppen angelegt.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
   'No licenses were found that match the search criteria.' => 'Es wurden keine Lizenzen gefunden, auf die die Suchkriterien zutreffen.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
   'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No unknown units where found.' => 'Es wurden keine unbekannten Einheiten gefunden.',
+  'No user has been selected.'  => 'Es wurde kein Benutzer ausgew&auml;hlt.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'No.'                         => 'Position',
   'Non-taxable Purchases'       => 'Nicht zu versteuernde Einkäufe',
@@ -808,10 +870,13 @@ aktualisieren wollen?',
   'Order Date missing!'         => 'Auftragsdatum fehlt!',
   'Order Number'                => 'Auftragsnummer',
   'Order Number missing!'       => 'Auftragsnummer fehlt!',
+  'Order Request Number'        => 'Bestellanfragenummer',
   'Order deleted!'              => 'Auftrag gelöscht!',
   'Ordered'                     => 'Vom Kunde bestellt',
   'Orientation'                 => 'Seitenformat',
   'Orphaned'                    => 'Nie benutzt',
+  'Others'                      => 'Andere',
+  'Otherwise all users will only have access to their own settings.' => 'Andernfalls haben alle Benutzer nur Zugriff auf ihre Benutzereinstellungen.',
   'Out of balance transaction!' => 'Buchung ist nicht ausgeglichen!',
   'Out of balance!'             => 'Summen stimmen nicht berein!',
   'Output Number Format'        => 'Zahlenformat (Ausgabe)',
@@ -841,7 +906,6 @@ aktualisieren wollen?',
   'Parts Inventory'             => 'Warenliste',
   'Parts must have an entry type.' => 'Waren m&uuml;ssen eine Buchungsgruppe haben.',
   'Password'                    => 'Passwort',
-  'Password changed!'           => 'Passwort geändert!',
   'Payables'                    => 'Verbindlichkeiten',
   'Payment'                     => 'Zahlungsausgang',
   'Payment Reminder'            => 'Zahlungserinnerung',
@@ -860,6 +924,7 @@ aktualisieren wollen?',
   'Pick List'                   => 'Sammelliste',
   'Please enter a license key.' => 'Bitte geben Sie einen Lizenzschlüssel an.',
   'Please enter a number of licenses.' => 'Bitte geben Sie die Anzahl Lizenzschlüssel an.',
+  '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 taxnumber in the administration menu userpreferences' => 'Bitte bei den Einstellungen des aktuellen Benutzers im Administrationsmodul
   angeben.',
@@ -869,6 +934,8 @@ aktualisieren wollen?',
   'Please insert your longdescription below' => 'Bitte den Langtext eingeben',
   'Please install the below listed modules or ask your system administrator to.' => 'Bitte installieren Sie die unten aufgef&uuml;hrten Module, oder bitten Sie Ihren Administrator darum.',
   'Please select a customer from the list below.' => 'Bitte einen Endkunden aus der Liste auswählen',
+  'Please select a part from the list below.' => 'Bitte w&auml;hlen Sie einen Artikel aus der Liste aus.',
+  'Please select a project from the list below.' => 'Bitte w&auml;hlen Sie ein Projekt aus der Liste aus.',
   'Please select a vendor from the list below.' => 'Bitte einen Händler aus der Liste auswählen',
   'Please select the chart of accounts this installation is using from the list below.' => 'Bitte w&auml;hlen Sie den Kontenrahmen aus, der bei dieser Installation verwendet wird.',
   'Please select the database you want to backup' => 'Bitte w&auml;hlen Sie die zu sichernde Datenbank gefunden',
@@ -926,6 +993,7 @@ aktualisieren wollen?',
   'Project deleted!'            => 'Projekt gelöscht!',
   'Project description'         => 'Projektbeschreibung',
   'Project not on file!'        => 'Dieses Projekt ist nicht in der Datenbank!',
+  'Project number'              => 'Projektnummer',
   'Project saved!'              => 'Projekt gespeichert!',
   'Projects'                    => 'Projekte',
   'Projecttransactions'         => 'Projektbuchungen',
@@ -955,6 +1023,7 @@ aktualisieren wollen?',
   'Ranges of numbers and default accounts' => 'Nummernkreise und Standardkonten',
   'Receipt'                     => 'Zahlungseingang',
   'Receipt posted!'             => 'Beleg gebucht!',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
   'Receipts'                    => 'Zahlungseingänge',
   'Receivables'                 => 'Forderungen',
   'Rechnungsnummer'             => 'Rechnungsnummer',
@@ -966,9 +1035,10 @@ aktualisieren wollen?',
   'Remove'                      => 'entfernen',
   'Remove Draft'                => 'Entwurf l&ouml;schen',
   'Remove draft when posting'   => 'Entwurf beim Buchen l&ouml;schen',
+  'Remove from group'           => 'Aus Gruppe entfernen',
   'Removed spoolfiles!'         => 'Druckdateien entfernt!',
   'Removing marked entries from queue ...' => 'Markierte Einträge werden von der Warteschlange entfernt ...',
-  'Repeat the password'         => 'Passwort wiederholen',
+  'Rename the group'            => 'Gruppe umbenennen',
   'Report Positions'            => 'Berichte',
   'Report and misc. Preferences' => 'Sonstige Einstellungen',
   'Report for'                  => 'Bericht für',
@@ -1024,11 +1094,13 @@ aktualisieren wollen?',
   'Select all'                  => 'Alle auswählen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Select from one of the items below' => 'Wählen Sie einen der untenstehenden Einträge',
   'Select from one of the names below' => 'Wählen Sie einen der untenstehenden Namen',
   'Select from one of the projects below' => 'Wählen Sie eines der untenstehenden Projekte',
   'Select postscript or PDF!'   => 'Postscript oder PDF auswählen!',
   'Select the chart of accounts in use' => 'Benutzten Kontenrahmen ausw&auml;hlen',
+  'Select the checkboxes that match users to the groups they should belong to.' => 'W&auml;hlen Sie diejenigen Checkboxen aus, die die Benutzer zu den gew&uuml;schten Gruppen zuordnen.',
   'Sell Price'                  => 'Verkaufspreis',
   'Send the backup via Email'   => 'Die Sicherungsdatei per Email verschicken',
   'Sep'                         => 'Sep',
@@ -1087,6 +1159,7 @@ aktualisieren wollen?',
   'Subject'                     => 'Betreff',
   'Subject:'                    => 'Betreff:',
   'Subtotal'                    => 'Zwischensumme',
+  'Superuser name'              => 'Datenbankadministrator',
   'System'                      => 'System',
   'TOP100'                      => 'Top 100',
   'Tax'                         => 'Steuer',
@@ -1125,15 +1198,26 @@ aktualisieren wollen?',
   'Template'                    => 'Druckvorlage',
   'Template Code'               => 'Vorlagenkürzel',
   'Template Code missing!'      => 'Vorlagenkürzel fehlt!',
+  'Template database'           => 'Datenbankvorlage',
   'Templates'                   => 'Vorlagen',
   'Terms missing in row '       => '+Tage fehlen in Zeile ',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The authentication configuration file &quot;config/authentication.pl&quot; does not exist. This Lx-Office installation has probably not been updated correctly yet. Please contact your administrator.' => 'Die Konfigurationsdatei f&uuml;r die Authentifizierung &quot;config/authentication.pl&quot; wurde nicht gefunden. Diese Lx-Office-Installation wurde vermutlich noch nicht vollst&auml;ndig aktualisiert oder eingerichtet. Bitte wenden Sie sich an Ihren Administrator.',
+  'The authentication database is not reachable at the moment. Either it hasn\'t been set up yet or the database server might be down. Please contact your administrator.' => 'Die Authentifizierungsdatenbank kann momentan nicht erreicht werden. Entweder wurde sie noch nicht eingerichtet, oder der Datenbankserver antwortet nicht. Bitte wenden Sie sich an Ihren Administrator.',
   'The backup you upload here has to be a file created with &quot;pg_dump -o -Ft&quot;.' => 'Die von Ihnen hochzuladende Sicherungsdatei muss mit dem Programm und den Parametern &quot;pg_dump -o -Ft&quot; erstellt worden sein.',
   'The base unit does not exist or it is about to be deleted in row %d.' => 'Die Basiseinheit in Zeile %d existiert nicht oder soll gel&ouml;scht werden.',
   'The base unit does not exist.' => 'Die Basiseinheit existiert nicht.',
   'The base unit relations must not contain loops (e.g. by saying that unit A\'s base unit is B, B\'s base unit is C and C\'s base unit is A) in row %d.' => 'Die Beziehungen der Einheiten d&uuml;rfen keine Schleifen beinhalten (z.B. wenn gesagt wird, dass Einheit As Basiseinheit B, Bs Basiseinheit C und Cs Basiseinheit A ist) in Zeile %d.',
   '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 config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'The database [% HTML.escape(db) %] has been successfully deleted.' => 'Die Datenbank [% HTML.escape(db) %] wurde erfolgreich gel&ouml;scht.',
+  'The database for user management and authentication does not exist. You can create let Lx-Office create it with the following parameters:' => 'Die Datenbank zur Verwaltung der Benutzerdaten und zur Authentifizierung existiert nicht. Sie k&ouml;nnen Lx-Office diese Datenbank mit den folgenden Parametern anlegen lassen:',
   'The database update/creation did not succeed. The file [% HTML.escape(file) %] contained the following error:' => 'Die Datenbankaktualisierung/erstellung schlug fehl. Die Datei [% HTML.escape(file) %] 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.',
@@ -1141,6 +1225,7 @@ aktualisieren wollen?',
   'The dataset backup has been sent via email to [% HTML.escape(to) %].' => 'Die Datenbanksicherung wurde per Email an [% HTML.escape(to) %] verschickt.',
   'The dataset has to exist before a restoration can be started.' => 'Die Datenbank muss vor der Wiederherstellung bereits angelegt worden sein.',
   'The dataset name is missing.' => 'Der Datenbankname fehlt.',
+  'The directory "%s" could not be created:\n%s' => 'Das Verzeichnis "%s" konnte nicht erstellt werden:\n%s',
   'The directory %s does not exist.' => 'Das Verzeichnis %s existiert nicht.',
   'The dunning process started' => 'Der Mahnprozess ist gestartet.',
   'The dunnings have been printed.' => 'Die Mahnung(en) wurden gedruckt.',
@@ -1152,15 +1237,21 @@ aktualisieren wollen?',
   '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 units are unknown.' => 'Die folgenden Einheiten sind unbekannt.',
   'The following units exist already:' => 'Die folgenden Einheiten existieren bereits:',
+  'The following users have been migrated into the authentication database:' => 'Die folgenden Benutzer wurden in die Authentifizierungsdatenbank migriert:',
   '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>Bitte achten Sie auf die Leerzeichen in der Formel<br>Es muss jeweils die Gesamte Zeile eingegeben werden',
+  'The group has been added.'   => 'Die Gruppe wurde erfasst.',
+  'The group has been deleted.' => 'Die Gruppe wurde gel&ouml;scht.',
+  'The group has been saved.'   => 'Die Gruppe wurde gespeichert.',
+  'The group memberships have been saved.' => 'Die Gruppenmitgliedschaften wurden gespeichert.',
+  'The group name is missing.'  => 'Der Gruppenname fehlt.',
   'The licensing module has been deactivated in lx-erp.conf.' => 'Das Lizenzverwaltungsmodul wurde in lx-erp.conf deaktiviert.',
   'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
   'The login is missing.'       => 'Das Login fehlt.',
   '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 passwords do not match.' => 'Die Passw&ouml;rter stimmen nicht &uuml;berein.',
+  'The old file containing the user information is still present (&quot;[% HTML.escape(memberfile) %]&quot;). Do you want to migrate these users into the database? If not then you will not be able to log in with any of the users present in the old file. ' => 'Die alte Datei mit den Benutzerdaten existiert in dieser Installation noch immer (&quot;[% HTML.escape(memberfile) %]&quot;). Wollen Sie diese Benutzer in die neue Authentifizierungsdatenbank migrieren lassen? Falls nicht, so werden Sie sich nicht mehr mit den Benutzerdaten aus der alten Mitgliedsdatei anmelden k&ouml;nnen.',
   'The pg_dump process could not be started.' => 'Der pg_dump-Prozess konnte nicht gestartet werden.',
   'The pg_restore process could not be started.' => 'Der pg_restore-Prozess konnte nicht gestartet werden.',
   'The preferred one is to install packages provided by your operating system distribution (e.g. Debian or RPM packages).' => 'Die bevorzugte Art, ein Perl-Modul zu installieren, ist durch Installation eines von Ihrem Betriebssystem zur Verf&uuml;gung gestellten Paketes (z.B. Debian-Pakete oder RPM).',
@@ -1168,20 +1259,28 @@ aktualisieren wollen?',
   'The restoration process has started. Here\'s the output of the &quot;pg_restore&quot; command:' => 'Der Wiederherstellungsprozess wurde gestartet. Hier ist die Ausgabe des &quot;pg_restore&quot;-Programmes:',
   'The restoration process is complete. Please review &quot;pg_restore&quot;\'s output to find out if the restoration was successful.' => 'Die Wiederherstellung ist abgeschlossen. Bitte sehen Sie sich die Ausgabe von &quot;pg_restore&quot; an, um festzustellen, ob die Wiederherstellung erfolgreich war.',
   'The second way is to use Perl\'s CPAN module and let it download and install the module for you.' => 'Die zweite Variante besteht darin, Perls CPAN-Modul zu benutzen und es das Modul f&uuml;r Sie installieren zu lassen.',
+  'The tables for user management and authentication do not exist. They will be created in the next step in the following database:' => 'Die Tabellen zum Speichern der Benutzerdaten und zur Benutzerauthentifizierung wurden nicht gefunden. Sie werden in der folgenden Datenbank angelegt:',
   'The tabulator character'     => 'Das Tabulator-Symbol',
   'The third way is to download the module from the above mentioned URL and to install the module manually following the installations instructions contained in the source archive.' => 'Die dritte Variante besteht darin, das Paket von der oben genannten URL herunterzuladen und es manuell zu installieren. Beachten Sie dabei die im Paket enthaltenen Installationsanweisungen.',
   'The unit has been saved.'    => 'Die Einheit wurde gespeichert.',
   'The unit in row %d has been deleted in the meantime.' => 'Die Einheit in Zeile %d ist in der Zwischentzeit gel&ouml;scht worden.',
   '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 has been added to this group.' => 'Der Benutzer wurde der Gruppe hinzugef&uuml;gt.',
+  'The user has been removed from this group.' => 'Der Benutzer wurde aus der Gruppe entfernt.',
+  'The user is a member in the following group(s):' => 'Der Benutzer ist Mitglied in den folgenden Gruppen:',
+  'The user migration process is complete.' => 'Der Prozess der Benutzerdatenmigration ist abgeschlossen.',
   'There are four tax zones.'   => 'Es gibt vier Steuerzonen.',
   'There are still entries in the database for which no unit has been assigned.' => 'Es gibt noch Eintr&auml;ge in der Datenbank, f&uuml;r die keine Einheit zugeordnet ist.',
   'There are usually three ways to install Perl modules.' => 'Es gibt normalerweise drei Arten, ein Perlmodul zu installieren.',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'There is nothing to do in this step.' => 'In diesem Schritt gibt es nichts mehr zu tun.',
   'Therefore there\'s no need to create the same article more than once if it is sold or bought in/from another tax zone.' => 'Deswegen muss man den gleichen Artikel nicht mehr mehrmals anlegen, wenn er in verschiedenen Steuerzonen gehandelt werden soll.',
   'These units can be based on other units so that Lx-Office can convert prices when the user switches from one unit to another.' => 'Diese Einheiten k&ouml;nnen auf anderen Einheiten basieren, sodass Lx-Office Preise umrechnen kann, wenn der Benutzer von einer Einheit zu einer anderen Wechselt.',
+  'This corresponds to Lx-Office\'s behavior prior to version 2.4.4.' => 'Dieses entspricht dem Verhalten von Lx-Office vor Version 2.4.4.',
   'This customer number is already in use.' => 'Diese Kundennummer wird bereits verwendet.',
+  'This group will be called &quot;Full Access&quot;.' => 'Diese Gruppe wird &quot;Vollzugriff&quot; genannt.',
   'This installation uses an unknown chart of accounts (&quot;[% HTML.escape(coa) %]&quot;). This database upgrade cannot create standard buchungsgruppen automatically.' => 'Diese Installation benutzt einen unbekannten Kontenrahmen (&quot;[% HTML.escape(coa) %]&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 upgrade script tries to map all existing parts in the database to the newly created Buchungsgruppen.' => 'Dieses Upgradescript versucht, bei allen bestehenden Artikeln neu erstellte Buchungsgruppen zuzuordnen.',
@@ -1209,6 +1308,7 @@ aktualisieren wollen?',
   'Transaction posted!'         => 'Buchung verbucht!',
   'Transaction reversal enforced for all dates' => 'Fehleintragungen müssen für jeden Zeitraum mit einer Kontraeintragung ausgebessert werden',
   'Transaction reversal enforced up to' => 'Fehleintragungen können bis zu dem angegebenen Zeitraum nur mit einer Kontraeintragung ausgebessert werden!',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Translation (%s)'            => '&Uuml;bersetzung (%s)',
   'Trial Balance'               => 'Saldenbilanz',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
@@ -1247,8 +1347,13 @@ aktualisieren wollen?',
   'Use Templates'               => 'benutze Vorlagen',
   'User'                        => 'Benutzer',
   'User Config'                 => 'Benutzereinstellungen',
+  'User data migration'         => 'Benutzerdatenmigration',
   'User deleted!'               => 'Benutzer gelöscht!',
+  'User migration complete'     => 'Benutzermigration abgeschlossen',
+  'User name'                   => 'Benutzername',
   'User saved!'                 => 'Benutzer gespeichert!',
+  'Users in<br>this group'      => 'Benutzer in<br>dieser Gruppe',
+  'Users not in this group'     => 'Benutzer nicht in dieser Gruppe',
   'Ust-IDNr'                    => 'USt-IdNr.',
   'Valid from'                  => 'Gültig ab',
   'Valid until'                 => 'gültig bis',
@@ -1296,10 +1401,13 @@ aktualisieren wollen?',
   'You cannot continue before all required modules are installed.' => 'Sie k&ouml;nnen nicht fortfahren, bevor alle ben&ouml;tigten Pakete installiert sind.',
   'You cannot continue until all unknown units have been mapped to known ones.' => 'Sie k&ouml;nnen nicht fortfahren, bis alle unbekannten Einheiten in neue Einheiten umgewandelt wurden.',
   'You did not enter a name!'   => 'Sie haben keinen Namen eingegeben!',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   'You have entered or selected the following shipping address for this customer:' => 'Sie haben die folgende Lieferadresse eingegeben oder ausgew&auml;hlt:',
   'You have to chose a dimension unit and a service unit which will then be assigned to those entries.' => 'Sie m&uuml;ssen eine Ma&szlig;- und eine Dienstleistungseinheit ausw&auml;hlen, die diesen Waren und Dienstleistungen, denen noch keine Einheit zugeordnet ist, zugeordnet wird.',
   'You have to chose which unit to save for each of them.' => 'Sie m&uuml;ssen f&uuml;r jeden Artikel die neue Einheit ausw&auml;hlen.',
+  'You have to create at least one group, grant it access to Lx-Office\'s functions and assign users to it.' => 'Sie m&uuml;ssen mindestens eine Benutzergruppe anlegen, ihr Zugriff auf die verschiedenen Funktionsbereiche von Lx-Office gew&auml;hren und Benutzer dieser Gruppe zuordnen.',
   'You have to create new Buchungsgruppen for all the combinations of inventory, income and expense accounts that have been used already.' => 'Sie m&uuml;ssen neue Buchungsgruppen f&uuml;r alle Kombinationen aus Inventar-, Erl&ouml;s- und Aufwandskonto, die bereits benutzt wurden.',
+  'You will now be forwarded to the administration panel.' => 'Sie werden nun zum Administrationsbereich weitergeleitet.',
   'You\'re not editing a file.' => 'Sie bearbeiten momentan keine Datei.',
   'You\'ve already chosen the following limitations:' => 'Sie haben bereits die folgenden Einschr&auml;nkungen vorgenommen:',
   'Zeitpunkt'                   => 'Zeitpunkt',
@@ -1324,6 +1432,10 @@ aktualisieren wollen?',
   'choice'                      => 'auswählen',
   'choice part'                 => 'Artikel auswählen',
   'close'                       => 'schließen',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'continue'                    => 'weiter',
   'customer'                    => 'Kunde',
   'customer_list'               => 'kundenliste',
index 9fe7ed9..64a3073 100644 (file)
@@ -13,6 +13,8 @@ $self->{texts} = {
   '&lt;%total_wo_skonto%&gt; -- Amount payable less discount' => '&lt;%total_wo_skonto%&gt; -- Noch zu bezahlender Betrag abz&uuml;glich Skonto',
   'A unit with this name does already exist.' => 'Eine Einheit mit diesem Namen existiert bereits.',
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Account'                     => 'Konto',
   'Account Category A'          => 'Aktiva/Mittelverwendung',
   'Account Category C'          => 'Kosten',
@@ -57,6 +59,8 @@ $self->{texts} = {
   'Add Printer'                 => 'Drucker hinzufügen',
   'Add and edit %s'             => '%s hinzuf&uuml;gen und bearbeiten',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Article Code'                => 'Artikelkürzel',
   'Article Code missing!'       => 'Artikelkürzel fehlt',
   'Asset'                       => 'Aktiva/Mittelverwendung',
@@ -65,6 +69,7 @@ $self->{texts} = {
   'Bcc'                         => 'Bcc',
   'Bestandskonto'               => 'Bestandskonto',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'Books are open'              => 'Die Bücher sind geöffnet.',
   'Buchungsgruppe'              => 'Buchungsgruppe',
   'Buchungsgruppen'             => 'Buchungsgruppen',
@@ -76,6 +81,7 @@ $self->{texts} = {
   'Cannot save account!'        => 'Konto kann nicht gespeichert werden!',
   'Cannot save preferences!'    => 'Benutzereinstellungen können nicht gespeichert werden!',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Chart of Accounts'           => 'Kontenübersicht',
   'Close Books up to'           => 'Die Bücher abschließen bis zum',
   'Confirmation'                => 'Auftragsbestätigung',
@@ -83,10 +89,23 @@ $self->{texts} = {
   'Continue'                    => 'Weiter',
   'Cost Center'                 => 'Kostenstelle',
   'Costs'                       => 'Kosten',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
   'Customernumberinit'          => 'Kunden-/Lieferantennummernkreis',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -127,6 +146,7 @@ $self->{texts} = {
   'File'                        => 'Datei',
   'Foreign Expenses'            => 'Aufwand Ausland',
   'Foreign Revenues'            => 'Erl&ouml;se Ausland',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Header'                      => 'Überschrift',
   'History'                     => 'Historie',
   'History Search'              => 'Historien Suche',
@@ -142,8 +162,11 @@ $self->{texts} = {
   'Long Dates'                  => 'Lange Monatsnamen',
   'Long Description'            => 'Langtext',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
@@ -161,12 +184,13 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'None'                        => 'Kein',
   'Number Format'               => 'Zahlenformat',
   'OpenDocument/OASIS'          => 'OpenDocument/OASIS',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF'                         => 'PDF',
   'PDF (OpenDocument/OASIS)'    => 'PDF (OpenDocument/OASIS)',
@@ -201,6 +225,8 @@ $self->{texts} = {
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
   'Ranges of numbers and default accounts' => 'Nummernkreise und Standardkonten',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'Revenue'                     => 'Erlöskonto',
   'Revenues EU with UStId'      => 'Erl&ouml;se EU m. UStId',
   'Revenues EU without UStId'   => 'Erl&ouml;se EU o. UStId',
@@ -217,6 +243,7 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Skonto'                      => 'Skonto',
   'Skonto Terms'                => 'Zahlungsziel Skonto',
   'Storno Invoice'              => 'Stornorechnung',
@@ -234,9 +261,16 @@ $self->{texts} = {
   'Template Code'               => 'Vorlagenkürzel',
   'Template Code missing!'      => 'Vorlagenkürzel fehlt!',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'The base unit does not exist or it is about to be deleted in row %d.' => 'Die Basiseinheit in Zeile %d existiert nicht oder soll gel&ouml;scht werden.',
   'The base unit does not exist.' => 'Die Basiseinheit existiert nicht.',
   'The base unit relations must not contain loops (e.g. by saying that unit A\'s base unit is B, B\'s base unit is C and C\'s base unit is A) in row %d.' => 'Die Beziehungen der Einheiten d&uuml;rfen keine Schleifen beinhalten (z.B. wenn gesagt wird, dass Einheit As Basiseinheit B, Bs Basiseinheit C und Cs Basiseinheit A ist) in Zeile %d.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'The factor is missing in row %d.' => 'Der Faktor fehlt in Zeile %d.',
   'The factor is missing.'      => 'Der Faktor fehlt.',
   'The name in row %d has already been used before.' => 'Der Name in Zeile %d wurde vorher bereits benutzt.',
@@ -247,9 +281,11 @@ $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.',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
   'Transaction reversal enforced for all dates' => 'Fehleintragungen müssen für jeden Zeitraum mit einer Kontraeintragung ausgebessert werden',
   'Transaction reversal enforced up to' => 'Fehleintragungen können bis zu dem angegebenen Zeitraum nur mit einer Kontraeintragung ausgebessert werden!',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Translation (%s)'            => '&Uuml;bersetzung (%s)',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Type of Business'            => 'Kunden-/Lieferantentyp',
@@ -262,8 +298,13 @@ $self->{texts} = {
   'Vendor details'              => 'Lieferantendetails',
   'Yes'                         => 'Ja',
   'You can use the following strings in the long description and all translations. They will be replaced by their actual values by Lx-Office before they\'re output.' => 'Sie k&ouml;nnen im Langtext und allen Übersetzungen die folgenden Variablen benutzen, die vor der Ausgabe von Lx-Office automatisch ersetzt werden:',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'dimension units'             => 'Ma&szlig;einheiten',
   'down'                        => 'runter',
@@ -365,11 +406,18 @@ $self->{subs} = {
   'list_printer'                => 'list_printer',
   'list_tax'                    => 'list_tax',
   'mark_as_paid_common'         => 'mark_as_paid_common',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
   'payment_header'              => 'payment_header',
   'printer_header'              => 'printer_header',
+  'project_created'             => 'project_created',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'save'                        => 'save',
   'save_account'                => 'save_account',
   'save_buchungsgruppe'         => 'save_buchungsgruppe',
@@ -386,8 +434,6 @@ $self->{subs} = {
   'save_unit'                   => 'save_unit',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_part'                 => 'select_part',
   'select_part_internal'        => 'select_part_internal',
@@ -407,6 +453,8 @@ $self->{subs} = {
   'weiter'                      => 'continue',
   'löschen'                     => 'delete',
   'kontodaten_bearbeiten'       => 'edit_account',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'speichern'                   => 'save',
 };
 
index 31b0c32..6c97d46 100644 (file)
@@ -1,19 +1,38 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.',
   'BWA'                         => 'BWA',
   'Balance Sheet'               => 'Bilanz',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Check'                       => 'Scheck',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -26,12 +45,16 @@ $self->{texts} = {
   'Enter longdescription'       => 'Langtext eingeben',
   'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
   'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'Income Statement'            => 'GuV',
   'Invoice'                     => 'Rechnung',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
@@ -45,9 +68,10 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'POSTED'                      => 'Gebucht',
   'POSTED AS NEW'               => 'Als neu gebucht',
@@ -65,6 +89,8 @@ $self->{texts} = {
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
   'Receipt'                     => 'Zahlungseingang',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -77,13 +103,23 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Statement'                   => 'Sammelrechnung',
   'Storno Invoice'              => 'Stornorechnung',
   'Storno Packing List'         => 'Stornolieferschein',
   'Subject'                     => 'Betreff',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'USTVA'                       => 'USTVA',
   'USTVA 2004'                  => 'USTVA 2004',
@@ -95,9 +131,14 @@ $self->{texts} = {
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
   'Vendor details'              => 'Lieferantendetails',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   'You\'re not editing a file.' => 'Sie bearbeiten momentan keine Datei.',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'invoice'                     => 'Rechnung',
   'no'                          => 'nein',
@@ -134,15 +175,20 @@ $self->{subs} = {
   'employee_selection_internal' => 'employee_selection_internal',
   'format_dates'                => 'format_dates',
   'mark_as_paid_common'         => 'mark_as_paid_common',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
+  'project_created'             => 'project_created',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'save'                        => 'save',
   'save_template'               => 'save_template',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_part'                 => 'select_part',
   'select_part_internal'        => 'select_part_internal',
@@ -153,6 +199,8 @@ $self->{subs} = {
   'weiter'                      => 'continue',
   'anzeigen'                    => 'display',
   'bearbeiten'                  => 'edit',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'speichern'                   => 'save',
 };
 
index 073f941..837afe2 100644 (file)
@@ -1,10 +1,14 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
   'AP Transaction (abbreviation)' => 'K',
   'AP Transactions'             => 'Kreditorenbuchungen',
+  'AR'                          => 'Verkauf',
   'Account'                     => 'Konto',
   'Add Accounts Payables Transaction' => 'Kreditorenbuchung erfassen',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Amount'                      => 'Betrag',
   'Amount Due'                  => 'Betrag fällig',
   'Apr'                         => 'Apr',
@@ -15,6 +19,7 @@ $self->{texts} = {
   'August'                      => 'August',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'Bis'                         => 'bis',
   'CANCELED'                    => 'Storniert',
   'CSV export -- options'       => 'CSV-Export -- Optionen',
@@ -25,6 +30,7 @@ $self->{texts} = {
   'Cannot post transaction for a closed period!' => 'Für einen bereits abgeschlossenen Zeitraum kann keine Buchung angelegt werden!',
   'Cannot post transaction!'    => 'Rechnung kann nicht gebucht werden!',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Closed'                      => 'Geschlossen',
   'Confirm!'                    => 'Bestätigen Sie!',
   'Confirmation'                => 'Auftragsbestätigung',
@@ -34,6 +40,18 @@ $self->{texts} = {
   'Could not spawn the printer command.' => 'Die Druckanwendung konnte nicht gestartet werden.',
   'Could not write the html2ps config file.' => 'Die tempor&auml;re html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
   'Could not write the temporary HTML file.' => 'Eine tempor&auml;re HTML-Datei konnte nicht geschrieben werden.',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Limit'                => 'Kreditlimit',
   'Credit Note'                 => 'Gutschrift',
   'Currency'                    => 'Währung',
@@ -41,6 +59,7 @@ $self->{texts} = {
   'Customer details'            => 'Kundendetails',
   'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
   'Customer not on file!'       => 'Kunde ist nicht in der Datenbank!',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -71,6 +90,7 @@ $self->{texts} = {
   'February'                    => 'Februar',
   'File'                        => 'Datei',
   'From'                        => 'Von',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'ID'                          => 'Buchungsnummer',
   'Include in Report'           => 'In Bericht aufnehmen',
@@ -87,12 +107,15 @@ $self->{texts} = {
   'June'                        => 'Juni',
   'Korrektur'                   => 'Korrektur',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mar'                         => 'März',
   'March'                       => 'März',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
   'May'                         => 'Mai',
   'May '                        => 'Mai',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Memo'                        => 'Memo',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
@@ -108,8 +131,8 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'Notes'                       => 'Bemerkungen',
   'Nov'                         => 'Nov',
@@ -120,6 +143,7 @@ $self->{texts} = {
   'Open'                        => 'Offen',
   'Order'                       => 'Auftrag',
   'Order Number'                => 'Auftragsnummer',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF export -- options'       => 'PDF-Export -- Optionen',
   'POSTED'                      => 'Gebucht',
@@ -144,8 +168,10 @@ $self->{texts} = {
   'Purchase Order'              => 'Lieferantenauftrag',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
   'Remaining'                   => 'Rest',
   'Remove draft when posting'   => 'Entwurf beim Buchen l&ouml;schen',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -159,6 +185,7 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Select from one of the names below' => 'Wählen Sie einen der untenstehenden Namen',
   'Select from one of the projects below' => 'Wählen Sie eines der untenstehenden Projekte',
   'Sep'                         => 'Sep',
@@ -174,8 +201,16 @@ $self->{texts} = {
   'Tax Included'                => 'Steuer im Preis inbegriffen',
   'Taxkey'                      => 'Steuerschlüssel',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
   'Total'                       => 'Summe',
   'Transaction %d cancelled.'   => 'Buchung %d erfolgreich storniert.',
@@ -183,6 +218,7 @@ $self->{texts} = {
   'Transaction description'     => 'Vorgangsbezeichnung',
   'Transaction has already been cancelled!' => 'Diese Buchung wurde bereits storniert.',
   'Transaction posted!'         => 'Buchung verbucht!',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Type'                        => 'Typ',
   'Unit'                        => 'Einheit',
@@ -197,10 +233,15 @@ $self->{texts} = {
   'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
   'Vendor not on file!'         => 'Lieferant ist nicht in der Datenbank!',
   'Yes'                         => 'Ja',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   'Zero amount posting!'        => 'Buchung ohne Wert',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
   'button'                      => '?',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'history'                     => 'Historie',
   'invoice'                     => 'Rechnung',
@@ -227,10 +268,7 @@ $self->{subs} = {
   'NTI'                         => 'NTI',
   'Q'                           => 'Q',
   'add'                         => 'add',
-  'add_transaction'             => 'add_transaction',
-  'ap_transaction'              => 'ap_transaction',
   'ap_transactions'             => 'ap_transactions',
-  'ar_transaction'              => 'ar_transaction',
   'build_std_url'               => 'build_std_url',
   'calculate_qty'               => 'calculate_qty',
   'call_sub'                    => 'call_sub',
@@ -255,18 +293,23 @@ $self->{subs} = {
   'form_footer'                 => 'form_footer',
   'form_header'                 => 'form_header',
   'format_dates'                => 'format_dates',
-  'gl_transaction'              => 'gl_transaction',
   'load_draft'                  => 'load_draft',
   'load_draft_maybe'            => 'load_draft_maybe',
   'mark_as_paid'                => 'mark_as_paid',
   'mark_as_paid_common'         => 'mark_as_paid_common',
   'name_selected'               => 'name_selected',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
   'post'                        => 'post',
   'post_as_new'                 => 'post_as_new',
   'post_payment'                => 'post_payment',
+  'project_created'             => 'project_created',
   'project_selected'            => 'project_selected',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
   'remove_draft'                => 'remove_draft',
   'report_generator_back'       => 'report_generator_back',
@@ -274,13 +317,11 @@ $self->{subs} = {
   'report_generator_do'         => 'report_generator_do',
   'report_generator_export_as_csv' => 'report_generator_export_as_csv',
   'report_generator_export_as_pdf' => 'report_generator_export_as_pdf',
-  'sales_invoice'               => 'sales_invoice',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'save_draft'                  => 'save_draft',
   'search'                      => 'search',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_name'                 => 'select_name',
   'select_part'                 => 'select_part',
@@ -292,7 +333,6 @@ $self->{subs} = {
   'storno'                      => 'storno',
   'update'                      => 'update',
   'use_as_template'             => 'use_as_template',
-  'vendor_invoice'              => 'vendor_invoice',
   'vendor_selection'            => 'vendor_selection',
   'yes'                         => 'yes',
   'kreditorenbuchung'           => 'ap_transaction',
@@ -301,6 +341,8 @@ $self->{subs} = {
   'löschen'                     => 'delete',
   'entwürfe_löschen'            => 'delete_drafts',
   'kreditorenbuchung_bearbeiten' => 'edit_accounts_payables_transaction',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'buchen'                      => 'post',
   'zahlung_buchen'              => 'post_payment',
   'entwurf_speichern'           => 'save_draft',
index c042fe4..9e42f4f 100644 (file)
@@ -1,11 +1,15 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'AR Transaction (abbreviation)' => 'D',
   'AR Transactions'             => 'Debitorenbuchungen',
   'Account'                     => 'Konto',
   'Accounting Menu'             => 'Kontoverwaltung',
   'Add Accounts Receivables Transaction' => 'Debitorenbuchung erfassen',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Amount'                      => 'Betrag',
   'Amount Due'                  => 'Betrag fällig',
   'Apr'                         => 'Apr',
@@ -16,6 +20,7 @@ $self->{texts} = {
   'August'                      => 'August',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'Bis'                         => 'bis',
   'CANCELED'                    => 'Storniert',
   'CSV export -- options'       => 'CSV-Export -- Optionen',
@@ -26,6 +31,7 @@ $self->{texts} = {
   'Cannot post transaction for a closed period!' => 'Für einen bereits abgeschlossenen Zeitraum kann keine Buchung angelegt werden!',
   'Cannot post transaction!'    => 'Rechnung kann nicht gebucht werden!',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Closed'                      => 'Geschlossen',
   'Confirm!'                    => 'Bestätigen Sie!',
   'Confirmation'                => 'Auftragsbestätigung',
@@ -35,6 +41,18 @@ $self->{texts} = {
   'Could not spawn the printer command.' => 'Die Druckanwendung konnte nicht gestartet werden.',
   'Could not write the html2ps config file.' => 'Die tempor&auml;re html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
   'Could not write the temporary HTML file.' => 'Eine tempor&auml;re HTML-Datei konnte nicht geschrieben werden.',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Limit'                => 'Kreditlimit',
   'Credit Note'                 => 'Gutschrift',
   'Credit note (one letter abbreviation)' => 'G',
@@ -45,6 +63,7 @@ $self->{texts} = {
   'Customer missing!'           => 'Kundenname fehlt!',
   'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
   'Customer not on file!'       => 'Kunde ist nicht in der Datenbank!',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -76,6 +95,7 @@ $self->{texts} = {
   'February'                    => 'Februar',
   'File'                        => 'Datei',
   'From'                        => 'Von',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'ID'                          => 'Buchungsnummer',
   'Include in Report'           => 'In Bericht aufnehmen',
@@ -94,12 +114,15 @@ $self->{texts} = {
   'June'                        => 'Juni',
   'Korrektur'                   => 'Korrektur',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mar'                         => 'März',
   'March'                       => 'März',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
   'May'                         => 'Mai',
   'May '                        => 'Mai',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Memo'                        => 'Memo',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
@@ -115,8 +138,8 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'Notes'                       => 'Bemerkungen',
   'Nov'                         => 'Nov',
@@ -127,6 +150,7 @@ $self->{texts} = {
   'Open'                        => 'Offen',
   'Order'                       => 'Auftrag',
   'Order Number'                => 'Auftragsnummer',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF export -- options'       => 'PDF-Export -- Optionen',
   'POSTED'                      => 'Gebucht',
@@ -150,8 +174,10 @@ $self->{texts} = {
   'Purchase Order'              => 'Lieferantenauftrag',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
   'Remaining'                   => 'Rest',
   'Remove draft when posting'   => 'Entwurf beim Buchen l&ouml;schen',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -165,6 +191,7 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Select from one of the names below' => 'Wählen Sie einen der untenstehenden Namen',
   'Select from one of the projects below' => 'Wählen Sie eines der untenstehenden Projekte',
   'Sep'                         => 'Sep',
@@ -183,8 +210,16 @@ $self->{texts} = {
   'Tax Included'                => 'Steuer im Preis inbegriffen',
   'Taxkey'                      => 'Steuerschlüssel',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
   'Total'                       => 'Summe',
   'Transaction %d cancelled.'   => 'Buchung %d erfolgreich storniert.',
@@ -192,6 +227,7 @@ $self->{texts} = {
   'Transaction description'     => 'Vorgangsbezeichnung',
   'Transaction has already been cancelled!' => 'Diese Buchung wurde bereits storniert.',
   'Transaction posted!'         => 'Buchung verbucht!',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Type'                        => 'Typ',
   'Unit'                        => 'Einheit',
@@ -204,10 +240,15 @@ $self->{texts} = {
   'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
   'Vendor not on file!'         => 'Lieferant ist nicht in der Datenbank!',
   'Yes'                         => 'Ja',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   'Zero amount posting!'        => 'Buchung ohne Wert',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
   'button'                      => '?',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'history'                     => 'Historie',
   'invoice'                     => 'Rechnung',
@@ -236,9 +277,6 @@ $self->{subs} = {
   '_post'                       => '_post',
   'acc_menu'                    => 'acc_menu',
   'add'                         => 'add',
-  'add_transaction'             => 'add_transaction',
-  'ap_transaction'              => 'ap_transaction',
-  'ar_transaction'              => 'ar_transaction',
   'ar_transactions'             => 'ar_transactions',
   'build_std_url'               => 'build_std_url',
   'calculate_qty'               => 'calculate_qty',
@@ -265,18 +303,23 @@ $self->{subs} = {
   'form_footer'                 => 'form_footer',
   'form_header'                 => 'form_header',
   'format_dates'                => 'format_dates',
-  'gl_transaction'              => 'gl_transaction',
   'load_draft'                  => 'load_draft',
   'load_draft_maybe'            => 'load_draft_maybe',
   'mark_as_paid'                => 'mark_as_paid',
   'mark_as_paid_common'         => 'mark_as_paid_common',
   'name_selected'               => 'name_selected',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
   'post'                        => 'post',
   'post_as_new'                 => 'post_as_new',
   'post_payment'                => 'post_payment',
+  'project_created'             => 'project_created',
   'project_selected'            => 'project_selected',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
   'remove_draft'                => 'remove_draft',
   'report_generator_back'       => 'report_generator_back',
@@ -284,14 +327,12 @@ $self->{subs} = {
   'report_generator_do'         => 'report_generator_do',
   'report_generator_export_as_csv' => 'report_generator_export_as_csv',
   'report_generator_export_as_pdf' => 'report_generator_export_as_pdf',
-  'sales_invoice'               => 'sales_invoice',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'save_draft'                  => 'save_draft',
   'search'                      => 'search',
   'section_menu'                => 'section_menu',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_name'                 => 'select_name',
   'select_part'                 => 'select_part',
@@ -303,13 +344,14 @@ $self->{subs} = {
   'storno'                      => 'storno',
   'update'                      => 'update',
   'use_as_template'             => 'use_as_template',
-  'vendor_invoice'              => 'vendor_invoice',
   'vendor_selection'            => 'vendor_selection',
   'yes'                         => 'yes',
   'debitorenbuchung'            => 'ar_transaction',
   'weiter'                      => 'continue',
   'löschen'                     => 'delete',
   'entwürfe_löschen'            => 'delete_drafts',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'buchen'                      => 'post',
   'zahlung_buchen'              => 'post_payment',
   'rechnung'                    => 'sales_invoice',
index 724c469..529c84b 100644 (file)
@@ -1,19 +1,38 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
   'Continue'                    => 'Weiter',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
   'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
   'Customer not on file!'       => 'Kunde ist nicht in der Datenbank!',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -25,11 +44,15 @@ $self->{texts} = {
   'Enter longdescription'       => 'Langtext eingeben',
   'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
   'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'Invoice'                     => 'Rechnung',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
@@ -43,10 +66,11 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'Number'                      => 'Nummer',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'POSTED'                      => 'Gebucht',
   'POSTED AS NEW'               => 'Als neu gebucht',
@@ -63,6 +87,8 @@ $self->{texts} = {
   'Purchase Order'              => 'Lieferantenauftrag',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -74,14 +100,24 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Select from one of the names below' => 'Wählen Sie einen der untenstehenden Namen',
   'Select from one of the projects below' => 'Wählen Sie eines der untenstehenden Projekte',
   'Storno Invoice'              => 'Stornorechnung',
   'Storno Packing List'         => 'Stornolieferschein',
   'Subject'                     => 'Betreff',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
@@ -90,8 +126,13 @@ $self->{texts} = {
   'Vendor details'              => 'Lieferantendetails',
   'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
   'Vendor not on file!'         => 'Lieferant ist nicht in der Datenbank!',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'invoice'                     => 'Rechnung',
   'no'                          => 'nein',
@@ -111,9 +152,6 @@ $self->{subs} = {
   'H'                           => 'H',
   'NTI'                         => 'NTI',
   'Q'                           => 'Q',
-  'add_transaction'             => 'add_transaction',
-  'ap_transaction'              => 'ap_transaction',
-  'ar_transaction'              => 'ar_transaction',
   'build_std_url'               => 'build_std_url',
   'calculate_qty'               => 'calculate_qty',
   'call_sub'                    => 'call_sub',
@@ -128,18 +166,21 @@ $self->{subs} = {
   'delivery_customer_selection' => 'delivery_customer_selection',
   'employee_selection_internal' => 'employee_selection_internal',
   'format_dates'                => 'format_dates',
-  'gl_transaction'              => 'gl_transaction',
   'mark_as_paid_common'         => 'mark_as_paid_common',
   'name_selected'               => 'name_selected',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
+  'project_created'             => 'project_created',
   'project_selected'            => 'project_selected',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
-  'sales_invoice'               => 'sales_invoice',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_name'                 => 'select_name',
   'select_part'                 => 'select_part',
@@ -148,9 +189,10 @@ $self->{subs} = {
   'set_longdescription'         => 'set_longdescription',
   'show_history'                => 'show_history',
   'show_vc_details'             => 'show_vc_details',
-  'vendor_invoice'              => 'vendor_invoice',
   'vendor_selection'            => 'vendor_selection',
   'weiter'                      => 'continue',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
 };
 
 1;
index a5707c6..912832a 100644 (file)
@@ -1,24 +1,43 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Account'                     => 'Konto',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Are you sure you want to remove the marked entries from the queue?' => 'Sind Sie sicher, dass die markierten Einträge von der Warteschlange gelöscht werden sollen?',
   'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'Bis'                         => 'bis',
   'CANCELED'                    => 'Storniert',
   'Cannot remove files!'        => 'Dateien können nicht gelöscht werden!',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Checks'                      => 'Schecks',
   'Confirm!'                    => 'Bestätigen Sie!',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
   'Continue'                    => 'Weiter',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer'                    => 'Kunde',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -31,13 +50,17 @@ $self->{texts} = {
   'Falsches Datumsformat!'      => 'Falsches Datumsformat!',
   'File'                        => 'Datei',
   'From'                        => 'Von',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'Invoice'                     => 'Rechnung',
   'Invoice Number'              => 'Rechnungsnummer',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
   'Marked entries printed!'     => 'Markierte Einträge wurden gedruckt!',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
@@ -51,11 +74,12 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'Order'                       => 'Auftrag',
   'Order Number'                => 'Auftragsnummer',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'POSTED'                      => 'Gebucht',
   'POSTED AS NEW'               => 'Als neu gebucht',
@@ -78,11 +102,13 @@ $self->{texts} = {
   'Quotations'                  => 'Angebote',
   'RFQ'                         => 'Anfrage',
   'RFQs'                        => 'Preisanfragen',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
   'Receipts'                    => 'Zahlungseingänge',
   'Reference'                   => 'Referenz',
   'Remove'                      => 'entfernen',
   'Removed spoolfiles!'         => 'Druckdateien entfernt!',
   'Removing marked entries from queue ...' => 'Markierte Einträge werden von der Warteschlange entfernt ...',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -97,14 +123,24 @@ $self->{texts} = {
   'Select all'                  => 'Alle auswählen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Spoolfile'                   => 'Druckdatei',
   'Storno Invoice'              => 'Stornorechnung',
   'Storno Packing List'         => 'Stornolieferschein',
   'Subject'                     => 'Betreff',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To'                          => 'An',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
@@ -113,9 +149,14 @@ $self->{texts} = {
   'Vendor'                      => 'Lieferant',
   'Vendor details'              => 'Lieferantendetails',
   'Yes'                         => 'Ja',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
   'button'                      => '?',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'done'                        => 'erledigt',
   'invoice'                     => 'Rechnung',
@@ -137,6 +178,7 @@ $self->{subs} = {
   'H'                           => 'H',
   'NTI'                         => 'NTI',
   'Q'                           => 'Q',
+  'assert_bp_access'            => 'assert_bp_access',
   'build_std_url'               => 'build_std_url',
   'calculate_qty'               => 'calculate_qty',
   'call_sub'                    => 'call_sub',
@@ -151,17 +193,22 @@ $self->{subs} = {
   'format_dates'                => 'format_dates',
   'list_spool'                  => 'list_spool',
   'mark_as_paid_common'         => 'mark_as_paid_common',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
   'print'                       => 'print',
+  'project_created'             => 'project_created',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
   'remove'                      => 'remove',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'search'                      => 'search',
   'select_all'                  => 'select_all',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_part'                 => 'select_part',
   'select_part_internal'        => 'select_part_internal',
@@ -171,6 +218,8 @@ $self->{subs} = {
   'vendor_selection'            => 'vendor_selection',
   'yes'                         => 'yes',
   'weiter'                      => 'continue',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'drucken'                     => 'print',
   'entfernen'                   => 'remove',
   'alle_auswählen'              => 'select_all',
index 4c38ff6..678fba5 100644 (file)
@@ -1,6 +1,10 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Account'                     => 'Konto',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Apr'                         => 'Apr',
   'April'                       => 'April',
   'Aug'                         => 'Aug',
@@ -8,17 +12,32 @@ $self->{texts} = {
   'Balance'                     => 'Bilanz',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'CSV export -- options'       => 'CSV-Export -- Optionen',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Chart of Accounts'           => 'Kontenübersicht',
   'Confirmation'                => 'Auftragsbestätigung',
   'Could not spawn html2ps or GhostScript.' => 'html2ps oder GhostScript konnte nicht gestartet werden.',
   'Could not spawn the printer command.' => 'Die Druckanwendung konnte nicht gestartet werden.',
   'Could not write the html2ps config file.' => 'Die tempor&auml;re html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
   'Could not write the temporary HTML file.' => 'Eine tempor&auml;re HTML-Datei konnte nicht geschrieben werden.',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit'                      => 'Haben',
   'Credit Note'                 => 'Gutschrift',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -36,6 +55,7 @@ $self->{texts} = {
   'February'                    => 'Februar',
   'File'                        => 'Datei',
   'From'                        => 'Von',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Include in Report'           => 'In Bericht aufnehmen',
   'Invoice'                     => 'Rechnung',
   'Jan'                         => 'Jan',
@@ -46,19 +66,24 @@ $self->{texts} = {
   'June'                        => 'Juni',
   'List Transactions'           => 'Buchungsliste',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mar'                         => 'März',
   'March'                       => 'März',
+  'Master Data'                 => 'Stammdaten',
   'May'                         => 'Mai',
   'May '                        => 'Mai',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
   'Missing parameter #1 in call to sub #2.' => 'Fehlernder Parameter \'#1\' in Funktionsaufruf \'#2\'.',
   'More than one control file with the tag \'%s\' exist.' => 'Es gibt mehr als eine Kontrolldatei mit dem Tag \'%s\'.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'Nov'                         => 'Nov',
   'November'                    => 'November',
   'Oct'                         => 'Okt',
   'October'                     => 'Oktober',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF export -- options'       => 'PDF-Export -- Optionen',
   'POSTED'                      => 'Gebucht',
@@ -71,7 +96,9 @@ $self->{texts} = {
   'Purchase Order'              => 'Lieferantenauftrag',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
   'Reference'                   => 'Referenz',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -82,13 +109,26 @@ $self->{texts} = {
   'Subject'                     => 'Betreff',
   'Subtotal'                    => 'Zwischensumme',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
   'To'                          => 'An',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
   'chart_of_accounts'           => 'kontenuebersicht',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'invoice'                     => 'Rechnung',
   'list_of_transactions'        => 'buchungsliste',
   'packing_list'                => 'Versandliste',
index b55c0ba..6ee607e 100644 (file)
@@ -1,16 +1,35 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -21,11 +40,15 @@ $self->{texts} = {
   'Enter longdescription'       => 'Langtext eingeben',
   'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
   'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'Invoice'                     => 'Rechnung',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
@@ -39,9 +62,10 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'POSTED'                      => 'Gebucht',
   'POSTED AS NEW'               => 'Als neu gebucht',
@@ -57,6 +81,8 @@ $self->{texts} = {
   'Purchase Order'              => 'Lieferantenauftrag',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -68,20 +94,35 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Storno Invoice'              => 'Stornorechnung',
   'Storno Packing List'         => 'Stornolieferschein',
   'Subject'                     => 'Betreff',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
   'Vendor details'              => 'Lieferantendetails',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'invoice'                     => 'Rechnung',
   'no'                          => 'nein',
@@ -113,13 +154,18 @@ $self->{subs} = {
   'employee_selection_internal' => 'employee_selection_internal',
   'format_dates'                => 'format_dates',
   'mark_as_paid_common'         => 'mark_as_paid_common',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
+  'project_created'             => 'project_created',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_part'                 => 'select_part',
   'select_part_internal'        => 'select_part_internal',
@@ -128,6 +174,8 @@ $self->{subs} = {
   'show_vc_details'             => 'show_vc_details',
   'vendor_selection'            => 'vendor_selection',
   'weiter'                      => 'continue',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
 };
 
 1;
index 8cdb6cb..c712fd2 100644 (file)
@@ -4,20 +4,36 @@ $self->{texts} = {
   'AR'                          => 'Verkauf',
   'Account'                     => 'Konto',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
   'All'                         => 'Alle',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Amount'                      => 'Betrag',
   'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'Cannot post Payment!'        => 'Zahlung kann nicht gebucht werden!',
   'Cannot post Receipt!'        => 'Beleg kann nicht gebucht werden!',
   'Cannot post payment!'        => 'Zahlung kann nicht gebucht werden!',
   'Cannot process payment for a closed period!' => 'Es kann keine Zahlung in einem abgeschlossenen Zeitraum verbucht werden!',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
   'Continue'                    => 'Weiter',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Currency'                    => 'Währung',
   'Customer'                    => 'Kunde',
@@ -25,6 +41,7 @@ $self->{texts} = {
   'Customer details'            => 'Kundendetails',
   'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
   'Customer not on file!'       => 'Kunde ist nicht in der Datenbank!',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -43,12 +60,16 @@ $self->{texts} = {
   'Exchangerate missing!'       => 'Es fehlt der Wechselkurs!',
   'Falsches Datumsformat!'      => 'Falsches Datumsformat!',
   'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'Invoice'                     => 'Rechnung',
   'Invoices'                    => 'Rechnungen',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Memo'                        => 'Memo',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
@@ -63,10 +84,11 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'Number'                      => 'Nummer',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF'                         => 'PDF',
   'POSTED'                      => 'Gebucht',
@@ -94,6 +116,8 @@ $self->{texts} = {
   'RFQ'                         => 'Anfrage',
   'Receipt'                     => 'Zahlungseingang',
   'Receipt posted!'             => 'Beleg gebucht!',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -107,6 +131,7 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Select from one of the names below' => 'Wählen Sie einen der untenstehenden Namen',
   'Select from one of the projects below' => 'Wählen Sie eines der untenstehenden Projekte',
   'Source'                      => 'Beleg',
@@ -114,8 +139,17 @@ $self->{texts} = {
   'Storno Packing List'         => 'Stornolieferschein',
   'Subject'                     => 'Betreff',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
@@ -126,10 +160,15 @@ $self->{texts} = {
   'Vendor details'              => 'Lieferantendetails',
   'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
   'Vendor not on file!'         => 'Lieferant ist nicht in der Datenbank!',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   'Zero amount posting!'        => 'Buchung ohne Wert',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
   'button'                      => '?',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'invoice'                     => 'Rechnung',
   'no'                          => 'nein',
@@ -150,9 +189,6 @@ $self->{subs} = {
   'H'                           => 'H',
   'NTI'                         => 'NTI',
   'Q'                           => 'Q',
-  'add_transaction'             => 'add_transaction',
-  'ap_transaction'              => 'ap_transaction',
-  'ar_transaction'              => 'ar_transaction',
   'build_std_url'               => 'build_std_url',
   'calculate_qty'               => 'calculate_qty',
   'call_sub'                    => 'call_sub',
@@ -165,28 +201,30 @@ $self->{subs} = {
   'cov_selected'                => 'cov_selected',
   'cov_selected2'               => 'cov_selected2',
   'cov_selection_internal'      => 'cov_selection_internal',
-  'customer_details'            => 'customer_details',
   'delivery_customer_selection' => 'delivery_customer_selection',
   'employee_selection_internal' => 'employee_selection_internal',
   'form_footer'                 => 'form_footer',
   'form_header'                 => 'form_header',
   'format_dates'                => 'format_dates',
-  'gl_transaction'              => 'gl_transaction',
   'list_invoices'               => 'list_invoices',
   'mark_as_paid_common'         => 'mark_as_paid_common',
   'name_selected'               => 'name_selected',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
   'payment'                     => 'payment',
   'post'                        => 'post',
   'print'                       => 'print',
+  'project_created'             => 'project_created',
   'project_selected'            => 'project_selected',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
-  'sales_invoice'               => 'sales_invoice',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_name'                 => 'select_name',
   'select_part'                 => 'select_part',
@@ -196,10 +234,10 @@ $self->{subs} = {
   'show_history'                => 'show_history',
   'show_vc_details'             => 'show_vc_details',
   'update'                      => 'update',
-  'vendor_details'              => 'vendor_details',
-  'vendor_invoice'              => 'vendor_invoice',
   'vendor_selection'            => 'vendor_selection',
   'weiter'                      => 'continue',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'buchen'                      => 'post',
   'drucken'                     => 'print',
   'erneuern'                    => 'update',
index 8d31b22..f5904c8 100644 (file)
@@ -1,29 +1,48 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Add Customer'                => 'Kunde erfassen',
   'Add Vendor'                  => 'Lieferant erfassen',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
   'All'                         => 'Alle',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'CSV export -- options'       => 'CSV-Export -- Optionen',
   'Cannot delete customer!'     => 'Kunde kann nicht gelöscht werden!',
   'Cannot delete vendor!'       => 'Lieferant kann nicht gelöscht werden!',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
   'Could not spawn html2ps or GhostScript.' => 'html2ps oder GhostScript konnte nicht gestartet werden.',
   'Could not spawn the printer command.' => 'Die Druckanwendung konnte nicht gestartet werden.',
   'Could not write the html2ps config file.' => 'Die tempor&auml;re html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
   'Could not write the temporary HTML file.' => 'Eine tempor&auml;re HTML-Datei konnte nicht geschrieben werden.',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer Number'             => 'Kundennummer',
   'Customer deleted!'           => 'Kunde gelöscht!',
   'Customer details'            => 'Kundendetails',
   'Customer saved!'             => 'Kunde gespeichert!',
   'Customers'                   => 'Kunden',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -38,12 +57,16 @@ $self->{texts} = {
   'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
   'Fax'                         => 'Fax',
   'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'ID'                          => 'Buchungsnummer',
   'Invoice'                     => 'Rechnung',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
@@ -59,11 +82,12 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'Number'                      => 'Nummer',
   'Orphaned'                    => 'Nie benutzt',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF export -- options'       => 'PDF-Export -- Optionen',
   'POSTED'                      => 'Gebucht',
@@ -81,6 +105,8 @@ $self->{texts} = {
   'Purchase Order'              => 'Lieferantenauftrag',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'Request for Quotation'       => 'Anfrage',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
@@ -95,16 +121,26 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Storno Invoice'              => 'Stornorechnung',
   'Storno Packing List'         => 'Stornolieferschein',
   'Subject'                     => 'Betreff',
   'Tax Number'                  => 'Steuernummer',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'This customer number is already in use.' => 'Diese Kundennummer wird bereits verwendet.',
   'This vendor number is already in use.' => 'Diese Lieferantennummer wird bereits verwendet.',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Type of Business'            => 'Kunden-/Lieferantentyp',
   'Unit'                        => 'Einheit',
@@ -116,8 +152,13 @@ $self->{texts} = {
   'Vendor details'              => 'Lieferantendetails',
   'Vendor saved!'               => 'Lieferant gespeichert!',
   'Vendors'                     => 'Lieferanten',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'customer_list'               => 'kundenliste',
   'customernumber not unique!'  => 'Die Kundennummer ist schon vergeben',
@@ -166,14 +207,21 @@ $self->{subs} = {
   'get_shipto'                  => 'get_shipto',
   'list_names'                  => 'list_names',
   'mark_as_paid_common'         => 'mark_as_paid_common',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
+  'project_created'             => 'project_created',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
   'report_generator_back'       => 'report_generator_back',
   'report_generator_dispatcher' => 'report_generator_dispatcher',
   'report_generator_do'         => 'report_generator_do',
   'report_generator_export_as_csv' => 'report_generator_export_as_csv',
   'report_generator_export_as_pdf' => 'report_generator_export_as_pdf',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'save'                        => 'save',
   'save_and_ap_transaction'     => 'save_and_ap_transaction',
   'save_and_ar_transaction'     => 'save_and_ar_transaction',
@@ -185,8 +233,6 @@ $self->{subs} = {
   'search'                      => 'search',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_part'                 => 'select_part',
   'select_part_internal'        => 'select_part_internal',
@@ -198,6 +244,8 @@ $self->{subs} = {
   'erfassen'                    => 'add',
   'weiter'                      => 'continue',
   'löschen'                     => 'delete',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'speichern'                   => 'save',
   'speichern_und_debitorenbuchung_erfassen' => 'save_and_ar_transaction',
   'speichern_und_schließen'     => 'save_and_close',
index 9240d49..3ea79a3 100644 (file)
@@ -1,7 +1,11 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Abrechnungsnummer'           => 'Abrechnungsnummer',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'April'                       => 'April',
   'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.',
   'August'                      => 'August',
@@ -9,16 +13,31 @@ $self->{texts} = {
   'Beratername'                 => 'Beratername',
   'Beraternummer'               => 'Beraternummer',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'Bis Konto: '                 => 'bis Konto: ',
   'CANCELED'                    => 'Storniert',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
   'Continue'                    => 'Weiter',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
   'DATEV Angaben'               => 'DATEV-Angaben',
+  'DATEV Export'                => 'DATEV-Export',
   'DATEX - Export Assistent'    => 'DATEV-Exportassistent',
   'DELETED'                     => 'Gelöscht',
   'DFV-Kennzeichen'             => 'DFV-Kennzeichen',
@@ -36,6 +55,7 @@ $self->{texts} = {
   'Export Stammdaten'           => 'Export Stammdaten',
   'February'                    => 'Februar',
   'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'I'                           => 'I',
   'II'                          => 'II',
@@ -49,11 +69,14 @@ $self->{texts} = {
   'Konten'                      => 'Konten',
   'Kontonummernerweiterung (KNE)' => 'Kontonummernerweiterung (KNE)',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mandantennummer'             => 'Mandantennummer',
   'March'                       => 'März',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
   'May'                         => 'Mai',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Medium Number'               => 'Datentr&auml;gernummer',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
@@ -69,12 +92,13 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'November'                    => 'November',
   'OBE-Export erfolgreich!'     => 'OBE-Export erfolgreich!',
   'October'                     => 'Oktober',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'POSTED'                      => 'Gebucht',
   'POSTED AS NEW'               => 'Als neu gebucht',
@@ -92,6 +116,8 @@ $self->{texts} = {
   'Quartal'                     => 'Quartal',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -103,13 +129,23 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'September'                   => 'September',
   'Storno Invoice'              => 'Stornorechnung',
   'Storno Packing List'         => 'Stornolieferschein',
   'Subject'                     => 'Betreff',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
@@ -117,10 +153,15 @@ $self->{texts} = {
   'Variable'                    => 'Variable',
   'Vendor details'              => 'Lieferantendetails',
   'Von Konto: '                 => 'von Konto: ',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   'Zeitraum'                    => 'Zeitraum',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
   'bis'                         => 'bis',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'invoice'                     => 'Rechnung',
   'no'                          => 'nein',
@@ -159,13 +200,18 @@ $self->{subs} = {
   'export_stammdaten'           => 'export_stammdaten',
   'format_dates'                => 'format_dates',
   'mark_as_paid_common'         => 'mark_as_paid_common',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
+  'project_created'             => 'project_created',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_part'                 => 'select_part',
   'select_part_internal'        => 'select_part_internal',
@@ -174,6 +220,8 @@ $self->{subs} = {
   'show_vc_details'             => 'show_vc_details',
   'vendor_selection'            => 'vendor_selection',
   'weiter'                      => 'continue',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
 };
 
 1;
index 56dd3e0..ed44185 100644 (file)
@@ -2,11 +2,15 @@ $self->{texts} = {
   ' Date missing!'              => ' Datum fehlt!',
   '*/'                          => '*/',
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Add Purchase Order'          => 'Lieferantenauftrag erfassen',
   'Add Quotation'               => 'Angebot erfassen',
   'Add Request for Quotation'   => 'Anfrage erfassen',
   'Add Sales Order'             => 'Auftrag erfassen',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Amount'                      => 'Betrag',
   'Apr'                         => 'Apr',
   'April'                       => 'April',
@@ -19,9 +23,11 @@ $self->{texts} = {
   'Billing Address'             => 'Rechnungsadresse',
   'Bin'                         => 'Lagerplatz',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'CSV export -- options'       => 'CSV-Export -- Optionen',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'City'                        => 'Stadt',
   'Company Name'                => 'Firmenname',
   'Confirmation'                => 'Auftragsbestätigung',
@@ -34,12 +40,23 @@ $self->{texts} = {
   'Could not write the html2ps config file.' => 'Die tempor&auml;re html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
   'Could not write the temporary HTML file.' => 'Eine tempor&auml;re HTML-Datei konnte nicht geschrieben werden.',
   'Country'                     => 'Land',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
-  'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
-  'Customer not on file!'       => 'Kunde ist nicht in der Datenbank!',
   'Customername'                => 'Kundenname',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -49,7 +66,6 @@ $self->{texts} = {
   'Delivery Date'               => 'Lieferdatum',
   'Department'                  => 'Abteilung',
   'Dependency loop detected:'   => 'Schleife in den Abh&auml;ngigkeiten entdeckt:',
-  'Description'                 => 'Beschreibung',
   'Directory'                   => 'Verzeichnis',
   'Discount'                    => 'Rabatt',
   'Dunning Date'                => 'Mahndatum',
@@ -74,6 +90,7 @@ $self->{texts} = {
   'Feb'                         => 'Feb',
   'February'                    => 'Februar',
   'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Group'                       => 'Warengruppe',
   'History'                     => 'Historie',
   'In-line'                     => 'im Text',
@@ -94,12 +111,15 @@ $self->{texts} = {
   'LP'                          => 'LP',
   'License'                     => 'Lizenz',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mar'                         => 'März',
   'March'                       => 'März',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
   'May'                         => 'Mai',
   'May '                        => 'Mai',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
@@ -114,8 +134,8 @@ $self->{texts} = {
   'No dunnings have been selected for printing.' => 'Es wurden keine Mahnungen zum Drucken ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'No.'                         => 'Position',
   'Nov'                         => 'Nov',
@@ -127,6 +147,7 @@ $self->{texts} = {
   'OpenDocument/OASIS'          => 'OpenDocument/OASIS',
   'Order Date missing!'         => 'Auftragsdatum fehlt!',
   'Order Number missing!'       => 'Auftragsnummer fehlt!',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF'                         => 'PDF',
   'PDF (OpenDocument/OASIS)'    => 'PDF (OpenDocument/OASIS)',
@@ -146,6 +167,7 @@ $self->{texts} = {
   'Please enter values'         => 'Bitte Werte eingeben',
   'Postscript'                  => 'Postscript',
   'Price'                       => 'Preis',
+  'Price Factor'                => 'Preisfaktor',
   'Pricegroup'                  => 'Preisgruppe',
   'Print dunnings'              => 'Mahnungen drucken',
   'Printer'                     => 'Drucker',
@@ -153,7 +175,6 @@ $self->{texts} = {
   'Project'                     => 'Projekt',
   'Project Number'              => 'Projektnummer',
   'Project description'         => 'Projektbeschreibung',
-  'Project not on file!'        => 'Dieses Projekt ist nicht in der Datenbank!',
   'Purchase Order'              => 'Lieferantenauftrag',
   'Qty'                         => 'Menge',
   'Queue'                       => 'Warteschlange',
@@ -161,6 +182,8 @@ $self->{texts} = {
   'Quotation Date missing!'     => 'Angebotsdatum fehlt!',
   'Quotation Number missing!'   => 'Angebotsnummer fehlt!',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'Reqdate'                     => 'Lieferdatum',
   'Required by'                 => 'Lieferdatum',
   'SAVED'                       => 'Gespeichert',
@@ -176,9 +199,8 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Select from one of the items below' => 'Wählen Sie einen der untenstehenden Einträge',
-  'Select from one of the names below' => 'Wählen Sie einen der untenstehenden Namen',
-  'Select from one of the projects below' => 'Wählen Sie eines der untenstehenden Projekte',
   'Select postscript or PDF!'   => 'Postscript oder PDF auswählen!',
   'Sep'                         => 'Sep',
   'September'                   => 'September',
@@ -196,11 +218,20 @@ $self->{texts} = {
   'Subtotal'                    => 'Zwischensumme',
   'Terms missing in row '       => '+Tage fehlen in Zeile ',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'The dunnings have been printed.' => 'Die Mahnung(en) wurden gedruckt.',
   'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
   'Total Fees'                  => 'Kumulierte Gebühren',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
@@ -208,11 +239,14 @@ $self->{texts} = {
   'Variable'                    => 'Variable',
   'Vendor Number'               => 'Lieferantennummer',
   'Vendor details'              => 'Lieferantendetails',
-  'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
-  'Vendor not on file!'         => 'Lieferant ist nicht in der Datenbank!',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   'Zipcode'                     => 'PLZ',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'dunning_list'                => 'mahnungsliste',
   'emailed to'                  => 'gemailt an',
@@ -241,17 +275,12 @@ $self->{subs} = {
   'NTI'                         => 'NTI',
   'Q'                           => 'Q',
   'add'                         => 'add',
-  'add_transaction'             => 'add_transaction',
-  'ap_transaction'              => 'ap_transaction',
-  'ar_transaction'              => 'ar_transaction',
   'build_std_url'               => 'build_std_url',
   'calculate_qty'               => 'calculate_qty',
   'call_sub'                    => 'call_sub',
   'check_cov2'                  => 'check_cov2',
   'check_customer_or_vendor'    => 'check_customer_or_vendor',
   'check_form'                  => 'check_form',
-  'check_name'                  => 'check_name',
-  'check_project'               => 'check_project',
   'continue'                    => 'continue',
   'cov_selected'                => 'cov_selected',
   'cov_selected2'               => 'cov_selected2',
@@ -263,13 +292,12 @@ $self->{subs} = {
   'edit_e_mail'                 => 'edit_e_mail',
   'employee_selection_internal' => 'employee_selection_internal',
   'format_dates'                => 'format_dates',
-  'gl_transaction'              => 'gl_transaction',
   'invoicetotal'                => 'invoicetotal',
   'item_selected'               => 'item_selected',
   'mark_as_paid_common'         => 'mark_as_paid_common',
-  'name_selected'               => 'name_selected',
   'new_item'                    => 'new_item',
   'new_license'                 => 'new_license',
+  'new_project'                 => 'new_project',
   'order'                       => 'order',
   'part_selection_internal'     => 'part_selection_internal',
   'post_as_new'                 => 'post_as_new',
@@ -278,8 +306,12 @@ $self->{subs} = {
   'print_form'                  => 'print_form',
   'print_multiple'              => 'print_multiple',
   'print_options'               => 'print_options',
-  'project_selected'            => 'project_selected',
+  'project_created'             => 'project_created',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'quotation'                   => 'quotation',
   'reformat_numbers'            => 'reformat_numbers',
   'relink_accounts'             => 'relink_accounts',
@@ -289,20 +321,16 @@ $self->{subs} = {
   'report_generator_export_as_csv' => 'report_generator_export_as_csv',
   'report_generator_export_as_pdf' => 'report_generator_export_as_pdf',
   'request_for_quotation'       => 'request_for_quotation',
-  'sales_invoice'               => 'sales_invoice',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'save'                        => 'save',
   'save_dunning'                => 'save_dunning',
   'search'                      => 'search',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item'                 => 'select_item',
   'select_item_selection_internal' => 'select_item_selection_internal',
-  'select_name'                 => 'select_name',
   'select_part'                 => 'select_part',
   'select_part_internal'        => 'select_part_internal',
-  'select_project'              => 'select_project',
   'send_email'                  => 'send_email',
   'set_duedate'                 => 'set_duedate',
   'set_email'                   => 'set_email',
@@ -315,9 +343,10 @@ $self->{subs} = {
   'show_vc_details'             => 'show_vc_details',
   'validate_items'              => 'validate_items',
   'vendor_details'              => 'vendor_details',
-  'vendor_invoice'              => 'vendor_invoice',
   'vendor_selection'            => 'vendor_selection',
   'weiter'                      => 'continue',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'drucken'                     => 'print',
   'speichern'                   => 'save',
 };
index c75999d..6354520 100644 (file)
@@ -1,16 +1,35 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -23,11 +42,15 @@ $self->{texts} = {
   'Enter longdescription'       => 'Langtext eingeben',
   'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
   'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'Invoice'                     => 'Rechnung',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
@@ -41,9 +64,10 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'POSTED'                      => 'Gebucht',
   'POSTED AS NEW'               => 'Als neu gebucht',
@@ -59,6 +83,8 @@ $self->{texts} = {
   'Purchase Order'              => 'Lieferantenauftrag',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -70,21 +96,36 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Skip'                        => 'Überspringen',
   'Storno Invoice'              => 'Stornorechnung',
   'Storno Packing List'         => 'Stornolieferschein',
   'Subject'                     => 'Betreff',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
   'Vendor details'              => 'Lieferantendetails',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'invoice'                     => 'Rechnung',
   'no'                          => 'nein',
@@ -121,15 +162,20 @@ $self->{subs} = {
   'load_draft'                  => 'load_draft',
   'load_draft_maybe'            => 'load_draft_maybe',
   'mark_as_paid_common'         => 'mark_as_paid_common',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
+  'project_created'             => 'project_created',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
   'remove_draft'                => 'remove_draft',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'save_draft'                  => 'save_draft',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_part'                 => 'select_part',
   'select_part_internal'        => 'select_part_internal',
@@ -139,6 +185,8 @@ $self->{subs} = {
   'vendor_selection'            => 'vendor_selection',
   'weiter'                      => 'continue',
   'entwürfe_löschen'            => 'delete_drafts',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'entwurf_speichern'           => 'save_draft',
   'Überspringen'                => 'skip',
 };
index 07e2f82..c63322f 100644 (file)
@@ -1,9 +1,13 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Account'                     => 'Konto',
   'Add General Ledger Transaction' => 'Dialogbuchen',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
   'All'                         => 'Alle',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Apr'                         => 'Apr',
   'April'                       => 'April',
   'Are you sure you want to delete Transaction' => 'Buchung wirklich löschen?',
@@ -15,6 +19,7 @@ $self->{texts} = {
   'Bcc'                         => 'Bcc',
   'Belegnummer'                 => 'Buchungsnummer',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'Bis'                         => 'bis',
   'Buchungsdatum'               => 'Buchungsdatum',
   'Buchungsnummer'              => 'Buchungsnummer',
@@ -27,6 +32,7 @@ $self->{texts} = {
   'Cannot post transaction for a closed period!' => 'Für einen bereits abgeschlossenen Zeitraum kann keine Buchung angelegt werden!',
   'Cannot post transaction with a debit and credit entry for the same account!' => 'Kann Soll und Haben nicht auf dasselbe Konto buchen!',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Confirm!'                    => 'Bestätigen Sie!',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
@@ -36,6 +42,18 @@ $self->{texts} = {
   'Could not spawn the printer command.' => 'Die Druckanwendung konnte nicht gestartet werden.',
   'Could not write the html2ps config file.' => 'Die tempor&auml;re html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
   'Could not write the temporary HTML file.' => 'Eine tempor&auml;re HTML-Datei konnte nicht geschrieben werden.',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit'                      => 'Haben',
   'Credit Account'              => 'Habenkonto',
   'Credit Note'                 => 'Gutschrift',
@@ -43,8 +61,7 @@ $self->{texts} = {
   'Credit Tax Account'          => 'Umsatzsteuerkonto',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
-  'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
-  'Customer not on file!'       => 'Kunde ist nicht in der Datenbank!',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -74,6 +91,7 @@ $self->{texts} = {
   'February'                    => 'Februar',
   'File'                        => 'Datei',
   'From'                        => 'Von',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'ID'                          => 'Buchungsnummer',
   'Include in Report'           => 'In Bericht aufnehmen',
@@ -88,12 +106,15 @@ $self->{texts} = {
   'Korrektur'                   => 'Korrektur',
   'Liability'                   => 'Passiva/Mittelherkunft',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mar'                         => 'März',
   'March'                       => 'März',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
   'May'                         => 'Mai',
   'May '                        => 'Mai',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Memo'                        => 'Memo',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
@@ -110,15 +131,15 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'Notes'                       => 'Bemerkungen',
   'Nov'                         => 'Nov',
   'November'                    => 'November',
-  'Number'                      => 'Nummer',
   'Oct'                         => 'Okt',
   'October'                     => 'Oktober',
+  'Others'                      => 'Andere',
   'Out of balance transaction!' => 'Buchung ist nicht ausgeglichen!',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF export -- options'       => 'PDF-Export -- Optionen',
@@ -137,12 +158,13 @@ $self->{texts} = {
   'Project Number'              => 'Projektnummer',
   'Project Numbers'             => 'Projektnummern',
   'Project description'         => 'Projektbeschreibung',
-  'Project not on file!'        => 'Dieses Projekt ist nicht in der Datenbank!',
   'Purchase Order'              => 'Lieferantenauftrag',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
   'Reference'                   => 'Referenz',
   'Reference missing!'          => 'Referenz fehlt!',
+  'Reports'                     => 'Berichte',
   'Revenue'                     => 'Erlöskonto',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
@@ -155,8 +177,7 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
-  'Select from one of the names below' => 'Wählen Sie einen der untenstehenden Namen',
-  'Select from one of the projects below' => 'Wählen Sie eines der untenstehenden Projekte',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Sep'                         => 'Sep',
   'September'                   => 'September',
   'Show details'                => 'Details anzeigen',
@@ -169,14 +190,23 @@ $self->{texts} = {
   'Tax'                         => 'Steuer',
   'Taxkey'                      => 'Steuerschlüssel',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
   'To (time)'                   => 'Bis',
   'Transaction %d cancelled.'   => 'Buchung %d erfolgreich storniert.',
   'Transaction Date missing!'   => 'Buchungsdatum fehlt!',
   'Transaction deleted!'        => 'Buchung gelöscht!',
   'Transaction has already been cancelled!' => 'Diese Buchung wurde bereits storniert.',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unbalanced Ledger'           => 'Bilanzfehler',
   'Unit'                        => 'Einheit',
@@ -185,12 +215,15 @@ $self->{texts} = {
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
   'Vendor details'              => 'Lieferantendetails',
-  'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
-  'Vendor not on file!'         => 'Lieferant ist nicht in der Datenbank!',
   'Yes'                         => 'Ja',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
   'button'                      => '?',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'general_ledger_list'         => 'buchungsjournal',
   'invoice'                     => 'Rechnung',
@@ -215,16 +248,11 @@ $self->{subs} = {
   'NTI'                         => 'NTI',
   'Q'                           => 'Q',
   'add'                         => 'add',
-  'add_transaction'             => 'add_transaction',
-  'ap_transaction'              => 'ap_transaction',
-  'ar_transaction'              => 'ar_transaction',
   'build_std_url'               => 'build_std_url',
   'calculate_qty'               => 'calculate_qty',
   'call_sub'                    => 'call_sub',
   'check_cov2'                  => 'check_cov2',
   'check_customer_or_vendor'    => 'check_customer_or_vendor',
-  'check_name'                  => 'check_name',
-  'check_project'               => 'check_project',
   'continue'                    => 'continue',
   'cov_selected'                => 'cov_selected',
   'cov_selected2'               => 'cov_selected2',
@@ -240,39 +268,37 @@ $self->{subs} = {
   'form_header'                 => 'form_header',
   'format_dates'                => 'format_dates',
   'generate_report'             => 'generate_report',
-  'gl_transaction'              => 'gl_transaction',
   'mark_as_paid_common'         => 'mark_as_paid_common',
-  'name_selected'               => 'name_selected',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
   'post'                        => 'post',
   'post_as_new'                 => 'post_as_new',
   'post_transaction'            => 'post_transaction',
   'prepare_transaction'         => 'prepare_transaction',
-  'project_selected'            => 'project_selected',
+  'project_created'             => 'project_created',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
   'report_generator_back'       => 'report_generator_back',
   'report_generator_dispatcher' => 'report_generator_dispatcher',
   'report_generator_do'         => 'report_generator_do',
   'report_generator_export_as_csv' => 'report_generator_export_as_csv',
   'report_generator_export_as_pdf' => 'report_generator_export_as_pdf',
-  'sales_invoice'               => 'sales_invoice',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'search'                      => 'search',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
-  'select_name'                 => 'select_name',
   'select_part'                 => 'select_part',
   'select_part_internal'        => 'select_part_internal',
-  'select_project'              => 'select_project',
   'set_longdescription'         => 'set_longdescription',
   'show_history'                => 'show_history',
   'show_vc_details'             => 'show_vc_details',
   'storno'                      => 'storno',
   'update'                      => 'update',
-  'vendor_invoice'              => 'vendor_invoice',
   'vendor_selection'            => 'vendor_selection',
   'yes'                         => 'yes',
   'kreditorenbuchung'           => 'ap_transaction',
@@ -280,6 +306,8 @@ $self->{subs} = {
   'weiter'                      => 'continue',
   'löschen'                     => 'delete',
   'dialogbuchung'               => 'gl_transaction',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'buchen'                      => 'post',
   'rechnung'                    => 'sales_invoice',
   'storno'                      => 'storno',
index c14534b..22d5f65 100644 (file)
@@ -3,6 +3,8 @@ $self->{texts} = {
   ' Part Number missing!'       => ' Artikelnummer fehlt!',
   '*/'                          => '*/',
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Accounting Menu'             => 'Kontoverwaltung',
   'Active'                      => 'Aktiv',
   'Add '                        => 'Hinzufügen',
@@ -14,6 +16,8 @@ $self->{texts} = {
   'Add Sales Order'             => 'Auftrag erfassen',
   'Add Service'                 => 'Dienstleistung erfassen',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Apr'                         => 'Apr',
   'April'                       => 'April',
   'Assemblies'                  => 'Erzeugnisse',
@@ -27,11 +31,13 @@ $self->{texts} = {
   'Billing Address'             => 'Rechnungsadresse',
   'Bin'                         => 'Lagerplatz',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'Bought'                      => 'Gekauft',
   'CANCELED'                    => 'Storniert',
   'CSV export -- options'       => 'CSV-Export -- Optionen',
   'Cannot delete item!'         => 'Artikel kann nicht gelöscht werden!',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'City'                        => 'Stadt',
   'Company Name'                => 'Firmenname',
   'Confirmation'                => 'Auftragsbestätigung',
@@ -43,9 +49,22 @@ $self->{texts} = {
   'Could not write the html2ps config file.' => 'Die tempor&auml;re html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
   'Could not write the temporary HTML file.' => 'Eine tempor&auml;re HTML-Datei konnte nicht geschrieben werden.',
   'Country'                     => 'Land',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -78,6 +97,7 @@ $self->{texts} = {
   'February'                    => 'Februar',
   'File'                        => 'Datei',
   'From'                        => 'Von',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Group'                       => 'Warengruppe',
   'History'                     => 'Historie',
   'If you see this message, you most likely just setup your LX-Office and haven\'t added any entry types. If this is the case, the option is accessible for administrators in the System menu.' => 'Wenn Sie diese Meldung sehen haben Sie wahrscheinlich ein frisches LX-Office Setup und noch keine Buchungsgruppen eingerichtet. Ein Administrator kann dies im Systemmen&uuml; erledigen.',
@@ -106,12 +126,15 @@ $self->{texts} = {
   'Long Description'            => 'Langtext',
   'MAILED'                      => 'Gesendet',
   'Make'                        => 'Hersteller',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mar'                         => 'März',
   'March'                       => 'März',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
   'May'                         => 'Mai',
   'May '                        => 'Mai',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Microfiche'                  => 'Mikrofilm',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
@@ -127,8 +150,8 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'No.'                         => 'Position',
   'Nov'                         => 'Nov',
@@ -147,6 +170,7 @@ $self->{texts} = {
   'Order Number missing!'       => 'Auftragsnummer fehlt!',
   'Ordered'                     => 'Vom Kunde bestellt',
   'Orphaned'                    => 'Nie benutzt',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF'                         => 'PDF',
   'PDF (OpenDocument/OASIS)'    => 'PDF (OpenDocument/OASIS)',
@@ -173,6 +197,7 @@ $self->{texts} = {
   'Preis'                       => 'Preis',
   'Preisklasse'                 => 'Preisgruppe',
   'Price'                       => 'Preis',
+  'Price Factor'                => 'Preisfaktor',
   'Pricegroup'                  => 'Preisgruppe',
   'Printer'                     => 'Drucker',
   'Proforma Invoice'            => 'Proformarechnung',
@@ -188,6 +213,8 @@ $self->{texts} = {
   'Quoted'                      => 'Angeboten',
   'RFQ'                         => 'Anfrage',
   'ROP'                         => 'Mindestlagerbestand',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'Reqdate'                     => 'Lieferdatum',
   'Required by'                 => 'Lieferdatum',
   'SAVED'                       => 'Gespeichert',
@@ -204,6 +231,7 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Select from one of the items below' => 'Wählen Sie einen der untenstehenden Einträge',
   'Select postscript or PDF!'   => 'Postscript oder PDF auswählen!',
   'Sell Price'                  => 'Verkaufspreis',
@@ -227,14 +255,23 @@ $self->{texts} = {
   'Subtotal'                    => 'Zwischensumme',
   'TOP100'                      => 'Top 100',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To'                          => 'An',
   'To (email)'                  => 'An',
   'To (time)'                   => 'Bis',
   'Top 100'                     => 'Top 100',
   'Top 100 hinzufuegen'         => 'Top 100 hinzufügen',
   'Total'                       => 'Summe',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unit of measure'             => 'Maßeinheit',
@@ -246,12 +283,17 @@ $self->{texts} = {
   'Vendor Number'               => 'Lieferantennummer',
   'Vendor details'              => 'Lieferantendetails',
   'Weight'                      => 'Gewicht',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   'Zipcode'                     => 'PLZ',
   '[email]'                     => '[email]',
   'assembly_list'               => 'erzeugnisliste',
   'bin_list'                    => 'Lagerliste',
   'choice'                      => 'auswählen',
   'choice part'                 => 'Artikel auswählen',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'deliverydate'                => 'Lieferdatum',
   'ea'                          => 'St.',
@@ -322,6 +364,7 @@ $self->{subs} = {
   'mark_as_paid_common'         => 'mark_as_paid_common',
   'new_item'                    => 'new_item',
   'new_license'                 => 'new_license',
+  'new_project'                 => 'new_project',
   'order'                       => 'order',
   'part_selection_internal'     => 'part_selection_internal',
   'parts_language_selection'    => 'parts_language_selection',
@@ -331,7 +374,12 @@ $self->{subs} = {
   'print'                       => 'print',
   'print_form'                  => 'print_form',
   'print_options'               => 'print_options',
+  'project_created'             => 'project_created',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'quotation'                   => 'quotation',
   'reformat_numbers'            => 'reformat_numbers',
   'relink_accounts'             => 'relink_accounts',
@@ -341,6 +389,7 @@ $self->{subs} = {
   'report_generator_export_as_csv' => 'report_generator_export_as_csv',
   'report_generator_export_as_pdf' => 'report_generator_export_as_pdf',
   'request_for_quotation'       => 'request_for_quotation',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'save'                        => 'save',
   'save_as_new'                 => 'save_as_new',
   'search'                      => 'search',
@@ -348,8 +397,6 @@ $self->{subs} = {
   'section_menu'                => 'section_menu',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item'                 => 'select_item',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_part'                 => 'select_part',
@@ -376,6 +423,8 @@ $self->{subs} = {
   'erzeugnis_bearbeiten'        => 'edit_assembly',
   'ware_bearbeiten'             => 'edit_part',
   'dienstleistung_bearbeiten'   => 'edit_service',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'speichern'                   => 'save',
   'als_neu_speichern'           => 'save_as_new',
   'top_100'                     => 'top100',
index bc4a8ec..5ac8817 100644 (file)
@@ -2,11 +2,15 @@ $self->{texts} = {
   ' Date missing!'              => ' Datum fehlt!',
   '*/'                          => '*/',
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Add Purchase Order'          => 'Lieferantenauftrag erfassen',
   'Add Quotation'               => 'Angebot erfassen',
   'Add Request for Quotation'   => 'Anfrage erfassen',
   'Add Sales Order'             => 'Auftrag erfassen',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Apr'                         => 'Apr',
   'April'                       => 'April',
   'Attachment'                  => 'als Anhang',
@@ -17,17 +21,32 @@ $self->{texts} = {
   'Billing Address'             => 'Rechnungsadresse',
   'Bin'                         => 'Lagerplatz',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'City'                        => 'Stadt',
   'Company Name'                => 'Firmenname',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
   'Continue'                    => 'Weiter',
   'Country'                     => 'Land',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -51,6 +70,7 @@ $self->{texts} = {
   'Feb'                         => 'Feb',
   'February'                    => 'Februar',
   'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Group'                       => 'Warengruppe',
   'History'                     => 'Historie',
   'In-line'                     => 'im Text',
@@ -67,12 +87,15 @@ $self->{texts} = {
   'LP'                          => 'LP',
   'License'                     => 'Lizenz',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mar'                         => 'März',
   'March'                       => 'März',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
   'May'                         => 'Mai',
   'May '                        => 'Mai',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
@@ -86,8 +109,8 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'No.'                         => 'Position',
   'Nov'                         => 'Nov',
@@ -99,6 +122,7 @@ $self->{texts} = {
   'OpenDocument/OASIS'          => 'OpenDocument/OASIS',
   'Order Date missing!'         => 'Auftragsdatum fehlt!',
   'Order Number missing!'       => 'Auftragsnummer fehlt!',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF'                         => 'PDF',
   'PDF (OpenDocument/OASIS)'    => 'PDF (OpenDocument/OASIS)',
@@ -116,6 +140,7 @@ $self->{texts} = {
   'Please enter values'         => 'Bitte Werte eingeben',
   'Postscript'                  => 'Postscript',
   'Price'                       => 'Preis',
+  'Price Factor'                => 'Preisfaktor',
   'Pricegroup'                  => 'Preisgruppe',
   'Printer'                     => 'Drucker',
   'Proforma Invoice'            => 'Proformarechnung',
@@ -129,6 +154,8 @@ $self->{texts} = {
   'Quotation Date missing!'     => 'Angebotsdatum fehlt!',
   'Quotation Number missing!'   => 'Angebotsnummer fehlt!',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'Reqdate'                     => 'Lieferdatum',
   'Required by'                 => 'Lieferdatum',
   'SAVED'                       => 'Gespeichert',
@@ -143,6 +170,7 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Select from one of the items below' => 'Wählen Sie einen der untenstehenden Einträge',
   'Select postscript or PDF!'   => 'Postscript oder PDF auswählen!',
   'Sep'                         => 'Sep',
@@ -159,8 +187,17 @@ $self->{texts} = {
   'Subject'                     => 'Betreff',
   'Subtotal'                    => 'Zwischensumme',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
@@ -168,9 +205,14 @@ $self->{texts} = {
   'Variable'                    => 'Variable',
   'Vendor Number'               => 'Lieferantennummer',
   'Vendor details'              => 'Lieferantendetails',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   'Zipcode'                     => 'PLZ',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'emailed to'                  => 'gemailt an',
   'invoice'                     => 'Rechnung',
@@ -215,21 +257,26 @@ $self->{subs} = {
   'mark_as_paid_common'         => 'mark_as_paid_common',
   'new_item'                    => 'new_item',
   'new_license'                 => 'new_license',
+  'new_project'                 => 'new_project',
   'order'                       => 'order',
   'part_selection_internal'     => 'part_selection_internal',
   'post_as_new'                 => 'post_as_new',
   'print'                       => 'print',
   'print_form'                  => 'print_form',
   'print_options'               => 'print_options',
+  'project_created'             => 'project_created',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'quotation'                   => 'quotation',
   'reformat_numbers'            => 'reformat_numbers',
   'relink_accounts'             => 'relink_accounts',
   'request_for_quotation'       => 'request_for_quotation',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item'                 => 'select_item',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_part'                 => 'select_part',
@@ -245,6 +292,8 @@ $self->{subs} = {
   'vendor_details'              => 'vendor_details',
   'vendor_selection'            => 'vendor_selection',
   'weiter'                      => 'continue',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
 };
 
 1;
index ff3ef26..e4c169a 100644 (file)
@@ -2,6 +2,8 @@ $self->{texts} = {
   ' Date missing!'              => ' Datum fehlt!',
   '*/'                          => '*/',
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Account'                     => 'Konto',
   'Add Purchase Order'          => 'Lieferantenauftrag erfassen',
   'Add Quotation'               => 'Angebot erfassen',
@@ -9,6 +11,8 @@ $self->{texts} = {
   'Add Sales Order'             => 'Auftrag erfassen',
   'Add Vendor Invoice'          => 'Einkaufsrechnung erfassen',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Amount'                      => 'Betrag',
   'Apr'                         => 'Apr',
   'April'                       => 'April',
@@ -21,6 +25,7 @@ $self->{texts} = {
   'Billing Address'             => 'Rechnungsadresse',
   'Bin'                         => 'Lagerplatz',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'Cannot delete invoice!'      => 'Rechnung kann nicht gelöscht werden!',
   'Cannot post invoice for a closed period!' => 'Das Rechnungsdatum fällt in einen abgeschlossen Zeitraum!',
@@ -29,6 +34,7 @@ $self->{texts} = {
   'Cannot post payment!'        => 'Zahlung kann nicht gebucht werden!',
   'Cannot storno storno invoice!' => 'Kann eine Stornorechnung nicht stornieren',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'City'                        => 'Stadt',
   'Company Name'                => 'Firmenname',
   'Confirm!'                    => 'Bestätigen Sie!',
@@ -37,6 +43,18 @@ $self->{texts} = {
   'Contact Person'              => 'Ansprechpartner',
   'Continue'                    => 'Weiter',
   'Country'                     => 'Land',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Limit'                => 'Kreditlimit',
   'Credit Note'                 => 'Gutschrift',
   'Currency'                    => 'Währung',
@@ -44,6 +62,7 @@ $self->{texts} = {
   'Customer details'            => 'Kundendetails',
   'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
   'Customer not on file!'       => 'Kunde ist nicht in der Datenbank!',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -79,6 +98,7 @@ $self->{texts} = {
   'Feb'                         => 'Feb',
   'February'                    => 'Februar',
   'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Group'                       => 'Warengruppe',
   'History'                     => 'Historie',
   'In-line'                     => 'im Text',
@@ -100,12 +120,15 @@ $self->{texts} = {
   'LP'                          => 'LP',
   'License'                     => 'Lizenz',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mar'                         => 'März',
   'March'                       => 'März',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
   'May'                         => 'Mai',
   'May '                        => 'Mai',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Memo'                        => 'Memo',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
@@ -121,8 +144,8 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'No.'                         => 'Position',
   'Notes'                       => 'Bemerkungen',
@@ -137,6 +160,7 @@ $self->{texts} = {
   'Order Date missing!'         => 'Auftragsdatum fehlt!',
   'Order Number'                => 'Auftragsnummer',
   'Order Number missing!'       => 'Auftragsnummer fehlt!',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF'                         => 'PDF',
   'PDF (OpenDocument/OASIS)'    => 'PDF (OpenDocument/OASIS)',
@@ -159,6 +183,7 @@ $self->{texts} = {
   'Post Payment'                => 'Zahlung buchen',
   'Postscript'                  => 'Postscript',
   'Price'                       => 'Preis',
+  'Price Factor'                => 'Preisfaktor',
   'Pricegroup'                  => 'Preisgruppe',
   'Printer'                     => 'Drucker',
   'Proforma Invoice'            => 'Proformarechnung',
@@ -174,9 +199,11 @@ $self->{texts} = {
   'Quotation Date missing!'     => 'Angebotsdatum fehlt!',
   'Quotation Number missing!'   => 'Angebotsnummer fehlt!',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
   'Rechnungsnummer'             => 'Rechnungsnummer',
   'Record in'                   => 'Buchen auf',
   'Remaining'                   => 'Rest',
+  'Reports'                     => 'Berichte',
   'Reqdate'                     => 'Lieferdatum',
   'Required by'                 => 'Lieferdatum',
   'SAVED'                       => 'Gespeichert',
@@ -192,6 +219,7 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Select from one of the items below' => 'Wählen Sie einen der untenstehenden Einträge',
   'Select from one of the names below' => 'Wählen Sie einen der untenstehenden Namen',
   'Select from one of the projects below' => 'Wählen Sie eines der untenstehenden Projekte',
@@ -215,9 +243,18 @@ $self->{texts} = {
   'Subtotal'                    => 'Zwischensumme',
   'Tax Included'                => 'Steuer im Preis inbegriffen',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
   'Total'                       => 'Summe',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
@@ -232,10 +269,15 @@ $self->{texts} = {
   'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
   'Vendor not on file!'         => 'Lieferant ist nicht in der Datenbank!',
   'Yes'                         => 'Ja',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   'Zipcode'                     => 'PLZ',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
   'button'                      => '?',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'emailed to'                  => 'gemailt an',
   'history'                     => 'Historie',
@@ -264,9 +306,6 @@ $self->{subs} = {
   'NTI'                         => 'NTI',
   'Q'                           => 'Q',
   'add'                         => 'add',
-  'add_transaction'             => 'add_transaction',
-  'ap_transaction'              => 'ap_transaction',
-  'ar_transaction'              => 'ar_transaction',
   'build_std_url'               => 'build_std_url',
   'calculate_qty'               => 'calculate_qty',
   'call_sub'                    => 'call_sub',
@@ -293,7 +332,6 @@ $self->{subs} = {
   'form_footer'                 => 'form_footer',
   'form_header'                 => 'form_header',
   'format_dates'                => 'format_dates',
-  'gl_transaction'              => 'gl_transaction',
   'invoice_links'               => 'invoice_links',
   'invoicetotal'                => 'invoicetotal',
   'item_selected'               => 'item_selected',
@@ -304,6 +342,7 @@ $self->{subs} = {
   'name_selected'               => 'name_selected',
   'new_item'                    => 'new_item',
   'new_license'                 => 'new_license',
+  'new_project'                 => 'new_project',
   'order'                       => 'order',
   'part_selection_internal'     => 'part_selection_internal',
   'post'                        => 'post',
@@ -313,19 +352,22 @@ $self->{subs} = {
   'print'                       => 'print',
   'print_form'                  => 'print_form',
   'print_options'               => 'print_options',
+  'project_created'             => 'project_created',
   'project_selected'            => 'project_selected',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'quotation'                   => 'quotation',
   'reformat_numbers'            => 'reformat_numbers',
   'relink_accounts'             => 'relink_accounts',
   'remove_draft'                => 'remove_draft',
   'request_for_quotation'       => 'request_for_quotation',
-  'sales_invoice'               => 'sales_invoice',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'save_draft'                  => 'save_draft',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item'                 => 'select_item',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_name'                 => 'select_name',
@@ -344,12 +386,13 @@ $self->{subs} = {
   'use_as_template'             => 'use_as_template',
   'validate_items'              => 'validate_items',
   'vendor_details'              => 'vendor_details',
-  'vendor_invoice'              => 'vendor_invoice',
   'vendor_selection'            => 'vendor_selection',
   'yes'                         => 'yes',
   'weiter'                      => 'continue',
   'löschen'                     => 'delete',
   'entwürfe_löschen'            => 'delete_drafts',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'buchen'                      => 'post',
   'zahlung_buchen'              => 'post_payment',
   'entwurf_speichern'           => 'save_draft',
index d92e8f7..2335dc2 100644 (file)
@@ -2,6 +2,8 @@ $self->{texts} = {
   ' Date missing!'              => ' Datum fehlt!',
   '*/'                          => '*/',
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Account'                     => 'Konto',
   'Add Credit Note'             => 'Gutschrift erfassen',
   'Add Purchase Order'          => 'Lieferantenauftrag erfassen',
@@ -11,6 +13,8 @@ $self->{texts} = {
   'Add Sales Order'             => 'Auftrag erfassen',
   'Add Storno Credit Note'      => 'Gutschrift Storno hinzufügen',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Amount'                      => 'Betrag',
   'Apr'                         => 'Apr',
   'April'                       => 'April',
@@ -23,6 +27,7 @@ $self->{texts} = {
   'Billing Address'             => 'Rechnungsadresse',
   'Bin'                         => 'Lagerplatz',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'Cannot delete invoice!'      => 'Rechnung kann nicht gelöscht werden!',
   'Cannot post invoice for a closed period!' => 'Das Rechnungsdatum fällt in einen abgeschlossen Zeitraum!',
@@ -31,6 +36,7 @@ $self->{texts} = {
   'Cannot post payment!'        => 'Zahlung kann nicht gebucht werden!',
   'Cannot storno storno invoice!' => 'Kann eine Stornorechnung nicht stornieren',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Choose Customer'             => 'Endkunde wählen:',
   'Choose Vendor'               => 'Händler wählen',
   'City'                        => 'Stadt',
@@ -41,6 +47,18 @@ $self->{texts} = {
   'Contact Person'              => 'Ansprechpartner',
   'Continue'                    => 'Weiter',
   'Country'                     => 'Land',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Limit'                => 'Kreditlimit',
   'Credit Limit exceeded!!!'    => 'Kreditlimit überschritten!',
   'Credit Note'                 => 'Gutschrift',
@@ -55,6 +73,7 @@ $self->{texts} = {
   'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
   'Customer not on file!'       => 'Kunde ist nicht in der Datenbank!',
   'Customer type'               => 'Kundentyp',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -95,6 +114,7 @@ $self->{texts} = {
   'Feb'                         => 'Feb',
   'February'                    => 'Februar',
   'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Group'                       => 'Warengruppe',
   'History'                     => 'Historie',
   'In-line'                     => 'im Text',
@@ -117,13 +137,16 @@ $self->{texts} = {
   'LP'                          => 'LP',
   'License'                     => 'Lizenz',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mar'                         => 'März',
   'March'                       => 'März',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
   'Max. Dunning Level'          => 'höchste Mahnstufe',
   'May'                         => 'Mai',
   'May '                        => 'Mai',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Memo'                        => 'Memo',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
@@ -139,8 +162,8 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'No.'                         => 'Position',
   'Notes'                       => 'Bemerkungen',
@@ -156,6 +179,7 @@ $self->{texts} = {
   'Order Date missing!'         => 'Auftragsdatum fehlt!',
   'Order Number'                => 'Auftragsnummer',
   'Order Number missing!'       => 'Auftragsnummer fehlt!',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF'                         => 'PDF',
   'PDF (OpenDocument/OASIS)'    => 'PDF (OpenDocument/OASIS)',
@@ -180,6 +204,7 @@ $self->{texts} = {
   'Postscript'                  => 'Postscript',
   'Preview'                     => 'Druckvorschau',
   'Price'                       => 'Preis',
+  'Price Factor'                => 'Preisfaktor',
   'Pricegroup'                  => 'Preisgruppe',
   'Print'                       => 'Drucken',
   'Print and Post'              => 'Drucken und Buchen',
@@ -198,8 +223,10 @@ $self->{texts} = {
   'Quotation Number'            => 'Angebotsnummer',
   'Quotation Number missing!'   => 'Angebotsnummer fehlt!',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
   'Record in'                   => 'Buchen auf',
   'Remaining'                   => 'Rest',
+  'Reports'                     => 'Berichte',
   'Reqdate'                     => 'Lieferdatum',
   'Required by'                 => 'Lieferdatum',
   'SAVED'                       => 'Gespeichert',
@@ -216,6 +243,7 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Select from one of the items below' => 'Wählen Sie einen der untenstehenden Einträge',
   'Select from one of the names below' => 'Wählen Sie einen der untenstehenden Namen',
   'Select from one of the projects below' => 'Wählen Sie eines der untenstehenden Projekte',
@@ -241,11 +269,20 @@ $self->{texts} = {
   'Subtotal'                    => 'Zwischensumme',
   'Tax Included'                => 'Steuer im Preis inbegriffen',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
   'Total'                       => 'Summe',
   'Trade Discount'              => 'Rabatt',
   'Transaction description'     => 'Vorgangsbezeichnung',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
@@ -258,10 +295,15 @@ $self->{texts} = {
   'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
   'Vendor not on file!'         => 'Lieferant ist nicht in der Datenbank!',
   'Yes'                         => 'Ja',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   'Zipcode'                     => 'PLZ',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
   'button'                      => '?',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'emailed to'                  => 'gemailt an',
   'history'                     => 'Historie',
@@ -290,9 +332,6 @@ $self->{subs} = {
   'NTI'                         => 'NTI',
   'Q'                           => 'Q',
   'add'                         => 'add',
-  'add_transaction'             => 'add_transaction',
-  'ap_transaction'              => 'ap_transaction',
-  'ar_transaction'              => 'ar_transaction',
   'build_std_url'               => 'build_std_url',
   'calculate_qty'               => 'calculate_qty',
   'call_sub'                    => 'call_sub',
@@ -321,7 +360,6 @@ $self->{subs} = {
   'form_footer'                 => 'form_footer',
   'form_header'                 => 'form_header',
   'format_dates'                => 'format_dates',
-  'gl_transaction'              => 'gl_transaction',
   'invoice_links'               => 'invoice_links',
   'invoicetotal'                => 'invoicetotal',
   'item_selected'               => 'item_selected',
@@ -332,6 +370,7 @@ $self->{subs} = {
   'name_selected'               => 'name_selected',
   'new_item'                    => 'new_item',
   'new_license'                 => 'new_license',
+  'new_project'                 => 'new_project',
   'order'                       => 'order',
   'part_selection_internal'     => 'part_selection_internal',
   'post'                        => 'post',
@@ -343,19 +382,22 @@ $self->{subs} = {
   'print_and_post'              => 'print_and_post',
   'print_form'                  => 'print_form',
   'print_options'               => 'print_options',
+  'project_created'             => 'project_created',
   'project_selected'            => 'project_selected',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'quotation'                   => 'quotation',
   'reformat_numbers'            => 'reformat_numbers',
   'relink_accounts'             => 'relink_accounts',
   'remove_draft'                => 'remove_draft',
   'request_for_quotation'       => 'request_for_quotation',
-  'sales_invoice'               => 'sales_invoice',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'save_draft'                  => 'save_draft',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item'                 => 'select_item',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_name'                 => 'select_name',
@@ -374,7 +416,6 @@ $self->{subs} = {
   'use_as_template'             => 'use_as_template',
   'validate_items'              => 'validate_items',
   'vendor_details'              => 'vendor_details',
-  'vendor_invoice'              => 'vendor_invoice',
   'vendor_selection'            => 'vendor_selection',
   'yes'                         => 'yes',
   'weiter'                      => 'continue',
@@ -382,6 +423,8 @@ $self->{subs} = {
   'löschen'                     => 'delete',
   'entwürfe_löschen'            => 'delete_drafts',
   'email'                       => 'e_mail',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'auftrag'                     => 'order',
   'buchen'                      => 'post',
   'zahlung_buchen'              => 'post_payment',
index b9e4383..8f1bcc9 100644 (file)
@@ -1,24 +1,43 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Add'                         => 'Erfassen',
   'Add License'                 => 'Lizenz erfassen',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
   'All'                         => 'Alle',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'City'                        => 'Stadt',
   'Comment'                     => 'Kommentar',
   'Company Name'                => 'Firmenname',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
   'Continue'                    => 'Weiter',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
   'Customer missing!'           => 'Kundenname fehlt!',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -32,6 +51,7 @@ $self->{texts} = {
   'Expired licenses'            => 'Abgelaufene Lizenzen',
   'Expiring in x month(s)'      => 'Die in x Monat(en) ablaufen',
   'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'Include in Report'           => 'In Bericht aufnehmen',
   'Invoice'                     => 'Rechnung',
@@ -39,8 +59,11 @@ $self->{texts} = {
   'License key'                 => 'Lizenzschlüssel',
   'Licenses'                    => 'Lizenzen',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
@@ -55,9 +78,10 @@ $self->{texts} = {
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
   'No licenses were found that match the search criteria.' => 'Es wurden keine Lizenzen gefunden, auf die die Suchkriterien zutreffen.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
+  'Others'                      => 'Andere',
   'Own Product'                 => 'eigenes Produkt',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'POSTED'                      => 'Gebucht',
@@ -77,6 +101,8 @@ $self->{texts} = {
   'Quantity'                    => 'Menge',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -89,6 +115,7 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Select from one of the items below' => 'Wählen Sie einen der untenstehenden Einträge',
   'Select from one of the names below' => 'Wählen Sie einen der untenstehenden Namen',
   'Storno Invoice'              => 'Stornorechnung',
@@ -96,9 +123,18 @@ $self->{texts} = {
   'Street'                      => 'Straße',
   'Subject'                     => 'Betreff',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'The licensing module has been deactivated in lx-erp.conf.' => 'Das Lizenzverwaltungsmodul wurde in lx-erp.conf deaktiviert.',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
@@ -108,9 +144,14 @@ $self->{texts} = {
   'Variable'                    => 'Variable',
   'Vendor details'              => 'Lieferantendetails',
   'View License'                => 'Lizenz ansehen',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   'Zipcode'                     => 'PLZ',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'invoice'                     => 'Rechnung',
   'no'                          => 'nein',
@@ -149,19 +190,24 @@ $self->{subs} = {
   'form_header'                 => 'form_header',
   'format_dates'                => 'format_dates',
   'mark_as_paid_common'         => 'mark_as_paid_common',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
   'print_customer_selection'    => 'print_customer_selection',
   'print_license_form'          => 'print_license_form',
   'print_part_selection'        => 'print_part_selection',
+  'project_created'             => 'project_created',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'quot'                        => 'quot',
   'reformat_numbers'            => 'reformat_numbers',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'save'                        => 'save',
   'search'                      => 'search',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_part'                 => 'select_part',
   'select_part_internal'        => 'select_part_internal',
@@ -173,6 +219,8 @@ $self->{subs} = {
   'vendor_selection'            => 'vendor_selection',
   'erfassen'                    => 'add',
   'weiter'                      => 'continue',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'speichern'                   => 'save',
   'erneuern'                    => 'update',
 };
index e5d2d4c..c619e17 100644 (file)
@@ -1,17 +1,36 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'About'                       => 'über',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -22,12 +41,17 @@ $self->{texts} = {
   'Enter longdescription'       => 'Langtext eingeben',
   'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
   'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
+  'Incorrect Password!'         => 'Ungültiges Passwort!',
   'Incorrect username or password!' => 'Ungültiger Benutzername oder falsches Passwort!',
   'Invoice'                     => 'Rechnung',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
@@ -41,9 +65,10 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'POSTED'                      => 'Gebucht',
   'POSTED AS NEW'               => 'Als neu gebucht',
@@ -59,6 +84,8 @@ $self->{texts} = {
   'Purchase Order'              => 'Lieferantenauftrag',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -70,12 +97,22 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Storno Invoice'              => 'Stornorechnung',
   'Storno Packing List'         => 'Stornolieferschein',
   'Subject'                     => 'Betreff',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
@@ -85,8 +122,13 @@ $self->{texts} = {
   'Version'                     => 'Version',
   'You are logged out!'         => 'Auf Wiedersehen!',
   'You did not enter a name!'   => 'Sie haben keinen Namen eingegeben!',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'invoice'                     => 'Rechnung',
   'no'                          => 'nein',
@@ -122,22 +164,30 @@ $self->{subs} = {
   'login_screen'                => 'login_screen',
   'logout'                      => 'logout',
   'mark_as_paid_common'         => 'mark_as_paid_common',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
+  'project_created'             => 'project_created',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_part'                 => 'select_part',
   'select_part_internal'        => 'select_part_internal',
   'set_longdescription'         => 'set_longdescription',
+  'show_error'                  => 'show_error',
   'show_history'                => 'show_history',
   'show_vc_details'             => 'show_vc_details',
   'vendor_selection'            => 'vendor_selection',
   'weiter'                      => 'continue',
   'anmeldung'                   => 'login',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
 };
 
 1;
index 203f8c2..6304d86 100644 (file)
@@ -33,24 +33,50 @@ $self->{texts} = {
   'Add Transaction'             => 'Dialogbuchen',
   'Add Vendor'                  => 'Lieferant erfassen',
   'Add Vendor Invoice'          => 'Einkaufsrechnung erfassen',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Assemblies'                  => 'Erzeugnisse',
   'Audit Control'               => 'Bücherkontrolle',
   'BWA'                         => 'BWA',
   'Balance Sheet'               => 'Bilanz',
   'Batch Printing'              => 'Druck',
+  'Bcc'                         => 'Bcc',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'Buchungsgruppen'             => 'Buchungsgruppen',
   'Cash'                        => 'Zahlungsverkehr',
+  'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Chart of Accounts'           => 'Kontenübersicht',
   'Checks'                      => 'Schecks',
   'Contacts'                    => 'Kontakte',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Customer'                    => 'Kunde',
   'Customers'                   => 'Kunden',
   'DATEV - Export Assistent'    => 'DATEV-Exportassistent',
+  'DATEV Export'                => 'DATEV-Export',
+  'Dataset upgrade'             => 'Datenbankaktualisierung',
+  'Date'                        => 'Datum',
   'Departments'                 => 'Abteilungen',
+  'Dependency loop detected:'   => 'Schleife in den Abh&auml;ngigkeiten entdeckt:',
   'Dimension units'             => 'Ma&szlig;einheiten',
+  'Directory'                   => 'Verzeichnis',
   'Dunnings'                    => 'Mahnungen',
   'Edit Dunning'                => 'Mahnungen konfigurieren',
+  'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
+  'File'                        => 'Datei',
   'General Ledger'              => 'Finanzbuchhaltung',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Groups'                      => 'Warengruppen',
   'HTML Templates'              => 'HTML-Vorlagen',
   'History Search Engine'       => 'Historien Suchmaschine',
@@ -75,7 +101,16 @@ $self->{texts} = {
   'List Printer'                => 'Drucker anzeigen',
   'List Tax'                    => 'Bearbeiten',
   'Logout'                      => 'Abmeldung',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
+  'Message'                     => 'Nachricht',
+  'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
+  'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
+  'Missing parameter #1 in call to sub #2.' => 'Fehlernder Parameter \'#1\' in Funktionsaufruf \'#2\'.',
+  'More than one control file with the tag \'%s\' exist.' => 'Es gibt mehr als eine Kontrolldatei mit dem Tag \'%s\'.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
+  'Others'                      => 'Andere',
   'Packing Lists'               => 'Lieferschein',
   'Parts'                       => 'Waren',
   'Payment'                     => 'Zahlungsausgang',
@@ -93,6 +128,7 @@ $self->{texts} = {
   'RFQs'                        => 'Preisanfragen',
   'Ranges of numbers and default accounts' => 'Nummernkreise und Standardkonten',
   'Receipt'                     => 'Zahlungseingang',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
   'Receipts'                    => 'Zahlungseingänge',
   'Reconciliation'              => 'Kontenabgleich',
   'Reports'                     => 'Berichte',
@@ -102,24 +138,43 @@ $self->{texts} = {
   'Services'                    => 'Dienstleistungen',
   'Shipto'                      => 'Lieferanschriften',
   'Stylesheet'                  => 'Stilvorlage',
+  'Subject'                     => 'Betreff',
   'System'                      => 'System',
   'Taxes'                       => 'Steuern',
   'Templates'                   => 'Vorlagen',
+  'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
+  'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trial Balance'               => 'Saldenbilanz',
   'Type of Business'            => 'Kunden-/Lieferantentyp',
   'UStVa'                       => 'UStVa',
   'UStVa Einstellungen'         => 'UStVa Einstellungen',
   'Units'                       => 'Einheiten',
+  'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
   'Update Prices'               => 'Preise aktualisieren',
   'Vendor Invoices'             => 'Einkaufsrechnungen',
   'Vendors'                     => 'Lieferanten',
   'Version'                     => 'Version',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
+  '[email]'                     => '[email]',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
 };
 
 $self->{subs} = {
   'acc_menu'                    => 'acc_menu',
   'display'                     => 'display',
   'section_menu'                => 'section_menu',
+  'weiter'                      => 'continue',
 };
 
 1;
index 6719928..b19de87 100755 (executable)
@@ -1,10 +1,69 @@
 $self->{texts} = {
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
+  'Bcc'                         => 'Bcc',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
+  'DATEV Export'                => 'DATEV-Export',
+  'Dataset upgrade'             => 'Datenbankaktualisierung',
+  'Date'                        => 'Datum',
+  'Dependency loop detected:'   => 'Schleife in den Abh&auml;ngigkeiten entdeckt:',
+  'Directory'                   => 'Verzeichnis',
+  'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
+  'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
+  'Message'                     => 'Nachricht',
+  'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
+  'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
+  'Missing parameter #1 in call to sub #2.' => 'Fehlernder Parameter \'#1\' in Funktionsaufruf \'#2\'.',
+  'More than one control file with the tag \'%s\' exist.' => 'Es gibt mehr als eine Kontrolldatei mit dem Tag \'%s\'.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
+  'Others'                      => 'Andere',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
+  'Subject'                     => 'Betreff',
+  'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
+  'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
+  'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
+  '[email]'                     => '[email]',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
 };
 
 $self->{subs} = {
   'acc_menu'                    => 'acc_menu',
   'display'                     => 'display',
   'print_menu'                  => 'print_menu',
+  'weiter'                      => 'continue',
 };
 
 1;
index e107398..b8b71d9 100644 (file)
@@ -32,24 +32,50 @@ $self->{texts} = {
   'Add Transaction'             => 'Dialogbuchen',
   'Add Vendor'                  => 'Lieferant erfassen',
   'Add Vendor Invoice'          => 'Einkaufsrechnung erfassen',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Assemblies'                  => 'Erzeugnisse',
   'Audit Control'               => 'Bücherkontrolle',
   'BWA'                         => 'BWA',
   'Balance Sheet'               => 'Bilanz',
   'Batch Printing'              => 'Druck',
+  'Bcc'                         => 'Bcc',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'Buchungsgruppen'             => 'Buchungsgruppen',
   'Cash'                        => 'Zahlungsverkehr',
+  'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Chart of Accounts'           => 'Kontenübersicht',
   'Checks'                      => 'Schecks',
   'Contacts'                    => 'Kontakte',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Customer'                    => 'Kunde',
   'Customers'                   => 'Kunden',
   'DATEV - Export Assistent'    => 'DATEV-Exportassistent',
+  'DATEV Export'                => 'DATEV-Export',
+  'Dataset upgrade'             => 'Datenbankaktualisierung',
+  'Date'                        => 'Datum',
   'Departments'                 => 'Abteilungen',
+  'Dependency loop detected:'   => 'Schleife in den Abh&auml;ngigkeiten entdeckt:',
   'Dimension units'             => 'Ma&szlig;einheiten',
+  'Directory'                   => 'Verzeichnis',
   'Dunnings'                    => 'Mahnungen',
   'Edit Dunning'                => 'Mahnungen konfigurieren',
+  'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
+  'File'                        => 'Datei',
   'General Ledger'              => 'Finanzbuchhaltung',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Groups'                      => 'Warengruppen',
   'HTML Templates'              => 'HTML-Vorlagen',
   'History Search Engine'       => 'Historien Suchmaschine',
@@ -74,7 +100,16 @@ $self->{texts} = {
   'List Printer'                => 'Drucker anzeigen',
   'List Tax'                    => 'Bearbeiten',
   'Logout'                      => 'Abmeldung',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
+  'Message'                     => 'Nachricht',
+  'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
+  'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
+  'Missing parameter #1 in call to sub #2.' => 'Fehlernder Parameter \'#1\' in Funktionsaufruf \'#2\'.',
+  'More than one control file with the tag \'%s\' exist.' => 'Es gibt mehr als eine Kontrolldatei mit dem Tag \'%s\'.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
+  'Others'                      => 'Andere',
   'Packing Lists'               => 'Lieferschein',
   'Parts'                       => 'Waren',
   'Payment'                     => 'Zahlungsausgang',
@@ -92,6 +127,7 @@ $self->{texts} = {
   'RFQs'                        => 'Preisanfragen',
   'Ranges of numbers and default accounts' => 'Nummernkreise und Standardkonten',
   'Receipt'                     => 'Zahlungseingang',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
   'Receipts'                    => 'Zahlungseingänge',
   'Reconciliation'              => 'Kontenabgleich',
   'Reports'                     => 'Berichte',
@@ -101,18 +137,36 @@ $self->{texts} = {
   'Services'                    => 'Dienstleistungen',
   'Shipto'                      => 'Lieferanschriften',
   'Stylesheet'                  => 'Stilvorlage',
+  'Subject'                     => 'Betreff',
   'System'                      => 'System',
   'Taxes'                       => 'Steuern',
   'Templates'                   => 'Vorlagen',
+  'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
+  'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trial Balance'               => 'Saldenbilanz',
   'Type of Business'            => 'Kunden-/Lieferantentyp',
   'UStVa'                       => 'UStVa',
   'UStVa Einstellungen'         => 'UStVa Einstellungen',
   'Units'                       => 'Einheiten',
+  'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
   'Update Prices'               => 'Preise aktualisieren',
   'Vendor Invoices'             => 'Einkaufsrechnungen',
   'Vendors'                     => 'Lieferanten',
   'Version'                     => 'Version',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
+  '[email]'                     => '[email]',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
 };
 
 $self->{subs} = {
@@ -120,6 +174,7 @@ $self->{subs} = {
   'clock_line'                  => 'clock_line',
   'display'                     => 'display',
   'section_menu'                => 'section_menu',
+  'weiter'                      => 'continue',
 };
 
 1;
index 821b8ec..ebd8232 100644 (file)
@@ -1,4 +1,62 @@
 $self->{texts} = {
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
+  'Bcc'                         => 'Bcc',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
+  'DATEV Export'                => 'DATEV-Export',
+  'Dataset upgrade'             => 'Datenbankaktualisierung',
+  'Date'                        => 'Datum',
+  'Dependency loop detected:'   => 'Schleife in den Abh&auml;ngigkeiten entdeckt:',
+  'Directory'                   => 'Verzeichnis',
+  'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
+  'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
+  'Message'                     => 'Nachricht',
+  'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
+  'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
+  'Missing parameter #1 in call to sub #2.' => 'Fehlernder Parameter \'#1\' in Funktionsaufruf \'#2\'.',
+  'More than one control file with the tag \'%s\' exist.' => 'Es gibt mehr als eine Kontrolldatei mit dem Tag \'%s\'.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
+  'Others'                      => 'Andere',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
+  'Subject'                     => 'Betreff',
+  'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
+  'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
+  'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
+  '[email]'                     => '[email]',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
 };
 
 $self->{subs} = {
@@ -6,6 +64,7 @@ $self->{subs} = {
   'clock_line'                  => 'clock_line',
   'display'                     => 'display',
   'print_menu'                  => 'print_menu',
+  'weiter'                      => 'continue',
 };
 
 1;
index 2646253..df30bde 100644 (file)
@@ -3,6 +3,8 @@ $self->{texts} = {
   ' missing!'                   => ' fehlt!',
   '*/'                          => '*/',
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Add Exchangerate'            => 'Wechselkurs erfassen',
   'Add Purchase Order'          => 'Lieferantenauftrag erfassen',
   'Add Quotation'               => 'Angebot erfassen',
@@ -11,6 +13,8 @@ $self->{texts} = {
   'Add Sales Order'             => 'Auftrag erfassen',
   'Add Vendor Invoice'          => 'Einkaufsrechnung erfassen',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Amount'                      => 'Betrag',
   'Apr'                         => 'Apr',
   'April'                       => 'April',
@@ -24,6 +28,7 @@ $self->{texts} = {
   'Billing Address'             => 'Rechnungsadresse',
   'Bin'                         => 'Lagerplatz',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'Bis'                         => 'bis',
   'CANCELED'                    => 'Storniert',
   'CSV export -- options'       => 'CSV-Export -- Optionen',
@@ -32,6 +37,7 @@ $self->{texts} = {
   'Cannot save order!'          => 'Auftrag kann nicht gespeichert werden!',
   'Cannot save quotation!'      => 'Angebot kann nicht gespeichert werden!',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'City'                        => 'Stadt',
   'Closed'                      => 'Geschlossen',
   'Collective Orders only work for orders from one customer!' => 'Sammelaufträge funktionieren nur für Aufträge von einem Kunden!',
@@ -45,6 +51,18 @@ $self->{texts} = {
   'Could not write the html2ps config file.' => 'Die tempor&auml;re html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
   'Could not write the temporary HTML file.' => 'Eine tempor&auml;re HTML-Datei konnte nicht geschrieben werden.',
   'Country'                     => 'Land',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Limit exceeded!!!'    => 'Kreditlimit überschritten!',
   'Credit Note'                 => 'Gutschrift',
   'Curr'                        => 'Währung',
@@ -56,6 +74,7 @@ $self->{texts} = {
   'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
   'Customer not on file!'       => 'Kunde ist nicht in der Datenbank!',
   'Customer type'               => 'Kundentyp',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -95,6 +114,7 @@ $self->{texts} = {
   'February'                    => 'Februar',
   'File'                        => 'Datei',
   'From'                        => 'Von',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Group'                       => 'Warengruppe',
   'History'                     => 'Historie',
   'ID'                          => 'Buchungsnummer',
@@ -113,12 +133,15 @@ $self->{texts} = {
   'LP'                          => 'LP',
   'License'                     => 'Lizenz',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mar'                         => 'März',
   'March'                       => 'März',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
   'May'                         => 'Mai',
   'May '                        => 'Mai',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
@@ -133,8 +156,8 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'No.'                         => 'Position',
   'Not delivered'               => 'Nicht geliefert',
@@ -152,6 +175,7 @@ $self->{texts} = {
   'Order Number'                => 'Auftragsnummer',
   'Order Number missing!'       => 'Auftragsnummer fehlt!',
   'Order deleted!'              => 'Auftrag gelöscht!',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF'                         => 'PDF',
   'PDF (OpenDocument/OASIS)'    => 'PDF (OpenDocument/OASIS)',
@@ -170,6 +194,7 @@ $self->{texts} = {
   'Please enter values'         => 'Bitte Werte eingeben',
   'Postscript'                  => 'Postscript',
   'Price'                       => 'Preis',
+  'Price Factor'                => 'Preisfaktor',
   'Pricegroup'                  => 'Preisgruppe',
   'Printer'                     => 'Drucker',
   'Proforma Invoice'            => 'Proformarechnung',
@@ -189,6 +214,8 @@ $self->{texts} = {
   'Quotations'                  => 'Angebote',
   'RFQ'                         => 'Anfrage',
   'RFQ Number'                  => 'Anfragenummer',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'Reqdate'                     => 'Lieferdatum',
   'Request for Quotation'       => 'Anfrage',
   'Request for Quotations'      => 'Anfragen',
@@ -208,6 +235,7 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Select from one of the items below' => 'Wählen Sie einen der untenstehenden Einträge',
   'Select from one of the names below' => 'Wählen Sie einen der untenstehenden Namen',
   'Select from one of the projects below' => 'Wählen Sie eines der untenstehenden Projekte',
@@ -227,11 +255,20 @@ $self->{texts} = {
   'Subtotal'                    => 'Zwischensumme',
   'Tax'                         => 'Steuer',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
   'Total'                       => 'Summe',
   'Transaction description'     => 'Vorgangsbezeichnung',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
@@ -249,10 +286,15 @@ $self->{texts} = {
   'Workflow sales_order'        => 'Workflow Auftrag',
   'Workflow sales_quotation'    => 'Workflow Angebot',
   'Yes'                         => 'Ja',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   'Zipcode'                     => 'PLZ',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
   'button'                      => '?',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'emailed to'                  => 'gemailt an',
   'invoice'                     => 'Rechnung',
@@ -285,9 +327,6 @@ $self->{subs} = {
   'NTI'                         => 'NTI',
   'Q'                           => 'Q',
   'add'                         => 'add',
-  'add_transaction'             => 'add_transaction',
-  'ap_transaction'              => 'ap_transaction',
-  'ar_transaction'              => 'ar_transaction',
   'backorder_exchangerate'      => 'backorder_exchangerate',
   'build_std_url'               => 'build_std_url',
   'calculate_qty'               => 'calculate_qty',
@@ -300,6 +339,7 @@ $self->{subs} = {
   'check_for_direct_delivery_yes' => 'check_for_direct_delivery_yes',
   'check_form'                  => 'check_form',
   'check_name'                  => 'check_name',
+  'check_oe_access'             => 'check_oe_access',
   'check_project'               => 'check_project',
   'continue'                    => 'continue',
   'cov_selected'                => 'cov_selected',
@@ -320,7 +360,6 @@ $self->{subs} = {
   'form_footer'                 => 'form_footer',
   'form_header'                 => 'form_header',
   'format_dates'                => 'format_dates',
-  'gl_transaction'              => 'gl_transaction',
   'invoice'                     => 'invoice',
   'invoicetotal'                => 'invoicetotal',
   'item_selected'               => 'item_selected',
@@ -328,6 +367,7 @@ $self->{subs} = {
   'name_selected'               => 'name_selected',
   'new_item'                    => 'new_item',
   'new_license'                 => 'new_license',
+  'new_project'                 => 'new_project',
   'no'                          => 'no',
   'order'                       => 'order',
   'order_links'                 => 'order_links',
@@ -339,8 +379,13 @@ $self->{subs} = {
   'print'                       => 'print',
   'print_form'                  => 'print_form',
   'print_options'               => 'print_options',
+  'project_created'             => 'project_created',
   'project_selected'            => 'project_selected',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'purchase_order'              => 'purchase_order',
   'quotation'                   => 'quotation',
   'reformat_numbers'            => 'reformat_numbers',
@@ -351,7 +396,7 @@ $self->{subs} = {
   'report_generator_export_as_csv' => 'report_generator_export_as_csv',
   'report_generator_export_as_pdf' => 'report_generator_export_as_pdf',
   'request_for_quotation'       => 'request_for_quotation',
-  'sales_invoice'               => 'sales_invoice',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'sales_order'                 => 'sales_order',
   'save'                        => 'save',
   'save_and_close'              => 'save_and_close',
@@ -360,8 +405,6 @@ $self->{subs} = {
   'search'                      => 'search',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item'                 => 'select_item',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_name'                 => 'select_name',
@@ -379,13 +422,14 @@ $self->{subs} = {
   'update'                      => 'update',
   'validate_items'              => 'validate_items',
   'vendor_details'              => 'vendor_details',
-  'vendor_invoice'              => 'vendor_invoice',
   'vendor_selection'            => 'vendor_selection',
   'yes'                         => 'yes',
   'weiter'                      => 'continue',
   'löschen'                     => 'delete',
   'email'                       => 'e_mail',
   'rechnung'                    => 'invoice',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'nein'                        => 'no',
   'auftrag'                     => 'order',
   'drucken'                     => 'print',
index 37d10cb..3c62030 100644 (file)
@@ -1,24 +1,43 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Active'                      => 'Aktiv',
   'Add'                         => 'Erfassen',
   'Add Group'                   => 'Warengruppe erfassen',
   'Add Pricegroup'              => 'Preisgruppe erfassen',
   'Add Project'                 => 'Projekt erfassen',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
   'All'                         => 'Alle',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'Both'                        => 'Sowohl als auch',
   'CANCELED'                    => 'Storniert',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
   'Continue'                    => 'Weiter',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -34,6 +53,7 @@ $self->{texts} = {
   'Enter longdescription'       => 'Langtext eingeben',
   'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
   'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Group'                       => 'Warengruppe',
   'Group deleted!'              => 'Warengruppe gelöscht!',
   'Group missing!'              => 'Warengruppe fehlt!',
@@ -43,8 +63,11 @@ $self->{texts} = {
   'Inactive'                    => 'Inaktiv',
   'Invoice'                     => 'Rechnung',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
@@ -59,11 +82,12 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'Number'                      => 'Nummer',
   'Orphaned'                    => 'Nie benutzt',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'POSTED'                      => 'Gebucht',
   'POSTED AS NEW'               => 'Als neu gebucht',
@@ -89,6 +113,8 @@ $self->{texts} = {
   'Purchase Order'              => 'Lieferantenauftrag',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -101,12 +127,22 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Storno Invoice'              => 'Stornorechnung',
   'Storno Packing List'         => 'Stornolieferschein',
   'Subject'                     => 'Betreff',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
@@ -114,8 +150,13 @@ $self->{texts} = {
   'Variable'                    => 'Variable',
   'Vendor details'              => 'Lieferantendetails',
   'Yes'                         => 'Ja',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'history'                     => 'Historie',
   'invoice'                     => 'Rechnung',
@@ -158,18 +199,23 @@ $self->{subs} = {
   'form_project_header'         => 'form_project_header',
   'format_dates'                => 'format_dates',
   'mark_as_paid_common'         => 'mark_as_paid_common',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
   'partsgroup_report'           => 'partsgroup_report',
   'pricegroup_report'           => 'pricegroup_report',
+  'project_created'             => 'project_created',
   'project_report'              => 'project_report',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'save'                        => 'save',
   'search'                      => 'search',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_part'                 => 'select_part',
   'select_part_internal'        => 'select_part_internal',
@@ -180,6 +226,8 @@ $self->{subs} = {
   'erfassen'                    => 'add',
   'weiter'                      => 'continue',
   'löschen'                     => 'delete',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'speichern'                   => 'save',
 };
 
index 4b447bb..755bbcb 100644 (file)
@@ -1,20 +1,39 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Account'                     => 'Konto',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.',
   'Balance'                     => 'Bilanz',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Cleared Balance'             => 'abgeschlossen',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
   'Continue'                    => 'Weiter',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -33,12 +52,16 @@ $self->{texts} = {
   'Falsches Datumsformat!'      => 'Falsches Datumsformat!',
   'File'                        => 'Datei',
   'From'                        => 'Von',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'Increase'                    => 'Erhöhen',
   'Invoice'                     => 'Rechnung',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
@@ -52,9 +75,10 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
+  'Others'                      => 'Andere',
   'Out of balance!'             => 'Summen stimmen nicht berein!',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'POSTED'                      => 'Gebucht',
@@ -72,7 +96,9 @@ $self->{texts} = {
   'Purchase Order'              => 'Lieferantenauftrag',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
   'Reconciliation'              => 'Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -85,14 +111,24 @@ $self->{texts} = {
   'Select all'                  => 'Alle auswählen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Source'                      => 'Beleg',
   'Statement Balance'           => 'Sammelrechnungsbilanz',
   'Storno Invoice'              => 'Stornorechnung',
   'Storno Packing List'         => 'Stornolieferschein',
   'Subject'                     => 'Betreff',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
@@ -101,8 +137,13 @@ $self->{texts} = {
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
   'Vendor details'              => 'Lieferantendetails',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'invoice'                     => 'Rechnung',
   'no'                          => 'nein',
@@ -138,15 +179,20 @@ $self->{subs} = {
   'format_dates'                => 'format_dates',
   'get_payments'                => 'get_payments',
   'mark_as_paid_common'         => 'mark_as_paid_common',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
+  'project_created'             => 'project_created',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reconciliation'              => 'reconciliation',
   'reformat_numbers'            => 'reformat_numbers',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'select_all'                  => 'select_all',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_part'                 => 'select_part',
   'select_part_internal'        => 'select_part_internal',
@@ -157,6 +203,8 @@ $self->{subs} = {
   'vendor_selection'            => 'vendor_selection',
   'weiter'                      => 'continue',
   'fertig'                      => 'done',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'alle_auswählen'              => 'select_all',
   'erneuern'                    => 'update',
 };
index 3624186..29d312c 100644 (file)
@@ -1,16 +1,35 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'CSV export -- options'       => 'CSV-Export -- Optionen',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Confirmation'                => 'Auftragsbestätigung',
   'Could not spawn html2ps or GhostScript.' => 'html2ps oder GhostScript konnte nicht gestartet werden.',
   'Could not spawn the printer command.' => 'Die Druckanwendung konnte nicht gestartet werden.',
   'Could not write the html2ps config file.' => 'Die tempor&auml;re html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
   'Could not write the temporary HTML file.' => 'Eine tempor&auml;re HTML-Datei konnte nicht geschrieben werden.',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -20,13 +39,19 @@ $self->{texts} = {
   'ELSE'                        => 'Zusatz',
   'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
   'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Invoice'                     => 'Rechnung',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
   'Missing parameter #1 in call to sub #2.' => 'Fehlernder Parameter \'#1\' in Funktionsaufruf \'#2\'.',
   'More than one control file with the tag \'%s\' exist.' => 'Es gibt mehr als eine Kontrolldatei mit dem Tag \'%s\'.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF export -- options'       => 'PDF-Export -- Optionen',
   'POSTED'                      => 'Gebucht',
@@ -38,6 +63,8 @@ $self->{texts} = {
   'Purchase Order'              => 'Lieferantenauftrag',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -45,11 +72,24 @@ $self->{texts} = {
   'Storno Packing List'         => 'Stornolieferschein',
   'Subject'                     => 'Betreff',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'invoice'                     => 'Rechnung',
   'packing_list'                => 'Versandliste',
   'pick_list'                   => 'Entnahmeliste',
index b288d9d..e3bc813 100644 (file)
@@ -1,12 +1,16 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
   'AP Aging'                    => 'Offene Verbindlichkeiten',
+  'AR'                          => 'Verkauf',
   'AR Aging'                    => 'Offene Forderungen',
   'Account'                     => 'Konto',
   'Account Number'              => 'Kontonummer',
   'Accrual'                     => 'Bilanzierung',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
   'All Accounts'                => 'Alle Konten',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Amount'                      => 'Betrag',
   'Apr'                         => 'Apr',
   'April'                       => 'April',
@@ -18,10 +22,12 @@ $self->{texts} = {
   'Balance Sheet'               => 'Bilanz',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'Bis'                         => 'bis',
   'CANCELED'                    => 'Storniert',
   'CSV export -- options'       => 'CSV-Export -- Optionen',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Compare to'                  => 'Gegenüberstellen zu',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
@@ -31,6 +37,18 @@ $self->{texts} = {
   'Could not spawn the printer command.' => 'Die Druckanwendung konnte nicht gestartet werden.',
   'Could not write the html2ps config file.' => 'Die tempor&auml;re html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
   'Could not write the temporary HTML file.' => 'Eine tempor&auml;re HTML-Datei konnte nicht geschrieben werden.',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit'                      => 'Haben',
   'Credit Note'                 => 'Gutschrift',
   'Current'                     => 'Betrag',
@@ -41,6 +59,7 @@ $self->{texts} = {
   'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
   'Customer not on file!'       => 'Kunde ist nicht in der Datenbank!',
   'Customized Report'           => 'Vorgewählte Zeiträume',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -66,6 +85,7 @@ $self->{texts} = {
   'File'                        => 'Datei',
   'Free report period'          => 'Freier Zeitraum',
   'From'                        => 'Von',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'HTML'                        => 'HTML',
   'Heading'                     => 'Überschrift',
   'History'                     => 'Historie',
@@ -82,12 +102,15 @@ $self->{texts} = {
   'Jun'                         => 'Jun',
   'June'                        => 'Juni',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mar'                         => 'März',
   'March'                       => 'März',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
   'May'                         => 'Mai',
   'May '                        => 'Mai',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Memo'                        => 'Memo',
   'Message'                     => 'Nachricht',
   'Method'                      => 'Verfahren',
@@ -104,8 +127,8 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'Non-taxable Purchases'       => 'Nicht zu versteuernde Einkäufe',
   'Non-taxable Sales'           => 'Nicht zu versteuernde Verkäufe',
@@ -115,6 +138,7 @@ $self->{texts} = {
   'Number'                      => 'Nummer',
   'Oct'                         => 'Okt',
   'October'                     => 'Oktober',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF'                         => 'PDF',
   'PDF export -- options'       => 'PDF-Export -- Optionen',
@@ -140,9 +164,11 @@ $self->{texts} = {
   'Quarterly'                   => 'quartalsweise',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
   'Receipts'                    => 'Zahlungseingänge',
   'Reference'                   => 'Referenz',
   'Report for'                  => 'Bericht für',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -155,6 +181,7 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Select from one of the names below' => 'Wählen Sie einen der untenstehenden Namen',
   'Select from one of the projects below' => 'Wählen Sie eines der untenstehenden Projekte',
   'Select postscript or PDF!'   => 'Postscript oder PDF auswählen!',
@@ -172,10 +199,19 @@ $self->{texts} = {
   'Tax collected'               => 'vereinnahmte Steuer',
   'Tax paid'                    => 'Vorsteuer',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
   'Total'                       => 'Summe',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trial Balance'               => 'Saldenbilanz',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
@@ -189,6 +225,7 @@ $self->{texts} = {
   'YYYY'                        => 'JJJJ',
   'Year'                        => 'Jahr',
   'Yearly'                      => 'jährlich',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   '[email]'                     => '[email]',
   'ap_aging_list'               => 'liste_offene_verbindlichkeiten',
   'ar_aging_list'               => 'liste_offene_forderungen',
@@ -196,6 +233,10 @@ $self->{texts} = {
   'bin_list'                    => 'Lagerliste',
   'bis'                         => 'bis',
   'button'                      => '?',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'for Period'                  => 'für den Zeitraum',
   'invoice'                     => 'Rechnung',
@@ -222,10 +263,7 @@ $self->{subs} = {
   'H'                           => 'H',
   'NTI'                         => 'NTI',
   'Q'                           => 'Q',
-  'add_transaction'             => 'add_transaction',
   'aging'                       => 'aging',
-  'ap_transaction'              => 'ap_transaction',
-  'ar_transaction'              => 'ar_transaction',
   'build_std_url'               => 'build_std_url',
   'calculate_qty'               => 'calculate_qty',
   'call_sub'                    => 'call_sub',
@@ -233,6 +271,7 @@ $self->{subs} = {
   'check_customer_or_vendor'    => 'check_customer_or_vendor',
   'check_name'                  => 'check_name',
   'check_project'               => 'check_project',
+  'check_rp_access'             => 'check_rp_access',
   'continue'                    => 'continue',
   'cov_selected'                => 'cov_selected',
   'cov_selected2'               => 'cov_selected2',
@@ -252,17 +291,22 @@ $self->{subs} = {
   'generate_tax_report'         => 'generate_tax_report',
   'generate_trial_balance'      => 'generate_trial_balance',
   'get_project'                 => 'get_project',
-  'gl_transaction'              => 'gl_transaction',
   'list_accounts'               => 'list_accounts',
   'list_payments'               => 'list_payments',
   'mark_as_paid_common'         => 'mark_as_paid_common',
   'name_selected'               => 'name_selected',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
   'print'                       => 'print',
   'print_form'                  => 'print_form',
   'print_options'               => 'print_options',
+  'project_created'             => 'project_created',
   'project_selected'            => 'project_selected',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
   'report'                      => 'report',
   'report_generator_back'       => 'report_generator_back',
@@ -270,12 +314,10 @@ $self->{subs} = {
   'report_generator_do'         => 'report_generator_do',
   'report_generator_export_as_csv' => 'report_generator_export_as_csv',
   'report_generator_export_as_pdf' => 'report_generator_export_as_pdf',
-  'sales_invoice'               => 'sales_invoice',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'select_all'                  => 'select_all',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
   'select_name'                 => 'select_name',
   'select_part'                 => 'select_part',
@@ -287,10 +329,11 @@ $self->{subs} = {
   'show_vc_details'             => 'show_vc_details',
   'statement_details'           => 'statement_details',
   'tax_subtotal'                => 'tax_subtotal',
-  'vendor_invoice'              => 'vendor_invoice',
   'vendor_selection'            => 'vendor_selection',
   'weiter'                      => 'continue',
   'email'                       => 'e_mail',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'drucken'                     => 'print',
   'alle_auswählen'              => 'select_all',
 };
index a8c811d..1d84719 100644 (file)
@@ -4,7 +4,11 @@ $self->{texts} = {
   '3. Quarter'                  => '3. Quartal',
   '4. Quarter'                  => '4. Quartal',
   'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
   'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
   'Amended Advance Turnover Tax Return' => 'Berichtigte Anmeldung',
   'Amended Advance Turnover Tax Return (Nr. 10)' => 'Ist dies eine berichtigte Anmeldung? (Nr. 10/Zeile 15 Steuererklärung)',
   'Application Error. No Format given' => 'Fehler in der Anwendung. Das Ausgabeformat fehlt.',
@@ -16,19 +20,31 @@ $self->{texts} = {
   'August'                      => 'August',
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'CANCELED'                    => 'Storniert',
   'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
   'Check Details'               => 'Bitte Angaben überprüfen',
   'Choose Outputformat'         => 'Ausgabeformat auswählen...',
   'Choose a Tax Number'         => 'Bitte eine Steuernummer angeben',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
-  'Continue'                    => 'Weiter',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
-  'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
-  'Customer not on file!'       => 'Kunde ist nicht in der Datenbank!',
+  'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
@@ -36,7 +52,6 @@ $self->{texts} = {
   'Dec'                         => 'Dez',
   'December'                    => 'Dezember',
   'Dependency loop detected:'   => 'Schleife in den Abh&auml;ngigkeiten entdeckt:',
-  'Description'                 => 'Beschreibung',
   'Directory'                   => 'Verzeichnis',
   'ELSE'                        => 'Zusatz',
   'ELSTER Export (Taxbird)'     => 'ELSTER-Export nach Taxbird',
@@ -47,6 +62,7 @@ $self->{texts} = {
   'Feb'                         => 'Feb',
   'February'                    => 'Februar',
   'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'Invoice'                     => 'Rechnung',
   'Jan'                         => 'Jan',
@@ -56,12 +72,15 @@ $self->{texts} = {
   'Jun'                         => 'Jun',
   'June'                        => 'Juni',
   'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
   'Mar'                         => 'März',
   'March'                       => 'März',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
   'May'                         => 'Mai',
   'May '                        => 'Mai',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
   'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
@@ -79,14 +98,14 @@ $self->{texts} = {
   'No customer has been selected.' => 'Es wurde kein Kunde ausgew&auml;hlt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No item was found.'          => 'Es wurde kein Eintrag gefunden.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
-  'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
   'Nov'                         => 'Nov',
   'November'                    => 'November',
-  'Number'                      => 'Nummer',
   'Oct'                         => 'Okt',
   'October'                     => 'Oktober',
+  'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'POSTED'                      => 'Gebucht',
   'POSTED AS NEW'               => 'Als neu gebucht',
@@ -100,10 +119,11 @@ $self->{texts} = {
   'Proforma Invoice'            => 'Proformarechnung',
   'Project Number'              => 'Projektnummer',
   'Project description'         => 'Projektbeschreibung',
-  'Project not on file!'        => 'Dieses Projekt ist nicht in der Datenbank!',
   'Purchase Order'              => 'Lieferantenauftrag',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
@@ -116,8 +136,7 @@ $self->{texts} = {
   'Select a vendor or customer' => 'Kunden oder Lieferanten ausw&auml;hlen',
   'Select an employee'          => 'Angestellten ausw&auml;hlen',
   'Select an entry'             => 'Eintrag ausw&auml;hlen',
-  'Select from one of the names below' => 'Wählen Sie einen der untenstehenden Namen',
-  'Select from one of the projects below' => 'Wählen Sie eines der untenstehenden Projekte',
+  'Select an project'           => 'Ein Projekt ausw&auml;hlen',
   'Sep'                         => 'Sep',
   'September'                   => 'September',
   'Storno Invoice'              => 'Stornorechnung',
@@ -125,8 +144,17 @@ $self->{texts} = {
   'Subject'                     => 'Betreff',
   'Tax Office Preferences'      => 'Finanzamt - Einstellungen',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '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/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
   'There is no %s whose name matches \'%s\'.' => 'Es gibt keinen %s, dessen Name \'%s\' enth&auml;lt.',
+  'There is no project whose project number matches \'%s\'.' => 'Es gibt kein Projekt, auf das die Suchkriterien zutreffen.',
   'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'USTVA-Hint: Method'          => 'Wenn Sie Ist-Versteuert sind, wählen Sie die Einnahmen-/Überschuß-Rechnung aus. Sind Sie Soll-Versteuert und bilanzverpflichtet, dann wählen Sie Bilanz aus.',
   'USTVA-Hint: Tax Authoritys'  => 'Bitte das Bundesland UND die Stadt bzw. den Einzugsbereich Ihres zuständigen Finanzamts auswählen.',
@@ -137,16 +165,19 @@ $self->{texts} = {
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
   'Vendor details'              => 'Lieferantendetails',
-  'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
-  'Vendor not on file!'         => 'Lieferant ist nicht in der Datenbank!',
   'Wrong Period'                => 'Falscher Zeitraum',
   'Year'                        => 'Jahr',
   'Yearly'                      => 'jährlich',
   'Yearly taxreport not yet implemented' => 'Jährlicher Steuerreport für dieses Ausgabeformat noch nicht implementiert',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   '[email]'                     => '[email]',
   'accrual'                     => 'Bilanzierung (Soll-Versteuerung)',
   'bin_list'                    => 'Lagerliste',
   'cash'                        => 'E/Ü-Rechnung (Ist-Versteuerung)',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
   'customer'                    => 'Kunde',
   'for Period'                  => 'für den Zeitraum',
   'invoice'                     => 'Rechnung',
@@ -171,17 +202,12 @@ $self->{subs} = {
   'H'                           => 'H',
   'NTI'                         => 'NTI',
   'Q'                           => 'Q',
-  'add_transaction'             => 'add_transaction',
-  'ap_transaction'              => 'ap_transaction',
-  'ar_transaction'              => 'ar_transaction',
   'back'                        => 'back',
   'build_std_url'               => 'build_std_url',
   'calculate_qty'               => 'calculate_qty',
   'call_sub'                    => 'call_sub',
   'check_cov2'                  => 'check_cov2',
   'check_customer_or_vendor'    => 'check_customer_or_vendor',
-  'check_name'                  => 'check_name',
-  'check_project'               => 'check_project',
   'config_step1'                => 'config_step1',
   'config_step2'                => 'config_step2',
   'continue'                    => 'continue',
@@ -195,35 +221,35 @@ $self->{subs} = {
   'employee_selection_internal' => 'employee_selection_internal',
   'format_dates'                => 'format_dates',
   'generate_ustva'              => 'generate_ustva',
-  'gl_transaction'              => 'gl_transaction',
   'help'                        => 'help',
   'mark_as_paid_common'         => 'mark_as_paid_common',
-  'name_selected'               => 'name_selected',
+  'new_project'                 => 'new_project',
   'part_selection_internal'     => 'part_selection_internal',
-  'project_selected'            => 'project_selected',
+  'project_created'             => 'project_created',
+  'project_selection'           => 'project_selection',
+  'project_selection_check'     => 'project_selection_check',
   'project_selection_internal'  => 'project_selection_internal',
+  'project_selection_selected'  => 'project_selection_selected',
+  'project_selection_step2'     => 'project_selection_step2',
   'reformat_numbers'            => 'reformat_numbers',
   'report'                      => 'report',
-  'sales_invoice'               => 'sales_invoice',
+  'retrieve_partunits'          => 'retrieve_partunits',
   'save'                        => 'save',
   'select_cov_internal'         => 'select_cov_internal',
   'select_customer_or_vendor'   => 'select_customer_or_vendor',
-  'select_employee'             => 'select_employee',
-  'select_employee_internal'    => 'select_employee_internal',
   'select_item_selection_internal' => 'select_item_selection_internal',
-  'select_name'                 => 'select_name',
   'select_part'                 => 'select_part',
   'select_part_internal'        => 'select_part_internal',
-  'select_project'              => 'select_project',
   'set_longdescription'         => 'set_longdescription',
   'show'                        => 'show',
   'show_history'                => 'show_history',
   'show_options'                => 'show_options',
   'show_vc_details'             => 'show_vc_details',
   'ustva_vorauswahl'            => 'ustva_vorauswahl',
-  'vendor_invoice'              => 'vendor_invoice',
   'vendor_selection'            => 'vendor_selection',
   'weiter'                      => 'continue',
+  'neue_ware'                   => 'new_part',
+  'neues_projekt'               => 'new_project',
   'speichern'                   => 'save',
   'zeigen'                      => 'show',
   'zurück'                      => 'back',
index 354949b..f216dd9 100755 (executable)
--- a/login.pl
+++ b/login.pl
@@ -47,8 +47,8 @@ $| = 1;
 use SL::LXDebug;
 $lxdebug = LXDebug->new();
 
-eval { require "lx-erp.conf"; };
-eval { require "lx-erp-local.conf"; } if -f "lx-erp-local.conf";
+eval { require "config/lx-erp.conf"; };
+eval { require "config/lx-erp-local.conf"; } if -f "config/lx-erp-local.conf";
 
 if ($ENV{CONTENT_LENGTH}) {
   read(STDIN, $_, $ENV{CONTENT_LENGTH});
diff --git a/lx-erp.conf b/lx-erp.conf
deleted file mode 100644 (file)
index abea479..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-use Cwd;
-use vars qw($userspath $spool $memberfile $templates $sendmail $language $sid $latex $eur $webdav $lizenzen $pg_dump_exe $pg_restore_exe $watch_form_variables);
-
-# path to user configuration files
-$userspath = "users";
-
-# spool directory for batch printing
-$spool = "spool";
-
-# templates base directory
-$templates = "templates";
-
-# member file
-$memberfile = "users/members";
-
-# Wenn nicht Bilanzierung dann auf 1 setzen
-$eur= 1;
-
-# location of sendmail
-$sendmail = '| /usr/sbin/sendmail -t<%if myconfig_email%> -f <%myconfig_email%><%end%>';
-
-# set language for login and admin
-$language = "de";
-
-# Oracle
-$sid = "T80509";
-$ENV{"ORACLE_HOME"} = "/usr/local/oracle";
-
-# if you have latex installed set to 1
-$latex_templates = 1;
-
-# if the server can't find gzip, latex, dvips or pdflatex, add the path
-$ENV{PATH} .= ":/usr/local/bin";
-
-# on mac os X using Fink's Perl libs, add the path
-$ENV{PERL5LIB} .= ":/sw/lib/perl5";
-
-# Aktivierung der verschiedenen Spezialmodule
-$webdav = 0;
-$lizenzen = 1;
-
-## Support fuer OpenDocument-Vorlagen
-# Diese Option legt fest, ob OpenDocument-Vorlagen generell verfuegbar sind.
-$opendocument_templates = 1;
-
-# Die folgenden zwei Variablen legen Pfade zu Programmen fest, die benoetigt
-# werden, um OpenDocument-Vorlagen in PDFs umzuwandeln.
-
-# Pfad zu OpenOffice.org writer
-$openofficeorg_writer_bin = "/usr/bin/oowriter";
-
-# Soll OpenOffice dauerhaft gestartet bleiben? Die Konvertierung nachfolgender
-# Dokumente geht dann schneller. Allerdings wird auf dem System ein
-# installiertes Python mit den Python-UNO-Bindings benoetigt, die Bestandteil
-# von OpenOffice sind.
-$openofficeorg_daemon = 1;
-$openofficeorg_daemon_port = 2002;
-
-# Pfad zum "X virtual frame buffer", unter dem OpenOffice gestartet wird.
-# Zusaetzlich muessen die Programme "xauth" und "mcookie" gefunden werden
-# koennen, was eine Aenderung an PATH bedeuten kann.
-$ENV{"PATH"} = $ENV{"PATH"} . ":/usr/X11R6/bin:/usr/X11/bin";
-$xvfb_bin = "/usr/bin/Xvfb";
-
-# Das charset, in dem die Daten in der Datenbank abgelegt sind.
-# $dbcharset = 'UTF-8'; # Für UNICODE UTF-8 
-$dbcharset = "ISO-8859-15";
-
-
-# Pfad zu 'html2ps' zum Export von Listenansichten als PDF
-$html2ps_bin = "/usr/bin/html2ps";
-$ghostscript_bin = "/usr/bin/gs";
-
-
-
-# Datenbankbackups werden mit dem externen Programm "pg_dump" erledigt.
-# Wenn es nicht im aktuellen Pfad vorhanden ist, so muss hier der vollständige
-# Pfad eingetragen werden. Wenn die Variable auf "DISABLED" gesetzt wird,
-# so wird der Menüpunkt zum Backup von Datenbanken im Administrationsfrontend
-# nicht angeboten.
-# Das gleiche gilt analog für das Wiederherstellen mittels "pg_restore".
-$pg_dump_exe    = "pg_dump";
-$pg_restore_exe = "pg_restore";
-
-# Globale Debug-Ausgaben (de-)aktivieren? Moegliche Werte sind
-# LXDebug::NONE   - keine Debugausgaben
-# LXDebug::INFO
-# LXDebug::DEBUG1 
-# LXDebug::DEBUG2 
-# LXDebug::QUERY  - SQL Queries 
-# LXDebug::TRACE  - Tracing von Funktionsaufrufen
-# LXDebug::BACKTRACE_ON_ERROR - Vollständiger Aufrufpfad, wenn $form->error() aufgerufen wird
-# LXDebug::ALL    - alle Debugausgaben
-#
-# LXDebug::DEVEL  - wie INFO | QUERY | TRACE | BACKTRACE_ON_ERROR
-#
-# Beipiel: 
-#   $LXDebug::global_level = LXDebug::TRACE | LXDebug::QUERY;
-$LXDebug::global_level = LXDebug::NONE;
-
-# Überwachung der Inhalte von $form aktiviert oder nicht? Wenn ja,
-# dann können einzelne Variablen mit
-#   $form->{"Watchdog::<variablenname>"} = 1;
-# überwacht werden. Bedeutet aber auch einen Geschwindigkeitsverlust,
-# weshalb sie normalerweise deaktiviert ist.
-$LXDebug::watch_form = 0;
-
-1;
-
diff --git a/lx-erp.conf.default b/lx-erp.conf.default
deleted file mode 100644 (file)
index abea479..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-use Cwd;
-use vars qw($userspath $spool $memberfile $templates $sendmail $language $sid $latex $eur $webdav $lizenzen $pg_dump_exe $pg_restore_exe $watch_form_variables);
-
-# path to user configuration files
-$userspath = "users";
-
-# spool directory for batch printing
-$spool = "spool";
-
-# templates base directory
-$templates = "templates";
-
-# member file
-$memberfile = "users/members";
-
-# Wenn nicht Bilanzierung dann auf 1 setzen
-$eur= 1;
-
-# location of sendmail
-$sendmail = '| /usr/sbin/sendmail -t<%if myconfig_email%> -f <%myconfig_email%><%end%>';
-
-# set language for login and admin
-$language = "de";
-
-# Oracle
-$sid = "T80509";
-$ENV{"ORACLE_HOME"} = "/usr/local/oracle";
-
-# if you have latex installed set to 1
-$latex_templates = 1;
-
-# if the server can't find gzip, latex, dvips or pdflatex, add the path
-$ENV{PATH} .= ":/usr/local/bin";
-
-# on mac os X using Fink's Perl libs, add the path
-$ENV{PERL5LIB} .= ":/sw/lib/perl5";
-
-# Aktivierung der verschiedenen Spezialmodule
-$webdav = 0;
-$lizenzen = 1;
-
-## Support fuer OpenDocument-Vorlagen
-# Diese Option legt fest, ob OpenDocument-Vorlagen generell verfuegbar sind.
-$opendocument_templates = 1;
-
-# Die folgenden zwei Variablen legen Pfade zu Programmen fest, die benoetigt
-# werden, um OpenDocument-Vorlagen in PDFs umzuwandeln.
-
-# Pfad zu OpenOffice.org writer
-$openofficeorg_writer_bin = "/usr/bin/oowriter";
-
-# Soll OpenOffice dauerhaft gestartet bleiben? Die Konvertierung nachfolgender
-# Dokumente geht dann schneller. Allerdings wird auf dem System ein
-# installiertes Python mit den Python-UNO-Bindings benoetigt, die Bestandteil
-# von OpenOffice sind.
-$openofficeorg_daemon = 1;
-$openofficeorg_daemon_port = 2002;
-
-# Pfad zum "X virtual frame buffer", unter dem OpenOffice gestartet wird.
-# Zusaetzlich muessen die Programme "xauth" und "mcookie" gefunden werden
-# koennen, was eine Aenderung an PATH bedeuten kann.
-$ENV{"PATH"} = $ENV{"PATH"} . ":/usr/X11R6/bin:/usr/X11/bin";
-$xvfb_bin = "/usr/bin/Xvfb";
-
-# Das charset, in dem die Daten in der Datenbank abgelegt sind.
-# $dbcharset = 'UTF-8'; # Für UNICODE UTF-8 
-$dbcharset = "ISO-8859-15";
-
-
-# Pfad zu 'html2ps' zum Export von Listenansichten als PDF
-$html2ps_bin = "/usr/bin/html2ps";
-$ghostscript_bin = "/usr/bin/gs";
-
-
-
-# Datenbankbackups werden mit dem externen Programm "pg_dump" erledigt.
-# Wenn es nicht im aktuellen Pfad vorhanden ist, so muss hier der vollständige
-# Pfad eingetragen werden. Wenn die Variable auf "DISABLED" gesetzt wird,
-# so wird der Menüpunkt zum Backup von Datenbanken im Administrationsfrontend
-# nicht angeboten.
-# Das gleiche gilt analog für das Wiederherstellen mittels "pg_restore".
-$pg_dump_exe    = "pg_dump";
-$pg_restore_exe = "pg_restore";
-
-# Globale Debug-Ausgaben (de-)aktivieren? Moegliche Werte sind
-# LXDebug::NONE   - keine Debugausgaben
-# LXDebug::INFO
-# LXDebug::DEBUG1 
-# LXDebug::DEBUG2 
-# LXDebug::QUERY  - SQL Queries 
-# LXDebug::TRACE  - Tracing von Funktionsaufrufen
-# LXDebug::BACKTRACE_ON_ERROR - Vollständiger Aufrufpfad, wenn $form->error() aufgerufen wird
-# LXDebug::ALL    - alle Debugausgaben
-#
-# LXDebug::DEVEL  - wie INFO | QUERY | TRACE | BACKTRACE_ON_ERROR
-#
-# Beipiel: 
-#   $LXDebug::global_level = LXDebug::TRACE | LXDebug::QUERY;
-$LXDebug::global_level = LXDebug::NONE;
-
-# Überwachung der Inhalte von $form aktiviert oder nicht? Wenn ja,
-# dann können einzelne Variablen mit
-#   $form->{"Watchdog::<variablenname>"} = 1;
-# überwacht werden. Bedeutet aber auch einen Geschwindigkeitsverlust,
-# weshalb sie normalerweise deaktiviert ist.
-$LXDebug::watch_form = 0;
-
-1;
-
index 66f1126..fe28f11 100644 (file)
--- a/menu.ini
+++ b/menu.ini
@@ -1,40 +1,48 @@
 [Master Data]
 
 [Master Data--Add Customer]
+ACCESS=customer_vendor_edit
 module=ct.pl
 action=add
 db=customer
 
 [Master Data--Add Vendor]
+ACCESS=customer_vendor_edit
 module=ct.pl
 action=add
 db=vendor
 
 [Master Data--Add Part]
+ACCESS=part_service_assembly_edit
 module=ic.pl
 action=add
 item=part
 
 [Master Data--Add Service]
+ACCESS=part_service_assembly_edit
 module=ic.pl
 action=add
 item=service
 
 [Master Data--Add Assembly]
+ACCESS=part_service_assembly_edit
 module=ic.pl
 action=add
 item=assembly
 
 [Master Data--Add Project]
+ACCESS=project_edit
 module=pe.pl
 action=add
 type=project
 
 [Master Data--Update Prices]
+ACCESS=part_service_assembly_edit
 module=ic.pl
 action=search_update_prices
 
 [Master Data--Add License]
+ACCESS=license_edit
 module=licenses.pl
 action=add
 
@@ -46,71 +54,83 @@ target=acc_menu
 submenu=1
 
 [Master Data--Reports--Customers]
+ACCESS=customer_vendor_edit
 module=ct.pl
 action=search
 db=customer
 
 [Master Data--Reports--Vendors]
+ACCESS=customer_vendor_edit
 module=ct.pl
 action=search
 db=vendor
 
 [Master Data--Reports--Parts]
+ACCESS=part_service_assembly_edit
 module=ic.pl
 action=search
 searchitems=part
 
 [Master Data--Reports--Services]
+ACCESS=part_service_assembly_edit
 module=ic.pl
 action=search
 searchitems=service
 
 [Master Data--Reports--Assemblies]
+ACCESS=part_service_assembly_edit
 module=ic.pl
 action=search
 searchitems=assembly
 
 [Master Data--Reports--Projects]
+ACCESS=project_edit
 module=pe.pl
 action=search
 type=project
 
 [Master Data--Reports--Projecttransactions]
+ACCESS=report
 module=rp.pl
 action=report
 report=projects
 
 [Master Data--Reports--Licenses]
+ACCESS=license_edit
 module=licenses.pl
 action=search
 
 [AR]
 
 [AR--Add Quotation]
+ACCESS=sales_quotation_edit
 module=oe.pl
 action=add
 type=sales_quotation
 
 [AR--Add Sales Order]
+ACCESS=sales_order_edit
 module=oe.pl
 action=add
 type=sales_order
 
 [AR--Add Sales Invoice]
+ACCESS=invoice_edit
 module=is.pl
 action=add
 type=invoice
 
 [AR--Add Credit Note]
+ACCESS=invoice_edit
 module=is.pl
 action=add
 type=credit_note
 
 [AR--Add Dunning]
+ACCESS=dunning_edit
 module=dn.pl
 action=add
 
-
 [AR--Reports]
 module=menu.pl
 action=acc_menu
@@ -118,38 +138,44 @@ target=acc_menu
 submenu=1
 
 [AR--Reports--Quotations]
+ACCESS=sales_quotation_edit
 module=oe.pl
 action=search
 type=sales_quotation
 
 [AR--Reports--Sales Orders]
+ACCESS=sales_order_edit
 module=oe.pl
 action=search
 type=sales_order
 
 [AR--Reports--Invoices]
+ACCESS=invoice_edit
 module=ar.pl
 action=search
 nextsub=ar_transactions
 
 [AR--Reports--Dunnings]
+ACCESS=dunning_edit
 module=dn.pl
 action=search
 
-
 [AP]
 
 [AP--Add RFQ]
+ACCESS=request_quotation_edit
 module=oe.pl
 action=add
 type=request_quotation
 
 [AP--Add Purchase Order]
+ACCESS=purchase_order_edit
 module=oe.pl
 action=add
 type=purchase_order
 
 [AP--Add Vendor Invoice]
+ACCESS=vendor_invoice_edit
 module=ir.pl
 action=add
 type=invoice
@@ -162,16 +188,19 @@ target=acc_menu
 submenu=1
 
 [AP--Reports--RFQs]
+ACCESS=request_quotation_edit
 module=oe.pl
 action=search
 type=request_quotation
 
 [AP--Reports--Purchase Orders]
+ACCESS=purchase_order_edit
 module=oe.pl
 action=search
 type=purchase_order
 
 [AP--Reports--Vendor Invoices]
+ACCESS=vendor_invoice_edit
 module=ap.pl
 action=search
 nextsub=ap_transactions
@@ -180,18 +209,22 @@ nextsub=ap_transactions
 [General Ledger]
 
 [General Ledger--Add Transaction]
+ACCESS=general_ledger
 module=gl.pl
 action=add
 
 [General Ledger--Add AR Transaction]
+ACCESS=general_ledger
 module=ar.pl
 action=add
 
 [General Ledger--Add AP Transaction]
+ACCESS=general_ledger
 module=ap.pl
 action=add
 
 [General Ledger--DATEV - Export Assistent]
+ACCESS=datev_export
 module=datev.pl
 action=export
 
@@ -206,23 +239,27 @@ submenu=1
 
 
 [General Ledger--Reports--AR Aging]
+ACCESS=general_ledger
 module=rp.pl
 action=report
 report=ar_aging
 
 
 [General Ledger--Reports--AP Aging]
+ACCESS=general_ledger
 module=rp.pl
 action=report
 report=ap_aging
 
 [General Ledger--Reports--Journal]
+ACCESS=general_ledger
 module=gl.pl
 action=search
 
 
 
 [Cash]
+ACCESS=cash
 
 [Cash--Receipt]
 module=cp.pl
@@ -239,6 +276,7 @@ vc=vendor
 # Wird selten eingesetzt und ist Fehlerbehaftet !!!
 # Stimmt nicht! Udo Spallek
 [Cash--Reconciliation]
+ACCESS=cash
 module=rc.pl
 action=reconciliation
 
@@ -262,79 +300,92 @@ report=payments
 [Reports]
 
 [Reports--Chart of Accounts]
+ACCESS=report
 module=ca.pl
 action=chart_of_accounts
 
 [Reports--Trial Balance]
+ACCESS=report
 module=rp.pl
 action=report
 report=trial_balance
 
 [Reports--Income Statement]
+ACCESS=report
 module=rp.pl
 action=report
 report=income_statement
 
 [Reports--BWA]
+ACCESS=report
 module=rp.pl
 action=report
 report=bwa
 
 [Reports--Balance Sheet]
+ACCESS=report
 module=rp.pl
 action=report
 report=balance_sheet
 
 [Reports--UStVa]
+ACCESS=advance_turnover_tax_return
 module=ustva.pl
 action=report
 
 [Batch Printing]
 
-
 [Batch Printing--Sales Invoices]
+ACCESS=invoice_edit
 module=bp.pl
 action=search
 vc=customer
 type=invoice
 
 [Batch Printing--Sales Orders]
+ACCESS=sales_order_edit
 module=bp.pl
 action=search
 vc=customer
 type=sales_order
 
 [Batch Printing--Quotations]
+ACCESS=sales_quotation_edit
 module=bp.pl
 action=search
 vc=customer
 type=sales_quotation
 
 [Batch Printing--Packing Lists]
+ACCESS=invoice_edit | sales_order_edit
 module=bp.pl
 action=search
 vc=customer
 type=packing_list
 
 [Batch Printing--Purchase Orders]
+ACCESS=purchase_order_edit
 module=bp.pl
 action=search
 vc=vendor
 type=purchase_order
 
 [Batch Printing--RFQs]
+ACCESS=request_quotation_edit
 module=bp.pl
 action=search
 vc=vendor
 type=request_quotation
 
 [Batch Printing--Checks]
+ACCESS=cash
 module=bp.pl
 action=search
 vc=vendor
 type=check
 
 [Batch Printing--Receipts]
+ACCESS=cash
 module=bp.pl
 action=search
 vc=customer
@@ -342,6 +393,7 @@ type=receipt
 
 
 [System]
+ACCESS=config
 
 [System--Ranges of numbers and default accounts]
 module=am.pl
diff --git a/sql/auth_db.sql b/sql/auth_db.sql
new file mode 100644 (file)
index 0000000..53a6af4
--- /dev/null
@@ -0,0 +1,67 @@
+CREATE SCHEMA auth;
+
+CREATE SEQUENCE auth.user_id_seq;
+CREATE SEQUENCE auth.group_id_seq;
+
+CREATE TABLE auth."user" (
+  id integer NOT NULL DEFAULT nextval('auth.user_id_seq'),
+  login text UNIQUE NOT NULL,
+  password text,
+
+  PRIMARY KEY (id)
+);
+
+CREATE TABLE auth."group" (
+  id integer NOT NULL DEFAULT nextval('auth.group_id_seq'),
+  name text UNIQUE NOT NULL,
+  description text,
+
+  PRIMARY KEY (id)
+);
+
+CREATE TABLE auth.user_group (
+  user_id integer NOT NULL,
+  group_id integer NOT NULL,
+
+  FOREIGN KEY (user_id) REFERENCES auth."user" (id),
+  FOREIGN KEY (group_id) REFERENCES auth."group" (id)
+);
+
+CREATE TABLE auth.group_rights (
+  group_id integer NOT NULL,
+  "right" text NOT NULL,
+  granted boolean NOT NULL,
+
+  FOREIGN KEY (group_id) REFERENCES auth."group" (id)
+);
+
+CREATE TABLE auth.user_config (
+  user_id integer NOT NULL,
+  cfg_key text NOT NULL,
+  cfg_value text,
+
+  FOREIGN KEY (user_id) REFERENCES auth."user" (id)
+);
+
+CREATE TABLE auth.schema_info (
+  tag text,
+  login text,
+  itime timestamp DEFAULT now(),
+  PRIMARY KEY (tag)
+);
+
+CREATE TABLE auth.session (
+  id text,
+  ip_address inet,
+  mtime timestamp,
+
+  PRIMARY KEY (id)
+);
+
+CREATE TABLE auth.session_content (
+  session_id text,
+  sess_key text,
+  sess_value text,
+
+  FOREIGN KEY (session_id) REFERENCES auth.session (id)
+);
index 196ef8f..cc37bee 100644 (file)
@@ -8,6 +8,10 @@
 
   <h2>Administration</h2>
 
+  [% IF error_message %]
+  <p><span class="error_message">[% error_message %]</span></p>
+  [% END %]
+
   <form method="post" action="admin.pl">
 
    <table>
index ad32c48..43f5be2 100644 (file)
@@ -8,6 +8,10 @@
 
   <h2><translate>Administration</translate></h2>
 
+  [% IF error_message %]
+  <p><span class="error_message">[% error_message %]</span></p>
+  [% END %]
+
   <form method="post" action="admin.pl">
 
    <table>
index 5fc9b76..2ff3799 100644 (file)
@@ -77,8 +77,7 @@
 
    </table>
 
-   <input name="callback" type="hidden" value="admin.pl?action=list_users&rpw=[% HTML.url(rpw) %]">
-   <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
+   <input name="callback" type="hidden" value="admin.pl?action=list_users">
    <input type="hidden" name="nextsub" value="backup_dataset_start">
    <input type="hidden" name="back_nextsub" value="list_users">
 
index 1d50653..7f2d34b 100644 (file)
@@ -5,7 +5,6 @@
  <p>Die Datenbanksicherung wurde per Email an [% HTML.escape(to) %] verschickt.</p>
 
  <form method="post" action="admin.pl">
-  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
   <input type="hidden" name="nextsub" value="list_users">
   <input type="submit" name="action" value="Weiter">
  </form>
index 71d5577..f76c1e5 100644 (file)
@@ -5,7 +5,6 @@
  <p><translate>The dataset backup has been sent via email to [% HTML.escape(to) %].</translate></p>
 
  <form method="post" action="admin.pl">
-  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
   <input type="hidden" name="nextsub" value="list_users">
   <input type="submit" name="action" value="<translate>Continue</translate>">
  </form>
index 23f674c..d795a9b 100644 (file)
@@ -77,8 +77,7 @@
 
    </table>
 
-   <input name="callback" type="hidden" value="admin.pl?action=list_users&rpw=[% HTML.url(rpw) %]">
-   <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
+   <input name="callback" type="hidden" value="admin.pl?action=list_users">
    <input type="hidden" name="nextsub" value="backup_dataset_start">
    <input type="hidden" name="back_nextsub" value="list_users">
 
diff --git a/templates/webpages/admin/change_admin_password_de.html b/templates/webpages/admin/change_admin_password_de.html
deleted file mode 100644 (file)
index 39469ae..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-[% USE HTML %]<body class="admin">
-
- <h2>Administratorpasswort ändern</h2>
-
- <form method="post" action="admin.pl">
-
-  <table>
-   <tr>
-    <td><b>Passwort</b></td>
-    <td><input type="password" name="password" size="8"></td>
-   </tr>
-
-   <tr>
-    <td><b>Passwort wiederholen</b></td>
-    <td><input type="password" name="password_again" size="8"></td>
-   </tr>
-  </table>
-
-  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
-
-  <p><input type="submit" class="submit" name="action" value="Passwort ändern"></p>
-
- </form>
-
-</body>
-</html>
diff --git a/templates/webpages/admin/change_admin_password_master.html b/templates/webpages/admin/change_admin_password_master.html
deleted file mode 100644 (file)
index fb41f9f..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-[% USE HTML %]<body class="admin">
-
- <h2><translate>Change Admin Password</translate></h2>
-
- <form method="post" action="admin.pl">
-
-  <table>
-   <tr>
-    <td><b><translate>Password</translate></b></td>
-    <td><input type="password" name="password" size="8"></td>
-   </tr>
-
-   <tr>
-    <td><b><translate>Repeat the password</translate></b></td>
-    <td><input type="password" name="password_again" size="8"></td>
-   </tr>
-  </table>
-
-  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
-
-  <p><input type="submit" class="submit" name="action" value="<translate>Change Password</translate>"></p>
-
- </form>
-
-</body>
-</html>
diff --git a/templates/webpages/admin/check_auth_database_de.html b/templates/webpages/admin/check_auth_database_de.html
new file mode 100644 (file)
index 0000000..2a1187a
--- /dev/null
@@ -0,0 +1,61 @@
+[% USE HTML %]<body>
+
+ <div class="listtop">[% title %]</div>
+
+ <form method="post" action="admin.pl">
+
+  <p>
+   Die Datenbank zur Verwaltung der Benutzerdaten und zur Authentifizierung existiert nicht. Sie k&ouml;nnen Lx-Office diese Datenbank mit den folgenden Parametern anlegen lassen:
+  </p>
+
+  <table border="0">
+   <tr>
+    <td>Datenbankcomputer:</td>
+    <td>[% HTML.escape(db_host) %]</td>
+   </tr>
+   <tr>
+    <td>Port:</td>
+    <td>[% HTML.escape(db_port) %]</td>
+   </tr>
+   <tr>
+    <td>Benutzername:</td>
+    <td>[% HTML.escape(db_user) %]</td>
+   </tr>
+   <tr>
+    <td>Datenbankname:</td>
+    <td>[% HTML.escape(db_db) %]</td>
+   </tr>
+  </table>
+
+  <p>
+   Bitte geben Sie den Namen der Datenbank an, die als Vorlage f&uuml;r die neue Datenbank benutzt wird:
+  </p>
+
+  <p>Datenbankvorlage: <input name="db_template" value="template0"></p>
+
+  <p>
+   Falls der oben genannte Datenbankbenutzer nicht die Berechtigung zum Anlegen neuer Datenbanken hat, so k&ouml;nnen Sie hier den Namen und das Passwort des Datenbankadministratoraccounts angeben:
+  </p>
+
+  <table border="0"
+   <tr>
+    <td>Datenbankadministrator:</td>
+    <td><input name="db_superuser"></td>
+   </tr>
+
+   <tr>
+    <td>Passwort:</td>
+    <td><input type="password" name="db_superuser_password"></td>
+   </tr>
+  </table>
+
+  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
+  <input type="hidden" name="action" value="create_auth_db">
+
+  <input type="submit" class="submit" value="Datenbank anlegen">
+  <input type="button" class="submit" onclick="history.back()" value="Zurück">
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/check_auth_database_master.html b/templates/webpages/admin/check_auth_database_master.html
new file mode 100644 (file)
index 0000000..d014b0d
--- /dev/null
@@ -0,0 +1,66 @@
+[% USE HTML %]<body>
+
+ <div class="listtop">[% title %]</div>
+
+ <form method="post" action="admin.pl">
+
+  <p>
+   <translate>The database for user management and authentication does
+    not exist. You can create let Lx-Office create it with the
+    following parameters:</translate>
+  </p>
+
+  <table border="0">
+   <tr>
+    <td><translate>Host</translate>:</td>
+    <td>[% HTML.escape(db_host) %]</td>
+   </tr>
+   <tr>
+    <td><translate>Port</translate>:</td>
+    <td>[% HTML.escape(db_port) %]</td>
+   </tr>
+   <tr>
+    <td><translate>User name</translate>:</td>
+    <td>[% HTML.escape(db_user) %]</td>
+   </tr>
+   <tr>
+    <td><translate>Database name</translate>:</td>
+    <td>[% HTML.escape(db_db) %]</td>
+   </tr>
+  </table>
+
+  <p>
+   <translate>Please enter the name of the database that will be
+    used as the template for the new database:</translate>
+  </p>
+
+  <p><translate>Template database</translate>: <input name="db_template" value="template0"></p>
+
+  <p>
+   <translate>If the database user listed above does not have the
+    right to create a database then enter the name and password of the
+    superuser below:</translate>
+  </p>
+
+  <table border="0"
+   <tr>
+    <td><translate>Superuser name</translate>:</td>
+    <td><input name="db_superuser"></td>
+   </tr>
+
+   <tr>
+    <td><translate>Password</translate>:</td>
+    <td><input type="password" name="db_superuser_password"></td>
+   </tr>
+  </table>
+
+  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
+  <input type="hidden" name="action" value="create_auth_db">
+
+  <input type="submit" class="submit" value="<translate>Create Dataset</translate>">
+  <input type="button" class="submit" onclick="history.back()" value="<translate>Back</translate>">
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/check_auth_tables_de.html b/templates/webpages/admin/check_auth_tables_de.html
new file mode 100644 (file)
index 0000000..79579ba
--- /dev/null
@@ -0,0 +1,43 @@
+[% USE HTML %]<body>
+
+ <div class="listtop">[% title %]</div>
+
+ <p>
+  Die Tabellen zum Speichern der Benutzerdaten und zur Benutzerauthentifizierung wurden nicht gefunden. Sie werden in der folgenden Datenbank angelegt:
+ </p>
+
+ <table border="0">
+  <tr>
+   <td>Datenbankcomputer:</td>
+   <td>[% HTML.escape(db_host) %]</td>
+  </tr>
+  <tr>
+   <td>Port:</td>
+   <td>[% HTML.escape(db_port) %]</td>
+  </tr>
+  <tr>
+   <td>Benutzername:</td>
+   <td>[% HTML.escape(db_user) %]</td>
+  </tr>
+  <tr>
+   <td>Datenbankname:</td>
+   <td>[% HTML.escape(db_db) %]</td>
+  </tr>
+ </table>
+
+ <p>
+  Wenn Sie einen der Parameter &auml;ndern wollen, so dr&uuml;cken Sie auf den &quot;Zur&uuml;ck&quot;-Button, bearbeiten Sie die Datei &quot;config/authentication.pl&quot;, und melden Sie sich erneut im Administrationsbereich an.
+ </p>
+
+ <form method="post" action="admin.pl">
+
+  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
+  <input type="hidden" name="action" value="create_auth_tables">
+
+  <input type="submit" class="submit" value="Tabellen anlegen">
+  <input type="button" class="submit" onclick="history.back()" value="Zurück">
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/check_auth_tables_master.html b/templates/webpages/admin/check_auth_tables_master.html
new file mode 100644 (file)
index 0000000..5ce296e
--- /dev/null
@@ -0,0 +1,48 @@
+[% USE HTML %]<body>
+
+ <div class="listtop">[% title %]</div>
+
+ <p>
+  <translate>The tables for user management and authentication do not
+   exist. They will be created in the next step in the following
+   database:</translate>
+ </p>
+
+ <table border="0">
+  <tr>
+   <td><translate>Host</translate>:</td>
+   <td>[% HTML.escape(db_host) %]</td>
+  </tr>
+  <tr>
+   <td><translate>Port</translate>:</td>
+   <td>[% HTML.escape(db_port) %]</td>
+  </tr>
+  <tr>
+   <td><translate>User name</translate>:</td>
+   <td>[% HTML.escape(db_user) %]</td>
+  </tr>
+  <tr>
+   <td><translate>Database name</translate>:</td>
+   <td>[% HTML.escape(db_db) %]</td>
+  </tr>
+ </table>
+
+ <p>
+  <translate>If you want to change any of these parameters then press
+   the &quot;Back&quot; button, edit the file
+   &quot;config/authentication.pl&quot; and login into the admin module
+   again.</translate>
+ </p>
+
+ <form method="post" action="admin.pl">
+
+  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
+  <input type="hidden" name="action" value="create_auth_tables">
+
+  <input type="submit" class="submit" value="<translate>Create tables</translate>">
+  <input type="button" class="submit" onclick="history.back()" value="<translate>Back</translate>">
+
+ </form>
+
+</body>
+</html>
index 55ff4ea..8bb5550 100644 (file)
@@ -42,8 +42,7 @@
    <input type="hidden" name="dbpasswd"  value="[% HTML.escape(dbpasswd) %]">
    <input type="hidden" name="dbdefault" value="[% HTML.escape(dbdefault) %]">
 
-   <input type="hidden" name="callback" value="admin.pl?action=list_users&rpw=[% HTML.url(rpw) %]">
-   <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
+   <input type="hidden" name="callback" value="admin.pl?action=list_users">
 
    <input type="hidden" name="nextsub" value="dbcreate">
 
index 5d480cc..a994539 100644 (file)
@@ -42,8 +42,7 @@
    <input type="hidden" name="dbpasswd"  value="[% HTML.escape(dbpasswd) %]">
    <input type="hidden" name="dbdefault" value="[% HTML.escape(dbdefault) %]">
 
-   <input type="hidden" name="callback" value="admin.pl?action=list_users&rpw=[% HTML.url(rpw) %]">
-   <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
+   <input type="hidden" name="callback" value="admin.pl?action=list_users">
 
    <input type="hidden" name="nextsub" value="dbcreate">
 
diff --git a/templates/webpages/admin/create_standard_group_ask_de.html b/templates/webpages/admin/create_standard_group_ask_de.html
new file mode 100644 (file)
index 0000000..9b446f5
--- /dev/null
@@ -0,0 +1,49 @@
+[% USE HTML %]<body>
+
+ <div class="listtop">[% title %]</div>
+
+ <form method="post" action="admin.pl">
+
+  <p>
+
+   Lx-Office wurde auf eine gruppenbasierte Benutzerzugriffsverwaltung umgestellt.
+
+   Sie m&uuml;ssen mindestens eine Benutzergruppe anlegen, ihr Zugriff auf die verschiedenen Funktionsbereiche von Lx-Office gew&auml;hren und Benutzer dieser Gruppe zuordnen.
+
+   Andernfalls haben alle Benutzer nur Zugriff auf ihre Benutzereinstellungen.
+
+  </p>
+
+  <p>
+
+   Im Rahmen dieser Benutzerdatenmigration kann Lx-Office eine solche Gruppe f&uuml;r Sie anlegen und allen Benutzern Zugriff auf alle Lx-Office-Funktionen gew&auml;hren.
+
+   Dieses entspricht dem Verhalten von Lx-Office vor Version 2.4.4.
+
+  </p>
+
+  <p>
+
+   Alternativ k&ouml;nnen Sie diesen Schritt &uuml;berspringen und selber Gruppen anlegen.
+
+  </p>
+
+  <p>
+
+   Wollen Sie, dass Lx-Office eine Gruppe mit Zugriff auf alle Funktionen anlegt?
+
+   Diese Gruppe wird &quot;Vollzugriff&quot; genannt.
+
+  </p>
+
+  <input type="hidden" name="action" value="dispatcher">
+
+  <p>
+   <input type="submit" class="submit" name="action_create_standard_group" value="Ja">
+   <input type="submit" class="submit" name="action_dont_create_standard_group" value="Nein">
+  </p>
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/create_standard_group_ask_master.html b/templates/webpages/admin/create_standard_group_ask_master.html
new file mode 100644 (file)
index 0000000..1513b38
--- /dev/null
@@ -0,0 +1,57 @@
+[% USE HTML %]<body>
+
+ <div class="listtop">[% title %]</div>
+
+ <form method="post" action="admin.pl">
+
+  <p>
+
+   <translate>Lx-Office has been switched to group-based access
+    restrictions.</translate>
+
+   <translate>You have to create at least one group, grant it access
+    to Lx-Office's functions and assign users to it.</translate>
+
+   <translate>Otherwise all users will only have access to their own
+    settings.</translate>
+
+  </p>
+
+  <p>
+
+   <translate>During this user migration Lx-Office can create such a
+    group for you and grant all users access to all of Lx-Office's
+    functions.</translate>
+
+   <translate>This corresponds to Lx-Office's behavior prior to
+    version 2.4.4.</translate>
+
+  </p>
+
+  <p>
+
+   <translate>Alternatively you can skip this step and create groups
+    yourself.</translate>
+
+  </p>
+
+  <p>
+
+   <translate>Do you want Lx-Office to create a group for access to
+    all functions?</translate>
+
+   <translate>This group will be called &quot;Full Access&quot;.</translate>
+
+  </p>
+
+  <input type="hidden" name="action" value="dispatcher">
+
+  <p>
+   <input type="submit" class="submit" name="action_create_standard_group" value="<translate>Yes</translate>">
+   <input type="submit" class="submit" name="action_dont_create_standard_group" value="<translate>No</translate>">
+  </p>
+
+ </form>
+
+</body>
+</html>
index 94796d7..9875604 100644 (file)
@@ -47,8 +47,7 @@
        </tr>
       </table>
 
-      <input name="callback" type="hidden" value="admin.pl?action=list_users&rpw=[% HTML.url(rpw) %]">
-      <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
+      <input name="callback" type="hidden" value="admin.pl?action=list_users">
 
       <br>
 
index a1306f0..8b098c2 100644 (file)
@@ -47,8 +47,7 @@
        </tr>
       </table>
 
-      <input name="callback" type="hidden" value="admin.pl?action=list_users&rpw=[% HTML.url(rpw) %]">
-      <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
+      <input name="callback" type="hidden" value="admin.pl?action=list_users">
 
       <br>
 
index ab62b1b..756460f 100644 (file)
@@ -6,7 +6,6 @@
 
    <p>Die Datenbank [% HTML.escape(db) %] wurde erfolgreich angelegt.</p>
 
-   <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
    <input type="hidden" name="nextsub" value="list_users">
 
    <p><input type="submit" class="submit" name="action" value="Weiter"></p>
index a5894b4..d15a2f7 100644 (file)
@@ -6,7 +6,6 @@
 
    <p><translate>The dataset [% HTML.escape(db) %] has been successfully created.</translate></p>
 
-   <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
    <input type="hidden" name="nextsub" value="list_users">
 
    <p><input type="submit" class="submit" name="action" value="<translate>Continue</translate>"></p>
index d827356..c62eb51 100644 (file)
@@ -6,7 +6,6 @@
 
    <p>Die Datenbank [% HTML.escape(db) %] wurde erfolgreich gel&ouml;scht.</p>
 
-   <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
    <input type="hidden" name="nextsub" value="list_users">
 
    <p><input type="submit" class="submit" name="action" value="Weiter"></p>
index 2c8d485..c744e5d 100644 (file)
@@ -6,7 +6,6 @@
 
    <p><translate>The database [% HTML.escape(db) %] has been successfully deleted.</translate></p>
 
-   <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
    <input type="hidden" name="nextsub" value="list_users">
 
    <p><input type="submit" class="submit" name="action" value="<translate>Continue</translate>"></p>
index d65ee3d..0764800 100644 (file)
@@ -11,7 +11,6 @@
 
 <form method="post" action="admin.pl">
  <input type="hidden" name="nextsub" value="list_users">
- <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
 
  <input type="submit" name="action" value="Weiter">
 </form>
index c9a5a1b..7884201 100644 (file)
@@ -11,7 +11,6 @@
 
 <form method="post" action="admin.pl">
  <input type="hidden" name="nextsub" value="list_users">
- <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
 
  <input type="submit" name="action" value="<translate>Continue</translate>">
 </form>
index 696d0cc..ceb91de 100644 (file)
@@ -18,9 +18,8 @@
   <input type="hidden" name="dbpasswd"  value="[% HTML.escape(dbpasswd) %]">
   <input type="hidden" name="dbdefault" value="[% HTML.escape(dbdefault) %]">
 
-  <input name="callback" type="hidden" value="admin.pl?action=list_users&rpw=[% HTML.url(rpw) %]">
+  <input name="callback" type="hidden" value="admin.pl?action=list_users">
 
-  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
 
   <input type="hidden" name="nextsub" value="dbdelete">
 
index afb4b88..e84509d 100644 (file)
@@ -21,9 +21,8 @@
   <input type="hidden" name="dbpasswd"  value="[% HTML.escape(dbpasswd) %]">
   <input type="hidden" name="dbdefault" value="[% HTML.escape(dbdefault) %]">
 
-  <input name="callback" type="hidden" value="admin.pl?action=list_users&rpw=[% HTML.url(rpw) %]">
+  <input name="callback" type="hidden" value="admin.pl?action=list_users">
 
-  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
 
   <input type="hidden" name="nextsub" value="dbdelete">
 
diff --git a/templates/webpages/admin/delete_group_confirm_de.html b/templates/webpages/admin/delete_group_confirm_de.html
new file mode 100644 (file)
index 0000000..01108f2
--- /dev/null
@@ -0,0 +1,19 @@
+[% USE HTML %]<body>
+ <form name="Form" method="post" action="admin.pl">
+
+
+  <input type="hidden" name="group_id" value="[% HTML.escape(id) %]">
+  <input type="hidden" name="confirmed" value="1">
+
+  <div class="listtop">Gruppe l&ouml;schen</div>
+
+  <p>Wollen Sie wirklich diese Gruppe l&ouml;schen: [% name %] ?</p>
+
+  <input type="hidden" name="delete_nextsub" value="delete_group">
+  <input type="submit" class="submit" name="action" value="Löschen">
+  <button type="button" onclick="history.back()">Zurück</button>
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/delete_group_confirm_master.html b/templates/webpages/admin/delete_group_confirm_master.html
new file mode 100644 (file)
index 0000000..ac7e63e
--- /dev/null
@@ -0,0 +1,19 @@
+[% USE HTML %]<body>
+ <form name="Form" method="post" action="admin.pl">
+
+
+  <input type="hidden" name="group_id" value="[% HTML.escape(id) %]">
+  <input type="hidden" name="confirmed" value="1">
+
+  <div class="listtop"><translate>Delete group</translate></div>
+
+  <p><translate>Do you really want to delete this group:</translate> [% name %] ?</p>
+
+  <input type="hidden" name="delete_nextsub" value="delete_group">
+  <input type="submit" class="submit" name="action" value="<translate>Delete</translate>">
+  <button type="button" onclick="history.back()"><translate>Back</translate></button>
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/edit_group_de.html b/templates/webpages/admin/edit_group_de.html
new file mode 100644 (file)
index 0000000..ec0441b
--- /dev/null
@@ -0,0 +1,114 @@
+[% USE HTML %]<body>
+ <form name="Form" method="post" action="admin.pl">
+
+  <input type="hidden" name="group_id" value="[% HTML.escape(group_id) %]">
+
+  <input type="hidden" name="back_nextsub" value="edit_groups">
+
+  [% IF message %]
+  <p>[% message %]</p>
+  [% END %]
+
+  <div class="listtop">Gruppe bearbeiten [% HTML.escape(name) %]</div>
+
+  <table width="100%">
+   <tr>
+    <td>
+     <table>
+      <tr class="listheading">
+       <td><b>Benutzer in<br>dieser Gruppe</b></td>
+       <td>&nbsp;</td>
+       <td><b>Benutzer nicht in dieser Gruppe</b></td>
+      </tr>
+
+      <tr>
+       <td valign="center">
+        <select name="user_id_in_group" size="10">
+         [% FOREACH user = USERS_IN_GROUP %]<option value="[% HTML.escape(user.id) %]">[% HTML.escape(user.login) %]</option>[% END %]
+        </select>
+       </td>
+
+       <td valign="center">
+        <input type="submit" class="submit" name="action" value="Zu Gruppe hinzufügen">
+        <br>
+        <br>
+        <input type="submit" class="submit" name="action" value="Aus Gruppe entfernen">
+       </td>
+
+       <td valign="center">
+        <select name="user_id_not_in_group" size="10">
+         [% FOREACH user = USERS_NOT_IN_GROUP %]<option value="[% HTML.escape(user.id) %]">[% HTML.escape(user.login) %]</option>[% END %]
+        </select>
+       </td>
+      </tr>
+
+      <tr>
+       <td>
+        <input type="submit" class="submit" name="action" value="Zurück">
+       </td>
+      </tr>
+     </table>
+
+     <hr>
+
+     <table>
+      <tr class="listheading">
+       <td colspan="2">Rechte bearbeiten</td>
+      </tr>
+
+      [% FOREACH right = RIGHTS %]
+      <tr>
+       <td>
+        [% IF right.is_section %]
+        <i>[% right.description %]</i>
+        [% ELSE %]
+        <input type="checkbox" name="[% HTML.escape(right.right) %]_granted" id="[% HTML.escape(right.right) %]_granted" [% IF right.granted %]checked[% END %]>
+        <label for="[% HTML.escape(right.right) %]_granted">[% IF right.description %][% right.description %][% ELSE %]<i>[% HTML.escape(right.right) %]</i>[% END %]</label>
+        [% END %]
+       </td>
+      </tr>
+      [% END %]
+
+      <tr>
+       <td>
+        <input type="hidden" name="save_nextsub" value="save_group">
+        <input type="submit" class="submit" name="action" value="Speichern">
+        &nbsp;
+        <input type="submit" class="submit" name="action" value="Zurück">
+       </td>
+      </tr>
+     </table>
+
+     <hr>
+
+     <table>
+      <tr class="listheading">
+       <td colspan="2">Gruppe umbenennen</td>
+      </tr>
+
+      <tr>
+       <td>Name:</td>
+       <td><input name="name" maxlength="50" value="[% HTML.escape(name) %]"></td>
+      </tr>
+
+      <tr>
+       <td>Beschreibung:</td>
+       <td><input name="description" value="[% HTML.escape(description) %]"></td>
+      </tr>
+
+      <tr>
+       <td>
+        <input type="hidden" name="save_nextsub" value="save_group">
+        <input type="submit" class="submit" name="action" value="Speichern">
+        &nbsp;
+        <input type="submit" class="submit" name="action" value="Zurück">
+       </td>
+      </tr>
+     </table>
+    </td>
+   </tr>
+  </table>
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/edit_group_master.html b/templates/webpages/admin/edit_group_master.html
new file mode 100644 (file)
index 0000000..7e7be7e
--- /dev/null
@@ -0,0 +1,114 @@
+[% USE HTML %]<body>
+ <form name="Form" method="post" action="admin.pl">
+
+  <input type="hidden" name="group_id" value="[% HTML.escape(group_id) %]">
+
+  <input type="hidden" name="back_nextsub" value="edit_groups">
+
+  [% IF message %]
+  <p>[% message %]</p>
+  [% END %]
+
+  <div class="listtop"><translate>Edit group </translate> [% HTML.escape(name) %]</div>
+
+  <table width="100%">
+   <tr>
+    <td>
+     <table>
+      <tr class="listheading">
+       <td><b><translate>Users in<br>this group</translate></b></td>
+       <td>&nbsp;</td>
+       <td><b><translate>Users not in this group</translate></b></td>
+      </tr>
+
+      <tr>
+       <td valign="center">
+        <select name="user_id_in_group" size="10">
+         [% FOREACH user = USERS_IN_GROUP %]<option value="[% HTML.escape(user.id) %]">[% HTML.escape(user.login) %]</option>[% END %]
+        </select>
+       </td>
+
+       <td valign="center">
+        <input type="submit" class="submit" name="action" value="<translate>Add to group</translate>">
+        <br>
+        <br>
+        <input type="submit" class="submit" name="action" value="<translate>Remove from group</translate>">
+       </td>
+
+       <td valign="center">
+        <select name="user_id_not_in_group" size="10">
+         [% FOREACH user = USERS_NOT_IN_GROUP %]<option value="[% HTML.escape(user.id) %]">[% HTML.escape(user.login) %]</option>[% END %]
+        </select>
+       </td>
+      </tr>
+
+      <tr>
+       <td>
+        <input type="submit" class="submit" name="action" value="<translate>Back</translate>">
+       </td>
+      </tr>
+     </table>
+
+     <hr>
+
+     <table>
+      <tr class="listheading">
+       <td colspan="2"><translate>Edit rights</translate></td>
+      </tr>
+
+      [% FOREACH right = RIGHTS %]
+      <tr>
+       <td>
+        [% IF right.is_section %]
+        <i>[% right.description %]</i>
+        [% ELSE %]
+        <input type="checkbox" name="[% HTML.escape(right.right) %]_granted" id="[% HTML.escape(right.right) %]_granted" [% IF right.granted %]checked[% END %]>
+        <label for="[% HTML.escape(right.right) %]_granted">[% IF right.description %][% right.description %][% ELSE %]<i>[% HTML.escape(right.right) %]</i>[% END %]</label>
+        [% END %]
+       </td>
+      </tr>
+      [% END %]
+
+      <tr>
+       <td>
+        <input type="hidden" name="save_nextsub" value="save_group">
+        <input type="submit" class="submit" name="action" value="<translate>Save</translate>">
+        &nbsp;
+        <input type="submit" class="submit" name="action" value="<translate>Back</translate>">
+       </td>
+      </tr>
+     </table>
+
+     <hr>
+
+     <table>
+      <tr class="listheading">
+       <td colspan="2"><translate>Rename the group</translate></td>
+      </tr>
+
+      <tr>
+       <td><translate>Name</translate>:</td>
+       <td><input name="name" maxlength="50" value="[% HTML.escape(name) %]"></td>
+      </tr>
+
+      <tr>
+       <td><translate>Description</translate>:</td>
+       <td><input name="description" value="[% HTML.escape(description) %]"></td>
+      </tr>
+
+      <tr>
+       <td>
+        <input type="hidden" name="save_nextsub" value="save_group">
+        <input type="submit" class="submit" name="action" value="<translate>Save</translate>">
+        &nbsp;
+        <input type="submit" class="submit" name="action" value="<translate>Back</translate>">
+       </td>
+      </tr>
+     </table>
+    </td>
+   </tr>
+  </table>
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/edit_group_membership_de.html b/templates/webpages/admin/edit_group_membership_de.html
new file mode 100644 (file)
index 0000000..05f2167
--- /dev/null
@@ -0,0 +1,46 @@
+[% USE HTML %][% USE LxERP %]<body>
+
+ <div class="listtop">Gruppenmitgliedschaften bearbeiten</div>
+
+ <p>W&auml;hlen Sie diejenigen Checkboxen aus, die die Benutzer zu den gew&uuml;schten Gruppen zuordnen.</p>
+
+ <form action="admin.pl">
+
+  <p>
+   <table border="0">
+    [% SET row_is_odd = '1' %][% USE users_it = Iterator(USERS) %][% FOREACH user = users_it %]
+
+    [% IF user.repeat_headings %]
+    <tr>
+     <th class="listheading" valign="bottom">Anmeldung</th>
+     <th class="listheading" valign="bottom">Name</th>
+     [% FOREACH column = HEADINGS %]<th class="listheading" valign="bottom" align="center">[% LxERP.turn90(column.title) %]</th>
+     [% END %]
+    </tr>
+    [% END %]
+
+    <tr class="listrow[% IF row_is_odd %]1[% SET row_is_odd = '0' %][% ELSE %]0[% SET row_is_odd = '1' %][% END %]">
+     <td valign="center">[% HTML.escape(user.login) %]</td>
+     <td valign="center">[% HTML.escape(user.name) %]</td>
+     [% FOREACH group = user.GROUPS %]
+     <td valign="center" align="center">
+      <input type="checkbox" name="u_[% HTML.escape(user.id) %]_g_[% HTML.escape(group.id) %]" [% IF group.is_member %]checked[% END %]>
+     </td>
+     [% END %]
+    </tr>
+    [% END %]
+   </table>
+  </p>
+
+  <input type="hidden" name="save_nextsub" value="save_group_membership">
+  <input type="hidden" name="back_nextsub" value="edit_groups">
+
+  <p>
+   <input type="submit" class="submit" name="action" value="Speichern">
+   <input type="submit" class="submit" name="action" value="Zurück">
+  </p>
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/edit_group_membership_master.html b/templates/webpages/admin/edit_group_membership_master.html
new file mode 100644 (file)
index 0000000..7acc53a
--- /dev/null
@@ -0,0 +1,47 @@
+[% USE HTML %][% USE LxERP %]<body>
+
+ <div class="listtop"><translate>Edit group membership</translate></div>
+
+ <p><translate>Select the checkboxes that match users to the groups
+   they should belong to.</translate></p>
+
+ <form action="admin.pl">
+
+  <p>
+   <table border="0">
+    [% SET row_is_odd = '1' %][% USE users_it = Iterator(USERS) %][% FOREACH user = users_it %]
+
+    [% IF user.repeat_headings %]
+    <tr>
+     <th class="listheading" valign="bottom"><translate>Login</translate></th>
+     <th class="listheading" valign="bottom"><translate>Name</translate></th>
+     [% FOREACH column = HEADINGS %]<th class="listheading" valign="bottom" align="center">[% LxERP.turn90(column.title) %]</th>
+     [% END %]
+    </tr>
+    [% END %]
+
+    <tr class="listrow[% IF row_is_odd %]1[% SET row_is_odd = '0' %][% ELSE %]0[% SET row_is_odd = '1' %][% END %]">
+     <td valign="center">[% HTML.escape(user.login) %]</td>
+     <td valign="center">[% HTML.escape(user.name) %]</td>
+     [% FOREACH group = user.GROUPS %]
+     <td valign="center" align="center">
+      <input type="checkbox" name="u_[% HTML.escape(user.id) %]_g_[% HTML.escape(group.id) %]" [% IF group.is_member %]checked[% END %]>
+     </td>
+     [% END %]
+    </tr>
+    [% END %]
+   </table>
+  </p>
+
+  <input type="hidden" name="save_nextsub" value="save_group_membership">
+  <input type="hidden" name="back_nextsub" value="edit_groups">
+
+  <p>
+   <input type="submit" class="submit" name="action" value="<translate>Save</translate>">
+   <input type="submit" class="submit" name="action" value="<translate>Back</translate>">
+  </p>
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/edit_groups_de.html b/templates/webpages/admin/edit_groups_de.html
new file mode 100644 (file)
index 0000000..4364843
--- /dev/null
@@ -0,0 +1,80 @@
+[% USE HTML %]<body>
+ <form name="Form" method="post" action="admin.pl">
+
+
+  [% IF message %]
+  <p>[% message %]</p>
+  [% END %]
+
+  <div class="listtop">Gruppen bearbeiten</div>
+
+  <br>
+
+  <div class="listheading">Gruppen bearbeiten und l&ouml;schen</div>
+
+  [% IF num_groups %]
+  <p>
+   <select name="group_id" size="10">
+    [% FOREACH row = GROUPS %]
+    <option value="[% HTML.escape(row.id) %]">[% HTML.escape(row.name) %][% IF row.description %] ([% HTML.escape(row.description) %])[% END %]</option>
+    [% END %]
+   </select>
+  </p>
+  [% ELSE %]
+  <p>Es wurden noch keine Gruppen angelegt.</p>
+  [% END %]
+
+  <p>
+   [% IF num_groups %]
+   <input type="hidden" name="edit_nextsub" value="edit_group">
+   <input type="hidden" name="delete_nextsub" value="delete_group">
+   <input type="submit" class="submit" name="action" value="Bearbeiten">
+   <input type="submit" class="submit" name="action" value="Löschen">
+   [% END %]
+   <input type="hidden" name="back_nextsub" value="list_users">
+   <input type="submit" class="submit" name="action" value="Zurück">
+  </p>
+ </form>
+
+ <hr size="2" noshade>
+
+ <div class="listheading">Grouppenzugeh&ouml;rigkeit</div>
+
+ <p>Bearbeiten der Mitgliedschaft aller Benutzer in allen Gruppen:</p>
+
+ <form method="post" action="admin.pl">
+  <p>
+   <input type="hidden" name="edit_nextsub" value="edit_group_membership">
+   <input type="submit" class="submit" name="action" value="Bearbeiten">
+  </p>
+
+ </form>
+
+ <hr size="2" noshade>
+
+ <div class="listheading">Neue Gruppe erfassen</div>
+
+ <form method="post" action="admin.pl">
+  <p>
+   <table border="0">
+    <tr>
+     <td>Name:</td>
+     <td><input name="name" maxlength="50"></td>
+    </tr>
+
+    <tr>
+     <td>Beschreibung:</td>
+     <td><input name="description"></td>
+    </tr>
+   </table>
+  </p>
+
+  <p>
+   <input type="hidden" name="add_nextsub" value="add_group">
+   <input type="submit" class="submit" name="action" value="Erfassen">
+  </p>
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/edit_groups_master.html b/templates/webpages/admin/edit_groups_master.html
new file mode 100644 (file)
index 0000000..97cde08
--- /dev/null
@@ -0,0 +1,80 @@
+[% USE HTML %]<body>
+ <form name="Form" method="post" action="admin.pl">
+
+
+  [% IF message %]
+  <p>[% message %]</p>
+  [% END %]
+
+  <div class="listtop"><translate>Edit groups</translate></div>
+
+  <br>
+
+  <div class="listheading"><translate>Edit and delete a group</translate></div>
+
+  [% IF num_groups %]
+  <p>
+   <select name="group_id" size="10">
+    [% FOREACH row = GROUPS %]
+    <option value="[% HTML.escape(row.id) %]">[% HTML.escape(row.name) %][% IF row.description %] ([% HTML.escape(row.description) %])[% END %]</option>
+    [% END %]
+   </select>
+  </p>
+  [% ELSE %]
+  <p><translate>No groups have been added yet.</translate></p>
+  [% END %]
+
+  <p>
+   [% IF num_groups %]
+   <input type="hidden" name="edit_nextsub" value="edit_group">
+   <input type="hidden" name="delete_nextsub" value="delete_group">
+   <input type="submit" class="submit" name="action" value="<translate>Edit</translate>">
+   <input type="submit" class="submit" name="action" value="<translate>Delete</translate>">
+   [% END %]
+   <input type="hidden" name="back_nextsub" value="list_users">
+   <input type="submit" class="submit" name="action" value="<translate>Back</translate>">
+  </p>
+ </form>
+
+ <hr size="2" noshade>
+
+ <div class="listheading"><translate>Group membership</translate></div>
+
+ <p><translate>Edit the membership of all users in all groups:</translate></p>
+
+ <form method="post" action="admin.pl">
+  <p>
+   <input type="hidden" name="edit_nextsub" value="edit_group_membership">
+   <input type="submit" class="submit" name="action" value="<translate>Edit</translate>">
+  </p>
+
+ </form>
+
+ <hr size="2" noshade>
+
+ <div class="listheading"><translate>Add a new group</translate></div>
+
+ <form method="post" action="admin.pl">
+  <p>
+   <table border="0">
+    <tr>
+     <td><translate>Name</translate>:</td>
+     <td><input name="name" maxlength="50"></td>
+    </tr>
+
+    <tr>
+     <td><translate>Description</translate>:</td>
+     <td><input name="description"></td>
+    </tr>
+   </table>
+  </p>
+
+  <p>
+   <input type="hidden" name="add_nextsub" value="add_group">
+   <input type="submit" class="submit" name="action" value="<translate>Add</translate>">
+  </p>
+
+ </form>
+
+</body>
+</html>
index e1a0fcc..c31c369 100644 (file)
      <table>
       <tr>
        <th align="right">Anmeldung</th>
-       <td><input name="login" value="[% HTML.escape(myc_login) %]"></td>
+       <td>[% IF edit %]<input type="hidden" name="login" value="[% HTML.escape(myc_login) %]">[% HTML.escape(myc_login) %][% ELSE %]<input name="login" value="[% HTML.escape(myc_login) %]">[% END %]</td>
       </tr>
 
       <tr>
        <th align="right">Passwort</th>
-       <td><input type="password" name="password" size="8" value="[% HTML.escape(myc_password) %]"></td>
-       <input type="hidden" name="old_password" value="[% HTML.escape(myc_password) %]">
+       <td>[% IF CAN_CHANGE_PASSWORD %]<input type="password" name="new_password" size="8" value="********">[% ELSE %]********[% END %]</td>
       </tr>
 
       <tr>
       <tr>
        <th align="right">Menüsetup</th>
        <td>
-        <input name="menustyle" type="radio" class="radio" value="v3" [% IF menustyle_v3 %]checked[% END %]>&nbsp;Oben (mit CSS)
-        <input name="menustyle" type="radio" class="radio" value="neu" [% IF menustyle_neu %]checked[% END %]>&nbsp;Oben (mit Javascript)
-        <input name="menustyle" type="radio" class="radio" value="old" [% IF menustyle_old %]checked[% END %]>&nbsp;Alt (seitlich)
+        <input name="menustyle" id="menustyle_v3"  type="radio" class="radio" value="v3" [% IF menustyle_v3 %]checked[% END %]>
+        <label for="menustyle_v3">&nbsp;Oben (mit CSS)</label>
+        <input name="menustyle" id="menustyle_neu" type="radio" class="radio" value="neu" [% IF menustyle_neu %]checked[% END %]>
+        <label for="menustyle_neu">&nbsp;Oben (mit Javascript)</label>
+        <input name="menustyle" id="menustyle_old" type="radio" class="radio" value="old" [% IF menustyle_old %]checked[% END %]>
+        <label for="menustyle_old">&nbsp;Alt (seitlich)</label>
        </td>
       </tr>
 
        <th align="right">Passwort</th>
        <td><input name="dbpasswd" type="password" size="10" value="[% HTML.escape(myc_dbpasswd) %]"></td>
       </tr>
-
-      <input type="hidden" name="old_dbpasswd" value="[% HTML.escape(myc_dbpasswd) %]">
      </table>
     </td>
    </tr>
 
-   <tr>
-    <td colspan="2"><hr size="2" noshade></td>
-   </tr>
-
-   <tr class="listheading"><th colspan="2">Zugriffkontrolle</th></tr>
-
-   [% FOREACH acl = ACLS %]
-    <tr>
-     <td valign="top">
-      <input type="checkbox" name="ACS_[% HTML.escape(acl.name) %]" id="ACS_[% HTML.escape(acl.name) %]" value="1" [% IF acl.checked %]checked[% END %]>
-      <label for="ACS_[% HTML.escape(acl.name) %]">[% HTML.escape(acl.title) %]</label>
-     </td>
-
-     <td valign="top">
-      [% USE SUBACLS_it = Iterator(acl.SUBACLS) %][% FOREACH subacl = SUBACLS_it %]
-       <input type="checkbox" name="ACS_[% HTML.escape(subacl.name) %]" id="ACS_[% HTML.escape(subacl.name) %]" value="1" [% IF subacl.checked %]checked[% END %]>
-       <label for="ACS_[% HTML.escape(subacl.name) %]">[% HTML.escape(subacl.title) %]</label>
-       [% UNLESS SUBACLS_it.last %]<br>[% END %]
-      [% END %]
-     </td>
-    </tr>
-   [% END %]
-
-   <input type="hidden" name="all_acs" value="[% HTML.escape(all_acs) %]">
-
    <tr><td colspan="2"><hr size="3" noshade></td></tr>
 
    <tr class="listheading">
     <td colspan="2">
      <table>
       <tr>
-       <td><input name="angebote" class="checkbox" type="checkbox" value="1" [% IF myc_angebote %]checked[% END %]>&nbsp;Angebot</td>
-       <td><input name="bestellungen" class="checkbox" type="checkbox" value="1" [% IF myc_bestellungen %]checked[% END %]>&nbsp;Bestellung</td>
-       <td><input name="rechnungen" class="checkbox" type="checkbox" value="1" [% IF myc_rechnung %]checked[% END %]>&nbsp;Rechnung</td>
+       <td>
+        <input name="angebote" id="angebote"class="checkbox" type="checkbox" value="1" [% IF myc_angebote %]checked[% END %]>
+        <label for="angebote">&nbsp;Angebot</label>
+       </td>
+       <td>
+        <input name="bestellungen" id="bestellungen" class="checkbox" type="checkbox" value="1" [% IF myc_bestellungen %]checked[% END %]>
+        <label for="bestellungen">&nbsp;Bestellung</label>
+       </td>
+       <td>
+        <input name="rechnungen" id="rechnungen" class="checkbox" type="checkbox" value="1" [% IF myc_rechnung %]checked[% END %]>
+        <label for="rechnungen">&nbsp;Rechnung</label>
+       </td>
       </tr>
 
       <tr>
-       <td><input name="anfragen" class="checkbox" type="checkbox" value="1" [% IF myc_anfragen %]checked[% END %]>&nbsp;Anfragen</td>
-       <td><input name="lieferantenbestellungen" class="checkbox" type="checkbox" value="1" [% IF myc_lieferantenbestellungen %]checked[% END %]>&nbsp;Lieferantenbestellung</td>
-       <td><input name="einkaufsrechnungen" class="checkbox" type="checkbox" value="1" [% IF myc_einkaufsrechnungen %]checked[% END %]>&nbsp;Einkaufsrechnung</td>
+       <td>
+        <input name="anfragen" id="anfragen" class="checkbox" type="checkbox" value="1" [% IF myc_anfragen %]checked[% END %]>
+        <label for="anfragen">&nbsp;Anfragen</label>
+       </td>
+       <td>
+        <input name="lieferantenbestellungen" id="lieferantenbestellungen" class="checkbox" type="checkbox" value="1" [% IF myc_lieferantenbestellungen %]checked[% END %]>
+        <label for="lieferantenbestellungen">&nbsp;Lieferantenbestellung</label>
+       </td>
+       <td>
+        <input name="einkaufsrechnungen" id="einkaufsrechnungen" class="checkbox" type="checkbox" value="1" [% IF myc_einkaufsrechnungen %]checked[% END %]>
+        <label for="einkaufsrechnungen">&nbsp;Einkaufsrechnung</label>
+       </td>
       </tr>
      </table>
     </td>
    </tr>
 
+   [% IF edit %]
+   <tr><td colspan="2"><hr size="3" noshade></td></tr>
+
+   <tr class="listheading">
+    <th colspan="2">Grouppenzugeh&ouml;rigkeit</th>
+   </tr>
+
+   <tr>
+    <td colspan="2">Der Benutzer ist Mitglied in den folgenden Gruppen:</td>
+   </tr>
+
+   <tr>
+    <td colspan="2">[% USE GROUPS_it = Iterator(GROUPS) %][% FOREACH row = GROUPS_it %]<a href="admin.pl?action=edit_group&group_id=[% HTML.url(row.id) %]">[% HTML.escape(row.name) %]</a>
+     [% UNLESS GROUPS_it.last %] | [% END %][% END %]</td>
+   </tr>
+   [% END %]
+
    <tr><td colspan="2"><hr size="3" noshade></td></tr>
 
   </table>
 
-  <input name="callback" type="hidden" value="admin.pl?action=list_users&rpw=[% HTML.url(rpw) %]">
-  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
+  <input name="callback" type="hidden" value="admin.pl?action=list_users">
 
   <input type="submit" class="submit" name="action" value="Speichern">
 
index c5f4809..dea5ee6 100644 (file)
      <table>
       <tr>
        <th align="right"><translate>Login</translate></th>
-       <td><input name="login" value="[% HTML.escape(myc_login) %]"></td>
+       <td>[% IF edit %]<input type="hidden" name="login" value="[% HTML.escape(myc_login) %]">[% HTML.escape(myc_login) %][% ELSE %]<input name="login" value="[% HTML.escape(myc_login) %]">[% END %]</td>
       </tr>
 
       <tr>
        <th align="right"><translate>Password</translate></th>
-       <td><input type="password" name="password" size="8" value="[% HTML.escape(myc_password) %]"></td>
-       <input type="hidden" name="old_password" value="[% HTML.escape(myc_password) %]">
+       <td>[% IF CAN_CHANGE_PASSWORD %]<input type="password" name="new_password" size="8" value="********">[% ELSE %]********[% END %]</td>
       </tr>
 
       <tr>
       <tr>
        <th align="right"><translate>Setup Menu</translate></th>
        <td>
-        <input name="menustyle" type="radio" class="radio" value="v3" [% IF menustyle_v3 %]checked[% END %]>&nbsp;<translate>Top (CSS)</translate>
-        <input name="menustyle" type="radio" class="radio" value="neu" [% IF menustyle_neu %]checked[% END %]>&nbsp;<translate>Top (Javascript)</translate>
-        <input name="menustyle" type="radio" class="radio" value="old" [% IF menustyle_old %]checked[% END %]>&nbsp;<translate>Old (on the side)</translate>
+        <input name="menustyle" id="menustyle_v3"  type="radio" class="radio" value="v3" [% IF menustyle_v3 %]checked[% END %]>
+        <label for="menustyle_v3">&nbsp;<translate>Top (CSS)</translate></label>
+        <input name="menustyle" id="menustyle_neu" type="radio" class="radio" value="neu" [% IF menustyle_neu %]checked[% END %]>
+        <label for="menustyle_neu">&nbsp;<translate>Top (Javascript)</translate></label>
+        <input name="menustyle" id="menustyle_old" type="radio" class="radio" value="old" [% IF menustyle_old %]checked[% END %]>
+        <label for="menustyle_old">&nbsp;<translate>Old (on the side)</translate></label>
        </td>
       </tr>
 
        <th align="right"><translate>Password</translate></th>
        <td><input name="dbpasswd" type="password" size="10" value="[% HTML.escape(myc_dbpasswd) %]"></td>
       </tr>
-
-      <input type="hidden" name="old_dbpasswd" value="[% HTML.escape(myc_dbpasswd) %]">
      </table>
     </td>
    </tr>
 
-   <tr>
-    <td colspan="2"><hr size="2" noshade></td>
-   </tr>
-
-   <tr class="listheading"><th colspan="2"><translate>Access Control</translate></th></tr>
-
-   [% FOREACH acl = ACLS %]
-    <tr>
-     <td valign="top">
-      <input type="checkbox" name="ACS_[% HTML.escape(acl.name) %]" id="ACS_[% HTML.escape(acl.name) %]" value="1" [% IF acl.checked %]checked[% END %]>
-      <label for="ACS_[% HTML.escape(acl.name) %]">[% HTML.escape(acl.title) %]</label>
-     </td>
-
-     <td valign="top">
-      [% USE SUBACLS_it = Iterator(acl.SUBACLS) %][% FOREACH subacl = SUBACLS_it %]
-       <input type="checkbox" name="ACS_[% HTML.escape(subacl.name) %]" id="ACS_[% HTML.escape(subacl.name) %]" value="1" [% IF subacl.checked %]checked[% END %]>
-       <label for="ACS_[% HTML.escape(subacl.name) %]">[% HTML.escape(subacl.title) %]</label>
-       [% UNLESS SUBACLS_it.last %]<br>[% END %]
-      [% END %]
-     </td>
-    </tr>
-   [% END %]
-
-   <input type="hidden" name="all_acs" value="[% HTML.escape(all_acs) %]">
-
    <tr><td colspan="2"><hr size="3" noshade></td></tr>
 
    <tr class="listheading">
     <td colspan="2">
      <table>
       <tr>
-       <td><input name="angebote" class="checkbox" type="checkbox" value="1" [% IF myc_angebote %]checked[% END %]>&nbsp;Angebot</td>
-       <td><input name="bestellungen" class="checkbox" type="checkbox" value="1" [% IF myc_bestellungen %]checked[% END %]>&nbsp;Bestellung</td>
-       <td><input name="rechnungen" class="checkbox" type="checkbox" value="1" [% IF myc_rechnung %]checked[% END %]>&nbsp;Rechnung</td>
+       <td>
+        <input name="angebote" id="angebote"class="checkbox" type="checkbox" value="1" [% IF myc_angebote %]checked[% END %]>
+        <label for="angebote">&nbsp;Angebot</label>
+       </td>
+       <td>
+        <input name="bestellungen" id="bestellungen" class="checkbox" type="checkbox" value="1" [% IF myc_bestellungen %]checked[% END %]>
+        <label for="bestellungen">&nbsp;Bestellung</label>
+       </td>
+       <td>
+        <input name="rechnungen" id="rechnungen" class="checkbox" type="checkbox" value="1" [% IF myc_rechnung %]checked[% END %]>
+        <label for="rechnungen">&nbsp;Rechnung</label>
+       </td>
       </tr>
 
       <tr>
-       <td><input name="anfragen" class="checkbox" type="checkbox" value="1" [% IF myc_anfragen %]checked[% END %]>&nbsp;Anfragen</td>
-       <td><input name="lieferantenbestellungen" class="checkbox" type="checkbox" value="1" [% IF myc_lieferantenbestellungen %]checked[% END %]>&nbsp;Lieferantenbestellung</td>
-       <td><input name="einkaufsrechnungen" class="checkbox" type="checkbox" value="1" [% IF myc_einkaufsrechnungen %]checked[% END %]>&nbsp;Einkaufsrechnung</td>
+       <td>
+        <input name="anfragen" id="anfragen" class="checkbox" type="checkbox" value="1" [% IF myc_anfragen %]checked[% END %]>
+        <label for="anfragen">&nbsp;Anfragen</label>
+       </td>
+       <td>
+        <input name="lieferantenbestellungen" id="lieferantenbestellungen" class="checkbox" type="checkbox" value="1" [% IF myc_lieferantenbestellungen %]checked[% END %]>
+        <label for="lieferantenbestellungen">&nbsp;Lieferantenbestellung</label>
+       </td>
+       <td>
+        <input name="einkaufsrechnungen" id="einkaufsrechnungen" class="checkbox" type="checkbox" value="1" [% IF myc_einkaufsrechnungen %]checked[% END %]>
+        <label for="einkaufsrechnungen">&nbsp;Einkaufsrechnung</label>
+       </td>
       </tr>
      </table>
     </td>
    </tr>
 
+   [% IF edit %]
+   <tr><td colspan="2"><hr size="3" noshade></td></tr>
+
+   <tr class="listheading">
+    <th colspan="2"><translate>Group membership</translate></th>
+   </tr>
+
+   <tr>
+    <td colspan="2"><translate>The user is a member in the following group(s):</translate></td>
+   </tr>
+
+   <tr>
+    <td colspan="2">[% USE GROUPS_it = Iterator(GROUPS) %][% FOREACH row = GROUPS_it %]<a href="admin.pl?action=edit_group&group_id=[% HTML.url(row.id) %]">[% HTML.escape(row.name) %]</a>
+     [% UNLESS GROUPS_it.last %] | [% END %][% END %]</td>
+   </tr>
+   [% END %]
+
    <tr><td colspan="2"><hr size="3" noshade></td></tr>
 
   </table>
 
-  <input name="callback" type="hidden" value="admin.pl?action=list_users&rpw=[% HTML.url(rpw) %]">
-  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
+  <input name="callback" type="hidden" value="admin.pl?action=list_users">
 
   <input type="submit" class="submit" name="action" value="<translate>Save</translate>">
 
index 4b35bb0..3214a74 100644 (file)
@@ -19,7 +19,7 @@
     [% SET row_odd = '1' %]
     [% FOREACH row = MEMBERS %]
      <tr class="listrow[% IF row_odd %]1[% SET row_odd = '0' %][% ELSE %]0[% SET row_odd = '1' %][% END %]">
-      <td><a href="admin.pl?action=edit&login=[% HTML.url(row.login) %]&rpw=[% HTML.url(rpw) %]">[% HTML.escape(row.login) %]</a></td>
+      <td><a href="admin.pl?action=edit&login=[% HTML.url(row.login) %]">[% HTML.escape(row.login) %]</a></td>
       <td>[% HTML.escape(row.name) %]</td>
       <td>[% HTML.escape(row.company) %]</td>
       <td>[% HTML.escape(row.dbdriver) %]</td>
    </table>
   </p>
 
-  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
 
   <input type="submit" class="submit" name="action" value="Benutzer erfassen">
-  <input type="submit" class="submit" name="action" value="Administratorpasswort ändern">
+  <input type="submit" class="submit" name="action" value="Gruppen bearbeiten">
   <input type="submit" class="submit" name="action" value="Datenbankadministration">
   [% IF LOCKED %]
    <input type="submit" class="submit" name="action" value="System entsperren">
    [% ELSE %]
    <input type="submit" class="submit" name="action" value="System sperren">
   [% END %]
+  <input type="submit" class="submit" name="action" value="Abmeldung">
 
   <p>Zum Bearbeiten den Zugriffsnamen anklicken!</p>
 
index fc7c70a..3bb34da 100644 (file)
@@ -19,7 +19,7 @@
     [% SET row_odd = '1' %]
     [% FOREACH row = MEMBERS %]
      <tr class="listrow[% IF row_odd %]1[% SET row_odd = '0' %][% ELSE %]0[% SET row_odd = '1' %][% END %]">
-      <td><a href="admin.pl?action=edit&login=[% HTML.url(row.login) %]&rpw=[% HTML.url(rpw) %]">[% HTML.escape(row.login) %]</a></td>
+      <td><a href="admin.pl?action=edit&login=[% HTML.url(row.login) %]">[% HTML.escape(row.login) %]</a></td>
       <td>[% HTML.escape(row.name) %]</td>
       <td>[% HTML.escape(row.company) %]</td>
       <td>[% HTML.escape(row.dbdriver) %]</td>
    </table>
   </p>
 
-  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
 
   <input type="submit" class="submit" name="action" value="<translate>Add User</translate>">
-  <input type="submit" class="submit" name="action" value="<translate>Change Admin Password</translate>">
+  <input type="submit" class="submit" name="action" value="<translate>Edit groups</translate>">
   <input type="submit" class="submit" name="action" value="<translate>Pg Database Administration</translate>">
   [% IF LOCKED %]
    <input type="submit" class="submit" name="action" value="<translate>Unlock System</translate>">
    [% ELSE %]
    <input type="submit" class="submit" name="action" value="<translate>Lock System</translate>">
   [% END %]
+  <input type="submit" class="submit" name="action" value="<translate>Logout</translate>">
 
   <p><translate>Click on login name to edit!</translate></p>
 
index 34877de..28e0d2d 100644 (file)
@@ -43,7 +43,6 @@
    </tr>
   </table>
 
-  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
   <input type="hidden" name="nextsub" value="restore_dataset_start">
 
   <hr size="3" noshade>
index 4ede0bb..a160272 100644 (file)
@@ -43,7 +43,6 @@
    </tr>
   </table>
 
-  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
   <input type="hidden" name="nextsub" value="restore_dataset_start">
 
   <hr size="3" noshade>
index 0376b52..2485438 100644 (file)
@@ -9,7 +9,6 @@
 
  <form method="post" action="admin.pl">
   <input type="hidden" name="nextsub" value="list_users">
-  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
   <input type="submit" name="action" value="Weiter">
  </form>
 </body>
index b671705..da55e2d 100644 (file)
@@ -9,7 +9,6 @@
 
  <form method="post" action="admin.pl">
   <input type="hidden" name="nextsub" value="list_users">
-  <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
   <input type="submit" name="action" value="<translate>Continue</translate>">
  </form>
 </body>
index 2338487..dadcc7e 100644 (file)
 
     [% SET odd = '1' %][% USE NEED_UPDATES_it = Iterator(NEED_UPDATES) %][% FOREACH row = NEED_UPDATES_it %]
      <tr class="listrow[% IF odd %]1[% SET odd='0' %][% ELSE %]0[% SET odd = '1' %][% END %]">
-      <td><input type="checkbox" name="update_[% NEED_UPDATES_it.count %]" value="1" checked></td>
-      <td><input type="hidden" name="dbname_[% NEED_UPDATES_it.count %]" value="[% HTML.escape(row.dbname) %]">[% HTML.escape(row.dbname) %]</td>
+      <td><input type="checkbox" name="update_[% NEED_UPDATES_it.count %]" id="update_[% NEED_UPDATES_it.count %]" value="1" checked></td>
+      <td>
+       <input type="hidden" name="dbname_[% NEED_UPDATES_it.count %]" value="[% HTML.escape(row.dbname) %]">
+       <label for="update_[% NEED_UPDATES_it.count %]">[% HTML.escape(row.dbname) %]</label>
+      </td>
       <td><input type="hidden" name="dbdriver_[% NEED_UPDATES_it.count %]" value="Pg">PostgreSQL</td>
       <td><input type="hidden" name="dbhost_[% NEED_UPDATES_it.count %]" value="[% HTML.escape(row.dbhost) %]">[% HTML.escape(row.dbhost) %]</td>
       <td><input type="hidden" name="dbport_[% NEED_UPDATES_it.count %]" value="[% HTML.escape(row.dbport) %]">[% HTML.escape(row.dbport) %]</td>
@@ -37,8 +40,7 @@
     [% END %]
    </table>
 
-   <input name="callback" type="hidden" value="admin.pl?action=list_users&rpw=[% HTML.url(rpw) %]">
-   <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
+   <input name="callback" type="hidden" value="admin.pl?action=list_users">
    <input type="hidden" name="nextsub" value="dbupdate">
 
    <hr size="3" noshade>
index f91797e..fd2c393 100644 (file)
 
     [% SET odd = '1' %][% USE NEED_UPDATES_it = Iterator(NEED_UPDATES) %][% FOREACH row = NEED_UPDATES_it %]
      <tr class="listrow[% IF odd %]1[% SET odd='0' %][% ELSE %]0[% SET odd = '1' %][% END %]">
-      <td><input type="checkbox" name="update_[% NEED_UPDATES_it.count %]" value="1" checked></td>
-      <td><input type="hidden" name="dbname_[% NEED_UPDATES_it.count %]" value="[% HTML.escape(row.dbname) %]">[% HTML.escape(row.dbname) %]</td>
+      <td><input type="checkbox" name="update_[% NEED_UPDATES_it.count %]" id="update_[% NEED_UPDATES_it.count %]" value="1" checked></td>
+      <td>
+       <input type="hidden" name="dbname_[% NEED_UPDATES_it.count %]" value="[% HTML.escape(row.dbname) %]">
+       <label for="update_[% NEED_UPDATES_it.count %]">[% HTML.escape(row.dbname) %]</label>
+      </td>
       <td><input type="hidden" name="dbdriver_[% NEED_UPDATES_it.count %]" value="Pg">PostgreSQL</td>
       <td><input type="hidden" name="dbhost_[% NEED_UPDATES_it.count %]" value="[% HTML.escape(row.dbhost) %]">[% HTML.escape(row.dbhost) %]</td>
       <td><input type="hidden" name="dbport_[% NEED_UPDATES_it.count %]" value="[% HTML.escape(row.dbport) %]">[% HTML.escape(row.dbport) %]</td>
@@ -37,8 +40,7 @@
     [% END %]
    </table>
 
-   <input name="callback" type="hidden" value="admin.pl?action=list_users&rpw=[% HTML.url(rpw) %]">
-   <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
+   <input name="callback" type="hidden" value="admin.pl?action=list_users">
    <input type="hidden" name="nextsub" value="dbupdate">
 
    <hr size="3" noshade>
diff --git a/templates/webpages/admin/user_migration_complete_de.html b/templates/webpages/admin/user_migration_complete_de.html
new file mode 100644 (file)
index 0000000..29257b8
--- /dev/null
@@ -0,0 +1,24 @@
+[% USE HTML %]<body>
+
+ <div class="listtop">[% title %]</div>
+
+ <form method="post" action="admin.pl">
+
+  [%- IF standard_group_created %]
+  <p>Eine Gruppe namens &quot;Vollzugriff&quot; wurde angelegt.</p>
+  [%- END %]
+
+
+  <p>Der Prozess der Benutzerdatenmigration ist abgeschlossen.
+   Sie werden nun zum Administrationsbereich weitergeleitet.</p>
+
+  <input type="hidden" name="nextsub" value="list_users">
+
+  <p>
+   <input type="submit" class="submit" name="action" value="Weiter">
+  </p>
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/user_migration_complete_master.html b/templates/webpages/admin/user_migration_complete_master.html
new file mode 100644 (file)
index 0000000..dcf0eb8
--- /dev/null
@@ -0,0 +1,26 @@
+[% USE HTML %]<body>
+
+ <div class="listtop">[% title %]</div>
+
+ <form method="post" action="admin.pl">
+
+  [%- IF standard_group_created %]
+  <p><translate>A group named &quot;Full Access&quot; has been
+    created.</translate></p>
+  [%- END %]
+
+
+  <p><translate>The user migration process is complete.</translate>
+   <translate>You will now be forwarded to the administration
+   panel.</translate></p>
+
+  <input type="hidden" name="nextsub" value="list_users">
+
+  <p>
+   <input type="submit" class="submit" name="action" value="<translate>Continue</translate>">
+  </p>
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/user_migration_de.html b/templates/webpages/admin/user_migration_de.html
new file mode 100644 (file)
index 0000000..c57f83d
--- /dev/null
@@ -0,0 +1,24 @@
+[% USE HTML %]<body>
+
+ <div class="listtop">[% title %]</div>
+
+ <form method="post" action="admin.pl">
+
+  <p>
+   Die alte Datei mit den Benutzerdaten existiert in dieser Installation noch immer (&quot;[% HTML.escape(memberfile) %]&quot;). Wollen Sie diese Benutzer in die neue Authentifizierungsdatenbank migrieren lassen? Falls nicht, so werden Sie sich nicht mehr mit den Benutzerdaten aus der alten Mitgliedsdatei anmelden k&ouml;nnen.
+  </p>
+
+  <p>
+   Falls Sie sich entscheiden, Lx-Office die Migration durchf&uuml;hren zu lassen, so wird Lx-Office ein Backup der alten Dateien im Verzeichnis &quot;[% HTML.escape(backupdir) %]&quot; erstellen und die Dateien anschlie&szlig;end l&ouml;schen.
+  </p>
+
+  <input type="hidden" name="yes_nextsub" value="migrate_users">
+  <input type="hidden" name="no_nextsub" value="list_users">
+
+  <input type="submit" class="submit" name="action" value="Ja">
+  <input type="submit" class="submit" name="action" value="Nein">
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/user_migration_done_de.html b/templates/webpages/admin/user_migration_done_de.html
new file mode 100644 (file)
index 0000000..d95b558
--- /dev/null
@@ -0,0 +1,18 @@
+[% USE HTML %]<body>
+
+ <div class="listtop">[% title %]</div>
+
+ <form method="post" action="admin.pl">
+
+  <p>Die folgenden Benutzer wurden in die Authentifizierungsdatenbank migriert:</p>
+
+  <p>[% FOREACH row = MEMBERS %][% row.login %] [% END %]</p>
+
+  <input type="hidden" name="nextsub" value="create_standard_group_ask">
+
+  <input type="submit" class="submit" name="action" value="Weiter">
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/user_migration_done_master.html b/templates/webpages/admin/user_migration_done_master.html
new file mode 100644 (file)
index 0000000..9e16d48
--- /dev/null
@@ -0,0 +1,19 @@
+[% USE HTML %]<body>
+
+ <div class="listtop">[% title %]</div>
+
+ <form method="post" action="admin.pl">
+
+  <p><translate>The following users have been migrated into the
+    authentication database:</translate></p>
+
+  <p>[% FOREACH row = MEMBERS %][% row.login %] [% END %]</p>
+
+  <input type="hidden" name="nextsub" value="create_standard_group_ask">
+
+  <input type="submit" class="submit" name="action" value="<translate>Continue</translate>">
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/user_migration_master.html b/templates/webpages/admin/user_migration_master.html
new file mode 100644 (file)
index 0000000..b9f5d4d
--- /dev/null
@@ -0,0 +1,31 @@
+[% USE HTML %]<body>
+
+ <div class="listtop">[% title %]</div>
+
+ <form method="post" action="admin.pl">
+
+  <p>
+   <translate>The old file containing the user information is still
+    present (&quot;[% HTML.escape(memberfile) %]&quot;). Do you want to
+    migrate these users into the database? If not then you will not be
+    able to log in with any of the users present in the old file.
+   </translate>
+  </p>
+
+  <p>
+   <translate>If you chose to let Lx-Office do the migration then
+    Lx-Office will also remove the old member file after creating a
+    backup copy of it in the directory
+    &quot;[% HTML.escape(backupdir) %]&quot;.</translate>
+  </p>
+
+  <input type="hidden" name="yes_nextsub" value="migrate_users">
+  <input type="hidden" name="no_nextsub" value="list_users">
+
+  <input type="submit" class="submit" name="action" value="<translate>Yes</translate>">
+  <input type="submit" class="submit" name="action" value="<translate>No</translate>">
+
+ </form>
+
+</body>
+</html>
index 3bf622a..c3e132c 100644 (file)
@@ -6,9 +6,6 @@
 
   <input type="hidden" name="type" value="preferences">
   <input type="hidden" name="role" value="[% HTML.escape(myconfig_role) %]">
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-  <input type="hidden" name="old_password" value="[% HTML.escape(myconfig_password) %]">
 
   <p>
    <table>
 
     <tr>
      <th align="right">Passwort</th>
-     <td><input type="password" name="new_password" size="10" value="[% HTML.escape(myconfig_password) %]"></td>
+     <td>
+      [%- IF CAN_CHANGE_PASSWORD %]
+      <input type="password" name="new_password" size="10" value="********">
+      [%- ELSE %]
+      <input type="hidden" name="new_password" value="********">
+      [%- END %]
+     </td>
     </tr>
 
     <tr>
index 775bcaf..e283bdb 100644 (file)
@@ -6,9 +6,6 @@
 
   <input type="hidden" name="type" value="preferences">
   <input type="hidden" name="role" value="[% HTML.escape(myconfig_role) %]">
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-  <input type="hidden" name="old_password" value="[% HTML.escape(myconfig_password) %]">
 
   <p>
    <table>
 
     <tr>
      <th align="right"><translate>Password</translate></th>
-     <td><input type="password" name="new_password" size="10" value="[% HTML.escape(myconfig_password) %]"></td>
+     <td>
+      [%- IF CAN_CHANGE_PASSWORD %]
+      <input type="password" name="new_password" size="10" value="********">
+      [%- ELSE %]
+      <input type="hidden" name="new_password" value="********">
+      [%- END %]
+     </td>
     </tr>
 
     <tr>
index f664230..d5c85ed 100644 (file)
@@ -5,8 +5,6 @@
  <form method="post" action="am.pl"name="Form">
 
   <input type="hidden" name="type" value="defaults">
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
 
   <p>
    <table>
      <td><input name="rfqnumber" size="10" value="[% HTML.escape(defaults_rfqnumber) %]"></td>
     </tr>
 
+    <tr>
+     <th align="right" nowrap>Letzte Lieferscheinnummer (Verkauf)</th>
+     <td><input name="sdonumber" size="10" value="[% HTML.escape(defaults_sdonumber) %]"></td>
+     <th align="right" nowrap>Letzte Lieferscheinnummer (Einkauf)</th>
+     <td><input name="pdonumber" size="10" value="[% HTML.escape(defaults_pdonumber) %]"></td>
+    </tr>
+
+    <tr>
+     <th align="right" nowrap>Letzte Materialr&uuml;ckgabescheinnummer</th>
+     <td><input name="rmsnumber" size="10" value="[% HTML.escape(defaults_rmsnumber) %]"></td>
+     <th align="right" nowrap>Letzte Bestellanfragenummer</th>
+     <td><input name="oreqnumber" size="10" value="[% HTML.escape(defaults_oreqnumber) %]"></td>
+    </tr>
+
+    <tr>
+     <th align="right" nowrap>Letzte Materialausgabebelegsnummer</th>
+     <td><input name="rlmsnumber" size="10" value="[% HTML.escape(defaults_rlmsnumber) %]"></td>
+    </tr>
+
     <tr class="listheading">
      <th colspan="4">Standardkonten</th>
     </tr>
index 3d61244..25ecff5 100644 (file)
@@ -5,8 +5,6 @@
  <form method="post" action="am.pl"name="Form">
 
   <input type="hidden" name="type" value="defaults">
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
 
   <p>
    <table>
      <td><input name="rfqnumber" size="10" value="[% HTML.escape(defaults_rfqnumber) %]"></td>
     </tr>
 
+    <tr>
+     <th align="right" nowrap><translate>Last Sales Delivery Order Number</translate></th>
+     <td><input name="sdonumber" size="10" value="[% HTML.escape(defaults_sdonumber) %]"></td>
+     <th align="right" nowrap><translate>Last Purchase Delivery Order Number</translate></th>
+     <td><input name="pdonumber" size="10" value="[% HTML.escape(defaults_pdonumber) %]"></td>
+    </tr>
+
+    <tr>
+     <th align="right" nowrap><translate>Last Return Material Slip Number</translate></th>
+     <td><input name="rmsnumber" size="10" value="[% HTML.escape(defaults_rmsnumber) %]"></td>
+     <th align="right" nowrap><translate>Last Order Request Number</translate></th>
+     <td><input name="oreqnumber" size="10" value="[% HTML.escape(defaults_oreqnumber) %]"></td>
+    </tr>
+
+    <tr>
+     <th align="right" nowrap><translate>Last Release Material Slip Number</translate></th>
+     <td><input name="rlmsnumber" size="10" value="[% HTML.escape(defaults_rlmsnumber) %]"></td>
+    </tr>
+
     <tr class="listheading">
      <th colspan="4"><translate>Default Accounts</translate></th>
     </tr>
index 3ed19a5..bf7f3d8 100644 (file)
@@ -21,8 +21,6 @@
   </p>
 
   <p>
-   <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-   <input type="hidden" name="password" value="[% HTML.escape(password) %]">
    <input type="hidden" name="callback" value="[% HTML.escape(callback) %]">
 
    <input type="hidden" name="type" value="price_factor">
index 261122f..8306b78 100644 (file)
@@ -21,8 +21,6 @@
   </p>
 
   <p>
-   <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-   <input type="hidden" name="password" value="[% HTML.escape(password) %]">
    <input type="hidden" name="callback" value="[% HTML.escape(callback) %]">
 
    <input type="hidden" name="type" value="price_factor">
index f69ef97..ee8ba4b 100644 (file)
   <br />
   Konten, die mit dieser Steuer verknüpft sind:
   [% FOREACH row = TAXINUSE %]
-  <a href="am.pl?action=edit_account&id=[% HTML.url(row.id) %]&login=[% HTML.url(login) %]&password=[% HTML.url(password) %]&callback=[% HTML.url(callback) %]">[% HTML.escape(row.accno) %]</a>&nbsp;
+  <a href="am.pl?action=edit_account&id=[% HTML.url(row.id) %]&callback=[% HTML.url(callback) %]">[% HTML.escape(row.accno) %]</a>&nbsp;
   [% END %]
   <br />
   [% END %]
 
   <input type="hidden" name="callback" value="[% HTML.escape(callback) %]">
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
 
   <input type="submit" class="submit" name="action" value="Speichern">
 
index 5f48c7d..3d4aed3 100644 (file)
   <br />
   <translate>Chartaccounts connected to this Tax:</translate>
   [% FOREACH row = TAXINUSE %]
-  <a href="am.pl?action=edit_account&id=[% HTML.url(row.id) %]&login=[% HTML.url(login) %]&password=[% HTML.url(password) %]&callback=[% HTML.url(callback) %]">[% HTML.escape(row.accno) %]</a>&nbsp;
+  <a href="am.pl?action=edit_account&id=[% HTML.url(row.id) %]&callback=[% HTML.url(callback) %]">[% HTML.escape(row.accno) %]</a>&nbsp;
   [% END %]
   <br />
   [% END %]
 
   <input type="hidden" name="callback" value="[% HTML.escape(callback) %]">
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
 
   <input type="submit" class="submit" name="action" value="<translate>Save</translate>">
 
index 096bfa2..10b3046 100644 (file)
@@ -8,9 +8,6 @@
 
  <form method="post" action="[% HTML.escape(script) %]">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
  <input type="hidden" name="type" value="unit">
  <input type="hidden" name="unit_type" value="[% HTML.escape(unit_type) %]">
 
index 971eb28..0d11216 100644 (file)
@@ -8,9 +8,6 @@
 
  <form method="post" action="[% HTML.escape(script) %]">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
  <input type="hidden" name="type" value="unit">
  <input type="hidden" name="unit_type" value="[% HTML.escape(unit_type) %]">
 
index a20ae17..f6708e1 100644 (file)
@@ -29,8 +29,6 @@
  <p>
   <form method="post" action="am.pl">
    <input type="hidden" name="type" value="price_factor">
-   <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-   <input type="hidden" name="password" value="[% HTML.escape(password) %]">
    <input type="hidden" name="callback" value="[% HTML.escape(callback) %]">
 
    <input type="submit" class="submit" name="action" value="Erfassen">
index 867aed3..ff560d6 100644 (file)
@@ -29,8 +29,6 @@
  <p>
   <form method="post" action="am.pl">
    <input type="hidden" name="type" value="price_factor">
-   <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-   <input type="hidden" name="password" value="[% HTML.escape(password) %]">
    <input type="hidden" name="callback" value="[% HTML.escape(callback) %]">
 
    <input type="submit" class="submit" name="action" value="<translate>Add</translate>">
index 94bc35a..39c66a5 100644 (file)
@@ -14,7 +14,7 @@
   [% SET row_odd = '1' %][% FOREACH row = TAX %]
   <tr class="listrow[% IF row_odd %]1[% SET row_odd = '0' %][% ELSE %]0[% SET row_odd = '1' %][% END %]">
    <td align="right">[% HTML.escape(row.taxkey) %]</td>
-   <td><a href="am.pl?action=edit_tax&id=[% HTML.url(row.id) %]&login=[% HTML.url(login) %]&password=[% HTML.url(password) %]&callback=[% HTML.url(callback) %]">[% HTML.escape(row.taxdescription) %]</a></td>
+   <td><a href="am.pl?action=edit_tax&id=[% HTML.url(row.id) %]&callback=[% HTML.url(callback) %]">[% HTML.escape(row.taxdescription) %]</a></td>
    <td align="right">[% HTML.escape(row.rate) %] %</td>
    <td align="right">[% HTML.escape(row.taxnumber) %]</td>
    <td>[% HTML.escape(row.account_description) %]</td>
@@ -27,8 +27,6 @@
 
    <input name="callback" type="hidden" value="[% HTML.escape(callback) %]">
    <input type="hidden" name="type" value="tax">
-   <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-   <input type="hidden" name="password" value="[% HTML.escape(password) %]">
    <input class="submit" type="submit" name="action" value="Erfassen">
   </form>
  </p>
index bbb4045..8c56512 100644 (file)
@@ -14,7 +14,7 @@
   [% SET row_odd = '1' %][% FOREACH row = TAX %]
   <tr class="listrow[% IF row_odd %]1[% SET row_odd = '0' %][% ELSE %]0[% SET row_odd = '1' %][% END %]">
    <td align="right">[% HTML.escape(row.taxkey) %]</td>
-   <td><a href="am.pl?action=edit_tax&id=[% HTML.url(row.id) %]&login=[% HTML.url(login) %]&password=[% HTML.url(password) %]&callback=[% HTML.url(callback) %]">[% HTML.escape(row.taxdescription) %]</a></td>
+   <td><a href="am.pl?action=edit_tax&id=[% HTML.url(row.id) %]&callback=[% HTML.url(callback) %]">[% HTML.escape(row.taxdescription) %]</a></td>
    <td align="right">[% HTML.escape(row.rate) %] %</td>
    <td align="right">[% HTML.escape(row.taxnumber) %]</td>
    <td>[% HTML.escape(row.account_description) %]</td>
@@ -27,8 +27,6 @@
 
    <input name="callback" type="hidden" value="[% HTML.escape(callback) %]">
    <input type="hidden" name="type" value="tax">
-   <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-   <input type="hidden" name="password" value="[% HTML.escape(password) %]">
    <input class="submit" type="submit" name="action" value="<translate>Add</translate>">
   </form>
  </p>
index 0e30e43..c9442d0 100644 (file)
@@ -2,9 +2,6 @@
 
   <input name="callback" type="hidden" value="[% callback %]">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
   Neu erfassen<br>
 
   <input class="submit" type="submit" name="action" value="Kreditorenbuchung">
index f864d87..0be66fb 100644 (file)
@@ -2,9 +2,6 @@
 
   <input name="callback" type="hidden" value="[% callback %]">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
   <translate>Create new</translate><br>
 
   <input class="submit" type="submit" name="action" value="<translate>AP Transaction</translate>">
index 9c1a17c..b70f89d 100644 (file)
@@ -2,9 +2,6 @@
 
   <input name="callback" type="hidden" value="[% callback %]">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
   Neu erfassen<br>
 
   <input class="submit" type="submit" name="action" value="Debitorenbuchung">
index 887b288..a6ffc7b 100644 (file)
@@ -2,9 +2,6 @@
 
   <input name="callback" type="hidden" value="[% callback %]">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
   <translate>Create new</translate><br>
 
   <input class="submit" type="submit" name="action" value="<translate>AR Transaction</translate>">
index 447657e..8bc24a3 100644 (file)
@@ -6,8 +6,6 @@
 
 <form method="post" onSubmit="javascript:set_history_uri();">
 
-<input type="hidden" name="login" value="[% HTML.escape(login) %]">
-<input type="hidden" name="password" value="[% HTML.escape(password) %]">
 <input type="hidden" name="action" value="show_am_history">
 
        <table>
index 72e1fcf..6aa176f 100644 (file)
@@ -6,8 +6,6 @@
 
 <form method="post" onSubmit="javascript:set_history_uri();">
 
-<input type="hidden" name="login" value="[% HTML.escape(login) %]">
-<input type="hidden" name="password" value="[% HTML.escape(password) %]">
 <input type="hidden" name="action" value="show_am_history">
 
        <table>
index 480081a..d0b191b 100644 (file)
@@ -1,7 +1,4 @@
-[% USE HTML %]<form>
-<input type="hidden" name="login" value="[% HTML.escape(login) %]">
-<input type="hidden" name="password" value="[% HTML.escape(password) %]">
-</form>
+[% USE HTML %]
 [% IF SUCCESS %]
 <script type="text/javascript">
   function orderBy(order,desc) {
index 9774e81..f86ce1f 100644 (file)
@@ -1,7 +1,4 @@
-[% USE HTML %]<form>
-<input type="hidden" name="login" value="[% HTML.escape(login) %]">
-<input type="hidden" name="password" value="[% HTML.escape(password) %]">
-</form>
+[% USE HTML %]
 [% IF SUCCESS %]
 <script type="text/javascript">
   function orderBy(order,desc) {
index 3f1495a..2d1955b 100644 (file)
@@ -3,9 +3,6 @@
 <input name=business_save type=hidden value="[% selectbusiness %]">
 <input name=title_save type=hidden value="[% title %]">
 
-<input type=hidden name=login value=[% login %]>
-<input type=hidden name=password value=[% password %]>
-
 <input type=hidden name=callback value="[% callback %]">
 <input type=hidden name=db id=db value=[% db %]>
 
index 2637e43..cb73f55 100644 (file)
@@ -3,9 +3,6 @@
 <input name=business_save type=hidden value="[% selectbusiness %]">
 <input name=title_save type=hidden value="[% title %]">
 
-<input type=hidden name=login value=[% login %]>
-<input type=hidden name=password value=[% password %]>
-
 <input type=hidden name=callback value="[% callback %]">
 <input type=hidden name=db id=db value=[% db %]>
 
index fe39d32..2d6625f 100644 (file)
@@ -3,9 +3,6 @@
  <input name="callback" type="hidden" value="[% HTML.escape(callback) %]">
  <input name="db" type="hidden" value="[% HTML.escape(db) %]">
 
- <input name="login" type="hidden" value="[% HTML.escape(login) %]">
- <input name="password" type="hidden" value="[% HTML.escape(password) %]">
-
  [% IF IS_CUSTOMER %]Neuer Kunde[% ELSE %]Neuer Lieferant[% END %]<br>
 
  <input class="submit" type="submit" name="action" value="Erfassen">
index eb30398..f95a18c 100644 (file)
@@ -3,9 +3,6 @@
  <input name="callback" type="hidden" value="[% HTML.escape(callback) %]">
  <input name="db" type="hidden" value="[% HTML.escape(db) %]">
 
- <input name="login" type="hidden" value="[% HTML.escape(login) %]">
- <input name="password" type="hidden" value="[% HTML.escape(password) %]">
-
  [% IF IS_CUSTOMER %]<translate>New customer</translate>[% ELSE %]<translate>New vendor</translate>[% END %]<br>
 
  <input class="submit" type="submit" name="action" value="<translate>Add</translate>">
index 512778e..4dbda8b 100644 (file)
 
   <input type="hidden" name="nextsub" value="list_names">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
   <input type="submit" class="submit" name="action" value="Weiter">
  </form>
 
index 6c4a0ff..50e38d9 100644 (file)
 
   <input type="hidden" name="nextsub" value="list_names">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
   <input type="submit" class="submit" name="action" value="<translate>Continue</translate>">
  </form>
 
index 331fedc..bb3f4cc 100644 (file)
@@ -2,8 +2,6 @@
 
 <form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="type" value="parts">
  <input type="hidden" name="action" value="login">
  <input type="hidden" name="action2" value="create_buchungsgruppen_assemblies">
index f3cc4d5..f9c6329 100644 (file)
@@ -2,8 +2,6 @@
 
 <form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="type" value="parts">
  <input type="hidden" name="action" value="login">
  <input type="hidden" name="action2" value="create_buchungsgruppen_assemblies">
index 225698e..9401f61 100644 (file)
@@ -2,8 +2,6 @@
 
 <form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="type" value="parts">
  <input type="hidden" name="action" value="login">
  <input type="hidden" name="action2" value="">
index 1d0f2d4..3f954b9 100644 (file)
@@ -2,8 +2,6 @@
 
 <form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="type" value="parts">
  <input type="hidden" name="action" value="login">
  <input type="hidden" name="action2" value="">
index b8353d5..e6493f3 100644 (file)
@@ -2,8 +2,6 @@
 
 <form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="type" value="parts">
  <input type="hidden" name="action" value="login">
  <input type="hidden" name="action2" value="">
index 2359878..bdf2180 100644 (file)
@@ -2,8 +2,6 @@
 
 <form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="type" value="parts">
  <input type="hidden" name="action" value="login">
  <input type="hidden" name="action2" value="">
index b93d1d7..0e53064 100644 (file)
@@ -2,8 +2,6 @@
 
 <form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="action" value="login">
  <input type="hidden" name="action2" value="">
 
index 656012b..f310c0c 100644 (file)
@@ -2,8 +2,6 @@
 
 <form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="action" value="login">
  <input type="hidden" name="action2" value="">
 
index 7db7cf9..a92d486 100644 (file)
@@ -2,8 +2,6 @@
 
 <form action="[% menufile %]">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="action" value="display">
 
  <p><input type="submit" value="Weiter"></p>
index b89531f..dda72dd 100644 (file)
@@ -2,8 +2,6 @@
 
 <form action="[% menufile %]">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="action" value="display">
 
  <p><input type="submit" value="<translate>Continue</translate>"></p>
index 425fd90..dcea40e 100644 (file)
@@ -2,8 +2,6 @@
 
 <form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="action" value="login">
  <input type="hidden" name="action2" value="">
 
index ea44240..7e29a03 100644 (file)
@@ -2,8 +2,6 @@
 
 <form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="action" value="login">
  <input type="hidden" name="action2" value="">
 
index f1af5f3..04d5d8e 100644 (file)
@@ -2,8 +2,6 @@
 
 <form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="unit_type" value="dimension">
  <input type="hidden" name="action" value="login">
  <input type="hidden" name="action2" value="">
index a7737b9..ad06450 100644 (file)
@@ -2,8 +2,6 @@
 
 <form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="unit_type" value="dimension">
  <input type="hidden" name="action" value="login">
  <input type="hidden" name="action2" value="">
index d115617..0304c38 100644 (file)
@@ -2,8 +2,6 @@
 
 <form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="unit_type" value="service">
  <input type="hidden" name="action" value="login">
  <input type="hidden" name="action2" value="">
index 6237146..32ba81c 100644 (file)
@@ -2,8 +2,6 @@
 
 <form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="unit_type" value="service">
  <input type="hidden" name="action" value="login">
  <input type="hidden" name="action2" value="">
index 7b59444..1377c6f 100644 (file)
@@ -2,8 +2,6 @@
 
 <form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="unit_type" value="dimension">
  <input type="hidden" name="action" value="login">
  <input type="hidden" name="action2" value="">
index 655d45b..e2779d9 100644 (file)
@@ -2,8 +2,6 @@
 
 <form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="unit_type" value="dimension">
  <input type="hidden" name="action" value="login">
  <input type="hidden" name="action2" value="">
index 7f926db..3be95a2 100644 (file)
@@ -1,7 +1,5 @@
 [% USE HTML %]<form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="action" value="login">
 
  <p>
index 160c236..10f70a4 100644 (file)
@@ -1,7 +1,5 @@
 [% USE HTML %]<form name="Form" method="post" action="login.pl">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="hashed_password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="action" value="login">
 
  <p>
index b58ab1c..49e22cf 100644 (file)
@@ -2,9 +2,6 @@
 
  <form action="[% HTML.escape(script) %]" method="post">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
   <input type="hidden" name="SAVED_FORM" value="[% HTML.escape(SAVED_FORM) %]">
 
   <table width="100%">
@@ -33,7 +30,7 @@
        <tr class="listrow[% loop.count % 2 %]">
         <td><input type="checkbox" name="checked_[% row.id %]" value="1"></td>
         <td>[% HTML.escape(row.itime) %]</td>
-        <td><a href="[% HTML.url(script) %]?login=[% HTML.url(login) %]&password=[% HTML.url(password) %]&action=load_draft&id=[% HTML.url(row.id) %]">[% HTML.escape(row.description) %]</a></td>
+        <td><a href="[% HTML.url(script) %]?action=load_draft&id=[% HTML.url(row.id) %]">[% HTML.escape(row.description) %]</a></td>
         <td>[% HTML.escape(row.employee_name) %]</td>
        </tr>
       [% END %]
index 46d7972..cc80110 100644 (file)
@@ -2,9 +2,6 @@
 
  <form action="[% HTML.escape(script) %]" method="post">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
   <input type="hidden" name="SAVED_FORM" value="[% HTML.escape(SAVED_FORM) %]">
 
   <table width="100%">
@@ -33,7 +30,7 @@
        <tr class="listrow[% loop.count % 2 %]">
         <td><input type="checkbox" name="checked_[% row.id %]" value="1"></td>
         <td>[% HTML.escape(row.itime) %]</td>
-        <td><a href="[% HTML.url(script) %]?login=[% HTML.url(login) %]&password=[% HTML.url(password) %]&action=load_draft&id=[% HTML.url(row.id) %]">[% HTML.escape(row.description) %]</a></td>
+        <td><a href="[% HTML.url(script) %]?action=load_draft&id=[% HTML.url(row.id) %]">[% HTML.escape(row.description) %]</a></td>
         <td>[% HTML.escape(row.employee_name) %]</td>
        </tr>
       [% END %]
index 815adc1..01c46c1 100644 (file)
@@ -2,9 +2,6 @@
 
  <form action="[% HTML.escape(script) %]" method="post">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
   <input type="hidden" name="SAVED_FORM" value="[% HTML.escape(SAVED_FORM) %]">
 
   <table width="100%">
index 50f5fc2..3f773a1 100644 (file)
@@ -2,9 +2,6 @@
 
  <form action="[% HTML.escape(script) %]" method="post">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
   <input type="hidden" name="SAVED_FORM" value="[% HTML.escape(SAVED_FORM) %]">
 
   <table width="100%">
index f95676d..6a1c193 100644 (file)
@@ -84,9 +84,6 @@
 
   <input type="hidden" name="nextsub" value="show_invoices">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
   <br>
   <input class="submit" type="submit" name="action" value="Weiter">
 
index 8ff0289..3c29092 100644 (file)
@@ -84,9 +84,6 @@
 
   <input type="hidden" name="nextsub" value="show_invoices">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
   <br>
   <input class="submit" type="submit" name="action" value="<translate>Continue</translate>">
 
index 53e8b69..d829d3b 100644 (file)
 
   <input type="hidden" name="callback" value="[% HTML.escape(callback) %]">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
   <input class="submit" type="submit" name="action" value="Speichern">
 
  </form>
index 337fae7..3d8cb60 100644 (file)
 
   <input type="hidden" name="callback" value="[% HTML.escape(callback) %]">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
   <input class="submit" type="submit" name="action" value="<translate>Save</translate>">
 
  </form>
index 3d48065..b9cc9fd 100644 (file)
 
   <input type="hidden" name="nextsub" value="show_dunning">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
   <br>
 
   <input class="submit" type="submit" name="action" value="Weiter">
index 4ef95e4..791836e 100644 (file)
 
   <input type="hidden" name="nextsub" value="show_dunning">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
   <br>
 
   <input class="submit" type="submit" name="action" value="<translate>Continue</translate>">
index f567b99..f835f95 100644 (file)
@@ -3,6 +3,3 @@
 
  <form method="post" action="dn.pl">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
index f567b99..f835f95 100644 (file)
@@ -3,6 +3,3 @@
 
  <form method="post" action="dn.pl">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
index 366c071..5efe3c7 100644 (file)
@@ -74,8 +74,6 @@
   <input name="callback" type="hidden" value="[% HTML.escape(callback) %]">
   <input name="nextsub" type="hidden" value="save_dunning">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
   <input type="hidden" name="action" value="Weiter">
 
   <input type="submit" name="dummy" value="Weiter"
index 84126a3..8311014 100644 (file)
@@ -76,8 +76,6 @@
   <input name="callback" type="hidden" value="[% HTML.escape(callback) %]">
   <input name="nextsub" type="hidden" value="save_dunning">
 
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
   <input type="hidden" name="action" value="<translate>Continue</translate>">
 
   <input type="submit" name="dummy" value="<translate>Continue</translate>"
diff --git a/templates/webpages/generic/part_selection_de.html b/templates/webpages/generic/part_selection_de.html
new file mode 100644 (file)
index 0000000..f6c8b02
--- /dev/null
@@ -0,0 +1,116 @@
+[% USE HTML %]<body [% IF onload %]onload="[% onload %]"[% END %]>
+
+ <form action="[% HTML.escape(script) %]" method="post" name="Form">
+
+  <input type="hidden" name="input_partnumber" value="[% HTML.escape(input_partnumber) %]">
+  <input type="hidden" name="input_description" value="[% HTML.escape(input_description) %]">
+  <input type="hidden" name="input_partsid" value="[% HTML.escape(input_partsid) %]">
+  <input type="hidden" name="input_partnotes" value="[% HTML.escape(input_partnotes) %]">
+  <input type="hidden" name="allow_creation" value="[% HTML.escape(allow_creation) %]">
+  <input type="hidden" name="action_on_part_selected" value="[% HTML.escape(action_on_part_selected) %]">
+  <input type="hidden" name="filter" value="[% HTML.escape(filter) %]">
+  <input type="hidden" name="new_description" value="[% HTML.escape(description) %]">
+
+  <div class="listtop">[% title %]</div>
+
+  <table width="100%">
+   <tr>
+    <td>
+     [% IF no_parts_found %]
+     Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.
+     [% IF allow_creation %]
+     Sie k&ouml;nnen jedoch einen neuen Artikel anlegen, der dann automatisch ausgew&auml;hlt wird.
+     [% END %]
+     [% ELSE %]
+     Bitte w&auml;hlen Sie einen Artikel aus der Liste aus.
+     [% IF allow_creation %]
+     Sie k&ouml;nnen auch einen neuen Artikel anlegen, der dann automatisch ausgew&auml;hlt wird.
+     [% END %]
+     [% END %]
+    </td>
+   </tr>
+
+   [% UNLESS no_parts_found %]
+   <tr>
+    <td>
+     <table>
+      <tr class="listheading">
+       <th class="listheading">&nbsp;</th>
+       [% FOREACH header = HEADER %]
+       <th nowrap class="listheading"><a href="[% HTML.escape(header.callback) %]">[% header.column_title %]</a></th>
+       [% END %]
+      </tr>
+
+      [% FOREACH part = PARTS %]
+      <tr class="listrow[% IF loop.count % 2 %]1[% ELSE %]0[% END %]">
+       <td><button type="button" onclick="part_selected('[% loop.count %]')">auswählen</button></td>
+       <td>
+        <input type="hidden" id="partsid_[% loop.count %]" name="partsid_[% loop.count %]" value="[% HTML.escape(part.id) %]">
+        <input type="hidden" id="partnumber_[% loop.count %]" name="partnumber_[% loop.count %]" value="[% HTML.escape(part.partnumber) %]">
+        [% HTML.escape(part.partnumber) %]
+       </td>
+       <td>
+        <input type="hidden" id="description_[% loop.count %]" name="description_[% loop.count %]" value="[% HTML.escape(part.description) %]">
+        <input type="hidden" id="partnotes_[% loop.count %]" name="partnotes_[% loop.count %]" value="[% HTML.escape(part.partnotes) %]">
+        [% HTML.escape(part.description) %]
+       </td>
+<!--        <td> -->
+<!--         <input type="hidden" id="onhand_[% loop.count %]" name="onhand_[% loop.count %]" value="[% HTML.escape(part.onhand) %]"> -->
+<!--         [% HTML.escape(part.onhand) %] -->
+<!--        </td> -->
+      </tr>
+      [% END %]
+     </table>
+    </td>
+   </tr>
+   [% END %]
+  </table>
+
+  [% IF allow_creation %]
+  <p><input type="submit" name="action" value="Neue Ware"></p>
+  [% END %]
+
+ </form>
+
+ <script type="text/javascript">
+  <!--
+      function part_selected(selected) {
+        var partnumber = document.getElementsByName("partnumber_" + selected)[0].value;
+        var description = document.getElementsByName("description_" + selected)[0].value;
+        var partsid = document.getElementsByName("partsid_" + selected)[0].value;
+        var partnotes = document.getElementsByName("partnotes_" + selected)[0].value;
+        var pnum_name = document.Form.input_partnumber.value;
+        window.opener.document.getElementsByName(pnum_name)[0].value = partnumber;
+        window.opener.document.getElementsByName(document.Form.input_description.value)[0].value = description;
+        if (document.Form.input_partsid.value != "") {
+          window.opener.document.getElementsByName(document.Form.input_partsid.value)[0].value = partsid;
+        }
+        if (document.Form.input_partnotes.value != "") {
+          var el = window.opener.document.getElementsByName(document.Form.input_partnotes.value)[0];
+          if (el)
+            el.value = partnotes;
+        }
+        if (document.Form.action_on_part_selected.value != "") {
+          window.opener.document.getElementsByName("action")[0].value = document.Form.action_on_part_selected.value;
+          window.opener.document.Form.submit();
+        }
+
+
+        var prefix = "";
+        if (pnum_name.substr(0, 2) == "f_") {
+          prefix = "f_";
+          pnum_name = pnum_name.substr(2);
+        }
+        pnum_name = prefix + "old_" + pnum_name;
+        var input = window.opener.document.getElementsByName(pnum_name)[0];
+        if (input) {
+          input.value = name;
+        }
+
+        self.close();
+      }
+      //-->
+ </script>
+
+</body>
+</html>
diff --git a/templates/webpages/generic/part_selection_master.html b/templates/webpages/generic/part_selection_master.html
new file mode 100644 (file)
index 0000000..41c3f51
--- /dev/null
@@ -0,0 +1,116 @@
+[% USE HTML %]<body [% IF onload %]onload="[% onload %]"[% END %]>
+
+ <form action="[% HTML.escape(script) %]" method="post" name="Form">
+
+  <input type="hidden" name="input_partnumber" value="[% HTML.escape(input_partnumber) %]">
+  <input type="hidden" name="input_description" value="[% HTML.escape(input_description) %]">
+  <input type="hidden" name="input_partsid" value="[% HTML.escape(input_partsid) %]">
+  <input type="hidden" name="input_partnotes" value="[% HTML.escape(input_partnotes) %]">
+  <input type="hidden" name="allow_creation" value="[% HTML.escape(allow_creation) %]">
+  <input type="hidden" name="action_on_part_selected" value="[% HTML.escape(action_on_part_selected) %]">
+  <input type="hidden" name="filter" value="[% HTML.escape(filter) %]">
+  <input type="hidden" name="new_description" value="[% HTML.escape(description) %]">
+
+  <div class="listtop">[% title %]</div>
+
+  <table width="100%">
+   <tr>
+    <td>
+     [% IF no_parts_found %]
+     <translate>No part was found matching the search parameters.</translate>
+     [% IF allow_creation %]
+     <translate>However, you can create a new part which will then be selected.</translate>
+     [% END %]
+     [% ELSE %]
+     <translate>Please select a part from the list below.</translate>
+     [% IF allow_creation %]
+     <translate>Alternatively you can create a new part which will then be selected.</translate>
+     [% END %]
+     [% END %]
+    </td>
+   </tr>
+
+   [% UNLESS no_parts_found %]
+   <tr>
+    <td>
+     <table>
+      <tr class="listheading">
+       <th class="listheading">&nbsp;</th>
+       [% FOREACH header = HEADER %]
+       <th nowrap class="listheading"><a href="[% HTML.escape(header.callback) %]">[% header.column_title %]</a></th>
+       [% END %]
+      </tr>
+
+      [% FOREACH part = PARTS %]
+      <tr class="listrow[% IF loop.count % 2 %]1[% ELSE %]0[% END %]">
+       <td><button type="button" onclick="part_selected('[% loop.count %]')"><translate>Select</translate></button></td>
+       <td>
+        <input type="hidden" id="partsid_[% loop.count %]" name="partsid_[% loop.count %]" value="[% HTML.escape(part.id) %]">
+        <input type="hidden" id="partnumber_[% loop.count %]" name="partnumber_[% loop.count %]" value="[% HTML.escape(part.partnumber) %]">
+        [% HTML.escape(part.partnumber) %]
+       </td>
+       <td>
+        <input type="hidden" id="description_[% loop.count %]" name="description_[% loop.count %]" value="[% HTML.escape(part.description) %]">
+        <input type="hidden" id="partnotes_[% loop.count %]" name="partnotes_[% loop.count %]" value="[% HTML.escape(part.partnotes) %]">
+        [% HTML.escape(part.description) %]
+       </td>
+<!--        <td> -->
+<!--         <input type="hidden" id="onhand_[% loop.count %]" name="onhand_[% loop.count %]" value="[% HTML.escape(part.onhand) %]"> -->
+<!--         [% HTML.escape(part.onhand) %] -->
+<!--        </td> -->
+      </tr>
+      [% END %]
+     </table>
+    </td>
+   </tr>
+   [% END %]
+  </table>
+
+  [% IF allow_creation %]
+  <p><input type="submit" name="action" value="<translate>New part</translate>"></p>
+  [% END %]
+
+ </form>
+
+ <script type="text/javascript">
+  <!--
+      function part_selected(selected) {
+        var partnumber = document.getElementsByName("partnumber_" + selected)[0].value;
+        var description = document.getElementsByName("description_" + selected)[0].value;
+        var partsid = document.getElementsByName("partsid_" + selected)[0].value;
+        var partnotes = document.getElementsByName("partnotes_" + selected)[0].value;
+        var pnum_name = document.Form.input_partnumber.value;
+        window.opener.document.getElementsByName(pnum_name)[0].value = partnumber;
+        window.opener.document.getElementsByName(document.Form.input_description.value)[0].value = description;
+        if (document.Form.input_partsid.value != "") {
+          window.opener.document.getElementsByName(document.Form.input_partsid.value)[0].value = partsid;
+        }
+        if (document.Form.input_partnotes.value != "") {
+          var el = window.opener.document.getElementsByName(document.Form.input_partnotes.value)[0];
+          if (el)
+            el.value = partnotes;
+        }
+        if (document.Form.action_on_part_selected.value != "") {
+          window.opener.document.getElementsByName("action")[0].value = document.Form.action_on_part_selected.value;
+          window.opener.document.Form.submit();
+        }
+
+
+        var prefix = "";
+        if (pnum_name.substr(0, 2) == "f_") {
+          prefix = "f_";
+          pnum_name = pnum_name.substr(2);
+        }
+        pnum_name = prefix + "old_" + pnum_name;
+        var input = window.opener.document.getElementsByName(pnum_name)[0];
+        if (input) {
+          input.value = name;
+        }
+
+        self.close();
+      }
+      //-->
+ </script>
+
+</body>
+</html>
diff --git a/templates/webpages/generic/project_selection_de.html b/templates/webpages/generic/project_selection_de.html
new file mode 100644 (file)
index 0000000..f3d8758
--- /dev/null
@@ -0,0 +1,108 @@
+[% USE HTML %]<body [% IF onload %]onload="[% onload %]"[% END %]>
+
+ <form action="[% HTML.escape(script) %]" method="post" name="Form">
+
+  <input type="hidden" name="input_projectnumber" value="[% HTML.escape(input_projectnumber) %]">
+  <input type="hidden" name="input_old_projectnumber" value="[% HTML.escape(input_old_projectnumber) %]">
+  <input type="hidden" name="input_description" value="[% HTML.escape(input_description) %]">
+  <input type="hidden" name="input_project_id" value="[% HTML.escape(input_project_id) %]">
+
+  <div class="listtop">[% title %]</div>
+
+  <p>
+   <table width="100%">
+    <tr>
+     <td>
+      [%- UNLESS PROJECTS.size %]
+      Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.
+      [%- IF AUTH_RIGHTS_PROJECT_EDIT %]
+      Sie k&ouml;nnen jedoch ein neues Projekt anlegen, das dann automatisch ausgew&auml;hlt wird.
+      [%- END %]
+      [%- ELSE %]
+      Bitte w&auml;hlen Sie ein Projekt aus der Liste aus.
+      [%- IF AUTH_RIGHTS_PROJECT_EDIT %]
+      Alternativ k&ouml;nnen Sie auch ein neues Projekt anlegen, das dann automatisch ausgew&auml;hlt wird.
+      [%- END %]
+      [%- END %]
+     </td>
+    </tr>
+
+    [% UNLESS no_projects_found %]
+    <tr>
+     <td>
+
+      <table>
+       <tr class="listheading">
+        <th class="listheading">&nbsp;</th>
+        [% FOREACH row = HEADER %]
+        <th nowrap class="listheading"><a href="[% HTML.escape(row.callback) %]">[% row.column_title %]</a></th>
+        [% END %]
+       </tr>
+
+       [%- SET row_odd = '1' %][%- USE projects_it = Iterator(PROJECTS) %][%- FOREACH project = projects_it %]
+       <tr class="listrow[% IF row_odd %]1[% SET row_odd = '0' %][% ELSE %]0[% SET row_odd = '1' %][% END %]">
+        <td><button type="button" onclick="project_selected('[% projects_it.count %]')">auswählen</button></td>
+
+        <td>
+         <input type="hidden" id="id_[% projects_it.count %]" name="id_[% projects_it.count %]" value="[% HTML.escape(project.id) %]">
+         <input type="hidden" id="projectnumber_[% projects_it.count %]" name="projectnumber_[% projects_it.count %]" value="[% HTML.escape(project.projectnumber) %]">
+         [% HTML.escape(project.projectnumber) %]</td>
+        <td><input type="hidden" id="description_[% projects_it.count %]" name="description_[% projects_it.count %]" value="[% HTML.escape(project.description) %]">
+         [% HTML.escape(project.description) %]</td>
+       </tr>
+       [% END %]
+      </table>
+
+     </td>
+    </tr>
+    [% END %]
+   </table>
+  </p>
+
+  [%- IF AUTH_RIGHTS_PROJECT_EDIT %]
+  <p><input type="submit" name="action" value="Neues Projekt"></p>
+  [%- END %]
+
+ </form>
+
+ <script type="text/javascript">
+  <!--
+      function project_selected(selected) {
+        var projectnumber = document.getElementById("projectnumber_" + selected).value
+        var description   = document.getElementById("description_" + selected).value
+        var id            = document.getElementById("id_" + selected).value
+        var pnum_name     = document.Form.input_projectnumber.value;
+
+        window.opener.document.getElementsByName(pnum_name)[0].value = projectnumber;
+
+        if (document.Form.input_description.value != "") {
+          window.opener.document.getElementsByName(document.Form.input_description.value)[0].value = description;
+        }
+
+        if (document.Form.input_project_id.value != "") {
+          window.opener.document.getElementsByName(document.Form.input_project_id.value)[0].value = id;
+        }
+
+        if (document.Form.input_old_projectnumber.value != "") {
+          window.opener.document.getElementsByName(document.Form.input_old_projectnumber.value)[0].value = projectnumber;
+        }
+
+        var prefix = "";
+        if (pnum_name.substr(0, 2) == "f_") {
+          prefix = "f_";
+          pnum_name = pnum_name.substr(2);
+        }
+
+        pnum_name = prefix + "old_" + pnum_name;
+        var input = window.opener.document.getElementsByName(pnum_name)[0];
+        if (input) {
+          input.value = projectnumber;
+        }
+
+        self.close();
+      }
+      //-->
+ </script>
+
+</body>
+</html>
diff --git a/templates/webpages/generic/project_selection_master.html b/templates/webpages/generic/project_selection_master.html
new file mode 100644 (file)
index 0000000..b9fd6a1
--- /dev/null
@@ -0,0 +1,108 @@
+[% USE HTML %]<body [% IF onload %]onload="[% onload %]"[% END %]>
+
+ <form action="[% HTML.escape(script) %]" method="post" name="Form">
+
+  <input type="hidden" name="input_projectnumber" value="[% HTML.escape(input_projectnumber) %]">
+  <input type="hidden" name="input_old_projectnumber" value="[% HTML.escape(input_old_projectnumber) %]">
+  <input type="hidden" name="input_description" value="[% HTML.escape(input_description) %]">
+  <input type="hidden" name="input_project_id" value="[% HTML.escape(input_project_id) %]">
+
+  <div class="listtop">[% title %]</div>
+
+  <p>
+   <table width="100%">
+    <tr>
+     <td>
+      [%- UNLESS PROJECTS.size %]
+      <translate>No project was found matching the search parameters.</translate>
+      [%- IF AUTH_RIGHTS_PROJECT_EDIT %]
+      <translate>However, you can create a new project which will then be selected.</translate>
+      [%- END %]
+      [%- ELSE %]
+      <translate>Please select a project from the list below.</translate>
+      [%- IF AUTH_RIGHTS_PROJECT_EDIT %]
+      <translate>Alternatively you can create a new project which will then be selected.</translate>
+      [%- END %]
+      [%- END %]
+     </td>
+    </tr>
+
+    [% UNLESS no_projects_found %]
+    <tr>
+     <td>
+
+      <table>
+       <tr class="listheading">
+        <th class="listheading">&nbsp;</th>
+        [% FOREACH row = HEADER %]
+        <th nowrap class="listheading"><a href="[% HTML.escape(row.callback) %]">[% row.column_title %]</a></th>
+        [% END %]
+       </tr>
+
+       [%- SET row_odd = '1' %][%- USE projects_it = Iterator(PROJECTS) %][%- FOREACH project = projects_it %]
+       <tr class="listrow[% IF row_odd %]1[% SET row_odd = '0' %][% ELSE %]0[% SET row_odd = '1' %][% END %]">
+        <td><button type="button" onclick="project_selected('[% projects_it.count %]')"><translate>Select</translate></button></td>
+
+        <td>
+         <input type="hidden" id="id_[% projects_it.count %]" name="id_[% projects_it.count %]" value="[% HTML.escape(project.id) %]">
+         <input type="hidden" id="projectnumber_[% projects_it.count %]" name="projectnumber_[% projects_it.count %]" value="[% HTML.escape(project.projectnumber) %]">
+         [% HTML.escape(project.projectnumber) %]</td>
+        <td><input type="hidden" id="description_[% projects_it.count %]" name="description_[% projects_it.count %]" value="[% HTML.escape(project.description) %]">
+         [% HTML.escape(project.description) %]</td>
+       </tr>
+       [% END %]
+      </table>
+
+     </td>
+    </tr>
+    [% END %]
+   </table>
+  </p>
+
+  [%- IF AUTH_RIGHTS_PROJECT_EDIT %]
+  <p><input type="submit" name="action" value="<translate>New project</translate>"></p>
+  [%- END %]
+
+ </form>
+
+ <script type="text/javascript">
+  <!--
+      function project_selected(selected) {
+        var projectnumber = document.getElementById("projectnumber_" + selected).value
+        var description   = document.getElementById("description_" + selected).value
+        var id            = document.getElementById("id_" + selected).value
+        var pnum_name     = document.Form.input_projectnumber.value;
+
+        window.opener.document.getElementsByName(pnum_name)[0].value = projectnumber;
+
+        if (document.Form.input_description.value != "") {
+          window.opener.document.getElementsByName(document.Form.input_description.value)[0].value = description;
+        }
+
+        if (document.Form.input_project_id.value != "") {
+          window.opener.document.getElementsByName(document.Form.input_project_id.value)[0].value = id;
+        }
+
+        if (document.Form.input_old_projectnumber.value != "") {
+          window.opener.document.getElementsByName(document.Form.input_old_projectnumber.value)[0].value = projectnumber;
+        }
+
+        var prefix = "";
+        if (pnum_name.substr(0, 2) == "f_") {
+          prefix = "f_";
+          pnum_name = pnum_name.substr(2);
+        }
+
+        pnum_name = prefix + "old_" + pnum_name;
+        var input = window.opener.document.getElementsByName(pnum_name)[0];
+        if (input) {
+          input.value = projectnumber;
+        }
+
+        self.close();
+      }
+      //-->
+ </script>
+
+</body>
+</html>
diff --git a/templates/webpages/generic/select_part_de.html b/templates/webpages/generic/select_part_de.html
new file mode 100644 (file)
index 0000000..abf7a72
--- /dev/null
@@ -0,0 +1,61 @@
+[% USE HTML %]<body [% IF onload %]onload="[% onload %]"[% END %]>
+
+ <form method="post" action="[% HTML.escape(script) %]">
+
+  <input type="hidden" name="nextsub" value="[% HTML.escape(nextsub) %]">
+  <input type="hidden" name="callback_sub" value="[% HTML.escape(callback_sub) %]">
+
+  <input type="hidden" name="old_form" value="[% HTML.escape(old_form) %]">
+  <input type="hidden" name="remap_parts_id" value="[% HTML.escape(remap_parts_id) %]">
+  <input type="hidden" name="remap_partnumber" value="[% HTML.escape(remap_partnumber) %]">
+
+  <div class="listtop">Artikel ausw&auml;hlen</div>
+
+  <p>
+   <table>
+    <tr>
+     <th class="listheading">&nbsp;</th>
+     <th class="listheading">Nummer</th>
+     <th class="listheading">Beschreibung</th>
+     [% IF has_charge %]
+     <th class="listheading">Chargennummer</th>
+     [% END %]
+    </tr>
+
+    [% FOREACH part = PARTS %]
+    <tr class="listrow[% loop.count % 2 %]">
+     <td>
+      <input type="radio" name="selection" value="[% loop.count %]"[% IF loop.first %] checked[% END %]>
+     </td>
+
+     <td>
+      <input type="hidden" name="new_id_[% loop.count %]" value="[% HTML.escape(part.id) %]">
+      <input type="hidden" name="new_number_[% loop.count %]" value="[% HTML.escape(part.number) %]">
+      [% HTML.escape(part.number) %]
+     </td>
+
+     <td>
+      <input type="hidden" name="new_description_[% loop.count %]" value="[% HTML.escape(part.description) %]">
+      [% HTML.escape(part.description) %]
+     </td>
+
+     [% IF has_charge %]
+     <td>
+      <input type="hidden" name="new_charge_id_[% loop.count %]" value="[% HTML.escape(part.charge_id) %]">
+      <input type="hidden" name="new_chargenumber_[% loop.count %]" value="[% HTML.escape(part.chargenumber) %]">
+      [% HTML.escape(part.chargenumber) %]
+     </td>
+     [% END %]
+    </tr>
+    [% END %]
+   </table>
+  </p>
+
+  <p>
+   <input type="submit" class="submit" name="action" value="Weiter">
+  </p>
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/generic/select_part_master.html b/templates/webpages/generic/select_part_master.html
new file mode 100644 (file)
index 0000000..836dde5
--- /dev/null
@@ -0,0 +1,61 @@
+[% USE HTML %]<body [% IF onload %]onload="[% onload %]"[% END %]>
+
+ <form method="post" action="[% HTML.escape(script) %]">
+
+  <input type="hidden" name="nextsub" value="[% HTML.escape(nextsub) %]">
+  <input type="hidden" name="callback_sub" value="[% HTML.escape(callback_sub) %]">
+
+  <input type="hidden" name="old_form" value="[% HTML.escape(old_form) %]">
+  <input type="hidden" name="remap_parts_id" value="[% HTML.escape(remap_parts_id) %]">
+  <input type="hidden" name="remap_partnumber" value="[% HTML.escape(remap_partnumber) %]">
+
+  <div class="listtop"><translate>Select a part</translate></div>
+
+  <p>
+   <table>
+    <tr>
+     <th class="listheading">&nbsp;</th>
+     <th class="listheading"><translate>Number</translate></th>
+     <th class="listheading"><translate>Description</translate></th>
+     [% IF has_charge %]
+     <th class="listheading"><translate>Charge number</translate></th>
+     [% END %]
+    </tr>
+
+    [% FOREACH part = PARTS %]
+    <tr class="listrow[% loop.count % 2 %]">
+     <td>
+      <input type="radio" name="selection" value="[% loop.count %]"[% IF loop.first %] checked[% END %]>
+     </td>
+
+     <td>
+      <input type="hidden" name="new_id_[% loop.count %]" value="[% HTML.escape(part.id) %]">
+      <input type="hidden" name="new_number_[% loop.count %]" value="[% HTML.escape(part.number) %]">
+      [% HTML.escape(part.number) %]
+     </td>
+
+     <td>
+      <input type="hidden" name="new_description_[% loop.count %]" value="[% HTML.escape(part.description) %]">
+      [% HTML.escape(part.description) %]
+     </td>
+
+     [% IF has_charge %]
+     <td>
+      <input type="hidden" name="new_charge_id_[% loop.count %]" value="[% HTML.escape(part.charge_id) %]">
+      <input type="hidden" name="new_chargenumber_[% loop.count %]" value="[% HTML.escape(part.chargenumber) %]">
+      [% HTML.escape(part.chargenumber) %]
+     </td>
+     [% END %]
+    </tr>
+    [% END %]
+   </table>
+  </p>
+
+  <p>
+   <input type="submit" class="submit" name="action" value="<translate>Continue</translate>">
+  </p>
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/generic/select_project_de.html b/templates/webpages/generic/select_project_de.html
new file mode 100644 (file)
index 0000000..e4765f4
--- /dev/null
@@ -0,0 +1,46 @@
+[% USE HTML %]<body [% IF onload %]onload="[% onload %]"[% END %]>
+
+ <form method="post" action="[% HTML.escape(script) %]">
+
+  <input type="hidden" name="nextsub" value="[% HTML.escape(nextsub) %]">
+  <input type="hidden" name="callback_sub" value="[% HTML.escape(callback_sub) %]">
+  <input type="hidden" name="prefix" value="[% HTML.escape(prefix) %]">
+
+  <input type="hidden" name="old_form" value="[% HTML.escape(old_form) %]">
+
+  <div class="listtop">Projekt ausw&auml;hlen</div>
+
+  <p>
+   <table>
+    <tr>
+     <td>
+      <table>
+       <tr>
+        <th class="listheading">&nbsp;</th>
+        <th class="listheading">Projektnummer</th>
+        <th class="listheading">Beschreibung</th>
+       </tr>
+
+       [% FOREACH PROJECTS %]
+       <tr class="listrow[% IF loop.count % 2 %]1[% ELSE %]0[% END %]">
+        <td>
+         <input type="hidden" name="new_id_[% loop.count %]" value="[% HTML.escape(id) %]">
+         <input type="hidden" name="new_number_[% loop.count %]" value="[% HTML.escape(projectnumber) %]">
+         <input type="hidden" name="new_description_[% loop.count %]" value="[% HTML.escape(description) %]">
+         <input type="radio" name="selection" value="[% loop.count %]" [% IF loop.first %]checked[% END %]>
+        </td>
+        <td>[% HTML.escape(projectnumber) %]</td>
+        <td>[% HTML.escape(description) %]</td>
+       </tr>
+       [% END %]
+      </table>
+     </td>
+    </tr>
+   </table>
+  </p>
+
+  <input type="submit" class="submit" name="action" value="Weiter">
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/generic/select_project_master.html b/templates/webpages/generic/select_project_master.html
new file mode 100644 (file)
index 0000000..f1ee98c
--- /dev/null
@@ -0,0 +1,46 @@
+[% USE HTML %]<body [% IF onload %]onload="[% onload %]"[% END %]>
+
+ <form method="post" action="[% HTML.escape(script) %]">
+
+  <input type="hidden" name="nextsub" value="[% HTML.escape(nextsub) %]">
+  <input type="hidden" name="callback_sub" value="[% HTML.escape(callback_sub) %]">
+  <input type="hidden" name="prefix" value="[% HTML.escape(prefix) %]">
+
+  <input type="hidden" name="old_form" value="[% HTML.escape(old_form) %]">
+
+  <div class="listtop"><translate>Select a project</translate></div>
+
+  <p>
+   <table>
+    <tr>
+     <td>
+      <table>
+       <tr>
+        <th class="listheading">&nbsp;</th>
+        <th class="listheading"><translate>Project number</translate></th>
+        <th class="listheading"><translate>Description</translate></th>
+       </tr>
+
+       [% FOREACH PROJECTS %]
+       <tr class="listrow[% IF loop.count % 2 %]1[% ELSE %]0[% END %]">
+        <td>
+         <input type="hidden" name="new_id_[% loop.count %]" value="[% HTML.escape(id) %]">
+         <input type="hidden" name="new_number_[% loop.count %]" value="[% HTML.escape(projectnumber) %]">
+         <input type="hidden" name="new_description_[% loop.count %]" value="[% HTML.escape(description) %]">
+         <input type="radio" name="selection" value="[% loop.count %]" [% IF loop.first %]checked[% END %]>
+        </td>
+        <td>[% HTML.escape(projectnumber) %]</td>
+        <td>[% HTML.escape(description) %]</td>
+       </tr>
+       [% END %]
+      </table>
+     </td>
+    </tr>
+   </table>
+  </p>
+
+  <input type="submit" class="submit" name="action" value="<translate>Continue</translate>">
+ </form>
+
+</body>
+</html>
index 5b53038..3798ab0 100644 (file)
@@ -2,9 +2,6 @@
 
  <input name="callback" type="hidden" value="[% HTML.escape(callback) %]">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
  <input class="submit" type="submit" name="action" value="Dialogbuchung">
  <input class="submit" type="submit" name="action" value="Debitorenbuchung">
  <input class="submit" type="submit" name="action" value="Kreditorenbuchung">
index 538761b..a5c41ff 100644 (file)
@@ -2,9 +2,6 @@
 
  <input name="callback" type="hidden" value="[% HTML.escape(callback) %]">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
  <input class="submit" type="submit" name="action" value="<translate>GL Transaction</translate>">
  <input class="submit" type="submit" name="action" value="<translate>AR Transaction</translate>">
  <input class="submit" type="submit" name="action" value="<translate>AP Transaction</translate>">
index 291cc4e..b6c6767 100644 (file)
@@ -4,9 +4,6 @@
 
  <input type="hidden" name="item" value="[% HTML.escape(searchitems) %]">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
  [% SWITCH searchitems %]
    [% CASE 'part' %]Neue Ware
    [% CASE 'service' %]Neue Dienstleistung
index 13a2b14..ede375c 100644 (file)
@@ -4,9 +4,6 @@
 
  <input type="hidden" name="item" value="[% HTML.escape(searchitems) %]">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
  [% SWITCH searchitems %]
    [% CASE 'part' %]<translate>New part</translate>
    [% CASE 'service' %]<translate>New service</translate>
index 32987e3..a292e85 100644 (file)
 
 <input type=hidden name=nextsub value=generate_report>
 
-<input type=hidden name=login value="[% login %]">
-<input type=hidden name=password value="[% password %]">
-
 <input type=hidden name=revers value="[% revers %]">
 <input type=hidden name=lastsort value="[% lastsort %]">
 <input type=hidden name=sort value="description">
index 9bb476b..607445c 100644 (file)
 
 <input type=hidden name=nextsub value=generate_report>
 
-<input type=hidden name=login value="[% login %]">
-<input type=hidden name=password value="[% password %]">
-
 <input type=hidden name=revers value="[% revers %]">
 <input type=hidden name=lastsort value="[% lastsort %]">
 <input type=hidden name=sort value="description">
index adb61d4..7f418e2 100644 (file)
@@ -90,9 +90,6 @@
 <input type=hidden name=nextsub value=confirm_price_update>
 <input type=hidden name=price_rows value=[% price_rows %]>
 
-<input type=hidden name=login value=[% login %]>
-<input type=hidden name=password value=[% password %]>
-
 <br>
 <input class=submit type=submit name=action value="Weiter">
 </form>
index 5feab3c..9163dfa 100644 (file)
@@ -90,9 +90,6 @@
 <input type=hidden name=nextsub value=confirm_price_update>
 <input type=hidden name=price_rows value=[% price_rows %]>
 
-<input type=hidden name=login value=[% login %]>
-<input type=hidden name=password value=[% password %]>
-
 <br>
 <input class=submit type=submit name=action value="<translate>Continue</translate>">
 </form>
diff --git a/templates/webpages/login/auth_db_unreachable_de.html b/templates/webpages/login/auth_db_unreachable_de.html
new file mode 100644 (file)
index 0000000..a30e4c9
--- /dev/null
@@ -0,0 +1,15 @@
+<body>
+
+ <p><b>Fehler!</b></p>
+
+ <p>Die Authentifizierungsdatenbank kann momentan nicht erreicht werden. Entweder wurde sie noch nicht eingerichtet, oder der Datenbankserver antwortet nicht. Bitte wenden Sie sich an Ihren Administrator.</p>
+
+ <p>Wenn Sie die Authentifizierungsdatenbank selber einrichten wollen, so melden Sie sich an der Administrationsoberfl&auml;che an. Lx-Office wird dann die Datenbank und die Tabellen f&uuml;r Sie anlegen.</p>
+
+ <p>
+  <a href="login.pl" target="_top">Anmeldung</a> |
+  <a href="admin.pl" target="_top">Administration</a>
+ </p>
+
+</body>
+</html>
diff --git a/templates/webpages/login/auth_db_unreachable_master.html b/templates/webpages/login/auth_db_unreachable_master.html
new file mode 100644 (file)
index 0000000..c2cbb82
--- /dev/null
@@ -0,0 +1,19 @@
+<body>
+
+ <p><b><translate>Error!</translate></b></p>
+
+ <p><translate>The authentication database is not reachable at the
+   moment. Either it hasn't been set up yet or the database server might
+   be down. Please contact your administrator.</translate></p>
+
+ <p><translate>If you want to set up the authentication database
+   yourself then log in to the administration panel. Lx-Office will
+   then create the database and tables for you.</translate></p>
+
+ <p>
+  <a href="login.pl" target="_top"><translate>Login</translate></a> |
+  <a href="admin.pl" target="_top"><translate>Administration</translate></a>
+ </p>
+
+</body>
+</html>
diff --git a/templates/webpages/login/authentication_pl_missing_de.html b/templates/webpages/login/authentication_pl_missing_de.html
new file mode 100644 (file)
index 0000000..08ee779
--- /dev/null
@@ -0,0 +1,15 @@
+<body>
+
+ <p><b>Fehler!</b></p>
+
+ <p>Die Konfigurationsdatei f&uuml;r die Authentifizierung &quot;config/authentication.pl&quot; wurde nicht gefunden. Diese Lx-Office-Installation wurde vermutlich noch nicht vollst&auml;ndig aktualisiert oder eingerichtet. Bitte wenden Sie sich an Ihren Administrator.</p>
+
+ <p>Wenn Sie selber die Aktualisierung bzw. Einrichtung &uuml;bernehmen wollen, so lesen Sie bitte die Datei &quot;doc/UPGRADE&quot; und folgen Sie den dort beschriebenen Schritten.</p>
+
+ <p>
+  <a href="login.pl" target="_top">Anmeldung</a> |
+  <a href="admin.pl" target="_top">Administration</a>
+ </p>
+
+</body>
+</html>
diff --git a/templates/webpages/login/authentication_pl_missing_master.html b/templates/webpages/login/authentication_pl_missing_master.html
new file mode 100644 (file)
index 0000000..30f87f3
--- /dev/null
@@ -0,0 +1,20 @@
+<body>
+
+ <p><b><translate>Error!</translate></b></p>
+
+ <p><translate>The authentication configuration file
+   &quot;config/authentication.pl&quot; does not exist. This Lx-Office
+   installation has probably not been updated correctly yet. Please
+   contact your administrator.</translate></p>
+
+ <p><translate>If you yourself want to upgrade the installation then
+   please read the file &quot;doc/UPGRADE&quot; and follow the steps
+   outlined in this file.</translate></p>
+
+ <p>
+  <a href="login.pl" target="_top"><translate>Login</translate></a> |
+  <a href="admin.pl" target="_top"><translate>Administration</translate></a>
+ </p>
+
+</body>
+</html>
index 6934db9..9455393 100644 (file)
@@ -12,7 +12,7 @@
    <b>
     [% HTML.escape(myconfig_company) %]
     <br>
-    [% HTML.escape(myconfig_address).replace('\\\\n', '<br>') %]
+    [% HTML.escape(myconfig_address).replace('\\\\n', '<br>').replace('\n', '<br>') %]
    </b>
 
    <br>
index 4af1057..3c81998 100644 (file)
@@ -12,7 +12,7 @@
    <b>
     [% HTML.escape(myconfig_company) %]
     <br>
-    [% HTML.escape(myconfig_address).replace('\\\\n', '<br>') %]
+    [% HTML.escape(myconfig_address).replace('\\\\n', '<br>').replace('\n', '<br>') %]
    </b>
 
    <br>
index 6dc00f7..071b579 100644 (file)
@@ -7,6 +7,10 @@
      <a href="http://www.lx-office.org" target="_top"><img src="image/lx-office-erp.png" border="0"></a>
      <h1 class="login" align="center">Version [% version %]</h1>
 
+     [% IF error_message %]
+     <p><span class="error_message">[% error_message %]</span></p>
+     [% END %]
+
      <p>
 
       <form method="post" name="loginscreen" action="login.pl">
            </tr>
           </table>
 
-[%- IF msg %]
-          <br>
-            <b>[% msg %]</b>
-          <br>
-[%- END %]
           <br>
           <input type="submit" name="action" value="Anmeldung" tabindex="3">
 
index 3106684..30e99a1 100644 (file)
@@ -7,6 +7,10 @@
      <a href="http://www.lx-office.org" target="_top"><img src="image/lx-office-erp.png" border="0"></a>
      <h1 class="login" align="center"><translate>Version</translate> [% version %]</h1>
 
+     [% IF error_message %]
+     <p><span class="error_message">[% error_message %]</span></p>
+     [% END %]
+
      <p>
 
       <form method="post" name="loginscreen" action="login.pl">
            </tr>
           </table>
 
-[%- IF msg %]
-          <br>
-            <b>[% msg %]</b>
-          <br>
-[%- END %]
           <br>
           <input type="submit" name="action" value="<translate>Login</translate>" tabindex="3">
 
diff --git a/templates/webpages/login/password_error_de.html b/templates/webpages/login/password_error_de.html
new file mode 100644 (file)
index 0000000..83fecc8
--- /dev/null
@@ -0,0 +1,10 @@
+<body>
+
+ <p><b>Fehler!</b></p>
+
+ <p>Ungültiges Passwort!</p>
+
+ <p><a href="login.pl" target="_top">Anmeldung</a></p>
+
+</body>
+</html>
diff --git a/templates/webpages/login/password_error_master.html b/templates/webpages/login/password_error_master.html
new file mode 100644 (file)
index 0000000..ad9fd2f
--- /dev/null
@@ -0,0 +1,10 @@
+<body>
+
+ <p><b><translate>Error!</translate></b></p>
+
+ <p><translate>Incorrect Password!</translate></p>
+
+ <p><a href="login.pl" target="_top"><translate>Login</translate></a></p>
+
+</body>
+</html>
index 3465907..5171ee3 100644 (file)
@@ -17,13 +17,13 @@ window.onload=clockon
   <tr>
    <td style="color:white; font-family:verdana,arial,sans-serif; font-size: 12px;">
     &nbsp;
-    [<a href="menuv3.pl?action=display&login=[% HTML.url(login) %]&password=[% HTML.url(password) %]" target="_blank">neues Fenster</a>]
+    [<a href="menuv3.pl?action=display" target="_blank">neues Fenster</a>]
     &nbsp;
     [<a href="JavaScript:top.main_window.print()">drucken</a>]
    </td>
    <td align="right" style="vertical-align:middle; color:white; font-family:verdana,arial,sans-serif; font-size: 12px;" nowrap>
     [Benutzer: [% HTML.escape(login) %] -
-    <a href="login.pl?action=logout&login=[% HTML.url(login) %]&password=[% HTML.url(password) %]" target="_top">abmelden</a>]
+    <a href="login.pl?action=logout" target="_top">abmelden</a>]
     [% date %] <span id='clock_id' style='position:relative'></span>&nbsp;
    </td>
   </tr>
@@ -38,7 +38,7 @@ window.onload=clockon
 
  <div style="clear: both;"></div>
 
- <iframe id="win1" src="login.pl?action=company_logo&login=[% HTML.url(login) %]&password=[% HTML.url(password) %]" width="100%" height="94%" name="main_window" style="position: absolute; border: 0px; z-index: 99; ">
+ <iframe id="win1" src="login.pl?action=company_logo" width="100%" height="94%" name="main_window" style="position: absolute; border: 0px; z-index: 99; ">
   <p>Ihr Browser kann leider keine eingebetteten Frames anzeigen. Bitte w&auml;hlen Sie ein anderes Men&uuml; in der Benutzerkonfiguration im Administrationsmen&uuml; aus.</p>
  </iframe>
 </body>
index e9c9224..8240287 100644 (file)
@@ -17,13 +17,13 @@ window.onload=clockon
   <tr>
    <td style="color:white; font-family:verdana,arial,sans-serif; font-size: 12px;">
     &nbsp;
-    [<a href="menuv3.pl?action=display&login=[% HTML.url(login) %]&password=[% HTML.url(password) %]" target="_blank"><translate>new Window</translate></a>]
+    [<a href="menuv3.pl?action=display" target="_blank"><translate>new Window</translate></a>]
     &nbsp;
     [<a href="JavaScript:top.main_window.print()"><translate>print</translate></a>]
    </td>
    <td align="right" style="vertical-align:middle; color:white; font-family:verdana,arial,sans-serif; font-size: 12px;" nowrap>
     [<translate>User</translate>: [% HTML.escape(login) %] -
-    <a href="login.pl?action=logout&login=[% HTML.url(login) %]&password=[% HTML.url(password) %]" target="_top"><translate>logout</translate></a>]
+    <a href="login.pl?action=logout" target="_top"><translate>logout</translate></a>]
     [% date %] <span id='clock_id' style='position:relative'></span>&nbsp;
    </td>
   </tr>
@@ -38,7 +38,7 @@ window.onload=clockon
 
  <div style="clear: both;"></div>
 
- <iframe id="win1" src="login.pl?action=company_logo&login=[% HTML.url(login) %]&password=[% HTML.url(password) %]" width="100%" height="94%" name="main_window" style="position: absolute; border: 0px; z-index: 99; ">
+ <iframe id="win1" src="login.pl?action=company_logo" width="100%" height="94%" name="main_window" style="position: absolute; border: 0px; z-index: 99; ">
   <p><translate>MSG_BROWSER_DOES_NOT_SUPPORT_IFRAMES</translate></p>
  </iframe>
 </body>
index 12f1983..fbe82b3 100644 (file)
@@ -6,8 +6,6 @@
  <input type="hidden" name="nextsub" value="edit">
  <input type="hidden" name="type" value="[% HTML.escape(type) %]">
  <input type="hidden" name="vc" value="[% HTML.escape(vc) %]">
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="callback" value="[% HTML.escape(callback) %]">
  <input type="hidden" name="rowcount" value="[% HTML.escape(rowcount) %]">
 </form>
index 0ddcaaa..d1a9d90 100644 (file)
@@ -6,8 +6,6 @@
  <input type="hidden" name="nextsub" value="edit">
  <input type="hidden" name="type" value="[% HTML.escape(type) %]">
  <input type="hidden" name="vc" value="[% HTML.escape(vc) %]">
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="password" value="[% HTML.escape(password) %]">
  <input type="hidden" name="callback" value="[% HTML.escape(callback) %]">
  <input type="hidden" name="rowcount" value="[% HTML.escape(rowcount) %]">
 </form>
index a251784..32609a1 100644 (file)
                     <th width=70% align=right nowrap>Auftragsnummer</th>
                     <td><input name=ordnumber size=11 value="[% HTML.escape(ordnumber) %]"></td>
                   </tr>
+[%- END %]
+[%- IF is_pur_ord || is_req_quo %]
+                  <tr>
+                    <th width=70% align=right nowrap>Bestellanfragenummer</th>
+                    <td><input name=oreqnumber size=11 value="[% HTML.escape(oreqnumber) %]"></td>
+                  </tr>
 [%- END %]
                   <tr>
                     <th width=70% align=right nowrap>[% IF is_req_quo %]Anfragenummer[% ELSE %]Angebotsnummer[% END %]</th>
index 76c3970..22a78fc 100644 (file)
                     <th width=70% align=right nowrap><translate>Order Number</translate></th>
                     <td><input name=ordnumber size=11 value="[% HTML.escape(ordnumber) %]"></td>
                   </tr>
+[%- END %]
+[%- IF is_pur_ord || is_req_quo %]
+                  <tr>
+                    <th width=70% align=right nowrap><translate>Order Request Number</translate></th>
+                    <td><input name=oreqnumber size=11 value="[% HTML.escape(oreqnumber) %]"></td>
+                  </tr>
 [%- END %]
                   <tr>
                     <th width=70% align=right nowrap>[% IF is_req_quo %]<translate>RFQ Number</translate>[% ELSE %]<translate>Quotation Number</translate>[% END %]</th>
index b34efda..9c4f4e5 100644 (file)
@@ -10,7 +10,7 @@
    </tr>
 
    [% FOREACH row = ROWS %]
-     <tr valign="top" class="listrow[% loop.count % 2 %]">[% FOREACH row1 = row.ROW1 %]
+     <tr valign="top" class="[% IF row.error %]error_message[% ELSE %]listrow[% loop.count % 2 %][% END %]">[% FOREACH row1 = row.ROW1 %]
       <td align="[% row1.align %]"[% IF row1.nowrap %] nowrap[% END %]>[% row1.value %]</td>[% END %]
      </tr>
 
index 55f0766..fef5c4b 100644 (file)
@@ -10,7 +10,7 @@
    </tr>
 
    [% FOREACH row = ROWS %]
-     <tr valign="top" class="listrow[% loop.count % 2 %]">[% FOREACH row1 = row.ROW1 %]
+     <tr valign="top" class="[% IF row.error %]error_message[% ELSE %]listrow[% loop.count % 2 %][% END %]">[% FOREACH row1 = row.ROW1 %]
       <td align="[% row1.align %]"[% IF row1.nowrap %] nowrap[% END %]>[% row1.value %]</td>[% END %]
      </tr>
 
index 6e1601e..c361f8e 100644 (file)
@@ -88,9 +88,6 @@
 
  [% IF SHOW_EXPORT_BUTTONS %]
   <form action="[% HTML.escape(script) %]" name="report_generator_form" method="post">
-   <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-   <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
    [% FOREACH var = EXPORT_VARIABLES %]<input type="hidden" name="report_generator_hidden_[% var.key %]" value="[% HTML.escape(var.value) %]">
    [% END %]
 
index f414eb9..b1bd96d 100644 (file)
@@ -88,9 +88,6 @@
 
  [% IF SHOW_EXPORT_BUTTONS %]
   <form action="[% HTML.escape(script) %]" name="report_generator_form" method="post">
-   <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-   <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
    [% FOREACH var = EXPORT_VARIABLES %]<input type="hidden" name="report_generator_hidden_[% var.key %]" value="[% HTML.escape(var.value) %]">
    [% END %]
 
index 903cda9..57c9c8c 100644 (file)
@@ -10,9 +10,6 @@
  <input type="hidden" name="vendor" value="[% HTML.escape(vendor) %]">
  <input type="hidden" name="department" value="[% HTML.escape(department) %]">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
  Sammelrechnung
  <br>
  <input class="submit" type="submit" name="action" value="Alle auswählen">
index 5736406..94b2f58 100644 (file)
@@ -10,9 +10,6 @@
  <input type="hidden" name="vendor" value="[% HTML.escape(vendor) %]">
  <input type="hidden" name="department" value="[% HTML.escape(department) %]">
 
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
  <translate>Statement</translate>
  <br>
  <input class="submit" type="submit" name="action" value="<translate>Select all</translate>">
index 5a84c54..2bc6d1f 100644 (file)
   <input type="hidden" name="reporttype" value="custom">
   <input type="hidden" name="co_street" value="[% HTML.escape(co_street) %]">
   <input type="hidden" name="co_city" value="[% HTML.escape(co_city) %]">
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
   <table width="100%">
   <tr>
    <td align="left">
index dbde625..d67fbdc 100644 (file)
   <input type="hidden" name="reporttype" value="custom">
   <input type="hidden" name="co_street" value="[% HTML.escape(co_street) %]">
   <input type="hidden" name="co_city" value="[% HTML.escape(co_city) %]">
-  <input type="hidden" name="login" value="[% HTML.escape(login) %]">
-  <input type="hidden" name="password" value="[% HTML.escape(password) %]">
   <table width="100%">
   <tr>
    <td align="left">