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