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 &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 ''){ if ($bor ne ''){ $query=$query." where reserves.biblionumber=$bib and reserves.borrowernumber=borrowers.borrowernumber and biblio.biblionumber=$bib and cancellationdate is NULL and (found <> 'F' or found is NULL)"; } else { $query=$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=$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 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)