Workflow Transformationen aus OE heraus setzen jetzt den Bearbeiter auf den aktuellen...
[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     foreach my $prefix (qw(from to)) {
673       next if ($form->{"${prefix}date"});
674
675       my $min_max = $prefix eq 'from' ? 'min' : 'max';
676       $query      = qq|SELECT ${min_max}(transdate)
677                        FROM acc_trans ac
678                        $dpt_join
679                        WHERE (1 = 1)
680                          $dpt_where
681                          $project|;
682       ($form->{"${prefix}date"}) = selectfirst_array_query($form, $dbh, $query);
683     }
684
685     # get beginning balances
686     $query =
687       qq|SELECT c.accno, c.category, SUM(ac.amount) AS amount, c.description
688           FROM acc_trans ac
689           LEFT JOIN chart c ON (ac.chart_id = c.id)
690           $dpt_join
691           WHERE ((select date_trunc('year', ac.transdate::date)) = (select date_trunc('year', ?::date))) AND ac.ob_transaction
692             $dpt_where
693             $project
694           GROUP BY c.accno, c.category, c.description |;
695
696     $sth = prepare_execute_query($form, $dbh, $query, $form->{fromdate});
697
698     while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
699
700       if ($ref->{amount} != 0 || $form->{all_accounts}) {
701         $trb{ $ref->{accno} }{description} = $ref->{description};
702         $trb{ $ref->{accno} }{charttype}   = 'A';
703         $trb{ $ref->{accno} }{beginning_balance} = $ref->{amount};
704
705         if ($ref->{amount} > 0) {
706           $trb{ $ref->{accno} }{haben_eb}   = $ref->{amount};
707         } else {
708           $trb{ $ref->{accno} }{soll_eb}   = $ref->{amount} * -1;
709         }
710         $trb{ $ref->{accno} }{category}    = $ref->{category};
711       }
712
713     }
714     $sth->finish;
715   }
716
717   # get headings
718   $query =
719     qq|SELECT c.accno, c.description, c.category
720        FROM chart c
721        WHERE c.charttype = 'H'
722        ORDER by c.accno|;
723
724   $sth = prepare_execute_query($form, $dbh, $query);
725
726   while ($ref = $sth->fetchrow_hashref("NAME_lc")) {
727     $trb{ $ref->{accno} }{description} = $ref->{description};
728     $trb{ $ref->{accno} }{charttype}   = 'H';
729     $trb{ $ref->{accno} }{category}    = $ref->{category};
730
731     push @headingaccounts, $ref->{accno};
732   }
733
734   $sth->finish;
735
736   $where = " 1 = 1 ";
737   my $saldowhere    = " 1 = 1 ";
738   my $sumwhere      = " 1 = 1 ";
739   my $subwhere      = '';
740   my $sumsubwhere   = '';
741   my $saldosubwhere = '';
742   my $glsaldowhere  = '';
743   my $glsubwhere    = '';
744   my $glwhere       = '';
745   my $glsumwhere    = '';
746   my $tofrom;
747
748   if ($form->{fromdate} || $form->{todate}) {
749     if ($form->{fromdate}) {
750       $fromdate = conv_dateq($form->{fromdate});
751       $tofrom        .= " AND (ac.transdate >= $fromdate)";
752       $subwhere      .= " AND (ac.transdate >= $fromdate)";
753       $sumsubwhere   .= " AND (ac.transdate >= (select date_trunc('year', date $fromdate))) ";
754       $saldosubwhere .= " AND (ac,transdate>=(select date_trunc('year', date $fromdate)))  ";
755       $invwhere      .= " AND (a.transdate >= $fromdate)";
756       $glsaldowhere  .= " AND ac.transdate>=(select date_trunc('year', date $fromdate)) ";
757       $glwhere        = " AND (ac.transdate >= $fromdate)";
758       $glsumwhere     = " AND (ac.transdate >= (select date_trunc('year', date $fromdate))) ";
759     }
760     if ($form->{todate}) {
761       $todate = conv_dateq($form->{todate});
762       $tofrom        .= " AND (ac.transdate <= $todate)";
763       $invwhere      .= " AND (a.transdate <= $todate)";
764       $saldosubwhere .= " AND (ac.transdate <= $todate)";
765       $sumsubwhere   .= " AND (ac.transdate <= $todate)";
766       $subwhere      .= " AND (ac.transdate <= $todate)";
767       $glwhere       .= " AND (ac.transdate <= $todate)";
768       $glsumwhere    .= " AND (ac.transdate <= $todate) ";
769       $glsaldowhere  .= " AND (ac.transdate <= $todate) ";
770    }
771   }
772
773   if ($form->{method} eq "cash") {
774     $where .=
775       qq| AND(ac.trans_id IN (SELECT id FROM ar WHERE datepaid>= $fromdate AND datepaid<= $todate UNION SELECT id FROM ap WHERE datepaid>= $fromdate AND datepaid<= $todate UNION SELECT id FROM gl WHERE transdate>= $fromdate AND transdate<= $todate)) AND (NOT ac.ob_transaction OR ac.ob_transaction IS NULL) AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL) |;
776     $saldowhere .= qq| AND(ac.trans_id IN (SELECT id FROM ar WHERE datepaid>= $fromdate AND datepaid<= $todate UNION SELECT id FROM ap WHERE datepaid>= $fromdate AND datepaid<= $todate UNION SELECT id FROM gl WHERE transdate>= $fromdate AND transdate<= $todate))  AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL) |;
777       
778     $sumwhere .= qq| AND(ac.trans_id IN (SELECT id FROM ar WHERE datepaid>= $fromdate AND datepaid<= $todate UNION SELECT id FROM ap WHERE datepaid>= $fromdate AND datepaid<= $todate UNION SELECT id FROM gl WHERE transdate>= $fromdate AND transdate<= $todate)) AND (NOT ac.ob_transaction OR ac.ob_transaction IS NULL) AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL) |;
779   } else {
780     $where .= $tofrom . " AND (NOT ac.ob_transaction OR ac.ob_transaction IS NULL) AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL)";
781     $saldowhere .= $glsaldowhere . " AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL)";
782     $sumwhere .= $glsumwhere . " AND (NOT ac.ob_transaction OR ac.ob_transaction IS NULL) AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL)";
783   }
784
785   $query = qq|
786        SELECT c.accno, c.description, c.category, SUM(ac.amount) AS amount
787        FROM acc_trans ac
788        JOIN chart c ON (c.id = ac.chart_id)
789        $dpt_join
790        WHERE $where
791          $dpt_where
792          $project
793        GROUP BY c.accno, c.description, c.category |;
794
795   if ($form->{project_id}) {
796     $query .= qq|
797       -- add project transactions from invoice
798
799       UNION ALL
800
801       SELECT c.accno, c.description, c.category, SUM(ac.sellprice * ac.qty) AS amount
802       FROM invoice ac
803       JOIN ar a ON (ac.trans_id = a.id)
804       JOIN parts p ON (ac.parts_id = p.id)
805       JOIN chart c ON (p.income_accno_id = c.id)
806       $dpt_join
807       WHERE $invwhere
808         $dpt_where
809         $project
810       GROUP BY c.accno, c.description, c.category
811
812       UNION ALL
813
814       SELECT c.accno, c.description, c.category, SUM(ac.sellprice * ac.qty) * -1 AS amount
815       FROM invoice ac
816       JOIN ap a ON (ac.trans_id = a.id)
817       JOIN parts p ON (ac.parts_id = p.id)
818       JOIN chart c ON (p.expense_accno_id = c.id)
819       $dpt_join
820       WHERE $invwhere
821         $dpt_where
822         $project
823       GROUP BY c.accno, c.description, c.category
824       |;
825     }
826
827   $query .= qq| ORDER BY accno|;
828
829   $sth = prepare_execute_query($form, $dbh, $query);
830
831   # calculate the debit and credit in the period
832   while ($ref = $sth->fetchrow_hashref("NAME_lc")) {
833     $trb{ $ref->{accno} }{description} = $ref->{description};
834     $trb{ $ref->{accno} }{charttype}   = 'A';
835     $trb{ $ref->{accno} }{category}    = $ref->{category};
836     $trb{ $ref->{accno} }{amount} += $ref->{amount};
837   }
838   $sth->finish;
839
840   # prepare query for each account
841   my ($q_drcr, $drcr, $q_project_drcr, $project_drcr);
842
843   $q_drcr =
844     qq|SELECT
845          (SELECT SUM(ac.amount) * -1
846           FROM acc_trans ac
847           JOIN chart c ON (c.id = ac.chart_id)
848           $dpt_join
849           WHERE $where
850             $dpt_where
851             $project
852           AND (ac.amount < 0)
853           AND (c.accno = ?)) AS debit,
854
855          (SELECT SUM(ac.amount)
856           FROM acc_trans ac
857           JOIN chart c ON (c.id = ac.chart_id)
858           $dpt_join
859           WHERE $where
860             $dpt_where
861             $project
862           AND ac.amount > 0
863           AND c.accno = ?) AS credit,
864         (SELECT SUM(ac.amount)
865          FROM acc_trans ac
866          JOIN chart c ON (ac.chart_id = c.id)
867          $dpt_join
868          WHERE $saldowhere
869            $dpt_where
870            $project
871          AND c.accno = ? AND (NOT ac.ob_transaction OR ac.ob_transaction IS NULL)) AS saldo,
872
873         (SELECT SUM(ac.amount)
874          FROM acc_trans ac
875          JOIN chart c ON (ac.chart_id = c.id)
876          $dpt_join
877          WHERE $sumwhere
878            $dpt_where
879            $project
880          AND amount > 0
881          AND c.accno = ?) AS sum_credit,
882
883         (SELECT SUM(ac.amount)
884          FROM acc_trans ac
885          JOIN chart c ON (ac.chart_id = c.id)
886          $dpt_join
887          WHERE $sumwhere
888            $dpt_where
889            $project
890          AND amount < 0
891          AND c.accno = ?) AS sum_debit,
892
893         (SELECT max(ac.transdate) FROM acc_trans ac
894         JOIN chart c ON (ac.chart_id = c.id)
895         $dpt_join
896         WHERE $where
897           $dpt_where
898           $project
899         AND c.accno = ?) AS last_transaction
900
901
902  |;
903
904   $drcr = prepare_query($form, $dbh, $q_drcr);
905
906   if ($form->{project_id}) {
907     # prepare query for each account
908     $q_project_drcr =
909       qq|SELECT
910           (SELECT SUM(ac.sellprice * ac.qty) * -1
911            FROM invoice ac
912            JOIN parts p ON (ac.parts_id = p.id)
913            JOIN ap a ON (ac.trans_id = a.id)
914            JOIN chart c ON (p.expense_accno_id = c.id)
915            $dpt_join
916            WHERE $invwhere
917              $dpt_where
918              $project
919            AND c.accno = ?) AS debit,
920
921           (SELECT SUM(ac.sellprice * ac.qty)
922            FROM invoice ac
923            JOIN parts p ON (ac.parts_id = p.id)
924            JOIN ar a ON (ac.trans_id = a.id)
925            JOIN chart c ON (p.income_accno_id = c.id)
926            $dpt_join
927            WHERE $invwhere
928              $dpt_where
929              $project
930            AND c.accno = ?) AS credit,
931
932         (SELECT SUM(ac.amount)
933          FROM acc_trans ac
934          JOIN chart c ON (ac.chart_id = c.id)
935          $dpt_join
936          WHERE $saldowhere
937            $dpt_where
938            $project
939          AND c.accno = ? AND (NOT ac.ob_transaction OR ac.ob_transaction IS NULL)) AS saldo,
940
941         (SELECT SUM(ac.amount)
942          FROM acc_trans ac
943          JOIN chart c ON (ac.chart_id = c.id)
944          $dpt_join
945          WHERE $sumwhere
946            $dpt_where
947            $project
948          AND amount > 0
949          AND c.accno = ?) AS sum_credit,
950
951         (SELECT SUM(ac.amount)
952          FROM acc_trans ac
953          JOIN chart c ON (ac.chart_id = c.id)
954          $dpt_join
955          WHERE $sumwhere
956            $dpt_where
957            $project
958          AND amount < 0
959          AND c.accno = ?) AS sum_debit,
960
961
962         (SELECT max(ac.transdate) FROM acc_trans ac
963         JOIN chart c ON (ac.chart_id = c.id)
964         $dpt_join
965         WHERE $where
966           $dpt_where
967           $project
968         AND c.accno = ?) AS last_transaction
969  |;
970
971     $project_drcr = prepare_query($form, $dbh, $q_project_drcr);
972   }
973
974
975   my ($debit, $credit, $saldo, $soll_saldo, $haben_saldo,$soll_kummuliert, $haben_kummuliert, $last_transaction);
976
977   foreach my $accno (sort keys %trb) {
978     $ref = {};
979
980     $ref->{accno} = $accno;
981     map { $ref->{$_} = $trb{$accno}{$_} }
982       qw(description category charttype amount soll_eb haben_eb beginning_balance);
983
984     $ref->{balance} = $form->round_amount($balance{ $ref->{accno} }, 2);
985
986     if ($trb{$accno}{charttype} eq 'A') {
987
988       # get DR/CR
989       do_statement($form, $drcr, $q_drcr, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno});
990
991       ($debit, $credit, $saldo, $haben_saldo, $soll_saldo) = (0, 0, 0, 0, 0);
992       my ($soll_kumuliert, $haben_kumuliert) = (0, 0);
993       $last_transaction = "";
994       while (($debit, $credit, $saldo, $haben_kumuliert, $soll_kumuliert, $last_transaction) = $drcr->fetchrow_array) {
995         $ref->{debit}  += $debit;
996         $ref->{credit} += $credit;
997         if ($saldo >= 0) {
998           $ref->{haben_saldo} += $saldo;
999         } else {
1000           $ref->{soll_saldo} += $saldo * -1;
1001         }
1002         $ref->{last_transaction} = $last_transaction;
1003         $ref->{soll_kumuliert} = $soll_kumuliert * -1;
1004         $ref->{haben_kumuliert} = $haben_kumuliert;
1005       }
1006       $drcr->finish;
1007
1008       if ($form->{project_id}) {
1009
1010         # get DR/CR
1011         do_statement($form, $project_drcr, $q_project_drcr, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno});
1012
1013         ($debit, $credit) = (0, 0);
1014         while (($debit, $credit, $saldo, $haben_kumuliert, $soll_kumuliert, $last_transaction) = $project_drcr->fetchrow_array) {
1015           $ref->{debit}  += $debit;
1016           $ref->{credit} += $credit;
1017           if ($saldo >= 0) {
1018             $ref->{haben_saldo} += $saldo;
1019           } else {
1020             $ref->{soll_saldo} += $saldo * -1;
1021           }
1022           $ref->{soll_kumuliert} += $soll_kumuliert * -1;
1023           $ref->{haben_kumuliert} += $haben_kumuliert;
1024         }
1025         $project_drcr->finish;
1026       }
1027
1028       $ref->{debit}  = $form->round_amount($ref->{debit},  2);
1029       $ref->{credit} = $form->round_amount($ref->{credit}, 2);
1030
1031       if ($ref->{haben_saldo} != 0) {
1032         $ref->{haben_saldo}  = $ref->{haben_saldo} + $ref->{beginning_balance};
1033         if ($ref->{haben_saldo} < 0) {
1034           $ref->{soll_saldo} = $form->round_amount(($ref->{haben_saldo} *- 1), 2);
1035           $ref->{haben_saldo} = 0;
1036         }
1037       } else {
1038         $ref->{soll_saldo} = $ref->{soll_saldo} - $ref->{beginning_balance};
1039         if ($ref->{soll_saldo} < 0) {
1040           $ref->{haben_saldo} = $form->round_amount(($ref->{soll_saldo} * -1), 2);
1041           $ref->{soll_saldo} = 0;
1042         }
1043      }
1044       $ref->{haben_saldo} = $form->round_amount($ref->{haben_saldo}, 2);
1045       $ref->{soll_saldo} = $form->round_amount($ref->{soll_saldo}, 2);
1046       $ref->{haben_kumuliert}  = $form->round_amount($ref->{haben_kumuliert},  2);
1047       $ref->{soll_kumuliert} = $form->round_amount($ref->{soll_kumuliert}, 2);
1048     }
1049
1050     # add subtotal
1051     my @accno;
1052     @accno = grep { $_ le "$ref->{accno}" } @headingaccounts;
1053     $accno = pop @accno;
1054     if ($accno) {
1055       $trb{$accno}{debit}  += $ref->{debit};
1056       $trb{$accno}{credit} += $ref->{credit};
1057       $trb{$accno}{soll_saldo}  += $ref->{soll_saldo};
1058       $trb{$accno}{haben_saldo} += $ref->{haben_saldo};
1059       $trb{$accno}{soll_kumuliert}  += $ref->{soll_kumuliert};
1060       $trb{$accno}{haben_kumuliert} += $ref->{haben_kumuliert};
1061     }
1062
1063     push @{ $form->{TB} }, $ref;
1064
1065   }
1066
1067   $dbh->disconnect;
1068
1069   # debits and credits for headings
1070   foreach my $accno (@headingaccounts) {
1071     foreach $ref (@{ $form->{TB} }) {
1072       if ($accno eq $ref->{accno}) {
1073         $ref->{debit}           = $trb{$accno}{debit};
1074         $ref->{credit}          = $trb{$accno}{credit};
1075         $ref->{soll_saldo}      = $trb{$accno}{soll_saldo};
1076         $ref->{haben_saldo}     = $trb{$accno}{haben_saldo};
1077         $ref->{soll_kumuliert}  = $trb{$accno}{soll_kumuliert};
1078         $ref->{haben_kumuliert} = $trb{$accno}{haben_kumuliert};
1079       }
1080     }
1081   }
1082
1083   $main::lxdebug->leave_sub();
1084 }
1085
1086 sub get_storno {
1087   $main::lxdebug->enter_sub();
1088   my ($self, $dbh, $form) = @_;
1089   my $arap = $form->{arap} eq "ar" ? "ar" : "ap";
1090   my $query = qq|SELECT invnumber FROM $arap WHERE invnumber LIKE "Storno zu "|;
1091   my $sth =  $dbh->prepare($query);
1092   while(my $ref = $sth->fetchrow_hashref()) {
1093     $ref->{invnumer} =~ s/Storno zu //g;
1094     $form->{storno}{$ref->{invnumber}} = 1;
1095   }
1096   $main::lxdebug->leave_sub();
1097 }
1098
1099 sub aging {
1100   $main::lxdebug->enter_sub();
1101
1102   my ($self, $myconfig, $form) = @_;
1103
1104   # connect to database
1105   my $dbh     = $form->dbconnect($myconfig);
1106
1107   my ($invoice, $arap, $buysell, $ct, $ct_id, $ml);
1108
1109   if ($form->{ct} eq "customer") {
1110     $invoice = "is";
1111     $arap = "ar";
1112     $buysell = "buy";
1113     $ct = "customer";
1114     $ml = -1;
1115   } else {
1116     $invoice = "ir";
1117     $arap = "ap";
1118     $buysell = "sell";
1119     $ct = "vendor";
1120     $ml = 1;
1121   }
1122   $ct_id = "${ct}_id";
1123
1124   $form->{todate} = $form->current_date($myconfig) unless ($form->{todate});
1125   my $todate = conv_dateq($form->{todate});
1126   my $fromdate = conv_dateq($form->{fromdate});
1127
1128   my $fromwhere = ($form->{fromdate} ne "") ? " AND (transdate >= (date $fromdate)) " : "";
1129
1130   my $where = " 1 = 1 ";
1131   my ($name, $null);
1132
1133   if ($form->{$ct_id}) {
1134     $where .= qq| AND (ct.id = | . conv_i($form->{$ct_id}) . qq|)|;
1135   } elsif ($form->{ $form->{ct} }) {
1136     $where .= qq| AND (ct.name ILIKE | . $dbh->quote('%' . $form->{$ct} . '%') . qq|)|;
1137   }
1138
1139   my $dpt_join;
1140   if ($form->{department}) {
1141     my ($null, $department_id) = split /--/, $form->{department};
1142     $dpt_join = qq| JOIN department d ON (a.department_id = d.id) |;
1143     $where .= qq| AND (a.department_id = | . conv_i($department_id, 'NULL') . qq|)|;
1144   }
1145
1146   my $q_details = qq|
1147     -- between 0-30 days
1148
1149     SELECT ${ct}.id AS ctid, ${ct}.name,
1150       street, zipcode, city, country, contact, email,
1151       phone as customerphone, fax as customerfax, ${ct}number,
1152       "invnumber", "transdate",
1153       (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",
1154       "duedate", invoice, ${arap}.id,
1155       (SELECT $buysell
1156        FROM exchangerate
1157        WHERE (${arap}.curr = exchangerate.curr)
1158          AND (exchangerate.transdate = ${arap}.transdate)) AS exchangerate
1159     FROM ${arap}, ${ct}
1160     WHERE ((paid != amount) OR (datepaid > (date $todate) AND datepaid is not null))
1161       AND (${arap}.storno IS FALSE)
1162       AND (${arap}.${ct}_id = ${ct}.id)
1163       AND (${ct}.id = ?)
1164       AND (transdate <= (date $todate) $fromwhere )
1165
1166     ORDER BY ctid, transdate, invnumber |;
1167
1168   my $sth_details = prepare_query($form, $dbh, $q_details);
1169
1170   # select outstanding vendors or customers, depends on $ct
1171   my $query =
1172     qq|SELECT DISTINCT ct.id, ct.name
1173        FROM $ct ct, $arap a
1174        $dpt_join
1175        WHERE $where
1176          AND (a.${ct_id} = ct.id)
1177          AND ((a.paid != a.amount) OR ((a.datepaid > $todate) AND (datepaid is NOT NULL)))
1178          AND (a.transdate <= $todate $fromwhere)
1179        ORDER BY ct.name|;
1180
1181   my $sth = prepare_execute_query($form, $dbh, $query);
1182
1183   $form->{AG} = [];
1184   # for each company that has some stuff outstanding
1185   while (my ($id) = $sth->fetchrow_array) {
1186     do_statement($form, $sth_details, $q_details, $id);
1187
1188     while (my $ref = $sth_details->fetchrow_hashref("NAME_lc")) {
1189       $ref->{module} = ($ref->{invoice}) ? $invoice : $arap;
1190       $ref->{exchangerate} = 1 unless $ref->{exchangerate};
1191       push @{ $form->{AG} }, $ref;
1192     }
1193
1194     $sth_details->finish;
1195
1196   }
1197
1198   $sth->finish;
1199
1200   # disconnect
1201   $dbh->disconnect;
1202
1203   $main::lxdebug->leave_sub();
1204 }
1205
1206 sub get_customer {
1207   $main::lxdebug->enter_sub();
1208
1209   my ($self, $myconfig, $form) = @_;
1210
1211   # connect to database
1212   my $dbh = $form->dbconnect($myconfig);
1213
1214   my $ct = $form->{ct} eq "customer" ? "customer" : "vendor";
1215
1216   my $query =
1217     qq|SELECT ct.name, ct.email, ct.cc, ct.bcc
1218        FROM $ct ct
1219        WHERE ct.id = ?|;
1220   ($form->{ $form->{ct} }, $form->{email}, $form->{cc}, $form->{bcc}) =
1221     selectrow_query($form, $dbh, $query, $form->{"${ct}_id"});
1222   $dbh->disconnect;
1223
1224   $main::lxdebug->leave_sub();
1225 }
1226
1227 sub get_taxaccounts {
1228   $main::lxdebug->enter_sub();
1229
1230   my ($self, $myconfig, $form) = @_;
1231
1232   # connect to database
1233   my $dbh = $form->dbconnect($myconfig);
1234
1235   # get tax accounts
1236   my $query =
1237     qq|SELECT c.accno, c.description, t.rate
1238        FROM chart c, tax t
1239        WHERE (c.link LIKE '%CT_tax%') AND (c.id = t.chart_id)
1240        ORDER BY c.accno|;
1241   $form->{taxaccounts} = selectall_hashref_quert($form, $dbh, $query);
1242
1243   $dbh->disconnect;
1244
1245   $main::lxdebug->leave_sub();
1246 }
1247
1248 sub tax_report {
1249   $main::lxdebug->enter_sub();
1250
1251   my ($self, $myconfig, $form) = @_;
1252
1253   # connect to database
1254   my $dbh = $form->dbconnect($myconfig);
1255
1256   my ($null, $department_id) = split /--/, $form->{department};
1257
1258   # build WHERE
1259   my $where = "1 = 1";
1260
1261   if ($department_id) {
1262     $where .= qq| AND (a.department_id = | . conv_i($department_id, 'NULL') . qq|) |;
1263   }
1264
1265   my ($accno, $rate);
1266
1267   if ($form->{accno}) {
1268     $accno = $form->{accno};
1269     $rate  = $form->{"$form->{accno}_rate"};
1270     $accno = qq| AND (ch.accno = | . $dbh->quote($accno) . qq|)|;
1271   }
1272   $rate *= 1;
1273
1274   my ($table, $ARAP);
1275
1276   if ($form->{db} eq 'ar') {
1277     $table = "customer";
1278     $ARAP  = "AR";
1279   } else {
1280     $table = "vendor";
1281     $ARAP  = "AP";
1282   }
1283
1284   my $arap = lc($ARAP);
1285
1286   my $transdate = "a.transdate";
1287
1288   if ($form->{method} eq 'cash') {
1289     $transdate = "a.datepaid";
1290
1291     my $todate = conv_dateq($form->{todate} ? $form->{todate} : $form->current_date($myconfig));
1292
1293     $where .= qq|
1294       AND ac.trans_id IN
1295         (
1296           SELECT trans_id
1297           FROM acc_trans
1298           JOIN chart ON (chart_id = id)
1299           WHERE (link LIKE '%${ARAP}_paid%')
1300           AND (transdate <= $todate)
1301         )
1302       |;
1303   }
1304
1305   # if there are any dates construct a where
1306   $where .= " AND ($transdate >= " . conv_dateq($form->{fromdate}) . ") " if ($form->{fromdate});
1307   $where .= " AND ($transdate <= " . conv_dateq($form->{todate}) . ") " if ($form->{todate});
1308
1309   my $ml = ($form->{db} eq 'ar') ? 1 : -1;
1310
1311   my $sortorder = join ', ', $form->sort_columns(qw(transdate invnumber name));
1312   $sortorder = $form->{sort} if ($form->{sort} && grep({ $_ eq $form->{sort} } qw(id transdate invnumber name netamount tax)));
1313
1314   my $query = '';
1315   if ($form->{report} !~ /nontaxable/) {
1316     $query =
1317       qq|SELECT a.id, '0' AS invoice, $transdate AS transdate, a.invnumber, n.name, a.netamount,
1318           ac.amount * $ml AS tax
1319          FROM acc_trans ac
1320          JOIN ${arap} a ON (a.id = ac.trans_id)
1321          JOIN chart ch ON (ch.id = ac.chart_id)
1322          JOIN $table n ON (n.id = a.${table}_id)
1323          WHERE
1324            $where
1325            $accno
1326            AND (a.invoice = '0')
1327
1328          UNION
1329
1330          SELECT a.id, '1' AS invoice, $transdate AS transdate, a.invnumber, n.name, i.sellprice * i.qty AS netamount,
1331            i.sellprice * i.qty * $rate * $ml AS tax
1332          FROM acc_trans ac
1333          JOIN ${arap} a ON (a.id = ac.trans_id)
1334          JOIN chart ch ON (ch.id = ac.chart_id)
1335          JOIN $table n ON (n.id = a.${table}_id)
1336          JOIN ${table}tax t ON (t.${table}_id = n.id)
1337          JOIN invoice i ON (i.trans_id = a.id)
1338          JOIN partstax p ON (p.parts_id = i.parts_id)
1339          WHERE
1340            $where
1341            $accno
1342            AND (a.invoice = '1')
1343          ORDER BY $sortorder|;
1344   } else {
1345     # only gather up non-taxable transactions
1346     $query =
1347       qq|SELECT a.id, '0' AS invoice, $transdate AS transdate, a.invnumber, n.name, a.netamount
1348          FROM acc_trans ac
1349          JOIN ${arap} a ON (a.id = ac.trans_id)
1350          JOIN $table n ON (n.id = a.${table}_id)
1351          WHERE
1352            $where
1353            AND (a.invoice = '0')
1354            AND (a.netamount = a.amount)
1355
1356          UNION
1357
1358          SELECT a.id, '1' AS invoice, $transdate AS transdate, a.invnumber, n.name, i.sellprice * i.qty AS netamount
1359          FROM acc_trans ac
1360          JOIN ${arap} a ON (a.id = ac.trans_id)
1361          JOIN $table n ON (n.id = a.${table}_id)
1362          JOIN invoice i ON (i.trans_id = a.id)
1363          WHERE
1364            $where
1365            AND (a.invoice = '1')
1366            AND (
1367              a.${table}_id NOT IN (SELECT ${table}_id FROM ${table}tax t (${table}_id))
1368              OR
1369              i.parts_id NOT IN (SELECT parts_id FROM partstax p (parts_id))
1370            )
1371          GROUP BY a.id, a.invnumber, $transdate, n.name, i.sellprice, i.qty
1372          ORDER by $sortorder|;
1373   }
1374
1375   $form->{TR} = selectall_hashref_query($form, $dbh, $query);
1376
1377   $dbh->disconnect;
1378
1379   $main::lxdebug->leave_sub();
1380 }
1381
1382 sub paymentaccounts {
1383   $main::lxdebug->enter_sub();
1384
1385   my ($self, $myconfig, $form) = @_;
1386
1387   # connect to database, turn AutoCommit off
1388   my $dbh = $form->dbconnect_noauto($myconfig);
1389
1390   my $ARAP = $form->{db} eq "ar" ? "AR" : "AP";
1391
1392   # get A(R|P)_paid accounts
1393   my $query =
1394     qq|SELECT accno, description
1395        FROM chart
1396        WHERE link LIKE '%${ARAP}_paid%'|;
1397   $form->{PR} = selectall_hashref_query($form, $dbh, $query);
1398
1399   $dbh->disconnect;
1400
1401   $main::lxdebug->leave_sub();
1402 }
1403
1404 sub payments {
1405   $main::lxdebug->enter_sub();
1406
1407   my ($self, $myconfig, $form) = @_;
1408
1409   # connect to database, turn AutoCommit off
1410   my $dbh = $form->dbconnect_noauto($myconfig);
1411
1412   my $ml = 1;
1413   my $arap;
1414   my $table;
1415   if ($form->{db} eq 'ar') {
1416     $table = 'customer';
1417     $ml = -1;
1418     $arap = 'ar';
1419   } else {
1420     $table = 'vendor';
1421     $arap = 'ap';
1422   }
1423
1424   my ($query, $sth);
1425   my $dpt_join;
1426   my $where;
1427
1428   if ($form->{department_id}) {
1429     $dpt_join = qq| JOIN dpt_trans t ON (t.trans_id = ac.trans_id) |;
1430     $where = qq| AND (t.department_id = | . conv_i($form->{department_id}, 'NULL') . qq|) |;
1431   }
1432
1433   if ($form->{fromdate}) {
1434     $where .= " AND (ac.transdate >= " . $dbh->quote($form->{fromdate}) . ") ";
1435   }
1436   if ($form->{todate}) {
1437     $where .= " AND (ac.transdate <= " . $dbh->quote($form->{todate}) . ") ";
1438   }
1439   if (!$form->{fx_transaction}) {
1440     $where .= " AND ac.fx_transaction = '0'";
1441   }
1442
1443   my $invnumber;
1444   my $reference;
1445   if ($form->{reference}) {
1446     $reference = $dbh->quote('%' . $form->{reference} . '%');
1447     $invnumber = " AND (a.invnumber LIKE $reference)";
1448     $reference = " AND (g.reference LIKE $reference)";
1449   }
1450   if ($form->{source}) {
1451     $where .= " AND (ac.source ILIKE " . $dbh->quote('%' . $form->{source} . '%') . ") ";
1452   }
1453   if ($form->{memo}) {
1454     $where .= " AND (ac.memo ILIKE " . $dbh->quote('%' . $form->{memo} . '%') . ") ";
1455   }
1456
1457   my %sort_columns =  (
1458     'transdate'    => [ qw(transdate lower_invnumber lower_name) ],
1459     'invnumber'    => [ qw(lower_invnumber lower_name transdate) ],
1460     'name'         => [ qw(lower_name transdate)                 ],
1461     'source'       => [ qw(lower_source)                         ],
1462     'memo'         => [ qw(lower_memo)                           ],
1463     );
1464   my %lowered_columns =  (
1465     'invnumber'       => { 'gl' => 'g.reference',   'arap' => 'a.invnumber', },
1466     'memo'            => { 'gl' => 'ac.memo',       'arap' => 'ac.memo',     },
1467     'source'          => { 'gl' => 'ac.source',     'arap' => 'ac.source',   },
1468     'name'            => { 'gl' => 'g.description', 'arap' => 'c.name',      },
1469     );
1470
1471   my $sortdir   = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC';
1472   my $sortkey   = $sort_columns{$form->{sort}} ? $form->{sort} : 'transdate';
1473   my $sortorder = join ', ', map { "$_ $sortdir" } @{ $sort_columns{$sortkey} };
1474
1475
1476   my %columns_for_sorting = ( 'gl' => '', 'arap' => '', );
1477   foreach my $spec (@{ $sort_columns{$sortkey} }) {
1478     next if ($spec !~ m/^lower_(.*)$/);
1479
1480     my $column = $1;
1481     map { $columns_for_sorting{$_} .= sprintf(', lower(%s) AS lower_%s', $lowered_columns{$column}->{$_}, $column) } qw(gl arap);
1482   }
1483
1484   $query = qq|SELECT id, accno, description FROM chart WHERE accno = ?|;
1485   $sth = prepare_query($form, $dbh, $query);
1486
1487   my $q_details =
1488       qq|SELECT c.name, a.invnumber, a.ordnumber,
1489            ac.transdate, ac.amount * $ml AS paid, ac.source,
1490            a.invoice, a.id, ac.memo, '${arap}' AS module
1491            $columns_for_sorting{arap}
1492          FROM acc_trans ac
1493          JOIN $arap a ON (ac.trans_id = a.id)
1494          JOIN $table c ON (c.id = a.${table}_id)
1495          $dpt_join
1496          WHERE (ac.chart_id = ?)
1497            $where
1498            $invnumber
1499
1500          UNION
1501
1502          SELECT g.description, g.reference, NULL AS ordnumber,
1503            ac.transdate, ac.amount * $ml AS paid, ac.source,
1504            '0' as invoice, g.id, ac.memo, 'gl' AS module
1505            $columns_for_sorting{gl}
1506          FROM acc_trans ac
1507          JOIN gl g ON (g.id = ac.trans_id)
1508          $dpt_join
1509          WHERE (ac.chart_id = ?)
1510            $where
1511            $reference
1512            AND (ac.amount * $ml) > 0
1513
1514          ORDER BY $sortorder|;
1515   my $sth_details = prepare_query($form, $dbh, $q_details);
1516
1517   $form->{PR} = [];
1518
1519   # cycle through each id
1520   foreach my $accno (split(/ /, $form->{paymentaccounts})) {
1521     do_statement($form, $sth, $query, $accno);
1522     my $ref = $sth->fetchrow_hashref();
1523     push(@{ $form->{PR} }, $ref);
1524     $sth->finish();
1525
1526     $form->{ $ref->{id} } = [] unless ($form->{ $ref->{id} });
1527
1528     do_statement($form, $sth_details, $q_details, $ref->{id}, $ref->{id});
1529     while (my $pr = $sth_details->fetchrow_hashref()) {
1530       push(@{ $form->{ $ref->{id} } }, $pr);
1531     }
1532     $sth_details->finish();
1533   }
1534
1535   $dbh->disconnect;
1536
1537   $main::lxdebug->leave_sub();
1538 }
1539
1540 sub bwa {
1541   $main::lxdebug->enter_sub();
1542
1543   my ($self, $myconfig, $form) = @_;
1544
1545   # connect to database
1546   my $dbh = $form->dbconnect($myconfig);
1547
1548   my $last_period = 0;
1549   my $category;
1550   my @categories  =
1551     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);
1552
1553   $form->{decimalplaces} *= 1;
1554
1555   &get_accounts_g($dbh, $last_period, $form->{fromdate}, $form->{todate}, $form, "pos_bwa");
1556
1557   # if there are any compare dates
1558   my $year;
1559   if ($form->{fromdate} || $form->{todate}) {
1560     $last_period = 1;
1561     if ($form->{fromdate}) {
1562       $form->{fromdate} =~ /[0-9]*\.[0-9]*\.([0-9]*)/;
1563       $year = $1;
1564     } else {
1565       $form->{todate} =~ /[0-9]*\.[0-9]*\.([0-9]*)/;
1566       $year = $1;
1567     }
1568     my $kummfromdate = $form->{comparefromdate};
1569     my $kummtodate   = $form->{comparetodate};
1570     &get_accounts_g($dbh, $last_period, $kummfromdate, $kummtodate, $form, "pos_bwa");
1571   }
1572
1573   my @periods        = qw(jetzt kumm);
1574   my @gesamtleistung = qw(1 3);
1575   my @gesamtkosten   = qw (10 11 12 13 14 15 16 17 18 19 20);
1576   my @ergebnisse     =
1577     qw (rohertrag betriebrohertrag betriebsergebnis neutraleraufwand neutralerertrag ergebnisvorsteuern ergebnis gesamtleistung gesamtkosten);
1578
1579   foreach my $key (@periods) {
1580     $form->{ "$key" . "gesamtleistung" } = 0;
1581     $form->{ "$key" . "gesamtkosten" }   = 0;
1582
1583     foreach $category (@categories) {
1584
1585       if (defined($form->{$category}{$key})) {
1586         $form->{"$key$category"} =
1587           $form->format_amount($myconfig,
1588                                $form->round_amount($form->{$category}{$key}, 2
1589                                ),
1590                                $form->{decimalplaces},
1591                                '0');
1592       }
1593     }
1594     foreach my $item (@gesamtleistung) {
1595       $form->{ "$key" . "gesamtleistung" } += $form->{$item}{$key};
1596     }
1597     $form->{ "$key" . "gesamtleistung" } -= $form->{2}{$key};
1598
1599     foreach my $item (@gesamtkosten) {
1600       $form->{ "$key" . "gesamtkosten" } += $form->{$item}{$key};
1601     }
1602     $form->{ "$key" . "rohertrag" } =
1603       $form->{ "$key" . "gesamtleistung" } - $form->{4}{$key};
1604     $form->{ "$key" . "betriebrohertrag" } =
1605       $form->{ "$key" . "rohertrag" } + $form->{5}{$key};
1606     $form->{ "$key" . "betriebsergebnis" } =
1607       $form->{ "$key" . "betriebrohertrag" } -
1608       $form->{ "$key" . "gesamtkosten" };
1609     $form->{ "$key" . "neutraleraufwand" } =
1610       $form->{30}{$key} + $form->{31}{$key};
1611     $form->{ "$key" . "neutralertrag" } =
1612       $form->{32}{$key} + $form->{33}{$key} + $form->{34}{$key};
1613     $form->{ "$key" . "ergebnisvorsteuern" } =
1614       $form->{ "$key" . "betriebsergebnis" } -
1615       $form->{ "$key" . "neutraleraufwand" } +
1616       $form->{ "$key" . "neutralertrag" };
1617     $form->{ "$key" . "ergebnis" } =
1618       $form->{ "$key" . "ergebnisvorsteuern" } - $form->{35}{$key};
1619
1620     if ($form->{ "$key" . "gesamtleistung" } > 0) {
1621       foreach $category (@categories) {
1622         if (defined($form->{$category}{$key})) {
1623           $form->{ "$key" . "gl" . "$category" } =
1624             $form->format_amount(
1625                                $myconfig,
1626                                $form->round_amount(
1627                                  ($form->{$category}{$key} /
1628                                     $form->{ "$key" . "gesamtleistung" } * 100
1629                                  ),
1630                                  $form->{decimalplaces}
1631                                ),
1632                                $form->{decimalplaces},
1633                                '0');
1634         }
1635       }
1636       foreach my $item (@ergebnisse) {
1637         $form->{ "$key" . "gl" . "$item" } =
1638           $form->format_amount($myconfig,
1639                                $form->round_amount(
1640                                  ( $form->{ "$key" . "$item" } /
1641                                      $form->{ "$key" . "gesamtleistung" } * 100
1642                                  ),
1643                                  $form->{decimalplaces}
1644                                ),
1645                                $form->{decimalplaces},
1646                                '0');
1647       }
1648     }
1649
1650     if ($form->{ "$key" . "gesamtkosten" } > 0) {
1651       foreach $category (@categories) {
1652         if (defined($form->{$category}{$key})) {
1653           $form->{ "$key" . "gk" . "$category" } =
1654             $form->format_amount($myconfig,
1655                                  $form->round_amount(
1656                                    ($form->{$category}{$key} /
1657                                       $form->{ "$key" . "gesamtkosten" } * 100
1658                                    ),
1659                                    $form->{decimalplaces}
1660                                  ),
1661                                  $form->{decimalplaces},
1662                                  '0');
1663         }
1664       }
1665       foreach my $item (@ergebnisse) {
1666         $form->{ "$key" . "gk" . "$item" } =
1667           $form->format_amount($myconfig,
1668                                $form->round_amount(
1669                                    ($form->{ "$key" . "$item" } /
1670                                       $form->{ "$key" . "gesamtkosten" } * 100
1671                                    ),
1672                                    $form->{decimalplaces}
1673                                ),
1674                                $form->{decimalplaces},
1675                                '0');
1676       }
1677     }
1678
1679     if ($form->{10}{$key} > 0) {
1680       foreach $category (@categories) {
1681         if (defined($form->{$category}{$key})) {
1682           $form->{ "$key" . "pk" . "$category" } =
1683             $form->format_amount(
1684                         $myconfig,
1685                         $form->round_amount(
1686                           ($form->{$category}{$key} / $form->{10}{$key} * 100),
1687                           $form->{decimalplaces}
1688                         ),
1689                         $form->{decimalplaces},
1690                         '0');
1691         }
1692       }
1693       foreach my $item (@ergebnisse) {
1694         $form->{ "$key" . "pk" . "$item" } =
1695           $form->format_amount($myconfig,
1696                                $form->round_amount(
1697                                                 ($form->{ "$key" . "$item" } /
1698                                                    $form->{10}{$key} * 100
1699                                                 ),
1700                                                 $form->{decimalplaces}
1701                                ),
1702                                $form->{decimalplaces},
1703                                '0');
1704       }
1705     }
1706
1707     if ($form->{4}{$key} > 0) {
1708       foreach $category (@categories) {
1709         if (defined($form->{$category}{$key})) {
1710           $form->{ "$key" . "auf" . "$category" } =
1711             $form->format_amount(
1712                          $myconfig,
1713                          $form->round_amount(
1714                            ($form->{$category}{$key} / $form->{4}{$key} * 100),
1715                            $form->{decimalplaces}
1716                          ),
1717                          $form->{decimalplaces},
1718                          '0');
1719         }
1720       }
1721       foreach my $item (@ergebnisse) {
1722         $form->{ "$key" . "auf" . "$item" } =
1723           $form->format_amount($myconfig,
1724                                $form->round_amount(
1725                                                 ($form->{ "$key" . "$item" } /
1726                                                    $form->{4}{$key} * 100
1727                                                 ),
1728                                                 $form->{decimalplaces}
1729                                ),
1730                                $form->{decimalplaces},
1731                                '0');
1732       }
1733     }
1734
1735     foreach my $item (@ergebnisse) {
1736       $form->{ "$key" . "$item" } =
1737         $form->format_amount($myconfig,
1738                              $form->round_amount($form->{ "$key" . "$item" },
1739                                                  $form->{decimalplaces}
1740                              ),
1741                              $form->{decimalplaces},
1742                              '0');
1743     }
1744
1745   }
1746   $dbh->disconnect;
1747
1748   $main::lxdebug->leave_sub();
1749 }
1750
1751 sub ustva {
1752   $main::lxdebug->enter_sub();
1753
1754   my ($self, $myconfig, $form) = @_;
1755
1756   # connect to database
1757   my $dbh = $form->dbconnect($myconfig);
1758
1759   my $last_period     = 0;
1760   my @categories_cent = qw(51r 511 86r 861 97r 971 93r 931
1761     96 66 43 45 53 62 65 67);
1762   my @categories_euro = qw(48 51 86 91 97 93 94);
1763   $form->{decimalplaces} *= 1;
1764
1765   foreach my $item (@categories_cent) {
1766     $form->{"$item"} = 0;
1767   }
1768   foreach my $item (@categories_euro) {
1769     $form->{"$item"} = 0;
1770   }
1771
1772   &get_accounts_g($dbh, $last_period, $form->{fromdate}, $form->{todate}, $form, "pos_ustva");
1773
1774   #   foreach $item (@categories_cent) {
1775   #     if ($form->{$item}{"jetzt"} > 0) {
1776   #             $form->{$item} = $form->{$item}{"jetzt"};
1777   #             delete $form->{$item}{"jetzt"};
1778   #     }
1779   #   }
1780   #   foreach $item (@categories_euro) {
1781   #     if ($form->{$item}{"jetzt"} > 0) {
1782   #             $form->{$item} = $form->{$item}{"jetzt"};
1783   #             delete $form->{$item}{"jetzt"};
1784   #     }  foreach $item (@categories_cent) {
1785   #     if ($form->{$item}{"jetzt"} > 0) {
1786   #             $form->{$item} = $form->{$item}{"jetzt"};
1787   #             delete $form->{$item}{"jetzt"};
1788   #     }
1789   #   }
1790   #   foreach $item (@categories_euro) {
1791   #     if ($form->{$item}{"jetzt"} > 0) {
1792   #             $form->{$item} = $form->{$item}{"jetzt"};
1793   #             delete $form->{$item}{"jetzt"};
1794   #     }
1795   #   }
1796   #
1797   #    }
1798
1799   #
1800   # Berechnung der USTVA Formularfelder
1801   #
1802   $form->{"51r"} = $form->{"511"};
1803   $form->{"86r"} = $form->{"861"};
1804   $form->{"97r"} = $form->{"971"};
1805   $form->{"93r"} = $form->{"931"};
1806
1807   #$form->{"96"}  = $form->{"94"} * 0.16;
1808   $form->{"43"} =
1809     $form->{"51r"} + $form->{"86r"} + $form->{"97r"} + $form->{"93r"} +
1810     $form->{"96"};
1811   $form->{"45"} = $form->{"43"};
1812   $form->{"53"} = $form->{"43"};
1813   $form->{"62"} = $form->{"43"} - $form->{"66"};
1814   $form->{"65"} = $form->{"43"} - $form->{"66"};
1815   $form->{"67"} = $form->{"43"} - $form->{"66"};
1816
1817   foreach my $item (@categories_cent) {
1818     $form->{$item} =
1819       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2),
1820                            2, '0');
1821   }
1822
1823   foreach my $item (@categories_euro) {
1824     $form->{$item} =
1825       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 0),
1826                            0, '0');
1827   }
1828
1829   $dbh->disconnect;
1830
1831   $main::lxdebug->leave_sub();
1832 }
1833
1834 sub income_statement {
1835   $main::lxdebug->enter_sub();
1836
1837   my ($self, $myconfig, $form) = @_;
1838
1839   # connect to database
1840   my $dbh = $form->dbconnect($myconfig);
1841
1842   my $last_period          = 0;
1843   my @categories_einnahmen = qw(1 2 3 4 5 6 7);
1844   my @categories_ausgaben  =
1845     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);
1846
1847   my @ergebnisse = qw(sumeura sumeurb guvsumme);
1848
1849   $form->{decimalplaces} *= 1;
1850
1851
1852
1853   &get_accounts_g($dbh, $last_period, $form->{fromdate}, $form->{todate},
1854                   $form, "pos_eur");
1855
1856
1857   foreach my $item (@categories_einnahmen) {
1858     $form->{"eur${item}"} =
1859       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2),2);
1860     $form->{"sumeura"} += $form->{$item};
1861   }
1862   foreach my $item (@categories_ausgaben) {
1863     $form->{"eur${item}"} =
1864       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2),2);
1865     $form->{"sumeurb"} += $form->{$item};
1866   }
1867
1868   $form->{"guvsumme"} = $form->{"sumeura"} - $form->{"sumeurb"};
1869
1870   foreach my $item (@ergebnisse) {
1871     $form->{$item} =
1872       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2),2);
1873   }
1874   $main::lxdebug->leave_sub();
1875 }
1876 1;