unstable-Zweig als Kopie des "alten" trunks erstellt.
[kivitendo-erp.git] / SL / CA.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) 2001
10 #
11 #  Author: Dieter Simader
12 #   Email: dsimader@sql-ledger.org
13 #     Web: http://www.sql-ledger.org
14 #
15 #  Contributors:
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 # chart of accounts
31 #
32 # CHANGE LOG:
33 #   DS. 2000-07-04  Created
34 #
35 #======================================================================
36
37
38 package CA;
39 use Data::Dumper;
40
41 sub all_accounts {
42   $main::lxdebug->enter_sub();
43
44   my ($self, $myconfig, $form) = @_;
45
46   my $amount = ();
47   # connect to database
48   my $dbh = $form->dbconnect($myconfig);
49
50   my $query = qq|SELECT c.accno,
51                  SUM(a.amount) AS amount
52                  FROM chart c, acc_trans a
53                  WHERE c.id = a.chart_id
54                  GROUP BY c.accno|;
55   my $sth = $dbh->prepare($query);
56   $sth->execute || $form->dberror($query);
57
58   while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
59     $amount{$ref->{accno}} = $ref->{amount}
60   }
61   $sth->finish;
62  
63   $query = qq|SELECT accno, description
64               FROM gifi|;
65   $sth = $dbh->prepare($query);
66   $sth->execute || $form->dberror($query);
67
68   my $gifi = ();
69   while (my ($accno, $description) = $sth->fetchrow_array) {
70     $gifi{$accno} = $description;
71   }
72   $sth->finish;
73
74   $query = qq|SELECT c.id, c.accno, c.description, c.charttype, c.gifi_accno,
75               c.category, c.link
76               FROM chart c
77               ORDER BY accno|;
78   $sth = $dbh->prepare($query);
79   $sth->execute || $form->dberror($query);
80  
81   while (my $ca = $sth->fetchrow_hashref(NAME_lc)) {
82     $ca->{amount} = $amount{$ca->{accno}};
83     $ca->{gifi_description} = $gifi{$ca->{gifi_accno}};
84     if ($ca->{amount} < 0) {
85       $ca->{debit} = $ca->{amount} * -1;
86     } else {
87       $ca->{credit} = $ca->{amount};
88     }
89     push @{ $form->{CA} }, $ca;
90   }
91
92   $sth->finish;
93   $dbh->disconnect;
94
95   $main::lxdebug->leave_sub();
96 }
97
98
99 sub all_transactions {
100   $main::lxdebug->enter_sub();
101
102   my ($self, $myconfig, $form) = @_;
103
104   # connect to database
105   my $dbh = $form->dbconnect($myconfig);
106
107   # get chart_id
108   my $query = qq|SELECT c.id FROM chart c
109                  WHERE c.accno = '$form->{accno}'|;
110   if ($form->{accounttype} eq 'gifi') {
111     $query = qq|SELECT c.id FROM chart c
112                 WHERE c.gifi_accno = '$form->{gifi_accno}'|;
113   }
114   my $sth = $dbh->prepare($query);
115   $sth->execute || $form->dberror($query);
116
117   my @id = ();
118   while (my ($id) = $sth->fetchrow_array) {
119     push @id, $id;
120   }
121   $sth->finish;
122
123   my $fromdate_where;
124   my $todate_where;
125   
126   my $where = '1 = 1';
127   # build WHERE clause from dates if any
128 #  if ($form->{fromdate}) {
129 #    $where .= " AND ac.transdate >= '$form->{fromdate}'";
130 #  }
131 #  if ($form->{todate}) {
132 #    $where .= " AND ac.transdate <= '$form->{todate}'";
133 #  }
134   
135   if ($form->{fromdate}) {
136       $fromto = " AND ac.transdate >= '$form->{fromdate}'";
137       $subwhere .= " AND transdate >= '$form->{fromdate}'";
138       $glwhere = " AND ac.transdate >= '$form->{fromdate}'";
139   }
140
141   if ($form->{todate}) {
142     $fromto .= " AND ac.transdate <= '$form->{todate}'";
143     $subwhere .= " AND transdate <= '$form->{todate}'";
144   }
145
146   if ($form->{eur}) {
147     $AR_PAID = qq|AND ac.trans_id IN
148                    (
149                      SELECT trans_id
150                      FROM acc_trans
151                      JOIN chart ON (chart_id = id)
152                      WHERE link LIKE '%AR_paid%'
153                      $subwhere
154                    )|;
155     $AP_PAID = qq|AND ac.trans_id IN
156                    (
157                      SELECT trans_id
158                      FROM acc_trans
159                      JOIN chart ON (chart_id = id)
160                      WHERE link LIKE '%AP_paid%'
161                      $subwhere
162                    )|;
163     } else {
164       $where .= $fromto;
165       $AR_PAID = "";
166       $AP_PAID = "";
167       $glwhere = "";
168   }
169   my $sortorder = join ', ', $form->sort_columns(qw(transdate reference description));
170   my $false = ($myconfig->{dbdriver} eq 'Pg') ? FALSE : q|'0'|;
171   
172   # Oracle workaround, use ordinal positions
173   my %ordinal = ( transdate => 4,
174                   reference => 2,
175                   description => 3 );
176   map { $sortorder =~ s/$_/$ordinal{$_}/ } keys %ordinal;
177
178
179   my ($null, $department_id) = split /--/, $form->{department};
180   my $dpt_where;
181   my $dpt_join;
182   if ($department_id) {
183     $dpt_join = qq|
184                    JOIN department t ON (t.trans_id = ac.trans_id)
185                   |;
186     $dpt_where == qq|
187                    AND t.department_id = $department_id
188                   |;
189   }
190
191   my $project;
192   if ($form->{project_id}) {
193     $project = qq|
194                  AND ac.project_id = $form->{project_id}
195                  |;
196   }
197
198   if ($form->{accno} || $form->{gifi_accno}) {
199     # get category for account
200     $query = qq|SELECT c.category
201                 FROM chart c
202                 WHERE c.accno = '$form->{accno}'|;
203
204     if ($form->{accounttype} eq 'gifi') {
205       $query = qq|SELECT c.category
206                 FROM chart c
207                 WHERE c.gifi_accno = '$form->{gifi_accno}'
208                 AND c.charttype = 'A'|;
209     }
210
211     $sth = $dbh->prepare($query);
212
213     $sth->execute || $form->dberror($query);
214     ($form->{category}) = $sth->fetchrow_array;
215     $sth->finish;
216     
217     if ($form->{fromdate}) {
218
219       # get beginning balance
220       $query = qq|SELECT SUM(ac.amount)
221                   FROM acc_trans ac
222                   JOIN chart c ON (ac.chart_id = c.id)
223                   $dpt_join
224                   WHERE c.accno = '$form->{accno}'
225                   AND ac.transdate < '$form->{fromdate}'
226                   $dpt_where
227                   $project
228                   |;
229
230       if ($form->{project_id}) {
231
232         $query .= qq|
233
234                UNION
235
236                   SELECT SUM(ac.sellprice)
237                   FROM invoice ac
238                   JOIN ar a ON (ac.trans_id = a.id)
239                   JOIN parts p ON (ac.parts_id = p.id)
240                   JOIN chart c ON (p.income_accno_id = c.id)
241                   $dpt_join
242                   WHERE c.accno = '$form->{accno}'
243                   AND a.transdate < '$form->{fromdate}'
244                   AND c.category = 'I'
245                   $dpt_where
246                   $project
247
248                UNION
249
250                   SELECT SUM(ac.sellprice)
251                   FROM invoice ac
252                   JOIN ap a ON (ac.trans_id = a.id)
253                   JOIN parts p ON (ac.parts_id = p.id)
254                   JOIN chart c ON (p.expense_accno_id = c.id)
255                   $dpt_join
256                   WHERE c.accno = '$form->{accno}'
257                   AND a.transdate < '$form->{fromdate}'
258                   AND c.category = 'E'
259                   $dpt_where
260                   $project
261                   |;
262
263       }
264
265       if ($form->{accounttype} eq 'gifi') {
266         $query = qq|SELECT SUM(ac.amount)
267                   FROM acc_trans ac
268                   JOIN chart c ON (ac.chart_id = c.id)
269                   $dpt_join
270                   WHERE c.gifi_accno = '$form->{gifi_accno}'
271                   AND ac.transdate < '$form->{fromdate}'
272                   $dpt_where
273                   $project
274                   |;
275                   
276         if ($form->{project_id}) {
277
278           $query .= qq|
279
280                UNION
281
282                   SELECT SUM(ac.sellprice)
283                   FROM invoice ac
284                   JOIN ar a ON (ac.trans_id = a.id)
285                   JOIN parts p ON (ac.parts_id = p.id)
286                   JOIN chart c ON (p.income_accno_id = c.id)
287                   $dpt_join
288                   WHERE c.gifi_accno = '$form->{gifi_accno}'
289                   AND a.transdate < '$form->{fromdate}'
290                   AND c.category = 'I'
291                   $dpt_where
292                   $project
293
294                UNION
295
296                   SELECT SUM(ac.sellprice)
297                   FROM invoice ac
298                   JOIN ap a ON (ac.trans_id = a.id)
299                   JOIN parts p ON (ac.parts_id = p.id)
300                   JOIN chart c ON (p.expense_accno_id = c.id)
301                   $dpt_join
302                   WHERE c.gifi_accno = '$form->{gifi_accno}'
303                   AND a.transdate < '$form->{fromdate}'
304                   AND c.category = 'E'
305                   $dpt_where
306                   $project
307                   |;
308
309         }
310       }
311       
312       $sth = $dbh->prepare($query);
313
314       $sth->execute || $form->dberror($query);
315       ($form->{balance}) = $sth->fetchrow_array;
316       $sth->finish;
317     }
318   }
319
320   $query = "";
321   my $union = "";
322
323    foreach my $id (@id) {
324     
325     # get all transactions
326     $query .= qq|$union
327       SELECT g.id, g.reference, g.description, ac.transdate,
328              $false AS invoice, ac.amount, 'gl' as module
329                 FROM gl g, acc_trans ac $dpt_from
330                 WHERE $where
331                 $glwhere
332                 $dpt_join
333                 $project
334                 AND ac.chart_id = $id
335                 AND ac.trans_id = g.id
336       UNION
337       SELECT a.id, a.invnumber, c.name, ac.transdate,
338              a.invoice, ac.amount, 'ar' as module
339                 FROM ar a, acc_trans ac, customer c $dpt_from
340                 WHERE $where
341                 $dpt_join
342                 $project
343                 AND ac.chart_id = $id
344                 AND ac.trans_id = a.id
345                 $AR_PAID
346                 AND a.customer_id = c.id
347       UNION
348       SELECT a.id, a.invnumber, v.name, ac.transdate,
349              a.invoice, ac.amount, 'ap' as module
350                 FROM ap a, acc_trans ac, vendor v $dpt_from
351                 WHERE $where
352                 $dpt_join
353                 $project
354                 AND ac.chart_id = $id
355                 AND ac.trans_id = a.id
356                 $AP_PAID
357                 AND a.vendor_id = v.id
358                 |;
359       $union = qq|
360       UNION ALL
361       |;
362
363     if ($form->{project_id}) {
364
365       $fromdate_where =~ s/ac\./a\./;
366       $todate_where =~ s/ac\./a\./;
367       
368       $query .= qq|
369
370              UNION ALL
371       
372                  SELECT a.id, a.invnumber, c.name, a.transdate,
373                  a.invoice, ac.sellprice, 'ar' as module
374                  FROM ar a
375                  JOIN invoice ac ON (ac.trans_id = a.id)
376                  JOIN parts p ON (ac.parts_id = p.id)
377                  JOIN customer c ON (a.customer_id = c.id)
378                  $dpt_join
379                  WHERE p.income_accno_id = $id
380                  $fromdate_where
381                  $todate_where
382                  $dpt_where
383                  $project
384       
385              UNION ALL
386       
387                  SELECT a.id, a.invnumber, v.name, a.transdate,
388                  a.invoice, ac.sellprice, 'ap' as module
389                  FROM ap a
390                  JOIN invoice ac ON (ac.trans_id = a.id)
391                  JOIN parts p ON (ac.parts_id = p.id)
392                  JOIN vendor v ON (a.vendor_id = v.id)
393                  $dpt_join
394                  WHERE p.expense_accno_id = $id
395                  $fromdate_where
396                  $todate_where
397                  $dpt_where
398                  $project
399                  |;
400                  
401       $fromdate_where =~ s/a\./ac\./;
402       $todate_where =~ s/a\./ac\./;
403  
404     }
405                  
406       $union = qq|
407              UNION ALL
408                  |;
409   }
410
411   $query .= qq|
412       ORDER BY $sortorder|;
413
414   $sth = $dbh->prepare($query);
415   $sth->execute || $form->dberror($query);
416
417   while (my $ca = $sth->fetchrow_hashref(NAME_lc)) {
418     
419     # gl
420     if ($ca->{module} eq "gl") {
421       $ca->{module} = "gl";
422     }
423
424     # ap
425     if ($ca->{module} eq "ap") {
426       $ca->{module} = ($ca->{invoice}) ? 'ir' : 'ap';
427     }
428
429     # ar
430     if ($ca->{module} eq "ar") {
431       $ca->{module} = ($ca->{invoice}) ? 'is' : 'ar';
432     }
433
434     if ($ca->{amount} < 0) {
435       $ca->{debit} = $ca->{amount} * -1;
436       $ca->{credit} = 0;
437     } else {
438       $ca->{credit} = $ca->{amount};
439       $ca->{debit} = 0;
440     }
441
442     push @{ $form->{CA} }, $ca;
443     
444   }
445  
446   $sth->finish;
447   $dbh->disconnect;
448
449   $main::lxdebug->leave_sub();
450 }
451
452 1;
453