X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FForm.pm;h=d7e0cdae9db0487e921a3f4e6137d15566a06836;hb=0d1bb5102f01eb03da55bc87b52ac52cd7ae7534;hp=0080dccd8545e36ced33ad84374c9b6dd98f2f14;hpb=aa0fece0399b780eae5688a4498d8c982b6a33d4;p=kivitendo-erp.git diff --git a/SL/Form.pm b/SL/Form.pm index 0080dccd8..d7e0cdae9 100644 --- a/SL/Form.pm +++ b/SL/Form.pm @@ -1,4 +1,4 @@ -#==================================================================== +#========= =========================================================== # LX-Office ERP # Copyright (C) 2004 # Based on SQL-Ledger Version 2.1.9 @@ -53,6 +53,7 @@ use SL::CVar; use SL::DB; use SL::DBConnect; use SL::DBUtils; +use SL::DB::Default; use SL::DO; use SL::IC; use SL::IS; @@ -86,6 +87,17 @@ sub disconnect_standard_dbh { undef $standard_dbh; } +sub read_version { + my ($self) = @_; + + open VERSION_FILE, "VERSION"; # New but flexible code reads version from VERSION-file + my $version = ; + $version =~ s/[^0-9A-Za-z\.\_\-]//g; # only allow numbers, letters, points, underscores and dashes. Prevents injecting of malicious code. + close VERSION_FILE; + + return $version; +} + sub new { $main::lxdebug->enter_sub(); @@ -101,10 +113,7 @@ sub new { bless $self, $type; - open VERSION_FILE, "VERSION"; # New but flexible code reads version from VERSION-file - $self->{version} = ; - close VERSION_FILE; - $self->{version} =~ s/[^0-9A-Za-z\.\_\-]//g; # only allow numbers, letters, points, underscores and dashes. Prevents injecting of malicious code. + $self->{version} = $self->read_version; $main::lxdebug->leave_sub(); @@ -138,9 +147,15 @@ sub _flatten_variables_rec { foreach my $idx (0 .. scalar @{ $curr->{$key} } - 1) { my $first_array_entry = 1; - foreach my $hash_key (sort keys %{ $curr->{$key}->[$idx] }) { - push @result, $self->_flatten_variables_rec($curr->{$key}->[$idx], $prefix . $key . ($first_array_entry ? '[+].' : '[].'), $hash_key); - $first_array_entry = 0; + my $element = $curr->{$key}[$idx]; + + if ('HASH' eq ref $element) { + foreach my $hash_key (sort keys %{ $element }) { + push @result, $self->_flatten_variables_rec($element, $prefix . $key . ($first_array_entry ? '[+].' : '[].'), $hash_key); + $first_array_entry = 0; + } + } else { + @result = ({ 'key' => $prefix . $key . ($first_array_entry ? '[+]' : '[]'), 'value' => $element }); } } } @@ -301,35 +316,13 @@ sub info { my ($self, $msg) = @_; if ($ENV{HTTP_USER_AGENT}) { - $msg =~ s/\n/
/g; - - if (!$self->{header}) { - $self->header; - print qq||; - } - - print qq| -

$msg

