Merge branch 'master' into after-262
authorMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 1 Feb 2011 13:41:27 +0000 (14:41 +0100)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 1 Feb 2011 13:41:27 +0000 (14:41 +0100)
Conflicts:
DEBIAN/DEBIAN/postinst
DEBIAN/mk_erp_deb.sh
config/lx-erp.conf
config/lx-erp.conf.default
doc/INSTALL.txt
locale/de_DE/all

15 files changed:
1  2 
DEBIAN/DEBIAN/postinst
DEBIAN/mk_erp_deb.sh
SL/DB/Object.pm
SL/Dispatcher.pm
SL/Form.pm
SL/IS.pm
SL/Template/LaTeX.pm
bin/mozilla/do.pl
bin/mozilla/wh.pl
doc/INSTALL.texi
doc/INSTALL.txt
doc/INSTALL/Datenbanken-anlegen.html
doc/INSTALL/OpenDocument_002dVorlagen.html
locale/de/all
locale/de_DE/all

diff --combined DEBIAN/DEBIAN/postinst
@@@ -81,17 -81,12 +81,12 @@@ set_lx_office_erp_web_admin_password() 
        db_get lx-office-erp/admin-password
        ADMINPASSWORD="$RET"
  
-       #cat /usr/lib/lx-office-erp/config/authentication.pl.default | \
        cat /etc/lx-office-erp/authentication.pl.default | \
        sed --expression "s/\$self->{admin_password} = 'admin';/\$self->{admin_password} = '$ADMINPASSWORD';/g" \
        > /tmp/1.txt
  
-       #mv /tmp/1.txt /usr/lib/lx-office-erp/config/authentication.pl
        mv /tmp/1.txt /etc/lx-office-erp/authentication.pl
  
-       #chmod 0600 /usr/lib/lx-office-erp/config/authentication.pl
-       #chown www-data:www-data /usr/lib/lx-office-erp/config/authentication.pl
  }
  
  
@@@ -99,12 -94,10 +94,10 @@@ set_lx_office_erp_authentication_db_pas
        db_get lx-office-erp/lx-office-erp-user-postgresql-password
        PASSWORD="$RET"
  
-       #cat /usr/lib/lx-office-erp/config/authentication.pl | \
        cat /etc/lx-office-erp/authentication.pl | \
        sed --expression "s/'password' => '',/'password' => '$PASSWORD',/g" \
        > /tmp/1.txt
  
-       #mv /tmp/1.txt /usr/lib/lx-office-erp/config/authentication.pl
        mv /tmp/1.txt /etc/lx-office-erp/authentication.pl
  
  }
  set_lx_office_erp_authentication_db_user() {
        USER="lxoffice"
  
-       #cat /usr/lib/lx-office-erp/config/authentication.pl | \
        cat /etc/lx-office-erp/authentication.pl | \
        sed --expression "s/'user'     => 'postgres',/'user'     => '$USER',/g" \
        > /tmp/1.txt
  
-       #mv /tmp/1.txt /usr/lib/lx-office-erp/config/authentication.pl
        mv /tmp/1.txt /etc/lx-office-erp/authentication.pl
  }
  
  set_user_rights() {
        chown -R www-data:www-data /usr/lib/lx-office-erp/users
        chown -R www-data:www-data /usr/lib/lx-office-erp/templates
-     chown www-data:www-data /etc/lx-office-erp/lx_office.conf
-     chown www-data:www-data /usr/lib/lx-office-erp/menu.ini
-     chown www-data:www-data /etc/lx-office-erp/authentication.pl
-     chmod 0600 /etc/lx-office-erp/lx_office.conf
-     chmod 0600 /etc/lx-office-erp/authentication.pl
 -      chown www-data:www-data /etc/lx-office-erp/lx-erp.conf
++      chown www-data:www-data /etc/lx-office-erp/lx_office.conf
+       chown www-data:www-data /usr/lib/lx-office-erp/menu.ini
+       chown www-data:www-data /etc/lx-office-erp/authentication.pl
 -      chmod 0600 /etc/lx-office-erp/lx-erp.conf
++      chmod 0600 /etc/lx-office-erp/lx_office.conf
+       chmod 0600 /etc/lx-office-erp/authentication.pl
  }
  
  disable_ipv6_on_lo_interface() {
  
  }
  mk_new_menu() {
 -    if [ -e /usr/lib/lx-office-crm ] ; then 
 +    if [ -e /usr/lib/lx-office-crm ] ; then
          #crm vorhanden, dann die menu.ini mit der höchsten VersNr nehmen
 -        for i in `ls -1 /usr/lib/lx-office-crm/update/menu*ini` ; do 
 +        for i in `ls -1 /usr/lib/lx-office-crm/update/menu*ini` ; do
              cat $i > /usr/lib/lx-office-erp/menu.ini
          done;
          cat /usr/lib/lx-office-erp/menu.default >> /usr/lib/lx-office-erp/menu.ini
      else
          cp /usr/lib/lx-office-erp/menu.default /usr/lib/lx-office-erp/menu.ini
      fi
 -}  
 +}
  
  mk_new_config() {
 -    if ! [ -f /etc/lx-office-erp/lx-erp.conf ] ; then
 -        cp /etc/lx-office-erp/lx-erp.conf.default /etc/lx-office-erp/lx-erp.conf
 -    fi
 -    if ! [ -f /etc/lx-office-erp/console.conf ] ; then
 -        cp /etc/lx-office-erp/console.conf.default /etc/lx-office-erp/console.conf
 +    if ! [ -f /etc/lx-office-erp/lx_office.conf ] ; then
 +        cp /etc/lx-office-erp/lx_office.conf.default /etc/lx-office-erp/lx_office.conf
      fi
 -}  
 +}
  
  mk_links() {
      if ! [ -f /usr/lib/lx-office-erp/config/authentication.pl ] ; then
          ln -s /etc/lx-office-erp/authentication.pl /usr/lib/lx-office-erp/config/authentication.pl
      fi;
 -    if ! [ -f /usr/lib/lx-office-erp/config/lx-erp.conf ] ; then
 -        ln -s /etc/lx-office-erp/lx-erp.conf /usr/lib/lx-office-erp/config/lx-erp.conf
 +    if ! [ -f /usr/lib/lx-office-erp/config/lx_office.conf ] ; then
 +        ln -s /etc/lx-office-erp/lx_office.conf /usr/lib/lx-office-erp/config/lx_office.conf
      fi;
 -    if ! [ -f /usr/lib/lx-office-erp/config/console.conf ] ; then
 -        ln -s /etc/lx-office-erp/console.conf /usr/lib/lx-office-erp/config/console.conf
 -    fi;
 -    if [ -e /etc/apache2 ] ; then 
 +    if [ -e /etc/apache2 ] ; then
          if ! [ -f /etc/apache2/conf.d/lx-office-erp.apache2.conf ] ; then
              ln -s /etc/lx-office-erp/lx-office-erp.apache2.conf /etc/apache2/conf.d/lx-office-erp.apache2.conf
          fi;
      fi;
 -    if [ -e /etc/cherokee/sites-available ] ; then 
 +    if [ -e /etc/cherokee/sites-available ] ; then
          if ! [ -f /etc/cherokee/sites-available/lx-office-erp.cherokee ] ; then
              cat /etc/lx-office-erp/lx-office-erp.cherokee.handler >> /etc/cherokee/sites-available/default
              ln -s /etc/lx-office-erp/lx-office-erp.cherokee /etc/cherokee/sites-available/lx-office-erp.cherokee
      fi;
  }
  reload_web_server() {
 -    if [ -f /etc/init.d/apache* ] ; then 
 +    if [ -f /etc/init.d/apache* ] ; then
              /etc/init.d/apache* reload
      fi
 -    if [ -f /etc/init.d/cherokee ] ; then 
 +    if [ -f /etc/init.d/cherokee ] ; then
              /etc/init.d/cherokee reload
      fi
  }
@@@ -215,7 -212,7 +206,7 @@@ case "$1" i
  
      install|configure)
          echo " ! "`date`" $1 !" >> /tmp/lxo-erp.log
 -        
 +
          mk_new_menu
          mk_new_config
          config_postgresql_factory_script
diff --combined DEBIAN/mk_erp_deb.sh
@@@ -4,10 -4,10 +4,10 @@@
  NR="0"
  
  #hier wurde das Git-Paket entpakt:
- SRC=/tmp/deb_test/unstable
+ SRC=/tmp/lx-office-erp
  
  #hier wird das Debian-Paket gebaut:
- DST=/tmp/deb_test/package
+ DST=/tmp/package
  
  
  ################################################
  VER=`cat VERSION`
  DEST=$DST/lx-office-erp_$VER-$NR-all
  
- FILES='
- usr/lib/lx-office-erp/
- usr/share/lx-office-erp/
- usr/share/doc/lx-office-erp/
- var/lib/lx-office-erp/spool/
- var/lib/lx-office-erp/users/
- var/lib/lx-office-erp/css/
- var/lib/lx-office-erp/xslt/
- var/lib/lx-office-erp/templates/
- var/lib/lx-office-erp/webdav/lieferantenbestellungen/
- var/lib/lx-office-erp/webdav/anfragen/
- var/lib/lx-office-erp/webdav/gutschriften/
- var/lib/lx-office-erp/webdav/einkaufsrechnungen/
- var/lib/lx-office-erp/webdav/rechnungen/
- var/lib/lx-office-erp/webdav/bestellungen/
- var/lib/lx-office-erp/webdav/angebote/
- usr/lib/lx-office-erp/
- usr/share/lx-office-erp/
- usr/share/doc/lx-office-erp/
- usr/share/man/man1/:lx-office-erp.1.gz
- etc/lx-office-erp/:lx-office-erp.cherokee.handler
- etc/lx-office-erp/:lx-office-erp.apache2.conf
- etc/lx-office-erp/:lx-office-erp.cherokee
- usr/bin/:lx-office-erp
- '
- for filespec in $FILES; do
-   set - `echo $filespec | sed -e 's/:/ /g'`
-   dir=$1
-   file=$2
-   mkdir -p $SRC/DEBIAN/$dir
-   if [ -f $SRC/DEBIAN/files/$file ]; then
-     cp  $SRC/DEBIAN/files/$file $SRC/DEBIAN/$dir/$file
-   else
-     echo '1' > $SRC/DEBIAN/$dir/.dummy
-   fi
- done
- SYMLINKS='
- css:/var/lib/lx-office-erp/css
- doc:/usr/share/doc/lx-office-erp/
- image:/usr/share/lx-office-erp
- spool:/var/lib/lx-office-erp/spool
- templates:/var/lib/lx-office-erp/templates
- users:/var/lib/lx-office-erp/users/
- webdav:/var/lib/lx-office-erp/webdav
- xslt:/var/lib/lx-office-erp/xslt
- '
- for symspec in $SYMLINKS; do
-   set - `echo $symspec | sed -e 's/:/ /g'`
-   src=$1
-   tar=$2
-   ln -s $tar $SRC/DEBIAN/usr/lib/lx-office-erp/$src
- done
- #fertig
  
  mkdir -p $DEST
  cd $DEST
  
  #Struktur anlegen:
