Koha/C4/Bookfund.pm
Colin Campbell 8f3c40e384 Update some DBI interactions
remove unnecessary calls to finish
let DBI return an array instead of looping to create one
make some SQL oneliners more succinct

Signed-off-by: Galen Charlton <gmcharlt@gmail.com>
2009-09-15 20:35:24 -04:00

502 lines
13 KiB
Perl

package C4::Bookfund;
# Copyright 2000-2002 Katipo Communications
#
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
# Suite 330, Boston, MA 02111-1307 USA
use strict;
# use Smart::Comments;
use vars qw($VERSION @ISA @EXPORT);
# set the version for version checking
$VERSION = 3.00;
=head1 NAME
C4::Bookfund - Koha functions for dealing with bookfund, currency & money.
=head1 SYNOPSIS
use C4::Bookfund;
=head1 DESCRIPTION
the functions in this modules deal with bookfund, currency and money.
They allow to get and/or set some informations for a specific budget or currency.
=cut
@ISA = qw(Exporter);
@EXPORT = qw(
&GetBookFund &GetBookFunds &GetBookFundsId &GetBookFundBreakdown &GetCurrencies
&NewBookFund
&ModBookFund &ModCurrencies
&SearchBookFund
&Countbookfund
&ConvertCurrency
&DelBookFund
);
=head1 FUNCTIONS
=cut
#-------------------------------------------------------------#
=head2 GetBookFund
$dataaqbookfund = &GetBookFund($bookfundid);
this function get the bookfundid, bookfundname, the bookfundgroup, the branchcode
from aqbookfund table for bookfundid given on input arg.
return:
C<$dataaqbookfund> is a hashref full of bookfundid, bookfundname, bookfundgroup,
and branchcode.
=cut
sub GetBookFund {
my $bookfundid = shift;
my $branchcode = shift;
$branchcode=($branchcode?$branchcode:'');
my $dbh = C4::Context->dbh;
my $query = "
SELECT
bookfundid,
bookfundname,
bookfundgroup,
branchcode
FROM aqbookfund
WHERE bookfundid = ?
AND branchcode = ?";
my $sth=$dbh->prepare($query);
$sth->execute($bookfundid,$branchcode);
my $data=$sth->fetchrow_hashref;
return $data;
}
=head3 GetBookFundsId
$sth = &GetBookFundsId
Read on aqbookfund table and execute a simple SQL query.
return:
$sth->execute. Don't forget to fetch row from the database after using
this function by using, for example, $sth->fetchrow_hashref;
C<@results> is an array of id existing on the database.
=cut
sub GetBookFundsId {
my @bookfundids_loop;
my $dbh= C4::Context->dbh;
my $query = "
SELECT bookfundid,branchcode
FROM aqbookfund
";
my $sth = $dbh->prepare($query);
$sth->execute;
return $sth;
}
#-------------------------------------------------------------#
=head3 GetBookFunds
@results = &GetBookFunds;
Returns a list of all book funds.
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
alphabetically by book fund name.
=cut
sub GetBookFunds {
my ($branch) = @_;
my $dbh = C4::Context->dbh;
my $userenv = C4::Context->userenv;
my $strsth;
if ( $branch ne '' ) {
$strsth = "
SELECT *
FROM aqbookfund
LEFT JOIN aqbudget ON aqbookfund.bookfundid=aqbudget.bookfundid
WHERE startdate<now()
AND enddate>now()
AND (aqbookfund.branchcode='' OR aqbookfund.branchcode= ? )
GROUP BY aqbookfund.bookfundid ORDER BY bookfundname";
}
else {
$strsth = "
SELECT *
FROM aqbookfund
LEFT JOIN aqbudget ON aqbookfund.bookfundid=aqbudget.bookfundid
WHERE startdate<now()
AND enddate>now()
GROUP BY aqbookfund.bookfundid ORDER BY bookfundname
";
}
my $sth = $dbh->prepare($strsth);
if ( $branch ne '' ) {
$sth->execute($branch);
}
else {
$sth->execute;
}
my @results = ();
while ( my $data = $sth->fetchrow_hashref ) {
push( @results, $data );
}
return @results;
}
#-------------------------------------------------------------#
=head3 GetCurrencies
@currencies = &GetCurrencies;
Returns the list of all known currencies.
C<$currencies> is a array; its elements are references-to-hash, whose
keys are the fields from the currency table in the Koha database.
=cut
sub GetCurrencies {
my $dbh = C4::Context->dbh;
my $results = $dbh->selectall_arrayref(
'SELECT * FROM currency', { Slice => {} } );
return @{$results};
}
#-------------------------------------------------------------#
=head3 GetBookFundBreakdown
( $spent, $comtd ) = &GetBookFundBreakdown( $id, $start, $end );
returns the total comtd & spent for a given bookfund, and a given year
used in acqui-home.pl
=cut
sub GetBookFundBreakdown {
my ( $id, $start, $end ) = @_;
my $dbh = C4::Context->dbh;
# if no start/end dates given defaut to everything
if ( !$start ) {
$start = '0000-00-00';
$end = 'now()';
}
# do a query for spent totals.
my $query = "
SELECT quantity,datereceived,freight,unitprice,listprice,ecost,
quantityreceived,subscription
FROM aqorders
LEFT JOIN aqorderbreakdown ON aqorders.ordernumber=aqorderbreakdown.ordernumber
LEFT JOIN aqbookfund ON (aqorderbreakdown.bookfundid=aqbookfund.bookfundid and aqorderbreakdown.branchcode=aqbookfund.branchcode)
LEFT JOIN aqbudget ON (aqbudget.bookfundid=aqbookfund.bookfundid and aqbudget.branchcode=aqbookfund.branchcode)
WHERE aqorderbreakdown.bookfundid=?
AND (datecancellationprinted IS NULL OR datecancellationprinted='0000-00-00')
AND ((budgetdate >= ? and budgetdate < ?) OR (startdate>=? and enddate<=?))
";
my $sth = $dbh->prepare($query);
$sth->execute( $id, $start, $end, $start, $end );
my ($spent) = 0;
while ( my $data = $sth->fetchrow_hashref ) {
if ( $data->{'subscription'} == 1 ) {
$spent += $data->{'quantity'} * $data->{'unitprice'};
}
else {
$spent += ( $data->{'unitprice'} ) * ($data->{'quantityreceived'}?$data->{'quantityreceived'}:0);
}
}
# then do a seperate query for commited totals, (pervious single query was
# returning incorrect comitted results.
$query = "
SELECT quantity,datereceived,freight,unitprice,
listprice,ecost,quantityreceived AS qrev,
subscription,title,itemtype,aqorders.biblionumber,
aqorders.booksellerinvoicenumber,
quantity-quantityreceived AS tleft,
aqorders.ordernumber AS ordnum,entrydate,budgetdate
FROM aqorders
LEFT JOIN biblioitems ON biblioitems.biblioitemnumber=aqorders.biblioitemnumber
LEFT JOIN aqorderbreakdown ON aqorders.ordernumber=aqorderbreakdown.ordernumber
WHERE bookfundid=?
AND (budgetdate >= ? AND budgetdate < ?)
AND (datecancellationprinted IS NULL OR datecancellationprinted='0000-00-00')
";
$sth = $dbh->prepare($query);
# warn "$start $end";
$sth->execute( $id, $start, $end );
my $comtd=0;
while ( my $data = $sth->fetchrow_hashref ) {
my $left = $data->{'tleft'};
if ( !$left || $left eq '' ) {
$left = $data->{'quantity'};
}
if ( $left && $left > 0 ) {
my $subtotal = $left * $data->{'ecost'};
$data->{subtotal} = $subtotal;
$data->{'left'} = $left;
$comtd += $subtotal;
}
# use Data::Dumper; warn Dumper($data);
}
return ( $spent, $comtd );
}
=head3 NewBookFund
&NewBookFund(bookfundid, bookfundname, branchcode);
this function create a new bookfund into the database.
=cut
sub NewBookFund{
my ($bookfundid, $bookfundname, $branchcode) = @_;
$branchcode = undef unless $branchcode;
my $dbh = C4::Context->dbh;
my $query = "
INSERT
INTO aqbookfund
(bookfundid, bookfundname, branchcode)
VALUES
(?, ?, ?)
";
my $sth=$dbh->prepare($query);
$sth->execute($bookfundid,$bookfundname,"$branchcode");
}
#-------------------------------------------------------------#
=head3 ModBookFund
&ModBookFund($bookfundname,$bookfundid,$current_branch, $branchcode)
This function updates the bookfundname and the branchcode in the aqbookfund table.
=cut
# FIXME: use placeholders, ->prepare(), ->execute()
sub ModBookFund {
my ($bookfundname,$bookfundid,$current_branch, $branchcode) = @_;
my $dbh = C4::Context->dbh;
my $retval = $dbh->do("
UPDATE aqbookfund
SET bookfundname = '$bookfundname',
branchcode = '$branchcode'
WHERE bookfundid = '$bookfundid'
AND branchcode = '$current_branch'
");
### $retval
# budgets depending on a bookfund must have the same branchcode
# if the bookfund branchcode is set, and previous update is successfull, then update aqbudget.branchcode too.
if (defined $branchcode && $retval > 0) {
my $query = "UPDATE aqbudget
SET branchcode = ?
WHERE bookfundid = ? ";
my $sth=$dbh->prepare($query);
$sth->execute($branchcode, $bookfundid) ;
}
}
#-------------------------------------------------------------#
=head3 SearchBookFund
@results = SearchBookFund(
$bookfundid,$filter,$filter_bookfundid,
$filter_bookfundname,$filter_branchcode);
this function searchs among the bookfunds corresponding to our filtering rules.
=cut
sub SearchBookFund {
my $dbh = C4::Context->dbh;
my ($filter,
$filter_bookfundid,
$filter_bookfundname,
$filter_branchcode
) = @_;
my @bindings;
my $query = "
SELECT bookfundid,
bookfundname,
bookfundgroup,
branchcode
FROM aqbookfund
WHERE 1 ";
if ($filter) {
if ($filter_bookfundid) {
$query.= "AND bookfundid = ?";
push @bindings, $filter_bookfundid;
}
if ($filter_bookfundname) {
$query.= "AND bookfundname like ?";
push @bindings, '%'.$filter_bookfundname.'%';
}
if ($filter_branchcode) {
$query.= "AND branchcode = ?";
push @bindings, $filter_branchcode;
}
}
$query.= "ORDER BY bookfundid";
my $sth = $dbh->prepare($query);
$sth->execute(@bindings);
my @results;
while (my $row = $sth->fetchrow_hashref) {
push @results, $row;
}
return @results;
}
#-------------------------------------------------------------#
=head3 ModCurrencies
&ModCurrencies($currency, $newrate);
Sets the exchange rate for C<$currency> to be C<$newrate>.
=cut
sub ModCurrencies {
my ( $currency, $rate ) = @_;
my $dbh = C4::Context->dbh;
$dbh->do('UPDATE currency SET rate=? WHERE currency=?', {}, $rate, $currency );
return;
}
#-------------------------------------------------------------#
=head3 Countbookfund
$number = Countbookfund($bookfundid);
this function count the number of bookfund with id given on input arg.
return :
the result of the SQL query as a number.
=cut
sub Countbookfund {
my $bookfundid = shift;
my $branchcode = shift;
my $dbh = C4::Context->dbh;
my $query ="
SELECT COUNT(*)
FROM aqbookfund
WHERE bookfundid = ?
AND branchcode = ?
";
my $sth = $dbh->prepare($query);
$sth->execute($bookfundid,"$branchcode");
return $sth->fetchrow;
}
#-------------------------------------------------------------#
=head3 ConvertCurrency
$foreignprice = &ConvertCurrency($currency, $localprice);
Converts the price C<$localprice> to foreign currency C<$currency> by
dividing by the exchange rate, and returns the result.
If no exchange rate is found, C<&ConvertCurrency> assumes the rate is one
to one.
=cut
sub ConvertCurrency {
my ( $currency, $price ) = @_;
my $dbh = C4::Context->dbh;
my $query = "
SELECT rate
FROM currency
WHERE currency=?
";
my $sth = $dbh->prepare($query);
$sth->execute($currency);
my $cur = ( $sth->fetchrow_array() )[0];
unless($cur) {
$cur = 1;
}
return ( $price / $cur );
}
#-------------------------------------------------------------#
=head3 DelBookFund
&DelBookFund($bookfundid);
this function delete a bookfund which has $bokfundid as parameter on aqbookfund table and delete the approriate budget.
=cut
sub DelBookFund {
my $bookfundid = shift;
my $branchcode=shift;
my $dbh = C4::Context->dbh;
$dbh->do('DELETE FROM aqbookfund WHERE bookfundid=? AND branchcode=?', {}, $bookfundid,$branchcode);
$dbh->do('DELETE FROM aqbudget where bookfundid=? and branchcode=?', {}, $bookfundid,$branchcode);
return;
}
END { } # module clean-up code here (global destructor)
1;
__END__
=head1 AUTHOR
Koha Developement team <info@koha.org>
=cut