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