- cp -a $SRC/DEBIAN/* .
- rm ./mk*.sh
+ cp -a $SRC/DEBIAN/DEBIAN .
+ tar xzf $SRC/DEBIAN/struktur.tgz
  
  #Dateien kopieren:
  #aber keine fertigen Konfigurationen, nur *.default
@@@ -96,7 -39,8 +39,7 @@@ cp -a $SRC/t usr/lib/lx-office-er
  cp -a $SRC/*.pl usr/lib/lx-office-erp
  cp $SRC/VERSION usr/lib/lx-office-erp
  cp $SRC/index.html usr/lib/lx-office-erp
 -cp $SRC/config/lx-erp.conf  etc/lx-office-erp/lx-erp.conf.default
 -cp $SRC/config/console.conf.default etc/lx-office-erp/
 +cp $SRC/config/lx_office.conf.default etc/lx-office-erp/lx_office.conf.default
  cp $SRC/config/authentication.pl.default etc/lx-office-erp/
  cp $SRC/menu.ini usr/lib/lx-office-erp/menu.default
  cp -a $SRC/css var/lib/lx-office-erp
diff --combined SL/DB/Object.pm
@@@ -2,7 -2,6 +2,6 @@@ package SL::DB::Object
  
  use strict;
  
- use Readonly;
  use Rose::DB::Object;
  use List::MoreUtils qw(any);
  
@@@ -41,7 -40,7 +40,7 @@@ sub _get_manager_class 
    return $class->meta->convention_manager->auto_manager_class_name($class);
  }
  
Readonly my %text_column_types => (text => 1, char => 1, varchar => 1);
my %text_column_types = (text => 1, char => 1, varchar => 1);
  
  sub assign_attributes {
    my $self       = shift;
@@@ -79,12 -78,6 +78,12 @@@ sub update_attributes 
    return $self;
  }
  
 +sub call_sub {
 +  my $self = shift;
 +  my $sub  = shift;
 +  return $self->$sub(@_);
 +}
 +
  1;
  
  __END__
@@@ -138,14 -131,6 +137,14 @@@ Returns the manager package for the obj
  on. Can be used from methods in this package for getting the actual
  object's manager.
  
 +=item C<call_sub $name, @args>
 +
 +Calls the sub C<$name> on C<$self> with the arguments C<@args> and
 +returns its result. This is meant for situations in which the sub's
 +name is a composite, e.g.
 +
 +  my $chart_id = $buchungsgruppe->call_sub(($is_sales ? "income" : "expense") . "_accno_id_${taxzone_id}");
 +
  =back
  
  =head1 AUTHOR
diff --combined SL/Dispatcher.pm
@@@ -5,21 -5,17 +5,20 @@@ use strict
  BEGIN {
    unshift @INC, "modules/override"; # Use our own versions of various modules (e.g. YAML).
    push    @INC, "modules/fallback"; # Only use our own versions of modules if there's no system version.
-   push    @INC, "SL";               # FCGI won't find modules that are not properly named. Help it by inclduging SL
  }
  
  use CGI qw( -no_xhtml);
 +use Config::Std;
  use DateTime;
 +use Encode;
  use English qw(-no_match_vars);
  use SL::Auth;
  use SL::LXDebug;
 +use SL::LxOfficeConf;
  use SL::Locale;
  use SL::Common;
+ use SL::Form;
  use SL::Helper::DateTime;
- use Form;
  use List::Util qw(first);
  use File::Basename;
  
@@@ -53,10 -49,10 +52,10 @@@ sub show_error 
    my $template             = shift;
    my $error_type           = shift || '';
  
 -  $::locale                = Locale->new($::language);
 +  $::locale                = Locale->new($::lx_office_conf{system}->{language});
    $::form->{error}         = $::locale->text('The session is invalid or has expired.') if ($error_type eq 'session');
    $::form->{error}         = $::locale->text('Incorrect password!.')                   if ($error_type eq 'password');
 -  $::myconfig{countrycode} = $::language;
 +  $::myconfig{countrycode} = $::lx_office_conf{system}->{language};
    $::form->{stylesheet}    = 'css/lx-office-erp.css';
  
    $::form->header;
  }
  
  sub pre_startup_setup {
 -  eval {
 -    package main;
 -    require "config/lx-erp.conf";
 -  };
 -  eval {
 -    package main;
 -    require "config/lx-erp-local.conf";
 -  } if -f "config/lx-erp-local.conf";
 +  SL::LxOfficeConf->read;
 +  _init_environment();
  
    eval {
      package main;
    # canonial globals. if it's not here, chances are it will get refactored someday.
    {
      no warnings 'once';
 -    $::userspath   = "users";
 -    $::templates   = "templates";
 -    $::memberfile  = "users/members";
 -    $::menufile    = "menu.ini";
 -    $::sendmail    = "| /usr/sbin/sendmail -t";
      $::lxdebug     = LXDebug->new;
      $::auth        = SL::Auth->new;
      $::form        = undef;
@@@ -154,7 -161,7 +153,7 @@@ sub handle_request 
    $self->unrequire_bin_mozilla;
  
    $::cgi         = CGI->new('');
 -  $::locale      = Locale->new($::language);
 +  $::locale      = Locale->new($::lx_office_conf{system}->{language});
    $::form        = Form->new;
    %::called_subs = ();
  
      my $session_result = $::auth->restore_session;
      $::auth->create_or_refresh_session;
  
 -    $::form->error($::locale->text('System currently down for maintenance!')) if -e "$::userspath/nologin" && $script ne 'admin';
 +    $::form->error($::locale->text('System currently down for maintenance!')) if -e ($::lx_office_conf{paths}->{userspath} . "/nologin") && $script ne 'admin';
  
      if ($script eq 'login' or $script eq 'admin' or $script eq 'kopf') {
        $::form->{titlebar} = "Lx-Office " . $::locale->text('Version') . " $::form->{version}";
    $::locale   = undef;
    $::form     = undef;
    $::myconfig = ();
 -  Form::disconnect_standard_dbh();
 +  Form::disconnect_standard_dbh unless $self->_interface_is_fcgi;
  
    $::lxdebug->end_request;
    $::lxdebug->leave_sub;
  
  sub unrequire_bin_mozilla {
    my $self = shift;
 -  return unless $self->{interface} =~ m/^(?:fastcgi|fcgid|fcgi)$/;
 +  return unless $self->_interface_is_fcgi;
  
    for (keys %INC) {
      next unless m#^bin/mozilla/#;
    }
  }
  
 +sub _interface_is_fcgi {
 +  my $self = shift;
 +  return $self->{interface} =~ m/^(?:fastcgi|fcgid|fcgi)$/;
 +}
 +
  sub _route_request {
    my $script_name = shift;
  
@@@ -312,27 -314,6 +311,27 @@@ sub get_standard_filehandles 
    return $self->{interface} =~ m/f(?:ast)cgi/i ? $self->{request}->GetHandles() : (\*STDIN, \*STDOUT, \*STDERR);
  }
  
 +sub _init_environment {
 +  my %key_map = ( lib  => { name => 'PERL5LIB', append_path => 1 },
 +                  path => { name => 'PATH',     append_path => 1 },
 +                );
 +  my $cfg     = $::lx_office_conf{environment} || {};
 +
 +  while (my ($key, $value) = each %{ $cfg }) {
 +    next unless $value;
 +
 +    my $info = $key_map{$key} || {};
 +    $key     = $info->{name}  || $key;
 +
 +    if ($info->{append_path}) {
 +      $value = ':' . $value unless $value =~ m/^:/ || !$ENV{$key};
 +      $value = $ENV{$key} . $value;
 +    }
 +
 +    $ENV{$key} = $value;
 +  }
 +}
 +
  package main;
  
  use strict;
diff --combined SL/Form.pm
@@@ -43,28 -43,21 +43,28 @@@ use CGI
  use CGI::Ajax;
  use Cwd;
  use Encode;
 +use File::Copy;
  use IO::File;
  use SL::Auth;
  use SL::Auth::DB;
  use SL::Auth::LDAP;
  use SL::AM;
  use SL::Common;
 +use SL::CVar;
 +use SL::DB;
  use SL::DBUtils;
 +use SL::DO;
 +use SL::IC;
 +use SL::IS;
  use SL::Mailer;
  use SL::Menu;
 +use SL::OE;
  use SL::Template;
  use SL::User;
  use Template;
  use URI;
  use List::Util qw(first max min sum);
 -use List::MoreUtils qw(any apply);
 +use List::MoreUtils qw(all any apply);
  
  use strict;
  
@@@ -262,7 -255,7 +262,7 @@@ sub new 
      $self->_request_to_hash($content);
    }
  
 -  my $db_charset   = $main::dbcharset;
 +  my $db_charset   = $::lx_office_conf{system}->{dbcharset};
    $db_charset    ||= Common::DEFAULT_CHARSET;
  
    my $encoding     = $self->{INPUT_ENCODING} || $db_charset;
@@@ -448,23 -441,13 +448,23 @@@ sub hide_form 
    $main::lxdebug->leave_sub();
  }
  
 +sub throw_on_error {
 +  my ($self, $code) = @_;
 +  local $self->{__ERROR_HANDLER} = sub { die({ error => $_[0] }) };
 +  $code->();
 +}
 +
  sub error {
    $main::lxdebug->enter_sub();
  
    $main::lxdebug->show_backtrace();
  
    my ($self, $msg) = @_;
 -  if ($ENV{HTTP_USER_AGENT}) {
 +
 +  if ($self->{__ERROR_HANDLER}) {
 +    $self->{__ERROR_HANDLER}->($msg);
 +
 +  } elsif ($ENV{HTTP_USER_AGENT}) {
      $msg =~ s/\n/<br>/g;
      $self->show_generic_error($msg);
  
@@@ -636,7 -619,7 +636,7 @@@ sub header 
    # extra code is currently only used by menuv3 and menuv4 to set their css.
    # it is strongly deprecated, and will be changed in a future version.
    my ($self, $extra_code) = @_;
 -  my $db_charset = $::dbcharset || Common::DEFAULT_CHARSET;
 +  my $db_charset = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
    my @header;
  
    $::lxdebug->leave_sub and return if !$ENV{HTTP_USER_AGENT} || $self->{header}++;
@@@ -720,7 -703,7 +720,7 @@@ sub ajax_response_header 
  
    my ($self) = @_;
  
 -  my $db_charset = $main::dbcharset ? $main::dbcharset : Common::DEFAULT_CHARSET;
 +  my $db_charset = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
    my $cgi        = $main::cgi || CGI->new('');
    my $output     = $cgi->header('-charset' => $db_charset);
  
@@@ -761,7 -744,7 +761,7 @@@ sub _prepare_html_template 
    my $language;
  
    if (!%::myconfig || !$::myconfig{"countrycode"}) {
 -    $language = $main::language;
 +    $language = $::lx_office_conf{system}->{language};
    } else {
      $language = $main::myconfig{"countrycode"};
    }
      map { $additional_params->{"myconfig_${_}"} = $main::myconfig{$_}; } keys %::myconfig;
    }
  
 -  $additional_params->{"conf_dbcharset"}              = $::dbcharset;
 -  $additional_params->{"conf_webdav"}                 = $::webdav;
 -  $additional_params->{"conf_lizenzen"}               = $::lizenzen;
 -  $additional_params->{"conf_latex_templates"}        = $::latex;
 -  $additional_params->{"conf_opendocument_templates"} = $::opendocument_templates;
 -  $additional_params->{"conf_vertreter"}              = $::vertreter;
 -  $additional_params->{"conf_show_best_before"}       = $::show_best_before;
 -  $additional_params->{"conf_parts_image_css"}        = $::parts_image_css;
 -  $additional_params->{"conf_parts_listing_images"}   = $::parts_listing_images;
 -  $additional_params->{"conf_parts_show_image"}       = $::parts_show_image;
 +  $additional_params->{"conf_dbcharset"}              = $::lx_office_conf{system}->{dbcharset};
 +  $additional_params->{"conf_webdav"}                 = $::lx_office_conf{system}->{webdav};
 +  $additional_params->{"conf_lizenzen"}               = $::lx_office_conf{system}->{lizenzen};
 +  $additional_params->{"conf_latex_templates"}        = $::lx_office_conf{print_templates}->{latex};
 +  $additional_params->{"conf_opendocument_templates"} = $::lx_office_conf{print_templates}->{opendocument};
 +  $additional_params->{"conf_vertreter"}              = $::lx_office_conf{system}->{vertreter};
 +  $additional_params->{"conf_show_best_before"}       = $::lx_office_conf{system}->{show_best_before};
 +  $additional_params->{"conf_parts_image_css"}        = $::lx_office_conf{features}->{parts_image_css};
 +  $additional_params->{"conf_parts_listing_images"}   = $::lx_office_conf{features}->{parts_listing_images};
 +  $additional_params->{"conf_parts_show_image"}       = $::lx_office_conf{features}->{parts_show_image};
  
    if (%main::debug_options) {
      map { $additional_params->{'DEBUG_' . uc($_)} = $main::debug_options{$_} } keys %main::debug_options;
@@@ -861,7 -844,7 +861,7 @@@ sub init_template 
       'PLUGIN_BASE'  => 'SL::Template::Plugin',
       'INCLUDE_PATH' => '.:templates/webpages',
       'COMPILE_EXT'  => '.tcc',
 -     'COMPILE_DIR'  => $::userspath . '/templates-cache',
 +     'COMPILE_DIR'  => $::lx_office_conf{paths}->{userspath} . '/templates-cache',
    })) || die;
  }
  
@@@ -876,12 -859,6 +876,12 @@@ sub show_generic_error 
  
    my ($self, $error, %params) = @_;
  
 +  if ($self->{__ERROR_HANDLER}) {
 +    $self->{__ERROR_HANDLER}->($error);
 +    $main::lxdebug->leave_sub();
 +    return;
 +  }
 +
    my $add_params = {
      'title_error' => $params{title},
      'label_error' => $error,
@@@ -1191,13 -1168,11 +1191,13 @@@ sub round_amount 
  sub parse_template {
    $main::lxdebug->enter_sub();
  
 -  my ($self, $myconfig, $userspath) = @_;
 +  my ($self, $myconfig) = @_;
    my $out;
  
    local (*IN, *OUT);
  
 +  my $userspath = $::lx_office_conf{paths}->{userspath};
 +
    $self->{"cwd"} = getcwd();
    $self->{"tmpdir"} = $self->{cwd} . "/${userspath}";
  
    }
  
    map { $self->{"${_}"} = $myconfig->{$_}; } qw(co_ustid);
 +  map { $self->{"myconfig_${_}"} = $myconfig->{$_} } grep { $_ ne 'dbpasswd' } keys %{ $myconfig };
  
    $self->{copies} = 1 if (($self->{copies} *= 1) <= 0);
  
      $self->error("$self->{IN} : " . $template->get_error());
    }
  
 +  if ($self->{media} eq 'file') {
 +    copy(join('/', $self->{cwd}, $userspath, $self->{tmpfile}), $out =~ m|^/| ? $out : join('/', $self->{cwd}, $out)) if $template->uses_temp_file;
 +    $self->cleanup;
 +    chdir("$self->{cwd}");
 +
 +    $::lxdebug->leave_sub();
 +
 +    return;
 +  }
 +
    if ($template->uses_temp_file() || $self->{media} eq 'email') {
  
      if ($self->{media} eq 'email') {
  
        map { $mail->{$_} = $self->{$_} }
          qw(cc bcc subject message version format);
 -      $mail->{charset} = $main::dbcharset ? $main::dbcharset : Common::DEFAULT_CHARSET;
 +      $mail->{charset} = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
        $mail->{to} = $self->{EMAIL_RECIPIENT} ? $self->{EMAIL_RECIPIENT} : $self->{email};
        $mail->{from}   = qq|"$myconfig->{name}" <$myconfig->{email}>|;
        $mail->{fileid} = "$fileid.";
        my $numbytes = (-s $self->{tmpfile});
        open(IN, $self->{tmpfile})
          or $self->error($self->cleanup . "$self->{tmpfile} : $!");
+       binmode IN;
  
        $self->{copies} = 1 unless $self->{media} eq 'printer';
  
@@@ -1507,7 -1472,7 +1508,7 @@@ sub cleanup 
      close(FH);
    }
  
 -  if ($self->{tmpfile} && ! $::keep_temp_files) {
 +  if ($self->{tmpfile} && !($::lx_office_conf{debug} && $::lx_office_conf{debug}->{keep_temp_files})) {
      $self->{tmpfile} =~ s|.*/||g;
      # strip extension
      $self->{tmpfile} =~ s/\.\w+$//g;
