Koha/opac/opac-reserve.pl

223 lines
6.2 KiB
Perl
Executable file

#!/usr/bin/perl
use strict;
require Exporter;
use CGI;
use C4::Search;
use C4::Auth; # checkauth, getborrowernumber.
use C4::Koha;
use C4::Circulation::Circ2;
use C4::Reserves2;
my $query = new CGI;
my ($template, $borrowernumber, $cookie)
= get_template_and_user({template_name => "opac-reserve.tmpl",
query => $query,
type => "opac",
authnotrequired => 0,
flagsrequired => {borrow => 1},
debug => 1,
});
# get borrower information ....
my ($borr, $flags) = getpatroninformation(undef, $borrowernumber);
my @bordat;
$bordat[0] = $borr;
$template->param(BORROWER_INFO => \@bordat);
# get biblionumber.....
my $biblionumber = $query->param('bib');
$template->param(biblionumber => $biblionumber);
my $bibdata = bibdata($biblionumber);
$template->param($bibdata);
# get the rank number....
my ($rank,$reserves) = FindReserves($biblionumber);
$template->param(reservecount => $rank);
foreach my $res (@$reserves) {
if ($res->{'found'} eq 'W') {
$rank--;
}
}
$rank++;
$template->param(rank => $rank);
# pass the pickup branch along....
my $branch = $query->param('branch');
$template->param(branch => $branch);
my $branches = getbranches();
$template->param(branchname => $branches->{$branch}->{'branchname'});
# make branch selection options...
my $branchoptions = '';
my @branches;
foreach my $br (keys %$branches) {
(next) unless $branches->{$br}->{'IS'};
my $selected = "";
if ($br eq $branch) {
$selected = "selected";
}
$branchoptions .= "<option value=$br $selected>$branches->{$br}->{'branchname'}</option>\n";
push @branches, {branchcode => $br, branchname => $branches->{$br}->{'branchname'}, selected => $selected};
}
$template->param( branchoptions => $branchoptions);
$template->param(BRANCHES => \@branches);
#### THIS IS A BIT OF A HACK BECAUSE THE BIBLIOITEMS DATA IS A LITTLE MESSED UP!
# get the itemtype data....
my @items = ItemInfo(undef, $biblionumber, 'opac');
my @temp;
foreach my $itm (@items) {
push @temp, $itm if $itm->{'itemtype'};
}
@items = @temp;
my $itemcount = @items;
$template->param(itemcount => $itemcount);
my %types;
my %itemtypes;
my @duedates;
foreach my $itm (@items) {
push @duedates, {date_due => slashifyDate($itm->{'date_due'})} if defined $itm->{'date_due'};
$itm->{$itm->{'publictype'}} = 1;
my $fee = CalcReserveFee(undef, $borrowernumber, $itm->{'biblionumber'},'a',($itm->{'biblioitemnumber'}));
$fee = sprintf "%.02f", $fee;
$itm->{'reservefee'} = $fee;
my $pty = $itm->{'publictype'};
$itemtypes{$itm->{'itemtype'}} = $itm;
unless ($types {$pty}) {
$types{$pty}->{'count'} = 1;
$types{$pty}->{$itm->{'itemtype'}} = 1;
push @{$types{$pty}->{'items'}}, $itm;
} else {
unless ($types{$pty}->{$itm->{'itemtype'}}) {
$types{$pty}->{'count'}++;
$types{$pty}->{$itm->{'itemtype'}} = 1;
push @{$types{$pty}->{'items'}}, $itm;
}
}
}
$template->param(ITEMS => \@duedates);
my $width = keys %types;
my @publictypes = sort {$b->{'count'} <=> $a->{'count'}} values %types;
my $typecount;
foreach my $pt (@publictypes) {
$typecount += $pt->{'count'};
}
$template->param(onlyone => 1) if $typecount == 1;
my @typerows;
for (my $rownum=0;$rownum<$publictypes[0]->{'count'} ;$rownum++) {
my @row;
foreach my $pty (@publictypes) {
my @items = @{$pty->{'items'}};
push @row, $items[$rownum] if defined $items[$rownum];
}
my $last = @row;
$row[$last-1]->{'last'} =1 if $last == $width;
my $fill = ($width - $last)*2;
$fill-- if $fill;
push @typerows, {ROW => \@row, fill => $fill};
}
$template->param(TYPE_ROWS => \@typerows);
$width = 2*$width -1;
$template->param(totalwidth => 2*$width-1);
if ($query->param('item_types_selected')) {
# this is what happens after the itemtypes have been selected. Stage 2
my @itemtypes = $query->param('itemtype');
my $fee = 0;
my $proceed = 0;
if (@itemtypes) {
my %newtypes;
foreach my $itmtype (@itemtypes) {
$newtypes{$itmtype} = $itemtypes{$itmtype};
}
my @types = values %newtypes;
$template->param(TYPES => \@types);
foreach my $type (@itemtypes) {
my @reqbibs;
foreach my $item (@items) {
if ($item->{'itemtype'} eq $type) {
push @reqbibs, $item->{'biblioitemnumber'};
}
}
$fee += CalcReserveFee(undef,$borrowernumber,$biblionumber,'o',\@reqbibs);
}
$proceed = 1;
} elsif ($query->param('all')) {
$template->param(all => 1);
$fee = 1;
$proceed = 1;
}
if ($proceed) {
$fee = sprintf "%.02f", $fee;
$template->param(fee => $fee);
$template->param(item_types_selected => 1);
} else {
$template->param(message => 1);
$template->param(no_items_selected => 1);
}
} elsif ($query->param('place_reserve')) {
# here we actually do the reserveration. Stage 3.
my $title = $bibdata->{'title'};
my @itemtypes = $query->param('itemtype');
foreach my $type (@itemtypes) {
my @reqbibs;
foreach my $item (@items) {
if ($item->{'itemtype'} eq $type) {
push @reqbibs, $item->{'biblioitemnumber'};
}
}
CreateReserve(undef,$branch,$borrowernumber,$biblionumber,'o',\@reqbibs,$rank,'',$title);
}
if ($query->param('all')) {
CreateReserve(undef,$branch,$borrowernumber,$biblionumber,'a', undef, $rank,'',$title);
}
print $query->redirect("/cgi-bin/koha/opac-user.pl");
} else {
# Here we check that the borrower can actually make reserves Stage 1.
my $noreserves = 0;
if ($borr->{'amountoutstanding'} > 5) {
my $amount = sprintf "\$%.02f", $borr->{'amountoutstanding'};
$template->param(message => 1);
$noreserves = 1;
$template->param(too_much_oweing => $amount);
}
my ($resnum, $reserves) = FindReserves(undef, $borrowernumber);
$template->param(RESERVES => $reserves);
if ($resnum >= $MAXIMUM_NUMBER_OF_RESERVES) {
$template->param(message => 1);
$noreserves = 1;
$template->param(too_many_reserves => $resnum);
}
foreach my $res (@$reserves) {
if ($res->{'biblionumber'} == $biblionumber) {
$template->param(message => 1);
$noreserves = 1;
$template->param(already_reserved => 1);
}
}
unless ($noreserves) {
$template->param(select_item_types => 1);
}
}
# check that you can actually make the reserve.
$template->param(BIBLIOITEMS => \@data);
print $query->header(-cookie => $cookie), $template->output;