Projekt

Allgemein

Profil

Herunterladen (37,8 KB) Statistiken
| Zweig: | Markierung: | Revision:
d319704a Moritz Bunkus
#=====================================================================
# LX-Office ERP
# Copyright (C) 2004
# Based on SQL-Ledger Version 2.1.9
# Web http://www.lx-office.org
#
#=====================================================================
# SQL-Ledger Accounting
# Copyright (c) 1998-2002
#
# Author: Dieter Simader
# Email: dsimader@sql-ledger.org
# Web: http://www.sql-ledger.org
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#======================================================================
#
# Genereal Ledger
#
#======================================================================

05c6840d Moritz Bunkus
use utf8;
use strict;

7a1f60ec Moritz Bunkus
use POSIX qw(strftime);
7a7f33b5 Moritz Bunkus
use List::Util qw(sum);
7a1f60ec Moritz Bunkus
7a7f33b5 Moritz Bunkus
use SL::FU;
d319704a Moritz Bunkus
use SL::GL;
dc7f3c9a Moritz Bunkus
use SL::IS;
d319704a Moritz Bunkus
use SL::PE;
7a1f60ec Moritz Bunkus
use SL::ReportGenerator;
d319704a Moritz Bunkus
0437033e Moritz Bunkus
require "bin/mozilla/common.pl";
25a5cdc8 Moritz Bunkus
require "bin/mozilla/drafts.pl";
18da4a96 Moritz Bunkus
require "bin/mozilla/reportgenerator.pl";
d319704a Moritz Bunkus
# this is for our long dates
# $locale->text('January')
# $locale->text('February')
# $locale->text('March')
# $locale->text('April')
# $locale->text('May ')
# $locale->text('June')
# $locale->text('July')
# $locale->text('August')
# $locale->text('September')
# $locale->text('October')
# $locale->text('November')
# $locale->text('December')

# this is for our short month
# $locale->text('Jan')
# $locale->text('Feb')
# $locale->text('Mar')
# $locale->text('Apr')
# $locale->text('May')
# $locale->text('Jun')
# $locale->text('Jul')
# $locale->text('Aug')
# $locale->text('Sep')
# $locale->text('Oct')
# $locale->text('Nov')
# $locale->text('Dec')

sub add {
870e380d Sven Schöling
$main::lxdebug->enter_sub();

$main::auth->assert('general_ledger');
d319704a Moritz Bunkus
870e380d Sven Schöling
my $form = $main::form;
my %myconfig = %main::myconfig;
8c7e4493 Moritz Bunkus
870e380d Sven Schöling
return $main::lxdebug->leave_sub() if (load_draft_maybe());
25a5cdc8 Moritz Bunkus
d319704a Moritz Bunkus
$form->{title} = "Add";

8c7e4493 Moritz Bunkus
$form->{callback} = "gl.pl?action=add" unless $form->{callback};
d319704a Moritz Bunkus
# we use this only to set a default date
12fb1a28 Jan Büren
# yep. aber er holt hier auch schon ALL_CHARTS. Aufwand / Nutzen? jb
d319704a Moritz Bunkus
GL->transaction(\%myconfig, \%$form);

2ae62d30 Stephan Köhler
$form->{rowcount} = 2;
d319704a Moritz Bunkus
$form->{debit} = 0;
$form->{credit} = 0;
$form->{tax} = 0;

# departments
$form->all_departments(\%myconfig);
e2b9e173 Sven Schöling
if (@{ $form->{all_departments} || [] }) {
d319704a Moritz Bunkus
$form->{selectdepartment} = "<option>\n";

map {
$form->{selectdepartment} .=
"<option>$_->{description}--$_->{id}\n"
e2b9e173 Sven Schöling
} (@{ $form->{all_departments} || [] });
d319704a Moritz Bunkus
}

2424e052 Moritz Bunkus
$form->{show_details} = $myconfig{show_form_details} unless defined $form->{show_details};

2ae62d30 Stephan Köhler
&display_form(1);
870e380d Sven Schöling
$main::lxdebug->leave_sub();
2ae62d30 Stephan Köhler
d319704a Moritz Bunkus
}

dc7f3c9a Moritz Bunkus
sub prepare_transaction {
870e380d Sven Schöling
$main::lxdebug->enter_sub();
d319704a Moritz Bunkus
870e380d Sven Schöling
$main::auth->assert('general_ledger');

my $form = $main::form;
my %myconfig = %main::myconfig;
8c7e4493 Moritz Bunkus
d319704a Moritz Bunkus
GL->transaction(\%myconfig, \%$form);
2ae62d30 Stephan Köhler
d319704a Moritz Bunkus
$form->{amount} = $form->format_amount(\%myconfig, $form->{amount}, 2);

# departments
$form->all_departments(\%myconfig);
e2b9e173 Sven Schöling
if (@{ $form->{all_departments} || [] }) {
d319704a Moritz Bunkus
$form->{selectdepartment} = "<option>\n";

map {
$form->{selectdepartment} .=
"<option>$_->{description}--$_->{id}\n"
e2b9e173 Sven Schöling
} (@{ $form->{all_departments} || [] });
d319704a Moritz Bunkus
}

2ae62d30 Stephan Köhler
my $i = 1;
my $tax = 0;
my $taxaccno = "";
870e380d Sven Schöling
foreach my $ref (@{ $form->{GL} }) {
my $j = $i - 1;
2ae62d30 Stephan Köhler
if ($tax && ($ref->{accno} eq $taxaccno)) {
$form->{"tax_$j"} = abs($ref->{amount});
744cfc20 Philip Reetz
$form->{"taxchart_$j"} = $ref->{id} . "--" . $ref->{taxrate};
cb9ded86 Stephan Köhler
if ($form->{taxincluded}) {
if ($ref->{amount} < 0) {
$form->{"debit_$j"} += $form->{"tax_$j"};
} else {
$form->{"credit_$j"} += $form->{"tax_$j"};
}
}
9c2d49bb Moritz Bunkus
$form->{"project_id_$j"} = $ref->{project_id};

2ae62d30 Stephan Köhler
} else {
8a3ba148 Philip Reetz
$form->{"accno_$i"} = "$ref->{accno}--$ref->{tax_id}";
2ae62d30 Stephan Köhler
for (qw(fx_transaction source memo)) { $form->{"${_}_$i"} = $ref->{$_} }
if ($ref->{amount} < 0) {
$form->{totaldebit} -= $ref->{amount};
$form->{"debit_$i"} = $ref->{amount} * -1;
} else {
$form->{totalcredit} += $ref->{amount};
$form->{"credit_$i"} = $ref->{amount};
}
65682418 Philip Reetz
$form->{"taxchart_$i"} = "0--0.00";
9c2d49bb Moritz Bunkus
$form->{"project_id_$i"} = $ref->{project_id};
2ae62d30 Stephan Köhler
$i++;
}
if ($ref->{taxaccno} && !$tax) {
$taxaccno = $ref->{taxaccno};
$tax = 1;
} else {
$taxaccno = "";
$tax = 0;
}
}

$form->{rowcount} = $i;
$form->{locked} =
d319704a Moritz Bunkus
($form->datetonum($form->{transdate}, \%myconfig) <=
$form->datetonum($form->{closedto}, \%myconfig));

870e380d Sven Schöling
$main::lxdebug->leave_sub();
dc7f3c9a Moritz Bunkus
}

