From 228e59a97a1d5ba23fec809c8db27be9e8694ddb Mon Sep 17 00:00:00 2001
From: Nick Clemens <nick@bywatersolutions.com>
Date: Wed, 12 Oct 2022 14:55:55 +0000
Subject: [PATCH] Bug 31459: (follow-up) Preserve budget period display

This patch adds a level to the budget_loops and displays the budgets
as optgroups for the funds

Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>

https://bugs.koha-community.org/show_bug.cgi?id=31559
---
 acqui/orderreceive.pl                         | 29 +++++-----
 .../prog/en/modules/acqui/orderreceive.tt     | 54 +++++++++++--------
 2 files changed, 48 insertions(+), 35 deletions(-)

diff --git a/acqui/orderreceive.pl b/acqui/orderreceive.pl
index 43b9c109f7..17c7280ea3 100755
--- a/acqui/orderreceive.pl
+++ b/acqui/orderreceive.pl
@@ -170,21 +170,26 @@ if ( $suggestion ) {
 }
 
 my $patron = Koha::Patrons->find( $loggedinuser )->unblessed;
-my $budget_loop = [];
+my %budget_loops;
 my $budgets = GetBudgetHierarchy( undef, undef, undef, 1 );
-foreach my $r (@{$budgets}) {
-    next unless (CanUserUseBudget($patron, $r, $userflags));
-    push @{$budget_loop}, {
-        b_id  => $r->{budget_id},
-        b_txt => $r->{budget_name},
-        b_sort1_authcat => $r->{'sort1_authcat'},
-        b_sort2_authcat => $r->{'sort2_authcat'},
-        b_active => $r->{budget_period_active},
-        b_sel => ( $r->{budget_id} == $order->budget_id ) ? 1 : 0,
-        b_level => $r->{budget_level},
+foreach my $budget (@{$budgets}) {
+    next unless (CanUserUseBudget($patron, $budget, $userflags));
+    unless ( defined $budget_loops{$budget->{budget_period_id}} ){
+        $budget_loops{$budget->{budget_period_id}}->{description} = $budget->{budget_period_description};
+        $budget_loops{$budget->{budget_period_id}}->{active} = $budget->{budget_period_active};
+        $budget_loops{$budget->{budget_period_id}}->{funds} = [];
+    }
+    push @{$budget_loops{$budget->{budget_period_id}}->{funds}}, {
+        b_id  => $budget->{budget_id},
+        b_txt => $budget->{budget_name},
+        b_sort1_authcat => $budget->{'sort1_authcat'},
+        b_sort2_authcat => $budget->{'sort2_authcat'},
+        b_active => $budget->{budget_period_active},
+        b_sel => ( $budget->{budget_id} == $order->budget_id ) ? 1 : 0,
+        b_level => $budget->{budget_level},
     };
 }
-$template->{'VARS'}->{'budget_loop'} = $budget_loop;
+$template->{'VARS'}->{'budget_loops'} = \%budget_loops;
 
 my $op = $input->param('op');
 if ($op and $op eq 'edit'){
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt
index 5626ecbb9d..b2085200dc 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt
@@ -291,33 +291,41 @@
             <label class="required" for="bookfund">Fund: </label>
             [% active_count = 0 %]
             [% IF !ordernumber %]
-                [% FOREACH budget_loo IN budget_loop %]
-                    [% active_count= active_count + budget_loo.b_active %]
+                [% FOREACH budget_period IN budget_loops.keys %]
+                    [% FOREACH fund IN budget_loops.$budget_period.funds %]
+                        [% active_count= active_count + fund.b_active %]
+                    [% END %]
                 [% END %]
             [% END %]
             <select class="select2" id="bookfund" name="bookfund">
-            [% FOREACH budget_loo IN budget_loop %]
-               [% level_indent_cnt = 0 %]
-                [% level_indent = "" %]
-                [% WHILE level_indent_cnt < budget_loo.b_level %]
-                    [% level_indent = level_indent _ " -- " %]
-                    [% level_indent_cnt = level_indent_cnt +1 %]
+            [% FOREACH budget_period_id IN budget_loops.keys %]
+                [% SET budget_period = budget_loops.$budget_period_id %]
+                [% IF budget_period.active %]
+                    <optgroup label="[% budget_period.description %]">
+                [% ELSE %]
+                    <optgroup class="inactive_budget" label="[% budget_period.description %] (Inactive)">
                 [% END %]
+                [% FOREACH budget_loo IN budget_period.funds %]
+                   [% level_indent_cnt = 0 %]
+                    [% level_indent = "" %]
+                    [% WHILE level_indent_cnt < budget_loo.b_level %]
+                        [% level_indent = level_indent _ " -- " %]
+                        [% level_indent_cnt = level_indent_cnt +1 %]
+                    [% END %]
 
-                [% IF ( budget_loo.b_sel ) %]
-                    [% active_count = 0 #select no other fund %]
-                    <option value="[% budget_loo.b_id | html %]" selected="selected" data-sort1-authcat="[% budget_loo.b_sort1_authcat | html %]" data-sort2-authcat="[% budget_loo.b_sort2_authcat | html %]"
-                    >
-                [% ELSIF active_count==1 && budget_loo.b_active %]
-                    <option value="[% budget_loo.b_id | html %]" selected="selected" data-sort1-authcat="[% budget_loo.b_sort1_authcat | html %]" data-sort2-authcat="[% budget_loo.b_sort2_authcat | html %]"
-                    >
-                [% ELSE %]
-                    [% bdgclass=budget_loo.b_active? "": "b_inactive" | html %]
-                    <option value="[% budget_loo.b_id | html %]" class="[% bdgclass | html %]" data-sort1-authcat="[% budget_loo.b_sort1_authcat | html %]" data-sort2-authcat="[% budget_loo.b_sort2_authcat | html %]"
-                    >
+                    [% IF ( budget_loo.b_sel ) %]
+                        [% active_count = 0 #select no other fund %]
+                        <option value="[% budget_loo.b_id | html %]" selected="selected" data-sort1-authcat="[% budget_loo.b_sort1_authcat | html %]" data-sort2-authcat="[% budget_loo.b_sort2_authcat | html %]">
+                    [% ELSIF active_count==1 && budget_loo.b_active %]
+                        <option value="[% budget_loo.b_id | html %]" selected="selected" data-sort1-authcat="[% budget_loo.b_sort1_authcat | html %]" data-sort2-authcat="[% budget_loo.b_sort2_authcat | html %]">
+                    [% ELSE %]
+                        [% bdgclass=budget_loo.b_active? "": "inactive_budget" | html %]
+                        <option value="[% budget_loo.b_id | html %]" class="[% bdgclass | html %]" data-sort1-authcat="[% budget_loo.b_sort1_authcat | html %]" data-sort2-authcat="[% budget_loo.b_sort2_authcat | html %]">
+                    [% END %]
+                        [% level_indent | html %][% budget_loo.b_txt | html %][% IF !budget_loo.b_active %] (inactive)[% END %]
+                    </option>
                 [% END %]
-                    [% level_indent | html %][% budget_loo.b_txt | html %][% IF !budget_loo.b_active %] (inactive)[% END %]
-                </option>
+                </optgroup>
             [% END %]
             </select>
             <span class="required">Required</span>
@@ -555,14 +563,14 @@
 
             //keep a copy of all budgets before removing the inactives
             disabledBudgetsCopy = $('#bookfund').html();
-            $('#bookfund .b_inactive').remove();
+            $('#bookfund .inactive_budget').remove();
 
             $('#showallbudgets').click(function() {
                 if ($(this).is(":checked")) {
                     $('#bookfund').html(disabledBudgetsCopy); //Puts back all the funds
                 }
                 else {
-                    $('#bookfund .b_inactive').remove();
+                    $('#bookfund .inactive_budget').remove();
                 }
             });
 
-- 
2.30.2