2 # NOTE: This file uses standard 8-character tabs
9 use C4::Auth; # checkauth, getborrowernumber.
11 use C4::Circulation::Circ2;
13 use C4::Interface::CGI::Output;
16 my $MAXIMUM_NUMBER_OF_RESERVES = 5;
18 my $MAXIMUM_NUMBER_OF_RESERVES = 10;
21 my ($template, $borrowernumber, $cookie)
22 = get_template_and_user({template_name => "opac-reserve.tmpl",
26 flagsrequired => {borrow => 1},
30 # get borrower information ....
31 my ($borr, $flags) = getpatroninformation(undef, $borrowernumber);
34 $template->param(BORROWER_INFO => \@bordat);
36 # get biblionumber.....
37 my $biblionumber = $query->param('bib');
38 $template->param(biblionumber => $biblionumber);
40 my $bibdata = bibdata($biblionumber);
41 $template->param($bibdata);
43 # get the rank number....
44 my ($rank,$reserves) = FindReserves($biblionumber);
45 $template->param(reservecount => $rank);
47 foreach my $res (@$reserves) {
48 if ($res->{'found'} eq 'W') {
56 $template->param(rank => $rank);
59 # pass the pickup branch along....
60 my $branch = $query->param('branch');
61 $template->param(branch => $branch);
63 my $branches = getbranches();
64 $template->param(branchname => $branches->{$branch}->{'branchname'});
67 # make branch selection options...
68 my $branchoptions = '';
70 foreach my $br (keys %$branches) {
71 #(next) unless $branches->{$br}->{'IS'}; # FIXME disabled to fix bug 202
74 $selected = "selected";
76 $branchoptions .= "<option value=$br $selected>$branches->{$br}->{'branchname'}</option>\n";
77 push @branches, {branchcode => $br, branchname => $branches->{$br}->{'branchname'}, selected => $selected};
79 $template->param( branchoptions => $branchoptions);
80 $template->param(BRANCHES => \@branches);
82 #### THIS IS A BIT OF A HACK BECAUSE THE BIBLIOITEMS DATA IS A LITTLE MESSED UP!
83 # get the itemtype data....
84 my @items = ItemInfo(undef, $biblionumber, 'opac');
86 #######################################################
87 # old version, add so that old templates still work
89 foreach my $itm (@items) {
90 my $ity = $itm->{'itemtype'};
91 unless ($types_old {$ity}) {
92 $types_old{$ity}->{'itemtype'} = $ity;
93 $types_old{$ity}->{'branchinfo'}->{$itm->{'branchcode'}} = 1;
94 $types_old{$ity}->{'description'} = $itm->{'description'};
96 $types_old{$ity}->{'branchinfo'}->{$itm->{'branchcode'}} ++;
100 foreach my $type (values %types_old) {
102 foreach my $bc (keys %{$type->{'branchinfo'}}) {
103 $copies .= $branches->{$bc}->{'branchname'}."(".$type->{'branchinfo'}->{$bc}.")";
105 $type->{'copies'} = $copies;
108 my @types_old = values %types_old;
111 ################################
114 foreach my $itm (@items) {
115 push @temp, $itm if $itm->{'itemtype'};
118 my $itemcount = @items;
119 $template->param(itemcount => $itemcount);
124 foreach my $itm (@items) {
125 push @duedates, {date_due => slashifyDate($itm->{'date_due'})} if defined $itm->{'date_due'};
126 $itm->{$itm->{'publictype'}} = 1;
127 # FIXME CalcReserveFee is supposed to be internal-use-only
128 my $fee = CalcReserveFee(undef, $borrowernumber, $itm->{'biblionumber'},'a',($itm->{'biblioitemnumber'}));
129 $fee = sprintf "%.02f", $fee;
130 $itm->{'reservefee'} = $fee;
131 my $pty = $itm->{'publictype'};
132 $itemtypes{$itm->{'itemtype'}} = $itm;
133 unless ($types {$pty}) {
134 $types{$pty}->{'count'} = 1;
135 $types{$pty}->{$itm->{'itemtype'}} = 1;
136 push @{$types{$pty}->{'items'}}, $itm;
138 unless ($types{$pty}->{$itm->{'itemtype'}}) {
139 $types{$pty}->{'count'}++;
140 $types{$pty}->{$itm->{'itemtype'}} = 1;
141 push @{$types{$pty}->{'items'}}, $itm;
147 $template->param(ITEMS => \@duedates);
149 my $width = keys %types;
150 my @publictypes = sort {$b->{'count'} <=> $a->{'count'}} values %types;
152 foreach my $pt (@publictypes) {
153 $typecount += $pt->{'count'};
155 $template->param(onlyone => 1) if $typecount == 1;
158 for (my $rownum=0;$rownum<$publictypes[0]->{'count'} ;$rownum++) {
160 foreach my $pty (@publictypes) {
161 my @items = @{$pty->{'items'}};
162 push @row, $items[$rownum] if defined $items[$rownum];
165 $row[$last-1]->{'last'} =1 if $last == $width;
166 my $fill = ($width - $last)*2;
168 push @typerows, {ROW => \@row, fill => $fill};
170 $template->param(TYPE_ROWS => \@typerows);
171 $width = 2*$width -1;
172 $template->param(totalwidth => 2*$width-1);
174 if ($query->param('item_types_selected')) {
175 # this is what happens after the itemtypes have been selected. Stage 2
176 my @itemtypes = $query->param('itemtype');
181 foreach my $itmtype (@itemtypes) {
182 $newtypes{$itmtype} = $itemtypes{$itmtype};
184 my @types = values %newtypes;
185 $template->param(TYPES => \@types);
186 foreach my $type (@itemtypes) {
188 foreach my $item (@items) {
189 if ($item->{'itemtype'} eq $type) {
190 push @reqbibs, $item->{'biblioitemnumber'};
193 $fee += CalcReserveFee(undef,$borrowernumber,$biblionumber,'o',\@reqbibs);
196 } elsif ($query->param('all')) {
197 $template->param(all => 1);
202 $fee = sprintf "%.02f", $fee;
203 $template->param(fee => $fee);
204 $template->param(item_types_selected => 1);
206 $template->param(message => 1);
207 $template->param(no_items_selected => 1);
211 } elsif ($query->param('place_reserve')) {
212 # here we actually do the reserveration. Stage 3.
213 my $title = $bibdata->{'title'};
214 my @itemtypes = $query->param('itemtype');
215 foreach my $type (@itemtypes) {
217 foreach my $item (@items) {
218 if ($item->{'itemtype'} eq $type) {
219 push @reqbibs, $item->{'biblioitemnumber'};
222 CreateReserve(undef,$branch,$borrowernumber,$biblionumber,'o',\@reqbibs,$rank,'',$title);
224 if ($query->param('all')) {
225 CreateReserve(undef,$branch,$borrowernumber,$biblionumber,'a', undef, $rank,'',$title);
227 print $query->redirect("/cgi-bin/koha/opac-user.pl");
229 # Here we check that the borrower can actually make reserves Stage 1.
231 if ($borr->{'amountoutstanding'} > 5) {
232 my $amount = sprintf "\$%.02f", $borr->{'amountoutstanding'};
233 $template->param(message => 1);
235 $template->param(too_much_oweing => $amount);
237 my ($resnum, $reserves) = FindReserves(undef, $borrowernumber);
238 $template->param(RESERVES => $reserves);
239 if ($resnum >= $MAXIMUM_NUMBER_OF_RESERVES) {
240 $template->param(message => 1);
242 $template->param(too_many_reserves => $resnum);
244 foreach my $res (@$reserves) {
245 if ($res->{'biblionumber'} == $biblionumber) {
246 $template->param(message => 1);
248 $template->param(already_reserved => 1);
251 unless ($noreserves) {
252 $template->param(TYPES => \@types_old);
253 $template->param(select_item_types => 1);
257 # check that you can actually make the reserve.
259 # $template->param(BIBLIOITEMS => \@data);
262 output_html_with_http_headers $query, $cookie, $template->output;