sub edit {
870e380d Sven Schöling
$main::lxdebug->enter_sub();

$main::auth->assert('general_ledger');
dc7f3c9a Moritz Bunkus
870e380d Sven Schöling
my $form = $main::form;
my %myconfig = %main::myconfig;
8c7e4493 Moritz Bunkus
dc7f3c9a Moritz Bunkus
prepare_transaction();

d319704a Moritz Bunkus
$form->{title} = "Edit";

2424e052 Moritz Bunkus
$form->{show_details} = $myconfig{show_form_details} unless defined $form->{show_details};

dc7f3c9a Moritz Bunkus
form_header();
display_rows();
form_footer();
2ae62d30 Stephan Köhler
870e380d Sven Schöling
$main::lxdebug->leave_sub();
d319704a Moritz Bunkus
}

dc7f3c9a Moritz Bunkus
d319704a Moritz Bunkus
sub search {
eca3a478 Sven Schöling
$::lxdebug->enter_sub;
$::auth->assert('general_ledger');

$::form->all_departments(\%::myconfig);
$::form->get_lists(
projects => { key => "ALL_PROJECTS", all => 1 },
employees => "ALL_EMPLOYEES",
);

my $onload = "focus()"
. qq|;setupDateFormat('|. $::myconfig{dateformat} . qq|', '| . $::locale->text("Falsches Datumsformat!") . qq|')|
. qq|;setupPoints('|. $::myconfig{numberformat} . qq|', '| . $::locale->text("wrongformat") . qq|')|;

$::form->header;
print $::form->parse_html_template('gl/search', {
onload => $onload,
department_label => sub { ("$_[0]{description}--$_[0]{id}")x2 },
employee_label => sub { "$_[0]{id}--$_[0]{name}" },
});

$::lxdebug->leave_sub;
d319704a Moritz Bunkus
}

7a1f60ec Moritz Bunkus
sub create_subtotal_row {
870e380d Sven Schöling
$main::lxdebug->enter_sub();
d319704a Moritz Bunkus
7a1f60ec Moritz Bunkus
my ($totals, $columns, $column_alignment, $subtotal_columns, $class) = @_;
d319704a Moritz Bunkus
870e380d Sven Schöling
my $form = $main::form;
my %myconfig = %main::myconfig;

7a1f60ec Moritz Bunkus
my $row = { map { $_ => { 'data' => '', 'class' => $class, 'align' => $column_alignment->{$_}, } } @{ $columns } };

map { $row->{$_}->{data} = $form->format_amount(\%myconfig, $totals->{$_}, 2) } @{ $subtotal_columns };
d319704a Moritz Bunkus
7a1f60ec Moritz Bunkus
map { $totals->{$_} = 0 } @{ $subtotal_columns };

870e380d Sven Schöling
$main::lxdebug->leave_sub();
7a1f60ec Moritz Bunkus
return $row;
}
d319704a Moritz Bunkus
7a1f60ec Moritz Bunkus
sub generate_report {
870e380d Sven Schöling
$main::lxdebug->enter_sub();

$main::auth->assert('general_ledger');
d319704a Moritz Bunkus
870e380d Sven Schöling
my $form = $main::form;
my %myconfig = %main::myconfig;
my $locale = $main::locale;
8c7e4493 Moritz Bunkus
4000272e Jan Büren
# 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

# ?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
# je nachdem ob in Suchmaske "transdate" oder "gldate" ausgesucht wurde erstes Suchergebnis entsprechend sortieren
$form->{sort} = $form->{datesort};
};

# was passiert hier?
report_generator_set_default_sort("$form->{datesort}", 1);
# report_generator_set_default_sort('transdate', 1);
d319704a Moritz Bunkus
7a1f60ec Moritz Bunkus
GL->all_transactions(\%myconfig, \%$form);
d319704a Moritz Bunkus
7a1f60ec Moritz Bunkus
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'),);
d319704a Moritz Bunkus
7a1f60ec Moritz Bunkus
$form->{title} = $locale->text('Journal');
if ($form->{category} ne 'X') {
d319704a Moritz Bunkus
$form->{title} .= " : " . $locale->text($acctype{ $form->{category} });
}
7a1f60ec Moritz Bunkus
$form->{landscape} = 1;

my $ml = ($form->{ml} =~ /(A|E|Q)/) ? -1 : 1;

my @columns = qw(
4000272e Jan Büren
gldate transdate id reference description
5494f687 Sven Schöling
notes source debit debit_accno
7a1f60ec Moritz Bunkus
credit credit_accno debit_tax debit_tax_accno
3286128e Jan Büren
credit_tax credit_tax_accno projectnumbers balance employee
7a1f60ec Moritz Bunkus
);

4000272e Jan Büren
# 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);
7a1f60ec Moritz Bunkus
push @hidden_variables, map { "l_${_}" } @columns;
4000272e Jan Büren
foreach ( @hidden_variables ) {
print URL "$_\n";
};
7a1f60ec Moritz Bunkus
cd1d67a1 Moritz Bunkus
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});
4000272e Jan Büren
push @options, $locale->text('Employee') . " : $form->{employee_name}" if ($form->{employee_name});
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}));
cd1d67a1 Moritz Bunkus
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);

d319704a Moritz Bunkus
if ($form->{department}) {
7a1f60ec Moritz Bunkus
my ($department) = split /--/, $form->{department};
push @options, $locale->text('Department') . " : $department";
d319704a Moritz Bunkus
}
cd1d67a1 Moritz Bunkus
7a1f60ec Moritz Bunkus
4b48d335 Moritz Bunkus
my $callback = build_std_url('action=generate_report', grep { $form->{$_} } @hidden_variables);
4000272e Jan Büren
print URL $callback;
close URL;
7a1f60ec Moritz Bunkus
$form->{l_credit_accno} = 'Y';
$form->{l_debit_accno} = 'Y';
$form->{l_credit_tax} = 'Y';
$form->{l_debit_tax} = 'Y';
4000272e Jan Büren
# $form->{l_gldate} = 'Y'; # Spalte mit gldate immer anzeigen
7a1f60ec Moritz Bunkus
$form->{l_credit_tax_accno} = 'Y';
4000272e Jan Büren
$form->{l_datesort} = 'Y';
7a1f60ec Moritz Bunkus
$form->{l_debit_tax_accno} = 'Y';
$form->{l_balance} = $form->{accno} ? 'Y' : '';

