use SL::DO;
use SL::IC;
use SL::IS;
+use SL::Layout::Dispatcher;
use SL::Locale;
use SL::Mailer;
use SL::Menu;
return $output;
}
-sub use_stylesheet {
- my $self = shift;
-
- $self->{stylesheet} = [ $self->{stylesheet} ] unless ref $self->{stylesheet} eq 'ARRAY';
-
- if (@_) {
- $self->{stylesheet} =
- [ grep { -f }
- map { m:^css/: ? $_ : "css/$_" }
- grep { $_ }
- (@{ $self->{stylesheet} }, @_)
- ];
- }
-
- return @{ $self->{stylesheet} };
-}
-
-sub get_stylesheet_for_user {
- my $css_path = 'css';
- if (my $user_style = $::myconfig{stylesheet}) {
- $user_style =~ s/\.css$//; # nuke trailing .css, this is a remnand of pre 2.7.0 stylesheet handling
- if (-d "$css_path/$user_style" &&
- -f "$css_path/$user_style/main.css") {
- $css_path = "$css_path/$user_style";
- } else {
- $css_path = "$css_path/lx-office-erp";
- }
- } else {
- $css_path = "$css_path/lx-office-erp";
- }
- $::myconfig{css_path} = $css_path; # needed for menunew, FIXME: don't do this here
-
- return $css_path;
-}
-
sub header {
$::lxdebug->enter_sub;
- # 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, %params) = @_;
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}++;
- my $css_path = $self->get_stylesheet_for_user;
+ if ($params{no_layout}) {
+ $::request->{layout} = SL::Layout::Dispatcher->new(style => 'none');
+ }
+
+ my $layout = $::request->{layout};
+
+ # standard css for all
+ # this should gradually move to the layouts that need it
+ $layout->use_stylesheet("$_.css") for qw(
+ main menu tabcontent list_accounts jquery.autocomplete
+ jquery.multiselect2side frame_header/header
+ ui-lightness/jquery-ui-1.8.12.custom
+ js/jscalendar/calendar-win2k-1
+ );
+
+ $layout->use_javascript("$_.js") for qw(
+ jquery common jscalendar/calendar jscalendar/lang/calendar-de
+ jscalendar/calendar-setup part_selection jquery-ui jquery.cookie jqModal
+ switchmenuframe
+ );
$self->{favicon} ||= "favicon.ico";
$self->{titlebar} = join ' - ', grep $_, $self->{title}, $self->{login}, $::myconfig{dbname}, $self->{version} if $self->{title};
push @header, "<meta http-equiv='refresh' content='$refresh_time;$refresh_url'>";
}
- push @header, map { qq|<link rel="stylesheet" href="$_" type="text/css" title="Stylesheet">| } $self->use_stylesheet, $::request->{layout}->stylesheets;
-
- push @header, "<style type='text/css'>\@page { size:landscape; }</style>" if $self->{landscape};
- push @header, "<link rel='shortcut icon' href='$self->{favicon}' type='image/x-icon'>" if -f $self->{favicon};
- push @header, map { qq|<script type="text/javascript" src="js/$_.js"></script>| }
- qw(jquery common jscalendar/calendar jscalendar/lang/calendar-de jscalendar/calendar-setup part_selection jquery-ui jquery.cookie jqModal switchmenuframe);
+ push @header, map { qq|<link rel="stylesheet" href="$_" type="text/css" title="Stylesheet">| } $layout->stylesheets;
+ push @header, "<style type='text/css'>\@page { size:landscape; }</style> " if $self->{landscape};
+ push @header, "<link rel='shortcut icon' href='$self->{favicon}' type='image/x-icon'>" if -f $self->{favicon};
+ push @header, map { qq|<script type="text/javascript" src="$_"></script>| } $layout->javascripts;
push @header, $self->{javascript} if $self->{javascript};
- push @header, map { qq|<link rel="stylesheet" type="text/css" href="$css_path/$_.css">| }
- qw(main menu tabcontent list_accounts jquery.autocomplete jquery.multiselect2side frame_header/header ui-lightness/jquery-ui-1.8.12.custom);
- push @header, map { qq|<link rel="stylesheet" type="text/css" href="js/jscalendar/calendar-win2k-1.css">| }
push @header, map { $_->show_javascript } @{ $self->{AJAX} || [] };
- push @header, "<script type='text/javascript'>function fokus(){ document.$self->{fokus}.focus(); }</script>" if $self->{fokus};
my %doctypes = (
strict => qq|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">|,
transitional => qq|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">|,
frameset => qq|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">|,
+ html5 => qq|<!DOCTYPE html>|,
);
# output
***********************************************/
</script>
- $params{extra_code}
</head>
<body>
print $::request->{layout}->pre_content;
print $::request->{layout}->start_content;
+ $layout->header_done;
+
$::lxdebug->leave_sub;
}
sub footer {
- # TODO: fix abort conditions
+ return unless $::request->{layout}->need_footer;
+ print $::request->{layout}->end_content;
print $::request->{layout}->post_content;
- print "<script type='text/javascript' src='$_'></script>\n" for $::request->{layout}->javascripts;
- if (my @inline_scripts = $::request->{layout}->javascript_inline) {
- print "<script type='text/javascript'>$_</script>\n" for @inline_scripts;
+
+ if (my @inline_scripts = $::request->{layout}->javascripts_inline) {
+ print "<script type='text/javascript'>@inline_scripts</script>\n";
}
print <<EOL
$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{features}->{vertreter};
- $additional_params->{"conf_show_best_before"} = $::lx_office_conf{features}->{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};
- $additional_params->{"conf_payments_changeable"} = $::lx_office_conf{features}->{payments_changeable};
$additional_params->{"INSTANCE_CONF"} = $::instance_conf;
if (my $debug_options = $::lx_office_conf{debug}{options}) {
UNLINK => ($::lx_office_conf{debug} && $::lx_office_conf{debug}->{keep_temp_files})? 0 : 1,
);
close $temp_fh;
+ (undef, undef, $self->{template_meta}{tmpfile}) = File::Spec->splitpath( $self->{tmpfile} );
if ($template->uses_temp_file() || $self->{media} eq 'email') {
$out = $self->{OUT};
my ($self, $dbh, $curr, $transdate, $fld) = @_;
my ($query);
- unless ($transdate) {
+ unless ($transdate && $curr) {
$main::lxdebug->leave_sub();
return 1;
}
$amounts{invtotal} = $self->{invtotal};
$amounts{total} = $self->{total};
}
- $amounts{skonto_in_percent} = 100.0 * $self->{percent_skonto};
-
map { $amounts{$_} = $self->parse_amount($myconfig, $amounts{$_}) } keys %amounts;
+ $amounts{skonto_in_percent} = 100.0 * $self->{percent_skonto};
$amounts{skonto_amount} = $amounts{invtotal} * $self->{percent_skonto};
$amounts{invtotal_wo_skonto} = $amounts{invtotal} * (1 - $self->{percent_skonto});
$amounts{total_wo_skonto} = $amounts{total} * (1 - $self->{percent_skonto});
$reference_date = $reference_date ? conv_dateq($reference_date) . '::DATE' : 'current_date';
my $dbh = $self->get_standard_dbh($myconfig);
- my $payment_id;
+ my ($payment_id, $duedate);
if($self->{payment_id}) {
$payment_id = $self->{payment_id};
($payment_id) = selectrow_query($self, $dbh, $query, $self->{vendor_id});
}
- my $query = qq|SELECT ${reference_date} + terms_netto FROM payment_terms WHERE id = ?|;
- my ($duedate) = selectrow_query($self, $dbh, $query, $payment_id);
+ if ($payment_id) {
+ my $query = qq|SELECT ${reference_date} + terms_netto FROM payment_terms WHERE id = ?|;
+ ($duedate) = selectrow_query($self, $dbh, $query, $payment_id);
+ }
$main::lxdebug->leave_sub();
$self->{TAX} = selectall_hashref_query($self, $dbh, $query);
}
+ my $extra_columns = '';
+ $extra_columns .= 'a.direct_debit, ' if $module eq 'AR';
+
if ($self->{id}) {
$query =
qq|SELECT
a.duedate, a.ordnumber, a.taxincluded, a.curr AS currency, a.notes,
a.intnotes, a.department_id, a.amount AS oldinvtotal,
a.paid AS oldtotalpaid, a.employee_id, a.gldate, a.type,
- a.globalproject_id,
+ a.globalproject_id, ${extra_columns}
c.name AS $table,
d.description AS department,
e.name AS employee
my %style_to_script_map = (
v3 => 'v3',
neu => 'new',
- v4 => 'v4',
);
my $menu_script = $style_to_script_map{$::myconfig{menustyle}} || '';
=head1 SYNOPSIS
-This is the main data object of Lx-Office.
+This is the main data object of kivitendo.
Unfortunately it also acts as a god object for certain data retrieval procedures used in the entry points.
Points of interest for a beginner are:
Generates a HTTP redirection header for the new C<$url>. Constructs an
absolute URL including scheme, host name and port. If C<$url> is a
-relative URL then it is considered relative to Lx-Office base URL.
+relative URL then it is considered relative to kivitendo base URL.
This function C<die>s if headers have already been created with
C<$::form-E<gt>header>.