diff --git a/C4/Items.pm b/C4/Items.pm index 3f550ef4f5..4d53d91512 100644 --- a/C4/Items.pm +++ b/C4/Items.pm @@ -64,6 +64,9 @@ BEGIN { get_itemnumbers_of GetItemnumberFromBarcode + DelItemCheck + MoveItemFromBiblio + GetLatestAcquisitions CartToShelf ); } @@ -800,7 +803,6 @@ sub GetItemStatus { while ( my ( $authorisedvalue, $lib ) = $authvalsth->fetchrow ) { $itemstatus{$authorisedvalue} = $lib; } - $authvalsth->finish; return \%itemstatus; exit 1; } @@ -809,7 +811,6 @@ sub GetItemStatus { #No authvalue list # build default } - $sth->finish; } #No authvalue list @@ -900,7 +901,6 @@ sub GetItemLocation { while ( my ( $authorisedvalue, $lib ) = $authvalsth->fetchrow ) { $itemlocation{$authorisedvalue} = $lib; } - $authvalsth->finish; return \%itemlocation; exit 1; } @@ -909,7 +909,6 @@ sub GetItemLocation { #No authvalue list # build default } - $sth->finish; } #No authvalue list @@ -997,7 +996,7 @@ sub GetLostItems { =over 4 -$itemlist = GetItemsForInventory($minlocation, $maxlocation, $location, $itemtype $datelastseen, $branch, $offset, $size); +$itemlist = GetItemsForInventory($minlocation, $maxlocation, $location, $itemtype $datelastseen, $branch, $offset, $size, $statushash); =back @@ -1010,11 +1009,12 @@ seen. It is ordered by callnumber then title. The required minlocation & maxlocation parameters are used to specify a range of item callnumbers the datelastseen can be used to specify that you want to see items not seen since a past date only. offset & size can be used to retrieve only a part of the whole listing (defaut behaviour) +$statushash requires a hashref that has the authorized values fieldname (intems.notforloan, etc...) as keys, and an arrayref of statuscodes we are searching for as values. =cut sub GetItemsForInventory { - my ( $minlocation, $maxlocation,$location, $itemtype, $ignoreissued, $datelastseen, $branch, $offset, $size ) = @_; + my ( $minlocation, $maxlocation,$location, $itemtype, $ignoreissued, $datelastseen, $branch, $offset, $size, $statushash ) = @_; my $dbh = C4::Context->dbh; my ( @bind_params, @where_strings ); @@ -1024,6 +1024,14 @@ FROM items LEFT JOIN biblio ON items.biblionumber = biblio.biblionumber LEFT JOIN biblioitems on items.biblionumber = biblioitems.biblionumber END_SQL + if ($statushash){ + for my $authvfield (keys %$statushash){ + if ( scalar @{$statushash->{$authvfield}} > 0 ){ + my $joinedvals = join ',', @{$statushash->{$authvfield}}; + push @where_strings, "$authvfield in (" . $joinedvals . ")"; + } + } + } if ($minlocation) { push @where_strings, 'itemcallnumber >= ?'; @@ -1102,7 +1110,6 @@ sub GetItemsCount { my $sth = $dbh->prepare($query); $sth->execute($biblionumber); my $count = $sth->fetchrow; - $sth->finish; return ($count); } @@ -1165,7 +1172,6 @@ sub GetItemsByBiblioitemnumber { # set date_due to blank, so in the template we check itemlost, and wthdrawn $data->{'date_due'} = ''; } # else - $sth2->finish; # Find the last 3 people who borrowed this item. my $query2 = "SELECT * FROM old_issues, borrowers WHERE itemnumber = ? AND old_issues.borrowernumber = borrowers.borrowernumber @@ -1179,10 +1185,8 @@ sub GetItemsByBiblioitemnumber { $data->{"borrower$i2"} = $data2->{'borrowernumber'}; $i2++; } - $sth2->finish; push(@results,$data); } - $sth->finish; return (\@results); } @@ -1304,8 +1308,6 @@ sub GetItemsInfo { # value. $count_reserves = $restype; } - $isth->finish; - $ssth->finish; #get branch information..... my $bsth = $dbh->prepare( "SELECT * FROM branches WHERE branchcode = ? @@ -1388,6 +1390,60 @@ sub GetItemsInfo { } } +=head2 GetLastAcquisitions + +=over 4 + +my $lastacq = GetLastAcquisitions({'branches' => ('branch1','branch2'), 'itemtypes' => ('BK','BD')}, 10); + +=back + +=cut + +sub GetLastAcquisitions { + my ($data,$max) = @_; + + my $itemtype = C4::Context->preference('item-level_itypes') ? 'itype' : 'itemtype'; + + my $number_of_branches = @{$data->{branches}}; + my $number_of_itemtypes = @{$data->{itemtypes}}; + + + my @where = ('WHERE 1 '); + $number_of_branches and push @where + , 'AND holdingbranch IN (' + , join(',', ('?') x $number_of_branches ) + , ')' + ; + + $number_of_itemtypes and push @where + , "AND $itemtype IN (" + , join(',', ('?') x $number_of_itemtypes ) + , ')' + ; + + my $query = "SELECT biblio.biblionumber as biblionumber, title, dateaccessioned + FROM items RIGHT JOIN biblio ON (items.biblionumber=biblio.biblionumber) + RIGHT JOIN biblioitems ON (items.biblioitemnumber=biblioitems.biblioitemnumber) + @where + GROUP BY biblio.biblionumber + ORDER BY dateaccessioned DESC LIMIT $max"; + + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare($query); + + $sth->execute((@{$data->{branches}}, @{$data->{itemtypes}})); + + my @results; + while( my $row = $sth->fetchrow_hashref){ + push @results, {date => $row->{dateaccessioned} + , biblionumber => $row->{biblionumber} + , title => $row->{title}}; + } + + return @results; +} + =head2 get_itemnumbers_of =over 4 @@ -1946,10 +2002,77 @@ sub _koha_new_item { if ( defined $sth->errstr ) { $error.="ERROR in _koha_new_item $query".$sth->errstr; } - $sth->finish(); return ( $itemnumber, $error ); } +=head2 MoveItemFromBiblio + +=over 4 + +MoveItemFromBiblio($itenumber, $frombiblio, $tobiblio); + +=back + +Moves an item from a biblio to another + +=cut +sub MoveItemFromBiblio { + my ($itemnumber, $frombiblio, $tobiblio) = @_; + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare("UPDATE items SET biblioitemnumber = ?, biblionumber = ? WHERE itemnumber = ? AND biblionumber = ?"); + my $return = $sth->execute($tobiblio, $tobiblio, $itemnumber, $frombiblio); + if ($return == 1) { + my $record = GetMarcBiblio($frombiblio); + my $frameworkcode = GetFrameworkCode($frombiblio); + ModBiblioMarc($record, $frombiblio, $frameworkcode); + + $record = GetMarcBiblio($tobiblio); + $frameworkcode = GetFrameworkCode($frombiblio); + ModBiblioMarc($record, $tobiblio, $frameworkcode); + } else { + return -1; + } +} + +=head2 DelItemCheck + +=over 4 + +DelItemCheck($dbh, $biblionumber, $itemnumber); + +=back + +Exported function (core API) for deleting an item record in Koha if there no current issue. + +=cut + +sub DelItemCheck { + my ( $dbh, $biblionumber, $itemnumber ) = @_; + my $error; + + # check that there is no issue on this item before deletion. + my $sth=$dbh->prepare("select * from issues i where i.itemnumber=?"); + $sth->execute($itemnumber); + + my $onloan=$sth->fetchrow; + + if ($onloan){ + $error = "book_on_loan" + }else{ + # check it doesnt have a waiting reserve + $sth=$dbh->prepare("SELECT * FROM reserves WHERE found = 'W' AND itemnumber = ?"); + $sth->execute($itemnumber); + my $reserve=$sth->fetchrow; + if ($reserve){ + $error = "book_reserved"; + }else{ + DelItem($dbh, $biblionumber, $itemnumber); + return 1; + } + } + return $error; +} + =head2 _koha_modify_item =over 4 @@ -1983,7 +2106,6 @@ sub _koha_modify_item { $error.="ERROR in _koha_modify_item $query".$dbh->errstr; warn $error; } - $sth->finish(); return ($item->{'itemnumber'},$error); } @@ -2006,7 +2128,6 @@ sub _koha_delete_item { my $sth = $dbh->prepare("SELECT * FROM items WHERE itemnumber=?"); $sth->execute($itemnum); my $data = $sth->fetchrow_hashref(); - $sth->finish(); my $query = "INSERT INTO deleteditems SET "; my @bind = (); foreach my $key ( keys %$data ) { @@ -2016,12 +2137,10 @@ sub _koha_delete_item { $query =~ s/\,$//; $sth = $dbh->prepare($query); $sth->execute(@bind); - $sth->finish(); # delete from items table $sth = $dbh->prepare("DELETE FROM items WHERE itemnumber=?"); $sth->execute($itemnum); - $sth->finish(); return undef; }