Merged with arensb-context branch: use C4::Context->dbh instead of
[koha.git] / C4 / Acquisitions.pm
1 package C4::Acquisitions; #assumes C4/Acquisitions.pm
2
3
4 # Copyright 2000-2002 Katipo Communications
5 #
6 # This file is part of Koha.
7 #
8 # Koha is free software; you can redistribute it and/or modify it under the
9 # terms of the GNU General Public License as published by the Free Software
10 # Foundation; either version 2 of the License, or (at your option) any later
11 # version.
12 #
13 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
14 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License along with
18 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
19 # Suite 330, Boston, MA  02111-1307 USA
20
21 # ***
22 # NOTE: This module is deprecated in Koha 1.3.x, and will shortly be
23 # deleted.
24 # ***
25
26 use strict;
27 require Exporter;
28 use C4::Context;
29  #use C4::Biblio;
30 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
31
32 # set the version for version checking
33 $VERSION = 0.01;
34
35 =head1 NAME
36
37 C4::Acquisitions - FIXME
38
39 =head1 SYNOPSIS
40
41   use C4::Acquisitions;
42
43 =head1 DESCRIPTION
44
45 FIXME
46
47 =head1 FUNCTIONS
48
49 =over 2
50
51 =cut
52
53 @ISA = qw(Exporter);
54 @EXPORT = qw(&getorders &bookseller &breakdown &basket &newbasket &bookfunds
55 &ordersearch &newbiblio &newbiblioitem &newsubject &newsubtitle &neworder
56 &newordernum &modbiblio &modorder &getsingleorder &invoice &receiveorder
57 &bookfundbreakdown &curconvert &updatesup &insertsup &newitems &modbibitem
58 &getcurrencies &modsubtitle &modsubject &modaddauthor &moditem &countitems 
59 &findall &needsmod &delitem &deletebiblioitem &delbiblio &delorder &branches
60 &getallorders &getrecorders &updatecurrencies &getorder &getcurrency &updaterecorder
61 &updatecost &checkitems &modnote &getitemtypes &getbiblio
62 &getbiblioitembybiblionumber
63 &getbiblioitem &getitemsbybiblioitem &isbnsearch
64 &websitesearch &addwebsite &updatewebsite &deletewebsite);
65 %EXPORT_TAGS = ( );     # eg: TAG => [ qw!name1 name2! ],
66
67 # your exported package globals go here,
68 # as well as any optionally exported functions
69
70 @EXPORT_OK   = qw($Var1 %Hashit);       # FIXME - Never used
71
72
73 # non-exported package globals go here
74 use vars qw(@more $stuff);              # FIXME - Never used
75
76 # initalize package globals, first exported ones
77 # FIXME - Never used
78 my $Var1   = '';
79 my %Hashit = ();
80
81
82
83 # then the others (which are still accessible as $Some::Module::stuff)
84 # FIXME - Never used
85 my $stuff  = '';
86 my @more   = ();
87
88 # all file-scoped lexicals must be created before
89 # the functions below that use them.
90
91 # file-private lexicals go here
92 # FIXME - Never used
93 my $priv_var    = '';
94 my %secret_hash = ();
95
96 # FIXME - Never used
97 # here's a file-private function as a closure,
98 # callable as &$priv_func;  it cannot be prototyped.
99 my $priv_func = sub {
100   # stuff goes here.
101   };
102   
103 # make all your functions, whether exported or not;
104
105 =item getorders
106
107   ($count, $orders) = &getorders($booksellerid);
108
109 Finds pending orders from the bookseller with the given ID. Ignores
110 completed and cancelled orders.
111
112 C<$count> is the number of elements in C<@{$orders}>.
113
114 C<$orders> is a reference-to-array; each element is a
115 reference-to-hash with the following fields:
116
117 =over 4
118
119 =item C<count(*)>
120
121 Gives the number of orders in with this basket number.
122
123 =item C<authorizedby>
124
125 =item C<entrydate>
126
127 =item C<basketno>
128
129 These give the value of the corresponding field in the aqorders table
130 of the Koha database.
131
132 =back
133
134 Results are ordered from most to least recent.
135
136 =cut
137 #'
138 # FIXME - This exact function already exists in C4::Catalogue
139 sub getorders {
140   my ($supplierid)=@_;
141   my $dbh = C4::Context->dbh;
142   my $query = "Select count(*),authorisedby,entrydate,basketno from aqorders where 
143   booksellerid='$supplierid' and (quantity > quantityreceived or
144   quantityreceived is NULL)
145   and (datecancellationprinted is NULL or datecancellationprinted = '0000-00-00')";
146   $query.=" group by basketno order by entrydate desc";
147   #print $query;
148   my $sth=$dbh->prepare($query);
149   $sth->execute;
150   my @results;
151   my $i=0;
152   while (my $data=$sth->fetchrow_hashref){
153     $results[$i]=$data;
154     $i++;
155   }
156   $sth->finish;
157   return ($i,\@results);
158 }
159
160 # Only used internally
161 # FIXME - This is the same as &C4::Biblio::itemcount, but not
162 # the same as &C4::Search::itemcount
163 sub itemcount{
164   my ($biblio)=@_;
165   my $dbh = C4::Context->dbh;
166   my $query="Select count(*) from items where biblionumber=$biblio";
167 #  print $query;
168   my $sth=$dbh->prepare($query);
169   $sth->execute;
170   my $data=$sth->fetchrow_hashref;
171   $sth->finish;
172   return($data->{'count(*)'});
173 }
174
175 =item getorder
176
177   ($order, $ordernumber) = &getorder($biblioitemnumber, $biblionumber);
178
179 Looks up the order with the given biblionumber and biblioitemnumber.
180
181 Returns a two-element array. C<$ordernumber> is the order number.
182 C<$order> is a reference-to-hash describing the order; its keys are
183 fields from the biblio, biblioitems, aqorders, and aqorderbreakdown
184 tables of the Koha database.
185
186 =cut
187 #'
188 # FIXME - There are functions &getorder and &getorders. Isn't this
189 # somewhat likely to cause confusion?
190 # FIXME - Almost the exact same function is already in C4::Catalogue
191 sub getorder{
192   my ($bi,$bib)=@_;
193   my $dbh = C4::Context->dbh;
194   my $query="Select ordernumber 
195         from aqorders 
196         where biblionumber=? and biblioitemnumber=?";
197   my $sth=$dbh->prepare($query);
198   $sth->execute($bib,$bi);
199   my $ordnum=$sth->fetchrow_hashref;
200   $sth->finish;
201   my $order=getsingleorder($ordnum->{'ordernumber'});
202 #  print $query;
203   return ($order,$ordnum->{'ordernumber'});
204 }
205
206 =item getsingleorder
207
208   $order = &getsingleorder($ordernumber);
209
210 Looks up an order by order number.
211
212 Returns a reference-to-hash describing the order. The keys of
213 C<$order> are fields from the biblio, biblioitems, aqorders, and
214 aqorderbreakdown tables of the Koha database.
215
216 =cut
217 #'
218 # FIXME - This is practically the same function as
219 # &C4::Catalogue::getsingleorder and &C4::Biblio::getsingleorder.
220 sub getsingleorder {
221   my ($ordnum)=@_;
222   my $dbh = C4::Context->dbh;
223   my $query="Select * from biblio,biblioitems,aqorders,aqorderbreakdown 
224   where aqorders.ordernumber=? 
225   and biblio.biblionumber=aqorders.biblionumber and
226   biblioitems.biblioitemnumber=aqorders.biblioitemnumber and
227   aqorders.ordernumber=aqorderbreakdown.ordernumber";
228   my $sth=$dbh->prepare($query);
229   $sth->execute($ordnum);
230   my $data=$sth->fetchrow_hashref;
231   $sth->finish;
232   return($data);
233 }
234
235 =item invoice
236
237   ($count, @results) = &invoice($booksellerinvoicenumber);
238
239 Looks up orders by invoice number.
240
241 Returns an array. C<$count> is the number of elements in C<@results>.
242 C<@results> is an array of references-to-hash; the keys of each
243 elements are fields from the aqorders, biblio, and biblioitems tables
244 of the Koha database.
245
246 =cut
247 #'
248 # FIXME - This exact function is already in C4::Catalogue
249 sub invoice {
250   my ($invoice)=@_;
251   my $dbh = C4::Context->dbh;
252   my $query="Select * from aqorders,biblio,biblioitems where
253   booksellerinvoicenumber='$invoice'
254   and biblio.biblionumber=aqorders.biblionumber and biblioitems.biblioitemnumber=
255   aqorders.biblioitemnumber group by aqorders.ordernumber,aqorders.biblioitemnumber";
256   my $i=0;
257   my @results;
258   my $sth=$dbh->prepare($query);
259   $sth->execute;
260   while (my $data=$sth->fetchrow_hashref){
261     $results[$i]=$data;
262     $i++;
263   }
264   $sth->finish;
265   return($i,@results);
266 }
267
268 =item getallorders
269
270   ($count, @results) = &getallorders($booksellerid);
271
272 Looks up all of the pending orders from the supplier with the given
273 bookseller ID. Ignores cancelled orders.
274
275 C<$count> is the number of elements in C<@results>. C<@results> is an
276 array of references-to-hash. The keys of each element are fields from
277 the aqorders, biblio, and biblioitems tables of the Koha database.
278
279 C<@results> is sorted alphabetically by book title.
280
281 =cut
282 #'
283 # FIXME - Almost (but not quite) the same function appears in C4::Catalogue
284 # That one only lists incomplete orders.
285 sub getallorders {
286   #gets all orders from a certain supplier, orders them alphabetically
287   my ($supid)=@_;
288   my $dbh = C4::Context->dbh;
289   my $query="Select * from aqorders,biblio,biblioitems where booksellerid='$supid'
290   and (cancelledby is NULL or cancelledby = '')
291   and biblio.biblionumber=aqorders.biblionumber and biblioitems.biblioitemnumber=                    
292   aqorders.biblioitemnumber 
293   group by aqorders.biblioitemnumber 
294   order by
295   biblio.title";
296   my $i=0;
297   my @results;
298   my $sth=$dbh->prepare($query);
299   $sth->execute;
300   while (my $data=$sth->fetchrow_hashref){
301     $results[$i]=$data;
302     $i++;
303   }
304   $sth->finish;
305   return($i,@results);
306 }
307
308 # FIXME - There's a getrecorders in C4::Catalogue
309 # FIXME - Never used (neither is the other one, actually)
310 sub getrecorders {
311   #gets all orders from a certain supplier, orders them alphabetically
312   my ($supid)=@_;
313   my $dbh = C4::Context->dbh;
314   my $query="Select * from aqorders,biblio,biblioitems where booksellerid='$supid'
315   and (cancelledby is NULL or cancelledby = '')
316   and biblio.biblionumber=aqorders.biblionumber and biblioitems.biblioitemnumber=                    
317   aqorders.biblioitemnumber and
318   aqorders.quantityreceived>0
319   and aqorders.datereceived >=now()
320   group by aqorders.biblioitemnumber 
321   order by
322   biblio.title";
323   my $i=0;
324   my @results;
325   my $sth=$dbh->prepare($query);
326   $sth->execute;
327   while (my $data=$sth->fetchrow_hashref){
328     $results[$i]=$data;
329     $i++;
330   }
331   $sth->finish;
332   return($i,@results);
333 }
334
335 =item ordersearch
336
337   ($count, @results) = &ordersearch($search, $biblionumber, $complete);
338
339 Searches for orders.
340
341 C<$search> may take one of several forms: if it is an ISBN,
342 C<&ordersearch> returns orders with that ISBN. If C<$search> is an
343 order number, C<&ordersearch> returns orders with that order number
344 and biblionumber C<$biblionumber>. Otherwise, C<$search> is considered
345 to be a space-separated list of search terms; in this case, all of the
346 terms must appear in the title (matching the beginning of title
347 words).
348
349 If C<$complete> is C<yes>, the results will include only completed
350 orders. In any case, C<&ordersearch> ignores cancelled orders.
351
352 C<&ordersearch> returns an array. C<$count> is the number of elements
353 in C<@results>. C<@results> is an array of references-to-hash with the
354 following keys:
355
356 =over 4
357
358 =item C<author>
359
360 =item C<seriestitle>
361
362 =item C<branchcode>
363
364 =item C<bookfundid>
365
366 =back
367
368 =cut
369 #'
370 # FIXME - The same function (modulo whitespace) appears in C4::Catalogue
371 sub ordersearch {
372   my ($search,$biblio,$catview)=@_;
373   my $dbh = C4::Context->dbh;
374   my $query="Select *,biblio.title from aqorders,biblioitems,biblio
375         where aqorders.biblioitemnumber = biblioitems.biblioitemnumber
376         and biblio.biblionumber=aqorders.biblionumber
377         and ((datecancellationprinted is NULL)
378         or (datecancellationprinted = '0000-00-00'))
379   and ((";
380   my @data=split(' ',$search);
381   my $count=@data;
382   for (my $i=0;$i<$count;$i++){
383     $query.= "(biblio.title like '$data[$i]%' or biblio.title like '% $data[$i]%') and ";
384   }
385   $query=~ s/ and $//;
386   $query.=" ) or biblioitems.isbn='$search' 
387   or (aqorders.ordernumber='$search' and aqorders.biblionumber='$biblio')) ";
388   if ($catview ne 'yes'){
389     $query.=" and (quantityreceived < quantity or quantityreceived is NULL)";
390   }
391   $query.=" group by aqorders.ordernumber";
392   my $sth=$dbh->prepare($query);
393 #  print $query;
394   $sth->execute;
395   my $i=0;
396   my @results;
397   while (my $data=$sth->fetchrow_hashref){
398      my $sth2=$dbh->prepare("Select * from biblio where
399      biblionumber='$data->{'biblionumber'}'");
400      $sth2->execute;
401      my $data2=$sth2->fetchrow_hashref;
402      $sth2->finish;
403      $data->{'author'}=$data2->{'author'};
404      $data->{'seriestitle'}=$data2->{'seriestitle'};
405      $sth2=$dbh->prepare("Select * from aqorderbreakdown where
406     ordernumber=$data->{'ordernumber'}");
407     $sth2->execute;
408     $data2=$sth2->fetchrow_hashref;
409     $sth2->finish;
410     $data->{'branchcode'}=$data2->{'branchcode'};
411     $data->{'bookfundid'}=$data2->{'bookfundid'};
412     $results[$i]=$data;
413     $i++;
414   }
415   $sth->finish;
416   return($i,@results);
417 }
418
419 =item bookseller
420
421   ($count, @results) = &bookseller($searchstring);
422
423 Looks up a book seller. C<$searchstring> may be either a book seller
424 ID, or a string to look for in the book seller's name.
425
426 C<$count> is the number of elements in C<@results>. C<@results> is an
427 array of references-to-hash, whose keys are the fields of of the
428 aqbooksellers table in the Koha database.
429
430 =cut
431 #'
432 # FIXME - This function appears in C4::Catalogue
433 sub bookseller {
434   my ($searchstring)=@_;
435   my $dbh = C4::Context->dbh;
436   my $query="Select * from aqbooksellers where name like '%$searchstring%' or
437   id = '$searchstring'";
438   my $sth=$dbh->prepare($query);
439   $sth->execute;
440   my @results;
441   my $i=0;
442   while (my $data=$sth->fetchrow_hashref){
443     $results[$i]=$data;
444     $i++;
445   }
446   $sth->finish;
447   return($i,@results);
448 }
449
450 =item breakdown
451
452   ($count, $results) = &breakdown($ordernumber);
453
454 Looks up an order by order ID, and returns its breakdown.
455
456 C<$count> is the number of elements in C<$results>. C<$results> is a
457 reference-to-array; its elements are references-to-hash, whose keys
458 are the fields of the aqorderbreakdown table in the Koha database.
459
460 =cut
461 #'
462 # FIXME - This function appears in C4::Catalogue.
463 sub breakdown {
464   my ($id)=@_;
465   my $dbh = C4::Context->dbh;
466   my $query="Select * from aqorderbreakdown where ordernumber='$id'";
467   my $sth=$dbh->prepare($query);
468   $sth->execute;
469   my @results;
470   my $i=0;
471   while (my $data=$sth->fetchrow_hashref){
472     $results[$i]=$data;
473     $i++;
474   }
475   $sth->finish;
476   return($i,\@results);
477 }
478
479 =item basket
480
481   ($count, @orders) = &basket($basketnumber, $booksellerID);
482
483 Looks up the pending (non-cancelled) orders with the given basket
484 number. If C<$booksellerID> is non-empty, only orders from that seller
485 are returned.
486
487 C<&basket> returns a two-element array. C<@orders> is an array of
488 references-to-hash, whose keys are the fields from the aqorders,
489 biblio, and biblioitems tables in the Koha database. C<$count> is the
490 number of elements in C<@orders>.
491
492 =cut
493 #'
494 # FIXME - Almost the same function (with less error-checking) appears in
495 # C4::Catalogue.pm
496 sub basket {
497   my ($basketno,$supplier)=@_;
498   my $dbh = C4::Context->dbh;
499   my $query="Select *,biblio.title from aqorders,biblio,biblioitems 
500   where basketno='$basketno'
501   and biblio.biblionumber=aqorders.biblionumber and biblioitems.biblioitemnumber
502   =aqorders.biblioitemnumber 
503   and (datecancellationprinted is NULL or datecancellationprinted =
504   '0000-00-00')";
505   if (defined $supplier && $supplier ne ''){
506     $query.=" and aqorders.booksellerid='$supplier'";
507   } 
508   $query.=" group by aqorders.ordernumber";
509   my $sth=$dbh->prepare($query);
510   $sth->execute;
511   my @results;
512 #  print $query;
513   my $i=0;
514   while (my $data=$sth->fetchrow_hashref){
515     $results[$i]=$data;
516     $i++;
517   }
518   $sth->finish;
519   return($i,@results);
520 }
521
522 =item newbasket
523
524   $basket = &newbasket();
525
526 Finds the next unused basket number in the aqorders table of the Koha
527 database, and returns it.
528
529 =cut
530 #'
531 # FIXME - There's a race condition here:
532 #       A calls &newbasket
533 #       B calls &newbasket (gets the same number as A)
534 #       A updates the basket
535 #       B updates the basket, and clobbers A's result.
536 # A better approach might be to create a dummy order (with, say,
537 # requisitionedby == "Dummy-$$" or notes == "dummy <time> <pid>"), and
538 # see which basket number it gets. Then have a cron job periodically
539 # remove out-of-date dummy orders.
540 # FIXME - This function appears in C4::Catalogue.pm
541 sub newbasket {
542   my $dbh = C4::Context->dbh;
543   my $query="Select max(basketno) from aqorders";
544   my $sth=$dbh->prepare($query);
545   $sth->execute;
546   my $data=$sth->fetchrow_arrayref;
547   my $basket=$$data[0];
548   $basket++;
549   $sth->finish;
550   return($basket);
551 }
552
553 =item bookfunds
554
555   ($count, @results) = &bookfunds();
556
557 Returns a list of all book funds started on Sep 1, 2001.
558
559 C<$count> is the number of elements in C<@results>. C<@results> is an
560 array of references-to-hash, whose keys are fields from the aqbookfund
561 and aqbudget tables of the Koha database. Results are ordered
562 alphabetically by book fund name.
563
564 =cut
565 #'
566 # FIXME - An identical function (without the hardcoded date) appears in
567 # C4::Catalogue
568 sub bookfunds {
569   my $dbh = C4::Context->dbh;
570   my $query="Select * from aqbookfund,aqbudget where aqbookfund.bookfundid
571   =aqbudget.bookfundid 
572    and aqbudget.startdate='2001-07-01'
573   group by aqbookfund.bookfundid order by bookfundname";
574   my $sth=$dbh->prepare($query);
575   $sth->execute;
576   my @results;
577   my $i=0;
578   while (my $data=$sth->fetchrow_hashref){
579     $results[$i]=$data;
580     $i++;
581   }
582   $sth->finish;
583   return($i,@results);
584 }
585
586 =item branches
587
588   ($count, @results) = &branches();
589
590 Returns a list of all library branches.
591
592 C<$count> is the number of elements in C<@results>. C<@results> is an
593 array of references-to-hash, whose keys are the fields of the branches
594 table of the Koha database.
595
596 =cut
597 #'
598 # FIXME - This function (modulo whitespace) appears in C4::Catalogue
599 sub branches {
600   my $dbh = C4::Context->dbh;
601   my $query="Select * from branches";
602   my $sth=$dbh->prepare($query);
603   my $i=0;
604   my @results;
605
606     $sth->execute;
607   while (my $data = $sth->fetchrow_hashref){
608     $results[$i]=$data;
609     $i++;
610     } # while
611
612   $sth->finish;
613   return($i, @results);
614 } # sub branches
615
616 # FIXME - POD. But I can't figure out what this function is doing
617 # FIXME - An almost identical function appears in C4::Catalogue
618 sub bookfundbreakdown {
619   my ($id)=@_;
620   my $dbh = C4::Context->dbh;
621   my $query="Select quantity,datereceived,freight,unitprice,listprice,ecost,quantityreceived,subscription
622   from aqorders,aqorderbreakdown where bookfundid='$id' and 
623    aqorders.ordernumber=aqorderbreakdown.ordernumber and ((budgetdate >=
624    '2001-07-01' and budgetdate <'2002-07-01') or
625    (datereceived >= '2001-07-01' and datereceived < '2002-07-01'))
626   and (datecancellationprinted is NULL or
627   datecancellationprinted='0000-00-00')";
628   my $sth=$dbh->prepare($query);
629   $sth->execute;
630   my $comtd=0;
631   my $spent=0;
632   while (my $data=$sth->fetchrow_hashref){
633     if ($data->{'subscription'} == 1){
634       $spent+=$data->{'quantity'}*$data->{'unitprice'};
635     } else {
636       my $leftover=$data->{'quantity'}-$data->{'quantityreceived'};
637       $comtd+=($data->{'ecost'})*$leftover;
638       $spent+=($data->{'unitprice'})*$data->{'quantityreceived'};
639     }
640   }
641   $sth->finish;
642   return($spent,$comtd);
643 }
644
645 # FIXME - This is in effect identical to &C4::Biblio::newbiblio.
646 # Pick one and stick with it.
647 # XXX - POD
648 sub newbiblio {
649   my ($biblio) = @_;
650   my $dbh    = C4::Context->dbh;
651   my $query  = "Select max(biblionumber) from biblio";
652   my $sth    = $dbh->prepare($query);
653   $sth->execute;
654   my $data   = $sth->fetchrow_arrayref;
655   my $bibnum = $$data[0] + 1;
656   my $series = 0;
657
658   $biblio->{'title'}       = $dbh->quote($biblio->{'title'});
659   $biblio->{'author'}      = $dbh->quote($biblio->{'author'});
660   $biblio->{'copyright'}   = $dbh->quote($biblio->{'copyright'});
661   $biblio->{'seriestitle'} = $dbh->quote($biblio->{'seriestitle'});
662   $biblio->{'notes'}       = $dbh->quote($biblio->{'notes'});
663   $biblio->{'abstract'}    = $dbh->quote($biblio->{'abstract'});
664   if ($biblio->{'seriestitle'}) { $series = 1 };
665
666   $sth->finish;
667   # FIXME - Use $dbh->do();
668   $query = "insert into biblio set
669 biblionumber  = $bibnum,
670 title         = $biblio->{'title'},
671 author        = $biblio->{'author'},
672 copyrightdate = $biblio->{'copyright'},
673 serial        = $series,
674 seriestitle   = $biblio->{'seriestitle'},
675 notes         = $biblio->{'notes'},
676 abstract      = $biblio->{'abstract'}";
677
678   $sth = $dbh->prepare($query);
679   $sth->execute;
680
681   $sth->finish;
682   return($bibnum);
683 }
684
685 # FIXME - This is in effect the same as &C4::Biblio::modbiblio.
686 # Pick one and stick with it.
687 # XXX - POD
688 sub modbiblio {
689   my ($biblio) = @_;
690   my $dbh   = C4::Context->dbh;
691   my $query;
692   my $sth;
693   
694   $biblio->{'title'}         = $dbh->quote($biblio->{'title'});
695   $biblio->{'author'}        = $dbh->quote($biblio->{'author'});
696   $biblio->{'abstract'}      = $dbh->quote($biblio->{'abstract'});
697   $biblio->{'copyrightdate'} = $dbh->quote($biblio->{'copyrightdate'});
698   $biblio->{'seriestitle'}   = $dbh->quote($biblio->{'serirestitle'});
699   $biblio->{'serial'}        = $dbh->quote($biblio->{'serial'});
700   $biblio->{'unititle'}      = $dbh->quote($biblio->{'unititle'});
701   $biblio->{'notes'}         = $dbh->quote($biblio->{'notes'});
702
703   $query = "Update biblio set
704 title         = $biblio->{'title'},
705 author        = $biblio->{'author'},
706 abstract      = $biblio->{'abstract'},
707 copyrightdate = $biblio->{'copyrightdate'},
708 seriestitle   = $biblio->{'seriestitle'},
709 serial        = $biblio->{'serial'},
710 unititle      = $biblio->{'unititle'},
711 notes         = $biblio->{'notes'}
712 where biblionumber = $biblio->{'biblionumber'}";
713   $sth   = $dbh->prepare($query);
714
715   $sth->execute;
716
717   $sth->finish;
718   return($biblio->{'biblionumber'});
719 } # sub modbiblio
720
721 # FIXME - This is in effect identical to &C4::Biblio::modsubtitle.
722 # Pick one and stick with it.
723 # XXX - POD
724 sub modsubtitle {
725   my ($bibnum, $subtitle) = @_;
726   my $dbh   = C4::Context->dbh;
727   my $query = "update bibliosubtitle set
728 subtitle = '$subtitle'
729 where biblionumber = $bibnum";
730   my $sth   = $dbh->prepare($query);
731
732   $sth->execute;
733   $sth->finish;
734 } # sub modsubtitle
735
736 # XXX - POD
737 # FIXME - This is functionally identical to &C4::Biblio::modaddauthor
738 # Pick one and stick with it.
739 sub modaddauthor {
740     my ($bibnum, $author) = @_;
741     my $dbh   = C4::Context->dbh;
742     my $query = "Delete from additionalauthors where biblionumber = $bibnum";
743     my $sth = $dbh->prepare($query);
744
745     $sth->execute;
746     $sth->finish;
747
748     if ($author ne '') {
749         $query = "Insert into additionalauthors set
750 author       = '$author',
751 biblionumber = '$bibnum'";
752         $sth   = $dbh->prepare($query);
753
754         $sth->execute;
755
756         $sth->finish;
757     } # if
758 } # sub modaddauthor
759
760 # FIXME - This is in effect identical to &C4::Biblio::modsubject.
761 # Pick one and stick with it.
762 # XXX - POD
763 sub modsubject {
764   my ($bibnum, $force, @subject) = @_;
765   my $dbh   = C4::Context->dbh;
766   my $count = @subject;
767   my $error;
768   for (my $i = 0; $i < $count; $i++) {
769     $subject[$i] =~ s/^ //g;
770     $subject[$i] =~ s/ $//g;
771     my $query = "select * from catalogueentry
772 where entrytype = 's'
773 and catalogueentry = '$subject[$i]'";
774     my $sth   = $dbh->prepare($query);
775     $sth->execute;
776
777     if (my $data = $sth->fetchrow_hashref) {
778     } else {
779       if ($force eq $subject[$i]) {
780
781          # subject not in aut, chosen to force anway
782          # so insert into cataloguentry so its in auth file
783          $query = "Insert into catalogueentry
784 (entrytype,catalogueentry)
785 values ('s','$subject[$i]')";
786          my $sth2 = $dbh->prepare($query);
787
788          $sth2->execute;
789          $sth2->finish;
790
791       } else {
792
793         $error = "$subject[$i]\n does not exist in the subject authority file";
794         $query = "Select * from catalogueentry
795 where entrytype = 's'
796 and (catalogueentry like '$subject[$i] %'
797 or catalogueentry like '% $subject[$i] %'
798 or catalogueentry like '% $subject[$i]')";
799         my $sth2 = $dbh->prepare($query);
800
801         $sth2->execute;
802         while (my $data = $sth2->fetchrow_hashref) {
803           $error = $error."<br>$data->{'catalogueentry'}";
804         } # while
805         $sth2->finish;
806       } # else
807     } # else
808     $sth->finish;
809   } # else
810
811   if ($error eq '') {
812     my $query = "Delete from bibliosubject where biblionumber = $bibnum";
813     my $sth   = $dbh->prepare($query);
814
815     $sth->execute;
816     $sth->finish;
817
818     for (my $i = 0; $i < $count; $i++) {
819       $sth = $dbh->prepare("Insert into bibliosubject
820 values ('$subject[$i]', $bibnum)");
821
822       $sth->execute;
823       $sth->finish;
824     } # for
825   } # if
826
827   return($error);
828 } # sub modsubject
829
830 # FIXME - This is very similar to &C4::Biblio::modbibitem.
831 # Pick one and stick with it.
832 # XXX - POD
833 sub modbibitem {
834     my ($biblioitem) = @_;
835     my $dbh   = C4::Context->dbh;
836     my $query;
837
838     # FIXME -
839     #   foreach my $field (qw( ... ))
840     #   {
841     #           $biblioitem->{$field} = $dbh->quote($biblioitem->{$field});
842     #   }
843     $biblioitem->{'itemtype'}        = $dbh->quote($biblioitem->{'itemtype'});
844     $biblioitem->{'url'}             = $dbh->quote($biblioitem->{'url'});
845     $biblioitem->{'isbn'}            = $dbh->quote($biblioitem->{'isbn'});
846     $biblioitem->{'publishercode'}   = $dbh->quote($biblioitem->{'publishercode'});
847     $biblioitem->{'publicationyear'} = $dbh->quote($biblioitem->{'publicationyear'});
848     $biblioitem->{'classification'}  = $dbh->quote($biblioitem->{'classification'});
849     $biblioitem->{'dewey'}           = $dbh->quote($biblioitem->{'dewey'});
850     $biblioitem->{'subclass'}        = $dbh->quote($biblioitem->{'subclass'});
851     $biblioitem->{'illus'}           = $dbh->quote($biblioitem->{'illus'});
852     $biblioitem->{'pages'}           = $dbh->quote($biblioitem->{'pages'});
853     $biblioitem->{'volumeddesc'}     = $dbh->quote($biblioitem->{'volumeddesc'});
854     $biblioitem->{'notes'}           = $dbh->quote($biblioitem->{'notes'});
855     $biblioitem->{'size'}            = $dbh->quote($biblioitem->{'size'});
856     $biblioitem->{'place'}           = $dbh->quote($biblioitem->{'place'});
857
858     $query = "Update biblioitems set
859 itemtype        = $biblioitem->{'itemtype'},
860 url             = $biblioitem->{'url'},
861 isbn            = $biblioitem->{'isbn'},
862 publishercode   = $biblioitem->{'publishercode'},
863 publicationyear = $biblioitem->{'publicationyear'},
864 classification  = $biblioitem->{'classification'},
865 dewey           = $biblioitem->{'dewey'},
866 subclass        = $biblioitem->{'subclass'},
867 illus           = $biblioitem->{'illus'},
868 pages           = $biblioitem->{'pages'},
869 volumeddesc     = $biblioitem->{'volumeddesc'},
870 notes           = $biblioitem->{'notes'},
871 size            = $biblioitem->{'size'},
872 place           = $biblioitem->{'place'}
873 where biblioitemnumber = $biblioitem->{'biblioitemnumber'}";
874
875     $dbh->do($query);
876 } # sub modbibitem
877
878 # FIXME - This is in effect identical to &C4::Biblio::modnote.
879 # Pick one and stick with it.
880 # XXX - POD
881 sub modnote {
882   my ($bibitemnum,$note)=@_;
883   my $dbh = C4::Context->dbh;
884   # FIXME - Use $dbh->do();
885   my $query="update biblioitems set notes='$note' where
886   biblioitemnumber='$bibitemnum'";
887   my $sth=$dbh->prepare($query);
888   $sth->execute;
889   $sth->finish;
890 }
891
892 # XXX - POD
893 # FIXME - &C4::Biblio::newbiblioitem is quite similar to this
894 sub newbiblioitem {
895   my ($biblioitem) = @_;
896   my $dbh   = C4::Context->dbh;
897   my $query = "Select max(biblioitemnumber) from biblioitems";
898   my $sth   = $dbh->prepare($query);
899   my $data;
900   my $bibitemnum;
901
902   $biblioitem->{'volume'}          = $dbh->quote($biblioitem->{'volume'});
903   $biblioitem->{'number'}          = $dbh->quote($biblioitem->{'number'});
904   $biblioitem->{'classification'}  = $dbh->quote($biblioitem->{'classification'});
905   $biblioitem->{'itemtype'}        = $dbh->quote($biblioitem->{'itemtype'});
906   $biblioitem->{'url'}             = $dbh->quote($biblioitem->{'url'});
907   $biblioitem->{'isbn'}            = $dbh->quote($biblioitem->{'isbn'});
908   $biblioitem->{'issn'}            = $dbh->quote($biblioitem->{'issn'});
909   $biblioitem->{'dewey'}           = $dbh->quote($biblioitem->{'dewey'});
910   $biblioitem->{'subclass'}        = $dbh->quote($biblioitem->{'subclass'});
911   $biblioitem->{'publicationyear'} = $dbh->quote($biblioitem->{'publicationyear'});
912   $biblioitem->{'publishercode'}   = $dbh->quote($biblioitem->{'publishercode'});
913   $biblioitem->{'volumedate'}      = $dbh->quote($biblioitem->{'volumedate'});
914   $biblioitem->{'volumeddesc'}     = $dbh->quote($biblioitem->{'volumeddesc'});  $biblioitem->{'illus'}            = $dbh->quote($biblioitem->{'illus'});
915   $biblioitem->{'illus'}           = $dbh->quote($biblioitem->{'illus'});
916   $biblioitem->{'pages'}           = $dbh->quote($biblioitem->{'pages'});
917   $biblioitem->{'notes'}           = $dbh->quote($biblioitem->{'notes'});
918   $biblioitem->{'size'}            = $dbh->quote($biblioitem->{'size'});
919   $biblioitem->{'place'}           = $dbh->quote($biblioitem->{'place'});
920   $biblioitem->{'lccn'}            = $dbh->quote($biblioitem->{'lccn'});
921   $biblioitem->{'marc'}            = $dbh->quote($biblioitem->{'marc'});
922   
923   $sth->execute;
924   $data       = $sth->fetchrow_arrayref;
925   $bibitemnum = $$data[0] + 1;
926
927   $sth->finish;
928
929   $query = "insert into biblioitems set
930 biblioitemnumber = $bibitemnum,
931 biblionumber     = $biblioitem->{'biblionumber'},
932 volume           = $biblioitem->{'volume'},
933 number           = $biblioitem->{'number'},
934 classification   = $biblioitem->{'classification'},
935 itemtype         = $biblioitem->{'itemtype'},
936 url              = $biblioitem->{'url'},
937 isbn             = $biblioitem->{'isbn'},
938 issn             = $biblioitem->{'issn'},
939 dewey            = $biblioitem->{'dewey'},
940 subclass         = $biblioitem->{'subclass'},
941 publicationyear  = $biblioitem->{'publicationyear'},
942 publishercode    = $biblioitem->{'publishercode'},
943 volumedate       = $biblioitem->{'volumedate'},
944 volumeddesc      = $biblioitem->{'volumeddesc'},
945 illus            = $biblioitem->{'illus'},
946 pages            = $biblioitem->{'pages'},
947 notes            = $biblioitem->{'notes'},
948 size             = $biblioitem->{'size'},
949 lccn             = $biblioitem->{'lccn'},
950 marc             = $biblioitem->{'marc'},
951 place            = $biblioitem->{'place'}";
952
953   $sth = $dbh->prepare($query);
954   $sth->execute;
955
956   $sth->finish;
957   return($bibitemnum);
958 }
959
960 # FIXME - This is in effect identical to &C4::Biblio::newsubject.
961 # Pick one and stick with it.
962 # XXX - POD
963 sub newsubject {
964   my ($bibnum)=@_;
965   my $dbh = C4::Context->dbh;
966   my $query="insert into bibliosubject (biblionumber) values
967   ($bibnum)";
968   my $sth=$dbh->prepare($query);
969 #  print $query;
970   $sth->execute;
971   $sth->finish;
972 }
973
974 # XXX - POD
975 # FIXME - This is in effect the same as &C4::Biblio::newsubtitle
976 # Pick one and stick with it.
977 sub newsubtitle {
978   my ($bibnum, $subtitle) = @_;
979   my $dbh   = C4::Context->dbh;
980   $subtitle = $dbh->quote($subtitle);
981   my $query = "insert into bibliosubtitle set
982 biblionumber = $bibnum,
983 subtitle = $subtitle";
984   my $sth   = $dbh->prepare($query);
985
986   $sth->execute;
987
988   $sth->finish;
989 }
990
991 =item neworder
992
993   &neworder($biblionumber, $title, $ordnum, $basket, $quantity, $listprice,
994         $booksellerid, $who, $notes, $bookfund, $biblioitemnumber, $rrp,
995         $ecost, $gst, $budget, $unitprice, $subscription,
996         $booksellerinvoicenumber);
997
998 Adds a new order to the database. Any argument that isn't described
999 below is the new value of the field with the same name in the aqorders
1000 table of the Koha database.
1001
1002 C<$ordnum> is a "minimum order number." After adding the new entry to
1003 the aqorders table, C<&neworder> finds the first entry in aqorders
1004 with order number greater than or equal to C<$ordnum>, and adds an
1005 entry to the aqorderbreakdown table, with the order number just found,
1006 and the book fund ID of the newly-added order.
1007
1008 C<$budget> is effectively ignored.
1009
1010 C<$subscription> may be either "yes", or anything else for "no".
1011
1012 =cut
1013 #'
1014 # FIXME - This function appears in C4::Catalogue
1015 sub neworder {
1016   my ($bibnum,$title,$ordnum,$basket,$quantity,$listprice,$supplier,$who,$notes,$bookfund,$bibitemnum,$rrp,$ecost,$gst,$budget,$cost,$sub,$invoice)=@_;
1017   if ($budget eq 'now'){
1018     $budget="now()";
1019   } else {
1020     $budget="'2001-07-01'";
1021   }
1022   if ($sub eq 'yes'){
1023     $sub=1;
1024   } else {
1025     $sub=0;
1026   }
1027   my $dbh = C4::Context->dbh;
1028   my $query="insert into aqorders (biblionumber,title,basketno,
1029   quantity,listprice,booksellerid,entrydate,requisitionedby,authorisedby,notes,
1030   biblioitemnumber,rrp,ecost,gst,unitprice,subscription,booksellerinvoicenumber)
1031
1032   values
1033   ($bibnum,'$title',$basket,$quantity,$listprice,'$supplier',now(),
1034   '$who','$who','$notes',$bibitemnum,'$rrp','$ecost','$gst','$cost',
1035   '$sub','$invoice')";
1036   my $sth=$dbh->prepare($query);
1037 #  print $query;
1038   $sth->execute;
1039   $sth->finish;
1040   $query="select * from aqorders where
1041   biblionumber=$bibnum and basketno=$basket and ordernumber >=$ordnum";
1042   $sth=$dbh->prepare($query);
1043   $sth->execute;
1044   my $data=$sth->fetchrow_hashref;
1045   $sth->finish;
1046   $ordnum=$data->{'ordernumber'};
1047   $query="insert into aqorderbreakdown (ordernumber,bookfundid) values
1048   ($ordnum,'$bookfund')";
1049   $sth=$dbh->prepare($query);
1050 #  print $query;
1051   $sth->execute;
1052   $sth->finish;
1053 }
1054
1055 =item delorder
1056
1057   &delorder($biblionumber, $ordernumber);
1058
1059 Cancel the order with the given order and biblio numbers. It does not
1060 delete any entries in the aqorders table, it merely marks them as
1061 cancelled.
1062
1063 If there are no items remaining with the given biblionumber,
1064 C<&delorder> also deletes them from the marc_subfield_table and
1065 marc_biblio tables of the Koha database.
1066
1067 =cut
1068 #'
1069 # FIXME - This function appears in C4::Catalogue
1070 sub delorder {
1071   my ($bibnum,$ordnum)=@_;
1072   my $dbh = C4::Context->dbh;
1073   my $query="update aqorders set datecancellationprinted=now()
1074   where biblionumber='$bibnum' and
1075   ordernumber='$ordnum'";
1076   my $sth=$dbh->prepare($query);
1077   #print $query;
1078   $sth->execute;
1079   $sth->finish;
1080   my $count=itemcount($bibnum);
1081   if ($count == 0){
1082     delbiblio($bibnum);
1083   }
1084 }
1085
1086 =item modorder
1087
1088   &modorder($title, $ordernumber, $quantity, $listprice,
1089         $biblionumber, $basketno, $supplier, $who, $notes,
1090         $bookfundid, $bibitemnum, $rrp, $ecost, $gst, $budget,
1091         $unitprice, $booksellerinvoicenumber);
1092
1093 Modifies an existing order. Updates the order with order number
1094 C<$ordernumber> and biblionumber C<$biblionumber>. All other arguments
1095 update the fields with the same name in the aqorders table of the Koha
1096 database.
1097
1098 Entries with order number C<$ordernumber> in the aqorderbreakdown
1099 table are also updated to the new book fund ID.
1100
1101 =cut
1102 #'
1103 # FIXME - This function appears in C4::Catalogue
1104 sub modorder {
1105   my ($title,$ordnum,$quantity,$listprice,$bibnum,$basketno,$supplier,$who,$notes,$bookfund,$bibitemnum,$rrp,$ecost,$gst,$budget,$cost,$invoice)=@_;
1106   my $dbh = C4::Context->dbh;
1107   my $query="update aqorders set title='$title',
1108   quantity='$quantity',listprice='$listprice',basketno='$basketno', 
1109   rrp='$rrp',ecost='$ecost',unitprice='$cost',
1110   booksellerinvoicenumber='$invoice'
1111   where
1112   ordernumber=$ordnum and biblionumber=$bibnum";
1113   my $sth=$dbh->prepare($query);
1114 #  print $query;
1115   $sth->execute;
1116   $sth->finish;
1117   $query="update aqorderbreakdown set bookfundid=$bookfund where
1118   ordernumber=$ordnum";
1119   $sth=$dbh->prepare($query);
1120 #  print $query;
1121   $sth->execute;
1122   $sth->finish;
1123 }
1124
1125 =item newordernum
1126
1127   $order = &newordernum();
1128
1129 Finds the next unused order number in the aqorders table of the Koha
1130 database, and returns it.
1131
1132 =cut
1133 #'
1134 # FIXME - Race condition
1135 # FIXME - This function appears in C4::Catalogue
1136 sub newordernum {
1137   my $dbh = C4::Context->dbh;
1138   my $query="Select max(ordernumber) from aqorders";
1139   my $sth=$dbh->prepare($query);
1140   $sth->execute;
1141   my $data=$sth->fetchrow_arrayref;
1142   my $ordnum=$$data[0];
1143   $ordnum++;
1144   $sth->finish;
1145   return($ordnum);
1146 }
1147
1148 =item receiveorder
1149
1150   &receiveorder($biblionumber, $ordernumber, $quantityreceived, $user,
1151         $unitprice, $booksellerinvoicenumber, $biblioitemnumber,
1152         $freight, $bookfund, $rrp);
1153
1154 Updates an order, to reflect the fact that it was received, at least
1155 in part. All arguments not mentioned below update the fields with the
1156 same name in the aqorders table of the Koha database.
1157
1158 Updates the order with bibilionumber C<$biblionumber> and ordernumber
1159 C<$ordernumber>.
1160
1161 Also updates the book fund ID in the aqorderbreakdown table.
1162
1163 =cut
1164 #'
1165 # FIXME - This function appears in C4::Catalogue
1166 sub receiveorder {
1167   my ($biblio,$ordnum,$quantrec,$user,$cost,$invoiceno,$bibitemno,$freight,$bookfund,$rrp)=@_;
1168   my $dbh = C4::Context->dbh;
1169   my $query="update aqorders set quantityreceived='$quantrec',
1170   datereceived=now(),booksellerinvoicenumber='$invoiceno',
1171   biblioitemnumber=$bibitemno,unitprice='$cost',freight='$freight',
1172   rrp='$rrp'
1173   where biblionumber=$biblio and ordernumber=$ordnum
1174   ";
1175 #  print $query;
1176   my $sth=$dbh->prepare($query);
1177   $sth->execute;
1178   $sth->finish;
1179   $query="update aqorderbreakdown set bookfundid=$bookfund where
1180   ordernumber=$ordnum";
1181   $sth=$dbh->prepare($query);
1182 #  print $query;
1183   $sth->execute;
1184   $sth->finish;  
1185 }
1186
1187 =item updaterecorder
1188
1189   &updaterecorder($biblionumber, $ordernumber, $user, $unitprice,
1190         $bookfundid, $rrp);
1191
1192 Updates the order with biblionumber C<$biblionumber> and order number
1193 C<$ordernumber>. C<$bookfundid> is the new value for the book fund ID
1194 in the aqorderbreakdown table of the Koha database. All other
1195 arguments update the fields with the same name in the aqorders table.
1196
1197 C<$user> is ignored.
1198
1199 =cut
1200 #'
1201 # FIXME - This function appears in C4::Catalogue
1202 sub updaterecorder{
1203   my($biblio,$ordnum,$user,$cost,$bookfund,$rrp)=@_;
1204   my $dbh = C4::Context->dbh;
1205   my $query="update aqorders set
1206   unitprice='$cost', rrp='$rrp'
1207   where biblionumber=$biblio and ordernumber=$ordnum
1208   ";
1209 #  print $query;
1210   my $sth=$dbh->prepare($query);
1211   $sth->execute;
1212   $sth->finish;
1213   $query="update aqorderbreakdown set bookfundid=$bookfund where
1214   ordernumber=$ordnum";
1215   $sth=$dbh->prepare($query);
1216 #  print $query;
1217   $sth->execute;
1218   $sth->finish;  
1219 }
1220
1221 =item curconvert
1222
1223   $foreignprice = &curconvert($currency, $localprice);
1224
1225 Converts the price C<$localprice> to foreign currency C<$currency> by
1226 dividing by the exchange rate, and returns the result.
1227
1228 If no exchange rate is found, C<&curconvert> assumes the rate is one
1229 to one.
1230
1231 =cut
1232 #'
1233 # FIXME - An almost identical version of this function appears in
1234 # C4::Catalogue
1235 sub curconvert {
1236   my ($currency,$price)=@_;
1237   my $dbh = C4::Context->dbh;
1238   my $query="Select rate from currency where currency='$currency'";
1239   my $sth=$dbh->prepare($query);
1240   $sth->execute;
1241   my $data=$sth->fetchrow_hashref;
1242   $sth->finish;
1243   my $cur=$data->{'rate'};
1244   if ($cur==0){
1245     $cur=1;
1246   }
1247   $price=$price / $cur;
1248   return($price);
1249 }
1250
1251 =item getcurrencies
1252
1253   ($count, $currencies) = &getcurrencies();
1254
1255 Returns the list of all known currencies.
1256
1257 C<$count> is the number of elements in C<$currencies>. C<$currencies>
1258 is a reference-to-array; its elements are references-to-hash, whose
1259 keys are the fields from the currency table in the Koha database.
1260
1261 =cut
1262 #'
1263 # FIXME - This function appears in C4::Catalogue
1264 sub getcurrencies {
1265   my $dbh = C4::Context->dbh;
1266   my $query="Select * from currency";
1267   my $sth=$dbh->prepare($query);
1268   $sth->execute;
1269   my @results;
1270   my $i=0;
1271   while (my $data=$sth->fetchrow_hashref){
1272     $results[$i]=$data;
1273     $i++;
1274   }
1275   $sth->finish;
1276   return($i,\@results);
1277
1278
1279 # FIXME - This function appears in C4::Catalogue. Neither one is used.
1280 sub getcurrency {
1281   my ($cur)=@_;
1282   my $dbh = C4::Context->dbh;
1283   my $query="Select * from currency where currency='$cur'";
1284   my $sth=$dbh->prepare($query);
1285   $sth->execute;
1286
1287   my $data=$sth->fetchrow_hashref;
1288   $sth->finish;
1289   return($data);
1290
1291
1292 =item updatecurrencies
1293
1294   &updatecurrencies($currency, $newrate);
1295
1296 Sets the exchange rate for C<$currency> to be C<$newrate>.
1297
1298 =cut
1299 #'
1300 # FIXME - This function appears in C4::Catalogue
1301 sub updatecurrencies {
1302   my ($currency,$rate)=@_;
1303   my $dbh = C4::Context->dbh;
1304   my $query="update currency set rate=$rate where currency='$currency'";
1305   my $sth=$dbh->prepare($query);
1306   $sth->execute;
1307   $sth->finish;
1308
1309
1310 =item updatesup
1311
1312   &updatesup($bookseller);
1313
1314 Updates the information for a given bookseller. C<$bookseller> is a
1315 reference-to-hash whose keys are the fields of the aqbooksellers table
1316 in the Koha database. It must contain entries for all of the fields.
1317 The entry to modify is determined by C<$bookseller-E<gt>{id}>.
1318
1319 The easiest way to get all of the necessary fields is to look up a
1320 book seller with C<&booksellers>, modify what's necessary, then call
1321 C<&updatesup> with the result.
1322
1323 =cut
1324 #'
1325 # FIXME - This function appears in C4::Catalogue
1326 sub updatesup {
1327    my ($data)=@_;
1328    my $dbh = C4::Context->dbh;
1329    my $query="Update aqbooksellers set
1330    name='$data->{'name'}',address1='$data->{'address1'}',address2='$data->{'address2'}',
1331    address3='$data->{'address3'}',address4='$data->{'address4'}',postal='$data->{'postal'}',
1332    phone='$data->{'phone'}',fax='$data->{'fax'}',url='$data->{'url'}',
1333    contact='$data->{'contact'}',contpos='$data->{'contpos'}',
1334    contphone='$data->{'contphone'}', contfax='$data->{'contfax'}', contaltphone=
1335    '$data->{'contaltphone'}', contemail='$data->{'contemail'}', contnotes=
1336    '$data->{'contnotes'}', active=$data->{'active'},
1337    listprice='$data->{'listprice'}', invoiceprice='$data->{'invoiceprice'}',
1338    gstreg=$data->{'gstreg'}, listincgst=$data->{'listincgst'},
1339    invoiceincgst=$data->{'invoiceincgst'}, specialty='$data->{'specialty'}',
1340    discount='$data->{'discount'}',invoicedisc='$data->{'invoicedisc'}',
1341    nocalc='$data->{'nocalc'}'
1342    where id='$data->{'id'}'";
1343    my $sth=$dbh->prepare($query);
1344    $sth->execute;
1345    $sth->finish;
1346 #   print $query;
1347 }
1348
1349 # XXX - POD
1350 sub insertsup {
1351   my ($data)=@_;
1352   my $dbh = C4::Context->dbh;
1353   my $sth=$dbh->prepare("Select max(id) from aqbooksellers");
1354   $sth->execute;
1355   my $data2=$sth->fetchrow_hashref;
1356   $sth->finish;
1357   $data2->{'max(id)'}++;
1358   $sth=$dbh->prepare("Insert into aqbooksellers (id) values ($data2->{'max(id)'})");
1359   $sth->execute;
1360   $sth->finish;
1361   $data->{'id'}=$data2->{'max(id)'};
1362   updatesup($data);
1363   return($data->{'id'});
1364 }
1365
1366 =item insertsup
1367
1368   $id = &insertsup($bookseller);
1369
1370 Creates a new bookseller. C<$bookseller> is a reference-to-hash whose
1371 keys are the fields of the aqbooksellers table in the Koha database.
1372 All fields must be present.
1373
1374 Returns the ID of the newly-created bookseller.
1375
1376 =cut
1377 #'
1378 # FIXME - This function appears in C4::Catalogue
1379 # FIXME - This is different from &C4::Biblio::newitems, though both
1380 # are exported.
1381 sub newitems {
1382   my ($item, @barcodes) = @_;
1383   my $dbh   = C4::Context->dbh;
1384   my $query = "Select max(itemnumber) from items";
1385   my $sth   = $dbh->prepare($query);
1386   my $data;
1387   my $itemnumber;
1388   my $error;
1389
1390   $sth->execute;
1391   $data       = $sth->fetchrow_hashref;
1392   $itemnumber = $data->{'max(itemnumber)'} + 1;
1393   $sth->finish;
1394   
1395   $item->{'booksellerid'}     = $dbh->quote($item->{'booksellerid'});
1396   $item->{'homebranch'}       = $dbh->quote($item->{'homebranch'});
1397   $item->{'price'}            = $dbh->quote($item->{'price'});
1398   $item->{'replacementprice'} = $dbh->quote($item->{'replacementprice'});
1399   $item->{'itemnotes'}        = $dbh->quote($item->{'itemnotes'});
1400
1401   foreach my $barcode (@barcodes) {
1402     $barcode = uc($barcode);
1403     $barcode = $dbh->quote($barcode);
1404     $query   = "Insert into items set
1405 itemnumber           = $itemnumber,
1406 biblionumber         = $item->{'biblionumber'},
1407 biblioitemnumber     = $item->{'biblioitemnumber'},
1408 barcode              = $barcode,
1409 booksellerid         = $item->{'booksellerid'},
1410 dateaccessioned      = NOW(),
1411 homebranch           = $item->{'homebranch'},
1412 holdingbranch        = $item->{'homebranch'},
1413 price                = $item->{'price'},
1414 replacementprice     = $item->{'replacementprice'},
1415 replacementpricedate = NOW(),
1416 itemnotes            = $item->{'itemnotes'}";
1417
1418     if ($item->{'loan'}) {
1419       $query .= ",
1420 notforloan           = $item->{'loan'}";
1421     } # if
1422
1423     $sth = $dbh->prepare($query);
1424     $sth->execute;
1425
1426     $error .= $sth->errstr;
1427
1428     $sth->finish;
1429     $itemnumber++;
1430   } # for
1431
1432   return($error);
1433 }
1434
1435 # FIXME - This is the same as &C4::Biblio::Checkitems.
1436 # Pick one and stick with it.
1437 # XXX - POD
1438 sub checkitems{
1439   my ($count,@barcodes)=@_;
1440   my $dbh = C4::Context->dbh;
1441   my $error;
1442   for (my $i=0;$i<$count;$i++){
1443     $barcodes[$i]=uc $barcodes[$i];
1444     my $query="Select * from items where barcode='$barcodes[$i]'";
1445     my $sth=$dbh->prepare($query);
1446     $sth->execute;
1447     if (my $data=$sth->fetchrow_hashref){
1448       $error.=" Duplicate Barcode: $barcodes[$i]";
1449     }
1450     $sth->finish;
1451   }
1452   return($error);
1453 }
1454
1455 # FIXME - This appears to be functionally equivalent to
1456 # &C4::Biblio::moditem.
1457 # Pick one and stick with it.
1458 # XXX - POD
1459 sub moditem {
1460   my ($loan,$itemnum,$bibitemnum,$barcode,$notes,$homebranch,$lost,$wthdrawn,$replacement)=@_;
1461   my $dbh = C4::Context->dbh;
1462   my $query="update items set biblioitemnumber=$bibitemnum,
1463   barcode='$barcode',itemnotes='$notes'
1464   where itemnumber=$itemnum";
1465   if ($barcode eq ''){
1466     $query="update items set biblioitemnumber=$bibitemnum,notforloan=$loan where itemnumber=$itemnum";
1467   }
1468   if ($lost ne ''){
1469     $query="update items set biblioitemnumber=$bibitemnum,
1470       barcode='$barcode',itemnotes='$notes',homebranch='$homebranch',
1471       itemlost='$lost',wthdrawn='$wthdrawn' where itemnumber=$itemnum";
1472   }
1473   if ($replacement ne ''){
1474     $query=~ s/ where/,replacementprice='$replacement' where/;
1475   }
1476
1477   my $sth=$dbh->prepare($query);
1478   $sth->execute;
1479   $sth->finish;
1480 }
1481
1482 # FIXME - This function appears in C4::Catalogue. Neither one is used
1483 sub updatecost{
1484   my($price,$rrp,$itemnum)=@_;
1485   my $dbh = C4::Context->dbh;
1486   my $query="update items set price='$price',replacementprice='$rrp'
1487   where itemnumber=$itemnum";
1488   my $sth=$dbh->prepare($query);
1489   $sth->execute;
1490   $sth->finish;
1491 }
1492
1493 # FIXME - This is identical to &C4::Biblio::countitems.
1494 # Pick one and stick with it.
1495 # XXX - POD
1496 sub countitems{
1497   my ($bibitemnum)=@_;
1498   my $dbh = C4::Context->dbh;
1499   my $query="Select count(*) from items where biblioitemnumber='$bibitemnum'";
1500   my $sth=$dbh->prepare($query);
1501   $sth->execute;
1502   my $data=$sth->fetchrow_hashref;
1503   $sth->finish;
1504   return($data->{'count(*)'});
1505 }
1506
1507 # FIXME - This function appears in C4::Catalogue. Neither one is used.
1508 sub findall {
1509   my ($biblionumber)=@_;
1510   my $dbh = C4::Context->dbh;
1511   my $query="Select * from biblioitems,items,itemtypes where 
1512   biblioitems.biblionumber=$biblionumber 
1513   and biblioitems.biblioitemnumber=items.biblioitemnumber and
1514   itemtypes.itemtype=biblioitems.itemtype
1515   order by items.biblioitemnumber";
1516   my $sth=$dbh->prepare($query);
1517   $sth->execute;
1518   my @results;
1519   my $i;
1520   while (my $data=$sth->fetchrow_hashref){
1521     $results[$i]=$data;
1522     $i++;
1523   }
1524   $sth->finish;
1525   return(@results);
1526 }
1527
1528 # FIXME - This function appears in C4::Catalogue. Neither one is used
1529 sub needsmod{
1530   my ($bibitemnum,$itemtype)=@_;
1531   my $dbh = C4::Context->dbh;
1532   my $query="Select * from biblioitems where biblioitemnumber=$bibitemnum
1533   and itemtype='$itemtype'";
1534   my $sth=$dbh->prepare($query);
1535   $sth->execute;
1536   my $result=0;
1537   if (my $data=$sth->fetchrow_hashref){
1538     $result=1;
1539   }
1540   $sth->finish;
1541   return($result);
1542 }
1543
1544 # FIXME - A nearly-identical function, appears in C4::Biblio
1545 # Pick one and stick with it.
1546 # XXX - POD
1547 sub delitem{
1548   my ($itemnum)=@_;
1549   my $dbh = C4::Context->dbh;
1550   my $query="select * from items where itemnumber=$itemnum";
1551   my $sth=$dbh->prepare($query);
1552   $sth->execute;
1553   my @data=$sth->fetchrow_array;
1554   $sth->finish;
1555   $query="Insert into deleteditems values (";
1556   foreach my $temp (@data){
1557     $query=$query."'$temp',";
1558   }
1559   $query=~ s/\,$/\)/;
1560 #  print $query;
1561   $sth=$dbh->prepare($query);
1562   $sth->execute;
1563   $sth->finish;
1564   $query = "Delete from items where itemnumber=$itemnum";
1565   $sth=$dbh->prepare($query);
1566   $sth->execute;
1567   $sth->finish;
1568 }
1569
1570 # FIXME - This is functionally identical to &C4::Biblio::deletebiblioitem.
1571 # Pick one and stick with it.
1572 # XXX - POD
1573 sub deletebiblioitem {
1574     my ($biblioitemnumber) = @_;
1575     my $dbh   = C4::Context->dbh;
1576     my $query = "Select * from biblioitems
1577 where biblioitemnumber = $biblioitemnumber";
1578     my $sth   = $dbh->prepare($query);
1579     my @results;
1580
1581     $sth->execute;
1582   
1583     if (@results = $sth->fetchrow_array) {
1584
1585         $query = "Insert into deletedbiblioitems values (";
1586         foreach my $value (@results) {
1587             $value  = $dbh->quote($value);
1588             $query .= "$value,";
1589         } # foreach
1590
1591         $query =~ s/\,$/\)/;
1592         $dbh->do($query);
1593
1594         $query = "Delete from biblioitems
1595 where biblioitemnumber = $biblioitemnumber";
1596         $dbh->do($query);
1597     } # if
1598
1599     $sth->finish;
1600
1601 # Now delete all the items attached to the biblioitem
1602
1603     $query = "Select * from items where biblioitemnumber = $biblioitemnumber";
1604     $sth   = $dbh->prepare($query);
1605
1606     $sth->execute;
1607
1608     while (@results = $sth->fetchrow_array) {
1609
1610         $query = "Insert into deleteditems values (";
1611         foreach my $value (@results) {
1612             $value  = $dbh->quote($value);
1613             $query .= "$value,";
1614         } # foreach
1615
1616         $query =~ s/\,$/\)/;
1617         $dbh->do($query);
1618     } # while
1619
1620     $sth->finish;
1621
1622     $query = "Delete from items where biblioitemnumber = $biblioitemnumber";
1623     $dbh->do($query);
1624     
1625 } # sub deletebiblioitem
1626
1627 # FIXME - This is functionally identical to &C4::Biblio::delbiblio.
1628 # Pick one and stick with it.
1629 # XXX - POD
1630 sub delbiblio{
1631   my ($biblio)=@_;
1632   my $dbh = C4::Context->dbh;
1633   my $query="select * from biblio where biblionumber=$biblio";
1634   my $sth=$dbh->prepare($query);
1635   $sth->execute;
1636   if (my @data=$sth->fetchrow_array){
1637     $sth->finish;
1638     $query="Insert into deletedbiblio values (";
1639     foreach my $temp (@data){
1640       $temp=~ s/\'/\\\'/g;
1641       $query=$query."'$temp',";
1642     }
1643     $query=~ s/\,$/\)/;
1644 #   print $query;
1645     $sth=$dbh->prepare($query);
1646     $sth->execute;
1647     $sth->finish;
1648     $query = "Delete from biblio where biblionumber=$biblio";
1649     $sth=$dbh->prepare($query);
1650     $sth->execute;
1651     $sth->finish;
1652   }
1653
1654   $sth->finish;
1655 }
1656
1657 # XXX - POD
1658 sub getitemtypes {
1659   my $dbh   = C4::Context->dbh;
1660   my $query = "select * from itemtypes";
1661   my $sth   = $dbh->prepare($query);
1662     # || die "Cannot prepare $query" . $dbh->errstr;
1663   my $count = 0;
1664   my @results;
1665   
1666   $sth->execute;
1667     # || die "Cannot execute $query\n" . $sth->errstr;
1668   while (my $data = $sth->fetchrow_hashref) {
1669     $results[$count] = $data;
1670     $count++;
1671   } # while
1672   
1673   $sth->finish;
1674   return($count, @results);
1675 } # sub getitemtypes
1676
1677 # FIXME - This is identical to &C4::Biblio::getitemtypes.
1678 # Pick one and stick with it.
1679 # XXX - POD
1680 sub getbiblio {
1681     my ($biblionumber) = @_;
1682     my $dbh   = C4::Context->dbh;
1683     my $query = "Select * from biblio where biblionumber = $biblionumber";
1684     my $sth   = $dbh->prepare($query);
1685       # || die "Cannot prepare $query\n" . $dbh->errstr;
1686     my $count = 0;
1687     my @results;
1688     
1689     $sth->execute;
1690       # || die "Cannot execute $query\n" . $sth->errstr;
1691     while (my $data = $sth->fetchrow_hashref) {
1692       $results[$count] = $data;
1693       $count++;
1694     } # while
1695     
1696     $sth->finish;
1697     return($count, @results);
1698 } # sub getbiblio
1699
1700 # XXX - POD
1701 sub getbiblioitem {
1702     my ($biblioitemnum) = @_;
1703     my $dbh   = C4::Context->dbh;
1704     my $query = "Select * from biblioitems where
1705 biblioitemnumber = $biblioitemnum";
1706     my $sth   = $dbh->prepare($query);
1707     my $count = 0;
1708     my @results;
1709
1710     $sth->execute;
1711
1712     while (my $data = $sth->fetchrow_hashref) {
1713         $results[$count] = $data;
1714         $count++;
1715     } # while
1716
1717     $sth->finish;
1718     return($count, @results);
1719 } # sub getbiblioitem
1720
1721 # FIXME - This is identical to &C4::Biblio::getbiblioitem.
1722 # Pick one and stick with it.
1723 # XXX - POD
1724 sub getbiblioitembybiblionumber {
1725     my ($biblionumber) = @_;
1726     my $dbh   = C4::Context->dbh;
1727     my $query = "Select * from biblioitems where biblionumber =
1728 $biblionumber";
1729     my $sth   = $dbh->prepare($query);
1730     my $count = 0;
1731     my @results;
1732
1733     $sth->execute;
1734
1735     while (my $data = $sth->fetchrow_hashref) {
1736         $results[$count] = $data;
1737         $count++;
1738     } # while
1739
1740     $sth->finish;
1741     return($count, @results);
1742 } # sub
1743
1744 # FIXME - This is identical to
1745 # &C4::Biblio::getbiblioitembybiblionumber.
1746 # Pick one and stick with it.
1747 # XXX - POD
1748 sub getitemsbybiblioitem {
1749     my ($biblioitemnum) = @_;
1750     my $dbh   = C4::Context->dbh;
1751     my $query = "Select * from items, biblio where
1752 biblio.biblionumber = items.biblionumber and biblioitemnumber
1753 = $biblioitemnum";
1754     my $sth   = $dbh->prepare($query);
1755       # || die "Cannot prepare $query\n" . $dbh->errstr;
1756     my $count = 0;
1757     my @results;
1758     
1759     $sth->execute;
1760       # || die "Cannot execute $query\n" . $sth->errstr;
1761     while (my $data = $sth->fetchrow_hashref) {
1762       $results[$count] = $data;
1763       $count++;
1764     } # while
1765     
1766     $sth->finish;
1767     return($count, @results);
1768 } # sub getitemsbybiblioitem
1769
1770 # FIXME - This is identical to &C4::Biblio::isbnsearch.
1771 # Pick one and stick with it.
1772 # XXX - POD
1773 sub isbnsearch {
1774     my ($isbn) = @_;
1775     my $dbh   = C4::Context->dbh;
1776     my $count = 0;
1777     my $query;
1778     my $sth;
1779     my @results;
1780     
1781     $isbn  = $dbh->quote($isbn);
1782     $query = "Select biblio.* from biblio, biblioitems where
1783 biblio.biblionumber = biblioitems.biblionumber
1784 and isbn = $isbn";
1785     $sth   = $dbh->prepare($query);
1786     
1787     $sth->execute;
1788     while (my $data = $sth->fetchrow_hashref) {
1789         $results[$count] = $data;
1790         $count++;
1791     } # while
1792
1793     $sth->finish;
1794     return($count, @results);
1795 } # sub isbnsearch
1796
1797 =item websitesearch
1798
1799   ($count, @results) = &websitesearch($keywordlist);
1800
1801 Looks up biblioitems by URL.
1802
1803 C<$keywordlist> is a space-separated list of search terms.
1804 C<&websitesearch> returns those biblioitems whose URL contains at
1805 least one of the search terms.
1806
1807 C<$count> is the number of elements in C<@results>. C<@results> is an
1808 array of references-to-hash, whose keys are the fields of the biblio
1809 and biblioitems tables in the Koha database.
1810
1811 =cut
1812 #'
1813 # FIXME - This function appears in C4::Catalogue
1814 sub websitesearch {
1815     my ($keywordlist) = @_;
1816     my $dbh   = C4::Context->dbh;
1817     my $query = "Select distinct biblio.* from biblio, biblioitems where
1818 biblio.biblionumber = biblioitems.biblionumber and (";
1819     my $count = 0;
1820     my $sth;
1821     my @results;
1822     my @keywords = split(/ +/, $keywordlist);
1823     my $keyword = shift(@keywords);
1824
1825     $keyword =~ s/%/\\%/g;
1826     $keyword =~ s/_/\\_/;
1827     $keyword = "%" . $keyword . "%";
1828     $keyword = $dbh->quote($keyword);
1829     $query  .= " (url like $keyword)";
1830
1831     foreach $keyword (@keywords) {
1832         $keyword =~ s/%/\\%/;
1833         $keyword =~ s/_/\\_/;
1834         $keyword = "%" . $keyword . "%";
1835         $keyword = $dbh->quote($keyword);
1836         $query  .= " or (url like $keyword)";
1837     } # foreach
1838
1839     $query .= ")";
1840     $sth    = $dbh->prepare($query);
1841     $sth->execute;
1842
1843     while (my $data = $sth->fetchrow_hashref) {
1844         $results[$count] = $data;
1845         $count++;
1846     } # while
1847
1848     $sth->finish;
1849     return($count, @results);
1850 } # sub websitesearch
1851
1852 =item addwebsite
1853
1854   &addwebsite($website);
1855
1856 Adds a new web site. C<$website> is a reference-to-hash, with the keys
1857 C<biblionumber>, C<title>, C<description>, and C<url>. All of these
1858 are mandatory.
1859
1860 =cut
1861 #'
1862 # FIXME - This function appears in C4::Catalogue
1863 sub addwebsite {
1864     my ($website) = @_;
1865     my $dbh = C4::Context->dbh;
1866     my $query;
1867     
1868     $website->{'biblionumber'} = $dbh->quote($website->{'biblionumber'});
1869     $website->{'title'}        = $dbh->quote($website->{'title'});
1870     $website->{'description'}  = $dbh->quote($website->{'description'});
1871     $website->{'url'}          = $dbh->quote($website->{'url'});
1872     
1873     $query = "Insert into websites set
1874 biblionumber = $website->{'biblionumber'},
1875 title        = $website->{'title'},
1876 description  = $website->{'description'},
1877 url          = $website->{'url'}";
1878     
1879     $dbh->do($query);
1880 } # sub website
1881
1882 =item updatewebsite
1883
1884   &updatewebsite($website);
1885
1886 Updates an existing web site. C<$website> is a reference-to-hash with
1887 the keys C<websitenumber>, C<title>, C<description>, and C<url>. All
1888 of these are mandatory. C<$website-E<gt>{websitenumber}> identifies
1889 the entry to update.
1890
1891 =cut
1892 #'
1893 # FIXME - This function appears in C4::Catalogue
1894 sub updatewebsite {
1895     my ($website) = @_;
1896     my $dbh = C4::Context->dbh;
1897     my $query;
1898     
1899     $website->{'title'}      = $dbh->quote($website->{'title'});
1900     $website->{'description'} = $dbh->quote($website->{'description'});
1901     $website->{'url'}        = $dbh->quote($website->{'url'});
1902     
1903     $query = "Update websites set
1904 title       = $website->{'title'},
1905 description = $website->{'description'},
1906 url         = $website->{'url'}
1907 where websitenumber = $website->{'websitenumber'}";
1908
1909     $dbh->do($query);
1910 } # sub updatewebsite
1911
1912 =item deletewebsite
1913
1914   &deletewebsite($websitenumber);
1915
1916 Deletes the web site with number C<$websitenumber>.
1917
1918 =cut
1919 #'
1920 # FIXME - This function appears in C4::Catalogue
1921 sub deletewebsite {
1922     my ($websitenumber) = @_;
1923     my $dbh = C4::Context->dbh;
1924     # FIXME - $query is unnecessary: just use
1925     # $dbh->do(<<EOT);
1926     #   DELETE FROM websites where websitenumber=$websitenumber
1927     # EOT
1928     my $query = "Delete from websites where websitenumber = $websitenumber";
1929     
1930     $dbh->do($query);
1931 } # sub deletewebsite
1932
1933
1934 END { }       # module clean-up code here (global destructor)
1935
1936 1;
1937 __END__
1938
1939 =back
1940
1941 =head1 AUTHOR
1942
1943 Koha Developement team <info@koha.org>
1944
1945 =head1 SEE ALSO
1946
1947 L<perl>.
1948
1949 =cut