my %column_defs = (
'id' => { 'text' => $locale->text('ID'), },
4000272e Jan Büren
'transdate' => { 'text' => $locale->text('Invoice Date'), },
'gldate' => { 'text' => $locale->text('Booking Date'), },
7a1f60ec Moritz Bunkus
'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'), },
4000272e Jan Büren
'employee' => { 'text' => $locale->text('Employee'), },
ff9c4ef2 Udo Spallek
);
d319704a Moritz Bunkus
4000272e Jan Büren
foreach my $name (qw(id transdate gldate reference description debit_accno credit_accno debit_tax_accno credit_tax_accno)) {
4b48d335 Moritz Bunkus
my $sortname = $name =~ m/accno/ ? 'accno' : $name;
19688fca Moritz Bunkus
my $sortdir = $sortname eq $form->{sort} ? 1 - $form->{sortdir} : $form->{sortdir};
4b48d335 Moritz Bunkus
$column_defs{$name}->{link} = $callback . "&sort=$sortname&sortdir=$sortdir";
}

7a1f60ec Moritz Bunkus
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};
d319704a Moritz Bunkus
7a1f60ec Moritz Bunkus
my %column_alignment;
09f64724 Philip Reetz
map { $column_alignment{$_} = 'right' } qw(balance id debit credit debit_tax credit_tax balance);
4000272e Jan Büren
map { $column_alignment{$_} = 'center' } qw(transdate gldate reference debit_accno credit_accno debit_tax_accno credit_tax_accno);
02411506 Philip Reetz
map { $column_alignment{$_} = 'left' } qw(description source notes);
4b48d335 Moritz Bunkus
map { $column_defs{$_}->{align} = $column_alignment{$_} } keys %column_alignment;
d319704a Moritz Bunkus
7a1f60ec Moritz Bunkus
my $report = SL::ReportGenerator->new(\%myconfig, $form);
d319704a Moritz Bunkus
7a1f60ec Moritz Bunkus
$report->set_columns(%column_defs);
$report->set_column_order(@columns);
d319704a Moritz Bunkus
19688fca Moritz Bunkus
$report->set_export_options('generate_report', @hidden_variables, qw(sort sortdir));
d319704a Moritz Bunkus
4b48d335 Moritz Bunkus
$report->set_sort_indicator($form->{sort} eq 'accno' ? 'debit_accno' : $form->{sort}, $form->{sortdir});
d319704a Moritz Bunkus
7a1f60ec Moritz Bunkus
$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();
a873249c Moritz Bunkus
$locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
d319704a Moritz Bunkus
# add sort to callback
4b48d335 Moritz Bunkus
$form->{callback} = "$callback&sort=" . E($form->{sort}) . "&sortdir=" . E($form->{sortdir});
d319704a Moritz Bunkus

7a1f60ec Moritz Bunkus
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;
d319704a Moritz Bunkus
870e380d Sven Schöling
foreach my $ref (@{ $form->{GL} }) {
081a4f97 Moritz Bunkus
7a1f60ec Moritz Bunkus
my %rows;
d319704a Moritz Bunkus
7a1f60ec Moritz Bunkus
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;
70682e3d Philip Reetz
if ($key =~ /debit.*/) {
$ml = -1;
} else {
$ml = 1;
}
$form->{balance} = $form->{balance} + $value * $ml;
7a1f60ec Moritz Bunkus
push @{ $rows{$key} }, $form->format_amount(\%myconfig, $value, 2);
d319704a Moritz Bunkus
}
}

6c7334b3 Philip Reetz
foreach my $key (qw(debit_accno credit_accno debit_tax_accno credit_tax_accno ac_transdate source)) {
7a1f60ec Moritz Bunkus
my $col = $key eq 'ac_transdate' ? 'transdate' : $key;
$rows{$col} = [ map { $ref->{$key}->{$_} } sort keys(%{ $ref->{$key} }) ];
d319704a Moritz Bunkus
}

7a1f60ec Moritz Bunkus
my $row = { };
map { $row->{$_} = { 'data' => '', 'align' => $column_alignment{$_} } } @columns;
d319704a Moritz Bunkus
70682e3d Philip Reetz
my $sh = "";
if ($form->{balance} < 0) {
09f64724 Philip Reetz
$sh = " S";
70682e3d Philip Reetz
$ml = -1;
} elsif ($form->{balance} > 0) {
09f64724 Philip Reetz
$sh = " H";
70682e3d Philip Reetz
$ml = 1;
}
my $data = $form->format_amount(\%myconfig, ($form->{balance} * $ml), 2);
$data .= $sh;

$row->{balance}->{data} = $data;
7a1f60ec Moritz Bunkus
$row->{projectnumbers}->{data} = join ", ", sort { lc($a) cmp lc($b) } keys %{ $ref->{projectnumbers} };
081a4f97 Moritz Bunkus
3286128e Jan Büren
map { $row->{$_}->{data} = $ref->{$_} } qw(id reference description notes gldate employee);
d319704a Moritz Bunkus
3286128e Jan Büren
map { $row->{$_}->{data} = \@{ $rows{$_} }; } qw(transdate debit credit debit_accno credit_accno debit_tax_accno credit_tax_accno source);
d319704a Moritz Bunkus
7a1f60ec Moritz Bunkus
foreach my $col (qw(debit_accno credit_accno debit_tax_accno credit_tax_accno)) {
27bdd44b Moritz Bunkus
$row->{$col}->{link} = [ map { "${callback}&accno=" . E($_) } @{ $rows{$col} } ];
d319704a Moritz Bunkus
}

27bdd44b Moritz Bunkus
map { $row->{$_}->{data} = \@{ $rows{$_} } if ($ref->{"${_}_accno"} ne "") } qw(debit_tax credit_tax);

7a1f60ec Moritz Bunkus
$row->{reference}->{link} = build_std_url("script=$ref->{module}.pl", 'action=edit', 'id=' . E($ref->{id}), 'callback');
d319704a Moritz Bunkus
7a1f60ec Moritz Bunkus
my $row_set = [ $row ];

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');
5ca651f0 Sven Schöling
}

7a1f60ec Moritz Bunkus
$report->add_data($row_set);
d319704a Moritz Bunkus
7a1f60ec Moritz Bunkus
$idx++;
d319704a Moritz Bunkus
}

7a1f60ec Moritz Bunkus
$report->add_separator();
ff9c4ef2 Udo Spallek
7a1f60ec Moritz Bunkus
# = 0 for balanced ledger
my $balanced_ledger = $totals{debit} + $totals{debit_tax} - $totals{credit} - $totals{credit_tax};
ff9c4ef2 Udo Spallek
7a1f60ec Moritz Bunkus
my $row = create_subtotal_row(\%totals, \@columns, \%column_alignment, [ qw(debit credit debit_tax credit_tax) ], 'listtotal');
70682e3d Philip Reetz
my $sh = "";
if ($form->{balance} < 0) {
09f64724 Philip Reetz
$sh = " S";
70682e3d Philip Reetz
$ml = -1;
} elsif ($form->{balance} > 0) {
09f64724 Philip Reetz
$sh = " H";
70682e3d Philip Reetz
$ml = 1;
}
my $data = $form->format_amount(\%myconfig, ($form->{balance} * $ml), 2);
$data .= $sh;

