[followup](bug #3348) fixing acq module
[koha.git] / C4 / Bookfund.pm
1 package C4::Bookfund;
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
21 use strict;
22 # use Smart::Comments;
23
24 use vars qw($VERSION @ISA @EXPORT);
25
26 # set the version for version checking
27 $VERSION = 3.00;
28
29 =head1 NAME
30
31 C4::Bookfund - Koha functions for dealing with bookfund, currency & money.
32
33 =head1 SYNOPSIS
34
35 use C4::Bookfund;
36
37 =head1 DESCRIPTION
38
39 the functions in this modules deal with bookfund, currency and money.
40 They allow to get and/or set some informations for a specific budget or currency.
41
42 =cut
43
44 @ISA    = qw(Exporter);
45 @EXPORT = qw(
46     &GetBookFund &GetBookFunds &GetBookFundsId &GetBookFundBreakdown &GetCurrencies
47     &NewBookFund
48     &ModBookFund &ModCurrencies
49     &SearchBookFund
50     &Countbookfund 
51     &ConvertCurrency
52     &DelBookFund
53 );
54
55 =head1 FUNCTIONS
56
57 =cut
58
59 #-------------------------------------------------------------#
60
61 =head2 GetBookFund
62
63 $dataaqbookfund = &GetBookFund($bookfundid);
64
65 this function get the bookfundid, bookfundname, the bookfundgroup,  the branchcode
66 from aqbookfund table for bookfundid given on input arg.
67 return: 
68 C<$dataaqbookfund> is a hashref full of bookfundid, bookfundname, bookfundgroup,
69 and branchcode.
70
71 =cut
72
73 sub GetBookFund {
74     my $bookfundid = shift;
75     my $branchcode = shift;
76     $branchcode=($branchcode?$branchcode:'');
77     my $dbh = C4::Context->dbh;
78     my $query = "
79         SELECT
80             bookfundid,
81             bookfundname,
82             bookfundgroup,
83             branchcode
84         FROM aqbookfund
85         WHERE bookfundid = ?
86         AND branchcode = ?";
87     my $sth=$dbh->prepare($query);
88     $sth->execute($bookfundid,$branchcode);
89     my $data=$sth->fetchrow_hashref;
90     return $data;
91 }
92
93
94 =head3 GetBookFundsId
95
96 $sth = &GetBookFundsId
97 Read on aqbookfund table and execute a simple SQL query.
98
99 return:
100 $sth->execute. Don't forget to fetch row from the database after using
101 this function by using, for example, $sth->fetchrow_hashref;
102
103 C<@results> is an array of id existing on the database.
104
105 =cut
106
107 sub GetBookFundsId {
108     my @bookfundids_loop;
109     my $dbh= C4::Context->dbh;
110     my $query = "
111         SELECT bookfundid,branchcode
112         FROM aqbookfund
113     ";
114     my $sth = $dbh->prepare($query);
115     $sth->execute;
116     return $sth;
117 }
118
119 #-------------------------------------------------------------#
120
121 =head3 GetBookFunds
122
123 @results = &GetBookFunds;
124
125 Returns a list of all book funds.
126
127 C<@results> is an array of references-to-hash, whose keys are fields from the aqbookfund and aqbudget tables of the Koha database. Results are ordered
128 alphabetically by book fund name.
129
130 =cut
131
132 sub GetBookFunds {
133     my ($branch) = @_;
134     my $dbh      = C4::Context->dbh;
135     my $userenv  = C4::Context->userenv;
136     my $strsth;
137
138     if ( $branch ne '' ) {
139         $strsth = "
140         SELECT *
141         FROM   aqbookfund
142         LEFT JOIN aqbudget ON aqbookfund.bookfundid=aqbudget.bookfundid
143         WHERE  startdate<now()
144             AND enddate>now()
145             AND (aqbookfund.branchcode='' OR aqbookfund.branchcode= ? )
146       GROUP BY aqbookfund.bookfundid ORDER BY bookfundname";
147     }
148     else {
149         $strsth = "
150             SELECT *
151             FROM   aqbookfund
152             LEFT JOIN aqbudget ON aqbookfund.bookfundid=aqbudget.bookfundid
153             WHERE startdate<now()
154                 AND enddate>now()
155             GROUP BY aqbookfund.bookfundid ORDER BY bookfundname
156         ";
157     }
158     my $sth = $dbh->prepare($strsth);
159     if ( $branch ne '' ) {
160         $sth->execute($branch);
161     }
162     else {
163         $sth->execute;
164     }
165     my @results = ();
166     while ( my $data = $sth->fetchrow_hashref ) {
167         push( @results, $data );
168     }
169     $sth->finish;
170     return @results;
171 }
172
173 #-------------------------------------------------------------#
174
175 =head3 GetCurrencies
176
177 @currencies = &GetCurrencies;
178
179 Returns the list of all known currencies.
180
181 C<$currencies> is a array; its elements are references-to-hash, whose
182 keys are the fields from the currency table in the Koha database.
183
184 =cut
185
186 sub GetCurrencies {
187     my $dbh = C4::Context->dbh;
188     my $query = "
189         SELECT *
190         FROM   currency
191     ";
192     my $sth = $dbh->prepare($query);
193     $sth->execute;
194     my @results = ();
195     while ( my $data = $sth->fetchrow_hashref ) {
196         push( @results, $data );
197     }
198     $sth->finish;
199     return @results;
200 }
201
202 #-------------------------------------------------------------#
203
204 =head3 GetBookFundBreakdown
205
206 ( $spent, $comtd ) = &GetBookFundBreakdown( $id, $start, $end );
207
208 returns the total comtd & spent for a given bookfund, and a given year
209 used in acqui-home.pl
210
211 =cut
212
213 sub GetBookFundBreakdown {
214     my ( $id, $start, $end ) = @_;
215     my $dbh = C4::Context->dbh;
216
217     
218     # if no start/end dates given defaut to everything
219     if ( !$start ) {
220         $start = '0000-00-00';
221         $end   = 'now()';
222     }
223
224     # do a query for spent totals.
225     my $query = "
226     SELECT quantity,datereceived,freight,unitprice,listprice,ecost,
227         quantityreceived AS qrev,subscription,title,aqorders.biblionumber,
228         aqorders.booksellerinvoicenumber,quantity-quantityreceived as tleft,
229         aqorders.ordernumber as ordnum,entrydate,budgetdate,aqbasket.booksellerid,
230         aqbasket.basketno
231     FROM aqorders
232         LEFT JOIN aqorderbreakdown USING (ordernumber)
233         LEFT JOIN aqbasket USING (basketno)
234         LEFT JOIN aqbudget USING (bookfundid)
235     WHERE bookfundid=?
236         AND (datecancellationprinted IS NULL OR datecancellationprinted = '0000-00-00')
237         AND closedate BETWEEN startdate AND enddate 
238         AND creationdate > startdate
239     ORDER BY datereceived
240     ";
241     my $sth = $dbh->prepare($query);
242     $sth->execute( $id);
243
244     my ($spent, $comtd) = (0, 0);
245     while ( my $data = $sth->fetchrow_hashref ) {
246         
247         my $recv  = $data->{'qrev'};
248         my $left = $data->{'tleft'};
249         my $ecost = $data->{'ecost'};
250         
251         
252         if($data->{datereceived}){
253             if ( $recv > 0 ) {
254                 $spent += $recv * $data->{'unitprice'};
255             }
256         }
257         $left = $data->{quantity} if(not $recv);
258
259         $comtd += $left * $ecost;
260
261     }
262
263     $sth->finish;
264     return ( $spent, $comtd );
265 }
266
267 =head3 NewBookFund
268
269 &NewBookFund(bookfundid, bookfundname, branchcode);
270
271 this function create a new bookfund into the database.
272
273 =cut 
274
275 sub NewBookFund{
276     my ($bookfundid, $bookfundname, $branchcode) = @_;
277     $branchcode = undef unless $branchcode;
278     my $dbh = C4::Context->dbh;
279     my $query = "
280         INSERT
281         INTO aqbookfund
282             (bookfundid, bookfundname, branchcode)
283         VALUES
284             (?, ?, ?)
285     ";
286     my $sth=$dbh->prepare($query);
287     $sth->execute($bookfundid,$bookfundname,"$branchcode");
288 }
289
290 #-------------------------------------------------------------#
291
292 =head3 ModBookFund
293
294 &ModBookFund($bookfundname,$bookfundid,$current_branch, $branchcode)
295
296 This function updates the bookfundname and the branchcode in the aqbookfund table.
297
298 =cut
299
300 # FIXME: use placeholders,  ->prepare(), ->execute()
301
302 sub ModBookFund {
303     my ($bookfundname,$bookfundid,$current_branch, $branchcode) = @_;
304
305     my $dbh = C4::Context->dbh;
306
307     my $retval = $dbh->do("
308      UPDATE aqbookfund
309         SET    bookfundname = '$bookfundname', 
310                branchcode = '$branchcode'
311         WHERE  bookfundid = '$bookfundid'
312         AND branchcode = '$current_branch'
313     ");
314
315     ### $retval
316
317     # budgets depending on a bookfund must have the same branchcode
318
319     # if the bookfund branchcode is set, and previous update is successfull, then update aqbudget.branchcode too.
320     if (defined $branchcode && $retval > 0) {
321         my $query = "UPDATE  aqbudget  
322             SET     branchcode = ?
323             WHERE   bookfundid = ? ";
324
325         my $sth=$dbh->prepare($query);
326         $sth->execute($branchcode, $bookfundid) ;
327     }
328 }
329
330 #-------------------------------------------------------------#
331
332 =head3 SearchBookFund
333
334 @results = SearchBookFund(
335         $bookfundid,$filter,$filter_bookfundid,
336         $filter_bookfundname,$filter_branchcode);
337
338 this function searchs among the bookfunds corresponding to our filtering rules.
339
340 =cut
341
342 sub SearchBookFund {
343     my $dbh = C4::Context->dbh;
344     my ($filter,
345         $filter_bookfundid,
346         $filter_bookfundname,
347         $filter_branchcode
348        ) = @_;
349
350     my @bindings;
351
352     my $query = "
353         SELECT  bookfundid,
354                 bookfundname,
355                 bookfundgroup,
356                 branchcode
357         FROM aqbookfund
358         WHERE 1 ";
359
360     if ($filter) {
361         if ($filter_bookfundid) {
362             $query.= "AND bookfundid = ?";
363             push @bindings, $filter_bookfundid;
364         }
365         if ($filter_bookfundname) {
366             $query.= "AND bookfundname like ?";
367             push @bindings, '%'.$filter_bookfundname.'%';
368         }
369         if ($filter_branchcode) {
370             $query.= "AND branchcode = ?";
371             push @bindings, $filter_branchcode;
372         }
373     }
374     $query.= "ORDER BY bookfundid";
375
376     my $sth = $dbh->prepare($query);
377     $sth->execute(@bindings);
378     my @results;
379     while (my $row = $sth->fetchrow_hashref) {
380         push @results, $row;
381     }
382     return @results;
383 }
384
385 #-------------------------------------------------------------#
386
387 =head3 ModCurrencies
388
389 &ModCurrencies($currency, $newrate);
390
391 Sets the exchange rate for C<$currency> to be C<$newrate>.
392
393 =cut
394
395 sub ModCurrencies {
396     my ( $currency, $rate ) = @_;
397     my $dbh = C4::Context->dbh;
398     my $query = "
399         UPDATE currency
400         SET    rate=?
401         WHERE  currency=?
402     ";
403     my $sth = $dbh->prepare($query);
404     $sth->execute( $rate, $currency );
405 }
406
407 #-------------------------------------------------------------#
408
409 =head3 Countbookfund
410
411 $number = Countbookfund($bookfundid);
412
413 this function count the number of bookfund with id given on input arg.
414 return :
415 the result of the SQL query as a number.
416
417 =cut
418
419 sub Countbookfund {
420     my $bookfundid = shift;
421     my $branchcode = shift;
422     my $dbh = C4::Context->dbh;
423     my $query ="
424         SELECT COUNT(*)
425         FROM  aqbookfund
426         WHERE bookfundid = ?
427         AND   branchcode = ?
428     ";
429     my $sth = $dbh->prepare($query);
430     $sth->execute($bookfundid,"$branchcode");
431     return $sth->fetchrow;
432 }
433
434
435 #-------------------------------------------------------------#
436
437 =head3 ConvertCurrency
438
439 $foreignprice = &ConvertCurrency($currency, $localprice);
440
441 Converts the price C<$localprice> to foreign currency C<$currency> by
442 dividing by the exchange rate, and returns the result.
443
444 If no exchange rate is found, C<&ConvertCurrency> assumes the rate is one
445 to one.
446
447 =cut
448
449 sub ConvertCurrency {
450     my ( $currency, $price ) = @_;
451     my $dbh = C4::Context->dbh;
452     my $query = "
453         SELECT rate
454         FROM   currency
455         WHERE  currency=?
456     ";
457     my $sth = $dbh->prepare($query);
458     $sth->execute($currency);
459     my $cur = ( $sth->fetchrow_array() )[0];
460     unless($cur) {
461         $cur = 1;
462     }
463     return ( $price / $cur );
464 }
465
466 #-------------------------------------------------------------#
467
468 =head3 DelBookFund
469
470 &DelBookFund($bookfundid);
471 this function delete a bookfund which has $bokfundid as parameter on aqbookfund table and delete the approriate budget.
472
473 =cut
474
475 sub DelBookFund {
476     my $bookfundid = shift;
477     my $branchcode=shift;
478     my $dbh = C4::Context->dbh;
479     my $query = "
480         DELETE FROM aqbookfund
481         WHERE bookfundid=?
482         AND branchcode=?
483     ";
484     my $sth=$dbh->prepare($query);
485     $sth->execute($bookfundid,$branchcode);
486     $sth->finish;
487     $query = "
488         DELETE FROM aqbudget where bookfundid=? and branchcode=?
489     ";
490     $sth=$dbh->prepare($query);
491     $sth->execute($bookfundid,$branchcode);
492     $sth->finish;
493 }
494
495 END { }    # module clean-up code here (global destructor)
496
497 1;
498
499 __END__
500
501 =head1 AUTHOR
502
503 Koha Developement team <info@koha.org>
504
505 =cut