Bug 3150: (follow-up) Make sure host information displays for unlinked records
[koha-ffzg.git] / virtualshelves / addbybiblionumber.pl
index 1dbffbb..ff0ef50 100755 (executable)
@@ -1,29 +1,27 @@
 #!/usr/bin/perl
 
 #!/usr/bin/perl
 
-#script to provide virtual shelf management
-#
-#
 # Copyright 2000-2002 Katipo Communications
 # Copyright 2000-2002 Katipo Communications
+# Copyright 2016 Koha Development Team
 #
 # This file is part of Koha.
 #
 #
 # This file is part of Koha.
 #
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any later
-# version.
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
 #
 #
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
 #
 #
-# You should have received a copy of the GNU General Public License along
-# with Koha; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
 
 
 =head1 NAME
 
 
 
 =head1 NAME
 
-    addbybiblionumber.pl
+addbybiblionumber.pl
 
 =head1 DESCRIPTION
 
 
 =head1 DESCRIPTION
 
@@ -46,9 +44,9 @@
     if this parameter exists, then it must be equals to the name of the shelf
     to add.
 
     if this parameter exists, then it must be equals to the name of the shelf
     to add.
 
-=item category
+=item public
 
 
-    if this script has to add a shelf, it add one with this category.
+    if this script has to add a shelf, it adds one with this 'public' setting.
 
 =item newshelf
 
 
 =item newshelf
 
 
 =cut
 
 
 =cut
 
-use strict;
-#use warnings; FIXME - Bug 2505
-use C4::Biblio;
-use CGI;
-use C4::Output;
-use C4::VirtualShelves qw/:DEFAULT GetRecentShelves/;
-use C4::Circulation;
-use C4::Auth;
-
-# splits incoming biblionumber(s) to array and adds each to shelf.
-sub AddBibliosToShelf {
-    my ($shelfnumber,@biblionumber)=@_;
-
-    # multiple bibs might come in as '/' delimited string (from where, i don't see), or as array.
-    # (Note : they come in as '/' when added from the cart)
-    if (scalar(@biblionumber) == 1) {
-        @biblionumber = (split /\//,$biblionumber[0]);
-    }
-    for my $bib (@biblionumber){
-        AddToShelf($bib, $shelfnumber);
-    }
-}
-
-my $query           = new CGI;
+use Modern::Perl;
 
 
-# If set, then single item case.
-my $biblionumber    = $query->param('biblionumber');
+use CGI qw ( -utf8 );
+use C4::Output qw( output_html_with_http_headers );
+use C4::Auth qw( get_template_and_user );
 
 
-# If set, then multiple item case.
-my @biblionumber   = $query->param('biblionumber');
-my $biblionumbers   = $query->param('biblionumbers');
+use Koha::Biblios;
+use Koha::Virtualshelves;
 
 
+my $query           = CGI->new;
 my $shelfnumber     = $query->param('shelfnumber');
 my $newvirtualshelf = $query->param('newvirtualshelf');
 my $newshelf        = $query->param('newshelf');
 my $shelfnumber     = $query->param('shelfnumber');
 my $newvirtualshelf = $query->param('newvirtualshelf');
 my $newshelf        = $query->param('newshelf');
-my $category        = $query->param('category');
-my $sortfield      = $query->param('sortfield');
+my $public          = $query->param('public');
+my $sortfield       = $query->param('sortfield');
 my $confirmed       = $query->param('confirmed') || 0;
 my $confirmed       = $query->param('confirmed') || 0;
-
+my ( $errcode, $authorized ) = ( 0, 1 );
+my @biblionumbers = $query->multi_param('biblionumber');
+
+if ( @biblionumbers == 0 && $query->param('biblionumbers') ) {
+    my $str = $query->param('biblionumbers');
+    @biblionumbers = split '/', $str;
+} elsif ( @biblionumbers == 1 && $biblionumbers[0] =~ /\// ) {
+    @biblionumbers = split '/', $biblionumbers[0];
+}
 
 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
 
 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
-    {
-        template_name   => "virtualshelves/addbybiblionumber.tmpl",
+    {   template_name   => "virtualshelves/addbybiblionumber.tt",
         query           => $query,
         type            => "intranet",
         query           => $query,
         type            => "intranet",
-        authnotrequired => 0,
         flagsrequired   => { catalogue => 1 },
     }
 );
 
         flagsrequired   => { catalogue => 1 },
     }
 );
 
