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

(-)a/C4/Circulation.pm (-44 / +8 lines)
Lines 1836-1842 patron who last borrowed the book. Link Here
1836
=cut
1836
=cut
1837
1837
1838
sub AddReturn {
1838
sub AddReturn {
1839
    my ( $barcode, $branch, $exemptfine, $dropbox, $return_date, $dropboxdate ) = @_;
1839
    my ( $barcode, $branch, $exemptfine, $return_date ) = @_;
1840
1840
1841
    if ($branch and not Koha::Libraries->find($branch)) {
1841
    if ($branch and not Koha::Libraries->find($branch)) {
1842
        warn "AddReturn error: branch '$branch' not found.  Reverting to " . C4::Context->userenv->{'branch'};
1842
        warn "AddReturn error: branch '$branch' not found.  Reverting to " . C4::Context->userenv->{'branch'};
Lines 1943-1967 sub AddReturn { Link Here
1943
        my $is_overdue;
1943
        my $is_overdue;
1944
        die "The item is not issed and cannot be returned" unless $issue; # Just in case...
1944
        die "The item is not issed and cannot be returned" unless $issue; # Just in case...
1945
        $patron or warn "AddReturn without current borrower";
1945
        $patron or warn "AddReturn without current borrower";
1946
        if ($dropbox) {
1946
        $is_overdue = $issue->is_overdue( $return_date );
1947
            $is_overdue = $issue->is_overdue( $dropboxdate );
1948
        } else {
1949
            $is_overdue = $issue->is_overdue;
1950
        }
1951
1947
1952
        if ($patron) {
1948
        if ($patron) {
1953
            eval {
1949
            eval {
1954
                if ( $dropbox ) {
1950
                MarkIssueReturned( $borrowernumber, $item->itemnumber, $return_date, $patron->privacy );
1955
                    MarkIssueReturned( $borrowernumber, $item->itemnumber,
1956
                        $dropboxdate, $patron->privacy );
1957
                }
1958
                else {
1959
                    MarkIssueReturned( $borrowernumber, $item->itemnumber,
1960
                        $return_date, $patron->privacy );
1961
                }
1962
            };
1951
            };
1963
            unless ( $@ ) {
1952
            unless ( $@ ) {
1964
                if ( ( C4::Context->preference('CalculateFinesOnReturn') && $is_overdue ) || $return_date ) {
1953
                if ( C4::Context->preference('CalculateFinesOnReturn') && $is_overdue ) {
1965
                    _CalculateAndUpdateFine( { issue => $issue, item => $item_unblessed, borrower => $patron_unblessed, return_date => $return_date } );
1954
                    _CalculateAndUpdateFine( { issue => $issue, item => $item_unblessed, borrower => $patron_unblessed, return_date => $return_date } );
1966
                }
1955
                }
1967
            } else {
1956
            } else {
Lines 2035-2047 sub AddReturn { Link Here
2035
2024
2036
    # fix up the overdues in accounts...
2025
    # fix up the overdues in accounts...
2037
    if ($borrowernumber) {
2026
    if ($borrowernumber) {
2038
        my $fix = _FixOverduesOnReturn($borrowernumber, $item->itemnumber, $exemptfine, $dropbox);
2027
        my $fix = _FixOverduesOnReturn( $borrowernumber, $item->itemnumber, $exemptfine );
2039
        defined($fix) or warn "_FixOverduesOnReturn($borrowernumber, $item->itemnumber...) failed!";  # zero is OK, check defined
2028
        defined($fix) or warn "_FixOverduesOnReturn($borrowernumber, $item->itemnumber...) failed!";  # zero is OK, check defined
2040
2029
2041
        if ( $issue and $issue->is_overdue ) {
2030
        if ( $issue and $issue->is_overdue ) {
2042
        # fix fine days
2031
        # fix fine days
2043
            $today = dt_from_string($return_date) if $return_date;
2032
            $today = $return_date if $return_date;
2044
            $today = $dropboxdate if $dropbox;
2045
            my ($debardate,$reminder) = _debar_user_on_return( $patron_unblessed, $item_unblessed, dt_from_string($issue->date_due), $today );
2033
            my ($debardate,$reminder) = _debar_user_on_return( $patron_unblessed, $item_unblessed, dt_from_string($issue->date_due), $today );
2046
            if ($reminder){
2034
            if ($reminder){
2047
                $messages->{'PrevDebarred'} = $debardate;
2035
                $messages->{'PrevDebarred'} = $debardate;
Lines 2334-2340 Internal function Link Here
2334
=cut
2322
=cut
2335
2323
2336
sub _FixOverduesOnReturn {
2324
sub _FixOverduesOnReturn {
2337
    my ($borrowernumber, $item, $exemptfine, $dropbox ) = @_;
2325
    my ($borrowernumber, $item, $exemptfine ) = @_;
2338
    unless( $borrowernumber ) {
2326
    unless( $borrowernumber ) {
2339
        warn "_FixOverduesOnReturn() not supplied valid borrowernumber";
2327
        warn "_FixOverduesOnReturn() not supplied valid borrowernumber";
2340
        return;
2328
        return;
Lines 2374-2403 sub _FixOverduesOnReturn { Link Here
2374
        if (C4::Context->preference("FinesLog")) {
2362
        if (C4::Context->preference("FinesLog")) {
2375
            &logaction("FINES", 'MODIFY',$borrowernumber,"Overdue forgiven: item $item");
2363
            &logaction("FINES", 'MODIFY',$borrowernumber,"Overdue forgiven: item $item");
2376
        }
2364
        }
2377
    } elsif ($dropbox && $accountline->lastincrement) {
2378
        my $outstanding = $accountline->amountoutstanding - $accountline->lastincrement;
2379
        my $amt = $accountline->amount - $accountline->lastincrement;
2380
2381
        Koha::Account::Offset->new(
2382
            {
2383
                debit_id => $accountline->id,
2384
                type => 'Dropbox',
2385
                amount => $accountline->lastincrement * -1,
2386
            }
2387
        )->store();
2388
2389
        if ( C4::Context->preference("FinesLog") ) {
2390
            &logaction( "FINES", 'MODIFY', $borrowernumber,
2391
                "Dropbox adjustment $amt, item $item" );
2392
        }
2393
2394
        $accountline->accounttype('F');
2395
2396
        if ( $outstanding >= 0 && $amt >= 0 ) {
2397
            $accountline->amount($amt);
2398
            $accountline->amountoutstanding($outstanding);
2399
        }
2400
2401
    } else {
2365
    } else {
2402
        $accountline->accounttype('F');
2366
        $accountline->accounttype('F');
2403
    }
2367
    }
Lines 4124-4130 sub _CalculateAndUpdateFine { Link Here
4124
      : ( $control eq 'PatronLibrary' )   ? $borrower->{branchcode}
4088
      : ( $control eq 'PatronLibrary' )   ? $borrower->{branchcode}
4125
      :                                     $issue->branchcode;
4089
      :                                     $issue->branchcode;
4126
4090
4127
    my $date_returned = $return_date ? dt_from_string($return_date) : dt_from_string();
4091
    my $date_returned = $return_date ? $return_date : dt_from_string();
4128
4092
4129
    my ( $amount, $unitcounttotal, $unitcount  ) =
4093
    my ( $amount, $unitcounttotal, $unitcount  ) =
4130
      C4::Overdues::CalcFine( $item, $borrower->{categorycode}, $control_branchcode, $datedue, $date_returned );
4094
      C4::Overdues::CalcFine( $item, $borrower->{categorycode}, $control_branchcode, $datedue, $date_returned );
(-)a/Koha/Checkouts.pm (-2 / +19 lines)
Lines 21-29 use Modern::Perl; Link Here
21
21
22
use Carp;
22
use Carp;
23
23
24
use Koha::Database;
24
use C4::Context;
25
26
use Koha::Checkout;
25
use Koha::Checkout;
26
use Koha::Database;
27
27
28
use base qw(Koha::Objects);
28
use base qw(Koha::Objects);
29
29
Lines 37-42 Koha::Checkouts - Koha Checkout object set class Link Here
37
37
38
=cut
38
=cut
39
39
40
=head3 calculate_dropbox_date
41
42
my $dt = Koha::Checkouts::calculate_dropbox_date();
43
44
=cut
45
46
sub calculate_dropbox_date {
47
    my $userenv    = C4::Context->userenv;
48
    my $branchcode = $userenv->{branch} // q{};
49
50
    my $calendar = Koha::Calendar->new( branchcode => $branchcode );
51
    my $today        = DateTime->now( time_zone => C4::Context->tz() );
52
    my $dropbox_date = $calendar->addDate( $today, -1 );
53
54
    return $dropbox_date;
55
}
56
40
=head3 type
57
=head3 type
41
58
42
=cut
59
=cut
(-)a/circ/returns.pl (-15 / +17 lines)
Lines 33-54 use Modern::Perl; Link Here
33
33
34
use CGI qw ( -utf8 );
34
use CGI qw ( -utf8 );
35
use DateTime;
35
use DateTime;
36
use C4::Context;
36
37
use C4::Auth qw/:DEFAULT get_session/;
37
use C4::Auth qw/:DEFAULT get_session/;
38
use C4::Output;
39
use C4::Circulation;
40
use C4::Print;
41
use C4::Reserves;
42
use C4::Biblio;
38
use C4::Biblio;
39
use C4::Circulation;
40
use C4::Context;
43
use C4::Items;
41
use C4::Items;
44
use C4::Members;
45
use C4::Members::Messaging;
46
use C4::Koha;   # FIXME : is it still useful ?
42
use C4::Koha;   # FIXME : is it still useful ?
43
use C4::Members::Messaging;
44
use C4::Members;
45
use C4::Output;
46
use C4::Print;
47
use C4::Reserves;
47
use C4::RotatingCollections;
48
use C4::RotatingCollections;
48
use Koha::AuthorisedValues;
49
use Koha::AuthorisedValues;
49
use Koha::DateUtils;
50
use Koha::Calendar;
51
use Koha::BiblioFrameworks;
50
use Koha::BiblioFrameworks;
51
use Koha::Calendar;
52
use Koha::Checkouts;
53
use Koha::DateUtils;
52
use Koha::Holds;
54
use Koha::Holds;
53
use Koha::Items;
55
use Koha::Items;
54
use Koha::Patrons;
56
use Koha::Patrons;
Lines 203-219 my $dropboxmode = $query->param('dropboxmode'); Link Here
203
my $dotransfer  = $query->param('dotransfer');
205
my $dotransfer  = $query->param('dotransfer');
204
my $canceltransfer = $query->param('canceltransfer');
206
my $canceltransfer = $query->param('canceltransfer');
205
my $dest = $query->param('dest');
207
my $dest = $query->param('dest');
206
my $calendar    = Koha::Calendar->new( branchcode => $userenv_branch );
207
#dropbox: get last open day (today - 1)
208
#dropbox: get last open day (today - 1)
208
my $today       = DateTime->now( time_zone => C4::Context->tz());
209
my $dropboxdate = Koha::Checkouts::calculate_dropbox_date();
209
my $dropboxdate = $calendar->addDate($today, -1);
210
210
211
my $return_date_override = $query->param('return_date_override');
211
my $return_date_override = $query->param('return_date_override');
212
my $return_date_override_dt;
212
my $return_date_override_remember =
213
my $return_date_override_remember =
213
  $query->param('return_date_override_remember');
214
  $query->param('return_date_override_remember');
214
if ($return_date_override) {
215
if ($return_date_override) {
215
    if ( C4::Context->preference('SpecifyReturnDate') ) {
216
    if ( C4::Context->preference('SpecifyReturnDate') ) {
216
        my $return_date_override_dt = eval {dt_from_string( $return_date_override ) };
217
        $return_date_override_dt = eval {dt_from_string( $return_date_override ) };
217
        if ( $return_date_override_dt ) {
218
        if ( $return_date_override_dt ) {
218
            # note that we've overriden the return date
219
            # note that we've overriden the return date
219
            $template->param( return_date_was_overriden => 1);
220
            $template->param( return_date_was_overriden => 1);
Lines 301-310 if ($barcode) { Link Here
301
        barcode => $barcode,
302
        barcode => $barcode,
302
    );
303
    );
303
304
305
    my $return_date = $dropboxmode ? $dropboxdate : $return_date_override_dt;
304
306
305
    # do the return
307
    # do the return
306
    ( $returned, $messages, $issue, $borrower ) =
308
    ( $returned, $messages, $issue, $borrower ) =
307
      AddReturn( $barcode, $userenv_branch, $exemptfine, $dropboxmode, $return_date_override, $dropboxdate );
309
      AddReturn( $barcode, $userenv_branch, $exemptfine, $return_date );
308
310
309
    if ($returned) {
311
    if ($returned) {
310
        my $time_now = DateTime->now( time_zone => C4::Context->tz )->truncate( to => 'minute');
312
        my $time_now = DateTime->now( time_zone => C4::Context->tz )->truncate( to => 'minute');
Lines 616-622 $template->param( Link Here
616
    errmsgloop     => \@errmsgloop,
618
    errmsgloop     => \@errmsgloop,
617
    exemptfine     => $exemptfine,
619
    exemptfine     => $exemptfine,
618
    dropboxmode    => $dropboxmode,
620
    dropboxmode    => $dropboxmode,
619
    dropboxdate    => output_pref($dropboxdate),
621
    dropboxdate    => $dropboxdate,
620
    forgivemanualholdsexpire => $forgivemanualholdsexpire,
622
    forgivemanualholdsexpire => $forgivemanualholdsexpire,
621
    overduecharges => $overduecharges,
623
    overduecharges => $overduecharges,
622
    AudioAlerts        => C4::Context->preference("AudioAlerts"),
624
    AudioAlerts        => C4::Context->preference("AudioAlerts"),
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt (-2 / +1 lines)
Lines 605-611 Link Here
605
        <p>Fines are not charged for manually cancelled holds.</p>
605
        <p>Fines are not charged for manually cancelled holds.</p>
606
    </div>
606
    </div>
607
    <div id="dropboxmode" class="dialog message" style="display:none;">
607
    <div id="dropboxmode" class="dialog message" style="display:none;">
608
        <p>Book drop mode.  (Effective checkin date is [% dropboxdate | html %] ).</p>
608
        <p>Book drop mode.  (Effective checkin date is [% dropboxdate | $KohaDates %] ).</p>
609
    </div>
609
    </div>
610
610
611
<div class="row">
611
<div class="row">
612
- 

Return to bug 14591