use strict;
use POSIX qw(strftime);
-use List::Util qw(sum);
+use List::Util qw(first sum);
+use SL::DB::RecordTemplate;
+use SL::DB::Tax;
use SL::FU;
use SL::GL;
+use SL::Helper::Flash qw(flash);
use SL::IS;
use SL::ReportGenerator;
use SL::DBUtils qw(selectrow_query selectall_hashref_query);
use SL::Webdav;
use SL::Locale::String qw(t8);
+use SL::Helper::GlAttachments qw(count_gl_attachments);
require "bin/mozilla/common.pl";
require "bin/mozilla/reportgenerator.pl";
# $locale->text('Nov')
# $locale->text('Dec')
+sub load_record_template {
+ $::auth->assert('gl_transactions');
+
+ # Load existing template and verify that its one for this module.
+ my $template = SL::DB::RecordTemplate
+ ->new(id => $::form->{id})
+ ->load(
+ with_object => [ qw(customer payment currency record_items record_items.chart) ],
+ );
+
+ die "invalid template type" unless $template->template_type eq 'gl_transaction';
+
+ $template->substitute_variables;
+
+ # Clean the current $::form before rebuilding it from the template.
+ delete @{ $::form }{ grep { !m{^(?:script|login)$}i } keys %{ $::form } };
+
+ my $dummy_form = {};
+ GL->transaction(\%::myconfig, $dummy_form);
+
+ # Fill $::form from the template.
+ my $today = DateTime->today_local;
+ $::form->{title} = "Add";
+ $::form->{transdate} = $today->to_kivitendo;
+ $::form->{duedate} = $today->to_kivitendo;
+ $::form->{rowcount} = @{ $template->items };
+ $::form->{paidaccounts} = 1;
+ $::form->{$_} = $template->$_ for qw(department_id taxincluded ob_transaction cb_transaction reference description);
+ $::form->{$_} = $dummy_form->{$_} for qw(closedto revtrans previous_id previous_gldate);
+
+ my $row = 0;
+ foreach my $item (@{ $template->items }) {
+ $row++;
+
+ my $active_taxkey = $item->chart->get_active_taxkey;
+ my $taxes = SL::DB::Manager::Tax->get_all(
+ where => [ chart_categories => { like => '%' . $item->chart->category . '%' }],
+ sort_by => 'taxkey, rate',
+ );
+
+ my $tax = first { $item->tax_id == $_->id } @{ $taxes };
+ $tax //= first { $active_taxkey->tax_id == $_->id } @{ $taxes };
+ $tax //= $taxes->[0];
+
+ if (!$tax) {
+ $row--;
+ next;
+ }
+
+ $::form->{"accno_id_${row}"} = $item->chart_id;
+ $::form->{"previous_accno_id_${row}"} = $item->chart_id;
+ $::form->{"debit_${row}"} = $::form->format_amount(\%::myconfig, $item->amount1, 2) if $item->amount1 * 1;
+ $::form->{"credit_${row}"} = $::form->format_amount(\%::myconfig, $item->amount2, 2) if $item->amount2 * 1;
+ $::form->{"taxchart_${row}"} = $item->tax_id . '--' . $tax->rate;
+ $::form->{"${_}_${row}"} = $item->$_ for qw(source memo project_id);
+ }
+
+ flash('info', $::locale->text("The record template '#1' has been loaded.", $template->template_name));
+
+ update(
+ keep_rows_without_amount => 1,
+ dont_add_new_row => 1,
+ );
+}
+
+sub save_record_template {
+ $::auth->assert('gl_transactions');
+
+ my $template = $::form->{record_template_id} ? SL::DB::RecordTemplate->new(id => $::form->{record_template_id})->load : SL::DB::RecordTemplate->new;
+ my $js = SL::ClientJS->new(controller => SL::Controller::Base->new);
+ my $new_name = $template->template_name_to_use($::form->{record_template_new_template_name});
+
+ $js->dialog->close('#record_template_dialog');
+
+ my @items = grep {
+ $_->{chart_id} && (($_->{tax_id} // '') ne '')
+ } map {
+ +{ chart_id => $::form->{"accno_id_${_}"},
+ amount1 => $::form->parse_amount(\%::myconfig, $::form->{"debit_${_}"}),
+ amount2 => $::form->parse_amount(\%::myconfig, $::form->{"credit_${_}"}),
+ tax_id => (split m{--}, $::form->{"taxchart_${_}"})[0],
+ project_id => $::form->{"project_id_${_}"} || undef,
+ source => $::form->{"source_${_}"},
+ memo => $::form->{"memo_${_}"},
+ }
+ } (1..($::form->{rowcount} || 1));
+
+ $template->assign_attributes(
+ template_type => 'gl_transaction',
+ template_name => $new_name,
+
+ currency_id => $::instance_conf->get_currency_id,
+ department_id => $::form->{department_id} || undef,
+ project_id => $::form->{globalproject_id} || undef,
+ taxincluded => $::form->{taxincluded} ? 1 : 0,
+ ob_transaction => $::form->{ob_transaction} ? 1 : 0,
+ cb_transaction => $::form->{cb_transaction} ? 1 : 0,
+ reference => $::form->{reference},
+ description => $::form->{description},
+
+ items => \@items,
+ );
+
+ eval {
+ $template->save;
+ 1;
+ } or do {
+ return $js
+ ->flash('error', $::locale->text("Saving the record template '#1' failed.", $new_name))
+ ->render;
+ };
+
+ return $js
+ ->flash('info', $::locale->text("The record template '#1' has been saved.", $new_name))
+ ->render;
+}
+
sub add {
$main::lxdebug->enter_sub();
my @columns = qw(
gldate transdate id reference description
- notes source debit debit_accno
+ notes source doccnt debit debit_accno
credit credit_accno debit_tax debit_tax_accno
credit_tax credit_tax_accno projectnumbers balance employee
);
$form->{l_datesort} = 'Y';
$form->{l_debit_tax_accno} = 'Y';
$form->{l_balance} = $form->{accno} ? 'Y' : '';
+ $form->{l_doccnt} = $form->{l_source} ? 'Y' : '';
my %column_defs = (
'id' => { 'text' => $locale->text('ID'), },
'gldate' => { 'text' => $locale->text('Booking Date'), },
'reference' => { 'text' => $locale->text('Reference'), },
'source' => { 'text' => $locale->text('Source'), },
+ 'doccnt' => { 'text' => $locale->text('Document Count'), },
'description' => { 'text' => $locale->text('Description'), },
'notes' => { 'text' => $locale->text('Notes'), },
'debit' => { 'text' => $locale->text('Debit'), },
$report->set_columns(%column_defs);
$report->set_column_order(@columns);
- $report->set_export_options('generate_report', @hidden_variables, qw(sort sortdir));
+ $form->{l_attachments} = 'Y';
+ $report->set_export_options('generate_report', @hidden_variables, qw(sort sortdir l_attachments));
$report->set_sort_indicator($form->{sort} eq 'accno' ? 'debit_accno' : $form->{sort}, $form->{sortdir});
my $row = { };
map { $row->{$_} = { 'data' => '', 'align' => $column_alignment{$_} } } @columns;
+ if ( $form->{l_doccnt} ) {
+ $row->{doccnt}->{data} = SL::Helper::GlAttachments->count_gl_pdf_attachments($ref->{id},$ref->{type});
+ }
+
my $sh = "";
if ($form->{balance} < 0) {
$sh = " S";
}
sub update {
+ my %params = @_;
+
$main::lxdebug->enter_sub();
$main::auth->assert('gl_transactions');
qw(accno debit credit projectnumber fx_transaction source memo tax taxchart);
for my $i (1 .. $form->{rowcount}) {
+ $form->{"${_}_$i"} = $form->parse_amount(\%myconfig, $form->{"${_}_$i"}) for qw(debit credit tax);
- unless (($form->{"debit_$i"} eq "") && ($form->{"credit_$i"} eq "")) {
- for (qw(debit credit tax)) {
- $form->{"${_}_$i"} =
- $form->parse_amount(\%myconfig, $form->{"${_}_$i"});
- }
+ next if !$form->{"debit_$i"} && !$form->{"credit_$i"} && !$params{keep_rows_without_amount};
- push @a, {};
- $debitcredit = ($form->{"debit_$i"} == 0) ? "0" : "1";
+ push @a, {};
+ $debitcredit = ($form->{"debit_$i"} == 0) ? "0" : "1";
+ if ($debitcredit) {
+ $debitcount++;
+ } else {
+ $creditcount++;
+ }
+
+ if (($debitcount >= 2) && ($creditcount == 2)) {
+ $form->{"credit_$i"} = 0;
+ $form->{"tax_$i"} = 0;
+ $creditcount--;
+ $form->{creditlock} = 1;
+ }
+ if (($creditcount >= 2) && ($debitcount == 2)) {
+ $form->{"debit_$i"} = 0;
+ $form->{"tax_$i"} = 0;
+ $debitcount--;
+ $form->{debitlock} = 1;
+ }
+ if (($creditcount == 1) && ($debitcount == 2)) {
+ $form->{creditlock} = 1;
+ }
+ if (($creditcount == 2) && ($debitcount == 1)) {
+ $form->{debitlock} = 1;
+ }
+ if ($debitcredit && $credittax) {
+ $form->{"taxchart_$i"} = "$notax_id--0.00";
+ }
+ if (!$debitcredit && $debittax) {
+ $form->{"taxchart_$i"} = "$notax_id--0.00";
+ }
+ $amount =
+ ($form->{"debit_$i"} == 0)
+ ? $form->{"credit_$i"}
+ : $form->{"debit_$i"};
+ my $j = $#a;
+ if (($debitcredit && $credittax) || (!$debitcredit && $debittax)) {
+ $form->{"taxchart_$i"} = "$notax_id--0.00";
+ $form->{"tax_$i"} = 0;
+ }
+ my ($taxkey, $rate) = split(/--/, $form->{"taxchart_$i"});
+ my $iswithouttax = grep { $_->{id} == $taxkey } @{ $zerotaxes };
+ if (!$iswithouttax) {
if ($debitcredit) {
- $debitcount++;
+ $debittax = 1;
} else {
- $creditcount++;
- }
-
- if (($debitcount >= 2) && ($creditcount == 2)) {
- $form->{"credit_$i"} = 0;
- $form->{"tax_$i"} = 0;
- $creditcount--;
- $form->{creditlock} = 1;
- }
- if (($creditcount >= 2) && ($debitcount == 2)) {
- $form->{"debit_$i"} = 0;
- $form->{"tax_$i"} = 0;
- $debitcount--;
- $form->{debitlock} = 1;
- }
- if (($creditcount == 1) && ($debitcount == 2)) {
- $form->{creditlock} = 1;
- }
- if (($creditcount == 2) && ($debitcount == 1)) {
- $form->{debitlock} = 1;
- }
- if ($debitcredit && $credittax) {
- $form->{"taxchart_$i"} = "$notax_id--0.00";
- }
- if (!$debitcredit && $debittax) {
- $form->{"taxchart_$i"} = "$notax_id--0.00";
- }
- $amount =
- ($form->{"debit_$i"} == 0)
- ? $form->{"credit_$i"}
- : $form->{"debit_$i"};
- my $j = $#a;
- if (($debitcredit && $credittax) || (!$debitcredit && $debittax)) {
- $form->{"taxchart_$i"} = "$notax_id--0.00";
- $form->{"tax_$i"} = 0;
+ $credittax = 1;
}
- my ($taxkey, $rate) = split(/--/, $form->{"taxchart_$i"});
- my $iswithouttax = grep { $_->{id} == $taxkey } @{ $zerotaxes };
- if (!$iswithouttax) {
- if ($debitcredit) {
- $debittax = 1;
- } else {
- $credittax = 1;
- }
- };
- my ($tmpnetamount,$tmpdiff);
- ($tmpnetamount,$form->{"tax_$i"},$tmpdiff) = $form->calculate_tax($amount,$rate,$form->{taxincluded} *= 1,2);
+ };
+ my ($tmpnetamount,$tmpdiff);
+ ($tmpnetamount,$form->{"tax_$i"},$tmpdiff) = $form->calculate_tax($amount,$rate,$form->{taxincluded} *= 1,2);
- for (@flds) { $a[$j]->{$_} = $form->{"${_}_$i"} }
- $count++;
- }
+ for (@flds) { $a[$j]->{$_} = $form->{"${_}_$i"} }
+ $count++;
}
for my $i (1 .. $count) {
for (@flds) { delete $form->{"${_}_$i"} }
}
- $form->{rowcount} = $count + 1;
+ $form->{rowcount} = $count + ($params{dont_add_new_row} ? 0 : 1);
- &display_form;
+ display_form();
$main::lxdebug->leave_sub();
}
my ($init) = @_;
- $::request->layout->add_javascripts("autocomplete_chart.js", "kivi.GL.js");
+ $::request->layout->add_javascripts("autocomplete_chart.js", "kivi.GL.js", "kivi.RecordTemplate.js");
my @old_project_ids = grep { $_ } map{ $::form->{"project_id_$_"} } 1..$::form->{rowcount};