- - - - - |; + $self->header; + print $self->parse_html_template('generic/form_info', { message => $msg }); + } elsif ($self->{info_function}) { + &{ $self->{info_function} }($msg); } else { - - if ($self->{info_function}) { - &{ $self->{info_function} }($msg); - } else { - print "$msg\n"; - } + print "$msg\n"; } $main::lxdebug->leave_sub(); @@ -454,7 +447,6 @@ sub header { $::lxdebug->enter_sub; 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}++; @@ -506,12 +498,12 @@ sub header { ); # output - print $self->create_http_response(content_type => 'text/html', charset => $db_charset); + print $self->create_http_response(content_type => 'text/html', charset => 'UTF-8'); print $doctypes{$params{doctype} || 'transitional'}, $/; print < - + $self->{titlebar} EOT print " $_\n" for @header; @@ -550,8 +542,7 @@ sub ajax_response_header { my ($self) = @_; - my $db_charset = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET; - my $output = $::request->{cgi}->header('-charset' => $db_charset); + my $output = $::request->{cgi}->header('-charset' => 'UTF-8'); $main::lxdebug->leave_sub(); @@ -623,7 +614,6 @@ sub _prepare_html_template { map { $additional_params->{"myconfig_${_}"} = $main::myconfig{$_}; } keys %::myconfig; } - $additional_params->{"conf_dbcharset"} = $::lx_office_conf{system}->{dbcharset}; $additional_params->{"conf_webdav"} = $::lx_office_conf{features}->{webdav}; $additional_params->{"conf_latex_templates"} = $::lx_office_conf{print_templates}->{latex}; $additional_params->{"conf_opendocument_templates"} = $::lx_office_conf{print_templates}->{opendocument}; @@ -985,6 +975,7 @@ sub parse_template { local (*IN, *OUT); + my $defaults = SL::DB::Default->get; my $userspath = $::lx_office_conf{paths}->{userspath}; $self->{"cwd"} = getcwd(); @@ -1036,11 +1027,13 @@ sub parse_template { $self->{"notes"} = $self->{ $self->{"formname"} . "notes" }; if (!$self->{employee_id}) { - map { $self->{"employee_${_}"} = $myconfig->{$_}; } qw(email tel fax name signature company address businessnumber co_ustid taxnumber duns); + $self->{"employee_${_}"} = $myconfig->{$_} for qw(email tel fax name signature); + $self->{"employee_${_}"} = $defaults->$_ for qw(address businessnumber co_ustid company duns sepa_creditor_id taxnumber); } - map { $self->{"${_}"} = $myconfig->{$_}; } qw(co_ustid); - map { $self->{"myconfig_${_}"} = $myconfig->{$_} } grep { $_ ne 'dbpasswd' } keys %{ $myconfig }; + $self->{"myconfig_${_}"} = $myconfig->{$_} for grep { $_ ne 'dbpasswd' } keys %{ $myconfig }; + $self->{$_} = $defaults->$_ for qw(co_ustid); + $self->{"myconfig_${_}"} = $defaults->$_ for qw(address businessnumber co_ustid company duns sepa_creditor_id taxnumber); $self->{copies} = 1 if (($self->{copies} *= 1) <= 0); @@ -1104,7 +1097,6 @@ sub parse_template { map { $mail->{$_} = $self->{$_} } qw(cc bcc subject message version format); - $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} = time() . '.' . $$ . '.'; @@ -1361,22 +1353,13 @@ sub datetonum { # Database routines used throughout -sub _dbconnect_options { - my $self = shift; - my $options = { pg_enable_utf8 => $::locale->is_utf8, - @_ }; - - return $options; -} - sub dbconnect { $main::lxdebug->enter_sub(2); my ($self, $myconfig) = @_; # connect to database - my $dbh = SL::DBConnect->connect($myconfig->{dbconnect}, $myconfig->{dbuser}, $myconfig->{dbpasswd}, $self->_dbconnect_options) - or $self->dberror; + my $dbh = SL::DBConnect->connect or $self->dberror; # set db options if ($myconfig->{dboptions}) { @@ -1394,8 +1377,7 @@ sub dbconnect_noauto { my ($self, $myconfig) = @_; # connect to database - my $dbh = SL::DBConnect->connect($myconfig->{dbconnect}, $myconfig->{dbuser}, $myconfig->{dbpasswd}, $self->_dbconnect_options(AutoCommit => 0)) - or $self->dberror; + my $dbh = SL::DBConnect->connect(SL::DBConnect->get_connect_args(AutoCommit => 0)) or $self->dberror; # set db options if ($myconfig->{dboptions}) { @@ -1435,18 +1417,18 @@ sub date_closed { my $sth = prepare_execute_query($self, $dbh, $query, conv_date($date)); # Falls $date = '' - Fehlermeldung aus der Datenbank. Ich denke, - # es ist sicher ein conv_date vorher IMMER auszuführen. - # Testfälle ohne definiertes closedto: + # es ist sicher ein conv_date vorher IMMER auszuführen. + # Testfälle ohne definiertes closedto: # Leere Datumseingabe i.O. # SELECT 1 FROM defaults WHERE '' < closedto - # normale Zahlungsbuchung über Rechnungsmaske i.O. + # normale Zahlungsbuchung über Rechnungsmaske i.O. # SELECT 1 FROM defaults WHERE '10.05.2011' < closedto - # Testfälle mit definiertem closedto (30.04.2011): + # Testfälle mit definiertem closedto (30.04.2011): # Leere Datumseingabe i.O. # SELECT 1 FROM defaults WHERE '' < closedto - # normale Buchung im geschloßenem Zeitraum i.O. + # normale Buchung im geschloßenem Zeitraum i.O. # SELECT 1 FROM defaults WHERE '21.04.2011' < closedto - # Fehlermeldung: Es können keine Zahlungen für abgeschlossene Bücher gebucht werden! + # Fehlermeldung: Es können keine Zahlungen für abgeschlossene Bücher gebucht werden! # normale Buchung in aktiver Buchungsperiode i.O. # SELECT 1 FROM defaults WHERE '01.05.2011' < closedto @@ -1457,6 +1439,24 @@ sub date_closed { return $closed; } +# prevents bookings to the to far away future +sub date_max_future { + $main::lxdebug->enter_sub(); + + my ($self, $date, $myconfig) = @_; + my $dbh = $self->dbconnect($myconfig); + + my $query = "SELECT 1 FROM defaults WHERE ? - current_date > max_future_booking_interval"; + my $sth = prepare_execute_query($self, $dbh, $query, conv_date($date)); + + my ($max_future_booking_interval) = $sth->fetchrow_array; + + $main::lxdebug->leave_sub(); + + return $max_future_booking_interval; +} + + sub update_balance { $main::lxdebug->enter_sub(); @@ -1629,16 +1629,9 @@ sub get_all_currencies { my $self = shift; my $myconfig = shift || \%::myconfig; my $dbh = $self->get_standard_dbh($myconfig); - my @currencies =(); - - my $query = qq|SELECT name AS curr FROM currencies|; - my $sth = prepare_execute_query($self, $dbh, $query); - - while (my $ref = $sth->fetchrow_hashref()) { - push(@currencies, $ref->{curr}); - } - $sth->finish; + my $query = qq|SELECT name FROM currencies|; + my @currencies = map { $_->{name} } selectall_hashref_query($self, $dbh, $query); $main::lxdebug->leave_sub(); @@ -1903,6 +1896,7 @@ sub get_employee_data { my $self = shift; my %params = @_; + my $defaults = SL::DB::Default->get; Common::check_params(\%params, qw(prefix)); Common::check_params_x(\%params, qw(id)); @@ -1919,7 +1913,8 @@ sub get_employee_data { if ($login) { my $user = User->new(login => $login); - map { $self->{$params{prefix} . "_${_}"} = $user->{$_}; } qw(address businessnumber co_ustid company duns email fax name signature taxnumber tel); + $self->{$params{prefix} . "_${_}"} = $user->{$_} for qw(email fax name signature tel); + $self->{$params{prefix} . "_${_}"} = $defaults->$_ for qw(address businessnumber co_ustid company duns taxnumber); $self->{$params{prefix} . '_login'} = $login; $self->{$params{prefix} . '_name'} ||= $login; @@ -2497,14 +2492,14 @@ sub all_vc { $table = $table eq "customer" ? "customer" : "vendor"; # build selection list - # Hotfix für Bug 1837 - Besser wäre es alte Buchungsbelege + # Hotfix für Bug 1837 - Besser wäre es alte Buchungsbelege # OHNE Auswahlliste (reines Textfeld) zu laden. Hilft aber auch - # nicht für veränderbare Belege (oe, do, ...) + # nicht für veränderbare Belege (oe, do, ...) my $obsolete = $self->{id} ? '' : "WHERE NOT obsolete"; my $query = qq|SELECT count(*) FROM $table $obsolete|; my ($count) = selectrow_query($self, $dbh, $query); - if ($count < $myconfig->{vclimit}) { + if ($count <= $myconfig->{vclimit}) { $query = qq|SELECT id, name, salesman_id FROM $table $obsolete ORDER BY name|; @@ -3374,17 +3369,24 @@ sub restore_vars { sub prepare_for_printing { my ($self) = @_; - $self->{templates} ||= $::myconfig{templates}; + my $defaults = SL::DB::Default->get; + + $self->{templates} ||= $defaults->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)$/; + # Several fields that used to reside in %::myconfig (stored in + # auth.user_config) are now stored in defaults. Copy them over for + # compatibility. + $self->{$_} = $defaults->$_ for qw(company address taxnumber co_ustid duns sepa_creditor_id); + # 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}; + $self->{shiptoname} = $defaults->company; + $self->{shiptostreet} = $defaults->address; } my $language = $self->{language} ? '_' . $self->{language} : ''; @@ -3426,7 +3428,7 @@ sub prepare_for_printing { } my $printer_code = $self->{printer_code} ? '_' . $self->{printer_code} : ''; - my $email_extension = -f "$::myconfig{templates}/$self->{formname}_email${language}.${extension}" ? '_email' : ''; + my $email_extension = -f ($defaults->templates . "/$self->{formname}_email${language}.${extension}") ? '_email' : ''; $self->{IN} = "$self->{formname}${email_extension}${language}${printer_code}.${extension}"; # Format dates.