$row->{balance}->{data} = $data;

7a1f60ec Moritz Bunkus
$report->add_data($row);
ff9c4ef2 Udo Spallek
7a1f60ec Moritz Bunkus
my $raw_bottom_info_text;
ff9c4ef2 Udo Spallek
7a1f60ec Moritz Bunkus
if (!$form->{accno} && (abs($balanced_ledger) > 0.001)) {
$raw_bottom_info_text .=
'<p><span class="unbalanced_ledger">'
. $locale->text('Unbalanced Ledger')
. ': '
. $form->format_amount(\%myconfig, $balanced_ledger, 3)
. '</span></p> ';
ff9c4ef2 Udo Spallek
}

9aaca433 Moritz Bunkus
$raw_bottom_info_text .= $form->parse_html_template('gl/generate_report_bottom');
d319704a Moritz Bunkus
7a1f60ec Moritz Bunkus
$report->set_options('raw_bottom_info_text' => $raw_bottom_info_text);
2ae62d30 Stephan Köhler
7a1f60ec Moritz Bunkus
$report->generate_with_headers();
d319704a Moritz Bunkus
870e380d Sven Schöling
$main::lxdebug->leave_sub();
d319704a Moritz Bunkus
}

sub update {
870e380d Sven Schöling
$main::lxdebug->enter_sub();
d319704a Moritz Bunkus
870e380d Sven Schöling
$main::auth->assert('general_ledger');

my $form = $main::form;
my %myconfig = %main::myconfig;
8c7e4493 Moritz Bunkus
0437033e Moritz Bunkus
$form->{oldtransdate} = $form->{transdate};
d319704a Moritz Bunkus
2ae62d30 Stephan Köhler
my @a = ();
my $count = 0;
my $debittax = 0;
my $credittax = 0;
my $debitcount = 0;
my $creditcount = 0;
870e380d Sven Schöling
my ($debitcredit, $amount);
d319704a Moritz Bunkus
2ae62d30 Stephan Köhler
my @flds =
qw(accno debit credit projectnumber fx_transaction source memo tax taxchart);
d319704a Moritz Bunkus
2ae62d30 Stephan Köhler
for my $i (1 .. $form->{rowcount}) {

unless (($form->{"debit_$i"} eq "") && ($form->{"credit_$i"} eq "")) {
for (qw(debit credit tax)) {
$form->{"${_}_$i"} =
$form->parse_amount(\%myconfig, $form->{"${_}_$i"});
}

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--;
a9f5ce46 Moritz Bunkus
$form->{creditlock} = 1;
2ae62d30 Stephan Köhler
}
if (($creditcount >= 2) && ($debitcount == 2)) {
$form->{"debit_$i"} = 0;
$form->{"tax_$i"} = 0;
$debitcount--;
a9f5ce46 Moritz Bunkus
$form->{debitlock} = 1;
2ae62d30 Stephan Köhler
}
if (($creditcount == 1) && ($debitcount == 2)) {
a9f5ce46 Moritz Bunkus
$form->{creditlock} = 1;
2ae62d30 Stephan Köhler
}
if (($creditcount == 2) && ($debitcount == 1)) {
a9f5ce46 Moritz Bunkus
$form->{debitlock} = 1;
2ae62d30 Stephan Köhler
}
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"};
870e380d Sven Schöling
my $j = $#a;
2ae62d30 Stephan Köhler
if (($debitcredit && $credittax) || (!$debitcredit && $debittax)) {
65682418 Philip Reetz
$form->{"taxchart_$i"} = "0--0.00";
2ae62d30 Stephan Köhler
$form->{"tax_$i"} = 0;
}
870e380d Sven Schöling
my ($taxkey, $rate) = split(/--/, $form->{"taxchart_$i"});
5d44361c Moritz Bunkus
if ($taxkey > 1) {
if ($debitcredit) {
$debittax = 1;
} else {
$credittax = 1;
}
if ($form->{taxincluded}) {
$form->{"tax_$i"} = $amount / ($rate + 1) * $rate;
2ae62d30 Stephan Köhler
} else {
5d44361c Moritz Bunkus
$form->{"tax_$i"} = $amount * $rate;
2ae62d30 Stephan Köhler
}
5d44361c Moritz Bunkus
} else {
$form->{"tax_$i"} = 0;
2ae62d30 Stephan Köhler
}

for (@flds) { $a[$j]->{$_} = $form->{"${_}_$i"} }
$count++;
d319704a Moritz Bunkus
}
}
2ae62d30 Stephan Köhler
870e380d Sven Schöling
for my $i (1 .. $count) {
my $j = $i - 1;
2ae62d30 Stephan Köhler
for (@flds) { $form->{"${_}_$i"} = $a[$j]->{$_} }
d319704a Moritz Bunkus
}

870e380d Sven Schöling
for my $i ($count + 1 .. $form->{rowcount}) {
2ae62d30 Stephan Köhler
for (@flds) { delete $form->{"${_}_$i"} }
}

$form->{rowcount} = $count + 1;
d319704a Moritz Bunkus
2ae62d30 Stephan Köhler
&display_form;
870e380d Sven Schöling
$main::lxdebug->leave_sub();
2ae62d30 Stephan Köhler
d319704a Moritz Bunkus
}

sub display_form {
2ae62d30 Stephan Köhler
my ($init) = @_;
870e380d Sven Schöling
$main::lxdebug->enter_sub();

$main::auth->assert('general_ledger');
d319704a Moritz Bunkus
870e380d Sven Schöling
my $form = $main::form;
my %myconfig = %main::myconfig;
8c7e4493 Moritz Bunkus
2ae62d30 Stephan Köhler
&form_header($init);
d319704a Moritz Bunkus
# for $i (1 .. $form->{rowcount}) {
# $form->{totaldebit} += $form->parse_amount(\%myconfig, $form->{"debit_$i"});
# $form->{totalcredit} += $form->parse_amount(\%myconfig, $form->{"credit_$i"});
#
# &form_row($i);
# }
2ae62d30 Stephan Köhler
&display_rows($init);
d319704a Moritz Bunkus
&form_footer;
870e380d Sven Schöling
$main::lxdebug->leave_sub();
d319704a Moritz Bunkus
2ae62d30 Stephan Köhler
}

