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.
package AM;
+use Carp;
use Data::Dumper;
use SL::DBUtils;
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);
$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 =
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();
$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 {
sub unit_select_data {
$main::lxdebug->enter_sub();
- my ($self, $units, $selected, $empty_entry) = @_;
+ my ($self, $units, $selected, $empty_entry, $convertible_into) = @_;
my $select = [];
}
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();
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();
--- /dev/null
+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;
--- /dev/null
+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;
--- /dev/null
+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;
);
%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';
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;
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 {
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;
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
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;
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();
$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);
my ($self, $str) = @_;
my %replace =
- ('order' => ['"', '<', '>'],
- '<' => '<',
- '>' => '>',
- '"' => '"',
+ ('order' => ['&', '"', '<', '>'],
+ '<' => '<',
+ '>' => '>',
+ '"' => '"',
+ '&' => '&',
);
map({ $str =~ s/$_/$replace{$_}/g; } @{ $replace{"order"} });
return $str;
}
+sub unquote_html {
+ $main::lxdebug->enter_sub(2);
+
+ my ($self, $str) = @_;
+
+ my %replace =
+ ('ä' => 'ä',
+ 'ö' => 'ö',
+ 'ü' => 'ü',
+ 'Ä' => 'Ä',
+ 'Ö' => 'Ö',
+ 'Ü' => 'Ü',
+ 'ß' => 'ß',
+ '>' => '>',
+ '<' => '<',
+ '"' => '"',
+ );
+
+ map { $str =~ s/\Q$_\E/$replace{$_}/g; } keys %replace;
+ $str =~ s/\&/\&/g;
+
+ $main::lxdebug->leave_sub(2);
+
+ return $str;
+}
+
+
sub hide_form {
my $self = shift;
# 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 {
return;
}
+ my $cgi = $main::cgi;
+ $cgi ||= CGI->new('');
+
my ($stylesheet, $favicon);
if ($ENV{HTTP_USER_AGENT}) {
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
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;
$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);
return $input;
}
+#
+
sub parse_amount {
$main::lxdebug->enter_sub(2);
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));
$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})
$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}";
}
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"
$self->{salesman_name} = $login
if ($self->{salesman_name} eq "");
-
- map({ $self->{"salesman_$_"} =~ s/\\n/\n/g; } qw(address company));
}
$main::lxdebug->leave_sub();
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();
}
$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);
}
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();
#======================================================================
package IC;
+
use Data::Dumper;
+use YAML;
+
use SL::DBUtils;
sub get_part {
# copy to $form variables
map { $form->{$_} = $ref->{$_} } (keys %{$ref});
+ $form->{onhand} *= 1;
+
my %oid = ('Pg' => 'a.oid',
'Oracle' => 'a.rowid');
$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;
--- /dev/null
+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;
package SL::InstallationCheck;
+use English '-no_match_vars';
+use IO::File;
+
use vars qw(@required_modules);
@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 {
}
}
+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;
}
}
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;
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 };
}
package Menu;
+use SL::Auth;
use SL::Inifile;
sub new {
map { $self->{$_} = $inifile->{$_} } keys %{ $inifile };
+ bless $self, $type;
+
+ $self->set_access();
+
$main::lxdebug->leave_sub();
- bless $self, $type;
+ return $self;
}
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);
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);
}
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}) {
}
}
+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;
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;
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;
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;
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) = @_;
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;
use IO::File;
use Fcntl qw(:seek);
+use SL::Auth;
use SL::DBUpgrade2;
use SL::DBUtils;
use SL::Iconv;
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;
}
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 =
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);
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)) {
}
# update the tables
- open(FH, ">$userspath/nologin") or die("$!");
+ open(FH, ">$main::userspath/nologin") or die("$!");
# required for Oracle
$form->{dbdefault} = $sid;
close(FH);
# remove lock file
- unlink("$userspath/nologin");
+ unlink("$main::userspath/nologin");
my $menufile =
$self->{"menustyle"} eq "v3" ? "menuv3.pl" :
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 {
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;
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);
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);
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();
}
$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";
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
# 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}";
$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
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;
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}"; };
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);
$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();
}
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();
edit_user_form($myconfig);
}
-sub edit {
+sub edit_user {
$form->{title} =
"Lx-Office ERP "
$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|.*/||;
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!'));
}
}
$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!'));
$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 =
}
-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;
}
}
}
- # delete config file for user
- unlink "$userspath/$form->{login}.conf";
-
$form->redirect($locale->text('User deleted!'));
}
$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';
}
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} =
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!'));
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;
--- /dev/null
+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;
#
#======================================================================
+use SL::Auth;
use SL::AM;
use SL::CA;
use SL::Form;
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;
sub edit_account {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = "Edit";
AM->get_account(\%myconfig, \%$form);
sub account_header {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
if ( $form->{action} eq 'edit_account') {
$form->{account_exists} = '1';
}
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}))) {
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!'));
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');
# Ajax Funktion aus list_account_details
$lxdebug->enter_sub();
+ $auth->assert('config');
+
my $chart_id = $form->{args};
CA->all_accounts(\%myconfig, \%$form, $chart_id);
sub delete_account {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = $locale->text('Delete Account');
foreach $id (
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;
sub edit_department {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = "Edit";
AM->get_department(\%myconfig, \%$form);
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});
$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>|;
</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|">
sub department_header {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = $locale->text("$form->{title} Department");
# $locale->text('Add Department')
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>
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!'));
sub delete_department {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
AM->delete_department(\%myconfig, \%$form);
$form->redirect($locale->text('Department deleted!'));
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;
sub edit_lead {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = "Edit";
AM->get_lead(\%myconfig, \%$form);
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});
$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;
</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|">
sub lead_header {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = $locale->text("$form->{title} Lead");
# $locale->text('Add Lead')
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>
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!'));
sub delete_lead {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
AM->delete_lead(\%myconfig, \%$form);
$form->redirect($locale->text('lead deleted!'));
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;
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});
$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>|;
</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|">
sub business_header {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = $locale->text("$form->{title} Business");
# $locale->text('Add Business')
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>
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);
sub delete_business {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
AM->delete_business(\%myconfig, \%$form);
$form->redirect($locale->text('Business deleted!'));
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;
sub edit_language {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = "Edit";
AM->get_language(\%myconfig, \%$form);
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});
$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>|;
</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|">
sub language_header {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = $locale->text("$form->{title} Language");
# $locale->text('Add Language')
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>
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!'));
sub delete_language {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
AM->delete_language(\%myconfig, \%$form);
$form->redirect($locale->text('Language deleted!'));
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++) {
sub edit_buchungsgruppe {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = "Edit";
AM->get_buchungsgruppe(\%myconfig, \%$form);
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});
</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} }) {
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>|;
</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|">
sub buchungsgruppe_header {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = $locale->text("$form->{title} Buchungsgruppe");
# $locale->text('Add Accounting Group')
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>
sub save_buchungsgruppe {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->isblank("description", $locale->text('Description missing!'));
AM->save_buchungsgruppe(\%myconfig, \%$form);
sub delete_buchungsgruppe {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
AM->delete_buchungsgruppe(\%myconfig, \%$form);
$form->redirect($locale->text('Accounting Group deleted!'));
sub swap_buchungsgruppen {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
AM->swap_sortkeys(\%myconfig, $form, "buchungsgruppen");
list_buchungsgruppe();
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;
sub edit_printer {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = "Edit";
AM->get_printer(\%myconfig, \%$form);
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});
|;
- $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>|;
</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|">
sub printer_header {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = $locale->text("$form->{title} Printer");
# $locale->text('Add Printer')
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>
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);
sub delete_printer {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
AM->delete_printer(\%myconfig, \%$form);
$form->redirect($locale->text('Printer deleted!'));
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;
sub edit_payment {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = "Edit";
AM->get_payment(\%myconfig, $form);
sub list_payment {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
AM->payment(\%myconfig, \%$form);
$form->{callback} = build_std_url("action=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|">
sub payment_header {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = $locale->text("$form->{title} Payment Terms");
# $locale->text('Add Payment Terms')
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>
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;
sub delete_payment {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
AM->delete_payment(\%myconfig, \%$form);
$form->redirect($locale->text('Payment terms deleted!'));
sub swap_payment_terms {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
AM->swap_sortkeys(\%myconfig, $form, "payment_terms");
list_payment();
$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});
$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();
sub audit_control {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = $locale->text('Audit Control');
AM->closedto(\%myconfig, \%$form);
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>
sub doclose {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
AM->closebooks(\%myconfig, \%$form);
if ($form->{revtrans}) {
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}));
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);
sub set_unit_languages {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
my ($unit, $languages, $idx) = @_;
$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);
sub show_history_search {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = $locale->text("History Search");
$form->header();
sub show_am_history {
$lxdebug->enter_sub();
+
+ $auth->assert('config');
+
my %search = ( "Artikelnummer" => "parts",
"Kundennummer" => "customer",
"Lieferantennummer" => "vendor",
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);
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";
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();
sub edit_tax {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = $locale->text('Edit');
AM->get_tax(\%myconfig, \%$form);
sub list_tax {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
AM->taxes(\%myconfig, \%$form);
map { $_->{rate} = $form->format_amount(\%myconfig, $_->{rate}, 2) } @{ $form->{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} };
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!'));
sub delete_tax {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
AM->delete_tax(\%myconfig, \%$form);
$form->redirect($locale->text('Tax deleted!'));
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';
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';
sub list_price_factors {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
AM->get_all_price_factors(\%myconfig, \%$form);
my $previous;
sub save_price_factor {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->isblank("description", $locale->text('Description missing!'));
$form->isblank("factor", $locale->text('Factor missing!'));
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});
sub swap_price_factors {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
AM->swap_sortkeys(\%myconfig, $form, 'price_factors');
list_price_factors();
sub display_template {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{edit} = 0;
display_template_form();
sub edit_template {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{edit} = 1;
display_template_form();
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);
sub display_template_form {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{"formname"} =~ s|.*/||;
my $format = $form->{"format"} eq "html" ? "html" : "tex";
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;
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};
sub edit {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
$form->{title} = "Edit";
&create_links;
sub display_form {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
&form_header;
&form_footer;
sub create_links {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
$form->create_links("AP", \%myconfig, "vendor");
$taxincluded = $form->{taxincluded};
$duedate = $form->{duedate};
sub form_header {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
$title = $form->{title};
$form->{title} = $locale->text("$title Accounts Payables Transaction");
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}])
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;
sub post_payment {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
$form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
for $i (1 .. $form->{paidaccounts}) {
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!"));
sub post_as_new {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
$form->{postasnew} = 1;
# saving the history
if(!exists $form->{addition} && $form->{id} ne "") {
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}--;
sub delete {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
$form->{title} = $locale->text('Confirm!');
$form->header;
|;
foreach $key (keys %$form) {
+ next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
$form->{$key} =~ s/\"/"/g;
print qq|<input type=hidden name=$key value="$form->{$key}">\n|;
}
sub yes {
$lxdebug->enter_sub();
+
+ $auth->assert('general_ledger');
+
if (AP->delete_transaction(\%myconfig, \%$form, $spool)) {
# saving the history
if(!exists $form->{addition}) {
sub search {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger | vendor_invoice_edit');
+
# setup vendor selection
$form->all_vc(\%myconfig, "vendor", "AP");
<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|">
sub ap_transactions {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger | vendor_invoice_edit');
+
($form->{vendor}, $form->{vendor_id}) = split(/--/, $form->{vendor});
$form->{sort} ||= 'transdate';
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!"));
sub add {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
return $lxdebug->leave_sub() if (load_draft_maybe());
# saving the history
# /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};
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
sub display_form {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
&form_header;
&form_footer;
sub create_links {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
my ($duedate, $taxincluded, @curr);
$form->create_links("AR", \%myconfig, "customer");
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);
sub form_footer {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
my ($transdate, $closedto);
print qq|
<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}])
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);
sub post_payment {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
$form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
for my $i (1 .. $form->{paidaccounts}) {
}
sub _post {
+
+ $auth->assert('general_ledger');
+
# inline post
post(1);
}
sub post {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
my ($inline) = @_;
my ($datepaid);
sub post_as_new {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
$form->{postasnew} = 1;
# saving the history
if(!exists $form->{addition} && $form->{id} ne "") {
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}--;
sub delete {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
$form->{title} = $locale->text('Confirm!');
$form->header;
|;
foreach my $key (keys %$form) {
+ next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
$form->{$key} =~ s/\"/"/g;
print qq|<input type=hidden name=$key value="$form->{$key}">\n|;
}
sub yes {
$lxdebug->enter_sub();
+
+ $auth->assert('general_ledger');
+
if (AR->delete_transaction(\%myconfig, \%$form)) {
# saving the history
if(!exists $form->{addition}) {
sub search {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger | invoice_edit');
+
my ($customer, $department);
my ($jsscript, $button1, $button2, $onload);
<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|">
sub ar_transactions {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger | invoice_edit');
+
my ($callback, $href, @columns);
$form->{customer} = $form->unescape($form->{customer});
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");
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";
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);
# save all other form variables
foreach $key (keys %${form}) {
+ next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
$form->{$key} =~ s/\"/"/g;
print qq|<input name=$key type=hidden value="$form->{$key}">\n|;
}
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
$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";
}
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
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);
# save all other form variables
foreach $key (keys %${form}) {
+ next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
$form->{$key} =~ s/\"/"/g;
print qq|<input name=$key type=hidden value="$form->{$key}">\n|;
}
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
}
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') }
# 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')
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}>
<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|">
sub remove {
$lxdebug->enter_sub();
+ assert_bp_access();
+
$selected = 0;
for $i (1 .. $form->{rowcount}) {
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|;
}
sub yes {
$lxdebug->enter_sub();
+ assert_bp_access();
+
$form->info($locale->text('Removing marked entries from queue ...'));
$form->{callback} .= "&header=1" if $form->{callback};
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};
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} });
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);
print qq|
<body>
-<form method=post action=$form->{script}>
+<form method=post action=bp.pl>
<table width=100%>
<tr>
}
$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>
<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}) {
sub select_all {
$lxdebug->enter_sub();
+ assert_bp_access();
+
map { $form->{"checked_$_"} = 1 } (1 .. $form->{rowcount});
&list_spool;
sub chart_of_accounts {
$lxdebug->enter_sub();
+ $auth->assert('report');
+
$form->{title} = $locale->text('Chart of Accounts');
CA->all_accounts(\%myconfig, \%$form);
sub list {
$lxdebug->enter_sub();
+ $auth->assert('report');
+
$form->{title} = $locale->text('List Transactions');
$form->{title} .= " - " . $locale->text('Account') . " $form->{accno}";
<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>
sub list_transactions {
$lxdebug->enter_sub();
+ $auth->assert('report');
+
$form->{title} = $locale->text('Account') . " $form->{accno} - $form->{description}";
CA->all_transactions(\%myconfig, \%$form);
#
######################################################################
-use SL::Form;
use SL::Common;
+use SL::DBUtils;
+use SL::Form;
use SL::MoreCommon;
sub build_std_url {
my @parts;
- foreach my $key ((qw(login password), @_)) {
+ foreach my $key (@_) {
next unless ($key);
if ($key =~ /(.*?)=(.*)/) {
}
} else {
- push @parts, "${key}=" . E($form->{$key});
+ foreach my $var ($form->flatten_variables($key)) {
+ push @parts, E($var->{key}) . '=' . E($var->{value});
+ }
}
}
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
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();
}
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);
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})) {
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"),
$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();
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"),
$lxdebug->leave_sub();
}
+# -------------------------------------------------------------------------
+
sub delivery_customer_selection {
$lxdebug->enter_sub();
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"),
$lxdebug->leave_sub();
}
+# -------------------------------------------------------------------------
+
sub vendor_selection {
$lxdebug->enter_sub();
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"),
$lxdebug->leave_sub();
}
+# -------------------------------------------------------------------------
+
sub calculate_qty {
$lxdebug->enter_sub();
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;
"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,
$lxdebug->leave_sub();
}
+# -------------------------------------------------------------------------
+
sub set_longdescription {
$lxdebug->enter_sub();
$lxdebug->leave_sub();
}
+# -------------------------------------------------------------------------
+
sub H {
return $form->quote_html($_[0]);
}
$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", {
uc($sort) => 1,
uc($sort)."BY" => $sortby
} );
-
+
$dbh->disconnect();
- $lxdebug->leave_sub();
+ $lxdebug->leave_sub();
}
+# -------------------------------------------------------------------------
+
sub call_sub {
$lxdebug->enter_sub();
$lxdebug->leave_sub();
}
+# -------------------------------------------------------------------------
+
sub show_vc_details {
$lxdebug->enter_sub();
$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}) {
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|'"> |;
print qq|<input type="button" value="|.$locale->text('no').qq|" onclick="javascript:history.back();">|;
print qq|</body></html>|;
-}
-
+ }
+
$lxdebug->leave_sub();
}
require "bin/mozilla/arap.pl";
require "bin/mozilla/common.pl";
-our ($form, %myconfig, $lxdebug, $locale);
+our ($form, %myconfig, $lxdebug, $locale, $auth);
1;
sub payment {
$lxdebug->enter_sub();
+ $auth->assert('cash');
+
my (@curr);
$form->{ARAP} = ($form->{type} eq 'receipt') ? "AR" : "AP";
sub form_header {
$lxdebug->enter_sub();
+ $auth->assert('cash');
+
my ($vc, $vclabel, $allvc, $arap, $department, $exchangerate);
my ($jsscript, $button1, $button2, $onload);
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}>
sub list_invoices {
$lxdebug->enter_sub();
+ $auth->assert('cash');
+
my (@column_index, %column_data, $colspan, $invoice);
my ($totalamount, $totaldue, $totalpaid);
sub form_footer {
$lxdebug->enter_sub();
+ $auth->assert('cash');
+
my ($media, $format, $latex_templates);
$form->{DF}{ $form->{format} } = "selected";
</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|">
sub update {
$lxdebug->enter_sub();
+ $auth->assert('cash');
+
my ($new_name_selected) = @_;
my ($buysell, $newvc, $updated, $exchangerate, $amount);
sub post {
$lxdebug->enter_sub();
+ $auth->assert('cash');
+
&check_form;
if ($form->{currency} ne $form->{defaultcurrency}) {
sub print {
$lxdebug->enter_sub();
+ $auth->assert('cash');
+
my ($whole, $check, %queued, $spool, $filename, $userspath);
&check_form;
$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} = "";
$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!'));
$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});
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);
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");
sub list_names {
$lxdebug->enter_sub();
+ $auth->assert('customer_vendor_edit');
+
$form->{IS_CUSTOMER} = $form->{db} eq 'customer';
CT->search(\%myconfig, \%$form);
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
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 });
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}
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();
sub add_transaction {
$lxdebug->enter_sub();
+ $auth->assert('customer_vendor_edit & general_ledger');
+
# # saving the history
# if(!exists $form->{addition}) {
# $form->{addition} = "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();
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}) {
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}) {
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
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
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
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";
sub save_and_close {
$lxdebug->enter_sub();
+ $auth->assert('customer_vendor_edit');
+
# $locale->text('Customer saved!')
# $locale->text('Vendor saved!')
sub save {
$lxdebug->enter_sub();
+ $auth->assert('customer_vendor_edit');
+
# $locale->text('Customer saved!')
# $locale->text('Vendor saved!')
sub delete {
$lxdebug->enter_sub();
+ $auth->assert('customer_vendor_edit');
+
# $locale->text('Customer deleted!')
# $locale->text('Cannot delete customer!')
# $locale->text('Vendor deleted!')
sub display {
$lxdebug->enter_sub();
+ $auth->assert('customer_vendor_edit');
+
&form_header();
&form_footer();
sub update {
$lxdebug->enter_sub();
+ $auth->assert('customer_vendor_edit');
+
&display();
$lxdebug->leave_sub();
}
sub get_contact {
$lxdebug->enter_sub();
+ $auth->assert('customer_vendor_edit');
+
CT->get_contact(\%myconfig, \%$form);
my $q = new CGI;
sub get_shipto {
$lxdebug->enter_sub();
+ $auth->assert('customer_vendor_edit');
+
CT->get_shipto(\%myconfig, \%$form);
my $q = new CGI;
sub get_delivery {
$lxdebug->enter_sub();
+ $auth->assert('customer_vendor_edit');
+
CT->get_delivery(\%myconfig, \%$form );
print CGI->new->header();
sub export {
$lxdebug->enter_sub();
+ $auth->assert('datev_export');
+
$form->{title} = $locale->text("DATEX - Export Assistent");
DATEV->get_datev_stamm(\%myconfig, \%$form);
<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|">
sub export2 {
$lxdebug->enter_sub();
+ $auth->assert('datev_export');
+
if ($form->{exporttype} == 0) {
&export_bewegungsdaten();
} else {
sub export_bewegungsdaten {
$lxdebug->enter_sub();
+ $auth->assert('datev_export');
+
$form->{title} = $locale->text("DATEX - Export Assistent");
$form->{allemonate} =
<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|">
sub export_stammdaten {
$lxdebug->enter_sub();
+ $auth->assert('datev_export');
+
$form->{title} = $locale->text("DATEX - Export Assistent");
$form->header;
<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|">
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);
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()));
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' });
sub add {
$lxdebug->enter_sub();
+ $auth->assert('dunning_edit');
+
# setup customer selection
$form->all_vc(\%myconfig, "customer", "AR");
sub show_invoices {
$lxdebug->enter_sub();
+ $auth->assert('dunning_edit');
+
DN->get_invoices(\%myconfig, \%$form);
$form->{title} = $locale->text('Start Dunning Process');
$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,
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);
sub save_dunning {
$lxdebug->enter_sub();
+ $auth->assert('dunning_edit');
+
my $active=1;
my @rows = ();
undef($form->{DUNNING_PDFS});
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"));
sub search {
$lxdebug->enter_sub();
+ $auth->assert('dunning_edit');
+
$form->get_lists("customers" => "ALL_CUSTOMERS",
"departments" => "ALL_DEPARTMENTS");
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);
sub print_dunning {
$lxdebug->enter_sub();
+ $auth->assert('dunning_edit');
+
$form->{rowcount} = 1;
$form->{selected_1} = 1;
$form->{dunning_id_1} = $form->{dunning_id};
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});
$lxdebug->leave_sub();
}
+sub continue {
+ call_sub($form->{nextsub});
+}
+
# end of main
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();
$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",
use SL::PE;
use SL::ReportGenerator;
-require "bin/mozilla/arap.pl";
require "bin/mozilla/common.pl";
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);
sub prepare_transaction {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
GL->transaction(\%myconfig, \%$form);
map {
sub edit {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
prepare_transaction();
$form->{title} = "Edit";
sub search {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
$form->{title} = $locale->text('Journal');
$form->all_departments(\%myconfig);
print qq|
<body onLoad="$onload">
-<form method=post action=$form->{script}>
+<form method=post action=gl.pl>
<input type=hidden name=sort value=transdate>
<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|">
sub generate_report {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
$form->{sort} ||= "transdate";
GL->all_transactions(\%myconfig, \%$form);
sub update {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
$form->{oldtransdate} = $form->{transdate};
my @a = ();
my ($init) = @_;
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
&form_header($init);
# for $i (1 .. $form->{rowcount}) {
my ($init) = @_;
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
$form->{debit_1} = 0 if !$form->{"debit_1"};
$form->{totaldebit} = 0;
$form->{totalcredit} = 0;
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" : "";
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));
sub form_footer {
$lxdebug->enter_sub();
+
+ $auth->assert('general_ledger');
+
($dec) = ($form->{totaldebit} =~ /\.(\d+)/);
$dec = length $dec;
$decimalplaces = ($dec > 2) ? $dec : 2;
</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>
print qq|
<body>
-<form method=post action=$form->{script}>
+<form method=post action=gl.pl>
|;
map { $form->{$_} =~ s/\"/"/g } qw(reference description);
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|;
}
sub post {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
$form->{title} = $locale->text("$form->{title} General Ledger Transaction");
$form->{storno} = 0;
sub post_as_new {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
$form->{id} = 0;
&add;
$lxdebug->leave_sub();
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");
$lxdebug->leave_sub();
}
+sub continue {
+ call_sub($form->{nextsub});
+}
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;
sub search {
$lxdebug->enter_sub();
+ $auth->assert('part_service_assembly_edit');
+
# switch for backward sorting
$form->{revers} = 0;
sub search_update_prices {
$lxdebug->enter_sub();
+ $auth->assert('part_service_assembly_edit');
+
my $pricegroups = IC->get_pricegroups(\%myconfig, \%$form);
$form->header;
sub confirm_price_update {
$lxdebug->enter_sub();
+ $auth->assert('part_service_assembly_edit');
+
$form->{nextsub} = "update_prices";
$form->header;
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 {
sub choice {
$lxdebug->enter_sub();
+ $auth->assert('part_service_assembly_edit');
+
our ($j, $lastndx);
my ($totop100);
$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 },
sub list {
$lxdebug->enter_sub();
+ $auth->assert('part_service_assembly_edit');
+
our ($lastndx);
our ($partnumber, $description, $unit, $sellprice, $soldtotal);
<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}">
sub top100 {
$lxdebug->enter_sub();
+ $auth->assert('part_service_assembly_edit');
+
if ($form->{ndx}) {
$form->{ndxs_counter}++;
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);
} #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
$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>";
<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}">
# 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";
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);
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
sub link_part {
$lxdebug->enter_sub();
+ $auth->assert('part_service_assembly_edit');
+
IC->create_links("IC", \%myconfig, \%$form);
# currencies
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;
sub form_footer {
$lxdebug->enter_sub();
+ $auth->assert('part_service_assembly_edit');
+
if ($form->{item} eq "assembly") {
print qq|
}
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}">
} 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} =
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
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};
sub delete {
$lxdebug->enter_sub();
+
+ $auth->assert('part_service_assembly_edit');
+
# saving the history
if(!exists $form->{addition}) {
$form->{snumbers} = qq|partnumber_| . $form->{partnumber};
sub price_row {
$lxdebug->enter_sub();
+ $auth->assert('part_service_assembly_edit');
+
my ($numrows) = @_;
print qq|
sub parts_language_selection {
$lxdebug->enter_sub();
+ $auth->assert('part_service_assembly_edit');
+
our ($onload);
my $languages = IC->retrieve_languages(\%myconfig, $form);
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);
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"};
&{$subroutine}($numrows);
- $numrows = ++$form->{makemodel_rows};
- $subroutine = "makemodel_row";
+ $numrows = 0;
}
if ($form->{item} eq 'assembly') {
$numrows = $form->{price_rows};
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";
########################################
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 = (
{ 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, },
);
$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} = ' ';
}
- $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+)/;
$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,
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};
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> </th>|;
# save all other form variables
foreach $key (keys %${form}) {
+ next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
$form->{$key} =~ s/\"/"/g;
print qq|<input name="$key" type="hidden" value="$form->{$key}">\n|;
}
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');
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);
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 ] } );
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;
$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);
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
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;
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;
}
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;
}
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;
$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;
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");
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
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();
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";
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";
$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;
($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);
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);
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;
}
$form->{title} = $title;
foreach $key (keys %$form) {
+ next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
$form->{$key} =~ s/\"/"/g;
print qq|<input type="hidden" name="$key" value="$form->{$key}">\n|;
}
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
# 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;
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();
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"})) {
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;
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');
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
sub invoice_links {
$lxdebug->enter_sub();
+ $auth->assert('vendor_invoice_edit');
+
# create links
$form->{webdav} = $webdav;
$form->{jsscript} = 1;
sub prepare_invoice {
$lxdebug->enter_sub();
+ $auth->assert('vendor_invoice_edit');
+
if ($form->{id}) {
map { $form->{$_} =~ s/\"/"/g } qw(invnumber ordnumber quonumber);
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//;
<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 =
sub form_footer {
$lxdebug->enter_sub();
+ $auth->assert('vendor_invoice_edit');
+
$form->{invtotal} = $form->{invsubtotal};
if (($rows = $form->numtextrows($form->{notes}, 25, 8)) < 2) {
}
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 "") {
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);
sub storno {
$lxdebug->enter_sub();
+ $auth->assert('vendor_invoice_edit');
+
if ($form->{storno}) {
$form->error($locale->text('Cannot storno storno invoice!'));
}
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}--;
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"}) {
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!'));
sub delete {
$lxdebug->enter_sub();
+ $auth->assert('vendor_invoice_edit');
+
$form->header;
print qq|
<body>
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/\"/"/g;
print qq|<input type=hidden name=$key value="$form->{$key}">\n|;
}
sub yes {
$lxdebug->enter_sub();
+
+ $auth->assert('vendor_invoice_edit');
+
if (IR->delete_invoice(\%myconfig, \%$form)) {
# saving the history
if(!exists $form->{addition}) {
sub add {
$lxdebug->enter_sub();
+ $auth->assert('invoice_edit');
+
return $lxdebug->leave_sub() if (load_draft_maybe());
if ($form->{type} eq "credit_note") {
}
- $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";
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
sub invoice_links {
$lxdebug->enter_sub();
+ $auth->assert('invoice_edit');
+
$form->{vc} = 'customer';
# create 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";
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};
}
}
- 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);
$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
sub form_footer {
$lxdebug->enter_sub();
+ $auth->assert('invoice_edit');
+
$form->{invtotal} = $form->{invsubtotal};
if (($rows = $form->numtextrows($form->{notes}, 26, 8)) < 2) {
| .
$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>
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;
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"}) {
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!'));
sub print_and_post {
$lxdebug->enter_sub();
+ $auth->assert('invoice_edit');
+
$old_form = new Form;
$print_post = 1;
$form->{print_and_post} = 1;
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}--;
sub storno {
$lxdebug->enter_sub();
+ $auth->assert('invoice_edit');
+
if ($form->{storno}) {
$form->error($locale->text('Cannot storno storno invoice!'));
}
$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();
sub preview {
$lxdebug->enter_sub();
+ $auth->assert('invoice_edit');
+
$form->{preview} = 1;
$old_form = new Form;
for (keys %$form) { $old_form->{$_} = $form->{$_} }
sub delete {
$lxdebug->enter_sub();
+
+ $auth->assert('invoice_edit');
+
if ($form->{second_run}) {
$form->{print_and_post} = 0;
}
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/\"/"/g;
print qq|<input type="hidden" name="$key" value="$form->{$key}">\n|;
}
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);
sub yes {
$lxdebug->enter_sub();
+
+ $auth->assert('invoice_edit');
+
if (IS->delete_invoice(\%myconfig, \%$form, $spool)) {
# saving the history
if(!exists $form->{addition}) {
sub e_mail {
$lxdebug->enter_sub();
+ $auth->assert('invoice_edit');
+
if (!$form->{id}) {
$print_post = 1;
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();
}
$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,
sub form_header {
$lxdebug->enter_sub();
+
+ $auth->assert('license_edit');
+
$form->{jsscript} = 1;
$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"
sub print_part_selection {
$lxdebug->enter_sub();
+
+ $auth->assert('license_edit');
+
form_header();
set_std_hidden("business");
sub print_customer_selection {
$lxdebug->enter_sub();
+
+ $auth->assert('license_edit');
+
form_header();
set_std_hidden("parts_id", "partnumber", "description");
sub print_license_form {
$lxdebug->enter_sub();
+
+ $auth->assert('license_edit');
+
print(
qq|
<table width=100%>
sub add {
$lxdebug->enter_sub();
+
+ $auth->assert('license_edit');
+
if (!$lizenzen) {
$form->error(
$locale->text(
sub do_add {
$lxdebug->enter_sub();
+
+ $auth->assert('license_edit');
+
$form->{"hidden"} = ["parts_id"];
form_header();
sub update {
$lxdebug->enter_sub();
+
+ $auth->assert('license_edit');
+
do_add();
+
$lxdebug->leave_sub();
}
sub save {
$lxdebug->enter_sub();
+ $auth->assert('license_edit');
+
($form->{customername}, $form->{customer_id}) = split /--/,
$form->{customer};
# 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);
sub search {
$lxdebug->enter_sub();
+
+ $auth->assert('license_edit');
+
if (!$lizenzen) {
$form->error(
$locale->text(
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;
sub details {
$lxdebug->enter_sub();
+
+ $auth->assert('license_edit');
+
LICENSES->get_license(\%myconfig, $form);
map(
{ $form->{$_} = $form->{"license"}->{$_}; } keys(%{ $form->{"license"} }));
#######################################################################
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}"; };
$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}));
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;
# 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();
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();
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};
$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;
+}
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.
} 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"> <a href="menu.pl?action=acc_menu&level=$ml_&login=$form->{login}&password=$form->{password}" class="nohover">$label</a> </td></tr>\n|;
+ qq|<tr><td class="bg" height="22" align="left" valign="middle" ><img src="image/$item.png" style="vertical-align:middle"> <a href="menu.pl?action=acc_menu&level=$ml_" class="nohover">$label</a> </td></tr>\n|;
§ion_menu($menu, $item);
#print qq|<br>\n|;
&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>
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,
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"> <a href="menu.pl?action=acc_menu&level=$ml_&login=$form->{login}&password=$form->{password}" class="nohover">$label</a> </td></tr>\n|;
+ #print qq|<tr><td class="bg" height="22" align="left" valign="middle" ><img src="image/$item.png" style="vertical-align:middle"> <a href="menu.pl?action=acc_menu&level=$ml_" class="nohover">$label</a> </td></tr>\n|;
§ion_menu($menu, $item);
#print qq|<br>\n|;
# $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') {
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;
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
sub order_links {
$lxdebug->enter_sub();
+
+ check_oe_access();
+
# get customer/vendor
$form->all_vc(\%myconfig, $form->{vc}, ($form->{vc} eq 'customer') ? "AR" : "AP");
sub prepare_order {
$lxdebug->enter_sub();
+
+ check_oe_access();
+
$form->{formname} = $form->{type} unless $form->{formname};
my $i = 0;
$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 = ();
sub form_footer {
$lxdebug->enter_sub();
+ check_oe_access();
+
$form->{invtotal} = $form->{invsubtotal};
$rows = max 2, $form->numtextrows($form->{notes}, 25, 8);
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;
sub search {
$lxdebug->enter_sub();
+ check_oe_access();
+
if ($form->{type} eq 'purchase_order') {
$form->{title} = $locale->text('Purchase Orders');
$form->{vc} = 'vendor';
<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>
<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}>
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} });
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();
}
sub save_and_close {
$lxdebug->enter_sub();
+ check_oe_access();
+
$form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
if ($form->{type} =~ /_order$/) {
sub save {
$lxdebug->enter_sub();
+ check_oe_access();
+
$form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
sub delete {
$lxdebug->enter_sub();
+ check_oe_access();
+
$form->header;
if ($form->{type} =~ /_order$/) {
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/\"/"/g;
print qq|<input type=hidden name=$key value="$form->{$key}">\n|;
}
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!');
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};
sub backorder_exchangerate {
$lxdebug->enter_sub();
+
+ check_oe_access();
+
my ($orddate, $buysell) = @_;
$form->header;
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/\"/"/g;
print qq|<input type=hidden name=$key value="$form->{$key}">\n|;
}
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>
sub save_as_new {
$lxdebug->enter_sub();
+ check_oe_access();
+
$form->{saveasnew} = 1;
$form->{closed} = 0;
map { delete $form->{$_} } qw(printed emailed queued);
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 };
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();
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();
}
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");
sub purchase_order {
$lxdebug->enter_sub();
+ check_oe_access();
+ $auth->assert('purchase_order_edit');
+
if ($form->{type} eq 'sales_order') {
check_for_direct_delivery();
}
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);
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};
sub e_mail {
$lxdebug->enter_sub();
+ check_oe_access();
+
$form->{print_and_save} = 1;
$print_post = 1;
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();
sub display_form {
$lxdebug->enter_sub();
+ check_oe_access();
+
$form->{"taxaccounts"} =~ s/\s*$//;
$form->{"taxaccounts"} =~ s/^\s*//;
foreach my $accno (split(/\s*/, $form->{"taxaccounts"})) {
sub add {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = "Add";
# construct callback
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
sub search {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
if ($form->{type} eq 'project') {
$report = "project_report";
$sort = 'projectnumber';
sub project_report {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
map { $form->{$_} = $form->unescape($form->{$_}) }
(projectnumber, description);
PE->projects(\%myconfig, \%$form);
sub form_project_header {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = $locale->text("$form->{title} Project");
# $locale->text('Add Project')
sub form_project_footer {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
print qq|
<input name=callback type=hidden value="$form->{callback}">
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);
sub delete {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
PE->delete_tuple(\%myconfig, \%$form);
if ($form->{type} eq 'project') {
sub partsgroup_report {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
map { $form->{$_} = $form->unescape($form->{$_}) } (partsgroup);
PE->partsgroups(\%myconfig, \%$form);
sub form_partsgroup_header {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
$form->{title} = $locale->text("$form->{title} Group");
# $locale->text('Add Group')
sub form_partsgroup_footer {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
print qq|
<input name=callback type=hidden value="$form->{callback}">
sub pricegroup_report {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
map { $form->{$_} = $form->unescape($form->{$_}) } (pricegroup);
PE->pricegroups(\%myconfig, \%$form);
sub form_pricegroup_header {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
# $locale->text('Add Pricegroup')
# $locale->text('Edit Pricegroup')
sub form_pricegroup_footer {
$lxdebug->enter_sub();
+ $auth->assert('config');
+
print qq|
<input name=callback type=hidden value="$form->{callback}">
sub reconciliation {
$lxdebug->enter_sub();
+ $auth->assert('cash');
+
RC->paymentaccounts(\%myconfig, \%$form);
$selection = "";
<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|">
sub get_payments {
$lxdebug->enter_sub();
+ $auth->assert('cash');
+
($form->{accno}, $form->{account}) = split /--/, $form->{accno};
RC->payment_transactions(\%myconfig, \%$form);
sub display_form {
$lxdebug->enter_sub();
+ $auth->assert('cash');
+
@column_index = qw(cleared transdate source name credit debit balance);
$column_header{cleared} = "<th> </th>";
<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|">
sub update {
$lxdebug->enter_sub();
+ $auth->assert('cash');
+
RC->payment_transactions(\%myconfig, \%$form);
foreach $ref (@{ $form->{PR} }) {
sub select_all {
$lxdebug->enter_sub();
+ $auth->assert('cash');
+
RC->payment_transactions(\%myconfig, \%$form);
map { $_->{cleared} = "checked" unless $_->{fx_transaction} }
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);
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} };
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();
# $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',
</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|">
sub get_project {
$lxdebug->enter_sub();
+
+ $auth->assert('report');
+
my $nextsub = shift;
$form->{project_id} = $form->{project_id_1};
sub generate_income_statement {
$lxdebug->enter_sub();
+ $auth->assert('report');
+
$form->{padding} = " ";
$form->{bold} = "<b>";
$form->{endbold} = "</b>";
sub generate_balance_sheet {
$lxdebug->enter_sub();
+ $auth->assert('report');
+
$form->{padding} = " ";
$form->{bold} = "<b>";
$form->{endbold} = "</b>";
$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};
sub generate_projects {
$lxdebug->enter_sub();
+ $auth->assert('report');
+
&get_project(generate_projects);
$form->{projectnumber} = $form->{projectnumber_1};
sub generate_trial_balance {
$lxdebug->enter_sub();
+ $auth->assert('report');
+
# get for each account initial balance, debits and credits
RP->trial_balance(\%myconfig, \%$form);
sub generate_ar_aging {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
# split customer
($form->{customer}) = split(/--/, $form->{customer});
sub generate_ap_aging {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
# split vendor
($form->{vendor}) = split(/--/, $form->{vendor});
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);
sub e_mail {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
# get name and email addresses
for $i (1 .. $form->{rowcount}) {
if ($form->{"statement_$i"}) {
# save all other variables
foreach $key (keys %$form) {
+ next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
$form->{$key} =~ s/\"/"/g;
print qq|<input type=hidden name=$key value="$form->{$key}">\n|;
}
sub send_email {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
$form->{subject} = $locale->text('Statement') . qq| - $form->{todate}|
unless $form->{subject};
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)/);
sub print_form {
$lxdebug->enter_sub();
+ $auth->assert('general_ledger');
+
my %replacements =
(
"ä" => "ae", "ö" => "oe", "ü" => "ue",
sub statement_details {
$lxdebug->enter_sub();
+
+ $auth->assert('general_ledger');
+
my ($ref) = @_;
push @{ $form->{invnumber} }, $ref->{invnumber};
sub generate_tax_report {
$lxdebug->enter_sub();
+ $auth->assert('report');
+
RP->tax_report(\%myconfig, \%$form);
$descvar = "$form->{accno}_description";
# 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";
$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} </td>|;
sub list_payments {
$lxdebug->enter_sub();
+ $auth->assert('cash');
+
if ($form->{account}) {
($form->{paymentaccounts}) = split /--/, $form->{account};
}
sub generate_bwa {
$lxdebug->enter_sub();
+
+ $auth->assert('report');
+
$form->{padding} = " ";
$form->{bold} = "<b>";
$form->{endbold} = "</b>";
# German Tax authority Module and later ELSTER Interface
#======================================================================
-require "bin/mozilla/arap.pl";
require "bin/mozilla/common.pl";
#use strict;
# $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');
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>|;
? 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|;
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();
sub help {
$lxdebug->enter_sub();
+ $auth->assert('advance_turnover_tax_return');
+
# parse help documents under doc
my $tmp = $form->{templates};
$form->{templates} = 'doc';
sub show {
$lxdebug->enter_sub();
+ $auth->assert('advance_turnover_tax_return');
+
#&generate_ustva();
no strict 'refs';
$lxdebug->leave_sub();
sub ustva_vorauswahl {
$lxdebug->enter_sub();
+ $auth->assert('advance_turnover_tax_return');
+
my $select_vorauswahl;
#Aktuelles Datum zerlegen:
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";
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');
dec_places => '0',
});
- $form->{"Watchdog::USTVA"} = 1;
$form->{USTVA} = [];
if ( $form->{format} eq 'generic') { # Formatierungen für HTML Ausgabe
sub config_step1 {
$lxdebug->enter_sub();
+ $auth->assert('advance_turnover_tax_return');
+
# edit all taxauthority prefs
$form->header;
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');
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) {
sub config_step2 {
$lxdebug->enter_sub();
+
+ $auth->assert('advance_turnover_tax_return');
+
$form->header();
# print qq|
FA_voranmeld method
FA_dauerfrist FA_71
elster
- login password
type elster_init
saved callback
);
sub create_steuernummer {
$lxdebug->enter_sub();
+
+ $auth->assert('advance_turnover_tax_return');
+
my $part = $form->{part};
my $patterncount = $form->{patterncount};
my $delimiter = $form->{delimiter};
sub save {
$lxdebug->enter_sub();
+ $auth->assert('advance_turnover_tax_return');
+
my $filename = "$form->{login}_$form->{filename}";
$filename =~ s|.*/||;
sub elster_hash {
$lxdebug->enter_sub();
+
+ $auth->assert('advance_turnover_tax_return');
+
my $finanzamt = USTVA->query_finanzamt(\%myconfig, \%$form);
$lxdebug->leave_sub();
return $finanzamt;
--- /dev/null
+#!/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;
--- /dev/null
+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;
+
--- /dev/null
+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;
+
* 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
@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 ---------------------------------------------------------------
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".
(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
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
`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
(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
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
--- /dev/null
+<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ächstes: <a rel="next" accesskey="n" href="Authentifizierungsdatenbank.html#Authentifizierungsdatenbank">Authentifizierungsdatenbank</a>,
+voriges: <a rel="previous" accesskey="p" href="Grundlagen-zur-Benutzerauthentifizierung.html#Grundlagen-zur-Benutzerauthentifizierung">Grundlagen zur Benutzerauthentifizierung</a>,
+aufwärts: <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->{admin_password}</code>.
+
+ </body></html>
+
--- /dev/null
+<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: <a rel="previous" accesskey="p" href="Name-des-Session_002dCookies.html#Name-des-Session_002dCookies">Name des Session-Cookies</a>,
+aufwärts: <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>
+
<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"><!--
<p>
<a name="Apache-Konfiguration"></a>
<a name="Apache_002dKonfiguration"></a>
-nächstes: <a rel="next" accesskey="n" href="Benutzer-und-Datenbanken-anlegen.html#Benutzer-und-Datenbanken-anlegen">Benutzer und Datenbanken anlegen</a>,
+nächstes: <a rel="next" accesskey="n" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>,
voriges: <a rel="previous" accesskey="p" href="Anpassung-der-PostgreSQL_002dKonfiguration.html#Anpassung-der-PostgreSQL_002dKonfiguration">Anpassung der PostgreSQL-Konfiguration</a>,
aufwärts: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
<hr>
--- /dev/null
+<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ächstes: <a rel="next" accesskey="n" href="Passwort_00fcberpr_00fcfung.html#Passwort_00fcberpr_00fcfung">Passwortüberprüfung</a>,
+voriges: <a rel="previous" accesskey="p" href="Administratorpasswort.html#Administratorpasswort">Administratorpasswort</a>,
+aufwärts: <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->{DB_config}</code> konfiguriert. Hier sind die folgenden
+Parameter anzugeben:
+
+ <ul>
+<li>`<samp><span class="samp">host</span></samp>' – Der Rechnername oder die IP-Adresse des Datenbankservers
+<li>`<samp><span class="samp">port</span></samp>' – Die Portnummer des Datenbankservers, meist 5432
+<li>`<samp><span class="samp">db</span></samp>' – Der Name der Authentifizierungsdatenbank
+<li>`<samp><span class="samp">user</span></samp>' – Der Benutzername, mit dem sich Lx-Office beim Datenbankserver anmeldet (z.B. “postgres”)
+<li>`<samp><span class="samp">password</span></samp>' – 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>
+
--- /dev/null
+<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ächstes: <a rel="next" accesskey="n" href="Gruppenmitgliedschaften-verwalten.html#Gruppenmitgliedschaften-verwalten">Gruppenmitgliedschaften verwalten</a>,
+voriges: <a rel="previous" accesskey="p" href="Gruppen-anlegen.html#Gruppen-anlegen">Gruppen anlegen</a>,
+aufwärts: <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>
+
+++ /dev/null
-<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ächstes: <a rel="next" accesskey="n" href="OpenDocument_002dVorlagen.html#OpenDocument_002dVorlagen">OpenDocument-Vorlagen</a>,
-voriges: <a rel="previous" accesskey="p" href="Apache_002dKonfiguration.html#Apache_002dKonfiguration">Apache-Konfiguration</a>,
-aufwärts: <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 “lxoffice”.
-
- <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 “lx-erp.conf”
-die Variable <code>$dbcharset</code> auf den Wert “UTF-8”
-setzen. Zusätzlich muss beim Anlegen der Datenbank “UTF-8 Unicode”
-als Schriftsatz ausgewählt werden.
-
-<!-- -->
-</body></html>
-
--- /dev/null
+<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ächstes: <a rel="next" accesskey="n" href="OpenDocument_002dVorlagen.html#OpenDocument_002dVorlagen">OpenDocument-Vorlagen</a>,
+voriges: <a rel="previous" accesskey="p" href="Benutzerauthentifizierung-und-Administratorpasswort.html#Benutzerauthentifizierung-und-Administratorpasswort">Benutzerauthentifizierung und Administratorpasswort</a>,
+aufwärts: <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>
+
--- /dev/null
+<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ächstes: <a rel="next" accesskey="n" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>,
+voriges: <a rel="previous" accesskey="p" href="Apache_002dKonfiguration.html#Apache_002dKonfiguration">Apache-Konfiguration</a>,
+aufwärts: <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>
+
--- /dev/null
+<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ächstes: <a rel="next" accesskey="n" href="Gruppen-anlegen.html#Gruppen-anlegen">Gruppen anlegen</a>,
+voriges: <a rel="previous" accesskey="p" href="Zusammenh_00e4nge.html#Zusammenh_00e4nge">Zusammenhänge</a>,
+aufwärts: <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>
+
--- /dev/null
+<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ächstes: <a rel="next" accesskey="n" href="Administratorpasswort.html#Administratorpasswort">Administratorpasswort</a>,
+aufwärts: <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 “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.
+
+ <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>
+
--- /dev/null
+<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ächstes: <a rel="next" accesskey="n" href="Benutzer-anlegen.html#Benutzer-anlegen">Benutzer anlegen</a>,
+voriges: <a rel="previous" accesskey="p" href="Datenbanken-anlegen.html#Datenbanken-anlegen">Datenbanken anlegen</a>,
+aufwärts: <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>
+
--- /dev/null
+<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ächstes: <a rel="next" accesskey="n" href="Migration-alter-Installationen.html#Migration-alter-Installationen">Migration alter Installationen</a>,
+voriges: <a rel="previous" accesskey="p" href="Benutzer-anlegen.html#Benutzer-anlegen">Benutzer anlegen</a>,
+aufwärts: <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>
+
<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:
--- /dev/null
+<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: <a rel="previous" accesskey="p" href="Gruppenmitgliedschaften-verwalten.html#Gruppenmitgliedschaften-verwalten">Gruppenmitgliedschaften verwalten</a>,
+aufwärts: <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>
+
--- /dev/null
+<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ächstes: <a rel="next" accesskey="n" href="Anlegen-der-Authentifizierungsdatenbank.html#Anlegen-der-Authentifizierungsdatenbank">Anlegen der Authentifizierungsdatenbank</a>,
+voriges: <a rel="previous" accesskey="p" href="Passwort_00fcberpr_00fcfung.html#Passwort_00fcberpr_00fcfung">Passwortüberprüfung</a>,
+aufwärts: <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->{cookie_name}</code> gesetzt.
+
+ <p>Diese Angabe ist optional, wenn nur eine Installation auf dem Server
+existiert.
+
+ </body></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="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ächstes: <a rel="next" accesskey="n" href="Lx_002dOffice-ERP-verwenden.html#Lx_002dOffice-ERP-verwenden">Lx-Office ERP verwenden</a>,
-voriges: <a rel="previous" accesskey="p" href="Benutzer-und-Datenbanken-anlegen.html#Benutzer-und-Datenbanken-anlegen">Benutzer und Datenbanken anlegen</a>,
+voriges: <a rel="previous" accesskey="p" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>,
aufwärts: <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 “lx-erp.conf”
-die Variable <code>$opendocument_templates</code> auf “1” 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 “lx-erp.conf” 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".
(xvfb) installiert werden. Bei Debian ist er im Paket “xvfb”
enthalten. Andere Distributionen enthalten ihn in anderen Paketen.
- <p>Nach der Installation müssen in der Datei “lx-erp.conf” 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 “X virtual frame buffer”
-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 “X virtual frame buffer” enthalten.
<p>Zusätzlich gibt es zwei verschiedene Arten, wie Lx-Office mit
OpenOffice kommuniziert. Die erste Variante, die benutzt wird, wenn
--- /dev/null
+<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ächstes: <a rel="next" accesskey="n" href="Name-des-Session_002dCookies.html#Name-des-Session_002dCookies">Name des Session-Cookies</a>,
+voriges: <a rel="previous" accesskey="p" href="Authentifizierungsdatenbank.html#Authentifizierungsdatenbank">Authentifizierungsdatenbank</a>,
+aufwärts: <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->{module}</code>.
+
+ <p>Sollen die Benutzerpasswörter in der Authentifizierungsdatenbank
+gespeichert werden, so muss der Parameter <code>$self->{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->{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->{LDAP_config}</code> angegeben werden:
+
+ <ul>
+<li>`<samp><span class="samp">host</span></samp>' – 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>' – Die Portnummer des LDAP-Servers; meist 389.
+<li>`<samp><span class="samp">tls</span></samp>' – 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>' – 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>' – Der Abschnitt des LDAP-Baumes, der durchsucht werden soll. Diese Angabe ist zwingend erforderlich.
+<li>`<samp><span class="samp">filter</span></samp>' – Ein optionaler LDAP-Filter. Enthält dieser Filter das Wort <code><%login%></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>' – 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>
+
--- /dev/null
+<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ächstes: <a rel="next" accesskey="n" href="Datenbanken-anlegen.html#Datenbanken-anlegen">Datenbanken anlegen</a>,
+aufwärts: <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>
+
<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>
<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>
<!-- -->
all:
+ rm -f INSTALL/*.html
makeinfo --html --document-language=de_DE INSTALL.texi
makeinfo --plaintext --document-language=de_DE -o INSTALL.txt INSTALL.texi
** 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
=======================================
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"; };
$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äres Verzeichnis konnte nicht erstellt werden:',
'A temporary file could not be created:' => 'Eine temporä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ü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 überprü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ändern der Lx-Office-Installationseinstellungen (Menüpunkte unterhalb von \'System\')',
'Confirmation' => 'Auftragsbestätigung',
'Contact' => 'Kontakt',
+ 'Could not open the old memberfile.' => 'Die Datei mit den Benutzerdaten konnte nicht geö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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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',
'Lockfile removed!' => 'System entsperrt!',
'Login name missing!' => 'Loginname fehlt.',
'MAILED' => 'Gesendet',
+ 'Manage license keys' => 'Lizenzschlü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\'.',
'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ä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ählt, oder die Gruppe wurde in der Zwischenzeit gelö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ä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',
'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',
'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',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ö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örter stimmen nicht ü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ü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ä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ä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ügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'invoice' => 'Rechnung',
'is already a member!' => 'ist bereits ein Mitglied!',
'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',
'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',
'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',
'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;
'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ös- und Aufwandskonten für diese vier Steuerzonen sowie aus einem Inventarkonto.',
+ 'A group named "Full Access" has been created.' => 'Eine Gruppe namens "Vollzugriff" 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äres Verzeichnis konnte nicht erstellt werden:',
'A temporary file could not be created:' => 'Eine temporäre Datei konnte nicht erstellt werden:',
'A unit with this name does already exist.' => 'Eine Einheit mit diesem Namen existiert bereits.',
'About' => 'über',
'Abrechnungsnummer' => 'Abrechnungsnummer',
'Abteilung' => 'Abteilung',
- 'Access Control' => 'Zugriffkontrolle',
'Account' => 'Konto',
'Account Category A' => 'Aktiva/Mittelverwendung',
'Account Category C' => 'Kosten',
'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ügen und bearbeiten',
+ 'Add to group' => 'Zu Gruppe hinzufügen',
'Add unit' => 'Einheit hinzufü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 Änderungen in dieser Datei wurden rückgängig gemacht.',
'All database upgrades have been applied.' => 'Alle Datenbankupdates wurden eingespielt.',
+ 'All reports' => 'Alle Berichte (Kontenübersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
+ 'Alternatively you can create a new part which will then be selected.' => 'Sie können auch einen neuen Artikel anlegen, der dann automatisch ausgewählt wird.',
+ 'Alternatively you can create a new project which will then be selected.' => 'Alternativ können Sie auch ein neues Projekt anlegen, das dann automatisch ausgewählt wird.',
+ 'Alternatively you can skip this step and create groups yourself.' => 'Alternativ können Sie diesen Schritt ü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',
'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',
'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 überprüfen Sie die Angaben in config/authentication.pl.',
'Birthday' => 'Geburtstag',
'Bis' => 'bis',
'Bis Konto: ' => 'bis Konto: ',
'Carry over shipping address' => 'Lieferadresse ü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ändern der Lx-Office-Installationseinstellungen (Menüpunkte unterhalb von \'System\')',
+ 'Charge number' => 'Chargennummer',
'Chart Type' => 'Kontentyp',
'Chart of Accounts' => 'Kontenübersicht',
'Chart of accounts' => 'Kontenrahmen',
'Costs' => 'Kosten',
'Could not copy %s to %s. Reason: %s' => 'Die Datei "%s" konnte nicht nach "%s" kopiert werden. Grund: %s',
'Could not open the file users/members.' => 'Die Datei "users/members" konnte nicht geöffnet werden.',
+ 'Could not open the old memberfile.' => 'Die Datei mit den Benutzerdaten konnte nicht geöffnet werden.',
'Could not print dunning.' => 'Die Mahnungen konnten nicht gedruckt werden.',
'Could not rename %s to %s. Reason: %s' => 'Die Datei "%s" konnte nicht in "%s" umbenannt werden. Grund: %s',
'Could not spawn ghostscript.' => 'Die Anwendung "ghostscript" konnte nicht gestartet werden.',
'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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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',
'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',
'Delete Account' => 'Konto löschen',
'Delete Dataset' => 'Datenbank löschen',
'Delete drafts' => 'Entwürfe löschen',
+ 'Delete group' => 'Gruppe löschen',
'Delivered' => 'Geliefert',
'Delivery Date' => 'Lieferdatum',
'Department' => 'Abteilung',
'Discount' => 'Rabatt',
'Display' => 'Anzeigen',
'Display file' => 'Datei anzeigen',
+ 'Do you really want to delete this group:' => 'Wollen Sie wirklich diese Gruppe lö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 übernehmen, damit der Händler die Waren direkt an Ihren Kunden liefern kann?',
'Done' => 'Fertig',
'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ür Sie anlegen und allen Benutzern Zugriff auf alle Lx-Office-Funktionen gewähren.',
'E-mail' => 'eMail',
'E-mail Statement to' => 'Fälligkeitsabrechnung als eMail an',
'E-mail address missing!' => 'E-Mail-Adresse fehlt!',
'Edit User' => 'Benutzerdaten bearbeiten',
'Edit Vendor' => 'Lieferant editieren',
'Edit Vendor Invoice' => 'Einkaufsrechnung bearbeiten',
+ 'Edit and delete a group' => 'Gruppen bearbeiten und lö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',
'February' => 'Februar',
'Fee' => 'Gebühr',
'File' => 'Datei',
- 'File locked!' => 'Datei gesperrt!',
'Files created by Lx-Office\'s "Backup Dataset" function are such files.' => 'Dateien, die von Lx-Office\' Funktion "Datenbank sichern" erstellt wurden, erfüllen diese Kriterien.',
'Folgekonto' => 'Folgekonto',
'Font size' => 'Schriftgröße',
'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',
'Group Invoices' => 'Rechnungen zusammenfassen',
'Group Items' => 'Waren gruppieren',
'Group deleted!' => 'Warengruppe gelöscht!',
+ 'Group membership' => 'Grouppenzugehörigkeit',
'Group missing!' => 'Warengruppe fehlt!',
'Group saved!' => 'Warengruppe gespeichert!',
'Groups' => 'Warengruppen',
'History Search Engine' => 'Historien Suchmaschine',
'Homepage' => 'Homepage',
'Host' => 'Datenbankcomputer',
+ 'However, you can create a new part which will then be selected.' => 'Sie können jedoch einen neuen Artikel anlegen, der dann automatisch ausgewählt wird.',
+ 'However, you can create a new project which will then be selected.' => 'Sie können jedoch ein neues Projekt anlegen, das dann automatisch ausgewählt wird.',
'I' => 'I',
'ID' => 'Buchungsnummer',
'ID-Nummer' => 'ID-Nummer (intern)',
'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 über Mahngebühren und Zinsen für ein Mahnlevel aktiviert ist, so werden die folgenden Konten fü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ö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 "[% HTML.escape(backupdir) %]".' => 'Falls Sie sich entscheiden, Lx-Office die Migration durchführen zu lassen, so wird Lx-Office ein Backup der alten Dateien im Verzeichnis "[% HTML.escape(backupdir) %]" erstellen und die Dateien anschließend lö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ü erledigen.',
+ 'If you want to change any of these parameters then press the "Back" button, edit the file "config/authentication.pl" and login into the admin module again.' => 'Wenn Sie einen der Parameter ändern wollen, so drücken Sie auf den "Zurück"-Button, bearbeiten Sie die Datei "config/authentication.pl", 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öschen wollen, so müssen Sie zuerst die Benutzer bearbeiten, die die fragliche Datenbank benutzen, und sie so ä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äche an. Lx-Office wird dann die Datenbank und die Tabellen für Sie anlegen.',
+ 'If you yourself want to upgrade the installation then please read the file "doc/UPGRADE" and follow the steps outlined in this file.' => 'Wenn Sie selber die Aktualisierung bzw. Einrichtung übernehmen wollen, so lesen Sie bitte die Datei "doc/UPGRADE" 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.',
'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ü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.',
'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ü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ä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ählen Sie ein anderes Menü in der Benutzerkonfiguration im Administrationsmenü aus.',
'Main Preferences' => 'Grundeinstellungen',
'Make' => 'Hersteller',
+ 'Manage license keys' => 'Lizenzschlüssel verwalten',
'Mandantennummer' => 'Mandantennummer',
'Mar' => 'März',
'March' => 'März',
'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ägernummer',
'Memo' => 'Memo',
'Message' => 'Nachricht',
'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',
'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ählt.',
'No dunnings have been selected for printing.' => 'Es wurden keine Mahnungen zum Drucken ausgewä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äge gefunden, denen keine Einheit zugeordnet war.',
+ 'No group has been selected, or the group does not exist anymore.' => 'Es wurde keine Gruppe ausgewählt, oder die Gruppe wurde in der Zwischenzeit gelö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ählt.',
'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
'No.' => 'Position',
'Non-taxable Purchases' => 'Nicht zu versteuernde Einkäufe',
'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)',
'Parts Inventory' => 'Warenliste',
'Parts must have an entry type.' => 'Waren müssen eine Buchungsgruppe haben.',
'Password' => 'Passwort',
- 'Password changed!' => 'Passwort geändert!',
'Payables' => 'Verbindlichkeiten',
'Payment' => 'Zahlungsausgang',
'Payment Reminder' => 'Zahlungserinnerung',
'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ü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.',
'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ü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ählen Sie einen Artikel aus der Liste aus.',
+ 'Please select a project from the list below.' => 'Bitte wä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ählen Sie den Kontenrahmen aus, der bei dieser Installation verwendet wird.',
'Please select the database you want to backup' => 'Bitte wählen Sie die zu sichernde Datenbank gefunden',
'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',
'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',
'Remove' => 'entfernen',
'Remove Draft' => 'Entwurf löschen',
'Remove draft when posting' => 'Entwurf beim Buchen lö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',
'Select all' => 'Alle auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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ählen',
+ 'Select the checkboxes that match users to the groups they should belong to.' => 'Wählen Sie diejenigen Checkboxen aus, die die Benutzer zu den gewüschten Gruppen zuordnen.',
'Sell Price' => 'Verkaufspreis',
'Send the backup via Email' => 'Die Sicherungsdatei per Email verschicken',
'Sep' => 'Sep',
'Subject' => 'Betreff',
'Subject:' => 'Betreff:',
'Subtotal' => 'Zwischensumme',
+ 'Superuser name' => 'Datenbankadministrator',
'System' => 'System',
'TOP100' => 'Top 100',
'Tax' => 'Steuer',
'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 überprüfen Sie die Angaben in config/authentication.pl.',
+ 'The authentication configuration file "config/authentication.pl" does not exist. This Lx-Office installation has probably not been updated correctly yet. Please contact your administrator.' => 'Die Konfigurationsdatei für die Authentifizierung "config/authentication.pl" wurde nicht gefunden. Diese Lx-Office-Installation wurde vermutlich noch nicht vollstä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 "pg_dump -o -Ft".' => 'Die von Ihnen hochzuladende Sicherungsdatei muss mit dem Programm und den Parametern "pg_dump -o -Ft" 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ö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ü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 "Dunning Duedate", "Total Fees" and "Interest" show data for the previous dunning created for this invoice.' => 'Die Spalten "Zahlbar bis", "Kumulierte Gebühren" und "Zinsen" zeigen Daten der letzten für diese Rechnung erzeugten Mahnung.',
+ 'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ungü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ö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ö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ür die Einführung von Buchungsgruppen ist jetzt beendet.',
'The database upgrade for the introduction of units is now complete.' => 'Das Datenbankupgrade zwecks Einführung von Einheiten ist nun beendet.',
'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.',
'The following drafts have been saved and can be loaded.' => 'Die folgenden Entwürfe wurden gespeichert und kö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ä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ü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ö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örter stimmen nicht überein.',
+ 'The old file containing the user information is still present ("[% HTML.escape(memberfile) %]"). 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 ("[% HTML.escape(memberfile) %]"). 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ö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ügung gestellten Paketes (z.B. Debian-Pakete oder RPM).',
'The restoration process has started. Here\'s the output of the "pg_restore" command:' => 'Der Wiederherstellungsprozess wurde gestartet. Hier ist die Ausgabe des "pg_restore"-Programmes:',
'The restoration process is complete. Please review "pg_restore"\'s output to find out if the restoration was successful.' => 'Die Wiederherstellung ist abgeschlossen. Bitte sehen Sie sich die Ausgabe von "pg_restore" 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ü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ö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ä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ü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äge in der Datenbank, fü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ä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ö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 "Full Access".' => 'Diese Gruppe wird "Vollzugriff" genannt.',
'This installation uses an unknown chart of accounts ("[% HTML.escape(coa) %]"). This database upgrade cannot create standard buchungsgruppen automatically.' => 'Diese Installation benutzt einen unbekannten Kontenrahmen ("[% HTML.escape(coa) %]"). 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 Ä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.',
'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)' => 'Übersetzung (%s)',
'Trial Balance' => 'Saldenbilanz',
'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
'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',
'You cannot continue before all required modules are installed.' => 'Sie können nicht fortfahren, bevor alle benötigten Pakete installiert sind.',
'You cannot continue until all unknown units have been mapped to known ones.' => 'Sie kö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ügen nicht ü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ählt:',
'You have to chose a dimension unit and a service unit which will then be assigned to those entries.' => 'Sie müssen eine Maß- und eine Dienstleistungseinheit auswä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üssen für jeden Artikel die neue Einheit auswählen.',
+ 'You have to create at least one group, grant it access to Lx-Office\'s functions and assign users to it.' => 'Sie müssen mindestens eine Benutzergruppe anlegen, ihr Zugriff auf die verschiedenen Funktionsbereiche von Lx-Office gewä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üssen neue Buchungsgruppen für alle Kombinationen aus Inventar-, Erlö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änkungen vorgenommen:',
'Zeitpunkt' => 'Zeitpunkt',
'choice' => 'auswählen',
'choice part' => 'Artikel auswählen',
'close' => 'schließen',
+ 'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schlüsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'continue' => 'weiter',
'customer' => 'Kunde',
'customer_list' => 'kundenliste',
'<%total_wo_skonto%> -- Amount payable less discount' => '<%total_wo_skonto%> -- Noch zu bezahlender Betrag abzü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',
'Add Printer' => 'Drucker hinzufügen',
'Add and edit %s' => '%s hinzufügen und bearbeiten',
'Address' => 'Adresse',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenübersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
'Article Code' => 'Artikelkürzel',
'Article Code missing!' => 'Artikelkürzel fehlt',
'Asset' => 'Aktiva/Mittelverwendung',
'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 überprüfen Sie die Angaben in config/authentication.pl.',
'Books are open' => 'Die Bücher sind geöffnet.',
'Buchungsgruppe' => 'Buchungsgruppe',
'Buchungsgruppen' => 'Buchungsgruppen',
'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ändern der Lx-Office-Installationseinstellungen (Menüpunkte unterhalb von \'System\')',
'Chart of Accounts' => 'Kontenübersicht',
'Close Books up to' => 'Die Bücher abschließen bis zum',
'Confirmation' => 'Auftragsbestätigung',
'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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'File' => 'Datei',
'Foreign Expenses' => 'Aufwand Ausland',
'Foreign Revenues' => 'Erlöse Ausland',
+ 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr',
'Header' => 'Überschrift',
'History' => 'Historie',
'History Search' => 'Historien Suche',
'Long Dates' => 'Lange Monatsnamen',
'Long Description' => 'Langtext',
'MAILED' => 'Gesendet',
+ 'Manage license keys' => 'Lizenzschlü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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)',
'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öse EU m. UStId',
'Revenues EU without UStId' => 'Erlöse EU o. UStId',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswählen',
'Skonto' => 'Skonto',
'Skonto Terms' => 'Zahlungsziel Skonto',
'Storno Invoice' => 'Stornorechnung',
'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 überprü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ö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ü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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.',
'The unit in row %d has been used in the meantime and cannot be changed anymore.' => 'Die Einheit in Zeile %d wurde in der Zwischenzeit benutzt und kann nicht mehr geändert werden.',
'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ä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)' => 'Übersetzung (%s)',
'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
'Type of Business' => 'Kunden-/Lieferantentyp',
'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ö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ügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'dimension units' => 'Maßeinheiten',
'down' => 'runter',
'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',
'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',
'weiter' => 'continue',
'löschen' => 'delete',
'kontodaten_bearbeiten' => 'edit_account',
+ 'neue_ware' => 'new_part',
+ 'neues_projekt' => 'new_project',
'speichern' => 'save',
};
$self->{texts} = {
'ADDED' => 'Hinzugefügt',
+ 'AP' => 'Einkauf',
+ 'AR' => 'Verkauf',
'Address' => 'Adresse',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenü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 überprüfen Sie die Angaben in config/authentication.pl.',
'CANCELED' => 'Storniert',
'Cc' => 'Cc',
+ 'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Verändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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ü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'Quotation' => 'Angebot',
'RFQ' => 'Anfrage',
'Receipt' => 'Zahlungseingang',
+ 'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+ 'Reports' => 'Berichte',
'SAVED' => 'Gespeichert',
'SAVED FOR DUNNING' => 'Gespeichert',
'SCREENED' => 'Angezeigt',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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',
'Value' => 'Wert',
'Variable' => 'Variable',
'Vendor details' => 'Lieferantendetails',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'invoice' => 'Rechnung',
'no' => 'nein',
'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',
'weiter' => 'continue',
'anzeigen' => 'display',
'bearbeiten' => 'edit',
+ 'neue_ware' => 'new_part',
+ 'neues_projekt' => 'new_project',
'speichern' => 'save',
};
$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übersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
'Amount' => 'Betrag',
'Amount Due' => 'Betrag fällig',
'Apr' => 'Apr',
'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 überprüfen Sie die Angaben in config/authentication.pl.',
'Bis' => 'bis',
'CANCELED' => 'Storniert',
'CSV export -- options' => 'CSV-Export -- Optionen',
'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ändern der Lx-Office-Installationseinstellungen (Menüpunkte unterhalb von \'System\')',
'Closed' => 'Geschlossen',
'Confirm!' => 'Bestätigen Sie!',
'Confirmation' => 'Auftragsbestätigung',
'Could not spawn the printer command.' => 'Die Druckanwendung konnte nicht gestartet werden.',
'Could not write the html2ps config file.' => 'Die temporäre html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
'Could not write the temporary HTML file.' => 'Eine temporä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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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',
'February' => 'Februar',
'File' => 'Datei',
'From' => 'Von',
+ 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr',
'History' => 'Historie',
'ID' => 'Buchungsnummer',
'Include in Report' => 'In Bericht aufnehmen',
'June' => 'Juni',
'Korrektur' => 'Korrektur',
'MAILED' => 'Gesendet',
+ 'Manage license keys' => 'Lizenzschlü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'Open' => 'Offen',
'Order' => 'Auftrag',
'Order Number' => 'Auftragsnummer',
+ 'Others' => 'Andere',
'PAYMENT POSTED' => 'Rechung gebucht',
'PDF export -- options' => 'PDF-Export -- Optionen',
'POSTED' => 'Gebucht',
'Purchase Order' => 'Lieferantenauftrag',
'Quotation' => 'Angebot',
'RFQ' => 'Anfrage',
+ 'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
'Remaining' => 'Rest',
'Remove draft when posting' => 'Entwurf beim Buchen löschen',
+ 'Reports' => 'Berichte',
'SAVED' => 'Gespeichert',
'SAVED FOR DUNNING' => 'Gespeichert',
'SCREENED' => 'Angezeigt',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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.',
'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',
'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ügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'history' => 'Historie',
'invoice' => 'Rechnung',
'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',
'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',
'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',
'storno' => 'storno',
'update' => 'update',
'use_as_template' => 'use_as_template',
- 'vendor_invoice' => 'vendor_invoice',
'vendor_selection' => 'vendor_selection',
'yes' => 'yes',
'kreditorenbuchung' => 'ap_transaction',
'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',
$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übersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
'Amount' => 'Betrag',
'Amount Due' => 'Betrag fällig',
'Apr' => 'Apr',
'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 überprüfen Sie die Angaben in config/authentication.pl.',
'Bis' => 'bis',
'CANCELED' => 'Storniert',
'CSV export -- options' => 'CSV-Export -- Optionen',
'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ändern der Lx-Office-Installationseinstellungen (Menüpunkte unterhalb von \'System\')',
'Closed' => 'Geschlossen',
'Confirm!' => 'Bestätigen Sie!',
'Confirmation' => 'Auftragsbestätigung',
'Could not spawn the printer command.' => 'Die Druckanwendung konnte nicht gestartet werden.',
'Could not write the html2ps config file.' => 'Die temporäre html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
'Could not write the temporary HTML file.' => 'Eine temporä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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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',
'February' => 'Februar',
'File' => 'Datei',
'From' => 'Von',
+ 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr',
'History' => 'Historie',
'ID' => 'Buchungsnummer',
'Include in Report' => 'In Bericht aufnehmen',
'June' => 'Juni',
'Korrektur' => 'Korrektur',
'MAILED' => 'Gesendet',
+ 'Manage license keys' => 'Lizenzschlü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'Open' => 'Offen',
'Order' => 'Auftrag',
'Order Number' => 'Auftragsnummer',
+ 'Others' => 'Andere',
'PAYMENT POSTED' => 'Rechung gebucht',
'PDF export -- options' => 'PDF-Export -- Optionen',
'POSTED' => 'Gebucht',
'Purchase Order' => 'Lieferantenauftrag',
'Quotation' => 'Angebot',
'RFQ' => 'Anfrage',
+ 'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
'Remaining' => 'Rest',
'Remove draft when posting' => 'Entwurf beim Buchen löschen',
+ 'Reports' => 'Berichte',
'SAVED' => 'Gespeichert',
'SAVED FOR DUNNING' => 'Gespeichert',
'SCREENED' => 'Angezeigt',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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.',
'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',
'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ügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'history' => 'Historie',
'invoice' => 'Rechnung',
'_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',
'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',
'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',
'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',
$self->{texts} = {
'ADDED' => 'Hinzugefügt',
+ 'AP' => 'Einkauf',
+ 'AR' => 'Verkauf',
'Address' => 'Adresse',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenü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 überprüfen Sie die Angaben in config/authentication.pl.',
'CANCELED' => 'Storniert',
'Cc' => 'Cc',
+ 'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Verändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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ü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'Purchase Order' => 'Lieferantenauftrag',
'Quotation' => 'Angebot',
'RFQ' => 'Anfrage',
+ 'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+ 'Reports' => 'Berichte',
'SAVED' => 'Gespeichert',
'SAVED FOR DUNNING' => 'Gespeichert',
'SCREENED' => 'Angezeigt',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ängigkeit \'%s\'.',
'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ügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'invoice' => 'Rechnung',
'no' => 'nein',
'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',
'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',
'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;
$self->{texts} = {
'ADDED' => 'Hinzugefügt',
+ 'AP' => 'Einkauf',
+ 'AR' => 'Verkauf',
'Account' => 'Konto',
'Address' => 'Adresse',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenü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 überprü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ändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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ü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'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',
'Select all' => 'Alle auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ängigkeit \'%s\'.',
'Vendor' => 'Lieferant',
'Vendor details' => 'Lieferantendetails',
'Yes' => 'Ja',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'done' => 'erledigt',
'invoice' => 'Rechnung',
'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',
'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',
'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',
$self->{texts} = {
'ADDED' => 'Hinzugefügt',
+ 'AP' => 'Einkauf',
+ 'AR' => 'Verkauf',
'Account' => 'Konto',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenübersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
'Apr' => 'Apr',
'April' => 'April',
'Aug' => 'Aug',
'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 überprü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ändern der Lx-Office-Installationseinstellungen (Menü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äre html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
'Could not write the temporary HTML file.' => 'Eine temporä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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'February' => 'Februar',
'File' => 'Datei',
'From' => 'Von',
+ 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr',
'Include in Report' => 'In Bericht aufnehmen',
'Invoice' => 'Rechnung',
'Jan' => 'Jan',
'June' => 'Juni',
'List Transactions' => 'Buchungsliste',
'MAILED' => 'Gesendet',
+ 'Manage license keys' => 'Lizenzschlü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',
'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',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ängigkeit \'%s\'.',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'invoice' => 'Rechnung',
'list_of_transactions' => 'buchungsliste',
'packing_list' => 'Versandliste',
$self->{texts} = {
'ADDED' => 'Hinzugefügt',
+ 'AP' => 'Einkauf',
+ 'AR' => 'Verkauf',
'Address' => 'Adresse',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenü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 überprüfen Sie die Angaben in config/authentication.pl.',
'CANCELED' => 'Storniert',
'Cc' => 'Cc',
+ 'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Verändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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ü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'Purchase Order' => 'Lieferantenauftrag',
'Quotation' => 'Angebot',
'RFQ' => 'Anfrage',
+ 'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+ 'Reports' => 'Berichte',
'SAVED' => 'Gespeichert',
'SAVED FOR DUNNING' => 'Gespeichert',
'SCREENED' => 'Angezeigt',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ängigkeit \'%s\'.',
'Value' => 'Wert',
'Variable' => 'Variable',
'Vendor details' => 'Lieferantendetails',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'invoice' => 'Rechnung',
'no' => 'nein',
'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',
'show_vc_details' => 'show_vc_details',
'vendor_selection' => 'vendor_selection',
'weiter' => 'continue',
+ 'neue_ware' => 'new_part',
+ 'neues_projekt' => 'new_project',
};
1;
'AR' => 'Verkauf',
'Account' => 'Konto',
'Address' => 'Adresse',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
'All' => 'Alle',
+ 'All reports' => 'Alle Berichte (Kontenü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 überprü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ändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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',
'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ü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'RFQ' => 'Anfrage',
'Receipt' => 'Zahlungseingang',
'Receipt posted!' => 'Beleg gebucht!',
+ 'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+ 'Reports' => 'Berichte',
'SAVED' => 'Gespeichert',
'SAVED FOR DUNNING' => 'Gespeichert',
'SCREENED' => 'Angezeigt',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ängigkeit \'%s\'.',
'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ügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'invoice' => 'Rechnung',
'no' => 'nein',
'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',
'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',
'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',
$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ü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 überprü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ändern der Lx-Office-Installationseinstellungen (Menü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äre html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
'Could not write the temporary HTML file.' => 'Eine temporä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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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ü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'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',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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',
'Vendor details' => 'Lieferantendetails',
'Vendor saved!' => 'Lieferant gespeichert!',
'Vendors' => 'Lieferanten',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'customer_list' => 'kundenliste',
'customernumber not unique!' => 'Die Kundennummer ist schon vergeben',
'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',
'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',
'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',
$self->{texts} = {
'ADDED' => 'Hinzugefügt',
+ 'AP' => 'Einkauf',
+ 'AR' => 'Verkauf',
'Abrechnungsnummer' => 'Abrechnungsnummer',
'Address' => 'Adresse',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenü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',
'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 überprü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ändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'Export Stammdaten' => 'Export Stammdaten',
'February' => 'Februar',
'File' => 'Datei',
+ 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr',
'History' => 'Historie',
'I' => 'I',
'II' => 'II',
'Konten' => 'Konten',
'Kontonummernerweiterung (KNE)' => 'Kontonummernerweiterung (KNE)',
'MAILED' => 'Gesendet',
+ 'Manage license keys' => 'Lizenzschlü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ägernummer',
'Message' => 'Nachricht',
'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'Quartal' => 'Quartal',
'Quotation' => 'Angebot',
'RFQ' => 'Anfrage',
+ 'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+ 'Reports' => 'Berichte',
'SAVED' => 'Gespeichert',
'SAVED FOR DUNNING' => 'Gespeichert',
'SCREENED' => 'Angezeigt',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ängigkeit \'%s\'.',
'Variable' => 'Variable',
'Vendor details' => 'Lieferantendetails',
'Von Konto: ' => 'von Konto: ',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'invoice' => 'Rechnung',
'no' => 'nein',
'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',
'show_vc_details' => 'show_vc_details',
'vendor_selection' => 'vendor_selection',
'weiter' => 'continue',
+ 'neue_ware' => 'new_part',
+ 'neues_projekt' => 'new_project',
};
1;
' 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übersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
'Amount' => 'Betrag',
'Apr' => 'Apr',
'April' => 'April',
'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 überprü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ändern der Lx-Office-Installationseinstellungen (Menüpunkte unterhalb von \'System\')',
'City' => 'Stadt',
'Company Name' => 'Firmenname',
'Confirmation' => 'Auftragsbestätigung',
'Could not write the html2ps config file.' => 'Die temporäre html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
'Could not write the temporary HTML file.' => 'Eine temporä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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'Delivery Date' => 'Lieferdatum',
'Department' => 'Abteilung',
'Dependency loop detected:' => 'Schleife in den Abhängigkeiten entdeckt:',
- 'Description' => 'Beschreibung',
'Directory' => 'Verzeichnis',
'Discount' => 'Rabatt',
'Dunning Date' => 'Mahndatum',
'Feb' => 'Feb',
'February' => 'Februar',
'File' => 'Datei',
+ 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr',
'Group' => 'Warengruppe',
'History' => 'Historie',
'In-line' => 'im Text',
'LP' => 'LP',
'License' => 'Lizenz',
'MAILED' => 'Gesendet',
+ 'Manage license keys' => 'Lizenzschlü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\'.',
'No dunnings have been selected for printing.' => 'Es wurden keine Mahnungen zum Drucken ausgewä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',
'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)',
'Please enter values' => 'Bitte Werte eingeben',
'Postscript' => 'Postscript',
'Price' => 'Preis',
+ 'Price Factor' => 'Preisfaktor',
'Pricegroup' => 'Preisgruppe',
'Print dunnings' => 'Mahnungen drucken',
'Printer' => 'Drucker',
'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',
'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',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ängigkeit \'%s\'.',
'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ügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'dunning_list' => 'mahnungsliste',
'emailed to' => 'gemailt an',
'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',
'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',
'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',
'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',
'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',
};
$self->{texts} = {
'ADDED' => 'Hinzugefügt',
+ 'AP' => 'Einkauf',
+ 'AR' => 'Verkauf',
'Address' => 'Adresse',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenü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 überprüfen Sie die Angaben in config/authentication.pl.',
'CANCELED' => 'Storniert',
'Cc' => 'Cc',
+ 'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Verändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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ü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'Purchase Order' => 'Lieferantenauftrag',
'Quotation' => 'Angebot',
'RFQ' => 'Anfrage',
+ 'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+ 'Reports' => 'Berichte',
'SAVED' => 'Gespeichert',
'SAVED FOR DUNNING' => 'Gespeichert',
'SCREENED' => 'Angezeigt',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ängigkeit \'%s\'.',
'Value' => 'Wert',
'Variable' => 'Variable',
'Vendor details' => 'Lieferantendetails',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'invoice' => 'Rechnung',
'no' => 'nein',
'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',
'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',
};
$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übersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
'Apr' => 'Apr',
'April' => 'April',
'Are you sure you want to delete Transaction' => 'Buchung wirklich löschen?',
'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 überprüfen Sie die Angaben in config/authentication.pl.',
'Bis' => 'bis',
'Buchungsdatum' => 'Buchungsdatum',
'Buchungsnummer' => 'Buchungsnummer',
'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ändern der Lx-Office-Installationseinstellungen (Menüpunkte unterhalb von \'System\')',
'Confirm!' => 'Bestätigen Sie!',
'Confirmation' => 'Auftragsbestätigung',
'Contact' => 'Kontakt',
'Could not spawn the printer command.' => 'Die Druckanwendung konnte nicht gestartet werden.',
'Could not write the html2ps config file.' => 'Die temporäre html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
'Could not write the temporary HTML file.' => 'Eine temporä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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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',
'February' => 'Februar',
'File' => 'Datei',
'From' => 'Von',
+ 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr',
'History' => 'Historie',
'ID' => 'Buchungsnummer',
'Include in Report' => 'In Bericht aufnehmen',
'Korrektur' => 'Korrektur',
'Liability' => 'Passiva/Mittelherkunft',
'MAILED' => 'Gesendet',
+ 'Manage license keys' => 'Lizenzschlü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'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',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswä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ählen',
'Sep' => 'Sep',
'September' => 'September',
'Show details' => 'Details anzeigen',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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',
'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ügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'general_ledger_list' => 'buchungsjournal',
'invoice' => 'Rechnung',
'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',
'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',
'weiter' => 'continue',
'löschen' => 'delete',
'dialogbuchung' => 'gl_transaction',
+ 'neue_ware' => 'new_part',
+ 'neues_projekt' => 'new_project',
'buchen' => 'post',
'rechnung' => 'sales_invoice',
'storno' => 'storno',
' Part Number missing!' => ' Artikelnummer fehlt!',
'*/' => '*/',
'ADDED' => 'Hinzugefügt',
+ 'AP' => 'Einkauf',
+ 'AR' => 'Verkauf',
'Accounting Menu' => 'Kontoverwaltung',
'Active' => 'Aktiv',
'Add ' => 'Hinzufügen',
'Add Sales Order' => 'Auftrag erfassen',
'Add Service' => 'Dienstleistung erfassen',
'Address' => 'Adresse',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenübersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
'Apr' => 'Apr',
'April' => 'April',
'Assemblies' => 'Erzeugnisse',
'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 überprü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ändern der Lx-Office-Installationseinstellungen (Menüpunkte unterhalb von \'System\')',
'City' => 'Stadt',
'Company Name' => 'Firmenname',
'Confirmation' => 'Auftragsbestätigung',
'Could not write the html2ps config file.' => 'Die temporäre html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
'Could not write the temporary HTML file.' => 'Eine temporä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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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ü erledigen.',
'Long Description' => 'Langtext',
'MAILED' => 'Gesendet',
'Make' => 'Hersteller',
+ 'Manage license keys' => 'Lizenzschlü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'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)',
'Preis' => 'Preis',
'Preisklasse' => 'Preisgruppe',
'Price' => 'Preis',
+ 'Price Factor' => 'Preisfaktor',
'Pricegroup' => 'Preisgruppe',
'Printer' => 'Drucker',
'Proforma Invoice' => 'Proformarechnung',
'Quoted' => 'Angeboten',
'RFQ' => 'Anfrage',
'ROP' => 'Mindestlagerbestand',
+ 'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+ 'Reports' => 'Berichte',
'Reqdate' => 'Lieferdatum',
'Required by' => 'Lieferdatum',
'SAVED' => 'Gespeichert',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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',
'Vendor Number' => 'Lieferantennummer',
'Vendor details' => 'Lieferantendetails',
'Weight' => 'Gewicht',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'deliverydate' => 'Lieferdatum',
'ea' => 'St.',
'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',
'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',
'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',
'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',
'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',
' 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übersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
'Apr' => 'Apr',
'April' => 'April',
'Attachment' => 'als Anhang',
'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 überprüfen Sie die Angaben in config/authentication.pl.',
'CANCELED' => 'Storniert',
'Cc' => 'Cc',
+ 'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Verändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'Feb' => 'Feb',
'February' => 'Februar',
'File' => 'Datei',
+ 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr',
'Group' => 'Warengruppe',
'History' => 'Historie',
'In-line' => 'im Text',
'LP' => 'LP',
'License' => 'Lizenz',
'MAILED' => 'Gesendet',
+ 'Manage license keys' => 'Lizenzschlü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'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)',
'Please enter values' => 'Bitte Werte eingeben',
'Postscript' => 'Postscript',
'Price' => 'Preis',
+ 'Price Factor' => 'Preisfaktor',
'Pricegroup' => 'Preisgruppe',
'Printer' => 'Drucker',
'Proforma Invoice' => 'Proformarechnung',
'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',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ängigkeit \'%s\'.',
'Variable' => 'Variable',
'Vendor Number' => 'Lieferantennummer',
'Vendor details' => 'Lieferantendetails',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'emailed to' => 'gemailt an',
'invoice' => 'Rechnung',
'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',
'vendor_details' => 'vendor_details',
'vendor_selection' => 'vendor_selection',
'weiter' => 'continue',
+ 'neue_ware' => 'new_part',
+ 'neues_projekt' => 'new_project',
};
1;
' Date missing!' => ' Datum fehlt!',
'*/' => '*/',
'ADDED' => 'Hinzugefügt',
+ 'AP' => 'Einkauf',
+ 'AR' => 'Verkauf',
'Account' => 'Konto',
'Add Purchase Order' => 'Lieferantenauftrag erfassen',
'Add Quotation' => 'Angebot erfassen',
'Add Sales Order' => 'Auftrag erfassen',
'Add Vendor Invoice' => 'Einkaufsrechnung erfassen',
'Address' => 'Adresse',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenübersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
'Amount' => 'Betrag',
'Apr' => 'Apr',
'April' => 'April',
'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 überprü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!',
'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ändern der Lx-Office-Installationseinstellungen (Menüpunkte unterhalb von \'System\')',
'City' => 'Stadt',
'Company Name' => 'Firmenname',
'Confirm!' => 'Bestätigen Sie!',
'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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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',
'Feb' => 'Feb',
'February' => 'Februar',
'File' => 'Datei',
+ 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr',
'Group' => 'Warengruppe',
'History' => 'Historie',
'In-line' => 'im Text',
'LP' => 'LP',
'License' => 'Lizenz',
'MAILED' => 'Gesendet',
+ 'Manage license keys' => 'Lizenzschlü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'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)',
'Post Payment' => 'Zahlung buchen',
'Postscript' => 'Postscript',
'Price' => 'Preis',
+ 'Price Factor' => 'Preisfaktor',
'Pricegroup' => 'Preisgruppe',
'Printer' => 'Drucker',
'Proforma Invoice' => 'Proformarechnung',
'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',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ängigkeit \'%s\'.',
'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ügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'emailed to' => 'gemailt an',
'history' => 'Historie',
'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',
'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',
'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',
'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',
'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',
' Date missing!' => ' Datum fehlt!',
'*/' => '*/',
'ADDED' => 'Hinzugefügt',
+ 'AP' => 'Einkauf',
+ 'AR' => 'Verkauf',
'Account' => 'Konto',
'Add Credit Note' => 'Gutschrift erfassen',
'Add Purchase Order' => 'Lieferantenauftrag erfassen',
'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übersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
'Amount' => 'Betrag',
'Apr' => 'Apr',
'April' => 'April',
'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 überprü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!',
'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ändern der Lx-Office-Installationseinstellungen (Menüpunkte unterhalb von \'System\')',
'Choose Customer' => 'Endkunde wählen:',
'Choose Vendor' => 'Händler wählen',
'City' => 'Stadt',
'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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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',
'Feb' => 'Feb',
'February' => 'Februar',
'File' => 'Datei',
+ 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr',
'Group' => 'Warengruppe',
'History' => 'Historie',
'In-line' => 'im Text',
'LP' => 'LP',
'License' => 'Lizenz',
'MAILED' => 'Gesendet',
+ 'Manage license keys' => 'Lizenzschlü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'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)',
'Postscript' => 'Postscript',
'Preview' => 'Druckvorschau',
'Price' => 'Preis',
+ 'Price Factor' => 'Preisfaktor',
'Pricegroup' => 'Preisgruppe',
'Print' => 'Drucken',
'Print and Post' => 'Drucken und Buchen',
'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',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ängigkeit \'%s\'.',
'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ügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'emailed to' => 'gemailt an',
'history' => 'Historie',
'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',
'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',
'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',
'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',
'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',
'email' => 'e_mail',
+ 'neue_ware' => 'new_part',
+ 'neues_projekt' => 'new_project',
'auftrag' => 'order',
'buchen' => 'post',
'zahlung_buchen' => 'post_payment',
$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ü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 überprüfen Sie die Angaben in config/authentication.pl.',
'CANCELED' => 'Storniert',
'Cc' => 'Cc',
+ 'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Verändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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',
'License key' => 'Lizenzschlüssel',
'Licenses' => 'Lizenzen',
'MAILED' => 'Gesendet',
+ 'Manage license keys' => 'Lizenzschlü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\'.',
'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',
'Quantity' => 'Menge',
'Quotation' => 'Angebot',
'RFQ' => 'Anfrage',
+ 'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+ 'Reports' => 'Berichte',
'SAVED' => 'Gespeichert',
'SAVED FOR DUNNING' => 'Gespeichert',
'SCREENED' => 'Angezeigt',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ängigkeit \'%s\'.',
'Variable' => 'Variable',
'Vendor details' => 'Lieferantendetails',
'View License' => 'Lizenz ansehen',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'invoice' => 'Rechnung',
'no' => 'nein',
'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',
'vendor_selection' => 'vendor_selection',
'erfassen' => 'add',
'weiter' => 'continue',
+ 'neue_ware' => 'new_part',
+ 'neues_projekt' => 'new_project',
'speichern' => 'save',
'erneuern' => 'update',
};
$self->{texts} = {
'ADDED' => 'Hinzugefügt',
+ 'AP' => 'Einkauf',
+ 'AR' => 'Verkauf',
'About' => 'über',
'Address' => 'Adresse',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenü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 überprüfen Sie die Angaben in config/authentication.pl.',
'CANCELED' => 'Storniert',
'Cc' => 'Cc',
+ 'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Verändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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ü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'Purchase Order' => 'Lieferantenauftrag',
'Quotation' => 'Angebot',
'RFQ' => 'Anfrage',
+ 'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+ 'Reports' => 'Berichte',
'SAVED' => 'Gespeichert',
'SAVED FOR DUNNING' => 'Gespeichert',
'SCREENED' => 'Angezeigt',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ängigkeit \'%s\'.',
'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ügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'invoice' => 'Rechnung',
'no' => 'nein',
'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;
'Add Transaction' => 'Dialogbuchen',
'Add Vendor' => 'Lieferant erfassen',
'Add Vendor Invoice' => 'Einkaufsrechnung erfassen',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenü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 überprü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ändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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ängigkeiten entdeckt:',
'Dimension units' => 'Maß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',
'List Printer' => 'Drucker anzeigen',
'List Tax' => 'Bearbeiten',
'Logout' => 'Abmeldung',
+ 'Manage license keys' => 'Lizenzschlü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',
'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',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ügen nicht über die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
+ '[email]' => '[email]',
+ 'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schlüsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
};
$self->{subs} = {
'acc_menu' => 'acc_menu',
'display' => 'display',
'section_menu' => 'section_menu',
+ 'weiter' => 'continue',
};
1;
$self->{texts} = {
+ 'AP' => 'Einkauf',
+ 'AR' => 'Verkauf',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenü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 überprüfen Sie die Angaben in config/authentication.pl.',
+ 'Cc' => 'Cc',
+ 'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Verändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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ä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ü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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ängigkeit \'%s\'.',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht über die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
+ '[email]' => '[email]',
+ 'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schlüsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
};
$self->{subs} = {
'acc_menu' => 'acc_menu',
'display' => 'display',
'print_menu' => 'print_menu',
+ 'weiter' => 'continue',
};
1;
'Add Transaction' => 'Dialogbuchen',
'Add Vendor' => 'Lieferant erfassen',
'Add Vendor Invoice' => 'Einkaufsrechnung erfassen',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenü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 überprü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ändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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ängigkeiten entdeckt:',
'Dimension units' => 'Maß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',
'List Printer' => 'Drucker anzeigen',
'List Tax' => 'Bearbeiten',
'Logout' => 'Abmeldung',
+ 'Manage license keys' => 'Lizenzschlü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',
'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',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ügen nicht über die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
+ '[email]' => '[email]',
+ 'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schlüsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
};
$self->{subs} = {
'clock_line' => 'clock_line',
'display' => 'display',
'section_menu' => 'section_menu',
+ 'weiter' => 'continue',
};
1;
$self->{texts} = {
+ 'AP' => 'Einkauf',
+ 'AR' => 'Verkauf',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenü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 überprüfen Sie die Angaben in config/authentication.pl.',
+ 'Cc' => 'Cc',
+ 'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Verändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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ä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ü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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ängigkeit \'%s\'.',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht über die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
+ '[email]' => '[email]',
+ 'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schlüsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
};
$self->{subs} = {
'clock_line' => 'clock_line',
'display' => 'display',
'print_menu' => 'print_menu',
+ 'weiter' => 'continue',
};
1;
' missing!' => ' fehlt!',
'*/' => '*/',
'ADDED' => 'Hinzugefügt',
+ 'AP' => 'Einkauf',
+ 'AR' => 'Verkauf',
'Add Exchangerate' => 'Wechselkurs erfassen',
'Add Purchase Order' => 'Lieferantenauftrag erfassen',
'Add Quotation' => 'Angebot erfassen',
'Add Sales Order' => 'Auftrag erfassen',
'Add Vendor Invoice' => 'Einkaufsrechnung erfassen',
'Address' => 'Adresse',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenübersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
'Amount' => 'Betrag',
'Apr' => 'Apr',
'April' => 'April',
'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 überprüfen Sie die Angaben in config/authentication.pl.',
'Bis' => 'bis',
'CANCELED' => 'Storniert',
'CSV export -- options' => 'CSV-Export -- Optionen',
'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ändern der Lx-Office-Installationseinstellungen (Menü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!',
'Could not write the html2ps config file.' => 'Die temporäre html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
'Could not write the temporary HTML file.' => 'Eine temporä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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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',
'February' => 'Februar',
'File' => 'Datei',
'From' => 'Von',
+ 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr',
'Group' => 'Warengruppe',
'History' => 'Historie',
'ID' => 'Buchungsnummer',
'LP' => 'LP',
'License' => 'Lizenz',
'MAILED' => 'Gesendet',
+ 'Manage license keys' => 'Lizenzschlü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'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)',
'Please enter values' => 'Bitte Werte eingeben',
'Postscript' => 'Postscript',
'Price' => 'Preis',
+ 'Price Factor' => 'Preisfaktor',
'Pricegroup' => 'Preisgruppe',
'Printer' => 'Drucker',
'Proforma Invoice' => 'Proformarechnung',
'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',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ängigkeit \'%s\'.',
'Workflow sales_order' => 'Workflow Auftrag',
'Workflow sales_quotation' => 'Workflow Angebot',
'Yes' => 'Ja',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'emailed to' => 'gemailt an',
'invoice' => 'Rechnung',
'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',
'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',
'form_footer' => 'form_footer',
'form_header' => 'form_header',
'format_dates' => 'format_dates',
- 'gl_transaction' => 'gl_transaction',
'invoice' => 'invoice',
'invoicetotal' => 'invoicetotal',
'item_selected' => 'item_selected',
'name_selected' => 'name_selected',
'new_item' => 'new_item',
'new_license' => 'new_license',
+ 'new_project' => 'new_project',
'no' => 'no',
'order' => 'order',
'order_links' => 'order_links',
'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',
'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',
'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',
'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',
$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ü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 überprü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ändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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!',
'Inactive' => 'Inaktiv',
'Invoice' => 'Rechnung',
'MAILED' => 'Gesendet',
+ 'Manage license keys' => 'Lizenzschlü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'Purchase Order' => 'Lieferantenauftrag',
'Quotation' => 'Angebot',
'RFQ' => 'Anfrage',
+ 'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+ 'Reports' => 'Berichte',
'SAVED' => 'Gespeichert',
'SAVED FOR DUNNING' => 'Gespeichert',
'SCREENED' => 'Angezeigt',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ängigkeit \'%s\'.',
'Variable' => 'Variable',
'Vendor details' => 'Lieferantendetails',
'Yes' => 'Ja',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'history' => 'Historie',
'invoice' => 'Rechnung',
'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',
'erfassen' => 'add',
'weiter' => 'continue',
'löschen' => 'delete',
+ 'neue_ware' => 'new_part',
+ 'neues_projekt' => 'new_project',
'speichern' => 'save',
};
$self->{texts} = {
'ADDED' => 'Hinzugefügt',
+ 'AP' => 'Einkauf',
+ 'AR' => 'Verkauf',
'Account' => 'Konto',
'Address' => 'Adresse',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenü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 überprüfen Sie die Angaben in config/authentication.pl.',
'CANCELED' => 'Storniert',
'Cc' => 'Cc',
+ 'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Verändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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ü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'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',
'Select all' => 'Alle auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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ängigkeit \'%s\'.',
'Value' => 'Wert',
'Variable' => 'Variable',
'Vendor details' => 'Lieferantendetails',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'invoice' => 'Rechnung',
'no' => 'nein',
'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',
'vendor_selection' => 'vendor_selection',
'weiter' => 'continue',
'fertig' => 'done',
+ 'neue_ware' => 'new_part',
+ 'neues_projekt' => 'new_project',
'alle_auswählen' => 'select_all',
'erneuern' => 'update',
};
$self->{texts} = {
'ADDED' => 'Hinzugefügt',
+ 'AP' => 'Einkauf',
+ 'AR' => 'Verkauf',
+ 'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+ 'All reports' => 'Alle Berichte (Kontenü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 überprü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ändern der Lx-Office-Installationseinstellungen (Menü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äre html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
'Could not write the temporary HTML file.' => 'Eine temporä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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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ü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',
'Purchase Order' => 'Lieferantenauftrag',
'Quotation' => 'Angebot',
'RFQ' => 'Anfrage',
+ 'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+ 'Reports' => 'Berichte',
'SAVED' => 'Gespeichert',
'SAVED FOR DUNNING' => 'Gespeichert',
'SCREENED' => 'Angezeigt',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ängigkeit \'%s\'.',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'invoice' => 'Rechnung',
'packing_list' => 'Versandliste',
'pick_list' => 'Entnahmeliste',
$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übersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
'Amount' => 'Betrag',
'Apr' => 'Apr',
'April' => 'April',
'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 überprü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ändern der Lx-Office-Installationseinstellungen (Menüpunkte unterhalb von \'System\')',
'Compare to' => 'Gegenüberstellen zu',
'Confirmation' => 'Auftragsbestätigung',
'Contact' => 'Kontakt',
'Could not spawn the printer command.' => 'Die Druckanwendung konnte nicht gestartet werden.',
'Could not write the html2ps config file.' => 'Die temporäre html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
'Could not write the temporary HTML file.' => 'Eine temporä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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'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',
'File' => 'Datei',
'Free report period' => 'Freier Zeitraum',
'From' => 'Von',
+ 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr',
'HTML' => 'HTML',
'Heading' => 'Überschrift',
'History' => 'Historie',
'Jun' => 'Jun',
'June' => 'Juni',
'MAILED' => 'Gesendet',
+ 'Manage license keys' => 'Lizenzschlü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',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'Number' => 'Nummer',
'Oct' => 'Okt',
'October' => 'Oktober',
+ 'Others' => 'Andere',
'PAYMENT POSTED' => 'Rechung gebucht',
'PDF' => 'PDF',
'PDF export -- options' => 'PDF-Export -- Optionen',
'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',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswählen',
+ 'Select an project' => 'Ein Projekt auswä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!',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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',
'YYYY' => 'JJJJ',
'Year' => 'Jahr',
'Yearly' => 'jährlich',
+ 'You do not have the permissions to access this function.' => 'Sie verfügen nicht über die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
'[email]' => '[email]',
'ap_aging_list' => 'liste_offene_verbindlichkeiten',
'ar_aging_list' => 'liste_offene_forderungen',
'bin_list' => 'Lagerliste',
'bis' => 'bis',
'button' => '?',
+ 'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schlüsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'for Period' => 'für den Zeitraum',
'invoice' => 'Rechnung',
'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',
'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',
'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',
'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',
'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',
};
'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ü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.',
'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 überprüfen Sie die Angaben in config/authentication.pl.',
'CANCELED' => 'Storniert',
'Cc' => 'Cc',
+ 'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Verändern der Lx-Office-Installationseinstellungen (Menü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äge erfassen und bearbeiten',
+ 'Create and edit sales delivery orders' => 'Lieferscheine für Kunden erfassen und bearbeiten',
+ 'Create and edit sales orders' => 'Auftragsbestä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',
'Dec' => 'Dez',
'December' => 'Dezember',
'Dependency loop detected:' => 'Schleife in den Abhängigkeiten entdeckt:',
- 'Description' => 'Beschreibung',
'Directory' => 'Verzeichnis',
'ELSE' => 'Zusatz',
'ELSTER Export (Taxbird)' => 'ELSTER-Export nach Taxbird',
'Feb' => 'Feb',
'February' => 'Februar',
'File' => 'Datei',
+ 'General ledger and cash' => 'Finanzbuchhaltung und Zahlungsverkehr',
'History' => 'Historie',
'Invoice' => 'Rechnung',
'Jan' => 'Jan',
'Jun' => 'Jun',
'June' => 'Juni',
'MAILED' => 'Gesendet',
+ 'Manage license keys' => 'Lizenzschlü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\'.',
'No customer has been selected.' => 'Es wurde kein Kunde ausgewä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',
'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',
'Select a vendor or customer' => 'Kunden oder Lieferanten auswählen',
'Select an employee' => 'Angestellten auswählen',
'Select an entry' => 'Eintrag auswä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ählen',
'Sep' => 'Sep',
'September' => 'September',
'Storno Invoice' => 'Stornorechnung',
'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 überprü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ü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üsselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte überprü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ä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.',
'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ügen nicht ü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üsselwort "DB_config" fehlt.',
+ 'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schlü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ö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ötigt werden "host", "attribute" und "base_dn".',
'customer' => 'Kunde',
'for Period' => 'für den Zeitraum',
'invoice' => 'Rechnung',
'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',
'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',
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});
+++ /dev/null
-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;
-
+++ /dev/null
-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;
-
[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
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
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
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
[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
[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
# Wird selten eingesetzt und ist Fehlerbehaftet !!!
# Stimmt nicht! Udo Spallek
[Cash--Reconciliation]
+ACCESS=cash
module=rc.pl
action=reconciliation
[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
[System]
+ACCESS=config
[System--Ranges of numbers and default accounts]
module=am.pl
--- /dev/null
+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)
+);
<h2>Administration</h2>
+ [% IF error_message %]
+ <p><span class="error_message">[% error_message %]</span></p>
+ [% END %]
+
<form method="post" action="admin.pl">
<table>
<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>
</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">
<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>
<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>
</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">
+++ /dev/null
-[% 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>
+++ /dev/null
-[% 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>
--- /dev/null
+[% 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ö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ü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ö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>
--- /dev/null
+[% 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>
--- /dev/null
+[% 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 ändern wollen, so drücken Sie auf den "Zurück"-Button, bearbeiten Sie die Datei "config/authentication.pl", 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>
--- /dev/null
+[% 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 "Back" button, edit the file
+ "config/authentication.pl" 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>
<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">
<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">
--- /dev/null
+[% 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üssen mindestens eine Benutzergruppe anlegen, ihr Zugriff auf die verschiedenen Funktionsbereiche von Lx-Office gewä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ür Sie anlegen und allen Benutzern Zugriff auf alle Lx-Office-Funktionen gewähren.
+
+ Dieses entspricht dem Verhalten von Lx-Office vor Version 2.4.4.
+
+ </p>
+
+ <p>
+
+ Alternativ können Sie diesen Schritt überspringen und selber Gruppen anlegen.
+
+ </p>
+
+ <p>
+
+ Wollen Sie, dass Lx-Office eine Gruppe mit Zugriff auf alle Funktionen anlegt?
+
+ Diese Gruppe wird "Vollzugriff" 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>
--- /dev/null
+[% 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 "Full Access".</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>
</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>
</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>
<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>
<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>
<p>Die Datenbank [% HTML.escape(db) %] wurde erfolgreich gelö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>
<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>
<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>
<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>
<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">
<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">
--- /dev/null
+[% 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öschen</div>
+
+ <p>Wollen Sie wirklich diese Gruppe lö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>
--- /dev/null
+[% 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>
--- /dev/null
+[% 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> </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">
+
+ <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">
+
+ <input type="submit" class="submit" name="action" value="Zurück">
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </form>
+
+</body>
+</html>
--- /dev/null
+[% 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> </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>">
+
+ <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>">
+
+ <input type="submit" class="submit" name="action" value="<translate>Back</translate>">
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </form>
+
+</body>
+</html>
--- /dev/null
+[% USE HTML %][% USE LxERP %]<body>
+
+ <div class="listtop">Gruppenmitgliedschaften bearbeiten</div>
+
+ <p>Wählen Sie diejenigen Checkboxen aus, die die Benutzer zu den gewü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>
--- /dev/null
+[% 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>
--- /dev/null
+[% 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ö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ö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>
--- /dev/null
+[% 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>
<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 %]> Oben (mit CSS)
- <input name="menustyle" type="radio" class="radio" value="neu" [% IF menustyle_neu %]checked[% END %]> Oben (mit Javascript)
- <input name="menustyle" type="radio" class="radio" value="old" [% IF menustyle_old %]checked[% END %]> Alt (seitlich)
+ <input name="menustyle" id="menustyle_v3" type="radio" class="radio" value="v3" [% IF menustyle_v3 %]checked[% END %]>
+ <label for="menustyle_v3"> 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"> 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"> 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 %]> Angebot</td>
- <td><input name="bestellungen" class="checkbox" type="checkbox" value="1" [% IF myc_bestellungen %]checked[% END %]> Bestellung</td>
- <td><input name="rechnungen" class="checkbox" type="checkbox" value="1" [% IF myc_rechnung %]checked[% END %]> Rechnung</td>
+ <td>
+ <input name="angebote" id="angebote"class="checkbox" type="checkbox" value="1" [% IF myc_angebote %]checked[% END %]>
+ <label for="angebote"> Angebot</label>
+ </td>
+ <td>
+ <input name="bestellungen" id="bestellungen" class="checkbox" type="checkbox" value="1" [% IF myc_bestellungen %]checked[% END %]>
+ <label for="bestellungen"> Bestellung</label>
+ </td>
+ <td>
+ <input name="rechnungen" id="rechnungen" class="checkbox" type="checkbox" value="1" [% IF myc_rechnung %]checked[% END %]>
+ <label for="rechnungen"> Rechnung</label>
+ </td>
</tr>
<tr>
- <td><input name="anfragen" class="checkbox" type="checkbox" value="1" [% IF myc_anfragen %]checked[% END %]> Anfragen</td>
- <td><input name="lieferantenbestellungen" class="checkbox" type="checkbox" value="1" [% IF myc_lieferantenbestellungen %]checked[% END %]> Lieferantenbestellung</td>
- <td><input name="einkaufsrechnungen" class="checkbox" type="checkbox" value="1" [% IF myc_einkaufsrechnungen %]checked[% END %]> Einkaufsrechnung</td>
+ <td>
+ <input name="anfragen" id="anfragen" class="checkbox" type="checkbox" value="1" [% IF myc_anfragen %]checked[% END %]>
+ <label for="anfragen"> Anfragen</label>
+ </td>
+ <td>
+ <input name="lieferantenbestellungen" id="lieferantenbestellungen" class="checkbox" type="checkbox" value="1" [% IF myc_lieferantenbestellungen %]checked[% END %]>
+ <label for="lieferantenbestellungen"> Lieferantenbestellung</label>
+ </td>
+ <td>
+ <input name="einkaufsrechnungen" id="einkaufsrechnungen" class="checkbox" type="checkbox" value="1" [% IF myc_einkaufsrechnungen %]checked[% END %]>
+ <label for="einkaufsrechnungen"> 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ö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">
<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 %]> <translate>Top (CSS)</translate>
- <input name="menustyle" type="radio" class="radio" value="neu" [% IF menustyle_neu %]checked[% END %]> <translate>Top (Javascript)</translate>
- <input name="menustyle" type="radio" class="radio" value="old" [% IF menustyle_old %]checked[% END %]> <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"> <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"> <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"> <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 %]> Angebot</td>
- <td><input name="bestellungen" class="checkbox" type="checkbox" value="1" [% IF myc_bestellungen %]checked[% END %]> Bestellung</td>
- <td><input name="rechnungen" class="checkbox" type="checkbox" value="1" [% IF myc_rechnung %]checked[% END %]> Rechnung</td>
+ <td>
+ <input name="angebote" id="angebote"class="checkbox" type="checkbox" value="1" [% IF myc_angebote %]checked[% END %]>
+ <label for="angebote"> Angebot</label>
+ </td>
+ <td>
+ <input name="bestellungen" id="bestellungen" class="checkbox" type="checkbox" value="1" [% IF myc_bestellungen %]checked[% END %]>
+ <label for="bestellungen"> Bestellung</label>
+ </td>
+ <td>
+ <input name="rechnungen" id="rechnungen" class="checkbox" type="checkbox" value="1" [% IF myc_rechnung %]checked[% END %]>
+ <label for="rechnungen"> Rechnung</label>
+ </td>
</tr>
<tr>
- <td><input name="anfragen" class="checkbox" type="checkbox" value="1" [% IF myc_anfragen %]checked[% END %]> Anfragen</td>
- <td><input name="lieferantenbestellungen" class="checkbox" type="checkbox" value="1" [% IF myc_lieferantenbestellungen %]checked[% END %]> Lieferantenbestellung</td>
- <td><input name="einkaufsrechnungen" class="checkbox" type="checkbox" value="1" [% IF myc_einkaufsrechnungen %]checked[% END %]> Einkaufsrechnung</td>
+ <td>
+ <input name="anfragen" id="anfragen" class="checkbox" type="checkbox" value="1" [% IF myc_anfragen %]checked[% END %]>
+ <label for="anfragen"> Anfragen</label>
+ </td>
+ <td>
+ <input name="lieferantenbestellungen" id="lieferantenbestellungen" class="checkbox" type="checkbox" value="1" [% IF myc_lieferantenbestellungen %]checked[% END %]>
+ <label for="lieferantenbestellungen"> Lieferantenbestellung</label>
+ </td>
+ <td>
+ <input name="einkaufsrechnungen" id="einkaufsrechnungen" class="checkbox" type="checkbox" value="1" [% IF myc_einkaufsrechnungen %]checked[% END %]>
+ <label for="einkaufsrechnungen"> 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>">
[% 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>
[% 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>
</tr>
</table>
- <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
<input type="hidden" name="nextsub" value="restore_dataset_start">
<hr size="3" noshade>
</tr>
</table>
- <input type="hidden" name="rpw" value="[% HTML.escape(rpw) %]">
<input type="hidden" name="nextsub" value="restore_dataset_start">
<hr size="3" noshade>
<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>
<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>
[% 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>
[% 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>
[% 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>
[% 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>
--- /dev/null
+[% USE HTML %]<body>
+
+ <div class="listtop">[% title %]</div>
+
+ <form method="post" action="admin.pl">
+
+ [%- IF standard_group_created %]
+ <p>Eine Gruppe namens "Vollzugriff" 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>
--- /dev/null
+[% USE HTML %]<body>
+
+ <div class="listtop">[% title %]</div>
+
+ <form method="post" action="admin.pl">
+
+ [%- IF standard_group_created %]
+ <p><translate>A group named "Full Access" 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>
--- /dev/null
+[% 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 ("[% HTML.escape(memberfile) %]"). 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önnen.
+ </p>
+
+ <p>
+ Falls Sie sich entscheiden, Lx-Office die Migration durchführen zu lassen, so wird Lx-Office ein Backup der alten Dateien im Verzeichnis "[% HTML.escape(backupdir) %]" erstellen und die Dateien anschließend lö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>
--- /dev/null
+[% 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>
--- /dev/null
+[% 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>
--- /dev/null
+[% 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 ("[% HTML.escape(memberfile) %]"). 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
+ "[% HTML.escape(backupdir) %]".</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>
<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>
<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>
<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ü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>
<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>
</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">
</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">
<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>
+ <a href="am.pl?action=edit_account&id=[% HTML.url(row.id) %]&callback=[% HTML.url(callback) %]">[% HTML.escape(row.accno) %]</a>
[% 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">
<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>
+ <a href="am.pl?action=edit_account&id=[% HTML.url(row.id) %]&callback=[% HTML.url(callback) %]">[% HTML.escape(row.accno) %]</a>
[% 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>">
<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) %]">
<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) %]">
<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">
<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>">
[% 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>
<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>
[% 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>
<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>
<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">
<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>">
<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">
<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>">
<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>
<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>
-[% 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) {
-[% 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) {
<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 %]>
<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 %]>
<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">
<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>">
<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>
<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>
<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">
<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">
<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="">
<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="">
<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="">
<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="">
<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="">
<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="">
<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>
<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>
<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="">
<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="">
<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="">
<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="">
<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="">
<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="">
<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="">
<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="">
[% 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>
[% 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>
<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%">
<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 %]
<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%">
<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 %]
<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%">
<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%">
<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">
<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>">
<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>
<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>
<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">
<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>">
<form method="post" action="dn.pl">
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
<form method="post" action="dn.pl">
- <input type="hidden" name="login" value="[% HTML.escape(login) %]">
- <input type="hidden" name="password" value="[% HTML.escape(password) %]">
-
<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"
<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>"
--- /dev/null
+[% 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önnen jedoch einen neuen Artikel anlegen, der dann automatisch ausgewählt wird.
+ [% END %]
+ [% ELSE %]
+ Bitte wählen Sie einen Artikel aus der Liste aus.
+ [% IF allow_creation %]
+ Sie können auch einen neuen Artikel anlegen, der dann automatisch ausgewählt wird.
+ [% END %]
+ [% END %]
+ </td>
+ </tr>
+
+ [% UNLESS no_parts_found %]
+ <tr>
+ <td>
+ <table>
+ <tr class="listheading">
+ <th class="listheading"> </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>
--- /dev/null
+[% 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"> </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>
--- /dev/null
+[% 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önnen jedoch ein neues Projekt anlegen, das dann automatisch ausgewählt wird.
+ [%- END %]
+ [%- ELSE %]
+ Bitte wählen Sie ein Projekt aus der Liste aus.
+ [%- IF AUTH_RIGHTS_PROJECT_EDIT %]
+ Alternativ können Sie auch ein neues Projekt anlegen, das dann automatisch ausgewählt wird.
+ [%- END %]
+ [%- END %]
+ </td>
+ </tr>
+
+ [% UNLESS no_projects_found %]
+ <tr>
+ <td>
+
+ <table>
+ <tr class="listheading">
+ <th class="listheading"> </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>
--- /dev/null
+[% 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"> </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>
--- /dev/null
+[% 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ählen</div>
+
+ <p>
+ <table>
+ <tr>
+ <th class="listheading"> </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>
--- /dev/null
+[% 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"> </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>
--- /dev/null
+[% 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ählen</div>
+
+ <p>
+ <table>
+ <tr>
+ <td>
+ <table>
+ <tr>
+ <th class="listheading"> </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>
--- /dev/null
+[% 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"> </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>
<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">
<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>">
<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
<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>
<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">
<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">
<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>
<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>
--- /dev/null
+<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äche an. Lx-Office wird dann die Datenbank und die Tabellen für Sie anlegen.</p>
+
+ <p>
+ <a href="login.pl" target="_top">Anmeldung</a> |
+ <a href="admin.pl" target="_top">Administration</a>
+ </p>
+
+</body>
+</html>
--- /dev/null
+<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>
--- /dev/null
+<body>
+
+ <p><b>Fehler!</b></p>
+
+ <p>Die Konfigurationsdatei für die Authentifizierung "config/authentication.pl" wurde nicht gefunden. Diese Lx-Office-Installation wurde vermutlich noch nicht vollständig aktualisiert oder eingerichtet. Bitte wenden Sie sich an Ihren Administrator.</p>
+
+ <p>Wenn Sie selber die Aktualisierung bzw. Einrichtung übernehmen wollen, so lesen Sie bitte die Datei "doc/UPGRADE" 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>
--- /dev/null
+<body>
+
+ <p><b><translate>Error!</translate></b></p>
+
+ <p><translate>The authentication configuration file
+ "config/authentication.pl" 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 "doc/UPGRADE" 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>
<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>
<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>
<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">
<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">
--- /dev/null
+<body>
+
+ <p><b>Fehler!</b></p>
+
+ <p>Ungültiges Passwort!</p>
+
+ <p><a href="login.pl" target="_top">Anmeldung</a></p>
+
+</body>
+</html>
--- /dev/null
+<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>
<tr>
<td style="color:white; font-family:verdana,arial,sans-serif; font-size: 12px;">
- [<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>]
[<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>
</td>
</tr>
<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ählen Sie ein anderes Menü in der Benutzerkonfiguration im Administrationsmenü aus.</p>
</iframe>
</body>
<tr>
<td style="color:white; font-family:verdana,arial,sans-serif; font-size: 12px;">
- [<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>]
[<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>
</td>
</tr>
<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>
<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>
<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>
<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>
<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>
</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>
</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>
[% 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 %]
[% 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 %]
<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">
<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>">
<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">
<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">