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