From f2495cf91812b9ab008440b1ca681065f8db584e Mon Sep 17 00:00:00 2001
From: Jonathan Druart <jonathan.druart@biblibre.com>
Date: Mon, 2 Jun 2014 10:14:52 +0200
Subject: [PATCH 2/7] Bug 12164: On cloning budget period, mark original
 budget as inactive

This patch adds a checkbox "mark original budget as inactive" (budget
period).
If it is checked, the original budget will be marked as inactive.

Signed-off-by: Paola Rossi <paola.rossi@cineca.it>
---
 C4/Budgets.pm                                      |   22 ++++++++++--
 admin/aqbudgetperiods.pl                           |    2 ++
 .../prog/en/modules/admin/aqbudgetperiods.tt       |    5 +++
 t/db_dependent/Budgets.t                           |   35 ++++++++++++++++++--
 4 files changed, 60 insertions(+), 4 deletions(-)

diff --git a/C4/Budgets.pm b/C4/Budgets.pm
index df9bda6..05dd12d 100644
--- a/C4/Budgets.pm
+++ b/C4/Budgets.pm
@@ -994,10 +994,13 @@ sub ConvertCurrency {
   my $new_budget_period_id = CloneBudgetPeriod({
     budget_period_id => $budget_period_id,
     budget_period_startdate => $budget_period_startdate;
-    $budget_period_enddate   => $budget_period_enddate;
+    budget_period_enddate   => $budget_period_enddate;
+    mark_original_budget_as_inactive => 1
   });
 
 Clone a budget period with all budgets.
+If the mark_origin_budget_as_inactive is set (0 by default),
+the original budget will be marked as inactive.
 
 =cut
 
@@ -1006,6 +1009,8 @@ sub CloneBudgetPeriod {
     my $budget_period_id        = $params->{budget_period_id};
     my $budget_period_startdate = $params->{budget_period_startdate};
     my $budget_period_enddate   = $params->{budget_period_enddate};
+    my $mark_original_budget_as_inactive =
+      $params->{mark_original_budget_as_inactive} || 0;
 
     my $budget_period = GetBudgetPeriod($budget_period_id);
 
@@ -1017,8 +1022,21 @@ sub CloneBudgetPeriod {
 
     my $budgets = GetBudgetHierarchy($budget_period_id);
     CloneBudgetHierarchy(
-        { budgets => $budgets, new_budget_period_id => $new_budget_period_id }
+        {
+            budgets              => $budgets,
+            new_budget_period_id => $new_budget_period_id
+        }
     );
+
+    if ($mark_original_budget_as_inactive) {
+        ModBudgetPeriod(
+            {
+                budget_period_id     => $budget_period_id,
+                budget_period_active => 0,
+            }
+        );
+    }
+
     return $new_budget_period_id;
 }
 
diff --git a/admin/aqbudgetperiods.pl b/admin/aqbudgetperiods.pl
index a59e311..a62deb2 100755
--- a/admin/aqbudgetperiods.pl
+++ b/admin/aqbudgetperiods.pl
@@ -185,12 +185,14 @@ elsif ( $op eq 'duplicate_budget' ){
 
     my $budget_period_startdate = $input->param('budget_period_startdate');
     my $budget_period_enddate   = $input->param('budget_period_enddate');
+    my $mark_original_budget_as_inactive = $input->param('mark_original_budget_as_inactive');
 
     my $new_budget_period_id = C4::Budgets::CloneBudgetPeriod(
         {
             budget_period_id        => $budget_period_id,
             budget_period_startdate => $budget_period_startdate,
             budget_period_enddate   => $budget_period_enddate,
+            mark_original_budget_as_inactive => $mark_original_budget_as_inactive,
         }
     );
 
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudgetperiods.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudgetperiods.tt
index 9bcf311..0f4bca6 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudgetperiods.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudgetperiods.tt
@@ -185,6 +185,11 @@
 				<div class="hint">[% INCLUDE 'date-format.inc' %]</div>
     </li>
 
+    <li>
+      <label for="mark_as_inactive">Mark the original budget as inactive</label>
+      <input type="checkbox" id="mark_as_inactive" name="mark_original_budget_as_inactive" />
+    </li>
+
     </ol>
     </fieldset>
 
diff --git a/t/db_dependent/Budgets.t b/t/db_dependent/Budgets.t
index 3b97dbd..4aac786 100755
--- a/t/db_dependent/Budgets.t
+++ b/t/db_dependent/Budgets.t
@@ -1,5 +1,5 @@
 use Modern::Perl;
-use Test::More tests => 27;
+use Test::More tests => 31;
 
 BEGIN {use_ok('C4::Budgets') }
 use C4::Context;
@@ -341,7 +341,38 @@ is(
 is_deeply(
     _get_dependencies($budget_hierarchy),
     _get_dependencies($budget_hierarchy_cloned),
-    'CloneBudgetPeriod keep the same dependencies order'
+    'CloneBudgetPeriod keeps the same dependencies order'
+);
+
+# CloneBudgetPeriod with param mark_original_budget_as_inactive
+my $budget_period = C4::Budgets::GetBudgetPeriod($budget_period_id);
+is( $budget_period->{budget_period_active}, 1,
+    'CloneBudgetPeriod does not mark as inactive the budgetperiod if not needed'
+);
+
+$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',
+        mark_original_budget_as_inactive => 1,
+    }
+);
+
+$budget_hierarchy        = GetBudgetHierarchy($budget_period_id);
+$budget_hierarchy_cloned = GetBudgetHierarchy($budget_period_id_cloned);
+
+is( scalar(@$budget_hierarchy_cloned), scalar(@$budget_hierarchy),
+'CloneBudgetPeriod (with inactive param) clones the same number of budgets (funds)'
+);
+is_deeply(
+    _get_dependencies($budget_hierarchy),
+    _get_dependencies($budget_hierarchy_cloned),
+    'CloneBudgetPeriod (with inactive param) keeps the same dependencies order'
+);
+$budget_period = C4::Budgets::GetBudgetPeriod($budget_period_id);
+is( $budget_period->{budget_period_active}, 0,
+    'CloneBudgetPeriod (with inactive param) marks as inactive the budgetperiod'
 );
 
 sub _get_dependencies {
-- 
1.7.10.4