@@@ -1615,7 -1580,7 +1616,7 @@@ sub get_standard_dbh 
      undef $standard_dbh;
    }
  
 -  $standard_dbh ||= $self->dbconnect_noauto($myconfig);
 +  $standard_dbh ||= SL::DB::create->dbh;
  
    $main::lxdebug->leave_sub(2);
  
@@@ -3531,163 -3496,6 +3532,163 @@@ sub restore_vars 
    $main::lxdebug->leave_sub();
  }
  
 +sub prepare_for_printing {
 +  my ($self) = @_;
 +
 +  $self->{templates} ||= $::myconfig{templates};
 +  $self->{formname}  ||= $self->{type};
 +  $self->{media}     ||= 'email';
 +
 +  die "'media' other than 'email', 'file', 'printer' is not supported yet" unless $self->{media} =~ m/^(?:email|file|printer)$/;
 +
 +  # set shipto from billto unless set
 +  my $has_shipto = any { $self->{"shipto$_"} } qw(name street zipcode city country contact);
 +  if (!$has_shipto && ($self->{type} =~ m/^(?:purchase_order|request_quotation)$/)) {
 +    $self->{shiptoname}   = $::myconfig{company};
 +    $self->{shiptostreet} = $::myconfig{address};
 +  }
 +
 +  my $language = $self->{language} ? '_' . $self->{language} : '';
 +
 +  my ($language_tc, $output_numberformat, $output_dateformat, $output_longdates);
 +  if ($self->{language_id}) {
 +    ($language_tc, $output_numberformat, $output_dateformat, $output_longdates) = AM->get_language_details(\%::myconfig, $self, $self->{language_id});
 +  } else {
 +    $output_dateformat   = $::myconfig{dateformat};
 +    $output_numberformat = $::myconfig{numberformat};
 +    $output_longdates    = 1;
 +  }
 +
 +  # Retrieve accounts for tax calculation.
 +  IC->retrieve_accounts(\%::myconfig, $self, map { $_ => $self->{"id_$_"} } 1 .. $self->{rowcount});
 +
 +  if ($self->{type} =~ /_delivery_order$/) {
 +    DO->order_details();
 +  } elsif ($self->{type} =~ /sales_order|sales_quotation|request_quotation|purchase_order/) {
 +    OE->order_details(\%::myconfig, $self);
 +  } else {
 +    IS->invoice_details(\%::myconfig, $self, $::locale);
 +  }
 +
 +  # Chose extension & set source file name
 +  my $extension = 'html';
 +  if ($self->{format} eq 'postscript') {
 +    $self->{postscript}   = 1;
 +    $extension            = 'tex';
 +  } elsif ($self->{"format"} =~ /pdf/) {
 +    $self->{pdf}          = 1;
 +    $extension            = $self->{'format'} =~ m/opendocument/i ? 'odt' : 'tex';
 +  } elsif ($self->{"format"} =~ /opendocument/) {
 +    $self->{opendocument} = 1;
 +    $extension            = 'odt';
 +  } elsif ($self->{"format"} =~ /excel/) {
 +    $self->{excel}        = 1;
 +    $extension            = 'xls';
 +  }
 +
 +  my $printer_code    = '_' . $self->{printer_code} if $self->{printer_code};
 +  my $email_extension = '_email' if -f "$self->{templates}/$self->{formname}_email${language}${printer_code}.${extension}";
 +  $self->{IN}         = "$self->{formname}${email_extension}${language}${printer_code}.${extension}";
 +
 +  # Format dates.
 +  $self->format_dates($output_dateformat, $output_longdates,
 +                      qw(invdate orddate quodate pldate duedate reqdate transdate shippingdate deliverydate validitydate paymentdate datepaid
 +                         transdate_oe deliverydate_oe employee_startdate employee_enddate),
 +                      grep({ /^(?:datepaid|transdate_oe|reqdate|deliverydate|deliverydate_oe|transdate)_\d+$/ } keys(%{$self})));
 +
 +  $self->reformat_numbers($output_numberformat, 2,
 +                          qw(invtotal ordtotal quototal subtotal linetotal listprice sellprice netprice discount tax taxbase total paid),
 +                          grep({ /^(?:linetotal|listprice|sellprice|netprice|taxbase|discount|paid|subtotal|total|tax)_\d+$/ } keys(%{$self})));
 +
 +  $self->reformat_numbers($output_numberformat, undef, qw(qty price_factor), grep({ /^qty_\d+$/} keys(%{$self})));
 +
 +  my ($cvar_date_fields, $cvar_number_fields) = CVar->get_field_format_list('module' => 'CT', 'prefix' => 'vc_');
 +
 +  if (scalar @{ $cvar_date_fields }) {
 +    $self->format_dates($output_dateformat, $output_longdates, @{ $cvar_date_fields });
 +  }
 +
 +  while (my ($precision, $field_list) = each %{ $cvar_number_fields }) {
 +    $self->reformat_numbers($output_numberformat, $precision, @{ $field_list });
 +  }
 +
 +  return $self;
 +}
 +
 +sub format_dates {
 +  my ($self, $dateformat, $longformat, @indices) = @_;
 +
 +  $dateformat ||= $::myconfig{dateformat};
 +
 +  foreach my $idx (@indices) {
 +    if ($self->{TEMPLATE_ARRAYS} && (ref($self->{TEMPLATE_ARRAYS}->{$idx}) eq "ARRAY")) {
 +      for (my $i = 0; $i < scalar(@{ $self->{TEMPLATE_ARRAYS}->{$idx} }); $i++) {
 +        $self->{TEMPLATE_ARRAYS}->{$idx}->[$i] = $::locale->reformat_date(\%::myconfig, $self->{TEMPLATE_ARRAYS}->{$idx}->[$i], $dateformat, $longformat);
 +      }
 +    }
 +
 +    next unless defined $self->{$idx};
 +
 +    if (!ref($self->{$idx})) {
 +      $self->{$idx} = $::locale->reformat_date(\%::myconfig, $self->{$idx}, $dateformat, $longformat);
 +
 +    } elsif (ref($self->{$idx}) eq "ARRAY") {
 +      for (my $i = 0; $i < scalar(@{ $self->{$idx} }); $i++) {
 +        $self->{$idx}->[$i] = $::locale->reformat_date(\%::myconfig, $self->{$idx}->[$i], $dateformat, $longformat);
 +      }
 +    }
 +  }
 +}
 +
 +sub reformat_numbers {
 +  my ($self, $numberformat, $places, @indices) = @_;
 +
 +  return if !$numberformat || ($numberformat eq $::myconfig{numberformat});
 +
 +  foreach my $idx (@indices) {
 +    if ($self->{TEMPLATE_ARRAYS} && (ref($self->{TEMPLATE_ARRAYS}->{$idx}) eq "ARRAY")) {
 +      for (my $i = 0; $i < scalar(@{ $self->{TEMPLATE_ARRAYS}->{$idx} }); $i++) {
 +        $self->{TEMPLATE_ARRAYS}->{$idx}->[$i] = $self->parse_amount(\%::myconfig, $self->{TEMPLATE_ARRAYS}->{$idx}->[$i]);
 +      }
 +    }
 +
 +    next unless defined $self->{$idx};
 +
 +    if (!ref($self->{$idx})) {
 +      $self->{$idx} = $self->parse_amount(\%::myconfig, $self->{$idx});
 +
 +    } elsif (ref($self->{$idx}) eq "ARRAY") {
 +      for (my $i = 0; $i < scalar(@{ $self->{$idx} }); $i++) {
 +        $self->{$idx}->[$i] = $self->parse_amount(\%::myconfig, $self->{$idx}->[$i]);
 +      }
 +    }
 +  }
 +
 +  my $saved_numberformat    = $::myconfig{numberformat};
 +  $::myconfig{numberformat} = $numberformat;
 +
 +  foreach my $idx (@indices) {
 +    if ($self->{TEMPLATE_ARRAYS} && (ref($self->{TEMPLATE_ARRAYS}->{$idx}) eq "ARRAY")) {
 +      for (my $i = 0; $i < scalar(@{ $self->{TEMPLATE_ARRAYS}->{$idx} }); $i++) {
 +        $self->{TEMPLATE_ARRAYS}->{$idx}->[$i] = $self->format_amount(\%::myconfig, $self->{TEMPLATE_ARRAYS}->{$idx}->[$i], $places);
 +      }
 +    }
 +
 +    next unless defined $self->{$idx};
 +
 +    if (!ref($self->{$idx})) {
 +      $self->{$idx} = $self->format_amount(\%::myconfig, $self->{$idx}, $places);
 +
 +    } elsif (ref($self->{$idx}) eq "ARRAY") {
 +      for (my $i = 0; $i < scalar(@{ $self->{$idx} }); $i++) {
 +        $self->{$idx}->[$i] = $self->format_amount(\%::myconfig, $self->{$idx}->[$i], $places);
 +      }
 +    }
 +  }
 +
 +  $::myconfig{numberformat} = $saved_numberformat;
 +}
 +
  1;
  
  __END__
diff --combined SL/IS.pm
+++ b/SL/IS.pm
@@@ -963,7 -963,10 +963,7 @@@ sub post_invoice 
      $query = qq|UPDATE ar SET paid = ? WHERE id = ?|;
      do_query($form, $dbh, $query,  $form->{paid}, conv_i($form->{id}));
  
 -    if (!$provided_dbh) {
 -      $dbh->commit();
 -      $dbh->disconnect();
 -    }
 +    $dbh->commit if !$provided_dbh;
  
      $main::lxdebug->leave_sub();
      return;
    # save printed, emailed and queued
    $form->save_status($dbh);
  
 -  Common::webdav_folder($form) if ($main::webdav);
 +  Common::webdav_folder($form);
  
    # Link this record to the records it was created from.
    RecordLinks->create_links('dbh'        => $dbh,
                                 'table'   => 'ar',);
  
    my $rc = 1;
 -  if (!$provided_dbh) {
 -    $dbh->commit();
 -    $dbh->disconnect();
 -  }
 +  $dbh->commit if !$provided_dbh;
  
    $main::lxdebug->leave_sub();
  
