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