-my @biblionumbers;
-if ($biblionumbers) {
-    @biblionumbers = split '/', $biblionumbers;
-} else {
-    @biblionumbers = (@biblionumber);
-}
-if (scalar(@biblionumber) == 1) {
-        @biblionumber = (split /\//,$biblionumber[0]);
-}
-
-$shelfnumber = AddShelf( $newvirtualshelf, $loggedinuser, $category, $sortfield ) if $newvirtualshelf;
-if ( $shelfnumber || ( $shelfnumber == -1 ) ) {    # the shelf already exist.
-
-    if ($confirmed == 1) {
-       AddBibliosToShelf($shelfnumber,@biblionumber);
-       print
-    "Content-Type: text/html\n\n<html><body onload=\"window.opener.location.reload(true);window.close()\"></body></html>";
-       exit;
+if ($newvirtualshelf) {
+    my $shelf = eval {
+        Koha::Virtualshelf->new(
+            {
+                shelfname => $newvirtualshelf,
+                public    => $public,
+                sortfield => $sortfield,
+                owner     => $loggedinuser,
+            }
+        )->store;
+    };
+    if ( $@ or not $shelf ) {
+        $errcode    = 1;
+        $authorized = 0;
     } else {
     } else {
-       my ( $singleshelf, $singleshelfname, $singlecategory ) = GetShelf( $query->param('shelfnumber') );
-       my @biblios;
-        for my $bib (@biblionumber) {
-           my $data = GetBiblioData( $bib );
-            push(@biblios,
-                        { biblionumber => $bib,
-                          title        => $data->{'title'},
-                          author       => $data->{'author'},
-                        } );
+
+        for my $biblionumber (@biblionumbers) {
+            $shelf->add_biblio( $biblionumber, $loggedinuser );
         }
 
         }
 
-               $template->param
-        (
-         biblionumber => \@biblionumber,
-         biblios      => \@biblios,
-         multiple     => (scalar(@biblionumber) > 1),
-         singleshelf  => 1,
-         shelfname    => $singleshelfname,
-         shelfnumber  => $singleshelf,
-         total        => scalar(@biblionumber),
-         confirm      => 1,
-        );
+        #Reload the page where you came from
+        print $query->header;
+        print "<html><meta http-equiv=\"refresh\" content=\"0\" /><body onload=\"window.opener.location.reload(true);self.close();\"></body></html>";
+        exit;
     }
     }
-}
-else {    # this shelf doesn't already exist.
-#    my $limit = 10;
-    my ($shelflist);
-    my @shelvesloop;
-    my %shelvesloop;
-
-    #grab each type of shelf, open (type 3) should not be limited by user.
-    foreach my $shelftype (1,2,3) {
-           my ($shelflist) = GetRecentShelves($shelftype, undef, $shelftype == 3 ? undef : $loggedinuser);
-           for my $shelf (@{ $shelflist }) {
-                   push(@shelvesloop, $shelf->{shelfnumber});
-                   $shelvesloop{$shelf->{shelfnumber}} = $shelf->{shelfname};
-           }
+
+} elsif ( $shelfnumber && $confirmed ) {
+    my $shelf = Koha::Virtualshelves->find($shelfnumber);
+    if ( $shelf->can_biblios_be_added($loggedinuser) ) {
+        for my $biblionumber (@biblionumbers) {
+            $shelf->add_biblio( $biblionumber, $loggedinuser );
+        }
+
+        #Close this page and return
+        print $query->header;
+        print "<html><meta http-equiv=\"refresh\" content=\"0\" /><body onload=\"self.close();\"></body></html>";
+        exit;
+    } else {
+        $errcode    = 2;    #no perm
+        $authorized = 0;
     }
 
     }
 
-    if( @shelvesloop ){
-        my $CGIvirtualshelves = CGI::scrolling_list
-          (
-           -name     => 'shelfnumber',
-           -values   => \@shelvesloop,
-           -labels   => \%shelvesloop,
-           -size     => 1,
-           -tabindex => '',
-           -multiple => 0
-          );
-        $template->param
-          (
-           CGIvirtualshelves => $CGIvirtualshelves,
-          );
+} elsif ($shelfnumber) {    #still needs confirmation
+    my $shelf = Koha::Virtualshelves->find($shelfnumber);
+    if ( $shelf->can_biblios_be_added($loggedinuser) ) {
+
+        #confirm adding to specific shelf
+        $template->param(
+            singleshelf => 1,
+            shelfnumber => $shelf->shelfnumber,
+            shelfname   => $shelf->shelfname,
+        );
+    } else {
+        $authorized = 0;
+        $errcode    = 2;    #no perm
     }
     }
-       my @biblios;
-        for my $bib (@biblionumber) {
-           my $data = GetBiblioData( $bib );
-            push(@biblios,
-                        { biblionumber => $bib,
-                          title        => $data->{'title'},
-                          author       => $data->{'author'},
-                        } );
-        }
+
+} else {
+    my $private_shelves = Koha::Virtualshelves->search(
+        {   public                  => 0,
+            owner                   => $loggedinuser,
+            allow_change_from_owner => 1,
+        },
+        { order_by => 'shelfname' }
+    );
+    my $shelves_shared_with_me = Koha::Virtualshelves->search(
+        {   public                              => 0,
+            'virtualshelfshares.borrowernumber' => $loggedinuser,
+            allow_change_from_others            => 1,
+        },
+        { join => 'virtualshelfshares', }
+    );
+    my $public_shelves = Koha::Virtualshelves->search(
+        {   public   => 1,
+            -or      => [
+                -and => {
+                    allow_change_from_owner => 1,
+                    owner     => $loggedinuser,
+                },
+                allow_change_from_others => 1,
+            ],
+        },
+        { order_by => 'shelfname' }
+    );
     $template->param(
     $template->param(
-           newshelf     => $newshelf,
-          biblios=>\@biblios,
-           multiple     => (scalar(@biblionumber) > 1),
-           total        => scalar(@biblionumber),
+        private_shelves                => $private_shelves,
+        private_shelves_shared_with_me => $shelves_shared_with_me,
+        public_shelves                 => $public_shelves,
     );
 
     );
 
-    unless (@biblionumbers) {
-        my ( $bibliocount, @biblios ) = GetBiblio($biblionumber);
-    
-        $template->param
-          (
-           biblionumber      => $biblionumber,
-           title             => $biblios[0]->{'title'},
-           author            => $biblios[0]->{'author'},
-          );
-    } else {
-        my @biblioloop = ();
-        foreach my $biblionumber (@biblionumbers) {
-            my ( $bibliocount, @biblios ) = GetBiblio($biblionumber);
-            my %biblioiter = (
-                              title=>$biblios[0]->{'title'},
-                              author=>$biblios[0]->{'author'}
-                             );
-            push @biblioloop, \%biblioiter;
+}
+
+my @biblios;
+for my $biblionumber (@biblionumbers) {
+    my $biblio = Koha::Biblios->find( $biblionumber );
+    push(
+        @biblios,
+        {   biblionumber => $biblionumber,
+            title        => $biblio->title,
+            author       => $biblio->author,
         }
         }
-        $template->param
-          (
-           biblioloop => \@biblioloop,
-           biblionumbers => $biblionumbers
-          );
-    }
-    
+    );
 }
 }
+$template->param(
+    multiple => ( scalar(@biblios) > 1 ),
+    total    => scalar @biblios,
+    biblios  => \@biblios,
+);
+
+$template->param(
+    newshelf => $newshelf || 0,
+    authorized => $authorized,
+    errcode    => $errcode,
+);
 output_html_with_http_headers $query, $cookie, $template->output;
 output_html_with_http_headers $query, $cookie, $template->output;