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

(-)a/circ/circulation.pl (-154 / +154 lines)
Lines 351-543 if (@$barcodes && $op eq 'cud-checkout') { Link Here
351
            }
351
            }
352
        };
352
        };
353
353
354
    my $blocker = $invalidduedate ? 1 : 0;
354
        my $blocker = $invalidduedate ? 1 : 0;
355
355
356
    $template_params->{alert} = $alerts;
356
        $template_params->{alert} = $alerts;
357
    $template_params->{messages} = $messages;
357
        $template_params->{messages} = $messages;
358
358
359
    my $item = Koha::Items->find({ barcode => $barcode });
359
        my $item = Koha::Items->find({ barcode => $barcode });
360
360
361
    my $biblio;
361
        my $biblio;
362
    if ( $item ) {
362
        if ( $item ) {
363
        $biblio = $item->biblio;
363
            $biblio = $item->biblio;
364
    }
364
        }
365
365
366
    if ( $issuingimpossible->{'STATS'} ) {
366
        if ( $issuingimpossible->{'STATS'} ) {
367
        my ( $stats_return, $stats_messages, $stats_iteminformation, $stats_borrower ) =
367
            my ( $stats_return, $stats_messages, $stats_iteminformation, $stats_borrower ) =
368
            AddReturn( $item->barcode, C4::Context->userenv->{'branch'}, undef, undef, 1 );
368
                AddReturn( $item->barcode, C4::Context->userenv->{'branch'}, undef, undef, 1 );
369
369
370
        $template->param(
370
            $template->param(
371
            STATS     => 1,
371
                STATS     => 1,
372
            CHECKEDIN => $stats_return,
372
                CHECKEDIN => $stats_return,
373
            MESSAGES  => $stats_messages,
373
                MESSAGES  => $stats_messages,
374
            ITEM      => $stats_iteminformation,
374
                ITEM      => $stats_iteminformation,
375
            BORROWER  => $stats_borrower,
375
                BORROWER  => $stats_borrower,
376
        );
376
            );
377
377
378
        #increment items.localuse
378
            #increment items.localuse
379
        my $localuse_count = $item->localuse;
379
            my $localuse_count = $item->localuse;
380
        $localuse_count++;
380
            $localuse_count++;
381
        $item->localuse($localuse_count)->store;
381
            $item->localuse($localuse_count)->store;
382
    }
382
        }
383
383
384
    # Fix for bug 7494: optional checkout-time fallback search for a book
384
        # Fix for bug 7494: optional checkout-time fallback search for a book
385
385
386
    if ( $issuingimpossible->{'UNKNOWN_BARCODE'}
386
        if ( $issuingimpossible->{'UNKNOWN_BARCODE'}
387
        && C4::Context->preference("itemBarcodeFallbackSearch")
387
            && C4::Context->preference("itemBarcodeFallbackSearch")
388
        && not $batch
388
            && not $batch
389
    )
389
        )
390
    {
390
        {
391
     $template_params->{FALLBACK} = 1;
391
        $template_params->{FALLBACK} = 1;
392
392
393
        my $searcher = Koha::SearchEngine::Search->new({index => $Koha::SearchEngine::BIBLIOS_INDEX});
393
            my $searcher = Koha::SearchEngine::Search->new({index => $Koha::SearchEngine::BIBLIOS_INDEX});
394
        my $query = "kw=" . $barcode;
394
            my $query = "kw=" . $barcode;
395
        my ( $searcherror, $results, $total_hits ) = $searcher->simple_search_compat($query, 0, 10);
395
            my ( $searcherror, $results, $total_hits ) = $searcher->simple_search_compat($query, 0, 10);
396
396
397
        # if multiple hits, offer options to librarian
397
            # if multiple hits, offer options to librarian
398
        if ( $total_hits > 0 ) {
398
            if ( $total_hits > 0 ) {
399
            my @barcodes;
399
                my @barcodes;
400
            foreach my $hit ( @{$results} ) {
400
                foreach my $hit ( @{$results} ) {
401
                my $chosen = # Maybe easier to retrieve the itemnumber from $hit?
401
                    my $chosen = # Maybe easier to retrieve the itemnumber from $hit?
402
                  TransformMarcToKoha({ record => C4::Search::new_record_from_zebra('biblioserver',$hit) });
402
                    TransformMarcToKoha({ record => C4::Search::new_record_from_zebra('biblioserver',$hit) });
403
403
404
                # offer all barcodes individually
404
                    # offer all barcodes individually
405
                if ( $chosen->{barcode} ) {
405
                    if ( $chosen->{barcode} ) {
406
                    push @barcodes, sort split(/\s*\|\s*/, $chosen->{barcode});
406
                        push @barcodes, sort split(/\s*\|\s*/, $chosen->{barcode});
407
                    }
407
                }
408
                }
409
                my $items = Koha::Items->search({ barcode => {-in => \@barcodes}});
410
                $template_params->{options} = $items;
408
            }
411
            }
409
            my $items = Koha::Items->search({ barcode => {-in => \@barcodes}});
410
            $template_params->{options} = $items;
411
        }
412
        }
412
    }
