X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=bin%2Fmozilla%2Fgl.pl;h=731f525767357c38d45bc2bfd75dec6041c71dd6;hb=fe73e0d261229f181e8133283b530509773d2151;hp=43f5447cc60b89eaa09382e33356ea8e6704cd9b;hpb=dc7f3c9afe98b033d29c645cd9d9ced238663fbc;p=kivitendo-erp.git diff --git a/bin/mozilla/gl.pl b/bin/mozilla/gl.pl index 43f5447cc..731f52576 100644 --- a/bin/mozilla/gl.pl +++ b/bin/mozilla/gl.pl @@ -31,16 +31,20 @@ # #====================================================================== +use POSIX qw(strftime); +use List::Util qw(sum); + +use SL::FU; use SL::GL; use SL::IS; use SL::PE; +use SL::ReportGenerator; -require "bin/mozilla/arap.pl"; require "bin/mozilla/common.pl"; +require "bin/mozilla/drafts.pl"; +require "bin/mozilla/reportgenerator.pl"; -1; - -# end of main +use strict; # this is for our long dates # $locale->text('January') @@ -70,16 +74,26 @@ require "bin/mozilla/common.pl"; # $locale->text('Nov') # $locale->text('Dec') +my $tax; +my $debitlock = 0; +my $creditlock = 0; + sub add { - $lxdebug->enter_sub(); + $main::lxdebug->enter_sub(); + + $main::auth->assert('general_ledger'); + + my $form = $main::form; + my %myconfig = %main::myconfig; + + return $main::lxdebug->leave_sub() if (load_draft_maybe()); $form->{title} = "Add"; - $form->{callback} = - "$form->{script}?action=add&login=$form->{login}&password=$form->{password}" - unless $form->{callback}; + $form->{callback} = "gl.pl?action=add" unless $form->{callback}; # we use this only to set a default date + # yep. aber er holt hier auch schon ALL_CHARTS. Aufwand / Nutzen? jb GL->transaction(\%myconfig, \%$form); map { @@ -105,13 +119,20 @@ sub add { } (@{ $form->{all_departments} }); } + $form->{show_details} = $myconfig{show_form_details} unless defined $form->{show_details}; + &display_form(1); - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub prepare_transaction { - $lxdebug->enter_sub(); + $main::lxdebug->enter_sub(); + + $main::auth->assert('general_ledger'); + + my $form = $main::form; + my %myconfig = %main::myconfig; GL->transaction(\%myconfig, \%$form); @@ -137,8 +158,8 @@ sub prepare_transaction { my $i = 1; my $tax = 0; my $taxaccno = ""; - foreach $ref (@{ $form->{GL} }) { - $j = $i - 1; + foreach my $ref (@{ $form->{GL} }) { + my $j = $i - 1; if ($tax && ($ref->{accno} eq $taxaccno)) { $form->{"tax_$j"} = abs($ref->{amount}); $form->{"taxchart_$j"} = $ref->{id} . "--" . $ref->{taxrate}; @@ -179,28 +200,42 @@ sub prepare_transaction { ($form->datetonum($form->{transdate}, \%myconfig) <= $form->datetonum($form->{closedto}, \%myconfig)); - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub edit { - $lxdebug->enter_sub(); + $main::lxdebug->enter_sub(); + + $main::auth->assert('general_ledger'); + + my $form = $main::form; + my %myconfig = %main::myconfig; prepare_transaction(); $form->{title} = "Edit"; + $form->{show_details} = $myconfig{show_form_details} unless defined $form->{show_details}; + form_header(); display_rows(); form_footer(); - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub search { - $lxdebug->enter_sub(); + $main::lxdebug->enter_sub(); + + $main::auth->assert('general_ledger'); - $form->{title} = $locale->text('Buchungsjournal'); + 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); @@ -214,7 +249,7 @@ sub search { } (@{ $form->{all_departments} }); } - $department = qq| + my $department = qq| | . $locale->text('Department') . qq| @@ -237,15 +272,16 @@ sub search { '-labels' => \%project_labels)); # use JavaScript Calendar or not - $form->{jsscript} = $jscalendar; - $jsscript = ""; + $form->{jsscript} = 1; + my $jsscript = ""; + my ($button1, $button2, $onload); if ($form->{jsscript}) { # with JavaScript Calendar $button1 = qq| text('button') . qq|> + . $locale->text('button') . qq|> |; $button2 = qq| @@ -273,7 +309,7 @@ sub search { print qq| -
{script}> + @@ -374,9 +410,6 @@ $jsscript -{login}> -{password}> -
@@ -385,551 +418,269 @@ $jsscript |; - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } -sub generate_report { - $lxdebug->enter_sub(); +sub create_subtotal_row { + $main::lxdebug->enter_sub(); - $form->{sort} = "transdate" unless $form->{sort}; - - GL->all_transactions(\%myconfig, \%$form); + my ($totals, $columns, $column_alignment, $subtotal_columns, $class) = @_; - $callback = - "$form->{script}?action=generate_report&login=$form->{login}&password=$form->{password}"; + my $form = $main::form; + my %myconfig = %main::myconfig; - $href = $callback; + my $row = { map { $_ => { 'data' => '', 'class' => $class, 'align' => $column_alignment->{$_}, } } @{ $columns } }; - %acctype = ('A' => $locale->text('Asset'), - 'C' => $locale->text('Contra'), - 'L' => $locale->text('Liability'), - 'Q' => $locale->text('Equity'), - 'I' => $locale->text('Revenue'), - 'E' => $locale->text('Expense'),); + map { $row->{$_}->{data} = $form->format_amount(\%myconfig, $totals->{$_}, 2) } @{ $subtotal_columns }; - $form->{title} = $locale->text('General Ledger'); + map { $totals->{$_} = 0 } @{ $subtotal_columns }; - $ml = ($form->{ml} =~ /(A|E|Q)/) ? -1 : 1; + $main::lxdebug->leave_sub(); - unless ($form->{category} eq 'X') { - $form->{title} .= " : " . $locale->text($acctype{ $form->{category} }); - } - if ($form->{accno}) { - $href .= "&accno=" . $form->escape($form->{accno}); - $callback .= "&accno=" . $form->escape($form->{accno}, 1); - $option = - $locale->text('Account') - . " : $form->{accno} $form->{account_description}"; - } - if ($form->{source}) { - $href .= "&source=" . $form->escape($form->{source}); - $callback .= "&source=" . $form->escape($form->{source}, 1); - $option .= "\n
" if $option; - $option .= $locale->text('Source') . " : $form->{source}"; - } - if ($form->{reference}) { - $href .= "&reference=" . $form->escape($form->{reference}); - $callback .= "&reference=" . $form->escape($form->{reference}, 1); - $option .= "\n
" if $option; - $option .= $locale->text('Reference') . " : $form->{reference}"; - } - if ($form->{department}) { - $href .= "&department=" . $form->escape($form->{department}); - $callback .= "&department=" . $form->escape($form->{department}, 1); - ($department) = split /--/, $form->{department}; - $option .= "\n
" if $option; - $option .= $locale->text('Department') . " : $department"; - } + return $row; +} - if ($form->{description}) { - $href .= "&description=" . $form->escape($form->{description}); - $callback .= "&description=" . $form->escape($form->{description}, 1); - $option .= "\n
" if $option; - $option .= $locale->text('Description') . " : $form->{description}"; - } - if ($form->{notes}) { - $href .= "¬es=" . $form->escape($form->{notes}); - $callback .= "¬es=" . $form->escape($form->{notes}, 1); - $option .= "\n
" if $option; - $option .= $locale->text('Notes') . " : $form->{notes}"; - } - if ($form->{project_id}) { - $href .= "&project_id=" . $form->escape($form->{project_id}); - $callback .= "&project_id=" . $form->escape($form->{project_id}); - } +sub generate_report { + $main::lxdebug->enter_sub(); - if ($form->{datefrom}) { - $href .= "&datefrom=$form->{datefrom}"; - $callback .= "&datefrom=$form->{datefrom}"; - $option .= "\n
" if $option; - $option .= - $locale->text('From') . " " - . $locale->date(\%myconfig, $form->{datefrom}, 1); - } - if ($form->{dateto}) { - $href .= "&dateto=$form->{dateto}"; - $callback .= "&dateto=$form->{dateto}"; - if ($form->{datefrom}) { - $option .= " "; - } else { - $option .= "\n
" if $option; - } - $option .= - $locale->text('Bis') . " " - . $locale->date(\%myconfig, $form->{dateto}, 1); - } + $main::auth->assert('general_ledger'); - @columns = $form->sort_columns( qw( - transdate id reference description - notes source debit debit_accno - credit credit_accno debit_tax debit_tax_accno - credit_tax credit_tax_accno accno - projectnumbers - ) - ); + my $form = $main::form; + my %myconfig = %main::myconfig; + my $locale = $main::locale; - if ($form->{accno}) { - @columns = grep !/accno/, @columns; - push @columns, "balance"; - $form->{l_balance} = "Y"; + report_generator_set_default_sort('transdate', 1); - } + GL->all_transactions(\%myconfig, \%$form); - $form->{l_credit_accno} = "Y"; - $form->{l_debit_accno} = "Y"; - $form->{l_credit_tax} = "Y"; - $form->{l_debit_tax} = "Y"; - $form->{l_credit_tax_accno} = "Y"; - $form->{l_debit_tax_accno} = "Y"; - $form->{l_accno} = "N"; - foreach $item (@columns) { - if ($form->{"l_$item"} eq "Y") { - push @column_index, $item; - - # add column to href and callback - $callback .= "&l_$item=Y"; - $href .= "&l_$item=Y"; - } - } + my %acctype = ('A' => $locale->text('Asset'), + 'C' => $locale->text('Contra'), + 'L' => $locale->text('Liability'), + 'Q' => $locale->text('Equity'), + 'I' => $locale->text('Revenue'), + 'E' => $locale->text('Expense'),); - if ($form->{l_subtotal} eq 'Y') { - $callback .= "&l_subtotal=Y"; - $href .= "&l_subtotal=Y"; + $form->{title} = $locale->text('Journal'); + if ($form->{category} ne 'X') { + $form->{title} .= " : " . $locale->text($acctype{ $form->{category} }); } - $callback .= "&category=$form->{category}"; - $href .= "&category=$form->{category}"; - - $column_header{id} = - "" - . $locale->text('ID') - . ""; - $column_header{transdate} = - "" - . $locale->text('Date') - . ""; - $column_header{reference} = - "" - . $locale->text('Reference') - . ""; - $column_header{source} = - "" - . $locale->text('Source') - . ""; - $column_header{description} = - "" - . $locale->text('Description') - . ""; - $column_header{notes} = - "" . $locale->text('Notes') . ""; - $column_header{debit} = - "" . $locale->text('Debit') . ""; - $column_header{debit_accno} = - "" - . $locale->text('Debit Account') - . ""; - $column_header{credit} = - "" . $locale->text('Credit') . ""; - $column_header{credit_accno} = - "" - . $locale->text('Credit Account') - . ""; - $column_header{debit_tax} = - "" - . $locale->text('Debit Tax') - . ""; - $column_header{debit_tax_accno} = - "" - . $locale->text('Debit Tax Account') - . ""; - $column_header{credit_tax} = - "" - . $locale->text('Credit Tax') - . ""; - $column_header{credit_tax_accno} = - "" - . $locale->text('Credit Tax Account') - . ""; - $column_header{balance} = "" . $locale->text('Balance') . ""; - $column_header{projectnumbers} = - "" . $locale->text('Project Numbers') . ""; - $form->{landscape} = 1; - $form->header; - - print qq| - + my $ml = ($form->{ml} =~ /(A|E|Q)/) ? -1 : 1; - - - - - - - - - - - - - - -
$form->{title}
$option
- - - -|; + my @columns = qw( + transdate id reference description + notes source debit debit_accno + credit credit_accno debit_tax debit_tax_accno + credit_tax credit_tax_accno projectnumbers balance + ); - map { print "$column_header{$_}\n" } @column_index; + my @hidden_variables = qw(accno source reference department description notes project_id datefrom dateto category l_subtotal); + push @hidden_variables, map { "l_${_}" } @columns; - print " - - - - -"; + my (@options, @date_options); + push @options, $locale->text('Account') . " : $form->{accno} $form->{account_description}" if ($form->{accno}); + push @options, $locale->text('Source') . " : $form->{source}" if ($form->{source}); + 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}); - # add sort to callback - $form->{callback} = "$callback&sort=$form->{sort}"; - $callback = $form->escape($form->{callback}); + push @date_options, $locale->text('From'), $locale->date(\%myconfig, $form->{datefrom}, 1) if ($form->{datefrom}); + push @date_options, $locale->text('Bis'), $locale->date(\%myconfig, $form->{dateto}, 1) if ($form->{dateto}); + push @options, join(' ', @date_options) if (scalar @date_options); - # initial item for subtotals - if (@{ $form->{GL} }) { - $sameitem = $form->{GL}->[0]->{ $form->{sort} }; + if ($form->{department}) { + my ($department) = split /--/, $form->{department}; + push @options, $locale->text('Department') . " : $department"; } - if ($form->{accno} && $form->{balance}) { - - map { $column_data{$_} = "" } @column_index; - $column_data{balance} = - ""; - $i++; - $i %= 2; - print qq| - -|; - map { print "$column_data{$_}\n" } @column_index; + my $callback = build_std_url('action=generate_report', grep { $form->{$_} } @hidden_variables); + + $form->{l_credit_accno} = 'Y'; + $form->{l_debit_accno} = 'Y'; + $form->{l_credit_tax} = 'Y'; + $form->{l_debit_tax} = 'Y'; + $form->{l_credit_tax_accno} = 'Y'; + $form->{l_debit_tax_accno} = 'Y'; + $form->{l_balance} = $form->{accno} ? 'Y' : ''; + + my %column_defs = ( + 'id' => { 'text' => $locale->text('ID'), }, + 'transdate' => { 'text' => $locale->text('Date'), }, + 'reference' => { 'text' => $locale->text('Reference'), }, + 'source' => { 'text' => $locale->text('Source'), }, + 'description' => { 'text' => $locale->text('Description'), }, + 'notes' => { 'text' => $locale->text('Notes'), }, + 'debit' => { 'text' => $locale->text('Debit'), }, + 'debit_accno' => { 'text' => $locale->text('Debit Account'), }, + 'credit' => { 'text' => $locale->text('Credit'), }, + 'credit_accno' => { 'text' => $locale->text('Credit Account'), }, + 'debit_tax' => { 'text' => $locale->text('Debit Tax'), }, + 'debit_tax_accno' => { 'text' => $locale->text('Debit Tax Account'), }, + 'credit_tax' => { 'text' => $locale->text('Credit Tax'), }, + 'credit_tax_accno' => { 'text' => $locale->text('Credit Tax Account'), }, + 'balance' => { 'text' => $locale->text('Balance'), }, + 'projectnumbers' => { 'text' => $locale->text('Project Numbers'), }, + ); - print qq| - -|; + foreach my $name (qw(id transdate reference description debit_accno credit_accno debit_tax_accno credit_tax_accno)) { + my $sortname = $name =~ m/accno/ ? 'accno' : $name; + my $sortdir = $sortname eq $form->{sort} ? 1 - $form->{sortdir} : $form->{sortdir}; + $column_defs{$name}->{link} = $callback . "&sort=$sortname&sortdir=$sortdir"; } - $form->{balance} *= $ml; - foreach $ref (@{ $form->{GL} }) { - $form->{balance} *= $ml; - - # if item ne sort print subtotal - if ($form->{l_subtotal} eq 'Y') { - if ($sameitem ne $ref->{ $form->{sort} }) { - &gl_subtotal; - } - } - #foreach $key (sort keys(%{ $ref->{amount} })) { - # $form->{balance} += $ref->{amount}{$key}; - #} + map { $column_defs{$_}->{visible} = $form->{"l_${_}"} ? 1 : 0 } @columns; + map { $column_defs{$_}->{visible} = 0 } qw(debit_accno credit_accno debit_tax_accno credit_tax_accno) if $form->{accno}; - $debit = ""; - foreach $key (sort keys(%{ $ref->{debit} })) { - $subtotaldebit += $ref->{debit}{$key}; - $totaldebit += $ref->{debit}{$key}; - if ($key == 0) { - $debit = $form->format_amount(\%myconfig, $ref->{debit}{$key}, 2, 0); - } else { - $debit .= - "
" . $form->format_amount(\%myconfig, $ref->{debit}{$key}, 2, 0); - } - $form->{balance} = abs($form->{balance}) - abs($ref->{debit}{$key}); - } + my %column_alignment; + map { $column_alignment{$_} = 'right' } qw(balance id debit credit debit_tax credit_tax balance); + map { $column_alignment{$_} = 'center' } qw(reference debit_accno credit_accno debit_tax_accno credit_tax_accno); + map { $column_alignment{$_} = 'left' } qw(description source notes); + map { $column_defs{$_}->{align} = $column_alignment{$_} } keys %column_alignment; - $credit = ""; - foreach $key (sort keys(%{ $ref->{credit} })) { - $subtotalcredit += $ref->{credit}{$key}; - $totalcredit += $ref->{credit}{$key}; - if ($key == 0) { - $credit = $form->format_amount(\%myconfig, $ref->{credit}{$key}, 2, 0); - } else { - $credit .= "
" - . $form->format_amount(\%myconfig, $ref->{credit}{$key}, 2, 0); - } - $form->{balance} = abs($form->{balance}) - abs($ref->{credit}{$key}); - } + my $report = SL::ReportGenerator->new(\%myconfig, $form); - $debittax = ""; - foreach $key (sort keys(%{ $ref->{debit_tax} })) { - $subtotaldebittax += $ref->{debit_tax}{$key}; - $totaldebittax += $ref->{debit_tax}{$key}; - if ($key == 0) { - $debittax = - $form->format_amount(\%myconfig, $ref->{debit_tax}{$key}, 2, 0); - } else { - $debittax .= "
" - . $form->format_amount(\%myconfig, $ref->{debit_tax}{$key}, 2, 0); - } - $form->{balance} = abs($form->{balance}) - abs($ref->{debit_tax}{$key}); - } + $report->set_columns(%column_defs); + $report->set_column_order(@columns); - $credittax = ""; - foreach $key (sort keys(%{ $ref->{credit_tax} })) { - $subtotalcredittax += $ref->{credit_tax}{$key}; - $totalcredittax += $ref->{credit_tax}{$key}; - if ($key == 0) { - $credittax = - $form->format_amount(\%myconfig, $ref->{credit_tax}{$key}, 2, 0); - } else { - $credittax .= "
" - . $form->format_amount(\%myconfig, $ref->{credit_tax}{$key}, 2, 0); - } - $form->{balance} = abs($form->{balance}) - abs($ref->{credit_tax}{$key}); - } + $report->set_export_options('generate_report', @hidden_variables, qw(sort sortdir)); - $debitaccno = ""; - $debittaxkey = ""; - $taxaccno = ""; - foreach $key (sort keys(%{ $ref->{debit_accno} })) { - if ($key == 0) { - $debitaccno = - "{debit_accno}{$key}&callback=$callback>$ref->{debit_accno}{$key}"; - } else { - $debitaccno .= - "
{debit_accno}{$key}&callback=$callback>$ref->{debit_accno}{$key}"; - } + $report->set_sort_indicator($form->{sort} eq 'accno' ? 'debit_accno' : $form->{sort}, $form->{sortdir}); - # if ($ref->{debit_taxkey}{$key} eq $debittaxkey) { - # $ref->{debit_tax_accno}{$key} = $taxaccno; - # } - $taxaccno = $ref->{debit_tax_accno}{$key}; - $debittaxkey = $ref->{debit_taxkey}{$key}; - } + $report->set_options('top_info_text' => join("\n", @options), + 'output_format' => 'HTML', + 'title' => $form->{title}, + 'attachment_basename' => $locale->text('general_ledger_list') . strftime('_%Y%m%d', localtime time), + ); + $report->set_options_from_form(); - $creditaccno = ""; - $credittaxkey = ""; - $taxaccno = ""; - foreach $key (sort keys(%{ $ref->{credit_accno} })) { - if ($key == 0) { - $creditaccno = - "{credit_accno}{$key}&callback=$callback>$ref->{credit_accno}{$key}"; - } else { - $creditaccno .= - "
{credit_accno}{$key}&callback=$callback>$ref->{credit_accno}{$key}"; - } + # add sort to callback + $form->{callback} = "$callback&sort=" . E($form->{sort}) . "&sortdir=" . E($form->{sortdir}); - # if ($ref->{credit_taxkey}{$key} eq $credittaxkey) { - # $ref->{credit_tax_accno}{$key} = $taxaccno; - # } - $taxaccno = $ref->{credit_tax_accno}{$key}; - $credittaxkey = $ref->{credit_taxkey}{$key}; - } - $debittaxaccno = ""; - foreach $key (sort keys(%{ $ref->{debit_tax_accno} })) { - if ($key == 0) { - $debittaxaccno = - "{debit_tax_accno}{$key}&callback=$callback>$ref->{debit_tax_accno}{$key}"; - } else { - $debittaxaccno .= - "
{debit_tax_accno}{$key}&callback=$callback>$ref->{debit_tax_accno}{$key}"; - } - } + my @totals_columns = qw(debit credit debit_tax credit_tax); + my %subtotals = map { $_ => 0 } @totals_columns; + my %totals = map { $_ => 0 } @totals_columns; + my $idx = 0; - $credittaxaccno = ""; - foreach $key (sort keys(%{ $ref->{credit_tax_accno} })) { - if ($key == 0) { - $credittaxaccno = - "{credit_tax_accno}{$key}&callback=$callback>$ref->{credit_tax_accno}{$key}"; - } else { - $credittaxaccno .= - "
{credit_tax_accno}{$key}&callback=$callback>$ref->{credit_tax_accno}{$key}"; + foreach my $ref (@{ $form->{GL} }) { + + my %rows; + + foreach my $key (qw(debit credit debit_tax credit_tax)) { + $rows{$key} = []; + foreach my $idx (sort keys(%{ $ref->{$key} })) { + my $value = $ref->{$key}->{$idx}; + $subtotals{$key} += $value; + $totals{$key} += $value; + if ($key =~ /debit.*/) { + $ml = -1; + } else { + $ml = 1; + } + $form->{balance} = $form->{balance} + $value * $ml; + push @{ $rows{$key} }, $form->format_amount(\%myconfig, $value, 2); } } - $transdate = ""; - foreach $key (sort keys(%{ $ref->{ac_transdate} })) { - if ($key == 0) { - $transdate = "$ref->{ac_transdate}{$key}"; - } else { - $transdate .= "
$ref->{ac_transdate}{$key}"; - } + foreach my $key (qw(debit_accno credit_accno debit_tax_accno credit_tax_accno ac_transdate source)) { + my $col = $key eq 'ac_transdate' ? 'transdate' : $key; + $rows{$col} = [ map { $ref->{$key}->{$_} } sort keys(%{ $ref->{$key} }) ]; } - # $ref->{debit} = $form->format_amount(\%myconfig, $ref->{debit}, 2, " "); - # $ref->{credit} = $form->format_amount(\%myconfig, $ref->{credit}, 2, " "); - - $column_data{id} = ""; - $column_data{transdate} = ""; - $column_data{reference} = - ""; - $column_data{description} = ""; - $column_data{source} = ""; - $column_data{notes} = ""; - $column_data{debit} = ""; - $column_data{debit_accno} = ""; - $column_data{credit} = ""; - $column_data{credit_accno} = ""; - $column_data{debit_tax} = - ($ref->{debit_tax_accno} ne "") - ? "" - : ""; - $column_data{debit_tax_accno} = ""; - $column_data{credit_tax} = - ($ref->{credit_tax_accno} ne "") - ? "" - : ""; - $column_data{credit_tax_accno} = ""; - $column_data{balance} = - ""; - $column_data{projectnumbers} = - ""; - - $i++; - $i %= 2; - print " - "; - map { print "$column_data{$_}\n" } @column_index; - print ""; + my $row = { }; + map { $row->{$_} = { 'data' => '', 'align' => $column_alignment{$_} } } @columns; - } + my $sh = ""; + if ($form->{balance} < 0) { + $sh = " S"; + $ml = -1; + } elsif ($form->{balance} > 0) { + $sh = " H"; + $ml = 1; + } + my $data = $form->format_amount(\%myconfig, ($form->{balance} * $ml), 2); + $data .= $sh; - &gl_subtotal if ($form->{l_subtotal} eq 'Y'); - - map { $column_data{$_} = "" } @column_index; - - my $balanced_ledger = $totaldebit - + $totaldebittax - - $totalcredit - - $totalcredittax; - # = 0 for balanced ledger - - $column_data{debit} = - ""; - $column_data{credit} = - ""; - $column_data{debit_tax} = - ""; - $column_data{credit_tax} = - ""; - $column_data{balance} = - ""; + $row->{balance}->{data} = $data; + $row->{projectnumbers}->{data} = join ", ", sort { lc($a) cmp lc($b) } keys %{ $ref->{projectnumbers} }; - print qq| - -|; + map { $row->{$_}->{data} = $ref->{$_} } qw(id reference description notes); - map { print "$column_data{$_}\n" } @column_index; + map { $row->{$_}->{data} = \@{ $rows{$_} }; } qw(transdate debit credit debit_accno credit_accno debit_tax_accno credit_tax_accno source); - print qq| - - |; + foreach my $col (qw(debit_accno credit_accno debit_tax_accno credit_tax_accno)) { + $row->{$col}->{link} = [ map { "${callback}&accno=" . E($_) } @{ $rows{$col} } ]; + } + map { $row->{$_}->{data} = \@{ $rows{$_} } if ($ref->{"${_}_accno"} ne "") } qw(debit_tax credit_tax); - if ( abs($balanced_ledger) > 0.001 ) { + $row->{reference}->{link} = build_std_url("script=$ref->{module}.pl", 'action=edit', 'id=' . E($ref->{id}), 'callback'); - print qq| - - -
 " - . $form->format_amount(\%myconfig, $form->{balance} * $ml, 2, 0) - . "
 $ref->{id} $transdate{module}.pl?action=edit&id=$ref->{id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{reference}$ref->{description} $ref->{source} $ref->{notes} $debit$debitaccno$credit$creditaccno$debittax$debittaxaccno$credittax$credittaxaccno" - . $form->format_amount(\%myconfig, $form->{balance}, 2, 0) . "" . join(", ", sort({ lc($a) cmp lc($b) } keys(%{ $ref->{projectnumbers} }))) . "
 " - . $form->format_amount(\%myconfig, $totaldebit, 2, " ") . "" - . $form->format_amount(\%myconfig, $totalcredit, 2, " ") . "" - . $form->format_amount(\%myconfig, $totaldebittax, 2, " ") . "" - . $form->format_amount(\%myconfig, $totalcredittax, 2, " ") . "" - . $form->format_amount(\%myconfig, $form->{balance} * $ml, 2, 0) . "
| - . $locale->text('Unbalanced Ledger') - . ": " - . $form->format_amount(\%myconfig, $balanced_ledger, 3, " ") + my $row_set = [ $row ]; - } elsif ( abs($balanced_ledger) <= 0.001 ) { + if (($form->{l_subtotal} eq 'Y') + && (($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'); + } - print qq|| - . $locale->text('Balanced Ledger') + $report->add_data($row_set); + $idx++; } - - print qq| -
-

- -
- -{script}> + $report->add_separator(); - + # = 0 for balanced ledger + my $balanced_ledger = $totals{debit} + $totals{debit_tax} - $totals{credit} - $totals{credit_tax}; -{login}> -{password}> + my $row = create_subtotal_row(\%totals, \@columns, \%column_alignment, [ qw(debit credit debit_tax credit_tax) ], 'listtotal'); - - - - - - -
- - - -|; - $lxdebug->leave_sub(); + my $sh = ""; + if ($form->{balance} < 0) { + $sh = " S"; + $ml = -1; + } elsif ($form->{balance} > 0) { + $sh = " H"; + $ml = 1; + } + my $data = $form->format_amount(\%myconfig, ($form->{balance} * $ml), 2); + $data .= $sh; -} + $row->{balance}->{data} = $data; -sub gl_subtotal { - $lxdebug->enter_sub(); + $report->add_data($row); - $subtotaldebit = - $form->format_amount(\%myconfig, $subtotaldebit, 2, " "); - $subtotalcredit = - $form->format_amount(\%myconfig, $subtotalcredit, 2, " "); + my $raw_bottom_info_text; - map { $column_data{$_} = " " } - qw(transdate id reference source description accno); - $column_data{debit} = "$subtotaldebit"; - $column_data{credit} = "$subtotalcredit"; + if (!$form->{accno} && (abs($balanced_ledger) > 0.001)) { + $raw_bottom_info_text .= + '

' + . $locale->text('Unbalanced Ledger') + . ': ' + . $form->format_amount(\%myconfig, $balanced_ledger, 3) + . '

'; + } - print ""; - map { print "$column_data{$_}\n" } @column_index; - print ""; + $raw_bottom_info_text .= $form->parse_html_template('gl/generate_report_bottom'); - $subtotaldebit = 0; - $subtotalcredit = 0; + $report->set_options('raw_bottom_info_text' => $raw_bottom_info_text); - $sameitem = $ref->{ $form->{sort} }; - $lxdebug->leave_sub(); + $report->generate_with_headers(); + $main::lxdebug->leave_sub(); } sub update { - $lxdebug->enter_sub(); + $main::lxdebug->enter_sub(); + + $main::auth->assert('general_ledger'); + + my $form = $main::form; + my %myconfig = %main::myconfig; $form->{oldtransdate} = $form->{transdate}; @@ -939,8 +690,7 @@ sub update { my $credittax = 0; my $debitcount = 0; my $creditcount = 0; - $debitlock = 0; - $creditlock = 0; + my ($debitcredit, $amount); my @flds = qw(accno debit credit projectnumber fx_transaction source memo tax taxchart); @@ -989,27 +739,25 @@ sub update { ($form->{"debit_$i"} == 0) ? $form->{"credit_$i"} : $form->{"debit_$i"}; - $j = $#a; + my $j = $#a; if (($debitcredit && $credittax) || (!$debitcredit && $debittax)) { $form->{"taxchart_$i"} = "0--0.00"; $form->{"tax_$i"} = 0; } - if (!$form->{"korrektur_$i"}) { - ($taxkey, $rate) = split(/--/, $form->{"taxchart_$i"}); - if ($taxkey > 1) { - if ($debitcredit) { - $debittax = 1; - } else { - $credittax = 1; - } - if ($form->{taxincluded}) { - $form->{"tax_$i"} = $amount / ($rate + 1) * $rate; - } else { - $form->{"tax_$i"} = $amount * $rate; - } + my ($taxkey, $rate) = split(/--/, $form->{"taxchart_$i"}); + if ($taxkey > 1) { + if ($debitcredit) { + $debittax = 1; + } else { + $credittax = 1; + } + if ($form->{taxincluded}) { + $form->{"tax_$i"} = $amount / ($rate + 1) * $rate; } else { - $form->{"tax_$i"} = 0; + $form->{"tax_$i"} = $amount * $rate; } + } else { + $form->{"tax_$i"} = 0; } for (@flds) { $a[$j]->{$_} = $form->{"${_}_$i"} } @@ -1017,25 +765,30 @@ sub update { } } - for $i (1 .. $count) { - $j = $i - 1; + for my $i (1 .. $count) { + my $j = $i - 1; for (@flds) { $form->{"${_}_$i"} = $a[$j]->{$_} } } - for $i ($count + 1 .. $form->{rowcount}) { + for my $i ($count + 1 .. $form->{rowcount}) { for (@flds) { delete $form->{"${_}_$i"} } } $form->{rowcount} = $count + 1; &display_form; - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub display_form { my ($init) = @_; - $lxdebug->enter_sub(); + $main::lxdebug->enter_sub(); + + $main::auth->assert('general_ledger'); + + my $form = $main::form; + my %myconfig = %main::myconfig; &form_header($init); @@ -1047,27 +800,23 @@ sub display_form { # } &display_rows($init); &form_footer; - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub display_rows { my ($init) = @_; - $lxdebug->enter_sub(); + $main::lxdebug->enter_sub(); - $form->{totaldebit} = 0; - $form->{totalcredit} = 0; + $main::auth->assert('general_ledger'); - my @old_project_ids = (); - map({ push(@old_project_ids, $form->{"project_id_$_"}) - if ($form->{"project_id_$_"}); } (1..$form->{"rowcount"})); + my $form = $main::form; + my %myconfig = %main::myconfig; + my $cgi = $main::cgi; - $form->get_lists("projects" => { "key" => "ALL_PROJECTS", - "all" => 0, - "old_id" => \@old_project_ids }, - "charts" => { "key" => "ALL_CHARTS", - "transdate" => $form->{transdate} }, - "taxcharts" => "ALL_TAXCHARTS"); + $form->{debit_1} = 0 if !$form->{"debit_1"}; + $form->{totaldebit} = 0; + $form->{totalcredit} = 0; my %project_labels = (); my @project_values = (""); @@ -1081,10 +830,13 @@ sub display_rows { my %charts = (); my $taxchart_init; foreach my $item (@{ $form->{ALL_CHARTS} }) { - my $key = Q($item->{accno}) . "--" . Q($item->{tax_id}); - $taxchart_init = $item->{taxkey_id} unless (@chart_values); + if ($item->{charttype} eq 'H'){ #falls überschrift + next; #überspringen (Bug 1150) + } + my $key = $item->{accno} . "--" . $item->{tax_id}; + $taxchart_init = $item->{tax_id} unless (@chart_values); push(@chart_values, $key); - $chart_labels{$key} = H($item->{accno}) . "--" . H($item->{description}); + $chart_labels{$key} = $item->{accno} . "--" . $item->{description}; $charts{$item->{accno}} = $item; } @@ -1092,20 +844,26 @@ sub display_rows { my @taxchart_values = (); my %taxcharts = (); foreach my $item (@{ $form->{ALL_TAXCHARTS} }) { - my $key = Q($item->{id}) . "--" . Q($item->{rate}); - $taxchart_init = $key if ($taxchart_init eq $item->{taxkey}); + my $key = $item->{id} . "--" . $item->{rate}; + $taxchart_init = $key if ($taxchart_init == $item->{id}); push(@taxchart_values, $key); - $taxchart_labels{$key} = H($item->{taxdescription}) . " " . - H($item->{rate} * 100) . ' %'; + $taxchart_labels{$key} = $item->{taxdescription} . " " . $item->{rate} * 100 . ' %'; $taxcharts{$item->{id}} = $item; } - for $i (1 .. $form->{rowcount}) { - - $source = qq| - |; - $memo = qq| - |; + my ($source, $memo, $source_hidden, $memo_hidden); + for my $i (1 .. $form->{rowcount}) { + if ($form->{show_details}) { + $source = qq| + |; + $memo = qq| + |; + } else { + $source_hidden = qq| + |; + $memo_hidden = qq| + |; + } my $selected_accno_full; my ($accno_row) = split(/--/, $form->{"accno_$i"}); @@ -1123,13 +881,13 @@ sub display_rows { $selected_taxchart = "$item->{id}--$item->{rate}"; } - $selected_accno = '' if ($init); - $selected_taxchart = $taxchart_init unless ($selected_taxchart ne ""); + $selected_accno = '' if ($init); + $selected_taxchart ||= $taxchart_init; - $accno = qq|| . + my $accno = qq|| . NTI($cgi->popup_menu('-name' => "accno_$i", '-id' => "accno_$i", - '-onChange' => "setTaxkey(this, $i)", + '-onChange' => "setTaxkey($i)", '-style' => 'width:200px', '-values' => \@chart_values, '-labels' => \%chart_labels, @@ -1146,9 +904,8 @@ sub display_rows { '-default' => $selected_taxchart)) . qq||; + my ($fx_transaction, $checked); if ($init) { - $korrektur = - qq||; if ($form->{transfer}) { $fx_transaction = qq| @@ -1178,19 +935,14 @@ sub display_rows { if ($i < $form->{rowcount}) { if ($form->{transfer}) { $checked = ($form->{"fx_transaction_$i"}) ? "1" : ""; - $x = ($checked) ? "x" : ""; + my $x = ($checked) ? "x" : ""; $fx_transaction = qq| $x |; } - $checked = ($form->{"korrektur_$i"}) ? "checked" : ""; - $korrektur = - qq||; $form->hide_form("accno_$i"); } else { - $korrektur = - qq||; if ($form->{transfer}) { $fx_transaction = qq| @@ -1214,43 +966,79 @@ sub display_rows { '-labels' => \%project_labels, '-default' => $form->{"project_id_$i"} )); + my $copy2credit = 'onkeyup="copy_debit_to_credit()"' if $i == 1; + print qq| $accno +   $fx_transaction - + - - $korrektur - $tax + $form->{"tax_$i"} + $tax|; + + if ($form->{show_details}) { + print qq| $source $memo $projectnumber +|; + } + print qq| + $source_hidden + $memo_hidden - - |; +|; } $form->hide_form(qw(rowcount selectaccno)); - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub form_header { my ($init) = @_; - $lxdebug->enter_sub(); - $title = $form->{title}; + $main::lxdebug->enter_sub(); + + $main::auth->assert('general_ledger'); + + my $form = $main::form; + my %myconfig = %main::myconfig; + my $locale = $main::locale; + + my @old_project_ids = (); + map({ push(@old_project_ids, $form->{"project_id_$_"}) + if ($form->{"project_id_$_"}); } (1..$form->{"rowcount"})); + + $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}); + + my $title = $form->{title}; $form->{title} = $locale->text("$title General Ledger Transaction"); - $readonly = ($form->{id}) ? "readonly" : ""; + 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}; # $locale->text('Add General Ledger Transaction') # $locale->text('Edit General Ledger Transaction') map { $form->{$_} =~ s/\"/"/g } qw(reference description chart taxchart); + $form->{javascript} = qq||; + + + +|; $form->{selectdepartment} =~ s/ selected//; $form->{selectdepartment} =~ s/option>\Q$form->{department}\E/option selected>$form->{department}/; - if (($rows = $form->numtextrows($form->{description}, 50)) > 1) { + my $description; + if ((my $rows = $form->numtextrows($form->{description}, 50)) > 1) { $description = qq||; } else { @@ -1280,12 +1077,13 @@ sub form_header { qq||; } - $taxincluded = ($form->{taxincluded}) ? "checked" : ""; + my $taxincluded = ($form->{taxincluded}) ? "checked" : ""; if ($init) { $taxincluded = "checked"; } + my $department; $department = qq| | . $locale->text('Department') . qq| @@ -1300,15 +1098,16 @@ sub form_header { } # use JavaScript Calendar or not - $form->{jsscript} = $jscalendar; - $jsscript = ""; + $form->{jsscript} = 1; + my $jsscript = ""; + my ($button1, $button2); if ($form->{jsscript}) { # with JavaScript Calendar $button1 = qq| text('button') . qq|> + . $locale->text('button') . qq|> |; #write Trigger @@ -1321,19 +1120,30 @@ sub form_header { qq||; } + $form->{previous_id} ||= "--"; + $form->{previous_gldate} ||= "--"; + + $jsscript .= $form->parse_html_template('gl/form_header_chart_balances_js'); + $form->header; print qq| - + + + -
{script}> + |; - $form->hide_form(qw(id closedto locked storno storno_id)); + $form->hide_form(qw(id closedto locked storno storno_id previous_id previous_gldate)); print qq| + + + + @@ -1343,6 +1153,14 @@ sub form_header {
+ + + @@ -1370,7 +1188,7 @@ sub form_header { |; } - print qq| + print qq| $department|; if ($form->{id}) { print qq| @@ -1409,6 +1227,22 @@ sub form_header { |; } + + print qq| + + + + + + |; + print qq| + - - + . $locale->text('Taxkey') . qq||; + + if ($form->{show_details}) { + print qq| + - + +|; + } + + print qq| $jsscript |; - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub form_footer { - $lxdebug->enter_sub(); - ($dec) = ($form->{totaldebit} =~ /\.(\d+)/); + $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; + + 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|

| . $locale->text("There are #1 unfinished follow-ups of which #2 are due.", scalar @{ $follow_ups }, $num_due) . qq|

|; + } + } + + my ($dec) = ($form->{totaldebit} =~ /\.(\d+)/); $dec = length $dec; - $decimalplaces = ($dec > 2) ? $dec : 2; - $radieren = ($form->current_date(\%myconfig) eq $form->{gldate}) ? 1 : 0; + 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, " ") + $form->{$_} = $form->format_amount(\%myconfig, $form->{$_}, 2, " ") } qw(totaldebit totalcredit); print qq| - - - + +
| + . $locale->text("Previous transnumber text") + . " $form->{previous_id} " + . $locale->text("Previous transdate text") + . " $form->{previous_gldate}" + . qq|
| . $locale->text('Reference') . qq|
+ + +
+ | . $locale->text('OB Transaction') . qq| + + | . $locale->text('CB Transaction') . qq| +
| . $locale->text('Show details') . qq|
@@ -1416,6 +1250,7 @@ sub form_header {
| . $locale->text('Account') . qq|| . $locale->text('Chart balance') . qq| | . $locale->text('Debit') . qq| | @@ -1423,39 +1258,58 @@ sub form_header { | . $locale->text('Tax') . qq| | - . $locale->text('Korrektur') . qq|| - . $locale->text('Taxkey') . qq|| - . $locale->text('Source') . qq|| . $locale->text('Source') . qq| | . $locale->text('Memo') . qq|| - . $locale->text('Project Number') . qq|| . $locale->text('Project Number') . qq|
$form->{totaldebit} $form->{totalcredit} $form->{totaldebit} $form->{totalcredit}
@@ -1463,45 +1317,50 @@ sub form_footer {
-{login}> -{password}> - +$follow_ups_block +
|; - $transdate = $form->datetonum($form->{transdate}, \%myconfig); - $closedto = $form->datetonum($form->{closedto}, \%myconfig); + my $transdate = $form->datetonum($form->{transdate}, \%myconfig); + my $closedto = $form->datetonum($form->{closedto}, \%myconfig); if ($form->{id}) { if (!$form->{storno}) { - print qq||; + print qq||; } # Löschen und Ändern von Buchungen nicht mehr möglich (GoB) nur am selben Tag möglich - if (!$form->{locked} && $radieren) { print qq| - - |; + + |; } - # if ($transdate > $closedto) { - # print qq| - # |; - # } + print qq| + + |; + } else { - if ($transdate > $closedto) { - print qq| - |; + if ($form->{draft_id}) { + my $remove_draft_checked = 'checked' if ($form->{remove_draft}); + print qq|

\n| + . qq| | + . qq| \n| + . qq|

\n|; } + + print 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 " @@ -1510,26 +1369,30 @@ sub form_footer { "; - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub delete { - $lxdebug->enter_sub(); + $main::lxdebug->enter_sub(); + + my $form = $main::form; + my $locale = $main::locale; $form->header; print qq| -{script}> + |; map { $form->{$_} =~ s/\"/"/g } qw(reference description); delete $form->{header}; - foreach $key (keys %$form) { + foreach my $key (keys %$form) { + next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key})); print qq|\n|; } @@ -1544,12 +1407,17 @@ sub delete { . $locale->text('Yes') . qq|">
|; - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub yes { - $lxdebug->enter_sub(); + $main::lxdebug->enter_sub(); + + my $form = $main::form; + my %myconfig = %main::myconfig; + my $locale = $main::locale; + if (GL->delete_transaction(\%myconfig, \%$form)){ # saving the history if(!exists $form->{addition} && $form->{id} ne "") { @@ -1557,24 +1425,28 @@ sub yes { $form->{addition} = "DELETED"; $form->save_history($form->dbconnect(\%myconfig)); } - # /saving the history + # /saving the history $form->redirect($locale->text('Transaction deleted!')) } $form->error($locale->text('Cannot delete transaction!')); - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } -sub post { - $lxdebug->enter_sub(); +sub post_transaction { + $main::lxdebug->enter_sub(); + + my $form = $main::form; + my %myconfig = %main::myconfig; + my $locale = $main::locale; # check if there is something in reference and date $form->isblank("reference", $locale->text('Reference missing!')); $form->isblank("transdate", $locale->text('Transaction Date missing!')); $form->isblank("description", $locale->text('Description missing!')); - $transdate = $form->datetonum($form->{transdate}, \%myconfig); - $closedto = $form->datetonum($form->{closedto}, \%myconfig); + my $transdate = $form->datetonum($form->{transdate}, \%myconfig); + my $closedto = $form->datetonum($form->{closedto}, \%myconfig); my @a = (); my $count = 0; @@ -1582,149 +1454,121 @@ sub post { my $credittax = 0; my $debitcount = 0; my $creditcount = 0; - $creditlock = 0; - $debitlock = 0; + my $debitcredit; - my @flds = - qw(accno debit credit projectnumber fx_transaction source memo tax taxchart); + my @flds = qw(accno debit credit projectnumber fx_transaction source memo tax taxchart); for my $i (1 .. $form->{rowcount}) { + next if $form->{"debit_$i"} eq "" && $form->{"credit_$i"} eq ""; - unless (($form->{"debit_$i"} eq "") && ($form->{"credit_$i"} eq "")) { - for (qw(debit credit tax)) { - $form->{"${_}_$i"} = - $form->parse_amount(\%myconfig, $form->{"${_}_$i"}); - } + for (qw(debit credit tax)) { + $form->{"${_}_$i"} = $form->parse_amount(\%myconfig, $form->{"${_}_$i"}); + } - 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--; + $creditlock = 1; + } + if (($creditcount >= 2) && ($debitcount == 2)) { + $form->{"debit_$i"} = 0; + $form->{"tax_$i"} = 0; + $debitcount--; + $debitlock = 1; + } + if (($creditcount == 1) && ($debitcount == 2)) { + $creditlock = 1; + } + if (($creditcount == 2) && ($debitcount == 1)) { + $debitlock = 1; + } + if ($debitcredit && $credittax) { + $form->{"taxchart_$i"} = "0--0.00"; + } + if (!$debitcredit && $debittax) { + $form->{"taxchart_$i"} = "0--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->{"tax_$i"} = 0; + } + my ($taxkey, $rate) = split(/--/, $form->{"taxchart_$i"}); + if ($taxkey > 1) { if ($debitcredit) { - $debitcount++; + $debittax = 1; } else { - $creditcount++; + $credittax = 1; } - - if (($debitcount >= 2) && ($creditcount == 2)) { - $form->{"credit_$i"} = 0; - $form->{"tax_$i"} = 0; - $creditcount--; - $creditlock = 1; - } - if (($creditcount >= 2) && ($debitcount == 2)) { - $form->{"debit_$i"} = 0; - $form->{"tax_$i"} = 0; - $debitcount--; - $debitlock = 1; - } - if (($creditcount == 1) && ($debitcount == 2)) { - $creditlock = 1; - } - if (($creditcount == 2) && ($debitcount == 1)) { - $debitlock = 1; - } - if ($debitcredit && $credittax) { - $form->{"taxchart_$i"} = "0--0.00"; - } - if (!$debitcredit && $debittax) { - $form->{"taxchart_$i"} = "0--0.00"; - } - $amount = - ($form->{"debit_$i"} == 0) - ? $form->{"credit_$i"} - : $form->{"debit_$i"}; - $j = $#a; - if (($debitcredit && $credittax) || (!$debitcredit && $debittax)) { - $form->{"taxchart_$i"} = "0--0.00"; - $form->{"tax_$i"} = 0; - } - if (!$form->{"korrektur_$i"}) { - ($taxkey, $rate) = split(/--/, $form->{"taxchart_$i"}); - if ($taxkey > 1) { - if ($debitcredit) { - $debittax = 1; - } 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"}; - } - } else { - $form->{"tax_$i"} = $amount * $rate; - } - } else { - $form->{"tax_$i"} = 0; - } - } elsif ($form->{taxincluded}) { + 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"}; } + } else { + $form->{"tax_$i"} = $amount * $rate; } - - for (@flds) { $a[$j]->{$_} = $form->{"${_}_$i"} } - $count++; + } else { + $form->{"tax_$i"} = 0; } + + for (@flds) { $a[$j]->{$_} = $form->{"${_}_$i"} } + $count++; } - for $i (1 .. $count) { - $j = $i - 1; + for my $i (1 .. $count) { + my $j = $i - 1; for (@flds) { $form->{"${_}_$i"} = $a[$j]->{$_} } } - for $i ($count + 1 .. $form->{rowcount}) { + for my $i ($count + 1 .. $form->{rowcount}) { for (@flds) { delete $form->{"${_}_$i"} } } - for $i (1 .. $form->{rowcount}) { - $dr = $form->{"debit_$i"}; - $cr = $form->{"credit_$i"}; + my ($debit, $credit, $taxtotal); + for my $i (1 .. $form->{rowcount}) { + my $dr = $form->{"debit_$i"}; + my $cr = $form->{"credit_$i"}; $tax = $form->{"tax_$i"}; if ($dr && $cr) { - $form->error( - $locale->text( - 'Cannot post transaction with a debit and credit entry for the same account!' - )); + $form->error($locale->text('Cannot post transaction with a debit and credit entry for the same account!')); } - if ($form->{taxincluded}) { - if ($dr) { - $debit += $dr + $tax; - } - if ($cr) { - $credit += $cr + $tax; - } - $taxtotal += $tax; - } else { - if ($dr) { - $debit += $dr + $tax; - } - if ($cr) { - $credit += $cr + $tax; - } - } - } - if (!$taxtotal) { - $form->{taxincluded} = 0; + $debit += $dr + $tax if $dr; + $credit += $cr + $tax if $cr; + $taxtotal += $tax if $form->{taxincluded} } + $form->{taxincluded} = 0 if !$taxtotal; + # this is just for the wise guys $form->error($locale->text('Cannot post transaction for a closed period!')) - if ($transdate <= $closedto); + if ($form->date_closed($form->{"transdate"}, \%myconfig)); if ($form->round_amount($debit, 2) != $form->round_amount($credit, 2)) { $form->error($locale->text('Out of balance transaction!')); } - + if ($form->round_amount($debit, 2) + $form->round_amount($credit, 2) == 0) { $form->error($locale->text('Empty transaction!')); } - - if (($errno = GL->post_transaction(\%myconfig, \%$form)) <= -1) { + + if ((my $errno = GL->post_transaction(\%myconfig, \%$form)) <= -1) { $errno *= -1; + my @err; $err[1] = $locale->text('Cannot have a value in both Debit and Credit!'); $err[2] = $locale->text('Debit and credit out of balance!'); $err[3] = $locale->text('Cannot post a transaction without a value!'); @@ -1735,78 +1579,81 @@ sub post { # 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->save_history($form->dbconnect(\%myconfig)); + $form->{addition} = "SAVED"; + $form->{what_done} = $locale->text("Buchungsnummer") . " = " . $form->{id}; + $form->save_history($form->dbconnect(\%myconfig)); } - # /saving the history - $form->redirect("Buchung gespeichert. Buchungsnummer = " . $form->{id}); - $lxdebug->leave_sub(); + # /saving the history + $main::lxdebug->leave_sub(); } -sub post_as_new { - $lxdebug->enter_sub(); +sub post { + $main::lxdebug->enter_sub(); - $form->{id} = 0; - &add; - $lxdebug->leave_sub(); + $main::auth->assert('general_ledger'); -} + my $form = $main::form; + my $locale = $main::locale; -sub storno { - $lxdebug->enter_sub(); + $form->{title} = $locale->text("$form->{title} General Ledger Transaction"); + $form->{storno} = 0; - if (IS->has_storno(\%myconfig, $form, 'gl')) { - $form->{title} = $locale->text("Cancel General Ledger Transaction"); - $form->error($locale->text("Transaction has already been cancelled!")); - } + post_transaction(); - my %keep_keys = map { $_, 1 } qw(login password id stylesheet); - map { delete $form->{$_} unless $keep_keys{$_} } keys %{ $form }; + remove_draft() if $form->{remove_draft}; - prepare_transaction(); + $form->{callback} = build_std_url("action=add", "show_details"); + $form->redirect($form->{callback}); - for my $i (1 .. $form->{rowcount}) { - for (qw(debit credit tax)) { - $form->{"${_}_$i"} = - ($form->{"${_}_$i"}) - ? $form->format_amount(\%myconfig, $form->{"${_}_$i"}, 2) - : ""; - } - } + $main::lxdebug->leave_sub(); +} - $form->{storno} = 1; - $form->{storno_id} = $form->{id}; - $form->{id} = 0; +sub post_as_new { + $main::lxdebug->enter_sub(); - $form->{reference} = "Storno-" . $form->{reference}; - $form->{description} = "Storno-" . $form->{description}; + $main::auth->assert('general_ledger'); - for my $i (1 .. $form->{rowcount}) { - next if (($form->{"debit_$i"} eq "") && ($form->{"credit_$i"} eq "")); + my $form = $main::form; + + $form->{id} = 0; + &add; + $main::lxdebug->leave_sub(); - if ($form->{"debit_$i"} ne "") { - $form->{"credit_$i"} = $form->{"debit_$i"}; - $form->{"debit_$i"} = ""; +} - } else { - $form->{"debit_$i"} = $form->{"credit_$i"}; - $form->{"credit_$i"} = ""; - } +sub storno { + $main::lxdebug->enter_sub(); + + $main::auth->assert('general_ledger'); + + my $form = $main::form; + my %myconfig = %main::myconfig; + my $locale = $main::locale; + + # don't cancel cancelled transactions + if (IS->has_storno(\%myconfig, $form, 'gl')) { + $form->{title} = $locale->text("Cancel Accounts Receivables Transaction"); + $form->error($locale->text("Transaction has already been cancelled!")); } - post(); + GL->storno($form, \%myconfig, $form->{id}); # saving the history if(!exists $form->{addition} && $form->{id} ne "") { - $form->{snumbers} = qq|ordnumber_| . $form->{ordnumber}; - $form->{addition} = "STORNO"; - $form->save_history($form->dbconnect(\%myconfig)); + $form->{snumbers} = "ordnumber_$form->{ordnumber}"; + $form->{addition} = "STORNO"; + $form->save_history($form->dbconnect(\%myconfig)); } - # /saving the history + # /saving the history - $lxdebug->leave_sub(); + $form->redirect(sprintf $locale->text("Transaction %d cancelled."), $form->{storno_id}); + $main::lxdebug->leave_sub(); } +sub continue { + call_sub($main::form->{nextsub}); +} + +1;