sub display_rows {
my ($init) = @_;
870e380d Sven Schöling
$main::lxdebug->enter_sub();

$main::auth->assert('general_ledger');
2ae62d30 Stephan Köhler
870e380d Sven Schöling
my $form = $main::form;
my %myconfig = %main::myconfig;
5494f687 Sven Schöling
my $cgi = $::request->{cgi};
8c7e4493 Moritz Bunkus
2424e052 Moritz Bunkus
$form->{debit_1} = 0 if !$form->{"debit_1"};
2ae62d30 Stephan Köhler
$form->{totaldebit} = 0;
$form->{totalcredit} = 0;
0437033e Moritz Bunkus
my %project_labels = ();
my @project_values = ("");
foreach my $item (@{ $form->{"ALL_PROJECTS"} }) {
push(@project_values, $item->{"id"});
$project_labels{$item->{"id"}} = $item->{"projectnumber"};
}

913fe339 Moritz Bunkus
my %chart_labels = ();
my @chart_values = ();
6aefd19d Moritz Bunkus
my %charts = ();
913fe339 Moritz Bunkus
my $taxchart_init;
foreach my $item (@{ $form->{ALL_CHARTS} }) {
05c6840d Moritz Bunkus
if ($item->{charttype} eq 'H'){ #falls überschrift
next; #überspringen (Bug 1150)
12fb1a28 Jan Büren
}
8740c4bf Moritz Bunkus
my $key = $item->{accno} . "--" . $item->{tax_id};
e325dbd2 Moritz Bunkus
$taxchart_init = $item->{tax_id} unless (@chart_values);
913fe339 Moritz Bunkus
push(@chart_values, $key);
8740c4bf Moritz Bunkus
$chart_labels{$key} = $item->{accno} . "--" . $item->{description};
6aefd19d Moritz Bunkus
$charts{$item->{accno}} = $item;
913fe339 Moritz Bunkus
}

my %taxchart_labels = ();
my @taxchart_values = ();
6aefd19d Moritz Bunkus
my %taxcharts = ();
913fe339 Moritz Bunkus
foreach my $item (@{ $form->{ALL_TAXCHARTS} }) {
8740c4bf Moritz Bunkus
my $key = $item->{id} . "--" . $item->{rate};
e325dbd2 Moritz Bunkus
$taxchart_init = $key if ($taxchart_init == $item->{id});
913fe339 Moritz Bunkus
push(@taxchart_values, $key);
8740c4bf Moritz Bunkus
$taxchart_labels{$key} = $item->{taxdescription} . " " . $item->{rate} * 100 . ' %';
6aefd19d Moritz Bunkus
$taxcharts{$item->{id}} = $item;
913fe339 Moritz Bunkus
}

870e380d Sven Schöling
my ($source, $memo, $source_hidden, $memo_hidden);
for my $i (1 .. $form->{rowcount}) {
4f80334f Moritz Bunkus
if ($form->{show_details}) {
$source = qq|
<td><input name="source_$i" value="$form->{"source_$i"}" size="16"></td>|;
$memo = qq|
<td><input name="memo_$i" value="$form->{"memo_$i"}" size="16"></td>|;
} else {
$source_hidden = qq|
<input type="hidden" name="source_$i" value="$form->{"source_$i"}" size="16">|;
$memo_hidden = qq|
<input type="hidden" name="memo_$i" value="$form->{"memo_$i"}" size="16">|;
}
2ae62d30 Stephan Köhler
6aefd19d Moritz Bunkus
my $selected_accno_full;
my ($accno_row) = split(/--/, $form->{"accno_$i"});
my $item = $charts{$accno_row};
$selected_accno_full = "$item->{accno}--$item->{tax_id}";

my $selected_taxchart = $form->{"taxchart_$i"};
my ($selected_accno, $selected_tax_id) = split(/--/, $selected_accno_full);
my ($previous_accno, $previous_tax_id) = split(/--/, $form->{"previous_accno_$i"});

if ($previous_accno &&
($previous_accno eq $selected_accno) &&
($previous_tax_id ne $selected_tax_id)) {
my $item = $taxcharts{$selected_tax_id};
$selected_taxchart = "$item->{id}--$item->{rate}";
}

e325dbd2 Moritz Bunkus
$selected_accno = '' if ($init);
$selected_taxchart ||= $taxchart_init;
6aefd19d Moritz Bunkus
870e380d Sven Schöling
my $accno = qq|<td>| .
356cd04b Moritz Bunkus
NTI($cgi->popup_menu('-name' => "accno_$i",
'-id' => "accno_$i",
3d728d80 Moritz Bunkus
'-onChange' => "setTaxkey($i)",
356cd04b Moritz Bunkus
'-style' => 'width:200px',
'-values' => \@chart_values,
'-labels' => \%chart_labels,
'-default' => $selected_accno_full))
6aefd19d Moritz Bunkus
. $cgi->hidden('-name' => "previous_accno_$i",
'-default' => $selected_accno_full)
913fe339 Moritz Bunkus
. qq|</td>|;
a9f5ce46 Moritz Bunkus
my $tax_ddbox = qq|<td>| .
356cd04b Moritz Bunkus
NTI($cgi->popup_menu('-name' => "taxchart_$i",
'-id' => "taxchart_$i",
'-style' => 'width:200px',
'-values' => \@taxchart_values,
'-labels' => \%taxchart_labels,
'-default' => $selected_taxchart))
913fe339 Moritz Bunkus
. qq|</td>|;
081a4f97 Moritz Bunkus
870e380d Sven Schöling
my ($fx_transaction, $checked);
913fe339 Moritz Bunkus
if ($init) {
2ae62d30 Stephan Köhler
if ($form->{transfer}) {
$fx_transaction = qq|
<td><input name="fx_transaction_$i" class=checkbox type=checkbox value=1></td>
|;
}

} else {
if ($form->{"debit_$i"} != 0) {
$form->{totaldebit} += $form->{"debit_$i"};
cb9ded86 Stephan Köhler
if (!$form->{taxincluded}) {
$form->{totaldebit} += $form->{"tax_$i"};
}
2ae62d30 Stephan Köhler
} else {
$form->{totalcredit} += $form->{"credit_$i"};
cb9ded86 Stephan Köhler
if (!$form->{taxincluded}) {
$form->{totalcredit} += $form->{"tax_$i"};
}
2ae62d30 Stephan Köhler
}

for (qw(debit credit tax)) {
$form->{"${_}_$i"} =
($form->{"${_}_$i"})
? $form->format_amount(\%myconfig, $form->{"${_}_$i"}, 2)
: "";
}

if ($i < $form->{rowcount}) {
if ($form->{transfer}) {
$checked = ($form->{"fx_transaction_$i"}) ? "1" : "";
870e380d Sven Schöling
my $x = ($checked) ? "x" : "";
2ae62d30 Stephan Köhler
$fx_transaction = qq|
<td><input type=hidden name="fx_transaction_$i" value="$checked">$x</td>
|;
}
cb9ded86 Stephan Köhler
$form->hide_form("accno_$i");
2ae62d30 Stephan Köhler
} else {
if ($form->{transfer}) {
$fx_transaction = qq|
<td><input name="fx_transaction_$i" class=checkbox type=checkbox value=1></td>
|;
}
}
}
my $debitreadonly = "";
my $creditreadonly = "";
if ($i == $form->{rowcount}) {
a9f5ce46 Moritz Bunkus
if ($form->{debitlock}) {
2ae62d30 Stephan Köhler
$debitreadonly = "readonly";
a9f5ce46 Moritz Bunkus
} elsif ($form->{creditlock}) {
2ae62d30 Stephan Köhler
$creditreadonly = "readonly";
}
}

0437033e Moritz Bunkus
my $projectnumber =
NTI($cgi->popup_menu('-name' => "project_id_$i",
'-values' => \@project_values,
'-labels' => \%project_labels,
'-default' => $form->{"project_id_$i"} ));
1d6ec050 Sven Schöling
my $projectnumber_hidden = qq|
<input type="hidden" name="project_id_$i" value="$form->{"project_id_$i"}">|;
0437033e Moritz Bunkus
74fca575 Sven Schöling
my $copy2credit = $i == 1 ? 'onkeyup="copy_debit_to_credit()"' : '';
2424e052 Moritz Bunkus
2ae62d30 Stephan Köhler
print qq|<tr valign=top>
$accno
34366eda Moritz Bunkus
<td id="chart_balance_$i" align="right">&nbsp;</td>
2ae62d30 Stephan Köhler
$fx_transaction
2424e052 Moritz Bunkus
<td><input name="debit_$i" size="8" value="$form->{"debit_$i"}" accesskey=$i $copy2credit $debitreadonly></td>
356cd04b Moritz Bunkus
<td><input name="credit_$i" size=8 value="$form->{"credit_$i"}" $creditreadonly></td>
5d44361c Moritz Bunkus
<td><input type="hidden" name="tax_$i" value="$form->{"tax_$i"}">$form->{"tax_$i"}</td>
a9f5ce46 Moritz Bunkus
$tax_ddbox|;
2424e052 Moritz Bunkus
if ($form->{show_details}) {
print qq|
2ae62d30 Stephan Köhler
$source
$memo
0437033e Moritz Bunkus
<td>$projectnumber</td>
2424e052 Moritz Bunkus
|;
1d6ec050 Sven Schöling
} else {
2424e052 Moritz Bunkus
print qq|
6a9bd14f Philip Reetz
$source_hidden
$memo_hidden
1d6ec050 Sven Schöling
$projectnumber_hidden
|;
}
print qq|
2ae62d30 Stephan Köhler
</tr>
2424e052 Moritz Bunkus
|;
2ae62d30 Stephan Köhler
}

$form->hide_form(qw(rowcount selectaccno));
081a4f97 Moritz Bunkus
870e380d Sven Schöling
$main::lxdebug->leave_sub();
2ae62d30 Stephan Köhler
d319704a Moritz Bunkus
}

