From 0cff21fd24f082589219e08500bc31d0e1d0600e Mon Sep 17 00:00:00 2001 From: Nick Clemens Date: Mon, 1 Dec 2025 19:51:52 +0000 Subject: [PATCH] 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 --- circ/overdue.pl | 17 ++++++++++++++++- .../prog/en/includes/patron-title.inc | 5 +++-- .../prog/en/modules/circ/overdue.tt | 8 ++++---- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/circ/overdue.pl b/circ/overdue.pl index 2d58dd27ee4..0bd118d8a99 100755 --- a/circ/overdue.pl +++ b/circ/overdue.pl @@ -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}, diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/patron-title.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/patron-title.inc index 7161ca7a3b9..67bce0be337 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/patron-title.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/patron-title.inc @@ -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 -%] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/overdue.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/overdue.tt index 1bc2b58b50d..a273247e607 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/overdue.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/overdue.tt @@ -120,8 +120,8 @@ [% END %] - [% 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 ) %] [email] [% END %] @@ -136,8 +136,8 @@ [% END %] - [% Categories.GetName( overdueloo.patron.categorycode ) | html %] - [% Branches.GetName( overdueloo.patron.branchcode ) | html %] + [% Categories.GetName( overdueloo.borrower.categorycode ) | html %] + [% Branches.GetName( overdueloo.borrower.branchcode ) | html %] [% INCLUDE 'biblio-title.inc' biblio=overdueloo link = 1 %] [% IF ( overdueloo.author ) %], by [% overdueloo.author | html %][% END %][% IF ( overdueloo.enumchron ) %], [% overdueloo.enumchron | html %][% END %]