Bug 12164: On closing budget period, move unspent amount
authorJonathan Druart <jonathan.druart@biblibre.com>
Mon, 2 Jun 2014 08:19:58 +0000 (10:19 +0200)
committerTomas Cohen Arazi <tomascohen@gmail.com>
Thu, 24 Jul 2014 17:17:24 +0000 (14:17 -0300)
On closing a budget (budget period), the user will be presented with an
option to move remaining unspent funds from the previous budget to the
newly created one - adding to the amounts already entered in those
funds.

Signed-off-by: Paola Rossi <paola.rossi@cineca.it>
Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de>
Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>
C4/Budgets.pm
admin/aqbudgetperiods.pl
koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudgetperiods.tt
t/db_dependent/Budgets.t

index 075cef7..3ac8ba9 100644 (file)
@@ -1144,6 +1144,7 @@ sub MoveOrders {
     my ($params)              = @_;
     my $from_budget_period_id = $params->{from_budget_period_id};
     my $to_budget_period_id   = $params->{to_budget_period_id};
+    my $move_remaining_unspent = $params->{move_remaining_unspent};
     return
       if not $from_budget_period_id
           or not $to_budget_period_id
@@ -1162,6 +1163,13 @@ sub MoveOrders {
             WHERE ordernumber = ?
         |
     );
+    my $sth_update_budget_amount = $dbh->prepare(
+        q|
+            UPDATE aqbudgets
+            SET budget_amount = ?
+            WHERE budget_id = ?
+        |
+    );
     my $from_budgets = GetBudgetHierarchy($from_budget_period_id);
     for my $from_budget (@$from_budgets) {
         my $new_budget_id = $dbh->selectcol_arrayref(
@@ -1178,7 +1186,7 @@ sub MoveOrders {
             push @report,
               {
                 moved       => 0,
-                budget_code => $from_budget->{budget_code},
+                budget      => $from_budget,
                 error       => 'budget_code_not_exists',
               };
             next;
@@ -1193,14 +1201,29 @@ sub MoveOrders {
         my @orders_moved;
         for my $order (@$orders_to_move) {
             $sth_update_aqorders->execute( $new_budget->{budget_id}, $order->{ordernumber} );
-            push @orders_moved, $order->{ordernumber};
+            push @orders_moved, $order;
+        }
+
+        my $unspent_moved = 0;
+        if ($move_remaining_unspent) {
+            my $spent   = GetBudgetHierarchySpent( $from_budget->{budget_id} );
+            my $unspent = $from_budget->{budget_amount} - $spent;
+            my $new_budget_amount = $new_budget->{budget_amount};
+            if ( $unspent > 0 ) {
+                $new_budget_amount += $unspent;
+                $unspent_moved = $unspent;
+            }
+            $new_budget->{budget_amount} = $new_budget_amount;
+            $sth_update_budget_amount->execute( $new_budget_amount,
+                $new_budget->{budget_id} );
         }
 
         push @report,
           {
-            budget => $new_budget,
+            budget        => $new_budget,
             orders_moved  => \@orders_moved,
             moved         => 1,
+            unspent_moved => $unspent_moved,
           };
     }
     return \@report;
index 8ab29ec..5034a58 100755 (executable)
@@ -227,7 +227,10 @@ elsif ( $op eq 'close_form' ) {
 
         # We want to move funds from this budget
         my $unreceived_orders = C4::Acquisition::SearchOrders(
-            { budget_id => $budget->{budget_id}, } );
+            {
+                budget_id => $budget->{budget_id},
+            }
+        );
         $budget->{unreceived_orders} = $unreceived_orders;
         $number_of_unreceived_orders += scalar(@$unreceived_orders);
     }
@@ -244,11 +247,13 @@ elsif ( $op eq 'close_form' ) {
 }
 
 elsif ( $op eq 'close_confirmed' ) {
-    my $to_budget_period_id = $input->param('to_budget_period_id');
-    my $report              = C4::Budgets::MoveOrders(
+    my $to_budget_period_id    = $input->param('to_budget_period_id');
+    my $move_remaining_unspent = $input->param('move_remaining_unspent');
+    my $report                 = C4::Budgets::MoveOrders(
         {
-            from_budget_period_id => $budget_period_id,
-            to_budget_period_id   => $to_budget_period_id,
+            from_budget_period_id  => $budget_period_id,
+            to_budget_period_id    => $to_budget_period_id,
+            move_remaining_unspent => $move_remaining_unspent,
         }
     );
 }
index 8904659..5161152 100644 (file)
               [% END %]
             </select>
           </li>
+          <li>
+          <label for="move_remaining_unspent">Move remaining unspent funds</label>
+            <input type="checkbox" name="move_remaining_unspent" id="move_remaining_unspent" />
+          </li>
         </ol>
       </fieldset>
       <fieldset class="action">
index 5a22315..a565c8d 100755 (executable)
@@ -1,5 +1,5 @@
 use Modern::Perl;
-use Test::More tests => 77;
+use Test::More tests => 107;
 
 BEGIN {
     use_ok('C4::Budgets')
@@ -467,14 +467,14 @@ $budget_period_id_cloned = C4::Budgets::CloneBudgetPeriod(
         budget_period_id        => $budget_period_id,
         budget_period_startdate => '2014-01-01',
         budget_period_enddate   => '2014-12-31',
-        reset_all_funds         => 1,
     }
 );
 
 my $report = C4::Budgets::MoveOrders(
     {
-        from_budget_period_id => $budget_period_id,
-        to_budget_period_id   => $budget_period_id_cloned,
+        from_budget_period_id  => $budget_period_id,
+        to_budget_period_id    => $budget_period_id_cloned,
+        move_remaining_unspent => 1,
     }
 );
 is( scalar( @$report ), 6 , "MoveOrders has processed 6 funds" );
@@ -483,6 +483,31 @@ my $number_of_orders_moved = 0;
 $number_of_orders_moved += scalar( @{ $_->{orders_moved} } ) for @$report;
 is( $number_of_orders_moved, $number_of_orders_to_move, "MoveOrders has moved $number_of_orders_to_move orders" );
 
+my @new_budget_ids = map { $_->{budget_id} }
+  @{ C4::Budgets::GetBudgetHierarchy($budget_period_id_cloned) };
+my @old_budget_ids = map { $_->{budget_id} }
+  @{ C4::Budgets::GetBudgetHierarchy($budget_period_id) };
+for my $budget_id ( keys %budgets ) {
+    for my $ordernumber ( @{ $budgets{$budget_id} } ) {
+        my $budget            = GetBudgetByOrderNumber($ordernumber);
+        my $is_in_new_budgets = grep /^$budget->{budget_id}$/, @new_budget_ids;
+        my $is_in_old_budgets = grep /^$budget->{budget_id}$/, @old_budget_ids;
+        is( $is_in_new_budgets, 1, "MoveOrders changed the budget_id for order $ordernumber" );
+        is( $is_in_old_budgets, 0, "MoveOrders changed the budget_id for order $ordernumber" );
+    }
+}
+
+
+# MoveOrders with param move_remaining_unspent
+my @new_budgets = @{ C4::Budgets::GetBudgetHierarchy($budget_period_id_cloned) };
+my @old_budgets = @{ C4::Budgets::GetBudgetHierarchy($budget_period_id) };
+
+for my $new_budget ( @new_budgets ) {
+    my ( $old_budget ) = map { $_->{budget_code} eq $new_budget->{budget_code} ? $_ : () } @old_budgets;
+    my $new_budget_amount_should_be = $old_budget->{budget_amount} * 2 - $old_budget->{total_spent};
+    is( $new_budget->{budget_amount} + 0, $new_budget_amount_should_be, "MoveOrders updated the budget amount with the previous unspent budget (for budget $new_budget->{budget_code})" );
+}
+
 sub _get_dependencies {
     my ($budget_hierarchy) = @_;
     my $graph;