X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FForm.pm;h=a10880d5678ec752d90629bb7c3266a73e223653;hb=98e5f0698f9419d600ee8652620217d17a3392f2;hp=3ad3b25ef590f5f5fe4981c7c1a6c7730b74be1e;hpb=f65faf202a24a1f1316f45e3695d3d9390dc0793;p=kivitendo-erp.git diff --git a/SL/Form.pm b/SL/Form.pm index 3ad3b25ef..a10880d56 100644 --- a/SL/Form.pm +++ b/SL/Form.pm @@ -45,6 +45,7 @@ use CGI::Ajax; use SL::DBUtils; use SL::Menu; use SL::User; +use SL::Common; use CGI; sub _input_to_hash { @@ -132,6 +133,11 @@ sub new { my $self = {}; + if ($LXDebug::watch_form) { + require SL::Watchdog; + tie %{ $self }, 'SL::Watchdog'; + } + read(STDIN, $_, $ENV{CONTENT_LENGTH}); if ($ENV{QUERY_STRING}) { @@ -252,6 +258,8 @@ sub hide_form { sub error { $main::lxdebug->enter_sub(); + $main::lxdebug->show_backtrace(); + my ($self, $msg) = @_; if ($ENV{HTTP_USER_AGENT}) { $msg =~ s/\n/
/g; @@ -347,7 +355,7 @@ sub header { return; } - my ($stylesheet, $favicon, $charset); + my ($stylesheet, $favicon); if ($ENV{HTTP_USER_AGENT}) { @@ -365,23 +373,15 @@ sub header { |; } - if ($self->{charset}) { - $charset = - qq| - |; - } + my $db_charset = $main::dbcharset ? $main::dbcharset : Common::DEFAULT_CHARSET; + if ($self->{landscape}) { $pagelayout = qq||; } - if ($self->{fokus}) { - $fokus = qq||; - } + + my $fokus = qq| document.$self->{fokus}.focus();| if ($self->{"fokus"}); #Set Calendar my $jsscript = ""; @@ -404,7 +404,7 @@ function fokus(){document.$self->{fokus}.focus();} foreach $item (@ { $self->{AJAX} }) { $ajax .= $item->show_javascript(); } - print qq|Content-Type: text/html + print qq|Content-Type: text/html; charset=${db_charset}; @@ -412,10 +412,18 @@ function fokus(){document.$self->{fokus}.focus();} $stylesheet $pagelayout $favicon - $charset + $jsscript $ajax - $fokus + + + @@ -458,7 +466,7 @@ sub parse_html_template { (-f "templates/webpages/${file}_master.html") && ((stat("templates/webpages/${file}_master.html"))[9] > (stat("templates/webpages/${file}_${language}.html"))[9])) { - my $info = "Developper information: templates/webpages/${file}_master.html is newer than the localized version.\n" . + my $info = "Developer information: templates/webpages/${file}_master.html is newer than the localized version.\n" . "Please re-run 'locales.pl' in 'locale/${language}'."; print(qq|
$info
|); die($info); @@ -500,7 +508,6 @@ sub parse_html_template { $additional_params->{"myconfig_jsc_dateformat"} = $jsc_dateformat; } - $additional_params->{"conf_jscalendar"} = $main::jscalendar; $additional_params->{"conf_lizenzen"} = $main::lizenzen; $additional_params->{"conf_latex_templates"} = $main::latex; $additional_params->{"conf_opendocument_templates"} = $main::opendocument_templates; @@ -723,7 +730,9 @@ sub parse_template { $main::lxdebug->enter_sub(); my ($self, $myconfig, $userspath) = @_; - my $template; + my ($template, $out); + + local (*IN, *OUT); $self->{"cwd"} = getcwd(); $self->{"tmpdir"} = $self->{cwd} . "/${userspath}"; @@ -766,7 +775,19 @@ sub parse_template { # OUT is used for the media, screen, printer, email # for postscript we store a copy in a temporary file my $fileid = time; - $self->{tmpfile} = "$userspath/${fileid}.$self->{IN}" if ( $self->{tmpfile} eq '' ); + my $prepend_userspath; + + if (!$self->{tmpfile}) { + $self->{tmpfile} = "${fileid}.$self->{IN}"; + $prepend_userspath = 1; + } + + $prepend_userspath = 1 if substr($self->{tmpfile}, 0, length $userspath) eq $userspath; + + $self->{tmpfile} =~ s|.*/||; + $self->{tmpfile} =~ s/[^a-zA-Z0-9\._\ \-]//g; + $self->{tmpfile} = "$userspath/$self->{tmpfile}" if $prepend_userspath; + if ($template->uses_temp_file() || $self->{media} eq 'email') { $out = $self->{OUT}; $self->{OUT} = ">$self->{tmpfile}"; @@ -795,8 +816,9 @@ sub parse_template { my $mail = new Mailer; map { $mail->{$_} = $self->{$_} } - qw(cc bcc subject message version format charset); - $mail->{to} = qq|$self->{email}|; + qw(cc bcc subject message version format); + $mail->{charset} = $main::dbcharset ? $main::dbcharset : Common::DEFAULT_CHARSET; + $mail->{to} = $self->{EMAIL_RECIPIENT} ? $self->{EMAIL_RECIPIENT} : $self->{email}; $mail->{from} = qq|"$myconfig->{name}" <$myconfig->{email}>|; $mail->{fileid} = "$fileid."; $myconfig->{signature} =~ s/\\r\\n/\\n/g; @@ -832,7 +854,7 @@ sub parse_template { } - my $err = $mail->send($out); + my $err = $mail->send(); $self->error($self->cleanup . "$err") if ($err); } else { @@ -853,7 +875,10 @@ sub parse_template { open(OUT, $self->{OUT}) or $self->error($self->cleanup . "$self->{OUT} : $!"); } else { - $self->{attachment_filename} = $self->{tmpfile} if ($self->{attachment_filename} eq ''); + $self->{attachment_filename} = ($self->{attachment_filename}) + ? $self->{attachment_filename} + : $self->generate_attachment_filename(); + # launch application print qq|Content-Type: | . $template->get_mime_type() . qq| Content-Disposition: attachment; filename="$self->{attachment_filename}" @@ -885,6 +910,48 @@ Content-Length: $numbytes $main::lxdebug->leave_sub(); } +sub generate_attachment_filename { + my ($self) = @_; + + my %formname_translations = ( + bin_list => $main::locale->text('Bin List'), + credit_note => $main::locale->text('Credit Note'), + invoice => $main::locale->text('Invoice'), + packing_list => $main::locale->text('Packing List'), + pick_list => $main::locale->text('Pick List'), + proforma => $main::locale->text('Proforma Invoice'), + purchase_order => $main::locale->text('Purchase Order'), + request_quotation => $main::locale->text('RFQ'), + sales_order => $main::locale->text('Confirmation'), + sales_quotation => $main::locale->text('Quotation'), + storno_invoice => $main::locale->text('Storno Invoice'), + storno_packing_list => $main::locale->text('Storno Packing List'), + ); + + my $attachment_filename = $formname_translations{$self->{"formname"}}; + my $prefix = + (grep { $self->{"type"} eq $_ } qw(invoice credit_note)) ? "inv" + : ($self->{"type"} =~ /_quotation$/) ? "quo" + : "ord"; + + if ($attachment_filename && $self->{"${prefix}number"}) { + $attachment_filename .= "_" . $self->{"${prefix}number"} + . ( $self->{format} =~ /pdf/i ? ".pdf" + : $self->{format} =~ /postscript/i ? ".ps" + : $self->{format} =~ /opendocument/i ? ".odt" + : $self->{format} =~ /html/i ? ".html" + : ""); + $attachment_filename =~ s/ /_/g; + my %umlaute = ( "ä" => "ae", "ö" => "oe", "ü" => "ue", + "Ä" => "Ae", "Ö" => "Oe", "Ü" => "Ue", "ß" => "ss"); + map { $attachment_filename =~ s/$_/$umlaute{$_}/g } keys %umlaute; + } else { + $attachment_filename = ""; + } + + return $attachment_filename; +} + sub cleanup { $main::lxdebug->enter_sub(); @@ -1452,10 +1519,7 @@ sub _get_shipto { $key = "all_shipto" unless ($key); # get shipping addresses - my $query = - qq|SELECT shipto_id, shiptoname, shiptodepartment_1 | . - qq|FROM shipto | . - qq|WHERE trans_id = ?|; + my $query = qq|SELECT * FROM shipto WHERE trans_id = ?|; $self->{$key} = selectall_hashref_query($self, $dbh, $query, $vc_id); @@ -1469,7 +1533,7 @@ sub _get_printers { $key = "all_printers" unless ($key); - my $query = qq|SELECT id, printer_description, printer_command FROM printers|; + my $query = qq|SELECT id, printer_description, printer_command, template_code FROM printers|; $self->{$key} = selectall_hashref_query($self, $dbh, $query); @@ -1514,6 +1578,20 @@ sub _get_taxcharts { $main::lxdebug->leave_sub(); } +sub _get_taxzones { + $main::lxdebug->enter_sub(); + + my ($self, $dbh, $key) = @_; + + $key = "all_taxzones" unless ($key); + + my $query = qq|SELECT * FROM tax_zones ORDER BY id|; + + $self->{$key} = selectall_hashref_query($self, $dbh, $query); + + $main::lxdebug->leave_sub(); +} + sub _get_employees { $main::lxdebug->enter_sub(); @@ -1538,6 +1616,104 @@ sub _get_business_types { $main::lxdebug->leave_sub(); } +sub _get_languages { + $main::lxdebug->enter_sub(); + + my ($self, $dbh, $key) = @_; + + $key = "all_languages" unless ($key); + + my $query = qq|SELECT * FROM language ORDER BY id|; + + $self->{$key} = selectall_hashref_query($self, $dbh, $query); + + $main::lxdebug->leave_sub(); +} + +sub _get_dunning_configs { + $main::lxdebug->enter_sub(); + + my ($self, $dbh, $key) = @_; + + $key = "all_dunning_configs" unless ($key); + + my $query = qq|SELECT * FROM dunning_config ORDER BY dunning_level|; + + $self->{$key} = selectall_hashref_query($self, $dbh, $query); + + $main::lxdebug->leave_sub(); +} + +sub _get_currencies { +$main::lxdebug->enter_sub(); + + my ($self, $dbh, $key) = @_; + + $key = "all_currencies" unless ($key); + + my $query = qq|SELECT curr AS currency FROM defaults|; + + $self->{$key} = [split(/\:/ , selectfirst_hashref_query($self, $dbh, $query)->{currency})]; + + $main::lxdebug->leave_sub(); +} + +sub _get_payments { +$main::lxdebug->enter_sub(); + + my ($self, $dbh, $key) = @_; + + $key = "all_payments" unless ($key); + + my $query = qq|SELECT * FROM payment_terms ORDER BY id|; + + $self->{$key} = selectall_hashref_query($self, $dbh, $query); + + $main::lxdebug->leave_sub(); +} + +sub _get_customers { + $main::lxdebug->enter_sub(); + + my ($self, $dbh, $key) = @_; + + $key = "all_customers" unless ($key); + + my $query = qq|SELECT * FROM customer|; + + $self->{$key} = selectall_hashref_query($self, $dbh, $query); + + $main::lxdebug->leave_sub(); +} + +sub _get_vendors { + $main::lxdebug->enter_sub(); + + my ($self, $dbh, $key) = @_; + + $key = "all_vendors" unless ($key); + + my $query = qq|SELECT * FROM vendor|; + + $self->{$key} = selectall_hashref_query($self, $dbh, $query); + + $main::lxdebug->leave_sub(); +} + +sub _get_departments { + $main::lxdebug->enter_sub(); + + my ($self, $dbh, $key) = @_; + + $key = "all_departments" unless ($key); + + my $query = qq|SELECT * FROM department|; + + $self->{$key} = selectall_hashref_query($self, $dbh, $query); + + $main::lxdebug->leave_sub(); +} + sub get_lists { $main::lxdebug->enter_sub(); @@ -1568,6 +1744,10 @@ sub get_lists { $self->_get_printers($dbh, $params{"printers"}); } + if ($params{"languages"}) { + $self->_get_languages($dbh, $params{"languages"}); + } + if ($params{"charts"}) { $self->_get_charts($dbh, $params{"charts"}); } @@ -1576,6 +1756,10 @@ sub get_lists { $self->_get_taxcharts($dbh, $params{"taxcharts"}); } + if ($params{"taxzones"}) { + $self->_get_taxzones($dbh, $params{"taxzones"}); + } + if ($params{"employees"}) { $self->_get_employees($dbh, $params{"employees"}); } @@ -1584,6 +1768,30 @@ sub get_lists { $self->_get_business_types($dbh, $params{"business_types"}); } + if ($params{"dunning_configs"}) { + $self->_get_dunning_configs($dbh, $params{"dunning_configs"}); + } + + if($params{"currencies"}) { + $self->_get_currencies($dbh, $params{"currencies"}); + } + + if($params{"customers"}) { + $self->_get_customers($dbh, $params{"customers"}); + } + + if($params{"vendors"}) { + $self->_get_vendors($dbh, $params{"vendors"}); + } + + if($params{"payments"}) { + $self->_get_payments($dbh, $params{"payments"}); + } + + if($params{"departments"}) { + $self->_get_departments($dbh, $params{"departments"}); + } + $dbh->disconnect(); $main::lxdebug->leave_sub(); @@ -1822,7 +2030,7 @@ sub create_links { $sth = $dbh->prepare($query); - do_statement($form, $sth, $query, '%' . $module . '%'); + do_statement($self, $sth, $query, '%' . $module . '%'); $self->{accounts} = ""; while ($ref = $sth->fetchrow_hashref(NAME_lc)) { @@ -1847,16 +2055,12 @@ sub create_links { # get taxkeys and description $query = qq|SELECT id, taxkey, taxdescription FROM tax|; - $self->{TAXKEY} = selectall_hashref_query($form, $dbh, $query); - - # get tax zones - $query = qq|SELECT id, description FROM tax_zones|; - $self->{TAXZONE} = selectall_hashref_query($form, $dbh, $query); + $self->{TAXKEY} = selectall_hashref_query($self, $dbh, $query); if (($module eq "AP") || ($module eq "AR")) { # get tax rates and description $query = qq|SELECT * FROM tax|; - $self->{TAX} = selectall_hashref_query($form, $dbh, $query); + $self->{TAX} = selectall_hashref_query($self, $dbh, $query); } if ($self->{id}) { @@ -1886,17 +2090,16 @@ sub create_links { } # now get the account numbers - $query = qq| - SELECT - c.accno, c.description, c.link, c.taxkey_id, - tk.tax_id - FROM chart c - LEFT JOIN taxkeys tk ON (tk.chart_id = c.id) - WHERE (c.link LIKE ?) AND (tk.chart_id = c.id) AND NOT (c.link LIKE '%_tax%') - ORDER BY c.accno|; + $query = qq|SELECT c.accno, c.description, c.link, c.taxkey_id, tk.tax_id + FROM chart c + LEFT JOIN taxkeys tk ON (tk.chart_id = c.id) + WHERE c.link LIKE ? + AND (tk.id = (SELECT id FROM taxkeys WHERE taxkeys.chart_id = c.id AND startdate <= $transdate ORDER BY startdate DESC LIMIT 1) + OR c.link LIKE '%_tax%') + ORDER BY c.accno|; $sth = $dbh->prepare($query); - do_statement($form, $sth, $query, "%" . $module . "%"); + do_statement($self, $sth, $query, "%$module%"); $self->{accounts} = ""; while ($ref = $sth->fetchrow_hashref(NAME_lc)) { @@ -1941,7 +2144,7 @@ sub create_links { AND a.fx_transaction = '0' ORDER BY a.oid, a.transdate|; $sth = $dbh->prepare($query); - do_statement($form, $sth, $query, $self->{id}); + do_statement($self, $sth, $query, $self->{id}); # get exchangerate for currency $self->{exchangerate} = @@ -2240,6 +2443,7 @@ sub save_status { # $main::locale->text('PRINTED') # $main::locale->text('MAILED') # $main::locale->text('SCREENED') +# $main::locale->text('CANCELED') # $main::locale->text('invoice') # $main::locale->text('proforma') # $main::locale->text('sales_order') @@ -2261,10 +2465,10 @@ sub save_history { } my $query = - qq|INSERT INTO history_erp (trans_id, employee_id, addition, what_done) | . - qq|VALUES (?, ?, ?, ?)|; + qq|INSERT INTO history_erp (trans_id, employee_id, addition, what_done, snumbers) | . + qq|VALUES (?, ?, ?, ?, ?)|; my @values = (conv_i($self->{id}), conv_i($self->{employee_id}), - $self->{addition}, $self->{what_done}); + $self->{addition}, $self->{what_done}, "$self->{snumbers}"); do_query($self, $dbh, $query, @values); $main::lxdebug->leave_sub(); @@ -2273,18 +2477,17 @@ sub save_history { sub get_history { $main::lxdebug->enter_sub(); - my $self = shift(); - my $dbh = shift(); - my $trans_id = shift(); - my $restriction = shift(); + my ($self, $dbh, $trans_id, $restriction, $order) = @_; + my ($orderBy, $desc) = split(/\-\-/, $order); + $order = " ORDER BY " . ($order eq "" ? " h.itime " : ($desc == 1 ? $orderBy . " DESC " : $orderBy . " ")); my @tempArray; my $i = 0; if ($trans_id ne "") { my $query = - qq|SELECT h.employee_id, h.itime::timestamp(0) AS itime, h.addition, h.what_done, emp.name | . + qq|SELECT h.employee_id, h.itime::timestamp(0) AS itime, h.addition, h.what_done, emp.name, h.snumbers, h.trans_id AS id | . qq|FROM history_erp h | . qq|LEFT JOIN employee emp ON (emp.id = h.employee_id) | . - qq|WHERE trans_id = ? | + qq|WHERE trans_id = ? |. $order . $restriction; my $sth = $dbh->prepare($query) || $self->dberror($query); @@ -2294,9 +2497,10 @@ sub get_history { while(my $hash_ref = $sth->fetchrow_hashref()) { $hash_ref->{addition} = $main::locale->text($hash_ref->{addition}); $hash_ref->{what_done} = $main::locale->text($hash_ref->{what_done}); + $hash_ref->{snumbers} =~ s/^.+_(.*)$/$1/g; $tempArray[$i++] = $hash_ref; } - $main::lxdebug->leave_sub() and return \@tempArray + $main::lxdebug->leave_sub() and return \@tempArray if ($i > 0 && $tempArray[0] ne ""); } $main::lxdebug->leave_sub(); @@ -2321,11 +2525,8 @@ sub update_defaults { my ($var) = $sth->fetchrow_array; $sth->finish; - if ($var =~ /^(.*?)(\d+)$/) { - $var = "$1" . ($2 + 1); - } else { - $var++; - } + $var =~ s/\d+$/ sprintf '%0*d', length($&), $&+1 /e; + $var ||= 1; $query = qq|UPDATE defaults SET $fld = ?|; do_query($self, $dbh, $query, $var); @@ -2356,13 +2557,8 @@ sub update_business { WHERE id = ? FOR UPDATE|; my ($var) = selectrow_query($self, $dbh, $query, $business_id); - if ($var ne "") { - if ($var =~ /^(.*?)(\d+)$/) { - $var = "$1" . ($2 + 1); - } else { - $var++; - } - } + $var =~ s/\d+$/ sprintf '%0*d', length($&), $&+1 /e; + $query = qq|UPDATE business SET customernumberinit = ? WHERE id = ?|; @@ -2420,7 +2616,7 @@ sub get_partsgroup { @values = ($p->{language_code}); } - $self->{all_partsgroups} = selectall_hashref_query($self, $dbh, $query, @values); + $self->{all_partsgroup} = selectall_hashref_query($self, $dbh, $query, @values); $dbh->disconnect; $main::lxdebug->leave_sub();