Bug 30359: GetBudgetHierarchy is slow on order receive page
authorJohanna Raisa <johanna.raisa@gmail.com>
Fri, 25 Mar 2022 10:25:56 +0000 (12:25 +0200)
committerLucas Gass <lucas@bywatersolutions.com>
Mon, 31 Oct 2022 22:26:01 +0000 (22:26 +0000)
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>
(cherry picked from commit 35724169c11352d4cc1e22fcd50e91d39b7d8c44)

Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
C4/Budgets.pm
acqui/orderreceive.pl

index 9624650..0837edf 100644 (file)
@@ -485,7 +485,7 @@ sub ModBudgetPeriod {
 
 # -------------------------------------------------------------------
 sub GetBudgetHierarchy {
-    my ( $budget_period_id, $branchcode, $owner ) = @_;
+    my ( $budget_period_id, $branchcode, $owner, $skiptotals ) = @_;
     my @bind_params;
     my $dbh   = C4::Context->dbh;
     my $query = qq|
@@ -550,49 +550,50 @@ sub GetBudgetHierarchy {
     foreach my $first_parent (@first_parents) {
         _add_budget_children(\@sort, $first_parent, 0);
     }
-
-    # Get all the budgets totals in as few queries as possible
-    my $hr_budget_spent = $dbh->selectall_hashref(q|
-        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
-        FROM aqorders JOIN aqbudgets USING (budget_id)
-        WHERE quantityreceived > 0 AND datecancellationprinted IS NULL
-        GROUP BY budget_id, budget_parent_id
-        |, 'budget_id');
-    my $hr_budget_ordered = $dbh->selectall_hashref(q|
-        SELECT aqorders.budget_id, aqbudgets.budget_parent_id,
-               SUM( | . C4::Acquisition::get_rounding_sql(qq|ecost_tax_included|) . q| *  quantity) AS budget_ordered
-        FROM aqorders JOIN aqbudgets USING (budget_id)
-        WHERE quantityreceived = 0 AND datecancellationprinted IS NULL
-        GROUP BY budget_id, budget_parent_id
-        |, 'budget_id');
-    my $hr_budget_spent_shipment = $dbh->selectall_hashref(q|
-        SELECT shipmentcost_budgetid as budget_id,
-               SUM(shipmentcost) as shipmentcost
-        FROM aqinvoices
-        GROUP BY shipmentcost_budgetid
-        |, 'budget_id');
-    my $hr_budget_spent_adjustment = $dbh->selectall_hashref(q|
-        SELECT budget_id,
-               SUM(adjustment) as adjustments
-        FROM aqinvoice_adjustments
-        JOIN aqinvoices USING (invoiceid)
-        WHERE closedate IS NOT NULL
-        GROUP BY budget_id
-        |, 'budget_id');
-    my $hr_budget_ordered_adjustment = $dbh->selectall_hashref(q|
-        SELECT budget_id,
-               SUM(adjustment) as adjustments
-        FROM aqinvoice_adjustments
-        JOIN aqinvoices USING (invoiceid)
-        WHERE closedate IS NULL AND encumber_open = 1
-        GROUP BY budget_id
-        |, 'budget_id');
-
-
-    foreach my $budget (@sort) {
-        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 );
+    if (!$skiptotals) {
+        # Get all the budgets totals in as few queries as possible
+        my $hr_budget_spent = $dbh->selectall_hashref(q|
+            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
+            FROM aqorders JOIN aqbudgets USING (budget_id)
+            WHERE quantityreceived > 0 AND datecancellationprinted IS NULL
+            GROUP BY budget_id, budget_parent_id
+            |, 'budget_id');
+        my $hr_budget_ordered = $dbh->selectall_hashref(q|
+            SELECT aqorders.budget_id, aqbudgets.budget_parent_id,
+                SUM( | . C4::Acquisition::get_rounding_sql(qq|ecost_tax_included|) . q| *  quantity) AS budget_ordered
+            FROM aqorders JOIN aqbudgets USING (budget_id)
+            WHERE quantityreceived = 0 AND datecancellationprinted IS NULL
+            GROUP BY budget_id, budget_parent_id
+            |, 'budget_id');
+        my $hr_budget_spent_shipment = $dbh->selectall_hashref(q|
+            SELECT shipmentcost_budgetid as budget_id,
+                SUM(shipmentcost) as shipmentcost
+            FROM aqinvoices
+            GROUP BY shipmentcost_budgetid
+            |, 'budget_id');
+        my $hr_budget_spent_adjustment = $dbh->selectall_hashref(q|
+            SELECT budget_id,
+                SUM(adjustment) as adjustments
+            FROM aqinvoice_adjustments
+            JOIN aqinvoices USING (invoiceid)
+            WHERE closedate IS NOT NULL
+            GROUP BY budget_id
+            |, 'budget_id');
+        my $hr_budget_ordered_adjustment = $dbh->selectall_hashref(q|
+            SELECT budget_id,
+                SUM(adjustment) as adjustments
+            FROM aqinvoice_adjustments
+            JOIN aqinvoices USING (invoiceid)
+            WHERE closedate IS NULL AND encumber_open = 1
+            GROUP BY budget_id
+            |, 'budget_id');
+
+
+        foreach my $budget (@sort) {
+            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 );
+            }
         }
     }
     return \@sort;
index e1b76d3..6572c69 100755 (executable)
@@ -177,7 +177,7 @@ foreach my $period (@$periods) {
         $template->{'VARS'}->{'budget_period_description'} = $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;
     foreach my $r ( @{$budget_hierarchy} ) {
         next unless ( CanUserUseBudget( $patron, $r, $userflags ) );