View | Details | Raw Unified | Return to bug 13517
Collapse All | Expand All

(-)a/reserve/request.pl (-200 / +216 lines)
Lines 1-6 Link Here
1
#!/usr/bin/perl
1
#!/usr/bin/perl
2
2
3
4
#writen 2/1/00 by chris@katipo.oc.nz
3
#writen 2/1/00 by chris@katipo.oc.nz
5
# Copyright 2000-2002 Katipo Communications
4
# Copyright 2000-2002 Katipo Communications
6
# Parts Copyright 2011 Catalyst IT
5
# Parts Copyright 2011 Catalyst IT
Lines 41-47 use C4::Koha; Link Here
41
use C4::Circulation;
40
use C4::Circulation;
42
use C4::Dates qw/format_date/;
41
use C4::Dates qw/format_date/;
43
use C4::Members;
42
use C4::Members;
44
use C4::Search;		# enabled_staff_search_views
43
use C4::Search;    # enabled_staff_search_views
45
use Koha::DateUtils;
44
use Koha::DateUtils;
46
45
47
my $dbh = C4::Context->dbh;
46
my $dbh = C4::Context->dbh;
Lines 58-76 my ( $template, $borrowernumber, $cookie, $flags ) = get_template_and_user( Link Here
58
);
57
);
59
58
60
my $multihold = $input->param('multi_hold');
59
my $multihold = $input->param('multi_hold');
61
$template->param(multi_hold => $multihold);
60
$template->param( multi_hold => $multihold );
62
my $showallitems = $input->param('showallitems');
61
my $showallitems = $input->param('showallitems');
63
62
64
# get Branches and Itemtypes
63
# get Branches and Itemtypes
65
my $branches = GetBranches();
64
my $branches  = GetBranches();
66
my $itemtypes = GetItemTypes();
65
my $itemtypes = GetItemTypes();
67
66
68
my $userbranch = '';
67
my $userbranch = '';
69
if (C4::Context->userenv && C4::Context->userenv->{'branch'}) {
68
if ( C4::Context->userenv && C4::Context->userenv->{'branch'} ) {
70
    $userbranch = C4::Context->userenv->{'branch'};
69
    $userbranch = C4::Context->userenv->{'branch'};
71
}
70
}
72
71
73
74
# Select borrowers infos
72
# Select borrowers infos
75
my $findborrower = $input->param('findborrower');
73
my $findborrower = $input->param('findborrower');
76
$findborrower = '' unless defined $findborrower;
74
$findborrower = '' unless defined $findborrower;
Lines 81-124 my $maxreserves; Link Here
81
my $warnings;
79
my $warnings;
82
my $messages;
80
my $messages;
83
81
84
my $date = C4::Dates->today('iso');
82
my $date   = C4::Dates->today('iso');
85
my $action = $input->param('action');
83
my $action = $input->param('action');
86
$action ||= q{};
84
$action ||= q{};
87
85
88
if ( $action eq 'move' ) {
86
if ( $action eq 'move' ) {
89
  my $where = $input->param('where');
87
    my $where      = $input->param('where');
90
  my $reserve_id = $input->param('reserve_id');
88
    my $reserve_id = $input->param('reserve_id');
91
  AlterPriority( $where, $reserve_id );
89
    AlterPriority( $where, $reserve_id );
92
} elsif ( $action eq 'cancel' ) {
90
}
93
  my $reserve_id = $input->param('reserve_id');
91
elsif ( $action eq 'cancel' ) {
94
  CancelReserve({ reserve_id => $reserve_id });
92
    my $reserve_id = $input->param('reserve_id');
95
} elsif ( $action eq 'setLowestPriority' ) {
93
    CancelReserve( { reserve_id => $reserve_id } );
96
  my $reserve_id = $input->param('reserve_id');
94
}
97
  ToggleLowestPriority( $reserve_id );
95
elsif ( $action eq 'setLowestPriority' ) {
98
} elsif ( $action eq 'toggleSuspend' ) {
96
    my $reserve_id = $input->param('reserve_id');
99
  my $reserve_id = $input->param('reserve_id');
97
    ToggleLowestPriority($reserve_id);
100
  my $suspend_until  = $input->param('suspend_until');
98
}
101
  ToggleSuspend( $reserve_id, $suspend_until );
99
elsif ( $action eq 'toggleSuspend' ) {
100
    my $reserve_id    = $input->param('reserve_id');
101
    my $suspend_until = $input->param('suspend_until');
102
    ToggleSuspend( $reserve_id, $suspend_until );
102
}
103
}
103
104
104
if ($findborrower) {
105
if ($findborrower) {
105
    my $borrowers = Search($findborrower, 'cardnumber');
106
    my $borrowers = Search( $findborrower, 'cardnumber' );
106
107
107
    if ($borrowers && @$borrowers) {
108
    if ( $borrowers && @$borrowers ) {
108
        if ( @$borrowers == 1 ) {
109
        if ( @$borrowers == 1 ) {
109
            $borrowernumber_hold = $borrowers->[0]->{'borrowernumber'};
110
            $borrowernumber_hold = $borrowers->[0]->{'borrowernumber'};
110
        }
111
        }
111
        else {
112
        else {
112
            $template->param( borrower_list => sort_borrowerlist($borrowers));
113
            $template->param( borrower_list => sort_borrowerlist($borrowers) );
113
        }
114
        }
114
    } else {
115
    }
116
    else {
115
        $messageborrower = "'$findborrower'";
117
        $messageborrower = "'$findborrower'";
116
    }
118
    }
117
}
119
}
118
120
119
# If we have the borrowernumber because we've performed an action, then we
121
# If we have the borrowernumber because we've performed an action, then we
120
# don't want to try to place another reserve.
122
# don't want to try to place another reserve.
121
if ($borrowernumber_hold && !$action) {
123
if ( $borrowernumber_hold && !$action ) {
122
    my $borrowerinfo = GetMember( borrowernumber => $borrowernumber_hold );
124
    my $borrowerinfo = GetMember( borrowernumber => $borrowernumber_hold );
123
    my $diffbranch;
125
    my $diffbranch;
124
    my @getreservloop;
126
    my @getreservloop;
Lines 127-145 if ($borrowernumber_hold && !$action) { Link Here
127
    # we check the reserves of the borrower, and if he can reserv a document
129
    # we check the reserves of the borrower, and if he can reserv a document
128
    # FIXME At this time we have a simple count of reservs, but, later, we could improve the infos "title" ...
130
    # FIXME At this time we have a simple count of reservs, but, later, we could improve the infos "title" ...
129
131
130
    my $number_reserves =
132
    my $number_reserves = GetReserveCount( $borrowerinfo->{'borrowernumber'} );
131
      GetReserveCount( $borrowerinfo->{'borrowernumber'} );
132
133
133
    if ( C4::Context->preference('maxreserves') && ($number_reserves >= C4::Context->preference('maxreserves')) ) {
134
    if ( C4::Context->preference('maxreserves') && ( $number_reserves >= C4::Context->preference('maxreserves') ) ) {
134
        $warnings = 1;
135
        $warnings    = 1;
135
        $maxreserves = 1;
136
        $maxreserves = 1;
136
    }
137
    }
137
138
138
    # we check the date expiry of the borrower (only if there is an expiry date, otherwise, set to 1 (warn)
139
    # we check the date expiry of the borrower (only if there is an expiry date, otherwise, set to 1 (warn)
139
    my $expiry_date = $borrowerinfo->{dateexpiry};
140
    my $expiry_date = $borrowerinfo->{dateexpiry};
140
    my $expiry = 0; # flag set if patron account has expired
141
    my $expiry      = 0;                             # flag set if patron account has expired
141
    if ($expiry_date and $expiry_date ne '0000-00-00' and
142
    if (    $expiry_date
142
        Date_to_Days(split /-/,$date) > Date_to_Days(split /-/,$expiry_date)) {
143
        and $expiry_date ne '0000-00-00'
144
        and Date_to_Days( split /-/, $date ) > Date_to_Days( split /-/, $expiry_date ) )
145
    {
143
        $expiry = 1;
146
        $expiry = 1;
144
    }
147
    }
145
148
Lines 149-172 if ($borrowernumber_hold && !$action) { Link Here
149
    }
152
    }
150
153
151
    $template->param(
154
    $template->param(
152
                borrowernumber      => $borrowerinfo->{'borrowernumber'},
155
        borrowernumber        => $borrowerinfo->{'borrowernumber'},
153
                borrowersurname     => $borrowerinfo->{'surname'},
156
        borrowersurname       => $borrowerinfo->{'surname'},
154
                borrowerfirstname   => $borrowerinfo->{'firstname'},
157
        borrowerfirstname     => $borrowerinfo->{'firstname'},
155
                borrowerstreetaddress   => $borrowerinfo->{'address'},
158
        borrowerstreetaddress => $borrowerinfo->{'address'},
156
                borrowercity        => $borrowerinfo->{'city'},
159
        borrowercity          => $borrowerinfo->{'city'},
157
                borrowerphone       => $borrowerinfo->{'phone'},
160
        borrowerphone         => $borrowerinfo->{'phone'},
158
                borrowermobile      => $borrowerinfo->{'mobile'},
161
        borrowermobile        => $borrowerinfo->{'mobile'},
159
                borrowerfax         => $borrowerinfo->{'fax'},
162
        borrowerfax           => $borrowerinfo->{'fax'},
160
                borrowerphonepro    => $borrowerinfo->{'phonepro'},
163
        borrowerphonepro      => $borrowerinfo->{'phonepro'},
161
                borroweremail       => $borrowerinfo->{'email'},
164
        borroweremail         => $borrowerinfo->{'email'},
162
                borroweremailpro    => $borrowerinfo->{'emailpro'},
165
        borroweremailpro      => $borrowerinfo->{'emailpro'},
163
                borrowercategory    => $borrowerinfo->{'category'},
166
        borrowercategory      => $borrowerinfo->{'category'},
164
                borrowerreservs     => $count_reserv,
167
        borrowerreservs       => $count_reserv,
165
                cardnumber          => $borrowerinfo->{'cardnumber'},
168
        cardnumber            => $borrowerinfo->{'cardnumber'},
166
                expiry              => $expiry,
169
        expiry                => $expiry,
167
                diffbranch          => $diffbranch,
170
        diffbranch            => $diffbranch,
168
                messages            => $messages,
171
        messages              => $messages,
169
                warnings            => $warnings
172
        warnings              => $warnings
170
    );
173
    );
171
}
174
}
172
175
Lines 179-190 my @biblionumbers = (); Link Here
179
my $biblionumbers = $input->param('biblionumbers');
182
my $biblionumbers = $input->param('biblionumbers');
180
if ($multihold) {
183
if ($multihold) {
181
    @biblionumbers = split '/', $biblionumbers;
184
    @biblionumbers = split '/', $biblionumbers;
182
} else {
185
}
186
else {
183
    push @biblionumbers, $input->param('biblionumber');
187
    push @biblionumbers, $input->param('biblionumber');
184
}
188
}
185
189
186
my $itemdata_enumchron = 0;
190
my $itemdata_enumchron = 0;
187
my @biblioloop = ();
191
my @biblioloop         = ();
188
foreach my $biblionumber (@biblionumbers) {
192
foreach my $biblionumber (@biblionumbers) {
189
193
190
    my %biblioloopiter = ();
194
    my %biblioloopiter = ();
Lines 208-242 foreach my $biblionumber (@biblionumbers) { Link Here
208
    }
212
    }
209
213
210
    my $alreadypossession;
214
    my $alreadypossession;
211
    if (not C4::Context->preference('AllowHoldsOnPatronsPossessions') and CheckIfIssuedToPatron($borrowerinfo->{borrowernumber},$biblionumber)) {
215
    if ( not C4::Context->preference('AllowHoldsOnPatronsPossessions')
216
        and CheckIfIssuedToPatron( $borrowerinfo->{borrowernumber}, $biblionumber ) )
217
    {
212
        $alreadypossession = 1;
218
        $alreadypossession = 1;
213
    }
219
    }
214
220
215
    # get existing reserves .....
221
    # get existing reserves .....
216
    my $reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber, all_dates => 1 });
