Implementing Independancy Branches management :
[koha.git] / C4 / Acquisition.pm
1 package C4::Acquisition;
2
3 # Copyright 2000-2002 Katipo Communications
4 #
5 # This file is part of Koha.
6 #
7 # Koha is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free Software
9 # Foundation; either version 2 of the License, or (at your option) any later
10 # version.
11 #
12 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License along with
17 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
18 # Suite 330, Boston, MA  02111-1307 USA
19
20 use strict;
21 require Exporter;
22 use C4::Context;
23 use MARC::Record;
24 # use C4::Biblio;
25
26 use vars qw($VERSION @ISA @EXPORT);
27
28 # set the version for version checking
29 $VERSION = 0.01;
30
31 =head1 NAME
32
33 C4::Acquisition - Koha functions for dealing with orders and acquisitions
34
35 =head1 SYNOPSIS
36
37   use C4::Acquisition;
38
39 =head1 DESCRIPTION
40
41 The functions in this module deal with acquisitions, managing book
42 orders, converting money to different currencies, and so forth.
43
44 =head1 FUNCTIONS
45
46 =over 2
47
48 =cut
49
50 @ISA = qw(Exporter);
51 @EXPORT = qw(
52                 &getbasket &getbasketcontent &newbasket &closebasket
53
54                 &getorders &getallorders &getrecorders
55                 &getorder &neworder &delorder
56                 &ordersearch &histsearch
57                 &modorder &getsingleorder &invoice &receiveorder
58                 &updaterecorder &newordernum
59
60                 &bookfunds &curconvert &getcurrencies &bookfundbreakdown
61                 &updatecurrencies &getcurrency
62
63                 &branches &updatesup &insertsup
64                 &bookseller &breakdown
65 );
66
67 #
68 #
69 #
70 # BASKETS
71 #
72 #
73 #
74 =item getbasket
75
76   $aqbasket = &getbasket($basketnumber);
77
78 get all basket informations in aqbasket for a given basket
79 =cut
80
81 sub getbasket {
82         my ($basketno)=@_;
83         my $dbh=C4::Context->dbh;
84         my $sth=$dbh->prepare("select aqbasket.*,borrowers.firstname+' '+borrowers.surname as authorisedbyname, borrowers.branchcode as branch from aqbasket left join borrowers on aqbasket.authorisedby=borrowers.borrowernumber where basketno=?");
85         $sth->execute($basketno);
86         return($sth->fetchrow_hashref);
87 }
88
89 =item getbasketcontent
90
91   ($count, @orders) = &getbasketcontent($basketnumber, $booksellerID);
92
93 Looks up the pending (non-cancelled) orders with the given basket
94 number. If C<$booksellerID> is non-empty, only orders from that seller
95 are returned.
96
97 C<&basket> returns a two-element array. C<@orders> is an array of
98 references-to-hash, whose keys are the fields from the aqorders,
99 biblio, and biblioitems tables in the Koha database. C<$count> is the
100 number of elements in C<@orders>.
101
102 =cut
103 #'
104 sub getbasketcontent {
105         my ($basketno,$supplier,$orderby)=@_;
106         my $dbh = C4::Context->dbh;
107         my $query="Select biblio.*,biblioitems.*,aqorders.*,aqorderbreakdown.*,biblio.title from aqorders,biblio,biblioitems
108         left join aqorderbreakdown on aqorderbreakdown.ordernumber=aqorders.ordernumber
109         where basketno='$basketno'
110         and biblio.biblionumber=aqorders.biblionumber and biblioitems.biblioitemnumber
111         =aqorders.biblioitemnumber
112         and (datecancellationprinted is NULL or datecancellationprinted =
113         '0000-00-00')";
114         if ($supplier ne ''){
115                 $query.=" and aqorders.booksellerid='$supplier'";
116         }
117         
118         $orderby="biblioitems.publishercode" unless $orderby;
119         $query.=" order by $orderby";
120         my $sth=$dbh->prepare($query);
121         $sth->execute;
122         my @results;
123         #  print $query;
124         my $i=0;
125         while (my $data=$sth->fetchrow_hashref){
126                 $results[$i]=$data;
127                 $i++;
128         }
129         $sth->finish;
130         return($i,@results);
131 }
132
133 =item newbasket
134
135   $basket = &newbasket();
136
137 Create a new basket in aqbasket table
138 =cut
139
140 sub newbasket {
141         my ($booksellerid,$authorisedby) = @_;
142         my $dbh = C4::Context->dbh;
143         my $sth=$dbh->do("insert into aqbasket (creationdate,booksellerid,authorisedby) values(now(),'$booksellerid','$authorisedby')");
144         #find & return basketno MYSQL dependant, but $dbh->last_insert_id always returns null :-(
145         my $basket = $dbh->{'mysql_insertid'};
146         return($basket);
147 }
148
149 =item closebasket
150
151   &newbasket($basketno);
152
153 close a basket (becomes unmodifiable,except for recieves
154 =cut
155
156 sub closebasket {
157         my ($basketno) = @_;
158         my $dbh = C4::Context->dbh;
159         my $sth=$dbh->prepare("update aqbasket set closedate=now() where basketno=?");
160         $sth->execute($basketno);
161 }
162
163 =item neworder
164
165   &neworder($basket, $biblionumber, $title, $quantity, $listprice,
166         $booksellerid, $who, $notes, $bookfund, $biblioitemnumber, $rrp,
167         $ecost, $gst, $budget, $unitprice, $subscription,
168         $booksellerinvoicenumber);
169
170 Adds a new order to the database. Any argument that isn't described
171 below is the new value of the field with the same name in the aqorders
172 table of the Koha database.
173
174 C<$ordnum> is a "minimum order number." After adding the new entry to
175 the aqorders table, C<&neworder> finds the first entry in aqorders
176 with order number greater than or equal to C<$ordnum>, and adds an
177 entry to the aqorderbreakdown table, with the order number just found,
178 and the book fund ID of the newly-added order.
179
180 C<$budget> is effectively ignored.
181
182 C<$subscription> may be either "yes", or anything else for "no".
183
184 =cut
185 #'
186 sub neworder {
187         my ($basketno,$bibnum,$title,$quantity,$listprice,$booksellerid,$authorisedby,$notes,$bookfund,$bibitemnum,$rrp,$ecost,$gst,$budget,$cost,$sub,$invoice,$sort1,$sort2)=@_;
188         if ($budget eq 'now'){
189                 $budget="now()";
190         } else {
191                 $budget="'2001-07-01'";
192         }
193         if ($sub eq 'yes'){
194                 $sub=1;
195         } else {
196                 $sub=0;
197         }
198         # if $basket empty, it's also a new basket, create it
199         unless ($basketno) {
200                 $basketno=newbasket($booksellerid,$authorisedby);
201         }
202         my $dbh = C4::Context->dbh;
203         my $sth=$dbh->prepare("insert into aqorders 
204                                                                 (biblionumber,title,basketno,quantity,listprice,notes,
205                                                                 biblioitemnumber,rrp,ecost,gst,unitprice,subscription,sort1,sort2)
206                                                                 values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
207         $sth->execute($bibnum,$title,$basketno,$quantity,$listprice,$notes,
208                                         $bibitemnum,$rrp,$ecost,$gst,$cost,$sub,$sort1,$sort2);
209         $sth->finish;
210         #get ordnum MYSQL dependant, but $dbh->last_insert_id returns null
211         my $ordnum = $dbh->{'mysql_insertid'};
212         $sth=$dbh->prepare("insert into aqorderbreakdown (ordernumber,bookfundid) values
213         (?,?)");
214         $sth->execute($ordnum,$bookfund);
215         $sth->finish;
216         return $basketno;
217 }
218
219 =item delorder
220
221   &delorder($biblionumber, $ordernumber);
222
223 Cancel the order with the given order and biblio numbers. It does not
224 delete any entries in the aqorders table, it merely marks them as
225 cancelled.
226
227 =cut
228 #'
229 sub delorder {
230   my ($bibnum,$ordnum)=@_;
231   my $dbh = C4::Context->dbh;
232   my $sth=$dbh->prepare("update aqorders set datecancellationprinted=now()
233   where biblionumber=? and ordernumber=?");
234   $sth->execute($bibnum,$ordnum);
235   $sth->finish;
236 }
237
238 =item modorder
239
240   &modorder($title, $ordernumber, $quantity, $listprice,
241         $biblionumber, $basketno, $supplier, $who, $notes,
242         $bookfundid, $bibitemnum, $rrp, $ecost, $gst, $budget,
243         $unitprice, $booksellerinvoicenumber);
244
245 Modifies an existing order. Updates the order with order number
246 C<$ordernumber> and biblionumber C<$biblionumber>. All other arguments
247 update the fields with the same name in the aqorders table of the Koha
248 database.
249
250 Entries with order number C<$ordernumber> in the aqorderbreakdown
251 table are also updated to the new book fund ID.
252
253 =cut
254 #'
255 sub modorder {
256   my ($title,$ordnum,$quantity,$listprice,$bibnum,$basketno,$supplier,$who,$notes,$bookfund,$bibitemnum,$rrp,$ecost,$gst,$budget,$cost,$invoice,$sort1,$sort2)=@_;
257   my $dbh = C4::Context->dbh;
258   my $sth=$dbh->prepare("update aqorders set title=?,
259   quantity=?,listprice=?,basketno=?,
260   rrp=?,ecost=?,unitprice=?,booksellerinvoicenumber=?,
261   notes=?,sort1=?, sort2=?
262   where
263   ordernumber=? and biblionumber=?");
264   $sth->execute($title,$quantity,$listprice,$basketno,$rrp,$ecost,$cost,$invoice,$notes,$sort1,$sort2,$ordnum,$bibnum);
265   $sth->finish;
266   $sth=$dbh->prepare("update aqorderbreakdown set bookfundid=? where
267   ordernumber=?");
268   unless ($sth->execute($bookfund,$ordnum)) { # zero rows affected [Bug 734]
269     my $query="insert into aqorderbreakdown (ordernumber,bookfundid) values (?,?)";
270     $sth=$dbh->prepare($query);
271     $sth->execute($ordnum,$bookfund);
272   }
273   $sth->finish;
274 }
275
276 =item newordernum
277
278   $order = &newordernum();
279
280 Finds the next unused order number in the aqorders table of the Koha
281 database, and returns it.
282
283 =cut
284 #'
285 # FIXME - Race condition
286 sub newordernum {
287   my $dbh = C4::Context->dbh;
288   my $sth=$dbh->prepare("Select max(ordernumber) from aqorders");
289   $sth->execute;
290   my $data=$sth->fetchrow_arrayref;
291   my $ordnum=$$data[0];
292   $ordnum++;
293   $sth->finish;
294   return($ordnum);
295 }
296
297 =item receiveorder
298
299   &receiveorder($biblionumber, $ordernumber, $quantityreceived, $user,
300         $unitprice, $booksellerinvoicenumber, $biblioitemnumber,
301         $freight, $bookfund, $rrp);
302
303 Updates an order, to reflect the fact that it was received, at least
304 in part. All arguments not mentioned below update the fields with the
305 same name in the aqorders table of the Koha database.
306
307 Updates the order with bibilionumber C<$biblionumber> and ordernumber
308 C<$ordernumber>.
309
310 Also updates the book fund ID in the aqorderbreakdown table.
311
312 =cut
313 #'
314 sub receiveorder {
315         my ($biblio,$ordnum,$quantrec,$user,$cost,$invoiceno,$freight,$rrp)=@_;
316         my $dbh = C4::Context->dbh;
317         my $sth=$dbh->prepare("update aqorders set quantityreceived=?,datereceived=now(),booksellerinvoicenumber=?,
318                                                                                         unitprice=?,freight=?,rrp=?
319                                                         where biblionumber=? and ordernumber=?");
320         $sth->execute($quantrec,$invoiceno,$cost,$freight,$rrp,$biblio,$ordnum);
321         $sth->finish;
322 }
323
324 =item updaterecorder
325
326   &updaterecorder($biblionumber, $ordernumber, $user, $unitprice,
327         $bookfundid, $rrp);
328
329 Updates the order with biblionumber C<$biblionumber> and order number
330 C<$ordernumber>. C<$bookfundid> is the new value for the book fund ID
331 in the aqorderbreakdown table of the Koha database. All other
332 arguments update the fields with the same name in the aqorders table.
333
334 C<$user> is ignored.
335
336 =cut
337 #'
338 sub updaterecorder{
339   my($biblio,$ordnum,$user,$cost,$bookfund,$rrp)=@_;
340   my $dbh = C4::Context->dbh;
341   my $sth=$dbh->prepare("update aqorders set
342   unitprice=?, rrp=?
343   where biblionumber=? and ordernumber=?
344   ");
345   $sth->execute($cost,$rrp,$biblio,$ordnum);
346   $sth->finish;
347   $sth=$dbh->prepare("update aqorderbreakdown set bookfundid=? where ordernumber=?");
348   $sth->execute($bookfund,$ordnum);
349   $sth->finish;
350 }
351
352 #
353 #
354 # ORDERS
355 #
356 #
357
358 =item getorders
359
360   ($count, $orders) = &getorders($booksellerid);
361
362 Finds pending orders from the bookseller with the given ID. Ignores
363 completed and cancelled orders.
364
365 C<$count> is the number of elements in C<@{$orders}>.
366
367 C<$orders> is a reference-to-array; each element is a
368 reference-to-hash with the following fields:
369
370 =over 4
371
372 =item C<count(*)>
373
374 Gives the number of orders in with this basket number.
375
376 =item C<authorizedby>
377
378 =item C<entrydate>
379
380 =item C<basketno>
381
382 These give the value of the corresponding field in the aqorders table
383 of the Koha database.
384
385 =back
386
387 Results are ordered from most to least recent.
388
389 =cut
390 #'
391 sub getorders {
392         my ($supplierid)=@_;
393         my $dbh = C4::Context->dbh;
394         
395         my $strsth ="Select count(*),authorisedby,creationdate,aqbasket.basketno,
396 closedate,surname,firstname 
397 from aqorders 
398 left join aqbasket on aqbasket.basketno=aqorders.basketno 
399 left join borrowers on aqbasket.authorisedby=borrowers.borrowernumber
400 where booksellerid=? and (quantity > quantityreceived or
401 quantityreceived is NULL) and datecancellationprinted is NULL ";
402                 
403         if (C4::Context->preference("IndependantBranches")) {
404                 my $userenv = C4::Context->userenv;
405                 unless ($userenv->{flags} == 1){
406                         $strsth .= " and (borrowers.branchcode = '".$userenv->{branch}."' or borrowers.branchcode ='')";
407                 }
408         }
409         $strsth.=" group by basketno order by aqbasket.basketno";
410         warn "getorders :".$strsth;
411         my $sth=$dbh->prepare($strsth);
412         $sth->execute($supplierid);
413         my @results = ();
414         while (my $data=$sth->fetchrow_hashref){
415                 push(@results,$data);
416         }
417         $sth->finish;
418         return (scalar(@results),\@results);
419 }
420
421 =item getorder
422
423   ($order, $ordernumber) = &getorder($biblioitemnumber, $biblionumber);
424
425 Looks up the order with the given biblionumber and biblioitemnumber.
426
427 Returns a two-element array. C<$ordernumber> is the order number.
428 C<$order> is a reference-to-hash describing the order; its keys are
429 fields from the biblio, biblioitems, aqorders, and aqorderbreakdown
430 tables of the Koha database.
431
432 =cut
433
434 sub getorder{
435   my ($bi,$bib)=@_;
436   my $dbh = C4::Context->dbh;
437   my $sth=$dbh->prepare("Select ordernumber from aqorders where biblionumber=? and biblioitemnumber=?");
438   $sth->execute($bib,$bi);
439   # FIXME - Use fetchrow_array(), since we're only interested in the one
440   # value.
441   my $ordnum=$sth->fetchrow_hashref;
442   $sth->finish;
443   my $order=getsingleorder($ordnum->{'ordernumber'});
444   return ($order,$ordnum->{'ordernumber'});
445 }
446
447 =item getsingleorder
448
449   $order = &getsingleorder($ordernumber);
450
451 Looks up an order by order number.
452
453 Returns a reference-to-hash describing the order. The keys of
454 C<$order> are fields from the biblio, biblioitems, aqorders, and
455 aqorderbreakdown tables of the Koha database.
456
457 =cut
458
459 sub getsingleorder {
460   my ($ordnum)=@_;
461   my $dbh = C4::Context->dbh;
462   my $sth=$dbh->prepare("Select * from biblio,biblioitems,aqorders left join aqorderbreakdown
463   on aqorders.ordernumber=aqorderbreakdown.ordernumber
464   where aqorders.ordernumber=?
465   and biblio.biblionumber=aqorders.biblionumber and
466   biblioitems.biblioitemnumber=aqorders.biblioitemnumber");
467   $sth->execute($ordnum);
468   my $data=$sth->fetchrow_hashref;
469   $sth->finish;
470   return($data);
471 }
472
473 =item getallorders
474
475   ($count, @results) = &getallorders($booksellerid);
476
477 Looks up all of the pending orders from the supplier with the given
478 bookseller ID. Ignores cancelled and completed orders.
479
480 C<$count> is the number of elements in C<@results>. C<@results> is an
481 array of references-to-hash. The keys of each element are fields from
482 the aqorders, biblio, and biblioitems tables of the Koha database.
483
484 C<@results> is sorted alphabetically by book title.
485
486 =cut
487 #'
488 sub getallorders {
489   #gets all orders from a certain supplier, orders them alphabetically
490   my ($supid)=@_;
491   my $dbh = C4::Context->dbh;
492   my @results = ();
493   my $strsth="Select * from aqorders,biblio,biblioitems,aqbasket "; 
494         $strsth .= ",borrowers " if (C4::Context->preference("IndependantBranches")); 
495         $strsth .=" where aqorders.basketno=aqbasket.basketno and aqbasket.booksellerid=aqbooksellers.id and biblio.biblionumber=aqorders.biblionumber ";
496         $strsth .= " and aqbasket.authorisedby=borrowers.borrowernumber" if (C4::Context->preference("IndependantBranches"));
497         $strsth.=" and booksellerid=? and (cancelledby is NULL or cancelledby = '')
498   and (quantityreceived < quantity or quantityreceived is NULL)
499   and biblio.biblionumber=aqorders.biblionumber and biblioitems.biblioitemnumber=
500   aqorders.biblioitemnumber";
501         if (C4::Context->preference("IndependantBranches")) {
502                 my $userenv = C4::Context->userenv;
503                 unless ($userenv->{flags} == 1){
504                         $strsth .= " and (borrowers.branchcode = '".$userenv->{branch}."' or borrowers.branchcode ='')";
505                 }
506         }
507         $strsth .= "group by aqorders.biblioitemnumber
508   order by
509   biblio.title";
510   my $sth=$dbh->prepare($strsth);
511   $sth->execute($supid);
512   while (my $data=$sth->fetchrow_hashref){
513     push(@results,$data);
514   }
515   $sth->finish;
516   return(scalar(@results),@results);
517 }
518
519 # FIXME - Never used
520 sub getrecorders {
521   #gets all orders from a certain supplier, orders them alphabetically
522   my ($supid)=@_;
523   my $dbh = C4::Context->dbh;
524   my @results= ();
525   my $sth=$dbh->prepare("Select * from aqorders,biblio,biblioitems where booksellerid=?
526   and (cancelledby is NULL or cancelledby = '')
527   and biblio.biblionumber=aqorders.biblionumber and biblioitems.biblioitemnumber=
528   aqorders.biblioitemnumber and
529   aqorders.quantityreceived>0
530   and aqorders.datereceived >=now()
531   group by aqorders.biblioitemnumber
532   order by
533   biblio.title");
534   $sth->execute($supid);
535   while (my $data=$sth->fetchrow_hashref){
536     push(@results,$data);
537   }
538   $sth->finish;
539   return(scalar(@results),@results);
540 }
541
542 =item ordersearch
543
544   ($count, @results) = &ordersearch($search, $biblionumber, $complete);
545
546 Searches for orders.
547
548 C<$search> may take one of several forms: if it is an ISBN,
549 C<&ordersearch> returns orders with that ISBN. If C<$search> is an
550 order number, C<&ordersearch> returns orders with that order number
551 and biblionumber C<$biblionumber>. Otherwise, C<$search> is considered
552 to be a space-separated list of search terms; in this case, all of the
553 terms must appear in the title (matching the beginning of title
554 words).
555
556 If C<$complete> is C<yes>, the results will include only completed
557 orders. In any case, C<&ordersearch> ignores cancelled orders.
558
559 C<&ordersearch> returns an array. C<$count> is the number of elements
560 in C<@results>. C<@results> is an array of references-to-hash with the
561 following keys:
562
563 =over 4
564
565 =item C<author>
566
567 =item C<seriestitle>
568
569 =item C<branchcode>
570
571 =item C<bookfundid>
572
573 =back
574
575 =cut
576 #'
577 sub ordersearch {
578         my ($search,$id,$biblio,$catview) = @_;
579         my $dbh   = C4::Context->dbh;
580         my @data  = split(' ',$search);
581         my @searchterms = ($id);
582         map { push(@searchterms,"$_%","% $_%") } @data;
583         push(@searchterms,$search,$search,$biblio);
584         my $sth=$dbh->prepare("Select biblio.*,biblioitems.*,aqorders.*,aqbasket.*,biblio.title from aqorders,biblioitems,biblio,aqbasket
585                 where aqorders.biblioitemnumber = biblioitems.biblioitemnumber and
586                 aqorders.basketno = aqbasket.basketno
587                 and aqbasket.booksellerid = ?
588                 and biblio.biblionumber=aqorders.biblionumber
589                 and ((datecancellationprinted is NULL)
590                 or (datecancellationprinted = '0000-00-00'))
591                 and (("
592                 .(join(" and ",map { "(biblio.title like ? or biblio.title like ?)" } @data))
593                 .") or biblioitems.isbn=? or (aqorders.ordernumber=? and aqorders.biblionumber=?)) "
594                 .(($catview ne 'yes')?" and (quantityreceived < quantity or quantityreceived is NULL)":"")
595                 ." group by aqorders.ordernumber");
596         $sth->execute(@searchterms);
597         my @results = ();
598         my $sth2=$dbh->prepare("Select * from biblio where biblionumber=?");
599         my $sth3=$dbh->prepare("Select * from aqorderbreakdown where ordernumber=?");
600         while (my $data=$sth->fetchrow_hashref){
601                 $sth2->execute($data->{'biblionumber'});
602                 my $data2=$sth2->fetchrow_hashref;
603                 $data->{'author'}=$data2->{'author'};
604                 $data->{'seriestitle'}=$data2->{'seriestitle'};
605                 $sth3->execute($data->{'ordernumber'});
606                 my $data3=$sth3->fetchrow_hashref;
607                 $data->{'branchcode'}=$data3->{'branchcode'};
608                 $data->{'bookfundid'}=$data3->{'bookfundid'};
609                 push(@results,$data);
610         }
611         $sth->finish;
612         $sth2->finish;
613         $sth3->finish;
614         return(scalar(@results),@results);
615 }
616
617
618 sub histsearch {
619         my ($title,$author,$name,$from_placed_on,$to_placed_on)=@_;
620         my $dbh= C4::Context->dbh;
621         my $query = "select biblio.title,aqorders.basketno,name,aqbasket.creationdate,aqorders.datereceived, aqorders.quantity, aqorders.ecost from aqorders,aqbasket,aqbooksellers,biblio";
622         
623         $query .= ",borrowers " if (C4::Context->preference("IndependantBranches")); 
624         $query .=" where aqorders.basketno=aqbasket.basketno and aqbasket.booksellerid=aqbooksellers.id and biblio.biblionumber=aqorders.biblionumber ";
625         $query .= " and aqbasket.authorisedby=borrowers.borrowernumber" if (C4::Context->preference("IndependantBranches"));
626         $query .= " and biblio.title like ".$dbh->quote("%".$title."%") if $title;
627         $query .= " and biblio.author like ".$dbh->quote("%".$author."%") if $author;
628         $query .= " and name like ".$dbh->quote("%".$name."%") if $name;
629         $query .= " and creationdate >" .$dbh->quote($from_placed_on) if $from_placed_on;
630         $query .= " and creationdate<".$dbh->quote($to_placed_on) if $to_placed_on;
631         if (C4::Context->preference("IndependantBranches")) {
632                 my $userenv = C4::Context->userenv;
633                 unless ($userenv->{flags} == 1){
634                         $query .= " and (borrowers.branchcode = '".$userenv->{branch}."' or borrowers.branchcode ='')";
635                 }
636         }
637 #       warn "C4:Acquisition : ".$query;
638         my $sth = $dbh->prepare($query);
639         $sth->execute;
640         my @order_loop;
641         while (my $line = $sth->fetchrow_hashref) {
642                 push @order_loop, $line;
643         }
644         return \@order_loop;
645 }
646
647 #
648 #
649 # MONEY
650 #
651 #
652 =item invoice
653
654   ($count, @results) = &invoice($booksellerinvoicenumber);
655
656 Looks up orders by invoice number.
657
658 Returns an array. C<$count> is the number of elements in C<@results>.
659 C<@results> is an array of references-to-hash; the keys of each
660 elements are fields from the aqorders, biblio, and biblioitems tables
661 of the Koha database.
662
663 =cut
664 #'
665 sub invoice {
666   my ($invoice)=@_;
667   my $dbh = C4::Context->dbh;
668   my @results = ();
669   my $sth=$dbh->prepare("Select * from aqorders,biblio,biblioitems where
670   booksellerinvoicenumber=?
671   and biblio.biblionumber=aqorders.biblionumber and biblioitems.biblioitemnumber=
672   aqorders.biblioitemnumber group by aqorders.ordernumber,aqorders.biblioitemnumber");
673   $sth->execute($invoice);
674   while (my $data=$sth->fetchrow_hashref){
675     push(@results,$data);
676   }
677   $sth->finish;
678   return(scalar(@results),@results);
679 }
680
681 =item bookfunds
682
683   ($count, @results) = &bookfunds();
684
685 Returns a list of all book funds.
686
687 C<$count> is the number of elements in C<@results>. C<@results> is an
688 array of references-to-hash, whose keys are fields from the aqbookfund
689 and aqbudget tables of the Koha database. Results are ordered
690 alphabetically by book fund name.
691
692 =cut
693 #'
694 sub bookfunds {
695   my ($branch)=@_;
696   my $dbh = C4::Context->dbh;
697   my $strsth;
698   
699   if ($branch eq '') {
700       $strsth="Select * from aqbookfund,aqbudget where aqbookfund.bookfundid
701       =aqbudget.bookfundid
702       group by aqbookfund.bookfundid order by bookfundname";
703   } else {
704       $strsth="Select * from aqbookfund,aqbudget where aqbookfund.bookfundid
705       =aqbudget.bookfundid and (aqbookfund.branchcode is null or aqbookfund.branchcode='' or aqbookfund.branchcode= ? )
706       group by aqbookfund.bookfundid order by bookfundname";
707   }
708   my $sth=$dbh->prepare($strsth);
709   if ($branch){
710       $sth->execute($branch);
711   } else {
712       $sth->execute;
713   }
714   my @results = ();
715   while (my $data=$sth->fetchrow_hashref){
716     push(@results,$data);
717   }
718   $sth->finish;
719   return(scalar(@results),@results);
720 }
721
722 =item bookfundbreakdown
723
724         returns the total comtd & spent for a given bookfund
725         used in acqui-home.pl
726 =cut
727 #'
728
729 sub bookfundbreakdown {
730   my ($id)=@_;
731   my $dbh = C4::Context->dbh;
732   my $sth=$dbh->prepare("Select quantity,datereceived,freight,unitprice,listprice,ecost,quantityreceived,subscription
733   from aqorders,aqorderbreakdown where bookfundid=? and
734   aqorders.ordernumber=aqorderbreakdown.ordernumber
735   and (datecancellationprinted is NULL or
736   datecancellationprinted='0000-00-00')");
737   $sth->execute($id);
738   my $comtd=0;
739   my $spent=0;
740   while (my $data=$sth->fetchrow_hashref){
741     if ($data->{'subscription'} == 1){
742       $spent+=$data->{'quantity'}*$data->{'unitprice'};
743     } else {
744       my $leftover=$data->{'quantity'}-$data->{'quantityreceived'};
745       $comtd+=($data->{'ecost'})*$leftover;
746       $spent+=($data->{'unitprice'})*$data->{'quantityreceived'};
747     }
748   }
749   $sth->finish;
750   return($spent,$comtd);
751 }
752
753
754
755 =item curconvert
756
757   $foreignprice = &curconvert($currency, $localprice);
758
759 Converts the price C<$localprice> to foreign currency C<$currency> by
760 dividing by the exchange rate, and returns the result.
761
762 If no exchange rate is found, C<&curconvert> assumes the rate is one
763 to one.
764
765 =cut
766 #'
767 sub curconvert {
768   my ($currency,$price)=@_;
769   my $dbh = C4::Context->dbh;
770   my $sth=$dbh->prepare("Select rate from currency where currency=?");
771   $sth->execute($currency);
772   my $cur=($sth->fetchrow_array())[0];
773   $sth->finish;
774   if ($cur==0){
775     $cur=1;
776   }
777   return($price / $cur);
778 }
779
780 =item getcurrencies
781
782   ($count, $currencies) = &getcurrencies();
783
784 Returns the list of all known currencies.
785
786 C<$count> is the number of elements in C<$currencies>. C<$currencies>
787 is a reference-to-array; its elements are references-to-hash, whose
788 keys are the fields from the currency table in the Koha database.
789
790 =cut
791 #'
792 sub getcurrencies {
793   my $dbh = C4::Context->dbh;
794   my $sth=$dbh->prepare("Select * from currency");
795   $sth->execute;
796   my @results = ();
797   while (my $data=$sth->fetchrow_hashref){
798     push(@results,$data);
799   }
800   $sth->finish;
801   return(scalar(@results),\@results);
802 }
803
804 =item updatecurrencies
805
806   &updatecurrencies($currency, $newrate);
807
808 Sets the exchange rate for C<$currency> to be C<$newrate>.
809
810 =cut
811 #'
812 sub updatecurrencies {
813   my ($currency,$rate)=@_;
814   my $dbh = C4::Context->dbh;
815   my $sth=$dbh->prepare("update currency set rate=? where currency=?");
816   $sth->execute($rate,$currency);
817   $sth->finish;
818 }
819
820 #
821 #
822 # OTHERS
823 #
824 #
825
826 =item bookseller
827
828   ($count, @results) = &bookseller($searchstring);
829
830 Looks up a book seller. C<$searchstring> may be either a book seller
831 ID, or a string to look for in the book seller's name.
832
833 C<$count> is the number of elements in C<@results>. C<@results> is an
834 array of references-to-hash, whose keys are the fields of of the
835 aqbooksellers table in the Koha database.
836
837 =cut
838 #'
839 sub bookseller {
840   my ($searchstring)=@_;
841   my $dbh = C4::Context->dbh;
842   my $sth=$dbh->prepare("Select * from aqbooksellers where name like ? or id = ?");
843   $sth->execute("$searchstring%",$searchstring);
844   my @results;
845   while (my $data=$sth->fetchrow_hashref){
846     push(@results,$data);
847   }
848   $sth->finish;
849   return(scalar(@results),@results);
850 }
851
852 =item breakdown
853
854   ($count, $results) = &breakdown($ordernumber);
855
856 Looks up an order by order ID, and returns its breakdown.
857
858 C<$count> is the number of elements in C<$results>. C<$results> is a
859 reference-to-array; its elements are references-to-hash, whose keys
860 are the fields of the aqorderbreakdown table in the Koha database.
861
862 =cut
863 #'
864 sub breakdown {
865   my ($id)=@_;
866   my $dbh = C4::Context->dbh;
867   my $sth=$dbh->prepare("Select * from aqorderbreakdown where ordernumber=?");
868   $sth->execute($id);
869   my @results = ();
870   while (my $data=$sth->fetchrow_hashref){
871     push(@results,$data);
872   }
873   $sth->finish;
874   return(scalar(@results),\@results);
875 }
876
877 =item branches
878
879   ($count, @results) = &branches();
880
881 Returns a list of all library branches.
882
883 C<$count> is the number of elements in C<@results>. C<@results> is an
884 array of references-to-hash, whose keys are the fields of the branches
885 table of the Koha database.
886
887 =cut
888 #'
889 sub branches {
890     my $dbh   = C4::Context->dbh;
891     my $sth   = $dbh->prepare("Select * from branches order by branchname");
892     my @results = ();
893
894     $sth->execute();
895     while (my $data = $sth->fetchrow_hashref) {
896         push(@results,$data);
897     } # while
898
899     $sth->finish;
900     return(scalar(@results), @results);
901 } # sub branches
902
903 =item updatesup
904
905   &updatesup($bookseller);
906
907 Updates the information for a given bookseller. C<$bookseller> is a
908 reference-to-hash whose keys are the fields of the aqbooksellers table
909 in the Koha database. It must contain entries for all of the fields.
910 The entry to modify is determined by C<$bookseller-E<gt>{id}>.
911
912 The easiest way to get all of the necessary fields is to look up a
913 book seller with C<&booksellers>, modify what's necessary, then call
914 C<&updatesup> with the result.
915
916 =cut
917 #'
918 sub updatesup {
919    my ($data)=@_;
920    my $dbh = C4::Context->dbh;
921    my $sth=$dbh->prepare("Update aqbooksellers set
922    name=?,address1=?,address2=?,address3=?,address4=?,postal=?,
923    phone=?,fax=?,url=?,contact=?,contpos=?,contphone=?,contfax=?,contaltphone=?,
924    contemail=?,contnotes=?,active=?,
925    listprice=?, invoiceprice=?,gstreg=?, listincgst=?,
926    invoiceincgst=?, specialty=?,discount=?,invoicedisc=?,
927    nocalc=?
928    where id=?");
929    $sth->execute($data->{'name'},$data->{'address1'},$data->{'address2'},
930    $data->{'address3'},$data->{'address4'},$data->{'postal'},$data->{'phone'},
931    $data->{'fax'},$data->{'url'},$data->{'contact'},$data->{'contpos'},
932    $data->{'contphone'},$data->{'contfax'},$data->{'contaltphone'},
933    $data->{'contemail'},
934    $data->{'contnote'},$data->{'active'},$data->{'listprice'},
935    $data->{'invoiceprice'},$data->{'gstreg'},$data->{'listincgst'},
936    $data->{'invoiceincgst'},$data->{'specialty'},$data->{'discount'},
937    $data->{'invoicedisc'},$data->{'nocalc'},$data->{'id'});
938    $sth->finish;
939 }
940
941 =item insertsup
942
943   $id = &insertsup($bookseller);
944
945 Creates a new bookseller. C<$bookseller> is a reference-to-hash whose
946 keys are the fields of the aqbooksellers table in the Koha database.
947 All fields must be present.
948
949 Returns the ID of the newly-created bookseller.
950
951 =cut
952 #'
953 sub insertsup {
954   my ($data)=@_;
955   my $dbh = C4::Context->dbh;
956   my $sth=$dbh->prepare("Select max(id) from aqbooksellers");
957   $sth->execute;
958   my $data2=$sth->fetchrow_hashref;
959   $sth->finish;
960   $data2->{'max(id)'}++;
961   $sth=$dbh->prepare("Insert into aqbooksellers (id) values (?)");
962   $sth->execute($data2->{'max(id)'});
963   $sth->finish;
964   $data->{'id'}=$data2->{'max(id)'};
965   updatesup($data);
966   return($data->{'id'});
967 }
968
969 END { }       # module clean-up code here (global destructor)
970
971 1;
972 __END__
973
974 =back
975
976 =head1 AUTHOR
977
978 Koha Developement team <info@koha.org>
979
980 =cut