]> wagnertech.de Git - kivitendo-erp.git/commitdiff
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 a2b6ff9bc0fe48e30aa9fe01e2321dbd5f442bfd..f788813800eeba2219a0d256a876b38853c4bccf 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 bedb9e6d7550594774701b8e48b17df6dfa7a924..8bc0d1484d72c45437a53e73c3c40121b87f2f1a 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 46fe23fa44d386ddac2f2a3fd35d7c3b2b749685..19e1aa15a966333c9804ebe3f3e53a86c05119ca 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 f893c63aabf5ac5a1ea975276b8402bb276a6a3e..98fd7b2b82ed8325d1f849f5db46dc2cfa85733d 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 a84647fce602eb96a2587e6c4bc32e36be6d6ff7..a05c85e493b1d041897cd1ae4c459c797ea19e91 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 e82298ea889f243b72e46032f483ed6ae6399c85..a399e7902549df27d23f878ae42d34737a68f6ba 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 185297ba0817a6e5fadcab75e9829d1f491db59c..047d2b0b611e6000442fb9192f355c263fd8cb84 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 7d07153bc1125c927c9c0adce71745f1260aa4e6..5df7089d564d5d2fe3d6759ece05271d8c042a80 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 b0b64d155ab7d8ca17b03748f84b65bd44a69caa..32ca6b6c08938331cb4f396741e49957bc572e3f 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 7c5ad94fff86ef389bb3d148e2928c5dd1d5307a..a6bd06a80ab2e5aa326c9e747464b1980f47611c 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 1984ca5aeb60e998d93f4a79e556b5bc6991e0cb..ea189637753cbd8fd45c10d4e4ec738023d5cf52 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 d35b4a90004f1c866b11f75be680f330294ad63e..5b3d66622853706857ecbace0ef2d93fb1274d22 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 ef646845c89dc9cb0f900b372b219f89caa09a4a..a6200bad227be8def10e3d6be7a403fe08211180 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 fbb5cfd3e46ebeb67d6cde08a0b1347dc754825a..51f8f69815352725787ea2d930d5a572a1bddb04 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 72e6500cba696404dc934100a9e0d5878d571fa0..1ef16c1eba371e726da90865e534a22156efecb2 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 627cbee87d1077a836caf8b6ed657fcb3d4c50a8..7b06ed74a6e0c0bc809e3983e2b32539feb96958 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 11a12e440dbc75f9a594d3ab07fc406c323bbe53..ae15aed9ad6c87b18b986423faa6b8d8c3106391 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 7952922f62735ea361d64c90fd841e61d59f1add..38308a97b29b539521fce216f8706f9f7cc19343 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 846aba18159aae4eee94aa2721cfc1d17a7b4093..8054af52bd18bdd6324828bd2a77f452547eedec 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 229e43004c24b4e5671f244c4dd39e0a9e2ce9e1..a4de2310ed68fb8c52947c7a168585bb2a917b41 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 bcdb599966dae549c322e5909cb699f45d064e96..e2bc13fcd8aa17d6fe6a0f4e4ad1439879ca41a5 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 5ced174723eac6c3d7f9abc5874b440efd3cce18..58c9a73aa77440df3fa150e96b7d468bce7f04a7 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 9e5e18869ff4673d1b7a875362e5619cc6c9be87..673aa09c3cd94fd89587c85d810cef47c3f9d195 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 06393376766dd599aa976a4601bc9903899d8edd..6d89a21b911823c3ee1b751ee9833f060297cfb8 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 c3e7966c3fe09e4116aa98563b74146a0cfc9762..338d86a2348207c2337948c1b599cc33c9423357 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 79ff97dcac35580d9385b53d4c179ba34de5dcd5..36eb6088a4f24dd41151e475b28094e2b1d40166 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 5069cefa7f89fd26cfbab3999b07fa99c7fd153b..6c4b413560a9c60e7a149de45fb72e3b875b124f 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 db33269207778ab3782b56844443043f82228c30..2922cfacbf5285ccbbd104782898a53dda725bbc 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 6e1dfc6b42a0b108860a2e788a3e8eeb6b10de70..71f3c01c83abdbb4fed7774f209312aa8bca6def 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 12864290f836f5710862143e40b5e75510126f79..229927220fb4ca803cf991c31da7ef7a9854b7bd 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 098c7b628748dc125619cd40b236556164a3a3f1..d17ea61ec10b132502d39e8ad83ce584c4073b90 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 f4345c1fe1cf3dc549a6531fee8638aae2b47e7b..5b47194869a060c228a721d344d5a445d68534fd 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 65cc0609d4788d7683d6494f260f99f4f0e6cd11..975cb9479ac46c786e13a8bb10e6d649d61f05ed 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 c5de93484c795e40af115f3b4311a0dbe80eec6b..03c601b21097597a345e88ef329ef8a7a2ec369f 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 fd8f01d9f514e8c24f914a8d26882a4978671315..93efc243544626435b8367a2c082a97ac439ad55 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 06e95fa14f1385582091966aa7780a112f3475ce..2d96b54002f087f35abb09bac84d9b9e7e8525f2 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 121f8b4a468ff20deb514a96a661fd10dd0ac273..976e27e794c20bd0f9c2f6a1313fa0c02db6c94d 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 e91d8a32008879913e7c3ad86d895c78c63e4ec1..80f7335f6f71b5845a6b68fb2261f10c19c3cc64 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 be239299ddd25592094627846f3f656df923e7f5..de1722e60db0e26cc8a8ec7f41f4d11a3f6e8bee 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 cae9bfc5db27b7af457fa1086457929c14519825..eb62b0663cfadd48ee7a6659b535e881d110cc80 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 4df612cc57ad353a70d0230d29fb5184402512d9..47344335fef4312463172af277532c9c1af415b4 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 38ee578760b32083fa55dd45e91375c54d5cdb7f..8186977c9f3e87b378c8c69befa52088cf04edec 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 4461286330cda72c4555eef77e14a9951c9ddc6d..88283d0d0b06a3ee88f2b4445d6aef060ad7539d 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 f2b1f72289bd3213416a364d212e62818be8a38e..d7ef9caeb7a188d04a544ad2c65c0ddd4de9379b 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 f9ca5227cd4c034281df6f783368d07f0514cb30..d6f890da404ee24fb84b49d64e8b1c629e2b2a17 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 90ba21b844a8407d82a7fef2aa225d782b125e5b..d4a3ac4d8327bbff4c58b3cdd01f7dfc0203bc70 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 bcf4ef6c2d879b42d0e751a4d8befda23fc1f296..daace6a163ff77cb8e93405376242498305f14e1 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 f780841824dabf206ab276d3687feee5794481d6..ed2e860a114bb2c241accbf39f83a0b7e204ec55 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 9a6ed1c6431638df514a12f2a52127fa18d4210a..3a0227f9be52633e5a35a6e75fe1800ff491ad39 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 5760ac7a9c9e54d78481624c32f9ebfb3ddefd1e..4e5a7cf1e43a24a92a6e46de56925b9fdbf14e36 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 d401fbdf99e092351cdea0ac1b50414078065c50..83243306abfcdb1297489ae46215f2675b9d2c61 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 c4c406d52a2a5599828e0724007bb114ee28285b..04b9a0805a7370c49d9608ebad610326fb60994c 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 5ee9f2ffc4aaa619b16c4bcc27d4ff00bb7d6440..28ab157168c9a95df4c8ca0ff2cbd5a1eaa432db 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 473edc50776f667f11c155ec2bf8ed443a9382a3..238f6aba96ad9d248e347192686f0a6f17a1c0be 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 c37c7b8b039ace0e995461c88c37b87527aeee65..88e650d3b281e44987229d0011bc3dace0fc2ddb 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 9fe7ed913c7b3a927c68d98eaa0941361cf56f31..64a30732c11c462c238284b918e16be508d02a3f 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 31b0c3213f367992008c2994f7d608ed00b1fea2..6c97d46b6874a9e5803d0cdcd00d0822b941376f 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 073f9417e97e3fca91c19ff4f187ca390a7a3baa..837afe2b5b7594772f9df942fd6ce759927fa7fb 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 c042fe4ce4e5a79fe31e30f044c62ecfabb812a6..9e42f4f8d46ca454282bd49dec7971a52030ddb5 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 724c4692deecabaae729f0c46b671a6e858d8afd..529c84b830bcc2ad48b898c693506e6b4c5069c2 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 a5707c6e358416dcc11396f3861bd18af20a8c3a..912832a829c64cc4763918b4a5bf9c12d5b273e2 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 4c38ff6bce0fc005be42d38180fc192ea9392251..678fba591849614c437b69be7393eb511c913d43 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 b55c0ba352c3df2d3908170e9408f205862c1c59..6ee607eff260e50ef298c31b1741a73e64bda577 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 8cdb6cb1f0cd3e697590b095b5a83a76d0b76e49..c712fd29c638b4cda3b97d6783e6088b42308a1b 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 8d31b22a0f8e0dcb4c6d0ec36e93883bbc859625..f5904c8df8faf0b07c47f05ccd24a58942276f92 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 9240d49126d2dd1d1eb743c637caa5271f1fa595..3ea79a3b85f0f072ba64c8aea75bb7fc7859eeb7 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 56dd3e04065e3c4f2fe3303c3fc4b45a2db52ed4..ed441857706d51454f940045b229ce290f8b5272 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 c75999d33234eb4eb97b65ab61feb10bef2d3064..6354520cac27e9a22678ca9918eb84d3835f355e 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 07e2f8230c97f6a75f0bd6d39812189f59ab5c1d..c63322faa94752381850eba794ba6ae3342a78ff 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 c14534bcc60a48ba7406fbd9ae30d39804d66667..22d5f659a4ba4373ab45e00c131a0fd8ca9cad8e 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 bc4a8ecd5eca78b46dbba38f07abf404adf95b07..5ac88170973b3a5008dac495a86f0a10a4a0ce70 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 ff3ef26924665ea506c2d564147ec246fa1b118e..e4c169adab71c401d141808bdbf5fb91b55bed92 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 d92e8f7994d57d31344a9a731120cd969dace903..2335dc2516b4722ea2c1003be2b90a8ddafdcf49 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 b9e4383f71f12c412b38e9764738741e20b32ed5..8f1bcc9f153a068fa460002b9d135804a91912b1 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 e5d2d4ca45373071d58e17202adb81522eaa9764..c619e17974092167aab30bae12fbe3c59a537327 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 203f8c23f57506170f5c6846ee731effb1893eed..6304d867467b49cb1b00fc015b318fa6d920dab4 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 6719928cf1d563ccaba3dc78761bdf08309558c5..b19de87be2fb6a057291ceb5544ca8408c0a3d46 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 e10739839da747d8f785d438417a80b51ca97d49..b8b71d92f8ca13e6e838de5f578eee4d33d32a3f 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 821b8ec59eaf86f259923e506d7cb91b397c45e0..ebd8232db9a63de458d592172a0571448478dc1a 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 2646253412dd362947cf2c11a9e1b5f56f39f996..df30bde0b0196e0fb1a966fbc7847dc666ad48bf 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 37d10cbcecf74a8acf9cdac0c4b53dc809999c5f..3c62030fd7e5df6163b1d8b632aa7f8dd7c13b9c 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 4b447bbea10c6fe6fa5df2ed0d9e075bc9ba72bc..755bbcb36cb31180cca2ae63cbaad6706029eec8 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 362418689343a223b14d868be307ae456bc6935c..29d312c77a81fcab0268dd866e8431ee8c2b0f28 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 b288d9d6c6b9dab8673c090adb3209dabeff0487..e3bc813292b205a69f1e07a1bbc0258fd5ffbed9 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 a8c811d4ba50478c9d363ce837d38d83bbb3ce85..1d847190ceafa45296b7f09fdef1adc47ac70d66 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 354949b578df28cfb53566a0bc2dfd8f1f40075f..f216dd9c40393dacc3a02c684b836d9a726a70dc 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 66f112623b3e745f4f81e89c0f17cd587b6ee3dc..fe28f11be48214d099913eec0307bf4e3164177a 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 196ef8f763e5aab73961bb91b9c663f79ae8e78f..cc37bee579a00976a235feaf170945d97029fd80 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 ad32c485b4c9033ab65d8ebb78125fb0bef1784e..43f5be2136a8bd6bb960eb1c34ffeaadb7890040 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 5fc9b76bc3a87f0672bec8237092d9bd2ed6e648..2ff37991614803bf5c53af860879f3389bc1d9d5 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 1d506531fc63a9a6a47a6a1315e0415a03132fd8..7f2d34b8de72709e7ca575e8346218b3720812af 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 71d55776f0aca418d926fea04a6368a24419fd03..f76c1e5f8e74b6db27376e514a30612cca17fa7c 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 23f674c345e4c5008b343e07d49964fc3ed65eb5..d795a9b2001b137053d9f823c2ac53ba5e3aac46 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 55ff4eabf71e9de86f4ae38f3d3bbe4101197c3c..8bb5550b4a1b8c3526b34c8e1f49ba3b3fbf8d83 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 5d480cc6fc5e4b803921c8964d97646aefb7bbf5..a9945398f1f56d3f85154f0b5a9dda9c4b10046c 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 94796d719755d9e781b547d85efa598c4e2914dc..987560492fae36d1c3876a93a6eed5054b756e87 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 a1306f057ba460a4e7cec22e2e82a4f3f518e3c2..8b098c2b4a11789e6fbf77373ae9aecf1413e0ee 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 ab62b1bd260999d4caf91ff1cba1f1484f7518a7..756460fbe2c5241e8ad51b4a1bbc88eab70a0cbe 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 a5894b4cf995e38cbd672c259cd3919919a9cc59..d15a2f7837191a5be71a1dec56e579427b3a058d 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 d827356f3d043ad5f1d5967181082ab8fca6d7d4..c62eb51ba0e8d744afd6ed0ffc36c04bee684a2b 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 2c8d485d1b963d77bda134d42db98449ad9fcbc2..c744e5d219bca9c784eda37f92c7a500fbf95bd7 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 d65ee3d6eb8cb522b14ecfc88769e106e8d878b4..07648005c07bb41ae7b440c0ca87f4ff3ec0d58c 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 c9a5a1b0be0182e919fd784a74b237ad3bec7cb9..7884201867591430ba638d168adf62d862e31cd1 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 696d0cc0f03a52f9619abd8595c06580291f3fb4..ceb91de845df7cd41615a28b58722ee882193289 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 afb4b88b2f8aa87b4f201d522cc9a0dc4b36f411..e84509d4d4092174e03be80a523481e213a459ed 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 e1a0fccbcce14b160443d8a3c7d89c2b9d727e2e..c31c3691ffbe4dfd31a346e3423329a2dfc7b1f4 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 c5f4809c73a6c72e575b7a1494109af67e91cffd..dea5ee67cbfd90bdd175a994aed41ab7483b7356 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 4b35bb09e82f91a93cebbec29d740bd816cbe9b0..3214a746fb10de869d96be7bfa476cf11ee419e3 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 fc7c70ad6cfbc2b9c83d580f0a3d5b22de350eda..3bb34da074b788d64e9c228a9a049ba98fbb1f41 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 34877de2cabdcb3fddc295206298a904ed9a54d5..28e0d2d3941fe8c46bc8e26f3feccb399768ae2c 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 4ede0bbbaf758437128f899d2af3fa647261d367..a160272f4c542974f3de75dd47f3ed6683343969 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 0376b52434a3b275628460aa4fca3b366d9458b6..24854389c2f578dcf785c4e71b4e9f7aedb6c2d0 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 b6717050e301c7c4d1ff8c5b1056ff3e00029eff..da55e2dc23847a7132751cac0a1b437988dcb615 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 2338487daf2106962360656591139060d298bcc0..dadcc7e69e316b7792259a0478113db3c290baf0 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 f91797e8666517f6a6a646061c36ab0cf9b8d0cd..fd2c3933edab0c98d4e5864d227fd14fbd7a8d83 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 3bf622af5e75c7bcff29da77df8c17c4ddfb26b8..c3e132c19595905da5c93807afbdb5096fe6e547 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 775bcaf30f0b7e7514b2b48c8fe7a06a03ec9dfc..e283bdbdd7eab721b8eab302f9e7041d00c6b3df 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 f6642303ffd11d7f58e5c507850ed67be1ed746e..d5c85ede80139ee97cccd517f24edf7b84fac4ac 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 3d61244b497338ef6400c0221760519f7c7872ec..25ecff5d58e3f972a602880ca66f395b6e250f6d 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 3ed19a5e9a0ebb516cab1283f3f4d41ae21d6fea..bf7f3d86753244948636aa57c594c82a3870fb1b 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 261122f96d801488c9fc189453b5f80576d22a47..8306b780d1d5f300d42757576ed35a6168d712f5 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 f69ef97f347ccf7cc74959e7075f8f0a4e692225..ee8ba4b913d8e678c4dfc5491f1de028f4f630db 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 5f48c7d184c639deaf9669cf911cff0b08515bce..3d4aed3a2f695ab76edd52b9f1f9c1c58c95f652 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 096bfa2d230d20511dcdf7a6765216ebff57d9f2..10b3046bb7052822d022f20db87d50922d0a1204 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 971eb28d79d137004ab267c8fe5bb36848e5e7a4..0d11216725547001a1ac39eac3cfb9249566fabb 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 a20ae17082cea68132a335447c69f6fe8945ba1d..f6708e1401584ed7d79f165403d196c233865af2 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 867aed3c78c8c2a91a1b77e9c5b0af514df7e7a9..ff560d6d5dfa4f1526fd7ff640f7ff048646930a 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 94bc35aa63d4874ce2dbcff7c8421faee15bb2c5..39c66a5b49af8b4547c7051956877444409a0578 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 bbb4045208a6cc0d12c905c9e93a8b308f6f1697..8c565128c8994bed6b93f57928df1d77d1abd44f 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 0e30e4321330758de5d83c5d046a91dc38cbbeff..c9442d0f0275185291a80ee4e69bd9232e1922bb 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 f864d87345e3cb07e08b3e27cdb4c78293ae232a..0be66fb4d6592ca00a7d4fd479db4b7928836a75 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 9c1a17c1cc795a0b17ba07b980c35d87116f6aa7..b70f89d0412516baabe2004d48fa35ff1ff7f1dd 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 887b288272252d8dcbac067ab44e3d9b037826fc..a6ffc7b51bce0c0dd189c0b26464e0adbf0e1537 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 447657e3526f91af589dade5bb0153a5266f4142..8bc24a39ac16c242ae2f8bfe751cb389ca272c83 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 72e1fcf7ee059bcbeeb712224858ad1e13f656e7..6aa176fbb3fe709b8e7dc33b51f5894c4d8eb293 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 480081a901d351a7f725281efa63c87df023277b..d0b191b8b6facdcbee46c2e4bd835f87a6651e00 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 9774e81a0d6c7ec49a68d68da966f6471a7565bc..f86ce1f8b61f2e84c7c03a57529cf1a5d9cfd0da 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 3f1495a57151dab95e1cf2ae494344c21e29ce1c..2d1955b7e025956b05f765b513813d14488250b5 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 2637e4392bfc87d93b0507be6a6fb01005d20cf4..cb73f5500a48f41d3eec0d062ea7d56b97755822 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 fe39d32b1900b9ef7e177948308d0a6edfe065d4..2d6625f9fc9a9a3ed4e3f7742d9f6b77d0d31cb9 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 eb30398dffb9fdb5ac663468ecab67ff28e50fbf..f95a18c8749428e47a7e0936f544d63fc6c68df9 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 512778e1364346c6390bcadf6e09c89fcb336544..4dbda8bdba86788dbd9e7c3fbd1f4ca2c155e2c3 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 6c4a0ffcec629b66847e9784536ba3c00677e2ce..50e38d9a66c6fd28ccb4e191208253deca98e1c2 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 331fedc86198ec7aea92431b69113999914f8331..bb3f4cc19e0625192b2aa17640dcd4a292b2ea52 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 f3cc4d588157a264fb4d158e761c9a911773a5ba..f9c6329ead43081f1fc592bcda435491d789f955 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 225698e252ebbcd7475cb65232ab21e6de80cc2e..9401f61fbadeec3e4ba1e0baf19a5b00bfa466d5 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 1d0f2d45f42396d8499f290cc87aa655382a18ab..3f954b916ba9d2d75eafa60ae1314a44b968fea8 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 b8353d5e9225ad216fbd3bbd8099d1ea0275229e..e6493f3e83060041c55c5aaffe82552119679b6d 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 235987845579f7d108dd97b62193c16fb2bf21d3..bdf2180dc75222e7445de0885a2aa3e3985a969b 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 b93d1d721095023680d6b6f92d2c5ba35d6052a9..0e53064e3674c5d1275ec263379eca37081b66a1 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 656012bdd50428bffc19238d93b60bcb1f7e844b..f310c0c11cdce5c7f68c11c10a830eddad6acdd0 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 7db7cf981c2c168c66745e8322bf462be9fe273d..a92d4861761dd53d2f2b913ac453f0b3054281cb 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 b89531f3ebdc2786183e3b7a144353171a760509..dda72ddcec504f026ca19ac6a5f694341876adae 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 425fd905bc280244d43d8e2661c5925c99865a9f..dcea40e0383edeb2ab00e07b24a1786941ef3343 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 ea4424062fd1e19e9319f5d27256058a78bc4554..7e29a03ff30c53197a4fc3bad5f3ae1b45f49195 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 f1af5f330db17bae928015417cd268dc254bbaf8..04d5d8edfb4ec4cd031e152e2ee24a14225074fa 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 a7737b962f037adf96bf4e542fdf80313b6f932b..ad0645082f8fae8832d40bc788f6443f3087b034 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 d11561760dd9a97c2d88a273d835aec33b04d0ad..0304c380752818e2cd052e4723417083f5232045 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 62371467307f6e239b27af23b5673d7d7a8c6c83..32ba81c46aa1232b87e37afb6ac7f81771ce35b8 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 7b59444d5fd170ec8f29377b1e567016e3be388c..1377c6fe415aa88e401f864f2a6ce3cb623cee32 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 655d45b539f7e982af5b6d113f2945419295f0f8..e2779d91a8a54a6c19b1533eb07103f396447bdf 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 7f926dbc90aaed6e184f793437165c28395c0973..3be95a20df7437ee7b581b1e2945a8298682ae02 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 160c236b5df87e582f5cd21dfe074b16a5dba5f2..10f70a41c5418cd1960f85324f7bc83e7ae5be49 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 b58ab1c534857b1e16ee5b7289f021af593bfbf3..49e22cf12134493a5c0f771bb40fe55a512d73b5 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 46d797270cba43cbc8a052925044a75231bd7e5f..cc80110fed87badebf65edae1748340e65f65ca2 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 815adc1bf41a74a0cc037d99ad2507a1b1496cb0..01c46c157ebcf632dc2b78dfff2e902270e72820 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 50f5fc242324cee2231267a564e493ac21406854..3f773a17e5802b9b19ab10ba6199c4c5c3c98102 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 f95676d548be35950e67a2e7cee24c1c550c6cdb..6a1c193aff0520c2cc2963ea92d03773b0b5a2e3 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 8ff0289c12def31990b77acb7dcd93fbdd7ef96d..3c29092bd5e69faa35666462e5b00ef3ce201903 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 53e8b69efdfae1b1389743d20662d4630500c2ad..d829d3b8f21a3856ce6bd9114d7e10d83b8107ec 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 337fae76822467eb27efdf4b6c5ac22d7a71a9da..3d8cb6095138657bab70894255363de8e2aec2b3 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 3d48065da315f904af4a54a41f5a0fbebc4f0d90..b9cc9fd0a021b9cee21e487e30a0362717911586 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 4ef95e4014077e054818b35b3d5b2705cbf08496..791836ed5674b2f0e2d16b3b7af8d3ef11cb0ce6 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 f567b990a9f724be278121111b55305d5600b31a..f835f956d2341d1b2602e464e2fc8d800a3e3b84 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 f567b990a9f724be278121111b55305d5600b31a..f835f956d2341d1b2602e464e2fc8d800a3e3b84 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 366c0719ccb38bb7649e7765c7e773b8812c8591..5efe3c77eaebf2be3b292615559aedff2e33dd96 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 84126a3a37633e182394e4bb8b687a049d980627..8311014394284ca2f8dbe66a48a9c8c5218656be 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 5b530380a943e79dac611a6ebb3d7f5cd36c5289..3798ab020a880ff2831cd4b0cd64ae206b694cf6 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 538761bd22face649c36db190b79d7f8718655fe..a5c41ff5e239e2bcc7e7b5c6ef982eeac5326f1e 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 291cc4e1055927e6a708f69d3d985e8ec0137623..b6c6767f5ef10a3d60e978adddbb51a59d77249c 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 13a2b144f089e4dfe978cf1d959c05cddb08bcf3..ede375cd2c3a8b5843eafef0078bb57934779f19 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 32987e3bdfcab67a005eb00d3554a261d1880e41..a292e85f2f3c9de7ec1e3ff4dbe03262609b5e61 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 9bb476b40805540965ca70cca60c34545124e42b..607445cdb51820927540f3fb6e162411d784940b 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 adb61d4bac8c0ffac4111a8a680decfccda58a1a..7f418e2c869d5bb93a5bce7acb9c1527d523ade5 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 5feab3cd95f95bba6ef6b311fa4f11d97f2150d0..9163dfae25b68587db38bb18b5e93c35c11275ae 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 6934db9f5d2322c8affd9af9fb4464a553fa54b7..9455393525a9051a8bb82b36a62f931877115da3 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 4af1057b8bfa89dd7e0dc583f35fdc9dd0b64bf9..3c81998e2cf192316d84b690d703eded7141933e 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 6dc00f791783f475016f8232e9a519fe9a777bf2..071b579de505231fee777ac6f85dcafe42984d97 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 3106684790aa4af5ddc021f41b0d0dfa1ff52327..30e99a1fec1766f6e5c736c11a3b9395b35a12b2 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 3465907c190ff5376a653816fe8534ca852afc77..5171ee31bbf447f92315ec9067f5da67bf51aa1b 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 e9c92242fab19c9ce1d9e0d7f41c9c8a6bf4de05..8240287b7d518c74cef7df514cefbe73ca72e9c8 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 12f1983cf9f599728c020da48966c2d84602e63e..fbe82b31412462a68cde0d950eae0f02c547d46e 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 0ddcaaa9b219878cc81bc5d8c5f5f68ce5ed0985..d1a9d90e2161c83dfc9b5187a180941fb59f1111 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 a251784a5e976601af4bd777d0fe39b29d87ba13..32609a112a1e0c3a7250a9633ad74af4b7c88367 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 76c3970722be0896a42014fc89abd62f464caaeb..22a78fcf26565a33265bab260e864385d96bc23c 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 b34efdaba7d66063b847215a8b12fe783b0a70b9..9c4f4e57142e0bbdae46a7f783dbbbde54f8a86d 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 55f0766d12f9349b178b2eae3efec85ba269cb49..fef5c4bb0e7443f7cfaacaa347ad128e932b10b2 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 6e1601ef8767b139b780c6f00e171de35b5bb5bd..c361f8e252ce7ba9b62ff4a46f0344a18ecd8e3a 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 f414eb91348ed6d89150eee4ae72c01cb0f3a6a9..b1bd96d3110800ae83b4f6e975549e4278281d69 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 903cda9667a8d7a3214fe5e2ec3c31e3825ffae6..57c9c8c868ae332c39c00f352218d468eb35c59a 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 5736406112f72a1f0abf35fe4ede7a554cf5c3e9..94b2f581c77f3e05aaba2488178098d1349f3655 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 5a84c540f3d5f8b51353d0447e8bac2b7b65b5e4..2bc6d1fe5eb6b12774aaf80bf0340b0fe2f7ae71 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 dbde6256fa9d51a72f4ea263b8ef428a99a37e92..d67fbdcd15b43439c92c1f3b0442b40fe354f9cc 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">