413
413
414
    # Only some errors will block when performing forced onsite checkout,
414
        # Only some errors will block when performing forced onsite checkout,
415
    # for other cases all errors will block
415
        # for other cases all errors will block
416
    my @blocking_error_codes =
416
        my @blocking_error_codes =
417
        ( $onsite_checkout and C4::Context->preference("OnSiteCheckoutsForce") )
417
            ( $onsite_checkout and C4::Context->preference("OnSiteCheckoutsForce") )
418
        ? qw( UNKNOWN_BARCODE NO_OPEN_DAYS )
418
            ? qw( UNKNOWN_BARCODE NO_OPEN_DAYS )
419
        : ( keys %$issuingimpossible );
419
            : ( keys %$issuingimpossible );
420
420
421
    if ( $issuingimpossible->{BOOKED_TO_ANOTHER} ) {
421
        if ( $issuingimpossible->{BOOKED_TO_ANOTHER} ) {
422
        $template_params->{BOOKED_TO_ANOTHER} = $issuingimpossible->{BOOKED_TO_ANOTHER};
422
            $template_params->{BOOKED_TO_ANOTHER} = $issuingimpossible->{BOOKED_TO_ANOTHER};
423
        $template_params->{IMPOSSIBLE}        = 1;
423
            $template_params->{IMPOSSIBLE}        = 1;
424
        $blocker                              = 1;
424
            $blocker                              = 1;
425
    }
425
        }
426
426
427
    foreach my $code ( @blocking_error_codes ) {
427
        foreach my $code ( @blocking_error_codes ) {
428
        if ($issuingimpossible->{$code}) {
428
            if ($issuingimpossible->{$code}) {
429
            $template_params->{$code} = $issuingimpossible->{$code};
429
                $template_params->{$code} = $issuingimpossible->{$code};
430
430
431
            $template_params->{IMPOSSIBLE} = 1;
431
                $template_params->{IMPOSSIBLE} = 1;
432
            $blocker = 1;
432
                $blocker = 1;
433
            }
433
        }
434
        }
434
    }
435
435
436
    delete $needsconfirmation->{'DEBT'} if ($debt_confirmed);
436
        delete $needsconfirmation->{'DEBT'} if ($debt_confirmed);
