X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=C4%2FAcquisition.pm;h=b28b4b0e1034d9e31758c111c4e1f04af1f12ada;hb=ab4cf23286219b473820b61bca82c884de274e80;hp=8039afac61ca7c63a89142a08913a376d5b1b5f8;hpb=77ea4686395f88c9678c611a78e6db4fd4c04101;p=koha.git diff --git a/C4/Acquisition.pm b/C4/Acquisition.pm index 8039afac61..b28b4b0e10 100644 --- a/C4/Acquisition.pm +++ b/C4/Acquisition.pm @@ -28,6 +28,7 @@ use C4::Contract; use C4::Debug; use C4::Templates qw(gettemplate); use Koha::DateUtils qw( dt_from_string output_pref ); +use Koha::Acquisition::Baskets; use Koha::Acquisition::Booksellers; use Koha::Acquisition::Orders; use Koha::Biblios; @@ -84,8 +85,6 @@ BEGIN { &DelInvoice &MergeInvoices - &GetItemnumbersFromOrder - &AddClaim &GetBiblioCountByBasketno @@ -94,6 +93,8 @@ BEGIN { &NotifyOrderUsers &FillWithDefaultValues + + &get_rounded_price ); } @@ -121,28 +122,6 @@ sub GetOrderFromItemnumber { } -# Returns the itemnumber(s) associated with the ordernumber given in parameter -sub GetItemnumbersFromOrder { - my ($ordernumber) = @_; - my $dbh = C4::Context->dbh; - my $query = "SELECT itemnumber FROM aqorders_items WHERE ordernumber=?"; - my $sth = $dbh->prepare($query); - $sth->execute($ordernumber); - my @tab; - - while (my $order = $sth->fetchrow_hashref) { - push @tab, $order->{'itemnumber'}; - } - - return @tab; - -} - - - - - - =head1 NAME C4::Acquisition - Koha functions for dealing with orders and acquisitions @@ -713,7 +692,13 @@ sub GetBasketsInfosByBookseller { unless ( $allbaskets ) { # Don't show the basket if it's NOT CLOSED or is FULLY RECEIVED - $query.=" HAVING (closedate IS NULL OR (expected_items > 0))" + $query.=" HAVING (closedate IS NULL OR ( + SUM( + IF(aqorders.datereceived IS NULL + AND (aqorders.datecancellationprinted IS NULL OR aqorders.datecancellationprinted='0000-00-00') + , aqorders.quantity + , 0) + ) > 0))" } my $sth = $dbh->prepare($query); @@ -1461,22 +1446,25 @@ sub ModReceiveOrder { UPDATE aqorders SET quantity = ?, orderstatus = 'partial'|; - $query .= q|, order_internalnote = ?| if defined $order->{order_internalnote}; $query .= q| WHERE ordernumber = ?|; my $sth = $dbh->prepare($query); $sth->execute( ( $is_standing ? 1 : ($order->{quantity} - $quantrec) ), - ( defined $order->{order_internalnote} ? $order->{order_internalnote} : () ), $order->{ordernumber} ); + if ( not $order->{subscriptionid} && defined $order->{order_internalnote} ) { + $dbh->do(q|UPDATE aqorders + SET order_internalnote = ?|, {}, $order->{order_internalnote}); + } + # Recalculate tax_value $dbh->do(q| UPDATE aqorders SET - tax_value_on_ordering = quantity * ecost_tax_excluded * tax_rate_on_ordering, - tax_value_on_receiving = quantity * unitprice_tax_excluded * tax_rate_on_receiving + tax_value_on_ordering = quantity * | . _get_rounding_sql(q|ecost_tax_excluded|) . q| * tax_rate_on_ordering, + tax_value_on_receiving = quantity * | . _get_rounding_sql(q|unitprice_tax_excluded|) . q| * tax_rate_on_receiving WHERE ordernumber = ? |, undef, $order->{ordernumber}); @@ -1488,8 +1476,8 @@ sub ModReceiveOrder { $order->{tax_rate_on_ordering} //= 0; $order->{unitprice_tax_excluded} //= 0; $order->{tax_rate_on_receiving} //= 0; - $order->{tax_value_on_ordering} = $order->{quantity} * $order->{ecost_tax_excluded} * $order->{tax_rate_on_ordering}; - $order->{tax_value_on_receiving} = $order->{quantity} * $order->{unitprice_tax_excluded} * $order->{tax_rate_on_receiving}; + $order->{tax_value_on_ordering} = $order->{quantity} * get_rounded_price($order->{ecost_tax_excluded}) * $order->{tax_rate_on_ordering}; + $order->{tax_value_on_receiving} = $order->{quantity} * get_rounded_price($order->{unitprice_tax_excluded}) * $order->{tax_rate_on_receiving}; $order->{datereceived} = $datereceived; $order->{invoiceid} = $invoice->{invoiceid}; $order->{orderstatus} = 'complete'; @@ -1602,8 +1590,8 @@ sub CancelReceipt { my $parent_ordernumber = $order->{'parent_ordernumber'}; - my @itemnumbers = GetItemnumbersFromOrder( $ordernumber ); my $order_obj = Koha::Acquisition::Orders->find( $ordernumber ); # FIXME rewrite all this subroutine using this object + my @itemnumbers = $order_obj->items->get_column('itemnumber'); if($parent_ordernumber == $ordernumber || not $parent_ordernumber) { # The order line has no parent, just mark it as not received @@ -1659,8 +1647,8 @@ sub CancelReceipt { $dbh->do(q| UPDATE aqorders SET - tax_value_on_ordering = quantity * ecost_tax_excluded * tax_rate_on_ordering, - tax_value_on_receiving = quantity * unitprice_tax_excluded * tax_rate_on_receiving + tax_value_on_ordering = quantity * | . _get_rounding_sql(q|ecost_tax_excluded|) . q| * tax_rate_on_ordering, + tax_value_on_receiving = quantity * | . _get_rounding_sql(q|unitprice_tax_excluded|) . q| * tax_rate_on_receiving WHERE ordernumber = ? |, undef, $parent_ordernumber); @@ -1679,7 +1667,7 @@ sub CancelReceipt { my @affects = split q{\|}, C4::Context->preference("AcqItemSetSubfieldsWhenReceiptIsCancelled"); if ( @affects ) { for my $in ( @itemnumbers ) { - my $item = Koha::Items->find( $in ); + my $item = Koha::Items->find( $in ); # FIXME We do not need that, we already have Koha::Items from $order_obj->items my $biblio = $item->biblio; my ( $itemfield ) = GetMarcFromKohaField( 'items.itemnumber', $biblio->frameworkcode ); my $item_marc = C4::Items::GetMarcItem( $biblio->biblionumber, $in ); @@ -1701,7 +1689,7 @@ sub _cancel_items_receipt { my ( $order, $parent_ordernumber ) = @_; $parent_ordernumber ||= $order->ordernumber; - my @itemnumbers = GetItemnumbersFromOrder($order->ordernumber); # FIXME Must be $order->items + my $items = $order->items; if ( $order->basket->effective_create_items eq 'receiving' ) { # Remove items that were created at receipt my $query = qq{ @@ -1711,13 +1699,13 @@ sub _cancel_items_receipt { }; my $dbh = C4::Context->dbh; my $sth = $dbh->prepare($query); - foreach my $itemnumber (@itemnumbers) { - $sth->execute($itemnumber, $itemnumber); + while ( my $item = $items->next ) { + $sth->execute($item->itemnumber, $item->itemnumber); } } else { # Update items - foreach my $itemnumber (@itemnumbers) { - ModItemOrder($itemnumber, $parent_ordernumber); + while ( my $item = $items->next ) { + ModItemOrder($item->itemnumber, $parent_ordernumber); } } } @@ -1921,9 +1909,10 @@ sub DelOrder { } $sth->finish; - my @itemnumbers = GetItemnumbersFromOrder( $ordernumber ); - foreach my $itemnumber (@itemnumbers){ - my $delcheck = C4::Items::DelItemCheck( $bibnum, $itemnumber ); + my $order = Koha::Acquisition::Orders->find($ordernumber); + my $items = $order->items; + while ( my $item = $items->next ) { # Should be moved to Koha::Acquisition::Order->delete + my $delcheck = C4::Items::DelItemCheck( $bibnum, $item->itemnumber ); if($delcheck != 1) { $error->{'delitem'} = 1; @@ -2011,6 +2000,37 @@ sub TransferOrder { return $newordernumber; } +=head3 _get_rounding_sql + + $rounding_sql = _get_rounding_sql("mysql_variable_to_round_string"); + +returns the correct SQL routine based on OrderPriceRounding system preference. + +=cut + +sub _get_rounding_sql { + my ( $round_string ) = @_; + my $rounding_pref = C4::Context->preference('OrderPriceRounding'); + if ( $rounding_pref eq "nearest_cent" ) { return ("CAST($round_string*100 AS UNSIGNED)/100"); } + else { return ("$round_string"); } +} + +=head3 get_rounded_price + + $rounded_price = get_rounded_price( $price ); + +returns a price rounded as specified in OrderPriceRounding system preference. + +=cut + +sub get_rounded_price { + my ( $price ) = @_; + my $rounding_pref = C4::Context->preference('OrderPriceRounding'); + if( $rounding_pref eq 'nearest_cent' ) { return Koha::Number::Price->new( $price )->round(); } + else { return $price; } +} + + =head2 FUNCTIONS ABOUT PARCELS =head3 GetParcels @@ -2293,6 +2313,8 @@ sub GetHistory { my $ordernumber = $params{ordernumber}; my $search_children_too = $params{search_children_too} || 0; my $created_by = $params{created_by} || []; + my $ordernumbers = $params{ordernumbers} || []; + my $additional_fields = $params{additional_fields} // []; my @order_loop; my $total_qty = 0; @@ -2453,6 +2475,18 @@ sub GetHistory { push @query_params, @$created_by; } + if ( @$ordernumbers ) { + $query .= ' AND (aqorders.ordernumber IN ( ' . join (',', ('?') x @$ordernumbers ) . '))'; + push @query_params, @$ordernumbers; + } + if ( @$additional_fields ) { + my @baskets = Koha::Acquisition::Baskets->filter_by_additional_fields($additional_fields); + + return [] unless @baskets; + + # No parameterization because record IDs come directly from DB + $query .= ' AND aqbasket.basketno IN ( ' . join( ',', map { $_->basketno } @baskets ) . ' )'; + } if ( C4::Context->preference("IndependentBranches") ) { unless ( C4::Context->IsSuperLibrarian() ) { @@ -3011,7 +3045,7 @@ sub populate_order_with_prices { # tax value = quantity * ecost tax excluded * tax rate $order->{tax_value_on_ordering} = - $order->{quantity} * $order->{ecost_tax_excluded} * $order->{tax_rate_on_ordering}; + $order->{quantity} * get_rounded_price($order->{ecost_tax_excluded}) * $order->{tax_rate_on_ordering}; } if ($receiving) { @@ -3045,7 +3079,7 @@ sub populate_order_with_prices { } # tax value = quantity * unit price tax excluded * tax rate - $order->{tax_value_on_receiving} = $order->{quantity} * $order->{unitprice_tax_excluded} * $order->{tax_rate_on_receiving}; + $order->{tax_value_on_receiving} = $order->{quantity} * get_rounded_price($order->{unitprice_tax_excluded}) * $order->{tax_rate_on_receiving}; } return $order;