Bug 41343: Don't fetch patron objects per overdue

We use SQL here to get all the needed info - the query says it is slow, but isn't so bad.
Worse is fetching the patron for each borrower with overdues (and more than once if they have several)

It appears we started grabbing the patron so we could use patron title, but we can just pass the info already fetched.

I additionally fetch the patron category types and update patron-title to allow for hide_patron_infos_if_needed to work
without a patron object - we can just use the branchcode as ultimately that's all we need

To test:
1 - Add many items to your catalog (can use my handy repo randitems.pl)
    https://github.com/kidclamp/handy-koha-script
2 - Add many issues (can use randissues.pl from above)
3 - I tested with about 1000
4 - Browse to Circulation->Overdues
5 - Note load time
6 - Apply patch
7 - Restart all
8 - Note load time is faster

Signed-off-by: David Nind <david@davidnind.com>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
This commit is contained in:
Nick Clemens 2025-12-01 19:51:52 +00:00 committed by Lucas Gass
parent 950c9f8188
commit e3862dc81b
No known key found for this signature in database
GPG Key ID: 60B447398B0D36CA
3 changed files with 23 additions and 7 deletions

View File

@ -247,6 +247,8 @@ if ($noreport) {
borrowers.cardnumber,
borrowers.borrowernumber,
borrowers.branchcode,
borrowers.categorycode,
categories.category_type,
issues.itemnumber,
issues.issuedate,
items.datelastborrowed,
@ -269,6 +271,7 @@ if ($noreport) {
return_claims.id AS return_claim_id
FROM issues
LEFT JOIN borrowers ON (issues.borrowernumber=borrowers.borrowernumber )
LEFT JOIN categories ON (categories.categorycode = borrowers.categorycode )
LEFT JOIN items ON (issues.itemnumber=items.itemnumber)
LEFT JOIN biblioitems ON (biblioitems.biblioitemnumber=items.biblioitemnumber)
LEFT JOIN biblio ON (biblio.biblionumber=items.biblionumber )
@ -349,7 +352,19 @@ if ($noreport) {
}
push @overduedata, {
patron => Koha::Patrons->find( $data->{borrowernumber} ),
borrower => {
branchcode => $data->{branchcode},
borrowernumber => $data->{borrowernumber},
categorycode => $data->{categorycode},
category_type => $data->{category_type},
surname => $data->{surname},
othernames => $data->{othernames},
firstname => $data->{firstname},
preferred_name => $data->{preferred_name},
middle_name => $data->{middle_name},
cardnumber => $data->{cardnumber},
title => $data->{title}
},
duedate => $data->{date_due},
borrowernumber => $data->{borrowernumber},
cardnumber => $data->{cardnumber},

View File

@ -3,6 +3,7 @@
[%- USE Branches -%]
[%- SET data = {} -%]
[%- IF patron -%]
[%- SET data.branchcode = patron.branchcode -%]
[%- SET data.category_type = patron.category.category_type -%]
[%- SET data.surname = patron.surname -%]
[%- SET data.othernames = patron.othernames -%]
@ -13,6 +14,7 @@
[%- SET data.borrowernumber = patron.borrowernumber -%]
[%- SET data.title = patron.title -%]
[%- ELSIF ( borrower.borrowernumber ) -%]
[%- SET data.branchcode = borrower.branchcode -%]
[%- SET data.category_type = borrower.category_type -%]
[%- SET data.surname = borrower.surname -%]
[%- SET data.othernames = borrower.othernames -%]
@ -38,8 +40,7 @@
[%- SET display_cardnumber = 1 -%]
[%- IF no_cardnumber -%][%- SET display_cardnumber = 0 -%][%- END -%]
[%- IF hide_patron_infos_if_needed -%]
[%# Should only be set if patron is set -%]
[%- SET can_see_patron_infos = logged_in_user.can_see_patron_infos( patron ) -%]
[%- SET can_see_patron_infos = logged_in_user.can_see_patrons_from( data.branchcode ) -%]
[%- UNLESS can_see_patron_infos -%]
[%- SET display_patron_name = 0 -%]
[%- SET display_cardnumber = 0 -%]

View File

@ -120,8 +120,8 @@
[% END %]
</td>
<td>
[% INCLUDE 'patron-title.inc' patron=overdueloo.patron hide_patron_infos_if_needed=1 %]
[% IF logged_in_user.can_see_patron_infos( overdueloo.patron ) %]
[% INCLUDE 'patron-title.inc' borrower=overdueloo.borrower hide_patron_infos_if_needed=1 %]
[% IF logged_in_user.can_see_patrons_from( overdueloo.branchcode ) %]
[% IF ( overdueloo.email ) %]
<span class="overdue_email"> [<a href="mailto:[% overdueloo.email | uri %]?subject=[% INCLUDE subject %] [% overdueloo.title | uri %]">email</a>] </span>
[% END %]
@ -136,8 +136,8 @@
</span>
[% END %]
</td>
<td>[% Categories.GetName( overdueloo.patron.categorycode ) | html %]</td>
<td>[% Branches.GetName( overdueloo.patron.branchcode ) | html %]</td>
<td>[% Categories.GetName( overdueloo.borrower.categorycode ) | html %]</td>
<td>[% Branches.GetName( overdueloo.borrower.branchcode ) | html %]</td>
<td
>[% INCLUDE 'biblio-title.inc' biblio=overdueloo link = 1 %]
[% IF ( overdueloo.author ) %], by [% overdueloo.author | html %][% END %][% IF ( overdueloo.enumchron ) %], [% overdueloo.enumchron | html %][% END %]</td