[Koha-patches] [PATCH] Adding Some new functions

Henri-Damien LAURENT henridamien.laurent at biblibre.com
Mon Aug 24 22:10:28 CEST 2009


---
 C4/Items.pm |  153 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 136 insertions(+), 17 deletions(-)

diff --git a/C4/Items.pm b/C4/Items.pm
index 3f550ef..4d53d91 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;
 }
 
-- 
1.6.0.4




More information about the Koha-patches mailing list