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

(-)a/C4/Circulation.pm (-15 / +12 lines)
Lines 3682-3702 sub AddRenewal { Link Here
3682
3682
3683
            #Log the renewal
3683
            #Log the renewal
3684
            if ( C4::Context->preference("RenewalLog") ) {
3684
            if ( C4::Context->preference("RenewalLog") ) {
3685
                my $info = $itemnumber;
3685
                my $info = to_json(
3686
                if ( defined($confirmations) || defined($forced) ) {
3686
                    {
3687
                    $info = to_json(
3687
                        issue         => $issue->issue_id,
3688
                        {
3688
                        itemnumber    => $itemnumber,
3689
                            issue         => $issue->issue_id,
3689
                        confirmations => $confirmations || [],
3690
                            itemnumber    => $itemnumber,
3690
                        forced        => $forced        || []
3691
                            confirmations => $confirmations,
3691
                    },
3692
                            forced        => $forced
3692
                    {
3693
                        },
3693
                        pretty    => 1,
3694
                        {
3694
                        canonical => 1
3695
                            pretty    => 1,
3695
                    }
3696
                            canonical => 1
3696
                );
3697
                        }
3698
                    );
3699
                }
3700
                logaction( "CIRCULATION", "RENEWAL", $borrowernumber, $info );
3697
                logaction( "CIRCULATION", "RENEWAL", $borrowernumber, $info );
3701
            }
3698
            }
3702
3699
(-)a/t/db_dependent/Circulation.t (-2 / +139 lines)
Lines 19-25 use Modern::Perl; Link Here
19
use utf8;
19
use utf8;
20
20
21
use Test::NoWarnings;
21
use Test::NoWarnings;
22
use Test::More tests => 78;
22
use Test::More tests => 80;
23
use Test::Exception;
23
use Test::Exception;
24
use Test::MockModule;
24
use Test::MockModule;
25
use Test::Deep qw( cmp_deeply );
25
use Test::Deep qw( cmp_deeply );
Lines 28-33 use Test::Warn; Link Here
28
use Data::Dumper;
28
use Data::Dumper;
29
use DateTime;
29
use DateTime;
30
use Time::Fake;
30
use Time::Fake;
31
use JSON  qw( from_json );
31
use POSIX qw( floor );
32
use POSIX qw( floor );
32
use t::lib::Mocks;
33
use t::lib::Mocks;
33
use t::lib::TestBuilder;
34
use t::lib::TestBuilder;
Lines 7769-7774 subtest 'ChildNeedsGuarantor' => sub { Link Here
7769
        "AddReturn generates no warning when can_be_guarantee type patron has a guarantor and not ChildNeedsGuarantor";
7770
        "AddReturn generates no warning when can_be_guarantee type patron has a guarantor and not ChildNeedsGuarantor";
7770
};
7771
};
7771
7772
7773
subtest 'Bug 9762: AddIssue override JSON logging' => sub {
7774
    plan tests => 8;
7775
7776
    my $library = $builder->build_object( { class => 'Koha::Libraries' } );
7777
    my $patron  = $builder->build_object( { class => 'Koha::Patrons' } );
7778
    my $item    = $builder->build_sample_item( { library => $library->branchcode } );
7779
7780
    t::lib::Mocks::mock_userenv( { patron => $patron, branchcode => $library->branchcode } );
7781
    t::lib::Mocks::mock_preference( 'IssueLog', 1 );
7782
7783
    # Clear any existing logs
7784
    Koha::ActionLogs->search( { module => 'CIRCULATION', action => 'ISSUE' } )->delete;
7785
7786
    # Test 1: Normal checkout without overrides - should log item number only
7787
    my $issue = C4::Circulation::AddIssue( $patron, $item->barcode );
7788
    ok( $issue, 'Item checked out successfully' );
7789
7790
    my $logs = Koha::ActionLogs->search(
7791
        {
7792
            module => 'CIRCULATION',
7793
            action => 'ISSUE',
7794
            object => $patron->borrowernumber
7795
        },
7796
        { order_by => { -desc => 'timestamp' } }
7797
    );
7798
    is( $logs->count, 1, 'One log entry created for normal checkout' );
7799
    my $log = $logs->next;
7800
    is( $log->info, $item->itemnumber, 'Normal checkout logs item number only' );
7801
7802
    # Return the item for next test
7803
    C4::Circulation::AddReturn( $item->barcode, $library->branchcode );
7804
7805
    # Test 2: Checkout with confirmations - should log JSON with confirmations
7806
    my $item2 = $builder->build_sample_item( { library => $library->branchcode } );
7807
7808
    my $issue2 = C4::Circulation::AddIssue(
7809
        $patron,
7810
        $item2->barcode,
7811
        undef, undef, undef, undef,
7812
        {
7813
            confirmations => [ 'DEBT', 'AGE_RESTRICTION' ],
7814
            forced        => []
7815
        }
7816
    );
7817
    ok( $issue2, 'Item with confirmations checked out successfully' );
7818
7819
    $logs = Koha::ActionLogs->search(
7820
        {
7821
            module => 'CIRCULATION',
7822
            action => 'ISSUE',
7823
            object => $patron->borrowernumber,
7824
            info   => { '!=', $item->itemnumber }    # Exclude the first test log
7825
        },
7826
        { order_by => { -desc => 'timestamp' } }
7827
    );
7828
    is( $logs->count, 1, 'One log entry created for override checkout' );
7829
    $log = $logs->next;
7830
7831
    my $log_data = eval { from_json( $log->info ) };
7832
    ok( !$@,                               'Log info is valid JSON' );
7833
    ok( exists $log_data->{confirmations}, 'JSON contains confirmations array' );
7834
    is_deeply( $log_data->{confirmations}, [ 'DEBT', 'AGE_RESTRICTION' ], 'Confirmations logged correctly' );
7835
};
7836
7837
subtest 'Bug 9762: AddRenewal override JSON logging' => sub {
7838
    plan tests => 11;
7839
7840
    my $library = $builder->build_object( { class => 'Koha::Libraries' } );
7841
    my $patron  = $builder->build_object( { class => 'Koha::Patrons' } );
7842
    my $item    = $builder->build_sample_item( { library => $library->branchcode } );
7843
7844
    t::lib::Mocks::mock_userenv( { patron => $patron, branchcode => $library->branchcode } );
7845
    t::lib::Mocks::mock_preference( 'RenewalLog', 1 );
7846
7847
    # Issue the item first
7848
    my $issue = C4::Circulation::AddIssue( $patron, $item->barcode );
7849
7850
    # Clear any existing renewal logs
7851
    Koha::ActionLogs->search( { module => 'CIRCULATION', action => 'RENEWAL' } )->delete;
7852
7853
    # Test 1: Normal renewal without overrides - should log item number only
7854
    C4::Circulation::AddRenewal(
7855
        {
7856
            borrowernumber => $patron->borrowernumber,
7857
            itemnumber     => $item->itemnumber,
7858
            branch         => $library->branchcode
7859
        }
7860
    );
7861
7862
    my $logs = Koha::ActionLogs->search(
7863
        {
7864
            module => 'CIRCULATION',
7865
            action => 'RENEWAL',
7866
            object => $patron->borrowernumber
7867
        },
7868
        { order_by => { -desc => 'timestamp' } }
7869
    );
7870
    is( $logs->count, 1, 'One log entry created for normal renewal' );
7871
    my $log = $logs->next;
7872
7873
    my $log_data = eval { from_json( $log->info ) };
7874
    ok( !$@, 'Normal renewal log info is valid JSON' );
7875
    is( $log_data->{itemnumber}, $item->itemnumber, 'Normal renewal JSON contains itemnumber' );
7876
    is_deeply( $log_data->{confirmations}, [], 'Normal renewal has empty confirmations array' );
7877
    is_deeply( $log_data->{forced},        [], 'Normal renewal has empty forced array' );
7878
7879
    # Test 2: Renewal with overrides - should log JSON with confirmations
7880
    C4::Circulation::AddRenewal(
7881
        {
7882
            borrowernumber => $patron->borrowernumber,
7883
            itemnumber     => $item->itemnumber,
7884
            branch         => $library->branchcode,
7885
            confirmations  => [ 'ON_RESERVE', 'RENEWAL_LIMIT' ],
7886
            forced         => ['TOO_MUCH']
7887
        }
7888
    );
7889
7890
    # Get only the most recent renewal log (the one with overrides)
7891
    my $override_log = Koha::ActionLogs->search(
7892
        {
7893
            module => 'CIRCULATION',
7894
            action => 'RENEWAL',
7895
            object => $patron->borrowernumber,
7896
            info   => { 'like' => '%ON_RESERVE%' }    # Only get the log with our test overrides
7897
        },
7898
        { order_by => { -desc => 'timestamp' }, rows => 1 }
7899
    )->next;
7900
7901
    ok( $override_log, 'Found override renewal log entry' );
7902
    $log_data = eval { from_json( $override_log->info ) };
7903
    ok( !$@,                               'Override renewal log info is valid JSON' );
7904
    ok( exists $log_data->{confirmations}, 'JSON contains confirmations array' );
7905
    ok( exists $log_data->{forced},        'JSON contains forced array' );
7906
    is_deeply( $log_data->{confirmations}, [ 'ON_RESERVE', 'RENEWAL_LIMIT' ], 'Confirmations logged correctly' );
7907
    is_deeply( $log_data->{forced},        ['TOO_MUCH'],                      'Forced overrides logged correctly' );
7908
};
7909
7772
$schema->storage->txn_rollback;
7910
$schema->storage->txn_rollback;
7773
C4::Context->clear_syspref_cache();
7911
C4::Context->clear_syspref_cache();
7774
$branches = Koha::Libraries->search();
7912
$branches = Koha::Libraries->search();
7775
- 

Return to bug 9762