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
31 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
34 # set the version for version checking
39 &GetShelves &GetShelfContents &GetShelf
41 &AddToShelf &AddToShelfFromBiblio &AddShelf
45 &DelFromShelf &DelShelf
47 @EXPORT_OK = qw(&GetShelvesSummary);
50 my $dbh = C4::Context->dbh;
54 C4::VirtualShelves - Functions for manipulating Koha virtual virtualshelves
58 use C4::VirtualShelves;
62 This module provides functions for manipulating virtual virtualshelves,
63 including creating and deleting virtualshelves, and adding and removing
64 items to and from virtualshelves.
72 $shelflist = &GetShelves($owner);
73 $shelflist = &GetShelves($owner, $mincategory);
74 $shelflist = &GetShelves($owner, $mincategory, $limit);
75 ($shelfnumber, $shelfhash) = each %{$shelflist};
77 Looks up the virtual virtualshelves, and returns a summary. C<$shelflist>
78 is a reference-to-hash. The keys are the virtualshelves numbers
79 (C<$shelfnumber>, above), and the values (C<$shelfhash>, above) are
80 themselves references-to-hash, with the following keys:
82 C<mincategory> : 2 if the list is for "Public", 3 for "Open".
83 virtualshelves of the owner are always selected, whatever the category
87 =item C<$shelfhash-E<gt>{shelfname}>
89 A string. The name of the shelf.
91 =item C<$shelfhash-E<gt>{count}>
93 The number of virtuals on that virtualshelves.
100 my ($owner, $mincategory, $limit) = @_;
101 ($mincategory and $mincategory =~ /^\d+$/) or $mincategory = 2;
102 ( $limit and $limit =~ /^\d+$/) or $limit = undef;
104 SELECT virtualshelves.shelfnumber, virtualshelves.shelfname,owner,surname,firstname,virtualshelves.category,virtualshelves.sortfield,
105 count(virtualshelfcontents.biblionumber) as count
107 LEFT JOIN virtualshelfcontents ON virtualshelves.shelfnumber = virtualshelfcontents.shelfnumber
108 LEFT JOIN borrowers ON virtualshelves.owner = borrowers.borrowernumber
109 WHERE owner=? OR category>=?
110 GROUP BY virtualshelves.shelfnumber
111 ORDER BY virtualshelves.category, virtualshelves.shelfname, borrowers.firstname, borrowers.surname
113 $limit and $query .= " LIMIT $limit ";
114 my $sth = $dbh->prepare($query);
115 $sth->execute( $owner, $mincategory );
119 $shelfnumber, $shelfname, $owner, $surname,
120 $firstname, $category, $sortfield, $count
125 $shelflist{$shelfnumber}->{'shelfname'} = $shelfname;
126 $shelflist{$shelfnumber}->{'count'} = $count;
127 $shelflist{$shelfnumber}->{'sortfield'} = $sortfield;
128 $shelflist{$shelfnumber}->{'category'} = $category;
129 $shelflist{$shelfnumber}->{'owner'} = $owner;
130 $shelflist{$shelfnumber}->{'surname'} = $surname;
131 $shelflist{$shelfnumber}->{'firstname'} = $firstname;
133 return ( \%shelflist );
136 sub GetShelvesSummary {
137 my ($owner, $mincategory, $limit) = @_;
138 ($mincategory and $mincategory =~ /^\d+$/) or $mincategory = 2;
139 ( $limit and $limit =~ /^\d+$/) or $limit = 10;
142 virtualshelves.shelfnumber,
143 virtualshelves.shelfname,
145 CONCAT(firstname, ' ', surname) AS name,
146 virtualshelves.category,
147 count(virtualshelfcontents.biblionumber) AS count
149 LEFT JOIN virtualshelfcontents ON virtualshelves.shelfnumber = virtualshelfcontents.shelfnumber
150 LEFT JOIN borrowers ON virtualshelves.owner = borrowers.borrowernumber
151 WHERE owner=? OR category>=?
152 GROUP BY virtualshelves.shelfnumber
153 ORDER BY virtualshelves.category, borrowers.surname, borrowers.firstname, virtualshelves.shelfname
156 my $sth = $dbh->prepare($query);
157 $sth->execute($owner,$mincategory,$limit);
159 my $shelves = $sth->fetchall_arrayref({});
160 # add private flag to each shelf entry --
161 # need to do this because HTML::Template::Pro's EXPR
162 # support complains about a non-initialized 'category'
163 # if the user has no shelves -- the offending line in
164 # masthead.inc was <-- TMPL_IF EXPR="category == 1"...
165 foreach my $shelf (@{ $shelves }) {
166 $shelf->{'private'} = ($shelf->{'category'} == 1);
170 # Probably NOT the final implementation since it is still bulky (repeated hash keys).
171 # might like an array of rows of delimited values:
172 # 1|2||0|blacklist|112
173 # 2|6|Josh Ferraro|51|en_fuego|106
178 (shelfnumber,shelfname,owner,category,sortfield) = &GetShelf($shelfnumber);
180 Looks up information about the contents of virtual virtualshelves number
183 Returns the database's information on 'virtualshelves' table.
188 my ($shelfnumber) = @_;
190 SELECT shelfnumber, shelfname, owner, category, sortfield
194 my $sth = $dbh->prepare($query);
195 $sth->execute($shelfnumber);
196 return $sth->fetchrow;
199 =item GetShelfContents
201 $itemlist = &GetShelfContents($shelfnumber);
203 Looks up information about the contents of virtual virtualshelves number
204 C<$shelfnumber>. Sorted by a field in the biblio table. copyrightdate
207 Returns a reference-to-array, whose elements are references-to-hash,
208 as returned by C<C4::Biblio::GetBiblioFromItemNumber>.
210 Note: the notforloan status comes from the itemtype, and where it equals 0
211 it does not ensure that related items.notforloan status is likewise 0. The
212 caller has to check any items on their own, possibly with CanBookBeIssued
213 from C4::Circulation.
217 sub GetShelfContents {
218 my ( $shelfnumber ,$sortfield) = @_;
219 my $dbh=C4::Context->dbh();
221 my $sthsort = $dbh->prepare('SELECT sortfield FROM virtualshelves WHERE shelfnumber=?');
222 $sthsort->execute($shelfnumber);
223 ($sortfield) = $sthsort->fetchrow_array;
226 " SELECT vc.biblionumber, vc.shelfnumber, vc.dateadded,
227 biblio.*, biblioitems.itemtype, itemtypes.*
228 FROM virtualshelfcontents vc
229 LEFT JOIN biblio ON vc.biblionumber = biblio.biblionumber
230 LEFT JOIN biblioitems ON biblio.biblionumber = biblioitems.biblionumber
231 LEFT JOIN itemtypes ON biblioitems.itemtype = itemtypes.itemtype
232 WHERE vc.shelfnumber=? ";
234 $query .= " ORDER BY `$sortfield` ";
235 $query .= " DESC " if ($sortfield eq 'copyrightdate');
237 my $sth = $dbh->prepare($query);
238 $sth->execute($shelfnumber);
239 return $sth->fetchall_arrayref({});
240 # Like the perldoc says,
241 # returns reference-to-array, where each element is reference-to-hash of the row:
242 # like [ $sth->fetchrow_hashref(), $sth->fetchrow_hashref() ... ]
243 # Suitable for use in TMPL_LOOP.
244 # See http://search.cpan.org/~timb/DBI-1.601/DBI.pm#fetchall_arrayref
245 # or newer, for your version of DBI.
250 $shelfnumber = &AddShelf( $shelfname, $owner, $category);
252 Creates a new virtual virtualshelves with name C<$shelfname>, owner C<$owner> and category
255 Returns a code to know what's happen.
256 * -1 : if this virtualshelves already exist.
257 * $shelfnumber : if success.
262 my ( $shelfname, $owner, $category ) = @_;
266 WHERE shelfname=? AND owner=?
268 my $sth = $dbh->prepare($query);
269 $sth->execute($shelfname,$owner);
270 ( $sth->rows ) and return (-1);
272 INSERT INTO virtualshelves
273 (shelfname,owner,category)
276 $sth = $dbh->prepare($query);
277 $sth->execute( $shelfname, $owner, $category );
278 my $shelfnumber = $dbh->{'mysql_insertid'};
279 return ($shelfnumber);
284 &AddToShelf($biblionumber, $shelfnumber);
286 Adds item number C<$biblionumber> to virtual virtualshelves number
287 C<$shelfnumber>, unless that item is already on that shelf.
293 my ( $biblionumber, $shelfnumber ) = @_;
294 return unless $biblionumber;
297 FROM virtualshelfcontents
298 WHERE shelfnumber=? AND biblionumber=?
300 my $sth = $dbh->prepare($query);
302 $sth->execute( $shelfnumber, $biblionumber );
303 ($sth->rows) and return undef; # already on shelf
305 INSERT INTO virtualshelfcontents
306 (shelfnumber, biblionumber, flags)
310 $sth = $dbh->prepare($query);
311 $sth->execute( $shelfnumber, $biblionumber );
314 =item AddToShelfFromBiblio
316 &AddToShelfFromBiblio($biblionumber, $shelfnumber)
318 this function allow to add a virtual into the shelf number $shelfnumber
323 sub AddToShelfFromBiblio {
324 my ( $biblionumber, $shelfnumber ) = @_;
325 return unless $biblionumber;
328 FROM virtualshelfcontents
329 WHERE shelfnumber=? AND biblionumber=?
331 my $sth = $dbh->prepare($query);
332 $sth->execute( $shelfnumber, $biblionumber );
333 unless ( $sth->rows ) {
335 INSERT INTO virtualshelfcontents
336 (shelfnumber, biblionumber, flags)
340 $sth = $dbh->prepare($query);
341 $sth->execute( $shelfnumber, $biblionumber );
347 ModShelf($shelfnumber, $hashref)
349 Where $hashref->{column} = param
351 Modify the value into virtualshelves table with values given
352 from hashref, which each key of the hashref should be
353 the name of a column of virtualshelves.
358 my $shelfnumber = shift;
361 if (exists $shelf->{shelfnumber}) {
362 carp "Should not use ModShelf to change shelfnumber";
365 unless (defined $shelfnumber and $shelfnumber =~ /^\d+$/) {
366 carp "Invalid shelfnumber passed to ModShelf: $shelfnumber";
370 my $query = "UPDATE virtualshelves SET ";
371 my @bind_params = ();
372 my @set_clauses = ();
374 foreach my $column (keys %$shelf) {
375 push @set_clauses, "$column = ?";
376 push @bind_params, $shelf->{$column};
379 if ($#set_clauses == -1) {
380 carp "No columns to update passed to ModShelf";
383 $query .= join(", ", @set_clauses);
385 $query .= " WHERE shelfnumber = ? ";
386 push @bind_params, $shelfnumber;
388 $debug and warn "ModShelf query:\n $query\n",
389 "ModShelf query args: ", join(',', @bind_params), "\n";
390 my $sth = $dbh->prepare($query);
391 $sth->execute( @bind_params );
394 =item ShelfPossibleAction
396 ShelfPossibleAction($loggedinuser, $shelfnumber, $action);
398 C<$loggedinuser,$shelfnumber,$action>
400 $action can be "view" or "manage".
402 Returns 1 if the user can do the $action in the $shelfnumber shelf.
407 sub ShelfPossibleAction {
408 my ( $user, $shelfnumber, $action ) = @_;
410 SELECT owner,category
414 my $sth = $dbh->prepare($query);
415 $sth->execute($shelfnumber);
416 my ( $owner, $category ) = $sth->fetchrow;
417 my $borrower = GetMemberDetails($user);
418 return 1 if ( $category >= 3); # open list
419 return 1 if (($category >= 2) and
420 defined($action) and $action eq 'view'); # public list, anybody can view
421 return 1 if (($category >= 2) and defined($user) and $borrower->{authflags}->{superlibrarian}); # public list, superlibrarian can edit/delete
422 return 1 if (defined($user) and $owner eq $user ); # user owns this list. Check last.
428 &DelFromShelf( $biblionumber, $shelfnumber);
430 Removes item number C<$biblionumber> from virtual virtualshelves number
431 C<$shelfnumber>. If the item wasn't on that virtualshelves to begin with,
438 my ( $biblionumber, $shelfnumber ) = @_;
440 DELETE FROM virtualshelfcontents
441 WHERE shelfnumber=? AND biblionumber=?
443 my $sth = $dbh->prepare($query);
444 $sth->execute( $shelfnumber, $biblionumber );
447 =item DelShelf (old version)
449 ($status, $msg) = &DelShelf($shelfnumber);
451 Deletes virtual virtualshelves number C<$shelfnumber>. The virtualshelves must
454 Returns a two-element array, where C<$status> is 0 if the operation
455 was successful, or non-zero otherwise. C<$msg> is "Done" in case of
456 success, or an error message giving the reason for failure.
458 =item DelShelf (current version)
460 $Number = DelShelf($shelfnumber);
462 This function deletes the shelf number, and all of it's content.
468 carp "DelShelf called without valid argument (shelfnumber)";
471 my $sth = $dbh->prepare("DELETE FROM virtualshelves WHERE shelfnumber=?");
472 return $sth->execute(shift);
483 Koha Developement team <info@koha.org>
487 C4::Circulation::Circ2(3)