sub search {
- $main::lxdebug->enter_sub();
-
- $main::auth->assert('general_ledger');
-
- my $form = $main::form;
- my %myconfig = %main::myconfig;
- my $locale = $main::locale;
- my $cgi = $main::cgi;
-
- $form->{title} = $locale->text('Journal');
-
- $form->all_departments(\%myconfig);
-
- # departments
- if (@{ $form->{all_departments} || [] }) {
- $form->{selectdepartment} = "<option>\n";
-
- map {
- $form->{selectdepartment} .=
- "<option>$_->{description}--$_->{id}\n"
- } (@{ $form->{all_departments} || [] });
- }
-
- my $department = qq|
- <tr>
- <th align=right nowrap>| . $locale->text('Department') . qq|</th>
- <td colspan=3><select name=department>$form->{selectdepartment}</select></td>
- </tr>
-| if $form->{selectdepartment};
-
- $form->get_lists("projects" => { "key" => "ALL_PROJECTS",
- "all" => 1},
- "employees" => "ALL_EMPLOYEES" );
-
- my %project_labels = ();
- my @project_values = ("");
- foreach my $item (@{ $form->{"ALL_PROJECTS"} }) {
- push(@project_values, $item->{"id"});
- $project_labels{$item->{"id"}} = $item->{"projectnumber"};
- }
-
- my $projectnumber =
- NTI($cgi->popup_menu('-name' => "project_id",
- '-values' => \@project_values,
- '-labels' => \%project_labels));
-
- my %employee_labels = ();
- my @employee_values = ("");
- foreach my $item (@{ $form->{"ALL_EMPLOYEES"} }) {
- # value in Form "1234--Name" übergeben
- my $id = "$item->{'id'}--$item->{'name'}";
- push(@employee_values, "$id");
- $employee_labels{$id} = $item->{"name"};
- }
-
- my $employeenumber =
- NTI($cgi->popup_menu('-name' => "employee",
- '-values' => \@employee_values,
- '-labels' => \%employee_labels));
-
- # use JavaScript Calendar or not
- $form->{jsscript} = 1;
- my $jsscript = "";
- my ($button1, $button2, $onload);
- if ($form->{jsscript}) {
-
- # with JavaScript Calendar
- $button1 = qq|
- <td><input name=datefrom id=datefrom size=11 title="$myconfig{dateformat}" onBlur=\"check_right_date_format(this)\">
- <input type=button name=datefrom id="trigger1" value=|
- . $locale->text('button') . qq|></td>
- |;
- $button2 = qq|
- <td><input name=dateto id=dateto size=11 title="$myconfig{dateformat}" onBlur=\"check_right_date_format(this)\">
- <input type=button name=dateto id="trigger2" value=|
- . $locale->text('button') . qq|></td>
- |;
-
- #write Trigger
- $jsscript =
- Form->write_trigger(\%myconfig, "2", "datefrom", "BR", "trigger1",
- "dateto", "BL", "trigger2");
- } else {
-
- # without JavaScript Calendar
- $button1 =
- qq|<td><input name=datefrom id=datefrom size=11 title="$myconfig{dateformat}" onBlur=\"check_right_date_format(this)\"></td>|;
- $button2 =
- qq|<td><input name=dateto id=dateto size=11 title="$myconfig{dateformat}" onBlur=\"check_right_date_format(this)\"></td>|;
- }
- $form->{javascript} .= qq|<script type="text/javascript" src="js/common.js"></script>|;
- $form->header;
- $onload = qq|focus()|;
- $onload .= qq|;setupDateFormat('|. $myconfig{dateformat} .qq|', '|. $locale->text("Falsches Datumsformat!") .qq|')|;
- $onload .= qq|;setupPoints('|. $myconfig{numberformat} .qq|', '|. $locale->text("wrongformat") .qq|')|;
- print qq|
-<body onLoad="$onload">
-
-<form method=post action=gl.pl>
-
-<input type=hidden name=sort value=datesort>
-
-<table width=100%>
- <tr>
- <th class=listtop>$form->{title}</th>
- </tr>
- <tr height="5"></tr>
- <tr>
- <td>
- <table>
- <tr>
- <th align=right>| . $locale->text('Reference') . qq|</th>
- <td><input name=reference size=20></td>
- <th align=right>| . $locale->text('Source') . qq|</th>
- <td><input name=source size=20></td>
- </tr>
- $department
- <tr>
- <th align=right>| . $locale->text('Description') . qq|</th>
- <td><input name=description size=40></td>
- <th align=right>| . $locale->text('Account Number') . qq|</th>
- <td><input name=accno size=20></td>
- </tr>
- <tr>
- <th align=right>| . $locale->text('Notes') . qq|</th>
- <td colspan=3><input name=notes size=40></td>
- </tr>
- <tr>
- <th align=right>| . $locale->text('Project Number') . qq|</th>
- <td colspan=3>$projectnumber</td>
- </tr>
- <tr>
- <th align=right>| . $locale->text('From') . qq|</th>
- <tr>
- <th align=right>| . $locale->text('Employee') . qq|</th>
- <td colspan=3>$employeenumber</td>
- </tr>
- <tr>
- <th align=right>| . $locale->text('Date Sorting') . qq|</th>
- <td colspan=3>
- <input name=datesort class=radio type=radio value=gldate checked> | . $locale->text('Booking Date') . qq|
- <input name=datesort class=radio type=radio value=transdate> | . $locale->text('Invoice Date') . qq|
- </td>
- </tr>
- <tr>
- <th align=right>| . $locale->text('From') . qq|</th>
- $button1
- <th align=right>| . $locale->text('To (time)') . qq|</th>
- $button2
- </tr>
- <tr>
- <th align=right>| . $locale->text('Include in Report') . qq|</th>
- <td colspan=3>
- <table>
- <tr>
- <td>
- <input name="category" class=radio type=radio value=X checked> |
- . $locale->text('All') . qq|
- <input name="category" class=radio type=radio value=A> |
- . $locale->text('Asset') . qq|
- <input name="category" class=radio type=radio value=L> |
- . $locale->text('Liability') . qq|
- <input name="category" class=radio type=radio value=I> |
- . $locale->text('Revenue') . qq|
- <input name="category" class=radio type=radio value=E> |
- . $locale->text('Expense') . qq|
- </td>
- </tr>
- <tr>
- <table>
- <tr>
- <td align=right><input name="l_id" class=checkbox type=checkbox value=Y></td>
- <td>| . $locale->text('ID') . qq|</td>
- <td align=right><input name="l_transdate" class=checkbox type=checkbox value=Y checked></td>
- <td>| . $locale->text('Invoice Date') . qq|</td>
- <td align=right><input name="l_gldate" class=checkbox type=checkbox value=Y checked></td>
- <td>| . $locale->text('Booking Date') . qq|</td>
- <td align=right><input name="l_reference" class=checkbox type=checkbox value=Y checked></td>
- <td>| . $locale->text('Reference') . qq|</td>
- <td align=right><input name="l_description" class=checkbox type=checkbox value=Y checked></td>
- <td>| . $locale->text('Description') . qq|</td>
- <td align=right><input name="l_notes" class=checkbox type=checkbox value=Y></td>
- <td>| . $locale->text('Notes') . qq|</td>
- </tr>
- <tr>
- <td align=right><input name="l_debit" class=checkbox type=checkbox value=Y checked></td>
- <td>| . $locale->text('Debit') . qq|</td>
- <td align=right><input name="l_credit" class=checkbox type=checkbox value=Y checked></td>
- <td>| . $locale->text('Credit') . qq|</td>
- <td align=right><input name="l_source" class=checkbox type=checkbox value=Y checked></td>
- <td>| . $locale->text('Source') . qq|</td>
- <td align=right><input name="l_accno" class=checkbox type=checkbox value=Y checked></td>
- <td>| . $locale->text('Account') . qq|</td>
- </tr>
- <tr>
- <td align=right><input name="l_subtotal" class=checkbox type=checkbox value=Y></td>
- <td>| . $locale->text('Subtotal') . qq|</td>
- <td align=right><input name="l_projectnumbers" class=checkbox type=checkbox value=Y></td>
- <td>| . $locale->text('Project Number') . qq|</td>
- <td align=right><input name="l_employee" class=checkbox type=checkbox value=Y></td>
- <td>| . $locale->text('Employee') . qq|</td>
- </tr>
- </table>
- </tr>
- </table>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td><hr size=3 noshade></td>
- </tr>
-</table>
+ $::lxdebug->enter_sub;
+ $::auth->assert('general_ledger');
-$jsscript
-
-<input type=hidden name=nextsub value=generate_report>
+ $::form->all_departments(\%::myconfig);
+ $::form->get_lists(
+ projects => { key => "ALL_PROJECTS", all => 1 },
+ );
+ $::form->{ALL_EMPLOYEES} = SL::DB::Manager::Employee->get_all_sorted(query => [ deleted => 0 ]);
-<br>
-<input class=submit type=submit name=action value="|
- . $locale->text('Continue') . qq|">
-</form>
+ $::form->header;
+ print $::form->parse_html_template('gl/search', {
+ department_label => sub { ("$_[0]{description}--$_[0]{id}")x2 },
+ employee_label => sub { "$_[0]{id}--$_[0]{name}" },
+ });
-</body>
-</html>
-|;
- $main::lxdebug->leave_sub();
+ $::lxdebug->leave_sub;
}
sub create_subtotal_row {
my %myconfig = %main::myconfig;
my $locale = $main::locale;
- # generate_report wird beim ersten Aufruf per Weiter-Knopf und POST mit der hidden Variablen sort mit Wert "datesort" (früher "transdate" als Defaultsortiervariable) übertragen
+ # generate_report wird beim ersten Aufruf per Weiter-Knopf und POST mit der hidden Variablen sort mit Wert "datesort" (früher "transdate" als Defaultsortiervariable) übertragen
# <form method=post action=gl.pl>
# <input type=hidden name=sort value=datesort> # form->{sort} setzen
# <input type=hidden name=nextsub value=generate_report>
# anhand von neuer Variable datesort wird jetzt $form->{sort} auf transdate oder gldate gesetzt
- # damit ist die Hidden Variable "sort" wahrscheinlich sogar überflüssig
+ # damit ist die Hidden Variable "sort" wahrscheinlich sogar überflüssig
- # ändert man die Sortierreihenfolge per Klick auf eine der Überschriften wird die Variable "sort" per GET übergeben, z.B. id,transdate, gldate, ...
+ # ändert man die Sortierreihenfolge per Klick auf eine der Überschriften wird die Variable "sort" per GET übergeben, z.B. id,transdate, gldate, ...
# gl.pl?action=generate_report&employee=18383--Jan%20B%c3%bcren&datesort=transdate&category=X&l_transdate=Y&l_gldate=Y&l_id=Y&l_reference=Y&l_description=Y&l_source=Y&l_debit=Y&l_credit=Y&sort=gldate&sortdir=0
if ( $form->{sort} eq 'datesort' ) { # sollte bei einem Post (Aufruf aus Suchmaske) immer wahr sein
my @columns = qw(
gldate transdate id reference description
- notes source debit debit_accno
+ notes source debit debit_accno
credit credit_accno debit_tax debit_tax_accno
- credit_tax credit_tax_accno projectnumbers balance
+ credit_tax credit_tax_accno projectnumbers balance employee
);
# add employee here, so that variable is still known and passed in url when choosing a different sort order in resulting table
- my @hidden_variables = qw(accno source reference department description notes project_id datefrom dateto employee datesort category l_subtotal);
+ my @hidden_variables = qw(accno source reference department description notes project_id datefrom dateto employee_id datesort category l_subtotal);
push @hidden_variables, map { "l_${_}" } @columns;
- foreach ( @hidden_variables ) {
- print URL "$_\n";
- };
+
+ my $employee = $form->{employee_id} ? SL::DB::Employee->new(id => $form->{employee_id})->load->name : '';
my (@options, @date_options);
push @options, $locale->text('Account') . " : $form->{accno} $form->{account_description}" if ($form->{accno});
push @options, $locale->text('Reference') . " : $form->{reference}" if ($form->{reference});
push @options, $locale->text('Description') . " : $form->{description}" if ($form->{description});
push @options, $locale->text('Notes') . " : $form->{notes}" if ($form->{notes});
- push @options, $locale->text('Employee') . " : $form->{employee_name}" if ($form->{employee_name});
+ push @options, $locale->text('Employee') . " : $employee" if $employee;
my $datesorttext = $form->{datesort} eq 'transdate' ? $locale->text('Invoice Date') : $locale->text('Booking Date');
push @date_options, "$datesorttext" if ($form->{datesort} and ($form->{datefrom} or $form->{dateto}));
push @date_options, $locale->text('From'), $locale->date(\%myconfig, $form->{datefrom}, 1) if ($form->{datefrom});
my $callback = build_std_url('action=generate_report', grep { $form->{$_} } @hidden_variables);
- print URL $callback;
- close URL;
$form->{l_credit_accno} = 'Y';
$form->{l_debit_accno} = 'Y';
$row->{balance}->{data} = $data;
$row->{projectnumbers}->{data} = join ", ", sort { lc($a) cmp lc($b) } keys %{ $ref->{projectnumbers} };
- map { $row->{$_}->{data} = $ref->{$_} } qw(id reference description notes);
+ map { $row->{$_}->{data} = $ref->{$_} } qw(id reference description notes gldate employee);
- map { $row->{$_}->{data} = \@{ $rows{$_} }; } qw(transdate gldate debit credit debit_accno credit_accno debit_tax_accno credit_tax_accno source);
+ map { $row->{$_}->{data} = \@{ $rows{$_} }; } qw(transdate debit credit debit_accno credit_accno debit_tax_accno credit_tax_accno source);
foreach my $col (qw(debit_accno credit_accno debit_tax_accno credit_tax_accno)) {
$row->{$col}->{link} = [ map { "${callback}&accno=" . E($_) } @{ $rows{$col} } ];
my $row_set = [ $row ];
- if (($form->{l_subtotal} eq 'Y')
+ if ( ($form->{l_subtotal} eq 'Y' && !$form->{report_generator_csv_options_for_import} )
&& (($idx == (scalar @{ $form->{GL} } - 1))
|| ($ref->{ $form->{sort} } ne $form->{GL}->[$idx + 1]->{ $form->{sort} }))) {
push @{ $row_set }, create_subtotal_row(\%subtotals, \@columns, \%column_alignment, [ qw(debit credit) ], 'listsubtotal');
$idx++;
}
- $report->add_separator();
-
# = 0 for balanced ledger
my $balanced_ledger = $totals{debit} + $totals{debit_tax} - $totals{credit} - $totals{credit_tax};
$row->{balance}->{data} = $data;
- $report->add_data($row);
+ if ( !$form->{report_generator_csv_options_for_import} ) {
+ $report->add_separator();
+ $report->add_data($row);
+ }
my $raw_bottom_info_text;
} else {
$credittax = 1;
}
- if ($form->{taxincluded}) {
- $form->{"tax_$i"} = $amount / ($rate + 1) * $rate;
- } else {
- $form->{"tax_$i"} = $amount * $rate;
- }
- } else {
- $form->{"tax_$i"} = 0;
- }
+ };
+ my ($tmpnetamount,$tmpdiff);
+ ($tmpnetamount,$form->{"tax_$i"},$tmpdiff) = $form->calculate_tax($amount,$rate,$form->{taxincluded} *= 1,2);
for (@flds) { $a[$j]->{$_} = $form->{"${_}_$i"} }
$count++;
my $form = $main::form;
my %myconfig = %main::myconfig;
- my $cgi = $main::cgi;
+ my $cgi = $::request->{cgi};
$form->{debit_1} = 0 if !$form->{"debit_1"};
$form->{totaldebit} = 0;
my %charts = ();
my $taxchart_init;
foreach my $item (@{ $form->{ALL_CHARTS} }) {
- if ($item->{charttype} eq 'H'){ #falls überschrift
- next; #überspringen (Bug 1150)
+ if ($item->{charttype} eq 'H'){ #falls Ã\83Å\92berschrift
+ next; #Ã\83Å\92berspringen (Bug 1150)
}
my $key = $item->{accno} . "--" . $item->{tax_id};
$taxchart_init = $item->{tax_id} unless (@chart_values);
$charts{$item->{accno}} = $item;
}
- my %taxchart_labels = ();
- my @taxchart_values = ();
- my %taxcharts = ();
- foreach my $item (@{ $form->{ALL_TAXCHARTS} }) {
- 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;
- }
-
my ($source, $memo, $source_hidden, $memo_hidden);
for my $i (1 .. $form->{rowcount}) {
if ($form->{show_details}) {
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 $accno = qq|<td>| .
NTI($cgi->popup_menu('-name' => "accno_$i",
'-id' => "accno_$i",
- '-onChange' => "setTaxkey($i)",
+ '-onChange' => "updateTaxes($i);",
'-style' => 'width:200px',
'-values' => \@chart_values,
'-labels' => \%chart_labels,
. qq|</td>|;
my $tax_ddbox = qq|<td>| .
NTI($cgi->popup_menu('-name' => "taxchart_$i",
- '-id' => "taxchart_$i",
- '-style' => 'width:200px',
- '-values' => \@taxchart_values,
- '-labels' => \%taxchart_labels,
- '-default' => $selected_taxchart))
+ '-id' => "taxchart_$i",
+ '-style' => 'width:200px',
+ '-values' => \@taxchart_values,
+ '-labels' => \%taxchart_labels,
+ '-default' => $selected_taxchart))
. qq|</td>|;
my ($fx_transaction, $checked);
my $projectnumber_hidden = qq|
<input type="hidden" name="project_id_$i" value="$form->{"project_id_$i"}">|;
- my $copy2credit = 'onkeyup="copy_debit_to_credit()"' if $i == 1;
+ my $copy2credit = $i == 1 ? 'onkeyup="copy_debit_to_credit()"' : '';
print qq|<tr valign=top>
$accno
}
-sub form_header {
- my ($init) = @_;
- $main::lxdebug->enter_sub();
+sub _get_radieren {
+ return ($::instance_conf->get_gl_changeable == 2) ? ($::form->current_date(\%::myconfig) eq $::form->{gldate}) : ($::instance_conf->get_gl_changeable == 1);
+}
- $main::auth->assert('general_ledger');
+sub form_header {
+ $::lxdebug->enter_sub;
+ $::auth->assert('general_ledger');
- my $form = $main::form;
- my %myconfig = %main::myconfig;
- my $locale = $main::locale;
+ my ($init) = @_;
- my @old_project_ids = ();
- map({ push(@old_project_ids, $form->{"project_id_$_"})
- if ($form->{"project_id_$_"}); } (1..$form->{"rowcount"}));
+ my @old_project_ids = grep { $_ } map{ $::form->{"project_id_$_"} } 1..$::form->{rowcount};
- $form->get_lists("projects" => { "key" => "ALL_PROJECTS",
+ $::form->get_lists("projects" => { "key" => "ALL_PROJECTS",
"all" => 0,
"old_id" => \@old_project_ids },
"charts" => { "key" => "ALL_CHARTS",
- "transdate" => $form->{transdate} },
- "taxcharts" => "ALL_TAXCHARTS");
-
- GL->get_chart_balances('charts' => $form->{ALL_CHARTS});
+ "transdate" => $::form->{transdate} });
- my $title = $form->{title};
- $form->{title} = $locale->text("$title General Ledger Transaction");
- my $readonly = ($form->{id}) ? "readonly" : "";
-
- my $show_details_checked = "checked" if $form->{show_details};
-
- my $ob_transaction_checked = "checked" if $form->{ob_transaction};
- my $cb_transaction_checked = "checked" if $form->{cb_transaction};
+ 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')
# $locale->text('Edit General Ledger Transaction')
- map { $form->{$_} =~ s/\"/"/g }
- qw(reference description chart taxchart);
-
- $form->{javascript} = qq|<script type="text/javascript">
- <!--
- function setTaxkey(row) {
- var accno = document.getElementById('accno_' + row);
- var taxkey = accno.options[accno.selectedIndex].value;
- var reg = /--([0-9]*)/;
- var found = reg.exec(taxkey);
- var index = found[1];
- index = parseInt(index);
- var tax = 'taxchart_' + row;
- for (var i = 0; i < document.getElementById(tax).options.length; ++i) {
- var reg2 = new RegExp("^"+ index, "");
- if (reg2.exec(document.getElementById(tax).options[i].value)) {
- document.getElementById(tax).options[i].selected = true;
- break;
- }
- }
- };
+ map { $::form->{$_} =~ s/\"/"/g }
+ qw(chart taxchart);
- function copy_debit_to_credit() {
- var txt = document.getElementsByName('debit_1')[0].value;
- document.getElementsByName('credit_2')[0].value = txt;
- };
- //-->
- </script>
- <script type="text/javascript" src="js/show_form_details.js"></script>
- <script type="text/javascript" src="js/jquery.js"></script>
-|;
-
- $form->{selectdepartment} =~ s/ selected//;
- $form->{selectdepartment} =~
- s/option>\Q$form->{department}\E/option selected>$form->{department}/;
-
- my $description;
- if ((my $rows = $form->numtextrows($form->{description}, 50)) > 1) {
- $description =
- qq|<textarea name=description rows=$rows cols=50 wrap=soft $readonly >$form->{description}</textarea>|;
- } else {
- $description =
- qq|<input name=description size=50 value="$form->{description}" $readonly>|;
- }
-
- my $taxincluded = ($form->{taxincluded}) ? "checked" : "";
+ $::form->{selectdepartment} =~ s/ selected//;
+ $::form->{selectdepartment} =~
+ s/option>\Q$::form->{department}\E/option selected>$::form->{department}/;
if ($init) {
- $taxincluded = "checked";
- }
-
- my $department;
- $department = qq|
- <tr>
- <th align=right nowrap>| . $locale->text('Department') . qq|</th>
- <td colspan=3><select name=department>$form->{selectdepartment}</select></td>
- <input type=hidden name=selectdepartment value="$form->{selectdepartment}">
- </tr>
-| if $form->{selectdepartment};
- if ($init) {
- $form->{fokus} = "gl.reference";
- } else {
- $form->{fokus} = qq|gl.accno_$form->{rowcount}|;
- }
-
- # use JavaScript Calendar or not
- $form->{jsscript} = 1;
- my $jsscript = "";
- my ($button1, $button2);
- if ($form->{jsscript}) {
-
- # with JavaScript Calendar
- $button1 = qq|
- <td><input name=transdate id=transdate size=11 title="$myconfig{dateformat}" value="$form->{transdate}" $readonly onBlur=\"check_right_date_format(this)\">
- <input type=button name=transdate id="trigger1" value=|
- . $locale->text('button') . qq|></td>
- |;
-
- #write Trigger
- $jsscript =
- Form->write_trigger(\%myconfig, "1", "transdate", "BL", "trigger1");
+ $::request->{layout}->focus("#reference");
+ $::form->{taxincluded} = "1";
} else {
-
- # without JavaScript Calendar
- $button1 =
- qq|<td><input name=transdate id=transdate size=11 title="$myconfig{dateformat}" value="$form->{transdate}" $readonly onBlur=\"check_right_date_format(this)\"></td>|;
+ $::request->{layout}->focus("#accno_$::form->{rowcount}");
}
- $form->{previous_id} ||= "--";
- $form->{previous_gldate} ||= "--";
-
- $jsscript .= $form->parse_html_template('gl/form_header_chart_balances_js');
-
- $form->header;
-
- print qq|
-<body onLoad="focus()">
-
-<script type="text/javascript" src="js/follow_up.js"></script>
-
-<form method=post name="gl" action=gl.pl>
-|;
-
- $form->hide_form(qw(id closedto locked storno storno_id previous_id previous_gldate));
+ $::form->{previous_id} ||= "--";
+ $::form->{previous_gldate} ||= "--";
- print qq|
-<input type=hidden name=title value="$title">
-
-<input type="hidden" name="follow_up_trans_id_1" value="| . H($form->{id}) . qq|">
-<input type="hidden" name="follow_up_trans_type_1" value="gl_transaction">
-<input type="hidden" name="follow_up_trans_info_1" value="| . H($form->{id}) . qq|">
-<input type="hidden" name="follow_up_rowcount" value="1">
-
-<table width=100%>
- <tr>
- <th class=listtop>$form->{title}</th>
- </tr>| .
-
- ($form->{saved_message} ? qq|
- <tr>
- <td>$form->{saved_message}</th>
- </tr>| : '') .
-
-qq|
- <tr height="5"></tr>
- <tr>
- <td>
- <table width=100%>
- <tr>
- <td colspan="6" align="left">|
- . $locale->text("Previous transnumber text")
- . " $form->{previous_id} "
- . $locale->text("Previous transdate text")
- . " $form->{previous_gldate}"
- . qq|</td>
- </tr>
- <tr>
- <th align=right>| . $locale->text('Reference') . qq|</th>
- <td><input name=reference size=20 value="$form->{reference}" $readonly></td>
- <td align=left>
- <table>
- <tr>
- <th align=right nowrap>| . $locale->text('Date') . qq|</th>
- $button1
- </tr>
- </table>
- </td>
- </tr>|;
- if ($form->{id}) {
- print qq|
- <tr>
- <th align=right>| . $locale->text('Belegnummer') . qq|</th>
- <td><input name=id size=20 value="$form->{id}" $readonly></td>
- <td align=left>
- <table>
- <tr>
- <th align=right width=50%>| . $locale->text('Buchungsdatum') . qq|</th>
- <td align=left><input name=gldate size=11 title="$myconfig{dateformat}" value=$form->{gldate} $readonly onBlur=\"check_right_date_format(this)\"></td>
- </tr>
- </table>
- </td>
- </tr>|;
- }
- print qq|
- $department|;
- if ($form->{id}) {
- print qq|
- <tr>
- <th align=right width=1%>| . $locale->text('Description') . qq|</th>
- <td width=1%>$description</td>
- <td>
- <table>
- <tr>
- <th align=left>| . $locale->text('MwSt. inkl.') . qq|</th>
- <td><input type=checkbox name=taxincluded value=1 $taxincluded></td>
- </tr>
- </table>
- </td>
- <td align=left>
- <table width=100%>
- <tr>
- <th align=right width=50%>| . $locale->text('Mitarbeiter') . qq|</th>
- <td align=left><input name=employee size=20 value="| . H($form->{employee}) . qq|" readonly></td>
- </tr>
- </table>
- </td>
- </tr>|;
- } else {
- print qq|
- <tr>
- <th align=left width=1%>| . $locale->text('Description') . qq|</th>
- <td width=1%>$description</td>
- <td>
- <table>
- <tr>
- <th align=left>| . $locale->text('MwSt. inkl.') . qq|</th>
- <td><input type=checkbox name=taxincluded value=1 $taxincluded></td>
- </tr>
- </table>
- </td>
- </tr>|;
- }
+ $::form->header;
+ print $::form->parse_html_template('gl/form_header', {
+ hide_title => $title,
+ readonly => $::form->{id} && ($::form->{locked} || !_get_radieren()),
+ });
- print qq|
- <tr>
- <tr><td colspan=4><table><tr>
- <td>
- | . $locale->text('OB Transaction') . qq|<input type="checkbox" name="ob_transaction" value="1" $ob_transaction_checked>
- </td>
- <td>
- | . $locale->text('CB Transaction') . qq|<input type="checkbox" name="cb_transaction" value="1" $cb_transaction_checked>
- </td>
- </tr></table></td></tr>
- <tr>
- <td width="1%" align="right" nowrap>| . $locale->text('Show details') . qq|</td>
- <td width="1%"><input type="checkbox" onclick="show_form_details();" name="show_details" value="1" $show_details_checked></td>
- </tr>|;
-
- print qq|
- <tr>
- <td colspan=4>
- <table width=100%>
- <tr class=listheading>
- <th class=listheading style="width:15%">|
- . $locale->text('Account') . qq|</th>
- <th class=listheading style="width:10%">| . $locale->text('Chart balance') . qq|</th>
- <th class=listheading style="width:10%">|
- . $locale->text('Debit') . qq|</th>
- <th class=listheading style="width:10%">|
- . $locale->text('Credit') . qq|</th>
- <th class=listheading style="width:10%">|
- . $locale->text('Tax') . qq|</th>
- <th class=listheading style="width:5%">|
- . $locale->text('Taxkey') . qq|</th>|;
-
- if ($form->{show_details}) {
- print qq|
- <th class=listheading style="width:20%">| . $locale->text('Source') . qq|</th>
- <th class=listheading style="width:20%">| . $locale->text('Memo') . qq|</th>
- <th class=listheading style="width:20%">| . $locale->text('Project Number') . qq|</th>
-|;
- }
-
- print qq|
- </tr>
-
-$jsscript
-|;
- $main::lxdebug->leave_sub();
+ $::lxdebug->leave_sub;
}
sub form_footer {
- $main::lxdebug->enter_sub();
-
- $main::auth->assert('general_ledger');
+ $::lxdebug->enter_sub;
+ $::auth->assert('general_ledger');
- my $form = $main::form;
- my %myconfig = %main::myconfig;
- my $locale = $main::locale;
- my $cgi = $main::cgi;
+ my ($follow_ups, $follow_ups_due);
- my $follow_ups_block;
- if ($form->{id}) {
- my $follow_ups = FU->follow_ups('trans_id' => $form->{id});
-
- if (@{ $follow_ups} ) {
- my $num_due = sum map { $_->{due} * 1 } @{ $follow_ups };
- $follow_ups_block = qq|<p>| . $locale->text("There are #1 unfinished follow-ups of which #2 are due.", scalar @{ $follow_ups }, $num_due) . qq|</p>|;
- }
+ if ($::form->{id}) {
+ $follow_ups = FU->follow_ups('trans_id' => $::form->{id});
+ $follow_ups_due = sum map { $_->{due} * 1 } @{ $follow_ups || [] };
}
- my ($dec) = ($form->{totaldebit} =~ /\.(\d+)/);
- $dec = length $dec;
- my $decimalplaces = ($dec > 2) ? $dec : 2;
- my $radieren = ($form->current_date(\%myconfig) eq $form->{gldate}) ? 1 : 0;
-
- map {
- $form->{$_} = $form->format_amount(\%myconfig, $form->{$_}, 2, " ")
- } qw(totaldebit totalcredit);
-
- print qq|
- <tr class=listtotal>
- <th colspan="3" align=right class=listtotal> $form->{totaldebit}</th>
- <th align=right class=listtotal> $form->{totalcredit}</th>
- <td colspan=6></td>
- </tr>
- </table>
- </td>
- </tr>
-</table>
-
-<input name=callback type=hidden value="$form->{callback}">
-
-$follow_ups_block
-
-<br>
-|;
-
- my $transdate = $form->datetonum($form->{transdate}, \%myconfig);
- my $closedto = $form->datetonum($form->{closedto}, \%myconfig);
-
- if ($form->{id}) {
-
- if (!$form->{storno}) {
- print qq|<input class=submit type=submit name=action value="| . $locale->text('Storno') . qq|">|;
- }
-
- # Löschen und Ändern von Buchungen nicht mehr möglich (GoB) nur am selben Tag möglich
- if (!$form->{locked} && $radieren) {
- print qq|
- <input class=submit type=submit name=action value="| . $locale->text('Post') . qq|" accesskey="b">
- <input class=submit type=submit name=action value="| . $locale->text('Delete') . qq|">|;
- }
-
- print qq|
- <input class=submit type=submit name=action id=update_button value="| . $locale->text('Update') . qq|">
- <input type="button" class="submit" onclick="follow_up_window()" value="|
- . $locale->text('Follow-Up')
- . qq|"> |;
-
- } else {
- if ($form->{draft_id}) {
- my $remove_draft_checked = 'checked' if ($form->{remove_draft});
- print qq|<p>\n|
- . qq| <input name="remove_draft" id="remove_draft" type="checkbox" class="checkbox" ${remove_draft_checked}>|
- . qq| <label for="remove_draft">| . $locale->text('Remove Draft') . qq|</label>\n|
- . qq|</p>\n|;
- }
-
- print qq|
- <input class=submit type=submit name=action id=update_button value="| . $locale->text('Update') . qq|">
- <input class=submit type=submit name=action value="| . $locale->text('Post') . qq|"> |
- . NTI($cgi->submit('-name' => 'action', '-value' => $locale->text('Save draft'), '-class' => 'submit'))
- . $cgi->hidden('-name' => 'draft_id', '-default' => [$form->{draft_id}])
- . $cgi->hidden('-name' => 'draft_description', '-default' => [$form->{draft_description}]);
- }
-
- print "
- </form>
-
-</body>
-</html>
-";
- $main::lxdebug->leave_sub();
+ print $::form->parse_html_template('gl/form_footer', {
+ radieren => _get_radieren(),
+ follow_ups => $follow_ups,
+ follow_ups_due => $follow_ups_due,
+ });
+ $::lxdebug->leave_sub;
}
sub delete {
$form->header;
print qq|
-<body>
-
<form method=post action=gl.pl>
|;
if (GL->delete_transaction(\%myconfig, \%$form)){
# saving the history
if(!exists $form->{addition} && $form->{id} ne "") {
- $form->{snumbers} = qq|ordnumber_| . $form->{ordnumber};
+ $form->{snumbers} = qq|gltransaction_| . $form->{id};
$form->{addition} = "DELETED";
+ $form->{what_done} = "gl_transaction";
$form->save_history;
}
# /saving the history
my $debitcount = 0;
my $creditcount = 0;
my $debitcredit;
+ my %split_safety = ();
+
+ my $dbh = $form->dbconnect_noauto(\%myconfig);
+ my ($notax_id) = selectrow_query($form, $dbh, "SELECT id FROM tax WHERE taxkey = 0 LIMIT 1", );
+ $dbh->disconnect;
my @flds = qw(accno debit credit projectnumber fx_transaction source memo tax taxchart);
push @a, {};
$debitcredit = ($form->{"debit_$i"} == 0) ? "0" : "1";
+ $split_safety{ $form->{"debit_$i"} <=> 0 }++;
+ $split_safety{ - $form->{"credit_$i"} <=> 0 }++;
+
if ($debitcredit) {
$debitcount++;
} else {
$form->{debitlock} = 1;
}
if ($debitcredit && $credittax) {
- $form->{"taxchart_$i"} = "0--0.00";
+ $form->{"taxchart_$i"} = "$notax_id--0.00";
}
if (!$debitcredit && $debittax) {
- $form->{"taxchart_$i"} = "0--0.00";
+ $form->{"taxchart_$i"} = "$notax_id--0.00";
}
my $amount = ($form->{"debit_$i"} == 0)
? $form->{"credit_$i"}
: $form->{"debit_$i"};
my $j = $#a;
if (($debitcredit && $credittax) || (!$debitcredit && $debittax)) {
- $form->{"taxchart_$i"} = "0--0.00";
+ $form->{"taxchart_$i"} = "$notax_id--0.00";
$form->{"tax_$i"} = 0;
}
my ($taxkey, $rate) = split(/--/, $form->{"taxchart_$i"});
} else {
$credittax = 1;
}
- if ($form->{taxincluded}) {
- $form->{"tax_$i"} = $amount / ($rate + 1) * $rate;
- if ($debitcredit) {
- $form->{"debit_$i"} = $form->{"debit_$i"} - $form->{"tax_$i"};
- } else {
- $form->{"credit_$i"} = $form->{"credit_$i"} - $form->{"tax_$i"};
- }
+
+ my ($tmpnetamount,$tmpdiff);
+ ($tmpnetamount,$form->{"tax_$i"},$tmpdiff) = $form->calculate_tax($amount,$rate,$form->{taxincluded} *= 1,2);
+ if ($debitcredit) {
+ $form->{"debit_$i"} = $tmpnetamount;
} else {
- $form->{"tax_$i"} = $amount * $rate;
+ $form->{"credit_$i"} = $tmpnetamount;
}
+
} else {
$form->{"tax_$i"} = 0;
}
$count++;
}
+ if ($split_safety{-1} > 1 && $split_safety{1} > 1) {
+ $::form->error($::locale->text("Split entry detected. The values you have entered will result in an entry with more than one position on both debit and credit. " .
+ "Due to known problems involving accounting software kivitendo does not allow these."));
+ }
+
for my $i (1 .. $count) {
my $j = $i - 1;
for (@flds) { $form->{"${_}_$i"} = $a[$j]->{$_} }
$form->{taxincluded} = 0 if !$taxtotal;
# this is just for the wise guys
+
+ $form->error($locale->text('Cannot post transaction above the maximum future booking date!'))
+ if ($form->date_max_future($form->{"transdate"}, \%myconfig));
$form->error($locale->text('Cannot post transaction for a closed period!'))
if ($form->date_closed($form->{"transdate"}, \%myconfig));
if ($form->round_amount($debit, 2) != $form->round_amount($credit, 2)) {
undef($form->{callback});
# saving the history
if(!exists $form->{addition} && $form->{id} ne "") {
- $form->{snumbers} = qq|ordnumber_| . $form->{ordnumber};
- $form->{addition} = "SAVED";
- $form->{what_done} = $locale->text("Buchungsnummer") . " = " . $form->{id};
+ $form->{snumbers} = qq|gltransaction_| . $form->{id};
+ $form->{addition} = "POSTED";
+ $form->{what_done} = "gl transaction";
$form->save_history;
}
# /saving the history
# saving the history
if(!exists $form->{addition} && $form->{id} ne "") {
- $form->{snumbers} = "ordnumber_$form->{ordnumber}";
+ $form->{snumbers} = qq|gltransaction_| . $form->{id};
$form->{addition} = "STORNO";
+ $form->{what_done} = "gl_transaction";
$form->save_history;
}
# /saving the history
call_sub($main::form->{nextsub});
}
+sub get_tax_dropdown {
+ $main::lxdebug->enter_sub();
+
+ 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");
+
+ $main::lxdebug->leave_sub();
+
+}
+
1;