From f62c8bb124e4cfd1adcf709fd9bff330735593ab Mon Sep 17 00:00:00 2001 From: Jared Camins-Esakov Date: Sat, 8 Jun 2013 13:27:36 -0400 Subject: [PATCH] Bug 10403: add ability to change fund on receipt 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: Jared Camins-Esakov Signed-off-by: Jared Camins-Esakov Signed-off-by: Jared Camins-Esakov http://bugs.koha-community.org/show_bug.cgi?id=6473 --- C4/Acquisition.pm | 5 +- C4/SQLHelper.pm | 2 +- acqui/finishreceive.pl | 3 +- acqui/orderreceive.pl | 35 +++++++++- .../prog/en/modules/acqui/orderreceive.tt | 14 +++- t/db_dependent/Acquisition.t | 70 +++++++++++++++++++- 6 files changed, 121 insertions(+), 8 deletions(-) diff --git a/C4/Acquisition.pm b/C4/Acquisition.pm index 68bb2fe..f3df179 100644 --- a/C4/Acquisition.pm +++ b/C4/Acquisition.pm @@ -1348,6 +1348,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; @@ -1366,9 +1367,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); diff --git a/C4/SQLHelper.pm b/C4/SQLHelper.pm index 21f5fa1..f1fa7b5 100644 --- a/C4/SQLHelper.pm +++ b/C4/SQLHelper.pm @@ -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; diff --git a/acqui/finishreceive.pl b/acqui/finishreceive.pl index f9c8532..4196b52 100755 --- a/acqui/finishreceive.pl +++ b/acqui/finishreceive.pl @@ -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, ); diff --git a/acqui/orderreceive.pl b/acqui/orderreceive.pl index 8fc760b..833e402 100755 --- a/acqui/orderreceive.pl +++ b/acqui/orderreceive.pl @@ -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; @@ -93,7 +93,7 @@ my $bookseller = GetBookSellerFromId($booksellerid); my $results; $results = SearchOrder($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, @@ -226,6 +226,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 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 0f454c0..938575e 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt @@ -274,7 +274,19 @@ Accounting details
  1. [% datereceived %]
  2. -
  3. [% bookfund %]
  4. +
  5. (Current: [% bookfund %])
  6. [% IF ( memberfirstname and membersurname ) %][% IF ( memberfirstname ) %][% memberfirstname %][% END %] [% membersurname %][% ELSE %]No name[% END %]
  7. [% IF ( edit and not subscriptionid) %] diff --git a/t/db_dependent/Acquisition.t b/t/db_dependent/Acquisition.t index c7b3c4a..523e400 100755 --- a/t/db_dependent/Acquisition.t +++ b/t/db_dependent/Acquisition.t @@ -8,7 +8,7 @@ use POSIX qw(strftime); use C4::Bookseller qw( GetBookSellerFromId ); -use Test::More tests => 41; +use Test::More tests => 56; BEGIN { use_ok('C4::Acquisition'); @@ -127,4 +127,72 @@ for my $field ( @expectedfields ) { ok( exists( $firstorder->{ $field } ), "This order has a $field field" ); } +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; -- 1.7.9.5