item rework: various changes
[koha.git] / opac / opac-shelves.pl
1 #!/usr/bin/perl
2
3 # Copyright 2000-2002 Katipo Communications
4 #
5 # This file is part of Koha.
6 #
7 # Koha is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free Software
9 # Foundation; either version 2 of the License, or (at your option) any later
10 # version.
11 #
12 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License along with
17 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
18 # Suite 330, Boston, MA  02111-1307 USA
19
20
21 =head1 NAME
22
23     opac-shelves.pl
24
25 =head1 DESCRIPTION
26
27     this script is used to script to provide virtualshelf management
28
29 =head1 CGI PARAMETERS
30
31 =over 4
32
33 =item C<modifyshelfcontents>
34
35     if this script has to modify the shelf content.
36
37 =item C<shelfnumber>
38
39     to know on which shelf this script has to work.
40
41 =item C<addbarcode>
42
43 =item C<op>
44
45     op can equal the following values:
46         * 'modifsave' to save changes on the shelves
47         * 'modif' to change the template to allow modification of the shelves.
48
49 =item C<viewshelf>
50
51     to load the template with 'viewshelves param' which allows reading the shelves information.
52
53 =item C<shelves>
54
55     if == 1, then call the function shelves to add or delete a shelf.
56
57 =item C<addshelf>
58
59     if the param shelves == 1, then addshelf must be equals to the name of the shelf to add.
60
61 =back
62
63 =cut
64
65 use strict;
66 use warnings;
67 use CGI;
68 use C4::Output;
69 use C4::VirtualShelves;
70 use C4::Circulation;
71 use C4::Auth;
72 use C4::Output;
73 use C4::Biblio;
74 use C4::Items;
75
76 use vars qw($debug);
77
78 BEGIN { 
79         $debug = $ENV{DEBUG} || 0;
80 }
81
82 my $query = new CGI;
83
84 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
85     {
86         template_name   => "opac-shelves.tmpl",
87         query           => $query,
88         type            => "opac",
89         authnotrequired => 1,
90     }
91 );
92
93 if ( $query->param('modifyshelfcontents') ) {
94     my $shelfnumber = $query->param('viewshelf');
95     my $barcode     = $query->param('addbarcode');
96     my ($item) = GetItemnumberFromBarcode($barcode);
97     my ($biblio) = GetBiblioFromItemNumber($item->{'itemnumber'});
98     if ( ShelfPossibleAction( $loggedinuser, $shelfnumber, 'manage' ) ) {
99         AddToShelf( $biblio->{'biblionumber'}, $shelfnumber );
100         foreach ( $query->param ) {
101             /REM-(\d+)/ or next;
102                         $debug and warn "SHELVES: user $loggedinuser removing item $1 from shelf $shelfnumber";
103             DelFromShelf( $1, $shelfnumber );   # $1 is biblionumber
104         }
105     }
106 }
107
108 my $showadd = 1;
109 # set the default tab, etc.
110 my $shelf_type = $query->param('display');
111 if (defined $shelf_type) {
112         if ($shelf_type eq 'privateshelves')  {
113                 $template->param(showprivateshelves => 1);
114         } elsif ($shelf_type eq 'publicshelves') {
115                 $template->param(showpublicshelves => 1);
116                 $showadd = 0;
117         } else {
118                 $debug and warn "Invalid 'display' param ($shelf_type)";
119         }
120 } else {
121     $template->param(showprivateshelves => 1);
122 }
123
124 # getting the Shelves list
125 my $shelflist = GetShelves( $loggedinuser, 2 );
126 $template->param( { loggedinuser => $loggedinuser } );
127 my $op = $query->param('op');
128
129 SWITCH: {
130         if ( $op ) {
131                 if ( $op eq 'modifsave' ) {
132                         ModShelf(
133                                 $query->param('shelfnumber'), $query->param('shelfname'),
134                                 $loggedinuser,                $query->param('category'), $query->param('sortfield')
135                         );
136                         $shelflist = GetShelves( $loggedinuser, 2 );    # refresh after mods
137                 } elsif ( $op eq 'modif' ) {
138                         my ( $shelfnumber, $shelfname, $owner, $category, $sortfield ) =GetShelf( $query->param('shelf') );
139                         $template->param(
140                                 edit                => 1,
141                                 shelfnumber         => $shelfnumber,
142                                 shelfname           => $shelfname,
143                                 "category$category" => 1,
144                                 "sort_$sortfield"   => 1,
145                         );
146                 }
147                 last SWITCH;
148         }
149         if ( $query->param('viewshelf') ) {
150         #check that the user can view the shelf
151         my $shelfnumber = $query->param('viewshelf');
152         if ( ShelfPossibleAction( $loggedinuser, $shelfnumber, 'view' ) ) {
153             my $items = GetShelfContents($shelfnumber);
154                         $showadd = 1;
155                         my $i = 0;
156                         foreach (grep {$i++ % 2} @$items) {             # every other item
157                                 $_->{toggle} = 1;
158                         }
159             $template->param(
160                 shelfname   => $shelflist->{$shelfnumber}->{'shelfname'},
161                 shelfnumber => $shelfnumber,
162                 viewshelf   => $query->param('viewshelf'),
163                 manageshelf => &ShelfPossibleAction( $loggedinuser, $shelfnumber, 'manage' ),
164                 itemsloop   => $items,
165             );
166         } # else {;}  # FIXME - some kind of warning *may* be in order
167         last SWITCH;
168     }
169     if ( $query->param('shelves') ) {
170         if ( my $newshelf = $query->param('addshelf') ) {
171             my $shelfnumber = AddShelf(
172                 $newshelf,
173                 $query->param('owner'),
174                 $query->param('category')
175             );
176
177             if ( $shelfnumber == -1 ) {    #shelf already exists.
178                                 $showadd = 1;
179                 $template->param(
180                         shelfnumber => $shelfnumber,
181                         already     => $newshelf,
182                 );
183             } else {
184                 print $query->redirect("/cgi-bin/koha/opac-shelves.pl?viewshelf=$shelfnumber");
185                                 exit;           # can't redirect AND expect %line to DO anything!
186                         }
187         }
188         my @paramsloop;
189         foreach ( $query->param() ) {
190                         /^DEL-(\d+)/ or next;
191                         my %line;
192                         ( $line{status}, $line{count} ) = DelShelf($1);
193                         (defined $shelflist->{$1}) and delete $shelflist->{$1};
194                         # print $query->redirect("/cgi-bin/koha/opac-shelves.pl"); exit;
195                         # can't redirect and expect %line to DO anything!
196                         push( @paramsloop, \%line );
197         }
198                 $showadd = 1;
199         $template->param( 
200                         paramsloop => \@paramsloop,
201             shelves    => 1,
202         );
203         last SWITCH;
204     }
205 }
206
207 # rebuilding shelflist (in case a shelf has been added) is not necessary since add redirects!
208
209 $showadd and $template->param(showadd => 1);
210 my $color = 0;
211 my @shelvesloop;
212 my @shelveslooppriv;
213
214 foreach my $element (sort { lc($shelflist->{$a}->{'shelfname'}) cmp lc($shelflist->{$b}->{'shelfname'}) } keys %$shelflist) {
215         my %line;
216         $color = ($color) ? 0 : 1;
217         $color and $line{'toggle'} = $color;
218         $line{'shelf'} = $element;
219         $line{'shelfname'} = $shelflist->{$element}->{'shelfname'};
220         $line{'sortfield'} = $shelflist->{$element}->{'sortfield'};
221         $line{"category".$shelflist->{$element}->{'category'}} = 1;
222         $line{'shelfvirtualcount'} = $shelflist->{$element}->{'count'};
223         $line{'canmanage'} = ShelfPossibleAction($loggedinuser,$element,'manage');
224         if ($shelflist->{$element}->{'owner'} eq $loggedinuser) {
225                 $line{'mine'} = 1;
226         } else {
227                 $line{'firstname'} = $shelflist->{$element}->{'firstname'};
228                 $line{ 'surname' } = $shelflist->{$element}->{ 'surname' };
229         }
230         if ($shelflist->{$element}->{'category'} eq 2) {
231                 push (@shelvesloop,     \%line);
232         } elsif ($shelflist->{$element}->{'category'} eq 1) {
233         push (@shelveslooppriv, \%line);
234     }
235 }
236
237 $template->param(
238     shelveslooppriv => \@shelveslooppriv,
239     shelvesloop     => \@shelvesloop,
240     "BiblioDefaultView".C4::Context->preference("BiblioDefaultView") => 1,
241 );
242
243 output_html_with_http_headers $query, $cookie, $template->output;