Bug 40866: Implement Alternative pattern for holds override logging (Part 4)
This patch implements proper override logging for holds following the
Alternative implementation pattern used for checkouts and renewals.
Instead of just removing the orphaned logging code from the original
Bug 9762 implementation, this patch properly implements override logging
by updating AddReserve to accept and log override information, similar
to how AddIssue handles confirmations and forced overrides.
Changes:
C4/Reserves.pm:
- Added JSON qw(to_json) import
- Updated AddReserve to accept confirmations and forced parameters
- Enhanced the existing logaction call to include override information
in JSON format when overrides are present
- Log format matches the Alternative implementation pattern:
* hold ID
* branchcode
* biblionumber
* itemnumber
* confirmations array
* forced array
Koha/REST/V1/Holds.pm:
- Added confirmations array building in the add() method
- Pass 'HOLD_POLICY_OVERRIDE' confirmation when override_all is true
- Pass confirmations parameter to AddReserve call
reserve/request.pl:
- Removed orphaned original implementation logging code
- Removed unused variables and imports (message, @message, user, etc.)
- Removed C4::Log import
koha-tmpl/intranet-tmpl/prog/en/includes/action-logs.inc:
- Added 'HOLD_POLICY_OVERRIDE' case to translate_log_override block
- Displays as "Hold policy override" in log viewer
koha-tmpl/intranet-tmpl/prog/en/modules/tools/viewlog.tt:
- Added JSON display handling for HOLDS module (similar to CIRCULATION)
- Displays hold ID, biblionumber, and optional itemnumber with links
- Shows forced and confirmation overrides using translate_log_override
This ensures hold overrides are logged consistently with the Alternative
implementation pattern, providing proper audit trails for policy overrides
that are properly displayed in the log viewer.
Signed-off-by: Andrew Fuerste Henry <andrew@bywatersolutions.com>
Signed-off-by: Paul Derscheid <paul.derscheid@lmscloud.de>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
(cherry picked from commit 1884f68c5b)
Signed-off-by: Paul Derscheid <paul.derscheid@lmscloud.de>
This commit is contained in:
parent
40d5b8b2e5
commit
e5bd7c1ad4
|
|
@ -22,6 +22,8 @@ package C4::Reserves;
|
|||
|
||||
use Modern::Perl;
|
||||
|
||||
use JSON qw( to_json );
|
||||
|
||||
use C4::Accounts;
|
||||
use C4::Biblio qw( GetMarcFromKohaField );
|
||||
use C4::Circulation qw( CheckIfIssuedToPatron GetAgeRestriction GetBranchItemRule );
|
||||
|
|
@ -192,6 +194,8 @@ sub AddReserve {
|
|||
my $itemtype = $params->{itemtype};
|
||||
my $non_priority = $params->{non_priority};
|
||||
my $item_group_id = $params->{item_group_id};
|
||||
my $confirmations = $params->{confirmations};
|
||||
my $forced = $params->{forced};
|
||||
|
||||
$resdate ||= dt_from_string;
|
||||
|
||||
|
|
@ -261,8 +265,24 @@ sub AddReserve {
|
|||
# record patron activity
|
||||
$hold->patron->update_lastseen('hold');
|
||||
|
||||
logaction( 'HOLDS', 'CREATE', $hold->id, $hold )
|
||||
if C4::Context->preference('HoldsLog');
|
||||
# Log the hold creation
|
||||
if ( C4::Context->preference('HoldsLog') ) {
|
||||
my $info = $hold->id;
|
||||
if ( defined($confirmations) || defined($forced) ) {
|
||||
$info = to_json(
|
||||
{
|
||||
hold => $hold->id,
|
||||
branchcode => $hold->branchcode,
|
||||
biblionumber => $hold->biblionumber,
|
||||
itemnumber => $hold->itemnumber,
|
||||
confirmations => $confirmations,
|
||||
forced => $forced
|
||||
},
|
||||
{ pretty => 1, canonical => 1 }
|
||||
);
|
||||
}
|
||||
logaction( 'HOLDS', 'CREATE', $hold->id, $info );
|
||||
}
|
||||
|
||||
my $reserve_id = $hold->id();
|
||||
|
||||
|
|
|
|||
|
|
@ -191,6 +191,12 @@ sub add {
|
|||
|
||||
my $priority = C4::Reserves::CalculatePriority($biblio_id);
|
||||
|
||||
# Build confirmations array for logging overrides
|
||||
my $confirmations = [];
|
||||
if ($override_all) {
|
||||
push @{$confirmations}, 'HOLD_POLICY_OVERRIDE';
|
||||
}
|
||||
|
||||
my $hold_id = C4::Reserves::AddReserve(
|
||||
{
|
||||
branchcode => $pickup_library_id,
|
||||
|
|
@ -206,6 +212,7 @@ sub add {
|
|||
itemtype => $item_type,
|
||||
non_priority => $non_priority,
|
||||
item_group_id => $item_group_id,
|
||||
confirmations => $confirmations,
|
||||
}
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -179,6 +179,8 @@
|
|||
|
||||
[% BLOCK translate_log_override %]
|
||||
[% SWITCH override %]
|
||||
[% CASE 'HOLD_POLICY_OVERRIDE' %]
|
||||
<span>Hold policy override</span>
|
||||
[% CASE 'INVALID_DATE' %]
|
||||
<span>Invalid date confirmed</span>
|
||||
[% CASE 'DEBT_GUARANTEES' %]
|
||||
|
|
|
|||
|
|
@ -349,6 +349,28 @@
|
|||
<div class="confirmed"> [% PROCESS translate_log_override override=confirmation %] </div>
|
||||
[% END %]
|
||||
</div>
|
||||
[% ELSIF ( loopro.module == 'HOLDS' && loopro.json_found ) %]
|
||||
<div class="loginfo" id="loginfo[% loopro.action_id | html %]">
|
||||
<div>
|
||||
<a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% loopro.json.biblionumber | uri %]" title="Display holds for this record"
|
||||
>Hold [% loopro.json.hold | html %] on biblio [% loopro.json.biblionumber | html %]</a
|
||||
>
|
||||
[% IF loopro.json.itemnumber %]
|
||||
-
|
||||
<a
|
||||
href="/cgi-bin/koha/catalogue/moredetail.pl?itemnumber=[% loopro.json.itemnumber | uri %]&biblionumber=[% loopro.json.biblionumber | uri %]#item[% loopro.json.itemnumber | uri %]"
|
||||
title="Display detail for this item"
|
||||
>Item [% loopro.json.itemnumber | html %]</a
|
||||
>
|
||||
[% END %]
|
||||
</div>
|
||||
[% FOREACH force IN loopro.json.forced %]
|
||||
<div class="forced"> [% PROCESS translate_log_override override=force %] </div>
|
||||
[% END %]
|
||||
[% FOREACH confirmation IN loopro.json.confirmations %]
|
||||
<div class="confirmed"> [% PROCESS translate_log_override override=confirmation %] </div>
|
||||
[% END %]
|
||||
</div>
|
||||
[% ELSIF loopro.module == "SYSTEMPREFERENCE" || loopro.module == "REPORTS" || loopro.module == "NEWS" %]
|
||||
<div class="loginfo" id="loginfo[% loopro.action_id | html %]">[% loopro.info | trim | html %]</div>
|
||||
<div class="compare_info" id="compare_info[% loopro.action_id | html %]">
|
||||
|
|
|
|||
|
|
@ -40,7 +40,6 @@ use C4::Serials qw( CountSubscriptionFromBiblionumber );
|
|||
use C4::Circulation qw( _GetCircControlBranch GetBranchItemRule );
|
||||
use Koha::DateUtils qw( dt_from_string );
|
||||
use C4::Search qw( enabled_staff_search_views );
|
||||
use C4::Log qw( logaction );
|
||||
|
||||
use Koha::Biblios;
|
||||
use Koha::Checkouts;
|
||||
|
|
@ -570,33 +569,6 @@ if ( ( $findborrower && $borrowernumber_hold || $findclub && $club_hold )
|
|||
$num_alreadyheld++;
|
||||
}
|
||||
|
||||
my $borrower = $patron;
|
||||
my $borrowernumber = $patron->borrowernumber;
|
||||
my $user = C4::Context->userenv->{number};
|
||||
my $branchcode = C4::Context->userenv->{branch};
|
||||
my $message = "Override limitation of hold";
|
||||
my @message = ("Override limitation of hold");
|
||||
my $barcode = $item->{barcode};
|
||||
|
||||
my $infos = (
|
||||
{
|
||||
message => \@message,
|
||||
borrowernumber => $borrowernumber,
|
||||
barcode => $barcode,
|
||||
manager_id => $user,
|
||||
branchcode => $branchcode,
|
||||
}
|
||||
);
|
||||
|
||||
my $json_infos = JSON->new->utf8->pretty->encode($infos);
|
||||
$json_infos =~ s/"/'/g;
|
||||
|
||||
logaction(
|
||||
"HOLD", "ISSUE",
|
||||
$borrower->{'borrowernumber'},
|
||||
$json_infos,
|
||||
) if C4::Context->preference("IssueLog");
|
||||
|
||||
push( @available_itemtypes, $item->{itype} );
|
||||
} else {
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue