]> wagnertech.de Git - kivitendo-erp.git/blob - SL/RP.pm
Kunden->Lieferanten Dialog mit Links versehen.
[kivitendo-erp.git] / SL / RP.pm
1 #=====================================================================
2 # LX-Office ERP
3 # Copyright (C) 2004
4 # Based on SQL-Ledger Version 2.1.9
5 # Web http://www.lx-office.org
6 #
7 #=====================================================================
8 # SQL-Ledger Accounting
9 # Copyright (C) 1998-2002
10 #
11 #  Author: Dieter Simader
12 #   Email: dsimader@sql-ledger.org
13 #     Web: http://www.sql-ledger.org
14 #
15 #  Contributors: Benjamin Lee <benjaminlee@consultant.com>
16 #
17 # This program is free software; you can redistribute it and/or modify
18 # it under the terms of the GNU General Public License as published by
19 # the Free Software Foundation; either version 2 of the License, or
20 # (at your option) any later version.
21 #
22 # This program is distributed in the hope that it will be useful,
23 # but WITHOUT ANY WARRANTY; without even the implied warranty of
24 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25 # GNU General Public License for more details.
26 # You should have received a copy of the GNU General Public License
27 # along with this program; if not, write to the Free Software
28 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 #======================================================================
30 #
31 # backend code for reports
32 #
33 #======================================================================
34
35 package RP;
36
37 use SL::DBUtils;
38 use Data::Dumper;
39 use List::Util qw(sum);
40 use strict;
41 use warnings;
42
43
44 # new implementation of balance sheet
45 # readme!
46 #
47 # stuff missing from the original implementation:
48 # - bold stuff
49 # - format (2 places, varying signs of negative amounts)
50 # - rounding (might not be necessary)
51 # - accno and subdescription
52 # - proper testing for heading charts
53 # - transmission from $form to TMPL realm is not as clear as i'd like
54 sub balance_sheet {
55   $main::lxdebug->enter_sub();
56
57   my $myconfig = \%main::myconfig;
58   my $form     = $main::form;
59   my $dbh      = $form->get_standard_dbh($myconfig);
60
61   my $last_period = 0;
62   my @categories  = qw(A C L Q);
63
64   # if there are any dates construct a where
65   if ($form->{asofdate}) {
66     $form->{period} = $form->{this_period} = conv_dateq($form->{asofdate});
67   }
68
69   $form->{decimalplaces} *= 1;
70   my $dec = $form->{decimalplaces};
71
72   get_accounts($dbh, $last_period, "", $form->{asofdate}, $form, \@categories);
73
74   # if there are any compare dates
75   if ($form->{compareasofdate}) {
76     $last_period = 1;
77     get_accounts($dbh, $last_period, "", $form->{compareasofdate}, $form, \@categories);
78     $form->{last_period} = conv_dateq($form->{compareasofdate});
79   }
80
81   # now we got $form->{A}{accno}{ }    assets
82   # and $form->{L}{accno}{ }           liabilities
83   # and $form->{Q}{accno}{ }           equity
84   # build asset accounts
85
86   my %account = ('A' => { 'ml'     => -1 },
87                  'L' => { 'ml'     =>  1 },
88                  'Q' => { 'ml'     =>  1 });
89
90   my $TMPL_DATA = {};
91
92   foreach my $category (grep { !/C/ } @categories) {
93
94     $TMPL_DATA->{$category} = [];
95     my $ml  = $account{$category}{ml};
96
97     foreach my $key (sort keys %{ $form->{$category} }) {
98
99       my $row = { %{ $form->{$category}{$key} } };
100
101       # if charttype "heading" - calculate this entry, start a new batch of charts belonging to this heading and skip the rest bo the loop
102       # header charts are not real charts. start a sub aggregation with them, but don't calculate anything with them
103       if ($row->{charttype} eq "H") {
104         if ($account{$category}{subtotal} && $form->{l_subtotal}) {
105           $row->{subdescription} = $account{$category}{subdescription};
106           $row->{this}           = $account{$category}{subthis} * $ml;                   # format: $dec, $dash
107           $row->{last}           = $account{$category}{sublast} * $ml if $last_period;   # format: $dec, $dash
108         }
109
110         $row->{subheader} = 1;
111         $account{$category}{subthis}        = $row->{this};
112         $account{$category}{sublast}        = $row->{last};
113         $account{$category}{subdescription} = $row->{description};
114         $account{$category}{subtotal} = 1;
115
116         $row->{this} = 0;
117         $row->{last} = 0;
118
119         next unless $form->{l_heading};
120       }
121
122       for my $period (qw(this last)) {
123         next if ($period eq 'last' && !$last_period);
124         # only add assets
125         $row->{$period}                    *= $ml;
126         $form->{total}{$category}{$period} += $row->{$period};      #      if ($row->{charttype} eq 'A') {   # why??
127       }
128
129       push @{ $TMPL_DATA->{$category} }, $row;
130     } # foreach
131
132     # resolve heading/subtotal
133     if ($account{$category}{subtotal} && $form->{l_subtotal}) {
134       $TMPL_DATA->{$category}[-1]{subdescription} = $account{$category}{subdescription};
135       $TMPL_DATA->{$category}[-1]{this}           = $account{$category}{subthis} * $ml;                   # format: $dec, $dash
136       $TMPL_DATA->{$category}[-1]{last}           = $account{$category}{sublast} * $ml if $last_period;   # format: $dec, $dash
137     }
138
139     $TMPL_DATA->{total}{$category}{this} = sum map { $_->{this} } @{ $TMPL_DATA->{$category} };
140     $TMPL_DATA->{total}{$category}{last} = sum map { $_->{last} } @{ $TMPL_DATA->{$category} };
141   }
142
143   for my $period (qw(this last)) {
144     next if ($period eq 'last' && !$last_period);
145
146     $form->{E}{$period}             = $form->{total}{A}{$period} - $form->{total}{L}{$period} - $form->{total}{Q}{$period};
147     $form->{total}{Q}{$period}     += $form->{E}{$period};
148     $TMPL_DATA->{total}{Q}{$period} = $form->{total}{Q}{$period};
149     $TMPL_DATA->{total}{$period}    = $form->{total}{L}{$period} + $form->{total}{Q}{$period};
150   }
151
152   push @{ $TMPL_DATA->{Q} }, $form->{E};
153
154   $main::lxdebug->leave_sub();
155
156   return $TMPL_DATA;
157 }
158
159 sub get_accounts {
160   $main::lxdebug->enter_sub();
161
162   my ($dbh, $last_period, $fromdate, $todate, $form, $categories) = @_;
163
164   my ($null, $department_id) = split /--/, $form->{department};
165
166   my $query;
167   my $dpt_where = '';
168   my $dpt_join  = '';
169   my $project   = '';
170   my $where     = "1 = 1";
171   my $glwhere   = "";
172   my $subwhere  = "";
173   my $item;
174   my $sth;
175   my $dec = $form->{decimalplaces};
176
177   my $category = qq| AND (| . join(" OR ", map({ "(c.category = " . $dbh->quote($_) . ")" } @{$categories})) . qq|) |;
178
179   # get headings
180   $query =
181     qq|SELECT c.accno, c.description, c.category
182        FROM chart c
183        WHERE (c.charttype = 'H')
184          $category
185        ORDER by c.accno|;
186
187   $sth = prepare_execute_query($form, $dbh, $query);
188
189   my @headingaccounts = ();
190   while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
191     $form->{ $ref->{category} }{ $ref->{accno} }{description} =
192       "$ref->{description}";
193     $form->{ $ref->{category} }{ $ref->{accno} }{charttype} = "H";
194     $form->{ $ref->{category} }{ $ref->{accno} }{accno}     = $ref->{accno};
195
196     push @headingaccounts, $ref->{accno};
197   }
198
199   $sth->finish;
200
201   if ($fromdate) {
202     $fromdate = conv_dateq($fromdate);
203     if ($form->{method} eq 'cash') {
204       $subwhere .= " AND (transdate >= $fromdate)";
205       $glwhere = " AND (ac.transdate >= $fromdate)";
206     } else {
207       $where .= " AND (ac.transdate >= $fromdate)";
208     }
209   }
210
211   if ($todate) {
212     $todate = conv_dateq($todate);
213     $where    .= " AND (ac.transdate <= $todate)";
214     $subwhere .= " AND (transdate <= $todate)";
215   }
216
217   if ($department_id) {
218     $dpt_join = qq| JOIN department t ON (a.department_id = t.id) |;
219     $dpt_where = qq| AND (t.id = | . conv_i($department_id, 'NULL') . qq|)|;
220   }
221
222   if ($form->{project_id}) {
223     $project = qq| AND (ac.project_id = | . conv_i($form->{project_id}, 'NULL') . qq|) |;
224   }
225
226   if ($form->{method} eq 'cash') {
227     $query =
228       qq|SELECT c.accno, sum(ac.amount) AS amount, c.description, c.category
229          FROM acc_trans ac
230          JOIN chart c ON (c.id = ac.chart_id)
231          JOIN ar a ON (a.id = ac.trans_id)
232          $dpt_join
233          WHERE $where
234            $dpt_where
235            $category
236            AND ac.trans_id IN
237              (
238                SELECT trans_id
239                FROM acc_trans
240                JOIN chart ON (chart_id = id)
241                WHERE (link LIKE '%AR_paid%')
242                $subwhere
243              )
244            $project
245          GROUP BY c.accno, c.description, c.category
246
247          UNION ALL
248
249          SELECT c.accno, sum(ac.amount) AS amount, c.description, c.category
250          FROM acc_trans ac
251          JOIN chart c ON (c.id = ac.chart_id)
252          JOIN ap a ON (a.id = ac.trans_id)
253          $dpt_join
254          WHERE $where
255            $dpt_where
256            $category
257            AND ac.trans_id IN
258              (
259                SELECT trans_id
260                FROM acc_trans
261                JOIN chart ON (chart_id = id)
262                WHERE (link LIKE '%AP_paid%')
263                $subwhere
264              )
265            $project
266          GROUP BY c.accno, c.description, c.category
267
268          UNION ALL
269
270          SELECT c.accno, sum(ac.amount) AS amount, c.description, c.category
271          FROM acc_trans ac
272          JOIN chart c ON (c.id = ac.chart_id)
273          JOIN gl a ON (a.id = ac.trans_id)
274          $dpt_join
275          WHERE $where
276            $glwhere
277            $dpt_where
278            $category
279              AND NOT ((c.link = 'AR') OR (c.link = 'AP'))
280            $project
281          GROUP BY c.accno, c.description, c.category |;
282
283     if ($form->{project_id}) {
284       $query .=
285         qq|
286          UNION ALL
287
288          SELECT c.accno AS accno, SUM(ac.sellprice * ac.qty) AS amount, c.description AS description, c.category
289          FROM invoice ac
290          JOIN ar a ON (a.id = ac.trans_id)
291          JOIN parts p ON (ac.parts_id = p.id)
292          JOIN chart c on (p.income_accno_id = c.id)
293          $dpt_join
294          -- use transdate from subwhere
295          WHERE (c.category = 'I')
296            $subwhere
297            $dpt_where
298            AND ac.trans_id IN
299              (
300                SELECT trans_id
301                FROM acc_trans
302                JOIN chart ON (chart_id = id)
303                WHERE (link LIKE '%AR_paid%')
304                $subwhere
305              )
306            $project
307          GROUP BY c.accno, c.description, c.category
308
309          UNION ALL
310
311          SELECT c.accno AS accno, SUM(ac.sellprice) AS amount, c.description AS description, c.category
312          FROM invoice ac
313          JOIN ap a ON (a.id = ac.trans_id)
314          JOIN parts p ON (ac.parts_id = p.id)
315          JOIN chart c on (p.expense_accno_id = c.id)
316          $dpt_join
317          WHERE (c.category = 'E')
318            $subwhere
319            $dpt_where
320            AND ac.trans_id IN
321              (
322                SELECT trans_id
323                FROM acc_trans
324                JOIN chart ON (chart_id = id)
325                WHERE link LIKE '%AP_paid%'
326                $subwhere
327              )
328            $project
329          GROUP BY c.accno, c.description, c.category |;
330     }
331
332   } else {                      # if ($form->{method} eq 'cash')
333     if ($department_id) {
334       $dpt_join = qq| JOIN dpt_trans t ON (t.trans_id = ac.trans_id) |;
335       $dpt_where = qq| AND t.department_id = $department_id |;
336     }
337
338     $query = qq|
339       SELECT c.accno, sum(ac.amount) AS amount, c.description, c.category
340       FROM acc_trans ac
341       JOIN chart c ON (c.id = ac.chart_id)
342       $dpt_join
343       WHERE $where
344         $dpt_where
345         $category
346         $project
347       GROUP BY c.accno, c.description, c.category |;
348
349     if ($form->{project_id}) {
350       $query .= qq|
351       UNION ALL
352
353       SELECT c.accno AS accno, SUM(ac.sellprice * ac.qty) AS amount, c.description AS description, c.category
354       FROM invoice ac
355       JOIN ar a ON (a.id = ac.trans_id)
356       JOIN parts p ON (ac.parts_id = p.id)
357       JOIN chart c on (p.income_accno_id = c.id)
358       $dpt_join
359       -- use transdate from subwhere
360       WHERE (c.category = 'I')
361         $subwhere
362         $dpt_where
363         $project
364       GROUP BY c.accno, c.description, c.category
365
366       UNION ALL
367
368       SELECT c.accno AS accno, SUM(ac.sellprice * ac.qty) * -1 AS amount, c.description AS description, c.category
369       FROM invoice ac
370       JOIN ap a ON (a.id = ac.trans_id)
371       JOIN parts p ON (ac.parts_id = p.id)
372       JOIN chart c on (p.expense_accno_id = c.id)
373       $dpt_join
374       WHERE (c.category = 'E')
375         $subwhere
376         $dpt_where
377         $project
378       GROUP BY c.accno, c.description, c.category |;
379     }
380   }
381
382   my @accno;
383   my $accno;
384   my $ref;
385
386   $sth = prepare_execute_query($form, $dbh, $query);
387
388   while ($ref = $sth->fetchrow_hashref("NAME_lc")) {
389
390     if ($ref->{category} eq 'C') {
391       $ref->{category} = 'A';
392     }
393
394     # get last heading account
395     @accno = grep { $_ le "$ref->{accno}" } @headingaccounts;
396     $accno = pop @accno;
397     if ($accno) {
398       if ($last_period) {
399         $form->{ $ref->{category} }{$accno}{last} += $ref->{amount};
400       } else {
401         $form->{ $ref->{category} }{$accno}{this} += $ref->{amount};
402       }
403     }
404
405     $form->{ $ref->{category} }{ $ref->{accno} }{accno}       = $ref->{accno};
406     $form->{ $ref->{category} }{ $ref->{accno} }{description} = $ref->{description};
407     $form->{ $ref->{category} }{ $ref->{accno} }{charttype} = "A";
408
409     if ($last_period) {
410       $form->{ $ref->{category} }{ $ref->{accno} }{last} += $ref->{amount};
411     } else {
412       $form->{ $ref->{category} }{ $ref->{accno} }{this} += $ref->{amount};
413     }
414   }
415   $sth->finish;
416
417   # remove accounts with zero balance
418   foreach $category (@{$categories}) {
419     foreach $accno (keys %{ $form->{$category} }) {
420       $form->{$category}{$accno}{last} = $form->round_amount($form->{$category}{$accno}{last}, $dec);
421       $form->{$category}{$accno}{this} = $form->round_amount($form->{$category}{$accno}{this}, $dec);
422
423       delete $form->{$category}{$accno}
424         if (   $form->{$category}{$accno}{this} == 0
425             && $form->{$category}{$accno}{last} == 0);
426     }
427   }
428
429   $main::lxdebug->leave_sub();
430 }
431
432 sub get_accounts_g {
433   $main::lxdebug->enter_sub();
434
435   my ($dbh, $last_period, $fromdate, $todate, $form, $category) = @_;
436
437   my ($null, $department_id) = split /--/, $form->{department};
438
439   my $query;
440   my $dpt_where;
441   my $dpt_join;
442   my $project;
443   my $where    = "1 = 1";
444   my $glwhere  = "";
445   my $prwhere  = "";
446   my $subwhere = "";
447   my $item;
448
449   if ($fromdate) {
450     $fromdate = conv_dateq($fromdate);
451     if ($form->{method} eq 'cash') {
452       $subwhere .= " AND (transdate    >= $fromdate)";
453       $glwhere   = " AND (ac.transdate >= $fromdate)";
454       $prwhere   = " AND (a.transdate  >= $fromdate)";
455     } else {
456       $where    .= " AND (ac.transdate >= $fromdate)";
457     }
458   }
459
460   if ($todate) {
461     $todate = conv_dateq($todate);
462     $subwhere   .= " AND (transdate    <= $todate)";
463     $where      .= " AND (ac.transdate <= $todate)";
464     $prwhere    .= " AND (a.transdate  <= $todate)";
465   }
466
467   if ($department_id) {
468     $dpt_join = qq| JOIN department t ON (a.department_id = t.id) |;
469     $dpt_where = qq| AND (t.id = | . conv_i($department_id, 'NULL') . qq|) |;
470   }
471
472   if ($form->{project_id}) {
473     $project = qq| AND (ac.project_id = | . conv_i($form->{project_id}) . qq|) |;
474   }
475
476   if ($form->{method} eq 'cash') {
477     $query =
478       qq|
479        SELECT SUM(ac.amount * chart_category_to_sgn(c.category)) AS amount, c.$category
480          FROM acc_trans ac
481          JOIN chart c ON (c.id = ac.chart_id)
482          JOIN ar a ON (a.id = ac.trans_id)
483          $dpt_join
484          WHERE $where $dpt_where
485            AND ac.trans_id IN ( SELECT trans_id FROM acc_trans JOIN chart ON (chart_id = id) WHERE (link LIKE '%AR_paid%') $subwhere)
486            $project
487          GROUP BY c.$category
488
489          UNION
490
491          SELECT SUM(ac.amount * chart_category_to_sgn(c.category)) AS amount, c.$category
492          FROM acc_trans ac
493          JOIN chart c ON (c.id = ac.chart_id)
494          JOIN ap a ON (a.id = ac.trans_id)
495          $dpt_join
496          WHERE $where $dpt_where
497            AND ac.trans_id IN ( SELECT trans_id FROM acc_trans JOIN chart ON (chart_id = id) WHERE (link LIKE '%AP_paid%') $subwhere)
498            $project
499          GROUP BY c.$category
500
501          UNION
502
503          SELECT SUM(ac.amount * chart_category_to_sgn(c.category)) AS amount, c.$category
504          FROM acc_trans ac
505          JOIN chart c ON (c.id = ac.chart_id)
506          JOIN gl a ON (a.id = ac.trans_id)
507          $dpt_join
508          WHERE $where $dpt_where $glwhere
509            AND NOT ((c.link = 'AR') OR (c.link = 'AP'))
510            $project
511          GROUP BY c.$category
512         |;
513
514     if ($form->{project_id}) {
515       $query .= qq|
516          UNION
517
518          SELECT SUM(ac.sellprice * ac.qty * chart_category_to_sgn(c.category)) AS amount, c.$category
519          FROM invoice ac
520          JOIN ar a ON (a.id = ac.trans_id)
521          JOIN parts p ON (ac.parts_id = p.id)
522          JOIN chart c on (p.income_accno_id = c.id)
523          $dpt_join
524          WHERE (c.category = 'I') $prwhere $dpt_where
525            AND ac.trans_id IN ( SELECT trans_id FROM acc_trans JOIN chart ON (chart_id = id) WHERE (link LIKE '%AR_paid%') $subwhere)
526            $project
527          GROUP BY c.$category
528
529          UNION
530
531          SELECT SUM(ac.sellprice * chart_category_to_sgn(c.category)) AS amount, c.$category
532          FROM invoice ac
533          JOIN ap a ON (a.id = ac.trans_id)
534          JOIN parts p ON (ac.parts_id = p.id)
535          JOIN chart c on (p.expense_accno_id = c.id)
536          $dpt_join
537          WHERE (c.category = 'E') $prwhere $dpt_where
538            AND ac.trans_id IN ( SELECT trans_id FROM acc_trans JOIN chart ON (chart_id = id) WHERE (link LIKE '%AP_paid%') $subwhere)
539          $project
540          GROUP BY c.$category
541          |;
542     }
543
544   } else {                      # if ($form->{method} eq 'cash')
545     if ($department_id) {
546       $dpt_join = qq| JOIN dpt_trans t ON (t.trans_id = ac.trans_id) |;
547       $dpt_where = qq| AND (t.department_id = | . conv_i($department_id, 'NULL') . qq|) |;
548     }
549
550     $query = qq|
551         SELECT sum(ac.amount * chart_category_to_sgn(c.category)) AS amount, c.$category
552         FROM acc_trans ac
553         JOIN chart c ON (c.id = ac.chart_id)
554         $dpt_join
555         WHERE $where
556           $dpt_where
557           $project
558         GROUP BY c.$category |;
559
560     if ($form->{project_id}) {
561       $query .= qq|
562         UNION
563
564         SELECT SUM(ac.sellprice * ac.qty * chart_category_to_sgn(c.category)) AS amount, c.$category
565         FROM invoice ac
566         JOIN ar a ON (a.id = ac.trans_id)
567         JOIN parts p ON (ac.parts_id = p.id)
568         JOIN chart c on (p.income_accno_id = c.id)
569         $dpt_join
570         WHERE (c.category = 'I')
571           $prwhere
572           $dpt_where
573           $project
574         GROUP BY c.$category
575
576         UNION
577
578         SELECT SUM(ac.sellprice * ac.qty * chart_category_to_sgn(c.category)) AS amount, c.$category
579         FROM invoice ac
580         JOIN ap a ON (a.id = ac.trans_id)
581         JOIN parts p ON (ac.parts_id = p.id)
582         JOIN chart c on (p.expense_accno_id = c.id)
583         $dpt_join
584         WHERE (c.category = 'E')
585           $prwhere
586           $dpt_where
587           $project
588         GROUP BY c.$category |;
589     }
590   }
591
592   my @accno;
593   my $accno;
594   my $ref;
595
596   my $sth = prepare_execute_query($form, $dbh, $query);
597
598   while ($ref = $sth->fetchrow_hashref("NAME_lc")) {
599     if ($category eq "pos_bwa") {
600       if ($last_period) {
601         $form->{ $ref->{$category} }{kumm} += $ref->{amount};
602       } else {
603         $form->{ $ref->{$category} }{jetzt} += $ref->{amount};
604       }
605     } else {
606       $form->{ $ref->{$category} } += $ref->{amount};
607     }
608   }
609   $sth->finish;
610
611   $main::lxdebug->leave_sub();
612 }
613
614 sub trial_balance {
615   $main::lxdebug->enter_sub();
616
617   my ($self, $myconfig, $form) = @_;
618
619   my $dbh = $form->dbconnect($myconfig);
620
621   my ($query, $sth, $ref);
622   my %balance = ();
623   my %trb     = ();
624   my ($null, $department_id) = split /--/, $form->{department};
625   my @headingaccounts = ();
626   my $dpt_where;
627   my $dpt_join;
628   my $project;
629
630   my $where    = "1 = 1";
631   my $invwhere = $where;
632
633   if ($department_id) {
634     $dpt_join = qq| JOIN dpt_trans t ON (ac.trans_id = t.trans_id) |;
635     $dpt_where = qq| AND (t.department_id = | . conv_i($department_id, 'NULL') . qq|) |;
636   }
637
638   # project_id only applies to getting transactions
639   # it has nothing to do with a trial balance
640   # but we use the same function to collect information
641
642   if ($form->{project_id}) {
643     $project = qq| AND (ac.project_id = | . conv_i($form->{project_id}, 'NULL') . qq|) |;
644   }
645
646   my $acc_cash_where = "";
647 #  my $ar_cash_where = "";
648 #  my $ap_cash_where = "";
649
650
651   if ($form->{method} eq "cash") {
652     $acc_cash_where = qq| AND (ac.trans_id IN (SELECT id FROM ar WHERE datepaid>='$form->{fromdate}' AND datepaid<='$form->{todate}' UNION SELECT id FROM ap WHERE datepaid>='$form->{fromdate}' AND datepaid<='$form->{todate}' UNION SELECT id FROM gl WHERE transdate>='$form->{fromdate}' AND transdate<='$form->{todate}')) |;
653 #    $ar_ap_cash_where = qq| AND (a.datepaid>='$form->{fromdate}' AND a.datepaid<='$form->{todate}') |;
654   }
655
656   # get beginning balances
657   $query =
658     qq|SELECT c.accno, c.category, SUM(ac.amount) AS amount, c.description
659         FROM acc_trans ac
660         LEFT JOIN chart c ON (ac.chart_id = c.id)
661         $dpt_join
662         WHERE ((select date_trunc('year', ac.transdate::date)) = (select date_trunc('year', ?::date))) AND ac.ob_transaction $acc_cash_where
663           $dpt_where
664           $project
665         GROUP BY c.accno, c.category, c.description |;
666
667   $sth = prepare_execute_query($form, $dbh, $query, $form->{fromdate});
668
669   while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
670
671     if ($ref->{amount} != 0 || $form->{all_accounts}) {
672       $trb{ $ref->{accno} }{description} = $ref->{description};
673       $trb{ $ref->{accno} }{charttype}   = 'A';
674
675       if ($ref->{amount} > 0) {
676         $trb{ $ref->{accno} }{haben_eb}   = $ref->{amount};
677       } else {
678         $trb{ $ref->{accno} }{soll_eb}   = $ref->{amount} * -1;
679       }
680       $trb{ $ref->{accno} }{category}    = $ref->{category};
681     }
682
683   }
684   $sth->finish;
685
686
687   # get headings
688   $query =
689     qq|SELECT c.accno, c.description, c.category
690        FROM chart c
691        WHERE c.charttype = 'H'
692        ORDER by c.accno|;
693
694   $sth = prepare_execute_query($form, $dbh, $query);
695
696   while ($ref = $sth->fetchrow_hashref("NAME_lc")) {
697     $trb{ $ref->{accno} }{description} = $ref->{description};
698     $trb{ $ref->{accno} }{charttype}   = 'H';
699     $trb{ $ref->{accno} }{category}    = $ref->{category};
700
701     push @headingaccounts, $ref->{accno};
702   }
703
704   $sth->finish;
705
706   $where = " 1 = 1 ";
707   my $saldowhere    = " 1 = 1 ";
708   my $sumwhere      = " 1 = 1 ";
709   my $subwhere      = '';
710   my $sumsubwhere   = '';
711   my $saldosubwhere = '';
712   my $glsaldowhere  = '';
713   my $glsubwhere    = '';
714   my $glwhere       = '';
715   my $glsumwhere    = '';
716   my $tofrom;
717
718   if ($form->{fromdate} || $form->{todate}) {
719     if ($form->{fromdate}) {
720       my $fromdate = conv_dateq($form->{fromdate});
721       $tofrom        .= " AND (ac.transdate >= $fromdate)";
722       $subwhere      .= " AND (transdate >= $fromdate)";
723       $sumsubwhere   .= " AND (transdate >= (select date_trunc('year', date $fromdate))) ";
724       $saldosubwhere .= " AND transdate>=(select date_trunc('year', date $fromdate))  ";
725       $invwhere      .= " AND (a.transdate >= $fromdate)";
726       $glsaldowhere  .= " AND ac.transdate>=(select date_trunc('year', date $fromdate)) ";
727       $glwhere        = " AND (ac.transdate >= $fromdate)";
728       $glsumwhere     = " AND (ac.transdate >= (select date_trunc('year', date $fromdate))) ";
729     }
730     if ($form->{todate}) {
731       my $todate = conv_dateq($form->{todate});
732       $tofrom        .= " AND (ac.transdate <= $todate)";
733       $invwhere      .= " AND (a.transdate <= $todate)";
734       $saldosubwhere .= " AND (transdate <= $todate)";
735       $sumsubwhere   .= " AND (transdate <= $todate)";
736       $subwhere      .= " AND (transdate <= $todate)";
737       $glwhere       .= " AND (ac.transdate <= $todate)";
738       $glsumwhere    .= " AND (ac.transdate <= $todate) ";
739       $glsaldowhere  .= " AND (ac.transdate <= $todate) ";
740    }
741   }
742
743   if ($form->{method} eq "cash") {
744     $where .=
745       qq| AND ((ac.trans_id IN (SELECT id from ar) AND
746                 ac.trans_id IN
747                   (
748                     SELECT trans_id
749                     FROM acc_trans
750                     JOIN chart ON (chart_id = id)
751                     WHERE (link LIKE '%AR_paid%')
752                       $subwhere
753                   )
754                )
755                OR
756                (ac.trans_id in (SELECT id from ap) AND
757                 ac.trans_id IN
758                   (
759                     SELECT trans_id
760                     FROM acc_trans
761                     JOIN chart ON (chart_id = id)
762                     WHERE (link LIKE '%AP_paid%')
763                       $subwhere
764                   )
765                )
766                OR
767                (ac.trans_id in (SELECT id from gl)
768                 $glwhere)
769               )|;
770     $saldowhere .=
771 qq| AND ((ac.trans_id IN (SELECT id from ar) AND
772                 ac.trans_id IN
773                   (
774                     SELECT trans_id
775                     FROM acc_trans
776                     JOIN chart ON (chart_id = id)
777                     WHERE (link LIKE '%AR_paid%')
778                       $saldosubwhere
779                   )
780                )
781                OR
782                (ac.trans_id in (SELECT id from ap) AND
783                 ac.trans_id IN
784                   (
785                     SELECT trans_id
786                     FROM acc_trans
787                     JOIN chart ON (chart_id = id)
788                     WHERE (link LIKE '%AP_paid%')
789                       $saldosubwhere
790                   )
791                )
792                OR
793                (ac.trans_id in (SELECT id from gl)
794                 $glsaldowhere)
795               )|;
796     $sumwhere .=
797 qq| AND ((ac.trans_id IN (SELECT id from ar) AND
798                 ac.trans_id IN
799                   (
800                     SELECT trans_id
801                     FROM acc_trans
802                     JOIN chart ON (chart_id = id)
803                     WHERE (link LIKE '%AR_paid%')
804                       $sumsubwhere
805                   )
806                )
807                OR
808                (ac.trans_id in (SELECT id from ap) AND
809                 ac.trans_id IN
810                   (
811                     SELECT trans_id
812                     FROM acc_trans
813                     JOIN chart ON (chart_id = id)
814                     WHERE (link LIKE '%AP_paid%')
815                       $sumsubwhere
816                   )
817                )
818                OR
819                (ac.trans_id in (SELECT id from gl)
820                 $glsumwhere)
821               )|;
822
823   } else {
824     $where .= $tofrom . " AND (NOT ac.ob_transaction OR ac.ob_transaction IS NULL) AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL)";
825     $saldowhere .= $glsaldowhere . " AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL)";
826     $sumwhere .= $glsumwhere . " AND (NOT ac.ob_transaction OR ac.ob_transaction IS NULL) AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL)";
827   }
828
829   $query = qq|
830        SELECT c.accno, c.description, c.category, SUM(ac.amount) AS amount
831        FROM acc_trans ac
832        JOIN chart c ON (c.id = ac.chart_id)
833        $dpt_join
834        WHERE $where
835          $dpt_where
836          $project
837        GROUP BY c.accno, c.description, c.category |;
838
839   if ($form->{project_id}) {
840     $query .= qq|
841       -- add project transactions from invoice
842
843       UNION ALL
844
845       SELECT c.accno, c.description, c.category, SUM(ac.sellprice * ac.qty) AS amount
846       FROM invoice ac
847       JOIN ar a ON (ac.trans_id = a.id)
848       JOIN parts p ON (ac.parts_id = p.id)
849       JOIN chart c ON (p.income_accno_id = c.id)
850       $dpt_join
851       WHERE $invwhere
852         $dpt_where
853         $project
854       GROUP BY c.accno, c.description, c.category
855
856       UNION ALL
857
858       SELECT c.accno, c.description, c.category, SUM(ac.sellprice * ac.qty) * -1 AS amount
859       FROM invoice ac
860       JOIN ap a ON (ac.trans_id = a.id)
861       JOIN parts p ON (ac.parts_id = p.id)
862       JOIN chart c ON (p.expense_accno_id = c.id)
863       $dpt_join
864       WHERE $invwhere
865         $dpt_where
866         $project
867       GROUP BY c.accno, c.description, c.category
868       |;
869     }
870
871   $query .= qq| ORDER BY accno|;
872
873   $sth = prepare_execute_query($form, $dbh, $query);
874
875   # calculate the debit and credit in the period
876   while ($ref = $sth->fetchrow_hashref("NAME_lc")) {
877     $trb{ $ref->{accno} }{description} = $ref->{description};
878     $trb{ $ref->{accno} }{charttype}   = 'A';
879     $trb{ $ref->{accno} }{category}    = $ref->{category};
880     $trb{ $ref->{accno} }{amount} += $ref->{amount};
881   }
882   $sth->finish;
883
884   # prepare query for each account
885   my ($q_drcr, $drcr, $q_project_drcr, $project_drcr);
886
887   $q_drcr =
888     qq|SELECT
889          (SELECT SUM(ac.amount) * -1
890           FROM acc_trans ac
891           JOIN chart c ON (c.id = ac.chart_id)
892           $dpt_join
893           WHERE $where
894             $dpt_where
895             $project
896           AND (ac.amount < 0)
897           AND (c.accno = ?)) AS debit,
898
899          (SELECT SUM(ac.amount)
900           FROM acc_trans ac
901           JOIN chart c ON (c.id = ac.chart_id)
902           $dpt_join
903           WHERE $where
904             $dpt_where
905             $project
906           AND ac.amount > 0
907           AND c.accno = ?) AS credit,
908         (SELECT SUM(ac.amount)
909          FROM acc_trans ac
910          JOIN chart c ON (ac.chart_id = c.id)
911          $dpt_join
912          WHERE $saldowhere
913            $dpt_where
914            $project
915          AND c.accno = ?) AS saldo,
916
917         (SELECT SUM(ac.amount)
918          FROM acc_trans ac
919          JOIN chart c ON (ac.chart_id = c.id)
920          $dpt_join
921          WHERE $sumwhere
922            $dpt_where
923            $project
924          AND amount > 0
925          AND c.accno = ?) AS sum_credit,
926
927         (SELECT SUM(ac.amount)
928          FROM acc_trans ac
929          JOIN chart c ON (ac.chart_id = c.id)
930          $dpt_join
931          WHERE $sumwhere
932            $dpt_where
933            $project
934          AND amount < 0
935          AND c.accno = ?) AS sum_debit,
936
937         (SELECT max(ac.transdate) FROM acc_trans ac
938         JOIN chart c ON (ac.chart_id = c.id)
939         $dpt_join
940         WHERE $where
941           $dpt_where
942           $project
943         AND c.accno = ?) AS last_transaction
944
945
946  |;
947
948   $drcr = prepare_query($form, $dbh, $q_drcr);
949
950   if ($form->{project_id}) {
951     # prepare query for each account
952     $q_project_drcr =
953       qq|SELECT
954           (SELECT SUM(ac.sellprice * ac.qty) * -1
955            FROM invoice ac
956            JOIN parts p ON (ac.parts_id = p.id)
957            JOIN ap a ON (ac.trans_id = a.id)
958            JOIN chart c ON (p.expense_accno_id = c.id)
959            $dpt_join
960            WHERE $invwhere
961              $dpt_where
962              $project
963            AND c.accno = ?) AS debit,
964
965           (SELECT SUM(ac.sellprice * ac.qty)
966            FROM invoice ac
967            JOIN parts p ON (ac.parts_id = p.id)
968            JOIN ar a ON (ac.trans_id = a.id)
969            JOIN chart c ON (p.income_accno_id = c.id)
970            $dpt_join
971            WHERE $invwhere
972              $dpt_where
973              $project
974            AND c.accno = ?) AS credit,
975
976         (SELECT SUM(ac.amount)
977          FROM acc_trans ac
978          JOIN chart c ON (ac.chart_id = c.id)
979          $dpt_join
980          WHERE $saldowhere
981            $dpt_where
982            $project
983          AND c.accno = ?) AS saldo,
984
985         (SELECT SUM(ac.amount)
986          FROM acc_trans ac
987          JOIN chart c ON (ac.chart_id = c.id)
988          $dpt_join
989          WHERE $sumwhere
990            $dpt_where
991            $project
992          AND amount > 0
993          AND c.accno = ?) AS sum_credit,
994
995         (SELECT SUM(ac.amount)
996          FROM acc_trans ac
997          JOIN chart c ON (ac.chart_id = c.id)
998          $dpt_join
999          WHERE $sumwhere
1000            $dpt_where
1001            $project
1002          AND amount < 0
1003          AND c.accno = ?) AS sum_debit,
1004
1005
1006         (SELECT max(ac.transdate) FROM acc_trans ac
1007         JOIN chart c ON (ac.chart_id = c.id)
1008         $dpt_join
1009         WHERE $where
1010           $dpt_where
1011           $project
1012         AND c.accno = ?) AS last_transaction
1013  |;
1014
1015     $project_drcr = prepare_query($form, $dbh, $q_project_drcr);
1016   }
1017
1018
1019   my ($debit, $credit, $saldo, $soll_saldo, $haben_saldo,$soll_kummuliert, $haben_kummuliert, $last_transaction);
1020
1021   foreach my $accno (sort keys %trb) {
1022     $ref = {};
1023
1024     $ref->{accno} = $accno;
1025     map { $ref->{$_} = $trb{$accno}{$_} }
1026       qw(description category charttype amount soll_eb haben_eb);
1027
1028     $ref->{balance} = $form->round_amount($balance{ $ref->{accno} }, 2);
1029
1030     if ($trb{$accno}{charttype} eq 'A') {
1031
1032       # get DR/CR
1033       do_statement($form, $drcr, $q_drcr, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno});
1034
1035       ($debit, $credit, $saldo, $haben_saldo, $soll_saldo) = (0, 0, 0, 0, 0);
1036       my ($soll_kumuliert, $haben_kumuliert) = (0, 0);
1037       $last_transaction = "";
1038       while (($debit, $credit, $saldo, $haben_kumuliert, $soll_kumuliert, $last_transaction) = $drcr->fetchrow_array) {
1039         $ref->{debit}  += $debit;
1040         $ref->{credit} += $credit;
1041         if ($saldo >= 0) {
1042           $ref->{haben_saldo} += $saldo;
1043         } else {
1044           $ref->{soll_saldo} += $saldo * -1;
1045         }
1046         $ref->{last_transaction} = $last_transaction;
1047         $ref->{soll_kumuliert} = $soll_kumuliert * -1;
1048         $ref->{haben_kumuliert} = $haben_kumuliert;
1049       }
1050       $drcr->finish;
1051
1052       if ($form->{project_id}) {
1053
1054         # get DR/CR
1055         do_statement($form, $project_drcr, $q_project_drcr, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno});
1056
1057         ($debit, $credit) = (0, 0);
1058         while (($debit, $credit, $saldo, $haben_kumuliert, $soll_kumuliert, $last_transaction) = $project_drcr->fetchrow_array) {
1059           $ref->{debit}  += $debit;
1060           $ref->{credit} += $credit;
1061           if ($saldo >= 0) {
1062             $ref->{haben_saldo} += $saldo;
1063           } else {
1064             $ref->{soll_saldo} += $saldo * -1;
1065           }
1066           $ref->{soll_kumuliert} += $soll_kumuliert * -1;
1067           $ref->{haben_kumuliert} += $haben_kumuliert;
1068         }
1069         $project_drcr->finish;
1070       }
1071
1072       $ref->{debit}  = $form->round_amount($ref->{debit},  2);
1073       $ref->{credit} = $form->round_amount($ref->{credit}, 2);
1074       $ref->{haben_saldo}  = $form->round_amount($ref->{haben_saldo},  2);
1075       $ref->{soll_saldo} = $form->round_amount($ref->{soll_saldo}, 2);
1076       $ref->{haben_kumuliert}  = $form->round_amount($ref->{haben_kumuliert},  2);
1077       $ref->{soll_kumuliert} = $form->round_amount($ref->{soll_kumuliert}, 2);
1078     }
1079
1080     # add subtotal
1081     my @accno;
1082     @accno = grep { $_ le "$ref->{accno}" } @headingaccounts;
1083     $accno = pop @accno;
1084     if ($accno) {
1085       $trb{$accno}{debit}  += $ref->{debit};
1086       $trb{$accno}{credit} += $ref->{credit};
1087       $trb{$accno}{soll_saldo}  += $ref->{soll_saldo};
1088       $trb{$accno}{haben_saldo} += $ref->{haben_saldo};
1089       $trb{$accno}{soll_kumuliert}  += $ref->{soll_kumuliert};
1090       $trb{$accno}{haben_kumuliert} += $ref->{haben_kumuliert};
1091     }
1092
1093     push @{ $form->{TB} }, $ref;
1094
1095   }
1096
1097   $dbh->disconnect;
1098
1099   # debits and credits for headings
1100   foreach my $accno (@headingaccounts) {
1101     foreach $ref (@{ $form->{TB} }) {
1102       if ($accno eq $ref->{accno}) {
1103         $ref->{debit}  = $trb{$accno}{debit};
1104         $ref->{credit} = $trb{$accno}{credit};
1105         $ref->{soll_saldo}  = $trb{$accno}{soll_saldo};
1106         $ref->{haben_saldo} = $trb{$accno}{haben_saldo};
1107         $ref->{soll_kumuliert}  = $trb{$accno}{soll_kumuliert};
1108         $ref->{haben_kumuliert} = $trb{$accno}{haben_kumuliert};      }
1109     }
1110   }
1111
1112   $main::lxdebug->leave_sub();
1113 }
1114
1115 sub get_storno {
1116   $main::lxdebug->enter_sub();
1117   my ($self, $dbh, $form) = @_;
1118   my $arap = $form->{arap} eq "ar" ? "ar" : "ap";
1119   my $query = qq|SELECT invnumber FROM $arap WHERE invnumber LIKE "Storno zu "|;
1120   my $sth =  $dbh->prepare($query);
1121   while(my $ref = $sth->fetchrow_hashref()) {
1122     $ref->{invnumer} =~ s/Storno zu //g;
1123     $form->{storno}{$ref->{invnumber}} = 1;
1124   }
1125   $main::lxdebug->leave_sub();
1126 }
1127
1128 sub aging {
1129   $main::lxdebug->enter_sub();
1130
1131   my ($self, $myconfig, $form) = @_;
1132
1133   # connect to database
1134   my $dbh     = $form->dbconnect($myconfig);
1135
1136   my ($invoice, $arap, $buysell, $ct, $ct_id, $ml);
1137
1138   if ($form->{ct} eq "customer") {
1139     $invoice = "is";
1140     $arap = "ar";
1141     $buysell = "buy";
1142     $ct = "customer";
1143     $ml = -1;
1144   } else {
1145     $invoice = "ir";
1146     $arap = "ap";
1147     $buysell = "sell";
1148     $ct = "vendor";
1149     $ml = 1;
1150   }
1151   $ct_id = "${ct}_id";
1152
1153   $form->{todate} = $form->current_date($myconfig) unless ($form->{todate});
1154   my $todate = conv_dateq($form->{todate});
1155   my $fromdate = conv_dateq($form->{fromdate});
1156
1157   my $fromwhere = ($form->{fromdate} ne "") ? " AND (transdate >= (date $fromdate)) " : "";
1158
1159   my $where = " 1 = 1 ";
1160   my ($name, $null);
1161
1162   if ($form->{$ct_id}) {
1163     $where .= qq| AND (ct.id = | . conv_i($form->{$ct_id}) . qq|)|;
1164   } elsif ($form->{ $form->{ct} }) {
1165     $where .= qq| AND (ct.name ILIKE | . $dbh->quote('%' . $form->{$ct} . '%') . qq|)|;
1166   }
1167
1168   my $dpt_join;
1169   if ($form->{department}) {
1170     my ($null, $department_id) = split /--/, $form->{department};
1171     $dpt_join = qq| JOIN department d ON (a.department_id = d.id) |;
1172     $where .= qq| AND (a.department_id = | . conv_i($department_id, 'NULL') . qq|)|;
1173   }
1174
1175   my $q_details = qq|
1176     -- between 0-30 days
1177
1178     SELECT ${ct}.id AS ctid, ${ct}.name,
1179       street, zipcode, city, country, contact, email,
1180       phone as customerphone, fax as customerfax, ${ct}number,
1181       "invnumber", "transdate",
1182       (amount - COALESCE((SELECT sum(amount)*$ml FROM acc_trans LEFT JOIN chart ON (acc_trans.chart_id=chart.id) WHERE link ilike '%paid%' AND acc_trans.trans_id=${arap}.id AND acc_trans.transdate <= (date $todate)),0)) as "open", "amount",
1183       "duedate", invoice, ${arap}.id,
1184       (SELECT $buysell
1185        FROM exchangerate
1186        WHERE (${arap}.curr = exchangerate.curr)
1187          AND (exchangerate.transdate = ${arap}.transdate)) AS exchangerate
1188     FROM ${arap}, ${ct}
1189     WHERE ((paid != amount) OR (datepaid > (date $todate) AND datepaid is not null))
1190       AND (${arap}.storno IS FALSE)
1191       AND (${arap}.${ct}_id = ${ct}.id)
1192       AND (${ct}.id = ?)
1193       AND (transdate <= (date $todate) $fromwhere )
1194
1195     ORDER BY ctid, transdate, invnumber |;
1196
1197   my $sth_details = prepare_query($form, $dbh, $q_details);
1198
1199   # select outstanding vendors or customers, depends on $ct
1200   my $query =
1201     qq|SELECT DISTINCT ct.id, ct.name
1202        FROM $ct ct, $arap a
1203        $dpt_join
1204        WHERE $where
1205          AND (a.${ct_id} = ct.id)
1206          AND ((a.paid != a.amount) OR ((a.datepaid > $todate) AND (datepaid is NOT NULL)))
1207          AND (a.transdate <= $todate $fromwhere)
1208        ORDER BY ct.name|;
1209
1210   my $sth = prepare_execute_query($form, $dbh, $query);
1211
1212   $form->{AG} = [];
1213   # for each company that has some stuff outstanding
1214   while (my ($id) = $sth->fetchrow_array) {
1215     do_statement($form, $sth_details, $q_details, $id);
1216
1217     while (my $ref = $sth_details->fetchrow_hashref("NAME_lc")) {
1218       $ref->{module} = ($ref->{invoice}) ? $invoice : $arap;
1219       $ref->{exchangerate} = 1 unless $ref->{exchangerate};
1220       push @{ $form->{AG} }, $ref;
1221     }
1222
1223     $sth_details->finish;
1224
1225   }
1226
1227   $sth->finish;
1228
1229   # disconnect
1230   $dbh->disconnect;
1231
1232   $main::lxdebug->leave_sub();
1233 }
1234
1235 sub get_customer {
1236   $main::lxdebug->enter_sub();
1237
1238   my ($self, $myconfig, $form) = @_;
1239
1240   # connect to database
1241   my $dbh = $form->dbconnect($myconfig);
1242
1243   my $ct = $form->{ct} eq "customer" ? "customer" : "vendor";
1244
1245   my $query =
1246     qq|SELECT ct.name, ct.email, ct.cc, ct.bcc
1247        FROM $ct ct
1248        WHERE ct.id = ?|;
1249   ($form->{ $form->{ct} }, $form->{email}, $form->{cc}, $form->{bcc}) =
1250     selectrow_query($form, $dbh, $query, $form->{"${ct}_id"});
1251   $dbh->disconnect;
1252
1253   $main::lxdebug->leave_sub();
1254 }
1255
1256 sub get_taxaccounts {
1257   $main::lxdebug->enter_sub();
1258
1259   my ($self, $myconfig, $form) = @_;
1260
1261   # connect to database
1262   my $dbh = $form->dbconnect($myconfig);
1263
1264   # get tax accounts
1265   my $query =
1266     qq|SELECT c.accno, c.description, t.rate
1267        FROM chart c, tax t
1268        WHERE (c.link LIKE '%CT_tax%') AND (c.id = t.chart_id)
1269        ORDER BY c.accno|;
1270   $form->{taxaccounts} = selectall_hashref_quert($form, $dbh, $query);
1271
1272   $dbh->disconnect;
1273
1274   $main::lxdebug->leave_sub();
1275 }
1276
1277 sub tax_report {
1278   $main::lxdebug->enter_sub();
1279
1280   my ($self, $myconfig, $form) = @_;
1281
1282   # connect to database
1283   my $dbh = $form->dbconnect($myconfig);
1284
1285   my ($null, $department_id) = split /--/, $form->{department};
1286
1287   # build WHERE
1288   my $where = "1 = 1";
1289
1290   if ($department_id) {
1291     $where .= qq| AND (a.department_id = | . conv_i($department_id, 'NULL') . qq|) |;
1292   }
1293
1294   my ($accno, $rate);
1295
1296   if ($form->{accno}) {
1297     $accno = $form->{accno};
1298     $rate  = $form->{"$form->{accno}_rate"};
1299     $accno = qq| AND (ch.accno = | . $dbh->quote($accno) . qq|)|;
1300   }
1301   $rate *= 1;
1302
1303   my ($table, $ARAP);
1304
1305   if ($form->{db} eq 'ar') {
1306     $table = "customer";
1307     $ARAP  = "AR";
1308   } else {
1309     $table = "vendor";
1310     $ARAP  = "AP";
1311   }
1312
1313   my $arap = lc($ARAP);
1314
1315   my $transdate = "a.transdate";
1316
1317   if ($form->{method} eq 'cash') {
1318     $transdate = "a.datepaid";
1319
1320     my $todate = conv_dateq($form->{todate} ? $form->{todate} : $form->current_date($myconfig));
1321
1322     $where .= qq|
1323       AND ac.trans_id IN
1324         (
1325           SELECT trans_id
1326           FROM acc_trans
1327           JOIN chart ON (chart_id = id)
1328           WHERE (link LIKE '%${ARAP}_paid%')
1329           AND (transdate <= $todate)
1330         )
1331       |;
1332   }
1333
1334   # if there are any dates construct a where
1335   $where .= " AND ($transdate >= " . conv_dateq($form->{fromdate}) . ") " if ($form->{fromdate});
1336   $where .= " AND ($transdate <= " . conv_dateq($form->{todate}) . ") " if ($form->{todate});
1337
1338   my $ml = ($form->{db} eq 'ar') ? 1 : -1;
1339
1340   my $sortorder = join ', ', $form->sort_columns(qw(transdate invnumber name));
1341   $sortorder = $form->{sort} if ($form->{sort} && grep({ $_ eq $form->{sort} } qw(id transdate invnumber name netamount tax)));
1342
1343   my $query = '';
1344   if ($form->{report} !~ /nontaxable/) {
1345     $query =
1346       qq|SELECT a.id, '0' AS invoice, $transdate AS transdate, a.invnumber, n.name, a.netamount,
1347           ac.amount * $ml AS tax
1348          FROM acc_trans ac
1349          JOIN ${arap} a ON (a.id = ac.trans_id)
1350          JOIN chart ch ON (ch.id = ac.chart_id)
1351          JOIN $table n ON (n.id = a.${table}_id)
1352          WHERE
1353            $where
1354            $accno
1355            AND (a.invoice = '0')
1356
1357          UNION
1358
1359          SELECT a.id, '1' AS invoice, $transdate AS transdate, a.invnumber, n.name, i.sellprice * i.qty AS netamount,
1360            i.sellprice * i.qty * $rate * $ml AS tax
1361          FROM acc_trans ac
1362          JOIN ${arap} a ON (a.id = ac.trans_id)
1363          JOIN chart ch ON (ch.id = ac.chart_id)
1364          JOIN $table n ON (n.id = a.${table}_id)
1365          JOIN ${table}tax t ON (t.${table}_id = n.id)
1366          JOIN invoice i ON (i.trans_id = a.id)
1367          JOIN partstax p ON (p.parts_id = i.parts_id)
1368          WHERE
1369            $where
1370            $accno
1371            AND (a.invoice = '1')
1372          ORDER BY $sortorder|;
1373   } else {
1374     # only gather up non-taxable transactions
1375     $query =
1376       qq|SELECT a.id, '0' AS invoice, $transdate AS transdate, a.invnumber, n.name, a.netamount
1377          FROM acc_trans ac
1378          JOIN ${arap} a ON (a.id = ac.trans_id)
1379          JOIN $table n ON (n.id = a.${table}_id)
1380          WHERE
1381            $where
1382            AND (a.invoice = '0')
1383            AND (a.netamount = a.amount)
1384
1385          UNION
1386
1387          SELECT a.id, '1' AS invoice, $transdate AS transdate, a.invnumber, n.name, i.sellprice * i.qty AS netamount
1388          FROM acc_trans ac
1389          JOIN ${arap} a ON (a.id = ac.trans_id)
1390          JOIN $table n ON (n.id = a.${table}_id)
1391          JOIN invoice i ON (i.trans_id = a.id)
1392          WHERE
1393            $where
1394            AND (a.invoice = '1')
1395            AND (
1396              a.${table}_id NOT IN (SELECT ${table}_id FROM ${table}tax t (${table}_id))
1397              OR
1398              i.parts_id NOT IN (SELECT parts_id FROM partstax p (parts_id))
1399            )
1400          GROUP BY a.id, a.invnumber, $transdate, n.name, i.sellprice, i.qty
1401          ORDER by $sortorder|;
1402   }
1403
1404   $form->{TR} = selectall_hashref_query($form, $dbh, $query);
1405
1406   $dbh->disconnect;
1407
1408   $main::lxdebug->leave_sub();
1409 }
1410
1411 sub paymentaccounts {
1412   $main::lxdebug->enter_sub();
1413
1414   my ($self, $myconfig, $form) = @_;
1415
1416   # connect to database, turn AutoCommit off
1417   my $dbh = $form->dbconnect_noauto($myconfig);
1418
1419   my $ARAP = $form->{db} eq "ar" ? "AR" : "AP";
1420
1421   # get A(R|P)_paid accounts
1422   my $query =
1423     qq|SELECT accno, description
1424        FROM chart
1425        WHERE link LIKE '%${ARAP}_paid%'|;
1426   $form->{PR} = selectall_hashref_query($form, $dbh, $query);
1427
1428   $dbh->disconnect;
1429
1430   $main::lxdebug->leave_sub();
1431 }
1432
1433 sub payments {
1434   $main::lxdebug->enter_sub();
1435
1436   my ($self, $myconfig, $form) = @_;
1437
1438   # connect to database, turn AutoCommit off
1439   my $dbh = $form->dbconnect_noauto($myconfig);
1440
1441   my $ml = 1;
1442   my $arap;
1443   my $table;
1444   if ($form->{db} eq 'ar') {
1445     $table = 'customer';
1446     $ml = -1;
1447     $arap = 'ar';
1448   } else {
1449     $table = 'vendor';
1450     $arap = 'ap';
1451   }
1452
1453   my ($query, $sth);
1454   my $dpt_join;
1455   my $where;
1456
1457   if ($form->{department_id}) {
1458     $dpt_join = qq| JOIN dpt_trans t ON (t.trans_id = ac.trans_id) |;
1459     $where = qq| AND (t.department_id = | . conv_i($form->{department_id}, 'NULL') . qq|) |;
1460   }
1461
1462   if ($form->{fromdate}) {
1463     $where .= " AND (ac.transdate >= " . $dbh->quote($form->{fromdate}) . ") ";
1464   }
1465   if ($form->{todate}) {
1466     $where .= " AND (ac.transdate <= " . $dbh->quote($form->{todate}) . ") ";
1467   }
1468   if (!$form->{fx_transaction}) {
1469     $where .= " AND ac.fx_transaction = '0'";
1470   }
1471
1472   my $invnumber;
1473   my $reference;
1474   if ($form->{reference}) {
1475     $reference = $dbh->quote('%' . $form->{reference} . '%');
1476     $invnumber = " AND (a.invnumber LIKE $reference)";
1477     $reference = " AND (g.reference LIKE $reference)";
1478   }
1479   if ($form->{source}) {
1480     $where .= " AND (ac.source ILIKE " . $dbh->quote('%' . $form->{source} . '%') . ") ";
1481   }
1482   if ($form->{memo}) {
1483     $where .= " AND (ac.memo ILIKE " . $dbh->quote('%' . $form->{memo} . '%') . ") ";
1484   }
1485
1486   my %sort_columns =  (
1487     'transdate'    => [ qw(transdate lower_invnumber lower_name) ],
1488     'invnumber'    => [ qw(lower_invnumber lower_name transdate) ],
1489     'name'         => [ qw(lower_name transdate)                 ],
1490     'source'       => [ qw(lower_source)                         ],
1491     'memo'         => [ qw(lower_memo)                           ],
1492     );
1493   my %lowered_columns =  (
1494     'invnumber'       => { 'gl' => 'g.reference',   'arap' => 'a.invnumber', },
1495     'memo'            => { 'gl' => 'ac.memo',       'arap' => 'ac.memo',     },
1496     'source'          => { 'gl' => 'ac.source',     'arap' => 'ac.source',   },
1497     'name'            => { 'gl' => 'g.description', 'arap' => 'c.name',      },
1498     );
1499
1500   my $sortdir   = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC';
1501   my $sortkey   = $sort_columns{$form->{sort}} ? $form->{sort} : 'transdate';
1502   my $sortorder = join ', ', map { "$_ $sortdir" } @{ $sort_columns{$sortkey} };
1503
1504
1505   my %columns_for_sorting = ( 'gl' => '', 'arap' => '', );
1506   foreach my $spec (@{ $sort_columns{$sortkey} }) {
1507     next if ($spec !~ m/^lower_(.*)$/);
1508
1509     my $column = $1;
1510     map { $columns_for_sorting{$_} .= sprintf(', lower(%s) AS lower_%s', $lowered_columns{$column}->{$_}, $column) } qw(gl arap);
1511   }
1512
1513   $query = qq|SELECT id, accno, description FROM chart WHERE accno = ?|;
1514   $sth = prepare_query($form, $dbh, $query);
1515
1516   my $q_details =
1517       qq|SELECT c.name, a.invnumber, a.ordnumber,
1518            ac.transdate, ac.amount * $ml AS paid, ac.source,
1519            a.invoice, a.id, ac.memo, '${arap}' AS module
1520            $columns_for_sorting{arap}
1521          FROM acc_trans ac
1522          JOIN $arap a ON (ac.trans_id = a.id)
1523          JOIN $table c ON (c.id = a.${table}_id)
1524          $dpt_join
1525          WHERE (ac.chart_id = ?)
1526            $where
1527            $invnumber
1528
1529          UNION
1530
1531          SELECT g.description, g.reference, NULL AS ordnumber,
1532            ac.transdate, ac.amount * $ml AS paid, ac.source,
1533            '0' as invoice, g.id, ac.memo, 'gl' AS module
1534            $columns_for_sorting{gl}
1535          FROM acc_trans ac
1536          JOIN gl g ON (g.id = ac.trans_id)
1537          $dpt_join
1538          WHERE (ac.chart_id = ?)
1539            $where
1540            $reference
1541            AND (ac.amount * $ml) > 0
1542
1543          ORDER BY $sortorder|;
1544   my $sth_details = prepare_query($form, $dbh, $q_details);
1545
1546   $form->{PR} = [];
1547
1548   # cycle through each id
1549   foreach my $accno (split(/ /, $form->{paymentaccounts})) {
1550     do_statement($form, $sth, $query, $accno);
1551     my $ref = $sth->fetchrow_hashref();
1552     push(@{ $form->{PR} }, $ref);
1553     $sth->finish();
1554
1555     $form->{ $ref->{id} } = [] unless ($form->{ $ref->{id} });
1556
1557     do_statement($form, $sth_details, $q_details, $ref->{id}, $ref->{id});
1558     while (my $pr = $sth_details->fetchrow_hashref()) {
1559       push(@{ $form->{ $ref->{id} } }, $pr);
1560     }
1561     $sth_details->finish();
1562   }
1563
1564   $dbh->disconnect;
1565
1566   $main::lxdebug->leave_sub();
1567 }
1568
1569 sub bwa {
1570   $main::lxdebug->enter_sub();
1571
1572   my ($self, $myconfig, $form) = @_;
1573
1574   # connect to database
1575   my $dbh = $form->dbconnect($myconfig);
1576
1577   my $last_period = 0;
1578   my $category;
1579   my @categories  =
1580     qw(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40);
1581
1582   $form->{decimalplaces} *= 1;
1583
1584   &get_accounts_g($dbh, $last_period, $form->{fromdate}, $form->{todate}, $form, "pos_bwa");
1585
1586   # if there are any compare dates
1587   my $year;
1588   if ($form->{fromdate} || $form->{todate}) {
1589     $last_period = 1;
1590     if ($form->{fromdate}) {
1591       $form->{fromdate} =~ /[0-9]*\.[0-9]*\.([0-9]*)/;
1592       $year = $1;
1593     } else {
1594       $form->{todate} =~ /[0-9]*\.[0-9]*\.([0-9]*)/;
1595       $year = $1;
1596     }
1597     my $kummfromdate = $form->{comparefromdate};
1598     my $kummtodate   = $form->{comparetodate};
1599     &get_accounts_g($dbh, $last_period, $kummfromdate, $kummtodate, $form, "pos_bwa");
1600   }
1601
1602   my @periods        = qw(jetzt kumm);
1603   my @gesamtleistung = qw(1 2 3);
1604   my @gesamtkosten   = qw (10 11 12 13 14 15 16 17 18 19 20);
1605   my @ergebnisse     =
1606     qw (rohertrag betriebrohertrag betriebsergebnis neutraleraufwand neutralerertrag ergebnisvorsteuern ergebnis gesamtleistung gesamtkosten);
1607
1608   foreach my $key (@periods) {
1609     $form->{ "$key" . "gesamtleistung" } = 0;
1610     $form->{ "$key" . "gesamtkosten" }   = 0;
1611
1612     foreach $category (@categories) {
1613
1614       if (defined($form->{$category}{$key})) {
1615         $form->{"$key$category"} =
1616           $form->format_amount($myconfig,
1617                                $form->round_amount($form->{$category}{$key}, 2
1618                                ),
1619                                $form->{decimalplaces},
1620                                '0');
1621       }
1622     }
1623     foreach my $item (@gesamtleistung) {
1624       $form->{ "$key" . "gesamtleistung" } += $form->{$item}{$key};
1625     }
1626     foreach my $item (@gesamtkosten) {
1627       $form->{ "$key" . "gesamtkosten" } += $form->{$item}{$key};
1628     }
1629     $form->{ "$key" . "rohertrag" } =
1630       $form->{ "$key" . "gesamtleistung" } - $form->{4}{$key};
1631     $form->{ "$key" . "betriebrohertrag" } =
1632       $form->{ "$key" . "rohertrag" } + $form->{5}{$key};
1633     $form->{ "$key" . "betriebsergebnis" } =
1634       $form->{ "$key" . "betriebrohertrag" } -
1635       $form->{ "$key" . "gesamtkosten" };
1636     $form->{ "$key" . "neutraleraufwand" } =
1637       $form->{30}{$key} + $form->{31}{$key};
1638     $form->{ "$key" . "neutralertrag" } =
1639       $form->{32}{$key} + $form->{33}{$key} + $form->{34}{$key};
1640     $form->{ "$key" . "ergebnisvorsteuern" } =
1641       $form->{ "$key" . "betriebsergebnis" } -
1642       $form->{ "$key" . "neutraleraufwand" } +
1643       $form->{ "$key" . "neutralertrag" };
1644     $form->{ "$key" . "ergebnis" } =
1645       $form->{ "$key" . "ergebnisvorsteuern" } - $form->{35}{$key};
1646
1647     if ($form->{ "$key" . "gesamtleistung" } > 0) {
1648       foreach $category (@categories) {
1649         if (defined($form->{$category}{$key})) {
1650           $form->{ "$key" . "gl" . "$category" } =
1651             $form->format_amount(
1652                                $myconfig,
1653                                $form->round_amount(
1654                                  ($form->{$category}{$key} /
1655                                     $form->{ "$key" . "gesamtleistung" } * 100
1656                                  ),
1657                                  $form->{decimalplaces}
1658                                ),
1659                                $form->{decimalplaces},
1660                                '0');
1661         }
1662       }
1663       foreach my $item (@ergebnisse) {
1664         $form->{ "$key" . "gl" . "$item" } =
1665           $form->format_amount($myconfig,
1666                                $form->round_amount(
1667                                  ( $form->{ "$key" . "$item" } /
1668                                      $form->{ "$key" . "gesamtleistung" } * 100
1669                                  ),
1670                                  $form->{decimalplaces}
1671                                ),
1672                                $form->{decimalplaces},
1673                                '0');
1674       }
1675     }
1676
1677     if ($form->{ "$key" . "gesamtkosten" } > 0) {
1678       foreach $category (@categories) {
1679         if (defined($form->{$category}{$key})) {
1680           $form->{ "$key" . "gk" . "$category" } =
1681             $form->format_amount($myconfig,
1682                                  $form->round_amount(
1683                                    ($form->{$category}{$key} /
1684                                       $form->{ "$key" . "gesamtkosten" } * 100
1685                                    ),
1686                                    $form->{decimalplaces}
1687                                  ),
1688                                  $form->{decimalplaces},
1689                                  '0');
1690         }
1691       }
1692       foreach my $item (@ergebnisse) {
1693         $form->{ "$key" . "gk" . "$item" } =
1694           $form->format_amount($myconfig,
1695                                $form->round_amount(
1696                                    ($form->{ "$key" . "$item" } /
1697                                       $form->{ "$key" . "gesamtkosten" } * 100
1698                                    ),
1699                                    $form->{decimalplaces}
1700                                ),
1701                                $form->{decimalplaces},
1702                                '0');
1703       }
1704     }
1705
1706     if ($form->{10}{$key} > 0) {
1707       foreach $category (@categories) {
1708         if (defined($form->{$category}{$key})) {
1709           $form->{ "$key" . "pk" . "$category" } =
1710             $form->format_amount(
1711                         $myconfig,
1712                         $form->round_amount(
1713                           ($form->{$category}{$key} / $form->{10}{$key} * 100),
1714                           $form->{decimalplaces}
1715                         ),
1716                         $form->{decimalplaces},
1717                         '0');
1718         }
1719       }
1720       foreach my $item (@ergebnisse) {
1721         $form->{ "$key" . "pk" . "$item" } =
1722           $form->format_amount($myconfig,
1723                                $form->round_amount(
1724                                                 ($form->{ "$key" . "$item" } /
1725                                                    $form->{10}{$key} * 100
1726                                                 ),
1727                                                 $form->{decimalplaces}
1728                                ),
1729                                $form->{decimalplaces},
1730                                '0');
1731       }
1732     }
1733
1734     if ($form->{4}{$key} > 0) {
1735       foreach $category (@categories) {
1736         if (defined($form->{$category}{$key})) {
1737           $form->{ "$key" . "auf" . "$category" } =
1738             $form->format_amount(
1739                          $myconfig,
1740                          $form->round_amount(
1741                            ($form->{$category}{$key} / $form->{4}{$key} * 100),
1742                            $form->{decimalplaces}
1743                          ),
1744                          $form->{decimalplaces},
1745                          '0');
1746         }
1747       }
1748       foreach my $item (@ergebnisse) {
1749         $form->{ "$key" . "auf" . "$item" } =
1750           $form->format_amount($myconfig,
1751                                $form->round_amount(
1752                                                 ($form->{ "$key" . "$item" } /
1753                                                    $form->{4}{$key} * 100
1754                                                 ),
1755                                                 $form->{decimalplaces}
1756                                ),
1757                                $form->{decimalplaces},
1758                                '0');
1759       }
1760     }
1761
1762     foreach my $item (@ergebnisse) {
1763       $form->{ "$key" . "$item" } =
1764         $form->format_amount($myconfig,
1765                              $form->round_amount($form->{ "$key" . "$item" },
1766                                                  $form->{decimalplaces}
1767                              ),
1768                              $form->{decimalplaces},
1769                              '0');
1770     }
1771
1772   }
1773   $dbh->disconnect;
1774
1775   $main::lxdebug->leave_sub();
1776 }
1777
1778 sub ustva {
1779   $main::lxdebug->enter_sub();
1780
1781   my ($self, $myconfig, $form) = @_;
1782
1783   # connect to database
1784   my $dbh = $form->dbconnect($myconfig);
1785
1786   my $last_period     = 0;
1787   my @categories_cent = qw(51r 511 86r 861 97r 971 93r 931
1788     96 66 43 45 53 62 65 67);
1789   my @categories_euro = qw(48 51 86 91 97 93 94);
1790   $form->{decimalplaces} *= 1;
1791
1792   foreach my $item (@categories_cent) {
1793     $form->{"$item"} = 0;
1794   }
1795   foreach my $item (@categories_euro) {
1796     $form->{"$item"} = 0;
1797   }
1798
1799   &get_accounts_g($dbh, $last_period, $form->{fromdate}, $form->{todate}, $form, "pos_ustva");
1800
1801   #   foreach $item (@categories_cent) {
1802   #     if ($form->{$item}{"jetzt"} > 0) {
1803   #             $form->{$item} = $form->{$item}{"jetzt"};
1804   #             delete $form->{$item}{"jetzt"};
1805   #     }
1806   #   }
1807   #   foreach $item (@categories_euro) {
1808   #     if ($form->{$item}{"jetzt"} > 0) {
1809   #             $form->{$item} = $form->{$item}{"jetzt"};
1810   #             delete $form->{$item}{"jetzt"};
1811   #     }  foreach $item (@categories_cent) {
1812   #     if ($form->{$item}{"jetzt"} > 0) {
1813   #             $form->{$item} = $form->{$item}{"jetzt"};
1814   #             delete $form->{$item}{"jetzt"};
1815   #     }
1816   #   }
1817   #   foreach $item (@categories_euro) {
1818   #     if ($form->{$item}{"jetzt"} > 0) {
1819   #             $form->{$item} = $form->{$item}{"jetzt"};
1820   #             delete $form->{$item}{"jetzt"};
1821   #     }
1822   #   }
1823   #
1824   #    }
1825
1826   #
1827   # Berechnung der USTVA Formularfelder
1828   #
1829   $form->{"51r"} = $form->{"511"};
1830   $form->{"86r"} = $form->{"861"};
1831   $form->{"97r"} = $form->{"971"};
1832   $form->{"93r"} = $form->{"931"};
1833
1834   #$form->{"96"}  = $form->{"94"} * 0.16;
1835   $form->{"43"} =
1836     $form->{"51r"} + $form->{"86r"} + $form->{"97r"} + $form->{"93r"} +
1837     $form->{"96"};
1838   $form->{"45"} = $form->{"43"};
1839   $form->{"53"} = $form->{"43"};
1840   $form->{"62"} = $form->{"43"} - $form->{"66"};
1841   $form->{"65"} = $form->{"43"} - $form->{"66"};
1842   $form->{"67"} = $form->{"43"} - $form->{"66"};
1843
1844   foreach my $item (@categories_cent) {
1845     $form->{$item} =
1846       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2),
1847                            2, '0');
1848   }
1849
1850   foreach my $item (@categories_euro) {
1851     $form->{$item} =
1852       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 0),
1853                            0, '0');
1854   }
1855
1856   $dbh->disconnect;
1857
1858   $main::lxdebug->leave_sub();
1859 }
1860
1861 sub income_statement {
1862   $main::lxdebug->enter_sub();
1863
1864   my ($self, $myconfig, $form) = @_;
1865
1866   # connect to database
1867   my $dbh = $form->dbconnect($myconfig);
1868
1869   my $last_period          = 0;
1870   my @categories_einnahmen = qw(1 2 3 4 5 6 7);
1871   my @categories_ausgaben  =
1872     qw(8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31);
1873
1874   my @ergebnisse = qw(sumeura sumeurb guvsumme);
1875
1876   $form->{decimalplaces} *= 1;
1877
1878   foreach my $item (@categories_einnahmen) {
1879     $form->{$item} = 0;
1880   }
1881   foreach my $item (@categories_ausgaben) {
1882     $form->{$item} = 0;
1883   }
1884
1885   foreach my $item (@ergebnisse) {
1886     $form->{$item} = 0;
1887   }
1888
1889   &get_accounts_g($dbh, $last_period, $form->{fromdate}, $form->{todate},
1890                   $form, "pos_eur");
1891
1892   foreach my $item (@categories_einnahmen) {
1893     $form->{"eur${item}"} =
1894       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2));
1895     $form->{"sumeura"} += $form->{$item};
1896   }
1897   foreach my $item (@categories_ausgaben) {
1898     $form->{"eur${item}"} =
1899       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2));
1900     $form->{"sumeurb"} += $form->{$item};
1901   }
1902
1903   $form->{"guvsumme"} = $form->{"sumeura"} - $form->{"sumeurb"};
1904
1905   foreach my $item (@ergebnisse) {
1906     $form->{$item} =
1907       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2));
1908   }
1909   $main::lxdebug->leave_sub();
1910 }
1911 1;