@@@ -1277,7 -1283,7 +1277,7 @@@ sub cogs 
      # sellprice is the cost of the item
      my $linetotal = $form->round_amount(($ref->{sellprice} * $qty) / ( ($ref->{price_factor} || 1) * ( $basefactor || 1 )), 2);
  
 -    if (!$main::eur) {
 +    if (!$::lx_office_conf{system}->{eur}) {
        $ref->{expense_accno} = ($form->{"expense_accno_$row"}) ? $form->{"expense_accno_$row"} : $ref->{expense_accno};
        # add to expense
        $form->{amount_cogs}{ $form->{id} }{ $ref->{expense_accno} } += -$linetotal;
@@@ -1362,7 -1368,7 +1362,7 @@@ sub reverse_invoice 
  sub delete_invoice {
    $main::lxdebug->enter_sub();
  
 -  my ($self, $myconfig, $form, $spool) = @_;
 +  my ($self, $myconfig, $form) = @_;
  
    # connect to database
    my $dbh = $form->dbconnect_noauto($myconfig);
  
    # Falls wir ein Storno haben, müssen zwei Felder in der stornierten Rechnung wieder
    # zurückgesetzt werden. Vgl:
 -  #  id | storno | storno_id |  paid   |  amount   
 +  #  id | storno | storno_id |  paid   |  amount
    #----+--------+-----------+---------+-----------
    # 18 | f      |           | 0.00000 | 119.00000
    # ZU:
    $dbh->disconnect;
  
    if ($rc) {
 +    my $spool = $::lx_office_conf{paths}->{spool};
      map { unlink "$spool/$_" if -f "$spool/$_"; } @spoolfiles;
    }
  
@@@ -1584,7 -1589,7 +1584,7 @@@ sub retrieve_invoice 
      }
      $sth->finish;
  
 -    Common::webdav_folder($form) if ($main::webdav);
 +    Common::webdav_folder($form);
    }
  
    my $rc = $dbh->commit;
@@@ -2081,13 -2086,13 +2081,13 @@@ sub get_pricegroups_for_parts 
          # to distinguish case A and B the variable pricegroup_id_$i is used
          # for new articles this variable isn't defined, for loaded articles it is
          # sellprice can't be used, as it already has 0,00 set
 -        
 +
          if ($pkr->{pricegroup_id} eq $form->{"pricegroup_id_$i"} and defined $form->{"pricegroup_id_$i"}) {
            # Case A
            $pkr->{selected}  = ' selected';
  
 -        } elsif ($pkr->{pricegroup_id} eq $form->{customer_klass} 
 -                 and not defined $form->{"pricegroup_id_$i"} 
 +        } elsif ($pkr->{pricegroup_id} eq $form->{customer_klass}
 +                 and not defined $form->{"pricegroup_id_$i"}
                   and $pkr->{price} != 0    # only use customer pricegroup price if it has a value, else use default_sellprice
                                             # for the case where pricegroup prices haven't been set
                  ) {
            if ($pkr->{pricegroup_id} eq $selectedpricegroup_id) {
              $pkr->{selected}  = ' selected';
            }
-         } elsif (($price_new != $form->{"sellprice_$i"}) and ($price_new ne 0) and defined $price_new) {
+         } elsif ( ($form->parse_amount($myconfig, $price_new)
+                  != $form->parse_amount($myconfig, $form->{"sellprice_$i"})) 
+                   and ($price_new ne 0) and defined $price_new) {
            # sellprice has changed
            # when loading existing invoices $price_new is NULL
            if ($pkr->{pricegroup_id} == 0) {
diff --combined SL/Template/LaTeX.pm
@@@ -134,7 -134,7 +134,7 @@@ sub find_end 
  
      my $keyword_pos = $pos - 1 + $tag_start_len;
  
-     if ((substr($text, $keyword_pos, 2) eq 'if') || (substr($text, $keyword_pos, 3) eq 'foreach')) {
+     if ((substr($text, $keyword_pos, 2) eq 'if') || (substr($text, $keyword_pos, 7) eq 'foreach')) {
        $depth++;
  
      } elsif ((substr($text, $keyword_pos, 4) eq 'else') && (1 == $depth)) {
@@@ -447,7 -447,7 +447,7 @@@ sub convert_to_pdf 
  }
  
  sub _get_latex_path {
 -  return $main::latex_bin || 'pdflatex';
 +  return $::lx_office_conf{applications}->{latex} || 'pdflatex';
  }
  
  sub get_mime_type() {
diff --combined bin/mozilla/do.pl
@@@ -165,7 -165,7 +165,7 @@@ sub order_links 
    $form->all_vc(\%myconfig, $form->{vc}, ($form->{vc} eq 'customer') ? "AR" : "AP");
  
    # retrieve order/quotation
 -  $form->{webdav}   = $main::webdav;
 +  $form->{webdav}   = $::lx_office_conf{system}->{webdav};
    $form->{jsscript} = 1;
  
    my $editing = $form->{id};
@@@ -751,6 -751,15 +751,15 @@@ sub invoice 
    my $currency = $form->{currency};
    invoice_links();
  
+   if ($form->{ordnumber}) {
+     require SL::DB::Order;
+     if (my $order = SL::DB::Manager::Order->find_by(ordnumber => $form->{ordnumber})) {
+       $order->load;
+       $form->{orddate} = $order->transdate_as_date;
+       $form->{$_}      = $order->$_ for qw(payment_id salesman_id taxzone_id quonumber);
+     }
+   }
    $form->{currency}     = $currency;
    $form->{exchangerate} = "";
    $form->{forex}        = $form->check_exchangerate(\%myconfig, $form->{currency}, $form->{invdate}, $buysell);
@@@ -1352,7 -1361,7 +1361,7 @@@ sub transfer_out 
          my $pinfo = $part_info_map{$request->{parts_id}};
          my $binfo = $bin_info_map{$request->{bin_id}};
  
 -        if ($main::show_best_before) {
 +        if ($::lx_office_conf{system}->{show_best_before}) {
              push @{ $form->{ERRORS} }, $locale->text("There is not enough available of '#1' at warehouse '#2', bin '#3', #4, #5, for the transfer of #6.",
                                                       $pinfo->{description},
                                                       $binfo->{warehouse_description},
diff --combined bin/mozilla/wh.pl
@@@ -176,7 -176,9 +176,9 @@@ sub transfer_or_removal_prepare_content
                                             "ean"          => $form->{ean},
                                             "description"  => $form->{description});
  
-   $form->show_generic_error($locale->text("The selected warehouse is empty.")) if (0 == scalar(@contents));
+   if (0 == scalar(@contents)) {
+     $form->show_generic_error($locale->text("The selected warehouse is empty, or no stocked items where found that match the filter settings."));
+   }
  
    my $all_units = AM->retrieve_units(\%myconfig, $form);
  
@@@ -436,7 -438,7 +438,7 @@@ sub create_assembly 
      $form->error($locale->text('The warehouse or the bin is missing.'));
    }
  
 -  if (!$main::show_best_before) {
 +  if (!$::lx_office_conf{system}->{show_best_before}) {
        $form->{bestbefore} = '';
    }
  
diff --combined doc/INSTALL.texi
@@@ -1,7 -1,7 +1,7 @@@
  \input texinfo   @c -*-texinfo-*-
  @c %**start of header
- @documentencoding UTF-8
  @setfilename INSTALL.info
+ @documentencoding UTF-8
  @settitle Lx-Office Installationsanleitung
  @c %**end of header
  
@@@ -24,7 -24,7 +24,7 @@@
  @menu
  * Aktuelle Hinweise:: Andere Informationsquellen als diese Anleitung
  * Benötigte Software und Pakete:: Vorraussetzungen zum Betrieb von Lx-Office
- * Installation des Programmpaketes:: Installationsort, Berechtigungen
+ * Manuelle 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
  * Benutzerauthentifizierung und Administratorpasswort:: Einrichtung der Authentifizierungsdatenbank und der Passwortüberprüfung
@@@ -56,12 -56,79 +56,79 @@@ im Lx-Office-Forum: @uref{http://www.lx
  @node Benötigte Software und Pakete
  @chapter Benötigte Software und Pakete
  
- Zum Betrieb von Lx-Office werden zwingend ein Webserver (meist Apache) und ein Datenbankserver (PostgreSQL) benötigt.
+ @menu
+ * Betriebssystem:: Unterstützte Betriebsysteme und Hinweise für ältere Systeme
+ * Pakete:: Benötigte Software und Perlpakete sowie deren Quellen
+ @end menu
+ @node Betriebssystem
+ @section Betriebssystem
  
- Zusätzlich benötigt Lx-Office die folgenden Perl-Pakete, die nicht Bestandteil einer Standard-Perl-Installation sind:
+ Lx-Office ist für Linux konzipiert, und sollte auf jedem unixoiden
+ Betriebssystem zum Laufen zu kriegen sein. Getestet ist diese Version im
+ speziellen auf Debian und Ubuntu, grundsätzlich wurde bei der Auswahl der
+ Pakete aber darauf Rücksicht genommen, dass es ohne große Probleme auf den
+ derzeit aktuellen verbreiteten Distributionen läuft.
+ Anfang 2011 sind das folgende Systeme:
  
  @itemize
  @item
+ Ubuntu 8.04 LTS Hardy Heron
+ @item
+ Ubuntu 9.10 Karmic Koala
+ @item
+ Ubuntu 10.04 Lucid Lynx
+ @item
+ Ubuntu 10.10 Maverick Meerkat
+ @item
+ Debian 5.0 Lenny
+ @item
+ Debian 6.0 Squeeze
+ @item
+ openSUSE 11.2
+ @item
+ openSUSE 11.3
+ @item
+ SuSE Linux Enterprice Server 11
+ @item
+ Fedora 13
+ @item
+ Fedora 14
+ @end itemize
+ Für die debianoiden Betriebssysteme existiert ein .deb, das deutlich einfacher
+ zu installieren ist.
+ Ubuntu 8.04 LTS hat zusätzlich die Schwierigkeit, dass die Module im Archiv
+ recht alt sind, und das viele der benötigten Module nicht einfach zu
+ installieren sind. Dafür sollte es kurz nach dem Release ein eigenes .deb
+ geben.
+ Alternativ dazu kann die normale Installation durchgeführt werden
+ (@pxref{Manuelle Installation des Programmpaketes}), wenn vorher ein
+ Kompatibilitätspaket installiert wird, das die fehlenden Pakete bereitstellt.
+ Das Paket ist auf @uref{https://sourceforge.net/projects/lx-office/files/Lx-Office%20ERP/2.6.2/, Sourceforge} unter dem Namen @code{lx-erp-perl-libs-compat-v2.tar.gz} hinterlegt.
+ Zur Installation das Paket in das entpackte Lx-Office Verzeichnis entpacken:
+ @code{tar xzf lx-erp-perl-libs-compat-v2.tar.gz /path/to/lx-office/}
+ Danach sollte der Installationscheck (@pxref{Pakete}) die enthaltenen Pakete erkennen.
+ @node Pakete
+ @section Pakete
+ Zum Betrieb von Lx-Office werden zwingend ein Webserver (meist Apache)
+ und ein Datenbankserver (PostgreSQL, mindestens v8.2) benötigt.
+ Zusätzlich benötigt Lx-Office die folgenden Perl-Pakete, die nicht Bestandteil
+ einer Standard-Perl-Installation sind:
+ @itemize
+ @item
+ parent
+ @item
  Archive::Zip
  @item
  Class::Accessor
@@@ -80,8 -147,6 +147,6 @@@ List::MoreUtil
  @item
  PDF::API2
  @item
- Readonly (benötigt) und Readonly::XS (optional)
- @item
  Rose::Object
  @item
  Rose::DB
@@@ -104,6 -169,10 +169,10 @@@ YAM
  Gegenüber Version 2.6.0 sind zu dieser Liste 2 Pakete hinzugekommen, @code{URI}
  und @code{XML::Writer} sind notwendig. Ohne startet Lx-Office nicht.
  
+ Gegenüber Version 2.6.1 sind @code{parent}, @code{DateTime},
+ @code{Rose::Object}, @code{Rose::DB} und @code{Rose::DB::Object} neu
+ hinzugekommen. @code{IO::Wrap} wurde entfernt.
  @code{Email::Address} und @code{List::MoreUtils} sind schon länger feste
  Abhängigkeiten, wurden aber bisher mit Lx-Office mitgeliefert.  Beide sind auch
  in 2.6.1 weiterhin mit ausgeliefert, wurden in einer zukünftigen Version aber
@@@ -117,15 -186,17 +186,17 @@@ Die zu installierenden Pakete können i
  
  Für Debian oder Ubuntu benötigen Sie diese Pakete:
  
- @code{apache2 postgresql libarchive-zip-perl libclass-accessor-perl libdatetime-perl libdbi-perl libdbd-pg-perl libpg-perl libemail-address-perl libio-stringy-perl liblist-moreutils-perl libpdf-api2-perl libtemplate-perl libtext-csv-xs-perl libtext-iconv-perl liburi-perl libxml-writer-perl libyaml-perl}
+ @code{apache2 postgresql libparent-perl libarchive-zip-perl libclass-accessor-perl libdatetime-perl libdbi-perl libdbd-pg-perl libpg-perl libemail-address-perl liblist-moreutils-perl libpdf-api2-perl librose-object-perl librose-db-perl librose-db-object-perl libtemplate-perl libtext-csv-xs-perl libtext-iconv-perl liburi-perl libxml-writer-perl libyaml-perl}
  
  Für Fedora Core benötigen Sie diese Pakete:
  
- @code{httpd postgresql-server perl-Class-Accessor perl-DateTime perl-DBI perl-DBD-Pg perl-Email-Address perl-IO-stringy perl-List-MoreUtils perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML}
+ @code{httpd postgresql-server perl-parent perl-Class-Accessor perl-DateTime perl-DBI perl-DBD-Pg perl-Email-Address perl-List-MoreUtils perl-PDF-API2 perl-Rose-Object perl-Rose-DB perl-Rose-DB-Object perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML}
  
  Für OpenSuSE benötigen Sie diese Pakete:
  
- @code{apache2 postgresql-server perl-Archive-Zip perl-Class-Accessor perl-DateTime perl-DBI perl-DBD-Pg perl-MailTools perl-IO-stringy perl-List-MoreUtils perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML}
+ @code{apache2 postgresql-server perl-Archive-Zip perl-Class-Accessor perl-DateTime perl-DBI perl-DBD-Pg perl-MailTools perl-List-MoreUtils perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML}
+ Bei openSuSE 11 ist @code{parent} bereits enthalten, und braucht nicht nachinstalliert werden. Die @code{Rose::*} Pakete sind derzeit nicht für SuSE gepackt, und müssen anderweitig nachinstalliert werden.
  
  Lx-Office enthält ein Script, mit dem überprüft werden kann, ob alle
  benötigten Perl-Module installiert sind. Der Aufruf lautet wie folgt:
  
  @c ---------------------------------------------------------------
  
- @node Installation des Programmpaketes
- @chapter Installation des Programmpaketes
+ @node Manuelle Installation des Programmpaketes
+ @chapter Manuelle Installation des Programmpaketes
  
- Die Lx-Office ERP Installationsdatei (lxoffice-erp-2.6.1.tgz) wird im
+ Die Lx-Office ERP Installationsdatei (lxoffice-erp-2.6.2.tgz) wird im
  Dokumentenverzeichnis des Webservers (z.B. @code{/var/www/html/},
  @code{/srv/www/htdocs} oder @code{/var/www/}) entpackt:
  
  @code{cd /var/www
  @*
- tar xvzf lxoffice-erp-2.6.1.tgz}
+ tar xvzf lxoffice-erp-2.6.2.tgz}
  
  Verändern Sie evtl. noch den Namen des Verzeichnisses mit
  
@@@ -219,16 -290,12 +290,12 @@@ Das Encoding einer Datenbank kann in @c
  In der Datei @code{postgresql.conf}, die je nach Distribution in
  verschiedenen Verzeichnissen liegen kann
  (z.B. @code{/var/lib/pgsql/data/} oder @code{/etc/postgresql/}, muss
- sichergestellt werden, dass TCP/IP-Verbindungen aktiviert sind. Für
- PostgreSQL vor Version v8.0 lautete dieser Parameter
- @code{TCPIP_SOCKET = 1}
- Ab v8.0 wird das Verhalten hingegen über den neuen Parameter
- @code{listen_address} gesteuert. Laufen PostgreSQL und Lx-Office auf
- demselben Rechner, so kann dort der Wert @code{localhost} verwendet
- werden. Andernfalls müssen Datenbankverbindungen auch von anderen
- Rechnern aus zugelassen werden, was mit dem Wert \@code{*} geschieht.
+ sichergestellt werden, dass TCP/IP-Verbindungen aktiviert sind. Das
+ Verhalten wird über den Parameter @code{listen_address}
+ gesteuert. Laufen PostgreSQL und Lx-Office auf demselben Rechner, so
+ kann dort der Wert @code{localhost} verwendet werden. Andernfalls
+ müssen Datenbankverbindungen auch von anderen Rechnern aus zugelassen
+ werden, was mit dem Wert \@code{*} geschieht.
  
  In der Datei @code{pg_hba.conf}, die im gleichen Verzeichnis wie die
  @code{postgresql.conf} zu finden sein sollte, müssen die
@@@ -252,21 -319,23 +319,23 @@@ host    all         lxoffice      127.0
  @node Erweiterung für servergespeicherte Prozeduren
  @section Erweiterung für servergespeicherte Prozeduren
  
- In der Datenbank @code{template1} muss die Unterstützung für
- servergespeicherte Prozeduren eingerichet werden. Melden Sie sich
- dafür als Benutzer ``postgres'' an der Datenbank an, und führen Sie
- die folgenden Kommandos aus:
+ In der Datenbank @code{template1} muss die Unterstützung für servergespeicherte
+ Prozeduren eingerichet werden. Melden Sie sich dafür als Benutzer ``postgres''
+ an der Datenbank an, und führen Sie die folgenden Kommandos aus:
+ @code{create language 'plpgsql';}
+ Achtung: In älteren Postgresversionen (vor 8.0) muss der Handler für die
+ Sprache manuell anlelegt werden, diese Versionen werden aber nicht mehr
+ offiziell von Lx-Office unterstützt. Dafür dann die folgenden Kommandos:
  
  @code{create function plpgsql_call_handler () returns opaque as '/usr/lib/pgsql/plpgsql.so' language 'c';
  @*
- create language 'plpgsql' handler plpgsql_call_handler
- lancompiler 'pl/pgsql';}
- Bitte beachten Sie, dass der Pfad zur Datei @code{plpgsql.so} von
- Distribution zu Distribution verschiedlich sein kann. Bei
- Debian/Ubuntu befindet sie sich unter
- @code{/usr/lib/postgresql/lib/plpgsql.so}, bei Ubuntu 9.10 unter @code{/usr/lib/postgresql/8.4/lib/plpgsql.so}.
+ create language 'plpgsql' handler plpgsql_call_handler lancompiler 'pl/pgsql';}
  
+ Bitte beachten Sie, dass der Pfad zur Datei @code{plpgsql.so} von Distribution
+ zu Distribution verschiedlich sein kann. Bei Debian/Ubuntu befindet sie sich
+ unter @code{/usr/lib/postgresql/lib/plpgsql.so}.
  
  @c ---------------------------------------------------------------
  
@@@ -290,6 -359,10 +359,10 @@@ bzw. den hier gewählten Benutzernamen
  @node Apache-Konfiguration
  @chapter Apache-Konfiguration
  
+ Hinweis: Für einen deutlichen Performanceschub sorgt die Ausführung
+ mittels FCGI. Die Einrichtung wird ausführlich in der Datei
+ @code{INSTALL.fcgi} beschrieben.
  Der Zugriff auf das Programmverzeichnis muss in der Apache
  Webserverkonfigurationsdatei @code{httpd.conf} eingestellt
  werden. Fügen Sie den folgenden Abschnitt dieser Datei oder einer
@@@ -547,10 -620,9 +620,10 @@@ 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
 -@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.
 +@code{config/lx_office.conf} die Variable @code{dbcharset} im
 +Abschnitt @code{system} 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
@@@ -607,7 -679,7 +680,7 @@@ ausgewählten Spalte hinzugefügt
  @node Migration alter Installationen
  @section Migration alter Installationen
  
- Wenn Lx-Office 2.6.1 über eine ältere Version installiert wird, in der
+ Wenn Lx-Office 2.6.2 ü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
@@@ -635,14 -707,13 +708,14 @@@ OpenDocument-Format, wie es OpenOffice.
  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
 -@code{config/lx-erp.conf} die Variable @code{$opendocument_templates}
 -auf @samp{1} stehen.  Dieses ist die Standardeinstellung.
 +@code{config/lx_office.conf} die Variable @code{opendocument} im
 +Abschnitt @code{print_templates} auf @samp{1} stehen.  Dieses ist die
 +Standardeinstellung.
  
 -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 "UTF-8".
 +Weiterhin muss in der Datei @code{config/lx_office.conf} die Variable
 +@code{dbcharset} im Abschnitt @code{system} auf die Zeichenkodierung
 +gesetzt werden, die auch bei der Speicherung der Daten in der
 +Datenbank verwendet wird. Diese ist in den meisten Fällen "UTF-8".
  
  Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
  weitere Software benötigt, wird zur Umwandlung dieser Dateien in PDF
@@@ -651,11 -722,11 +724,11 @@@ neben OpenOffice.org ab Version 2 auch 
  (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 @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.
 +Nach der Installation müssen in der Datei @code{config/lx_config.conf}
 +zwei weitere Variablen angepasst werden: @code{openofficeorg_writer}
 +muss den vollständigen Pfad zur OpenOffice.org Writer-Anwendung
 +enthalten. @code{xvfb} muss den Pfad zum ``X virtual frame buffer''
 +enthalten. Beide stehen im Abschnitt @code{applications}.
  
  Zusätzlich gibt es zwei verschiedene Arten, wie Lx-Office mit
  OpenOffice kommuniziert. Die erste Variante, die benutzt wird, wenn
@@@ -685,11 -756,10 +758,10 @@@ folgender Befehl auszuführen
  
  @code{mv users/.openoffice.org2 users/.openoffice}
  
- Dieses Verzeichnis, wie auch das komplette @code{users}-Verzeichnis,
- muss vom Webserver beschreibbar sein. Dieses wurde in Schritt
- @code{Installation des Programmpakets} oben bereits erledigt, kann
- aber erneut überprüft werden, wenn die Konvertierung nach PDF
- fehlschlägt.
+ Dieses Verzeichnis, wie auch das komplette @code{users}-Verzeichnis, muss vom
+ Webserver beschreibbar sein. Dieses wurde bereits erledigt
+ (@pxref{Manuelle Installation des Programmpaketes}), kann aber erneut überprüft
+ werden, wenn die Konvertierung nach PDF fehlschlägt.
  
  @c ---------------------------------------------------------------
  
diff --combined doc/INSTALL.txt
@@@ -4,7 -4,9 +4,9 @@@ Table of Content
  Inhalt der Anleitung
  1 Aktuelle Hinweise
  2 Benötigte Software und Pakete
- 3 Installation des Programmpaketes
+   2.1 Betriebssystem
+   2.2 Pakete
+ 3 Manuelle Installation des Programmpaketes
  4 Anpassung der PostgreSQL-Konfiguration
    4.1 Zeichensätze/die Verwendung von UTF-8
    4.2 Änderungen an Konfigurationsdateien
@@@ -48,12 -50,73 +50,73 @@@ Aktuelle Installations- und Konfigurati
  2 Benötigte Software und Pakete
  ********************************
  
+ 2.1 Betriebssystem
+ ==================
+ Lx-Office ist für Linux konzipiert, und sollte auf jedem unixoiden
+ Betriebssystem zum Laufen zu kriegen sein. Getestet ist diese Version im
+ speziellen auf Debian und Ubuntu, grundsätzlich wurde bei der Auswahl
+ der Pakete aber darauf Rücksicht genommen, dass es ohne große Probleme
+ auf den derzeit aktuellen verbreiteten Distributionen läuft.
+    Anfang 2011 sind das folgende Systeme:
+    * Ubuntu 8.04 LTS Hardy Heron
+    * Ubuntu 9.10 Karmic Koala
+    * Ubuntu 10.04 Lucid Lynx
+    * Ubuntu 10.10 Maverick Meerkat
+    * Debian 5.0 Lenny
+    * Debian 6.0 Squeeze
+    * openSUSE 11.2
+    * openSUSE 11.3
+    * SuSE Linux Enterprice Server 11
+    * Fedora 13
+    * Fedora 14
+    Für die debianoiden Betriebssysteme existiert ein .deb, das deutlich
+ einfacher zu installieren ist.
+    Ubuntu 8.04 LTS hat zusätzlich die Schwierigkeit, dass die Module im
+ Archiv recht alt sind, und das viele der benötigten Module nicht
+ einfach zu installieren sind. Dafür sollte es kurz nach dem Release ein
+ eigenes .deb geben.
+    Alternativ dazu kann die normale Installation durchgeführt werden
+ (*note Manuelle Installation des Programmpaketes::), wenn vorher ein
+ Kompatibilitätspaket installiert wird, das die fehlenden Pakete
+ bereitstellt.  Das Paket ist auf Sourceforge
+ (https://sourceforge.net/projects/lx-office/files/Lx-Office%20ERP/2.6.2/)
+ unter dem Namen `lx-erp-perl-libs-compat-v2.tar.gz' hinterlegt.
+    Zur Installation das Paket in das entpackte Lx-Office Verzeichnis
+ entpacken:
+    `tar xzf lx-erp-perl-libs-compat-v2.tar.gz /path/to/lx-office/'
+    Danach sollte der Installationscheck (*note Pakete::) die
+ enthaltenen Pakete erkennen.
+ 2.2 Pakete
+ ==========
  Zum Betrieb von Lx-Office werden zwingend ein Webserver (meist Apache)
- und ein Datenbankserver (PostgreSQL) benötigt.
+ und ein Datenbankserver (PostgreSQL, mindestens v8.2) benötigt.
  
     Zusätzlich benötigt Lx-Office die folgenden Perl-Pakete, die nicht
  Bestandteil einer Standard-Perl-Installation sind:
  
+    * parent
     * Archive::Zip
  
     * Class::Accessor
  
     * PDF::API2
  
-    * Readonly (benötigt) und Readonly::XS (optional)
     * Rose::Object
  
     * Rose::DB
     Gegenüber Version 2.6.0 sind zu dieser Liste 2 Pakete hinzugekommen,
  `URI' und `XML::Writer' sind notwendig. Ohne startet Lx-Office nicht.
  
+    Gegenüber Version 2.6.1 sind `parent', `DateTime', `Rose::Object',
+ `Rose::DB' und `Rose::DB::Object' neu hinzugekommen. `IO::Wrap' wurde
+ entfernt.
     `Email::Address' und `List::MoreUtils' sind schon länger feste
  Abhängigkeiten, wurden aber bisher mit Lx-Office mitgeliefert.  Beide
  sind auch in 2.6.1 weiterhin mit ausgeliefert, wurden in einer
@@@ -110,40 -175,46 +175,46 @@@ Distributionen unterschiedlich heißen
  
     Für Debian oder Ubuntu benötigen Sie diese Pakete:
  
-    `apache2 postgresql libarchive-zip-perl libclass-accessor-perl
- libdatetime-perl libdbi-perl libdbd-pg-perl libpg-perl
- libemail-address-perl libio-stringy-perl liblist-moreutils-perl
- libpdf-api2-perl libtemplate-perl libtext-csv-xs-perl
+    `apache2 postgresql libparent-perl libarchive-zip-perl
+ libclass-accessor-perl libdatetime-perl libdbi-perl libdbd-pg-perl
+ libpg-perl libemail-address-perl liblist-moreutils-perl
+ libpdf-api2-perl librose-object-perl librose-db-perl
+ librose-db-object-perl libtemplate-perl libtext-csv-xs-perl
  libtext-iconv-perl liburi-perl libxml-writer-perl libyaml-perl'
  
     Für Fedora Core benötigen Sie diese Pakete:
  
-    `httpd postgresql-server perl-Class-Accessor perl-DateTime perl-DBI
- perl-DBD-Pg perl-Email-Address perl-IO-stringy perl-List-MoreUtils
- perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv
- perl-URI perl-XML-Writer perl-YAML'
+    `httpd postgresql-server perl-parent perl-Class-Accessor
+ perl-DateTime perl-DBI perl-DBD-Pg perl-Email-Address
+ perl-List-MoreUtils perl-PDF-API2 perl-Rose-Object perl-Rose-DB
+ perl-Rose-DB-Object perl-Template-Toolkit perl-Text-CSV_XS
+ perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML'
  
     Für OpenSuSE benötigen Sie diese Pakete:
  
     `apache2 postgresql-server perl-Archive-Zip perl-Class-Accessor
- perl-DateTime perl-DBI perl-DBD-Pg perl-MailTools perl-IO-stringy
- perl-List-MoreUtils perl-PDF-API2 perl-Template-Toolkit
- perl-Text-CSV_XS perl-Text-Iconv perl-URI perl-XML-Writer perl-YAML'
+ perl-DateTime perl-DBI perl-DBD-Pg perl-MailTools perl-List-MoreUtils
+ perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv
+ perl-URI perl-XML-Writer perl-YAML'
+    Bei openSuSE 11 ist `parent' bereits enthalten, und braucht nicht
+ nachinstalliert werden. Die `Rose::*' Pakete sind derzeit nicht für
+ SuSE gepackt, und müssen anderweitig nachinstalliert werden.
  
     Lx-Office enthält ein Script, mit dem überprüft werden kann, ob alle
  benötigten Perl-Module installiert sind. Der Aufruf lautet wie folgt:
  
     `./scripts/installation_check.pl'
  
- 3 Installation des Programmpaketes
- **********************************
+ 3 Manuelle Installation des Programmpaketes
+ *******************************************
  
- Die Lx-Office ERP Installationsdatei (lxoffice-erp-2.6.1.tgz) wird im
+ Die Lx-Office ERP Installationsdatei (lxoffice-erp-2.6.2.tgz) wird im
  Dokumentenverzeichnis des Webservers (z.B. `/var/www/html/',
  `/srv/www/htdocs' oder `/var/www/') entpackt:
  
     `cd /var/www
- tar xvzf lxoffice-erp-2.6.1.tgz'
+ tar xvzf lxoffice-erp-2.6.2.tgz'
  
     Verändern Sie evtl. noch den Namen des Verzeichnisses mit
  
@@@ -211,16 -282,11 +282,11 @@@ mit ISO-8859-15 als Encoding betrieben 
  In der Datei `postgresql.conf', die je nach Distribution in
  verschiedenen Verzeichnissen liegen kann (z.B. `/var/lib/pgsql/data/'
  oder `/etc/postgresql/', muss sichergestellt werden, dass
- TCP/IP-Verbindungen aktiviert sind. Für PostgreSQL vor Version v8.0
- lautete dieser Parameter
-    `TCPIP_SOCKET = 1'
-    Ab v8.0 wird das Verhalten hingegen über den neuen Parameter
- `listen_address' gesteuert. Laufen PostgreSQL und Lx-Office auf
- demselben Rechner, so kann dort der Wert `localhost' verwendet werden.
- Andernfalls müssen Datenbankverbindungen auch von anderen Rechnern aus
- zugelassen werden, was mit dem Wert \`*' geschieht.
+ TCP/IP-Verbindungen aktiviert sind. Das Verhalten wird über den
+ Parameter `listen_address' gesteuert. Laufen PostgreSQL und Lx-Office
+ auf demselben Rechner, so kann dort der Wert `localhost' verwendet
+ werden. Andernfalls müssen Datenbankverbindungen auch von anderen
+ Rechnern aus zugelassen werden, was mit dem Wert \`*' geschieht.
  
     In der Datei `pg_hba.conf', die im gleichen Verzeichnis wie die
  `postgresql.conf' zu finden sein sollte, müssen die Berichtigungen für
@@@ -246,6 -312,13 +312,13 @@@ servergespeicherte Prozeduren eingerich
  als Benutzer "postgres" an der Datenbank an, und führen Sie die
  folgenden Kommandos aus:
  
+    `create language 'plpgsql';'
+    Achtung: In älteren Postgresversionen (vor 8.0) muss der Handler für
+ die Sprache manuell anlelegt werden, diese Versionen werden aber nicht
+ mehr offiziell von Lx-Office unterstützt. Dafür dann die folgenden
+ Kommandos:
     `create function plpgsql_call_handler () returns opaque as
  '/usr/lib/pgsql/plpgsql.so' language 'c';
  create language 'plpgsql' handler plpgsql_call_handler lancompiler
  
     Bitte beachten Sie, dass der Pfad zur Datei `plpgsql.so' von
  Distribution zu Distribution verschiedlich sein kann. Bei Debian/Ubuntu
- befindet sie sich unter `/usr/lib/postgresql/lib/plpgsql.so', bei
- Ubuntu 9.10 unter `/usr/lib/postgresql/8.4/lib/plpgsql.so'.
+ befindet sie sich unter `/usr/lib/postgresql/lib/plpgsql.so'.
  
  4.4 Datenbankbenutzer anlegen
  =============================
@@@ -273,7 -345,11 +345,11 @@@ hier gewählten Benutzernamen
  5 Apache-Konfiguration
  **********************
  
- Der Zugriff auf das Programmverzeichnis muss in der Apache
+ Hinweis: Für einen deutlichen Performanceschub sorgt die Ausführung
+ mittels FCGI. Die Einrichtung wird ausführlich in der Datei
+ `INSTALL.fcgi' beschrieben.
+    Der Zugriff auf das Programmverzeichnis muss in der Apache
  Webserverkonfigurationsdatei `httpd.conf' eingestellt werden. Fügen Sie
  den folgenden Abschnitt dieser Datei oder einer anderen Datei hinzu,
  die beim Starten des Webservers eingelesen wird:
@@@ -496,9 -572,9 +572,9 @@@ 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
 -`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.
 +`config/lx_office.conf' die Variable `dbcharset' im Abschnitt `system'
 +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
@@@ -552,7 -628,7 +628,7 @@@ zugewiesen werden. Dazu gibt es zwei MÃ
  7.6 Migration alter Installationen
  ==================================
  
- Wenn Lx-Office 2.6.1 über eine ältere Version installiert wird, in der
+ Wenn Lx-Office 2.6.2 ü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
@@@ -577,13 -653,13 +653,13 @@@ OpenDocument-Format, wie es OpenOffice.
  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
 -`config/lx-erp.conf' die Variable `$opendocument_templates' auf `1'
 -stehen.  Dieses ist die Standardeinstellung.
 +`config/lx_office.conf' die Variable `opendocument' im Abschnitt
 +`print_templates' auf `1' stehen.  Dieses ist die Standardeinstellung.
  
 -   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 "UTF-8".
 +   Weiterhin muss in der Datei `config/lx_office.conf' die Variable
 +`dbcharset' im Abschnitt `system' auf die Zeichenkodierung gesetzt
 +werden, die auch bei der Speicherung der Daten in der Datenbank
 +verwendet wird. Diese ist in den meisten Fällen "UTF-8".
  
     Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
  weitere Software benötigt, wird zur Umwandlung dieser Dateien in PDF
@@@ -592,11 -668,10 +668,11 @@@ neben OpenOffice.org ab Version 2 auch 
  (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 `config/lx-erp.conf' zwei
 -weitere Variablen angepasst werden: `$openofficeorg_writer_bin' muss
 +   Nach der Installation müssen in der Datei `config/lx_config.conf'
 +zwei weitere Variablen angepasst werden: `openofficeorg_writer' muss
  den vollständigen Pfad zur OpenOffice.org Writer-Anwendung enthalten.
 -`$xvfb_bin' muss den Pfad zum "X virtual frame buffer" enthalten.
 +`xvfb' muss den Pfad zum "X virtual frame buffer" enthalten. Beide
 +stehen im Abschnitt `applications'.
  
     Zusätzlich gibt es zwei verschiedene Arten, wie Lx-Office mit
  OpenOffice kommuniziert. Die erste Variante, die benutzt wird, wenn die
@@@ -626,8 -701,8 +702,8 @@@ z.B. einfach nur `.openoffice', so wär
     `mv users/.openoffice.org2 users/.openoffice'
  
     Dieses Verzeichnis, wie auch das komplette `users'-Verzeichnis, muss
- vom Webserver beschreibbar sein. Dieses wurde in Schritt `Installation
des Programmpakets' oben bereits erledigt, kann aber erneut überprüft
+ vom Webserver beschreibbar sein. Dieses wurde bereits erledigt (*note
Manuelle Installation des Programmpaketes::), kann aber erneut überprüft
  werden, wenn die Konvertierung nach PDF fehlschlägt.
  
  9 Lx-Office ERP verwenden
@@@ -642,3 -717,8 +718,8 @@@ URL erreichbar
  
     `http://localhost/lx-office-erp/admin.pl'
  
\1f
+ Local Variables:
+ coding: utf-8
+ End:
@@@ -1,9 -1,9 +1,9 @@@
  <html lang="en">
  <head>
  <title>Datenbanken anlegen - Lx-Office Installationsanleitung</title>
- <meta http-equiv="Content-Type" content="text/html">
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta name="description" content="Lx-Office Installationsanleitung">
- <meta name="generator" content="makeinfo 4.13">
+ <meta name="generator" content="makeinfo 4.11">
  <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_00c3_00a4nge.html#Zusammenh_00c3_00a4nge" title="Zusammenhänge">
  </head>
  <body>
  <div class="node">
- <a name="Datenbanken-anlegen"></a>
  <p>
- Next:&nbsp;<a rel="next" accesskey="n" href="Gruppen-anlegen.html#Gruppen-anlegen">Gruppen anlegen</a>,
- Previous:&nbsp;<a rel="previous" accesskey="p" href="Zusammenh_00c3_00a4nge.html#Zusammenh_00c3_00a4nge">Zusammenhänge</a>,
- Up:&nbsp;<a rel="up" accesskey="u" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>
+ <a name="Datenbanken-anlegen"></a>
+ n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="Gruppen-anlegen.html#Gruppen-anlegen">Gruppen anlegen</a>,
+ voriges:&nbsp;<a rel="previous" accesskey="p" href="Zusammenh_00c3_00a4nge.html#Zusammenh_00c3_00a4nge">Zusammenhänge</a>,
+ aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>
  <hr>
  </div>
  
@@@ -41,10 -41,9 +41,10 @@@ ist dies &lsquo;<samp><span class="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
 -&lsquo;<samp><span class="samp">UTF-8</span></samp>&rsquo; setzen. Zusätzlich muss beim Anlegen der Datenbank
 -&lsquo;<samp><span class="samp">UTF-8 Unicode</span></samp>&rsquo; als Schriftsatz ausgewählt werden.
 +<code>config/lx_office.conf</code> die Variable <code>dbcharset</code> im
 +Abschnitt <code>system</code> auf den Wert &lsquo;<samp><span class="samp">UTF-8</span></samp>&rsquo; setzen. Zusätzlich
 +muss beim Anlegen der Datenbank &lsquo;<samp><span class="samp">UTF-8 Unicode</span></samp>&rsquo; 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
@@@ -1,9 -1,9 +1,9 @@@
  <html lang="en">
  <head>
  <title>OpenDocument-Vorlagen - Lx-Office Installationsanleitung</title>
- <meta http-equiv="Content-Type" content="text/html">
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta name="description" content="Lx-Office Installationsanleitung">
- <meta name="generator" content="makeinfo 4.13">
+ <meta name="generator" content="makeinfo 4.11">
  <link title="Top" rel="start" href="index.html#Top">
  <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">
  </head>
  <body>
  <div class="node">
+ <p>
  <a name="OpenDocument-Vorlagen"></a>
  <a name="OpenDocument_002dVorlagen"></a>
- <p>
- Next:&nbsp;<a rel="next" accesskey="n" href="Lx_002dOffice-ERP-verwenden.html#Lx_002dOffice-ERP-verwenden">Lx-Office ERP verwenden</a>,
- Previous:&nbsp;<a rel="previous" accesskey="p" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>,
- Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
+ n&auml;chstes:&nbsp;<a rel="next" accesskey="n" href="Lx_002dOffice-ERP-verwenden.html#Lx_002dOffice-ERP-verwenden">Lx-Office ERP verwenden</a>,
+ voriges:&nbsp;<a rel="previous" accesskey="p" href="Benutzer_002d-und-Gruppenverwaltung.html#Benutzer_002d-und-Gruppenverwaltung">Benutzer- und Gruppenverwaltung</a>,
+ aufw&auml;rts:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
  <hr>
  </div>
  
@@@ -39,14 -39,13 +39,14 @@@ OpenDocument-Format, wie es OpenOffice.
  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
 -<code>config/lx-erp.conf</code> die Variable <code>$opendocument_templates</code>
 -auf &lsquo;<samp><span class="samp">1</span></samp>&rsquo; stehen.  Dieses ist die Standardeinstellung.
 +<code>config/lx_office.conf</code> die Variable <code>opendocument</code> im
 +Abschnitt <code>print_templates</code> auf &lsquo;<samp><span class="samp">1</span></samp>&rsquo; stehen.  Dieses ist die
 +Standardeinstellung.
  
 -   <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 "UTF-8".
 +   <p>Weiterhin muss in der Datei <code>config/lx_office.conf</code> die Variable
 +<code>dbcharset</code> im Abschnitt <code>system</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 "UTF-8".
  
     <p>Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
  weitere Software benötigt, wird zur Umwandlung dieser Dateien in PDF
@@@ -55,11 -54,11 +55,11 @@@ neben OpenOffice.org ab Version 2 auch 
  (xvfb) installiert werden.  Bei Debian ist er im Paket &ldquo;xvfb&rdquo;
  enthalten. Andere Distributionen enthalten ihn in anderen Paketen.
  
 -   <p>Nach der Installation müssen in der Datei <code>config/lx-erp.conf</code>
 -zwei weitere Variablen angepasst werden:
 -<code>$openofficeorg_writer_bin</code> muss den vollständigen Pfad zur
 -OpenOffice.org Writer-Anwendung enthalten.  <code>$xvfb_bin</code> muss den
 -Pfad zum &ldquo;X virtual frame buffer&rdquo; enthalten.
 +   <p>Nach der Installation müssen in der Datei <code>config/lx_config.conf</code>
 +zwei weitere Variablen angepasst werden: <code>openofficeorg_writer</code>
 +muss den vollständigen Pfad zur OpenOffice.org Writer-Anwendung
 +enthalten. <code>xvfb</code> muss den Pfad zum &ldquo;X virtual frame buffer&rdquo;
 +enthalten. Beide stehen im Abschnitt <code>applications</code>.
  
     <p>Zusätzlich gibt es zwei verschiedene Arten, wie Lx-Office mit
  OpenOffice kommuniziert. Die erste Variante, die benutzt wird, wenn
@@@ -89,11 -88,10 +89,10 @@@ folgender Befehl auszuführen
  
     <p><code>mv users/.openoffice.org2 users/.openoffice</code>
  
-    <p>Dieses Verzeichnis, wie auch das komplette <code>users</code>-Verzeichnis,
- muss vom Webserver beschreibbar sein. Dieses wurde in Schritt
- <code>Installation des Programmpakets</code> oben bereits erledigt, kann
- aber erneut überprüft werden, wenn die Konvertierung nach PDF
- fehlschlägt.
+    <p>Dieses Verzeichnis, wie auch das komplette <code>users</code>-Verzeichnis, muss vom
+ Webserver beschreibbar sein. Dieses wurde bereits erledigt
+ (siehe <a href="Manuelle-Installation-des-Programmpaketes.html#Manuelle-Installation-des-Programmpaketes">Manuelle Installation des Programmpaketes</a>), kann aber erneut überprüft
+ werden, wenn die Konvertierung nach PDF fehlschlägt.
  
  <!--  -->
     </body></html>
diff --combined locale/de/all
@@@ -38,12 -38,9 +38,12 @@@ $self->{texts} = 
    '4. Quarter'                  => '4. Quartal',
    '<b>What</b> do you want to look for?' => '<b>Wonach</b> wollen Sie suchen?',
    'A Buchungsgruppe consists of a descriptive name and the account numbers for the income and expense accounts for those four tax zones as well as the inventory account number.' => 'Eine Buchungsgruppe besteht aus einem deskriptiven Namen, den Erl&ouml;s- und Aufwandskonten f&uuml;r diese vier Steuerzonen sowie aus einem Inventarkonto.',
 +  'A digit is required.'        => 'Eine Ziffer ist vorgeschrieben.',
    'A group named &quot;Full Access&quot; has been created.' => 'Eine Gruppe namens &quot;Vollzugriff&quot; wurde angelegt.',
    'A group with that name does already exist.' => 'Eine Gruppe mit diesem Namen gibt es bereits.',
    'A lot of the usability of Lx-Office has been enhanced with javascript. Although it is currently possible to use every aspect of Lx-Office without javascript, we strongly recommend it. In a future version this may change and javascript may be necessary to access advanced features.' => 'Die Bedienung von Lx-Office wurde an vielen Stellen mit Javascript verbessert. Obwohl es derzeit möglich ist, jeden Aspekt von Lx-Office auch ohne Javascript zu benutzen, empfehlen wir es. In einer zukünftigen Version wird Javascript eventuell notwendig sein um weitergehende Features zu benutzen.',
 +  'A lower-case character is required.' => 'Ein Kleinbuchstabe ist vorgeschrieben.',
 +  'A special character is required (valid characters: #1).' => 'Ein Sonderzeichen ist vorgeschrieben (gültige Zeichen: #1).',
    'A temporary directory could not be created:' => 'Ein tempor&auml;res Verzeichnis konnte nicht erstellt werden:',
    'A temporary file could not be created. Please verify that the directory "#1" is writeable by the webserver.' => 'Eine temporäre Datei konnte nicht angelegt werden. Bitte stellen Sie sicher, dass das Verzeichnis "#1" vom Webserver beschrieben werden darf.',
    'A temporary file could not be created:' => 'Eine tempor&auml;re Datei konnte nicht erstellt werden:',
    'Amount'                      => 'Betrag',
    'Amount Due'                  => 'Betrag fällig',
    'Amount has to be greater then zero! Wrong row number: ' => 'Leere Eingabe oder Werte kleiner, gleich null eingegeben. Fehler in Reihe Nummer: ',
 +  'An invalid character was used (invalid characters: #1).' => 'Ein ungültiges Zeichen wurde benutzt (ungültige Zeichen: #1).',
 +  'An invalid character was used (valid characters: #1).' => 'Ein ungültiges Zeichen wurde benutzt (gültige Zeichen: #1).',
 +  'An upper-case character is required.' => 'Ein Großbuchstabe ist vorgeschrieben.',
    'Annotations'                 => 'Anmerkungen',
    'Another user with the login #1 does already exist.' => 'Es existiert bereits ein anderer Benutzer mit diesem Login.',
    'Ap aging on %s'              => 'Offene Verbindlichkeiten zum %s',
    'BOM'                         => 'Stückliste',
    'BWA'                         => 'BWA',
    'Back'                        => 'Zurück',
+   'Back to the login page'      => 'Zurück zur Loginseite',
    'Backup Dataset'              => 'Datenbank sichern',
    'Backup file'                 => 'Sicherungsdatei',
    'Backup of dataset'           => 'Sicherung der Datenbank',
    'Company Name'                => 'Firmenname',
    'Compare to'                  => 'Gegenüberstellen zu',
    'Configuration of individual TODO items' => 'Konfiguration f&uuml;r die einzelnen Aufgabenlistenpunkte',
 +  'Configure'                   => 'Konfigurieren',
    'Confirm'                     => 'Best&auml;tigen',
    'Confirm!'                    => 'Bestätigen Sie!',
    'Confirmation'                => 'Auftragsbestätigung',
    'Database Host'               => 'Datenbankcomputer',
    'Database User'               => 'Datenbankbenutzer',
    '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 backups and restorations are disabled in the configuration.' => 'Datenbanksicherungen und -wiederherstellungen sind in der Konfiguration deaktiviert.',
    'Database name'               => 'Datenbankname',
    'Database template'           => 'Datenbankvorlage',
    'Database update error:'      => 'Fehler beim Datenbankupgrade:',
    'Edit rights'                 => 'Rechte bearbeiten',
    'Edit templates'              => 'Vorlagen bearbeiten',
    'Edit the Delivery Order'     => 'Lieferschein bearbeiten',
 +  'Edit the configuration for periodic invoices' => 'Konfiguration für wiederkehrende Rechnungen 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',
    'Element disabled'            => 'Element deaktiviert',
    'Employee'                    => 'Bearbeiter',
    'Empty transaction!'          => 'Buchung ist leer!',
 +  'End date'                    => 'Enddatum',
    'Enter a description for this new draft.' => 'Geben Sie eine Beschreibung f&uuml;r diesen Entwurf ein.',
    'Enter longdescription'       => 'Langtext eingeben',
    'Enter the requested execution date or leave empty for the quickest possible execution:' => 'Geben Sie das jeweils gewünschte Ausführungsdatum an, oder lassen Sie das Feld leer für die schnellstmögliche Ausführung:',
    'Export date'                 => 'Exportdatum',
    'Export date from'            => 'Exportdatum von',
    'Export date to'              => 'Exportdatum bis',
 +  'Extend automatically by n months' => 'Automatische Verlängerung um x Monate',
    'Extended'                    => 'Gesamt',
    'Extension Of Time'           => 'Dauerfristverlängerung',
    'Factor'                      => 'Faktor',
    'Help Template Variables'     => 'Hilfe zu Dokumenten-Variablen',
    'Here\'s an example command line:' => 'Hier ist eine Kommandozeile, die als Beispiel dient:',
    'Hide by default'             => 'Standardm&auml;&szlig;ig verstecken',
 -  'History'                     => 'Historie',
    'History Search'              => 'Historien Suche',
    'History Search Engine'       => 'Historien Suchmaschine',
    'Homepage'                    => 'Homepage',
    'List Price'                  => 'Listenpreis',
    'List Price Factors'          => 'Preisfaktoren anzeigen',
    'List Pricegroups'            => 'Preisgruppen anzeigen',
-   'List Tax'                    => 'Bearbeiten',
    'List Transactions'           => 'Buchungsliste',
    'List Warehouses'             => 'Lager anzeigen',
    'List bank accounts'          => 'Bankkonten anzeigen',
    'Not done yet'                => 'Noch nicht fertig',
    'Not obsolete'                => 'Gültig',
    'Note'                        => 'Hinweis',
-   'Note: Taxkeys must have a "valid from" date, and will not behave correctly without.' => 'Hinweis: Steuerschlüssel sind fehlerhaft ohne gültiges "von Datum"',
+   'Note: Taxkeys must have a "valid from" date, and will not behave correctly without.' => 'Hinweis: Steuerschlüssel sind fehlerhaft ohne "Gültig ab" Datum',
    'Notes'                       => 'Bemerkungen',
    'Notes (will appear on hard copy)' => 'Bemerkungen',
    'Nothing has been selected for removal.' => 'Es wurde nichts f&uuml;r eine Entnahme ausgew&auml;hlt.',
    'Payment posted!'             => 'Zahlung gebucht!',
    'Payment terms deleted!'      => 'Zahlungskonditionen gelöscht!',
    'Payments'                    => 'Zahlungsausgänge',
 +  'Per. Inv.'                   => 'Wied. Rech.',
    'Period'                      => 'Zeitraum',
    'Period:'                     => 'Zeitraum:',
 +  'Periodic Invoices'           => 'Wiederkehrende Rechnungen',
 +  'Periodic invoices active'    => 'Wiederkehrende Rechnungen aktiv',
 +  'Periodic invoices inactive'  => 'Wiederkehrende Rechnungen inaktiv',
 +  'Periodicity'                 => 'Periodizität',
    'Personal settings'           => 'Pers&ouml;nliche Einstellungen',
    'Pg Database Administration'  => 'Datenbankadministration',
    'Phone'                       => 'Telefon',
    'Pricegroups'                 => 'Preisgruppen',
    'Print'                       => 'Drucken',
    'Print and Post'              => 'Drucken und Buchen',
 +  'Print automatically'         => 'Automatisch ausdrucken',
    'Print dunnings'              => 'Mahnungen drucken',
    'Print list'                  => 'Liste ausdrucken',
    'Print options'               => 'Druckoptionen',
    'Spoolfile'                   => 'Druckdatei',
    'Start Dunning Process'       => 'Mahnprozess starten',
    'Start analysis'              => 'Analyse beginnen',
 +  'Start date'                  => 'Startdatum',
    'Start the correction assistant' => 'Korrekturassistenten starten',
    'Startdate_coa'               => 'Gültig ab',
    'Starting Balance'            => 'Eröffnungsbilanzwerte',
    'Statement Balance'           => 'Sammelrechnungsbilanz',
    'Statement sent to'           => 'Sammelrechnung verschickt an',
    'Statements sent to printer!' => 'Sammelrechnungen an Drucker geschickt!',
 +  'Status'                      => 'Status',
    'Step 1 of 3: Parts'          => 'Schritt 1 von 3: Waren',
    'Step 2'                      => 'Schritt 2',
    'Step 2 of 3: Services'       => 'Schritt 2 von 3: Dienstleistungen',
    'The dunning process started' => 'Der Mahnprozess ist gestartet.',
    'The dunnings have been printed.' => 'Die Mahnung(en) wurden gedruckt.',
    'The email address is missing.' => 'Die Emailadresse fehlt.',
 +  'The end date is the last day for which invoices will possibly be created.' => 'Das Enddatum ist das letztmögliche Datum, an dem eine Rechnung erzeugt wird.',
    'The factor is missing in row %d.' => 'Der Faktor fehlt in Zeile %d.',
    'The factor is missing.'      => 'Der Faktor fehlt.',
    'The first reason is that Lx-Office contained a bug which resulted in the wrong taxkeys being recorded for transactions in which two entries are posted for the same chart with different taxkeys.' => 'Zum Einen gab es einen Bug in Lx-Office, der dazu führte, dass bei Buchungen mit verschiedenen Steuerschlüssel auf ein Konto teilweise falsche Steuerschlüssel gespeichert wurden.',
    '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 licensing module has been deactivated in the configuration.' => 'Das Lizenzverwaltungsmodul wurde in der Konfiguration 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 parts have been removed.' => 'Die Waren wurden aus dem Lager entnommen.',
    'The parts have been stocked.' => 'Die Artikel wurden eingelagert.',
    'The parts have been transferred.' => 'Die Waren wurden umgelagert.',
 +  'The password is too long (maximum length: #1).' => 'Das Passwort ist zu lang (maximale Länge: #1).',
 +  'The password is too short (minimum length: #1).' => 'Das Password ist zu kurz (minimale Länge: #1).',
 +  'The password is weak (e.g. it can be found in a dictionary).' => 'Das Passwort ist schwach (z.B. wenn es in einem Wörterbuch steht).',
    'The payments have been posted.' => 'Die Zahlungen wurden gebucht.',
    '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 selected bin does not exist.' => 'Der ausgew&auml;hlte Lagerplatz existiert nicht.',
    'The selected exports have been closed.' => 'Die ausgewählten Exporte wurden abgeschlossen.',
    'The selected warehouse does not exist.' => 'Das ausgew&auml;hlte Lager existiert nicht.',
-   'The selected warehouse is empty.' => 'Das ausgew&auml;hlte Lager ist leer.',
+   'The selected warehouse is empty, or no stocked items where found that match the filter settings.' => 'Das ausgewählte Lager ist leer, oder in ihm wurden keine zu den Sucheinstellungen passenden eingelagerten Artikel gefunden.',
    'The session is invalid or has expired.' => 'Sie sind von Lx-Office abgemeldet.',
 +  'The settings were saved, but the password was not changed.' => 'Die Einstellungen wurden gespeichert, aber das Passwort wurde nicht geändert.',
    'The source warehouse does not contain any bins.' => 'Das Quelllager enth&auml;lt keine Lagerpl&auml;tze.',
 +  'The start date is missing.'  => 'Das Startdatum fehlt.',
    'The subject is missing.'     => 'Der Betreff fehlt.',
    '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',
    '[email]'                     => '[email]',
    'account_description'         => 'Beschreibung',
    'accrual'                     => 'Bilanzierung (Soll-Versteuerung)',
 +  'active'                      => 'aktiv',
    'all entries'                 => 'alle Einträge',
    'ap_aging_list'               => 'liste_offene_verbindlichkeiten',
    'ar_aging_list'               => 'liste_offene_forderungen',
    'general_ledger_list'         => 'buchungsjournal',
    'history'                     => 'Historie',
    'history search engine'       => 'Historien Suchmaschine',
 +  'inactive'                    => 'inaktiv',
    'invoice'                     => 'Rechnung',
    'invoice_list'                => 'debitorenbuchungsliste',
    'lead deleted!'               => 'Kundenquelle gelöscht',
    'mark as paid'                => 'als bezahlt markieren',
    'missing'                     => 'Fehlbestand',
    'month'                       => 'Monatliche Abgabe',
 +  'monthly'                     => 'monatlich',
    'new Window'                  => 'neues Fenster',
    'no'                          => 'nein',
    'no bestbefore'               => 'keine Mindesthaltbarkeit',
    'no chargenumber'             => 'keine Chargennummer',
    'none (pricegroup)'           => 'keine',
 +  'not configured'              => 'nicht konfiguriert',
    'not executed'                => 'nicht ausgeführt',
    'not transferred in yet'      => 'noch nicht eingelagert',
    'not transferred out yet'     => 'noch nicht ausgelagert',
    'purchase_order'              => 'Auftrag',
    'purchase_order_list'         => 'lieferantenauftragsliste',
    'quarter'                     => 'Vierteljährliche (quartalsweise) Abgabe',
 +  'quarterly'                   => 'quartalsweise',
    'quotation_list'              => 'angebotsliste',
    'release_material'            => 'Materialausgabebe',
    'report_generator_dispatch_to is not defined.' => 'report_generator_dispatch_to ist nicht definiert.',
    'tax_taxdescription'          => 'Steuername',
    'tax_taxkey'                  => 'Steuerschlüssel',
    'taxnumber'                   => 'Automatikkonto',
 +  'terminated'                  => 'gekündigt',
    'to (date)'                   => 'bis',
    'to (time)'                   => 'bis',
    'transfer'                    => 'Umlagerung',
    'warehouse_journal_list'      => 'lagerbuchungsliste',
    'warehouse_report_list'       => 'lagerbestandsliste',
    'wrongformat'                 => 'Falsches Format',
 +  'yearly'                      => 'jährlich',
    'yes'                         => 'ja',
  };
  
diff --combined locale/de_DE/all
@@@ -38,12 -38,9 +38,12 @@@ $self->{texts} = 
    '4. Quarter'                  => '4. Quartal',
    '<b>What</b> do you want to look for?' => '<b>Wonach</b> wollen Sie suchen?',
    'A Buchungsgruppe consists of a descriptive name and the account numbers for the income and expense accounts for those four tax zones as well as the inventory account number.' => 'Eine Buchungsgruppe besteht aus einem deskriptiven Namen, den Erl&ouml;s- und Aufwandskonten f&uuml;r diese vier Steuerzonen sowie aus einem Inventarkonto.',
 +  'A digit is required.'        => '',
    'A group named &quot;Full Access&quot; has been created.' => 'Eine Gruppe namens &quot;Vollzugriff&quot; wurde angelegt.',
    'A group with that name does already exist.' => 'Eine Gruppe mit diesem Namen gibt es bereits.',
    'A lot of the usability of Lx-Office has been enhanced with javascript. Although it is currently possible to use every aspect of Lx-Office without javascript, we strongly recommend it. In a future version this may change and javascript may be necessary to access advanced features.' => 'Die Bedienung von Lx-Office wurde an vielen Stellen mit Javascript verbessert. Obwohl es derzeit möglich ist, jeden Aspekt von Lx-Office auch ohne Javascript zu benutzen, empfehlen wir es. In einer zukünftigen Version wird Javascript eventuell notwendig sein um weitergehende Features zu benutzen.',
 +  'A lower-case character is required.' => '',
 +  'A special character is required (valid characters: #1).' => '',
    'A temporary directory could not be created:' => 'Ein tempor&auml;res Verzeichnis konnte nicht erstellt werden:',
    'A temporary file could not be created. Please verify that the directory "#1" is writeable by the webserver.' => 'Eine temporäre Datei konnte nicht angelegt werden. Bitte stellen Sie sicher, dass das Verzeichnis "#1" vom Webserver beschrieben werden darf.',
    'A temporary file could not be created:' => 'Eine tempor&auml;re Datei konnte nicht erstellt werden:',
    'Amount'                      => 'Betrag',
    'Amount Due'                  => 'Betrag fällig',
    'Amount has to be greater then zero! Wrong row number: ' => '"Betrag" muss größer Null sein. Fehlerhafte Zeile: ',
 +  'An invalid character was used (invalid characters: #1).' => '',
 +  'An invalid character was used (valid characters: #1).' => '',
 +  'An upper-case character is required.' => '',
    'Annotations'                 => 'Hilfe',
    'Another user with the login #1 does already exist.' => 'Es existiert bereits ein anderer Benutzer mit diesem Login.',
    'Ap aging on %s'              => 'Offene Verbindlichkeiten zum %s',
    'Company Name'                => 'Firmenname',
    'Compare to'                  => 'Gegenüberstellen zu',
    'Configuration of individual TODO items' => 'Konfiguration f&uuml;r die einzelnen Aufgabenlistenpunkte',
 +  'Configure'                   => '',
    'Confirm'                     => 'Best&auml;tigen',
    'Confirm!'                    => 'Bestätigen Sie!',
    'Confirmation'                => 'Auftragsbestätigung',
    'Database Host'               => 'Datenbankcomputer',
    'Database User'               => 'Datenbankbenutzer',
    '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 backups and restorations are disabled in the configuration.' => 'Datenbanksicherungen und -wiederherstellungen sind in der Konfiguration deaktiviert.',
    'Database name'               => 'Datenbankname',
    'Database template'           => 'Datenbankvorlage',
    'Database update error:'      => 'Fehler beim Datenbankupgrade:',
    'Edit rights'                 => 'Rechte bearbeiten',
    'Edit templates'              => 'Vorlagen bearbeiten',
    'Edit the Delivery Order'     => 'Lieferschein bearbeiten',
 +  'Edit the configuration for periodic invoices' => '',
    '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',
    'Element disabled'            => 'Element deaktiviert',
    'Employee'                    => 'Bearbeiter',
    'Empty transaction!'          => 'Buchung ist leer!',
 +  'End date'                    => '',
    'Enter a description for this new draft.' => 'Geben Sie eine Beschreibung f&uuml;r diesen Entwurf ein.',
    'Enter longdescription'       => 'Langtext eingeben',
    'Enter the requested execution date or leave empty for the quickest possible execution:' => 'Geben Sie das jeweils gewünschte Ausführungsdatum an, oder lassen Sie das Feld leer für die schnellstmögliche Ausführung:',
    'Export date'                 => 'Exportdatum',
    'Export date from'            => 'Exportdatum von',
    'Export date to'              => 'Exportdatum bis',
 +  'Extend automatically by n months' => '',
    'Extended'                    => 'Gesamt',
    'Extension Of Time'           => 'Dauerfristverlängerung',
    'Factor'                      => 'Faktor',
    'Help Template Variables'     => 'Hilfe zu Dokumenten-Variablen',
    'Here\'s an example command line:' => 'Hier ist eine Kommandozeile, die als Beispiel dient:',
    'Hide by default'             => 'Standardm&auml;&szlig;ig verstecken',
 -  'History'                     => 'Historie',
    'History Search'              => 'Historien Suche',
    'History Search Engine'       => 'Historien Suchmaschine',
    'Homepage'                    => 'Homepage',
    'List Price'                  => 'Listenpreis',
    'List Price Factors'          => 'Preisfaktoren anzeigen',
    'List Pricegroups'            => 'Preisgruppen anzeigen',
-   'List Tax'                    => 'Bearbeiten',
    'List Transactions'           => 'Buchungsliste',
    'List Warehouses'             => 'Lager anzeigen',
    'List bank accounts'          => 'Bankkonten anzeigen',
    'Not done yet'                => 'Noch nicht fertig',
    'Not obsolete'                => 'Gültig',
    'Note'                        => 'Hinweis',
-   'Note: Taxkeys must have a "valid from" date, and will not behave correctly without.' => 'Hinweis: Steuerschlüssel sind fehlerhaft ohne gültiges "von Datum"',
+   'Note: Taxkeys must have a "valid from" date, and will not behave correctly without.' => 'Hinweis: Steuerschlüssel sind fehlerhaft ohne "Gültig ab" Datum',
    'Notes'                       => 'Notizen',
    'Notes (will appear on hard copy)' => 'Hinweise (erscheinen auf Ausdruck)',
    'Nothing has been selected for removal.' => 'Es wurde nichts f&uuml;r eine Entnahme ausgew&auml;hlt.',
    'Payment posted!'             => 'Zahlung gebucht!',
    'Payment terms deleted!'      => 'Zahlungskonditionen gelöscht!',
    'Payments'                    => 'Zahlungsausgänge',
 +  'Per. Inv.'                   => '',
    'Period'                      => 'Zeitraum',
    'Period:'                     => 'Zeitraum:',
 +  'Periodic Invoices'           => '',
 +  'Periodic invoices active'    => '',
 +  'Periodic invoices inactive'  => '',
 +  'Periodicity'                 => '',
    'Personal settings'           => 'Meine Daten',
    'Pg Database Administration'  => 'Datenbankadministration',
    'Phone'                       => 'Telefon',
    'Pricegroups'                 => 'Preisgruppen',
    'Print'                       => 'Drucken',
    'Print and Post'              => 'Drucken und Buchen',
 +  'Print automatically'         => '',
    'Print dunnings'              => 'Mahnungen drucken',
    'Print list'                  => 'Liste ausdrucken',
    'Print options'               => 'Drucken',
    'Spoolfile'                   => 'Druckdatei',
    'Start Dunning Process'       => 'Neue Mahnung',
    'Start analysis'              => 'Analyse beginnen',
 +  'Start date'                  => '',
    'Start the correction assistant' => 'Korrekturassistenten starten',
    'Startdate_coa'               => 'Gültig ab',
    'Starting Balance'            => 'Eröffnungsbilanzwerte',
    'Statement Balance'           => 'Sammelrechnungsbilanz',
    'Statement sent to'           => 'Sammelrechnung verschickt an',
    'Statements sent to printer!' => 'Sammelrechnungen an Drucker geschickt!',
 +  'Status'                      => '',
    'Step 1 of 3: Parts'          => 'Schritt 1 von 3: Waren',
    'Step 2'                      => 'Schritt 2',
    'Step 2 of 3: Services'       => 'Schritt 2 von 3: Dienstleistungen',
    'The dunning process started' => 'Der Mahnprozess ist gestartet.',
    'The dunnings have been printed.' => 'Die Mahnung(en) wurden gedruckt.',
    'The email address is missing.' => 'Die Emailadresse fehlt.',
 +  'The end date is the last day for which invoices will possibly be created.' => '',
    'The factor is missing in row %d.' => 'Der Faktor fehlt in Zeile %d.',
    'The factor is missing.'      => 'Der Faktor fehlt.',
    'The first reason is that Lx-Office contained a bug which resulted in the wrong taxkeys being recorded for transactions in which two entries are posted for the same chart with different taxkeys.' => 'Zum Einen gab es einen Bug in Lx-Office, der dazu führte, dass bei Buchungen mit verschiedenen Steuerschlüssel auf ein Konto teilweise falsche Steuerschlüssel gespeichert wurden.',
    '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 licensing module has been deactivated in the configuration.' => 'Das Lizenzverwaltungsmodul wurde in der Konfiguration 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 parts have been removed.' => 'Die Waren wurden aus dem Lager entnommen.',
    'The parts have been stocked.' => 'Die Artikel wurden eingelagert.',
    'The parts have been transferred.' => 'Die Waren wurden umgelagert.',
 +  'The password is too long (maximum length: #1).' => '',
 +  'The password is too short (minimum length: #1).' => '',
 +  'The password is weak (e.g. it can be found in a dictionary).' => '',
    'The payments have been posted.' => 'Die Zahlungen wurden gebucht.',
    '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 selected warehouse does not exist.' => 'Das ausgew&auml;hlte Lager existiert nicht.',
    'The selected warehouse is empty.' => 'Das ausgew&auml;hlte Lager ist leer.',
    'The session is invalid or has expired.' => 'Sie sind von Lx-Office abgemeldet.',
 +  'The settings were saved, but the password was not changed.' => '',
    'The source warehouse does not contain any bins.' => 'Das Quelllager enth&auml;lt keine Lagerpl&auml;tze.',
 +  'The start date is missing.'  => '',
    'The subject is missing.'     => 'Der Betreff fehlt.',
    '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',
    'Warehouse management'        => 'Lagerverwaltung/Bestandsveränderung',
    'Warehouse saved.'            => 'Lager gespeichert.',
    'Warehouses'                  => 'Lager',
-   'Warning'                     => '',
+   'Warning'                     => 'Warnung',
    'Warnings during template upgrade' => 'Warnungen bei Aktualisierung der Dokumentenvorlagen',
    'WebDAV link'                 => 'WebDAV-Link',
    'Weight'                      => 'Gewicht',
    '[email]'                     => '[email]',
    'account_description'         => 'Beschreibung',
    'accrual'                     => 'Bilanzierung (Soll-Versteuerung)',
 +  'active'                      => '',
    'all entries'                 => 'alle Einträge',
    'ap_aging_list'               => 'liste_offene_verbindlichkeiten',
    'ar_aging_list'               => 'liste_offene_forderungen',
    'general_ledger_list'         => 'buchungsjournal',
    'history'                     => 'Historie',
    'history search engine'       => 'Historien Suchmaschine',
 +  'inactive'                    => '',
    'invoice'                     => 'Rechnung',
    'invoice_list'                => 'debitorenbuchungsliste',
    'lead deleted!'               => 'Kundenquelle gelöscht',
    'mark as paid'                => 'als bezahlt markieren',
    'missing'                     => 'Fehlbestand',
    'month'                       => 'Monatliche Abgabe',
 +  'monthly'                     => '',
    'new Window'                  => 'neues Fenster',
    'no'                          => 'nein',
    'no bestbefore'               => 'keine Mindesthaltbarkeit',
    'no chargenumber'             => 'keine Chargennummer',
    'none (pricegroup)'           => 'keine',
 +  'not configured'              => '',
    'not executed'                => 'nicht ausgeführt',
    'not transferred in yet'      => 'noch nicht eingelagert',
    'not transferred out yet'     => 'noch nicht ausgelagert',
    'purchase_order'              => 'Auftrag',
    'purchase_order_list'         => 'lieferantenauftragsliste',
    'quarter'                     => 'Vierteljährliche (quartalsweise) Abgabe',
 +  'quarterly'                   => '',
    'quotation_list'              => 'angebotsliste',
    'release_material'            => 'Materialausgabebe',
    'report_generator_dispatch_to is not defined.' => 'report_generator_dispatch_to ist nicht definiert.',
    'tax_taxdescription'          => 'Steuername',
    'tax_taxkey'                  => 'Steuerschlüssel',
    'taxnumber'                   => 'Automatikkonto',
 +  'terminated'                  => '',
    'to (date)'                   => 'bis',
    'to (time)'                   => 'bis',
    'transfer'                    => 'Umlagerung',
    'warehouse_journal_list'      => 'lagerbuchungsliste',
    'warehouse_report_list'       => 'lagerbestandsliste',
    'wrongformat'                 => 'Falsches Format',
 +  'yearly'                      => '',
    'yes'                         => 'ja',
  };