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