2 # Please use 8-character tabs for this file (indents are every 4 characters)
4 package C4::VirtualShelves;
8 # Copyright 2000-2002 Katipo Communications
10 # This file is part of Koha.
12 # Koha is free software; you can redistribute it and/or modify it under the
13 # terms of the GNU General Public License as published by the Free Software
14 # Foundation; either version 2 of the License, or (at your option) any later
17 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
18 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
19 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
21 # You should have received a copy of the GNU General Public License along with
22 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
23 # Suite 330, Boston, MA 02111-1307 USA
29 use vars qw($VERSION @ISA @EXPORT);
31 # set the version for version checking
32 $VERSION = do { my @v = '$Revision$' =~ /\d+/g; shift(@v) . "." . join( "_", map { sprintf "%03d", $_ } @v ); };
36 C4::VirtualShelves - Functions for manipulating Koha virtual virtualshelves
40 use C4::VirtualShelves;
44 This module provides functions for manipulating virtual virtualshelves,
45 including creating and deleting virtualshelves, and adding and removing
46 items to and from virtualshelves.
56 &GetShelves &GetShelfContents &GetShelf
58 &AddToShelf &AddToShelfFromBiblio &AddShelf
62 &DelFromShelf &DelShelf
65 my $dbh = C4::Context->dbh;
69 $shelflist = &GetShelves($owner, $mincategory);
70 ($shelfnumber, $shelfhash) = each %{$shelflist};
72 Looks up the virtual virtualshelves, and returns a summary. C<$shelflist>
73 is a reference-to-hash. The keys are the virtualshelves numbers
74 (C<$shelfnumber>, above), and the values (C<$shelfhash>, above) are
75 themselves references-to-hash, with the following keys:
77 C<mincategory> : 2 if the list is for "look". 3 if the list is for "Select virtualshelves for adding a virtual".
78 virtualshelves of the owner are always selected, whatever the category
82 =item C<$shelfhash-E<gt>{shelfname}>
84 A string. The name of the shelf.
86 =item C<$shelfhash-E<gt>{count}>
88 The number of virtuals on that virtualshelves.
95 # FIXME - Wouldn't it be more intuitive to return a list, rather than
96 # a reference-to-hash? The shelf number can be just another key in the
100 my ( $owner, $mincategory ) = @_;
103 SELECT virtualshelves.shelfnumber, virtualshelves.shelfname,owner,surname,firstname,virtualshelves.category,
104 count(virtualshelfcontents.biblionumber) as count
106 LEFT JOIN virtualshelfcontents ON virtualshelves.shelfnumber = virtualshelfcontents.shelfnumber
107 LEFT JOIN borrowers ON virtualshelves.owner = borrowers.borrowernumber
108 WHERE owner=? OR category>=?
109 GROUP BY virtualshelves.shelfnumber
110 ORDER BY virtualshelves.category, virtualshelves.shelfname, borrowers.firstname, borrowers.surname
112 my $sth = $dbh->prepare($query);
113 $sth->execute( $owner, $mincategory );
117 $shelfnumber, $shelfname, $owner, $surname,
118 $firstname, $category, $count
123 $shelflist{$shelfnumber}->{'shelfname'} = $shelfname;
124 $shelflist{$shelfnumber}->{'count'} = $count;
125 $shelflist{$shelfnumber}->{'category'} = $category;
126 $shelflist{$shelfnumber}->{'owner'} = $owner;
127 $shelflist{$shelfnumber}->{'surname'} = $surname;
128 $shelflist{$shelfnumber}->{'firstname'} = $firstname;
130 return ( \%shelflist );
135 (shelfnumber,shelfname,owner,category) = &GetShelf($shelfnumber);
137 Looks up information about the contents of virtual virtualshelves number
140 Returns the database's information on 'virtualshelves' table.
145 my ($shelfnumber) = @_;
147 SELECT shelfnumber,shelfname,owner,category
151 my $sth = $dbh->prepare($query);
152 $sth->execute($shelfnumber);
153 return $sth->fetchrow;
156 =item GetShelfContents
158 $itemlist = &GetShelfContents($shelfnumber);
160 Looks up information about the contents of virtual virtualshelves number
163 Returns a reference-to-array, whose elements are references-to-hash,
164 as returned by C<C4::Biblio::GetBiblioFromItemNumber>.
169 sub GetShelfContents {
170 my ( $shelfnumber ) = @_;
173 " SELECT biblionumber
174 FROM virtualshelfcontents
176 ORDER BY biblionumber
178 my $sth = $dbh->prepare($query);
179 $sth->execute($shelfnumber);
180 my $sth2 = $dbh->prepare("
181 SELECT biblio.*,biblioitems.* FROM biblio
182 LEFT JOIN biblioitems on biblio.biblionumber=biblioitems.biblionumber
183 WHERE biblio.biblionumber=?"
185 while ( my ($biblionumber) = $sth->fetchrow ) {
186 $sth2->execute($biblionumber);
187 my $item = $sth2->fetchrow_hashref;
188 $item->{'biblionumber'}=$biblionumber;
189 push( @itemlist, $item );
191 return ( \@itemlist );
196 $shelfnumber = &AddShelf( $shelfname, $owner, $category);
198 Creates a new virtual virtualshelves with name C<$shelfname>, owner C<$owner> and category
201 Returns a code to know what's happen.
202 * -1 : if this virtualshelves already exist.
203 * $shelfnumber : if success.
208 my ( $shelfname, $owner, $category ) = @_;
212 WHERE shelfname=? AND owner=?
214 my $sth = $dbh->prepare($query);
215 $sth->execute($shelfname,$owner);
221 INSERT INTO virtualshelves
222 (shelfname,owner,category)
225 $sth = $dbh->prepare($query);
226 $sth->execute( $shelfname, $owner, $category );
227 my $shelfnumber = $dbh->{'mysql_insertid'};
228 return ($shelfnumber);
234 &AddToShelf($biblionumber, $shelfnumber);
236 Adds item number C<$biblionumber> to virtual virtualshelves number
237 C<$shelfnumber>, unless that item is already on that shelf.
243 my ( $biblionumber, $shelfnumber ) = @_;
244 return unless $biblionumber;
247 FROM virtualshelfcontents
248 WHERE shelfnumber=? AND biblionumber=?
250 my $sth = $dbh->prepare($query);
252 $sth->execute( $shelfnumber, $biblionumber );
253 unless ( $sth->rows ) {
256 INSERT INTO virtualshelfcontents
257 (shelfnumber, biblionumber, flags)
261 $sth = $dbh->prepare($query);
262 $sth->execute( $shelfnumber, $biblionumber );
266 =item AddToShelfFromBiblio
268 &AddToShelfFromBiblio($biblionumber, $shelfnumber)
270 this function allow to add a virtual into the shelf number $shelfnumber
275 sub AddToShelfFromBiblio {
276 my ( $biblionumber, $shelfnumber ) = @_;
277 return unless $biblionumber;
280 FROM virtualshelfcontents
281 WHERE shelfnumber=? AND biblionumber=?
283 my $sth = $dbh->prepare($query);
284 $sth->execute( $shelfnumber, $biblionumber );
285 unless ( $sth->rows ) {
287 INSERT INTO virtualshelfcontents
288 (shelfnumber, biblionumber, flags)
292 $sth = $dbh->prepare($query);
293 $sth->execute( $shelfnumber, $biblionumber );
299 ModShelf($shelfnumber, $shelfname, $owner, $category )
301 Modify the value into virtualshelves table with values given on input arg.
306 my ( $shelfnumber, $shelfname, $owner, $category ) = @_;
308 UPDATE virtualshelves
309 SET shelfname=?,owner=?,category=?
312 my $sth = $dbh->prepare($query);
313 $sth->execute( $shelfname, $owner, $category, $shelfnumber );
318 ($status) = &DelShelf($shelfnumber);
320 Deletes virtual virtualshelves number C<$shelfnumber>. The virtualshelves must
323 Returns a two-element array, where C<$status> is 0 if the operation
324 was successful, or non-zero otherwise. C<$msg> is "Done" in case of
325 success, or an error message giving the reason for failure.
330 =item ShelfPossibleAction
332 ShelfPossibleAction($loggedinuser, $shelfnumber, $action);
334 C<$loggedinuser,$shelfnumber,$action>
336 $action can be "view" or "manage".
338 Returns 1 if the user can do the $action in the $shelfnumber shelf.
343 sub ShelfPossibleAction {
344 my ( $user, $shelfnumber, $action ) = @_;
346 SELECT owner,category
350 my $sth = $dbh->prepare($query);
351 $sth->execute($shelfnumber);
352 my ( $owner, $category ) = $sth->fetchrow;
353 return 1 if (($category >= 3 or $owner eq $user) && $action eq 'manage' );
354 return 1 if (($category >= 2 or $owner eq $user) && $action eq 'view' );
360 &DelFromShelf( $biblionumber, $shelfnumber);
362 Removes item number C<$biblionumber> from virtual virtualshelves number
363 C<$shelfnumber>. If the item wasn't on that virtualshelves to begin with,
370 my ( $biblionumber, $shelfnumber ) = @_;
372 DELETE FROM virtualshelfcontents
373 WHERE shelfnumber=? AND biblionumber=?
375 my $sth = $dbh->prepare($query);
376 $sth->execute( $shelfnumber, $biblionumber );
381 $Number = DelShelf($shelfnumber);
383 this function delete the shelf number, and all of it's content
389 my ( $shelfnumber ) = @_;
390 my $sth = $dbh->prepare("DELETE FROM virtualshelves WHERE shelfnumber=?");
391 $sth->execute($shelfnumber);
395 END { } # module clean-up code here (global destructor)
405 Koha Developement team <info@koha.org>
409 C4::Circulation::Circ2(3)