2 # Please use 8-character tabs for this file (indents are every 4 characters)
4 package C4::VirtualShelves;
7 # Copyright 2000-2002 Katipo Communications
9 # This file is part of Koha.
11 # Koha is free software; you can redistribute it and/or modify it under the
12 # terms of the GNU General Public License as published by the Free Software
13 # Foundation; either version 2 of the License, or (at your option) any later
16 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
17 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
18 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
20 # You should have received a copy of the GNU General Public License along with
21 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
22 # Suite 330, Boston, MA 02111-1307 USA
28 use vars qw($VERSION @ISA @EXPORT);
30 # set the version for version checking
35 C4::VirtualShelves - Functions for manipulating Koha virtual virtualshelves
39 use C4::VirtualShelves;
43 This module provides functions for manipulating virtual virtualshelves,
44 including creating and deleting virtualshelves, and adding and removing
45 items to and from virtualshelves.
55 &GetShelves &GetShelfContents &GetShelf
57 &AddToShelf &AddToShelfFromBiblio &AddShelf
61 &DelFromShelf &DelShelf
64 my $dbh = C4::Context->dbh;
68 $shelflist = &GetShelves($owner, $mincategory);
69 ($shelfnumber, $shelfhash) = each %{$shelflist};
71 Looks up the virtual virtualshelves, and returns a summary. C<$shelflist>
72 is a reference-to-hash. The keys are the virtualshelves numbers
73 (C<$shelfnumber>, above), and the values (C<$shelfhash>, above) are
74 themselves references-to-hash, with the following keys:
76 C<mincategory> : 2 if the list is for "look". 3 if the list is for "Select virtualshelves for adding a virtual".
77 virtualshelves of the owner are always selected, whatever the category
81 =item C<$shelfhash-E<gt>{shelfname}>
83 A string. The name of the shelf.
85 =item C<$shelfhash-E<gt>{count}>
87 The number of virtuals on that virtualshelves.
94 # FIXME - Wouldn't it be more intuitive to return a list, rather than
95 # a reference-to-hash? The shelf number can be just another key in the
99 my ( $owner, $mincategory ) = @_;
102 SELECT virtualshelves.shelfnumber, virtualshelves.shelfname,owner,surname,firstname,virtualshelves.category,virtualshelves.sortfield,
103 count(virtualshelfcontents.biblionumber) as count
105 LEFT JOIN virtualshelfcontents ON virtualshelves.shelfnumber = virtualshelfcontents.shelfnumber
106 LEFT JOIN borrowers ON virtualshelves.owner = borrowers.borrowernumber
107 WHERE owner=? OR category>=?
108 GROUP BY virtualshelves.shelfnumber
109 ORDER BY virtualshelves.category, virtualshelves.shelfname, borrowers.firstname, borrowers.surname
111 my $sth = $dbh->prepare($query);
112 $sth->execute( $owner, $mincategory );
116 $shelfnumber, $shelfname, $owner, $surname,
117 $firstname, $category, $sortfield, $count
122 $shelflist{$shelfnumber}->{'shelfname'} = $shelfname;
123 $shelflist{$shelfnumber}->{'count'} = $count;
124 $shelflist{$shelfnumber}->{'sortfield'} = $sortfield;
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,sortfield
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
161 C<$shelfnumber>. Sorted by a field in the biblio table. copyrightdate
164 Returns a reference-to-array, whose elements are references-to-hash,
165 as returned by C<C4::Biblio::GetBiblioFromItemNumber>.
170 sub GetShelfContents {
171 my ( $shelfnumber ,$sortfield) = @_;
172 my $dbh=C4::Context->dbh();
174 my $sthsort = $dbh->prepare('select sortfield from virtualshelves where shelfnumber=?');
175 $sthsort->execute($shelfnumber);
176 ($sortfield) = $sthsort->fetchrow_array;
180 " SELECT vc.biblionumber,vc.shelfnumber,biblio.*
181 FROM virtualshelfcontents vc LEFT JOIN biblio on vc.biblionumber=biblio.biblionumber
182 WHERE vc.shelfnumber=? ";
183 my @bind = ($shelfnumber);
185 #$sortfield = $dbh->quote($sortfield);
186 $query .= " ORDER BY `$sortfield`";
187 $query .= "DESC" if($sortfield eq 'copyrightdate');
189 my $sth = $dbh->prepare($query);
190 $sth->execute(@bind);
191 while ( my $item = $sth->fetchrow_hashref ) {
192 push( @itemlist, $item );
194 return ( \@itemlist );
199 $shelfnumber = &AddShelf( $shelfname, $owner, $category);
201 Creates a new virtual virtualshelves with name C<$shelfname>, owner C<$owner> and category
204 Returns a code to know what's happen.
205 * -1 : if this virtualshelves already exist.
206 * $shelfnumber : if success.
211 my ( $shelfname, $owner, $category ) = @_;
215 WHERE shelfname=? AND owner=?
217 my $sth = $dbh->prepare($query);
218 $sth->execute($shelfname,$owner);
224 INSERT INTO virtualshelves
225 (shelfname,owner,category)
228 $sth = $dbh->prepare($query);
229 $sth->execute( $shelfname, $owner, $category );
230 my $shelfnumber = $dbh->{'mysql_insertid'};
231 return ($shelfnumber);
237 &AddToShelf($biblionumber, $shelfnumber);
239 Adds item number C<$biblionumber> to virtual virtualshelves number
240 C<$shelfnumber>, unless that item is already on that shelf.
246 my ( $biblionumber, $shelfnumber ) = @_;
247 return unless $biblionumber;
250 FROM virtualshelfcontents
251 WHERE shelfnumber=? AND biblionumber=?
253 my $sth = $dbh->prepare($query);
255 $sth->execute( $shelfnumber, $biblionumber );
256 unless ( $sth->rows ) {
259 INSERT INTO virtualshelfcontents
260 (shelfnumber, biblionumber, flags)
264 $sth = $dbh->prepare($query);
265 $sth->execute( $shelfnumber, $biblionumber );
269 =item AddToShelfFromBiblio
271 &AddToShelfFromBiblio($biblionumber, $shelfnumber)
273 this function allow to add a virtual into the shelf number $shelfnumber
278 sub AddToShelfFromBiblio {
279 my ( $biblionumber, $shelfnumber ) = @_;
280 return unless $biblionumber;
283 FROM virtualshelfcontents
284 WHERE shelfnumber=? AND biblionumber=?
286 my $sth = $dbh->prepare($query);
287 $sth->execute( $shelfnumber, $biblionumber );
288 unless ( $sth->rows ) {
290 INSERT INTO virtualshelfcontents
291 (shelfnumber, biblionumber, flags)
295 $sth = $dbh->prepare($query);
296 $sth->execute( $shelfnumber, $biblionumber );
302 ModShelf($shelfnumber, $shelfname, $owner, $category )
304 Modify the value into virtualshelves table with values given on input arg.
309 my ( $shelfnumber, $shelfname, $owner, $category, $sortfield ) = @_;
311 UPDATE virtualshelves
312 SET shelfname=?,owner=?,category=?,sortfield=?
315 my $sth = $dbh->prepare($query);
316 $sth->execute( $shelfname, $owner, $category, $sortfield, $shelfnumber );
321 ($status) = &DelShelf($shelfnumber);
323 Deletes virtual virtualshelves number C<$shelfnumber>. The virtualshelves must
326 Returns a two-element array, where C<$status> is 0 if the operation
327 was successful, or non-zero otherwise. C<$msg> is "Done" in case of
328 success, or an error message giving the reason for failure.
333 =item ShelfPossibleAction
335 ShelfPossibleAction($loggedinuser, $shelfnumber, $action);
337 C<$loggedinuser,$shelfnumber,$action>
339 $action can be "view" or "manage".
341 Returns 1 if the user can do the $action in the $shelfnumber shelf.
346 sub ShelfPossibleAction {
347 my ( $user, $shelfnumber, $action ) = @_;
349 SELECT owner,category
353 my $sth = $dbh->prepare($query);
354 $sth->execute($shelfnumber);
355 my ( $owner, $category ) = $sth->fetchrow;
356 return 1 if (($category >= 3 or $owner eq $user) && $action eq 'manage' );
357 return 1 if (($category >= 2 or $owner eq $user) && $action eq 'view' );
363 &DelFromShelf( $biblionumber, $shelfnumber);
365 Removes item number C<$biblionumber> from virtual virtualshelves number
366 C<$shelfnumber>. If the item wasn't on that virtualshelves to begin with,
373 my ( $biblionumber, $shelfnumber ) = @_;
375 DELETE FROM virtualshelfcontents
376 WHERE shelfnumber=? AND biblionumber=?
378 my $sth = $dbh->prepare($query);
379 $sth->execute( $shelfnumber, $biblionumber );
384 $Number = DelShelf($shelfnumber);
386 this function delete the shelf number, and all of it's content
392 my ( $shelfnumber ) = @_;
393 my $sth = $dbh->prepare("DELETE FROM virtualshelves WHERE shelfnumber=?");
394 $sth->execute($shelfnumber);
398 END { } # module clean-up code here (global destructor)
408 Koha Developement team <info@koha.org>
412 C4::Circulation::Circ2(3)