$main::lxdebug->message(LXDebug->DEBUG1, "Auth::dbconnect DSN: $dsn");
- $self->{dbh} = DBI->connect($dsn, $cfg->{user}, $cfg->{password}, { 'AutoCommit' => 0 });
+ $self->{dbh} = DBI->connect($dsn, $cfg->{user}, $cfg->{password}, { pg_enable_utf8 => $::locale->is_utf8, AutoCommit => 0 });
if (!$may_fail && !$self->{dbh}) {
$main::form->error($main::locale->text('The connection to the authentication database failed:') . "\n" . $DBI::errstr);
$main::lxdebug->message(LXDebug->DEBUG1(), "Auth::create_database DSN: $dsn");
- my $dbh = DBI->connect($dsn, $params{superuser}, $params{superuser_password});
-
- if (!$dbh) {
- $main::form->error($main::locale->text('The connection to the template database failed:') . "\n" . $DBI::errstr);
- }
-
my $charset = $main::dbcharset;
$charset ||= Common::DEFAULT_CHARSET;
my $encoding = $Common::charset_to_db_encoding{$charset};
$encoding ||= 'UNICODE';
+ my $dbh = DBI->connect($dsn, $params{superuser}, $params{superuser_password}, { pg_enable_utf8 => $charset =~ m/^utf-?8$/i });
+
+ if (!$dbh) {
+ $main::form->error($main::locale->text('The connection to the template database failed:') . "\n" . $DBI::errstr);
+ }
+
my $query = qq|CREATE DATABASE "$cfg->{db}" OWNER "$cfg->{user}" TEMPLATE "$params{template}" ENCODING '$encoding'|;
$main::lxdebug->message(LXDebug->DEBUG1(), "Auth::create_database query: $query");
do_statement($form, $sth, $query, @values);
- unless ($params{always_valid}) {
- $self->save_custom_variables_validity(trans_id => $params{trans_id}, config_id => $config->{id},
- validity => ($params{variables}->{"$params{name_prefix}cvar_$config->{name}$params{name_postfix}_valid"} ? 1 : 0)
- );
- };
+ my $valid_index = "$params{name_prefix}cvar_$config->{name}$params{name_postfix}_valid";
+ $self->save_custom_variables_validity(trans_id => $params{trans_id}, config_id => $config->{id},
+ validity => ($params{variables}{$valid_index} || $params{always_valid} ? 1 : 0)
+ );
}
$sth->finish();
}
while ($query =~ /\?/) {
- my $value = shift(@_);
+ my $value = shift || '';
$value =~ s/\'/\\\'/g;
$value = "'${value}'";
$query =~ s/\?/$value/;
my ($form, $dbh, $query) = splice(@_, 0, 3);
- my $sth = prepare_execute_query($form, $dbh, $query, @_);
- my $result = [];
- while (my $ref = $sth->fetchrow_hashref()) {
- push(@{ $result }, $ref);
- }
- $sth->finish();
+ dump_query(LXDebug->QUERY(), '', $query, @_);
+
+ # this works back 'til at least DBI 1.46 on perl 5.8.4 on Debian Sarge (2004)
+ my $result = $dbh->selectall_arrayref($query, { Slice => {} }, @_)
+ or $form->dberror($query . (@_ ? " (" . join(", ", @_) . ")" : ''));
$main::lxdebug->leave_sub(2);
%::myconfig = ();
%::called_subs = (); # currently used for recursion detection
}
+
+ $SIG{__WARN__} = sub {
+ $::lxdebug->warn(@_);
+ }
}
sub pre_startup_checks {
$self->{action} = lc $self->{action};
$self->{action} =~ s/( |-|,|\#)/_/g;
- $self->{version} = "2.6.1";
+ #$self->{version} = "2.6.1"; # Old hardcoded but secure style
+ open VERSION_FILE, "VERSION"; # New but flexible code reads version from VERSION-file
+ $self->{version} = <VERSION_FILE>;
+ close VERSION_FILE;
+ $self->{version} =~ s/[^0-9A-Za-z\.\_\-]//g; # only allow numbers, letters, points, underscores and dashes. Prevents injecting of malicious code.
$main::lxdebug->leave_sub();
if (!$self->{header}) {
$self->header;
- print qq|
- <body>|;
+ print qq|<body>|;
}
print qq|
-
- <p><b>$msg</b>
+ <p class="message_ok"><b>$msg</b></p>
+
+ <script type="text/javascript">
+ <!--
+ // If JavaScript is enabled, the whole thing will be reloaded.
+ // The reason is: When one changes his menu setup (HTML / XUL / CSS ...)
+ // it now loads the correct code into the browser instead of do nothing.
+ setTimeout("top.frames.location.href='login.pl'",500);
+ //-->
+ </script>
+
+</body>
|;
} else {
</script>
| if $self->{"fokus"};
+ # if there is a title, we put some JavaScript in to the page, wich writes a
+ # meaningful title-tag for our frameset.
+ my $title_hack;
+ if ($self->{"title"}){
+ $title_hack = qq|
+ <script type="text/javascript">
+ <!--
+ // Write a meaningful title-tag for our frameset.
+ top.document.title="| . $self->{"title"} . qq| - | . $self->{"login"} . qq| - | . $::myconfig{dbname} . qq| - Ver. | . $self->{"version"} . qq|";
+ //-->
+ </script>
+ |;
+ }
+
#Set Calendar
my $jsscript = "";
if ($self->{jsscript} == 1) {
$favicon
$jsscript
$ajax
-
$fokus
-
+ $title_hack
+
<link rel="stylesheet" href="css/jquery.autocomplete.css" type="text/css" />
<meta name="robots" content="noindex,nofollow" />
use strict;
+BEGIN {
@required_modules = (
- { name => "Archive::Zip", url => "http://search.cpan.org/~adamk/" },
- { name => "Class::Accessor", url => "http://search.cpan.org/~kasei/" },
- { name => "CGI::Ajax", url => "http://search.cpan.org/~bct/" },
- { name => "DBI", url => "http://search.cpan.org/~timb/" },
- { name => "DBD::Pg", url => "http://search.cpan.org/~dbdpg/" },
- { name => "Email::Address", url => "http://search.cpan.org/~rjbs/" },
- { name => "FCGI", url => "http://search.cpan.org/~mstrout/" },
- { name => "IO::Wrap", url => "http://search.cpan.org/~dskoll/" },
- { name => "List::MoreUtils", url => "http://search.cpan.org/~vparseval/" },
- { name => "PDF::API2", url => "http://search.cpan.org/~areibens/" },
- { name => "Template", url => "http://search.cpan.org/~abw/" },
- { name => "Text::CSV_XS", url => "http://search.cpan.org/~hmbrand/" },
- { name => "Text::Iconv", url => "http://search.cpan.org/~mpiotr/" },
- { name => "URI", url => "http://search.cpan.org/~gaas/" },
- { name => "XML::Writer", url => "http://search.cpan.org/~josephw/" },
- { name => "YAML", url => "http://search.cpan.org/~ingy/" },
+ { name => "parent", url => "http://search.cpan.org/~corion/" },
+ { name => "Archive::Zip", url => "http://search.cpan.org/~adamk/" },
+ { name => "Class::Accessor", url => "http://search.cpan.org/~kasei/" },
+ { name => "CGI::Ajax", url => "http://search.cpan.org/~bct/" },
+ { name => "DateTime", url => "http://search.cpan.org/~drolsky/" },
+ { name => "DBI", url => "http://search.cpan.org/~timb/" },
+ { name => "DBD::Pg", url => "http://search.cpan.org/~dbdpg/" },
+ { name => "Email::Address", url => "http://search.cpan.org/~rjbs/" },
+ { name => "FCGI", url => "http://search.cpan.org/~mstrout/" },
+ { name => "IO::Wrap", url => "http://search.cpan.org/~dskoll/" },
+ { name => "List::MoreUtils", url => "http://search.cpan.org/~vparseval/" },
+ { name => "PDF::API2", url => "http://search.cpan.org/~areibens/" },
+ { name => "Template", version => '2.18', url => "http://search.cpan.org/~abw/" },
+ { name => "Text::CSV_XS", url => "http://search.cpan.org/~hmbrand/" },
+ { name => "Text::Iconv", url => "http://search.cpan.org/~mpiotr/" },
+ { name => "URI", url => "http://search.cpan.org/~gaas/" },
+ { name => "XML::Writer", url => "http://search.cpan.org/~josephw/" },
+ { name => "YAML", url => "http://search.cpan.org/~ingy/" },
);
@optional_modules = ();
+$_->{fullname} = join ' ', grep $_, @$_{qw(name version)}
+ for @required_modules, @optional_modules;
+}
+
sub module_available {
- my ($module) = @_;
+ my $module = $_[0];
+ my $version = $_[1] || '' ;
- if (!defined(eval("require $module;"))) {
- return 0;
- } else {
- return 1;
- }
+ return eval "use $module $version; 1";
}
my %conditional_dependencies;
sub check_for_conditional_dependencies {
- if (!$conditional_dependencies{net_ldap}) {
- $conditional_dependencies{net_ldap} = 1;
-
- my $in = IO::File->new('config/authentication.pl', 'r');
- if ($in) {
- my $self = {};
- my $code;
-
- while (my $line = <$in>) {
- $code .= $line;
- }
- $in->close();
-
- eval $code;
+ return if $conditional_dependencies{net_ldap}++;
- if (! $EVAL_ERROR) {
+ my $self = {};
+ eval do { local (@ARGV, $/) = 'config/authentication.pl'; <> } or return;
- if ($self->{module} && ($self->{module} eq 'LDAP')) {
- push @required_modules, { 'name' => 'Net::LDAP', 'url' => 'http://search.cpan.org/~gbarr/' };
- }
- }
- }
- }
+ push @required_modules, { 'name' => 'Net::LDAP', 'url' => 'http://search.cpan.org/~gbarr/' }
+ if $self->{module} && ($self->{module} eq 'LDAP');
}
sub test_all_modules {
use constant TRACE => 1 << 4;
use constant BACKTRACE_ON_ERROR => 1 << 5;
use constant REQUEST_TIMER => 1 << 6;
-use constant ALL => (1 << 7) - 1;
+use constant WARN => 1 << 7;
+use constant ALL => (1 << 8) - 1;
use constant DEVEL => INFO | QUERY | TRACE | BACKTRACE_ON_ERROR | REQUEST_TIMER;
use constant FILE_TARGET => 0;
}
sub enter_sub {
- my ($self, $level) = @_;
- $level *= 1;
+ my $self = shift;
+ my $level = shift || 0;
return 1 unless ($global_level & TRACE); # ignore if traces aren't active
return 1 if $level && !($global_level & $level); # ignore if level of trace isn't active
}
sub leave_sub {
- my ($self, $level) = @_;
- $level *= 1;
+ my $self = shift;
+ my $level = shift || 0;
return 1 unless ($global_level & TRACE); # ignore if traces aren't active
return 1 if $level && !($global_level & $level); # ignore if level of trace isn't active
}
sub message {
+ no warnings;
my ($self, $level, $message) = @_;
$self->_write(level2string($level), $message) if (($self->{"level"} | $global_level) & $level || !$level);
}
+sub warn {
+ no warnings;
+ my ($self, $message) = @_;
+ $self->message(WARN, $message);
+}
sub dump {
my ($self, $level, $name, $variable) = @_;
}
sub _write {
+ no warnings;
my ($self, $prefix, $message) = @_;
my $date = strftime("%Y-%m-%d %H:%M:%S $$ [" . getppid() . "] ${prefix}: ", localtime(time()));
local *FILE;
}
sub level2string {
+ no warnings;
# use $_[0] as a bit mask and return levelstrings separated by /
- join '/', qw(info debug1 debug2 query trace error_call_trace)[ grep { (reverse split //, sprintf "%05b", $_[0])[$_] } 0..5 ]
+ join '/', qw(info debug1 debug2 query trace error_call_trace request_timer WARNING)[ grep { (reverse split //, sprintf "%08b", $_[0])[$_] } 0..7 ]
}
sub begin_request {
CVar->save_custom_variables('dbh' => $dbh,
'module' => 'Projects',
'trans_id' => $params{id},
- 'variables' => $form);
+ 'variables' => $form,
+ 'always_valid' => 1);
$dbh->commit();
package SL::Template::Excel;
+use strict;
use parent qw(SL::Template::Simple);
sub new {
package SL::Template::Plugin::T8;
+use strict;
+
use Template::Plugin::Filter;
use base qw( Template::Plugin::Filter );
taxzones => "ALL_TAXZONES");
$form->get_pricegroup(\%myconfig, { all => 1 });
- $form->get_lists(customers => { key => "ALL_SALESMAN_CUSTOMERS", business_is_salesman => 1, with_obsolete => 1 }) if $::vertreter;
+ $form->get_lists(customers => { key => "ALL_SALESMAN_CUSTOMERS", business_is_salesman => 1 }) if $::vertreter;
$form->{ALL_SALESMEN} = $form->{ALL_EMPLOYEES};
$form->{taxincluded} = ($form->{taxincluded}) ? "checked" : "";
$main::lxdebug->leave_sub();
}
+sub _do_save {
+ $main::auth->assert('customer_vendor_edit & ' .
+ '(general_ledger | invoice_edit | vendor_invoice_edit | ' .
+ ' request_quotation_edit | sales_quotation_edit | sales_order_edit | purchase_order_edit)');
+
+ $::form->isblank("name", $::locale->text("Name missing!"));
+
+ if ($::form->{new_salesman_id} && $::vertreter) {
+ $::form->{salesman_id} = $::form->{new_salesman_id};
+ delete $::form->{new_salesman_id};
+ }
+
+ my $res = $::form->{db} eq 'customer' ? CT->save_customer(\%::myconfig, $::form) : CT->save_vendor(\%::myconfig, $::form);
+
+ if (3 == $res) {
+ if ($::form->{"db"} eq "customer") {
+ $::form->error($::locale->text('This customer number is already in use.'));
+ } else {
+ $::form->error($::locale->text('This vendor number is already in use.'));
+ }
+ }
+}
+
sub add_transaction {
$main::lxdebug->enter_sub();
# }
# # /saving the history
- $form->isblank("name", $locale->text("Name missing!"));
- if ($form->{"db"} eq "customer") {
- CT->save_customer(\%myconfig, \%$form);
- } else {
- CT->save_vendor(\%myconfig, \%$form);
- }
+ _do_save();
$form->{callback} = $form->escape($form->{callback}, 1);
my $name = $form->escape("$form->{name}", 1);
my $msg = ucfirst $form->{db};
$msg .= " saved!";
- $form->isblank("name", $locale->text("Name missing!"));
- my $rc;
- if ($form->{"db"} eq "customer") {
- $rc = CT->save_customer(\%myconfig, \%$form);
- } else {
- $rc = CT->save_vendor(\%myconfig, \%$form);
- }
- if ($rc == 3) {
- $form->error($locale->text('customernumber not unique!'));
- }
+ _do_save();
+
# saving the history
if(!exists $form->{addition}) {
$form->{snumbers} = ($form->{"db"} eq "customer" ? qq|customernumber_| . $form->{customernumber} : qq|vendornumber_| . $form->{vendornumber});
my $msg = ucfirst $form->{db};
$msg .= " saved!";
- $form->isblank("name", $locale->text("Name missing!"));
-
- my $res;
- if ($form->{"db"} eq "customer") {
- $res = CT->save_customer(\%myconfig, \%$form);
- } else {
- $res = CT->save_vendor(\%myconfig, \%$form);
- }
+ _do_save();
- if (3 == $res) {
- if ($form->{"db"} eq "customer") {
- $form->error($locale->text('This customer number is already in use.'));
- } else {
- $form->error($locale->text('This vendor number is already in use.'));
- }
- }
# saving the history
if(!exists $form->{addition}) {
$form->{snumbers} = ($form->{"db"} eq "customer" ? qq|customernumber_| . $form->{customernumber} : qq|vendornumber_| . $form->{vendornumber});
$auth->assert('part_service_assembly_edit');
- $form->{title} = $locale->text('Add ' . ucfirst $form->{item});
+ my $title = 'Add ' . ucfirst $form->{item};
+ $form->{title} = $locale->text($title);
$form->{callback} = "$form->{script}?action=add&item=$form->{item}" unless $form->{callback};
$form->{unit_changeable} = 1;
my $pricegroups = IC->get_pricegroups(\%myconfig, \%$form);
+ $form->{title} = $locale->text('Update Prices');
+
$form->header;
print $form->parse_html_template('ic/search_update_prices', { PRICE_ROWS => $pricegroups });
$form->{"original_partnumber"} = $form->{"partnumber"};
- $form->{title} = $locale->text('Edit ' . ucfirst $form->{item});
+ my $title = 'Edit ' . ucfirst $form->{item};
+ $form->{title} = $locale->text($title);
&link_part;
&display_form;
# any custom scripts for this one
if (-f "bin/mozilla/custom_invoice_io.pl") {
- eval { require "bin/mozilla/custom_ivvoice_io.pl"; };
+ eval { require "bin/mozilla/custom_invoice_io.pl"; };
}
if (-f "bin/mozilla/$main::form->{login}_invoice_io.pl") {
eval { require "bin/mozilla/$main::form->{login}_invoice_io.pl"; };
$name = $wert;
}
my $login =
- "[" . $form->{login}
- . " - <a href=\"login.pl?action=logout\" target=\"_top\">"
+ "". $locale->text('User') . ": " . $form->{login}
+ . " [<a href=\"login.pl?action=logout\" target=\"_top\" title=\"". $locale->text('Logout now') . "\">"
. $locale->text('Logout')
. "</a>] ";
my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat,
|;
#
+my $framesize = _calc_framesize(); # framesize calculation as in menu.pl is only a quick and dirty hack here
+ # it would be better to use a global or config variable
+
print qq|
<body bgcolor="#ffffff" text="#ffffff" link="#ffffff" vlink="#ffffff" alink="#ffffff" topmargin="0" leftmargin="0" marginwidth="0" marginheight="0" style="background-image: url('image/fade.png'); background-repeat:repeat-x;">
-
+<script language='JavaScript' src='js/switchmenuframe.js'></script>
<table border="0" width="100%" background="image/bg_titel.gif" cellpadding="0" cellspacing="0">
<tr>
<td style="color:white; font-family:verdana,arial,sans-serif; font-size: 12px;">
+ [<a href="JavaScript:Switch_Menu(|.$framesize.qq|);" title="| . $locale->text('Switch Menu on / off') . qq|">| . $locale->text('Menu') . qq|</a>]
+ [<a HREF="login.pl" target="_blank" title="| . $locale->text('Open a further Lx-Office Window or Tab') . qq|">| . $locale->text('New Win/Tab') . qq|</a>]
[<a href="JavaScript:top.main_window.print();" title="| . $locale->text('Hardcopy') . qq|">| . $locale->text('Print') . qq|</a>]
- [<a HREF="login.pl" target="_blank" "title="| . $locale->text('Open a further Lx-Office Window or Tab') . qq|">| . $locale->text('New Win/Tab') . qq|</a>]
[<a href="Javascript:top.main_window.history.back();" title="| . $locale->text('Go one step back') . qq|">| . $locale->text('Back') . qq|</a>]
- <!-- is there a better solution for Back? Possibly with the callback variable? -->
+ [<a href="Javascript:top.main_window.history.forward();" title="| . $locale->text('Go one step forward') . qq|">| . $locale->text('Fwd') . qq|</a>]
+ <!-- is there any better solution for Back? Possibly with the callback variable? -->
</td>
<td align="right" style="vertical-align:middle; color:white; font-family:verdana,arial,sans-serif; font-size: 12px;" nowrap>|
. $login . $datum . qq| <script>writeclock()</script>
</html>
|;
+sub _calc_framesize {
+ my $is_lynx_browser = $ENV{HTTP_USER_AGENT} =~ /links/i;
+ my $is_mobile_browser = $ENV{HTTP_USER_AGENT} =~ /mobile/i;
+ my $is_mobile_style = $::form->{stylesheet} =~ /mobile/i;
+
+ return $is_mobile_browser && $is_mobile_style ? 130
+ : $is_lynx_browser ? 240
+ : 180;
+}
+
}
1;
my $form = $main::form;
my $locale = $main::locale;
+ $form->{title} = $locale->text('Add License');
+
if (!$main::lizenzen) {
$form->error(
$locale->text(
my $form = $main::form;
my $locale = $main::locale;
+ $form->{title} = $locale->text('Licenses');
+
if (!$main::lizenzen) {
$form->error(
$locale->text(
$form->{todo_list} = create_todo_list('login_screen' => 1) if (!$form->{no_todo_list});
$form->{stylesheet} = $myconfig{stylesheet};
- $form->{title} = $::locale->text('About');
+ $form->{title} = $::locale->text('Lx-Office');
# create the logo screen
$form->header() unless $form->{noheader};
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#######################################################################
#
-# thre frame layout with refractured menu
+# the frame layout with refractured menu
#
# CHANGE LOG:
# DS. 2002-03-25 Created
# 2004-12-14 - New Optik - Marco Welter <mawe@linux-studio.de>
+# 2010-08-19 - Icons for sub entries and one click
+# JS switchable HTML-menu - Sven Donath <lxo@dexo.de>
#######################################################################
use strict;
print qq|
<frameset rows="28px,*" cols="*" framespacing="0" frameborder="0">
<frame src="kopf.pl" name="kopf" scrolling="NO">
- <frameset cols="$framesize,*" framespacing="0" frameborder="0" border="0" >
+ <frameset cols="$framesize,*" framespacing="0" frameborder="0" border="0" id="menuframe" name="menuframe">
<frame src="$form->{script}?action=acc_menu" name="acc_menu" scrolling="auto" noresize marginwidth="0">
<frame src="$callback" name="main_window" scrolling="auto">
</frameset>
my $form = $main::form;
my $locale = $main::locale;
- my $framesize = _calc_framesize();
+ my $framesize = _calc_framesize(); # how to get it into kopf.pl or vice versa?
$mainlevel = $form->{level};
$mainlevel =~ s/\Q$mainlevel\E--//g;
my $menu = Menu->new($::menufile);
- $form->{title} = $locale->text('Accounting Menu');
+ $form->{title} = $locale->text('Lx-Office');
$form->header;
|;
print qq|<div align="left">\n<table width="|
. $framesize
- . qq|" border=0>\n|;
+ . qq|" border="0">\n|;
§ion_menu($menu);
$ml =~ s/--.*//;
if ($ml eq $mainlevel) { $zeige = 1; }
else { $zeige = 0; }
- my $spacer = " " x (($item =~ s/--/--/g) * 1);
+ my $spacer = " " x (($item =~ s/--/--/g) * 2);
$label =~ s/.*--//g;
- my $label_icon = $label . ".gif";
+ my $label_icon = $level . "--" . $label . ".png";
my $mlab = $label;
$label = $locale->text($label);
if ($zeige) {
if (scalar @chunks <= 1) {
print
- qq|<tr><td class="hover" height="13" >$spacer<img src="image/unterpunkt.png" style="vertical-align:text-top">|
- . $menu->menuitem(\%myconfig, \%$form, $item, $level)
- . qq|$label</a></td></tr>\n|;
+ qq|<tr><td class="hover" height="16" >$spacer|
+ . $menu->menuitem(\%myconfig, \%$form, $item, $level) ;
+
+ if (-f "image/icons/16x16/$label_icon")
+ { print
+ qq|<img src="image/icons/16x16/$label_icon" border="0" style="vertical-align:text-top" title="|
+ . $label
+ . qq|"> | }
+ else {
+ print qq|<img src="image/unterpunkt.png" border="0" style="vertical-align:text-top">|;
+ }
+
+ print
+ qq|$label</a></td></tr>\n|;
} else {
my $tmpitem = $menu->menuitem(\%myconfig, \%$form, $item, $level);
print
- qq|<tr><td class="hover" height="13" >$spacer<img src="image/unterpunkt.png" style="vertical-align:text-top">|
+ qq|<tr><td class="hover" height="16" >$spacer<img src="image/unterpunkt.png" style="vertical-align:text-top">|
. $tmpitem
. qq|$chunks[0]</a></td></tr>\n|;
map {
print
- qq|<tr style="vertical-align:top""><td class="hover">$spacer<img src="image/unterpunkt.png" style="visibility:hidden; width:23; height=2;">|
+ qq|<tr style="vertical-align:top""><td class="hover">$spacer<img src="image/unterpunkt.png" style="visibility:hidden; width:24; height=2;">|
. $tmpitem
. qq|$chunks[$_]</a></td></tr>\n|;
} 1..$#chunks;
} else {
my $ml_ = $form->escape($ml);
print
- qq|<tr><td class="bg" height="22" align="left" valign="middle" ><img src="image/$item.png" style="vertical-align:middle"> <a href="menu.pl?action=acc_menu&level=$ml_" class="nohover">$label</a> </td></tr>\n|;
+ qq|<tr><td class="bg" height="24" align="left" valign="middle"><a href="menu.pl?action=acc_menu&level=$ml_" class="nohover" title="$label"><img src="image/icons/24x24/$item.png" border="0" style="vertical-align:middle" title="$label"> $label</a> </td></tr>\n|;
§ion_menu($menu, $item);
- #print qq|<br>\n|;
+ print qq|\n|;
}
}
}
return $is_mobile_browser && $is_mobile_style ? 130
: $is_lynx_browser ? 240
- : 190;
+ : 180;
}
1;
$form->{CUSTOM_VARIABLES_INCLUSION_CODE}) = CVar->render_search_options('variables' => $form->{CUSTOM_VARIABLES},
'include_prefix' => 'l_',
'include_value' => 'Y');
+ $form->{fokus} = 'getElementById("projectnumber")';
$form->header();
print $form->parse_html_template('projects/search');
$auth->assert('advance_turnover_tax_return');
+$form->{title} = $locale->text('Tax Office Preferences');
+
# edit all taxauthority prefs
$form->header;
my $form = $main::form;
my %myconfig = %main::myconfig;
+ my $locale = $main::locale;
+ $form->{title} = $locale->text('Report about warehouse transactions');
$form->get_lists('warehouses' => { 'key' => 'WAREHOUSES',
'bins' => 'BINS', });
# $form->{fokus} = "partnumber";
# $form->{onload} .= "focus();";
- $form->{title} = $locale->text("Report about wareouse contents");
+ $form->{title} = $locale->text("Report about warehouse contents");
$form->header();
print $form->parse_html_template("wh/report_filter",
my %myconfig = %main::myconfig;
my $locale = $main::locale;
- $form->{title} = $locale->text("Report about wareouse contents");
+ $form->{title} = $locale->text("Report about warehouse contents");
$form->{sort} ||= 'partnumber';
my $sort_col = $form->{sort};
# LXDebug::TRACE - Tracing von Funktionsaufrufen
# LXDebug::BACKTRACE_ON_ERROR - Vollständiger Aufrufpfad, wenn $form->error() aufgerufen wird
# LXDebug::REQUEST_TIMER - Timing von Requests loggen
+# LXDebug::WARN - warnings
# LXDebug::ALL - alle Debugausgaben
#
# LXDebug::DEVEL - wie INFO | QUERY | TRACE | BACKTRACE_ON_ERROR
# weshalb sie normalerweise deaktiviert ist.
$LXDebug::watch_form = 0;
+# Zum debuggen von Latexausgaben. Wenn diese Option auf 1 gesetzt wird, werden
+# temporäre Dateien, die bei der Erstellung von PDFs aus Latex erzeugt werden,
+# nach Abschluß der Erstellung oder im Fehlerfall nicht gelöscht, damit man sie
+# untersuchen kann.
+$::keep_temp_files = 0;
+
1;
# LXDebug::QUERY - SQL Queries
# LXDebug::TRACE - Tracing von Funktionsaufrufen
# LXDebug::BACKTRACE_ON_ERROR - Vollständiger Aufrufpfad, wenn $form->error() aufgerufen wird
+# LXDebug::REQUEST_TIMER - Timing von Requests loggen
+# LXDebug::WARN - warnings
# LXDebug::ALL - alle Debugausgaben
#
# LXDebug::DEVEL - wie INFO | QUERY | TRACE | BACKTRACE_ON_ERROR
border-width:1px;
background:#D4D0C8;
}
+
+.message_ok {
+ font-size: 10pt;
+ padding:3px;
+ background-color: lightgreen;
+ color: black;
+ font-weight: bolder;
+ text-align:center;
+ border-style:solid;
+ border-width:thin;
+}
+
+.message_error {
+ font-size: 10pt;
+ padding:5px;
+ background-color: #FFAAAA;
+ color: white;
+ font-weight: bolder;
+ text-align:center;
+ border-style:solid;
+ border-width:thin;
+}
+
/* Bei Listen den Farbwechsel zur besseren Lesbarkeit: */
.listrow1 { background-color: #C8D4C6; color: black; vertical-align: top; }
.listrow0 { background-color: white; color: black; vertical-align: top; }
color: black;
}
+.message_ok {
+ font-size: 12pt;
+ padding:5px;
+ background-color: lightgreen;
+ color: black;
+ font-weight: bolder;
+ text-align:center;
+ border-style:solid;
+ border-width:thin;
+}
+
+.message_error {
+ font-size: 12pt;
+ padding:5px;
+ background-color: #FFAAAA;
+ color: black;
+ font-weight: bolder;
+ text-align:center;
+ border-style:solid;
+ border-width:thin;
+}
/*
Ãœberschriftsbalken
--- /dev/null
+dispatcher.fpl
\ No newline at end of file
Bitte vorher die Dokumentation von dem Script lesen.
Es gibt einige Fälle die nicht abgedeckt sind davon, aber die sollte mit einem
-Diff danach zu finden sein. vor allem kann es keine LxERP.format_text Aufrufe
+Diff danach zu finden sein. Vor allem kann es keine LxERP.format_text Aufrufe
umwandeln, und es hat keinen Schutz gegen nicht escapte Anführungszeichen in
den zu übersetzenden Strings.
Folgende Kombinationen sind getestet:
* Apache 2.2.11 (Ubuntu) und mod_fastcgi.
-
-Folgende Kombinationen funktionieren nicht:
-
- * Apache 2.2.11 (Ubuntu) + mod_fcgid:
+ * Apache 2.2.11 (Ubuntu) und mod_fcgid:
Als Perl Backend wird das Modul FCGI.pm verwendet. Vorsicht: FCGI 0.69 und
höher ist extrem strict in der Behandlung von Unicode, und verweigert bestimmte
a2enmod fastcgi
+bzw.
+
+ a2enmod fcgid
+
Die Konfiguration für die Verwendung von Lx-Office mit FastCGI erfolgt
durch Anpassung der vorhandenen Alias- und Directory-Direktiven. Dabei
wird zwischen dem Installationspfad von Lx-Office im Dateisystem
("/path/to/lx-office-erp") und der URL unterschieden, unter der
Lx-Office im Webbrowser erreichbar ist ("/web/path/to/lx-office-erp").
+Folgendes Template funktioniert mit mod_fastcgi:
+
AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
+ Alias /web/path/to/lx-office-erp/ /path/to/lx-office-erp/
<Directory /path/to/lx-office-erp>
AllowOverride All
Deny from All
</DirectoryMatch>
+...und für mod_fcgid muss die erste Zeile geändert werden in:
+
+ AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fcgi
+
+
Hierdurch wird nur ein zentraler Dispatcher gestartet. Alle Zugriffe
auf die einzelnen Scripte werden auf diesen umgeleitet. Dadurch, dass
zur Laufzeit öfter mal Scripte neu geladen werden, gibt es hier kleine
Benutzung von "AddHandler fastcgi-script .pl" vorzuziehen.
-=head2 Entwicklungsaspekte
-
-Die AddHandler Direktive vom Apache ist entgegen der Dokumentation
-anscheinend nicht lokal auf das Verzeichnis beschränkt sondern global im
-vhost.
-
-Wenn Änderungen in der Konfiguration von Lx-Office gemacht werden, oder wenn
-Templates editiert werden muss der Server neu gestartet werden.
-
Es ist möglich die gleiche Lx-Office Version parallel unter cgi und fastcgi zu
-betreiben. Da nimmt man Variante 2 wie oben beschrieben, und ändert die
-AliasMatch Zeile auf eine andere URL, und lässt alle anderen URLs auch
-weiterleiten:
+betreiben. Dafür bleiben Directorydirektiven bleiben wie oben beschrieben, die
+URLs werden aber umgeleitet:
# Zugriff ohne FastCGI
- Alias /web/path/to/lx-office-erp /path/to/lx-office-erp
+ Alias /web/path/to/lx-office-erp /path/to/lx-office-erp
# Zugriff mit FastCGI:
AliasMatch ^/web/path/to/lx-office-erp-fcgi/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
Dann ist unter C</web/path/to/lx-office-erp/> die normale Version erreichbar,
und unter C</web/opath/to/lx-office-erp-fcgi/> die FastCGI Version.
+Achtung:
+
+Die AddHandler Direktive vom Apache ist entgegen der Dokumentation
+anscheinend nicht lokal auf das Verzeichnis beschränkt sondern global im
+vhost.
+
+=head2 Entwicklungsaspekte
+
+Wenn Änderungen in der Konfiguration von Lx-Office gemacht werden, muss der
+Server neu gestartet werden.
+
Bei der Entwicklung für FastCGI ist auf ein paar Fallstricke zu achten. Dadurch
dass das Programm in einer Endlosschleife läuft, müssen folgende Aspekte
geachtet werden:
angezeigt werden. Die Lx-Office eigene C<$::form->error()> tut im Prinzip das
Gleiche, mit ein paar Extraoptionen. C<warn> und C<exit> hingegen werden nicht
abgefangen. C<warn> wird direkt nach STDERR, also in Server Log eine Nachricht
-schreiben, und C<exit> wird die Ausführung beenden.
+schreiben (sofern in der Konfiguration nicht die Warnungen in das Lx-Office Log
+umgeleitet wurden), und C<exit> wird die Ausführung beenden.
Prinzipiell ist es kein Beinbruch, wenn sich der Prozess beendet, fcgi wird ihn
sofort neu starten. Allerdings sollte das die Ausnahme sein. Quintessenz: Bitte
-kein C<warn> oder C<exit> benutzen, alle anderen Exceptionmechanismen sind ok.
+kein C<exit> benutzen, alle anderen Exceptionmechanismen sind ok.
=head3 Globale Variablen
Das ist besonders wichtig im C<$::cgi> und C<$::auth> Objekt, weil diese nicht
gelöscht werden pro Instanz, sondern persistent gehalten werden.
+In C<SL::Dispatcher> gibt es einen sauber abgetrennten Block der alle
+kanonischen globalen Variablen listet und erklärt. Bitte keine anderen
+einführen ohne das sauber zu dokumentieren.
+
Datenbankverbindungen wird noch ein Guide verfasst werden, wie man sichergeht,
dass man die richtige erwischt.
Die kritischen Pfade des Programms sind die Belegmasken, und unter diesen ganz
besonders die Verkaufsrechnungsmaske. Ein Aufruf der Rechnungsmaske in
-Lx-Office 2.4.3 stable dauert auf einem Core2duo mit 2GB Arbeitsspeicher und
+Lx-Office 2.4.3 stable dauert auf einem Core2duo mit 4GB Arbeitsspeicher und
Ubuntu 9.10 eine halbe Sekunde. In der 2.6.0 sind es je nach Menge der
definierten Variablen 1-2s. Ab der Moose/Rose::DB Version sind es 5-6s.
-Mit FastCGI ist die neuste Version auf 0,4 Sekunden selbst in den kritischen
+Mit FastCGI ist die neuste Version auf 0,26 Sekunden selbst in den kritischen
Pfaden, unter 0,15 sonst.
=head2 Bekannte Probleme
+=head3 Encoding Awareness
+
+UTF-8 kodierte Installationen sind sehr anfällig gegen fehlerhfate Encodings
+unter FCGI. latin9 Installationen behandeln falsch kodierte Zeichen eher
+unwissend, und geben sie einfach weiter. UTF-8 verweigert bei fehlerhaften
+Programmpfaden kurzerhand aus ausliefern. Es wird noch daran gearbeitet alles
+Fehler da zu beseitigen.
+
@item
CGI::Ajax
@item
+DateTime
+@item
DBI
@item
DBD::Pg
Für Debian oder Ubuntu benötigen Sie diese Pakete:
-@code{apache postgresql libarchive-zip-perl libclass-accessor-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 lib-uriperl libxml-writer-perl libyaml-perl}
+@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}
Für Fedora Core benötigen Sie diese Pakete:
-@code{httpd postgresql-server perl-Class-Accessor 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-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}
Für OpenSuSE benötigen Sie diese Pakete:
-@code{apache2 postgresql-server perl-Archive-Zip perl-Class-Accessor 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-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}
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:
* CGI::Ajax
+ * DateTime
+
* DBI
* DBD::Pg
Für Debian oder Ubuntu benötigen Sie diese Pakete:
- `apache postgresql libarchive-zip-perl libclass-accessor-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 lib-uriperl
-libxml-writer-perl libyaml-perl'
+ `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'
Für Fedora Core benötigen Sie diese Pakete:
- `httpd postgresql-server perl-Class-Accessor 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-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'
Für OpenSuSE benötigen Sie diese Pakete:
`apache2 postgresql-server perl-Archive-Zip perl-Class-Accessor
-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-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'
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:
<li>Archive::Zip
<li>Class::Accessor
<li>CGI::Ajax
+<li>DateTime
<li>DBI
<li>DBD::Pg
<li>Email::Address
<p>Für Debian oder Ubuntu benötigen Sie diese Pakete:
- <p><code>apache postgresql libarchive-zip-perl libclass-accessor-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 lib-uriperl libxml-writer-perl libyaml-perl</code>
+ <p><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>
<p>Für Fedora Core benötigen Sie diese Pakete:
- <p><code>httpd postgresql-server perl-Class-Accessor 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>
+ <p><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>
<p>Für OpenSuSE benötigen Sie diese Pakete:
- <p><code>apache2 postgresql-server perl-Archive-Zip perl-Class-Accessor 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>
+ <p><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>
<p>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:
The structure of locales in Lx-Office is:
- lx-office/locale/<lnagcode>/
+ lx-office/locale/<langcode>/
where <langcode> stands for an abbreviation of the language package. The builtin
packages use two letter ISO 639-1 codes, but the actual name is not relevant for
autogenerated by locales.pl. To generate it, generate the directory and the two
files mentioned above, and execute
- scripts/locaes.pl <langcode>
+ scripts/locales.pl <langcode>
or simply copy one of the other languages. You will be told how many are missing
like this:
English - 0.6% - 2015/2028 missing
-A "missing" file will be generated and can be edited. You can also edit the all
-directly. Edit all that sounds differently in your language, and execute
+A "missing" file will be generated and can be edited. You can also edit the "all" file
+directly. Edit everything you like to fit the target language, and execute
locales.pl again. See how the missing words get fewer.
-
-
These three files are necessary for a localization to be working. Other files
are optional, but will have special effects:
Legacy code from sql ledger. It provides a means for numbers to be converted
into natural language, like 1523 => one thousand five hundred twenty three. If
-you want to provide it, it must be inlinable perl code which privdes a num2text
+you want to provide it, it must be inlinable perl code which provides a num2text
sub. If an init sub exists, it will be executed first.
Only used in the check and receipt printing module.
Lx-Office comes with a lot of interfaces to different formats, some of which are
rather picky with their accepted charset. The special_chars file contains a
-listing of chars not suited for diefferent file format, and provides
+listing of chars not suited for different file format, and provides
substitutions. It is written in "Simple Ini" style, containing a block for every
file format.
First entry should be the order of substitution for entries as a whitespace
-separated list. all entries are interpolated, so \n, \x20 and \\ all work.
+separated list. All entries are interpolated, so \n, \x20 and \\ all work.
After that every entry is a special char that should be translated when writing
text into such a file.
>=>
\n=<br>
-Note how in this example the order is important. Substituting < and > befor &
+Note the importance of the order in this example. Substituting < and > befor &
would lead to $gt; become &gt;
For a list of valid formats, see the german special_chars entry. As of this
The last of which is very machine dependant. Remember that a lot of characters
are forbidden by some filesystems, for exmaple MS Windows doesn't like ':' in
-its files where linux doesn't mind that. If you want the files created with your
+its files where Linux doesn't mind that. If you want the files created with your
language pack to be portable, find all chars that could cause trouble.
This is a file generated by scripts/locales.pl while processing your locales.
It's only to have the missing entries singled out and does not belong to a
-languge package.
+language package.
lost (not part of language package)
--- /dev/null
+/* This is used in bin/mozilla/kopf.pl to switch the HTML sidemenu on/off
+ 2010, Sven Donath, lxo@dexo.de */
+
+var vSwitch_Menu = 1;
+
+function Switch_Menu(framesize)
+{
+ if (vSwitch_Menu)
+ {
+ vSwitch_Menu=false;
+ parent.document.getElementById('menuframe').setAttribute('cols','30,*')
+ }
+ else
+ {
+ vSwitch_Menu=true;
+ framesize = framesize + ',*';
+ parent.document.getElementById('menuframe').setAttribute('cols',framesize);
+ }
+ return;
+}
#!/usr/bin/perl
+# -*- coding: ISO-8859-15; -*-
+# vim: fenc=ISO-8859-15
# These are all the texts to build the translations files.
# The file has the form of 'english text' => 'foreign text',
'AR Transaction (abbreviation)' => 'D',
'AR Transactions' => 'Debitorenbuchungen',
'ASSETS' => 'AKTIVA',
- 'About' => 'über',
'Abrechnungsnummer' => 'Abrechnungsnummer',
'Abteilung' => 'Abteilung',
'Account' => 'Konto',
'Account saved!' => 'Konto gespeichert!',
'Accounting Group deleted!' => 'Buchungsgruppe gelöscht!',
'Accounting Group saved!' => 'Buchungsgruppe gespeichert!',
- 'Accounting Menu' => 'Kontoverwaltung',
'Accrual' => 'Bilanzierung',
'Active' => 'Aktiv',
'Active?' => 'Aktiviert?',
'Add' => 'Erfassen',
- 'Add ' => 'Hinzufügen',
'Add AP Transaction' => 'Kreditorenbuchung',
'Add AR Transaction' => 'Debitorenbuchung',
'Add Account' => 'Konto erfassen',
'Add unit' => 'Einheit hinzufügen',
'Address' => 'Adresse',
'Administration' => 'Administration',
- 'Administration area' => 'Administrationsbereich',
+ 'Administration area' => 'Administration',
'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
'Aktion' => 'Aktion',
'All' => 'Alle',
'Amount Due' => 'Betrag fällig',
'Annotations' => 'Anmerkungen',
'Another user with the login #1 does already exist.' => 'Es existiert bereits ein anderer Benutzer mit diesem Login.',
- 'Ansprechpartner' => 'Ansprechpartner',
'Ap aging on %s' => 'Offene Verbindlichkeiten zum %s',
'Application Error. No Format given' => 'Fehler in der Anwendung. Das Ausgabeformat fehlt.',
'Application Error. Wrong Format' => 'Fehler in der Anwendung. Falsches Format: ',
'Cannot remove files!' => 'Dateien können nicht gelöscht werden!',
'Cannot save account!' => 'Konto kann nicht gespeichert werden!',
'Cannot save order!' => 'Auftrag kann nicht gespeichert werden!',
- 'Cannot save preferences!' => 'Benutzereinstellungen können nicht gespeichert werden!',
+ 'Cannot save preferences!' => 'Einstellungen können nicht gespeichert werden!',
'Cannot save quotation!' => 'Angebot kann nicht gespeichert werden!',
'Cannot storno storno invoice!' => 'Kann eine Stornorechnung nicht stornieren',
'Carry over shipping address' => 'Lieferadresse übernehmen',
'Cash' => 'Zahlungsverkehr',
'Cc' => 'Cc',
'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Verändern der Lx-Office-Installationseinstellungen (Menüpunkte unterhalb von \'System\')',
+ 'Change representative to' => 'Vertreter ändern in',
'Charge Number' => 'Chargennummer',
'Charge number' => 'Chargennummer',
'Chart' => 'Buchungskonto',
'Contact' => 'Kontakt',
'Contact Person' => 'Ansprechpartner',
'Contact person (surname)' => 'Ansprechpartner (Nachname)',
- 'Contacts' => 'Kontakte',
+ 'Contacts' => 'Ansprechpartner',
'Continue' => 'Weiter',
'Contra' => 'gegen',
'Copies' => 'Kopien',
'EUR' => 'E/Ü-Rechnung',
'Earlier versions of Lx-Office contained bugs which might have led to wrong entries in the general ledger.' => 'Frühere Versionen von Lx-Office enthielten Bugs, die zu falschen Einträgen im Hauptbuch geführt haben können.',
'Edit' => 'Bearbeiten',
- 'Edit ' => 'Bearbeiten',
'Edit Access Rights' => 'Zugriffsrechte bearbeiten',
- 'Edit Access Rights for Follow-Ups' => 'Zugriffsrechte für Wiedervorlagen bearbeiten',
+ 'Edit Access Rights for Follow-Ups' => 'Zugriff auf meine Wiedervorlagen regeln',
'Edit Account' => 'Kontodaten bearbeiten',
'Edit Accounting Group' => 'Buchungsgruppe bearbeiten',
'Edit Accounts Payables Transaction' => 'Kreditorenbuchung bearbeiten',
'Edit Lead' => 'Kundenquelle bearbeiten',
'Edit Part' => 'Ware bearbeiten',
'Edit Payment Terms' => 'Zahlungskonditionen bearbeiten',
- 'Edit Preferences for #1' => 'Benutzereinstellungen für #1 bearbeiten',
+ 'Edit Preferences for #1' => 'Einstellungen von #1 bearbeiten',
'Edit Price Factor' => 'Preisfaktor bearbeiten',
'Edit Pricegroup' => 'Preisgruppe bearbeiten',
'Edit Printer' => 'Drucker bearbeiten',
'Factor' => 'Faktor',
'Factor missing!' => 'Der Faktor fehlt.',
'Falsches Datumsformat!' => 'Falsches Datumsformat!',
- 'Favorites' => 'Favoriten',
+ 'Favorites' => 'Favoriten (nur im XUL-Menü)',
'Fax' => 'Fax',
'Feb' => 'Feb',
'February' => 'Februar',
'From Date' => 'Von',
'Full Access' => 'Vollzugriff',
'Full access to all functions' => 'Vollzugriff auf alle Funktionen',
+ 'Fwd' => 'Vorwärts',
'GL Transaction' => 'Dialogbuchung',
'Gegenkonto' => 'Gegenkonto',
'Gender' => 'Geschlecht',
'Generic Tax Report' => 'USTVA Bericht',
'Given Name' => 'Vorname',
'Go one step back' => 'Einen Schritt zurück',
+ 'Go one step forward' => 'Einen Schritt vorwärts',
'Greeting' => 'Anrede',
'Greetings' => 'Anreden',
'Group' => 'Warengruppe',
'License key' => 'Lizenzschlüssel',
'Licensed to' => 'Lizenziert für',
'Licenses' => 'Lizenzen',
- 'Lieferungen' => 'Lieferungen',
'Limit part selection' => 'Artikelauswahl eingrenzen',
'Line Total' => 'Zeilensumme',
'Line endings' => 'Zeilenumbrüche',
- 'List' => 'List',
+ 'List' => 'Anzeigen',
'List Accounting Groups' => 'Buchungsgruppen anzeigen',
'List Accounts' => 'Konten anzeigen',
'List Businesses' => 'Kunden-/Lieferantentypen anzeigen',
'Lock System' => 'System sperren',
'Lockfile created!' => 'System gesperrt!',
'Lockfile removed!' => 'System entsperrt!',
- 'Login' => 'Anmeldung',
+ 'Login' => 'Anmelden',
'Login Name' => 'Benutzername',
'Login name missing!' => 'Loginname fehlt.',
'Logout' => 'Abmelden',
+ 'Logout now' => 'Lx-Office jetzt verlassen',
'Long Dates' => 'Lange Monatsnamen',
'Long Description' => 'Langtext',
+ 'Lx-Office' => 'Lx-Office',
'Lx-Office 2.4.0 introduces two new concepts: tax zones and Buchungsgruppen.' => 'Lx-Office 2.4.0 führt zwei neue Konzepte ein: Steuerzonen und Buchungsgruppen.',
'Lx-Office can fix these problems automatically.' => 'Lx-Office kann solche Probleme automatisch beheben.',
'Lx-Office has been switched to group-based access restrictions.' => 'Lx-Office wurde auf eine gruppenbasierte Benutzerzugriffsverwaltung umgestellt.',
'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
'Medium Number' => 'Datenträgernummer',
'Memo' => 'Memo',
+ 'Menu' => 'Menü',
'Message' => 'Nachricht',
'Method' => 'Verfahren',
'Microfiche' => 'Mikrofilm',
'Oct' => 'Okt',
'October' => 'Oktober',
'Off' => 'Aus',
- 'Old (on the side)' => 'Alt (seitlich)',
+ 'Old (on the side)' => 'Links (HTML)',
'On' => 'An',
'On Hand' => 'Auf Lager',
'On Order' => 'Ist bestellt',
'Other users\' follow-ups' => 'Wiedervorlagen anderer Benutzer',
'Other values are ignored.' => 'Andere Eingaben werden ignoriert.',
'Others' => 'Andere',
- 'Otherwise all users will only have access to their own settings.' => 'Andernfalls haben alle Benutzer nur Zugriff auf ihre Benutzereinstellungen.',
+ 'Otherwise all users will only have access to their own settings.' => 'Andernfalls haben alle Benutzer nur Zugriff auf ihre Einstellungen.',
'Otherwise the variable is only available for printing.' => 'Andernfalls steht die Variable nur beim Ausdruck zur Verfügung.',
'Out of balance transaction!' => 'Buchung ist nicht ausgeglichen!',
'Out of balance!' => 'Summen stimmen nicht berein!',
'Post payments' => 'Zahlungen buchen',
'Postscript' => 'Postscript',
'Posustva_coa' => 'USTVA Kennz.',
- 'Preferences' => 'Benutzereinstellungen',
+ 'Preferences' => 'Einstellungen',
'Preferences saved!' => 'Einstellungen gespeichert!',
'Prefix for the new bins\' names' => 'Namenspräfix für die neuen Lagerplätze',
'Preis' => 'Preis',
'Productivity' => 'Produktivität',
'Profit Center' => 'Erfolgsbereich',
'Proforma Invoice' => 'Proformarechnung',
- 'Programm' => 'Programm',
+ 'Program' => 'Programm',
'Project' => 'Projekt',
'Project Number' => 'Projektnummer',
'Project Number missing!' => 'Projektnummer fehlt!',
'Removing marked entries from queue ...' => 'Markierte Einträge werden von der Warteschlange entfernt ...',
'Rename the group' => 'Gruppe umbenennen',
'Report Positions' => 'Berichte',
- 'Report about wareouse contents' => 'Bericht über eingelagerte Waren',
- 'Report about wareouse transactions' => 'Bericht über Lagerbewegungen',
+ 'Report about warehouse contents' => 'Lagerbestand anzeigen',
+ 'Report about warehouse transactions' => 'Lagerbewegungen anzeigen',
'Report and misc. Preferences' => 'Sonstige Einstellungen',
'Report for' => 'Bericht für',
'Reports' => 'Berichte',
'Services' => 'Dienstleistungen',
'Set Language Values' => 'Spracheinstellungen',
'Set eMail text' => 'eMail Text eingeben',
- 'Setup Menu' => 'Menüsetup',
+ 'Setup Menu' => 'Menü-Variante',
'Setup Templates' => 'Vorlagen auswählen',
'Ship to' => 'Lieferadresse',
'Ship via' => 'Transportmittel',
'Sum per' => 'Summe per',
'Summen- und Saldenliste' => 'Summen- und Saldenliste',
'Superuser name' => 'Datenbankadministrator',
+ 'Supplies' => 'Lieferungen',
+ 'Switch Menu on / off' => 'Menü ein- / ausklappen',
'System' => 'System',
'TODO list' => 'Aufgabenliste',
'TODO list options' => 'Aufgabenlistenoptionen',
'Top (CSS)' => 'Oben (mit CSS)',
'Top (CSS) new' => 'Oben (mit CSS, neu)',
'Top (Javascript)' => 'Oben (mit Javascript)',
- 'Top (XUL; only for Mozilla Firefox)' => 'Oben (XUL; nur für Mozilla Firefox)',
+ 'Top (XUL; only for Mozilla Firefox)' => 'Oben + links (XUL, nur Mozilla Firefox)',
'Top 100' => 'Top 100',
'Top 100 hinzufuegen' => 'Top 100 hinzufügen',
'Top Level' => 'Hauptartikelbezeichnung',
'Transfer out' => 'Auslagern',
'Transfer qty' => 'Umlagermenge',
'Translation (%s)' => 'Übersetzung (%s)',
- 'Trial Balance' => 'Summen- u. Saldenliste',
+ 'Trial Balance' => 'Summen- und Saldenliste',
'Trial balance between %s and %s' => 'Summen- und Saldenlisten vom %s bis zum %s',
'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
'Type' => 'Typ',
'Use As Template' => 'Als Vorlage verwenden',
'Use Templates' => 'benutze Vorlagen',
'User' => 'Benutzer',
- 'User Config' => 'Benutzereinstellungen',
+ 'User Config' => 'Einstellungen',
'User data migration' => 'Benutzerdatenmigration',
'User deleted!' => 'Benutzer gelöscht!',
'User migration complete' => 'Benutzermigration abgeschlossen',
'You have to chose which unit to save for each of them.' => 'Sie müssen für jeden Artikel die neue Einheit auswählen.',
'You have to create at least one group, grant it access to Lx-Office\'s functions and assign users to it.' => 'Sie müssen mindestens eine Benutzergruppe anlegen, ihr Zugriff auf die verschiedenen Funktionsbereiche von Lx-Office gewähren und Benutzer dieser Gruppe zuordnen.',
'You have to create new Buchungsgruppen for all the combinations of inventory, income and expense accounts that have been used already.' => 'Sie müssen neue Buchungsgruppen für alle Kombinationen aus Inventar-, Erlös- und Aufwandskonto, die bereits benutzt wurden.',
- 'You have to enter a company name in your user preferences (see the "Program" menu, "Preferences").' => 'Sie müssen einen Firmennamen in Ihren Benutzereinstellungen angeben (siehe "Programm"-Menü, "Benuztereinstellungen).',
+ 'You have to enter a company name in your user preferences (see the "Program" menu, "Preferences").' => 'Sie müssen einen Firmennamen in Ihren Einstellungen angeben (siehe Menü "Programm", "Einstellungen").',
'You have to fill in at least an account number, the bank code, the IBAN and the BIC.' => 'Sie müssen zumindest die Kontonummer, die Bankleitzahl, die IBAN und den BIC angeben.',
'You have to specify a department.' => 'Sie müssen eine Abteilung wählen.',
'You have to specify an execution date for each antry.' => 'Sie müssen für jeden zu buchenden Eintrag ein Ausführungsdatum angeben.',
'cp_greeting to cp_gender migration' => 'Datenumwandlung von Titel nach Geschlecht (cp_greeting to cp_gender)',
'customer' => 'Kunde',
'customer_list' => 'kundenliste',
- 'customernumber not unique!' => 'Die Kundennummer ist schon vergeben',
'debug' => 'Debug',
'delete' => 'Löschen',
'deliverydate' => 'Lieferdatum',
#!/usr/bin/perl
+# -*- coding: ISO-8859-15; -*-
+# vim: fenc=ISO-8859-15
# These are all the texts to build the translations files.
# The file has the form of 'english text' => 'foreign text',
'AR Transaction (abbreviation)' => '',
'AR Transactions' => 'Sales Transactions',
'ASSETS' => '',
- 'About' => '',
'Abrechnungsnummer' => '',
'Abteilung' => '',
'Account' => '',
'Account saved!' => '',
'Accounting Group deleted!' => '',
'Accounting Group saved!' => '',
- 'Accounting Menu' => '',
'Accrual' => '',
'Active' => '',
'Active?' => '',
'Add' => '',
- 'Add ' => '',
'Add AP Transaction' => '',
'Add AR Transaction' => '',
'Add Account' => '',
'Amount Due' => '',
'Annotations' => '',
'Another user with the login #1 does already exist.' => '',
- 'Ansprechpartner' => '',
'Ap aging on %s' => '',
'Application Error. No Format given' => '',
'Application Error. Wrong Format' => '',
'Cash' => '',
'Cc' => '',
'Change Lx-Office installation settings (all menu entries beneath \'System\')' => '',
+ 'Change representative to' => '',
'Charge Number' => '',
'Charge number' => '',
'Chart' => '',
'EUR' => '',
'Earlier versions of Lx-Office contained bugs which might have led to wrong entries in the general ledger.' => '',
'Edit' => '',
- 'Edit ' => '',
'Edit Access Rights' => '',
'Edit Access Rights for Follow-Ups' => '',
'Edit Account' => '',
'From Date' => '',
'Full Access' => '',
'Full access to all functions' => '',
+ 'Fwd' => 'Forward',
'GL Transaction' => '',
'Gegenkonto' => '',
'Gender' => '',
'Generic Tax Report' => '',
'Given Name' => '',
'Go one step back' => '',
+ 'Go one step forward' => '',
'Greeting' => '',
'Greetings' => '',
'Group' => '',
'License key' => '',
'Licensed to' => '',
'Licenses' => '',
- 'Lieferungen' => '',
'Limit part selection' => '',
'Line Total' => '',
'Line endings' => '',
'Login Name' => '',
'Login name missing!' => '',
'Logout' => '',
+ 'Logout now' => '',
'Long Dates' => '',
'Long Description' => '',
+ 'Lx-Office' => '',
'Lx-Office 2.4.0 introduces two new concepts: tax zones and Buchungsgruppen.' => '',
'Lx-Office can fix these problems automatically.' => '',
'Lx-Office has been switched to group-based access restrictions.' => '',
'May set the BCC field when sending emails' => '',
'Medium Number' => '',
'Memo' => '',
+ 'Menu' => '',
'Message' => '',
'Method' => '',
'Microfiche' => '',
'Productivity' => '',
'Profit Center' => '',
'Proforma Invoice' => '',
- 'Programm' => '',
+ 'Program' => '',
'Project' => '',
'Project Number' => '',
'Project Number missing!' => '',
'Removing marked entries from queue ...' => '',
'Rename the group' => '',
'Report Positions' => '',
- 'Report about wareouse contents' => '',
- 'Report about wareouse transactions' => '',
+ 'Report about warehouse contents' => '',
+ 'Report about warehouse transactions' => '',
'Report and misc. Preferences' => '',
'Report for' => '',
'Reports' => '',
'Sum per' => '',
'Summen- und Saldenliste' => '',
'Superuser name' => '',
+ 'Supplies' => '',
+ 'Switch Menu on / off' => '',
'System' => '',
'TODO list' => '',
'TODO list options' => '',
'cp_greeting to cp_gender migration' => '',
'customer' => '',
'customer_list' => '',
- 'customernumber not unique!' => '',
'debug' => '',
'delete' => '',
'deliverydate' => '',
--- /dev/null
+ISO-8859-15
+++ /dev/null
-#!/usr/bin/perl
-
-# The last 50 texts that have been removed.
-# This file will be auto-generated by locales.pl. Do not edit it.
-
-@lost = (
- { 'text' => 'GIFI deleted!', 'translation' => '' },
- { 'text' => 'Assemblies restocked!', 'translation' => '' },
- { 'text' => 'Amount does not equal applied!', 'translation' => '' },
- { 'text' => 'Post as new', 'translation' => '' },
- { 'text' => 'Amount missing!', 'translation' => '' },
- { 'text' => 'Edit Template', 'translation' => '' },
- { 'text' => 'Applied', 'translation' => '' },
- { 'text' => 'Paid in full', 'translation' => '' },
- { 'text' => 'Cannot stock assemblies!', 'translation' => '' },
- { 'text' => 'Access Control', 'translation' => '' },
- { 'text' => 'Password changed!', 'translation' => '' },
- { 'text' => 'Check printing failed!', 'translation' => '' },
- { 'text' => 'Oracle Database Administration', 'translation' => '' },
- { 'text' => 'Check printed!', 'translation' => '' },
- { 'text' => 'Edit Preferences for', 'translation' => '' },
- { 'text' => 'Include this account on the customer/vendor forms to flag customer/vendor as taxable?', 'translation' => 'Include this account on debtor/creditor forms to set debtor/creditor taxable?' },
- { 'text' => 'DBI not installed!', 'translation' => '' },
- { 'text' => 'successfully created!', 'translation' => '' },
- { 'text' => 'Order saved!', 'translation' => '' },
- { 'text' => 'is not a member!', 'translation' => '' },
- { 'text' => 'Standard', 'translation' => '' },
- { 'text' => 'Weight Unit', 'translation' => '' },
- { 'text' => 'Tax Accounts', 'translation' => '' },
- { 'text' => 'localhost', 'translation' => '' },
- { 'text' => 'to', 'translation' => '' },
- { 'text' => 'Hostname missing!', 'translation' => '' },
- { 'text' => 'Last Numbers & Default Accounts', 'translation' => '' },
- { 'text' => 'Link', 'translation' => '' },
- { 'text' => 'Transactions exist, cannot delete customer!', 'translation' => '' },
- { 'text' => 'Order Entry', 'translation' => '' },
- { 'text' => 'GIFI missing!', 'translation' => '' },
- { 'text' => 'Recd', 'translation' => '' },
- { 'text' => 'Receipt printed!', 'translation' => '' },
- { 'text' => 'Stock Assembly', 'translation' => '' },
- { 'text' => 'Administrator', 'translation' => '' },
- { 'text' => 'Dataset updated!', 'translation' => '' },
- { 'text' => 'Change Password', 'translation' => '' },
- { 'text' => 'The following Datasets are not in use and can be deleted', 'translation' => '' },
- { 'text' => 'hr', 'translation' => '' },
- { 'text' => 'paid on purchases', 'translation' => '' },
- { 'text' => 'is already a member!', 'translation' => '' },
- { 'text' => 'Edit GIFI', 'translation' => '' },
- { 'text' => 'O', 'translation' => '' },
- { 'text' => 'Accounts', 'translation' => '' },
- { 'text' => 'Retained Earnings', 'translation' => '' },
- { 'text' => 'Ship rcvd', 'translation' => '' },
- { 'text' => 'Ship', 'translation' => '' },
- { 'text' => 'There is not enough available of \'#1\' at warehouse \'#2\', bin \'#3\', #4, for the transfer of #5.', 'translation' => '' },
- { 'text' => 'Warehouse MIgration', 'translation' => '' },
- { 'text' => 'WEBDAV access', 'translation' => '' },
-);
-
-1;
action=search
-
[Cash]
ACCESS=cash
action=login
-[Programm]
+[Program]
-[Programm--Preferences]
+[Program--Preferences]
module=am.pl
action=config
-[Programm--Logout]
-module=login.pl
-action=logout
-target=_top
+[Program--Administration area]
+module=admin.pl
+action=login
-[Programm--Version]
+[Program--Version]
module=login.pl
action=company_logo
no_todo_list=1
+[Program--Logout]
+module=login.pl
+action=logout
+target=_top
+
#################################
# WEISS NOCH NICHT WAS DAMIT IST #
#!/usr/bin/perl -w
+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.
$| = 1;
-foreach my $module (@SL::InstallationCheck::required_modules) {
- print("Looking for $module->{name}...");
- if (!SL::InstallationCheck::module_available($module->{"name"})) {
- print(" NOT found\n" .
- " The module '$module->{name}' is not available on your system.\n" .
- " Please install it with the CPAN shell, e.g.\n" .
- " perl -MCPAN -e \"install $module->{name}\"\n" .
- " or download it from this URL and install it manually:\n" .
- " $module->{url}\n\n");
- } else {
- print(" ok\n");
- }
+check($_, 0) for @SL::InstallationCheck::required_modules;
+check($_, 1) for @SL::InstallationCheck::optional_modules;
+
+sub check {
+ my ($module, $optional) = @_;
+
+ print "Looking for $module->{fullname}...";
+ my $res = SL::InstallationCheck::module_available($module->{"name"}, $module->{version});
+ print $res ? '' : " NOT", " ok\n";
+
+ return if $res;
+
+ my $needed_text = $optional
+ ? 'It is OPTIONAL for Lx-Office but recommended for improved functionality.'
+ : 'It is NEEDED by Lx-Office and must be installed.';
+
+ my @source_texts = source_texts($module);
+ local $" = $/;
+ print <<EOL;
++-----------------------------------------------------------------------------+
+ $module->{fullname} could not be loaded.
+
+ This module is either too old or not available on your system.
+ $needed_text
+
+ Here are some ideas how to get it:
+
+@source_texts
++-----------------------------------------------------------------------------+
+EOL
}
-foreach my $module (@SL::InstallationCheck::optional_modules) {
- print("Looking for $module->{name} (optional)...");
- if (!SL::InstallationCheck::module_available($module->{"name"})) {
- print(" NOT found\n" .
- " The module '$module->{name}' is not available on your system.\n" .
- " While it is not strictly needed it provides extra functionality\n" .
- " and should be installed.\n" .
- " You can install it with the CPAN shell, e.g.\n" .
- " perl -MCPAN -e \"install $module->{name}\"\n" .
- " or download it from this URL and install it manually:\n" .
- " $module->{url}\n\n");
- } else {
- print(" ok\n");
- }
+sub source_texts {
+ my ($module) = @_;
+ my @texts;
+ push @texts, <<EOL;
+ - You can get it from CPAN:
+ perl -MCPAN -e "install $module->{name}"
+EOL
+ push @texts, <<EOL if $module->{url};
+ - You can download it from this URL and install it manually:
+ $module->{url}
+EOL
+ push @texts, <<EOL if $module->{debian};
+ - On Debian, Ubuntu and other distros you can install it with apt-get:
+ sudo apt-get install $module->{debian}
+ Note these may be out of date as well if you system is old.
+EOL
+ # TODO: SuSE and Fedora packaging. Windows packaging.
+
+ return @texts;
}
unlink "$locales_dir/lost";
}
+my $charset = slurp("$locales_dir/charset") || 'utf-8';
+chomp $charset;
+
my %old_texts = %{ $self->{texts} || {} };
map({ handle_file($_, $bindir); } @progfiles);
# add the missing texts and run locales.pl to rebuild
EOL
$LOST_HEADER = <<EOL;
-# The last 50 texts that have been removed.
-# This file will be auto-generated by locales.pl. Do not edit it.
+# The last 50 text strings, that have been removed.
+# This file has been auto-generated by locales.pl. Please don't edit!
EOL
}
open my $fh, '>', $file or die "$! : $file";
- print $fh "#!/usr/bin/perl\n\n";
+ print $fh "#!/usr/bin/perl\n# -*- coding: $charset; -*-\n# vim: fenc=$charset\n\n";
print $fh $header, "\n" if $header;
print $fh "$data_name = $delim[0]\n" if $data_name;
close $fh;
}
+sub slurp {
+ my $file = shift;
+ do { local ( @ARGV, $/ ) = $file; <> }
+}
+
__END__
=head1 NAME
<ul id="maintab" class="shadetabs">
<li class="selected"><a href="#" rel="billing">[% 'Billing Address' | $T8 %]</a></li>
<li><a href="#" rel="shipto">[% 'Shipping Address' | $T8 %]</a></li>
- <li><a href="#" rel="contacts">Ansprechpartner</a></li>
- <li><a href="#" rel="deliveries">[% 'Lieferungen' | $T8 %]</a></li>
+ <li><a href="#" rel="contacts">[% 'Contacts' | $T8 %]</a></li>
+ <li><a href="#" rel="deliveries">[% 'Supplies' | $T8 %]</a></li>
<li><a href="#" rel="vcnotes">[% 'Notes' | $T8 %]</a></li>
[%- IF CUSTOM_VARIABLES.size %]
<li><a href="#" rel="custom_variables">[% 'Custom Variables' | $T8 %]</a></li>
-%]
</td>
</tr>
+ [%- IF id %]
<tr>
<th align="right">[% 'Representative' | $T8 %]</th>
+ <td>
+ <input type="hidden" name="salesman_id" value="[%- HTML.escape(salesman_id) %]"%>
+ [%- HTML.escape(salesman) %]
+ </td>
+ </tr>
+ [%- END %]
+ <tr>
+ <th align="right">
+ [%- IF !id %]
+ [% 'Representative' | $T8 %]
+ [%- ELSE %]
+ [% 'Change representative to' | $T8 %]
+ [%- END %]
+ </th>
<td>
[%- INCLUDE generic/multibox.html
- name = 'salesman_id',
- DATA = ALL_SALESMAN_CUSTOMERS,
- id_key = 'id',
- label_key = 'name',
+ name = 'new_salesman_id',
+ DATA = ALL_SALESMAN_CUSTOMERS,
+ id_key = 'id',
+ label_key = 'name',
+ show_empty = id,
-%]
</td>
</tr>
<table>
<input type="hidden" name="cp_id" value="[% HTML.escape(cp_id) %]">
<tr>
- <th align="right">[% 'Ansprechpartner' | $T8 %]</th>
+ <th align="left">[% 'Contacts' | $T8 %]</th>
<td>
[%- INCLUDE generic/multibox.html
name = 'cp_id',
[%- USE T8 %]
[% USE HTML %]<body>
- <div class="listtop">[% IF title_error %][% title_error %][% ELSE %][% 'Error!' | $T8 %][% END %]</div>
+ <div class="message_error">[% IF title_error %][% title_error %][% ELSE %][% 'Error!' | $T8 %][% END %]</div>
<p>[% label_error %]</p>
[% USE HTML %]<body>
<table width="100%">
<tr>
- <th class="listtop">[% IF title_information %][% title_information %][% ELSE %][% 'Information' | $T8 %][% END %]</th>
+ <th class="message_ok">[% IF title_information %][% title_information %][% ELSE %][% 'Information' | $T8 %][% END %]</th>
</tr>
<tr height="5"></tr>
[%- USE T8 %]
[% USE HTML %][% USE LxERP %]<body>
[%- DEFAULT myconfig_dbhost = 'localhost' %]
-
+ <noscript>
+ [% INCLUDE 'generic/information.html'
+ title_information = LxERP.t8('Your browser does not currently support Javascript.'),
+ label_information = LxERP.t8('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.'),
+ %]
+ </noscript>
<center>
<a class="nomobile" href="http://www.lx-office.org" target="_top"><img src="image/lx-office-erp.png" border="0"></a>
<th colspan="2" align="center"><a href="http://lx-office.org" target="blank">http://lx-office.org</a></th>
</tr>
</table>
-
- <noscript>
- [% INCLUDE 'generic/information.html'
- title_information = LxERP.t8('Your browser does not currently support Javascript.'),
- label_information = LxERP.t8('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.'),
- %]
- </noscript>
</center>
[%- todo_list %]
</table>
<br>
- <input type="submit" name="action" value="[% 'Login' | $T8 %]" tabindex="3">
+ <input type="hidden" name="action" value="login">
+ <input type="submit" value="[% 'Login' | $T8 %]" tabindex="3">
</td>
</tr>
[%- USE T8 %]
-[% USE HTML %]<body>
+[% USE HTML %]<body onload="fokus()">
- <form method="post" action="projects.pl">
+ <form method="post" action="projects.pl" name="Form">
<div class="listtop">[% title %]</div>
<table>
<tr>
<th align="right">[% 'Number' | $T8 %]</th>
- <td><input name="filter.projectnumber" size="20"></td>
+ <td><input name="filter.projectnumber" id="projectnumber" size="20"></td>
</tr>
<tr>
-->
</script>
- <div class="listtop">[% 'Report about wareouse transactions' | $T8 %]</div>
+ <div class="listtop">[% 'Report about warehouse transactions' | $T8 %]</div>
<form method="post" name="Form" action="wh.pl">
-->
</script>
- <div class="listtop">[% 'Report about wareouse contents' | $T8 %]</div>
+ <div class="listtop">[% 'Report about warehouse contents' | $T8 %]</div>
<form method="post" name="Form" action="wh.pl">
toolbar{
-moz-appearance:none !important;
background: url('../image/fade.png');
- border-bottom:1px solid black;
+ border-bottom:1px solid #888;
}
/* sidebar styles */
width:150px;
font:12px Arial;
margin:0px;
- border-right:1px solid black
+ border-right:1px solid #888;
}
/* menubar styles */
menubar{
-moz-appearance:none !important;
background: url('../image/bg_titel.gif');
- border:0px
+ border:0px;
}
menu,
font:12px Arial;
}
+menu menu{
+ -moz-appearance: none !important;
+ color:white;
+ background: #35a;
+}
+
menubar menu{
-moz-appearance: none !important;
color:white;
- background: url('../image/bg_titel.gif');
}
menubar menu:hover{
-moz-appearance:none !important;
- background:#4466cc;
+ background:#46d;
color:yellow;
}
border:0px;
}
iframe{
- border-left:1px solid black !important;
+ border-left:1px solid #888 !important;
}
<xsl:template match="doc" mode="html">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
- <meta http-equiv="refresh" content="2;url=menuv3.pl?action=display"/>
+ <meta http-equiv="refresh" content="5;url=menu.pl?action=display"/>
</head>
- <body>
-Ihr Browser unterstuetzt kein XUL!<br/>
-wenn die automatische weiterleitung nicht funktioniert klicken sie <a href="menuv3.pl?action=display">hier</a>
+ <body style="background-color: #eee; color: #333;">
+ <div style="margin-top: 2em; margin-left: auto; margin-right: auto; border: solid 0.1em #f88; width: 30em; background-color:#fff; font-size: 0.8em;font-family: Verdana, Arial, Helvetica; padding: 2em;">
+ <h2>XUL-Menü ist aktiviert</h2>
+ <h3>Nur der Firefox-Browser mag das XUL-Menü.</h3>
+ Wir schalten auf die kompatiblere <a href="menu.pl?action=display">HTML-Variante</a> um.
+ <h3>Only the Firefox-Browser likes the XUL-Menu.</h3>
+ We switch to the <a href="menu.pl?action=display">HTML-Version</a> now.
+ </div>
</body>
</html>
</xsl:template>
********************************************************************************** -->
<xsl:template match="menu" mode="tree">
<toolbar>
-<label value="Hauptmenue"/>
+<label value="Hauptmenü"/>
</toolbar>
<tree flex="1" onselect="openTreeLink(event)" style="margin:0px;" hidecolumnpicker="true">
<treecols>
<xsl:template name="specialbuttons">
<toolbarbutton image="image/icons/24x24/Batch Printing.png" oncommand="PrintW(event)" tooltiptext="Drucken"/>
<toolbarbutton image="image/icons/24x24/Neues Fenster.png" tooltiptext="Neues Fenster" link="menuXML.pl?action=display" target="_top" oncommand="openLinkNewWindow(event)"/>
- <toolbarbutton image="image/icons/24x24/Programm--Logout.png" link="{/*//item[@id='Programm--Logout']/@link}" target="_top" oncommand="openLink(event)" tooltiptext="Abmelden"/>
+ <toolbarbutton image="image/icons/24x24/Program--Logout.png" link="{/*//item[@id='Program--Logout']/@link}" target="_top" oncommand="openLink(event)" tooltiptext="Abmelden"/>
<toolbarseparator/>
<toolbarbutton image="image/icons/24x24/leftarrow_24.png" tooltiptext="Schritt zurück" oncommand="MyGoBack()"/>
<toolbarbutton image="image/icons/24x24/rightarrow_24.png" tooltiptext="Schritt vor" oncommand="MyGoForward()"/>