437
437
438
    if ( $item && C4::Context->preference('ClaimReturnedLostValue') ) {
438
        if ( $item && C4::Context->preference('ClaimReturnedLostValue') ) {
439
        my $autoClaimReturnCheckout = C4::Context->preference('AutoClaimReturnStatusOnCheckout');
439
            my $autoClaimReturnCheckout = C4::Context->preference('AutoClaimReturnStatusOnCheckout');
440
440
441
        my $claims = Koha::Checkouts::ReturnClaims->search(
441
            my $claims = Koha::Checkouts::ReturnClaims->search(
442
            {
442
                {
443
                itemnumber => $item->id,
443
                    itemnumber => $item->id,
444
                    resolution => undef,
445
                }
446
            );
447
            if ( $claims->count ) {
448
                if ($autoClaimReturnCheckout) {
449
                    my $claim = $claims->next;
450
451
                    my $patron_id  = $logged_in_user->borrowernumber;
452
                    my $resolution = $autoClaimReturnCheckout;
453
454
                    $claim->resolve(
455
                        {
456
                            resolution  => $resolution,
457
                            resolved_by => $patron_id,
458
                        }
459
                    );
460
                    $template_params->{CLAIM_RESOLUTION} = $claim;
461
                }
444
            }
462
            }
445
        );
463
        }
446
        if ( $claims->count ) {
447
            if ($autoClaimReturnCheckout) {
448
                my $claim = $claims->next;
449
450
                my $patron_id  = $logged_in_user->borrowernumber;
451
                my $resolution = $autoClaimReturnCheckout;
452
464
453
                $claim->resolve(
465
        if( $item and ( !$blocker or $force_allow_issue ) ){
454
                    {
466
            my $confirm_required = 0;
455
                        resolution  => $resolution,
467
            unless($issueconfirmed){
456
                        resolved_by => $patron_id,
468
                #  Get the item title for more information
469
                my $materials = $item->materials;
470
                my $descriptions = Koha::AuthorisedValues->get_description_by_koha_field({ frameworkcode => $biblio->frameworkcode, kohafield => 'items.materials', authorised_value => $materials });
471
                $materials = $descriptions->{lib} // $materials;
472
                $template_params->{ADDITIONAL_MATERIALS} = $materials;
473
                $template_params->{itemhomebranch} = $item->homebranch;
474
475
                # pass needsconfirmation to template if issuing is possible and user hasn't yet confirmed.
476
                foreach my $needsconfirmation_key ( keys %$needsconfirmation ) {
477
                    $template_params->{$needsconfirmation_key} = $needsconfirmation->{$needsconfirmation_key};
478
                    $template_params->{getTitleMessageIteminfo} = $biblio->title;
479
                    $template_params->{getBarcodeMessageIteminfo} = $item->barcode;
480
                    $template_params->{NEEDSCONFIRMATION} = 1;
481
                    $confirm_required = 1;
482
                    if ( $needsconfirmation_key eq 'BOOKED_TO_ANOTHER' ) {
483
                        my $reduceddue =
484
                            dt_from_string( $$needsconfirmation{$needsconfirmation_key}->start_date )->subtract( days => 1 );
485
                        $template_params->{reduceddue} = $reduceddue;
457
                    }
486
                    }
458
                );
487
                }
459
                $template_params->{CLAIM_RESOLUTION} = $claim;
460
            }
488
            }
461
        }
489
            unless ($confirm_required) {
462
    }
490
                my $switch_onsite_checkout = exists $messages->{ONSITE_CHECKOUT_WILL_BE_SWITCHED};
491
                if ( C4::Context->preference('UseRecalls') && !$recall_id ) {
492
                    my $recall = Koha::Recalls->find(
493
                        {
494
                            biblio_id => $item->biblionumber,
495
                            item_id   => [ undef,       $item->itemnumber ],
496
                            status    => [ 'requested', 'waiting' ],
497
                            completed => 0,
498
                            patron_id => $patron->borrowernumber,
499
                        }
500
                    );
501
                    $recall_id = ( $recall and $recall->id ) ? $recall->id : undef;
502
                }
463
503
464
    if( $item and ( !$blocker or $force_allow_issue ) ){
504
                # If booked (alerts or confirmation) update datedue to end of booking
465
        my $confirm_required = 0;
505
                if ( my $booked = $needsconfirmation->{BOOKED_EARLY} // $alerts->{BOOKED} ) {
466
        unless($issueconfirmed){
506
                    $datedue = $booked->end_date;
467
            #  Get the item title for more information
468
            my $materials = $item->materials;
469
            my $descriptions = Koha::AuthorisedValues->get_description_by_koha_field({ frameworkcode => $biblio->frameworkcode, kohafield => 'items.materials', authorised_value => $materials });
470
            $materials = $descriptions->{lib} // $materials;
471
            $template_params->{ADDITIONAL_MATERIALS} = $materials;
472
            $template_params->{itemhomebranch} = $item->homebranch;
473
474
            # pass needsconfirmation to template if issuing is possible and user hasn't yet confirmed.
475
            foreach my $needsconfirmation_key ( keys %$needsconfirmation ) {
476
                $template_params->{$needsconfirmation_key} = $needsconfirmation->{$needsconfirmation_key};
477
                $template_params->{getTitleMessageIteminfo} = $biblio->title;
478
                $template_params->{getBarcodeMessageIteminfo} = $item->barcode;
479
                $template_params->{NEEDSCONFIRMATION} = 1;
480
                $confirm_required = 1;
481
                if ( $needsconfirmation_key eq 'BOOKED_TO_ANOTHER' ) {
482
                    my $reduceddue =
483
                        dt_from_string( $$needsconfirmation{$needsconfirmation_key}->start_date )->subtract( days => 1 );
484
                    $template_params->{reduceddue} = $reduceddue;
485
                }
507
                }
486
            }
508
                my $issue = AddIssue(
487
        }
509
                    $patron, $barcode, $datedue,
488
        unless ($confirm_required) {
510
                    $cancelreserve,
489
            my $switch_onsite_checkout = exists $messages->{ONSITE_CHECKOUT_WILL_BE_SWITCHED};
511
                    undef, undef,
490
            if ( C4::Context->preference('UseRecalls') && !$recall_id ) {
491
                my $recall = Koha::Recalls->find(
492
                    {
512
                    {
493
                        biblio_id => $item->biblionumber,
513
                        onsite_checkout        => $onsite_checkout,        auto_renew    => $session->param('auto_renew'),
494
                        item_id   => [ undef,       $item->itemnumber ],
514
                        switch_onsite_checkout => $switch_onsite_checkout, cancel_recall => $cancel_recall,
495
                        status    => [ 'requested', 'waiting' ],
515
                        recall_id              => $recall_id,
496
                        completed => 0,
497
                        patron_id => $patron->borrowernumber,
498
                    }
516
                    }
499
                );
517
                );
500
                $recall_id = ( $recall and $recall->id ) ? $recall->id : undef;
518
                $template_params->{issue} = $issue;
519
                $session->clear('auto_renew');
520
                $inprocess = 1;
501
            }
521
            }
522
        }
502
523
503
            # If booked (alerts or confirmation) update datedue to end of booking
524
        if ($needsconfirmation->{RESERVE_WAITING} or $needsconfirmation->{RESERVED} or $needsconfirmation->{TRANSFERRED} or $needsconfirmation->{PROCESSING}){
504
            if ( my $booked = $needsconfirmation->{BOOKED_EARLY} // $alerts->{BOOKED} ) {
525
            $template->param(
505
                $datedue = $booked->end_date;
526
                reserveborrowernumber => $needsconfirmation->{'resborrowernumber'},
506
            }
527
                reserve_id => $needsconfirmation->{reserve_id},
507
            my $issue = AddIssue(
508
                $patron, $barcode, $datedue,
509
                $cancelreserve,
510
                undef, undef,
511
                {
512
                    onsite_checkout        => $onsite_checkout,        auto_renew    => $session->param('auto_renew'),
513
                    switch_onsite_checkout => $switch_onsite_checkout, cancel_recall => $cancel_recall,
514
                    recall_id              => $recall_id,
515
                }
516
            );
528
            );
517
            $template_params->{issue} = $issue;
518
            $session->clear('auto_renew');
519
            $inprocess = 1;
520
        }
529
        }
521
    }
