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