return $sth->fetchrow;
}
-# This is *not* the good way to calcul prices
-# But it's how it works at the moment into Koha
-# This will be fixed later.
# Note this subroutine should be moved to Koha::Acquisition::Order
# Will do when a DBIC decision will be taken.
sub populate_order_with_prices {
my $discount = $order->{discount};
$discount /= 100 if $discount > 1;
- $order->{rrp} = Koha::Number::Price->new( $order->{rrp} )->round;
- $order->{ecost} = Koha::Number::Price->new( $order->{ecost} )->round;
if ($ordering) {
if ( $bookseller->{listincgst} ) {
+ # The user entered the rrp tax included
$order->{rrp_tax_included} = $order->{rrp};
- $order->{rrp_tax_excluded} = Koha::Number::Price->new(
- $order->{rrp_tax_included} / ( 1 + $order->{tax_rate} ) )->round;
- $order->{ecost_tax_included} = $order->{ecost};
- $order->{ecost_tax_excluded} = Koha::Number::Price->new(
- $order->{ecost} / ( 1 + $order->{tax_rate} ) )->round;
- $order->{tax_value} = Koha::Number::Price->new(
- ( $order->{ecost_tax_included} - $order->{ecost_tax_excluded} ) *
- $order->{quantity} )->round;
+
+ # rrp tax excluded = rrp tax included / ( 1 + tax rate )
+ $order->{rrp_tax_excluded} = $order->{rrp_tax_included} / ( 1 + $order->{tax_rate} );
+
+ # ecost tax excluded = rrp tax excluded * ( 1 - discount )
+ $order->{ecost_tax_excluded} = $order->{rrp_tax_excluded} * ( 1 - $discount );
+
+ # ecost tax included = rrp tax included ( 1 - discount )
+ $order->{ecost_tax_included} = $order->{rrp_tax_included} * ( 1 - $discount );
}
else {
+ # The user entered the rrp tax excluded
$order->{rrp_tax_excluded} = $order->{rrp};
- $order->{rrp_tax_included} = Koha::Number::Price->new(
- $order->{rrp} * ( 1 + $order->{tax_rate} ) )->round;
- $order->{ecost_tax_excluded} = $order->{ecost};
- $order->{ecost_tax_included} = Koha::Number::Price->new(
- $order->{ecost} * ( 1 + $order->{tax_rate} ) )->round;
- $order->{tax_value} = Koha::Number::Price->new(
- ( $order->{ecost_tax_included} - $order->{ecost_tax_excluded} ) *
- $order->{quantity} )->round;
+
+ # rrp tax included = rrp tax excluded * ( 1 - tax rate )
+ $order->{rrp_tax_included} = $order->{rrp_tax_excluded} * ( 1 + $order->{tax_rate} );
+
+ # 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 )
+ $order->{ecost_tax_included} =
+ $order->{rrp_tax_excluded} *
+ ( 1 + $order->{tax_rate} ) *
+ ( 1 - $discount );
}
+
+ # tax value = quantity * ecost tax excluded * tax rate
+ $order->{tax_value} = $order->{quantity} * $order->{ecost_tax_excluded} * $order->{tax_rate};
}
if ($receiving) {
- if ( $bookseller->{listincgst} ) {
- $order->{unitprice_tax_included} = Koha::Number::Price->new( $order->{unitprice} )->round;
- $order->{unitprice_tax_excluded} = Koha::Number::Price->new(
- $order->{unitprice_tax_included} / ( 1 + $order->{tax_rate} ) )->round;
+ if ( $bookseller->{invoiceincgst} ) {
+ # 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} );
}
else {
- $order->{unitprice_tax_excluded} = Koha::Number::Price->new( $order->{unitprice} )->round;
- $order->{unitprice_tax_included} = Koha::Number::Price->new(
- $order->{unitprice_tax_excluded} * ( 1 + $order->{tax_rate} ) )->round;
+ # 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} );
}
- $order->{tax_value} = Koha::Number::Price->new(
- ( $order->{unitprice_tax_included} - $order->{unitprice_tax_excluded} )
- * $order->{quantityreceived} )->round;
+ # tax value = quantity * unit price tax excluded * tax rate
+ $order->{tax_value} = $order->{quantity} * $order->{unitprice_tax_excluded} * $order->{tax_rate};
}
return $order;
$template->param( uncertainprices => 1 );
}
- $line->{total_tax_excluded} = Koha::Number::Price->new( $line->{ecost_tax_excluded} * $line->{quantity} )->format;
- $line->{total_tax_included} = Koha::Number::Price->new( $line->{ecost_tax_included} * $line->{quantity} )->format;
-
push @books_loop, $line;
$foot{$$line{tax_rate}}{tax_rate} = $$line{tax_rate};
$line{basketno} = $basketno;
$line{budget_name} = $budget->{budget_name};
+ $line{total_tax_included} = $line{ecost_tax_included} * $line{quantity};
+ $line{total_tax_excluded} = $line{ecost_tax_excluded} * $line{quantity};
+
if ( $line{uncertainprice} ) {
$line{rrp_tax_excluded} .= ' (Uncertain)';
}
} else {
$total = $total + ( $order->{ecost_tax_excluded} * $order->{quantity} );
}
- if ($bookseller->{invoiceincgst} && ! $bookseller->{listincgst} && ( $bookseller->{tax_rate} // C4::Context->preference("gist") )) {
- my $gst = $bookseller->{tax_rate} // C4::Context->preference("gist");
- $total = $total * ( $gst / 100 +1);
- }
}
$total .= " " . ($bookseller->{invoiceprice} // 0);
return $total;
my $invoiceno = $invoice->{invoicenumber};
my $booksellerid = $input->param('booksellerid');
my $cnt = 0;
-my $ecost = $input->param('ecost');
-my $rrp = $input->param('rrp');
my $bookfund = $input->param("bookfund");
my $order = GetOrder($ordernumber);
my $new_ordernumber = $ordernumber;
}
$order->{order_internalnote} = $input->param("order_internalnote");
- $order->{rrp} = $rrp;
- $order->{ecost} = $ecost;
$order->{unitprice} = $unitprice;
- # FIXME is it still useful?
my $bookseller = Koha::Acquisition::Bookseller->fetch({ id => $booksellerid });
- if ( $bookseller->{listincgst} ) {
- if ( not $bookseller->{invoiceincgst} ) {
- $order->{rrp} = $order->{rrp} * ( 1 + $order->{tax_rate} );
- $order->{ecost} = $order->{ecost} * ( 1 + $order->{tax_rate} );
- $order->{unitprice} = $order->{unitprice} * ( 1 + $order->{tax_rate} );
- }
- } else {
- if ( $bookseller->{invoiceincgst} ) {
- $order->{rrp} = $order->{rrp} / ( 1 + $order->{tax_rate} );
- $order->{ecost} = $order->{ecost} / ( 1 + $order->{tax_rate} );
- $order->{unitprice} = $order->{unitprice} / ( 1 + $order->{tax_rate} );
- }
- }
$order = C4::Acquisition::populate_order_with_prices(
{
booksellerid => $booksellerid,
dateaccessioned => $datereceived,
price => $unitprice,
- replacementprice => $rrp,
+ replacementprice => $order->{rrp},
replacementpricedate => $datereceived,
},
$biblionumber,
push @foot_loop, map {$_} values %foot;
-my $format = "%.2f";
my $budgets = GetBudgets();
my @budgets_loop;
my $shipmentcost_budgetid = $details->{shipmentcost_budgetid};
orders_loop => \@orders_loop,
foot_loop => \@foot_loop,
total_quantity => $total_quantity,
- total_tax_excluded => sprintf( $format, $total_tax_excluded ),
- total_tax_included => sprintf( $format, $total_tax_included ),
- total_tax_value => sprintf( $format, $total_tax_value ),
- total_tax_excluded_shipment => sprintf( $format, $total_tax_excluded + $details->{shipmentcost}),
- total_tax_included_shipment => sprintf( $format, $total_tax_included + $details->{shipmentcost}),
+ total_tax_excluded => $total_tax_excluded,
+ total_tax_included => $total_tax_included,
+ total_tax_value => $total_tax_value,
+ total_tax_excluded_shipment => $total_tax_excluded + $details->{shipmentcost},
+ total_tax_included_shipment => $total_tax_included + $details->{shipmentcost},
invoiceincgst => $bookseller->{invoiceincgst},
currency => Koha::Acquisition::Currencies->get_active,
budgets_loop => \@budgets_loop,
$line{budget} = GetBudgetByOrderNumber( $line{ordernumber} );
$foot{$line{tax_rate}}{tax_rate} = $line{tax_rate};
$foot{$line{tax_rate}}{tax_value} += $line{tax_value};
- $total_tax_excluded += Koha::Number::Price->new( $line{ecost_tax_excluded} * $line{quantity} )->format;
- $total_tax_included += Koha::Number::Price->new( $line{ecost_tax_included} * $line{quantity} )->format;
+ $total_tax_excluded += $line{unitprice_tax_excluded} * $line{quantity};
+ $total_tax_included += $line{unitprice_tax_included} * $line{quantity};
my $suggestion = GetSuggestionInfoFromBiblionumber($line{biblionumber});
$line{suggestionid} = $suggestion->{suggestionid};
</div>
[% END %][%# IF (AcqCreateItemReceiving) %]
</li>
- <li><label for="rrp">Replacement cost: </label><input type="text" size="20" name="rrp" id="rrp" value="[% rrp %]" /></li>
- <li><label for="ecost">Budgeted cost: </label><input type="text" size="20" name="ecost" id="ecost" value="[% ecost %]" /></li>
+
+ <li><label for="rrp">Replacement cost: </label>[% rrp | $Price %]</li>
+ <li><label for="ecost">Budgeted cost: </label>[% ecost | $Price %]</li>
<li><label for="cost">Actual cost:</label>
[% IF ( unitprice ) %]
- <input type="text" size="20" name="cost" id="cost" value="[% unitprice %]" />
+ <input type="text" size="20" name="cost" id="cost" value="[% unitprice | $Price %]" />
[% ELSE %]
- <input type="text" size="20" name="cost" id="cost" value="[% ecost %]" />
+ <input type="text" size="20" name="cost" id="cost" value="[% ecost | $Price %]" />
[% END %]</li>
<li><label for="order_internalnote">Internal note: </label><textarea name="order_internalnote" width="40" rows="8" >[% order_internalnote %]</textarea></li>
[% IF order_vendornote %]
for my $currency_format ( qw( US FR ) ) {
t::lib::Mocks::mock_preference( 'CurrencyFormat', $currency_format );
subtest 'Configuration 1: 0 0' => sub {
- plan tests => 12;
+ plan tests => 8;
$bookseller_module->mock(
'fetch',
sub {
}
);
- # Note that this configuration is correct \o/
compare(
{
got => $order_0_0->{rrp_tax_included},
field => 'tax_value'
}
);
- compare(
- {
- got => $order_0_0->{total_tax_included},
- expected => 154.98,
- conf => '0 0',
- field => 'total_tax_included'
- }
- );
- compare(
- {
- got => $order_0_0->{total_tax_excluded},
- expected => 147.60,
- conf => '0 0',
- field => 'total_tax_excluded'
- }
- );
$order_0_0 = C4::Acquisition::populate_order_with_prices(
{
}
);
- # Note that this configuration is correct \o/
compare(
{
got => $order_0_0->{unitprice_tax_included},
field => 'tax_value'
}
);
- compare(
- {
- got => $order_0_0->{total_tax_included},
- expected => 154.98,
- conf => '0 0',
- field => 'total_tax_included'
- }
- );
- compare(
- {
- got => $order_0_0->{total_tax_excluded},
- expected => 147.60,
- conf => '0 0',
- field => 'total_tax_excluded'
- }
- );
};
subtest 'Configuration 1: 1 1' => sub {
- plan tests => 12;
+ plan tests => 8;
$bookseller_module->mock(
'fetch',
sub {
}
);
- # Note that this configuration is *not* correct
- # tax_value should be 7.03 instead of 7.02
compare(
{
got => $order_1_1->{rrp_tax_included},
compare(
{
got => $order_1_1->{tax_value},
- expected => 7.02,
+ expected => 7.03,
conf => '1 1',
field => 'tax_value'
}
);
- compare(
- {
- got => $order_1_1->{total_tax_included},
- expected => 147.60,
- conf => '1 1',
- field => 'total_tax_included'
- }
- );
- compare(
- {
- got => $order_1_1->{total_tax_excluded},
- expected => 140.58,
- conf => '1 1',
- field => 'total_tax_excluded'
- }
- );
$order_1_1 = C4::Acquisition::populate_order_with_prices(
{
receiving => 1,
}
);
- # Note that this configuration is *not* correct!
- # tax_value should be 7.03
+
compare(
{
got => $order_1_1->{unitprice_tax_included},
compare(
{
got => $order_1_1->{tax_value},
- expected => 7.02,
+ expected => 7.03,
conf => '1 1',
field => 'tax_value'
}
);
- compare(
- {
- got => $order_1_1->{total_tax_included},
- expected => 147.60,
- conf => '1 1',
- field => 'total_tax_included'
- }
- );
- compare(
- {
- got => $order_1_1->{total_tax_excluded},
- expected => 140.58,
- conf => '1 1',
- field => 'total_tax_excluded'
- }
- );
};
subtest 'Configuration 1: 1 0' => sub {
- plan tests => 12;
+ plan tests => 8;
$bookseller_module->mock(
'fetch',
sub {
biblionumber => $biblionumber_1_0,
quantity => 2,
listprice => 82.000000,
- unitprice => 73.804500,
+ unitprice => 70.290000,
quantityreceived => 2,
basketno => $basketno_1_1,
invoiceid => $invoiceid_1_1,
- rrp => 82.01,
+ rrp => 82.00,
ecost => 73.80,
tax_rate => 0.0500,
discount => 10.0000,
}
);
- # Note that this configuration is *not* correct!
- # rrp_tax_included should be 82 (what we inserted!)
- # tax_value should be 7.03 instead of 7.02
-
compare(
{
got => $order_1_0->{rrp_tax_included},
- expected => 82.01,
+ expected => 82,
conf => '1 0',
field => 'rrp_tax_included'
}
compare(
{
got => $order_1_0->{tax_value},
- expected => 7.02,
+ expected => 7.03,
conf => '1 0',
field => 'tax_value'
}
);
- compare(
- {
- got => $order_1_0->{total_tax_included},
- expected => 147.60,
- conf => '1 0',
- field => 'total_tax_included'
- }
- );
- compare(
- {
- got => $order_1_0->{total_tax_excluded},
- expected => 140.58,
- conf => '1 0',
- field => 'total_tax_excluded'
- }
- );
$order_1_0 = C4::Acquisition::populate_order_with_prices(
{
receiving => 1,
}
);
- # Note that this configuration is *not* correct!
- # gstvalue should be 7.03
+
compare(
{
got => $order_1_0->{unitprice_tax_included},
compare(
{
got => $order_1_0->{tax_value},
- expected => 7.02,
+ expected => 7.03,
conf => '1 0',
field => 'tax_value'
}
);
- compare(
- {
- got => $order_1_0->{total_tax_included},
- expected => 147.60,
- conf => '1 0',
- field => 'total_tax_included'
- }
- );
- compare(
- {
- got => $order_1_0->{total_tax_excluded},
- expected => 140.58,
- conf => '1 0',
- field => 'total_tax_excluded'
- }
- );
};
subtest 'Configuration 1: 0 1' => sub {
- plan tests => 12;
+ plan tests => 8;
$bookseller_module->mock(
'fetch',
sub {
biblionumber => $biblionumber_0_1,
quantity => 2,
listprice => 82.000000,
- unitprice => 73.800000,
+ unitprice => 77.490000,
quantityreceived => 2,
basketno => $basketno_1_1,
invoiceid => $invoiceid_1_1,
}
);
- # Note that this configuration is correct \o/
compare(
{
got => $order_0_1->{rrp_tax_included},
expected => 86.10,
- conf => '1 0',
+ conf => '0 1',
field => 'rrp_tax_included'
}
);
{
got => $order_0_1->{rrp_tax_excluded},
expected => 82.00,
- conf => '1 0',
+ conf => '0 1',
field => 'rrp_tax_excluded'
}
);
{
got => $order_0_1->{ecost_tax_included},
expected => 77.49,
- conf => '1 0',
+ conf => '0 1',
field => 'ecost_tax_included'
}
);
{
got => $order_0_1->{ecost_tax_excluded},
expected => 73.80,
- conf => '1 0',
+ conf => '0 1',
field => 'ecost_tax_excluded'
}
);
{
got => $order_0_1->{tax_value},
expected => 7.38,
- conf => '1 0',
+ conf => '0 1',
field => 'tax_value'
}
);
- compare(
- {
- got => $order_0_1->{total_tax_included},
- expected => 154.98,
- conf => '1 0',
- field => 'total_tax_included'
- }
- );
- compare(
- {
- got => $order_0_1->{total_tax_excluded},
- expected => 147.60,
- conf => '1 0',
- field => 'total_tax_excluded'
- }
- );
$order_0_1 = C4::Acquisition::populate_order_with_prices(
{
receiving => 1,
}
);
- # Note that this configuration is correct
+
compare(
{
got => $order_0_1->{unitprice_tax_included},
field => 'tax_value'
}
);
- compare(
- {
- got => $order_0_1->{total_tax_included},
- expected => 154.98,
- conf => '0 1',
- field => 'total_tax_included'
- }
- );
- compare(
- {
- got => $order_0_1->{total_tax_excluded},
- expected => 147.60,
- conf => '0 1',
- field => 'total_tax_excluded'
- }
- );
};
}