sub form_header {
d1123673 Sven Schöling
$::lxdebug->enter_sub;
$::auth->assert('general_ledger');
8c7e4493 Moritz Bunkus
d1123673 Sven Schöling
my ($init) = @_;
8c7e4493 Moritz Bunkus
d1123673 Sven Schöling
my @old_project_ids = grep { $_ } map{ $::form->{"project_id_$_"} } 1..$::form->{rowcount};
34366eda Moritz Bunkus
d1123673 Sven Schöling
$::form->get_lists("projects" => { "key" => "ALL_PROJECTS",
34366eda Moritz Bunkus
"all" => 0,
"old_id" => \@old_project_ids },
"charts" => { "key" => "ALL_CHARTS",
d1123673 Sven Schöling
"transdate" => $::form->{transdate} },
34366eda Moritz Bunkus
"taxcharts" => "ALL_TAXCHARTS");

d1123673 Sven Schöling
GL->get_chart_balances('charts' => $::form->{ALL_CHARTS});
e2305bab Philip Reetz
d1123673 Sven Schöling
my $title = $::form->{title};
$::form->{title} = $::locale->text("$title General Ledger Transaction");
d319704a Moritz Bunkus
# $locale->text('Add General Ledger Transaction')
# $locale->text('Edit General Ledger Transaction')
2ae62d30 Stephan Köhler
d1123673 Sven Schöling
map { $::form->{$_} =~ s/\"/&quot;/g }
qw(chart taxchart);
d319704a Moritz Bunkus
d1123673 Sven Schöling
$::form->{selectdepartment} =~ s/ selected//;
$::form->{selectdepartment} =~
s/option>\Q$::form->{department}\E/option selected>$::form->{department}/;
d319704a Moritz Bunkus
2ae62d30 Stephan Köhler
if ($init) {
d1123673 Sven Schöling
$::form->{fokus} = "gl.reference";
$::form->{taxincluded} = "1";
2ae62d30 Stephan Köhler
} else {
d1123673 Sven Schöling
$::form->{fokus} = qq|gl.accno_$::form->{rowcount}|;
2ae62d30 Stephan Köhler
}
d319704a Moritz Bunkus
d1123673 Sven Schöling
$::form->{previous_id} ||= "--";
$::form->{previous_gldate} ||= "--";
d319704a Moritz Bunkus
d1123673 Sven Schöling
$::form->header;
print $::form->parse_html_template('gl/form_header', {
hide_title => $title,
});
2ae62d30 Stephan Köhler
d1123673 Sven Schöling
$::lxdebug->leave_sub;
2ae62d30 Stephan Köhler
d319704a Moritz Bunkus
}

sub form_footer {
750ac970 Sven Schöling
$::lxdebug->enter_sub;
$::auth->assert('general_ledger');
7a7f33b5 Moritz Bunkus
750ac970 Sven Schöling
my ($follow_ups, $follow_ups_due);
25a5cdc8 Moritz Bunkus
750ac970 Sven Schöling
if ($::form->{id}) {
$follow_ups = FU->follow_ups('trans_id' => $::form->{id});
$follow_ups_due = sum map { $_->{due} * 1 } @{ $follow_ups || [] };
d319704a Moritz Bunkus
}

750ac970 Sven Schöling
my $radieren = $::form->current_date(\%::myconfig) eq $::form->{gldate};
d319704a Moritz Bunkus
750ac970 Sven Schöling
print $::form->parse_html_template('gl/form_footer', {
radieren => $radieren,
follow_ups => $follow_ups,
follow_ups_due => $follow_ups_due,
});
2ae62d30 Stephan Köhler
750ac970 Sven Schöling
$::lxdebug->leave_sub;
d319704a Moritz Bunkus
}

sub delete {
870e380d Sven Schöling
$main::lxdebug->enter_sub();

my $form = $main::form;
my $locale = $main::locale;
d319704a Moritz Bunkus
$form->header;

print qq|
<body>

8c7e4493 Moritz Bunkus
<form method=post action=gl.pl>
d319704a Moritz Bunkus
|;

913fe339 Moritz Bunkus
map { $form->{$_} =~ s/\"/&quot;/g } qw(reference description);
d319704a Moritz Bunkus
delete $form->{header};

870e380d Sven Schöling
foreach my $key (keys %$form) {
8c7e4493 Moritz Bunkus
next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key}));
5c832131 Moritz Bunkus
print qq|<input type="hidden" name="$key" value="$form->{$key}">\n|;
d319704a Moritz Bunkus
}