222
    my $reserves        = GetReservesFromBiblionumber( { biblionumber => $biblionumber, all_dates => 1 } );
217
    my $count = scalar( @$reserves );
223
    my $count           = scalar(@$reserves);
218
    my $totalcount = $count;
224
    my $totalcount      = $count;
219
    my $holds_count = 0;
225
    my $holds_count     = 0;
220
    my $alreadyreserved = 0;
226
    my $alreadyreserved = 0;
221
227
222
    foreach my $res (@$reserves) {
228
    foreach my $res (@$reserves) {
223
        if ( defined $res->{found} ) { # found can be 'W' or 'T'
229
        if ( defined $res->{found} ) {    # found can be 'W' or 'T'
224
            $count--;
230
            $count--;
225
        }
231
        }
226
232
227
        if ( defined $borrowerinfo && defined($borrowerinfo->{borrowernumber}) && ($borrowerinfo->{borrowernumber} eq $res->{borrowernumber}) ) {
233
        if (   defined $borrowerinfo
234
            && defined( $borrowerinfo->{borrowernumber} )
235
            && ( $borrowerinfo->{borrowernumber} eq $res->{borrowernumber} ) )
236
        {
228
            $holds_count++;
237
            $holds_count++;
229
        }
238
        }
230
    }
239
    }
