Koha/C4/Acquisitions.pm
arensb e4a482ac3d Fixed FIXMEs.
Removed reference to Perl. It should be obvious.
2002-10-10 04:32:06 +00:00

1944 lines
55 KiB
Perl

package C4::Acquisitions; #assumes C4/Acquisitions.pm
# 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
# ***
# NOTE: This module is deprecated in Koha 1.3.x, and will shortly be
# deleted.
# ***
use strict;
require Exporter;
use C4::Context;
#use C4::Biblio;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
# set the version for version checking
$VERSION = 0.01;
=head1 NAME
C4::Acquisitions - Koha module dealing with acquisitions and orders
=head1 SYNOPSIS
use C4::Acquisitions;
=head1 DESCRIPTION
B<NOTE:> This module is deprecated in Koha 1.3.x.
The functions in this module deal with acquisitions, managing book
orders, converting money to different currencies, and so forth.
=head1 FUNCTIONS
=over 2
=cut
@ISA = qw(Exporter);
@EXPORT = qw(&getorders &bookseller &breakdown &basket &newbasket &bookfunds
&ordersearch &newbiblio &newbiblioitem &newsubject &newsubtitle &neworder
&newordernum &modbiblio &modorder &getsingleorder &invoice &receiveorder
&bookfundbreakdown &curconvert &updatesup &insertsup &newitems &modbibitem
&getcurrencies &modsubtitle &modsubject &modaddauthor &moditem &countitems
&findall &needsmod &delitem &deletebiblioitem &delbiblio &delorder &branches
&getallorders &getrecorders &updatecurrencies &getorder &getcurrency &updaterecorder
&updatecost &checkitems &modnote &getitemtypes &getbiblio
&getbiblioitembybiblionumber
&getbiblioitem &getitemsbybiblioitem &isbnsearch
&websitesearch &addwebsite &updatewebsite &deletewebsite);
%EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
# your exported package globals go here,
# as well as any optionally exported functions
@EXPORT_OK = qw($Var1 %Hashit); # FIXME - Never used
# non-exported package globals go here
use vars qw(@more $stuff); # FIXME - Never used
# initalize package globals, first exported ones
# FIXME - Never used
my $Var1 = '';
my %Hashit = ();
# then the others (which are still accessible as $Some::Module::stuff)
# FIXME - Never used
my $stuff = '';
my @more = ();
# all file-scoped lexicals must be created before
# the functions below that use them.
# file-private lexicals go here
# FIXME - Never used
my $priv_var = '';
my %secret_hash = ();
# FIXME - Never used
# here's a file-private function as a closure,
# callable as &$priv_func; it cannot be prototyped.
my $priv_func = sub {
# stuff goes here.
};
# make all your functions, whether exported or not;
=item getorders
($count, $orders) = &getorders($booksellerid);
Finds pending orders from the bookseller with the given ID. Ignores
completed and cancelled orders.
C<$count> is the number of elements in C<@{$orders}>.
C<$orders> is a reference-to-array; each element is a
reference-to-hash with the following fields:
=over 4
=item C<count(*)>
Gives the number of orders in with this basket number.
=item C<authorizedby>
=item C<entrydate>
=item C<basketno>
These give the value of the corresponding field in the aqorders table
of the Koha database.
=back
Results are ordered from most to least recent.
=cut
#'
# FIXME - This exact function already exists in C4::Catalogue
sub getorders {
my ($supplierid)=@_;
my $dbh = C4::Context->dbh;
my $query = "Select count(*),authorisedby,entrydate,basketno from aqorders where
booksellerid='$supplierid' and (quantity > quantityreceived or
quantityreceived is NULL)
and (datecancellationprinted is NULL or datecancellationprinted = '0000-00-00')";
$query.=" group by basketno order by entrydate desc";
#print $query;
my $sth=$dbh->prepare($query);
$sth->execute;
my @results;
my $i=0;
while (my $data=$sth->fetchrow_hashref){
$results[$i]=$data;
$i++;
}
$sth->finish;
return ($i,\@results);
}
# Only used internally
# FIXME - This is the same as &C4::Biblio::itemcount, but not
# the same as &C4::Search::itemcount
sub itemcount{
my ($biblio)=@_;
my $dbh = C4::Context->dbh;
my $query="Select count(*) from items where biblionumber=$biblio";
# print $query;
my $sth=$dbh->prepare($query);
$sth->execute;
my $data=$sth->fetchrow_hashref;
$sth->finish;
return($data->{'count(*)'});
}
=item getorder
($order, $ordernumber) = &getorder($biblioitemnumber, $biblionumber);
Looks up the order with the given biblionumber and biblioitemnumber.
Returns a two-element array. C<$ordernumber> is the order number.
C<$order> is a reference-to-hash describing the order; its keys are
fields from the biblio, biblioitems, aqorders, and aqorderbreakdown
tables of the Koha database.
=cut
#'
# FIXME - There are functions &getorder and &getorders. Isn't this
# somewhat likely to cause confusion?
# FIXME - Almost the exact same function is already in C4::Catalogue
sub getorder{
my ($bi,$bib)=@_;
my $dbh = C4::Context->dbh;
my $query="Select ordernumber
from aqorders
where biblionumber=? and biblioitemnumber=?";
my $sth=$dbh->prepare($query);
$sth->execute($bib,$bi);
my $ordnum=$sth->fetchrow_hashref;
$sth->finish;
my $order=getsingleorder($ordnum->{'ordernumber'});
# print $query;
return ($order,$ordnum->{'ordernumber'});
}
=item getsingleorder
$order = &getsingleorder($ordernumber);
Looks up an order by order number.
Returns a reference-to-hash describing the order. The keys of
C<$order> are fields from the biblio, biblioitems, aqorders, and
aqorderbreakdown tables of the Koha database.
=cut
#'
# FIXME - This is practically the same function as
# &C4::Catalogue::getsingleorder and &C4::Biblio::getsingleorder.
sub getsingleorder {
my ($ordnum)=@_;
my $dbh = C4::Context->dbh;
my $query="Select * from biblio,biblioitems,aqorders,aqorderbreakdown
where aqorders.ordernumber=?
and biblio.biblionumber=aqorders.biblionumber and
biblioitems.biblioitemnumber=aqorders.biblioitemnumber and
aqorders.ordernumber=aqorderbreakdown.ordernumber";
my $sth=$dbh->prepare($query);
$sth->execute($ordnum);
my $data=$sth->fetchrow_hashref;
$sth->finish;
return($data);
}
=item invoice
($count, @results) = &invoice($booksellerinvoicenumber);
Looks up orders by invoice number.
Returns an array. C<$count> is the number of elements in C<@results>.
C<@results> is an array of references-to-hash; the keys of each
elements are fields from the aqorders, biblio, and biblioitems tables
of the Koha database.
=cut
#'
# FIXME - This exact function is already in C4::Catalogue
sub invoice {
my ($invoice)=@_;
my $dbh = C4::Context->dbh;
my $query="Select * from aqorders,biblio,biblioitems where
booksellerinvoicenumber='$invoice'
and biblio.biblionumber=aqorders.biblionumber and biblioitems.biblioitemnumber=
aqorders.biblioitemnumber group by aqorders.ordernumber,aqorders.biblioitemnumber";
my $i=0;
my @results;
my $sth=$dbh->prepare($query);
$sth->execute;
while (my $data=$sth->fetchrow_hashref){
$results[$i]=$data;
$i++;
}
$sth->finish;
return($i,@results);
}
=item getallorders
($count, @results) = &getallorders($booksellerid);
Looks up all of the pending orders from the supplier with the given
bookseller ID. Ignores cancelled orders.
C<$count> is the number of elements in C<@results>. C<@results> is an
array of references-to-hash. The keys of each element are fields from
the aqorders, biblio, and biblioitems tables of the Koha database.
C<@results> is sorted alphabetically by book title.
=cut
#'
# FIXME - Almost (but not quite) the same function appears in C4::Catalogue
# That one only lists incomplete orders.
sub getallorders {
#gets all orders from a certain supplier, orders them alphabetically
my ($supid)=@_;
my $dbh = C4::Context->dbh;
my $query="Select * from aqorders,biblio,biblioitems where booksellerid='$supid'
and (cancelledby is NULL or cancelledby = '')
and biblio.biblionumber=aqorders.biblionumber and biblioitems.biblioitemnumber=
aqorders.biblioitemnumber
group by aqorders.biblioitemnumber
order by
biblio.title";
my $i=0;
my @results;
my $sth=$dbh->prepare($query);
$sth->execute;
while (my $data=$sth->fetchrow_hashref){
$results[$i]=$data;
$i++;
}
$sth->finish;
return($i,@results);
}
# FIXME - There's a getrecorders in C4::Catalogue
# FIXME - Never used (neither is the other one, actually)
sub getrecorders {
#gets all orders from a certain supplier, orders them alphabetically
my ($supid)=@_;
my $dbh = C4::Context->dbh;
my $query="Select * from aqorders,biblio,biblioitems where booksellerid='$supid'
and (cancelledby is NULL or cancelledby = '')
and biblio.biblionumber=aqorders.biblionumber and biblioitems.biblioitemnumber=
aqorders.biblioitemnumber and
aqorders.quantityreceived>0
and aqorders.datereceived >=now()
group by aqorders.biblioitemnumber
order by
biblio.title";
my $i=0;
my @results;
my $sth=$dbh->prepare($query);
$sth->execute;
while (my $data=$sth->fetchrow_hashref){
$results[$i]=$data;
$i++;
}
$sth->finish;
return($i,@results);
}
=item ordersearch
($count, @results) = &ordersearch($search, $biblionumber, $complete);
Searches for orders.
C<$search> may take one of several forms: if it is an ISBN,
C<&ordersearch> returns orders with that ISBN. If C<$search> is an
order number, C<&ordersearch> returns orders with that order number
and biblionumber C<$biblionumber>. Otherwise, C<$search> is considered
to be a space-separated list of search terms; in this case, all of the
terms must appear in the title (matching the beginning of title
words).
If C<$complete> is C<yes>, the results will include only completed
orders. In any case, C<&ordersearch> ignores cancelled orders.
C<&ordersearch> returns an array. C<$count> is the number of elements
in C<@results>. C<@results> is an array of references-to-hash with the
following keys:
=over 4
=item C<author>
=item C<seriestitle>
=item C<branchcode>
=item C<bookfundid>
=back
=cut
#'
# FIXME - The same function (modulo whitespace) appears in C4::Catalogue
sub ordersearch {
my ($search,$biblio,$catview)=@_;
my $dbh = C4::Context->dbh;
my $query="Select *,biblio.title from aqorders,biblioitems,biblio
where aqorders.biblioitemnumber = biblioitems.biblioitemnumber
and biblio.biblionumber=aqorders.biblionumber
and ((datecancellationprinted is NULL)
or (datecancellationprinted = '0000-00-00'))
and ((";
my @data=split(' ',$search);
my $count=@data;
for (my $i=0;$i<$count;$i++){
$query.= "(biblio.title like '$data[$i]%' or biblio.title like '% $data[$i]%') and ";
}
$query=~ s/ and $//;
$query.=" ) or biblioitems.isbn='$search'
or (aqorders.ordernumber='$search' and aqorders.biblionumber='$biblio')) ";
if ($catview ne 'yes'){
$query.=" and (quantityreceived < quantity or quantityreceived is NULL)";
}
$query.=" group by aqorders.ordernumber";
my $sth=$dbh->prepare($query);
# print $query;
$sth->execute;
my $i=0;
my @results;
while (my $data=$sth->fetchrow_hashref){
my $sth2=$dbh->prepare("Select * from biblio where
biblionumber='$data->{'biblionumber'}'");
$sth2->execute;
my $data2=$sth2->fetchrow_hashref;
$sth2->finish;
$data->{'author'}=$data2->{'author'};
$data->{'seriestitle'}=$data2->{'seriestitle'};
$sth2=$dbh->prepare("Select * from aqorderbreakdown where
ordernumber=$data->{'ordernumber'}");
$sth2->execute;
$data2=$sth2->fetchrow_hashref;
$sth2->finish;
$data->{'branchcode'}=$data2->{'branchcode'};
$data->{'bookfundid'}=$data2->{'bookfundid'};
$results[$i]=$data;
$i++;
}
$sth->finish;
return($i,@results);
}
=item bookseller
($count, @results) = &bookseller($searchstring);
Looks up a book seller. C<$searchstring> may be either a book seller
ID, or a string to look for in the book seller's name.
C<$count> is the number of elements in C<@results>. C<@results> is an
array of references-to-hash, whose keys are the fields of of the
aqbooksellers table in the Koha database.
=cut
#'
# FIXME - This function appears in C4::Catalogue
sub bookseller {
my ($searchstring)=@_;
my $dbh = C4::Context->dbh;
my $query="Select * from aqbooksellers where name like '%$searchstring%' or
id = '$searchstring'";
my $sth=$dbh->prepare($query);
$sth->execute;
my @results;
my $i=0;
while (my $data=$sth->fetchrow_hashref){
$results[$i]=$data;
$i++;
}
$sth->finish;
return($i,@results);
}
=item breakdown
($count, $results) = &breakdown($ordernumber);
Looks up an order by order ID, and returns its breakdown.
C<$count> is the number of elements in C<$results>. C<$results> is a
reference-to-array; its elements are references-to-hash, whose keys
are the fields of the aqorderbreakdown table in the Koha database.
=cut
#'
# FIXME - This function appears in C4::Catalogue.
sub breakdown {
my ($id)=@_;
my $dbh = C4::Context->dbh;
my $query="Select * from aqorderbreakdown where ordernumber='$id'";
my $sth=$dbh->prepare($query);
$sth->execute;
my @results;
my $i=0;
while (my $data=$sth->fetchrow_hashref){
$results[$i]=$data;
$i++;
}
$sth->finish;
return($i,\@results);
}
=item basket
($count, @orders) = &basket($basketnumber, $booksellerID);
Looks up the pending (non-cancelled) orders with the given basket
number. If C<$booksellerID> is non-empty, only orders from that seller
are returned.
C<&basket> returns a two-element array. C<@orders> is an array of
references-to-hash, whose keys are the fields from the aqorders,
biblio, and biblioitems tables in the Koha database. C<$count> is the
number of elements in C<@orders>.
=cut
#'
# FIXME - Almost the same function (with less error-checking) appears in
# C4::Catalogue.pm
sub basket {
my ($basketno,$supplier)=@_;
my $dbh = C4::Context->dbh;
my $query="Select *,biblio.title from aqorders,biblio,biblioitems
where basketno='$basketno'
and biblio.biblionumber=aqorders.biblionumber and biblioitems.biblioitemnumber
=aqorders.biblioitemnumber
and (datecancellationprinted is NULL or datecancellationprinted =
'0000-00-00')";
if (defined $supplier && $supplier ne ''){
$query.=" and aqorders.booksellerid='$supplier'";
}
$query.=" group by aqorders.ordernumber";
my $sth=$dbh->prepare($query);
$sth->execute;
my @results;
# print $query;
my $i=0;
while (my $data=$sth->fetchrow_hashref){
$results[$i]=$data;
$i++;
}
$sth->finish;
return($i,@results);
}
=item newbasket
$basket = &newbasket();
Finds the next unused basket number in the aqorders table of the Koha
database, and returns it.
=cut
#'
# FIXME - There's a race condition here:
# A calls &newbasket
# B calls &newbasket (gets the same number as A)
# A updates the basket
# B updates the basket, and clobbers A's result.
# A better approach might be to create a dummy order (with, say,
# requisitionedby == "Dummy-$$" or notes == "dummy <time> <pid>"), and
# see which basket number it gets. Then have a cron job periodically
# remove out-of-date dummy orders.
# FIXME - This function appears in C4::Catalogue.pm
sub newbasket {
my $dbh = C4::Context->dbh;
my $query="Select max(basketno) from aqorders";
my $sth=$dbh->prepare($query);
$sth->execute;
my $data=$sth->fetchrow_arrayref;
my $basket=$$data[0];
$basket++;
$sth->finish;
return($basket);
}
=item bookfunds
($count, @results) = &bookfunds();
Returns a list of all book funds started on Sep 1, 2001.
C<$count> is the number of elements in C<@results>. 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
#'
# FIXME - An identical function (without the hardcoded date) appears in
# C4::Catalogue
sub bookfunds {
my $dbh = C4::Context->dbh;
my $query="Select * from aqbookfund,aqbudget where aqbookfund.bookfundid
=aqbudget.bookfundid
and aqbudget.startdate='2001-07-01'
group by aqbookfund.bookfundid order by bookfundname";
my $sth=$dbh->prepare($query);
$sth->execute;
my @results;
my $i=0;
while (my $data=$sth->fetchrow_hashref){
$results[$i]=$data;
$i++;
}
$sth->finish;
return($i,@results);
}
=item branches
($count, @results) = &branches();
Returns a list of all library branches.
C<$count> is the number of elements in C<@results>. C<@results> is an
array of references-to-hash, whose keys are the fields of the branches
table of the Koha database.
=cut
#'
# FIXME - This function (modulo whitespace) appears in C4::Catalogue
sub branches {
my $dbh = C4::Context->dbh;
my $query="Select * from branches";
my $sth=$dbh->prepare($query);
my $i=0;
my @results;
$sth->execute;
while (my $data = $sth->fetchrow_hashref){
$results[$i]=$data;
$i++;
} # while
$sth->finish;
return($i, @results);
} # sub branches
# FIXME - POD. But I can't figure out what this function is doing
# FIXME - An almost identical function appears in C4::Catalogue
sub bookfundbreakdown {
my ($id)=@_;
my $dbh = C4::Context->dbh;
my $query="Select quantity,datereceived,freight,unitprice,listprice,ecost,quantityreceived,subscription
from aqorders,aqorderbreakdown where bookfundid='$id' and
aqorders.ordernumber=aqorderbreakdown.ordernumber and ((budgetdate >=
'2001-07-01' and budgetdate <'2002-07-01') or
(datereceived >= '2001-07-01' and datereceived < '2002-07-01'))
and (datecancellationprinted is NULL or
datecancellationprinted='0000-00-00')";
my $sth=$dbh->prepare($query);
$sth->execute;
my $comtd=0;
my $spent=0;
while (my $data=$sth->fetchrow_hashref){
if ($data->{'subscription'} == 1){
$spent+=$data->{'quantity'}*$data->{'unitprice'};
} else {
my $leftover=$data->{'quantity'}-$data->{'quantityreceived'};
$comtd+=($data->{'ecost'})*$leftover;
$spent+=($data->{'unitprice'})*$data->{'quantityreceived'};
}
}
$sth->finish;
return($spent,$comtd);
}
# FIXME - This is in effect identical to &C4::Biblio::newbiblio.
# Pick one and stick with it.
# XXX - POD
sub newbiblio {
my ($biblio) = @_;
my $dbh = C4::Context->dbh;
my $query = "Select max(biblionumber) from biblio";
my $sth = $dbh->prepare($query);
$sth->execute;
my $data = $sth->fetchrow_arrayref;
my $bibnum = $$data[0] + 1;
my $series = 0;
$biblio->{'title'} = $dbh->quote($biblio->{'title'});
$biblio->{'author'} = $dbh->quote($biblio->{'author'});
$biblio->{'copyright'} = $dbh->quote($biblio->{'copyright'});
$biblio->{'seriestitle'} = $dbh->quote($biblio->{'seriestitle'});
$biblio->{'notes'} = $dbh->quote($biblio->{'notes'});
$biblio->{'abstract'} = $dbh->quote($biblio->{'abstract'});
if ($biblio->{'seriestitle'}) { $series = 1 };
$sth->finish;
$dbh->do(<<EOT);
INSERT INTO biblio
SET biblionumber = $bibnum,
title = $biblio->{'title'},
author = $biblio->{'author'},
copyrightdate = $biblio->{'copyright'},
serial = $series,
seriestitle = $biblio->{'seriestitle'},
notes = $biblio->{'notes'},
abstract = $biblio->{'abstract'}
EOT
return($bibnum);
}
# FIXME - This is in effect the same as &C4::Biblio::modbiblio.
# Pick one and stick with it.
# XXX - POD
sub modbiblio {
my ($biblio) = @_;
my $dbh = C4::Context->dbh;
my $query;
my $sth;
$biblio->{'title'} = $dbh->quote($biblio->{'title'});
$biblio->{'author'} = $dbh->quote($biblio->{'author'});
$biblio->{'abstract'} = $dbh->quote($biblio->{'abstract'});
$biblio->{'copyrightdate'} = $dbh->quote($biblio->{'copyrightdate'});
$biblio->{'seriestitle'} = $dbh->quote($biblio->{'serirestitle'});
$biblio->{'serial'} = $dbh->quote($biblio->{'serial'});
$biblio->{'unititle'} = $dbh->quote($biblio->{'unititle'});
$biblio->{'notes'} = $dbh->quote($biblio->{'notes'});
$query = "Update biblio set
title = $biblio->{'title'},
author = $biblio->{'author'},
abstract = $biblio->{'abstract'},
copyrightdate = $biblio->{'copyrightdate'},
seriestitle = $biblio->{'seriestitle'},
serial = $biblio->{'serial'},
unititle = $biblio->{'unititle'},
notes = $biblio->{'notes'}
where biblionumber = $biblio->{'biblionumber'}";
$sth = $dbh->prepare($query);
$sth->execute;
$sth->finish;
return($biblio->{'biblionumber'});
} # sub modbiblio
# FIXME - This is in effect identical to &C4::Biblio::modsubtitle.
# Pick one and stick with it.
# XXX - POD
sub modsubtitle {
my ($bibnum, $subtitle) = @_;
my $dbh = C4::Context->dbh;
my $query = "update bibliosubtitle set
subtitle = '$subtitle'
where biblionumber = $bibnum";
my $sth = $dbh->prepare($query);
$sth->execute;
$sth->finish;
} # sub modsubtitle
# XXX - POD
# FIXME - This is functionally identical to &C4::Biblio::modaddauthor
# Pick one and stick with it.
sub modaddauthor {
my ($bibnum, $author) = @_;
my $dbh = C4::Context->dbh;
my $query = "Delete from additionalauthors where biblionumber = $bibnum";
my $sth = $dbh->prepare($query);
$sth->execute;
$sth->finish;
if ($author ne '') {
$query = "Insert into additionalauthors set
author = '$author',
biblionumber = '$bibnum'";
$sth = $dbh->prepare($query);
$sth->execute;
$sth->finish;
} # if
} # sub modaddauthor
# FIXME - This is in effect identical to &C4::Biblio::modsubject.
# Pick one and stick with it.
# XXX - POD
sub modsubject {
my ($bibnum, $force, @subject) = @_;
my $dbh = C4::Context->dbh;
my $count = @subject;
my $error;
for (my $i = 0; $i < $count; $i++) {
$subject[$i] =~ s/^ //g;
$subject[$i] =~ s/ $//g;
my $query = "select * from catalogueentry
where entrytype = 's'
and catalogueentry = '$subject[$i]'";
my $sth = $dbh->prepare($query);
$sth->execute;
if (my $data = $sth->fetchrow_hashref) {
} else {
if ($force eq $subject[$i]) {
# subject not in aut, chosen to force anway
# so insert into cataloguentry so its in auth file
$query = "Insert into catalogueentry
(entrytype,catalogueentry)
values ('s','$subject[$i]')";
my $sth2 = $dbh->prepare($query);
$sth2->execute;
$sth2->finish;
} else {
$error = "$subject[$i]\n does not exist in the subject authority file";
$query = "Select * from catalogueentry
where entrytype = 's'
and (catalogueentry like '$subject[$i] %'
or catalogueentry like '% $subject[$i] %'
or catalogueentry like '% $subject[$i]')";
my $sth2 = $dbh->prepare($query);
$sth2->execute;
while (my $data = $sth2->fetchrow_hashref) {
$error = $error."<br>$data->{'catalogueentry'}";
} # while
$sth2->finish;
} # else
} # else
$sth->finish;
} # else
if ($error eq '') {
my $query = "Delete from bibliosubject where biblionumber = $bibnum";
my $sth = $dbh->prepare($query);
$sth->execute;
$sth->finish;
for (my $i = 0; $i < $count; $i++) {
$sth = $dbh->prepare("Insert into bibliosubject
values ('$subject[$i]', $bibnum)");
$sth->execute;
$sth->finish;
} # for
} # if
return($error);
} # sub modsubject
# FIXME - This is very similar to &C4::Biblio::modbibitem.
# Pick one and stick with it.
# XXX - POD
sub modbibitem {
my ($biblioitem) = @_;
my $dbh = C4::Context->dbh;
# FIXME -
# foreach my $field (qw( ... ))
# {
# $biblioitem->{$field} = $dbh->quote($biblioitem->{$field});
# }
$biblioitem->{'itemtype'} = $dbh->quote($biblioitem->{'itemtype'});
$biblioitem->{'url'} = $dbh->quote($biblioitem->{'url'});
$biblioitem->{'isbn'} = $dbh->quote($biblioitem->{'isbn'});
$biblioitem->{'publishercode'} = $dbh->quote($biblioitem->{'publishercode'});
$biblioitem->{'publicationyear'} = $dbh->quote($biblioitem->{'publicationyear'});
$biblioitem->{'classification'} = $dbh->quote($biblioitem->{'classification'});
$biblioitem->{'dewey'} = $dbh->quote($biblioitem->{'dewey'});
$biblioitem->{'subclass'} = $dbh->quote($biblioitem->{'subclass'});
$biblioitem->{'illus'} = $dbh->quote($biblioitem->{'illus'});
$biblioitem->{'pages'} = $dbh->quote($biblioitem->{'pages'});
$biblioitem->{'volumeddesc'} = $dbh->quote($biblioitem->{'volumeddesc'});
$biblioitem->{'notes'} = $dbh->quote($biblioitem->{'notes'});
$biblioitem->{'size'} = $dbh->quote($biblioitem->{'size'});
$biblioitem->{'place'} = $dbh->quote($biblioitem->{'place'});
$dbh->do(<<EOT);
UPDATE biblioitems
SET itemtype = $biblioitem->{'itemtype'},
url = $biblioitem->{'url'},
isbn = $biblioitem->{'isbn'},
publishercode = $biblioitem->{'publishercode'},
publicationyear = $biblioitem->{'publicationyear'},
classification = $biblioitem->{'classification'},
dewey = $biblioitem->{'dewey'},
subclass = $biblioitem->{'subclass'},
illus = $biblioitem->{'illus'},
pages = $biblioitem->{'pages'},
volumeddesc = $biblioitem->{'volumeddesc'},
notes = $biblioitem->{'notes'},
size = $biblioitem->{'size'},
place = $biblioitem->{'place'}
WHERE biblioitemnumber = $biblioitem->{'biblioitemnumber'}
EOT
} # sub modbibitem
# FIXME - This is in effect identical to &C4::Biblio::modnote.
# Pick one and stick with it.
# XXX - POD
sub modnote {
my ($bibitemnum,$note)=@_;
my $dbh = C4::Context->dbh;
$dbh->do(<<EOT);
UPDATE biblioitems
SET notes = '$note'
WHERE biblioitemnumber = '$bibitemnum'
EOT
}
# XXX - POD
# FIXME - &C4::Biblio::newbiblioitem is quite similar to this
sub newbiblioitem {
my ($biblioitem) = @_;
my $dbh = C4::Context->dbh;
my $query = "Select max(biblioitemnumber) from biblioitems";
my $sth = $dbh->prepare($query);
my $data;
my $bibitemnum;
$biblioitem->{'volume'} = $dbh->quote($biblioitem->{'volume'});
$biblioitem->{'number'} = $dbh->quote($biblioitem->{'number'});
$biblioitem->{'classification'} = $dbh->quote($biblioitem->{'classification'});
$biblioitem->{'itemtype'} = $dbh->quote($biblioitem->{'itemtype'});
$biblioitem->{'url'} = $dbh->quote($biblioitem->{'url'});
$biblioitem->{'isbn'} = $dbh->quote($biblioitem->{'isbn'});
$biblioitem->{'issn'} = $dbh->quote($biblioitem->{'issn'});
$biblioitem->{'dewey'} = $dbh->quote($biblioitem->{'dewey'});
$biblioitem->{'subclass'} = $dbh->quote($biblioitem->{'subclass'});
$biblioitem->{'publicationyear'} = $dbh->quote($biblioitem->{'publicationyear'});
$biblioitem->{'publishercode'} = $dbh->quote($biblioitem->{'publishercode'});
$biblioitem->{'volumedate'} = $dbh->quote($biblioitem->{'volumedate'});
$biblioitem->{'volumeddesc'} = $dbh->quote($biblioitem->{'volumeddesc'}); $biblioitem->{'illus'} = $dbh->quote($biblioitem->{'illus'});
$biblioitem->{'illus'} = $dbh->quote($biblioitem->{'illus'});
$biblioitem->{'pages'} = $dbh->quote($biblioitem->{'pages'});
$biblioitem->{'notes'} = $dbh->quote($biblioitem->{'notes'});
$biblioitem->{'size'} = $dbh->quote($biblioitem->{'size'});
$biblioitem->{'place'} = $dbh->quote($biblioitem->{'place'});
$biblioitem->{'lccn'} = $dbh->quote($biblioitem->{'lccn'});
$biblioitem->{'marc'} = $dbh->quote($biblioitem->{'marc'});
$sth->execute;
$data = $sth->fetchrow_arrayref;
$bibitemnum = $$data[0] + 1;
$sth->finish;
$query = "insert into biblioitems set
biblioitemnumber = $bibitemnum,
biblionumber = $biblioitem->{'biblionumber'},
volume = $biblioitem->{'volume'},
number = $biblioitem->{'number'},
classification = $biblioitem->{'classification'},
itemtype = $biblioitem->{'itemtype'},
url = $biblioitem->{'url'},
isbn = $biblioitem->{'isbn'},
issn = $biblioitem->{'issn'},
dewey = $biblioitem->{'dewey'},
subclass = $biblioitem->{'subclass'},
publicationyear = $biblioitem->{'publicationyear'},
publishercode = $biblioitem->{'publishercode'},
volumedate = $biblioitem->{'volumedate'},
volumeddesc = $biblioitem->{'volumeddesc'},
illus = $biblioitem->{'illus'},
pages = $biblioitem->{'pages'},
notes = $biblioitem->{'notes'},
size = $biblioitem->{'size'},
lccn = $biblioitem->{'lccn'},
marc = $biblioitem->{'marc'},
place = $biblioitem->{'place'}";
$sth = $dbh->prepare($query);
$sth->execute;
$sth->finish;
return($bibitemnum);
}
# FIXME - This is in effect identical to &C4::Biblio::newsubject.
# Pick one and stick with it.
# XXX - POD
sub newsubject {
my ($bibnum)=@_;
my $dbh = C4::Context->dbh;
my $query="insert into bibliosubject (biblionumber) values
($bibnum)";
my $sth=$dbh->prepare($query);
# print $query;
$sth->execute;
$sth->finish;
}
# XXX - POD
# FIXME - This is in effect the same as &C4::Biblio::newsubtitle
# Pick one and stick with it.
sub newsubtitle {
my ($bibnum, $subtitle) = @_;
my $dbh = C4::Context->dbh;
$subtitle = $dbh->quote($subtitle);
my $query = "insert into bibliosubtitle set
biblionumber = $bibnum,
subtitle = $subtitle";
my $sth = $dbh->prepare($query);
$sth->execute;
$sth->finish;
}
=item neworder
&neworder($biblionumber, $title, $ordnum, $basket, $quantity, $listprice,
$booksellerid, $who, $notes, $bookfund, $biblioitemnumber, $rrp,
$ecost, $gst, $budget, $unitprice, $subscription,
$booksellerinvoicenumber);
Adds a new order to the database. Any argument that isn't described
below is the new value of the field with the same name in the aqorders
table of the Koha database.
C<$ordnum> is a "minimum order number." After adding the new entry to
the aqorders table, C<&neworder> finds the first entry in aqorders
with order number greater than or equal to C<$ordnum>, and adds an
entry to the aqorderbreakdown table, with the order number just found,
and the book fund ID of the newly-added order.
C<$budget> is effectively ignored.
C<$subscription> may be either "yes", or anything else for "no".
=cut
#'
# FIXME - This function appears in C4::Catalogue
sub neworder {
my ($bibnum,$title,$ordnum,$basket,$quantity,$listprice,$supplier,$who,$notes,$bookfund,$bibitemnum,$rrp,$ecost,$gst,$budget,$cost,$sub,$invoice)=@_;
if ($budget eq 'now'){
$budget="now()";
} else {
$budget="'2001-07-01'";
}
if ($sub eq 'yes'){
$sub=1;
} else {
$sub=0;
}
my $dbh = C4::Context->dbh;
my $query="insert into aqorders (biblionumber,title,basketno,
quantity,listprice,booksellerid,entrydate,requisitionedby,authorisedby,notes,
biblioitemnumber,rrp,ecost,gst,unitprice,subscription,booksellerinvoicenumber)
values
($bibnum,'$title',$basket,$quantity,$listprice,'$supplier',now(),
'$who','$who','$notes',$bibitemnum,'$rrp','$ecost','$gst','$cost',
'$sub','$invoice')";
my $sth=$dbh->prepare($query);
# print $query;
$sth->execute;
$sth->finish;
$query="select * from aqorders where
biblionumber=$bibnum and basketno=$basket and ordernumber >=$ordnum";
$sth=$dbh->prepare($query);
$sth->execute;
my $data=$sth->fetchrow_hashref;
$sth->finish;
$ordnum=$data->{'ordernumber'};
$query="insert into aqorderbreakdown (ordernumber,bookfundid) values
($ordnum,'$bookfund')";
$sth=$dbh->prepare($query);
# print $query;
$sth->execute;
$sth->finish;
}
=item delorder
&delorder($biblionumber, $ordernumber);
Cancel the order with the given order and biblio numbers. It does not
delete any entries in the aqorders table, it merely marks them as
cancelled.
If there are no items remaining with the given biblionumber,
C<&delorder> also deletes them from the marc_subfield_table and
marc_biblio tables of the Koha database.
=cut
#'
# FIXME - This function appears in C4::Catalogue
sub delorder {
my ($bibnum,$ordnum)=@_;
my $dbh = C4::Context->dbh;
my $query="update aqorders set datecancellationprinted=now()
where biblionumber='$bibnum' and
ordernumber='$ordnum'";
my $sth=$dbh->prepare($query);
#print $query;
$sth->execute;
$sth->finish;
my $count=itemcount($bibnum);
if ($count == 0){
delbiblio($bibnum);
}
}
=item modorder
&modorder($title, $ordernumber, $quantity, $listprice,
$biblionumber, $basketno, $supplier, $who, $notes,
$bookfundid, $bibitemnum, $rrp, $ecost, $gst, $budget,
$unitprice, $booksellerinvoicenumber);
Modifies an existing order. Updates the order with order number
C<$ordernumber> and biblionumber C<$biblionumber>. All other arguments
update the fields with the same name in the aqorders table of the Koha
database.
Entries with order number C<$ordernumber> in the aqorderbreakdown
table are also updated to the new book fund ID.
=cut
#'
# FIXME - This function appears in C4::Catalogue
sub modorder {
my ($title,$ordnum,$quantity,$listprice,$bibnum,$basketno,$supplier,$who,$notes,$bookfund,$bibitemnum,$rrp,$ecost,$gst,$budget,$cost,$invoice)=@_;
my $dbh = C4::Context->dbh;
my $query="update aqorders set title='$title',
quantity='$quantity',listprice='$listprice',basketno='$basketno',
rrp='$rrp',ecost='$ecost',unitprice='$cost',
booksellerinvoicenumber='$invoice'
where
ordernumber=$ordnum and biblionumber=$bibnum";
my $sth=$dbh->prepare($query);
# print $query;
$sth->execute;
$sth->finish;
$query="update aqorderbreakdown set bookfundid=$bookfund where
ordernumber=$ordnum";
$sth=$dbh->prepare($query);
# print $query;
$sth->execute;
$sth->finish;
}
=item newordernum
$order = &newordernum();
Finds the next unused order number in the aqorders table of the Koha
database, and returns it.
=cut
#'
# FIXME - Race condition
# FIXME - This function appears in C4::Catalogue
sub newordernum {
my $dbh = C4::Context->dbh;
my $query="Select max(ordernumber) from aqorders";
my $sth=$dbh->prepare($query);
$sth->execute;
my $data=$sth->fetchrow_arrayref;
my $ordnum=$$data[0];
$ordnum++;
$sth->finish;
return($ordnum);
}
=item receiveorder
&receiveorder($biblionumber, $ordernumber, $quantityreceived, $user,
$unitprice, $booksellerinvoicenumber, $biblioitemnumber,
$freight, $bookfund, $rrp);
Updates an order, to reflect the fact that it was received, at least
in part. All arguments not mentioned below update the fields with the
same name in the aqorders table of the Koha database.
Updates the order with bibilionumber C<$biblionumber> and ordernumber
C<$ordernumber>.
Also updates the book fund ID in the aqorderbreakdown table.
=cut
#'
# FIXME - This function appears in C4::Catalogue
sub receiveorder {
my ($biblio,$ordnum,$quantrec,$user,$cost,$invoiceno,$bibitemno,$freight,$bookfund,$rrp)=@_;
my $dbh = C4::Context->dbh;
my $query="update aqorders set quantityreceived='$quantrec',
datereceived=now(),booksellerinvoicenumber='$invoiceno',
biblioitemnumber=$bibitemno,unitprice='$cost',freight='$freight',
rrp='$rrp'
where biblionumber=$biblio and ordernumber=$ordnum
";
# print $query;
my $sth=$dbh->prepare($query);
$sth->execute;
$sth->finish;
$query="update aqorderbreakdown set bookfundid=$bookfund where
ordernumber=$ordnum";
$sth=$dbh->prepare($query);
# print $query;
$sth->execute;
$sth->finish;
}
=item updaterecorder
&updaterecorder($biblionumber, $ordernumber, $user, $unitprice,
$bookfundid, $rrp);
Updates the order with biblionumber C<$biblionumber> and order number
C<$ordernumber>. C<$bookfundid> is the new value for the book fund ID
in the aqorderbreakdown table of the Koha database. All other
arguments update the fields with the same name in the aqorders table.
C<$user> is ignored.
=cut
#'
# FIXME - This function appears in C4::Catalogue
sub updaterecorder{
my($biblio,$ordnum,$user,$cost,$bookfund,$rrp)=@_;
my $dbh = C4::Context->dbh;
my $query="update aqorders set
unitprice='$cost', rrp='$rrp'
where biblionumber=$biblio and ordernumber=$ordnum
";
# print $query;
my $sth=$dbh->prepare($query);
$sth->execute;
$sth->finish;
$query="update aqorderbreakdown set bookfundid=$bookfund where
ordernumber=$ordnum";
$sth=$dbh->prepare($query);
# print $query;
$sth->execute;
$sth->finish;
}
=item curconvert
$foreignprice = &curconvert($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<&curconvert> assumes the rate is one
to one.
=cut
#'
# FIXME - An almost identical version of this function appears in
# C4::Catalogue
sub curconvert {
my ($currency,$price)=@_;
my $dbh = C4::Context->dbh;
my $query="Select rate from currency where currency='$currency'";
my $sth=$dbh->prepare($query);
$sth->execute;
my $data=$sth->fetchrow_hashref;
$sth->finish;
my $cur=$data->{'rate'};
if ($cur==0){
$cur=1;
}
$price=$price / $cur;
return($price);
}
=item getcurrencies
($count, $currencies) = &getcurrencies();
Returns the list of all known currencies.
C<$count> is the number of elements in C<$currencies>. C<$currencies>
is a reference-to-array; its elements are references-to-hash, whose
keys are the fields from the currency table in the Koha database.
=cut
#'
# FIXME - This function appears in C4::Catalogue
sub getcurrencies {
my $dbh = C4::Context->dbh;
my $query="Select * from currency";
my $sth=$dbh->prepare($query);
$sth->execute;
my @results;
my $i=0;
while (my $data=$sth->fetchrow_hashref){
$results[$i]=$data;
$i++;
}
$sth->finish;
return($i,\@results);
}
# FIXME - This function appears in C4::Catalogue. Neither one is used.
sub getcurrency {
my ($cur)=@_;
my $dbh = C4::Context->dbh;
my $query="Select * from currency where currency='$cur'";
my $sth=$dbh->prepare($query);
$sth->execute;
my $data=$sth->fetchrow_hashref;
$sth->finish;
return($data);
}
=item updatecurrencies
&updatecurrencies($currency, $newrate);
Sets the exchange rate for C<$currency> to be C<$newrate>.
=cut
#'
# FIXME - This function appears in C4::Catalogue
sub updatecurrencies {
my ($currency,$rate)=@_;
my $dbh = C4::Context->dbh;
my $query="update currency set rate=$rate where currency='$currency'";
my $sth=$dbh->prepare($query);
$sth->execute;
$sth->finish;
}
=item updatesup
&updatesup($bookseller);
Updates the information for a given bookseller. C<$bookseller> is a
reference-to-hash whose keys are the fields of the aqbooksellers table
in the Koha database. It must contain entries for all of the fields.
The entry to modify is determined by C<$bookseller-E<gt>{id}>.
The easiest way to get all of the necessary fields is to look up a
book seller with C<&booksellers>, modify what's necessary, then call
C<&updatesup> with the result.
=cut
#'
# FIXME - This function appears in C4::Catalogue
sub updatesup {
my ($data)=@_;
my $dbh = C4::Context->dbh;
my $query="Update aqbooksellers set
name='$data->{'name'}',address1='$data->{'address1'}',address2='$data->{'address2'}',
address3='$data->{'address3'}',address4='$data->{'address4'}',postal='$data->{'postal'}',
phone='$data->{'phone'}',fax='$data->{'fax'}',url='$data->{'url'}',
contact='$data->{'contact'}',contpos='$data->{'contpos'}',
contphone='$data->{'contphone'}', contfax='$data->{'contfax'}', contaltphone=
'$data->{'contaltphone'}', contemail='$data->{'contemail'}', contnotes=
'$data->{'contnotes'}', active=$data->{'active'},
listprice='$data->{'listprice'}', invoiceprice='$data->{'invoiceprice'}',
gstreg=$data->{'gstreg'}, listincgst=$data->{'listincgst'},
invoiceincgst=$data->{'invoiceincgst'}, specialty='$data->{'specialty'}',
discount='$data->{'discount'}',invoicedisc='$data->{'invoicedisc'}',
nocalc='$data->{'nocalc'}'
where id='$data->{'id'}'";
my $sth=$dbh->prepare($query);
$sth->execute;
$sth->finish;
# print $query;
}
# XXX - POD
sub insertsup {
my ($data)=@_;
my $dbh = C4::Context->dbh;
my $sth=$dbh->prepare("Select max(id) from aqbooksellers");
$sth->execute;
my $data2=$sth->fetchrow_hashref;
$sth->finish;
$data2->{'max(id)'}++;
$sth=$dbh->prepare("Insert into aqbooksellers (id) values ($data2->{'max(id)'})");
$sth->execute;
$sth->finish;
$data->{'id'}=$data2->{'max(id)'};
updatesup($data);
return($data->{'id'});
}
=item insertsup
$id = &insertsup($bookseller);
Creates a new bookseller. C<$bookseller> is a reference-to-hash whose
keys are the fields of the aqbooksellers table in the Koha database.
All fields must be present.
Returns the ID of the newly-created bookseller.
=cut
#'
# FIXME - This function appears in C4::Catalogue
# FIXME - This is different from &C4::Biblio::newitems, though both
# are exported.
sub newitems {
my ($item, @barcodes) = @_;
my $dbh = C4::Context->dbh;
my $query = "Select max(itemnumber) from items";
my $sth = $dbh->prepare($query);
my $data;
my $itemnumber;
my $error;
$sth->execute;
$data = $sth->fetchrow_hashref;
$itemnumber = $data->{'max(itemnumber)'} + 1;
$sth->finish;
$item->{'booksellerid'} = $dbh->quote($item->{'booksellerid'});
$item->{'homebranch'} = $dbh->quote($item->{'homebranch'});
$item->{'price'} = $dbh->quote($item->{'price'});
$item->{'replacementprice'} = $dbh->quote($item->{'replacementprice'});
$item->{'itemnotes'} = $dbh->quote($item->{'itemnotes'});
foreach my $barcode (@barcodes) {
$barcode = uc($barcode);
$barcode = $dbh->quote($barcode);
$query = "Insert into items set
itemnumber = $itemnumber,
biblionumber = $item->{'biblionumber'},
biblioitemnumber = $item->{'biblioitemnumber'},
barcode = $barcode,
booksellerid = $item->{'booksellerid'},
dateaccessioned = NOW(),
homebranch = $item->{'homebranch'},
holdingbranch = $item->{'homebranch'},
price = $item->{'price'},
replacementprice = $item->{'replacementprice'},
replacementpricedate = NOW(),
itemnotes = $item->{'itemnotes'}";
if ($item->{'loan'}) {
$query .= ",
notforloan = $item->{'loan'}";
} # if
$sth = $dbh->prepare($query);
$sth->execute;
$error .= $sth->errstr;
$sth->finish;
$itemnumber++;
} # for
return($error);
}
# FIXME - This is the same as &C4::Biblio::Checkitems.
# Pick one and stick with it.
# XXX - POD
sub checkitems{
my ($count,@barcodes)=@_;
my $dbh = C4::Context->dbh;
my $error;
for (my $i=0;$i<$count;$i++){
$barcodes[$i]=uc $barcodes[$i];
my $query="Select * from items where barcode='$barcodes[$i]'";
my $sth=$dbh->prepare($query);
$sth->execute;
if (my $data=$sth->fetchrow_hashref){
$error.=" Duplicate Barcode: $barcodes[$i]";
}
$sth->finish;
}
return($error);
}
# FIXME - This appears to be functionally equivalent to
# &C4::Biblio::moditem.
# Pick one and stick with it.
# XXX - POD
sub moditem {
my ($loan,$itemnum,$bibitemnum,$barcode,$notes,$homebranch,$lost,$wthdrawn,$replacement)=@_;
my $dbh = C4::Context->dbh;
my $query="update items set biblioitemnumber=$bibitemnum,
barcode='$barcode',itemnotes='$notes'
where itemnumber=$itemnum";
if ($barcode eq ''){
$query="update items set biblioitemnumber=$bibitemnum,notforloan=$loan where itemnumber=$itemnum";
}
if ($lost ne ''){
$query="update items set biblioitemnumber=$bibitemnum,
barcode='$barcode',itemnotes='$notes',homebranch='$homebranch',
itemlost='$lost',wthdrawn='$wthdrawn' where itemnumber=$itemnum";
}
if ($replacement ne ''){
$query=~ s/ where/,replacementprice='$replacement' where/;
}
my $sth=$dbh->prepare($query);
$sth->execute;
$sth->finish;
}
# FIXME - This function appears in C4::Catalogue. Neither one is used
sub updatecost{
my($price,$rrp,$itemnum)=@_;
my $dbh = C4::Context->dbh;
my $query="update items set price='$price',replacementprice='$rrp'
where itemnumber=$itemnum";
my $sth=$dbh->prepare($query);
$sth->execute;
$sth->finish;
}
# FIXME - This is identical to &C4::Biblio::countitems.
# Pick one and stick with it.
# XXX - POD
sub countitems{
my ($bibitemnum)=@_;
my $dbh = C4::Context->dbh;
my $query="Select count(*) from items where biblioitemnumber='$bibitemnum'";
my $sth=$dbh->prepare($query);
$sth->execute;
my $data=$sth->fetchrow_hashref;
$sth->finish;
return($data->{'count(*)'});
}
# FIXME - This function appears in C4::Catalogue. Neither one is used.
sub findall {
my ($biblionumber)=@_;
my $dbh = C4::Context->dbh;
my $query="Select * from biblioitems,items,itemtypes where
biblioitems.biblionumber=$biblionumber
and biblioitems.biblioitemnumber=items.biblioitemnumber and
itemtypes.itemtype=biblioitems.itemtype
order by items.biblioitemnumber";
my $sth=$dbh->prepare($query);
$sth->execute;
my @results;
my $i;
while (my $data=$sth->fetchrow_hashref){
$results[$i]=$data;
$i++;
}
$sth->finish;
return(@results);
}
# FIXME - This function appears in C4::Catalogue. Neither one is used
sub needsmod{
my ($bibitemnum,$itemtype)=@_;
my $dbh = C4::Context->dbh;
my $query="Select * from biblioitems where biblioitemnumber=$bibitemnum
and itemtype='$itemtype'";
my $sth=$dbh->prepare($query);
$sth->execute;
my $result=0;
if (my $data=$sth->fetchrow_hashref){
$result=1;
}
$sth->finish;
return($result);
}
# FIXME - A nearly-identical function, appears in C4::Biblio
# Pick one and stick with it.
# XXX - POD
sub delitem{
my ($itemnum)=@_;
my $dbh = C4::Context->dbh;
my $query="select * from items where itemnumber=$itemnum";
my $sth=$dbh->prepare($query);
$sth->execute;
my @data=$sth->fetchrow_array;
$sth->finish;
$query="Insert into deleteditems values (";
foreach my $temp (@data){
$query=$query."'$temp',";
}
$query=~ s/\,$/\)/;
# print $query;
$sth=$dbh->prepare($query);
$sth->execute;
$sth->finish;
$query = "Delete from items where itemnumber=$itemnum";
$sth=$dbh->prepare($query);
$sth->execute;
$sth->finish;
}
# FIXME - This is functionally identical to &C4::Biblio::deletebiblioitem.
# Pick one and stick with it.
# XXX - POD
sub deletebiblioitem {
my ($biblioitemnumber) = @_;
my $dbh = C4::Context->dbh;
my $query = "Select * from biblioitems
where biblioitemnumber = $biblioitemnumber";
my $sth = $dbh->prepare($query);
my @results;
$sth->execute;
if (@results = $sth->fetchrow_array) {
$query = "Insert into deletedbiblioitems values (";
foreach my $value (@results) {
$value = $dbh->quote($value);
$query .= "$value,";
} # foreach
$query =~ s/\,$/\)/;
$dbh->do($query);
$dbh->do(<<EOT);
DELETE FROM biblioitems
WHERE biblioitemnumber = $biblioitemnumber
EOT
} # if
$sth->finish;
# Now delete all the items attached to the biblioitem
$query = "Select * from items where biblioitemnumber = $biblioitemnumber";
$sth = $dbh->prepare($query);
$sth->execute;
while (@results = $sth->fetchrow_array) {
$query = "Insert into deleteditems values (";
foreach my $value (@results) {
$value = $dbh->quote($value);
$query .= "$value,";
} # foreach
$query =~ s/\,$/\)/;
$dbh->do($query);
} # while
$sth->finish; # FIXME - This is bogus, isn't it?
$dbh->do(<<EOT);
DELETE FROM items
WHERE biblioitemnumber = $biblioitemnumber
EOT
} # sub deletebiblioitem
# FIXME - This is functionally identical to &C4::Biblio::delbiblio.
# Pick one and stick with it.
# XXX - POD
sub delbiblio{
my ($biblio)=@_;
my $dbh = C4::Context->dbh;
my $query="select * from biblio where biblionumber=$biblio";
my $sth=$dbh->prepare($query);
$sth->execute;
if (my @data=$sth->fetchrow_array){
$sth->finish;
$query="Insert into deletedbiblio values (";
foreach my $temp (@data){
$temp=~ s/\'/\\\'/g;
$query=$query."'$temp',";
}
$query=~ s/\,$/\)/;
# print $query;
$sth=$dbh->prepare($query);
$sth->execute;
$sth->finish;
$query = "Delete from biblio where biblionumber=$biblio";
$sth=$dbh->prepare($query);
$sth->execute;
$sth->finish;
}
$sth->finish;
}
# XXX - POD
sub getitemtypes {
my $dbh = C4::Context->dbh;
my $query = "select * from itemtypes";
my $sth = $dbh->prepare($query);
# || die "Cannot prepare $query" . $dbh->errstr;
my $count = 0;
my @results;
$sth->execute;
# || die "Cannot execute $query\n" . $sth->errstr;
while (my $data = $sth->fetchrow_hashref) {
$results[$count] = $data;
$count++;
} # while
$sth->finish;
return($count, @results);
} # sub getitemtypes
# FIXME - This is identical to &C4::Biblio::getitemtypes.
# Pick one and stick with it.
# XXX - POD
sub getbiblio {
my ($biblionumber) = @_;
my $dbh = C4::Context->dbh;
my $query = "Select * from biblio where biblionumber = $biblionumber";
my $sth = $dbh->prepare($query);
# || die "Cannot prepare $query\n" . $dbh->errstr;
my $count = 0;
my @results;
$sth->execute;
# || die "Cannot execute $query\n" . $sth->errstr;
while (my $data = $sth->fetchrow_hashref) {
$results[$count] = $data;
$count++;
} # while
$sth->finish;
return($count, @results);
} # sub getbiblio
# XXX - POD
sub getbiblioitem {
my ($biblioitemnum) = @_;
my $dbh = C4::Context->dbh;
my $query = "Select * from biblioitems where
biblioitemnumber = $biblioitemnum";
my $sth = $dbh->prepare($query);
my $count = 0;
my @results;
$sth->execute;
while (my $data = $sth->fetchrow_hashref) {
$results[$count] = $data;
$count++;
} # while
$sth->finish;
return($count, @results);
} # sub getbiblioitem
# FIXME - This is identical to &C4::Biblio::getbiblioitem.
# Pick one and stick with it.
# XXX - POD
sub getbiblioitembybiblionumber {
my ($biblionumber) = @_;
my $dbh = C4::Context->dbh;
my $query = "Select * from biblioitems where biblionumber =
$biblionumber";
my $sth = $dbh->prepare($query);
my $count = 0;
my @results;
$sth->execute;
while (my $data = $sth->fetchrow_hashref) {
$results[$count] = $data;
$count++;
} # while
$sth->finish;
return($count, @results);
} # sub
# FIXME - This is identical to
# &C4::Biblio::getbiblioitembybiblionumber.
# Pick one and stick with it.
# XXX - POD
sub getitemsbybiblioitem {
my ($biblioitemnum) = @_;
my $dbh = C4::Context->dbh;
my $query = "Select * from items, biblio where
biblio.biblionumber = items.biblionumber and biblioitemnumber
= $biblioitemnum";
my $sth = $dbh->prepare($query);
# || die "Cannot prepare $query\n" . $dbh->errstr;
my $count = 0;
my @results;
$sth->execute;
# || die "Cannot execute $query\n" . $sth->errstr;
while (my $data = $sth->fetchrow_hashref) {
$results[$count] = $data;
$count++;
} # while
$sth->finish;
return($count, @results);
} # sub getitemsbybiblioitem
# FIXME - This is identical to &C4::Biblio::isbnsearch.
# Pick one and stick with it.
# XXX - POD
sub isbnsearch {
my ($isbn) = @_;
my $dbh = C4::Context->dbh;
my $count = 0;
my $query;
my $sth;
my @results;
$isbn = $dbh->quote($isbn);
$query = "Select biblio.* from biblio, biblioitems where
biblio.biblionumber = biblioitems.biblionumber
and isbn = $isbn";
$sth = $dbh->prepare($query);
$sth->execute;
while (my $data = $sth->fetchrow_hashref) {
$results[$count] = $data;
$count++;
} # while
$sth->finish;
return($count, @results);
} # sub isbnsearch
=item websitesearch
($count, @results) = &websitesearch($keywordlist);
Looks up biblioitems by URL.
C<$keywordlist> is a space-separated list of search terms.
C<&websitesearch> returns those biblioitems whose URL contains at
least one of the search terms.
C<$count> is the number of elements in C<@results>. C<@results> is an
array of references-to-hash, whose keys are the fields of the biblio
and biblioitems tables in the Koha database.
=cut
#'
# FIXME - This function appears in C4::Catalogue
sub websitesearch {
my ($keywordlist) = @_;
my $dbh = C4::Context->dbh;
my $query = "Select distinct biblio.* from biblio, biblioitems where
biblio.biblionumber = biblioitems.biblionumber and (";
my $count = 0;
my $sth;
my @results;
my @keywords = split(/ +/, $keywordlist);
my $keyword = shift(@keywords);
$keyword =~ s/%/\\%/g;
$keyword =~ s/_/\\_/;
$keyword = "%" . $keyword . "%";
$keyword = $dbh->quote($keyword);
$query .= " (url like $keyword)";
foreach $keyword (@keywords) {
$keyword =~ s/%/\\%/;
$keyword =~ s/_/\\_/;
$keyword = "%" . $keyword . "%";
$keyword = $dbh->quote($keyword);
$query .= " or (url like $keyword)";
} # foreach
$query .= ")";
$sth = $dbh->prepare($query);
$sth->execute;
while (my $data = $sth->fetchrow_hashref) {
$results[$count] = $data;
$count++;
} # while
$sth->finish;
return($count, @results);
} # sub websitesearch
=item addwebsite
&addwebsite($website);
Adds a new web site. C<$website> is a reference-to-hash, with the keys
C<biblionumber>, C<title>, C<description>, and C<url>. All of these
are mandatory.
=cut
#'
# FIXME - This function appears in C4::Catalogue
sub addwebsite {
my ($website) = @_;
my $dbh = C4::Context->dbh;
$website->{'biblionumber'} = $dbh->quote($website->{'biblionumber'});
$website->{'title'} = $dbh->quote($website->{'title'});
$website->{'description'} = $dbh->quote($website->{'description'});
$website->{'url'} = $dbh->quote($website->{'url'});
$dbh->do(<<EOT);
INSERT INTO websites
SET biblionumber = $website->{'biblionumber'},
title = $website->{'title'},
description = $website->{'description'},
url = $website->{'url'}
EOT
} # sub website
=item updatewebsite
&updatewebsite($website);
Updates an existing web site. C<$website> is a reference-to-hash with
the keys C<websitenumber>, C<title>, C<description>, and C<url>. All
of these are mandatory. C<$website-E<gt>{websitenumber}> identifies
the entry to update.
=cut
#'
# FIXME - This function appears in C4::Catalogue
sub updatewebsite {
my ($website) = @_;
my $dbh = C4::Context->dbh;
$website->{'title'} = $dbh->quote($website->{'title'});
$website->{'description'} = $dbh->quote($website->{'description'});
$website->{'url'} = $dbh->quote($website->{'url'});
$dbh->do(<<EOT);
UPDATE websites
SET title = $website->{'title'},
description = $website->{'description'},
url = $website->{'url'}
where websitenumber = $website->{'websitenumber'}
EOT
} # sub updatewebsite
=item deletewebsite
&deletewebsite($websitenumber);
Deletes the web site with number C<$websitenumber>.
=cut
#'
# FIXME - This function appears in C4::Catalogue
sub deletewebsite {
my ($websitenumber) = @_;
my $dbh = C4::Context->dbh;
$dbh->do(<<EOT);
DELETE FROM websites
WHERE websitenumber = $websitenumber
EOT
} # sub deletewebsite
END { } # module clean-up code here (global destructor)
1;
__END__
=back
=head1 AUTHOR
Koha Developement team <info@koha.org>
=cut