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

(-)a/C4/Circulation.pm (-19 / +12 lines)
Lines 3224-3237 sub GetSoonestRenewDate { Link Here
3224
3224
3225
=head2 GetLatestAutoRenewDate
3225
=head2 GetLatestAutoRenewDate
3226
3226
3227
  $NoAutoRenewalAfterThisDate = &GetLatestAutoRenewDate($borrowernumber, $itemnumber);
3227
  $NoAutoRenewalAfterThisDate = &GetLatestAutoRenewDate({ patron => $patron, issue => $issue, item => $item });
3228
3228
3229
Find out the latest possible auto renew date of a borrowed item.
3229
Find out the latest possible auto renew date of a borrowed item.
3230
3230
3231
C<$borrowernumber> is the borrower number of the patron who currently
3231
C<$borrower> is the patron who currencly has the item on loan.
3232
has the item on loan.
3233
3232
3234
C<$itemnumber> is the number of the item to renew.
3233
C<$item> is the item to renew.
3234
3235
C<$issue> is the issue to renew.
3235
3236
3236
C<$GetLatestAutoRenewDate> returns the DateTime of the latest possible
3237
C<$GetLatestAutoRenewDate> returns the DateTime of the latest possible
3237
auto renew date, based on the value "No auto renewal after" and the "No auto
3238
auto renew date, based on the value "No auto renewal after" and the "No auto
Lines 3242-3271 or item cannot be found. Link Here
3242
=cut
3243
=cut
3243
3244
3244
sub GetLatestAutoRenewDate {
3245
sub GetLatestAutoRenewDate {
3245
    my ( $borrowernumber, $itemnumber ) = @_;
3246
    my ( $params ) = @_;
3246
3247
    my $dbh = C4::Context->dbh;
3248
3249
    my $item      = GetItem($itemnumber)      or return;
3250
    my $itemissue = GetItemIssue($itemnumber) or return;
3251
3247
3252
    $borrowernumber ||= $itemissue->{borrowernumber};
3248
    my $patron   = $params->{patron} or return;
3253
    my $borrower = C4::Members::GetMember( borrowernumber => $borrowernumber )
3249
    my $item     = $params->{item}     or return;
3254
      or return;
3250
    my $issue    = $params->{issue}    or return;
3255
3251
3256
    my $branchcode = _GetCircControlBranch( $item, $borrower );
3252
    my $branchcode = _GetCircControlBranch( $item, $patron );
3257
    my $issuingrule =
3253
    my $issuingrule =
3258
      GetIssuingRule( $borrower->{categorycode}, $item->{itype}, $branchcode );
3254
      GetIssuingRule( $patron->{categorycode}, $item->{itype}, $branchcode );
3259
3260
    my $now = dt_from_string;
3261
3255
3262
    return if ( not $issuingrule->{no_auto_renewal_after} or $issuingrule->{no_auto_renewal_after} eq '' )
3256
    return if ( not $issuingrule->{no_auto_renewal_after} or $issuingrule->{no_auto_renewal_after} eq '' )
3263
        and   ( not $issuingrule->{no_auto_renewal_after_hard_limit} or $issuingrule->{no_auto_renewal_after_hard_limit} eq '' );
3257
        and   ( not $issuingrule->{no_auto_renewal_after_hard_limit} or $issuingrule->{no_auto_renewal_after_hard_limit} eq '' );
3264
3258
3265
3266
    my $maximum_renewal_date;
3259
    my $maximum_renewal_date;
3267
    if ( $issuingrule->{no_auto_renewal_after} ) {
3260
    if ( $issuingrule->{no_auto_renewal_after} ) {
3268
        $maximum_renewal_date = dt_from_string($itemissue->{issuedate});
3261
        $maximum_renewal_date = dt_from_string($issue->{issuedate});
3269
        $maximum_renewal_date->add(
3262
        $maximum_renewal_date->add(
3270
            $issuingrule->{lengthunit} => $issuingrule->{no_auto_renewal_after}
3263
            $issuingrule->{lengthunit} => $issuingrule->{no_auto_renewal_after}
3271
        );
3264
        );
(-)a/circ/renew.pl (-2 / +5 lines)
Lines 84-91 if ($barcode) { Link Here
84
                }
84
                }
85
                if ( $error && ( $error eq 'auto_too_late' ) ) {
85
                if ( $error && ( $error eq 'auto_too_late' ) ) {
86
                    $latest_auto_renew_date = C4::Circulation::GetLatestAutoRenewDate(
86
                    $latest_auto_renew_date = C4::Circulation::GetLatestAutoRenewDate(
87
                        $borrower->borrowernumber(),
87
                        {
88
                        $item->itemnumber(),
88
                            borrower => $borrower->unblessed,
89
                            item     => $item->unblessed,
90
                            issue    => $issue->unblessed,
91
                        }
89
                    );
92
                    );
90
                }
93
                }
91
                if ($can_renew) {
94
                if ($can_renew) {
(-)a/t/db_dependent/Circulation.t (-7 / +7 lines)
Lines 605-637 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
605
605
606
        my $ten_days_before = dt_from_string->add( days => -10 );
606
        my $ten_days_before = dt_from_string->add( days => -10 );
607
        my $ten_days_ahead  = dt_from_string->add( days => 10 );
607
        my $ten_days_ahead  = dt_from_string->add( days => 10 );
608
        AddIssue( $renewing_borrower, $item_to_auto_renew->{barcode}, $ten_days_ahead, undef, $ten_days_before, undef, { auto_renew => 1 } );
608
        my $issue = AddIssue( $renewing_borrower, $item_to_auto_renew->{barcode}, $ten_days_ahead, undef, $ten_days_before, undef, { auto_renew => 1 } );
609
        $issue->result_class('DBIx::Class::ResultClass::HashRefInflator');
609
        $dbh->do('UPDATE issuingrules SET norenewalbefore = 7, no_auto_renewal_after = "", no_auto_renewal_after_hard_limit = NULL');
610
        $dbh->do('UPDATE issuingrules SET norenewalbefore = 7, no_auto_renewal_after = "", no_auto_renewal_after_hard_limit = NULL');
610
        my $latest_auto_renew_date = GetLatestAutoRenewDate( $renewing_borrowernumber, $item_to_auto_renew->{itemnumber} );
611
        my $latest_auto_renew_date = GetLatestAutoRenewDate( { patron => $renewing_borrower, item => $item_to_auto_renew, issue => { issuedate => $issue->issuedate }, } );
611
        is( $latest_auto_renew_date, undef, 'GetLatestAutoRenewDate should return undef if no_auto_renewal_after or no_auto_renewal_after_hard_limit are not defined' );
612
        is( $latest_auto_renew_date, undef, 'GetLatestAutoRenewDate should return undef if no_auto_renewal_after or no_auto_renewal_after_hard_limit are not defined' );
612
        my $five_days_before = dt_from_string->add( days => -5 );
613
        my $five_days_before = dt_from_string->add( days => -5 );
613
        $dbh->do('UPDATE issuingrules SET norenewalbefore = 10, no_auto_renewal_after = 5, no_auto_renewal_after_hard_limit = NULL');
614
        $dbh->do('UPDATE issuingrules SET norenewalbefore = 10, no_auto_renewal_after = 5, no_auto_renewal_after_hard_limit = NULL');
614
        $latest_auto_renew_date = GetLatestAutoRenewDate( $renewing_borrowernumber, $item_to_auto_renew->{itemnumber} );
615
        $latest_auto_renew_date = GetLatestAutoRenewDate( { patron => $renewing_borrower, item => $item_to_auto_renew, issue => { issuedate => $issue->issuedate }, } );
615
        is( $latest_auto_renew_date->truncate( to => 'minute' ),
616
        is( $latest_auto_renew_date->truncate( to => 'minute' ),
616
            $five_days_before->truncate( to => 'minute' ),
617
            $five_days_before->truncate( to => 'minute' ),
617
            'GetLatestAutoRenewDate should return -5 days if no_auto_renewal_after = 5 and date_due is 10 days before'
618
            'GetLatestAutoRenewDate should return -5 days if no_auto_renewal_after = 5 and date_due is 10 days before'
618
        );
619
        );
619
        my $five_days_ahead = dt_from_string->add( days => 5 );
620
        my $five_days_ahead = dt_from_string->add( days => 5 );
620
        $dbh->do('UPDATE issuingrules SET norenewalbefore = 10, no_auto_renewal_after = 15, no_auto_renewal_after_hard_limit = NULL');
621
        $dbh->do('UPDATE issuingrules SET norenewalbefore = 10, no_auto_renewal_after = 15, no_auto_renewal_after_hard_limit = NULL');
621
        $latest_auto_renew_date = GetLatestAutoRenewDate( $renewing_borrowernumber, $item_to_auto_renew->{itemnumber} );
622
        $latest_auto_renew_date = GetLatestAutoRenewDate( { patron => $renewing_borrower, item => $item_to_auto_renew, issue => { issuedate => $issue->issuedate }, } );
622
        is( $latest_auto_renew_date->truncate( to => 'minute' ),
623
        is( $latest_auto_renew_date->truncate( to => 'minute' ),
623
            $five_days_ahead->truncate( to => 'minute' ),
624
            $five_days_ahead->truncate( to => 'minute' ),
624
            'GetLatestAutoRenewDate should return +5 days if no_auto_renewal_after = 15 and date_due is 10 days before'
625
            'GetLatestAutoRenewDate should return +5 days if no_auto_renewal_after = 15 and date_due is 10 days before'
625
        );
626
        );
626
        my $two_days_ahead = dt_from_string->add( days => 2 );
627
        my $two_days_ahead = dt_from_string->add( days => 2 );
627
        $dbh->do('UPDATE issuingrules SET norenewalbefore = 10, no_auto_renewal_after = "", no_auto_renewal_after_hard_limit = ?', undef, dt_from_string->add( days => 2 ) );
628
        $dbh->do('UPDATE issuingrules SET norenewalbefore = 10, no_auto_renewal_after = "", no_auto_renewal_after_hard_limit = ?', undef, dt_from_string->add( days => 2 ) );
628
        $latest_auto_renew_date = GetLatestAutoRenewDate( $renewing_borrowernumber, $item_to_auto_renew->{itemnumber} );
629
        $latest_auto_renew_date = GetLatestAutoRenewDate( { patron => $renewing_borrower, item => $item_to_auto_renew, issue => { issuedate => $issue->issuedate }, } );
629
        is( $latest_auto_renew_date->truncate( to => 'day' ),
630
        is( $latest_auto_renew_date->truncate( to => 'day' ),
630
            $two_days_ahead->truncate( to => 'day' ),
631
            $two_days_ahead->truncate( to => 'day' ),
631
            'GetLatestAutoRenewDate should return +2 days if no_auto_renewal_after_hard_limit is defined and not no_auto_renewal_after'
632
            'GetLatestAutoRenewDate should return +2 days if no_auto_renewal_after_hard_limit is defined and not no_auto_renewal_after'
632
        );
633
        );
633
        $dbh->do('UPDATE issuingrules SET norenewalbefore = 10, no_auto_renewal_after = 15, no_auto_renewal_after_hard_limit = ?', undef, dt_from_string->add( days => 2 ) );
634
        $dbh->do('UPDATE issuingrules SET norenewalbefore = 10, no_auto_renewal_after = 15, no_auto_renewal_after_hard_limit = ?', undef, dt_from_string->add( days => 2 ) );
634
        $latest_auto_renew_date = GetLatestAutoRenewDate( $renewing_borrowernumber, $item_to_auto_renew->{itemnumber} );
635
        $latest_auto_renew_date = GetLatestAutoRenewDate( { patron => $renewing_borrower, item => $item_to_auto_renew, issue => { issuedate => $issue->issuedate }, } );
635
        is( $latest_auto_renew_date->truncate( to => 'day' ),
636
        is( $latest_auto_renew_date->truncate( to => 'day' ),
636
            $two_days_ahead->truncate( to => 'day' ),
637
            $two_days_ahead->truncate( to => 'day' ),
637
            'GetLatestAutoRenewDate should return +2 days if no_auto_renewal_after_hard_limit is < no_auto_renewal_after'
638
            'GetLatestAutoRenewDate should return +2 days if no_auto_renewal_after_hard_limit is < no_auto_renewal_after'
638
- 

Return to bug 16413