231
240
232
    if ( $holds_count ) {
241
    if ($holds_count) {
233
            $alreadyreserved = 1;
242
        $alreadyreserved            = 1;
234
            $biblioloopiter{warn} = 1;
243
        $biblioloopiter{warn}       = 1;
235
            $biblioloopiter{alreadyres} = 1;
244
        $biblioloopiter{alreadyres} = 1;
236
    }
245
    }
237
246
238
    $template->param(
247
    $template->param(
239
        alreadyreserved => $alreadyreserved,
248
        alreadyreserved   => $alreadyreserved,
240
        alreadypossession => $alreadypossession,
249
        alreadypossession => $alreadypossession,
241
    );
250
    );
242
251
Lines 246-277 foreach my $biblionumber (@biblionumbers) { Link Here
246
    my @optionloop;
255
    my @optionloop;
247
    for ( 1 .. $count + 1 ) {
256
    for ( 1 .. $count + 1 ) {
248
        push(
257
        push(
249
             @optionloop,
258
            @optionloop,
250
             {
259
            {
251
              num      => $_,
260
                num      => $_,
252
              selected => ( $_ == $count + 1 ),
261
                selected => ( $_ == $count + 1 ),
253
             }
262
            }
254
            );
263
        );
255
    }
264
    }
265
256
    # adding a fixed value for priority options
266
    # adding a fixed value for priority options
257
    my $fixedRank = $count+1;
267
    my $fixedRank = $count + 1;
258
268
259
    my @branchcodes;
269
    my @branchcodes;
260
    my %itemnumbers_of_biblioitem;
270
    my %itemnumbers_of_biblioitem;
261
    my @itemnumbers;
271
    my @itemnumbers;
262
272
263
    ## $items is array of 'item' table numbers
273
    ## $items is array of 'item' table numbers
264
    if (my $items = get_itemnumbers_of($biblionumber)->{$biblionumber}){
274
    if ( my $items = get_itemnumbers_of($biblionumber)->{$biblionumber} ) {
265
        @itemnumbers  = @$items;
275
        @itemnumbers = @$items;
266
    }
276
    }
267
    my @hostitems = get_hostitemnumbers_of($biblionumber);
277
    my @hostitems = get_hostitemnumbers_of($biblionumber);
268
    if (@hostitems){
278
    if (@hostitems) {
269
        $template->param('hostitemsflag' => 1);
279
        $template->param( 'hostitemsflag' => 1 );
270
        push(@itemnumbers, @hostitems);
280
        push( @itemnumbers, @hostitems );
271
    }
281
    }
272
282
273
    if (!@itemnumbers) {
283
    if ( !@itemnumbers ) {
274
        $template->param('noitems' => 1);
284
        $template->param( 'noitems' => 1 );
275
        $biblioloopiter{noitems} = 1;
285
        $biblioloopiter{noitems} = 1;
276
    }
286
    }
277
287
Lines 291-325 foreach my $biblionumber (@biblionumbers) { Link Here
291
    my $notforloan_label_of = get_notforloan_label_of();
301
    my $notforloan_label_of = get_notforloan_label_of();
292
302
293
    ## Hash of biblioitemnumber to 'biblioitem' table records
303
    ## Hash of biblioitemnumber to 'biblioitem' table records
294
    my $biblioiteminfos_of  = GetBiblioItemInfosOf(@biblioitemnumbers);
304
    my $biblioiteminfos_of = GetBiblioItemInfosOf(@biblioitemnumbers);
295
305
296
    my @bibitemloop;
306
    my @bibitemloop;
297
307
298
    foreach my $biblioitemnumber (@biblioitemnumbers) {
308
    foreach my $biblioitemnumber (@biblioitemnumbers) {
299
        my $biblioitem = $biblioiteminfos_of->{$biblioitemnumber};
309
        my $biblioitem    = $biblioiteminfos_of->{$biblioitemnumber};
300
        my $num_available = 0;
310
        my $num_available = 0;
301
        my $num_override  = 0;
311
        my $num_override  = 0;
302
        my $hiddencount   = 0;
312
        my $hiddencount   = 0;
303
313
304
        $biblioitem->{description} =
314
        $biblioitem->{description} =
305
          $itemtypes->{ $biblioitem->{itemtype} }{description};
315
          $itemtypes->{ $biblioitem->{itemtype} }{description};
306
	if($biblioitem->{biblioitemnumber} ne $biblionumber){
316
        if ( $biblioitem->{biblioitemnumber} ne $biblionumber ) {
307
		$biblioitem->{hostitemsflag}=1;
317
            $biblioitem->{hostitemsflag} = 1;
308
	}
318
        }
309
        $biblioloopiter{description} = $biblioitem->{description};
319
        $biblioloopiter{description} = $biblioitem->{description};
310
        $biblioloopiter{itypename} = $biblioitem->{description};
320
        $biblioloopiter{itypename}   = $biblioitem->{description};
311
        $biblioloopiter{imageurl} =
321
        $biblioloopiter{imageurl} =
312
          getitemtypeimagelocation('intranet', $itemtypes->{$biblioitem->{itemtype}}{imageurl});
322
          getitemtypeimagelocation( 'intranet', $itemtypes->{ $biblioitem->{itemtype} }{imageurl} );
313
323
314
        foreach my $itemnumber ( @{ $itemnumbers_of_biblioitem{$biblioitemnumber} } )    {
324
        foreach my $itemnumber ( @{ $itemnumbers_of_biblioitem{$biblioitemnumber} } ) {
315
            my $item = $iteminfos_of->{$itemnumber};
325
            my $item = $iteminfos_of->{$itemnumber};
316
326
317
            unless (C4::Context->preference('item-level_itypes')) {
327
            unless ( C4::Context->preference('item-level_itypes') ) {
318
                $item->{itype} = $biblioitem->{itemtype};
328
                $item->{itype} = $biblioitem->{itemtype};
319
            }
329
            }
320
330
321
            $item->{itypename} = $itemtypes->{ $item->{itype} }{description};
331
            $item->{itypename}      = $itemtypes->{ $item->{itype} }{description};
322
            $item->{imageurl} = getitemtypeimagelocation( 'intranet', $itemtypes->{ $item->{itype} }{imageurl} );
332
            $item->{imageurl}       = getitemtypeimagelocation( 'intranet', $itemtypes->{ $item->{itype} }{imageurl} );
323
            $item->{homebranchname} = $branches->{ $item->{homebranch} }{branchname};
333
            $item->{homebranchname} = $branches->{ $item->{homebranch} }{branchname};
324
334
325
            # if the holdingbranch is different than the homebranch, we show the
335
            # if the holdingbranch is different than the homebranch, we show the
Lines 329-362 foreach my $biblionumber (@biblionumbers) { Link Here
329
                  $branches->{ $item->{holdingbranch} }{branchname};
339
                  $branches->{ $item->{holdingbranch} }{branchname};
330
            }
340
            }
331
341
332
		if($item->{biblionumber} ne $biblionumber){
342
            if ( $item->{biblionumber} ne $biblionumber ) {
333
			$item->{hostitemsflag}=1;
343
                $item->{hostitemsflag} = 1;
334
		        $item->{hosttitle} = GetBiblioData($item->{biblionumber})->{title};
344
                $item->{hosttitle}     = GetBiblioData( $item->{biblionumber} )->{title};
335
		}
345
            }
336
		
346
337
            #   add information
347
            #   add information
338
            $item->{itemcallnumber} = $item->{itemcallnumber};
348
            $item->{itemcallnumber} = $item->{itemcallnumber};
339
349
340
            # if the item is currently on loan, we display its return date and
350
            # if the item is currently on loan, we display its return date and
341
            # change the background color
351
            # change the background color
342
            my $issues= GetItemIssue($itemnumber);
352
            my $issues = GetItemIssue($itemnumber);
343
            if ( $issues->{'date_due'} ) {
353
            if ( $issues->{'date_due'} ) {
344
                $item->{date_due} = format_sqldatetime($issues->{date_due});
354
                $item->{date_due}        = format_sqldatetime( $issues->{date_due} );
345
                $item->{backgroundcolor} = 'onloan';
355
                $item->{backgroundcolor} = 'onloan';
346
            }
356
            }
347
357
348
            # checking reserve
358
            # checking reserve
349
            my ($reservedate,$reservedfor,$expectedAt,$reserve_id,$wait) = GetReservesFromItemnumber($itemnumber);
359
            my ( $reservedate, $reservedfor, $expectedAt, $reserve_id, $wait ) = GetReservesFromItemnumber($itemnumber);
350
            my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor );
360
            my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor );
351
361
352
            if ( defined $reservedate ) {
362
            if ( defined $reservedate ) {
353
                $item->{backgroundcolor} = 'reserved';
363
                $item->{backgroundcolor}           = 'reserved';
354
                $item->{reservedate}     = format_date($reservedate);
364
                $item->{reservedate}               = format_date($reservedate);
355
                $item->{ReservedForBorrowernumber}     = $reservedfor;
365
                $item->{ReservedForBorrowernumber} = $reservedfor;
356
                $item->{ReservedForSurname}     = $ItemBorrowerReserveInfo->{'surname'};
366
                $item->{ReservedForSurname}        = $ItemBorrowerReserveInfo->{'surname'};
357
                $item->{ReservedForFirstname}     = $ItemBorrowerReserveInfo->{'firstname'};
367
                $item->{ReservedForFirstname}      = $ItemBorrowerReserveInfo->{'firstname'};
358
                $item->{ExpectedAtLibrary}     = $branches->{$expectedAt}{branchname};
368
                $item->{ExpectedAtLibrary}         = $branches->{$expectedAt}{branchname};
359
                $item->{waitingdate} = $wait;
369
                $item->{waitingdate}               = $wait;
360
            }
370
            }
361
371
362
            # Management of the notforloan document
372
            # Management of the notforloan document
Lines 371-396 foreach my $biblionumber (@biblionumbers) { Link Here
371
381
372
                # FIXME localized strings should never be in Perl code
382
                # FIXME localized strings should never be in Perl code
373
                $item->{message} =
383
                $item->{message} =
374
                  $item->{itemlost} == 1 ? "(lost)"
384
                    $item->{itemlost} == 1 ? "(lost)"
375
                    : $item->{itemlost} == 2 ? "(long overdue)"
385
                  : $item->{itemlost} == 2 ? "(long overdue)"
376
                      : "";
386
                  :                          "";
377
                $item->{backgroundcolor} = 'other';
387
                $item->{backgroundcolor} = 'other';
378
                if (GetHideLostItemsPreference($borrowernumber) && !$showallitems) {
388
                if ( GetHideLostItemsPreference($borrowernumber) && !$showallitems ) {
379
                    $item->{hide} = 1;
389
                    $item->{hide} = 1;
380
                    $hiddencount++;
390
                    $hiddencount++;
381
                }
391
                }
382
            }
392
            }
383
393
384
            # Check the transit status
394
            # Check the transit status
385
            my ( $transfertwhen, $transfertfrom, $transfertto ) =
395
            my ( $transfertwhen, $transfertfrom, $transfertto ) = GetTransfers($itemnumber);
386
              GetTransfers($itemnumber);
387
396
388
            if ( defined $transfertwhen && $transfertwhen ne '' ) {
397
            if ( defined $transfertwhen && $transfertwhen ne '' ) {
389
                $item->{transfertwhen} = format_date($transfertwhen);
398
                $item->{transfertwhen} = format_date($transfertwhen);
390
                $item->{transfertfrom} =
399
                $item->{transfertfrom} =
391
                  $branches->{$transfertfrom}{branchname};
400
                  $branches->{$transfertfrom}{branchname};
392
                $item->{transfertto} = $branches->{$transfertto}{branchname};
401
                $item->{transfertto} = $branches->{$transfertto}{branchname};
393
                $item->{nocancel} = 1;
402
                $item->{nocancel}    = 1;
394
            }
403
            }
395
404
396
            # If there is no loan, return and transfer, we show a checkbox.
405
            # If there is no loan, return and transfer, we show a checkbox.
Lines 399-406 foreach my $biblionumber (@biblionumbers) { Link Here
399
            # if independent branches is on we need to check if the person can reserve
408
            # if independent branches is on we need to check if the person can reserve
400
            # for branches they arent logged in to
409
            # for branches they arent logged in to
401
            if ( C4::Context->preference("IndependentBranches") ) {
410
            if ( C4::Context->preference("IndependentBranches") ) {
402
                if (! C4::Context->preference("canreservefromotherbranches")){
411
                if ( !C4::Context->preference("canreservefromotherbranches") ) {
403
                    # cant reserve items so need to check if item homebranch and userenv branch match if not we cant reserve
412
413
                # cant reserve items so need to check if item homebranch and userenv branch match if not we cant reserve
404
                    my $userenv = C4::Context->userenv;
414
                    my $userenv = C4::Context->userenv;
405
                    unless ( C4::Context->IsSuperLibrarian ) {
415
                    unless ( C4::Context->IsSuperLibrarian ) {
406
                        $item->{cantreserve} = 1 if ( $item->{homebranch} ne $userenv->{branch} );
416
                        $item->{cantreserve} = 1 if ( $item->{homebranch} ne $userenv->{branch} );
Lines 408-511 foreach my $biblionumber (@biblionumbers) { Link Here
408
                }
418
                }
409
            }
419
            }
410
420
411
            my $branch = C4::Circulation::_GetCircControlBranch($item, $borrowerinfo);
421
            my $branch = C4::Circulation::_GetCircControlBranch( $item, $borrowerinfo );
412
422
413
            my $branchitemrule = GetBranchItemRule( $branch, $item->{'itype'} );
423
            my $branchitemrule = GetBranchItemRule( $branch, $item->{'itype'} );
414
            my $policy_holdallowed = 1;
424
            my $policy_holdallowed = 1;
415
425
416
            $item->{'holdallowed'} = $branchitemrule->{'holdallowed'};
426
            $item->{'holdallowed'} = $branchitemrule->{'holdallowed'};
417
427
418
            if ( $branchitemrule->{'holdallowed'} == 0 ||
428
            if (
419
                 ( $branchitemrule->{'holdallowed'} == 1 &&
429
                $branchitemrule->{'holdallowed'} == 0
420
                     $borrowerinfo->{'branchcode'} ne $item->{'homebranch'} ) ) {
430
                || (   $branchitemrule->{'holdallowed'} == 1
431
                    && $borrowerinfo->{'branchcode'} ne $item->{'homebranch'} )
432
              )
433
            {
421
                $policy_holdallowed = 0;
434
                $policy_holdallowed = 0;
422
            }
435
            }
423
            
436
424
            if (
437
            if (   $policy_holdallowed
425
                   $policy_holdallowed
426
                && !$item->{cantreserve}
438
                && !$item->{cantreserve}
427
                && IsAvailableForItemLevelRequest($itemnumber)
439
                && IsAvailableForItemLevelRequest($itemnumber)
428
                && CanItemBeReserved(
440
                && CanItemBeReserved( $borrowerinfo->{borrowernumber}, $itemnumber ) eq 'OK' )
429
                    $borrowerinfo->{borrowernumber}, $itemnumber
430
                ) eq 'OK'
431
              )
432
            {
441
            {
433
                $item->{available} = 1;
442
                $item->{available} = 1;
434
                $num_available++;
443
                $num_available++;
435
            }
444
            }
436
            elsif ( C4::Context->preference('AllowHoldPolicyOverride') ) {
445
            elsif ( C4::Context->preference('AllowHoldPolicyOverride') ) {
446
437
                # If AllowHoldPolicyOverride is set, it should override EVERY restriction, not just branch item rules
447
                # If AllowHoldPolicyOverride is set, it should override EVERY restriction, not just branch item rules
438
                $item->{override} = 1;
448
                $item->{override} = 1;
439
                $num_override++;
449
                $num_override++;
440
            }
450
            }
441
451
442
            # If none of the conditions hold true, then neither override nor available is set and the item cannot be checked
452
        # If none of the conditions hold true, then neither override nor available is set and the item cannot be checked
443
453
444
            # Show serial enumeration when needed
454
            # Show serial enumeration when needed
445
            if ($item->{enumchron}) {
455
            if ( $item->{enumchron} ) {
446
                $itemdata_enumchron = 1;
456
                $itemdata_enumchron = 1;
447
            }
457
            }
448
458
449
            push @{ $biblioitem->{itemloop} }, $item;
459
            push @{ $biblioitem->{itemloop} }, $item;
450
        }
460
        }
451
461
452
        if ( $num_override == scalar( @{ $biblioitem->{itemloop} } ) ) { # That is, if all items require an override
462
        if ( $num_override == scalar( @{ $biblioitem->{itemloop} } ) ) {    # That is, if all items require an override
453
            $template->param( override_required => 1 );
463
            $template->param( override_required => 1 );
454
        } elsif ( $num_available == 0 ) {
464
        }
465
        elsif ( $num_available == 0 ) {
455
            $template->param( none_available => 1 );
466
            $template->param( none_available => 1 );
456
            $biblioloopiter{warn} = 1;
467
            $biblioloopiter{warn}       = 1;
457
            $biblioloopiter{none_avail} = 1;
468
            $biblioloopiter{none_avail} = 1;
458
        }
469
        }
459
        $template->param( hiddencount => $hiddencount);
470
        $template->param( hiddencount => $hiddencount );
460
471
461
        push @bibitemloop, $biblioitem;
472
        push @bibitemloop, $biblioitem;
462
    }
473
    }
463
474
464
    # existingreserves building
475
    # existingreserves building
465
    my @reserveloop;
476
    my @reserveloop;
466
    $reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber, all_dates => 1 });
