can't set $p without $cgi
[freeside.git] / sql-ledger / old / sql-ledger / SL / CA.pm
1 #=====================================================================
2 # SQL-Ledger Accounting
3 # Copyright (C) 2001
4 #
5 #  Author: Dieter Simader
6 #   Email: dsimader@sql-ledger.org
7 #     Web: http://www.sql-ledger.org
8 #
9 #  Contributors:
10 #
11 # This program is free software; you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License as published by
13 # the Free Software Foundation; either version 2 of the License, or
14 # (at your option) any later version.
15 #
16 # This program is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 # GNU General Public License for more details.
20 # You should have received a copy of the GNU General Public License
21 # along with this program; if not, write to the Free Software
22 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #======================================================================
24 # chart of accounts
25 #
26 # CHANGE LOG:
27 #   DS. 2000-07-04  Created
28 #
29 #======================================================================
30
31
32 package CA;
33
34
35 sub all_accounts {
36   my ($self, $myconfig, $form) = @_;
37
38   my $amount = ();
39   # connect to database
40   my $dbh = $form->dbconnect($myconfig);
41
42   my $query = qq|SELECT accno,
43                  SUM(acc_trans.amount) AS amount
44                  FROM chart, acc_trans
45                  WHERE chart.id = acc_trans.chart_id
46                  GROUP BY accno|;
47   my $sth = $dbh->prepare($query);
48   $sth->execute || $form->dberror($query);
49
50   while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
51     $amount{$ref->{accno}} = $ref->{amount}
52   }
53   $sth->finish;
54  
55   $query = qq|SELECT accno, description
56               FROM gifi|;
57   $sth = $dbh->prepare($query);
58   $sth->execute || $form->dberror($query);
59
60   my $gifi = ();
61   while (my ($accno, $description) = $sth->fetchrow_array) {
62     $gifi{$accno} = $description;
63   }
64   $sth->finish;
65
66   $query = qq|SELECT c.id, c.accno, c.description, c.charttype, c.gifi_accno,
67               c.category, c.link
68               FROM chart c
69               ORDER BY accno|;
70   $sth = $dbh->prepare($query);
71   $sth->execute || $form->dberror($query);
72  
73   while (my $ca = $sth->fetchrow_hashref(NAME_lc)) {
74     $ca->{amount} = $amount{$ca->{accno}};
75     $ca->{gifi_description} = $gifi{$ca->{gifi_accno}};
76     if ($ca->{amount} < 0) {
77       $ca->{debit} = $ca->{amount} * -1;
78     } else {
79       $ca->{credit} = $ca->{amount};
80     }
81     push @{ $form->{CA} }, $ca;
82   }
83
84   $sth->finish;
85   $dbh->disconnect;
86
87 }
88
89
90 sub all_transactions {
91   my ($self, $myconfig, $form) = @_;
92
93   # connect to database
94   my $dbh = $form->dbconnect($myconfig);
95
96   # get chart_id
97   my $query = qq|SELECT id FROM chart
98                  WHERE accno = '$form->{accno}'|;
99   if ($form->{accounttype} eq 'gifi') {
100     $query = qq|SELECT id FROM chart
101                 WHERE gifi_accno = '$form->{gifi_accno}'|;
102   }
103   my $sth = $dbh->prepare($query);
104   $sth->execute || $form->dberror($query);
105
106   my @id = ();
107   while (my ($id) = $sth->fetchrow_array) {
108     push @id, $id;
109   }
110
111   $sth->finish;
112
113   my $where = '1 = 1';
114   # build WHERE clause from dates if any
115   if ($form->{fromdate}) {
116     $where .= " AND ac.transdate >= '$form->{fromdate}'";
117   }
118   if ($form->{todate}) {
119     $where .= " AND ac.transdate <= '$form->{todate}'";
120   }
121
122   my $sortorder = join ', ', $form->sort_columns(qw(transdate reference description));
123   my $false = ($myconfig->{dbdriver} eq 'Pg') ? FALSE : q|'0'|;
124   
125   # Oracle workaround, use ordinal positions
126   my %ordinal = ( transdate => 4,
127                   reference => 2,
128                   description => 3 );
129   map { $sortorder =~ s/$_/$ordinal{$_}/ } keys %ordinal;
130
131    
132   if ($form->{accno}) {
133     # get category for account
134     $query = qq|SELECT category
135                 FROM chart
136                 WHERE accno = '$form->{accno}'|;
137     $sth = $dbh->prepare($query);
138
139     $sth->execute || $form->dberror($query);
140     ($form->{category}) = $sth->fetchrow_array;
141     $sth->finish;
142     
143     if ($form->{fromdate}) {
144       # get beginning balance
145       $query = qq|SELECT SUM(ac.amount)
146                   FROM acc_trans ac, chart c
147                   WHERE ac.chart_id = c.id
148                   AND c.accno = '$form->{accno}'
149                   AND ac.transdate < date '$form->{fromdate}'
150                   |;
151       $sth = $dbh->prepare($query);
152
153       $sth->execute || $form->dberror($query);
154       ($form->{balance}) = $sth->fetchrow_array;
155       $sth->finish;
156     }
157   }
158   
159   if ($form->{accounttype} eq 'gifi' && $form->{gifi_accno}) {
160     # get category for account
161     $query = qq|SELECT category
162                 FROM chart
163                 WHERE gifi_accno = '$form->{gifi_accno}'|;
164     $sth = $dbh->prepare($query);
165
166     $sth->execute || $form->dberror($query);
167     ($form->{category}) = $sth->fetchrow_array;
168     $sth->finish;
169  
170     if ($form->{fromdate}) {
171       # get beginning balance
172       $query = qq|SELECT SUM(ac.amount)
173                   FROM acc_trans ac, chart c
174                   WHERE ac.chart_id = c.id
175                   AND c.gifi_accno = '$form->{gifi_accno}'
176                   AND ac.transdate < date '$form->{fromdate}'
177                   |;
178       $sth = $dbh->prepare($query);
179
180       $sth->execute || $form->dberror($query);
181       ($form->{balance}) = $sth->fetchrow_array;
182       $sth->finish;
183     }
184   }
185  
186   $query = "";
187   
188   foreach my $id (@id) {
189     
190     # get all transactions
191     $query .= qq|
192       SELECT g.id, g.reference, g.description, ac.transdate,
193                 $false AS invoice,
194                 ac.amount, 'gl' as charttype
195                 FROM gl g, acc_trans ac
196                 WHERE $where
197                 AND ac.chart_id = $id
198                 AND ac.trans_id = g.id
199       UNION ALL
200       SELECT a.id, a.invnumber, c.name, ac.transdate,
201                 a.invoice,
202                 ac.amount, 'ar' as charttype
203                 FROM ar a, acc_trans ac, customer c
204                 WHERE $where
205                 AND ac.chart_id = $id
206                 AND ac.trans_id = a.id
207                 AND a.customer_id = c.id
208       UNION ALL
209       SELECT a.id, a.invnumber, v.name, ac.transdate,
210                 a.invoice,
211                 ac.amount, 'ap' as charttype
212                 FROM ap a, acc_trans ac, vendor v
213                 WHERE $where
214                 AND ac.chart_id = $id
215                 AND ac.trans_id = a.id
216                 AND a.vendor_id = v.id
217       UNION ALL|;
218   }
219
220   $query =~ s/UNION ALL$//;
221   $query .= qq|
222       ORDER BY $sortorder|;
223
224   $sth = $dbh->prepare($query);
225   $sth->execute || $form->dberror($query);
226
227   while (my $ca = $sth->fetchrow_hashref(NAME_lc)) {
228
229     # gl
230     if ($ca->{charttype} eq "gl") {
231       $ca->{module} = "gl";
232     }
233
234     # ap
235     if ($ca->{charttype} eq "ap") {
236       $ca->{module} = ($ca->{invoice}) ? 'ir' : 'ap';
237     }
238
239     # ar
240     if ($ca->{charttype} eq "ar") {
241       $ca->{module} = ($ca->{invoice}) ? 'is' : 'ar';
242     }
243
244     if ($ca->{amount} < 0) {
245       $ca->{debit} = $ca->{amount} * -1;
246       $ca->{credit} = 0;
247     } else {
248       $ca->{credit} = $ca->{amount};
249       $ca->{debit} = 0;
250     }
251
252     push @{ $form->{CA} }, $ca;
253
254   }
255  
256   $sth->finish;
257   $dbh->disconnect;
258
259 }
260
261 1;
262