Bug 3150: (follow-up) Make sure host information displays for unlinked records
[koha-ffzg.git] / virtualshelves / addbybiblionumber.pl
index 5fd82b3..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;
+use Modern::Perl;
 
 
-use CGI;
-use C4::Biblio;
-use C4::Output;
-use C4::VirtualShelves qw/:DEFAULT GetAllShelves/;
-use C4::Auth;
+use CGI qw ( -utf8 );
+use C4::Output qw( output_html_with_http_headers );
+use C4::Auth qw( get_template_and_user );
 
 
+use Koha::Biblios;
+use Koha::Virtualshelves;
 
 
-our $query           = new CGI;
-our @biblionumber    = HandleBiblioPars();
-our $shelfnumber     = $query->param('shelfnumber');
-our $newvirtualshelf = $query->param('newvirtualshelf');
-our $newshelf        = $query->param('newshelf');
-our $category        = $query->param('category');
-our $sortfield     = $query->param('sortfield');
+my $query           = CGI->new;
+my $shelfnumber     = $query->param('shelfnumber');
+my $newvirtualshelf = $query->param('newvirtualshelf');
+my $newshelf        = $query->param('newshelf');
+my $public          = $query->param('public');
+my $sortfield       = $query->param('sortfield');
 my $confirmed       = $query->param('confirmed') || 0;
 my $confirmed       = $query->param('confirmed') || 0;
-our $authorized      = 1;
-our $errcode       = 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];
+}
 
 
-our ( $template, $loggedinuser, $cookie ) = get_template_and_user(
-    {
-        template_name   => "virtualshelves/addbybiblionumber.tmpl",
+my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
+    {   template_name   => "virtualshelves/addbybiblionumber.tt",
         query           => $query,
         type            => "intranet",
         query           => $query,
         type            => "intranet",
-        authnotrequired => 0,
         flagsrequired   => { catalogue => 1 },
     }
 );
 
         flagsrequired   => { catalogue => 1 },
     }
 );
 
-if( $newvirtualshelf) {
-    HandleNewVirtualShelf();
-    exit if $authorized;
-    ShowTemplate(); #error message
-}
-elsif($shelfnumber && $confirmed) {
-    HandleShelfNumber();
-    exit if $authorized;
-    ShowTemplate(); #error message
-}
-elsif($shelfnumber) { #still needs confirmation
-    HandleSelectedShelf();
-    LoadBib() if $authorized;
-    ShowTemplate();
-}
-else {
-    HandleSelect();
-    LoadBib();
-    ShowTemplate();
-}
-#end
-
-sub HandleBiblioPars {
-    my @bib= $query->param('biblionumber');
-    if(@bib==0 && $query->param('biblionumbers')) {
-        my $str= $query->param('biblionumbers');
-        @bib= split '/', $str;
-    }
-    elsif(@bib==1 && $bib[0]=~/\//) {
-        @bib= split '/', $bib[0];
+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 {
+
+        for my $biblionumber (@biblionumbers) {
+            $shelf->add_biblio( $biblionumber, $loggedinuser );
+        }
+
+        #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;
     }
     }
-    return @bib;
-}
-
-sub AddBibliosToShelf {
-    my ($shelfnumber, @biblionumber)=@_;
-    for my $bib (@biblionumber){
-        AddToShelf($bib, $shelfnumber, $loggedinuser);
-    }
-}
 
 
-sub HandleNewVirtualShelf {
-    $shelfnumber = AddShelf( {
-        shelfname => $newvirtualshelf,
-        sortfield => $sortfield,
-        category => $category }, $loggedinuser);
-    if($shelfnumber == -1) {
-        $authorized=0;
-        $errcode=1; #add failed
-        return;
+} 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;
     }
     }
-    AddBibliosToShelf($shelfnumber, @biblionumber);
-    #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>";
-}
 
 
-sub HandleShelfNumber {
-    if($authorized= ShelfPossibleAction($loggedinuser, $shelfnumber, 'add')) {
-    AddBibliosToShelf($shelfnumber, @biblionumber);
-    #Close this page and return
-    print $query->header;
-    print "<html><meta http-equiv=\"refresh\" content=\"0\" /><body onload=\"self.close();\"></body></html>";
-    }
-    else {
-    $errcode=2; #no perm
-    }
-}
+} elsif ($shelfnumber) {    #still needs confirmation
+    my $shelf = Koha::Virtualshelves->find($shelfnumber);
+    if ( $shelf->can_biblios_be_added($loggedinuser) ) {
 
 
-sub HandleSelectedShelf {
-    if($authorized= ShelfPossibleAction( $loggedinuser, $shelfnumber, 'add')){
         #confirm adding to specific shelf
         #confirm adding to specific shelf
-        my ($singleshelf, $singleshelfname)= GetShelf($shelfnumber);
         $template->param(
         $template->param(
-        singleshelf               => 1,
-        shelfnumber               => $singleshelf,
-        shelfname                 => $singleshelfname,
+            singleshelf => 1,
+            shelfnumber => $shelf->shelfnumber,
+            shelfname   => $shelf->shelfname,
         );
         );
+    } else {
+        $authorized = 0;
+        $errcode    = 2;    #no perm
     }
     }
-    else {
-    $errcode=2; #no perm
-    }
-}
 
 
-sub HandleSelect {
-    my $privateshelves = GetAllShelves(1,$loggedinuser,1);
-    my $publicshelves = GetAllShelves(2,$loggedinuser,1);
-    $template->param(
-    privatevirtualshelves => $privateshelves,
-    publicvirtualshelves  => $publicshelves,
+} 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' }
     );
     );
-}
-
-sub LoadBib {
-    my @biblios;
-    for my $bib (@biblionumber) {
-        my $data = GetBiblioData($bib);
-    push(@biblios,
-        { biblionumber => $bib,
-          title        => $data->{'title'},
-          author       => $data->{'author'},
-    } );
-    }
     $template->param(
     $template->param(
-        multiple => (scalar(@biblios) > 1),
-    total    => scalar @biblios,
-    biblios  => \@biblios,
+        private_shelves                => $private_shelves,
+        private_shelves_shared_with_me => $shelves_shared_with_me,
+        public_shelves                 => $public_shelves,
     );
     );
+
 }
 
 }
 
-sub ShowTemplate {
-    $template->param (
-    newshelf => $newshelf||0,
-    authorized => $authorized,
-    errcode            => $errcode,
+my @biblios;
+for my $biblionumber (@biblionumbers) {
+    my $biblio = Koha::Biblios->find( $biblionumber );
+    push(
+        @biblios,
+        {   biblionumber => $biblionumber,
+            title        => $biblio->title,
+            author       => $biblio->author,
+        }
     );
     );
-    output_html_with_http_headers $query, $cookie, $template->output;
 }
 }
+$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;