Bug 10403: add ability to change fund on receipt
authorJared Camins-Esakov <jcamins@cpbibliography.com>
Sat, 8 Jun 2013 17:27:36 +0000 (13:27 -0400)
committerGalen Charlton <gmc@esilibrary.com>
Tue, 22 Oct 2013 12:57:25 +0000 (12:57 +0000)
Right now there is no way to change the budget or fund when receiving an
item, which is annoying, particularly at the end of the fiscal year when
every item not already received has to be switched to the following
year's budget. This patch adds the ability to change the budget and fund
when receiving.

To test:
1) Apply patch.
2) Create an order for a vendor, choosing a fund to use for that order.
3) Receive the order, leaving the fund unchanged. Make sure the fund
   did not change.
4) Create another order for a vendor, choosing a fund to use for that
   order.
5) Receive the order, this time changing the fund. Make sure the fund
   is changed.
6) Run the unit test:
    > prove t/db_dependent/Acquisition.t
7) Sign off.

(Notes: this patch depends on the Acquisitions.t unit test improvements
in bug 10274; the seemingly-unrelated change in SQLHelper quiets an
irritating warning caused by the NewOrder call in ModReceiveOrder)

Signed-off-by: Mathieu Saby <mathieu.saby@univ-rennes2.fr>

Signed-off-by: Jonathan Druart <jonathan.druart@biblibre.com>
Signed-off-by: Galen Charlton <gmc@esilibrary.com>

C4/Acquisition.pm
C4/SQLHelper.pm
acqui/finishreceive.pl
acqui/orderreceive.pl
koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt
t/db_dependent/Acquisition.t

