Bug 36155

Summary: Improve perfs of suggestion.pl when there are many budgets
Product: Koha Reporter: Fridolin Somers <fridolin.somers>
Component: AcquisitionsAssignee: Fridolin Somers <fridolin.somers>
Status: Signed Off --- QA Contact: Testopia <testopia>
Severity: minor    
Priority: P5 - low CC: dcook, jonathan.druart
Version: Main   
Hardware: All   
OS: All   
See Also: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=35921
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=30232
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=31024
https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=33430
GIT URL: Change sponsored?: ---
Patch complexity: Trivial patch Documentation contact:
Documentation submission: Text to go in the release notes:
Version(s) released in:
Circulation function:
Bug Depends on:    
Bug Blocks: 7923    
Attachments: Bug 36155: Improve perfs of suggestion.pl when there are many budgets
Bug 36155: Improve perfs of suggestion.pl when there are many budgets
Bug 36155: Improve perfs of suggestion.pl when there are many budgets
Bug 36155: Improve perfs of suggestion.pl when there are many budgets

Description Fridolin Somers 2024-02-23 07:53:34 UTC
Page suggestion/suggestion.pl always calls GetBudgets() and GetBudgetHierarchy().
But the result are not always used in template.
When there are many budgets and funds this takes some time.
Also CanUserUseBudget() in a loop should use a unique Koha::Patron object of the logged in user.
Comment 1 Fridolin Somers 2024-02-23 08:38:54 UTC
(In reply to Fridolin Somers from comment #0)
> Also CanUserUseBudget() in a loop should use a unique Koha::Patron object of
> the logged in user.
Ah I mean a unblessed Koha::Patron object of logged in user
Comment 2 Fridolin Somers 2024-02-23 08:49:07 UTC
Created attachment 162364 [details] [review]
Bug 36155: Improve perfs of suggestion.pl when there are many budgets

Page suggestion/suggestion.pl always calls GetBudgets() and GetBudgetHierarchy().
But the result are not always used in template.
When there are many budgets and funds this takes some time.
Also CanUserUseBudget() in a loop should use a unique Koha::Patron unblessed object of the logged in user.

Test plan :
1) Create a user 'P1' with permissions 'catalogue', 'suggestions_manage'
   and all permissions on acquisition except 'budget_manage_all'
2) Create some funds and subfunds without restricted access
3) Create a fund 'F1' with owner other than 'P1' and restricted access on owner
4) Go to staff interface with patron 'P1'
5) Go to Acquisitions > Suggestions
6) Check you see all founds except F1 in Filter by > Acquisition information
7) Create a new suggestion
8) Check you see all founds except F1 in Fund
9) Select a fund and save
10) Edit this suggestion
11) Check you see all founds except F1 in Fund
12) Compare performance with and without patch with many budgets and funds
    (see test plan of Bug 35921)
Comment 3 Fridolin Somers 2024-02-23 09:18:15 UTC
Applyed on a Koha with :
67 aqbudgetperiods
1605 aqbudgets

Timings :
suggestion.pl?op=add : 14s > 2s
suggestion.pl?op=edit : 14s > 2s
suggestion.pl?op=show : 20s > 8s

Whaouuu :D
Comment 4 Pedro Amorim 2024-02-23 10:22:02 UTC
Created attachment 162371 [details] [review]
Bug 36155: Improve perfs of suggestion.pl when there are many budgets

Page suggestion/suggestion.pl always calls GetBudgets() and GetBudgetHierarchy().
But the result are not always used in template.
When there are many budgets and funds this takes some time.
Also CanUserUseBudget() in a loop should use a unique Koha::Patron unblessed object of the logged in user.

Test plan :
1) Create a user 'P1' with permissions 'catalogue', 'suggestions_manage'
   and all permissions on acquisition except 'budget_manage_all'
2) Create some funds and subfunds without restricted access
3) Create a fund 'F1' with owner other than 'P1' and restricted access on owner
4) Go to staff interface with patron 'P1'
5) Go to Acquisitions > Suggestions
6) Check you see all founds except F1 in Filter by > Acquisition information
7) Create a new suggestion
8) Check you see all founds except F1 in Fund
9) Select a fund and save
10) Edit this suggestion
11) Check you see all founds except F1 in Fund
12) Compare performance with and without patch with many budgets and funds
    (see test plan of Bug 35921)

Signed-off-by: Pedro Amorim <pedro.amorim@ptfs-europe.com>
Comment 5 Jonathan Druart 2024-02-29 10:02:08 UTC
Will need to be rebased on top of 34478 when pushed.
Comment 6 Fridolin Somers 2025-07-01 16:25:36 UTC
Created attachment 183676 [details] [review]
Bug 36155: Improve perfs of suggestion.pl when there are many budgets

Page suggestion/suggestion.pl calls CanUserUseBudget() in a loop,
will must use a uniq Koha::Patron object of the logged in user.
When there are many budgets and funds this takes some time.

Test plan :
Compare performance with and without patch with many budgets and funds
(see test plan of Bug 35921)
Comment 7 Fridolin Somers 2025-07-01 16:26:26 UTC
Code have changed so patch is smaller, only replaces call on patron in loop
Comment 8 David Cook 2025-08-13 23:57:22 UTC
Ah yes... suggestion.pl. The home of "$op eq 'else'". *shudder*.

In theory, we should probably only fetch the data for "sugg_budgets" for the ops that need it, but... unpicking suggestion.tt would not be fun and this fix makes a big difference so very practical improvement as is.
Comment 9 David Cook 2025-08-13 23:58:37 UTC
My test plan:
1. Create many budgets (see bug 35921)
       perl -MKoha::Database -e '
           my $schema = Koha::Database->schema;
           my $period = $schema->resultset("Aqbudgetperiod")->create({
               budget_period_startdate => "2000-01-01",
               budget_period_enddate => "2999-12-31"
           });
           $schema->resultset("Aqbudget")->create({
               budget_owner_id => 1,
               budget_period_id => $period->id
           }) for (1..1000)
       '
2. Go to http://localhost:8081/cgi-bin/koha/suggestion/suggestion.pl
3. Note how it takes several seconds to load
4. Apply the patch
5. koha-plack --restart kohadev
6. Go to http://localhost:8081/cgi-bin/koha/suggestion/suggestion.pl
7. Note how it loads in < 1 second now
Comment 10 David Cook 2025-08-13 23:59:06 UTC
Created attachment 185381 [details] [review]
Bug 36155: Improve perfs of suggestion.pl when there are many budgets

Page suggestion/suggestion.pl calls CanUserUseBudget() in a loop,
will must use a uniq Koha::Patron object of the logged in user.
When there are many budgets and funds this takes some time.

Test plan :
Compare performance with and without patch with many budgets and funds
(see test plan of Bug 35921)

Signed-off-by: David Cook <dcook@prosentient.com.au>