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:
parent
63f88a5742
commit
35724169c1
2 changed files with 44 additions and 43 deletions
|
@ -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;
|
||||||
|
|
|
@ -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 ) );
|
||||||
|
|
Loading…
Reference in a new issue