ffzg/recall_notices.pl: added --interval and --dedup
[koha.git] / opac / opac-addbybiblionumber.pl
index f988d9d..ddc6778 100755 (executable)
 #!/usr/bin/perl
 
-#script to provide virtualshelf management
-# WARNING: This file uses 4-character tabs!
-#
-# $Header$
-#
 # Copyright 2000-2002 Katipo Communications
+# Copyright 2016 Koha Development Team
 #
 # 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>.
 
-use strict;
-use warnings;
+use Modern::Perl;
 
 use CGI qw ( -utf8 );
 use C4::Biblio;
-use C4::VirtualShelves qw/:DEFAULT GetAllShelves/;
 use C4::Output;
 use C4::Auth;
 
-our $query             = new CGI;
-our @biblionumber      = $query->param('biblionumber');
-our $selectedshelf     = $query->param('selectedshelf');
-our $newshelf          = $query->param('newshelf');
-our $shelfnumber       = $query->param('shelfnumber');
-our $newvirtualshelf   = $query->param('newvirtualshelf');
-our $category          = $query->param('category');
-our $authorized          = 1;
-our $errcode           = 0;
-our @biblios;
+use Koha::Biblios;
+use Koha::Virtualshelves;
+
+my $query           = new CGI;
+my @biblionumbers   = $query->multi_param('biblionumber');
+my $selectedshelf   = $query->param('selectedshelf');
+my $newshelf        = $query->param('newshelf');
+my $shelfnumber     = $query->param('shelfnumber');
+my $newvirtualshelf = $query->param('newvirtualshelf');
+my $category        = $query->param('category');
+my ( $errcode, $authorized ) = ( 0, 1 );
+my @biblios;
+
+# if virtualshelves is disabled, leave immediately
+if ( !C4::Context->preference('virtualshelves') ) {
+    print $query->redirect("/cgi-bin/koha/errors/404.pl");
+    exit;
+}
 
