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

(-)a/C4/Circulation.pm (-1 / +11 lines)
Lines 2835-2840 C<$datedue> can be a DateTime object used to set the due date. Link Here
2835
C<$lastreneweddate> is an optional ISO-formatted date used to set issues.lastreneweddate.  If
2835
C<$lastreneweddate> is an optional ISO-formatted date used to set issues.lastreneweddate.  If
2836
this parameter is not supplied, lastreneweddate is set to the current date.
2836
this parameter is not supplied, lastreneweddate is set to the current date.
2837
2837
2838
C<$skipfinecalc> is an optional boolean. There may be circumstances where, even if the
2839
CalculateFinesOnReturn syspref is enabled, we don't want to calculate fines upon renew,
2840
for example, when we're renewing as a result of a fine being paid (see RenewAccruingItemWhenPaid
2841
syspref)
2842
2838
If C<$datedue> is the empty string, C<&AddRenewal> will calculate the due date automatically
2843
If C<$datedue> is the empty string, C<&AddRenewal> will calculate the due date automatically
2839
from the book's item type.
2844
from the book's item type.
2840
2845
Lines 2846-2851 sub AddRenewal { Link Here
2846
    my $branch          = shift;
2851
    my $branch          = shift;
2847
    my $datedue         = shift;
2852
    my $datedue         = shift;
2848
    my $lastreneweddate = shift || DateTime->now(time_zone => C4::Context->tz);
2853
    my $lastreneweddate = shift || DateTime->now(time_zone => C4::Context->tz);
2854
    my $skipfinecalc    = shift;
2849
2855
2850
    my $item_object   = Koha::Items->find($itemnumber) or return;
2856
    my $item_object   = Koha::Items->find($itemnumber) or return;
2851
    my $biblio = $item_object->biblio;
2857
    my $biblio = $item_object->biblio;
Lines 2868-2874 sub AddRenewal { Link Here
2868
2874
2869
    my $circ_library = Koha::Libraries->find( _GetCircControlBranch($item_unblessed, $patron_unblessed) );
2875
    my $circ_library = Koha::Libraries->find( _GetCircControlBranch($item_unblessed, $patron_unblessed) );
2870
2876
2871
    if ( C4::Context->preference('CalculateFinesOnReturn') && $issue->is_overdue ) {
2877
    if (
2878
        !$skipfinecalc &&
2879
        C4::Context->preference('CalculateFinesOnReturn') &&
2880
        $issue->is_overdue
2881
    ) {
2872
        _CalculateAndUpdateFine( { issue => $issue, item => $item_unblessed, borrower => $patron_unblessed } );
2882
        _CalculateAndUpdateFine( { issue => $issue, item => $item_unblessed, borrower => $patron_unblessed } );
2873
    }
2883
    }
2874
    _FixOverduesOnReturn( $borrowernumber, $itemnumber, undef, 'RENEWED' );
2884
    _FixOverduesOnReturn( $borrowernumber, $itemnumber, undef, 'RENEWED' );
(-)a/Koha/Account.pm (-1 / +60 lines)
Lines 23-32 use Carp; Link Here
23
use Data::Dumper;
23
use Data::Dumper;
24
use List::MoreUtils qw( uniq );
24
use List::MoreUtils qw( uniq );
25
25
26
use C4::Circulation qw( ReturnLostItem );
26
use C4::Circulation qw( ReturnLostItem CanBookBeRenewed AddRenewal );
27
use C4::Letters;
27
use C4::Letters;
28
use C4::Log qw( logaction );
28
use C4::Log qw( logaction );
29
use C4::Stats qw( UpdateStats );
29
use C4::Stats qw( UpdateStats );
30
use C4::Overdues qw(GetFine);
30
31
31
use Koha::Patrons;
32
use Koha::Patrons;
32
use Koha::Account::Lines;
33
use Koha::Account::Lines;
Lines 90-95 sub pay { Link Here
90
    my $interface = $params ? ( $params->{interface} || C4::Context->interface ) : C4::Context->interface;
91
    my $interface = $params ? ( $params->{interface} || C4::Context->interface ) : C4::Context->interface;
91
92
92
    my @fines_paid; # List of account lines paid on with this payment
93
    my @fines_paid; # List of account lines paid on with this payment
94
    # Item numbers that have had a fine paid where the line has a accounttype
95
    # of OVERDUE and a status of UNRETURNED. We might want to try and renew
96
    # these items.
97
    my $overdue_unreturned = {};
93
98
94
    my $balance_remaining = $amount; # Set it now so we can adjust the amount if necessary
99
    my $balance_remaining = $amount; # Set it now so we can adjust the amount if necessary
95
    $balance_remaining ||= 0;
100
    $balance_remaining ||= 0;
Lines 108-113 sub pay { Link Here
108
        $fine->amountoutstanding($new_amountoutstanding)->store();
113
        $fine->amountoutstanding($new_amountoutstanding)->store();
109
        $balance_remaining = $balance_remaining - $amount_to_pay;
114
        $balance_remaining = $balance_remaining - $amount_to_pay;
110
115
116
        # If we need to make a note of the item associated with this line,
117
        # in order that we can potentially renew it, do so.
118
        if (
119
            $new_amountoutstanding == 0 &&
120
            $fine->accounttype &&
121
            $fine->accounttype eq 'OVERDUE' &&
122
            $fine->status &&
123
            $fine->status eq 'UNRETURNED'
124
        ) {
125
            $overdue_unreturned->{$fine->itemnumber} = $fine;
126
        }
127
111
        # Same logic exists in Koha::Account::Line::apply
128
        # Same logic exists in Koha::Account::Line::apply
112
        if (   $new_amountoutstanding == 0
129
        if (   $new_amountoutstanding == 0
113
            && $fine->itemnumber
130
            && $fine->itemnumber
Lines 168-173 sub pay { Link Here
168
        $fine->amountoutstanding( $old_amountoutstanding - $amount_to_pay );
185
        $fine->amountoutstanding( $old_amountoutstanding - $amount_to_pay );
169
        $fine->store();
186
        $fine->store();
170
187
188
        # If we need to make a note of the item associated with this line,
189
        # in order that we can potentially renew it, do so.
190
        if (
191
            $old_amountoutstanding - $amount_to_pay == 0 &&
192
            $fine->accounttype &&
193
            $fine->accounttype eq 'OVERDUE' &&
194
            $fine->status &&
195
            $fine->status eq 'UNRETURNED'
196
        ) {
197
            $overdue_unreturned->{$fine->itemnumber} = $fine;
198
        }
199
171
        if (   $fine->amountoutstanding == 0
200
        if (   $fine->amountoutstanding == 0
172
            && $fine->itemnumber
201
            && $fine->itemnumber
173
            && $fine->accounttype
202
            && $fine->accounttype
Lines 247-252 sub pay { Link Here
247
        }
276
        }
248
    );
277
    );
249
278
279
    # If we have overdue unreturned items that have had payments made
280
    # against them, check whether the balance on those items is now zero
281
    # and, if the syspref is set, renew them
282
    # Same logic exists in Koha::Account::Line::apply
283
    if (
284
        C4::Context->preference('RenewAccruingItemWhenPaid') &&
285
        keys %{$overdue_unreturned}
286
    ) {
287
        foreach my $itemnumber (keys %{$overdue_unreturned}) {
288
            # Only do something if this item has no fines left on it
289
            my $fine = C4::Overdues::GetFine( $itemnumber, $self->{patron_id} );
290
            next if $fine && $fine > 0;
291
292
            my ( $renew_ok, $error ) =
293
                C4::Circulation::CanBookBeRenewed(
294
                    $self->{patron_id}, $itemnumber
295
                );
296
            if ( $renew_ok ) {
297
                C4::Circulation::AddRenewal(
298
                    $self->{patron_id},
299
                    $itemnumber,
300
                    $library_id,
301
                    undef,
302
                    undef,
303
                    1
304
                );
305
            }
306
        }
307
    }
308
250
    if ( C4::Context->preference("FinesLog") ) {
309
    if ( C4::Context->preference("FinesLog") ) {
251
        logaction(
310
        logaction(
252
            "FINES", 'CREATE',
311
            "FINES", 'CREATE',
(-)a/Koha/Account/Line.pm (-1 / +49 lines)
Lines 21-26 use Carp; Link Here
21
use Data::Dumper;
21
use Data::Dumper;
22
22
23
use C4::Log qw(logaction);
23
use C4::Log qw(logaction);
24
use C4::Overdues qw(GetFine);
24
25
25
use Koha::Account::Offsets;
26
use Koha::Account::Offsets;
26
use Koha::Database;
27
use Koha::Database;
Lines 203-208 sub apply { Link Here
203
204
204
    my $schema = Koha::Database->new->schema;
205
    my $schema = Koha::Database->new->schema;
205
206
207
    # Item numbers that have had a fine paid where the line has a accounttype
208
    # of OVERDUE and a status of UNRETURNED. We might want to try and renew
209
    # these items.
210
    my $overdue_unreturned = {};
211
206
    $schema->txn_do( sub {
212
    $schema->txn_do( sub {
207
        while ( my $debit = $debits->next ) {
213
        while ( my $debit = $debits->next ) {
208
214
Lines 235-240 sub apply { Link Here
235
            $self->amountoutstanding( $available_credit * -1 )->store;
241
            $self->amountoutstanding( $available_credit * -1 )->store;
236
            $debit->amountoutstanding( $owed - $amount_to_cancel )->store;
242
            $debit->amountoutstanding( $owed - $amount_to_cancel )->store;
237
243
244
            # If we need to make a note of the item associated with this line,
245
            # in order that we can potentially renew it, do so.
246
            # Same logic existing in Koha::Account::pay
247
            if (
248
                $debit->amountoutstanding == 0 &&
249
                $debit->accounttype &&
250
                $debit->accounttype eq 'OVERDUE' &&
251
                $debit->status &&
252
                $debit->status eq 'UNRETURNED'
253
            ) {
254
                $overdue_unreturned->{$debit->itemnumber} = $debit;
255
            }
256
238
            # Same logic exists in Koha::Account::pay
257
            # Same logic exists in Koha::Account::pay
239
            if (   $debit->amountoutstanding == 0
258
            if (   $debit->amountoutstanding == 0
240
                && $debit->itemnumber
259
                && $debit->itemnumber
Lines 247-252 sub apply { Link Here
247
        }
266
        }
248
    });
267
    });
249
268
269
    # If we have overdue unreturned items that have had payments made
270
    # against them, check whether the balance on those items is now zero
271
    # and, if the syspref is set, renew them
272
    # Same logic existing in Koha::Account::pay
273
    if (
274
        C4::Context->preference('RenewAccruingItemWhenPaid') &&
275
        keys %{$overdue_unreturned}
276
    ) {
277
        foreach my $itemnumber (keys %{$overdue_unreturned}) {
278
            # Only do something if this item has no fines left on it
279
            my $fine = C4::Overdues::GetFine( $itemnumber, $self->borrowernumber );
280
            next if $fine && $fine > 0;
281
282
            my ( $renew_ok, $error ) =
283
                C4::Circulation::CanBookBeRenewed(
284
                    $self->borrowernumber, $itemnumber
285
                );
286
            if ( $renew_ok ) {
287
                C4::Circulation::AddRenewal(
288
                    $self->borrowernumber,
289
                    $itemnumber,
290
                    $overdue_unreturned->{$itemnumber}->{branchcode},
291
                    undef,
292
                    undef,
293
                    1
294
                );
295
            }
296
        }
297
    }
298
250
    return $available_credit;
299
    return $available_credit;
251
}
300
}
252
301
253
- 

Return to bug 23051