1 ###=====================================================================
4 # Based on SQL-Ledger Version 2.1.9
5 # Web http://www.lx-office.org
7 #=====================================================================
8 # SQL-Ledger Accounting
9 # Copyright (C) 1998-2002
11 # Author: Dieter Simader
12 # Email: dsimader@sql-ledger.org
13 # Web: http://www.sql-ledger.org
15 # Contributors: Benjamin Lee <benjaminlee@consultant.com>
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.
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 #======================================================================
31 # backend code for reports
33 #======================================================================
41 $main::lxdebug->enter_sub();
43 my ($self, $myconfig, $form) = @_;
46 my $dbh = $form->dbconnect($myconfig);
49 my @categories = qw(A C L Q);
51 # if there are any dates construct a where
52 if ($form->{asofdate}) {
53 $form->{period} = $form->{this_period} = conv_dateq($form->{asofdate});
56 $form->{decimalplaces} *= 1;
58 &get_accounts($dbh, $last_period, "", $form->{asofdate}, $form,
61 # if there are any compare dates
62 if ($form->{compareasofdate}) {
65 &get_accounts($dbh, $last_period, "", $form->{compareasofdate},
68 $form->{last_period} = conv_dateq($form->{compareasofdate});
75 # now we got $form->{A}{accno}{ } assets
76 # and $form->{L}{accno}{ } liabilities
77 # and $form->{Q}{accno}{ } equity
78 # build asset accounts
84 'A' => { 'label' => 'asset',
88 'L' => { 'label' => 'liability',
89 'labels' => 'liabilities',
92 'Q' => { 'label' => 'equity',
97 foreach my $category (grep { !/C/ } @categories) {
99 foreach $key (sort keys %{ $form->{$category} }) {
101 $str = ($form->{l_heading}) ? $form->{padding} : "";
103 if ($form->{$category}{$key}{charttype} eq "A") {
106 ? "$form->{$category}{$key}{accno} - $form->{$category}{$key}{description}"
107 : "$form->{$category}{$key}{description}";
109 if ($form->{$category}{$key}{charttype} eq "H") {
110 if ($account{$category}{subtotal} && $form->{l_subtotal}) {
112 push(@{ $form->{"$account{$category}{label}_account"} },
113 "$str$form->{bold}$account{$category}{subdescription}$form->{endbold}"
115 push(@{ $form->{"$account{$category}{label}_this_period"} },
116 $form->format_amount(
118 $account{$category}{subthis} * $account{$category}{ml},
119 $form->{decimalplaces}, $dash
123 push(@{ $form->{"$account{$category}{label}_last_period"} },
124 $form->format_amount(
126 $account{$category}{sublast} * $account{$category}{ml},
127 $form->{decimalplaces}, $dash
133 "$form->{bold}$form->{$category}{$key}{description}$form->{endbold}";
135 $account{$category}{subthis} = $form->{$category}{$key}{this};
136 $account{$category}{sublast} = $form->{$category}{$key}{last};
137 $account{$category}{subdescription} =
138 $form->{$category}{$key}{description};
139 $account{$category}{subtotal} = 1;
141 $form->{$category}{$key}{this} = 0;
142 $form->{$category}{$key}{last} = 0;
144 next unless $form->{l_heading};
149 # push description onto array
150 push(@{ $form->{"$account{$category}{label}_account"} }, $str);
152 if ($form->{$category}{$key}{charttype} eq 'A') {
153 $form->{"total_$account{$category}{labels}_this_period"} +=
154 $form->{$category}{$key}{this} * $account{$category}{ml};
158 push(@{ $form->{"$account{$category}{label}_this_period"} },
159 $form->format_amount(
161 $form->{$category}{$key}{this} * $account{$category}{ml},
162 $form->{decimalplaces}, $dash
166 $form->{"total_$account{$category}{labels}_last_period"} +=
167 $form->{$category}{$key}{last} * $account{$category}{ml};
169 push(@{ $form->{"$account{$category}{label}_last_period"} },
170 $form->format_amount(
172 $form->{$category}{$key}{last} * $account{$category}{ml},
173 $form->{decimalplaces}, $dash
178 $str = ($form->{l_heading}) ? $form->{padding} : "";
179 if ($account{$category}{subtotal} && $form->{l_subtotal}) {
180 push(@{ $form->{"$account{$category}{label}_account"} },
181 "$str$form->{bold}$account{$category}{subdescription}$form->{endbold}"
183 push(@{ $form->{"$account{$category}{label}_this_period"} },
184 $form->format_amount(
186 $account{$category}{subthis} * $account{$category}{ml},
187 $form->{decimalplaces}, $dash
191 push(@{ $form->{"$account{$category}{label}_last_period"} },
192 $form->format_amount(
194 $account{$category}{sublast} * $account{$category}{ml},
195 $form->{decimalplaces}, $dash
202 # totals for assets, liabilities
203 $form->{total_assets_this_period} =
204 $form->round_amount($form->{total_assets_this_period},
205 $form->{decimalplaces});
206 $form->{total_liabilities_this_period} =
207 $form->round_amount($form->{total_liabilities_this_period},
208 $form->{decimalplaces});
209 $form->{total_equity_this_period} =
210 $form->round_amount($form->{total_equity_this_period},
211 $form->{decimalplaces});
214 $form->{earnings_this_period} =
215 $form->{total_assets_this_period} -
216 $form->{total_liabilities_this_period} - $form->{total_equity_this_period};
218 push(@{ $form->{equity_this_period} },
219 $form->format_amount($myconfig,
220 $form->{earnings_this_period},
221 $form->{decimalplaces}, "- "
224 $form->{total_equity_this_period} =
226 $form->{total_equity_this_period} + $form->{earnings_this_period},
227 $form->{decimalplaces});
229 # add liability + equity
230 $form->{total_this_period} =
231 $form->format_amount(
233 $form->{total_liabilities_this_period} + $form->{total_equity_this_period},
234 $form->{decimalplaces},
239 # totals for assets, liabilities
240 $form->{total_assets_last_period} =
241 $form->round_amount($form->{total_assets_last_period},
242 $form->{decimalplaces});
243 $form->{total_liabilities_last_period} =
244 $form->round_amount($form->{total_liabilities_last_period},
245 $form->{decimalplaces});
246 $form->{total_equity_last_period} =
247 $form->round_amount($form->{total_equity_last_period},
248 $form->{decimalplaces});
250 # calculate retained earnings
251 $form->{earnings_last_period} =
252 $form->{total_assets_last_period} -
253 $form->{total_liabilities_last_period} -
254 $form->{total_equity_last_period};
256 push(@{ $form->{equity_last_period} },
257 $form->format_amount($myconfig,
258 $form->{earnings_last_period},
259 $form->{decimalplaces}, "- "
262 $form->{total_equity_last_period} =
264 $form->{total_equity_last_period} + $form->{earnings_last_period},
265 $form->{decimalplaces});
267 # add liability + equity
268 $form->{total_last_period} =
269 $form->format_amount($myconfig,
270 $form->{total_liabilities_last_period} +
271 $form->{total_equity_last_period},
272 $form->{decimalplaces},
277 $form->{total_liabilities_last_period} =
278 $form->format_amount($myconfig,
279 $form->{total_liabilities_last_period},
280 $form->{decimalplaces}, "- ")
281 if ($form->{total_liabilities_last_period} != 0);
283 $form->{total_equity_last_period} =
284 $form->format_amount($myconfig,
285 $form->{total_equity_last_period},
286 $form->{decimalplaces}, "- ")
287 if ($form->{total_equity_last_period} != 0);
289 $form->{total_assets_last_period} =
290 $form->format_amount($myconfig,
291 $form->{total_assets_last_period},
292 $form->{decimalplaces}, "- ")
293 if ($form->{total_assets_last_period} != 0);
295 $form->{total_assets_this_period} =
296 $form->format_amount($myconfig,
297 $form->{total_assets_this_period},
298 $form->{decimalplaces}, "- ");
300 $form->{total_liabilities_this_period} =
301 $form->format_amount($myconfig,
302 $form->{total_liabilities_this_period},
303 $form->{decimalplaces}, "- ");
305 $form->{total_equity_this_period} =
306 $form->format_amount($myconfig,
307 $form->{total_equity_this_period},
308 $form->{decimalplaces}, "- ");
310 $main::lxdebug->leave_sub();
314 $main::lxdebug->enter_sub();
316 my ($dbh, $last_period, $fromdate, $todate, $form, $categories) = @_;
318 my ($null, $department_id) = split /--/, $form->{department};
330 my $category = qq| AND (| . join(" OR ", map({ "(c.category = " . $dbh->quote($_) . ")" } @{$categories})) . qq|) |;
334 qq|SELECT c.accno, c.description, c.category
336 WHERE (c.charttype = 'H')
340 $sth = prepare_execute_query($form, $dbh, $query);
342 my @headingaccounts = ();
343 while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
344 $form->{ $ref->{category} }{ $ref->{accno} }{description} =
345 "$ref->{description}";
346 $form->{ $ref->{category} }{ $ref->{accno} }{charttype} = "H";
347 $form->{ $ref->{category} }{ $ref->{accno} }{accno} = $ref->{accno};
349 push @headingaccounts, $ref->{accno};
355 $fromdate = conv_dateq($fromdate);
356 if ($form->{method} eq 'cash') {
357 $subwhere .= " AND (transdate >= $fromdate)";
358 $glwhere = " AND (ac.transdate >= $fromdate)";
360 $where .= " AND (ac.transdate >= $fromdate)";
365 $todate = conv_dateq($todate);
366 $where .= " AND (ac.transdate <= $todate)";
367 $subwhere .= " AND (transdate <= $todate)";
370 if ($department_id) {
371 $dpt_join = qq| JOIN department t ON (a.department_id = t.id) |;
372 $dpt_where = qq| AND (t.id = | . conv_i($department_id, 'NULL') . qq|)|;
375 if ($form->{project_id}) {
376 $project = qq| AND (ac.project_id = | . conv_i($form->{project_id}, 'NULL') . qq|) |;
379 if ($form->{method} eq 'cash') {
381 qq|SELECT c.accno, sum(ac.amount) AS amount, c.description, c.category
383 JOIN chart c ON (c.id = ac.chart_id)
384 JOIN ar a ON (a.id = ac.trans_id)
393 JOIN chart ON (chart_id = id)
394 WHERE (link LIKE '%AR_paid%')
398 GROUP BY c.accno, c.description, c.category
402 SELECT c.accno, sum(ac.amount) AS amount, c.description, c.category
404 JOIN chart c ON (c.id = ac.chart_id)
405 JOIN ap a ON (a.id = ac.trans_id)
414 JOIN chart ON (chart_id = id)
415 WHERE (link LIKE '%AP_paid%')
419 GROUP BY c.accno, c.description, c.category
423 SELECT c.accno, sum(ac.amount) AS amount, c.description, c.category
425 JOIN chart c ON (c.id = ac.chart_id)
426 JOIN gl a ON (a.id = ac.trans_id)
432 AND NOT ((c.link = 'AR') OR (c.link = 'AP'))
434 GROUP BY c.accno, c.description, c.category |;
436 if ($form->{project_id}) {
441 SELECT c.accno AS accno, SUM(ac.sellprice * ac.qty) AS amount, c.description AS description, c.category
443 JOIN ar a ON (a.id = ac.trans_id)
444 JOIN parts p ON (ac.parts_id = p.id)
445 JOIN chart c on (p.income_accno_id = c.id)
447 -- use transdate from subwhere
448 WHERE (c.category = 'I')
455 JOIN chart ON (chart_id = id)
456 WHERE (link LIKE '%AR_paid%')
460 GROUP BY c.accno, c.description, c.category
464 SELECT c.accno AS accno, SUM(ac.sellprice) AS amount, c.description AS description, c.category
466 JOIN ap a ON (a.id = ac.trans_id)
467 JOIN parts p ON (ac.parts_id = p.id)
468 JOIN chart c on (p.expense_accno_id = c.id)
470 WHERE (c.category = 'E')
477 JOIN chart ON (chart_id = id)
478 WHERE link LIKE '%AP_paid%'
482 GROUP BY c.accno, c.description, c.category |;
485 } else { # if ($form->{method} eq 'cash')
486 if ($department_id) {
487 $dpt_join = qq| JOIN dpt_trans t ON (t.trans_id = ac.trans_id) |;
488 $dpt_where = qq| AND t.department_id = $department_id |;
492 SELECT c.accno, sum(ac.amount) AS amount, c.description, c.category
494 JOIN chart c ON (c.id = ac.chart_id)
500 GROUP BY c.accno, c.description, c.category |;
502 if ($form->{project_id}) {
506 SELECT c.accno AS accno, SUM(ac.sellprice * ac.qty) AS amount, c.description AS description, c.category
508 JOIN ar a ON (a.id = ac.trans_id)
509 JOIN parts p ON (ac.parts_id = p.id)
510 JOIN chart c on (p.income_accno_id = c.id)
512 -- use transdate from subwhere
513 WHERE (c.category = 'I')
517 GROUP BY c.accno, c.description, c.category
521 SELECT c.accno AS accno, SUM(ac.sellprice * ac.qty) * -1 AS amount, c.description AS description, c.category
523 JOIN ap a ON (a.id = ac.trans_id)
524 JOIN parts p ON (ac.parts_id = p.id)
525 JOIN chart c on (p.expense_accno_id = c.id)
527 WHERE (c.category = 'E')
531 GROUP BY c.accno, c.description, c.category |;
539 my $sth = prepare_execute_query($form, $dbh, $query);
541 while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
543 if ($ref->{category} eq 'C') {
544 $ref->{category} = 'A';
547 # get last heading account
548 @accno = grep { $_ le "$ref->{accno}" } @headingaccounts;
552 $form->{ $ref->{category} }{$accno}{last} += $ref->{amount};
554 $form->{ $ref->{category} }{$accno}{this} += $ref->{amount};
558 $form->{ $ref->{category} }{ $ref->{accno} }{accno} = $ref->{accno};
559 $form->{ $ref->{category} }{ $ref->{accno} }{description} =
561 $form->{ $ref->{category} }{ $ref->{accno} }{charttype} = "A";
564 $form->{ $ref->{category} }{ $ref->{accno} }{last} += $ref->{amount};
566 $form->{ $ref->{category} }{ $ref->{accno} }{this} += $ref->{amount};
571 # remove accounts with zero balance
572 foreach $category (@{$categories}) {
573 foreach $accno (keys %{ $form->{$category} }) {
574 $form->{$category}{$accno}{last} =
575 $form->round_amount($form->{$category}{$accno}{last},
576 $form->{decimalplaces});
577 $form->{$category}{$accno}{this} =
578 $form->round_amount($form->{$category}{$accno}{this},
579 $form->{decimalplaces});
581 delete $form->{$category}{$accno}
582 if ( $form->{$category}{$accno}{this} == 0
583 && $form->{$category}{$accno}{last} == 0);
587 $main::lxdebug->leave_sub();
591 $main::lxdebug->enter_sub();
593 my ($dbh, $last_period, $fromdate, $todate, $form, $category) = @_;
595 my ($null, $department_id) = split /--/, $form->{department};
608 $fromdate = conv_dateq($fromdate);
609 if ($form->{method} eq 'cash') {
610 $subwhere .= " AND (transdate >= $fromdate)";
611 $glwhere = " AND (ac.transdate >= $fromdate)";
612 $prwhere = " AND (ar.transdate >= $fromdate)";
614 $where .= " AND (ac.transdate >= $fromdate)";
619 $todate = conv_dateq($todate);
620 $subwhere .= " AND (transdate <= $todate)";
621 $where .= " AND (ac.transdate <= $todate)";
622 $prwhere .= " AND (ar.transdate <= $todate)";
625 if ($department_id) {
626 $dpt_join = qq| JOIN department t ON (a.department_id = t.id) |;
627 $dpt_where = qq| AND (t.id = | . conv_i($department_id, 'NULL') . qq|) |;
630 if ($form->{project_id}) {
631 $project = qq| AND (ac.project_id = | . conv_i($form->{project_id}) . qq|) |;
634 if ($form->{method} eq 'cash') {
637 SELECT SUM(ac.amount * chart_category_to_sgn(c.category)) AS amount, c.$category
639 JOIN chart c ON (c.id = ac.chart_id)
640 JOIN ar a ON (a.id = ac.trans_id)
642 WHERE $where $dpt_where
643 AND ac.trans_id IN ( SELECT trans_id FROM acc_trans JOIN chart ON (chart_id = id) WHERE (link LIKE '%AR_paid%') $subwhere)
649 SELECT SUM(ac.amount * chart_category_to_sgn(c.category)) AS amount, c.$category
651 JOIN chart c ON (c.id = ac.chart_id)
652 JOIN ap a ON (a.id = ac.trans_id)
654 WHERE $where $dpt_where
655 AND ac.trans_id IN ( SELECT trans_id FROM acc_trans JOIN chart ON (chart_id = id) WHERE (link LIKE '%AP_paid%') $subwhere)
661 SELECT SUM(ac.amount * chart_category_to_sgn(c.category)) AS amount, c.$category
663 JOIN chart c ON (c.id = ac.chart_id)
664 JOIN gl a ON (a.id = ac.trans_id)
666 WHERE $where $dpt_where $glwhere
667 AND NOT ((c.link = 'AR') OR (c.link = 'AP'))
674 if ($form->{project_id}) {
678 SELECT SUM(ac.sellprice * ac.qty * chart_category_to_sgn(c.category)) AS amount, c.$category
680 JOIN ar a ON (a.id = ac.trans_id)
681 JOIN parts p ON (ac.parts_id = p.id)
682 JOIN chart c on (p.income_accno_id = c.id)
684 WHERE (c.category = 'I') $prwhere $dpt_where
685 AND ac.trans_id IN ( SELECT trans_id FROM acc_trans JOIN chart ON (chart_id = id) WHERE (link LIKE '%AR_paid%') $subwhere)
691 SELECT SUM(ac.sellprice * chart_category_to_sgn(c.category)) AS amount, c.$category
693 JOIN ap a ON (a.id = ac.trans_id)
694 JOIN parts p ON (ac.parts_id = p.id)
695 JOIN chart c on (p.expense_accno_id = c.id)
697 WHERE (c.category = 'E') $prwhere $dpt_where
698 AND ac.trans_id IN ( SELECT trans_id FROM acc_trans JOIN chart ON (chart_id = id) WHERE (link LIKE '%AP_paid%') $subwhere)
704 } else { # if ($form->{method} eq 'cash')
705 if ($department_id) {
706 $dpt_join = qq| JOIN dpt_trans t ON (t.trans_id = ac.trans_id) |;
707 $dpt_where = qq| AND (t.department_id = | . conv_i($department_id, 'NULL') . qq|) |;
711 SELECT sum(ac.amount * chart_category_to_sgn(c.category)) AS amount, c.$category
713 JOIN chart c ON (c.id = ac.chart_id)
718 GROUP BY c.$category |;
720 if ($form->{project_id}) {
724 SELECT SUM(ac.sellprice * ac.qty * chart_category_to_sgn(c.category)) AS amount, c.$category
726 JOIN ar a ON (a.id = ac.trans_id)
727 JOIN parts p ON (ac.parts_id = p.id)
728 JOIN chart c on (p.income_accno_id = c.id)
730 WHERE (c.category = 'I')
738 SELECT SUM(ac.sellprice * ac.qty * chart_category_to_sgn(c.category)) AS amount, c.$category
740 JOIN ap a ON (a.id = ac.trans_id)
741 JOIN parts p ON (ac.parts_id = p.id)
742 JOIN chart c on (p.expense_accno_id = c.id)
744 WHERE (c.category = 'E')
748 GROUP BY c.$category |;
756 my $sth = prepare_execute_query($form, $dbh, $query);
758 while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
759 if ($category eq "pos_bwa") {
761 $form->{ $ref->{$category} }{kumm} += $ref->{amount};
763 $form->{ $ref->{$category} }{jetzt} += $ref->{amount};
766 $form->{ $ref->{$category} } += $ref->{amount};
771 $main::lxdebug->leave_sub();
775 $main::lxdebug->enter_sub();
777 my ($self, $myconfig, $form) = @_;
779 my $dbh = $form->dbconnect($myconfig);
781 my ($query, $sth, $ref);
784 my ($null, $department_id) = split /--/, $form->{department};
785 my @headingaccounts = ();
791 my $invwhere = $where;
793 if ($department_id) {
794 $dpt_join = qq| JOIN dpt_trans t ON (ac.trans_id = t.trans_id) |;
795 $dpt_where = qq| AND (t.department_id = | . conv_i($department_id, 'NULL') . qq|) |;
798 # project_id only applies to getting transactions
799 # it has nothing to do with a trial balance
800 # but we use the same function to collect information
802 if ($form->{project_id}) {
803 $project = qq| AND (ac.project_id = | . conv_i($form->{project_id}, 'NULL') . qq|) |;
806 my $acc_cash_where = "";
807 my $ar_cash_where = "";
808 my $ap_cash_where = "";
811 if ($form->{method} eq "cash") {
812 $acc_cash_where = qq| AND (ac.trans_id IN (SELECT id FROM ar WHERE datepaid>='$form->{fromdate}' AND datepaid<='$form->{todate}' UNION SELECT id FROM ap WHERE datepaid>='$form->{fromdate}' AND datepaid<='$form->{todate}' UNION SELECT id FROM gl WHERE transdate>='$form->{fromdate}' AND transdate<='$form->{todate}')) |;
813 $ar_ap_cash_where = qq| AND (a.datepaid>='$form->{fromdate}' AND a.datepaid<='$form->{todate}') |;
816 # get beginning balances
818 qq|SELECT c.accno, c.category, SUM(ac.amount) AS amount, c.description
820 LEFT JOIN chart c ON (ac.chart_id = c.id)
822 WHERE ((select date_trunc('year', ac.transdate::date)) = (select date_trunc('year', ?::date))) AND ac.ob_transaction $acc_cash_where
825 GROUP BY c.accno, c.category, c.description |;
827 $sth = prepare_execute_query($form, $dbh, $query, $form->{fromdate});
829 while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
831 if ($ref->{amount} != 0 || $form->{all_accounts}) {
832 $trb{ $ref->{accno} }{description} = $ref->{description};
833 $trb{ $ref->{accno} }{charttype} = 'A';
835 if ($ref->{amount} > 0) {
836 $trb{ $ref->{accno} }{haben_eb} = $ref->{amount};
838 $trb{ $ref->{accno} }{soll_eb} = $ref->{amount} * -1;
840 $trb{ $ref->{accno} }{category} = $ref->{category};
849 qq|SELECT c.accno, c.description, c.category
851 WHERE c.charttype = 'H'
854 $sth = prepare_execute_query($form, $dbh, $query);
856 while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
857 $trb{ $ref->{accno} }{description} = $ref->{description};
858 $trb{ $ref->{accno} }{charttype} = 'H';
859 $trb{ $ref->{accno} }{category} = $ref->{category};
861 push @headingaccounts, $ref->{accno};
867 $saldowhere = " 1 = 1 ";
868 $sumwhere = " 1 = 1 ";
871 if ($form->{fromdate} || $form->{todate}) {
872 if ($form->{fromdate}) {
873 my $fromdate = conv_dateq($form->{fromdate});
874 $tofrom .= " AND (ac.transdate >= $fromdate)";
875 $subwhere .= " AND (transdate >= $fromdate)";
876 $sumsubwhere .= " AND (transdate >= (select date_trunc('year', date $fromdate))) ";
877 $saldosubwhere .= " AND transdate>=(select date_trunc('year', date $fromdate)) ";
878 $invwhere .= " AND (a.transdate >= $fromdate)";
879 $glsaldowhere .= " AND ac.transdate>=(select date_trunc('year', date $fromdate)) ";
880 $glwhere = " AND (ac.transdate >= $fromdate)";
881 $glsumwhere = " AND (ac.transdate >= (select date_trunc('year', date $fromdate))) ";
883 if ($form->{todate}) {
884 my $todate = conv_dateq($form->{todate});
885 $tofrom .= " AND (ac.transdate <= $todate)";
886 $invwhere .= " AND (a.transdate <= $todate)";
887 $saldosubwhere .= " AND (transdate <= $todate)";
888 $sumsubwhere .= " AND (transdate <= $todate)";
889 $subwhere .= " AND (transdate <= $todate)";
890 $glwhere .= " AND (ac.transdate <= $todate)";
891 $glsumwhere .= " AND (ac.transdate <= $todate) ";
892 $glsaldowhere .= " AND (ac.transdate <= $todate) ";
896 if ($form->{method} eq "cash") {
898 qq| AND ((ac.trans_id IN (SELECT id from ar) AND
903 JOIN chart ON (chart_id = id)
904 WHERE (link LIKE '%AR_paid%')
909 (ac.trans_id in (SELECT id from ap) AND
914 JOIN chart ON (chart_id = id)
915 WHERE (link LIKE '%AP_paid%')
920 (ac.trans_id in (SELECT id from gl)
924 qq| AND ((ac.trans_id IN (SELECT id from ar) AND
929 JOIN chart ON (chart_id = id)
930 WHERE (link LIKE '%AR_paid%')
935 (ac.trans_id in (SELECT id from ap) AND
940 JOIN chart ON (chart_id = id)
941 WHERE (link LIKE '%AP_paid%')
946 (ac.trans_id in (SELECT id from gl)
950 qq| AND ((ac.trans_id IN (SELECT id from ar) AND
955 JOIN chart ON (chart_id = id)
956 WHERE (link LIKE '%AR_paid%')
961 (ac.trans_id in (SELECT id from ap) AND
966 JOIN chart ON (chart_id = id)
967 WHERE (link LIKE '%AP_paid%')
972 (ac.trans_id in (SELECT id from gl)
977 $where .= $tofrom . " AND (NOT ac.ob_transaction OR ac.ob_transaction IS NULL) AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL)";
978 $saldowhere .= $glsaldowhere . " AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL)";
979 $sumwhere .= $glsumwhere . " AND (NOT ac.ob_transaction OR ac.ob_transaction IS NULL) AND (NOT ac.cb_transaction OR ac.cb_transaction IS NULL)";
983 SELECT c.accno, c.description, c.category, SUM(ac.amount) AS amount
985 JOIN chart c ON (c.id = ac.chart_id)
990 GROUP BY c.accno, c.description, c.category |;
992 if ($form->{project_id}) {
994 -- add project transactions from invoice
998 SELECT c.accno, c.description, c.category, SUM(ac.sellprice * ac.qty) AS amount
1000 JOIN ar a ON (ac.trans_id = a.id)
1001 JOIN parts p ON (ac.parts_id = p.id)
1002 JOIN chart c ON (p.income_accno_id = c.id)
1007 GROUP BY c.accno, c.description, c.category
1011 SELECT c.accno, c.description, c.category, SUM(ac.sellprice * ac.qty) * -1 AS amount
1013 JOIN ap a ON (ac.trans_id = a.id)
1014 JOIN parts p ON (ac.parts_id = p.id)
1015 JOIN chart c ON (p.expense_accno_id = c.id)
1020 GROUP BY c.accno, c.description, c.category
1024 $query .= qq| ORDER BY accno|;
1026 $sth = prepare_execute_query($form, $dbh, $query);
1028 # calculate the debit and credit in the period
1029 while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
1030 $trb{ $ref->{accno} }{description} = $ref->{description};
1031 $trb{ $ref->{accno} }{charttype} = 'A';
1032 $trb{ $ref->{accno} }{category} = $ref->{category};
1033 $trb{ $ref->{accno} }{amount} += $ref->{amount};
1037 # prepare query for each account
1038 my ($q_drcr, $drcr, $q_project_drcr, $project_drcr);
1042 (SELECT SUM(ac.amount) * -1
1044 JOIN chart c ON (c.id = ac.chart_id)
1050 AND (c.accno = ?)) AS debit,
1052 (SELECT SUM(ac.amount)
1054 JOIN chart c ON (c.id = ac.chart_id)
1060 AND c.accno = ?) AS credit,
1061 (SELECT SUM(ac.amount)
1063 JOIN chart c ON (ac.chart_id = c.id)
1068 AND c.accno = ?) AS saldo,
1070 (SELECT SUM(ac.amount)
1072 JOIN chart c ON (ac.chart_id = c.id)
1078 AND c.accno = ?) AS sum_credit,
1080 (SELECT SUM(ac.amount)
1082 JOIN chart c ON (ac.chart_id = c.id)
1088 AND c.accno = ?) AS sum_debit,
1090 (SELECT max(ac.transdate) FROM acc_trans ac
1091 JOIN chart c ON (ac.chart_id = c.id)
1096 AND c.accno = ?) AS last_transaction
1101 $drcr = prepare_query($form, $dbh, $q_drcr);
1103 if ($form->{project_id}) {
1104 # prepare query for each account
1107 (SELECT SUM(ac.sellprice * ac.qty) * -1
1109 JOIN parts p ON (ac.parts_id = p.id)
1110 JOIN ap a ON (ac.trans_id = a.id)
1111 JOIN chart c ON (p.expense_accno_id = c.id)
1116 AND c.accno = ?) AS debit,
1118 (SELECT SUM(ac.sellprice * ac.qty)
1120 JOIN parts p ON (ac.parts_id = p.id)
1121 JOIN ar a ON (ac.trans_id = a.id)
1122 JOIN chart c ON (p.income_accno_id = c.id)
1127 AND c.accno = ?) AS credit,
1129 (SELECT SUM(ac.amount)
1131 JOIN chart c ON (ac.chart_id = c.id)
1136 AND c.accno = ?) AS saldo,
1138 (SELECT SUM(ac.amount)
1140 JOIN chart c ON (ac.chart_id = c.id)
1146 AND c.accno = ?) AS sum_credit,
1148 (SELECT SUM(ac.amount)
1150 JOIN chart c ON (ac.chart_id = c.id)
1156 AND c.accno = ?) AS sum_debit,
1159 (SELECT max(ac.transdate) FROM acc_trans ac
1160 JOIN chart c ON (ac.chart_id = c.id)
1165 AND c.accno = ?) AS last_transaction
1168 $project_drcr = prepare_query($form, $dbh, $q_project_drcr);
1172 my ($debit, $credit, $saldo, $soll_saldo, $haben_saldo,$soll_kummuliert, $haben_kummuliert, $last_transaction);
1174 foreach my $accno (sort keys %trb) {
1177 $ref->{accno} = $accno;
1178 map { $ref->{$_} = $trb{$accno}{$_} }
1179 qw(description category charttype amount soll_eb haben_eb);
1181 $ref->{balance} = $form->round_amount($balance{ $ref->{accno} }, 2);
1183 if ($trb{$accno}{charttype} eq 'A') {
1186 do_statement($form, $drcr, $q_drcr, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno});
1188 ($debit, $credit, $saldo, $haben_saldo, $soll_saldo, $soll_kumuliert, $haben_kumuliert) = (0, 0, 0, 0, 0, 0, 0);
1189 $last_transaction = "";
1190 while (($debit, $credit, $saldo, $haben_kumuliert, $soll_kumuliert, $last_transaction) = $drcr->fetchrow_array) {
1191 $ref->{debit} += $debit;
1192 $ref->{credit} += $credit;
1194 $ref->{haben_saldo} += $saldo;
1196 $ref->{soll_saldo} += $saldo * -1;
1198 $ref->{last_transaction} = $last_transaction;
1199 $ref->{soll_kumuliert} = $soll_kumuliert * -1;
1200 $ref->{haben_kumuliert} = $haben_kumuliert;
1204 if ($form->{project_id}) {
1207 do_statement($form, $project_drcr, $q_project_drcr, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno}, $ref->{accno});
1209 ($debit, $credit) = (0, 0);
1210 while (($debit, $credit, $saldo, $haben_kumuliert, $soll_kumuliert, $last_transaction) = $project_drcr->fetchrow_array) {
1211 $ref->{debit} += $debit;
1212 $ref->{credit} += $credit;
1214 $ref->{haben_saldo} += $saldo;
1216 $ref->{soll_saldo} += $saldo * -1;
1218 $ref->{soll_kumuliert} += $soll_kumuliert * -1;
1219 $ref->{haben_kumuliert} += $haben_kumuliert;
1221 $project_drcr->finish;
1224 $ref->{debit} = $form->round_amount($ref->{debit}, 2);
1225 $ref->{credit} = $form->round_amount($ref->{credit}, 2);
1226 $ref->{haben_saldo} = $form->round_amount($ref->{haben_saldo}, 2);
1227 $ref->{soll_saldo} = $form->round_amount($ref->{soll_saldo}, 2);
1228 $ref->{haben_kumuliert} = $form->round_amount($ref->{haben_kumuliert}, 2);
1229 $ref->{soll_kumuliert} = $form->round_amount($ref->{soll_kumuliert}, 2);
1233 @accno = grep { $_ le "$ref->{accno}" } @headingaccounts;
1234 $accno = pop @accno;
1236 $trb{$accno}{debit} += $ref->{debit};
1237 $trb{$accno}{credit} += $ref->{credit};
1238 $trb{$accno}{soll_saldo} += $ref->{soll_saldo};
1239 $trb{$accno}{haben_saldo} += $ref->{haben_saldo};
1240 $trb{$accno}{soll_kumuliert} += $ref->{soll_kumuliert};
1241 $trb{$accno}{haben_kumuliert} += $ref->{haben_kumuliert};
1244 push @{ $form->{TB} }, $ref;
1250 # debits and credits for headings
1251 foreach $accno (@headingaccounts) {
1252 foreach $ref (@{ $form->{TB} }) {
1253 if ($accno eq $ref->{accno}) {
1254 $ref->{debit} = $trb{$accno}{debit};
1255 $ref->{credit} = $trb{$accno}{credit};
1256 $ref->{soll_saldo} = $trb{$accno}{soll_saldo};
1257 $ref->{haben_saldo} = $trb{$accno}{haben_saldo};
1258 $ref->{soll_kumuliert} = $trb{$accno}{soll_kumuliert};
1259 $ref->{haben_kumuliert} = $trb{$accno}{haben_kumuliert}; }
1263 $main::lxdebug->leave_sub();
1267 $main::lxdebug->enter_sub();
1268 my ($self, $dbh, $form) = @_;
1269 my $arap = $form->{arap} eq "ar" ? "ar" : "ap";
1270 my $query = qq|SELECT invnumber FROM $arap WHERE invnumber LIKE "Storno zu "|;
1271 my $sth = $dbh->prepare($query);
1272 while(my $ref = $sth->fetchrow_hashref()) {
1273 $ref->{invnumer} =~ s/Storno zu //g;
1274 $form->{storno}{$ref->{invnumber}} = 1;
1276 $main::lxdebug->leave_sub();
1280 $main::lxdebug->enter_sub();
1282 my ($self, $myconfig, $form) = @_;
1284 # connect to database
1285 my $dbh = $form->dbconnect($myconfig);
1287 my ($invoice, $arap, $buysell, $ct, $ct_id, $ml);
1289 if ($form->{ct} eq "customer") {
1302 $ct_id = "${ct}_id";
1304 $form->{todate} = $form->current_date($myconfig) unless ($form->{todate});
1305 my $todate = conv_dateq($form->{todate});
1306 my $fromdate = conv_dateq($form->{fromdate});
1308 my $fromwhere = ($form->{fromdate} ne "") ? " AND (transdate >= (date $fromdate)) " : "";
1310 my $where = " 1 = 1 ";
1313 if ($form->{$ct_id}) {
1314 $where .= qq| AND (ct.id = | . conv_i($form->{$ct_id}) . qq|)|;
1315 } elsif ($form->{ $form->{ct} }) {
1316 $where .= qq| AND (ct.name ILIKE | . $dbh->quote('%' . $form->{$ct} . '%') . qq|)|;
1320 if ($form->{department}) {
1321 ($null, $department_id) = split /--/, $form->{department};
1322 $dpt_join = qq| JOIN department d ON (a.department_id = d.id) |;
1323 $where .= qq| AND (a.department_id = | . conv_i($department_id, 'NULL') . qq|)|;
1327 -- between 0-30 days
1329 SELECT ${ct}.id AS ctid, ${ct}.name,
1330 street, zipcode, city, country, contact, email,
1331 phone as customerphone, fax as customerfax, ${ct}number,
1332 "invnumber", "transdate",
1333 (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",
1334 "duedate", invoice, ${arap}.id,
1337 WHERE (${arap}.curr = exchangerate.curr)
1338 AND (exchangerate.transdate = ${arap}.transdate)) AS exchangerate
1340 WHERE ((paid != amount) OR (datepaid > (date $todate) AND datepaid is not null))
1341 AND (${arap}.storno IS FALSE)
1342 AND (${arap}.${ct}_id = ${ct}.id)
1344 AND (transdate <= (date $todate) $fromwhere )
1346 ORDER BY ctid, transdate, invnumber |;
1348 my $sth_details = prepare_query($form, $dbh, $q_details);
1350 # select outstanding vendors or customers, depends on $ct
1352 qq|SELECT DISTINCT ct.id, ct.name
1353 FROM $ct ct, $arap a
1356 AND (a.${ct_id} = ct.id)
1357 AND ((a.paid != a.amount) OR ((a.datepaid > $todate) AND (datepaid is NOT NULL)))
1358 AND (a.transdate <= $todate $fromwhere)
1361 my $sth = prepare_execute_query($form, $dbh, $query);
1364 # for each company that has some stuff outstanding
1365 while (my ($id) = $sth->fetchrow_array) {
1366 do_statement($form, $sth_details, $q_details, $id);
1368 while (my $ref = $sth_details->fetchrow_hashref(NAME_lc)) {
1369 $ref->{module} = ($ref->{invoice}) ? $invoice : $arap;
1370 $ref->{exchangerate} = 1 unless $ref->{exchangerate};
1371 push @{ $form->{AG} }, $ref;
1374 $sth_details->finish;
1383 $main::lxdebug->leave_sub();
1387 $main::lxdebug->enter_sub();
1389 my ($self, $myconfig, $form) = @_;
1391 # connect to database
1392 my $dbh = $form->dbconnect($myconfig);
1394 my $ct = $form->{ct} eq "customer" ? "customer" : "vendor";
1397 qq|SELECT ct.name, ct.email, ct.cc, ct.bcc
1400 ($form->{ $form->{ct} }, $form->{email}, $form->{cc}, $form->{bcc}) =
1401 selectrow_query($form, $dbh, $query, $form->{"${ct}_id"});
1404 $main::lxdebug->leave_sub();
1407 sub get_taxaccounts {
1408 $main::lxdebug->enter_sub();
1410 my ($self, $myconfig, $form) = @_;
1412 # connect to database
1413 my $dbh = $form->dbconnect($myconfig);
1417 qq|SELECT c.accno, c.description, t.rate
1419 WHERE (c.link LIKE '%CT_tax%') AND (c.id = t.chart_id)
1421 $form->{taxaccounts} = selectall_hashref_quert($form, $dbh, $query);
1425 $main::lxdebug->leave_sub();
1429 $main::lxdebug->enter_sub();
1431 my ($self, $myconfig, $form) = @_;
1433 # connect to database
1434 my $dbh = $form->dbconnect($myconfig);
1436 my ($null, $department_id) = split /--/, $form->{department};
1439 my $where = "1 = 1";
1441 if ($department_id) {
1442 $where .= qq| AND (a.department_id = | . conv_i($department_id, 'NULL') . qq|) |;
1447 if ($form->{accno}) {
1448 $accno = $form->{accno};
1449 $rate = $form->{"$form->{accno}_rate"};
1450 $accno = qq| AND (ch.accno = | . $dbh->quote($accno) . qq|)|;
1456 if ($form->{db} eq 'ar') {
1457 $table = "customer";
1464 my $arap = lc($ARAP);
1466 my $transdate = "a.transdate";
1468 if ($form->{method} eq 'cash') {
1469 $transdate = "a.datepaid";
1471 my $todate = conv_dateq($form->{todate} ? $form->{todate} : $form->current_date($myconfig));
1478 JOIN chart ON (chart_id = id)
1479 WHERE (link LIKE '%${ARAP}_paid%')
1480 AND (transdate <= $todate)
1485 # if there are any dates construct a where
1486 $where .= " AND ($transdate >= " . conv_dateq($form->{fromdate}) . ") " if ($form->{fromdate});
1487 $where .= " AND ($transdate <= " . conv_dateq($form->{todate}) . ") " if ($form->{todate});
1489 my $ml = ($form->{db} eq 'ar') ? 1 : -1;
1491 my $sortorder = join ', ', $form->sort_columns(qw(transdate invnumber name));
1492 $sortorder = $form->{sort} if ($form->{sort} && grep({ $_ eq $form->{sort} } qw(id transdate invnumber name netamount tax)));
1494 if ($form->{report} !~ /nontaxable/) {
1496 qq|SELECT a.id, '0' AS invoice, $transdate AS transdate, a.invnumber, n.name, a.netamount,
1497 ac.amount * $ml AS tax
1499 JOIN ${arap} a ON (a.id = ac.trans_id)
1500 JOIN chart ch ON (ch.id = ac.chart_id)
1501 JOIN $table n ON (n.id = a.${table}_id)
1505 AND (a.invoice = '0')
1509 SELECT a.id, '1' AS invoice, $transdate AS transdate, a.invnumber, n.name, i.sellprice * i.qty AS netamount,
1510 i.sellprice * i.qty * $rate * $ml AS tax
1512 JOIN ${arap} a ON (a.id = ac.trans_id)
1513 JOIN chart ch ON (ch.id = ac.chart_id)
1514 JOIN $table n ON (n.id = a.${table}_id)
1515 JOIN ${table}tax t ON (t.${table}_id = n.id)
1516 JOIN invoice i ON (i.trans_id = a.id)
1517 JOIN partstax p ON (p.parts_id = i.parts_id)
1521 AND (a.invoice = '1')
1522 ORDER BY $sortorder|;
1524 # only gather up non-taxable transactions
1526 qq|SELECT a.id, '0' AS invoice, $transdate AS transdate, a.invnumber, n.name, a.netamount
1528 JOIN ${arap} a ON (a.id = ac.trans_id)
1529 JOIN $table n ON (n.id = a.${table}_id)
1532 AND (a.invoice = '0')
1533 AND (a.netamount = a.amount)
1537 SELECT a.id, '1' AS invoice, $transdate AS transdate, a.invnumber, n.name, i.sellprice * i.qty AS netamount
1539 JOIN ${arap} a ON (a.id = ac.trans_id)
1540 JOIN $table n ON (n.id = a.${table}_id)
1541 JOIN invoice i ON (i.trans_id = a.id)
1544 AND (a.invoice = '1')
1546 a.${table}_id NOT IN (SELECT ${table}_id FROM ${table}tax t (${table}_id))
1548 i.parts_id NOT IN (SELECT parts_id FROM partstax p (parts_id))
1550 GROUP BY a.id, a.invnumber, $transdate, n.name, i.sellprice, i.qty
1551 ORDER by $sortorder|;
1554 $form->{TR} = selectall_hashref_query($form, $dbh, $query);
1558 $main::lxdebug->leave_sub();
1561 sub paymentaccounts {
1562 $main::lxdebug->enter_sub();
1564 my ($self, $myconfig, $form) = @_;
1566 # connect to database, turn AutoCommit off
1567 my $dbh = $form->dbconnect_noauto($myconfig);
1569 my $ARAP = $form->{db} eq "ar" ? "AR" : "AP";
1571 # get A(R|P)_paid accounts
1573 qq|SELECT accno, description
1575 WHERE link LIKE '%${ARAP}_paid%'|;
1576 $form->{PR} = selectall_hashref_query($form, $dbh, $query);
1580 $main::lxdebug->leave_sub();
1584 $main::lxdebug->enter_sub();
1586 my ($self, $myconfig, $form) = @_;
1588 # connect to database, turn AutoCommit off
1589 my $dbh = $form->dbconnect_noauto($myconfig);
1593 if ($form->{db} eq 'ar') {
1594 $table = 'customer';
1606 if ($form->{department_id}) {
1607 $dpt_join = qq| JOIN dpt_trans t ON (t.trans_id = ac.trans_id) |;
1608 $where = qq| AND (t.department_id = | . conv_i($form->{department_id}, 'NULL') . qq|) |;
1611 if ($form->{fromdate}) {
1612 $where .= " AND (ac.transdate >= " . $dbh->quote($form->{fromdate}) . ") ";
1614 if ($form->{todate}) {
1615 $where .= " AND (ac.transdate <= " . $dbh->quote($form->{todate}) . ") ";
1617 if (!$form->{fx_transaction}) {
1618 $where .= " AND ac.fx_transaction = '0'";
1623 if ($form->{reference}) {
1624 $reference = $dbh->quote('%' . $form->{reference} . '%');
1625 $invnumber = " AND (a.invnumber LIKE $reference)";
1626 $reference = " AND (g.reference LIKE $reference)";
1628 if ($form->{source}) {
1629 $where .= " AND (ac.source ILIKE " . $dbh->quote('%' . $form->{source} . '%') . ") ";
1631 if ($form->{memo}) {
1632 $where .= " AND (ac.memo ILIKE " . $dbh->quote('%' . $form->{memo} . '%') . ") ";
1635 my %sort_columns = (
1636 'transdate' => [ qw(transdate lower_invnumber lower_name) ],
1637 'invnumber' => [ qw(lower_invnumber lower_name transdate) ],
1638 'name' => [ qw(lower_name transdate) ],
1639 'source' => [ qw(lower_source) ],
1640 'memo' => [ qw(lower_memo) ],
1642 my %lowered_columns = (
1643 'invnumber' => { 'gl' => 'g.reference', 'arap' => 'a.invnumber', },
1644 'memo' => { 'gl' => 'ac.memo', 'arap' => 'ac.memo', },
1645 'source' => { 'gl' => 'ac.source', 'arap' => 'ac.source', },
1646 'name' => { 'gl' => 'g.description', 'arap' => 'c.name', },
1649 my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC';
1650 my $sortkey = $sort_columns{$form->{sort}} ? $form->{sort} : 'transdate';
1651 my $sortorder = join ', ', map { "$_ $sortdir" } @{ $sort_columns{$sortkey} };
1654 my %columns_for_sorting = ( 'gl' => '', 'arap' => '', );
1655 foreach my $spec (@{ $sort_columns{$sortkey} }) {
1656 next if ($spec !~ m/^lower_(.*)$/);
1659 map { $columns_for_sorting{$_} .= sprintf(', lower(%s) AS lower_%s', $lowered_columns{$column}->{$_}, $column) } qw(gl arap);
1662 $query = qq|SELECT id, accno, description FROM chart WHERE accno = ?|;
1663 my $sth = prepare_query($form, $dbh, $query);
1666 qq|SELECT c.name, a.invnumber, a.ordnumber,
1667 ac.transdate, ac.amount * $ml AS paid, ac.source,
1668 a.invoice, a.id, ac.memo, '${arap}' AS module
1669 $columns_for_sorting{arap}
1671 JOIN $arap a ON (ac.trans_id = a.id)
1672 JOIN $table c ON (c.id = a.${table}_id)
1674 WHERE (ac.chart_id = ?)
1680 SELECT g.description, g.reference, NULL AS ordnumber,
1681 ac.transdate, ac.amount * $ml AS paid, ac.source,
1682 '0' as invoice, g.id, ac.memo, 'gl' AS module
1683 $columns_for_sorting{gl}
1685 JOIN gl g ON (g.id = ac.trans_id)
1687 WHERE (ac.chart_id = ?)
1690 AND (ac.amount * $ml) > 0
1692 ORDER BY $sortorder|;
1693 my $sth_details = prepare_query($form, $dbh, $q_details);
1697 # cycle through each id
1698 foreach my $accno (split(/ /, $form->{paymentaccounts})) {
1699 do_statement($form, $sth, $query, $accno);
1700 my $ref = $sth->fetchrow_hashref();
1701 push(@{ $form->{PR} }, $ref);
1704 $form->{ $ref->{id} } = [] unless ($form->{ $ref->{id} });
1706 do_statement($form, $sth_details, $q_details, $ref->{id}, $ref->{id});
1707 while (my $pr = $sth_details->fetchrow_hashref()) {
1708 push(@{ $form->{ $ref->{id} } }, $pr);
1710 $sth_details->finish();
1715 $main::lxdebug->leave_sub();
1719 $main::lxdebug->enter_sub();
1721 my ($self, $myconfig, $form) = @_;
1723 # connect to database
1724 my $dbh = $form->dbconnect($myconfig);
1726 my $last_period = 0;
1729 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);
1731 $form->{decimalplaces} *= 1;
1733 &get_accounts_g($dbh, $last_period, $form->{fromdate}, $form->{todate}, $form, "pos_bwa");
1735 # if there are any compare dates
1736 if ($form->{fromdate} || $form->{todate}) {
1738 if ($form->{fromdate}) {
1739 $form->{fromdate} =~ /[0-9]*\.[0-9]*\.([0-9]*)/;
1742 $form->{todate} =~ /[0-9]*\.[0-9]*\.([0-9]*)/;
1745 $kummfromdate = $form->{comparefromdate};
1746 $kummtodate = $form->{comparetodate};
1747 &get_accounts_g($dbh, $last_period, $kummfromdate, $kummtodate, $form, "pos_bwa");
1750 @periods = qw(jetzt kumm);
1751 @gesamtleistung = qw(1 2 3);
1752 @gesamtkosten = qw (10 11 12 13 14 15 16 17 18 19 20);
1754 qw (rohertrag betriebrohertrag betriebsergebnis neutraleraufwand neutralerertrag ergebnisvorsteuern ergebnis gesamtleistung gesamtkosten);
1756 foreach $key (@periods) {
1757 $form->{ "$key" . "gesamtleistung" } = 0;
1758 $form->{ "$key" . "gesamtkosten" } = 0;
1760 foreach $category (@categories) {
1762 if (defined($form->{$category}{$key})) {
1763 $form->{"$key$category"} =
1764 $form->format_amount($myconfig,
1765 $form->round_amount($form->{$category}{$key}, 2
1767 $form->{decimalplaces},
1771 foreach $item (@gesamtleistung) {
1772 $form->{ "$key" . "gesamtleistung" } += $form->{$item}{$key};
1774 foreach $item (@gesamtkosten) {
1775 $form->{ "$key" . "gesamtkosten" } += $form->{$item}{$key};
1777 $form->{ "$key" . "rohertrag" } =
1778 $form->{ "$key" . "gesamtleistung" } - $form->{4}{$key};
1779 $form->{ "$key" . "betriebrohertrag" } =
1780 $form->{ "$key" . "rohertrag" } + $form->{5}{$key};
1781 $form->{ "$key" . "betriebsergebnis" } =
1782 $form->{ "$key" . "betriebrohertrag" } -
1783 $form->{ "$key" . "gesamtkosten" };
1784 $form->{ "$key" . "neutraleraufwand" } =
1785 $form->{30}{$key} + $form->{31}{$key};
1786 $form->{ "$key" . "neutralertrag" } =
1787 $form->{32}{$key} + $form->{33}{$key} + $form->{34}{$key};
1788 $form->{ "$key" . "ergebnisvorsteuern" } =
1789 $form->{ "$key" . "betriebsergebnis" } -
1790 $form->{ "$key" . "neutraleraufwand" } +
1791 $form->{ "$key" . "neutralertrag" };
1792 $form->{ "$key" . "ergebnis" } =
1793 $form->{ "$key" . "ergebnisvorsteuern" } - $form->{35}{$key};
1795 if ($form->{ "$key" . "gesamtleistung" } > 0) {
1796 foreach $category (@categories) {
1797 if (defined($form->{$category}{$key})) {
1798 $form->{ "$key" . "gl" . "$category" } =
1799 $form->format_amount(
1801 $form->round_amount(
1802 ($form->{$category}{$key} /
1803 $form->{ "$key" . "gesamtleistung" } * 100
1805 $form->{decimalplaces}
1807 $form->{decimalplaces},
1811 foreach $item (@ergebnisse) {
1812 $form->{ "$key" . "gl" . "$item" } =
1813 $form->format_amount($myconfig,
1814 $form->round_amount(
1815 ( $form->{ "$key" . "$item" } /
1816 $form->{ "$key" . "gesamtleistung" } * 100
1818 $form->{decimalplaces}
1820 $form->{decimalplaces},
1825 if ($form->{ "$key" . "gesamtkosten" } > 0) {
1826 foreach $category (@categories) {
1827 if (defined($form->{$category}{$key})) {
1828 $form->{ "$key" . "gk" . "$category" } =
1829 $form->format_amount($myconfig,
1830 $form->round_amount(
1831 ($form->{$category}{$key} /
1832 $form->{ "$key" . "gesamtkosten" } * 100
1834 $form->{decimalplaces}
1836 $form->{decimalplaces},
1840 foreach $item (@ergebnisse) {
1841 $form->{ "$key" . "gk" . "$item" } =
1842 $form->format_amount($myconfig,
1843 $form->round_amount(
1844 ($form->{ "$key" . "$item" } /
1845 $form->{ "$key" . "gesamtkosten" } * 100
1847 $form->{decimalplaces}
1849 $form->{decimalplaces},
1854 if ($form->{10}{$key} > 0) {
1855 foreach $category (@categories) {
1856 if (defined($form->{$category}{$key})) {
1857 $form->{ "$key" . "pk" . "$category" } =
1858 $form->format_amount(
1860 $form->round_amount(
1861 ($form->{$category}{$key} / $form->{10}{$key} * 100),
1862 $form->{decimalplaces}
1864 $form->{decimalplaces},
1868 foreach $item (@ergebnisse) {
1869 $form->{ "$key" . "pk" . "$item" } =
1870 $form->format_amount($myconfig,
1871 $form->round_amount(
1872 ($form->{ "$key" . "$item" } /
1873 $form->{10}{$key} * 100
1875 $form->{decimalplaces}
1877 $form->{decimalplaces},
1882 if ($form->{4}{$key} > 0) {
1883 foreach $category (@categories) {
1884 if (defined($form->{$category}{$key})) {
1885 $form->{ "$key" . "auf" . "$category" } =
1886 $form->format_amount(
1888 $form->round_amount(
1889 ($form->{$category}{$key} / $form->{4}{$key} * 100),
1890 $form->{decimalplaces}
1892 $form->{decimalplaces},
1896 foreach $item (@ergebnisse) {
1897 $form->{ "$key" . "auf" . "$item" } =
1898 $form->format_amount($myconfig,
1899 $form->round_amount(
1900 ($form->{ "$key" . "$item" } /
1901 $form->{4}{$key} * 100
1903 $form->{decimalplaces}
1905 $form->{decimalplaces},
1910 foreach $item (@ergebnisse) {
1911 $form->{ "$key" . "$item" } =
1912 $form->format_amount($myconfig,
1913 $form->round_amount($form->{ "$key" . "$item" },
1914 $form->{decimalplaces}
1916 $form->{decimalplaces},
1923 $main::lxdebug->leave_sub();
1927 $main::lxdebug->enter_sub();
1929 my ($self, $myconfig, $form) = @_;
1931 # connect to database
1932 my $dbh = $form->dbconnect($myconfig);
1934 my $last_period = 0;
1935 my @categories_cent = qw(51r 511 86r 861 97r 971 93r 931
1936 96 66 43 45 53 62 65 67);
1937 my @categories_euro = qw(48 51 86 91 97 93 94);
1938 $form->{decimalplaces} *= 1;
1940 foreach $item (@categories_cent) {
1941 $form->{"$item"} = 0;
1943 foreach $item (@categories_euro) {
1944 $form->{"$item"} = 0;
1947 &get_accounts_g($dbh, $last_period, $form->{fromdate}, $form->{todate}, $form, "pos_ustva");
1949 # foreach $item (@categories_cent) {
1950 # if ($form->{$item}{"jetzt"} > 0) {
1951 # $form->{$item} = $form->{$item}{"jetzt"};
1952 # delete $form->{$item}{"jetzt"};
1955 # foreach $item (@categories_euro) {
1956 # if ($form->{$item}{"jetzt"} > 0) {
1957 # $form->{$item} = $form->{$item}{"jetzt"};
1958 # delete $form->{$item}{"jetzt"};
1959 # } foreach $item (@categories_cent) {
1960 # if ($form->{$item}{"jetzt"} > 0) {
1961 # $form->{$item} = $form->{$item}{"jetzt"};
1962 # delete $form->{$item}{"jetzt"};
1965 # foreach $item (@categories_euro) {
1966 # if ($form->{$item}{"jetzt"} > 0) {
1967 # $form->{$item} = $form->{$item}{"jetzt"};
1968 # delete $form->{$item}{"jetzt"};
1975 # Berechnung der USTVA Formularfelder
1977 $form->{"51r"} = $form->{"511"};
1978 $form->{"86r"} = $form->{"861"};
1979 $form->{"97r"} = $form->{"971"};
1980 $form->{"93r"} = $form->{"931"};
1982 #$form->{"96"} = $form->{"94"} * 0.16;
1984 $form->{"51r"} + $form->{"86r"} + $form->{"97r"} + $form->{"93r"} +
1986 $form->{"45"} = $form->{"43"};
1987 $form->{"53"} = $form->{"43"};
1988 $form->{"62"} = $form->{"43"} - $form->{"66"};
1989 $form->{"65"} = $form->{"43"} - $form->{"66"};
1990 $form->{"67"} = $form->{"43"} - $form->{"66"};
1992 foreach $item (@categories_cent) {
1994 $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2),
1998 foreach $item (@categories_euro) {
2000 $form->format_amount($myconfig, $form->round_amount($form->{$item}, 0),
2006 $main::lxdebug->leave_sub();
2009 sub income_statement {
2010 $main::lxdebug->enter_sub();
2012 my ($self, $myconfig, $form) = @_;
2014 # connect to database
2015 my $dbh = $form->dbconnect($myconfig);
2017 my $last_period = 0;
2018 my @categories_einnahmen = qw(1 2 3 4 5 6 7);
2019 my @categories_ausgaben =
2020 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);
2022 my @ergebnisse = qw(sumeura sumeurb guvsumme);
2024 $form->{decimalplaces} *= 1;
2026 foreach $item (@categories_einnahmen) {
2029 foreach $item (@categories_ausgaben) {
2033 foreach $item (@ergebnisse) {
2037 &get_accounts_g($dbh, $last_period, $form->{fromdate}, $form->{todate},
2040 foreach $item (@categories_einnahmen) {
2041 $form->{"eur${item}"} =
2042 $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2));
2043 $form->{"sumeura"} += $form->{$item};
2045 foreach $item (@categories_ausgaben) {
2046 $form->{"eur${item}"} =
2047 $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2));
2048 $form->{"sumeurb"} += $form->{$item};
2051 $form->{"guvsumme"} = $form->{"sumeura"} - $form->{"sumeurb"};
2053 foreach $item (@ergebnisse) {
2055 $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2));
2057 $main::lxdebug->leave_sub();