print qq|
<h2 class=confirm>| . $locale->text('Confirm!') . qq|</h2>

<h4>|
. $locale->text('Are you sure you want to delete Transaction')
. qq| $form->{reference}</h4>

<input name=action class=submit type=submit value="|
. $locale->text('Yes') . qq|">
</form>
|;
870e380d Sven Schöling
$main::lxdebug->leave_sub();
2ae62d30 Stephan Köhler
d319704a Moritz Bunkus
}

sub yes {
870e380d Sven Schöling
$main::lxdebug->enter_sub();

my $form = $main::form;
my %myconfig = %main::myconfig;
my $locale = $main::locale;

2b89ec97 Thomas Kasulke
if (GL->delete_transaction(\%myconfig, \%$form)){
# saving the history
if(!exists $form->{addition} && $form->{id} ne "") {
8cef58b2 Thomas Kasulke
$form->{snumbers} = qq|ordnumber_| . $form->{ordnumber};
b65a230d Sven Schöling
$form->{addition} = "DELETED";
a590a651 Sven Schöling
$form->save_history;
2b89ec97 Thomas Kasulke
}
f4e15a53 Sven Schöling
# /saving the history
2b89ec97 Thomas Kasulke
$form->redirect($locale->text('Transaction deleted!'))
}
d319704a Moritz Bunkus
$form->error($locale->text('Cannot delete transaction!'));
870e380d Sven Schöling
$main::lxdebug->leave_sub();
2ae62d30 Stephan Köhler
d319704a Moritz Bunkus
}

7391daa6 Sven Schöling
sub post_transaction {
870e380d Sven Schöling
$main::lxdebug->enter_sub();

my $form = $main::form;
my %myconfig = %main::myconfig;
my $locale = $main::locale;
d319704a Moritz Bunkus
# 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!'));

870e380d Sven Schöling
my $transdate = $form->datetonum($form->{transdate}, \%myconfig);
my $closedto = $form->datetonum($form->{closedto}, \%myconfig);
d319704a Moritz Bunkus
2ae62d30 Stephan Köhler
my @a = ();
my $count = 0;
my $debittax = 0;
my $credittax = 0;
my $debitcount = 0;
my $creditcount = 0;
870e380d Sven Schöling
my $debitcredit;
9f4817cd Sven Schöling
my %split_safety = ();
d319704a Moritz Bunkus
7391daa6 Sven Schöling
my @flds = qw(accno debit credit projectnumber fx_transaction source memo tax taxchart);
d319704a Moritz Bunkus
2ae62d30 Stephan Köhler
for my $i (1 .. $form->{rowcount}) {
7391daa6 Sven Schöling
next if $form->{"debit_$i"} eq "" && $form->{"credit_$i"} eq "";
2ae62d30 Stephan Köhler
7391daa6 Sven Schöling
for (qw(debit credit tax)) {
$form->{"${_}_$i"} = $form->parse_amount(\%myconfig, $form->{"${_}_$i"});
}
2ae62d30 Stephan Köhler
7391daa6 Sven Schöling
push @a, {};
$debitcredit = ($form->{"debit_$i"} == 0) ? "0" : "1";
2ae62d30 Stephan Köhler
9f4817cd Sven Schöling
$split_safety{ $form->{"debit_$i"} <=> 0 }++;
$split_safety{ - $form->{"credit_$i"} <=> 0 }++;

7391daa6 Sven Schöling
if ($debitcredit) {
$debitcount++;
} else {
$creditcount++;
}
2ae62d30 Stephan Köhler
7391daa6 Sven Schöling
if (($debitcount >= 2) && ($creditcount == 2)) {
$form->{"credit_$i"} = 0;
$form->{"tax_$i"} = 0;
$creditcount--;
a9f5ce46 Moritz Bunkus
$form->{creditlock} = 1;
7391daa6 Sven Schöling
}
if (($creditcount >= 2) && ($debitcount == 2)) {
$form->{"debit_$i"} = 0;
$form->{"tax_$i"} = 0;
$debitcount--;
a9f5ce46 Moritz Bunkus
$form->{debitlock} = 1;
7391daa6 Sven Schöling
}
if (($creditcount == 1) && ($debitcount == 2)) {
a9f5ce46 Moritz Bunkus
$form->{creditlock} = 1;
7391daa6 Sven Schöling
}
if (($creditcount == 2) && ($debitcount == 1)) {
a9f5ce46 Moritz Bunkus
$form->{debitlock} = 1;
7391daa6 Sven Schöling
}
if ($debitcredit && $credittax) {
$form->{"taxchart_$i"} = "0--0.00";
}
if (!$debitcredit && $debittax) {
$form->{"taxchart_$i"} = "0--0.00";
}
870e380d Sven Schöling
my $amount = ($form->{"debit_$i"} == 0)
7391daa6 Sven Schöling
? $form->{"credit_$i"}
: $form->{"debit_$i"};
870e380d Sven Schöling
my $j = $#a;
7391daa6 Sven Schöling
if (($debitcredit && $credittax) || (!$debitcredit && $debittax)) {
$form->{"taxchart_$i"} = "0--0.00";
$form->{"tax_$i"} = 0;
}
870e380d Sven Schöling
my ($taxkey, $rate) = split(/--/, $form->{"taxchart_$i"});
5d44361c Moritz Bunkus
if ($taxkey > 1) {
if ($debitcredit) {
$debittax = 1;
} else {
$credittax = 1;
}
if ($form->{taxincluded}) {
$form->{"tax_$i"} = $amount / ($rate + 1) * $rate;
7391daa6 Sven Schöling
if ($debitcredit) {
5d44361c Moritz Bunkus
$form->{"debit_$i"} = $form->{"debit_$i"} - $form->{"tax_$i"};
7391daa6 Sven Schöling
} else {
5d44361c Moritz Bunkus
$form->{"credit_$i"} = $form->{"credit_$i"} - $form->{"tax_$i"};
cb9ded86 Stephan Köhler
}
7391daa6 Sven Schöling
} else {
5d44361c Moritz Bunkus
$form->{"tax_$i"} = $amount * $rate;
2ae62d30 Stephan Köhler
}
5d44361c Moritz Bunkus
} else {
$form->{"tax_$i"} = 0;
d319704a Moritz Bunkus
}
7391daa6 Sven Schöling
for (@flds) { $a[$j]->{$_} = $form->{"${_}_$i"} }
$count++;
2ae62d30 Stephan Köhler
}
d319704a Moritz Bunkus
9f4817cd Sven Schöling
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 Lx-Office does not allow these."));
}

