From: Thomas Heck Date: Wed, 27 Feb 2013 13:44:58 +0000 (+0100) Subject: Merge branch 'master' into dev X-Git-Tag: release-3.1.0beta1~554^2~1^2~7 X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/commitdiff_plain/6061749dc0ece2873ef61a0c14af1b8a9e46034a?hp=224291ddfd1633e2e3a47632cca24c1039fcb105 Merge branch 'master' into dev --- diff --git a/SL/AM.pm b/SL/AM.pm index c7a88d2df..5645c4dd7 100644 --- a/SL/AM.pm +++ b/SL/AM.pm @@ -1779,7 +1779,9 @@ sub get_tax { taxkey, taxdescription, round(rate * 100, 2) AS rate, - chart_id + chart_id, + (id IN (SELECT tax_id + FROM acc_trans)) AS tax_already_used FROM tax WHERE id = ? |; diff --git a/SL/AP.pm b/SL/AP.pm index 03a21e3c6..54abcd17e 100644 --- a/SL/AP.pm +++ b/SL/AP.pm @@ -209,24 +209,28 @@ sub post_transaction { # insert detail records in acc_trans $query = qq|INSERT INTO acc_trans | . - qq| (trans_id, chart_id, amount, transdate, project_id, taxkey, tax_id)| . + qq| (trans_id, chart_id, amount, transdate, project_id, taxkey, tax_id, chart_link)| . qq|VALUES (?, (SELECT c.id FROM chart c WHERE c.accno = ?), | . - qq| ?, ?, ?, ?, ?)|; + qq| ?, ?, ?, ?, ?,| . + qq| (SELECT c.link FROM chart c WHERE c.accno = ?))|; @values = ($form->{id}, $form->{AP_amounts}{"amount_$i"}, $form->{"amount_$i"}, conv_date($form->{transdate}), - $project_id, $form->{"taxkey_$i"}, conv_i($form->{"tax_id_$i"})); + $project_id, $form->{"taxkey_$i"}, conv_i($form->{"tax_id_$i"}), + $form->{AP_amounts}{"amount_$i"}); do_query($form, $dbh, $query, @values); if ($form->{"tax_$i"} != 0) { # insert detail records in acc_trans $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, | . - qq| project_id, taxkey, tax_id) | . + qq| project_id, taxkey, tax_id, chart_link) | . qq|VALUES (?, (SELECT c.id FROM chart c WHERE c.accno = ?), | . - qq| ?, ?, ?, ?, ?)|; + qq| ?, ?, ?, ?, ?,| . + qq| (SELECT c.link FROM chart c WHERE c.accno = ?))|; @values = ($form->{id}, $form->{AP_amounts}{"tax_$i"}, $form->{"tax_$i"}, conv_date($form->{transdate}), - $project_id, $form->{"taxkey_$i"}, conv_i($form->{"tax_id_$i"})); + $project_id, $form->{"taxkey_$i"}, conv_i($form->{"tax_id_$i"}), + $form->{AP_amounts}{"tax_$i"}); do_query($form, $dbh, $query, @values); } @@ -235,7 +239,7 @@ sub post_transaction { # add payables $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey, tax_id) | . + qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey, tax_id, chart_link) | . qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, | . qq| (SELECT taxkey_id FROM chart WHERE accno = ?),| . qq| (SELECT tax_id| . @@ -244,9 +248,11 @@ sub post_transaction { qq| FROM chart| . qq| WHERE accno = ?)| . qq| AND startdate <= ?| . - qq| ORDER BY startdate DESC LIMIT 1))|; + qq| ORDER BY startdate DESC LIMIT 1),| . + qq| (SELECT c.link FROM chart c WHERE c.accno = ?))|; @values = ($form->{id}, $form->{AP_amounts}{payables}, $form->{payables}, - conv_date($form->{transdate}), $form->{AP_amounts}{payables}, $form->{AP_amounts}{payables}, conv_date($form->{transdate})); + conv_date($form->{transdate}), $form->{AP_amounts}{payables}, $form->{AP_amounts}{payables}, conv_date($form->{transdate}), + $form->{AP_amounts}{payables}); do_query($form, $dbh, $query, @values); } @@ -290,7 +296,7 @@ sub post_transaction { 2); if ($form->{payables}) { $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id, taxkey, tax_id) | . + qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id, taxkey, tax_id, chart_link) | . qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, | . qq| (SELECT taxkey_id FROM chart WHERE accno = ?),| . qq| (SELECT tax_id| . @@ -299,10 +305,12 @@ sub post_transaction { qq| FROM chart| . qq| WHERE accno = ?)| . qq| AND startdate <= ?| . - qq| ORDER BY startdate DESC LIMIT 1))|; + qq| ORDER BY startdate DESC LIMIT 1),| . + qq| (SELECT c.link FROM chart c WHERE c.accno = ?))|; @values = ($form->{id}, $form->{AP_payables}, $amount, conv_date($form->{"datepaid_$i"}), $project_id, - $form->{AP_payables}, $form->{AP_payables}, conv_date($form->{"datepaid_$i"})); + $form->{AP_payables}, $form->{AP_payables}, conv_date($form->{"datepaid_$i"}), + $form->{AP_payables}); do_query($form, $dbh, $query, @values); } $form->{payables} = $amount; @@ -310,7 +318,7 @@ sub post_transaction { # add payment my $gldate = (conv_date($form->{"gldate_$i"}))? conv_date($form->{"gldate_$i"}) : conv_date($form->current_date($myconfig)); $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, gldate, source, memo, project_id, taxkey, tax_id) | . + qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, gldate, source, memo, project_id, taxkey, tax_id, chart_link) | . qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, ?, ?, ?, | . qq| (SELECT taxkey_id FROM chart WHERE accno = ?), | . qq| (SELECT tax_id| . @@ -319,11 +327,13 @@ sub post_transaction { qq| FROM chart| . qq| WHERE accno = ?)| . qq| AND startdate <= ?| . - qq| ORDER BY startdate DESC LIMIT 1))|; + qq| ORDER BY startdate DESC LIMIT 1),| . + qq| (SELECT c.link FROM chart c WHERE c.accno = ?))|; @values = ($form->{id}, $form->{"AP_paid_account_$i"}, $form->{"paid_$i"}, conv_date($form->{"datepaid_$i"}), $gldate, $form->{"source_$i"}, $form->{"memo_$i"}, $project_id, $form->{"AP_paid_account_$i"}, - $form->{"AP_paid_account_$i"}, conv_date($form->{"datepaid_$i"})); + $form->{"AP_paid_account_$i"}, conv_date($form->{"datepaid_$i"}), + $form->{"AP_paid_account_$i"}); do_query($form, $dbh, $query, @values); # add exchange rate difference @@ -332,7 +342,7 @@ sub post_transaction { ($form->{"exchangerate_$i"} - 1), 2); if ($amount != 0) { $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, fx_transaction, cleared, project_id, taxkey, tax_id) | . + qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, fx_transaction, cleared, project_id, taxkey, tax_id, chart_link) | . qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, 't', 'f', ?, | . qq| (SELECT taxkey_id FROM chart WHERE accno = ?), | . qq| (SELECT tax_id| . @@ -341,11 +351,13 @@ sub post_transaction { qq| FROM chart| . qq| WHERE accno = ?)| . qq| AND startdate <= ?| . - qq| ORDER BY startdate DESC LIMIT 1))|; + qq| ORDER BY startdate DESC LIMIT 1),| . + qq| (SELECT c.link FROM chart c WHERE c.accno = ?))|; @values = ($form->{id}, $form->{"AP_paid_account_$i"}, $amount, conv_date($form->{"datepaid_$i"}), $project_id, $form->{"AP_paid_account_$i"}, - $form->{"AP_paid_account_$i"}, conv_date($form->{"datepaid_$i"})); + $form->{"AP_paid_account_$i"}, conv_date($form->{"datepaid_$i"}), + $form->{"AP_paid_account_$i"}); do_query($form, $dbh, $query, @values); } @@ -357,7 +369,7 @@ sub post_transaction { if ($amount != 0) { $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, fx_transaction, cleared, project_id, taxkey, tax_id) | . + qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, fx_transaction, cleared, project_id, taxkey, tax_id, chart_link) | . qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, 't', 'f', ?, | . qq| (SELECT taxkey_id FROM chart WHERE accno = ?)| . qq| (SELECT tax_id| . @@ -366,13 +378,14 @@ sub post_transaction { qq| FROM chart| . qq| WHERE accno = ?)| . qq| AND startdate <= ?| . - qq| ORDER BY startdate DESC LIMIT 1))|; - @values = ($form->{id}, ($amount > 0) ? - $form->{fxgain_accno} : $form->{fxloss_accno}, + qq| ORDER BY startdate DESC LIMIT 1),| . + qq| (SELECT c.link FROM chart c WHERE c.accno = ?))|; + @values = ($form->{id}, + ($amount > 0) ? $form->{fxgain_accno} : $form->{fxloss_accno}, $amount, conv_date($form->{"datepaid_$i"}), $project_id, - ($amount > 0) ? - $form->{fxgain_accno} : $form->{fxloss_accno}, - ($amount > 0) ? $form->{fxgain_accno} : $form->{fxloss_accno}, conv_date($form->{"datepaid_$i"})); + ($amount > 0) ? $form->{fxgain_accno} : $form->{fxloss_accno}, + ($amount > 0) ? $form->{fxgain_accno} : $form->{fxloss_accno}, conv_date($form->{"datepaid_$i"}), + ($amount > 0) ? $form->{fxgain_accno} : $form->{fxloss_accno}); do_query($form, $dbh, $query, @values); } diff --git a/SL/AR.pm b/SL/AR.pm index a953af44b..795849583 100644 --- a/SL/AR.pm +++ b/SL/AR.pm @@ -172,25 +172,25 @@ sub post_transaction { my $project_id = conv_i($form->{"project_id_$i"}); # insert detail records in acc_trans - $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id, taxkey, tax_id) - VALUES (?, (SELECT c.id FROM chart c WHERE c.accno = ?), ?, ?, ?, ?, ?)|; + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id, taxkey, tax_id, chart_link) + VALUES (?, (SELECT c.id FROM chart c WHERE c.accno = ?), ?, ?, ?, ?, ?, (SELECT c.link FROM chart c WHERE c.accno = ?))|; @values = (conv_i($form->{id}), $form->{AR_amounts}{"amount_$i"}, conv_i($form->{"amount_$i"}), conv_date($form->{transdate}), $project_id, - conv_i($form->{"taxkey_$i"}), conv_i($form->{"tax_id_$i"})); + conv_i($form->{"taxkey_$i"}), conv_i($form->{"tax_id_$i"}), $form->{AR_amounts}{"amount_$i"}); do_query($form, $dbh, $query, @values); if ($form->{"tax_$i"} != 0) { # insert detail records in acc_trans - $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id, taxkey, tax_id) - VALUES (?, (SELECT c.id FROM chart c WHERE c.accno = ?), ?, ?, ?, ?, ?)|; + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id, taxkey, tax_id, chart_link) + VALUES (?, (SELECT c.id FROM chart c WHERE c.accno = ?), ?, ?, ?, ?, ?, (SELECT c.link FROM chart c WHERE c.accno = ?))|; @values = (conv_i($form->{id}), $form->{AR_amounts}{"tax_$i"}, conv_i($form->{"tax_$i"}), conv_date($form->{transdate}), $project_id, - conv_i($form->{"taxkey_$i"}), conv_i($form->{"tax_id_$i"})); + conv_i($form->{"taxkey_$i"}), conv_i($form->{"tax_id_$i"}), $form->{AR_amounts}{"tax_$i"}); do_query($form, $dbh, $query, @values); } } } # add recievables - $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey, tax_id) + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey, tax_id, chart_link) VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, (SELECT taxkey_id FROM chart WHERE accno = ?), (SELECT tax_id FROM taxkeys @@ -198,9 +198,10 @@ sub post_transaction { FROM chart WHERE accno = ?) AND startdate <= ? - ORDER BY startdate DESC LIMIT 1))|; + ORDER BY startdate DESC LIMIT 1), + (SELECT c.link FROM chart c WHERE c.accno = ?))|; @values = (conv_i($form->{id}), $form->{AR_amounts}{receivables}, conv_i($form->{receivables}), conv_date($form->{transdate}), - $form->{AR_amounts}{receivables}, $form->{AR_amounts}{receivables}, conv_date($form->{transdate})); + $form->{AR_amounts}{receivables}, $form->{AR_amounts}{receivables}, conv_date($form->{transdate}), $form->{AR_amounts}{receivables}); do_query($form, $dbh, $query, @values); } else { @@ -237,7 +238,7 @@ sub post_transaction { if ($amount != 0) { # add receivable - $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id, taxkey, tax_id) + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id, taxkey, tax_id, chart_link) VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, (SELECT taxkey_id FROM chart WHERE accno = ?), (SELECT tax_id FROM taxkeys @@ -245,8 +246,11 @@ sub post_transaction { FROM chart WHERE accno = ?) AND startdate <= ? - ORDER BY startdate DESC LIMIT 1))|; - @values = (conv_i($form->{id}), $form->{AR}{receivables}, $amount, conv_date($form->{"datepaid_$i"}), $project_id, $form->{AR}{receivables}, $form->{AR}{receivables}, conv_date($form->{"datepaid_$i"})); + ORDER BY startdate DESC LIMIT 1), + (SELECT c.link FROM chart c WHERE c.accno = ?))|; + @values = (conv_i($form->{id}), $form->{AR}{receivables}, $amount, conv_date($form->{"datepaid_$i"}), $project_id, $form->{AR}{receivables}, $form->{AR}{receivables}, conv_date($form->{"datepaid_$i"}), + $form->{AR}{receivables}); + do_query($form, $dbh, $query, @values); } @@ -255,7 +259,7 @@ sub post_transaction { my $project_id = conv_i($form->{"paid_project_id_$i"}); my $gldate = (conv_date($form->{"gldate_$i"}))? conv_date($form->{"gldate_$i"}) : conv_date($form->current_date($myconfig)); $amount = $form->{"paid_$i"} * -1; - $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, gldate, source, memo, project_id, taxkey, tax_id) + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, gldate, source, memo, project_id, taxkey, tax_id, chart_link) VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, ?, ?, ?, (SELECT taxkey_id FROM chart WHERE accno = ?), (SELECT tax_id FROM taxkeys @@ -263,16 +267,17 @@ sub post_transaction { FROM chart WHERE accno = ?) AND startdate <= ? - ORDER BY startdate DESC LIMIT 1))|; + ORDER BY startdate DESC LIMIT 1), + (SELECT c.link FROM chart c WHERE c.accno = ?))|; @values = (conv_i($form->{id}), $form->{AR}{"paid_$i"}, $amount, conv_date($form->{"datepaid_$i"}), $gldate, $form->{"source_$i"}, $form->{"memo_$i"}, $project_id, $form->{AR}{"paid_$i"}, - $form->{AR}{"paid_$i"}, conv_date($form->{"datepaid_$i"})); + $form->{AR}{"paid_$i"}, conv_date($form->{"datepaid_$i"}), $form->{AR}{"paid_$i"}); do_query($form, $dbh, $query, @values); # exchangerate difference for payment $amount = $form->round_amount( $form->{"paid_$i"} * ($form->{"exchangerate_$i"} - 1) * -1, 2); if ($amount != 0) { - $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, fx_transaction, cleared, project_id, taxkey, tax_id) + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, fx_transaction, cleared, project_id, taxkey, tax_id, chart_link) VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, 't', 'f', ?, (SELECT taxkey_id FROM chart WHERE accno = ?), (SELECT tax_id FROM taxkeys @@ -280,9 +285,10 @@ sub post_transaction { FROM chart WHERE accno = ?) AND startdate <= ? - ORDER BY startdate DESC LIMIT 1))|; + ORDER BY startdate DESC LIMIT 1), + (SELECT c.link FROM chart c WHERE c.accno = ?))|; @values = (conv_i($form->{id}), $form->{AR}{"paid_$i"}, $amount, conv_date($form->{"datepaid_$i"}), $project_id, $form->{AR}{"paid_$i"}, - $form->{AR}{"paid_$i"}, conv_date($form->{"datepaid_$i"})); + $form->{AR}{"paid_$i"}, conv_date($form->{"datepaid_$i"}), $form->{AR}{"paid_$i"}); do_query($form, $dbh, $query, @values); } @@ -291,7 +297,7 @@ sub post_transaction { if ($amount != 0) { my $accno = ($amount > 0) ? $form->{fxgain_accno} : $form->{fxloss_accno}; - $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, fx_transaction, cleared, project_id, taxkey, tax_id) + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, fx_transaction, cleared, project_id, taxkey, tax_id, chart_link) VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, 't', 'f', ?, (SELECT taxkey_id FROM chart WHERE accno = ?), (SELECT tax_id FROM taxkeys @@ -299,8 +305,9 @@ sub post_transaction { FROM chart WHERE accno = ?) AND startdate <= ? - ORDER BY startdate DESC LIMIT 1))|; - @values = (conv_i($form->{id}), $accno, $amount, conv_date($form->{"datepaid_$i"}), $project_id, $accno, $accno, conv_date($form->{"datepaid_$i"})); + ORDER BY startdate DESC LIMIT 1), + (SELECT c.link FROM chart c WHERE c.accno = ?))|; + @values = (conv_i($form->{id}), $accno, $amount, conv_date($form->{"datepaid_$i"}), $project_id, $accno, $accno, conv_date($form->{"datepaid_$i"}), $accno); do_query($form, $dbh, $query, @values); } } diff --git a/SL/BackgroundJob/SelfTest/Transactions.pm b/SL/BackgroundJob/SelfTest/Transactions.pm index 881298d98..a7fe76364 100644 --- a/SL/BackgroundJob/SelfTest/Transactions.pm +++ b/SL/BackgroundJob/SelfTest/Transactions.pm @@ -309,7 +309,7 @@ sub check_stornos_ohne_partner { LEFT JOIN vendor v on (v.id = ap.vendor_id) WHERE storno_id is null AND storno is true AND ap.id not in (SELECT storno_id FROM ap WHERE storno_id is not null AND storno is true); |; - + my $stornos_ohne_partner = selectall_hashref_query($::form, $self->dbh, $query); $self->tester->ok(@$stornos_ohne_partner == 0, 'Es sollte keine Stornos ohne Partner geben'); diff --git a/SL/CT.pm b/SL/CT.pm index a32486b59..97f57c72c 100644 --- a/SL/CT.pm +++ b/SL/CT.pm @@ -614,13 +614,37 @@ sub search { my $where = "1 = 1"; my @values; - my %allowed_sort_columns = - map { $_, 1 } qw( - id customernumber vendornumber name contact phone fax email street - taxnumber business invnumber ordnumber quonumber zipcode city + my %allowed_sort_columns = ( + "id" => "id", + "customernumber" => "customernumber", + "vendornumber" => "vendornumber", + "name" => "ct.name", + "contact" => "contact", + "phone" => "phone", + "fax" => "fax", + "email" => "email", + "street" => "street", + "taxnumber" => "taxnumber", + "business" => "business", + "invnumber" => "invnumber", + "ordnumber" => "ordnumber", + "quonumber" => "quonumber", + "zipcode" => "zipcode", + "city" => "city", + "country" => "country", + "salesman" => "e.name" ); - my $sortorder = $form->{sort} && $allowed_sort_columns{$form->{sort}} ? $form->{sort} : "name"; - $form->{sort} = $sortorder; + + $form->{sort} ||= "name"; + my $sortorder; + if ( $join_records ) { + # in UNION case order by hash key, e.g. salesman + # the UNION created an implicit select around the result + $sortorder = $allowed_sort_columns{$form->{sort}} ? $form->{sort} : "name"; + } else { + # in not UNION case order by hash value, e.g. e.name + $sortorder = $allowed_sort_columns{$form->{sort}} ? $allowed_sort_columns{$form->{sort}} : "ct.name"; + } my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC'; if ($sortorder !~ /(business|id)/ && !$join_records) { @@ -659,6 +683,19 @@ sub search { push @values, ('%' . $form->{addr_city} . '%') x 2; } + if ($form->{addr_country}) { + $where .= " AND ((lower(ct.country) LIKE lower(?)) + OR + (ct.id IN ( + SELECT trans_id + FROM shipto + WHERE (module = 'CT') + AND (lower(shiptocountry) LIKE lower(?)) + )) + )"; + push @values, ('%' . $form->{addr_country} . '%') x 2; + } + if ( $form->{status} eq 'orphaned' ) { $where .= qq| AND ct.id NOT IN | . @@ -716,10 +753,11 @@ sub search { } my $query = - qq|SELECT ct.*, b.description AS business | . + qq|SELECT ct.*, b.description AS business, e.name as salesman | . (qq|, NULL AS invnumber, NULL AS ordnumber, NULL AS quonumber, NULL AS invid, NULL AS module, NULL AS formtype, NULL AS closed | x!! $join_records) . qq|FROM $cv ct | . qq|LEFT JOIN business b ON (ct.business_id = b.id) | . + qq|LEFT JOIN employee e ON (ct.salesman_id = e.id) | . qq|WHERE $where|; my @saved_values = @values; @@ -733,13 +771,14 @@ sub search { push(@values, @saved_values); $query .= qq| UNION | . - qq|SELECT ct.*, b.description AS business, | . + qq|SELECT ct.*, b.description AS business, e.name as salesman, | . qq| a.invnumber, a.ordnumber, a.quonumber, a.id AS invid, | . qq| '$module' AS module, 'invoice' AS formtype, | . qq| (a.amount = a.paid) AS closed | . qq|FROM $cv ct | . qq|JOIN $ar a ON (a.${cv}_id = ct.id) | . qq|LEFT JOIN business b ON (ct.business_id = b.id) | . + qq|LEFT JOIN employee e ON (ct.salesman_id = e.id) | . qq|WHERE $where AND (a.invoice = '1')|; } @@ -747,12 +786,13 @@ sub search { push(@values, @saved_values); $query .= qq| UNION | . - qq|SELECT ct.*, b.description AS business,| . + qq|SELECT ct.*, b.description AS business, e.name as salesman, | . qq| ' ' AS invnumber, o.ordnumber, o.quonumber, o.id AS invid, | . qq| 'oe' AS module, 'order' AS formtype, o.closed | . qq|FROM $cv ct | . qq|JOIN oe o ON (o.${cv}_id = ct.id) | . qq|LEFT JOIN business b ON (ct.business_id = b.id) | . + qq|LEFT JOIN employee e ON (ct.salesman_id = e.id) | . qq|WHERE $where AND (o.quotation = '0')|; } @@ -760,12 +800,13 @@ sub search { push(@values, @saved_values); $query .= qq| UNION | . - qq|SELECT ct.*, b.description AS business, | . + qq|SELECT ct.*, b.description AS business, e.name as salesman, | . qq| ' ' AS invnumber, o.ordnumber, o.quonumber, o.id AS invid, | . qq| 'oe' AS module, 'quotation' AS formtype, o.closed | . qq|FROM $cv ct | . qq|JOIN oe o ON (o.${cv}_id = ct.id) | . qq|LEFT JOIN business b ON (ct.business_id = b.id) | . + qq|LEFT JOIN employee e ON (ct.salesman_id = e.id) | . qq|WHERE $where AND (o.quotation = '1')|; } } diff --git a/SL/Common.pm b/SL/Common.pm index 726c4c8e2..159609d30 100644 --- a/SL/Common.pm +++ b/SL/Common.pm @@ -441,6 +441,9 @@ sub get_vc_details { $query = qq|SELECT * FROM contacts WHERE (cp_cv_id = ?)|; $form->{CONTACTS} = selectall_hashref_query($form, $dbh, $query, $vc_id); + # Only show default pricegroup for customer, not vendor, which is why this is outside the main query + ($form->{pricegroup}) = selectrow_query($form, $dbh, qq|SELECT pricegroup FROM pricegroup WHERE id = ?|, $form->{klass}); + $dbh->disconnect(); $main::lxdebug->leave_sub(); diff --git a/SL/Controller/Base.pm b/SL/Controller/Base.pm index aa65645ae..2d86f0f96 100644 --- a/SL/Controller/Base.pm +++ b/SL/Controller/Base.pm @@ -80,6 +80,7 @@ sub render { croak "Unsupported type: " . $options->{type} unless $options->{type} =~ m/^(?:html|js|json)$/; # The "template" argument must be a string or a reference to one. + $template = ${ $template } if ((ref($template) || '') eq 'REF') && (ref(${ $template }) eq 'SL::Presenter::EscapedText'); croak "Unsupported 'template' reference type: " . ref($template) if ref($template) && (ref($template) !~ m/^(?:SCALAR|SL::Presenter::EscapedText)$/); # If all output is turned off then don't output the header either. @@ -380,6 +381,11 @@ If C<$template> is a reference to a scalar then the referenced scalar's content is used as the content to process. The C option is not considered in this case. +C<$template> can also be an instance of L +or a reference to such an instance. Both of these cases are handled +the same way as if C<$template> were a reference to a scalar: its +content is processed, and C is not considered. + Other reference types, unknown options and unknown arguments to the C option cause the function to L. diff --git a/SL/Controller/RecordLinks.pm b/SL/Controller/RecordLinks.pm new file mode 100644 index 000000000..fd424b967 --- /dev/null +++ b/SL/Controller/RecordLinks.pm @@ -0,0 +1,35 @@ +package SL::Controller::RecordLinks; + +use strict; + +use parent qw(SL::Controller::Base); + +use SL::DB::Order; +use SL::DB::DeliveryOrder; +use SL::DB::Invoice; +use SL::DB::PurchaseInvoice; +use SL::Locale::String; + +# +# actions +# + +sub action_ajax_list { + my ($self) = @_; + + eval { + die $::locale->text("Invalid parameters") if (!$::form->{object_id} || ($::form->{object_model} !~ m/^(?:Order|DeliveryOrder|Invoice|PurchaseInvoice)$/)); + + my $model = 'SL::DB::' . $::form->{object_model}; + my $object = $model->new(id => $::form->{object_id})->load || die $::locale->text("Record not found"); + my $linked_records = $object->linked_records(direction => 'both'); + my $output = SL::Presenter->get->grouped_record_list($linked_records); + $self->render(\$output, { layout => 0, process => 0 }); + + 1; + } or do { + $self->render('generic/error', { layout => 0 }, label_error => $@); + }; +} + +1; diff --git a/SL/DATEV.pm b/SL/DATEV.pm index 875588859..b748d30d2 100644 --- a/SL/DATEV.pm +++ b/SL/DATEV.pm @@ -465,11 +465,11 @@ sub _get_transactions { next; } - # determine at which array position the reference value (called absumsatz) is + # determine at which array position the reference value (called absumsatz) is # and which amount it has for my $j (0 .. (scalar(@{$trans}) - 1)) { - + # Three cases: # 1: gl transaction (Dialogbuchung), invoice is false, no double split booking allowed diff --git a/SL/DB/Invoice.pm b/SL/DB/Invoice.pm index dd26532e0..77d6769a8 100644 --- a/SL/DB/Invoice.pm +++ b/SL/DB/Invoice.pm @@ -170,16 +170,21 @@ sub _post_add_acctrans { my ($self, $entries) = @_; my $default_tax_id = SL::DB::Manager::Tax->find_by(taxkey => 0)->id; + my $chart_link; while (my ($chart_id, $spec) = each %{ $entries }) { $spec = { taxkey => 0, tax_id => $default_tax_id, amount => $spec } unless ref $spec; + $chart_link = SL::DB::Manager::Chart->find_by(id => $chart_id)->{'link'}; + $chart_link ||= ''; + SL::DB::AccTransaction->new(trans_id => $self->id, chart_id => $chart_id, amount => $spec->{amount}, tax_id => $spec->{tax_id}, taxkey => $spec->{taxkey}, project_id => $self->globalproject_id, - transdate => $self->transdate)->save; + transdate => $self->transdate, + chart_link => $chart_link)->save; } } diff --git a/SL/DB/MetaSetup/AccTransaction.pm b/SL/DB/MetaSetup/AccTransaction.pm index 29d5c3534..db89491cf 100644 --- a/SL/DB/MetaSetup/AccTransaction.pm +++ b/SL/DB/MetaSetup/AccTransaction.pm @@ -27,6 +27,7 @@ __PACKAGE__->meta->setup( itime => { type => 'timestamp', default => 'now()' }, mtime => { type => 'timestamp' }, tax_id => { type => 'integer', not_null => 1 }, + chart_link => { type => 'text', not_null => 1 }, ], primary_key_columns => [ 'acc_trans_id' ], @@ -41,6 +42,11 @@ __PACKAGE__->meta->setup( class => 'SL::DB::Project', key_columns => { project_id => 'id' }, }, + + tax => { + class => 'SL::DB::Tax', + key_columns => { tax_id => 'id' }, + }, ], ); diff --git a/SL/DB/MetaSetup/PeriodicInvoicesConfig.pm b/SL/DB/MetaSetup/PeriodicInvoicesConfig.pm index aeaf1c2ed..8860e8c80 100644 --- a/SL/DB/MetaSetup/PeriodicInvoicesConfig.pm +++ b/SL/DB/MetaSetup/PeriodicInvoicesConfig.pm @@ -32,7 +32,7 @@ __PACKAGE__->meta->setup( key_columns => { ar_chart_id => 'id' }, }, - oe => { + order => { class => 'SL::DB::Order', key_columns => { oe_id => 'id' }, }, diff --git a/SL/DB/PeriodicInvoicesConfig.pm b/SL/DB/PeriodicInvoicesConfig.pm index c9ef22285..2b4542a97 100644 --- a/SL/DB/PeriodicInvoicesConfig.pm +++ b/SL/DB/PeriodicInvoicesConfig.pm @@ -4,16 +4,6 @@ use strict; use SL::DB::MetaSetup::PeriodicInvoicesConfig; -__PACKAGE__->meta->add_relationships( - order => { - type => 'many to one', - class => 'SL::DB::Order', - column_map => { oe_id => 'id' }, - }, -); - -__PACKAGE__->meta->initialize; - # Creates get_all, get_all_count, get_all_iterator, delete_all and update_all. __PACKAGE__->meta->make_manager_class; diff --git a/SL/Form.pm b/SL/Form.pm index f406817f6..e7d142599 100644 --- a/SL/Form.pm +++ b/SL/Form.pm @@ -490,10 +490,12 @@ sub header { push @header, ""; } - push @header, map { qq|| } $layout->stylesheets; + my $auto_reload_resources_param = $layout->auto_reload_resources_param; + + push @header, map { qq|| } $layout->stylesheets; push @header, " " if $self->{landscape}; push @header, "" if -f $self->{favicon}; - push @header, map { qq|| } $layout->javascripts; + push @header, map { qq|| } $layout->javascripts; push @header, $self->{javascript} if $self->{javascript}; push @header, map { $_->show_javascript } @{ $self->{AJAX} || [] }; diff --git a/SL/GL.pm b/SL/GL.pm index 5783fbfd3..10d6ee120 100644 --- a/SL/GL.pm +++ b/SL/GL.pm @@ -157,11 +157,11 @@ sub post_transaction { if ($amount != 0) { $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, - source, memo, project_id, taxkey, ob_transaction, cb_transaction, tax_id) + source, memo, project_id, taxkey, ob_transaction, cb_transaction, tax_id, chart_link) VALUES (?, (SELECT id FROM chart WHERE accno = ?), - ?, ?, ?, ?, ?, ?, ?, ?, ?)|; + ?, ?, ?, ?, ?, ?, ?, ?, ?, (SELECT link FROM chart WHERE accno = ?))|; @values = (conv_i($form->{id}), $accno, $amount, conv_date($form->{transdate}), - $form->{"source_$i"}, $form->{"memo_$i"}, $project_id, $taxkey, $form->{ob_transaction} ? 't' : 'f', $form->{cb_transaction} ? 't' : 'f', conv_i($form->{"tax_id_$i"})); + $form->{"source_$i"}, $form->{"memo_$i"}, $project_id, $taxkey, $form->{ob_transaction} ? 't' : 'f', $form->{cb_transaction} ? 't' : 'f', conv_i($form->{"tax_id_$i"}), $accno); do_query($form, $dbh, $query, @values); } @@ -169,12 +169,16 @@ sub post_transaction { # add taxentry $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, - source, memo, project_id, taxkey, tax_id) + source, memo, project_id, taxkey, tax_id, chart_link) VALUES (?, (SELECT chart_id FROM tax WHERE id = ?), - ?, ?, ?, ?, ?, ?, ?)|; + ?, ?, ?, ?, ?, ?, ?, (SELECT link + FROM chart + WHERE id = (SELECT chart_id + FROM tax + WHERE id = ?)))|; @values = (conv_i($form->{id}), conv_i($form->{"tax_id_$i"}), $tax, conv_date($form->{transdate}), $form->{"source_$i"}, - $form->{"memo_$i"}, $project_id, $taxkey, conv_i($form->{"tax_id_$i"})); + $form->{"memo_$i"}, $project_id, $taxkey, conv_i($form->{"tax_id_$i"}), conv_i($form->{"tax_id_$i"})); do_query($form, $dbh, $query, @values); } } @@ -280,7 +284,7 @@ sub all_transactions { push(@arvalues, '%' . $form->{description} . '%'); push(@apvalues, '%' . $form->{description} . '%'); } - + if ($form->{employee} =~ /--/) { ($form->{employee_id},$form->{employee_name}) = split(/--/,$form->{employee}); #if ($form->{employee_id}) { @@ -366,7 +370,7 @@ sub all_transactions { 'source' => { 'gl' => 'ac.source', 'arap' => 'ac.source', }, 'description' => { 'gl' => 'g.description', 'arap' => 'ct.name', }, ); - + # sortdir = sort direction (ascending or descending) my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC'; my $sortkey = $sort_columns{$form->{sort}} ? $form->{sort} : $form->{datesort}; # default used to be transdate diff --git a/SL/IR.pm b/SL/IR.pm index bd8bd591d..48c5134fa 100644 --- a/SL/IR.pm +++ b/SL/IR.pm @@ -269,27 +269,37 @@ sub post_invoice { # allocated >= 0 # add entry for inventory, this one is for the sold item - $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey, tax_id) VALUES (?, ?, ?, ?, (SELECT taxkey_id FROM chart WHERE id = ?), - (SELECT tax_id + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey, tax_id) VALUES (?, ?, ?, ?, + (SELECT taxkey_id + FROM taxkeys + WHERE chart_id= ? + AND startdate <= ? + ORDER BY startdate DESC LIMIT 1), + (SELECT tax_id FROM taxkeys - WHERE chart_id= (SELECT id - FROM chart - WHERE accno = ?) + WHERE chart_id= ? AND startdate <= ? - ORDER BY startdate DESC LIMIT 1))|; - @values = ($ref->{trans_id}, $ref->{inventory_accno_id}, $linetotal, $ref->{transdate}, $ref->{inventory_accno_id}, $ref->{inventory_accno_id}, $ref->{transdate}); + ORDER BY startdate DESC LIMIT 1), + (SELECT chart_link FROM chart WHERE id = ?))|; + @values = ($ref->{trans_id}, $ref->{inventory_accno_id}, $linetotal, $ref->{transdate}, $ref->{inventory_accno_id}, $ref->{transdate}, $ref->{inventory_accno_id}, $ref->{transdate}, + $ref->{inventory_accno_id}); do_query($form, $dbh, $query, @values); # add expense - $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey, tax_id) VALUES (?, ?, ?, ?, (SELECT taxkey from tax WHERE chart_id = ?), + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey, tax_id) VALUES (?, ?, ?, ?, + (SELECT taxkey_id + FROM taxkeys + WHERE chart_id= ? + AND startdate <= ? + ORDER BY startdate DESC LIMIT 1), (SELECT tax_id FROM taxkeys - WHERE chart_id= (SELECT id - FROM chart - WHERE accno = ?) + WHERE chart_id= ? AND startdate <= ? - ORDER BY startdate DESC LIMIT 1))|; - @values = ($ref->{trans_id}, $ref->{expense_accno_id}, ($linetotal * -1), $ref->{transdate}, $ref->{expense_accno_id}, $ref->{expense_accno_id}, $ref->{transdate}); + ORDER BY startdate DESC LIMIT 1), + (SELECT chart_link FROM chart WHERE id = ?))|; + @values = ($ref->{trans_id}, $ref->{expense_accno_id}, ($linetotal * -1), $ref->{transdate}, $ref->{expense_accno_id}, $ref->{transdate}, $ref->{expense_accno_id}, $ref->{transdate}, + $ref->{expense_accno_id}); do_query($form, $dbh, $query, @values); } }; @@ -492,18 +502,26 @@ sub post_invoice { next if $payments_only || !$form->{amount}{$trans_id}{$accno}; - $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey, project_id, tax_id) + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey, project_id, tax_id, chart_link) VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, - (SELECT taxkey_id FROM chart WHERE accno = ?), ?, + (SELECT taxkey_id + FROM taxkeys + WHERE chart_id= (SELECT id + FROM chart + WHERE accno = ?) + AND startdate <= ? + ORDER BY startdate DESC LIMIT 1), + ?, (SELECT tax_id FROM taxkeys WHERE chart_id= (SELECT id FROM chart WHERE accno = ?) AND startdate <= ? - ORDER BY startdate DESC LIMIT 1))|; + ORDER BY startdate DESC LIMIT 1), + (SELECT link FROM chart WHERE accno = ?))|; @values = ($trans_id, $accno, $form->{amount}{$trans_id}{$accno}, - conv_date($form->{invdate}), $accno, $project_id, $accno, conv_date($form->{invdate})); + conv_date($form->{invdate}), $accno, conv_date($form->{invdate}), $project_id, $accno, conv_date($form->{invdate}), $accno); do_query($form, $dbh, $query, @values); } } @@ -538,18 +556,26 @@ sub post_invoice { # record AP if ($form->{amount}{ $form->{id} }{ $form->{AP} } != 0) { - $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey, project_id, tax_id) + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey, project_id, tax_id, chart_link) VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, - (SELECT taxkey_id FROM chart WHERE accno = ?), ?, + (SELECT taxkey_id + FROM taxkeys + WHERE chart_id= (SELECT id + FROM chart + WHERE accno = ?) + AND startdate <= ? + ORDER BY startdate DESC LIMIT 1), + ?, (SELECT tax_id FROM taxkeys WHERE chart_id= (SELECT id FROM chart WHERE accno = ?) AND startdate <= ? - ORDER BY startdate DESC LIMIT 1))|; + ORDER BY startdate DESC LIMIT 1), + (SELECT link FROM chart WHERE accno = ?))|; @values = (conv_i($form->{id}), $form->{AP}, $amount, - $form->{"datepaid_$i"}, $form->{AP}, $project_id, $form->{AP}, conv_date($form->{"datepaid_$i"})); + $form->{"datepaid_$i"}, $form->{AP}, conv_date($form->{"datepaid_$i"}), $project_id, $form->{AP}, conv_date($form->{"datepaid_$i"}), $form->{AP}); do_query($form, $dbh, $query, @values); } @@ -557,17 +583,24 @@ sub post_invoice { my $gldate = (conv_date($form->{"gldate_$i"}))? conv_date($form->{"gldate_$i"}) : conv_date($form->current_date($myconfig)); $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, gldate, source, memo, taxkey, project_id, tax_id) + qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, gldate, source, memo, taxkey, project_id, tax_id, chart_link) VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, ?, ?, - (SELECT taxkey_id FROM chart WHERE accno = ?), ?, + (SELECT taxkey_id + FROM taxkeys + WHERE chart_id= (SELECT id + FROM chart WHERE accno = ?) + AND startdate <= ? + ORDER BY startdate DESC LIMIT 1), + ?, (SELECT tax_id FROM taxkeys WHERE chart_id= (SELECT id FROM chart WHERE accno = ?) AND startdate <= ? - ORDER BY startdate DESC LIMIT 1))|; + ORDER BY startdate DESC LIMIT 1), + (SELECT link FROM chart WHERE accno = ?))|; @values = (conv_i($form->{id}), $accno, $form->{"paid_$i"}, $form->{"datepaid_$i"}, - $gldate, $form->{"source_$i"}, $form->{"memo_$i"}, $accno, $project_id, $accno, conv_date($form->{"datepaid_$i"})); + $gldate, $form->{"source_$i"}, $form->{"memo_$i"}, $accno, conv_date($form->{"datepaid_$i"}), $project_id, $accno, conv_date($form->{"datepaid_$i"}), $accno); do_query($form, $dbh, $query, @values); $exchangerate = 0; @@ -605,16 +638,11 @@ sub post_invoice { $form->{fx}{$accno}{$transdate} = $form->round_amount($form->{fx}{$accno}{$transdate}, 2); next if ($form->{fx}{$accno}{$transdate} == 0); - $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, cleared, fx_transaction, taxkey, project_id, tax_id) + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, cleared, fx_transaction, taxkey, project_id, tax_id, chart_link) VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, '0', '1', 0, ?, - (SELECT tax_id - FROM taxkeys - WHERE chart_id= (SELECT id - FROM chart - WHERE accno = ?) - AND startdate <= ? - ORDER BY startdate DESC LIMIT 1))|; - @values = (conv_i($form->{id}), $accno, $form->{fx}{$accno}{$transdate}, conv_date($transdate), $project_id, $accno, $form->{fx}{$accno}{$transdate}); + (SELECT id FROM tax WHERE taxkey=0 LIMIT 1), + (SELECT link FROM chart WHERE accno = ?))|; + @values = (conv_i($form->{id}), $accno, $form->{fx}{$accno}{$transdate}, conv_date($transdate), $project_id, $accno); do_query($form, $dbh, $query, @values); } } diff --git a/SL/IS.pm b/SL/IS.pm index 196d6dff2..052dcfd3f 100644 --- a/SL/IS.pm +++ b/SL/IS.pm @@ -832,9 +832,9 @@ sub post_invoice { if (!$payments_only && ($form->{amount_cogs}{$trans_id}{$accno} != 0)) { $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, tax_id, taxkey, project_id) - VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, (SELECT id FROM tax WHERE taxkey=0), 0, ?)|; - @values = (conv_i($trans_id), $accno, $form->{amount_cogs}{$trans_id}{$accno}, conv_date($form->{invdate}), conv_i($project_id)); + qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, tax_id, taxkey, project_id, chart_link) + VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, (SELECT id FROM tax WHERE taxkey=0), 0, ?, (SELECT link FROM chart WHERE accno = ?))|; + @values = (conv_i($trans_id), $accno, $form->{amount_cogs}{$trans_id}{$accno}, conv_date($form->{invdate}), conv_i($project_id), $accno); do_query($form, $dbh, $query, @values); $form->{amount_cogs}{$trans_id}{$accno} = 0; } @@ -845,9 +845,9 @@ sub post_invoice { if (!$payments_only && ($form->{amount_cogs}{$trans_id}{$accno} != 0)) { $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, tax_id, taxkey, project_id) - VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, (SELECT id FROM tax WHERE taxkey=0), 0, ?)|; - @values = (conv_i($trans_id), $accno, $form->{amount_cogs}{$trans_id}{$accno}, conv_date($form->{invdate}), conv_i($project_id)); + qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, tax_id, taxkey, project_id, chart_link) + VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, (SELECT id FROM tax WHERE taxkey=0), 0, ?, (SELECT link FROM chart WHERE accno = ?))|; + @values = (conv_i($trans_id), $accno, $form->{amount_cogs}{$trans_id}{$accno}, conv_date($form->{invdate}), conv_i($project_id), $accno); do_query($form, $dbh, $query, @values); } } @@ -861,7 +861,7 @@ sub post_invoice { if (!$payments_only && ($form->{amount}{$trans_id}{$accno} != 0)) { $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, tax_id, taxkey, project_id) + qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, tax_id, taxkey, project_id, chart_link) VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, (SELECT tax_id FROM taxkeys @@ -870,8 +870,16 @@ sub post_invoice { WHERE accno = ?) AND startdate <= ? ORDER BY startdate DESC LIMIT 1), - (SELECT taxkey_id FROM chart WHERE accno = ?), ?)|; - @values = (conv_i($trans_id), $accno, $form->{amount}{$trans_id}{$accno}, conv_date($form->{invdate}), $accno, conv_date($taxdate), $accno, conv_i($project_id)); + (SELECT taxkey_id + FROM taxkeys + WHERE chart_id= (SELECT id + FROM chart + WHERE accno = ?) + AND startdate <= ? + ORDER BY startdate DESC LIMIT 1), + ?, + (SELECT link FROM chart WHERE accno = ?))|; + @values = (conv_i($trans_id), $accno, $form->{amount}{$trans_id}{$accno}, conv_date($form->{invdate}), $accno, conv_date($taxdate), $accno, conv_date($taxdate), conv_i($project_id), $accno); do_query($form, $dbh, $query, @values); $form->{amount}{$trans_id}{$accno} = 0; } @@ -882,7 +890,7 @@ sub post_invoice { if (!$payments_only && ($form->{amount}{$trans_id}{$accno} != 0)) { $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, tax_id, taxkey, project_id) + qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, tax_id, taxkey, project_id, chart_link) VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, (SELECT tax_id FROM taxkeys @@ -891,8 +899,16 @@ sub post_invoice { WHERE accno = ?) AND startdate <= ? ORDER BY startdate DESC LIMIT 1), - (SELECT taxkey_id FROM chart WHERE accno = ?), ?)|; - @values = (conv_i($trans_id), $accno, $form->{amount}{$trans_id}{$accno}, conv_date($form->{invdate}), $accno, conv_date($taxdate), $accno, conv_i($project_id)); + (SELECT taxkey_id + FROM taxkeys + WHERE chart_id= (SELECT id + FROM chart + WHERE accno = ?) + AND startdate <= ? + ORDER BY startdate DESC LIMIT 1), + ?, + (SELECT link FROM chart WHERE accno = ?))|; + @values = (conv_i($trans_id), $accno, $form->{amount}{$trans_id}{$accno}, conv_date($form->{invdate}), $accno, conv_date($taxdate), $accno, conv_date($taxdate), conv_i($project_id), $accno); do_query($form, $dbh, $query, @values); } } @@ -938,7 +954,7 @@ sub post_invoice { if ($form->{amount}{ $form->{id} }{ $form->{AR} } != 0) { $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, tax_id, taxkey, project_id) + qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, tax_id, taxkey, project_id, chart_link) VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, (SELECT tax_id FROM taxkeys @@ -947,8 +963,16 @@ sub post_invoice { WHERE accno = ?) AND startdate <= ? ORDER BY startdate DESC LIMIT 1), - (SELECT taxkey_id FROM chart WHERE accno = ?), ?)|; - @values = (conv_i($form->{"id"}), $form->{AR}, $amount, $form->{"datepaid_$i"}, $form->{AR}, conv_date($taxdate), $form->{AR}, $project_id); + (SELECT taxkey_id + FROM taxkeys + WHERE chart_id= (SELECT id + FROM chart + WHERE accno = ?) + AND startdate <= ? + ORDER BY startdate DESC LIMIT 1), + ?, + (SELECT link FROM chart WHERE accno = ?))|; + @values = (conv_i($form->{"id"}), $form->{AR}, $amount, $form->{"datepaid_$i"}, $form->{AR}, conv_date($taxdate), $form->{AR}, conv_date($taxdate), $project_id, $form->{AR}); do_query($form, $dbh, $query, @values); } @@ -957,7 +981,7 @@ sub post_invoice { my $gldate = (conv_date($form->{"gldate_$i"}))? conv_date($form->{"gldate_$i"}) : conv_date($form->current_date($myconfig)); $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, gldate, source, memo, tax_id, taxkey, project_id) + qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, gldate, source, memo, tax_id, taxkey, project_id, chart_link) VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, ?, ?, (SELECT tax_id FROM taxkeys @@ -966,9 +990,17 @@ sub post_invoice { WHERE accno = ?) AND startdate <= ? ORDER BY startdate DESC LIMIT 1), - (SELECT taxkey_id FROM chart WHERE accno = ?), ?)|; + (SELECT taxkey_id + FROM taxkeys + WHERE chart_id= (SELECT id + FROM chart + WHERE accno = ?) + AND startdate <= ? + ORDER BY startdate DESC LIMIT 1), + ?, + (SELECT link FROM chart WHERE accno = ?))|; @values = (conv_i($form->{"id"}), $accno, $form->{"paid_$i"}, $form->{"datepaid_$i"}, - $gldate, $form->{"source_$i"}, $form->{"memo_$i"}, $accno, conv_date($taxdate), $accno, $project_id); + $gldate, $form->{"source_$i"}, $form->{"memo_$i"}, $accno, conv_date($taxdate), $accno, conv_date($taxdate), $project_id, $accno); do_query($form, $dbh, $query, @values); # exchangerate difference @@ -1008,7 +1040,7 @@ sub post_invoice { if ( $form->{fx}{$accno}{$transdate} != 0 ) { $query = - qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, cleared, fx_transaction, tax_id, taxkey, project_id) + qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, cleared, fx_transaction, tax_id, taxkey, project_id, chart_link) VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, '0', '1', (SELECT tax_id FROM taxkeys @@ -1017,8 +1049,16 @@ sub post_invoice { WHERE accno = ?) AND startdate <= ? ORDER BY startdate DESC LIMIT 1), - (SELECT taxkey_id FROM chart WHERE accno = ?), ?)|; - @values = (conv_i($form->{"id"}), $accno, $form->{fx}{$accno}{$transdate}, conv_date($transdate), $accno, conv_date($taxdate), $accno, conv_i($project_id)); + (SELECT taxkey_id + FROM taxkeys + WHERE chart_id= (SELECT id + FROM chart + WHERE accno = ?) + AND startdate <= ? + ORDER BY startdate DESC LIMIT 1), + ?, + (SELECT link FROM chart WHERE accno = ?))|; + @values = (conv_i($form->{"id"}), $accno, $form->{fx}{$accno}{$transdate}, conv_date($transdate), $accno, conv_date($taxdate), $accno, conv_date($taxdate), conv_i($project_id), $accno); do_query($form, $dbh, $query, @values); } } diff --git a/SL/Layout/Base.pm b/SL/Layout/Base.pm index cd5ace939..de94ee054 100644 --- a/SL/Layout/Base.pm +++ b/SL/Layout/Base.pm @@ -4,9 +4,10 @@ use strict; use parent qw(SL::Controller::Base); use List::MoreUtils qw(uniq); +use Time::HiRes qw(); use Rose::Object::MakeMethods::Generic ( - 'scalar --get_set_init' => qw(menu), + 'scalar --get_set_init' => [ qw(menu auto_reload_resources_param) ], 'scalar' => qw(focus), 'array' => [ 'add_stylesheets_inline' => { interface => 'add', hash_key => 'stylesheets_inline' }, @@ -30,6 +31,11 @@ sub init_menu { Menu->new('menu.ini'); } +sub init_auto_reload_resources_param { + return '' unless $::lx_office_conf{debug}->{auto_reload_resources}; + return sprintf('?rand=%d-%d-%d', Time::HiRes::gettimeofday(), int(rand 1000000000000)); +} + ########################################## # inheritable/overridable ########################################## diff --git a/SL/MoreCommon.pm b/SL/MoreCommon.pm index 6fbf87dc4..dfc5a7d80 100644 --- a/SL/MoreCommon.pm +++ b/SL/MoreCommon.pm @@ -171,7 +171,7 @@ sub uri_encode { } sub uri_decode { - my $str = $_[0] || ''; + my $str = $_[0] // ''; $str =~ tr/+/ /; $str =~ s/\\$//; diff --git a/SL/Presenter.pm b/SL/Presenter.pm index 6658184c1..f328cce9e 100644 --- a/SL/Presenter.pm +++ b/SL/Presenter.pm @@ -41,6 +41,7 @@ sub render { croak "Unsupported type: " . $options->{type} unless $options->{type} =~ m/^(?:html|js|json)$/; # The "template" argument must be a string or a reference to one. + $template = ${ $template } if ((ref($template) || '') eq 'REF') && (ref(${ $template }) eq 'SL::Presenter::EscapedText'); croak "Unsupported 'template' reference type: " . ref($template) if ref($template) && (ref($template) !~ m/^(?:SCALAR|SL::Presenter::EscapedText)$/); # Look for the file given by $template if $template is not a reference. @@ -61,7 +62,9 @@ sub render { # If no processing is requested then return the content. if (!$options->{process}) { # If $template is a reference then don't try to read a file. - return SL::Presenter::EscapedText->new(text => ${ $template }, is_escaped => 1) if ref $template; + my $ref = ref $template; + return $template if $ref eq 'SL::Presenter::EscapedText'; + return SL::Presenter::EscapedText->new(text => ${ $template }, is_escaped => 1) if $ref eq 'SCALAR'; # Otherwise return the file's content. my $file = IO::File->new($source, "r") || croak("Template file ${source} could not be read"); @@ -194,6 +197,11 @@ If C<$template> is a reference to a scalar then the referenced scalar's content is used as the content to process. The C option is not considered in this case. +C<$template> can also be an instance of L +or a reference to such an instance. Both of these cases are handled +the same way as if C<$template> were a reference to a scalar: its +content is processed, and C is not considered. + Other reference types, unknown options and unknown arguments to the C option cause the function to L. diff --git a/SL/SEPA.pm b/SL/SEPA.pm index e07fdcaf5..73a333030 100644 --- a/SL/SEPA.pm +++ b/SL/SEPA.pm @@ -357,8 +357,8 @@ sub post_payment { AND ((c.link LIKE '%:${ARAP}') OR (c.link LIKE '${ARAP}:%') OR (c.link = '${ARAP}')) LIMIT 1| ], - 'add_acc_trans' => [ qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, gldate, source, memo) - VALUES (?, ?, ?, ?, current_date, ?, '')| ], + 'add_acc_trans' => [ qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, gldate, source, memo, taxkey, tax_id , chart_link) + VALUES (?, ?, ?, ?, current_date, ?, '', 0, (SELECT id FROM tax WHERE taxkey=0 LIMIT 1), (SELECT link FROM chart WHERE id=?))| ], 'update_arap' => [ qq|UPDATE ${arap} SET paid = paid + ? @@ -397,8 +397,9 @@ sub post_payment { my ($arap_chart_id) = $handles{get_arap}->[0]->fetchrow_array(); # Record the payment in acc_trans offsetting AR/AP. - do_statement($form, @{ $handles{add_acc_trans} }, $orig_item->{"${arap}_id"}, $arap_chart_id, -1 * $mult * $orig_item->{amount}, $item->{execution_date}, ''); - do_statement($form, @{ $handles{add_acc_trans} }, $orig_item->{"${arap}_id"}, $orig_item->{chart_id}, $mult * $orig_item->{amount}, $item->{execution_date}, $orig_item->{reference}); + do_statement($form, @{ $handles{add_acc_trans} }, $orig_item->{"${arap}_id"}, $arap_chart_id, -1 * $mult * $orig_item->{amount}, $item->{execution_date}, '', $arap_chart_id); + do_statement($form, @{ $handles{add_acc_trans} }, $orig_item->{"${arap}_id"}, $orig_item->{chart_id}, $mult * $orig_item->{amount}, $item->{execution_date}, $orig_item->{reference}, + $orig_item->{chart_id}); # Update the invoice to reflect the new paid amount. do_statement($form, @{ $handles{update_arap} }, $orig_item->{amount}, $orig_item->{"${arap}_id"}); diff --git a/SL/VK.pm b/SL/VK.pm index c056aac65..c373a1956 100644 --- a/SL/VK.pm +++ b/SL/VK.pm @@ -52,7 +52,7 @@ sub invoice_transactions { my $query = qq|SELECT ct.id as customerid, ct.name as customername,ct.customernumber,ct.country,ar.invnumber,ar.id,ar.transdate,p.partnumber,pg.partsgroup,i.parts_id,i.qty,i.price_factor,i.discount,i.description as description,i.lastcost,i.sellprice,i.fxsellprice,i.marge_total,i.marge_percent,i.unit,b.description as business,e.name as employee,e2.name as salesman, to_char(ar.transdate,'Month') as month, to_char(ar.transdate, 'YYYYMM') as nummonth, p.unit as parts_unit, p.weight | . - qq|FROM invoice i | . + qq|FROM invoice i | . qq|JOIN ar on (i.trans_id = ar.id) | . qq|JOIN parts p on (i.parts_id = p.id) | . qq|LEFT JOIN partsgroup pg on (p.partsgroup_id = pg.id) | . @@ -157,7 +157,7 @@ sub invoice_transactions { push(@values, $form->{"project_id"}, $form->{"project_id"}); } if ($form->{business_id}) { - $where .= qq| AND ct.business_id = ? |; + $where .= qq| AND ct.business_id = ? |; push(@values, $form->{"business_id"}); } @@ -179,7 +179,7 @@ sub invoice_transactions { $where .= qq| AND ($cvar_where_ic)|; push @values, @cvar_values_ic; } - + $query .= " WHERE $where ORDER BY $sortorder "; # LIMIT 5000"; my @result = selectall_hashref_query($form, $dbh, $query, @values); diff --git a/bin/mozilla/am.pl b/bin/mozilla/am.pl index 2b7cdf8ee..bcb39d258 100644 --- a/bin/mozilla/am.pl +++ b/bin/mozilla/am.pl @@ -1491,7 +1491,11 @@ sub edit_tax { $form->header(); + #set readonly if the there are entries in acc_trans with the tax + my $readonly = $form->{tax_already_used} ? 'readonly' : ''; + my $parameters_ref = { + readonly => $readonly, }; # Ausgabe des Templates @@ -1552,12 +1556,16 @@ sub save_tax { $main::auth->assert('config'); - $form->isblank("rate", $locale->text('Taxrate missing!')); - $form->isblank("taxdescription", $locale->text('Taxdescription missing!')); - $form->isblank("taxkey", $locale->text('Taxkey missing!')); + $form->error($locale->text('Taxkey missing!')) unless length($form->{taxkey}) != 0; + $form->error($locale->text('Taxdescription missing!')) unless length($form->{taxdescription}) != 0; + $form->error($locale->text('Taxrate missing!')) unless length($form->{rate}) != 0; $form->{rate} = $form->parse_amount(\%myconfig, $form->{rate}); + if ($form->{taxkey} == 0 and $form->{rate} > 0) { + $form->error($locale->text('Taxkey 0 is reserved for rate 0')); + } + if ( $form->{rate} < 0 || $form->{rate} >= 100 ) { $form->error($locale->text('Tax Percent is a number between 0 and 100')); } diff --git a/bin/mozilla/ct.pl b/bin/mozilla/ct.pl index ff7eedef6..8a30094fa 100644 --- a/bin/mozilla/ct.pl +++ b/bin/mozilla/ct.pl @@ -161,6 +161,7 @@ sub list_names { push @options, $locale->text('Billing/shipping address (city)') . " : $form->{addr_city}" if $form->{addr_city}; push @options, $locale->text('Billing/shipping address (zipcode)') . " : $form->{zipcode}" if $form->{addr_zipcode}; push @options, $locale->text('Billing/shipping address (street)') . " : $form->{street}" if $form->{addr_street}; + push @options, $locale->text('Billing/shipping address (country)') . " : $form->{country}" if $form->{addr_country}; if ($form->{business_id}) { my $business = SL::DB::Manager::Business->find_by(id => $form->{business_id}); @@ -171,9 +172,9 @@ sub list_names { } my @columns = ( - 'id', 'name', "$form->{db}number", 'contact', 'phone', - 'fax', 'email', 'taxnumber', 'street', 'zipcode' , 'city', - 'business', 'invnumber', 'ordnumber', 'quonumber' + 'id', 'name', "$form->{db}number", 'contact', 'phone', + 'fax', 'email', 'taxnumber', 'street', 'zipcode' , 'city', + 'business', 'invnumber', 'ordnumber', 'quonumber', 'salesman', 'country' ); my @includeable_custom_variables = grep { $_->{includeable} } @{ $cvar_configs }; @@ -199,6 +200,8 @@ sub list_names { 'street' => { 'text' => $locale->text('Street'), }, 'zipcode' => { 'text' => $locale->text('Zipcode'), }, 'city' => { 'text' => $locale->text('City'), }, + 'country' => { 'text' => $locale->text('Country'), }, + 'salesman' => { 'text' => $locale->text('Salesman'), }, %column_defs_cvars, ); @@ -206,7 +209,7 @@ sub list_names { my @hidden_variables = ( qw( db status obsolete name contact email cp_name addr_street addr_zipcode - addr_city business_id + addr_city addr_country business_id ), "$form->{db}number", map({ "cvar_$_->{name}" } @searchable_custom_variables), map({'cvar_'. $_->{name} .'_qtyop'} grep({$_->{type} eq 'number'} @searchable_custom_variables)), diff --git a/config/kivitendo.conf.default b/config/kivitendo.conf.default index 2f4c88a6b..875cfe0c3 100644 --- a/config/kivitendo.conf.default +++ b/config/kivitendo.conf.default @@ -293,3 +293,9 @@ file_name = /tmp/kivitendo-debug.log # If set to 1 then the installation will be kept unlocked even if a # database upgrade fails. keep_installation_unlocked = 0 + +# If set to 1 then all resource links (JavaScript, CSS files) output +# via $::request->{layout}->use_stylesheet() / use_javascript() will +# be made unique by appending a random GET parameter. This will cause +# the web browser to always reload the resources. +auto_reload_resources = 0 diff --git a/css/kivitendo/jquery-ui.custom.css b/css/kivitendo/jquery-ui.custom.css index e9dae4f10..2ec0e2370 100644 --- a/css/kivitendo/jquery-ui.custom.css +++ b/css/kivitendo/jquery-ui.custom.css @@ -9,6 +9,7 @@ color: #333333; font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; + overflow: hidden; } .tabwidget ul { @@ -25,7 +26,6 @@ border: 1px #dddddd; color: #fe5f14; margin: 0; - padding: .2em .2em 0; } .tabwidget ul::after { @@ -86,3 +86,5 @@ .tabwidget .ui-state-hover a, .tabwidget .ui-state-hover a:hover { color: #fe5f14; } + +.ui-tabs .ui-tabs-nav li a { padding: .2em .7em; } diff --git a/css/lx-office-erp/jquery-ui.custom.css b/css/lx-office-erp/jquery-ui.custom.css index e4c151cf0..5df9b6387 100644 --- a/css/lx-office-erp/jquery-ui.custom.css +++ b/css/lx-office-erp/jquery-ui.custom.css @@ -9,6 +9,7 @@ color: #000000; font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; + overflow: hidden; } .tabwidget ul { @@ -25,7 +26,6 @@ border: 0; color: #000000; margin: 0; - padding: .2em .2em 0; } .tabwidget ul::after { @@ -88,3 +88,5 @@ color: #000000; text-decoration: underline; } + +.ui-tabs .ui-tabs-nav li a { padding: .2em .7em; } diff --git a/locale/de/all b/locale/de/all index 9e7f46f0a..15f94b8af 100644 --- a/locale/de/all +++ b/locale/de/all @@ -20,9 +20,11 @@ $self->{texts} = { '*) Since version 2.7 these parameters ares set in the client database and not in the configuration file, details in chapter:' => '*) Seit 2.7 werden Gewinnermittlungsart, Versteuerungsart und Warenbuchungsmethode in der Mandanten-DB gesteuert und nicht mehr in der Konfigurationsdatei, Umstellungs-Details:', '*/' => '*/', '---please select---' => '---bitte auswählen---', + '. Automatically generated.' => '. Automatisch erzeugt.', '...after loggin in' => '...nach dem Anmelden', '...done' => '...fertig', '...on the TODO list' => '...auf der Aufgabenliste', + '0% tax with taxkey' => '0% Steuer mit Steuerschlüssel ', '1. Quarter' => '1. Quartal', '2. Quarter' => '2. Quartal', '3. Quarter' => '3. Quartal', @@ -282,6 +284,7 @@ $self->{texts} = { 'Bilanz' => 'Bilanz', 'Billing Address' => 'Rechnungsadresse', 'Billing/shipping address (city)' => 'Rechnungsadresse (Stadt)', + 'Billing/shipping address (country)' => 'Rechnungsadresse (Land)', 'Billing/shipping address (street)' => 'Rechnungsadresse (Straße)', 'Billing/shipping address (zipcode)' => 'Rechnungsadresse (PLZ)', 'Bin' => 'Lagerplatz', @@ -1008,6 +1011,7 @@ $self->{texts} = { 'Income accno' => 'Erlöskonto', 'Incoming Payments' => 'Zahlungseingänge', 'Incoming invoice number' => 'Eingangsrechnungsnummer', + 'Inconsistency in database' => 'Unstimmigkeiten in der Datenbank', 'Incorrect Password!' => 'Ungültiges Passwort!', 'Incorrect password!' => 'Ungültiges Passwort!', 'Incorrect username or password!' => 'Ungültiger Benutzername oder falsches Passwort!', @@ -1417,6 +1421,7 @@ $self->{texts} = { 'Please Check the bank information for each vendor:' => 'Bitte überprüfen Sie die Kontoinformationen der Lieferanten:', 'Please ask your administrator to create warehouses and bins.' => 'Bitten Sie Ihren Administrator, dass er Lager und Lagerplätze anlegt.', 'Please contact your administrator.' => 'Bitte wenden Sie sich an Ihren Administrator.', + 'Please define a taxkey for the following taxes and run the update again:' => 'Bitte definieren Sie einen Steuerschlüssel für die folgenden Steuern und starten Sie dann das Update erneut:', 'Please enter a profile name.' => 'Bitte geben Sie einen Profilnamen an.', 'Please enter the login for the new user.' => 'Bitte geben Sie das Login für den neuen Benutzer ein.', 'Please enter the name of the database that will be used as the template for the new database:' => 'Bitte geben Sie den Namen der Datenbank an, die als Vorlage für die neue Datenbank benutzt wird:', @@ -1440,6 +1445,7 @@ $self->{texts} = { 'Please select the destination bank account for the collections:' => 'Bitte wählen Sie das Bankkonto als Ziel für die Einzüge aus:', 'Please select the source bank account for the transfers:' => 'Bitte wählen Sie das Bankkonto als Quelle für die Überweisungen aus:', 'Please seletct the dataset you want to delete:' => 'Bitte wählen Sie die zu löschende Datenbank aus:', + 'Please set another taxnumber for the following taxes and run the update again:' => 'Bitte wählen Sie ein anderes Steuerautomatik-Konto für die folgenden Steuern aus uns starten Sie dann das Update erneut.', 'Please specify a description for the warehouse designated for these goods.' => 'Bitte geben Sie den Namen des Ziellagers für die übernommenen Daten ein.', 'Plural' => 'Plural', 'Port' => 'Port', @@ -1858,6 +1864,7 @@ $self->{texts} = { 'Taxes' => 'Steuern', 'Taxkey' => 'Steuerschlüssel', 'Taxkey missing!' => 'Steuerschlüssel fehlt!', + 'Taxkey 0 is reserved for rate 0' => 'Der Steuerschlüssel 0 darf keinen Steuersatz über 0 haben.', 'Taxkey_coa' => 'Steuerschlüssel', 'Taxkeys and Taxreport Preferences' => 'Steuerautomatik und UStVA', 'Taxlink_coa' => 'Steuerautomatik', @@ -2052,7 +2059,9 @@ $self->{texts} = { 'There are #1 more open invoices from this vendor with other currencies.' => 'Es gibt #1 weitere offene Rechnungen von diesem Lieferanten, die in anderen Währungen ausgestellt wurden.', 'There are #1 unfinished follow-ups of which #2 are due.' => 'Es gibt #1 Wiedervorlage(n), von denen #2 fällig ist/sind.', 'There are bookings to the account 3803 after 01.01.2007. If you didn\'t change this account manually to 19% the bookings are probably incorrect.' => 'Das Konto 3803 wurde nach dem 01.01.2007 bebucht. Falls Sie dieses Konto nicht manuell auf 19% gestellt haben sind die Buchungen wahrscheinlich mit falscher Umsatzsteuer gebucht worden.', + 'There are entries in tax where taxkey is NULL.' => 'In der Datenbank sind Steuern ohne Steuerschlüssel vorhanden (in der Tabelle tax Spalte taxkey).', 'There are four tax zones.' => 'Es gibt vier Steuerzonen.', + 'There are invalid taxnumbers in use.' => 'Es werden ungültige Steuerautomatik-Konten benutzt.', 'There are no entries in the background job history.' => 'Es gibt keine Einträge im Hintergrund-Job-Verlauf.', 'There are no items in stock.' => 'Dieser Artikel ist nicht eingelagert.', 'There are no items on your TODO list at the moment.' => 'Ihre Aufgabenliste enthält momentan keine Einträge.', @@ -2060,6 +2069,7 @@ $self->{texts} = { 'There are still transfers not matching the qty of the delivery order. Stock operations can not be changed later. Do you really want to proceed?' => 'Einige der Lagerbewegungen sind nicht vollständig und Lagerbewegungen können nachträglich nicht mehr verändert werden. Wollen Sie wirklich fortfahren?', 'There are usually three ways to install Perl modules.' => 'Es gibt normalerweise drei Arten, ein Perlmodul zu installieren.', 'There is already a taxkey 0 with tax rate not 0.' => 'Es existiert bereits ein Steuerschlüssel mit Steuersatz ungleich 0%.', + 'There is an inconsistancy in your database.' => 'In Ihrer Datenbank sind Unstimmigkeiten vorhanden.', 'There is at least one sales or purchase invoice for which kivitendo recorded an inventory transaction with taxkeys even though no tax was recorded.' => 'Es gibt mindestens eine Verkaufs- oder Einkaufsrechnung, für die kivitendo eine Warenbestandsbuchung ohne dazugehörige Steuerbuchung durchgeführt hat.', 'There is at least one transaction for which the user has chosen a logically wrong taxkey.' => 'Es gibt mindestens eine Buchung, bei der ein logisch nicht passender Steuerschlüssel ausgewählt wurde.', 'There is not enough available of \'#1\' at warehouse \'#2\', bin \'#3\', #4, #5, for the transfer of #6.' => 'Von \'#1\' ist in Lager \'#2\', Lagerplatz \'#3\', #4, #5, nicht genügend eingelagert, um insgesamt #6 auszulagern.', diff --git a/locale/en/all b/locale/en/all index 7734f90cf..3424a0158 100644 --- a/locale/en/all +++ b/locale/en/all @@ -20,9 +20,11 @@ $self->{texts} = { '*) Since version 2.7 these parameters ares set in the client database and not in the lx-erp.conf / lx_office.conf file, details in chapter:' => '', '*/' => '', '---please select---' => '', + '. Automatically generated.' => '', '...after loggin in' => '', '...done' => '', '...on the TODO list' => '', + '0% tax with taxkey' => '', '1. Quarter' => '', '2. Quarter' => '', '3. Quarter' => '', @@ -1814,6 +1816,7 @@ $self->{texts} = { 'Taxes' => '', 'Taxkey' => '', 'Taxkey missing!' => '', + 'Taxkey 0 is reserved for rate 0' => '', 'Taxkey_coa' => '', 'Taxkeys and Taxreport Preferences' => '', 'Taxlink_coa' => '', @@ -1985,13 +1988,17 @@ $self->{texts} = { 'There are #1 more open invoices from this vendor with other currencies.' => '', 'There are #1 unfinished follow-ups of which #2 are due.' => '', 'There are bookings to the account 3803 after 01.01.2007. If you didn\'t change this account manually to 19% the bookings are probably incorrect.' => '', + 'There are entries in tax where taxkey is NULL.' => '', 'There are four tax zones.' => '', + 'There are invalid taxnumbers in use.' => '', + 'There are no entries in the background job history.' => '', 'There are no items in stock.' => '', 'There are no items on your TODO list at the moment.' => '', 'There are still entries in the database for which no unit has been assigned.' => '', 'There are still transfers not matching the qty of the delivery order. Stock operations can not be changed later. Do you really want to proceed?' => '', 'There are usually three ways to install Perl modules.' => '', 'There is already a taxkey 0 with tax rate not 0.' => '', + 'There is an inconsistancy in your database.' => '', 'There is at least one sales or purchase invoice for which kivitendo recorded an inventory transaction with taxkeys even though no tax was recorded.' => '', 'There is at least one transaction for which the user has chosen a logically wrong taxkey.' => '', 'There is not enough available of \'#1\' at warehouse \'#2\', bin \'#3\', #4, #5, for the transfer of #6.' => '', diff --git a/scripts/console b/scripts/console index 239ed5431..d264a8941 100755 --- a/scripts/console +++ b/scripts/console @@ -48,6 +48,7 @@ use SL::InstanceConfiguration; use SL::Locale; use SL::LXDebug; use Data::Dumper; +use List::Util qw(max); # this is a cleaned up version of am.pl # it lacks redirection, some html setup and most of the authentication process. @@ -129,6 +130,43 @@ sub pp { Data::Dumper::Dumper(@_); } +sub ptab { + my @rows = ref($_[0]) eq 'ARRAY' ? @{ $_[0] } : @_; + return '' unless @rows; + + my @columns = sort keys %{ $rows[0] }; + my @widths = map { max @{ $_ } } map { my $column = $_; [ length($column), map { length("" . ($_->{$column} // '')) } @rows ] } @columns; + my @output = (join ' | ', map { my $width = $widths[$_]; sprintf "\%-${width}s", $columns[$_] } (0..@columns - 1)); + push @output, join('-+-', map { '-' x $_ } @widths); + push @output, map { my $row = $_; join(' | ', map { my $width = $widths[$_]; sprintf "\%-${width}s", $row->{ $columns[$_] } // '' } (0..@columns - 1) ) } @rows; + + return join("\n", @output); +} + +sub pobj { + my ($obj) = @_; + return '' unless $obj; + + my $ref = ref $obj; + $ref =~ s/^SL::DB:://; + my %primaries = map { ($_ => 1) } $obj->meta->primary_key; + my @columns = map { "${_}:" . ($obj->$_ // 'UNDEF') } sort $obj->meta->primary_key; + push @columns, map { "${_}:" . ($obj->$_ // 'UNDEF') } grep { !$primaries{$_} } sort map { $_->{name} } $obj->meta->columns; + + return "<${ref} " . join(' ', @columns) . '>'; +} + +sub sql { + my $dbh = ref($_[0]) ? shift : $::form->get_standard_dbh; + my ($query, @args) = @_; + + if ($query =~ m/^\s*select/i) { + ptab($dbh->selectall_arrayref($query, { Slice => {} }, @args)); + } else { + $dbh->do($query, { Slice => {} }, @args); + } +} + 1; __END__ @@ -165,6 +203,47 @@ Currently C will set the Data::Dumper depth to 2, so if you need a different depth, you'll have to change that. A nice feature would be to configure that, or at least to be able to change it at runtime. +=head2 ptab C<@data> + +Returns a tabular representation of C<@data>. C<@data> must be an +array or array reference containing hash references. Column widths are +calculated automatically. + +Undefined values are represented by an empty column. + +Example usage: + + ptab($dbh->selectall_arrayref("SELECT * FROM employee", { Slice => {} })); + +=head2 pobj C<$obj> + +Returns a textual representation of the L instance +C<$obj>. This includes the class name, then the primary key columns as +name/value pairs and then all other columns as name/value pairs. + +Undefined values are represented by C. + +Example usage: + + pobj(SL::DB::Manager::Employee->find_by(login => 'demo')); + +=head2 sql C<[ $dbh, ] $query, @bind_values> + +Executes an SQL query using the optional bind values. If the first +parameter is a database handle then that database handle is used; +otherwise the handle returned by L is used. + +If the query is a C + @@ -19,7 +19,7 @@ [% 'tax_percent' | $T8 %] - % + % @@ -42,7 +42,7 @@ - [% IF orphaned %] + [% IF orphaned AND NOT tax_already_used %] [% END %] diff --git a/templates/webpages/common/show_vc_details.html b/templates/webpages/common/show_vc_details.html index be6406bce..e0555d33c 100644 --- a/templates/webpages/common/show_vc_details.html +++ b/templates/webpages/common/show_vc_details.html @@ -105,6 +105,13 @@ [% HTML.escape(discount) %]% + [% IF is_customer %] + + [% 'Pricegroup' | $T8 %] + [% HTML.escape(pricegroup) %] + + [% END %] + [% 'Payment Terms' | $T8 %] [% HTML.escape(payment_terms) %] diff --git a/templates/webpages/ct/search.html b/templates/webpages/ct/search.html index 2d78134fe..9d3f696aa 100644 --- a/templates/webpages/ct/search.html +++ b/templates/webpages/ct/search.html @@ -43,6 +43,11 @@ [% 'Billing/shipping address (city)' | $T8 %] + + [% 'Billing/shipping address (country)' | $T8 %] + + + [% IF SHOW_BUSINESS_TYPES %] [% IF IS_CUSTOMER %][% 'Customer type' | $T8 %][% ELSE %][% 'Vendor type' | $T8 %][% END %] @@ -128,7 +133,7 @@ - + @@ -145,8 +150,18 @@ + + + + + [% IF IS_CUSTOMER %] + + + + + [% END %] [% CUSTOM_VARIABLES_INCLUSION_CODE %] diff --git a/templates/webpages/dbupgrade/tax_constraints.html b/templates/webpages/dbupgrade/tax_constraints.html new file mode 100644 index 000000000..085e9fb15 --- /dev/null +++ b/templates/webpages/dbupgrade/tax_constraints.html @@ -0,0 +1,53 @@ +[%- USE T8 %] +[% USE HTML %]
[% 'Inconsistency in database' | $T8 %]
+ +
+ + +

[% 'There is an inconsistancy in your database.' | $T8 %]

+

[% 'Please contact your administrator.' | $T8 %]

+ +[% IF invalid_tax_account %] +

[% 'There are invalid taxnumbers in use.' | $T8 %]

+

[% 'Please set another taxnumber for the following taxes and run the update again:' | $T8 %]

+ + + + + + + + [% SET row_odd = '1' %][% FOREACH row = TAX %] + + + + + + [% END %] +
[% 'tax_taxkey' | $T8 %][% 'tax_taxdescription' | $T8 %][% 'tax_rate' | $T8 %]
[% HTML.escape(row.taxkey) %] [% HTML.escape(row.taxdescription) %][% HTML.escape(row.rate) %] %
+ +[% END %] + +[% IF taxkey_is_null %] +

[% 'There are entries in tax where taxkey is NULL.' | $T8 %]

+

[% 'Please define a taxkey for the following taxes and run the update again:' | $T8 %]

+ + + + + + + + + [% SET row_odd = '1' %][% FOREACH row = TAX %] + + + + + + + [% END %] +
[% 'tax_taxdescription' | $T8 %][% 'tax_rate' | $T8 %][% 'taxnumber' | $T8 %][% 'account_description' | $T8 %]
[% HTML.escape(row.taxdescription) %][% HTML.escape(row.rate) %] %[% HTML.escape(row.taxnumber) %][% HTML.escape(row.account_description) %]
+ +[% END %] +
diff --git a/templates/webpages/do/form_footer.html b/templates/webpages/do/form_footer.html index 364367b92..78ad35a41 100644 --- a/templates/webpages/do/form_footer.html +++ b/templates/webpages/do/form_footer.html @@ -23,30 +23,14 @@

-
+ +[% PROCESS 'webdav/_list.html' %] +
+ [%- LxERP.t8("Loading...") %] +
+ - [%- IF conf_webdav %] -
[% 'Documents in the WebDAV repository' | $T8 %]
- -

- - - - - - - [%- FOREACH file = WEBDAV %] - - - - - [%- END %] - -
[% 'File name' | $T8 %][% 'WebDAV link' | $T8 %]
[% HTML.escape(file.name) %][% HTML.escape(file.type) %]
-

- -
- [%- END %] +

[% PRINT_OPTIONS %]

diff --git a/templates/webpages/do/form_header.html b/templates/webpages/do/form_header.html index cd99f9619..ceed4e564 100644 --- a/templates/webpages/do/form_header.html +++ b/templates/webpages/do/form_header.html @@ -45,6 +45,19 @@
+
+ + +
+ diff --git a/templates/webpages/ir/form_footer.html b/templates/webpages/ir/form_footer.html index 5b66f7031..8538fd42d 100644 --- a/templates/webpages/ir/form_footer.html +++ b/templates/webpages/ir/form_footer.html @@ -78,21 +78,19 @@ -[% PROCESS 'webdav/_list.html' %] - [% PROCESS 'ir/_payments.html' %] - -
- - - -[% print_options %] - - +
+[% PROCESS 'webdav/_list.html' %] +
+ [%- LxERP.t8("Loading...") %] +
+
+
+

[% print_options %]

[% IF id %] diff --git a/templates/webpages/ir/form_header.html b/templates/webpages/ir/form_header.html index 4065b039e..6f6bf238d 100644 --- a/templates/webpages/ir/form_header.html +++ b/templates/webpages/ir/form_header.html @@ -25,6 +25,18 @@ [%- INCLUDE 'common/flash.html' %] +
+ + +
- - - +
diff --git a/templates/webpages/is/form_footer.html b/templates/webpages/is/form_footer.html index 79bbdb162..52179c295 100644 --- a/templates/webpages/is/form_footer.html +++ b/templates/webpages/is/form_footer.html @@ -1,7 +1,7 @@ [%- USE T8 %] [%- USE HTML %] [%- USE LxERP %] -[%- USE L %] +[%- USE L %][%- USE P -%]
@@ -107,21 +107,18 @@ -[% PROCESS 'webdav/_list.html' %] - [% PROCESS 'is/_payments.html' %] - - - - - - -

-[% print_options %] -
+ +[% PROCESS 'webdav/_list.html' %] +
+ [% LxERP.t8('Loading...') %] +
+ +
+

[% print_options %]

[% IF id %] diff --git a/templates/webpages/is/form_header.html b/templates/webpages/is/form_header.html index 97561d154..c1c4c9e89 100644 --- a/templates/webpages/is/form_header.html +++ b/templates/webpages/is/form_header.html @@ -26,6 +26,18 @@ [%- PROCESS 'common/flash.html' %] +
+ + +
diff --git a/templates/webpages/oe/form_footer.html b/templates/webpages/oe/form_footer.html index f83334c44..bfad52d2d 100644 --- a/templates/webpages/oe/form_footer.html +++ b/templates/webpages/oe/form_footer.html @@ -96,41 +96,18 @@

-[%- IF webdav %] - - Dokumente im Webdav-Repository - - - - - - - - - [%- FOREACH file = WEBDAV %] - - - - - [%- END %] -
DateinameWebdavlink
[% HTML.escape(file.name) %][% HTML.escape(file.type) %]
- - - -
- -[%- END %] +
+[%- PROCESS 'webdav/_list.html' %] +
+ [%- LxERP.t8("Loading...") %] +
+
- - - [% print_options %] - - - +
+ +

[% PRINT_OPTIONS %]

[% label_edit %]
diff --git a/templates/webpages/oe/form_header.html b/templates/webpages/oe/form_header.html index eed285c72..50c9c46db 100644 --- a/templates/webpages/oe/form_header.html +++ b/templates/webpages/oe/form_header.html @@ -29,6 +29,19 @@ [%- INCLUDE 'common/flash.html' %] +
+ + +
+ - - +[%- IF conf_webdav %] +
+ +
[% 'Documents in the WebDAV repository' | $T8 %]
+ +
diff --git a/templates/webpages/presenter/record/record_list.html b/templates/webpages/presenter/record/record_list.html index 67acb345c..d701d6fc8 100644 --- a/templates/webpages/presenter/record/record_list.html +++ b/templates/webpages/presenter/record/record_list.html @@ -1,4 +1,4 @@ -[% USE L %][% USE LxERP %] +[% USE L %][% USE LxERP %][%- USE P -%]
[%- P.escape(title) %]
diff --git a/templates/webpages/webdav/_list.html b/templates/webpages/webdav/_list.html index 5e86becb9..2e1d1e44e 100644 --- a/templates/webpages/webdav/_list.html +++ b/templates/webpages/webdav/_list.html @@ -1,25 +1,23 @@ +[% USE HTML %][% USE T8 %] -[%- IF webdav %] -

- + + + +[%- FOREACH file = WEBDAV %] - + + -[% END %] +[%- END %] +
Dokumente im Webdav-Repository[% 'File name' | $T8 %][% 'WebDAV link' | $T8 %]
- - - - - - [%- FOREACH file = WEBDAV %] - - - - - [%- END %] -
DateinameWebdavlink
[% file.name %][% file.type %]
-
[% HTML.escape(file.name) %][% HTML.escape(file.type) %]
+
+ +[%- END %]