From ad635c66023bc107d55b2f2f41f6fcadabd02cc3 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Fri, 6 Jan 2017 10:23:01 +0100 Subject: [PATCH] Dialogbuchen auf Verwendung des Chart-Pickers umgestellt --- SL/GL.pm | 73 ++++-------- bin/mozilla/gl.pl | 106 +++++++----------- js/kivi.GL.js | 30 +++++ templates/webpages/gl/form_footer.html | 14 +++ templates/webpages/gl/form_header.html | 22 ---- .../gl/form_header_chart_balances_js.html | 28 ----- .../webpages/gl/update_tax_accounts.html | 4 +- 7 files changed, 108 insertions(+), 169 deletions(-) create mode 100644 js/kivi.GL.js delete mode 100644 templates/webpages/gl/form_header_chart_balances_js.html diff --git a/SL/GL.pm b/SL/GL.pm index 09fc2f03b..f46a95427 100644 --- a/SL/GL.pm +++ b/SL/GL.pm @@ -39,9 +39,12 @@ package GL; +use List::Util qw(first); + use Data::Dumper; use SL::DATEV qw(:CONSTANTS); use SL::DBUtils; +use SL::DB::Chart; use SL::Util qw(trim); use SL::DB; @@ -131,8 +134,6 @@ sub _post_transaction { # insert acc_trans transactions for $i (1 .. $form->{rowcount}) { - # extract accno - my ($accno) = split(/--/, $form->{"accno_$i"}); ($form->{"tax_id_$i"}) = split(/--/, $form->{"taxchart_$i"}); if ($form->{"tax_id_$i"} ne "") { $query = qq|SELECT taxkey, rate FROM tax WHERE id = ?|; @@ -161,10 +162,9 @@ sub _post_transaction { $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, 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"}), $accno); + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, (SELECT link FROM chart WHERE id = ?))|; + @values = (conv_i($form->{id}), $form->{"accno_id_$i"}, $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->{"accno_id_$i"}); do_query($form, $dbh, $query, @values); } @@ -650,7 +650,7 @@ sub transaction { $query = qq|SELECT c.accno, t.taxkey AS accnotaxkey, a.amount, a.memo, a.source, a.transdate, a.cleared, a.project_id, p.projectnumber, - a.taxkey, t.rate AS taxrate, t.id, + a.taxkey, t.rate AS taxrate, t.id, a.chart_id, (SELECT c1.accno FROM chart c1, tax t1 WHERE (t1.id = t.id) AND (c1.id = t.chart_id)) AS taxaccno, @@ -754,60 +754,35 @@ sub _storno { } sub get_chart_balances { - $main::lxdebug->enter_sub(); - - my $self = shift; - my %params = @_; - - Common::check_params(\%params, qw(charts)); + my ($self, @chart_ids) = @_; - my $myconfig = \%main::myconfig; - my $form = $main::form; - - my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); - - my @ids = map { $_->{id} } @{ $params{charts} }; - - if (!@ids) { - $main::lxdebug->leave_sub(); - return; - } + return () unless @chart_ids; + my $placeholders = join ', ', ('?') x scalar(@chart_ids); my $query = qq|SELECT chart_id, SUM(amount) AS sum FROM acc_trans - WHERE chart_id IN (| . join(', ', ('?') x scalar(@ids)) . qq|) + WHERE chart_id IN (${placeholders}) GROUP BY chart_id|; - my %balances = selectall_as_map($form, $dbh, $query, 'chart_id', 'sum', @ids); + my %balances = selectall_as_map($::form, $::form->get_standard_dbh(\%::myconfig), $query, 'chart_id', 'sum', @chart_ids); - foreach my $chart (@{ $params{charts} }) { - $chart->{balance} = $balances{ $chart->{id} } || 0; - } - - $main::lxdebug->leave_sub(); + return %balances; } -sub get_tax_dropdown { - my ($self, $accno) = @_; - - my $myconfig = \%main::myconfig; - my $form = $main::form; +sub get_active_taxes_for_chart { + my ($self, $chart_id, $transdate) = @_; - my $dbh = $form->get_standard_dbh($myconfig); + my $chart = SL::DB::Chart->new(id => $chart_id)->load; + my $active_taxkey = $chart->get_active_taxkey($transdate); + my $taxes = SL::DB::Manager::Tax->get_all( + where => [ chart_categories => { like => '%' . $chart->category . '%' }], + sort_by => 'taxkey, rate', + ); - my $query = qq|SELECT category FROM chart WHERE accno = ?|; - my ($category) = selectrow_query($form, $dbh, $query, $accno); - - $query = qq|SELECT * FROM tax WHERE chart_categories like '%$category%' order by taxkey, rate|; - - my $sth = prepare_execute_query($form, $dbh, $query); - - my @tax_accounts = (); - while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { - push(@tax_accounts, $ref); - } + my $default_tax = first { $active_taxkey->tax_id == $_->id } @{ $taxes }; + $default_tax->{is_default} = 1 if $default_tax; - return @tax_accounts; + return @{ $taxes }; } 1; diff --git a/bin/mozilla/gl.pl b/bin/mozilla/gl.pl index cad79b7c6..cb2ebb2e7 100644 --- a/bin/mozilla/gl.pl +++ b/bin/mozilla/gl.pl @@ -140,7 +140,7 @@ sub prepare_transaction { $form->{"project_id_$j"} = $ref->{project_id}; } else { - $form->{"accno_$i"} = "$ref->{accno}--$ref->{tax_id}"; + $form->{"accno_id_$i"} = $ref->{chart_id}; for (qw(fx_transaction source memo)) { $form->{"${_}_$i"} = $ref->{$_} } if ($ref->{amount} < 0) { $form->{totaldebit} -= $ref->{amount}; @@ -650,6 +650,8 @@ sub display_rows { my %myconfig = %main::myconfig; my $cgi = $::request->{cgi}; + my %balances = GL->get_chart_balances(map { $_->{id} } @{ $form->{ALL_CHARTS} }); + $form->{debit_1} = 0 if !$form->{"debit_1"}; $form->{totaldebit} = 0; $form->{totalcredit} = 0; @@ -661,20 +663,9 @@ sub display_rows { $project_labels{$item->{"id"}} = $item->{"projectnumber"}; } - my %chart_labels = (); - my @chart_values = (); - my %charts = (); - my $taxchart_init; - foreach my $item (@{ $form->{ALL_CHARTS} }) { - if ($item->{charttype} eq 'H'){ # skip headings - next; - } - my $key = $item->{accno} . "--" . $item->{tax_id}; - $taxchart_init = $item->{tax_id} unless (@chart_values); - push(@chart_values, $key); - $chart_labels{$key} = $item->{accno} . "--" . $item->{description}; - $charts{$item->{accno}} = $item; - } + my %charts_by_id = map { ($_->{id} => $_) } @{ $::form->{ALL_CHARTS} }; + my $default_chart = $::form->{ALL_CHARTS}[0]; + my $transdate = $::form->{transdate} ? DateTime->from_kivitendo($::form->{transdate}) : DateTime->today_local; my ($source, $memo, $source_hidden, $memo_hidden); for my $i (1 .. $form->{rowcount}) { @@ -690,49 +681,31 @@ sub display_rows { |; } - my $selected_accno_full; - my ($accno_row) = split(/--/, $form->{"accno_$i"}); - my $item = $charts{$accno_row}; - $selected_accno_full = "$item->{accno}--$item->{tax_id}"; - - my $selected_taxchart = $form->{"taxchart_$i"}; - my ($selected_accno, $selected_tax_id) = split(/--/, $selected_accno_full); - my ($previous_accno, $previous_tax_id) = split(/--/, $form->{"previous_accno_$i"}); - my %taxchart_labels = (); my @taxchart_values = (); - my %taxcharts = (); - my $filter_accno; - $filter_accno = $::form->{ALL_CHARTS}[0]->{accno}; - $filter_accno = $selected_accno if (!$init and $i < $form->{rowcount}); - foreach my $item ( GL->get_tax_dropdown($filter_accno) ) { - my $key = $item->{id} . "--" . $item->{rate}; - $taxchart_init = $key if ($taxchart_init == $item->{id}); - push(@taxchart_values, $key); - $taxchart_labels{$key} = $item->{taxdescription} . " " . $item->{rate} * 100 . ' %'; - $taxcharts{$item->{id}} = $item; - } - if ($previous_accno && - ($previous_accno eq $selected_accno) && - ($previous_tax_id ne $selected_tax_id)) { - my $item = $taxcharts{$selected_tax_id}; - $selected_taxchart = "$item->{id}--$item->{rate}"; + my $accno_id = $::form->{"accno_id_$i"}; + my $chart = $charts_by_id{$accno_id} // $default_chart; + $accno_id = $chart->{id}; + my $chart_has_changed = $::form->{"previous_accno_id_$i"} && ($accno_id != $::form->{"previous_accno_id_$i"}); + my ($first_taxchart, $default_taxchart, $taxchart_to_use); + + foreach my $item ( GL->get_active_taxes_for_chart($accno_id, $transdate) ) { + my $key = $item->id . "--" . $item->rate; + $first_taxchart //= $item; + $default_taxchart = $item if $item->{is_default}; + $taxchart_to_use = $item if $key eq $form->{"taxchart_$i"}; + + push(@taxchart_values, $key); + $taxchart_labels{$key} = $item->taxdescription . " " . $item->rate * 100 . ' %'; } - $selected_accno = '' if ($init); - $selected_taxchart ||= $taxchart_init; + $taxchart_to_use = $default_taxchart // $first_taxchart if $chart_has_changed || !$taxchart_to_use; + my $selected_taxchart = $taxchart_to_use->id . '--' . $taxchart_to_use->rate; my $accno = qq|| . - NTI($cgi->popup_menu('-name' => "accno_$i", - '-id' => "accno_$i", - '-onChange' => "updateTaxes($i);", - '-style' => 'width:200px', - '-values' => \@chart_values, - '-labels' => \%chart_labels, - '-default' => $selected_accno_full)) - . $cgi->hidden('-name' => "previous_accno_$i", - '-default' => $selected_accno_full) + $::request->presenter->chart_picker("accno_id_$i", $accno_id, style => "width: 300px") . + $::request->presenter->hidden_tag("previous_accno_id_$i", $accno_id) . qq||; my $tax_ddbox = qq|| . NTI($cgi->popup_menu('-name' => "taxchart_$i", @@ -808,10 +781,11 @@ sub display_rows { |; my $copy2credit = $i == 1 ? 'onkeyup="copy_debit_to_credit()"' : ''; + my $balance = $form->format_amount(\%::myconfig, $balances{$accno_id} // 0, 2, 'DRCR'); print qq| $accno -   + ${balance} $fx_transaction @@ -852,6 +826,8 @@ sub form_header { my ($init) = @_; + $::request->layout->add_javascripts("autocomplete_chart.js", "kivi.GL.js"); + my @old_project_ids = grep { $_ } map{ $::form->{"project_id_$_"} } 1..$::form->{rowcount}; $::form->get_lists("projects" => { "key" => "ALL_PROJECTS", @@ -863,8 +839,6 @@ sub form_header { $::form->{ALL_DEPARTMENTS} = SL::DB::Manager::Department->get_all; - GL->get_chart_balances('charts' => $::form->{ALL_CHARTS}); - my $title = $::form->{title}; $::form->{title} = $::locale->text("$title General Ledger Transaction"); # $locale->text('Add General Ledger Transaction') @@ -877,7 +851,7 @@ sub form_header { $::request->{layout}->focus("#reference"); $::form->{taxincluded} = "1"; } else { - $::request->{layout}->focus("#accno_$::form->{rowcount}"); + $::request->{layout}->focus("#accno_id_$::form->{rowcount}_name"); } $::form->{previous_id} ||= "--"; @@ -1222,22 +1196,18 @@ sub continue { } sub get_tax_dropdown { - $main::lxdebug->enter_sub(); + my $transdate = $::form->{transdate} ? DateTime->from_kivitendo($::form->{transdate}) : DateTime->today_local; + my @tax_accounts = GL->get_active_taxes_for_chart($::form->{accno_id}, $transdate); + my $html = $::form->parse_html_template("gl/update_tax_accounts", { TAX_ACCOUNTS => \@tax_accounts }); - my $form = $main::form; - my @tax_accounts = GL->get_tax_dropdown($form->{accno}); - - foreach my $item (@tax_accounts) { - $item->{taxdescription} = $::locale->{iconv_utf8}->convert($item->{taxdescription}); - $item->{taxdescription} .= ' ' . $form->round_amount($item->{rate} * 100); - } - - $form->{TAX_ACCOUNTS} = [ @tax_accounts ]; - - print $form->ajax_response_header, $form->parse_html_template("gl/update_tax_accounts"); + print $::form->ajax_response_header, $html; +} - $main::lxdebug->leave_sub(); +sub get_chart_balance { + my %balances = GL->get_chart_balances($::form->{accno_id}); + my $balance = $::form->format_amount(\%::myconfig, $balances{ $::form->{accno_id} }, 2, 'DRCR'); + print $::form->ajax_response_header, $balance; } 1; diff --git a/js/kivi.GL.js b/js/kivi.GL.js new file mode 100644 index 000000000..833d9283e --- /dev/null +++ b/js/kivi.GL.js @@ -0,0 +1,30 @@ +namespace('kivi.GL', function(ns) { + "use strict"; + + this.show_chart_balance = function(obj) { + var row = $(obj).attr('name').replace(/.*_/, ''); + + $.ajax({ + url: 'gl.pl?action=get_chart_balance', + data: { accno_id: $(obj).val() }, + dataType: 'html', + success: function (new_html) { + $('#chart_balance_' + row).html(new_html); + } + }); + }; + + this.update_taxes = function(obj) { + var row = $(obj).attr('name').replace(/.*_/, ''); + + $.ajax({ + url: 'gl.pl?action=get_tax_dropdown', + data: { accno_id: $(obj).val(), + transdate: $('#transdate').val() }, + dataType: 'html', + success: function (new_html) { + $("#taxchart_" + row).html(new_html); + } + }); + }; +}); diff --git a/templates/webpages/gl/form_footer.html b/templates/webpages/gl/form_footer.html index 48bbbea62..6e78ce12f 100644 --- a/templates/webpages/gl/form_footer.html +++ b/templates/webpages/gl/form_footer.html @@ -51,3 +51,17 @@ + diff --git a/templates/webpages/gl/form_header.html b/templates/webpages/gl/form_header.html index 748ff1b32..2a34a69e9 100644 --- a/templates/webpages/gl/form_header.html +++ b/templates/webpages/gl/form_header.html @@ -6,26 +6,6 @@ diff --git a/templates/webpages/gl/update_tax_accounts.html b/templates/webpages/gl/update_tax_accounts.html index d3c9586b2..88d866861 100644 --- a/templates/webpages/gl/update_tax_accounts.html +++ b/templates/webpages/gl/update_tax_accounts.html @@ -1,4 +1,4 @@ -[% USE L %] +[% USE L %][%- USE LxERP -%] [% FOR row = TAX_ACCOUNTS %] - + [% END %] -- 2.20.1