870e380d Sven Schöling
for my $i (1 .. $count) {
my $j = $i - 1;
2ae62d30 Stephan Köhler
for (@flds) { $form->{"${_}_$i"} = $a[$j]->{$_} }
}
d319704a Moritz Bunkus
870e380d Sven Schöling
for my $i ($count + 1 .. $form->{rowcount}) {
2ae62d30 Stephan Köhler
for (@flds) { delete $form->{"${_}_$i"} }
}
d319704a Moritz Bunkus
870e380d Sven Schöling
my ($debit, $credit, $taxtotal);
for my $i (1 .. $form->{rowcount}) {
my $dr = $form->{"debit_$i"};
my $cr = $form->{"credit_$i"};
a9f5ce46 Moritz Bunkus
my $tax = $form->{"tax_$i"};
2ae62d30 Stephan Köhler
if ($dr && $cr) {
7391daa6 Sven Schöling
$form->error($locale->text('Cannot post transaction with a debit and credit entry for the same account!'));
2ae62d30 Stephan Köhler
}
7391daa6 Sven Schöling
$debit += $dr + $tax if $dr;
$credit += $cr + $tax if $cr;
$taxtotal += $tax if $form->{taxincluded}
d319704a Moritz Bunkus
}
f4e15a53 Sven Schöling
7391daa6 Sven Schöling
$form->{taxincluded} = 0 if !$taxtotal;
d319704a Moritz Bunkus
# this is just for the wise guys
$form->error($locale->text('Cannot post transaction for a closed period!'))
9e06d0e4 Philip Reetz
if ($form->date_closed($form->{"transdate"}, \%myconfig));
2ae62d30 Stephan Köhler
if ($form->round_amount($debit, 2) != $form->round_amount($credit, 2)) {
$form->error($locale->text('Out of balance transaction!'));
}
f4e15a53 Sven Schöling
a88b876c Udo Spallek
if ($form->round_amount($debit, 2) + $form->round_amount($credit, 2) == 0) {
$form->error($locale->text('Empty transaction!'));
}
f4e15a53 Sven Schöling
870e380d Sven Schöling
if ((my $errno = GL->post_transaction(\%myconfig, \%$form)) <= -1) {
d319704a Moritz Bunkus
$errno *= -1;
870e380d Sven Schöling
my @err;
d319704a Moritz Bunkus
$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!');

$form->error($err[$errno]);
}
undef($form->{callback});
2b89ec97 Thomas Kasulke
# saving the history
if(!exists $form->{addition} && $form->{id} ne "") {
8cef58b2 Thomas Kasulke
$form->{snumbers} = qq|ordnumber_| . $form->{ordnumber};
7391daa6 Sven Schöling
$form->{addition} = "SAVED";
f4e15a53 Sven Schöling
$form->{what_done} = $locale->text("Buchungsnummer") . " = " . $form->{id};
a590a651 Sven Schöling
$form->save_history;
2b89ec97 Thomas Kasulke
}
f4e15a53 Sven Schöling
# /saving the history
2424e052 Moritz Bunkus
870e380d Sven Schöling
$main::lxdebug->leave_sub();
7391daa6 Sven Schöling
}

sub post {
870e380d Sven Schöling
$main::lxdebug->enter_sub();

$main::auth->assert('general_ledger');
7391daa6 Sven Schöling
870e380d Sven Schöling
my $form = $main::form;
my $locale = $main::locale;
8c7e4493 Moritz Bunkus
05174f19 Sven Schöling
if ($::myconfig{mandatory_departments} && !$form->{department}) {
$form->{saved_message} = $::locale->text('You have to specify a department.');
update();
exit;
}

91ea86b4 Moritz Bunkus
$form->{title} = $locale->text("$form->{title} General Ledger Transaction");
$form->{storno} = 0;
7391daa6 Sven Schöling
post_transaction();

25a5cdc8 Moritz Bunkus
remove_draft() if $form->{remove_draft};

595799f4 Moritz Bunkus
$form->{callback} = build_std_url("action=add&DONT_LOAD_DRAFT=1", "show_details");
2424e052 Moritz Bunkus
$form->redirect($form->{callback});

870e380d Sven Schöling
$main::lxdebug->leave_sub();
d319704a Moritz Bunkus
}

sub post_as_new {
870e380d Sven Schöling
$main::lxdebug->enter_sub();
d319704a Moritz Bunkus
870e380d Sven Schöling
$main::auth->assert('general_ledger');

my $form = $main::form;
8c7e4493 Moritz Bunkus
d319704a Moritz Bunkus
$form->{id} = 0;
&add;
870e380d Sven Schöling
$main::lxdebug->leave_sub();
2ae62d30 Stephan Köhler
d319704a Moritz Bunkus
}

sub storno {
870e380d Sven Schöling
$main::lxdebug->enter_sub();

$main::auth->assert('general_ledger');
d319704a Moritz Bunkus
870e380d Sven Schöling
my $form = $main::form;
my %myconfig = %main::myconfig;
my $locale = $main::locale;
8c7e4493 Moritz Bunkus
090de47c Sven Schöling
# don't cancel cancelled transactions
dc7f3c9a Moritz Bunkus
if (IS->has_storno(\%myconfig, $form, 'gl')) {
090de47c Sven Schöling
$form->{title} = $locale->text("Cancel Accounts Receivables Transaction");
dc7f3c9a Moritz Bunkus
$form->error($locale->text("Transaction has already been cancelled!"));
}

090de47c Sven Schöling
GL->storno($form, \%myconfig, $form->{id});
dc7f3c9a Moritz Bunkus
2b89ec97 Thomas Kasulke
# saving the history
if(!exists $form->{addition} && $form->{id} ne "") {
090de47c Sven Schöling
$form->{snumbers} = "ordnumber_$form->{ordnumber}";
$form->{addition} = "STORNO";
a590a651 Sven Schöling
$form->save_history;
2b89ec97 Thomas Kasulke
}
f4e15a53 Sven Schöling
# /saving the history
dc7f3c9a Moritz Bunkus
f4e15a53 Sven Schöling
$form->redirect(sprintf $locale->text("Transaction %d cancelled."), $form->{storno_id});
7391daa6 Sven Schöling
870e380d Sven Schöling
$main::lxdebug->leave_sub();
d319704a Moritz Bunkus
}

8c7e4493 Moritz Bunkus
sub continue {
870e380d Sven Schöling
call_sub($main::form->{nextsub});
8c7e4493 Moritz Bunkus
}
2dacd279 Sven Schöling
1;