index e470b24..c93b0a7 100644 (file)
@@ -1268,6 +1268,7 @@ sub ModReceiveOrder {
         $sth->finish;
 
         delete $order->{'ordernumber'};
+        $order->{'budget_id'} = ( $budget_id || $order->{'budget_id'} );
         $order->{'quantity'} = $quantrec;
         $order->{'quantityreceived'} = $quantrec;
         $order->{'datereceived'} = $datereceived;
@@ -1287,9 +1288,9 @@ sub ModReceiveOrder {
     } else {
         $sth=$dbh->prepare("update aqorders
                             set quantityreceived=?,datereceived=?,invoiceid=?,
-                                unitprice=?,rrp=?,ecost=?
+                                unitprice=?,rrp=?,ecost=?,budget_id=?
                             where biblionumber=? and ordernumber=?");
-        $sth->execute($quantrec,$datereceived,$invoiceid,$cost,$rrp,$ecost,$biblionumber,$ordernumber);
+        $sth->execute($quantrec,$datereceived,$invoiceid,$cost,$rrp,$ecost,$budget_id,$biblionumber,$ordernumber);
         $sth->finish;
     }
     return ($datereceived, $new_ordernumber);
index 21f5fa1..f1fa7b5 100644 (file)
@@ -406,7 +406,7 @@ sub _filter_hash{
                ## supposed to be a hash of simple values, hashes of arrays could be implemented
                $filter_input->{$field}=format_date_in_iso($filter_input->{$field})
           if $columns->{$field}{Type}=~/date/ &&
-             $filter_input->{$field} !~C4::Dates->regexp("iso");
+             ($filter_input->{$field} && $filter_input->{$field} !~C4::Dates->regexp("iso"));
                my ($tmpkeys, $localvalues)=_Process_Operands($filter_input->{$field},"$tablename.$field",$searchtype,$columns);
                if (@$tmpkeys){
                        push @values, @$localvalues;
index f9c8532..4196b52 100755 (executable)
@@ -54,6 +54,7 @@ my $cnt              = 0;
 my $ecost            = $input->param('ecost');
 my $rrp              = $input->param('rrp');
 my $note             = $input->param("note");
+my $bookfund         = $input->param("bookfund");
 my $order            = GetOrder($ordernumber);
 
 #need old recievedate if we update the order, parcel.pl only shows the right parcel this way FIXME
@@ -93,7 +94,7 @@ if ($quantityrec > $origquantityrec ) {
             $order->{ecost},
             $invoiceid,
             $order->{rrp},
-            undef,
+            $bookfund,
             $datereceived,
             \@received_items,
         );
index ab7b341..fa400a1 100755 (executable)
@@ -69,7 +69,7 @@ use C4::Auth;
 use C4::Output;
 use C4::Dates qw/format_date/;
 use C4::Bookseller qw/ GetBookSellerFromId /;
-use C4::Budgets qw/ GetBudget /;
+use C4::Budgets qw/ GetBudget GetBudgetHierarchy CanUserUseBudget GetBudgetPeriods /;
 use C4::Members;
 use C4::Branch;    # GetBranches
 use C4::Items;
@@ -95,7 +95,7 @@ $results = SearchOrders({
     ordernumber => $ordernumber
 }) if $ordernumber;
 
-my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
+my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user(
     {
         template_name   => "acqui/orderreceive.tmpl",
         query           => $input,
@@ -228,6 +228,37 @@ $template->param(
     firstnamesuggestedby  => $suggestion->{firstnamesuggestedby},
 );
 
+my $borrower = GetMember( 'borrowernumber' => $loggedinuser );
+my @budget_loop;
+my $periods = GetBudgetPeriods( { 'budget_period_active' => 1 } );
+foreach my $period (@$periods) {
+    my $budget_hierarchy = GetBudgetHierarchy( $period->{'budget_period_id'} );
+    my @funds;
+    foreach my $r ( @{$budget_hierarchy} ) {
+        next unless ( CanUserUseBudget( $borrower, $r, $userflags ) );
+        if ( !defined $r->{budget_amount} || $r->{budget_amount} == 0 ) {
+            next;
+        }
+        push @funds,
+          {
+            b_id  => $r->{budget_id},
+            b_txt => $r->{budget_name},
+            b_sel => ( $r->{budget_id} == $order->{budget_id} ) ? 1 : 0,
+          };
+    }
+
+    @funds = sort { uc( $a->{b_txt} ) cmp uc( $b->{b_txt} ) } @funds;
+
+    push @budget_loop,
+      {
+        'id'          => $period->{'budget_period_id'},
+        'description' => $period->{'budget_period_description'},
+        'funds'       => \@funds
+      };
+}
+
+$template->{'VARS'}->{'budget_loop'} = \@budget_loop;
+
 # regardless of the content of $unitprice e.g 0 or '' or any string will return in these cases 0.00
 # and the 'IF' in the .tt will show 0.00 and not 'ecost' (see BZ 7129)
 # So if $unitprice == 0 we don't create unitprice
index 67999e4..0ffce99 100644 (file)
     <legend>Accounting details</legend>
        <ol>
        <li><label for="datereceived">Date received: </label><span> [% datereceived %] </span></li>
-       <li><label for="bookfund">Budget: </label><span> [% bookfund %] </span></li>
+       <li><label for="bookfund">Fund: </label><select id="bookfund" name="bookfund">
+            <option value="">Keep current ([% bookfund %])</option>
+            [% FOREACH period IN budget_loop %]
+                <optgroup label="[% period.description %]">
+                [% FOREACH fund IN period.funds %]
+                    [% IF ( fund.b_sel ) %]
+                        <option value="[% fund.b_id %]" selected="selected">[% fund.b_txt %]</option>
+                    [% ELSE %]
+                        <option value="[% fund.b_id %]">[% fund.b_txt %]</option>
+                    [% END %]
+                [% END %]
+            [% END %]
+       </select> (Current: [% bookfund %])</li>
        <li><label for="creator">Created by: </label><span> [% IF ( memberfirstname and membersurname ) %][% IF ( memberfirstname ) %][% memberfirstname %][% END %] [% membersurname %][% ELSE %]No name[% END %]</span></li>
        <li><label for="quantity_to_receive">Quantity to receive: </label><span class="label">
            [% IF ( edit and not subscriptionid) %]
index 202641f..2b36068 100755 (executable)
@@ -8,7 +8,7 @@ use POSIX qw(strftime);
 
 use C4::Bookseller qw( GetBookSellerFromId );
 
-use Test::More tests => 44;
+use Test::More tests => 59;
 
 BEGIN {
     use_ok('C4::Acquisition');
@@ -146,4 +146,72 @@ my $allorders = SearchOrders({
 });
 is(scalar(@$allorders), 3, 'retrieved all 3 orders even after after receiving on one (bug 10723)');
 
+my $invoiceid = AddInvoice(invoicenumber => 'invoice', booksellerid => 1, unknown => "unknown");
+
+my ($datereceived, $new_ordernumber) = ModReceiveOrder(
+    $biblionumber2,
+    $ordernumber2,
+    2,
+    undef,
+    12,
+    12,
+    $invoiceid,
+    42,
+    );
+my $order2 = GetOrder( $ordernumber2 );
+is($order2->{'quantityreceived'}, 0, 'Splitting up order did not receive any on original order');
+is($order2->{'quantity'}, 40, '40 items on original order');
+is($order2->{'budget_id'}, $budgetid, 'Budget on original order is unchanged');
+
+$neworder = GetOrder( $new_ordernumber );
+is($neworder->{'quantity'}, 2, '2 items on new order');
+is($neworder->{'quantityreceived'}, 2, 'Splitting up order received items on new order');
+is($neworder->{'budget_id'}, $budgetid, 'Budget on new order is unchanged');
+
+my $budgetid2 = C4::Budgets::AddBudget(
+    {
+        budget_code => "budget_code_test_modrecv",
+        budget_name => "budget_name_test_modrecv",
+    }
+);
+
+($datereceived, $new_ordernumber) = ModReceiveOrder(
+    $biblionumber2,
+    $ordernumber3,
+    2,
+    undef,
+    12,
+    12,
+    $invoiceid,
+    42,
+    $budgetid2
+    );
+
+my $order3 = GetOrder( $ordernumber3 );
+is($order3->{'quantityreceived'}, 0, 'Splitting up order did not receive any on original order');
+is($order3->{'quantity'}, 2, '2 items on original order');
+is($order3->{'budget_id'}, $budgetid, 'Budget on original order is unchanged');
+
+$neworder = GetOrder( $new_ordernumber );
+is($neworder->{'quantity'}, 2, '2 items on new order');
+is($neworder->{'quantityreceived'}, 2, 'Splitting up order received items on new order');
+is($neworder->{'budget_id'}, $budgetid2, 'Budget on new order is changed');
+
+($datereceived, $new_ordernumber) = ModReceiveOrder(
+    $biblionumber2,
+    $ordernumber3,
+    2,
+    undef,
+    12,
+    12,
+    $invoiceid,
+    42,
+    $budgetid2
+    );
+
+$order3 = GetOrder( $ordernumber3 );
+is($order3->{'quantityreceived'}, 2, 'Order not split up');
+is($order3->{'quantity'}, 2, '2 items on order');
+is($order3->{'budget_id'}, $budgetid2, 'Budget has changed');
+
 $dbh->rollback;