Template for 141a field plugin
[koha.git] / C4 / BookShelves.pm
index d545ee2..381dacb 100755 (executable)
@@ -53,10 +53,38 @@ items to and from bookshelves.
 =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();
@@ -85,27 +113,36 @@ The number of books on that bookshelf.
 # 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=?");
-               # FIXME - Should there be an "order by" in here somewhere?
-       $sti->execute($shelfnumber);
-       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);
@@ -144,21 +181,32 @@ C<$env> is ignored.
 =cut
 #'
 sub AddToShelf {
-    my ($env, $itemnumber, $shelfnumber) = @_;
-    my $sth=$dbh->prepare("select * from shelfcontents
-       where shelfnumber=? and itemnumber=?");
+       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) {
+       $sth->execute($shelfnumber, $itemnumber);
+       if ($sth->rows) {
 # already on shelf
-    } else {
-       $sth=$dbh->prepare("insert into shelfcontents
-               (shelfnumber, itemnumber, flags) values (?, ?, 0)");
-
-                       # FIXME - The default for 'flags' is NULL.
-                       # Why set it to 0?
+       } 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
@@ -192,22 +240,27 @@ success, or an error message giving the reason for failure.
 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 ($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 (?)");
-       $sth->execute($shelfname);
-       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);
@@ -243,6 +296,25 @@ END { }       # module clean-up code here (global destructor)
 
 #
 # $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
 #