477
    $reserves = GetReservesFromBiblionumber( { biblionumber => $biblionumber, all_dates => 1 } );
467
    foreach my $res ( sort {
478
    foreach my $res (
479
        sort {
468
            my $a_found = $a->{found} || '';
480
            my $a_found = $a->{found} || '';
469
            my $b_found = $a->{found} || '';
481
            my $b_found = $a->{found} || '';
470
            $a_found cmp $b_found;
482
            $a_found cmp $b_found;
471
        } @$reserves ) {
483
        } @$reserves
484
      )
485
    {
472
        my %reserve;
486
        my %reserve;
473
        my @optionloop;
487
        my @optionloop;
474
        for ( my $i = 1 ; $i <= $totalcount ; $i++ ) {
488
        for ( my $i = 1 ; $i <= $totalcount ; $i++ ) {
475
            push(
489
            push(
476
                 @optionloop,
490
                @optionloop,
477
                 {
491
                {
478
                  num      => $i,
492
                    num      => $i,
479
                  selected => ( $i == $res->{priority} ),
493
                    selected => ( $i == $res->{priority} ),
480
                 }
494
                }
481
                );
495
            );
482
        }
496
        }
483
497
484
        if ( defined $res->{'found'} && ($res->{'found'} eq 'W' || $res->{'found'} eq 'T' )) {
498
        if ( defined $res->{'found'} && ( $res->{'found'} eq 'W' || $res->{'found'} eq 'T' ) ) {
485
            my $item = $res->{'itemnumber'};
499
            my $item = $res->{'itemnumber'};
486
            $item = GetBiblioFromItemNumber($item,undef);
500
            $item = GetBiblioFromItemNumber( $item, undef );
487
            $reserve{'wait'}= 1;
501
            $reserve{'wait'}          = 1;
488
            $reserve{'holdingbranch'}=$item->{'holdingbranch'};
502
            $reserve{'holdingbranch'} = $item->{'holdingbranch'};
489
            $reserve{'biblionumber'}=$item->{'biblionumber'};
503
            $reserve{'biblionumber'}  = $item->{'biblionumber'};
490
            $reserve{'barcodenumber'}   = $item->{'barcode'};
504
            $reserve{'barcodenumber'} = $item->{'barcode'};
491
            $reserve{'wbrcode'} = $res->{'branchcode'};
505
            $reserve{'wbrcode'}       = $res->{'branchcode'};
492
            $reserve{'itemnumber'}  = $res->{'itemnumber'};
506
            $reserve{'itemnumber'}    = $res->{'itemnumber'};
493
            $reserve{'wbrname'} = $branches->{$res->{'branchcode'}}->{'branchname'};
507
            $reserve{'wbrname'}       = $branches->{ $res->{'branchcode'} }->{'branchname'};
494
            if($reserve{'holdingbranch'} eq $reserve{'wbrcode'}){
508
            if ( $reserve{'holdingbranch'} eq $reserve{'wbrcode'} ) {
509
495
                # Just because the holdingbranch matches the reserve branch doesn't mean the item
510
                # Just because the holdingbranch matches the reserve branch doesn't mean the item
496
                # has arrived at the destination, check for an open transfer for the item as well
511
                # has arrived at the destination, check for an open transfer for the item as well
497
                my ( $transfertwhen, $transfertfrom, $transferto ) = C4::Circulation::GetTransfers( $res->{itemnumber} );
512
                my ( $transfertwhen, $transfertfrom, $transferto ) =
513
                  C4::Circulation::GetTransfers( $res->{itemnumber} );
498
                if ( not $transferto or $transferto ne $res->{branchcode} ) {
514
                if ( not $transferto or $transferto ne $res->{branchcode} ) {
499
                    $reserve{'atdestination'} = 1;
515
                    $reserve{'atdestination'} = 1;
500
                }
516
                }
501
            }
517
            }
518
502
            # set found to 1 if reserve is waiting for patron pickup
519
            # set found to 1 if reserve is waiting for patron pickup
503
            $reserve{'found'} = 1 if $res->{'found'} eq 'W';
520
            $reserve{'found'}     = 1 if $res->{'found'} eq 'W';
504
            $reserve{'intransit'} = 1 if $res->{'found'} eq 'T';
521
            $reserve{'intransit'} = 1 if $res->{'found'} eq 'T';
505
        } elsif ($res->{priority} > 0) {
522
        }
506
            if (defined($res->{itemnumber})) {
523
        elsif ( $res->{priority} > 0 ) {
507
                my $item = GetItem($res->{itemnumber});
524
            if ( defined( $res->{itemnumber} ) ) {
508
                $reserve{'itemnumber'}  = $res->{'itemnumber'};
525
                my $item = GetItem( $res->{itemnumber} );
526
                $reserve{'itemnumber'}      = $res->{'itemnumber'};
509
                $reserve{'barcodenumber'}   = $item->{'barcode'};
527
                $reserve{'barcodenumber'}   = $item->{'barcode'};
510
                $reserve{'item_level_hold'} = 1;
528
                $reserve{'item_level_hold'} = 1;
511
            }
529
            }
Lines 513-524 foreach my $biblionumber (@biblionumbers) { Link Here
513
531
514
        #     get borrowers reserve info
532
        #     get borrowers reserve info
515
        my $reserveborrowerinfo = GetMember( borrowernumber => $res->{'borrowernumber'} );
533
        my $reserveborrowerinfo = GetMember( borrowernumber => $res->{'borrowernumber'} );
516
        if (C4::Context->preference('HidePatronName')){
534
        if ( C4::Context->preference('HidePatronName') ) {
517
	    $reserve{'hidename'} = 1;
535
            $reserve{'hidename'}   = 1;
518
	    $reserve{'cardnumber'} = $reserveborrowerinfo->{'cardnumber'};
536
            $reserve{'cardnumber'} = $reserveborrowerinfo->{'cardnumber'};
519
	}
537
        }
520
        $reserve{'expirationdate'} = format_date( $res->{'expirationdate'} )
538
        $reserve{'expirationdate'} = format_date( $res->{'expirationdate'} )
521
            unless ( !defined($res->{'expirationdate'}) || $res->{'expirationdate'} eq '0000-00-00' );
539
          unless ( !defined( $res->{'expirationdate'} ) || $res->{'expirationdate'} eq '0000-00-00' );
522
        $reserve{'date'}           = format_date( $res->{'reservedate'} );
540
        $reserve{'date'}           = format_date( $res->{'reservedate'} );
523
        $reserve{'borrowernumber'} = $res->{'borrowernumber'};
541
        $reserve{'borrowernumber'} = $res->{'borrowernumber'};
524
        $reserve{'biblionumber'}   = $res->{'biblionumber'};
542
        $reserve{'biblionumber'}   = $res->{'biblionumber'};
Lines 526-549 foreach my $biblionumber (@biblionumbers) { Link Here
526
        $reserve{'firstname'}      = $reserveborrowerinfo->{'firstname'};
544
        $reserve{'firstname'}      = $reserveborrowerinfo->{'firstname'};
527
        $reserve{'surname'}        = $reserveborrowerinfo->{'surname'};
545
        $reserve{'surname'}        = $reserveborrowerinfo->{'surname'};
528
        $reserve{'notes'}          = $res->{'reservenotes'};
546
        $reserve{'notes'}          = $res->{'reservenotes'};
529
        $reserve{'wait'}           =
547
        $reserve{'wait'} =
530
          ( ( defined $res->{'found'} and $res->{'found'} eq 'W' ) or ( $res->{'priority'} eq '0' ) );
548
          ( ( defined $res->{'found'} and $res->{'found'} eq 'W' ) or ( $res->{'priority'} eq '0' ) );
531
        $reserve{'constrainttypea'} = ( $res->{'constrainttype'} eq 'a' );
549
        $reserve{'constrainttypea'} = ( $res->{'constrainttype'} eq 'a' );
532
        $reserve{'constrainttypeo'} = ( $res->{'constrainttype'} eq 'o' );
550
        $reserve{'constrainttypeo'} = ( $res->{'constrainttype'} eq 'o' );
533
        $reserve{'voldesc'}         = $res->{'volumeddesc'};
551
        $reserve{'voldesc'}         = $res->{'volumeddesc'};
534
        $reserve{'ccode'}           = $res->{'ccode'};
552
        $reserve{'ccode'}           = $res->{'ccode'};
535
        $reserve{'barcode'}         = $res->{'barcode'};
553
        $reserve{'barcode'}         = $res->{'barcode'};
536
        $reserve{'priority'}    = $res->{'priority'};
554
        $reserve{'priority'}        = $res->{'priority'};
537
        $reserve{'lowestPriority'}    = $res->{'lowestPriority'};
555
        $reserve{'lowestPriority'}  = $res->{'lowestPriority'};
538
        $reserve{'optionloop'} = \@optionloop;
556
        $reserve{'optionloop'}      = \@optionloop;
539
        $reserve{'suspend'} = $res->{'suspend'};
557
        $reserve{'suspend'}         = $res->{'suspend'};
540
        $reserve{'suspend_until'} = $res->{'suspend_until'};
558
        $reserve{'suspend_until'}   = $res->{'suspend_until'};
541
        $reserve{'reserve_id'} = $res->{'reserve_id'};
559
        $reserve{'reserve_id'}      = $res->{'reserve_id'};
542
560
543
        if ( C4::Context->preference('IndependentBranches') && $flags->{'superlibrarian'} != 1 ) {
561
        if ( C4::Context->preference('IndependentBranches') && $flags->{'superlibrarian'} != 1 ) {
544
              $reserve{'branchloop'} = [ GetBranchDetail($res->{'branchcode'}) ];
562
            $reserve{'branchloop'} = [ GetBranchDetail( $res->{'branchcode'} ) ];
545
        } else {
563
        }
546
              $reserve{'branchloop'} = GetBranchesLoop($res->{'branchcode'});
564
        else {
565
            $reserve{'branchloop'} = GetBranchesLoop( $res->{'branchcode'} );
547
        }
566
        }
548
567
549
        push( @reserveloop, \%reserve );
568
        push( @reserveloop, \%reserve );
Lines 553-587 foreach my $biblionumber (@biblionumbers) { Link Here
553
    my $time = time();
572
    my $time = time();
554
573
555
    $template->param(
574
    $template->param(
556
                     branchloop  => GetBranchesLoop($userbranch),
575
        branchloop => GetBranchesLoop($userbranch),
557
                     time        => $time,
576
        time       => $time,
558
                     fixedRank   => $fixedRank,
577
        fixedRank  => $fixedRank,
559
                    );
578
    );
560
579
561
    # display infos
580
    # display infos
562
    $template->param(
581
    $template->param(
563
                     optionloop        => \@optionloop,
582
        optionloop         => \@optionloop,
564
                     bibitemloop       => \@bibitemloop,
583
        bibitemloop        => \@bibitemloop,
565
                     itemdata_enumchron => $itemdata_enumchron,
584
        itemdata_enumchron => $itemdata_enumchron,
566
                     date              => $date,
585
        date               => $date,
567
                     biblionumber      => $biblionumber,
586
        biblionumber       => $biblionumber,
568
                     findborrower      => $findborrower,
587
        findborrower       => $findborrower,
569
                     title             => $dat->{title},
588
        title              => $dat->{title},
570
                     author            => $dat->{author},
589
        author             => $dat->{author},
571
                     holdsview => 1,
590
        holdsview          => 1,
572
                     C4::Search::enabled_staff_search_views,
591
        C4::Search::enabled_staff_search_views,
573
                    );
592
    );
574
    if (defined $borrowerinfo && exists $borrowerinfo->{'branchcode'}) {
593
    if ( defined $borrowerinfo && exists $borrowerinfo->{'branchcode'} ) {
575
        $template->param(
594
        $template->param(
576
                     borrower_branchname => $branches->{$borrowerinfo->{'branchcode'}}->{'branchname'},
595
            borrower_branchname => $branches->{ $borrowerinfo->{'branchcode'} }->{'branchname'},
577
                     borrower_branchcode => $borrowerinfo->{'branchcode'},
596
            borrower_branchcode => $borrowerinfo->{'branchcode'},
578
        );
597
        );
579
    }
598
    }
580
599
581
    $biblioloopiter{biblionumber} = $biblionumber;
600
    $biblioloopiter{biblionumber} = $biblionumber;
582
    $biblioloopiter{title} = $dat->{title};
601
    $biblioloopiter{title}        = $dat->{title};
583
    $biblioloopiter{rank} = $fixedRank;
602
    $biblioloopiter{rank}         = $fixedRank;
584
    $biblioloopiter{reserveloop} = \@reserveloop;
603
    $biblioloopiter{reserveloop}  = \@reserveloop;
585
604
586
    if (@reserveloop) {
605
    if (@reserveloop) {
587
        $template->param( reserveloop => \@reserveloop );
606
        $template->param( reserveloop => \@reserveloop );
Lines 590-609 foreach my $biblionumber (@biblionumbers) { Link Here
590
    push @biblioloop, \%biblioloopiter;
609
    push @biblioloop, \%biblioloopiter;
591
}
610
}
592
611
593
$template->param( biblioloop => \@biblioloop );
612
$template->param( biblioloop    => \@biblioloop );
594
$template->param( biblionumbers => $biblionumbers );
613
$template->param( biblionumbers => $biblionumbers );
595
$template->param( maxreserves => $maxreserves );
614
$template->param( maxreserves   => $maxreserves );
596
615
597
if ($multihold) {
616
if ($multihold) {
598
    $template->param( multi_hold => 1 );
617
    $template->param( multi_hold => 1 );
599
}
618
}
600
619
601
if ( C4::Context->preference( 'AllowHoldDateInFuture' ) ) {
620
if ( C4::Context->preference('AllowHoldDateInFuture') ) {
602
    $template->param( reserve_in_future => 1 );
621
    $template->param( reserve_in_future => 1 );
603
}
622
}
604
623
605
$template->param(
624
$template->param(
606
    SuspendHoldsIntranet => C4::Context->preference('SuspendHoldsIntranet'),
625
    SuspendHoldsIntranet     => C4::Context->preference('SuspendHoldsIntranet'),
607
    AutoResumeSuspendedHolds => C4::Context->preference('AutoResumeSuspendedHolds'),
626
    AutoResumeSuspendedHolds => C4::Context->preference('AutoResumeSuspendedHolds'),
608
);
627
);
609
628
Lines 613-621 output_html_with_http_headers $input, $cookie, $template->output; Link Here
613
sub sort_borrowerlist {
632
sub sort_borrowerlist {
614
    my $borrowerslist = shift;
633
    my $borrowerslist = shift;
615
    my $ref           = [];
634
    my $ref           = [];
616
    push @{$ref}, sort {
635
    push @{$ref},
617
        uc( $a->{surname} . $a->{firstname} ) cmp
636
      sort { uc( $a->{surname} . $a->{firstname} ) cmp uc( $b->{surname} . $b->{firstname} ) } @{$borrowerslist};
618
          uc( $b->{surname} . $b->{firstname} )
619
    } @{$borrowerslist};
620
    return $ref;
637
    return $ref;
621
}
638
}
622
- 

Return to bug 13517