kivitendo/bin/mozilla/gl.pl @ 8a2d9daf
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"> </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/\"/"/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/\"/"/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;
|