-our ( $template, $loggedinuser, $cookie ) = get_template_and_user(
-    {
-        template_name   => "opac-addbybiblionumber.tt",
+if ( scalar(@biblionumbers) == 1 ) {
+    @biblionumbers = ( split /\//, $biblionumbers[0] );
+}
+
+my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
+    {   template_name   => "opac-addbybiblionumber.tt",
         query           => $query,
         type            => "opac",
         authnotrequired => 0,
     }
 );
 
-if( $newvirtualshelf) {
-    HandleNewVirtualShelf();
-    exit if $authorized;
-    ShowTemplate(); #error message
-}
-elsif($shelfnumber) {
-    HandleShelfNumber();
-    exit if $authorized;
-    ShowTemplate(); #error message
-}
-elsif($selectedshelf) {
-    HandleSelectedShelf();
-    LoadBib() if $authorized;
-    ShowTemplate();
-}
-else {
-    HandleSelect();
-    LoadBib() if $authorized;
-    ShowTemplate();
-}
-#end
-
-sub AddBibliosToShelf {
-    #splits incoming biblionumber(s) to array and adds each to shelf.
-    my ($shelfnumber,@biblionumber)=@_;
-
-    #multiple bibs might come in as '/' delimited string (from where, i don't see), or as array.
-    if (scalar(@biblionumber) == 1) {
-        @biblionumber = (split /\//,$biblionumber[0]);
-    }
-    for my $bib (@biblionumber) {
-        AddToShelf($bib, $shelfnumber, $loggedinuser);
-    }
-}
+if ($newvirtualshelf) {
+    if ($loggedinuser > 0
+        and (  $category == 1
+            or $category == 2 and $loggedinuser > 0 && C4::Context->preference('OpacAllowPublicListCreation') )
+      ) {
+        my $shelf = eval { Koha::Virtualshelf->new( { shelfname => $newvirtualshelf, category => $category, owner => $loggedinuser, } )->store; };
+        if ( $@ or not $shelf ) {
+            $errcode    = 1;
+            $authorized = 0;
+        } else {
+            for my $biblionumber (@biblionumbers) {
+                $shelf->add_biblio( $biblionumber, $loggedinuser );
+            }
 
-sub HandleNewVirtualShelf {
-    if($authorized= ShelfPossibleAction($loggedinuser, undef, $category==1? 'new_private': 'new_public')) {
-    $shelfnumber = AddShelf( {
-            shelfname => $newvirtualshelf,
-            category => $category }, $loggedinuser);
-    if($shelfnumber == -1) {
-        $authorized=0;
-        $errcode=1;
-        return;
-    }
-    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>";
+            #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;
+        }
     }
-}
+} elsif ($shelfnumber) {
+    my $shelfnumber = $query->param('shelfnumber');
+    my $shelf       = Koha::Virtualshelves->find($shelfnumber);
+    if ( $shelf->can_biblios_be_added($loggedinuser) ) {
+        for my $biblionumber (@biblionumbers) {
+            $shelf->add_biblio( $biblionumber, $loggedinuser );
+        }
 
-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>";
+        #Close this page and return
+        print $query->header;
+        print "<html><meta http-equiv=\"refresh\" content=\"0\" /><body onload=\"self.close();\"></body></html>";
+        exit;
+    } else {
+        $authorized = 0;
     }
-}
-
-sub HandleSelectedShelf {
-    if($authorized= ShelfPossibleAction( $loggedinuser, $selectedshelf, 'add')){
-        #adding to specific shelf
-        my ($singleshelf, $singleshelfname)= GetShelf($query->param('selectedshelf'));
+} elsif ($selectedshelf) {
+    my $shelfnumber = $query->param('selectedshelf');
+    my $shelf       = Koha::Virtualshelves->find($shelfnumber);
+    if ( $shelf->can_biblios_be_added($loggedinuser) ) {
         $template->param(
-        singleshelf               => 1,
-        shelfnumber               => $singleshelf,
-        shelfname                 => $singleshelfname,
+            singleshelf => 1,
+            shelfnumber => $shelf->shelfnumber,
+            shelfname   => $shelf->shelfname,
         );
+    } else {
+        $authorized = 0;
     }
-}
-
-sub HandleSelect {
-    return unless $authorized= $loggedinuser>0;
-    my $privateshelves = GetAllShelves(1,$loggedinuser,1);
-    if(@{$privateshelves}){
-        $template->param (
-        privatevirtualshelves          => $privateshelves,
-        existingshelves => 1
-    );
-    }
-    my $publicshelves = GetAllShelves(2,$loggedinuser,1);
-    if(@{$publicshelves}){
-        $template->param (
-        publicvirtualshelves          => $publicshelves,
-        existingshelves => 1
-    );
+} else {
+    if ( $loggedinuser > 0 ) {
+        my $private_shelves = Koha::Virtualshelves->search(
+            {   category => 1,
+                owner    => $loggedinuser,
+                allow_change_from_owner => 1,
+            },
+            { order_by => 'shelfname' }
+        );
+        my $shelves_shared_with_me = Koha::Virtualshelves->search(
+            {   category                            => 1,
+                'virtualshelfshares.borrowernumber' => $loggedinuser,
+                allow_change_from_others            => 1,
+            },
+            { join => 'virtualshelfshares', }
+        );
+        my $public_shelves = Koha::Virtualshelves->search(
+            {   category => 2,
+                -or      => [
+                    -and => {
+                        allow_change_from_owner => 1,
+                        owner     => $loggedinuser,
+                    },
+                    allow_change_from_others => 1,
+                ],
+            },
+            { order_by => 'shelfname' }
+        );
+        $template->param(
+            private_shelves                => $private_shelves,
+            private_shelves_shared_with_me => $shelves_shared_with_me,
+            public_shelves                 => $public_shelves,
+        );
+    } else {
+        $authorized = 0;
     }
 }
 
-sub LoadBib {
-    #see comment in AddBibliosToShelf
-    if (scalar(@biblionumber) == 1) {
-        @biblionumber = (split /\//,$biblionumber[0]);
-    }
-    for my $bib (@biblionumber) {
-        my $data = GetBiblioData( $bib );
-    push(@biblios,
-        { biblionumber => $bib,
-          title        => $data->{'title'},
-          author       => $data->{'author'},
-    } );
+if ($authorized) {
+    for my $biblionumber (@biblionumbers) {
+        my $biblio = Koha::Biblios->find( $biblionumber );
+        push(
+            @biblios,
+            {   biblionumber => $biblionumber,
+                title        => $biblio->title,
+                author       => $biblio->author,
+            }
+        );
     }
     $template->param(
-        multiple => (scalar(@biblios) > 1),
-    total    => scalar @biblios,
-    biblios  => \@biblios,
+        multiple => ( scalar(@biblios) > 1 ),
+        total    => scalar @biblios,
+        biblios  => \@biblios,
     );
-}
 
-sub ShowTemplate {
-    $template->param (
-    newshelf => $newshelf||0,
-    authorized => $authorized,
-    errcode            => $errcode,
-    OpacAllowPublicListCreation => C4::Context->preference('OpacAllowPublicListCreation'),
+    $template->param(
+        newshelf => $newshelf || 0,
+        OpacAllowPublicListCreation => C4::Context->preference('OpacAllowPublicListCreation'),
     );
-    output_html_with_http_headers $query, $cookie, $template->output;
 }
+$template->param( authorized => $authorized, errcode => $errcode, );
+output_html_with_http_headers $query, $cookie, $template->output;