Überbleibsel von der Unterstützung für html2ps entfernt.
[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 ((select date_trunc('year', ac.transdate::date)) = (select date_trunc('year', ?::date))) AND ac.ob_transaction 
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 transdate>=(select date_trunc('year', date $fromdate))  ";
869       $invwhere .= " AND (a.transdate >= $fromdate)";
870       $glsaldowhere .= " AND ac.transdate>=(select date_trunc('year', date $fromdate)) ";
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 . " AND (NOT ac.ob_transaction OR ac.ob_transaction IS NULL) AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL)";
969     $saldowhere .= $glsaldowhere . " AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL)";
970     $sumwhere .= $glsumwhere . " AND (NOT ac.ob_transaction OR ac.ob_transaction IS NULL) AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL)";
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
1163   my ($debit, $credit, $saldo, $soll_saldo, $haben_saldo,$soll_kummuliert, $haben_kummuliert, $last_transaction);
1164
1165   foreach my $accno (sort keys %trb) {
1166     $ref = {};
1167
1168     $ref->{accno} = $accno;
1169     map { $ref->{$_} = $trb{$accno}{$_} }
1170       qw(description category charttype amount soll_eb haben_eb);
1171
1172     $ref->{balance} = $form->round_amount($balance{ $ref->{accno} }, 2);
1173
1174     if ($trb{$accno}{charttype} eq 'A') {
1175
1176       # get DR/CR
1177       do_statement($form, $drcr, $q_drcr, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno});
1178
1179       ($debit, $credit, $saldo, $haben_saldo, $soll_saldo, $soll_kumuliert, $haben_kumuliert) = (0, 0, 0, 0, 0, 0, 0);
1180       $last_transaction = "";
1181       while (($debit, $credit, $saldo, $haben_kumuliert, $soll_kumuliert, $last_transaction) = $drcr->fetchrow_array) {
1182         $ref->{debit}  += $debit;
1183         $ref->{credit} += $credit;
1184         if ($saldo >= 0) {
1185           $ref->{haben_saldo} += $saldo;
1186         } else {
1187           $ref->{soll_saldo} += $saldo * -1;
1188         }
1189         $ref->{last_transaction} = $last_transaction;
1190         $ref->{soll_kumuliert} = $soll_kumuliert * -1;
1191         $ref->{haben_kumuliert} = $haben_kumuliert;
1192       }
1193       $drcr->finish;
1194
1195       if ($form->{project_id}) {
1196
1197         # get DR/CR
1198         do_statement($form, $project_drcr, $q_project_drcr, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno});
1199
1200         ($debit, $credit) = (0, 0);
1201         while (($debit, $credit, $saldo, $haben_kumuliert, $soll_kumuliert, $last_transaction) = $project_drcr->fetchrow_array) {
1202           $ref->{debit}  += $debit;
1203           $ref->{credit} += $credit;
1204           if ($saldo >= 0) {
1205             $ref->{haben_saldo} += $saldo;
1206           } else {
1207             $ref->{soll_saldo} += $saldo * -1;
1208           }
1209           $ref->{soll_kumuliert} += $soll_kumuliert * -1;
1210           $ref->{haben_kumuliert} += $haben_kumuliert;
1211         }
1212         $project_drcr->finish;
1213       }
1214
1215       $ref->{debit}  = $form->round_amount($ref->{debit},  2);
1216       $ref->{credit} = $form->round_amount($ref->{credit}, 2);
1217       $ref->{haben_saldo}  = $form->round_amount($ref->{haben_saldo},  2);
1218       $ref->{soll_saldo} = $form->round_amount($ref->{soll_saldo}, 2);
1219       $ref->{haben_kumuliert}  = $form->round_amount($ref->{haben_kumuliert},  2);
1220       $ref->{soll_kumuliert} = $form->round_amount($ref->{soll_kumuliert}, 2);
1221     }
1222
1223     # add subtotal
1224     @accno = grep { $_ le "$ref->{accno}" } @headingaccounts;
1225     $accno = pop @accno;
1226     if ($accno) {
1227       $trb{$accno}{debit}  += $ref->{debit};
1228       $trb{$accno}{credit} += $ref->{credit};
1229       $trb{$accno}{soll_saldo}  += $ref->{soll_saldo};
1230       $trb{$accno}{haben_saldo} += $ref->{haben_saldo};
1231       $trb{$accno}{soll_kumuliert}  += $ref->{soll_kumuliert};
1232       $trb{$accno}{haben_kumuliert} += $ref->{haben_kumuliert};
1233     }
1234
1235     push @{ $form->{TB} }, $ref;
1236
1237   }
1238
1239   $dbh->disconnect;
1240
1241   # debits and credits for headings
1242   foreach $accno (@headingaccounts) {
1243     foreach $ref (@{ $form->{TB} }) {
1244       if ($accno eq $ref->{accno}) {
1245         $ref->{debit}  = $trb{$accno}{debit};
1246         $ref->{credit} = $trb{$accno}{credit};
1247         $ref->{soll_saldo}  = $trb{$accno}{soll_saldo};
1248         $ref->{haben_saldo} = $trb{$accno}{haben_saldo};
1249         $ref->{soll_kumuliert}  = $trb{$accno}{soll_kumuliert};
1250         $ref->{haben_kumuliert} = $trb{$accno}{haben_kumuliert};      }
1251     }
1252   }
1253
1254   $main::lxdebug->leave_sub();
1255 }
1256
1257 sub get_storno {
1258   $main::lxdebug->enter_sub();
1259   my ($self, $dbh, $form) = @_;
1260   my $arap = $form->{arap} eq "ar" ? "ar" : "ap";
1261   my $query = qq|SELECT invnumber FROM $arap WHERE invnumber LIKE "Storno zu "|;
1262   my $sth =  $dbh->prepare($query);
1263   while(my $ref = $sth->fetchrow_hashref()) {
1264     $ref->{invnumer} =~ s/Storno zu //g;
1265     $form->{storno}{$ref->{invnumber}} = 1;
1266   }
1267   $main::lxdebug->leave_sub();
1268 }
1269
1270 sub aging {
1271   $main::lxdebug->enter_sub();
1272
1273   my ($self, $myconfig, $form) = @_;
1274
1275   # connect to database
1276   my $dbh     = $form->dbconnect($myconfig);
1277
1278   my ($invoice, $arap, $buysell, $ct, $ct_id, $ml);
1279
1280   if ($form->{ct} eq "customer") {
1281     $invoice = "is";
1282     $arap = "ar";
1283     $buysell = "buy";
1284     $ct = "customer";
1285     $ml = -1;
1286   } else {
1287     $invoice = "ir";
1288     $arap = "ap";
1289     $buysell = "sell";
1290     $ct = "vendor";
1291     $ml = 1;
1292   }
1293   $ct_id = "${ct}_id";
1294
1295   $form->{todate} = $form->current_date($myconfig) unless ($form->{todate});
1296   my $todate = conv_dateq($form->{todate});
1297
1298   my $where = " 1 = 1 ";
1299   my ($name, $null);
1300
1301   if ($form->{$ct_id}) {
1302     $where .= qq| AND (ct.id = | . conv_i($form->{$ct_id}) . qq|)|;
1303   } elsif ($form->{ $form->{ct} }) {
1304     $where .= qq| AND (ct.name ILIKE | . $dbh->quote('%' . $form->{$ct} . '%') . qq|)|;
1305   }
1306
1307   my $dpt_join;
1308   if ($form->{department}) {
1309     ($null, $department_id) = split /--/, $form->{department};
1310     $dpt_join = qq| JOIN department d ON (a.department_id = d.id) |;
1311     $where .= qq| AND (a.department_id = | . conv_i($department_id, 'NULL') . qq|)|;
1312   }
1313
1314   my $q_details = qq|
1315     -- between 0-30 days
1316
1317     SELECT ${ct}.id AS ctid, ${ct}.name,
1318       street, zipcode, city, country, contact, email,
1319       phone as customerphone, fax as customerfax, ${ct}number,
1320       "invnumber", "transdate",
1321       (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",
1322       "duedate", invoice, ${arap}.id,
1323       (SELECT $buysell
1324        FROM exchangerate
1325        WHERE (${arap}.curr = exchangerate.curr)
1326          AND (exchangerate.transdate = ${arap}.transdate)) AS exchangerate
1327     FROM ${arap}, ${ct}
1328     WHERE ((paid != amount) OR (datepaid > (date $todate) AND datepaid is not null))
1329       AND (${arap}.storno IS FALSE)
1330       AND (${arap}.${ct}_id = ${ct}.id)
1331       AND (${ct}.id = ?)
1332       AND (transdate <= (date $todate))
1333
1334     ORDER BY ctid, transdate, invnumber |;
1335
1336   my $sth_details = prepare_query($form, $dbh, $q_details);
1337
1338   # select outstanding vendors or customers, depends on $ct
1339   my $query =
1340     qq|SELECT DISTINCT ct.id, ct.name
1341        FROM $ct ct, $arap a
1342        $dpt_join
1343        WHERE $where
1344          AND (a.${ct_id} = ct.id)
1345          AND (a.paid != a.amount)
1346          AND (a.transdate <= $todate)
1347        ORDER BY ct.name|;
1348
1349   my $sth = prepare_execute_query($form, $dbh, $query);
1350
1351   $form->{AG} = [];
1352   # for each company that has some stuff outstanding
1353   while (my ($id) = $sth->fetchrow_array) {
1354     do_statement($form, $sth_details, $q_details, $id);
1355
1356     while (my $ref = $sth_details->fetchrow_hashref(NAME_lc)) {
1357       $ref->{module} = ($ref->{invoice}) ? $invoice : $arap;
1358       $ref->{exchangerate} = 1 unless $ref->{exchangerate};
1359       push @{ $form->{AG} }, $ref;
1360     }
1361
1362     $sth_details->finish;
1363
1364   }
1365
1366   $sth->finish;
1367
1368   # disconnect
1369   $dbh->disconnect;
1370
1371   $main::lxdebug->leave_sub();
1372 }
1373
1374 sub get_customer {
1375   $main::lxdebug->enter_sub();
1376
1377   my ($self, $myconfig, $form) = @_;
1378
1379   # connect to database
1380   my $dbh = $form->dbconnect($myconfig);
1381
1382   my $ct = $form->{ct} eq "customer" ? "customer" : "vendor";
1383
1384   my $query =
1385     qq|SELECT ct.name, ct.email, ct.cc, ct.bcc
1386        FROM $ct ct
1387        WHERE ct.id = ?|;
1388   ($form->{ $form->{ct} }, $form->{email}, $form->{cc}, $form->{bcc}) =
1389     selectrow_query($form, $dbh, $query, $form->{"${ct}_id"});
1390   $dbh->disconnect;
1391
1392   $main::lxdebug->leave_sub();
1393 }
1394
1395 sub get_taxaccounts {
1396   $main::lxdebug->enter_sub();
1397
1398   my ($self, $myconfig, $form) = @_;
1399
1400   # connect to database
1401   my $dbh = $form->dbconnect($myconfig);
1402
1403   # get tax accounts
1404   my $query =
1405     qq|SELECT c.accno, c.description, t.rate
1406        FROM chart c, tax t
1407        WHERE (c.link LIKE '%CT_tax%') AND (c.id = t.chart_id)
1408        ORDER BY c.accno|;
1409   $form->{taxaccounts} = selectall_hashref_quert($form, $dbh, $query);
1410
1411   $dbh->disconnect;
1412
1413   $main::lxdebug->leave_sub();
1414 }
1415
1416 sub tax_report {
1417   $main::lxdebug->enter_sub();
1418
1419   my ($self, $myconfig, $form) = @_;
1420
1421   # connect to database
1422   my $dbh = $form->dbconnect($myconfig);
1423
1424   my ($null, $department_id) = split /--/, $form->{department};
1425
1426   # build WHERE
1427   my $where = "1 = 1";
1428
1429   if ($department_id) {
1430     $where .= qq| AND (a.department_id = | . conv_i($department_id, 'NULL') . qq|) |;
1431   }
1432
1433   my ($accno, $rate);
1434
1435   if ($form->{accno}) {
1436     $accno = $form->{accno};
1437     $rate  = $form->{"$form->{accno}_rate"};
1438     $accno = qq| AND (ch.accno = | . $dbh->quote($accno) . qq|)|;
1439   }
1440   $rate *= 1;
1441
1442   my ($table, $ARAP);
1443
1444   if ($form->{db} eq 'ar') {
1445     $table = "customer";
1446     $ARAP  = "AR";
1447   } else {
1448     $table = "vendor";
1449     $ARAP  = "AP";
1450   }
1451
1452   my $arap = lc($ARAP);
1453
1454   my $transdate = "a.transdate";
1455
1456   if ($form->{method} eq 'cash') {
1457     $transdate = "a.datepaid";
1458
1459     my $todate = conv_dateq($form->{todate} ? $form->{todate} : $form->current_date($myconfig));
1460
1461     $where .= qq|
1462       AND ac.trans_id IN
1463         (
1464           SELECT trans_id
1465           FROM acc_trans
1466           JOIN chart ON (chart_id = id)
1467           WHERE (link LIKE '%${ARAP}_paid%')
1468           AND (transdate <= $todate)
1469         )
1470       |;
1471   }
1472
1473   # if there are any dates construct a where
1474   $where .= " AND ($transdate >= " . conv_dateq($form->{fromdate}) . ") " if ($form->{fromdate});
1475   $where .= " AND ($transdate <= " . conv_dateq($form->{todate}) . ") " if ($form->{todate});
1476
1477   my $ml = ($form->{db} eq 'ar') ? 1 : -1;
1478
1479   my $sortorder = join ', ', $form->sort_columns(qw(transdate invnumber name));
1480   $sortorder = $form->{sort} if ($form->{sort} && grep({ $_ eq $form->{sort} } qw(id transdate invnumber name netamount tax)));
1481
1482   if ($form->{report} !~ /nontaxable/) {
1483     $query =
1484       qq|SELECT a.id, '0' AS invoice, $transdate AS transdate, a.invnumber, n.name, a.netamount,
1485           ac.amount * $ml AS tax
1486          FROM acc_trans ac
1487          JOIN ${arap} a ON (a.id = ac.trans_id)
1488          JOIN chart ch ON (ch.id = ac.chart_id)
1489          JOIN $table n ON (n.id = a.${table}_id)
1490          WHERE
1491            $where
1492            $accno
1493            AND (a.invoice = '0')
1494
1495          UNION
1496
1497          SELECT a.id, '1' AS invoice, $transdate AS transdate, a.invnumber, n.name, i.sellprice * i.qty AS netamount,
1498            i.sellprice * i.qty * $rate * $ml AS tax
1499          FROM acc_trans ac
1500          JOIN ${arap} a ON (a.id = ac.trans_id)
1501          JOIN chart ch ON (ch.id = ac.chart_id)
1502          JOIN $table n ON (n.id = a.${table}_id)
1503          JOIN ${table}tax t ON (t.${table}_id = n.id)
1504          JOIN invoice i ON (i.trans_id = a.id)
1505          JOIN partstax p ON (p.parts_id = i.parts_id)
1506          WHERE
1507            $where
1508            $accno
1509            AND (a.invoice = '1')
1510          ORDER BY $sortorder|;
1511   } else {
1512     # only gather up non-taxable transactions
1513     $query =
1514       qq|SELECT a.id, '0' AS invoice, $transdate AS transdate, a.invnumber, n.name, a.netamount
1515          FROM acc_trans ac
1516          JOIN ${arap} a ON (a.id = ac.trans_id)
1517          JOIN $table n ON (n.id = a.${table}_id)
1518          WHERE
1519            $where
1520            AND (a.invoice = '0')
1521            AND (a.netamount = a.amount)
1522
1523          UNION
1524
1525          SELECT a.id, '1' AS invoice, $transdate AS transdate, a.invnumber, n.name, i.sellprice * i.qty AS netamount
1526          FROM acc_trans ac
1527          JOIN ${arap} a ON (a.id = ac.trans_id)
1528          JOIN $table n ON (n.id = a.${table}_id)
1529          JOIN invoice i ON (i.trans_id = a.id)
1530          WHERE
1531            $where
1532            AND (a.invoice = '1')
1533            AND (
1534              a.${table}_id NOT IN (SELECT ${table}_id FROM ${table}tax t (${table}_id))
1535              OR
1536              i.parts_id NOT IN (SELECT parts_id FROM partstax p (parts_id))
1537            )
1538          GROUP BY a.id, a.invnumber, $transdate, n.name, i.sellprice, i.qty
1539          ORDER by $sortorder|;
1540   }
1541
1542   $form->{TR} = selectall_hashref_query($form, $dbh, $query);
1543
1544   $dbh->disconnect;
1545
1546   $main::lxdebug->leave_sub();
1547 }
1548
1549 sub paymentaccounts {
1550   $main::lxdebug->enter_sub();
1551
1552   my ($self, $myconfig, $form) = @_;
1553
1554   # connect to database, turn AutoCommit off
1555   my $dbh = $form->dbconnect_noauto($myconfig);
1556
1557   my $ARAP = $form->{db} eq "ar" ? "AR" : "AP";
1558
1559   # get A(R|P)_paid accounts
1560   my $query =
1561     qq|SELECT accno, description
1562        FROM chart
1563        WHERE link LIKE '%${ARAP}_paid%'|;
1564   $form->{PR} = selectall_hashref_query($form, $dbh, $query);
1565
1566   $dbh->disconnect;
1567
1568   $main::lxdebug->leave_sub();
1569 }
1570
1571 sub payments {
1572   $main::lxdebug->enter_sub();
1573
1574   my ($self, $myconfig, $form) = @_;
1575
1576   # connect to database, turn AutoCommit off
1577   my $dbh = $form->dbconnect_noauto($myconfig);
1578
1579   my $ml = 1;
1580   my $arap;
1581   if ($form->{db} eq 'ar') {
1582     $table = 'customer';
1583     $ml = -1;
1584     $arap = 'ar';
1585   } else {
1586     $table = 'vendor';
1587     $arap = 'ap';
1588   }
1589
1590   my ($query, $sth);
1591   my $dpt_join;
1592   my $where;
1593
1594   if ($form->{department_id}) {
1595     $dpt_join = qq| JOIN dpt_trans t ON (t.trans_id = ac.trans_id) |;
1596     $where = qq| AND (t.department_id = | . conv_i($form->{department_id}, 'NULL') . qq|) |;
1597   }
1598
1599   if ($form->{fromdate}) {
1600     $where .= " AND (ac.transdate >= " . $dbh->quote($form->{fromdate}) . ") ";
1601   }
1602   if ($form->{todate}) {
1603     $where .= " AND (ac.transdate <= " . $dbh->quote($form->{todate}) . ") ";
1604   }
1605   if (!$form->{fx_transaction}) {
1606     $where .= " AND ac.fx_transaction = '0'";
1607   }
1608
1609   my $invnumber;
1610   my $reference;
1611   if ($form->{reference}) {
1612     $reference = $dbh->quote('%' . $form->{reference} . '%');
1613     $invnumber = " AND (a.invnumber LIKE $reference)";
1614     $reference = " AND (g.reference LIKE $reference)";
1615   }
1616   if ($form->{source}) {
1617     $where .= " AND (ac.source ILIKE " . $dbh->quote('%' . $form->{source} . '%') . ") ";
1618   }
1619   if ($form->{memo}) {
1620     $where .= " AND (ac.memo ILIKE " . $dbh->quote('%' . $form->{memo} . '%') . ") ";
1621   }
1622
1623   my $sortorder = join(', ', qw(name invnumber ordnumber transdate source));
1624   $sortorder = $form->{sort} if ($form->{sort} && grep({ $_ eq $form->{sort} } qw(transdate invnumber name source memo)));
1625
1626   $query = qq|SELECT id, accno, description FROM chart WHERE accno = ?|;
1627   my $sth = prepare_query($form, $dbh, $query);
1628
1629   my $q_details =
1630       qq|SELECT c.name, a.invnumber, a.ordnumber,
1631            ac.transdate, ac.amount * $ml AS paid, ac.source,
1632            a.invoice, a.id, ac.memo, '${arap}' AS module
1633          FROM acc_trans ac
1634          JOIN $arap a ON (ac.trans_id = a.id)
1635          JOIN $table c ON (c.id = a.${table}_id)
1636          $dpt_join
1637          WHERE (ac.chart_id = ?)
1638            $where
1639            $invnumber
1640
1641          UNION
1642
1643          SELECT g.description, g.reference, NULL AS ordnumber,
1644            ac.transdate, ac.amount * $ml AS paid, ac.source,
1645            '0' as invoice, g.id, ac.memo, 'gl' AS module
1646          FROM acc_trans ac
1647          JOIN gl g ON (g.id = ac.trans_id)
1648          $dpt_join
1649          WHERE (ac.chart_id = ?)
1650            $where
1651            $reference
1652            AND (ac.amount * $ml) > 0
1653
1654          ORDER BY $sortorder|;
1655   my $sth_details = prepare_query($form, $dbh, $q_details);
1656
1657   $form->{PR} = [];
1658
1659   # cycle through each id
1660   foreach my $accno (split(/ /, $form->{paymentaccounts})) {
1661     do_statement($form, $sth, $query, $accno);
1662     my $ref = $sth->fetchrow_hashref();
1663     push(@{ $form->{PR} }, $ref);
1664     $sth->finish();
1665
1666     $form->{ $ref->{id} } = [] unless ($form->{ $ref->{id} });
1667
1668     do_statement($form, $sth_details, $q_details, $ref->{id}, $ref->{id});
1669     while (my $pr = $sth_details->fetchrow_hashref()) {
1670       push(@{ $form->{ $ref->{id} } }, $pr);
1671     }
1672     $sth_details->finish();
1673   }
1674
1675   $dbh->disconnect;
1676
1677   $main::lxdebug->leave_sub();
1678 }
1679
1680 sub bwa {
1681   $main::lxdebug->enter_sub();
1682
1683   my ($self, $myconfig, $form) = @_;
1684
1685   # connect to database
1686   my $dbh = $form->dbconnect($myconfig);
1687
1688   my $last_period = 0;
1689   my $category;
1690   my @categories  =
1691     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);
1692
1693   $form->{decimalplaces} *= 1;
1694
1695   &get_accounts_g($dbh, $last_period, $form->{fromdate}, $form->{todate}, $form, "pos_bwa");
1696
1697   # if there are any compare dates
1698   if ($form->{fromdate} || $form->{todate}) {
1699     $last_period = 1;
1700     if ($form->{fromdate}) {
1701       $form->{fromdate} =~ /[0-9]*\.[0-9]*\.([0-9]*)/;
1702       $year = $1;
1703     } else {
1704       $form->{todate} =~ /[0-9]*\.[0-9]*\.([0-9]*)/;
1705       $year = $1;
1706     }
1707     $kummfromdate = $form->{comparefromdate};
1708     $kummtodate   = $form->{comparetodate};
1709     &get_accounts_g($dbh, $last_period, $kummfromdate, $kummtodate, $form, "pos_bwa");
1710   }
1711
1712   @periods        = qw(jetzt kumm);
1713   @gesamtleistung = qw(1 2 3);
1714   @gesamtkosten   = qw (10 11 12 13 14 15 16 17 18 19 20);
1715   @ergebnisse     =
1716     qw (rohertrag betriebrohertrag betriebsergebnis neutraleraufwand neutralerertrag ergebnisvorsteuern ergebnis gesamtleistung gesamtkosten);
1717
1718   foreach $key (@periods) {
1719     $form->{ "$key" . "gesamtleistung" } = 0;
1720     $form->{ "$key" . "gesamtkosten" }   = 0;
1721
1722     foreach $category (@categories) {
1723
1724       if (defined($form->{$category}{$key})) {
1725         $form->{"$key$category"} =
1726           $form->format_amount($myconfig,
1727                                $form->round_amount($form->{$category}{$key}, 2
1728                                ),
1729                                $form->{decimalplaces},
1730                                '0');
1731       }
1732     }
1733     foreach $item (@gesamtleistung) {
1734       $form->{ "$key" . "gesamtleistung" } += $form->{$item}{$key};
1735     }
1736     foreach $item (@gesamtkosten) {
1737       $form->{ "$key" . "gesamtkosten" } += $form->{$item}{$key};
1738     }
1739     $form->{ "$key" . "rohertrag" } =
1740       $form->{ "$key" . "gesamtleistung" } - $form->{4}{$key};
1741     $form->{ "$key" . "betriebrohertrag" } =
1742       $form->{ "$key" . "rohertrag" } + $form->{5}{$key};
1743     $form->{ "$key" . "betriebsergebnis" } =
1744       $form->{ "$key" . "betriebrohertrag" } -
1745       $form->{ "$key" . "gesamtkosten" };
1746     $form->{ "$key" . "neutraleraufwand" } =
1747       $form->{30}{$key} + $form->{31}{$key};
1748     $form->{ "$key" . "neutralertrag" } =
1749       $form->{32}{$key} + $form->{33}{$key} + $form->{34}{$key};
1750     $form->{ "$key" . "ergebnisvorsteuern" } =
1751       $form->{ "$key" . "betriebsergebnis" } -
1752       $form->{ "$key" . "neutraleraufwand" } +
1753       $form->{ "$key" . "neutralertrag" };
1754     $form->{ "$key" . "ergebnis" } =
1755       $form->{ "$key" . "ergebnisvorsteuern" } - $form->{35}{$key};
1756
1757     if ($form->{ "$key" . "gesamtleistung" } > 0) {
1758       foreach $category (@categories) {
1759         if (defined($form->{$category}{$key})) {
1760           $form->{ "$key" . "gl" . "$category" } =
1761             $form->format_amount(
1762                                $myconfig,
1763                                $form->round_amount(
1764                                  ($form->{$category}{$key} /
1765                                     $form->{ "$key" . "gesamtleistung" } * 100
1766                                  ),
1767                                  $form->{decimalplaces}
1768                                ),
1769                                $form->{decimalplaces},
1770                                '0');
1771         }
1772       }
1773       foreach $item (@ergebnisse) {
1774         $form->{ "$key" . "gl" . "$item" } =
1775           $form->format_amount($myconfig,
1776                                $form->round_amount(
1777                                  ( $form->{ "$key" . "$item" } /
1778                                      $form->{ "$key" . "gesamtleistung" } * 100
1779                                  ),
1780                                  $form->{decimalplaces}
1781                                ),
1782                                $form->{decimalplaces},
1783                                '0');
1784       }
1785     }
1786
1787     if ($form->{ "$key" . "gesamtkosten" } > 0) {
1788       foreach $category (@categories) {
1789         if (defined($form->{$category}{$key})) {
1790           $form->{ "$key" . "gk" . "$category" } =
1791             $form->format_amount($myconfig,
1792                                  $form->round_amount(
1793                                    ($form->{$category}{$key} /
1794                                       $form->{ "$key" . "gesamtkosten" } * 100
1795                                    ),
1796                                    $form->{decimalplaces}
1797                                  ),
1798                                  $form->{decimalplaces},
1799                                  '0');
1800         }
1801       }
1802       foreach $item (@ergebnisse) {
1803         $form->{ "$key" . "gk" . "$item" } =
1804           $form->format_amount($myconfig,
1805                                $form->round_amount(
1806                                    ($form->{ "$key" . "$item" } /
1807                                       $form->{ "$key" . "gesamtkosten" } * 100
1808                                    ),
1809                                    $form->{decimalplaces}
1810                                ),
1811                                $form->{decimalplaces},
1812                                '0');
1813       }
1814     }
1815
1816     if ($form->{10}{$key} > 0) {
1817       foreach $category (@categories) {
1818         if (defined($form->{$category}{$key})) {
1819           $form->{ "$key" . "pk" . "$category" } =
1820             $form->format_amount(
1821                         $myconfig,
1822                         $form->round_amount(
1823                           ($form->{$category}{$key} / $form->{10}{$key} * 100),
1824                           $form->{decimalplaces}
1825                         ),
1826                         $form->{decimalplaces},
1827                         '0');
1828         }
1829       }
1830       foreach $item (@ergebnisse) {
1831         $form->{ "$key" . "pk" . "$item" } =
1832           $form->format_amount($myconfig,
1833                                $form->round_amount(
1834                                                 ($form->{ "$key" . "$item" } /
1835                                                    $form->{10}{$key} * 100
1836                                                 ),
1837                                                 $form->{decimalplaces}
1838                                ),
1839                                $form->{decimalplaces},
1840                                '0');
1841       }
1842     }
1843
1844     if ($form->{4}{$key} > 0) {
1845       foreach $category (@categories) {
1846         if (defined($form->{$category}{$key})) {
1847           $form->{ "$key" . "auf" . "$category" } =
1848             $form->format_amount(
1849                          $myconfig,
1850                          $form->round_amount(
1851                            ($form->{$category}{$key} / $form->{4}{$key} * 100),
1852                            $form->{decimalplaces}
1853                          ),
1854                          $form->{decimalplaces},
1855                          '0');
1856         }
1857       }
1858       foreach $item (@ergebnisse) {
1859         $form->{ "$key" . "auf" . "$item" } =
1860           $form->format_amount($myconfig,
1861                                $form->round_amount(
1862                                                 ($form->{ "$key" . "$item" } /
1863                                                    $form->{4}{$key} * 100
1864                                                 ),
1865                                                 $form->{decimalplaces}
1866                                ),
1867                                $form->{decimalplaces},
1868                                '0');
1869       }
1870     }
1871
1872     foreach $item (@ergebnisse) {
1873       $form->{ "$key" . "$item" } =
1874         $form->format_amount($myconfig,
1875                              $form->round_amount($form->{ "$key" . "$item" },
1876                                                  $form->{decimalplaces}
1877                              ),
1878                              $form->{decimalplaces},
1879                              '0');
1880     }
1881
1882   }
1883   $dbh->disconnect;
1884
1885   $main::lxdebug->leave_sub();
1886 }
1887
1888 sub ustva {
1889   $main::lxdebug->enter_sub();
1890
1891   my ($self, $myconfig, $form) = @_;
1892
1893   # connect to database
1894   my $dbh = $form->dbconnect($myconfig);
1895
1896   my $last_period     = 0;
1897   my @categories_cent = qw(51r 511 86r 861 97r 971 93r 931
1898     96 66 43 45 53 62 65 67);
1899   my @categories_euro = qw(48 51 86 91 97 93 94);
1900   $form->{decimalplaces} *= 1;
1901
1902   foreach $item (@categories_cent) {
1903     $form->{"$item"} = 0;
1904   }
1905   foreach $item (@categories_euro) {
1906     $form->{"$item"} = 0;
1907   }
1908
1909   &get_accounts_g($dbh, $last_period, $form->{fromdate}, $form->{todate}, $form, "pos_ustva");
1910
1911   #   foreach $item (@categories_cent) {
1912   #     if ($form->{$item}{"jetzt"} > 0) {
1913   #             $form->{$item} = $form->{$item}{"jetzt"};
1914   #             delete $form->{$item}{"jetzt"};
1915   #     }
1916   #   }
1917   #   foreach $item (@categories_euro) {
1918   #     if ($form->{$item}{"jetzt"} > 0) {
1919   #             $form->{$item} = $form->{$item}{"jetzt"};
1920   #             delete $form->{$item}{"jetzt"};
1921   #     }  foreach $item (@categories_cent) {
1922   #     if ($form->{$item}{"jetzt"} > 0) {
1923   #             $form->{$item} = $form->{$item}{"jetzt"};
1924   #             delete $form->{$item}{"jetzt"};
1925   #     }
1926   #   }
1927   #   foreach $item (@categories_euro) {
1928   #     if ($form->{$item}{"jetzt"} > 0) {
1929   #             $form->{$item} = $form->{$item}{"jetzt"};
1930   #             delete $form->{$item}{"jetzt"};
1931   #     }
1932   #   }
1933   #
1934   #    }
1935
1936   #
1937   # Berechnung der USTVA Formularfelder
1938   #
1939   $form->{"51r"} = $form->{"511"};
1940   $form->{"86r"} = $form->{"861"};
1941   $form->{"97r"} = $form->{"971"};
1942   $form->{"93r"} = $form->{"931"};
1943
1944   #$form->{"96"}  = $form->{"94"} * 0.16;
1945   $form->{"43"} =
1946     $form->{"51r"} + $form->{"86r"} + $form->{"97r"} + $form->{"93r"} +
1947     $form->{"96"};
1948   $form->{"45"} = $form->{"43"};
1949   $form->{"53"} = $form->{"43"};
1950   $form->{"62"} = $form->{"43"} - $form->{"66"};
1951   $form->{"65"} = $form->{"43"} - $form->{"66"};
1952   $form->{"67"} = $form->{"43"} - $form->{"66"};
1953
1954   foreach $item (@categories_cent) {
1955     $form->{$item} =
1956       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2),
1957                            2, '0');
1958   }
1959
1960   foreach $item (@categories_euro) {
1961     $form->{$item} =
1962       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 0),
1963                            0, '0');
1964   }
1965
1966   $dbh->disconnect;
1967
1968   $main::lxdebug->leave_sub();
1969 }
1970
1971 sub income_statement {
1972   $main::lxdebug->enter_sub();
1973
1974   my ($self, $myconfig, $form) = @_;
1975
1976   # connect to database
1977   my $dbh = $form->dbconnect($myconfig);
1978
1979   my $last_period          = 0;
1980   my @categories_einnahmen = qw(1 2 3 4 5 6 7);
1981   my @categories_ausgaben  =
1982     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);
1983
1984   my @ergebnisse = qw(sumeura sumeurb guvsumme);
1985
1986   $form->{decimalplaces} *= 1;
1987
1988   foreach $item (@categories_einnahmen) {
1989     $form->{$item} = 0;
1990   }
1991   foreach $item (@categories_ausgaben) {
1992     $form->{$item} = 0;
1993   }
1994
1995   foreach $item (@ergebnisse) {
1996     $form->{$item} = 0;
1997   }
1998
1999   &get_accounts_g($dbh, $last_period, $form->{fromdate}, $form->{todate},
2000                   $form, "pos_eur");
2001
2002   foreach $item (@categories_einnahmen) {
2003     $form->{"eur${item}"} =
2004       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2));
2005     $form->{"sumeura"} += $form->{$item};
2006   }
2007   foreach $item (@categories_ausgaben) {
2008     $form->{"eur${item}"} =
2009       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2));
2010     $form->{"sumeurb"} += $form->{$item};
2011   }
2012
2013   $form->{"guvsumme"} = $form->{"sumeura"} - $form->{"sumeurb"};
2014
2015   foreach $item (@ergebnisse) {
2016     $form->{$item} =
2017       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2));
2018   }
2019   $main::lxdebug->leave_sub();
2020 }
2021 1;