New XML handling of data

This commit is contained in:
tgarip1957 2006-09-01 22:05:51 +00:00
parent fe59c6c516
commit aa52969153
2 changed files with 62 additions and 99 deletions

View file

@ -81,6 +81,7 @@ Also deals with stocktaking.
&calc_charges
&listitemsforinventory
&itemseen
&itemseenbarcode
&fixdate
&itemissues
&patronflags
@ -176,7 +177,7 @@ and issues.borrowernumber = borrowers.borrowernumber");
where itemnumber = ?
and issues.borrowernumber = borrowers.borrowernumber
and returndate is not NULL
order by returndate desc,timestamp desc ,limit 2") ;
order by returndate desc,timestamp desc limit 2") ;
$sth2->execute($data->{'itemnumber'}) ;
# for (my $i2 = 0; $i2 < 2; $i2++) { # FIXME : error if there is less than 3 pple borrowing this item
my $i2=0;
@ -211,26 +212,26 @@ sub itemseen {
my $sth=$dbh->prepare("select biblionumber from items where itemnumber=?");
$sth->execute($itemnumber);
my ($biblionumber)=$sth->fetchrow;
MARCmoditemonefield($dbh,$biblionumber,$itemnumber,'itemlost',"0",1);
XMLmoditemonefield($dbh,$biblionumber,$itemnumber,'itemlost',"0",1);
# find today's date
my ($sec,$min,$hour,$mday,$mon,$year) = localtime();
$year += 1900;
$mon += 1;
my $timestamp = sprintf("%4d%02d%02d%02d%02d%02d.0",
$year,$mon,$mday,$hour,$min,$sec);
MARCmoditemonefield($dbh,$biblionumber,$itemnumber,'datelastseen', $timestamp);
XMLmoditemonefield($dbh,$biblionumber,$itemnumber,'datelastseen', $timestamp);
}
sub itemseenbarcode {
my ($dbh,$barcode) = @_;
my $sth=$dbh->prepare("select biblionumber,itemnumber from items where barcode=$barcode");
$sth->execute();
my ($biblionumber,$itemnumber)=$sth->fetchrow;
MARCmoditemonefield($dbh,$biblionumber,$itemnumber,'itemlost',"0",1);
XMLmoditemonefield($dbh,$biblionumber,$itemnumber,'itemlost',"0",1);
my ($sec,$min,$hour,$mday,$mon,$year) = localtime();
$year += 1900;
$mon += 1;
my $timestamp = sprintf("%4d%02d%02d%02d%02d%02d.0",$year,$mon,$mday,$hour,$min,$sec);
MARCmoditemonefield($dbh,$biblionumber,$itemnumber,'datelastseen', $timestamp);
XMLmoditemonefield($dbh,$biblionumber,$itemnumber,'datelastseen', $timestamp);
}
sub listitemsforinventory {
@ -352,12 +353,14 @@ sub getiteminformation {
# returns a hash of item information together with biblio given either the itemnumber or the barcode
my ($env, $itemnumber, $barcode) = @_;
my $dbh=C4::Context->dbh;
my ($itemrecord)=MARCgetitem($dbh,$itemnumber,$barcode);
my $iteminformation=MARCmarc2koha($dbh,$itemrecord,"holdings");
my ($itemrecord)=XMLgetitem($dbh,$itemnumber,$barcode);
my $itemhash=XML_xml2hash_onerecord($itemrecord);
my $iteminformation=XMLmarc2koha_onerecord($dbh,$itemhash,"holdings");
##Now get full biblio details from MARC
if ($iteminformation) {
my ($record)=MARCgetbiblio($dbh,$iteminformation->{'biblionumber'});
my $biblio=MARCmarc2koha($dbh,$record,"biblios");
my ($record)=XMLgetbiblio($dbh,$iteminformation->{'biblionumber'});
my $recordhash=XML_xml2hash_onerecord($record);
my $biblio=XMLmarc2koha_onerecord($dbh,$recordhash,"biblios");
foreach my $field (keys %$biblio){
$iteminformation->{$field}=$biblio->{$field};
}
@ -505,7 +508,7 @@ $itemnumber=~s /\'//g;
my $sth=$dbh->prepare("select biblionumber from items where itemnumber=$itemnumber");
$sth->execute();
my ($biblionumber)=$sth->fetchrow;
MARCmoditemonefield($dbh,$biblionumber,$itemnumber,'holdingbranch',$holdingbranch,1);
XMLmoditemonefield($dbh,$biblionumber,$itemnumber,'holdingbranch',$holdingbranch,1);
$sth->finish;
}
@ -894,10 +897,12 @@ C<$date> contains the max date of return. calculated if empty.
# issuing book. We already have checked it can be issued, so, just issue it !
#
sub issuebook {
### fix me STOP using koha hashes, change so that XML hash is used
my ($env,$borrower,$barcode,$date,$cancelreserve) = @_;
my $dbh = C4::Context->dbh;
my ($itemrecord)=MARCgetitem($dbh,"",$barcode);
my $iteminformation=MARCmarc2koha($dbh,$itemrecord,"holdings");
my ($itemrecord)=XMLgetitem($dbh,"",$barcode);
$itemrecord=XML_xml2hash_onerecord($itemrecord);
my $iteminformation=XMLmarc2koha_onerecord($dbh,$itemrecord,"holdings");
my $error;
#
# check if we just renew the issue.
@ -995,17 +1000,17 @@ sub issuebook {
$sth->finish;
$iteminformation->{'issues'}++;
##Record in MARC the new data ,date_due as due date,issue count and the borrowernumber
&MARCkoha2marcOnefield($itemrecord, "issues", $iteminformation->{'issues'},"holdings");
&MARCkoha2marcOnefield($itemrecord, "date_due", $dateduef,"holdings");
&MARCkoha2marcOnefield($itemrecord, "borrowernumber", $borrower->{'borrowernumber'},"holdings");
&MARCkoha2marcOnefield($itemrecord, "itemlost", "0","holdings");
$itemrecord=XML_writeline($itemrecord, "issues", $iteminformation->{'issues'},"holdings");
$itemrecord=XML_writeline($itemrecord, "date_due", $dateduef,"holdings");
$itemrecord=XML_writeline($itemrecord, "borrowernumber", $borrower->{'borrowernumber'},"holdings");
$itemrecord=XML_writeline($itemrecord, "itemlost", "0","holdings");
# find today's date as timestamp
my ($sec,$min,$hour,$mday,$mon,$year) = localtime();
$year += 1900;
$mon += 1;
my $timestamp = sprintf("%4d%02d%02d%02d%02d%02d.0",
$year,$mon,$mday,$hour,$min,$sec);
&MARCkoha2marcOnefield($itemrecord, "datelastseen", $timestamp,"holdings");
$itemrecord=XML_writeline($itemrecord, "datelastseen", $timestamp,"holdings");
##Now update the zebradb
NEWmoditem($dbh,$itemrecord,$iteminformation->{'biblionumber'},$iteminformation->{'itemnumber'});
# If it costs to borrow this book, charge it to the patron's account.
@ -1140,8 +1145,9 @@ sub returnbook {
my $doreturn = 1;
die '$branch not defined' unless defined $branch; # just in case (bug 170)
# get information on item
my ($itemrecord)=MARCgetitem($dbh,"",$barcode);
my $iteminformation=MARCmarc2koha($dbh,$itemrecord,"holdings");
my ($itemrecord)=XMLgetitem($dbh,"",$barcode);
$itemrecord=XML_xml2hash_onerecord($itemrecord);
my $iteminformation=XMLmarc2koha_onerecord($dbh,$itemrecord,"holdings");
if (not $iteminformation) {
$messages->{'BadBarcode'} = $barcode;
$doreturn = 0;
@ -1171,8 +1177,8 @@ sub returnbook {
$messages->{'WasReturned'} = 1; # FIXME is the "= 1" right?
$sth->finish;
&MARCkoha2marcOnefield($itemrecord, "date_due", "","holdings");
&MARCkoha2marcOnefield($itemrecord, "borrowernumber", "","holdings");
$itemrecord=XML_writeline($itemrecord, "date_due", "","holdings");
$itemrecord=XML_writeline($itemrecord, "borrowernumber", "","holdings");
}
my ($transfered, $mess, $item) = transferbook($branch, $barcode, 1);
my ($sec,$min,$hour,$mday,$mon,$year) = localtime();
@ -1180,7 +1186,7 @@ sub returnbook {
$mon += 1;
my $timestamp = sprintf("%4d%02d%02d%02d%02d%02d.0",
$year,$mon,$mday,$hour,$min,$sec);
&MARCkoha2marcOnefield($itemrecord, "datelastseen", $timestamp,"holdings");
$itemrecord=XML_writeline($itemrecord, "datelastseen", $timestamp,"holdings");
($borrower) = getpatroninformation(\%env, $currentborrower, 0);
@ -1193,7 +1199,7 @@ sub returnbook {
if ($iteminformation->{'itemlost'}) {
fixaccountforlostandreturned($iteminformation, $borrower);
$messages->{'WasLost'} = 1; # FIXME is the "= 1" right?
&MARCkoha2marcOnefield($itemrecord, "itemlost", "","holdings");
$itemrecord=XML_writeline($itemrecord, "itemlost", "","holdings");
}
####WARNING-- FIXME#########
### The following new script is commented out
@ -1224,7 +1230,7 @@ sub returnbook {
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# fix up the overdues in accounts...
fixoverduesonreturn($borrower->{'borrowernumber'}, $iteminformation->{'itemnumber'});
&MARCkoha2marcOnefield($itemrecord, "itemoverdue", "","holdings");
$itemrecord=XML_writeline($itemrecord, "itemoverdue", "","holdings");
# find reserves.....
my ($resfound, $resrec) = CheckReserves($iteminformation->{'itemnumber'});
if ($resfound) {
@ -1465,19 +1471,16 @@ sub checkoverdues {
my $today = (1900+$datearr[5]).sprintf ("%02d", ($datearr[4]+1)).sprintf ("%02d", $datearr[3]);
my @overdueitems;
my $count = 0;
my $sth = $dbh->prepare("SELECT issues.* , i.biblionumber as biblionumber FROM issues, items i
my $sth = $dbh->prepare("SELECT issues.* , i.biblionumber as biblionumber,b.* FROM issues, items i,biblio b
WHERE i.itemnumber=issues.itemnumber
AND i.biblionumber=b.biblionumber
AND issues.borrowernumber = ?
AND issues.returndate is NULL
AND issues.date_due < ?");
$sth->execute($bornum,$today);
while (my $data = $sth->fetchrow_hashref) {
my ($record)=MARCgetbiblio($dbh,$data->{biblionumber});
my $bibliodata=MARCmarc2koha($dbh,$record,"biblios");
foreach my $field (keys % $data){
$bibliodata->{$field}=$data->{$field};
}
push (@overdueitems, $bibliodata);
push (@overdueitems, $data);
$count++;
}
$sth->finish;
@ -1660,25 +1663,20 @@ sub getissues {
my $todaysdate = (1900+$datearr[5])."-".sprintf ("%0.2d", ($datearr[4]+1))."-".sprintf ("%0.2d", $datearr[3]);
my $counter = 0;
my $select = "SELECT *
FROM issues,items
FROM issues,items,biblio
WHERE issues.borrowernumber = ?
AND issues.itemnumber = items.itemnumber
AND items.biblionumber = biblio.biblionumber
AND issues.returndate IS NULL
ORDER BY issues.date_due";
# print $select;
my $sth=$dbh->prepare($select);
$sth->execute($borrowernumber);
while (my $data = $sth->fetchrow_hashref) {
my ($record)=MARCgetbiblio($dbh,$data->{biblionumber},1);
$bibliodata=MARCmarc2koha($dbh,$record,"biblios");
foreach my $field (keys %$data){
$bibliodata->{$field}=$data->{$field};
while (my $data = $sth->fetchrow_hashref) {
if ($data->{'date_due'} lt $todaysdate) {
$data->{'overdue'} = 1;
}
$bibliodata->{'date_due'} = $data->{'date_due'};
if ($bibliodata->{'date_due'} lt $todaysdate) {
$bibliodata->{'overdue'} = 1;
}
$currentissues{$counter} = $bibliodata;
$currentissues{$counter} = $data;
$counter++;
}
$sth->finish;
@ -1741,12 +1739,14 @@ my $borrower=getpatroninformation($dbh,$bornum,undef);
## faculty members and privileged get renewal whatever the case may be
if ($borrower->{'categorycode'} eq 'F' ||$borrower->{'categorycode'} eq 'P'){
$renewokay = 1;
return $renewokay;
}
}
# FIXME - I think this function could be redone to use only one SQL call.
my $sth1 = $dbh->prepare("select * from issues,items
my $sth1 = $dbh->prepare("select * from issues,items,biblio
where (borrowernumber = ?)
and (issues.itemnumber = ?)
and items.biblionumber=biblio.biblionumber
and returndate is null
and items.itemnumber=issues.itemnumber");
$sth1->execute($bornum,$itemnumber);
@ -1754,11 +1754,8 @@ my $borrower=getpatroninformation($dbh,$bornum,undef);
# Found a matching item
# See if this item may be renewed.
my ($record)=MARCgetbiblio($dbh,$data1->{biblionumber});
my $bibliodata=MARCmarc2koha($dbh,$record,"biblios");
my $sth2 = $dbh->prepare("select renewalsallowed from itemtypes where itemtypes.itemtype=?");
$sth2->execute($bibliodata->{itemtype});
$sth2->execute($data1->{itemtype});
if (my $data2=$sth2->fetchrow_hashref) {
$renews = $data2->{'renewalsallowed'};
}
@ -1766,7 +1763,7 @@ my $borrower=getpatroninformation($dbh,$bornum,undef);
$renewokay= 1;
}else{
if (C4::Context->preference("strictrenewals")){
$renewokay=3 unless $renewokay==1;
$renewokay=3 ;
}
}
$sth2->finish;
@ -1815,9 +1812,8 @@ if (C4::Context->preference("strictrenewals")){
$sth->execute($startdate);
my $difference = $sth->fetchrow;
$sth->finish;
if ($difference < 0) {
$renewokay=2 unless $renewokay==1;
$renewokay=2 ;
}
}##strictrenewals
return($renewokay);
@ -1903,7 +1899,7 @@ if ($datedue eq "" ) {
## Update items and marc record with new date -T.G
my $iteminformation = getiteminformation($env, $itemnumber,0);
&MARCmoditemonefield($dbh,$iteminformation->{'biblionumber'},$iteminformation->{'itemnumber'},'date_due',$datedue);
&XMLmoditemonefield($dbh,$iteminformation->{'biblionumber'},$iteminformation->{'itemnumber'},'date_due',$datedue);
# Log the renewal
UpdateStats($env,$env->{'branchcode'},'renew','','',$itemnumber);
@ -1953,16 +1949,13 @@ sub calc_charges {
my $charge=0;
my $dbh = C4::Context->dbh;
my $item_type;
my $sth= $dbh->prepare("select biblionumber from items where itemnumber=?");
my $sth= $dbh->prepare("select itemtype from biblio,items where items.biblionumber=biblio.biblionumber and itemnumber=?");
$sth->execute($itemnumber);
my $data1=$sth->fetchrow;
my $itemtype=$sth->fetchrow;
$sth->finish;
my ($record)=MARCgetbiblio($dbh,$data1);
my $bibliodata=MARCmarc2koha($dbh,$record,"biblios");
# Get the book's item type and rental charge (via its biblioitem).
my $sth1= $dbh->prepare("select rentalcharge from itemtypes where itemtypes.itemtype=?");
$sth1->execute($bibliodata->{itemtype});
$sth1->execute($itemtype);
$charge = $sth1->fetchrow;
my $q2 = "select rentaldiscount from issuingrules,borrowers
@ -1970,7 +1963,7 @@ sub calc_charges {
and (borrowers.categorycode = issuingrules.categorycode)
and (issuingrules.itemtype = ?)";
my $sth2=$dbh->prepare($q2);
$sth2->execute($bornum,$bibliodata->{itemtype});
$sth2->execute($bornum,$itemtype);
if (my $data2=$sth2->fetchrow_hashref) {
my $discount = $data2->{'rentaldiscount'};
if ($discount eq 'NULL') {
@ -1982,7 +1975,7 @@ sub calc_charges {
$sth2->finish;
$sth1->finish;
return ($charge,$bibliodata->{itemtype});
return ($charge,$itemtype);
}

View file

@ -1,4 +1,4 @@
package C4::Circulation::Fines;
package C4::Circulation::Fines2;
# $Id$
@ -49,7 +49,7 @@ overdue items. It is primarily used by the 'misc/fines2.pl' script.
=cut
@ISA = qw(Exporter);
@EXPORT = qw(&Getoverdues &CalcFine &BorType &UpdateFine &ReplacementCost &GetFine &ReplacementCost2);
@EXPORT = qw(&Getoverdues &CalcFine &BorType &UpdateFine &ReplacementCost);
=item Getoverdues
@ -261,13 +261,11 @@ sub UpdateFine {
} else {
# I think this else-clause deals with the case where we're adding
# a new fine.
my $sth4=$dbh->prepare("select biblio.marc from biblio ,items where items.itemnumber=?
my $sth4=$dbh->prepare("select title from biblio ,items where items.itemnumber=?
and biblio.biblionumber=items.biblionumber");
$sth4->execute($itemnum);
my $marc=$sth4->fetchrow;
my $title=$sth4->fetchrow;
$sth4->finish;
my $record=MARC::File::USMARC::decode($marc,\&func_title);
my $title=$record->title();
# print "not in account";
my $sth3=$dbh->prepare("Select max(accountno) from accountlines");
$sth3->execute;
@ -285,11 +283,7 @@ my $title=$record->title();
$sth->finish;
}
sub func_title {
my ($tagno,$tagdata) = @_;
my ($titlef,$subf)=&MARCfind_marc_from_kohafield("title","biblios");
return ($tagno == $titlef );
}
=item BorType
@ -327,36 +321,12 @@ Returns the replacement cost of the item with the given item number.
sub ReplacementCost{
my ($itemnumber)=@_;
my $dbh = C4::Context->dbh;
my ($itemrecord)=MARCgetitem($dbh,$itemnumber);
my $data=MARCmarc2koha($dbh,$itemrecord,"holdings");
return($data->{'replacementprice'});
}
sub GetFine {
my ( $itemnum, $bornum ) = @_;
my $dbh = C4::Context->dbh();
my $query = "SELECT sum(amountoutstanding) FROM accountlines
where accounttype like 'F%'
AND amountoutstanding > 0 AND itemnumber = ? AND borrowernumber=?";
my $sth = $dbh->prepare($query);
$sth->execute( $itemnum, $bornum );
my $data = $sth->fetchrow_hashref();
$sth->finish();
$dbh->disconnect();
return ( $data->{'sum(amountoutstanding)'} );
my ($itemrecord)=XMLgetitem($dbh,$itemnumber);
$itemrecord=XML_xml2hash_onerecord($itemrecord);
my $replacementprice=XML_readline_onerecord($itemrecord,"replacementprice","holdings");
return($replacementprice);
}
sub ReplacementCost2 {
my ( $itemnum, $bornum ) = @_;
my $dbh = C4::Context->dbh();
my $query = "SELECT amountoutstanding FROM accountlines
where accounttype like 'L' AND amountoutstanding > 0 AND
itemnumber = ? AND borrowernumber= ?";
my $sth = $dbh->prepare($query);
$sth->execute( $itemnum, $bornum );
my $data = $sth->fetchrow_hashref();
$sth->finish();
$dbh->disconnect();
return ( $data->{'amountoutstanding'} );
1;
__END__