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

(-)a/Koha/CirculationRules.pm (+3 lines)
Lines 163-168 our $RULE_KINDS = { Link Here
163
    note => { # This is not really a rule. Maybe we will want to separate this later.
163
    note => { # This is not really a rule. Maybe we will want to separate this later.
164
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
164
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
165
    },
165
    },
166
    holds_pickup_period => {
167
        scope => [ 'branchcode', 'categorycode', 'itemtype' ],
168
    },
166
    # Not included (deprecated?):
169
    # Not included (deprecated?):
167
    #   * accountsent
170
    #   * accountsent
168
    #   * reservecharge
171
    #   * reservecharge
(-)a/Koha/Hold.pm (+12 lines)
Lines 194-199 sub set_waiting { Link Here
194
    my $cancel_on_holidays = C4::Context->preference('ExpireReservesOnHolidays');
194
    my $cancel_on_holidays = C4::Context->preference('ExpireReservesOnHolidays');
195
195
196
    my $expirationdate = $today->clone;
196
    my $expirationdate = $today->clone;
197
198
    my $rule = Koha::CirculationRules->get_effective_rule({
199
        categorycode => $self->borrower->categorycode,
200
        itemtype => $self->item->effective_itemtype,
201
        branchcode => $self->branchcode,
202
        rule_name => 'holds_pickup_period',
203
    });
204
    if ( defined($rule) and $rule->rule_value ne '' ){
205
        # circulation rule overrides ReservesMaxPickUpDelay
206
        $max_pickup_delay = $rule->rule_value;
207
    }
208
197
    $expirationdate->add(days => $max_pickup_delay);
209
    $expirationdate->add(days => $max_pickup_delay);
198
210
199
    if ( C4::Context->preference("ExcludeHolidaysFromMaxPickUpDelay") ) {
211
    if ( C4::Context->preference("ExcludeHolidaysFromMaxPickUpDelay") ) {
(-)a/admin/smart-rules.pl (+2 lines)
Lines 287-292 elsif ($op eq 'add') { Link Here
287
    my $overduefinescap = $input->param('overduefinescap') || '';
287
    my $overduefinescap = $input->param('overduefinescap') || '';
288
    my $cap_fine_to_replacement_price = ($input->param('cap_fine_to_replacement_price') || '') eq 'on';
288
    my $cap_fine_to_replacement_price = ($input->param('cap_fine_to_replacement_price') || '') eq 'on';
289
    my $note = $input->param('note');
289
    my $note = $input->param('note');
290
    my $holds_pickup_period = strip_non_numeric($input->param('holds_pickup_period'));
290
    $debug and warn "Adding $br, $bor, $itemtype, $fine, $maxissueqty, $maxonsiteissueqty, $cap_fine_to_replacement_price";
291
    $debug and warn "Adding $br, $bor, $itemtype, $fine, $maxissueqty, $maxonsiteissueqty, $cap_fine_to_replacement_price";
291
292
292
    my $rules = {
293
    my $rules = {
Lines 320-325 elsif ($op eq 'add') { Link Here
320
        cap_fine_to_replacement_price => $cap_fine_to_replacement_price,
321
        cap_fine_to_replacement_price => $cap_fine_to_replacement_price,
321
        article_requests              => $article_requests,
322
        article_requests              => $article_requests,
322
        note                          => $note,
323
        note                          => $note,
324
        holds_pickup_period           => $holds_pickup_period,
323
    };
325
    };
324
326
325
    Koha::CirculationRules->set_rules(
327
    Koha::CirculationRules->set_rules(
(-)a/installer/data/mysql/atomicupdate/bug_8367-add_holds_pickup_period_circrule.perl (+6 lines)
Line 0 Link Here
1
$DBversion = 'XXX';
2
if( CheckVersion( $DBversion ) ) {
3
    $dbh->do(q{INSERT IGNORE INTO circulation_rules (branchcode, categorycode, itemtype, rule_name, rule_value) VALUES (NULL, NULL, NULL, 'holds_pickup_period', NULL) });
4
5
    NewVersion( $DBversion, 8367, "Add holds_pickup_period circulation rule" );
6
}
(-)a/installer/onboarding.pl (+1 lines)
Lines 287-292 if ( $step == 5 ) { Link Here
287
                rentaldiscount                   => 0,
287
                rentaldiscount                   => 0,
288
                reservesallowed                  => $reservesallowed,
288
                reservesallowed                  => $reservesallowed,
289
                suspension_chargeperiod          => undef,
289
                suspension_chargeperiod          => undef,
290
                holds_pickup_period              => undef,
290
              }
291
              }
291
        };
292
        };
292
293
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt (-1 / +6 lines)
Lines 122-127 Link Here
122
                <th>Holds per record (count)</th>
122
                <th>Holds per record (count)</th>
123
                <th>On shelf holds allowed</th>
123
                <th>On shelf holds allowed</th>
124
                <th>OPAC item level holds</th>
124
                <th>OPAC item level holds</th>
125
                <th>Holds pickup period (day)</th>
125
                <th>Article requests</th>
126
                <th>Article requests</th>
126
                <th>Rental discount (%)</th>
127
                <th>Rental discount (%)</th>
127
                <th>Actions</th>
128
                <th>Actions</th>
Lines 161-170 Link Here
161
                        [% SET holds_per_record = all_rules.$c.$i.holds_per_record %]
162
                        [% SET holds_per_record = all_rules.$c.$i.holds_per_record %]
162
                        [% SET onshelfholds = all_rules.$c.$i.onshelfholds %]
163
                        [% SET onshelfholds = all_rules.$c.$i.onshelfholds %]
163
                        [% SET opacitemholds = all_rules.$c.$i.opacitemholds %]
164
                        [% SET opacitemholds = all_rules.$c.$i.opacitemholds %]
165
                        [% SET holds_pickup_period = all_rules.$c.$i.holds_pickup_period %]
164
                        [% SET article_requests = all_rules.$c.$i.article_requests %]
166
                        [% SET article_requests = all_rules.$c.$i.article_requests %]
165
                        [% SET rentaldiscount = all_rules.$c.$i.rentaldiscount %]
167
                        [% SET rentaldiscount = all_rules.$c.$i.rentaldiscount %]
166
168
167
                        [% SET show_rule = note || maxissueqty || maxonsiteissueqty || issuelength || daysmode || lengthunit || hardduedate || hardduedatecompare || fine || chargeperiod || chargeperiod_charge_at || firstremind || overduefinescap || cap_fine_to_replacement_price || finedays || maxsuspensiondays || suspension_chargeperiod || renewalsallowed || renewalperiod || norenewalbefore || auto_renew || no_auto_renewal_after || no_auto_renewal_after_hard_limit || reservesallowed || holds_per_day || holds_per_record || onshelfholds || opacitemholds || article_requests || rentaldiscount %]
169
                        [% SET show_rule = note || maxissueqty || maxonsiteissueqty || issuelength || daysmode || lengthunit || hardduedate || hardduedatecompare || fine || chargeperiod || chargeperiod_charge_at || firstremind || overduefinescap || cap_fine_to_replacement_price || finedays || maxsuspensiondays || suspension_chargeperiod || renewalsallowed || renewalperiod || norenewalbefore || auto_renew || no_auto_renewal_after || no_auto_renewal_after_hard_limit || reservesallowed || holds_per_day || holds_per_record || onshelfholds || opacitemholds || article_requests || rentaldiscount || holds_pickup_period %]
168
                        [% IF show_rule %]
170
                        [% IF show_rule %]
169
                            [% SET row_count = row_count + 1 %]
171
                            [% SET row_count = row_count + 1 %]
170
                            <tr row_countd="row_[% row_count | html %]">
172
                            <tr row_countd="row_[% row_count | html %]">
Lines 308-313 Link Here
308
                                            <span>Don't allow</span>
310
                                            <span>Don't allow</span>
309
                                        [% END %]
311
                                        [% END %]
310
                                    </td>
312
                                    </td>
313
                                    <td>[% holds_pickup_period | html %]</td>
311
                                    <td>
314
                                    <td>
312
                                        [% IF article_requests == 'no' %]
315
                                        [% IF article_requests == 'no' %]
313
                                            <span>No</span>
316
                                            <span>No</span>
Lines 436-441 Link Here
436
                            <option value="F">Force</option>
439
                            <option value="F">Force</option>
437
                        </select>
440
                        </select>
438
                    </td>
441
                    </td>
442
                    <td><input type="text" name="holds_pickup_period" id="holds_pickup_period" size="2" /></td>
439
                    <td>
443
                    <td>
440
                        <select id="article_requests" name="article_requests">
444
                        <select id="article_requests" name="article_requests">
441
                            <option value="no">No</option>
445
                            <option value="no">No</option>
Lines 485-490 Link Here
485
                      <th>Holds per record (count)</th>
489
                      <th>Holds per record (count)</th>
486
                      <th>On shelf holds allowed</th>
490
                      <th>On shelf holds allowed</th>
487
                      <th>OPAC item level holds</th>
491
                      <th>OPAC item level holds</th>
492
                      <th>Holds pickup period (day)</th>
488
                      <th>Article requests</th>
493
                      <th>Article requests</th>
489
                      <th>Rental discount (%)</th>
494
                      <th>Rental discount (%)</th>
490
                      <th>&nbsp;</th>
495
                      <th>&nbsp;</th>
(-)a/misc/cronjobs/thirdparty/TalkingTech_itiva_outbound.pl (+12 lines)
Lines 344-349 sub GetWaitingHolds { Link Here
344
        my $calendar = Koha::Calendar->new( branchcode => $issue->{'site'}, days_mode => $daysmode );
344
        my $calendar = Koha::Calendar->new( branchcode => $issue->{'site'}, days_mode => $daysmode );
345
345
346
        my $waiting_date = dt_from_string( $issue->{waitingdate}, 'sql' );
346
        my $waiting_date = dt_from_string( $issue->{waitingdate}, 'sql' );
347
        my $item = Koha::Items->find({ barcode => $issue->{barcode} });
348
        my $rule = Koha::CirculationRules->get_effective_rule({
349
            categorycode => $issue->{categorycode},
350
            itemtype => $item->effective_itemtype,
351
            branchcode => $issue->{branchcode},
352
            rule_name => 'holds_pickup_period',
353
        });
354
        if ( defined($rule) and $rule->rule_value ne '' ){
355
            # circulation rule overrides ReservesMaxPickUpDelay
356
            $pickupdelay = $rule->rule_value;
357
        }
358
347
        my $pickup_date = $waiting_date->clone->add( days => $pickupdelay );
359
        my $pickup_date = $waiting_date->clone->add( days => $pickupdelay );
348
        if ( $calendar->is_holiday($pickup_date) ) {
360
        if ( $calendar->is_holiday($pickup_date) ) {
349
            $pickup_date = $calendar->next_open_days( $pickup_date, 1 );
361
            $pickup_date = $calendar->next_open_days( $pickup_date, 1 );
(-)a/t/db_dependent/Holds/WaitingReserves.t (-2 / +67 lines)
Lines 8-14 use Koha::DateUtils; Link Here
8
use t::lib::Mocks;
8
use t::lib::Mocks;
9
use t::lib::TestBuilder;
9
use t::lib::TestBuilder;
10
10
11
use Test::More tests => 11;
11
use Test::More tests => 13;
12
12
13
use_ok('C4::Reserves');
13
use_ok('C4::Reserves');
14
14
Lines 63-73 my $biblio = $builder->build_sample_biblio; Link Here
63
my $biblio2 = $builder->build_sample_biblio;
63
my $biblio2 = $builder->build_sample_biblio;
64
my $biblio3 = $builder->build_sample_biblio;
64
my $biblio3 = $builder->build_sample_biblio;
65
my $biblio4 = $builder->build_sample_biblio;
65
my $biblio4 = $builder->build_sample_biblio;
66
my $biblio5 = $builder->build_sample_biblio;
67
my $biblio6 = $builder->build_sample_biblio;
66
68
67
my $item1 = $builder->build_sample_item({biblionumber => $biblio->biblionumber});
69
my $item1 = $builder->build_sample_item({biblionumber => $biblio->biblionumber});
68
my $item2 = $builder->build_sample_item({biblionumber => $biblio2->biblionumber});
70
my $item2 = $builder->build_sample_item({biblionumber => $biblio2->biblionumber});
69
my $item3 = $builder->build_sample_item({biblionumber => $biblio3->biblionumber});
71
my $item3 = $builder->build_sample_item({biblionumber => $biblio3->biblionumber});
70
my $item4 = $builder->build_sample_item({biblionumber => $biblio4->biblionumber});
72
my $item4 = $builder->build_sample_item({biblionumber => $biblio4->biblionumber});
73
my $item5 = $builder->build_sample_item({biblionumber => $biblio5->biblionumber});
74
my $item6 = $builder->build_sample_item({biblionumber => $biblio6->biblionumber});
75
76
Koha::CirculationRules->set_rules({
77
    categorycode => undef,
78
    itemtype => undef,
79
    branchcode => undef,
80
    rules => {
81
        holds_pickup_period => undef,
82
    }
83
});
71
84
72
my $today = dt_from_string();
85
my $today = dt_from_string();
73
86
Lines 199-202 ModReserveAffect( $item4->itemnumber, $patron2->{borrowernumber}, 0, $reserve4-> Link Here
199
my $r4 = Koha::Holds->find($reserve4->{reserve_id});
212
my $r4 = Koha::Holds->find($reserve4->{reserve_id});
200
is($r4->expirationdate, $requested_expiredate->ymd, 'Requested expiration date should be kept' );
213
is($r4->expirationdate, $requested_expiredate->ymd, 'Requested expiration date should be kept' );
201
214
215
Koha::CirculationRules->set_rules({
216
    categorycode => $patron1->{categorycode},
217
    itemtype => undef,
218
    branchcode => undef,
219
    rules => {
220
        holds_pickup_period => '3',
221
    }
222
});
223
t::lib::Mocks::mock_preference('ReservesMaxPickUpDelay', 7);
224
225
my $reserve5_reservedate = $today->clone;
226
my $reserve5_expirationdate = $reserve5_reservedate->add(days => 3);
227
228
my $reserve5 = $builder->build({
229
    source => 'Reserve',
230
    value => {
231
        borrowernumber => $patron1->{borrowernumber},
232
        reservedate => $reserve5_reservedate->ymd,
233
        expirationdate => undef,
234
        biblionumber => $biblio5->biblionumber,
235
        branchcode => 'LIB2',
236
        priority => 1,
237
        found => '',
238
    },
239
});
240
241
ModReserveAffect( $item5->itemnumber, $patron1->{borrowernumber});
242
my $r5 = Koha::Holds->find($reserve5->{reserve_id});
243
244
is($r5->expirationdate, $reserve5_expirationdate->ymd, 'Expiration date should be set to today + 3 based on circulation rules' );
245
246
my $reserve6_reservedate = $today->clone;
247
# add 3 days of pickup + 1 day of holiday
248
my $reserve6_expirationdate = $reserve6_reservedate->add(days => 5);
249
250
my $reserve6 = $builder->build({
251
    source => 'Reserve',
252
    value => {
253
        borrowernumber => $patron1->{borrowernumber},
254
        reservedate => $reserve6_reservedate->ymd,
255
        expirationdate => undef,
256
        biblionumber => $biblio6->biblionumber,
257
        branchcode => 'LIB1',
258
        priority => 1,
259
        found => '',
260
    },
261
});
262
263
ModReserveAffect( $item6->itemnumber, $patron1->{borrowernumber});
264
my $r6 = Koha::Holds->find($reserve6->{reserve_id});
265
266
is($r6->expirationdate, $reserve6_expirationdate->ymd, 'Expiration date should be set to today + 4 based on circulation rules and including a holiday' );
267
202
$schema->storage->txn_rollback;
268
$schema->storage->txn_rollback;
203
- 

Return to bug 8367