@@ -, +, @@ --- C4/Acquisition.pm | 46 +++++++++++++++++++++++------------ acqui/addorder.pl | 2 +- t/db_dependent/Acquisition.t | 55 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 86 insertions(+), 17 deletions(-) --- a/C4/Acquisition.pm +++ a/C4/Acquisition.pm @@ -1285,7 +1285,7 @@ sub NewOrder { =head3 NewOrderItem - &NewOrderItem(); + &NewOrderItem ($itemnumber, $ordernumber); =cut @@ -1752,30 +1752,46 @@ sub SearchOrders { =head3 DelOrder - &DelOrder($ordernumber, $biblionumber); + &DelOrder($ordernumber); -Cancel the order with the given order and biblio numbers. It does not -delete any entries in the aqorders table, it merely marks them as -cancelled. +Cancel the order with the given order, by filling the datecancellationprinted and orderstatus fields. +C<$ordernumber > is mandatory +If no ordernumber is passed, the function returns undef and does not try to update database. +All the items linked with that order are deleted. +Other items are not deleted. =cut sub DelOrder { - my ($ordernumber,$biblionumber) = @_; + my ($ordernumber) = @_; + return unless $ordernumber; my $dbh = C4::Context->dbh; - my $query = " + my $query = qq { UPDATE aqorders SET datecancellationprinted=now(), orderstatus='cancelled' - WHERE ordernumber=? - "; + WHERE ordernumber = ? + }; my $sth = $dbh->prepare($query); $sth->execute($ordernumber ); - $sth->finish; - if ($biblionumber) { - my @itemnumbers = GetItemnumbersFromOrder( $ordernumber ); - foreach my $itemnumber (@itemnumbers){ - C4::Items::DelItem( $dbh, $biblionumber, $itemnumber ); - } +# get the biblionumber (we need it to run DelItem + $query = qq{ + SELECT biblionumber + FROM aqorders + WHERE ordernumber = ? + }; + $sth = $dbh->prepare($query); + $sth->execute($ordernumber ); + my $record = $sth->fetchrow_hashref; +# delete items from items and aqorders_items tables + my @itemnumbers = GetItemnumbersFromOrder( $ordernumber ); + foreach my $itemnumber (@itemnumbers) { + $query = qq{ + DELETE FROM aqorders_items + WHERE aqorders_items.itemnumber = ? + }; + $sth = $dbh->prepare($query); + $sth->execute($itemnumber ); + C4::Items::DelItem( $dbh, $record->{biblionumber}, $itemnumber ) if $record->{biblionumber}; } } --- a/acqui/addorder.pl +++ a/acqui/addorder.pl @@ -323,7 +323,7 @@ if ( $orderinfo->{quantity} ne '0' ) { else { # qty=0, delete the line my $biblionumber = $input->param('biblionumber'); - DelOrder($$orderinfo{ordernumber}, $biblionumber ); + DelOrder($$orderinfo{ordernumber}); if ($orderinfo->{delbiblio} == 1){ DelBiblio($biblionumber); } --- a/t/db_dependent/Acquisition.t +++ a/t/db_dependent/Acquisition.t @@ -7,8 +7,10 @@ use Modern::Perl; use POSIX qw(strftime); use C4::Bookseller qw( GetBookSellerFromId ); +use C4::Items qw (AddItem GetItem); +use C4::Branch qw (ModBranch); -use Test::More tests => 62; +use Test::More tests => 67; BEGIN { use_ok('C4::Acquisition'); @@ -223,4 +225,55 @@ is($order3->{'quantityreceived'}, 2, 'Order not split up'); is($order3->{'quantity'}, 2, '2 items on order'); is($order3->{'budget_id'}, $budgetid2, 'Budget has changed'); +# +# test DelOrder +# use: +# &DelOrder($ordernumber); + +# create 3 items on the same record and link 2 of them to the order + +# Add a branch +my $b1 = { + add => 1, + branchcode => 'BRA', + branchname => 'BranchA', + branchaddress1 => 'adr1A', + branchaddress2 => 'adr2A', + branchaddress3 => 'adr3A', + branchzip => 'zipA', + branchcity => 'cityA', + branchstate => 'stateA', + branchcountry => 'countryA', + branchphone => 'phoneA', + branchfax => 'faxA', + branchemail => 'emailA', + branchurl => 'urlA', + branchip => 'ipA', + branchprinter => undef, + branchnotes => 'noteA', + opac_info => 'opacA' +}; +ModBranch($b1); + +my ($item_bibnum1, $item_bibitemnum1, $itemnumber1) = AddItem({ homebranch => 'BRA', holdingbranch => 'BRA' } , $biblionumber2); +my ($item_bibnum2, $item_bibitemnum2, $itemnumber2) = AddItem({ homebranch => 'BRA', holdingbranch => 'BRA' } , $biblionumber2); +my ($item_bibnum3, $item_bibitemnum3, $itemnumber3) = AddItem({ homebranch => 'BRA', holdingbranch => 'BRA' } , $biblionumber2); +NewOrderItem ($itemnumber1, $ordernumber3); +NewOrderItem ($itemnumber2, $ordernumber3); + +# If no ordernumber is passed, the function returns undef and does not try to update database +my $return_DelOrder = DelOrder (); +is($return_DelOrder , undef, 'DelOrder returns undef with no param'); +# Cancel the order with the given order, by filling the datecancellationprinted and orderstatus fields. +DelOrder ($ordernumber3); +$order3 = GetOrder( $ordernumber3 ); +ok(($order3->{'orderstatus'} eq 'cancelled')&& (defined $order3->{'datecancellationprinted'}),'DelOrders update orderstatus and fill datecancellationprinted fields'); + +# All the items linked with that order are deleted. +is(scalar GetItemnumbersFromOrder($ordernumber3), 0, 'DelOrders delete items linked with cancelled order in aqorders_items table'); +ok(!defined GetItem($itemnumber1) && !defined GetItem($itemnumber2), "DelOrder deletes items linked with order in items table"); + +# Other items (created manually) are not deleted. +is(GetItem($itemnumber3)->{biblionumber},$biblionumber2, "DelOrder does not delete item created manually"); + $dbh->rollback; --