Koha-clms/C4/Reserves2.pm

488 lines
17 KiB
Perl
Executable File

package C4::Reserves2; #asummes C4/Reserves2
#requires DBI.pm to be installed
#uses DBD:Pg
use strict;
require Exporter;
use DBI;
use C4::Database;
#use C4::Accounts;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
# set the version for version checking
$VERSION = 0.01;
@ISA = qw(Exporter);
@EXPORT = qw(&FindReserves &CheckReserves &CancelReserve &ReserveWaiting &CreateReserve &updatereserves &getreservetitle &Findgroupreserve);
%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);
# non-exported package globals go here
use vars qw(@more $stuff);
# initalize package globals, first exported ones
my $Var1 = '';
my %Hashit = ();
# then the others (which are still accessible as $Some::Module::stuff)
my $stuff = '';
my @more = ();
# all file-scoped lexicals must be created before
# the functions below that use them.
# file-private lexicals go here
my $priv_var = '';
my %secret_hash = ();
# 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;
sub FindReserves {
my ($bib,$bor) = @_;
my $dbh = C4Connect;
my $query = "Select *,reserves.branchcode,biblio.title as btitle
from reserves,borrowers,biblio ";
if ($bib ne ''){
$bib = $dbh->quote($bib);
if ($bor ne ''){
$bor = $dbh->quote($bor);
$query .= " where reserves.biblionumber = $bib
and borrowers.borrowernumber = $bor
and reserves.borrowernumber = borrowers.borrowernumber
and biblio.biblionumber = $bib
and cancellationdate is NULL
and (found <> 'F' or found is NULL)";
} else {
$query .= " where reserves.borrowernumber = borrowers.borrowernumber
and biblio.biblionumber = $bib
and reserves.biblionumber = $bib
and cancellationdate is NULL
and (found <> 'F' or found is NULL)";
}
} else {
$query .= " where borrowers.borrowernumber = $bor
and reserves.borrowernumber = borrowers.borrowernumber
and reserves.biblionumber = biblio.biblionumber
and cancellationdate is NULL and
(found <> 'F' or found is NULL)";
}
$query.=" order by priority";
my $sth=$dbh->prepare($query);
$sth->execute;
my $i=0;
my @results;
while (my $data=$sth->fetchrow_hashref){
$results[$i]=$data;
$i++;
}
# print $query;
$sth->finish;
$dbh->disconnect;
return($i,\@results);
}
sub CheckReserves {
my ($item) = @_;
my $dbh=C4Connect;
my $qitem=$dbh->quote($item);
# get the biblionumber...
my $sth=$dbh->prepare("select biblionumber from items where itemnumber=$qitem");
$sth->execute;
my ($biblio) = $sth->fetchrow_array;
$sth->finish;
$dbh->disconnect;
# get the reserves...
my ($count, $reserves) = FindReserves($biblio);
my $priority = 10000000;
my $highest;
if ($count) {
foreach my $res (@$reserves) {
if ($res->{'itemnumber'} == $item) {
return ("Waiting", $res);
} else {
if ($res->{'priority'} < $priority) {
$priority = $res->{'priority'};
$highest = $res;
}
}
}
$highest->{'itemnumber'} = $item;
return ("Reserved", $highest);
} else {
return (0, 0);
}
}
sub CancelReserve {
my ($biblio, $item, $borr) = @_;
my $dbh=C4Connect;
if (($item and $borr) and (not $biblio)) {
# removing a waiting reserve record....
$item = $dbh->quote($item);
$borr = $dbh->quote($borr);
# update the database...
my $query = "update reserves set cancellationdate = now(),
found = Null,
priority = 0
where itemnumber = $item
and borrowernumber = $borr";
my $sth = $dbh->prepare($query);
$sth->execute;
$sth->finish;
}
if (($biblio and $borr) and (not $item)) {
# removing a reserve record....
$biblio = $dbh->quote($biblio);
$borr = $dbh->quote($borr);
# fix up the priorities on the other records....
my $query = "select priority from reserves
where biblionumber = $biblio
and borrowernumber = $borr
and cancellationdate is NULL
and (found <> 'F' or found is NULL)";
my $sth=$dbh->prepare($query);
$sth->execute;
my ($priority) = $sth->fetchrow_array;
$sth->finish;
# update the database, removing the record...
my $query = "update reserves set cancellationdate = now(),
found = Null,
priority = 0
where biblionumber = $biblio
and borrowernumber = $borr
and cancellationdate is NULL
and (found <> 'F' or found is NULL)";
my $sth = $dbh->prepare($query);
$sth->execute;
$sth->finish;
# now fix the priority on the others....
my ($count, $reserves) = FindReserves($biblio);
foreach my $rec (@$reserves) {
if ($rec->{'priority'} > $priority) {
my $newpr = $rec->{'priority'};
$newpr = $dbh->quote($newpr - 1);
my $query = "update reserves set priority = $newpr
where biblionumber = $rec->{'biblionumber'}
and borrowernumber = $rec->{'borrowernumber'}
and cancellationdate is NULL
and (found <> 'F' or found is NULL)";
my $sth = $dbh->prepare($query);
$sth->execute;
$sth->finish;
}
}
}
$dbh->disconnect;
}
sub ReserveWaiting {
my ($item, $borr) = @_;
my $dbh = C4Connect;
$item = $dbh->quote($item);
$borr = $dbh->quote($borr);
# get priority and biblionumber....
my $query = "SELECT reserves.priority as priority,
reserves.biblionumber as biblionumber,
reserves.branchcode as branchcode
FROM reserves,items
WHERE reserves.biblionumber = items.biblionumber
AND items.itemnumber = $item
AND reserves.borrowernumber = $borr
AND reserves.cancellationdate is NULL
AND (reserves.found <> 'F' or reserves.found is NULL)";
my $sth = $dbh->prepare($query);
$sth->execute;
my $data = $sth->fetchrow_hashref;
$sth->finish;
my $biblio = $data->{'biblionumber'};
$biblio = $dbh->quote($biblio);
# update reserves record....
$query = "update reserves set priority = 0, found = 'W', itemnumber = $item
where borrowernumber = $borr and biblionumber = $biblio";
$sth = $dbh->prepare($query);
$sth->execute;
$sth->finish;
# now fix up the remaining priorities....
$query = "select priority, borrowernumber from reserves where biblionumber = $biblio
and cancellationdate is NULL
and found is NULL
and priority <> 0 and priority is not NULL";
$sth = $dbh->prepare($query);
$sth->execute;
my $branchcode = $data->{'branchcode'};
my $priority = $data->{'priority'};
while (my $data = $sth->fetchrow_hashref) {
if ($data->{'priority'} > $priority) {
my $uquery = "update reserves set priority = priority - 1
where biblionumber = $biblio
and borrowernumber = $borr
and cancellation is NULL";
my $usth->$dbh->prepare($query);
$usth->execute;
$usth->finish;
}
}
$sth->finish;
$dbh->disconnect;
return $branchcode;
}
sub Findgroupreserve {
my ($bibitem,$biblio)=@_;
my $dbh=C4Connect;
$bibitem=$dbh->quote($bibitem);
my $query="Select * from reserves
left join reserveconstraints on
reserves.biblionumber=reserveconstraints.biblionumber
where
reserves.biblionumber=$biblio and
((reserveconstraints.biblioitemnumber=$bibitem
and reserves.borrowernumber=reserveconstraints.borrowernumber
and reserves.reservedate=reserveconstraints.reservedate)
or reserves.constrainttype='a')
and reserves.cancellationdate is NULL
and (reserves.found <> 'F' or reserves.found is NULL)";
# print $query;
my $sth=$dbh->prepare($query);
$sth->execute;
my $i=0;
my @results;
while (my $data=$sth->fetchrow_hashref){
$results[$i]=$data;
$i++;
}
$sth->finish;
$dbh->disconnect;
return($i,@results);
}
sub CreateReserve {
my
($env,$branch,$borrnum,$biblionumber,$constraint,$bibitems,$priority,$notes,$title)= @_;
my $fee=CalcReserveFee($env,$borrnum,$biblionumber,$constraint,$bibitems);
my $dbh = &C4Connect;
my $const = lc substr($constraint,0,1);
my @datearr = localtime(time);
my $resdate =(1900+$datearr[5])."-".($datearr[4]+1)."-".$datearr[3];
#eval {
# updates take place here
if ($fee > 0) {
# print $fee;
my $nextacctno = &getnextacctno($env,$borrnum,$dbh);
my $updquery = "insert into accountlines
(borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding)
values
($borrnum,$nextacctno,now(),$fee,'Reserve Charge - $title','Res',$fee)";
my $usth = $dbh->prepare($updquery);
$usth->execute;
$usth->finish;
}
#if ($const eq 'a'){
my $query="insert into reserves
(borrowernumber,biblionumber,reservedate,branchcode,constrainttype,priority,reservenotes)
values
('$borrnum','$biblionumber','$resdate','$branch','$const','$priority','$notes')";
my $sth = $dbh->prepare($query);
$sth->execute();
$sth->finish;
#}
if (($const eq "o") || ($const eq "e")) {
my $numitems = @$bibitems;
my $i = 0;
while ($i < $numitems) {
my $biblioitem = @$bibitems[$i];
my $query = "insert into
reserveconstraints
(borrowernumber,biblionumber,reservedate,biblioitemnumber)
values
('$borrnum','$biblionumber','$resdate','$biblioitem')";
my $sth = $dbh->prepare($query);
$sth->execute();
$sth->finish;
$i++;
}
}
# print $query;
$dbh->disconnect();
return();
}
sub CalcReserveFee {
my ($env,$borrnum,$biblionumber,$constraint,$bibitems) = @_;
#check for issues;
my $dbh = &C4Connect;
my $const = lc substr($constraint,0,1);
my $query = "select * from borrowers,categories
where (borrowernumber = '$borrnum')
and (borrowers.categorycode = categories.categorycode)";
my $sth = $dbh->prepare($query);
$sth->execute;
my $data = $sth->fetchrow_hashref;
$sth->finish();
my $fee = $data->{'reservefee'};
my $cntitems = @->$bibitems;
if ($fee > 0) {
# check for items on issue
# first find biblioitem records
my @biblioitems;
my $query1 = "select * from biblio,biblioitems
where (biblio.biblionumber = '$biblionumber')
and (biblio.biblionumber = biblioitems.biblionumber)";
my $sth1 = $dbh->prepare($query1);
$sth1->execute();
while (my $data1=$sth1->fetchrow_hashref) {
if ($const eq "a") {
push @biblioitems,$data1;
} else {
my $found = 0;
my $x = 0;
while ($x < $cntitems) {
if (@$bibitems->{'biblioitemnumber'} == $data->{'biblioitemnumber'}) {
$found = 1;
}
$x++;
}
if ($const eq 'o') {
if ( $found == 1) {
push @biblioitems,$data1;
}
} else {
if ($found == 0) {
push @biblioitems,$data1;
}
}
}
}
$sth1->finish;
my $cntitemsfound = @biblioitems;
my $issues = 0;
my $x = 0;
my $allissued = 1;
while ($x < $cntitemsfound) {
my $bitdata = @biblioitems[$x];
my $query2 = "select * from items
where biblioitemnumber = '$bitdata->{'biblioitemnumber'}'";
my $sth2 = $dbh->prepare($query2);
$sth2->execute;
while (my $itdata=$sth2->fetchrow_hashref) {
my $query3 = "select * from issues
where itemnumber = '$itdata->{'itemnumber'}' and
returndate is null";
my $sth3 = $dbh->prepare($query3);
$sth3->execute();
if (my $isdata=$sth3->fetchrow_hashref) {
} else {
$allissued = 0;
}
}
$x++;
}
if ($allissued == 0) {
my $rquery = "select * from reserves
where biblionumber = '$biblionumber'";
my $rsth = $dbh->prepare($rquery);
$rsth->execute();
if (my $rdata = $rsth->fetchrow_hashref) {
} else {
$fee = 0;
}
}
}
# print "fee $fee";
$dbh->disconnect();
return $fee;
}
sub getnextacctno {
my ($env,$bornumber,$dbh)=@_;
my $nextaccntno = 1;
my $query = "select * from accountlines
where (borrowernumber = '$bornumber')
order by accountno desc";
my $sth = $dbh->prepare($query);
$sth->execute;
if (my $accdata=$sth->fetchrow_hashref){
$nextaccntno = $accdata->{'accountno'} + 1;
}
$sth->finish;
return($nextaccntno);
}
sub updatereserves{
#subroutine to update a reserve
my ($rank,$biblio,$borrower,$del,$branch)=@_;
my $dbh=C4Connect;
my $query="Update reserves ";
if ($del ==0){
$query.="set priority='$rank',branchcode='$branch' where
biblionumber=$biblio and borrowernumber=$borrower";
} else {
$query="Select * from reserves where biblionumber=$biblio and
borrowernumber=$borrower";
my $sth=$dbh->prepare($query);
$sth->execute;
my $data=$sth->fetchrow_hashref;
$sth->finish;
$query="Select * from reserves where biblionumber=$biblio and
priority > '$data->{'priority'}' and cancellationdate is NULL
order by priority";
my $sth2=$dbh->prepare($query) || die $dbh->errstr;
$sth2->execute || die $sth2->errstr;
while (my $data=$sth2->fetchrow_hashref){
$data->{'priority'}--;
$query="Update reserves set priority=$data->{'priority'} where
biblionumber=$data->{'biblionumber'} and
borrowernumber=$data->{'borrowernumber'}";
my $sth3=$dbh->prepare($query);
$sth3->execute || die $sth3->errstr;
$sth3->finish;
}
$sth2->finish;
$query="update reserves set cancellationdate=now() where biblionumber=$biblio
and borrowernumber=$borrower";
}
my $sth=$dbh->prepare($query);
$sth->execute;
$sth->finish;
$dbh->disconnect;
}
sub getreservetitle {
my ($biblio,$bor,$date,$timestamp)=@_;
my $dbh=C4Connect;
my $query="Select * from reserveconstraints,biblioitems where
reserveconstraints.biblioitemnumber=biblioitems.biblioitemnumber
and reserveconstraints.biblionumber=$biblio and reserveconstraints.borrowernumber
= $bor and reserveconstraints.reservedate='$date' and
reserveconstraints.timestamp=$timestamp";
my $sth=$dbh->prepare($query);
$sth->execute;
my $data=$sth->fetchrow_hashref;
$sth->finish;
$dbh->disconnect;
# print $query;
return($data);
}
END { } # module clean-up code here (global destructor)