Merge remote branch 'kc/master' into new/bug_3013
[koha.git] / virtualshelves / addbybiblionumber.pl
1 #!/usr/bin/perl
2
3 #script to provide virtual shelf management
4 #
5 #
6 # Copyright 2000-2002 Katipo Communications
7 #
8 # This file is part of Koha.
9 #
10 # Koha is free software; you can redistribute it and/or modify it under the
11 # terms of the GNU General Public License as published by the Free Software
12 # Foundation; either version 2 of the License, or (at your option) any later
13 # version.
14 #
15 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
16 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
17 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License along
20 # with Koha; if not, write to the Free Software Foundation, Inc.,
21 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22
23
24 =head1 NAME
25
26     addbybiblionumber.pl
27
28 =head1 DESCRIPTION
29
30     This script allow to add a virtual in a virtual shelf from a biblionumber.
31
32 =head1 CGI PARAMETERS
33
34 =over 4
35
36 =item biblionumber
37
38     The biblionumber
39
40 =item shelfnumber
41
42     the shelfnumber where to add the virtual.
43
44 =item newvirtualshelf
45
46     if this parameter exists, then it must be equals to the name of the shelf
47     to add.
48
49 =item category
50
51     if this script has to add a shelf, it add one with this category.
52
53 =item newshelf
54
55     if this parameter exists, then we create a new shelf
56
57 =back
58
59 =cut
60
61 use strict;
62 #use warnings; FIXME - Bug 2505
63 use C4::Biblio;
64 use CGI;
65 use C4::Output;
66 use C4::VirtualShelves qw/:DEFAULT GetRecentShelves/;
67 use C4::Circulation;
68 use C4::Auth;
69
70 # splits incoming biblionumber(s) to array and adds each to shelf.
71 sub AddBibliosToShelf {
72     my ($shelfnumber,@biblionumber)=@_;
73
74     # multiple bibs might come in as '/' delimited string (from where, i don't see), or as array.
75     # (Note : they come in as '/' when added from the cart)
76     if (scalar(@biblionumber) == 1) {
77         @biblionumber = (split /\//,$biblionumber[0]);
78     }
79     for my $bib (@biblionumber){
80         AddToShelf($bib, $shelfnumber);
81     }
82 }
83
84 my $query           = new CGI;
85
86 # If set, then single item case.
87 my $biblionumber    = $query->param('biblionumber');
88
89 # If set, then multiple item case.
90 my @biblionumber   = $query->param('biblionumber');
91 my $biblionumbers   = $query->param('biblionumbers');
92
93 my $shelfnumber     = $query->param('shelfnumber');
94 my $newvirtualshelf = $query->param('newvirtualshelf');
95 my $newshelf        = $query->param('newshelf');
96 my $category        = $query->param('category');
97 my $sortfield       = $query->param('sortfield');
98 my $confirmed       = $query->param('confirmed') || 0;
99
100
101 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
102     {
103         template_name   => "virtualshelves/addbybiblionumber.tmpl",
104         query           => $query,
105         type            => "intranet",
106         authnotrequired => 0,
107         flagsrequired   => { catalogue => 1 },
108     }
109 );
110
111 my @biblionumbers;
112 if ($biblionumbers) {
113     @biblionumbers = split '/', $biblionumbers;
114 } else {
115     @biblionumbers = (@biblionumber);
116 }
117 if (scalar(@biblionumber) == 1) {
118         @biblionumber = (split /\//,$biblionumber[0]);
119 }
120
121 $shelfnumber = AddShelf( $newvirtualshelf, $loggedinuser, $category, $sortfield ) if $newvirtualshelf;
122 if ( $shelfnumber || ( $shelfnumber == -1 ) ) {    # the shelf already exist.
123
124     if ($confirmed == 1) {
125         AddBibliosToShelf($shelfnumber,@biblionumber);
126         print
127     "Content-Type: text/html\n\n<html><body onload=\"window.opener.location.reload(true);window.close()\"></body></html>";
128         exit;
129     } else {
130         my ( $singleshelf, $singleshelfname, $singlecategory ) = GetShelf( $query->param('shelfnumber') );
131         my @biblios;
132         for my $bib (@biblionumber) {
133             my $data = GetBiblioData( $bib );
134             push(@biblios,
135                         { biblionumber => $bib,
136                           title        => $data->{'title'},
137                           author       => $data->{'author'},
138                         } );
139         }
140
141         $template->param
142         (
143          biblionumber => \@biblionumber,
144          biblios      => \@biblios,
145          multiple     => (scalar(@biblionumber) > 1),
146          singleshelf  => 1,
147          shelfname    => $singleshelfname,
148          shelfnumber  => $singleshelf,
149          total        => scalar(@biblionumber),
150          confirm      => 1,
151         );
152     }
153 }
154 else {    # this shelf doesn't already exist.
155     my $limit = 10;
156     my ($shelflist);
157     my @shelvesloop;
158     my %shelvesloop;
159
160     #grab each type of shelf, open (type 3) should not be limited by user.
161     foreach my $shelftype (1,2,3) {
162             my ($shelflist) = GetRecentShelves($shelftype, $limit, $shelftype == 3 ? undef : $loggedinuser);
163             for my $shelf (@{ $shelflist->[0] }) {
164                     push(@shelvesloop, $shelf->{shelfnumber});
165                     $shelvesloop{$shelf->{shelfnumber}} = $shelf->{shelfname};
166             }
167     }
168
169     if(@shelvesloop gt 0){
170         my $CGIvirtualshelves = CGI::scrolling_list
171           (
172            -name     => 'shelfnumber',
173            -values   => \@shelvesloop,
174            -labels   => \%shelvesloop,
175            -size     => 1,
176            -tabindex => '',
177            -multiple => 0
178           );
179         $template->param
180           (
181            CGIvirtualshelves => $CGIvirtualshelves,
182           );
183     }
184         my @biblios;
185         for my $bib (@biblionumber) {
186             my $data = GetBiblioData( $bib );
187             push(@biblios,
188                         { biblionumber => $bib,
189                           title        => $data->{'title'},
190                           author       => $data->{'author'},
191                         } );
192         }
193     $template->param(
194            newshelf     => $newshelf,
195            biblios=>\@biblios,
196            multiple     => (scalar(@biblionumber) > 1),
197            total        => scalar(@biblionumber),
198     );
199
200     unless (@biblionumbers) {
201         my ( $bibliocount, @biblios ) = GetBiblio($biblionumber);
202     
203         $template->param
204           (
205            biblionumber      => $biblionumber,
206            title             => $biblios[0]->{'title'},
207            author            => $biblios[0]->{'author'},
208           );
209     } else {
210         my @biblioloop = ();
211         foreach my $biblionumber (@biblionumbers) {
212             my ( $bibliocount, @biblios ) = GetBiblio($biblionumber);
213             my %biblioiter = (
214                               title=>$biblios[0]->{'title'},
215                               author=>$biblios[0]->{'author'}
216                              );
217             push @biblioloop, \%biblioiter;
218         }
219         $template->param
220           (
221            biblioloop => \@biblioloop,
222            biblionumbers => $biblionumbers
223           );
224     }
225     
226 }
227 output_html_with_http_headers $query, $cookie, $template->output;