522
523
    if ($needsconfirmation->{RESERVE_WAITING} or $needsconfirmation->{RESERVED} or $needsconfirmation->{TRANSFERRED} or $needsconfirmation->{PROCESSING}){
524
        $template->param(
525
            reserveborrowernumber => $needsconfirmation->{'resborrowernumber'},
526
            reserve_id => $needsconfirmation->{reserve_id},
527
        );
528
    }
529
530
530
531
531
    # FIXME If the issue is confirmed, we launch another time checkouts->count, now display the issue count after issue
532
        # FIXME If the issue is confirmed, we launch another time checkouts->count, now display the issue count after issue
532
    $patron = Koha::Patrons->find( $borrowernumber );
533
        $patron = Koha::Patrons->find( $borrowernumber );
533
    $template_params->{issuecount} = $patron->checkouts->count;
534
        $template_params->{issuecount} = $patron->checkouts->count;
534
535
535
    if ( $item ) {
536
        if ( $item ) {
536
        $template_params->{item} = $item;
537
            $template_params->{item} = $item;
537
        $template_params->{biblio} = $biblio;
538
            $template_params->{biblio} = $biblio;
538
        $template_params->{itembiblionumber} = $biblio->biblionumber;
539
            $template_params->{itembiblionumber} = $biblio->biblionumber;
539
    }
540
        }
540
    push @$checkout_infos, $template_params;
541
        push @$checkout_infos, $template_params;
541
  }
542
  }
542
  unless ( $batch ) {
543
  unless ( $batch ) {
543
    $template->param( %{$checkout_infos->[0]} );
544
    $template->param( %{$checkout_infos->[0]} );
544
- 

Return to bug 38246