+# -*- tab-width: 8 -*-
+# Please use 8-character tabs for this file (indents are every 4 characters)
+
package C4::BookShelves;
# $Id$
=cut
@ISA = qw(Exporter);
-@EXPORT = qw(&GetShelfList &GetShelfContents &AddToShelf &RemoveFromShelf &AddShelf &RemoveShelf);
+@EXPORT = qw(&GetShelfList &GetShelfContents &GetShelf
+ &AddToShelf &AddToShelfFromBiblio
+ &RemoveFromShelf &AddShelf &ModifShelf
+ &RemoveShelf &ShelfPossibleAction
+ );
my $dbh = C4::Context->dbh;
+=item ShelfPossibleAction
+
+=over 4
+
+=item C<$loggedinuser,$shelfnumber,$action>
+
+$action can be "view" or "manage".
+
+Returns 1 if the user can do the $action in the $shelfnumber shelf.
+Returns 0 otherwise.
+
+=back
+
+=cut
+sub ShelfPossibleAction {
+ my ($loggedinuser,$shelfnumber,$action)= @_;
+ my $sth = $dbh->prepare("select owner,category from bookshelf where shelfnumber=?");
+ $sth->execute($shelfnumber);
+ my ($owner,$category) = $sth->fetchrow;
+ return 1 if (($category>=3 or $owner eq $loggedinuser) && $action eq 'manage');
+ return 1 if (($category>= 2 or $owner eq $loggedinuser) && $action eq 'view');
+ return 0;
+}
+
=item GetShelfList
$shelflist = &GetShelfList();
# a reference-to-hash? The shelf number can be just another key in the
# hash.
sub GetShelfList {
- # FIXME - These two database queries can be combined into one:
- # SELECT bookshelf.shelfnumber, bookshelf.shelfname,
- # count(shelfcontents.itemnumber)
- # FROM bookshelf
- # LEFT JOIN shelfcontents
- # ON bookshelf.shelfnumber = shelfcontents.shelfnumber
- # GROUP BY bookshelf.shelfnumber
- my $sth=$dbh->prepare("select shelfnumber,shelfname from bookshelf");
- $sth->execute;
+ my ($owner,$mincategory) = @_;
+ # mincategory : 2 if the list is for "look". 3 if the list is for "Select bookshelf for adding a book".
+ # bookshelves of the owner are always selected, whatever the category
+ my $sth=$dbh->prepare("SELECT bookshelf.shelfnumber, bookshelf.shelfname,owner,surname,firstname,category,
+ count(shelfcontents.itemnumber) as count
+ FROM bookshelf
+ LEFT JOIN shelfcontents
+ ON bookshelf.shelfnumber = shelfcontents.shelfnumber
+ left join borrowers on bookshelf.owner = borrowers.borrowernumber
+ where owner=? or category>=?
+ GROUP BY bookshelf.shelfnumber order by shelfname");
+ $sth->execute($owner,$mincategory);
my %shelflist;
- while (my ($shelfnumber, $shelfname) = $sth->fetchrow) {
- my $sti=$dbh->prepare("select count(*) from shelfcontents where shelfnumber=$shelfnumber");
- # FIXME - Should there be an "order by" in here somewhere?
- $sti->execute;
- my ($count) = $sti->fetchrow;
+ while (my ($shelfnumber, $shelfname,$owner,$surname,$firstname,$category,$count) = $sth->fetchrow) {
$shelflist{$shelfnumber}->{'shelfname'}=$shelfname;
$shelflist{$shelfnumber}->{'count'}=$count;
+ $shelflist{$shelfnumber}->{'category'}=$category;
+ $shelflist{$shelfnumber}->{'owner'}=$owner;
+ $shelflist{$shelfnumber}->{surname} = $surname;
+ $shelflist{$shelfnumber}->{firstname} = $firstname;
}
return(\%shelflist);
}
+sub GetShelf {
+ my ($shelfnumber) = @_;
+ my $sth=$dbh->prepare("select shelfnumber,shelfname,owner,category from bookshelf where shelfnumber=?");
+ $sth->execute($shelfnumber);
+ return $sth->fetchrow;
+}
=item GetShelfContents
$itemlist = &GetShelfContents($env, $shelfnumber);
sub GetShelfContents {
my ($env, $shelfnumber) = @_;
my @itemlist;
- my $sth=$dbh->prepare("select itemnumber from shelfcontents where shelfnumber=$shelfnumber order by itemnumber");
- $sth->execute;
+ my $sth=$dbh->prepare("select itemnumber from shelfcontents where shelfnumber=? order by itemnumber");
+ $sth->execute($shelfnumber);
while (my ($itemnumber) = $sth->fetchrow) {
my ($item) = getiteminformation($env, $itemnumber, 0);
push (@itemlist, $item);
}
return (\@itemlist);
- # FIXME - Wouldn't it be more intuitive to return a list,
- # rather than a reference-to-list?
}
=item AddToShelf
=cut
#'
sub AddToShelf {
- my ($env, $itemnumber, $shelfnumber) = @_;
- my $sth=$dbh->prepare("select * from shelfcontents where shelfnumber=$shelfnumber and itemnumber=$itemnumber");
- $sth->execute;
- if ($sth->rows) {
+ my ($env, $itemnumber, $shelfnumber) = @_;
+ return unless $itemnumber;
+ my $sth=$dbh->prepare("select * from shelfcontents where shelfnumber=? and itemnumber=?");
+
+ $sth->execute($shelfnumber, $itemnumber);
+ if ($sth->rows) {
# already on shelf
- } else {
- $sth=$dbh->prepare("insert into shelfcontents (shelfnumber, itemnumber, flags) values ($shelfnumber, $itemnumber, 0)");
- # FIXME - The default for 'flags' is NULL.
- # Why set it to 0?
- $sth->execute;
- }
+ } else {
+ $sth=$dbh->prepare("insert into shelfcontents (shelfnumber, itemnumber, flags) values (?, ?, 0)");
+ $sth->execute($shelfnumber, $itemnumber);
+ }
+}
+sub AddToShelfFromBiblio {
+ my ($env, $biblionumber, $shelfnumber) = @_;
+ return unless $biblionumber;
+ my $sth = $dbh->prepare("select itemnumber from items where biblionumber=?");
+ $sth->execute($biblionumber);
+ my ($itemnumber) = $sth->fetchrow;
+ $sth=$dbh->prepare("select * from shelfcontents where shelfnumber=? and itemnumber=?");
+ $sth->execute($shelfnumber, $itemnumber);
+ if ($sth->rows) {
+# already on shelf
+ } else {
+ $sth=$dbh->prepare("insert into shelfcontents (shelfnumber, itemnumber, flags) values (?, ?, 0)");
+ $sth->execute($shelfnumber, $itemnumber);
+ }
}
=item RemoveFromShelf
#'
sub RemoveFromShelf {
my ($env, $itemnumber, $shelfnumber) = @_;
- my $sth=$dbh->prepare("delete from shelfcontents where shelfnumber=$shelfnumber and itemnumber=$itemnumber");
- $sth->execute;
+ my $sth=$dbh->prepare("delete from shelfcontents where shelfnumber=? and itemnumber=?");
+ $sth->execute($shelfnumber,$itemnumber);
}
=item AddShelf
C<$env> is ignored.
=cut
-#'
-# FIXME - Perhaps this could/should return the number of the new bookshelf
-# as well?
+
sub AddShelf {
- my ($env, $shelfname) = @_;
- my $q_shelfname=$dbh->quote($shelfname);
- my $sth=$dbh->prepare("select * from bookshelf where shelfname=$q_shelfname");
- $sth->execute;
+ my ($env, $shelfname, $owner, $category) = @_;
+ my $sth=$dbh->prepare("select * from bookshelf where shelfname=?");
+ $sth->execute($shelfname);
if ($sth->rows) {
- return(1, "Shelf \"$shelfname\" already exists");
+ return(1, "Shelf \"$shelfname\" already exists");
} else {
- $sth=$dbh->prepare("insert into bookshelf (shelfname) values ($q_shelfname)");
- $sth->execute;
- return (0, "Done");
+ $sth=$dbh->prepare("insert into bookshelf (shelfname,owner,category) values (?,?,?)");
+ $sth->execute($shelfname,$owner,$category);
+ my $shelfnumber = $dbh->{'mysql_insertid'};
+ return (0, "Done",$shelfnumber);
}
}
+sub ModifShelf {
+ my ($shelfnumber, $shelfname, $owner, $category) = @_;
+ my $sth = $dbh->prepare("update bookshelf set shelfname=?,owner=?,category=? where shelfnumber=?");
+ $sth->execute($shelfname,$owner,$category,$shelfnumber);
+}
+
=item RemoveShelf
($status, $msg) = &RemoveShelf($env, $shelfnumber);
#'
sub RemoveShelf {
my ($env, $shelfnumber) = @_;
- my $sth=$dbh->prepare("select count(*) from shelfcontents where shelfnumber=$shelfnumber");
- $sth->execute;
+ my $sth=$dbh->prepare("select count(*) from shelfcontents where shelfnumber=?");
+ $sth->execute($shelfnumber);
my ($count)=$sth->fetchrow;
if ($count) {
return (1, "Shelf has $count items on it. Please remove all items before deleting this shelf.");
} else {
- $sth=$dbh->prepare("delete from bookshelf where shelfnumber=$shelfnumber");
- $sth->execute;
+ $sth=$dbh->prepare("delete from bookshelf where shelfnumber=?");
+ $sth->execute($shelfnumber);
return (0, "Done");
}
}
#
# $Log$
+# Revision 1.15 2004/12/16 11:30:58 tipaul
+# adding bookshelf features :
+# * create bookshelf on the fly
+# * modify a bookshelf name & status
+#
+# Revision 1.14 2004/12/15 17:28:23 tipaul
+# adding bookshelf features :
+# * create bookshelf on the fly
+# * modify a bookshelf (this being not finished, will commit the rest soon)
+#
+# Revision 1.13 2004/03/11 16:06:20 tipaul
+# *** empty log message ***
+#
+# Revision 1.11.2.2 2004/02/19 10:15:41 tipaul
+# new feature : adding book to bookshelf from biblio detail screen.
+#
+# Revision 1.11.2.1 2004/02/06 14:16:55 tipaul
+# fixing bugs in bookshelves management.
+#
+# Revision 1.11 2003/12/15 10:57:08 slef
+# DBI call fix for bug 662
+#
+# Revision 1.10 2003/02/05 10:05:02 acli
+# Converted a few SQL statements to use ? to fix a few strange SQL errors
+# Noted correct tab size
+#
# Revision 1.9 2002/10/13 08:29:18 arensb
# Deleted unused variables.
# Removed trailing whitespace.