This commit was generated by cvs2svn to compensate for changes in r2526,
[freeside.git] / sql-ledger / SL / CT.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 #
25 # backend code for customers and vendors
26 #
27 # CHANGE LOG:
28 #   DS. 2000-07-04  Created
29 #
30 #======================================================================
31
32 package CT;
33
34
35 sub get_tuple {
36   my ($self, $myconfig, $form) = @_;
37
38   my $dbh = $form->dbconnect($myconfig);
39   my $query = qq|SELECT *
40                  FROM $form->{db}
41                  WHERE id = $form->{id}|;
42   my $sth = $dbh->prepare($query);
43   $sth->execute || $form->dberror($query);
44   
45   my $ref = $sth->fetchrow_hashref(NAME_lc);
46   
47   map { $form->{$_} = $ref->{$_} } keys %$ref;
48
49   $sth->finish;
50
51
52   # get ship to
53   $query = qq|SELECT *
54               FROM shipto
55               WHERE trans_id = $form->{id}|;
56   $sth = $dbh->prepare($query);
57   $sth->execute || $form->dberror($query);
58
59   $ref = $sth->fetchrow_hashref(NAME_lc);
60
61   map { $form->{$_} = $ref->{$_} } keys %$ref;
62
63   $sth->finish;
64
65
66   # get tax labels
67   $query = qq|SELECT accno, description
68               FROM chart, tax
69               WHERE link LIKE '%CT_tax%'
70               AND chart.id = tax.chart_id
71               ORDER BY accno|;
72   $sth = $dbh->prepare($query);
73   $sth->execute || $form->dberror($query);
74
75   while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
76     $form->{taxaccounts} .= "$ref->{accno} ";
77     $form->{tax}{$ref->{accno}}{description} = $ref->{description};
78   }
79   $sth->finish;
80   chop $form->{taxaccounts};
81
82   # get taxes for customer/vendor
83   $query = qq|SELECT chart_id, accno
84               FROM $form->{db}tax, chart
85               WHERE chart_id = chart.id
86               AND $form->{db}_id = $form->{id}|;
87   $sth = $dbh->prepare($query);
88   $sth->execute || $form->dberror($query);
89
90   while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
91     $form->{tax}{$ref->{accno}}{taxable} = 1;
92   }
93   $sth->finish;
94
95   
96   $dbh->disconnect;
97
98 }
99
100
101 sub taxaccounts {
102   my ($self, $myconfig, $form) = @_;
103
104   my $dbh = $form->dbconnect($myconfig);
105
106   # get tax labels
107   my $query = qq|SELECT accno, description
108                  FROM chart, tax
109                  WHERE link LIKE '%CT_tax%'
110                  AND chart.id = tax.chart_id
111                  ORDER BY accno|;
112   $sth = $dbh->prepare($query);
113   $sth->execute || $form->dberror($query);
114
115   while (my $taxref = $sth->fetchrow_hashref(NAME_lc)) {
116     $form->{taxaccounts} .= "$taxref->{accno} ";
117     $form->{tax}{$taxref->{accno}}{description} = $taxref->{description};
118   }
119   $sth->finish;
120   chop $form->{taxaccounts};
121
122   $dbh->disconnect;
123
124 }
125
126
127 sub delete_customer {
128   my ($self, $myconfig, $form) = @_;
129
130   # connect to database, turn AutoCommit off
131   my $dbh = $form->dbconnect_noauto($myconfig);
132
133   my $query = qq|SELECT id FROM ar
134                  WHERE customer_id = $form->{id}
135                  UNION
136                  SELECT id FROM oe
137                  WHERE customer_id = $form->{id}|;
138   my $sth = $dbh->prepare($query) || $form->dberror($query);
139   $sth->execute;
140
141   my ($rc) = $sth->fetchrow_array;
142   $sth->finish;
143
144   if ($rc) {
145     $dbh->disconnect;
146     $rc = -1;
147   } else {
148     
149     # delete customer
150     $query = qq|DELETE FROM customer
151                 WHERE id = $form->{id}|;
152     $dbh->do($query) || $form->dberror($query);
153
154     $query = qq|DELETE FROM shipto
155                 WHERE trans_id = $form->{id}|;
156     $dbh->do($query) || $form->dberror($query);
157     
158     $query = qq|DELETE FROM customertax
159                 WHERE customer_id = $form->{id}|;
160     $dbh->do($query) || $form->dberror($query);
161
162     # commit and redirect
163     $rc = $dbh->commit;
164     $dbh->disconnect;
165     
166   }
167
168   $rc;
169   
170 }
171
172
173 sub save_customer {
174   my ($self, $myconfig, $form) = @_;
175
176   # connect to database
177   my $dbh = $form->dbconnect($myconfig);
178
179   # escape '
180   map { $form->{$_} =~ s/'/''/g } qw(customernumber name addr1 addr2 addr3 addr4 contact notes);
181
182   # assign value discount, terms, creditlimit
183   $form->{discount} /= 100;
184   $form->{terms} *= 1;
185   $form->{taxincluded} *= 1;
186   $form->{creditlimit} = $form->parse_amount($myconfig, $form->{creditlimit});
187   
188   my ($query, $sth);
189
190   if ($form->{id}) {
191     $query = qq|DELETE FROM customertax
192                 WHERE customer_id = $form->{id}|;
193     $dbh->do($query) || $form->dberror($query);
194
195     $query = qq|DELETE FROM shipto
196                 WHERE trans_id = $form->{id}|;
197     $dbh->do($query) || $form->dberror($query);
198   } else {
199     my $uid = time;
200     $uid .= $form->{login};
201
202     $query = qq|INSERT INTO customer (name)
203                 VALUES ('$uid')|;
204     $dbh->do($query) || $form->dberror($query);
205     
206     $query = qq|SELECT id FROM customer
207                 WHERE name = '$uid'|;
208     $sth = $dbh->prepare($query);
209     $sth->execute || $form->dberror($query);
210
211     ($form->{id}) = $sth->fetchrow_array;
212     $sth->finish;
213
214   }
215                 
216   $query = qq|UPDATE customer SET
217               customernumber = '$form->{customernumber}',
218               name = '$form->{name}',
219               addr1 = '$form->{addr1}',
220               addr2 = '$form->{addr2}',
221               addr3 = '$form->{addr3}',
222               addr4 = '$form->{addr4}',
223               contact = '$form->{contact}',
224               phone = '$form->{phone}',
225               fax = '$form->{fax}',
226               email = '$form->{email}',
227               cc = '$form->{cc}',
228               bcc = '$form->{bcc}',
229               notes = '$form->{notes}',
230               discount = $form->{discount},
231               creditlimit = $form->{creditlimit},
232               terms = $form->{terms},
233               taxincluded = '$form->{taxincluded}'
234               WHERE id = $form->{id}|;
235   $dbh->do($query) || $form->dberror($query);
236
237   # save taxes
238   foreach $item (split / /, $form->{taxaccounts}) {
239     if ($form->{"tax_$item"}) {
240       $query = qq|INSERT INTO customertax (customer_id, chart_id)
241                   VALUES ($form->{id}, (SELECT id
242                                         FROM chart
243                                         WHERE accno = '$item'))|;
244       $dbh->do($query) || $form->dberror($query);
245     }
246   }
247   
248   # add shipto
249   $form->add_shipto($dbh, $form->{id});
250
251   $dbh->disconnect;
252
253 }
254
255
256 sub save_vendor {
257   my ($self, $myconfig, $form) = @_;
258
259   # connect to database
260   my $dbh = $form->dbconnect($myconfig);
261
262   # escape '
263   map { $form->{$_} =~ s/'/''/g } qw(vendornumber name addr1 addr2 addr3 addr4 contact notes);
264
265   $form->{terms} *= 1;
266   $form->{taxincluded} *= 1;
267   
268   my $query;
269   
270   if ($form->{id}) {
271     $query = qq|DELETE FROM vendortax
272                 WHERE vendor_id = $form->{id}|;
273     $dbh->do($query) || $form->dberror($query);
274
275     $query = qq|DELETE FROM shipto
276                 WHERE trans_id = $form->{id}|;
277     $dbh->do($query) || $form->dberror($query);
278   } else {
279     my $uid = time;
280     $uid .= $form->{login};
281     
282     $query = qq|INSERT INTO vendor (name)
283                 VALUES ('$uid')|;
284     $dbh->do($query) || $form->dberror($query);
285    
286     $query = qq|SELECT id FROM vendor
287                 WHERE name = '$uid'|;
288     $sth = $dbh->prepare($query);
289     $sth->execute || $form->dberror($query);
290
291     ($form->{id}) = $sth->fetchrow_array;
292     $sth->finish;
293
294   }
295    
296
297   $query = qq|UPDATE vendor SET
298               vendornumber = '$form->{vendornumber}',
299               name = '$form->{name}',
300               addr1 = '$form->{addr1}',
301               addr2 = '$form->{addr2}',
302               addr3 = '$form->{addr3}',
303               addr4 = '$form->{addr4}',
304               contact = '$form->{contact}',
305               phone = '$form->{phone}',
306               fax = '$form->{fax}',
307               email = '$form->{email}',
308               cc = '$form->{cc}',
309               bcc = '$form->{bcc}',
310               notes = '$form->{notes}',
311               terms = $form->{terms},
312               taxincluded = '$form->{taxincluded}'
313               WHERE id = $form->{id}|;
314   $dbh->do($query) || $form->dberror($query);
315
316   # save taxes
317   foreach $item (split / /, $form->{taxaccounts}) {
318     if ($form->{"tax_$item"}) {
319       $query = qq|INSERT INTO vendortax (vendor_id, chart_id)
320                   VALUES ($form->{id}, (SELECT id
321                                         FROM chart
322                                         WHERE accno = '$item'))|;
323       $dbh->do($query) || $form->dberror($query);
324     }
325   }
326
327   # add shipto
328   $form->add_shipto($dbh, $form->{id});
329
330   $dbh->disconnect;
331
332 }
333
334
335
336 sub delete_vendor {
337   my ($self, $myconfig, $form) = @_;
338
339   # connect to database, turn AutoCommit off
340   my $dbh = $form->dbconnect_noauto($myconfig);
341
342   # check if there are any transactions on file
343   my $query = qq|SELECT id FROM ap
344                  WHERE vendor_id = $form->{id}
345                  UNION
346                  SELECT id FROM oe
347                  WHERE vendor_id = $form->{id}|;
348   my $sth = $dbh->prepare($query) || $form->dberror($query);
349   $sth->execute;
350   
351   my ($rc) = $sth->fetchrow_array;
352   $sth->finish;
353   
354   if ($rc) {
355     $dbh->disconnect;
356     $rc = -1;
357   } else {
358     
359     # delete vendor
360     $query = qq|DELETE FROM vendor
361                 WHERE id = $form->{id}|;
362     $dbh->do($query) || $form->dberror($query);
363
364     $query = qq|DELETE FROM shipto
365                 WHERE trans_id = $form->{id}|;
366     $dbh->do($query) || $form->dberror($query);
367
368     $query = qq|DELETE FROM vendortax
369                 WHERE vendor_id = $form->{id}|;
370     $dbh->do($query) || $form->dberror($query);
371
372     # commit and redirect
373     $rc = $dbh->commit;
374     $dbh->disconnect;
375
376   }
377
378   $rc;
379
380 }
381
382
383 sub search {
384   my ($self, $myconfig, $form) = @_;
385
386   # connect to database
387   my $dbh = $form->dbconnect($myconfig);
388
389   my $where = "1 = 1";
390   $form->{sort} = "name" unless ($form->{sort});
391   
392   if ($form->{"$form->{db}number"}) {
393     my $companynumber = $form->like(lc $form->{"$form->{db}number"});
394     $where .= " AND lower($form->{db}number) LIKE '$companynumber'";
395   }
396   if ($form->{name}) {
397     my $name = $form->like(lc $form->{name});
398     $where .= " AND lower(name) LIKE '$name'";
399   }
400   if ($form->{contact}) {
401     my $contact = $form->like(lc $form->{contact});
402     $where .= " AND lower(contact) LIKE '$contact'";
403   }
404   if ($form->{email}) {
405     my $email = $form->like(lc $form->{email});
406     $where .= " AND lower(email) LIKE '$email'";
407   }
408
409   if ($form->{status} eq 'orphaned') {
410     $where .= qq| AND id NOT IN (SELECT o.$form->{db}_id
411                                  FROM oe o, $form->{db} ct
412                                  WHERE ct.id = o.$form->{db}_id)|;
413     if ($form->{db} eq 'customer') {
414       $where .= qq| AND id NOT IN (SELECT a.customer_id
415                                    FROM ar a, customer ct
416                                    WHERE ct.id = a.customer_id)|;
417     }
418     if ($form->{db} eq 'vendor') {
419       $where .= qq| AND id NOT IN (SELECT a.vendor_id
420                                    FROM ap a, vendor ct
421                                    WHERE ct.id = a.vendor_id)|;
422     }
423   }
424   
425   my $query = qq~SELECT id, name, $form->{db}number, 
426                  addr1 || ' ' || addr2 || ' ' || addr3 || ' ' || addr4 AS address,
427                  contact, phone, fax, email, cc, terms
428                  FROM $form->{db}
429                  WHERE $where
430                  ORDER BY $form->{sort}~;
431
432   my $sth = $dbh->prepare($query);
433   $sth->execute || $form->dberror($query);
434
435
436   while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
437     push @{ $form->{CT} }, $ref;
438   }
439
440   $sth->finish;
441   $dbh->disconnect;
442
443 }
444
445
446 1;
447