Bug 29955: Move populate_order_with_prices to Koha namespace

and split the subroutine into 2 smaller subroutines (one for ordering,
the other for receiving)

Test plan:
1. Create a vendor and an acquisition basket
2. In this basket, create new orders using all the different methods
   (from an existing record, from a suggestion, from a new record, ...)
   then close the basket and receive these orders.
   Make sure it works the same with and without the patch
3. Run tests in t/Prices.t,
   t/db_dependent/Acquisition/populate_order_with_prices.t, and
   t/db_dependent/Budgets.t

Signed-off-by: Joonas Kylmälä <joonas.kylmala@iki.fi>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
Julian Maurice 2022-01-26 15:58:26 +01:00 committed by Tomas Cohen Arazi
parent 39df2a2a3d
commit b760eb4725
No known key found for this signature in database
GPG Key ID: 0A272EA1B2F3C15F
8 changed files with 391 additions and 490 deletions

View File

@ -67,7 +67,6 @@ BEGIN {
GetOrderFromItemnumber
SearchOrders GetHistory GetRecentAcqui
ModReceiveOrder CancelReceipt
populate_order_with_prices
TransferOrder
ModItemOrder
@ -2825,139 +2824,6 @@ sub GetBiblioCountByBasketno {
return $sth->fetchrow;
}
=head3 populate_order_with_prices
$order = populate_order_with_prices({
order => $order #a hashref with the order values
booksellerid => $booksellerid #FIXME - should obtain from order basket
receiving => 1 # boolean representing order stage, should pass only this or ordering
ordering => 1 # boolean representing order stage
});
Sets calculated values for an order - all values are stored with full precision
regardless of rounding preference except for tax value which is calculated
on rounded values if requested
For ordering the values set are:
rrp_tax_included
rrp_tax_excluded
ecost_tax_included
ecost_tax_excluded
tax_value_on_ordering
For receiving the value set are:
unitprice_tax_included
unitprice_tax_excluded
tax_value_on_receiving
Note: When receiving, if the rounded value of the unitprice matches the rounded
value of the ecost then then ecost (full precision) is used.
Returns a hashref of the order
FIXME: Move this to Koha::Acquisition::Order.pm
=cut
sub populate_order_with_prices {
my ($params) = @_;
my $order = $params->{order};
my $booksellerid = $params->{booksellerid};
return unless $booksellerid;
my $bookseller = Koha::Acquisition::Booksellers->find( $booksellerid );
my $receiving = $params->{receiving};
my $ordering = $params->{ordering};
my $discount = $order->{discount};
$discount /= 100 if $discount > 1;
if ($ordering) {
$order->{tax_rate_on_ordering} //= $order->{tax_rate};
if ( $bookseller->listincgst ) {
# The user entered the prices tax included
$order->{unitprice} += 0;
$order->{unitprice_tax_included} = $order->{unitprice};
$order->{rrp_tax_included} = $order->{rrp};
# price tax excluded = price tax included / ( 1 + tax rate )
$order->{unitprice_tax_excluded} = $order->{unitprice_tax_included} / ( 1 + $order->{tax_rate_on_ordering} );
$order->{rrp_tax_excluded} = $order->{rrp_tax_included} / ( 1 + $order->{tax_rate_on_ordering} );
# ecost tax included = rrp tax included ( 1 - discount )
$order->{ecost_tax_included} = $order->{rrp_tax_included} * ( 1 - $discount );
# ecost tax excluded = rrp tax excluded * ( 1 - discount )
$order->{ecost_tax_excluded} = $order->{rrp_tax_excluded} * ( 1 - $discount );
# tax value = quantity * ecost tax excluded * tax rate
# we should use the unitprice if included
my $cost_tax_included = $order->{unitprice_tax_included} == 0 ? $order->{ecost_tax_included} : $order->{unitprice_tax_included};
my $cost_tax_excluded = $order->{unitprice_tax_excluded} == 0 ? $order->{ecost_tax_excluded} : $order->{unitprice_tax_excluded};
$order->{tax_value_on_ordering} = ( get_rounded_price($cost_tax_included) - get_rounded_price($cost_tax_excluded) ) * $order->{quantity};
}
else {
# The user entered the prices tax excluded
$order->{unitprice_tax_excluded} = $order->{unitprice};
$order->{rrp_tax_excluded} = $order->{rrp};
# price tax included = price tax excluded * ( 1 - tax rate )
$order->{unitprice_tax_included} = $order->{unitprice_tax_excluded} * ( 1 + $order->{tax_rate_on_ordering} );
$order->{rrp_tax_included} = $order->{rrp_tax_excluded} * ( 1 + $order->{tax_rate_on_ordering} );
# ecost tax excluded = rrp tax excluded * ( 1 - discount )
$order->{ecost_tax_excluded} = $order->{rrp_tax_excluded} * ( 1 - $discount );
# ecost tax included = rrp tax excluded * ( 1 + tax rate ) * ( 1 - discount ) = ecost tax excluded * ( 1 + tax rate )
$order->{ecost_tax_included} = $order->{ecost_tax_excluded} * ( 1 + $order->{tax_rate_on_ordering} );
# tax value = quantity * ecost tax included * tax rate
# we should use the unitprice if included
my $cost_tax_excluded = $order->{unitprice_tax_excluded} == 0 ? $order->{ecost_tax_excluded} : $order->{unitprice_tax_excluded};
$order->{tax_value_on_ordering} = $order->{quantity} * get_rounded_price($cost_tax_excluded) * $order->{tax_rate_on_ordering};
}
}
if ($receiving) {
$order->{tax_rate_on_receiving} //= $order->{tax_rate};
if ( $bookseller->invoiceincgst ) {
# Trick for unitprice. If the unit price rounded value is the same as the ecost rounded value
# we need to keep the exact ecost value
if ( Koha::Number::Price->new( $order->{unitprice} )->round == Koha::Number::Price->new( $order->{ecost_tax_included} )->round ) {
$order->{unitprice} = $order->{ecost_tax_included};
}
# The user entered the unit price tax included
$order->{unitprice_tax_included} = $order->{unitprice};
# unit price tax excluded = unit price tax included / ( 1 + tax rate )
$order->{unitprice_tax_excluded} = $order->{unitprice_tax_included} / ( 1 + $order->{tax_rate_on_receiving} );
}
else {
# Trick for unitprice. If the unit price rounded value is the same as the ecost rounded value
# we need to keep the exact ecost value
if ( Koha::Number::Price->new( $order->{unitprice} )->round == Koha::Number::Price->new( $order->{ecost_tax_excluded} )->round ) {
$order->{unitprice} = $order->{ecost_tax_excluded};
}
# The user entered the unit price tax excluded
$order->{unitprice_tax_excluded} = $order->{unitprice};
# unit price tax included = unit price tax included * ( 1 + tax rate )
$order->{unitprice_tax_included} = $order->{unitprice_tax_excluded} * ( 1 + $order->{tax_rate_on_receiving} );
}
# tax value = quantity * unit price tax excluded * tax rate
$order->{tax_value_on_receiving} = $order->{quantity} * get_rounded_price($order->{unitprice_tax_excluded}) * $order->{tax_rate_on_receiving};
}
return $order;
}
=head3 GetOrderUsers
$order_users_ids = &GetOrderUsers($ordernumber);

View File

@ -20,6 +20,7 @@ use Modern::Perl;
use Carp qw( croak );
use C4::Biblio qw( DelBiblio );
use C4::Acquisition;
use Koha::Acquisition::Baskets;
use Koha::Acquisition::Funds;
@ -31,6 +32,7 @@ use Koha::Exceptions::Object;
use Koha::Biblios;
use Koha::Holds;
use Koha::Items;
use Koha::Number::Price;
use Koha::Subscriptions;
use base qw(Koha::Object);
@ -457,6 +459,133 @@ sub duplicate_to {
return $new_order;
}
=head3 populate_with_prices_for_ordering
Sets calculated values for an order - all values are stored with full precision
regardless of rounding preference except for tax value which is calculated on
rounded values if requested
$order->populate_with_prices_for_ordering()
The values set are:
rrp_tax_included
rrp_tax_excluded
ecost_tax_included
ecost_tax_excluded
tax_value_on_ordering
=cut
sub populate_with_prices_for_ordering {
my ($self) = @_;
my $bookseller = $self->basket->bookseller;
return unless $bookseller;
my $discount = $self->discount || 0;
$discount /= 100 if $discount > 1;
if ( $bookseller->listincgst ) {
# The user entered the prices tax included
$self->unitprice($self->unitprice + 0);
$self->unitprice_tax_included($self->unitprice);
$self->rrp_tax_included($self->rrp);
# price tax excluded = price tax included / ( 1 + tax rate )
$self->unitprice_tax_excluded( $self->unitprice_tax_included / ( 1 + $self->tax_rate_on_ordering ) );
$self->rrp_tax_excluded( $self->rrp_tax_included / ( 1 + $self->tax_rate_on_ordering ) );
# ecost tax included = rrp tax included ( 1 - discount )
$self->ecost_tax_included($self->rrp_tax_included * ( 1 - $discount ));
# ecost tax excluded = rrp tax excluded * ( 1 - discount )
$self->ecost_tax_excluded($self->rrp_tax_excluded * ( 1 - $discount ));
# tax value = quantity * ecost tax excluded * tax rate
# we should use the unitprice if included
my $cost_tax_included = $self->unitprice_tax_included == 0 ? $self->ecost_tax_included : $self->unitprice_tax_included;
my $cost_tax_excluded = $self->unitprice_tax_excluded == 0 ? $self->ecost_tax_excluded : $self->unitprice_tax_excluded;
$self->tax_value_on_ordering( ( C4::Acquisition::get_rounded_price($cost_tax_included) - C4::Acquisition::get_rounded_price($cost_tax_excluded) ) * $self->quantity );
} else {
# The user entered the prices tax excluded
$self->unitprice_tax_excluded($self->unitprice);
$self->rrp_tax_excluded($self->rrp);
# price tax included = price tax excluded * ( 1 - tax rate )
$self->unitprice_tax_included($self->unitprice_tax_excluded * ( 1 + $self->tax_rate_on_ordering ));
$self->rrp_tax_included($self->rrp_tax_excluded * ( 1 + $self->tax_rate_on_ordering ));
# ecost tax excluded = rrp tax excluded * ( 1 - discount )
$self->ecost_tax_excluded($self->rrp_tax_excluded * ( 1 - $discount ));
# ecost tax included = rrp tax excluded * ( 1 + tax rate ) * ( 1 - discount ) = ecost tax excluded * ( 1 + tax rate )
$self->ecost_tax_included($self->ecost_tax_excluded * ( 1 + $self->tax_rate_on_ordering ));
# tax value = quantity * ecost tax included * tax rate
# we should use the unitprice if included
my $cost_tax_excluded = $self->unitprice_tax_excluded == 0 ? $self->ecost_tax_excluded : $self->unitprice_tax_excluded;
$self->tax_value_on_ordering($self->quantity * C4::Acquisition::get_rounded_price($cost_tax_excluded) * $self->tax_rate_on_ordering);
}
}
=head3 populate_with_prices_for_receiving
Sets calculated values for an order - all values are stored with full precision
regardless of rounding preference except for tax value which is calculated on
rounded values if requested
$order->populate_with_prices_for_receiving()
The values set are:
unitprice_tax_included
unitprice_tax_excluded
tax_value_on_receiving
Note: When receiving, if the rounded value of the unitprice matches the rounded
value of the ecost then then ecost (full precision) is used.
=cut
sub populate_with_prices_for_receiving {
my ($self) = @_;
my $bookseller = $self->basket->bookseller;
return unless $bookseller;
my $discount = $self->discount || 0;
$discount /= 100 if $discount > 1;
if ($bookseller->invoiceincgst) {
# Trick for unitprice. If the unit price rounded value is the same as the ecost rounded value
# we need to keep the exact ecost value
if ( Koha::Number::Price->new( $self->unitprice )->round == Koha::Number::Price->new( $self->ecost_tax_included )->round ) {
$self->unitprice($self->ecost_tax_included);
}
# The user entered the unit price tax included
$self->unitprice_tax_included($self->unitprice);
# unit price tax excluded = unit price tax included / ( 1 + tax rate )
$self->unitprice_tax_excluded($self->unitprice_tax_included / ( 1 + $self->tax_rate_on_receiving ));
} else {
# Trick for unitprice. If the unit price rounded value is the same as the ecost rounded value
# we need to keep the exact ecost value
if ( Koha::Number::Price->new($self->unitprice)->round == Koha::Number::Price->new($self->ecost_tax_excluded)->round ) {
$self->unitprice($self->ecost_tax_excluded);
}
# The user entered the unit price tax excluded
$self->unitprice_tax_excluded($self->unitprice);
# unit price tax included = unit price tax included * ( 1 + tax rate )
$self->unitprice_tax_included($self->unitprice_tax_excluded * ( 1 + $self->tax_rate_on_receiving ));
}
# tax value = quantity * unit price tax excluded * tax rate
$self->tax_value_on_receiving($self->quantity * C4::Acquisition::get_rounded_price($self->unitprice_tax_excluded) * $self->tax_rate_on_receiving);
}
=head3 to_api_mapping
This method returns the mapping for representing a Koha::Acquisition::Order object

View File

@ -72,7 +72,7 @@ the ISBN of the record ordered.
=item C<quantity>
the quantity to order.
=item C<list_price>
=item C<listprice>
the price of this order.
=item C<uncertainprice>
@ -121,7 +121,7 @@ use Modern::Perl;
use CGI qw ( -utf8 );
use JSON qw ( to_json encode_json );
use C4::Auth qw( get_template_and_user );
use C4::Acquisition qw( FillWithDefaultValues populate_order_with_prices ModOrder ModOrderUsers );
use C4::Acquisition qw( FillWithDefaultValues ModOrderUsers );
use C4::Suggestions qw( ModSuggestion );
use C4::Biblio qw(
AddBiblio
@ -228,9 +228,30 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
);
# get CGI parameters
my $orderinfo = $input->Vars;
$orderinfo->{'list_price'} ||= 0;
$orderinfo->{'uncertainprice'} ||= 0;
my $orderinfo = {
ordernumber => scalar $input->param('ordernumber'),
basketno => scalar $input->param('basketno'),
biblionumber => scalar $input->param('biblionumber'),
invoiceid => scalar $input->param('invoiceid'),
quantity => scalar $input->param('quantity'),
budget_id => scalar $input->param('budget_id'),
currency => scalar $input->param('currency'),
listprice => scalar $input->param('listprice'),
uncertainprice => scalar $input->param('uncertainprice'),
tax_rate_on_ordering => scalar $input->param('tax_rate'),
discount => scalar $input->param('discount'),
rrp => scalar $input->param('rrp'),
replacementprice => scalar $input->param('replacementprice'),
ecost => scalar $input->param('ecost'),
unitprice => scalar $input->param('unitprice'),
order_internalnote => scalar $input->param('order_internalnote'),
order_vendornote => scalar $input->param('order_vendornote'),
sort1 => scalar $input->param('sort1'),
sort2 => scalar $input->param('sort2'),
subscriptionid => scalar $input->param('subscriptionid'),
};
$orderinfo->{uncertainprice} ||= 0;
$orderinfo->{subscriptionid} ||= undef;
my $user = $input->remote_user;
@ -272,18 +293,18 @@ if ( $basket->{is_standing} || $orderinfo->{quantity} ne '0' ) {
#if it doesn't create it
$record = TransformKohaToMarc(
{
"biblio.title" => "$$orderinfo{title}",
"biblio.author" => $$orderinfo{author} ? $$orderinfo{author} : "",
"biblio.seriestitle" => $$orderinfo{series} ? $$orderinfo{series} : "",
"biblioitems.isbn" => $$orderinfo{isbn} ? $$orderinfo{isbn} : "",
"biblioitems.ean" => $$orderinfo{ean} ? $$orderinfo{ean} : "",
"biblioitems.publishercode" => $$orderinfo{publishercode} ? $$orderinfo{publishercode} : "",
"biblioitems.publicationyear" => $$orderinfo{publicationyear} ? $$orderinfo{publicationyear}: "",
"biblio.copyrightdate" => $$orderinfo{publicationyear} ? $$orderinfo{publicationyear}: "",
"biblioitems.itemtype" => $$orderinfo{itemtype} ? $$orderinfo{itemtype} : "",
"biblioitems.editionstatement"=> $$orderinfo{editionstatement} ? $$orderinfo{editionstatement} : "",
});
"biblio.title" => $input->param('title') || '',
"biblio.author" => $input->param('author') || '',
"biblio.seriestitle" => $input->param('series') || '',
"biblioitems.isbn" => $input->param('isbn') || '',
"biblioitems.ean" => $input->param('ean') || '',
"biblioitems.publishercode" => $input->param('publishercode') || '',
"biblioitems.publicationyear" => $input->param('publicationyear') || '',
"biblio.copyrightdate" => $input->param('publicationyear') || '',
"biblioitems.itemtype" => $input->param('itemtype') || '',
"biblioitems.editionstatement"=> $input->param('editionstatement') || '',
}
);
}
C4::Acquisition::FillWithDefaultValues( $record );
@ -294,10 +315,10 @@ if ( $basket->{is_standing} || $orderinfo->{quantity} ne '0' ) {
}
# change suggestion status if applicable
if ( $orderinfo->{suggestionid} ) {
if ( my $suggestionid = $input->param('suggestionid') ) {
ModSuggestion(
{
suggestionid => $orderinfo->{suggestionid},
suggestionid => $suggestionid,
biblionumber => $orderinfo->{biblionumber},
STATUS => 'ORDERED',
}
@ -306,47 +327,31 @@ if ( $basket->{is_standing} || $orderinfo->{quantity} ne '0' ) {
$orderinfo->{unitprice} = $orderinfo->{ecost} if not defined $orderinfo->{unitprice} or $orderinfo->{unitprice} eq '';
$orderinfo = C4::Acquisition::populate_order_with_prices(
{
order => $orderinfo,
booksellerid => $orderinfo->{booksellerid},
ordering => 1,
}
);
# if we already have $ordernumber, then it's an ordermodif
my $order = Koha::Acquisition::Order->new($orderinfo);
my $order;
my $log_action_name;
if ( $orderinfo->{ordernumber} ) {
ModOrder($orderinfo);
# Log the order modification
if (C4::Context->preference("AcquisitionLog")) {
my $infos = {};
foreach my $field(@log_order_fields) {
$infos->{$field} = $orderinfo->{$field};
}
logaction(
'ACQUISITIONS',
'MODIFY_ORDER',
$orderinfo->{ordernumber},
encode_json($infos)
);
}
$order = Koha::Acquisition::Orders->find($orderinfo->{ordernumber});
$order->set($orderinfo);
$log_action_name = 'MODIFY_ORDER';
} else {
$order = Koha::Acquisition::Order->new($orderinfo);
$log_action_name = 'CREATE_ORDER';
}
else { # else, it's a new line
$order->store;
# Log the order creation
if (C4::Context->preference("AcquisitionLog")) {
my $infos = {};
foreach my $field(@log_order_fields) {
$infos->{$field} = $orderinfo->{$field};
}
logaction(
'ACQUISITIONS',
'CREATE_ORDER',
$order->ordernumber,
encode_json($infos)
);
$order->populate_with_prices_for_ordering();
$order->store;
# Log the order creation
if (C4::Context->preference("AcquisitionLog")) {
my $infos = {};
foreach my $field(@log_order_fields) {
$infos->{$field} = $order->$field;
}
logaction(
'ACQUISITIONS',
$log_action_name,
$order->ordernumber,
encode_json($infos)
);
}
my $order_users_ids = $input->param('users_ids');
my @order_users = split( /:/, $order_users_ids );
@ -417,7 +422,7 @@ if (C4::Context->preference("AcquisitionLog") && $basketno) {
}
my $booksellerid=$$orderinfo{booksellerid};
if (my $import_batch_id=$$orderinfo{import_batch_id}) {
if (my $import_batch_id = $input->param('import_batch_id')) {
print $input->redirect("/cgi-bin/koha/acqui/addorderiso2709.pl?import_batch_id=$import_batch_id&basketno=$basketno&booksellerid=$booksellerid");
} elsif ( defined $orderinfo->{invoiceid} ) {
print $input->redirect("/cgi-bin/koha/acqui/parcel.pl?invoiceid=" . $orderinfo->{invoiceid});

View File

@ -33,7 +33,6 @@ use C4::Output qw( output_html_with_http_headers );
use C4::ImportBatch qw( GetImportRecordsRange GetImportRecordMarc GetImportRecordMatches SetImportRecordStatus SetMatchedBiblionumber SetImportBatchStatus GetImportBatch GetImportBatchRangeDesc GetNumberOfNonZ3950ImportBatches GetImportBatchOverlayAction GetImportBatchNoMatchAction GetImportBatchItemAction );
use C4::Matcher;
use C4::Search qw( FindDuplicate );
use C4::Acquisition qw( populate_order_with_prices );
use C4::Biblio qw(
AddBiblio
GetMarcFromKohaField
@ -43,7 +42,6 @@ use C4::Biblio qw(
);
use C4::Items qw( PrepareItemrecordDisplay AddItemFromMarc );
use C4::Budgets qw( GetBudget GetBudgets GetBudgetHierarchy CanUserUseBudget GetBudgetByCode );
use C4::Acquisition qw( populate_order_with_prices );
use C4::Suggestions; # GetSuggestion
use C4::Members;
@ -273,7 +271,8 @@ if ($op eq ""){
# in this case, the price will be x100 when unformatted ! Replace the . by a , to get a proper price calculation
$price =~ s/\./,/ if C4::Context->preference("CurrencyFormat") eq "FR";
$price = Koha::Number::Price->new($price)->unformat;
$orderinfo{tax_rate} = $bookseller->tax_rate;
$orderinfo{tax_rate_on_ordering} = $bookseller->tax_rate;
$orderinfo{tax_rate_on_receiving} = $bookseller->tax_rate;
my $c = $c_discount ? $c_discount : $bookseller->discount;
$orderinfo{discount} = $c;
if ( $c ) {
@ -282,7 +281,6 @@ if ($op eq ""){
}
$orderinfo{listprice} = $orderinfo{rrp} / $active_currency->rate;
$orderinfo{unitprice} = $orderinfo{ecost};
$orderinfo{total} = $orderinfo{ecost} * $infos->{quantity};
} else {
$orderinfo{listprice} = 0;
}
@ -291,18 +289,9 @@ if ($op eq ""){
# remove uncertainprice flag if we have found a price in the MARC record
$orderinfo{uncertainprice} = 0 if $orderinfo{listprice};
%orderinfo = %{
C4::Acquisition::populate_order_with_prices(
{
order => \%orderinfo,
booksellerid => $booksellerid,
ordering => 1,
receiving => 1,
}
)
};
my $order = Koha::Acquisition::Order->new( \%orderinfo )->store;
$order->populate_with_prices_for_ordering();
$order->populate_with_prices_for_receiving();
$order->add_item( $_ ) for @{ $budget_hash->{$budget_id}->{itemnumbers} };
}
}
@ -331,7 +320,8 @@ if ($op eq ""){
# in this case, the price will be x100 when unformatted ! Replace the . by a , to get a proper price calculation
$c_price =~ s/\./,/ if C4::Context->preference("CurrencyFormat") eq "FR";
$c_price = Koha::Number::Price->new($c_price)->unformat;
$orderinfo{tax_rate} = $bookseller->tax_rate;
$orderinfo{tax_rate_on_ordering} = $bookseller->tax_rate;
$orderinfo{tax_rate_on_receiving} = $bookseller->tax_rate;
my $c = $c_discount ? $c_discount : $bookseller->discount;
$orderinfo{discount} = $c;
if ( $c ) {
@ -340,7 +330,6 @@ if ($op eq ""){
}
$orderinfo{listprice} = $orderinfo{rrp} / $active_currency->rate;
$orderinfo{unitprice} = $orderinfo{ecost};
$orderinfo{total} = $orderinfo{ecost} * $c_quantity;
} else {
$orderinfo{listprice} = 0;
}
@ -348,18 +337,10 @@ if ($op eq ""){
# remove uncertainprice flag if we have found a price in the MARC record
$orderinfo{uncertainprice} = 0 if $orderinfo{listprice};
%orderinfo = %{
C4::Acquisition::populate_order_with_prices(
{
order => \%orderinfo,
booksellerid => $booksellerid,
ordering => 1,
receiving => 1,
}
)
};
my $order = Koha::Acquisition::Order->new( \%orderinfo )->store;
my $order = Koha::Acquisition::Order->new( \%orderinfo );
$order->populate_with_prices_for_ordering();
$order->populate_with_prices_for_receiving();
$order->store;
# 4th, add items if applicable
# parse the item sent by the form, and create an item just for the import_record_id we are dealing with

View File

@ -26,7 +26,7 @@ use C4::Auth qw( checkauth );
use JSON qw( encode_json );
use C4::Output;
use C4::Context;
use C4::Acquisition qw( GetInvoice GetOrder populate_order_with_prices ModReceiveOrder );
use C4::Acquisition qw( GetInvoice GetOrder ModReceiveOrder );
use C4::Biblio qw( GetFrameworkCode GetMarcFromKohaField TransformHtmlToXml );
use C4::Items qw( GetMarcItem ModItemFromMarc AddItemFromMarc );
use C4::Log qw(logaction);
@ -98,29 +98,23 @@ if ($quantityrec > $origquantityrec ) {
}
}
$order->{order_internalnote} = $input->param("order_internalnote");
$order->{tax_rate_on_receiving} = $input->param("tax_rate");
$order->{replacementprice} = $replacementprice;
$order->{unitprice} = $unitprice;
$order_obj->order_internalnote(scalar $input->param("order_internalnote"));
$order_obj->tax_rate_on_receiving(scalar $input->param("tax_rate"));
$order_obj->replacementprice($replacementprice);
$order_obj->unitprice($unitprice);
$order = C4::Acquisition::populate_order_with_prices(
{
order => $order,
booksellerid => $booksellerid,
receiving => 1
}
);
$order_obj->populate_with_prices_for_receiving();
# save the quantity received.
if ( $quantityrec > 0 ) {
if ( $order_obj->subscriptionid ) {
# Quantity can only be modified if linked to a subscription
$order->{quantity} = $quantity; # quantityrec will be deduced from this value in ModReceiveOrder
$order_obj->quantity($quantity); # quantityrec will be deduced from this value in ModReceiveOrder
}
( $datereceived, $new_ordernumber ) = ModReceiveOrder(
{
biblionumber => $biblionumber,
order => $order,
order => $order_obj->unblessed,
quantityreceived => $quantityrec,
user => $user,
invoice => $invoice,

View File

@ -8,13 +8,12 @@ use Module::Load::Conditional qw/check_install/;
BEGIN {
if ( check_install( module => 'Test::DBIx::Class' ) ) {
plan tests => 16;
plan tests => 15;
} else {
plan skip_all => "Need Test::DBIx::Class"
}
}
use_ok('C4::Acquisition', qw( populate_order_with_prices ));
use_ok('C4::Context');
use_ok('Koha::Number::Price');
@ -38,11 +37,18 @@ fixtures_ok [
[ 3, '1 0', 1, 0 ],
[ 4, '1 1', 1, 1 ],
],
Aqbasket => [
[ qw/ basketno basketname booksellerid / ],
[ 1, '0 0', 1 ],
[ 2, '0 1', 2 ],
[ 3, '1 0', 3 ],
[ 4, '1 1', 4 ],
],
], 'add currency fixtures';
my $bookseller_module = Test::MockModule->new('Koha::Acquisition::Bookseller');
my ( $basketno_0_0, $basketno_1_1 );
my ( $basketno_0_0, $basketno_0_1, $basketno_1_0, $basketno_1_1 ) = (1, 2, 3, 4);
my ( $invoiceid_0_0, $invoiceid_1_1 );
my $today;
@ -53,7 +59,7 @@ for my $currency_format ( qw( US FR ) ) {
my $biblionumber_0_0 = 42;
my $order_0_0 = {
my $order_0_0 = Koha::Acquisition::Order->new({
biblionumber => $biblionumber_0_0,
quantity => 2,
listprice => 82,
@ -63,21 +69,16 @@ for my $currency_format ( qw( US FR ) ) {
invoiceid => $invoiceid_0_0,
rrp => 82.00,
ecost => 73.80,
tax_rate => 0.0500,
tax_rate_on_ordering => 0.0500,
tax_rate_on_receiving => 0.0500,
discount => 10,
datereceived => $today
};
$order_0_0 = C4::Acquisition::populate_order_with_prices(
{
order => $order_0_0,
booksellerid => 1,
ordering => 1,
}
);
});
$order_0_0->populate_with_prices_for_ordering();
compare(
{
got => $order_0_0->{rrp_tax_included},
got => $order_0_0->rrp_tax_included,
expected => 86.10,
conf => '0 0',
field => 'rrp_tax_included'
@ -85,7 +86,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_0_0->{rrp_tax_excluded},
got => $order_0_0->rrp_tax_excluded,
expected => 82.00,
conf => '0 0',
field => 'rrp_tax_excluded'
@ -93,7 +94,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_0_0->{ecost_tax_included},
got => $order_0_0->ecost_tax_included,
expected => 77.49,
conf => '0 0',
field => 'ecost_tax_included'
@ -101,7 +102,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_0_0->{ecost_tax_excluded},
got => $order_0_0->ecost_tax_excluded,
expected => 73.80,
conf => '0 0',
field => 'ecost_tax_excluded'
@ -109,24 +110,18 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_0_0->{tax_value_on_ordering},
got => $order_0_0->tax_value_on_ordering,
expected => 7.38,
conf => '0 0',
field => 'tax_value'
}
);
$order_0_0 = C4::Acquisition::populate_order_with_prices(
{
order => $order_0_0,
booksellerid => 1,
receiving => 1,
}
);
$order_0_0->populate_with_prices_for_receiving();
compare(
{
got => $order_0_0->{unitprice_tax_included},
got => $order_0_0->unitprice_tax_included,
expected => 77.49,
conf => '0 0',
field => 'unitprice_tax_included'
@ -134,7 +129,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_0_0->{unitprice_tax_excluded},
got => $order_0_0->unitprice_tax_excluded,
expected => 73.80,
conf => '0 0',
field => 'unitprice_tax_excluded'
@ -142,7 +137,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_0_0->{tax_value_on_receiving},
got => $order_0_0->tax_value_on_receiving,
expected => 7.38,
conf => '0 0',
field => 'tax_value'
@ -154,7 +149,7 @@ for my $currency_format ( qw( US FR ) ) {
plan tests => 11;
my $biblionumber_1_1 = 43;
my $order_1_1 = {
my $order_1_1 = Koha::Acquisition::Order->new({
biblionumber => $biblionumber_1_1,
quantity => 2,
listprice => 82,
@ -164,22 +159,17 @@ for my $currency_format ( qw( US FR ) ) {
invoiceid => $invoiceid_1_1,
rrp => 82.00,
ecost => 73.80,
tax_rate => 0.0500,
tax_rate_on_ordering => 0.0500,
tax_rate_on_receiving => 0.0500,
discount => 10,
datereceived => $today
};
});
$order_1_1 = C4::Acquisition::populate_order_with_prices(
{
order => $order_1_1,
booksellerid => 4,
ordering => 1,
}
);
$order_1_1->populate_with_prices_for_ordering();
compare(
{
got => $order_1_1->{rrp_tax_included},
got => $order_1_1->rrp_tax_included,
expected => 82.00,
conf => '1 1',
field => 'rrp_tax_included'
@ -187,7 +177,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_1->{rrp_tax_excluded},
got => $order_1_1->rrp_tax_excluded,
expected => 78.10,
conf => '1 1',
field => 'rrp_tax_excluded'
@ -195,7 +185,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_1->{ecost_tax_included},
got => $order_1_1->ecost_tax_included,
expected => 73.80,
conf => '1 1',
field => 'ecost_tax_included'
@ -203,7 +193,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_1->{ecost_tax_excluded},
got => $order_1_1->ecost_tax_excluded,
expected => 70.29,
conf => '1 1',
field => 'ecost_tax_excluded'
@ -211,24 +201,18 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_1->{tax_value_on_ordering},
got => $order_1_1->tax_value_on_ordering,
expected => 7.03,
conf => '1 1',
field => 'tax_value'
}
);
$order_1_1 = C4::Acquisition::populate_order_with_prices(
{
order => $order_1_1,
booksellerid => 4,
receiving => 1,
}
);
$order_1_1->populate_with_prices_for_receiving();
compare(
{
got => $order_1_1->{unitprice_tax_included},
got => $order_1_1->unitprice_tax_included,
expected => 73.80,
conf => '1 1',
field => 'unitprice_tax_included'
@ -236,7 +220,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_1->{unitprice_tax_excluded},
got => $order_1_1->unitprice_tax_excluded,
expected => 70.29,
conf => '1 1',
field => 'unitprice_tax_excluded'
@ -244,15 +228,17 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_1->{tax_value_on_receiving},
got => $order_1_1->tax_value_on_receiving,
expected => 7.03,
conf => '1 1',
field => 'tax_value'
}
);
# When unitprice is 0.00 C4::Acquisition->populate_order_with_prices() falls back to using ecost_tax_included and ecost_tax_excluded
$order_1_1 = {
# When unitprice is 0.00
# Koha::Acquisition::Order::populate_with_prices_for_ordering() falls
# back to using ecost_tax_included and ecost_tax_excluded
$order_1_1 = Koha::Acquisition::Order->new({
biblionumber => $biblionumber_1_1,
quantity => 1,
listprice => 10,
@ -262,22 +248,17 @@ for my $currency_format ( qw( US FR ) ) {
invoiceid => $invoiceid_1_1,
rrp => 10.00,
ecost => 10.00,
tax_rate => 0.1500,
tax_rate_on_ordering => 0.1500,
tax_rate_on_receiving => 0.1500,
discount => 0,
datereceived => $today
};
});
$order_1_1 = C4::Acquisition::populate_order_with_prices(
{
order => $order_1_1,
booksellerid => 4,
ordering => 1,
}
);
$order_1_1->populate_with_prices_for_ordering();
compare(
{
got => $order_1_1->{ecost_tax_included},
got => $order_1_1->ecost_tax_included,
expected => 10.00,
conf => '1 1',
field => 'ecost_tax_included'
@ -285,7 +266,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_1->{ecost_tax_excluded},
got => $order_1_1->ecost_tax_excluded,
expected => 8.70,
conf => '1 1',
field => 'ecost_tax_excluded'
@ -293,7 +274,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_1->{tax_value_on_ordering},
got => $order_1_1->tax_value_on_ordering,
expected => 1.30,
conf => '1 1',
field => 'tax_value'
@ -305,32 +286,27 @@ for my $currency_format ( qw( US FR ) ) {
plan tests => 9;
my $biblionumber_1_0 = 44;
my $order_1_0 = {
my $order_1_0 = Koha::Acquisition::Order->new({
biblionumber => $biblionumber_1_0,
quantity => 2,
listprice => 82,
unitprice => 0,
quantityreceived => 2,
basketno => $basketno_1_1,
basketno => $basketno_1_0,
invoiceid => $invoiceid_1_1,
rrp => 82.00,
ecost => 73.80,
tax_rate => 0.0500,
tax_rate_on_ordering => 0.0500,
tax_rate_on_receiving => 0.0500,
discount => 10,
datereceived => $today
};
});
$order_1_0 = C4::Acquisition::populate_order_with_prices(
{
order => $order_1_0,
booksellerid => 3,
ordering => 1,
}
);
$order_1_0->populate_with_prices_for_ordering();
compare(
{
got => $order_1_0->{rrp_tax_included},
got => $order_1_0->rrp_tax_included,
expected => 82,
conf => '1 0',
field => 'rrp_tax_included'
@ -338,7 +314,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_0->{rrp_tax_excluded},
got => $order_1_0->rrp_tax_excluded,
expected => 78.10,
conf => '1 0',
field => 'rrp_tax_excluded'
@ -346,7 +322,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_0->{ecost_tax_included},
got => $order_1_0->ecost_tax_included,
expected => 73.80,
conf => '1 0',
field => 'ecost_tax_included'
@ -354,7 +330,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_0->{ecost_tax_excluded},
got => $order_1_0->ecost_tax_excluded,
expected => 70.29,
conf => '1 0',
field => 'ecost_tax_excluded'
@ -364,41 +340,30 @@ for my $currency_format ( qw( US FR ) ) {
# (note that in addorder.pl and addorderiso2709 the unitprice may/will be set to the ecost
compare(
{
got => $order_1_0->{tax_value_on_ordering},
got => $order_1_0->tax_value_on_ordering,
expected => 7.03,
conf => '1 0',
field => 'tax_value'
}
);
$order_1_0->{unitprice} = 70.29;
$order_1_0 = C4::Acquisition::populate_order_with_prices(
{
order => $order_1_0,
booksellerid => 3,
ordering => 1,
}
);
$order_1_0->unitprice(70.29);
$order_1_0->populate_with_prices_for_ordering();
# If a unitprice is provided at ordering, we calculate the tax from that
compare(
{
got => $order_1_0->{tax_value_on_ordering},
got => $order_1_0->tax_value_on_ordering,
expected => 6.69,
conf => '1 0',
field => 'tax_value'
}
);
$order_1_0 = C4::Acquisition::populate_order_with_prices(
{
order => $order_1_0,
booksellerid => 3,
receiving => 1,
}
);
$order_1_0->populate_with_prices_for_receiving();
compare(
{
got => $order_1_0->{unitprice_tax_included},
got => $order_1_0->unitprice_tax_included,
expected => 73.80,
conf => '1 0',
field => 'unitprice_tax_included'
@ -406,7 +371,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_0->{unitprice_tax_excluded},
got => $order_1_0->unitprice_tax_excluded,
expected => 70.29,
conf => '1 0',
field => 'unitprice_tax_excluded'
@ -414,7 +379,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_0->{tax_value_on_receiving},
got => $order_1_0->tax_value_on_receiving,
expected => 7.03,
conf => '1 0',
field => 'tax_value'
@ -426,32 +391,27 @@ for my $currency_format ( qw( US FR ) ) {
plan tests => 9;
my $biblionumber_0_1 = 45;
my $order_0_1 = {
my $order_0_1 = Koha::Acquisition::Order->new({
biblionumber => $biblionumber_0_1,
quantity => 2,
listprice => 82,
unitprice => 0,
quantityreceived => 2,
basketno => $basketno_1_1,
basketno => $basketno_0_1,
invoiceid => $invoiceid_1_1,
rrp => 82.00,
ecost => 73.80,
tax_rate => 0.0500,
tax_rate_on_ordering => 0.0500,
tax_rate_on_receiving => 0.0500,
discount => 10,
datereceived => $today
};
});
$order_0_1 = C4::Acquisition::populate_order_with_prices(
{
order => $order_0_1,
booksellerid => 2,
ordering => 1,
}
);
$order_0_1->populate_with_prices_for_ordering();
compare(
{
got => $order_0_1->{rrp_tax_included},
got => $order_0_1->rrp_tax_included,
expected => 86.10,
conf => '0 1',
field => 'rrp_tax_included'
@ -459,7 +419,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_0_1->{rrp_tax_excluded},
got => $order_0_1->rrp_tax_excluded,
expected => 82.00,
conf => '0 1',
field => 'rrp_tax_excluded'
@ -467,7 +427,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_0_1->{ecost_tax_included},
got => $order_0_1->ecost_tax_included,
expected => 77.49,
conf => '0 1',
field => 'ecost_tax_included'
@ -475,7 +435,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_0_1->{ecost_tax_excluded},
got => $order_0_1->ecost_tax_excluded,
expected => 73.80,
conf => '0 1',
field => 'ecost_tax_excluded'
@ -485,40 +445,29 @@ for my $currency_format ( qw( US FR ) ) {
# (note that in addorder.pl and addorderiso2709 the unitprice may/will be set to the ecost
compare(
{
got => $order_0_1->{tax_value_on_ordering},
got => $order_0_1->tax_value_on_ordering,
expected => 7.38,
conf => '0 1',
field => 'tax_value'
}
);
$order_0_1->{unitprice} = 77.490000;
$order_0_1 = C4::Acquisition::populate_order_with_prices(
{
order => $order_0_1,
booksellerid => 2,
ordering => 1,
}
);
$order_0_1->unitprice(77.490000);
$order_0_1->populate_with_prices_for_ordering();
# If a unitprice is provided at ordering, we calculate the tax from that
compare(
{
got => $order_0_1->{tax_value_on_ordering},
got => $order_0_1->tax_value_on_ordering,
expected => 7.75,
conf => '0 1',
field => 'tax_value'
}
);
$order_0_1 = C4::Acquisition::populate_order_with_prices(
{
order => $order_0_1,
booksellerid => 2,
receiving => 1,
}
);
$order_0_1->populate_with_prices_for_receiving();
compare(
{
got => $order_0_1->{unitprice_tax_included},
got => $order_0_1->unitprice_tax_included,
expected => 77.49,
conf => '0 1',
field => 'unitprice_tax_included'
@ -526,7 +475,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_0_1->{unitprice_tax_excluded},
got => $order_0_1->unitprice_tax_excluded,
expected => 73.80,
conf => '0 1',
field => 'unitprice_tax_excluded'
@ -534,14 +483,13 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_0_1->{tax_value_on_receiving},
got => $order_0_1->tax_value_on_receiving,
expected => 7.38,
conf => '0 1',
field => 'tax_value'
}
);
};
}
sub compare {

View File

@ -3,9 +3,10 @@
use Modern::Perl;
use Test::More tests => 44;
use C4::Acquisition qw( populate_order_with_prices );
use C4::Context;
use Koha::Database;
use Koha::Acquisition::Bookseller;
use Koha::Acquisition::Order;
use t::lib::TestBuilder;
use t::lib::Mocks;
@ -37,158 +38,135 @@ my $bookseller_exc_tax = Koha::Acquisition::Bookseller->new(
}
)->store;
my $order_exc_tax = {
tax_rate => .1965,
my $basket_exc_tax = Koha::Acquisition::Basket->new(
{
basketname => 'Basket tax excluded',
booksellerid => $bookseller_exc_tax->id,
}
)->store;
my $order_exc_tax = Koha::Acquisition::Order->new({
tax_rate_on_ordering => .1965,
tax_rate_on_receiving => .1965,
discount => .42,
rrp => 16.99,
unitprice => "0.00",
quantity => 8,
};
basketno => $basket_exc_tax->basketno,
});
#Vendor prices exclude tax, no rounding, ordering
t::lib::Mocks::mock_preference('OrderPriceRounding', '');
my $order_with_prices = C4::Acquisition::populate_order_with_prices({
ordering => 1,
booksellerid => $bookseller_exc_tax->id,
order => $order_exc_tax,
});
$order_exc_tax->populate_with_prices_for_ordering();
is( $order_with_prices->{rrp_tax_excluded}+0 ,16.99 ,"Ordering tax excluded, no round: rrp tax excluded is rrp");
is( $order_with_prices->{rrp_tax_included}+0 ,20.328535 ,"Ordering tax excluded, no round: rrp tax included is rr tax excluded * (1 + tax rate on ordering)");
is( $order_with_prices->{ecost_tax_excluded}+0 ,9.8542 ,"Ordering tax excluded, no round: ecost tax excluded is rrp * ( 1 - discount )");
is( $order_with_prices->{ecost_tax_included}+0 ,11.7905503 ,"Ordering tax excluded, no round: ecost tax included is ecost tax excluded * (1 + tax rate on ordering)");
is( $order_with_prices->{tax_value_on_ordering}+0 ,15.4908024 ,"Ordering tax excluded, no round: tax value on ordering is quantity * ecost_tax_excluded * tax rate on ordering if no unitprice");
is( $order_exc_tax->rrp_tax_excluded+0 ,16.99 ,"Ordering tax excluded, no round: rrp tax excluded is rrp");
is( $order_exc_tax->rrp_tax_included+0 ,20.328535 ,"Ordering tax excluded, no round: rrp tax included is rr tax excluded * (1 + tax rate on ordering)");
is( $order_exc_tax->ecost_tax_excluded+0 ,9.8542 ,"Ordering tax excluded, no round: ecost tax excluded is rrp * ( 1 - discount )");
is( $order_exc_tax->ecost_tax_included+0 ,11.7905503 ,"Ordering tax excluded, no round: ecost tax included is ecost tax excluded * (1 + tax rate on ordering)");
is( $order_exc_tax->tax_value_on_ordering+0 ,15.4908024 ,"Ordering tax excluded, no round: tax value on ordering is quantity * ecost_tax_excluded * tax rate on ordering if no unitprice");
$order_exc_tax->{unitprice} = 9.85;
$order_exc_tax->unitprice(9.85);
$order_with_prices = C4::Acquisition::populate_order_with_prices({
ordering => 1,
booksellerid => $bookseller_exc_tax->id,
order => $order_exc_tax,
});
$order_exc_tax->populate_with_prices_for_ordering();
is( $order_with_prices->{unitprice_tax_excluded}+0 ,9.85 ,"Ordering tax excluded, no round: rrp tax excluded is rrp");
is( $order_with_prices->{unitprice_tax_included}+0 ,11.785525 ,"Ordering tax excluded, no round: rrp tax included is rr tax excluded * (1 + tax rate on ordering)");
is( $order_with_prices->{tax_value_on_ordering}+0 ,15.4842 ,"Ordering tax excluded, no round: tax value on ordering is quantity * unitprice_tax_excluded * tax rate on ordering if unitprice");
is( $order_exc_tax->unitprice_tax_excluded+0 ,9.85 ,"Ordering tax excluded, no round: rrp tax excluded is rrp");
is( $order_exc_tax->unitprice_tax_included+0 ,11.785525 ,"Ordering tax excluded, no round: rrp tax included is rr tax excluded * (1 + tax rate on ordering)");
is( $order_exc_tax->tax_value_on_ordering+0 ,15.4842 ,"Ordering tax excluded, no round: tax value on ordering is quantity * unitprice_tax_excluded * tax rate on ordering if unitprice");
#Vendor prices exclude tax, no rounding, receiving
$order_with_prices = C4::Acquisition::populate_order_with_prices({
receiving => 1,
booksellerid => $bookseller_exc_tax->id,
order => $order_exc_tax,
});
$order_exc_tax->populate_with_prices_for_receiving();
is( $order_with_prices->{unitprice}+0 ,9.8542 ,"Receiving tax excluded, no round, rounded ecost tax excluded = rounded unitprice : unitprice is ecost tax excluded");
is( $order_with_prices->{unitprice_tax_excluded}+0 ,9.8542 ,"Receiving tax excluded, no round, rounded ecost tax excluded = rounded unitprice : unitprice tax excluded is ecost tax excluded");
is( $order_with_prices->{unitprice_tax_included}+0 ,11.7905503 ,"Receiving tax excluded, no round: unitprice tax included is unitprice tax excluded * (1 + tax rate on ordering)");
is( $order_with_prices->{tax_value_on_receiving}+0 ,15.4908024 ,"Receiving tax excluded, no round: tax value on receiving is quantity * unitprice_tax_excluded * tax rate on receiving");
is( $order_exc_tax->unitprice+0 ,9.8542 ,"Receiving tax excluded, no round, rounded ecost tax excluded = rounded unitprice : unitprice is ecost tax excluded");
is( $order_exc_tax->unitprice_tax_excluded+0 ,9.8542 ,"Receiving tax excluded, no round, rounded ecost tax excluded = rounded unitprice : unitprice tax excluded is ecost tax excluded");
is( $order_exc_tax->unitprice_tax_included+0 ,11.7905503 ,"Receiving tax excluded, no round: unitprice tax included is unitprice tax excluded * (1 + tax rate on ordering)");
is( $order_exc_tax->tax_value_on_receiving+0 ,15.4908024 ,"Receiving tax excluded, no round: tax value on receiving is quantity * unitprice_tax_excluded * tax rate on receiving");
$order_exc_tax->{unitprice} = 9.85;
$order_exc_tax->unitprice(9.85);
#populate order with prices updates the passed in order hashref
#we need to reset after additional tests and changes
#Vendor prices exclude tax, rounding to nearest cent, ordering
t::lib::Mocks::mock_preference('OrderPriceRounding', 'nearest_cent');
$order_with_prices = C4::Acquisition::populate_order_with_prices({
ordering => 1,
booksellerid => $bookseller_exc_tax->id,
order => $order_exc_tax,
});
$order_exc_tax->populate_with_prices_for_ordering();
is( $order_with_prices->{unitprice_tax_excluded}+0 ,9.85 ,"Ordering tax excluded, round: unitprice tax excluded is unitprice");
is( $order_with_prices->{unitprice_tax_included}+0 ,11.785525 ,"Ordering tax excluded, round: unitprice tax included is unitprice tax excluded * (1 + tax rate on ordering)");
is( $order_with_prices->{rrp_tax_excluded}+0 ,16.99 ,"Ordering tax excluded, round: rrp tax excluded is rrp");
is( $order_with_prices->{rrp_tax_included}+0 ,20.328535 ,"Ordering tax excluded, round: rrp tax included is rr tax excluded * (1 + tax rate on ordering)");
is( $order_with_prices->{ecost_tax_excluded}+0 ,9.8542 ,"Ordering tax excluded, round: ecost tax excluded is rrp * ( 1 - discount )");
is( $order_with_prices->{ecost_tax_included}+0 ,11.7905503 ,"Ordering tax excluded, round: ecost tax included is ecost tax excluded * (1 + tax rate on ordering)");
is( $order_with_prices->{tax_value_on_ordering}+0 ,15.4842 ,"Ordering tax excluded, round: tax value on ordering is quantity * ecost_tax_excluded * tax rate on ordering");
is( $order_exc_tax->unitprice_tax_excluded+0 ,9.85 ,"Ordering tax excluded, round: unitprice tax excluded is unitprice");
is( $order_exc_tax->unitprice_tax_included+0 ,11.785525 ,"Ordering tax excluded, round: unitprice tax included is unitprice tax excluded * (1 + tax rate on ordering)");
is( $order_exc_tax->rrp_tax_excluded+0 ,16.99 ,"Ordering tax excluded, round: rrp tax excluded is rrp");
is( $order_exc_tax->rrp_tax_included+0 ,20.328535 ,"Ordering tax excluded, round: rrp tax included is rr tax excluded * (1 + tax rate on ordering)");
is( $order_exc_tax->ecost_tax_excluded+0 ,9.8542 ,"Ordering tax excluded, round: ecost tax excluded is rrp * ( 1 - discount )");
is( $order_exc_tax->ecost_tax_included+0 ,11.7905503 ,"Ordering tax excluded, round: ecost tax included is ecost tax excluded * (1 + tax rate on ordering)");
is( $order_exc_tax->tax_value_on_ordering+0 ,15.4842 ,"Ordering tax excluded, round: tax value on ordering is quantity * ecost_tax_excluded * tax rate on ordering");
#Vendor prices exclude tax, no rounding, receiving
$order_with_prices = C4::Acquisition::populate_order_with_prices({
receiving => 1,
booksellerid => $bookseller_exc_tax->id,
order => $order_exc_tax,
});
$order_exc_tax->populate_with_prices_for_receiving();
is( $order_with_prices->{unitprice_tax_excluded}+0 ,9.8542 ,"Receiving tax excluded, round, rounded ecost tax excluded = rounded unitprice : unitprice tax excluded is ecost tax excluded");
is( $order_with_prices->{unitprice_tax_included}+0 ,11.7905503 ,"Receiving tax excluded, round: unitprice tax included is unitprice tax excluded * (1 + tax rate on ordering)");
is( $order_with_prices->{tax_value_on_receiving}+0 ,15.4842 ,"Receiving tax excluded, round: tax value on receiving is quantity * unitprice_tax_excluded * tax rate on receiving");
is( $order_exc_tax->unitprice_tax_excluded+0 ,9.8542 ,"Receiving tax excluded, round, rounded ecost tax excluded = rounded unitprice : unitprice tax excluded is ecost tax excluded");
is( $order_exc_tax->unitprice_tax_included+0 ,11.7905503 ,"Receiving tax excluded, round: unitprice tax included is unitprice tax excluded * (1 + tax rate on ordering)");
is( $order_exc_tax->tax_value_on_receiving+0 ,15.4842 ,"Receiving tax excluded, round: tax value on receiving is quantity * unitprice_tax_excluded * tax rate on receiving");
my $basket_inc_tax = Koha::Acquisition::Basket->new(
{
basketname => 'Basket tax included',
booksellerid => $bookseller_inc_tax->id,
}
)->store;
my $order_inc_tax = {
tax_rate => .1965,
my $order_inc_tax = Koha::Acquisition::Order->new({
tax_rate_on_ordering => .1965,
tax_rate_on_receiving => .1965,
discount => .42,
rrp => 20.33,
unitprice => 0.00,
quantity => 8,
};
basketno => $basket_inc_tax->basketno,
});
#Vendor prices include tax, no rounding, ordering
t::lib::Mocks::mock_preference('OrderPriceRounding', '');
$order_with_prices = C4::Acquisition::populate_order_with_prices({
ordering => 1,
booksellerid => $bookseller_inc_tax->id,
order => $order_inc_tax,
});
$order_inc_tax->populate_with_prices_for_ordering();
is( $order_with_prices->{rrp_tax_included}+0 ,20.33 ,"Ordering tax included, no round: rrp tax included is rrp");
is( $order_with_prices->{rrp_tax_excluded}+0 ,16.9912244045132 ,"Ordering tax included, no round: rrp tax excluded is rrp tax included / (1 + tax rate on ordering)");
is( $order_with_prices->{ecost_tax_included}+0 ,11.7914 ,"Ordering tax included, no round: ecost tax included is rrp tax included * (1 - discount)");
is( $order_with_prices->{ecost_tax_excluded}+0 ,9.85491015461764 ,"Ordering tax included, no round: ecost tax excluded is rrp tax excluded * ( 1 - discount )");
is( $order_with_prices->{tax_value_on_ordering}+0 ,15.4919187630589 ,"Ordering tax included, no round: tax value on ordering is ( ecost tax included - ecost tax excluded ) * quantity if no unitprice");
is( $order_inc_tax->rrp_tax_included+0 ,20.33 ,"Ordering tax included, no round: rrp tax included is rrp");
is( $order_inc_tax->rrp_tax_excluded+0 ,16.9912244045132 ,"Ordering tax included, no round: rrp tax excluded is rrp tax included / (1 + tax rate on ordering)");
is( $order_inc_tax->ecost_tax_included+0 ,11.7914 ,"Ordering tax included, no round: ecost tax included is rrp tax included * (1 - discount)");
is( $order_inc_tax->ecost_tax_excluded+0 ,9.85491015461764 ,"Ordering tax included, no round: ecost tax excluded is rrp tax excluded * ( 1 - discount )");
is( $order_inc_tax->tax_value_on_ordering+0 ,15.4919187630589 ,"Ordering tax included, no round: tax value on ordering is ( ecost tax included - ecost tax excluded ) * quantity if no unitprice");
$order_inc_tax->{unitprice} = 11.79;
$order_with_prices = C4::Acquisition::populate_order_with_prices({
ordering => 1,
booksellerid => $bookseller_inc_tax->id,
order => $order_inc_tax,
});
$order_inc_tax->unitprice(11.79);
$order_inc_tax->populate_with_prices_for_ordering();
is( $order_with_prices->{unitprice_tax_included}+0 ,11.79 ,"Ordering tax included, no round: unitprice tax included is unitprice");
is( $order_with_prices->{unitprice_tax_excluded}+0 ,9.85374007521939 ,"Ordering tax included, no round: unitprice tax excluded is unitprice tax included / (1 + tax_rate_on_ordering ");
is( $order_with_prices->{tax_value_on_ordering}+0 ,15.4900793982449 ,"Ordering tax included, no round: tax value on ordering is ( unitprice tax included - unitprice tax excluded ) * quantity if unitprice");
is( $order_inc_tax->unitprice_tax_included+0 ,11.79 ,"Ordering tax included, no round: unitprice tax included is unitprice");
is( $order_inc_tax->unitprice_tax_excluded+0 ,9.85374007521939 ,"Ordering tax included, no round: unitprice tax excluded is unitprice tax included / (1 + tax_rate_on_ordering ");
is( $order_inc_tax->tax_value_on_ordering+0 ,15.4900793982449 ,"Ordering tax included, no round: tax value on ordering is ( unitprice tax included - unitprice tax excluded ) * quantity if unitprice");
#Vendor prices include tax, no rounding, receiving
$order_with_prices = C4::Acquisition::populate_order_with_prices({
receiving => 1,
booksellerid => $bookseller_inc_tax->id,
order => $order_inc_tax,
});
$order_inc_tax->populate_with_prices_for_receiving();
is( $order_with_prices->{unitprice}+0 ,11.7914 ,"Receiving tax included, no round, rounded ecost tax excluded = rounded unitprice : unitprice is ecost tax excluded");
is( $order_with_prices->{unitprice_tax_included}+0 ,11.7914 ,"Receiving tax included, no round: unitprice tax included is unitprice");
is( $order_with_prices->{unitprice_tax_excluded}+0 ,9.85491015461764 ,"Receiving tax included, no round: unitprice tax excluded is unitprice tax included / (1 + tax rate on receiving)");
is( $order_with_prices->{tax_value_on_receiving}+0 ,15.4919187630589 ,"Receiving tax included, no round: tax value on receiving is quantity * unitprice_tax_excluded * tax rate on receiving");
is( $order_inc_tax->unitprice+0 ,11.7914 ,"Receiving tax included, no round, rounded ecost tax excluded = rounded unitprice : unitprice is ecost tax excluded");
is( $order_inc_tax->unitprice_tax_included+0 ,11.7914 ,"Receiving tax included, no round: unitprice tax included is unitprice");
is( $order_inc_tax->unitprice_tax_excluded+0 ,9.85491015461764 ,"Receiving tax included, no round: unitprice tax excluded is unitprice tax included / (1 + tax rate on receiving)");
is( $order_inc_tax->tax_value_on_receiving+0 ,15.4919187630589 ,"Receiving tax included, no round: tax value on receiving is quantity * unitprice_tax_excluded * tax rate on receiving");
#Vendor prices include tax, rounding to nearest cent, ordering
t::lib::Mocks::mock_preference('OrderPriceRounding', 'nearest_cent');
$order_inc_tax->{unitprice} = 11.79;
$order_with_prices = C4::Acquisition::populate_order_with_prices({
ordering => 1,
booksellerid => $bookseller_inc_tax->id,
order => $order_inc_tax,
});
$order_inc_tax->unitprice(11.79);
$order_inc_tax->populate_with_prices_for_ordering();
is( $order_with_prices->{unitprice_tax_included}+0 ,11.79 ,"Ordering tax included, round: unitprice tax included is unitprice");
is( $order_with_prices->{unitprice_tax_excluded}+0,9.85374007521939 ,"Ordering tax included, round: unitprice tax excluded is unitprice tax included / (1 + tax_rate_on_ordering ");
is( $order_with_prices->{rrp_tax_included}+0 ,20.33 ,"Ordering tax included, round: rrp tax included is rrp");
is( $order_with_prices->{rrp_tax_excluded}+0 ,16.9912244045132 ,"Ordering tax included, round: rrp tax excluded is rounded rrp tax included * (1 + tax rate on ordering)");
is( $order_with_prices->{ecost_tax_included}+0 ,11.7914 ,"Ordering tax included, round: ecost tax included is rounded rrp * ( 1 - discount )");
is( $order_with_prices->{ecost_tax_excluded}+0 ,9.85491015461764 ,"Ordering tax included, round: ecost tax excluded is rounded ecost tax excluded * (1 - discount)");
is( $order_with_prices->{tax_value_on_ordering}+0 ,15.52 ,"Ordering tax included, round: tax value on ordering is (ecost_tax_included - ecost_tax_excluded) * quantity");
is( $order_inc_tax->unitprice_tax_included+0 ,11.79 ,"Ordering tax included, round: unitprice tax included is unitprice");
is( $order_inc_tax->unitprice_tax_excluded+0,9.85374007521939 ,"Ordering tax included, round: unitprice tax excluded is unitprice tax included / (1 + tax_rate_on_ordering ");
is( $order_inc_tax->rrp_tax_included+0 ,20.33 ,"Ordering tax included, round: rrp tax included is rrp");
is( $order_inc_tax->rrp_tax_excluded+0 ,16.9912244045132 ,"Ordering tax included, round: rrp tax excluded is rounded rrp tax included * (1 + tax rate on ordering)");
is( $order_inc_tax->ecost_tax_included+0 ,11.7914 ,"Ordering tax included, round: ecost tax included is rounded rrp * ( 1 - discount )");
is( $order_inc_tax->ecost_tax_excluded+0 ,9.85491015461764 ,"Ordering tax included, round: ecost tax excluded is rounded ecost tax excluded * (1 - discount)");
is( $order_inc_tax->tax_value_on_ordering+0 ,15.52 ,"Ordering tax included, round: tax value on ordering is (ecost_tax_included - ecost_tax_excluded) * quantity");
#Vendor prices include tax, no rounding, receiving
$order_with_prices = C4::Acquisition::populate_order_with_prices({
receiving => 1,
booksellerid => $bookseller_inc_tax->id,
order => $order_inc_tax,
});
$order_inc_tax->populate_with_prices_for_receiving();
is( $order_with_prices->{unitprice_tax_included}+0 ,11.7914 ,"Receiving tax included, round: rounded ecost tax included = rounded unitprice : unitprice tax excluded is ecost tax included");
is( $order_with_prices->{unitprice_tax_excluded}+0 ,9.85491015461764 ,"Receiving tax included, round: unitprice tax excluded is unitprice tax included / (1 + tax rate on ordering)");
is( $order_with_prices->{tax_value_on_receiving}+0 ,15.4842 ,"Receiving tax included, round: tax value on receiving is quantity * (rounded unitprice_tax_excluded) * tax rate on receiving");
is( $order_inc_tax->unitprice_tax_included+0 ,11.7914 ,"Receiving tax included, round: rounded ecost tax included = rounded unitprice : unitprice tax excluded is ecost tax included");
is( $order_inc_tax->unitprice_tax_excluded+0 ,9.85491015461764 ,"Receiving tax included, round: unitprice tax excluded is unitprice tax included / (1 + tax rate on ordering)");
is( $order_inc_tax->tax_value_on_receiving+0 ,15.4842 ,"Receiving tax included, round: tax value on receiving is quantity * (rounded unitprice_tax_excluded) * tax rate on receiving");
$schema->storage->txn_rollback();

View File

@ -8,7 +8,7 @@ BEGIN {
}
use C4::Context;
use C4::Biblio qw( AddBiblio );
use C4::Acquisition qw( NewBasket AddInvoice GetInvoice ModReceiveOrder populate_order_with_prices );
use C4::Acquisition qw( NewBasket AddInvoice GetInvoice ModReceiveOrder );
use Koha::ActionLogs;
use Koha::Acquisition::Booksellers;
@ -37,10 +37,14 @@ my $library = $builder->build({
source => 'Branch',
});
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
$patron->store;
t::lib::Mocks::mock_userenv(
{
flags => 1,
userid => 'my_userid',
userid => $patron->userid,
borrowernumber => $patron->borrowernumber,
branch => $library->{branchcode},
}
);
@ -1073,11 +1077,9 @@ subtest 'GetBudgetSpent GetBudgetOrdered GetBudgetsPlanCell tests' => sub {
#Okay we have basically what the user would enter, now we do some maths
$spent_orderinfo = C4::Acquisition::populate_order_with_prices({
order => $spent_orderinfo,
booksellerid => $spent_orderinfo->{booksellerid},
ordering => 1,
});
my $spent_order_obj = Koha::Acquisition::Order->new($spent_orderinfo);
$spent_order_obj->populate_with_prices_for_ordering();
$spent_orderinfo = $spent_order_obj->unblessed();
#And let's place the order
@ -1160,11 +1162,9 @@ subtest 'GetBudgetSpent GetBudgetOrdered GetBudgetsPlanCell tests' => sub {
#Do our maths
$spent_orderinfo = C4::Acquisition::populate_order_with_prices({
order => $spent_orderinfo,
booksellerid => $spent_orderinfo->{booksellerid},
receiving => 1,
});
$spent_order_obj = Koha::Acquisition::Order->new($spent_orderinfo);
$spent_order_obj->populate_with_prices_for_receiving();
$spent_orderinfo = $spent_order_obj->unblessed();
my $received_order = $builder->build({ source => 'Aqorder', value => $spent_orderinfo });
#And receive a copy of the order so we have both spent and ordered values