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