Bug 30359: GetBudgetHierarchy is slow on order receive page

This patch adds skiptotals parameter to GetBudgetHierarchy so calculating
totals can be skipped from some pages.

Test plan:
1) Open browser's Inspect -> Network
2) Go to receive orders
3) Check the timings for page load
4) Apply the patch
5) Refresh the page
6) Check the timings again
7) prove t/db_dependent/Budgets.t

Sponsored-by: Koha-Suomi Oy

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Signed-off-by: Joonas Kylmälä <joonas.kylmala@iki.fi>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
Johanna Raisa 2022-03-25 12:25:56 +02:00 committed by Tomas Cohen Arazi
parent 63f88a5742
commit 35724169c1
Signed by: tomascohen
GPG key ID: 0A272EA1B2F3C15F
2 changed files with 44 additions and 43 deletions

View file

@ -485,7 +485,7 @@ sub ModBudgetPeriod {
# ------------------------------------------------------------------- # -------------------------------------------------------------------
sub GetBudgetHierarchy { sub GetBudgetHierarchy {
my ( $budget_period_id, $branchcode, $owner ) = @_; my ( $budget_period_id, $branchcode, $owner, $skiptotals ) = @_;
my @bind_params; my @bind_params;
my $dbh = C4::Context->dbh; my $dbh = C4::Context->dbh;
my $query = qq| my $query = qq|
@ -550,49 +550,50 @@ sub GetBudgetHierarchy {
foreach my $first_parent (@first_parents) { foreach my $first_parent (@first_parents) {
_add_budget_children(\@sort, $first_parent, 0); _add_budget_children(\@sort, $first_parent, 0);
} }
if (!$skiptotals) {
# Get all the budgets totals in as few queries as possible # Get all the budgets totals in as few queries as possible
my $hr_budget_spent = $dbh->selectall_hashref(q| my $hr_budget_spent = $dbh->selectall_hashref(q|
SELECT aqorders.budget_id, aqbudgets.budget_parent_id, SELECT aqorders.budget_id, aqbudgets.budget_parent_id,
SUM( | . C4::Acquisition::get_rounding_sql(qq|COALESCE(unitprice_tax_included, ecost_tax_included)|) . q| * quantity ) AS budget_spent SUM( | . C4::Acquisition::get_rounding_sql(qq|COALESCE(unitprice_tax_included, ecost_tax_included)|) . q| * quantity ) AS budget_spent
FROM aqorders JOIN aqbudgets USING (budget_id) FROM aqorders JOIN aqbudgets USING (budget_id)
WHERE quantityreceived > 0 AND datecancellationprinted IS NULL WHERE quantityreceived > 0 AND datecancellationprinted IS NULL
GROUP BY budget_id, budget_parent_id GROUP BY budget_id, budget_parent_id
|, 'budget_id'); |, 'budget_id');
my $hr_budget_ordered = $dbh->selectall_hashref(q| my $hr_budget_ordered = $dbh->selectall_hashref(q|
SELECT aqorders.budget_id, aqbudgets.budget_parent_id, SELECT aqorders.budget_id, aqbudgets.budget_parent_id,
SUM( | . C4::Acquisition::get_rounding_sql(qq|ecost_tax_included|) . q| * quantity) AS budget_ordered SUM( | . C4::Acquisition::get_rounding_sql(qq|ecost_tax_included|) . q| * quantity) AS budget_ordered
FROM aqorders JOIN aqbudgets USING (budget_id) FROM aqorders JOIN aqbudgets USING (budget_id)
WHERE quantityreceived = 0 AND datecancellationprinted IS NULL WHERE quantityreceived = 0 AND datecancellationprinted IS NULL
GROUP BY budget_id, budget_parent_id GROUP BY budget_id, budget_parent_id
|, 'budget_id'); |, 'budget_id');
my $hr_budget_spent_shipment = $dbh->selectall_hashref(q| my $hr_budget_spent_shipment = $dbh->selectall_hashref(q|
SELECT shipmentcost_budgetid as budget_id, SELECT shipmentcost_budgetid as budget_id,
SUM(shipmentcost) as shipmentcost SUM(shipmentcost) as shipmentcost
FROM aqinvoices FROM aqinvoices
GROUP BY shipmentcost_budgetid GROUP BY shipmentcost_budgetid
|, 'budget_id'); |, 'budget_id');
my $hr_budget_spent_adjustment = $dbh->selectall_hashref(q| my $hr_budget_spent_adjustment = $dbh->selectall_hashref(q|
SELECT budget_id, SELECT budget_id,
SUM(adjustment) as adjustments SUM(adjustment) as adjustments
FROM aqinvoice_adjustments FROM aqinvoice_adjustments
JOIN aqinvoices USING (invoiceid) JOIN aqinvoices USING (invoiceid)
WHERE closedate IS NOT NULL WHERE closedate IS NOT NULL
GROUP BY budget_id GROUP BY budget_id
|, 'budget_id'); |, 'budget_id');
my $hr_budget_ordered_adjustment = $dbh->selectall_hashref(q| my $hr_budget_ordered_adjustment = $dbh->selectall_hashref(q|
SELECT budget_id, SELECT budget_id,
SUM(adjustment) as adjustments SUM(adjustment) as adjustments
FROM aqinvoice_adjustments FROM aqinvoice_adjustments
JOIN aqinvoices USING (invoiceid) JOIN aqinvoices USING (invoiceid)
WHERE closedate IS NULL AND encumber_open = 1 WHERE closedate IS NULL AND encumber_open = 1
GROUP BY budget_id GROUP BY budget_id
|, 'budget_id'); |, 'budget_id');
foreach my $budget (@sort) { foreach my $budget (@sort) {
if ( not defined $budget->{budget_parent_id} ) { if ( not defined $budget->{budget_parent_id} ) {
_recursiveAdd( $budget, undef, $hr_budget_spent, $hr_budget_spent_shipment, $hr_budget_ordered, $hr_budget_spent_adjustment, $hr_budget_ordered_adjustment ); _recursiveAdd( $budget, undef, $hr_budget_spent, $hr_budget_spent_shipment, $hr_budget_ordered, $hr_budget_spent_adjustment, $hr_budget_ordered_adjustment );
}
} }
} }
return \@sort; return \@sort;

View file

@ -177,7 +177,7 @@ foreach my $period (@$periods) {
$template->{'VARS'}->{'budget_period_description'} = $period->{'budget_period_description'}; $template->{'VARS'}->{'budget_period_description'} = $period->{'budget_period_description'};
} }
next if $period->{'budget_period_locked'} || !$period->{'budget_period_description'}; next if $period->{'budget_period_locked'} || !$period->{'budget_period_description'};
my $budget_hierarchy = GetBudgetHierarchy( $period->{'budget_period_id'} ); my $budget_hierarchy = GetBudgetHierarchy( $period->{'budget_period_id'}, undef, undef, 1 );
my @funds; my @funds;
foreach my $r ( @{$budget_hierarchy} ) { foreach my $r ( @{$budget_hierarchy} ) {
next unless ( CanUserUseBudget( $patron, $r, $userflags ) ); next unless ( CanUserUseBudget( $patron, $r, $userflags ) );