Bug 13323: Tax rate can change on receiving

This commit permits to update the tax rate on receiving.

Signed-off-by: Laurence Rault <laurence.rault@biblibre.com>

Signed-off-by: Francois Charbonnier <francois.charbonnier@inlibro.com>

Signed-off-by: Sonia Bouis <sonia.bouis@univ-lyon3.fr>
Signed-off-by: Sonia Bouis <koha@univ-lyon3.fr>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
This commit is contained in:
Jonathan Druart 2014-11-19 17:01:17 +01:00 committed by Kyle M Hall
parent 1204a7269f
commit 19398f2777
10 changed files with 98 additions and 67 deletions

View File

@ -1443,12 +1443,12 @@ sub ModReceiveOrder {
| if defined $order->{unitprice};
$query .= q|
, rrp = ?, rrp_tax_included = ?, rrp_tax_excluded = ?
| if defined $order->{rrp};
,tax_value_on_receiving = ?
| if defined $order->{tax_value_on_receiving};
$query .= q|
, ecost = ?, ecost_tax_included = ?, ecost_tax_excluded = ?
| if defined $order->{ecost};
,tax_rate_on_receiving = ?
| if defined $order->{tax_rate_on_receiving};
$query .= q|
, order_internalnote = ?
@ -1462,12 +1462,15 @@ sub ModReceiveOrder {
if ( defined $order->{unitprice} ) {
push @params, $order->{unitprice}, $order->{unitprice_tax_included}, $order->{unitprice_tax_excluded};
}
if ( defined $order->{rrp} ) {
push @params, $order->{rrp}, $order->{rrp_tax_included}, $order->{rrp_tax_excluded};
if ( defined $order->{tax_value_on_receiving} ) {
push @params, $order->{tax_value_on_receiving};
}
if ( defined $order->{ecost} ) {
push @params, $order->{ecost}, $order->{ecost_tax_included}, $order->{ecost_tax_excluded};
if ( defined $order->{tax_rate_on_receiving} ) {
push @params, $order->{tax_rate_on_receiving};
}
if ( defined $order->{order_internalnote} ) {
push @params, $order->{order_internalnote};
}
@ -2864,12 +2867,13 @@ sub populate_order_with_prices {
$discount /= 100 if $discount > 1;
if ($ordering) {
$order->{tax_rate_on_ordering} //= $order->{tax_rate};
if ( $bookseller->{listincgst} ) {
# The user entered the rrp tax included
$order->{rrp_tax_included} = $order->{rrp};
# rrp tax excluded = rrp tax included / ( 1 + tax rate )
$order->{rrp_tax_excluded} = $order->{rrp_tax_included} / ( 1 + $order->{tax_rate} );
$order->{rrp_tax_excluded} = $order->{rrp_tax_included} / ( 1 + $order->{tax_rate_on_ordering} );
# ecost tax excluded = rrp tax excluded * ( 1 - discount )
$order->{ecost_tax_excluded} = $order->{rrp_tax_excluded} * ( 1 - $discount );
@ -2882,7 +2886,7 @@ sub populate_order_with_prices {
$order->{rrp_tax_excluded} = $order->{rrp};
# rrp tax included = rrp tax excluded * ( 1 - tax rate )
$order->{rrp_tax_included} = $order->{rrp_tax_excluded} * ( 1 + $order->{tax_rate} );
$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 );
@ -2890,15 +2894,17 @@ sub populate_order_with_prices {
# ecost tax included = rrp tax excluded * ( 1 - tax rate ) * ( 1 - discount )
$order->{ecost_tax_included} =
$order->{rrp_tax_excluded} *
( 1 + $order->{tax_rate} ) *
( 1 + $order->{tax_rate_on_ordering} ) *
( 1 - $discount );
}
# tax value = quantity * ecost tax excluded * tax rate
$order->{tax_value} = $order->{quantity} * $order->{ecost_tax_excluded} * $order->{tax_rate};
$order->{tax_value_on_ordering} =
$order->{quantity} * $order->{ecost_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
@ -2910,7 +2916,7 @@ sub populate_order_with_prices {
$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} );
$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
@ -2922,12 +2928,13 @@ sub populate_order_with_prices {
# 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->{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} = $order->{quantity} * $order->{unitprice_tax_excluded} * $order->{tax_rate};
$order->{tax_value_on_receiving} = $order->{quantity} * $order->{unitprice_tax_excluded} * $order->{tax_rate_on_receiving};
}
return $order;

View File

@ -329,6 +329,9 @@ if ( $op eq 'list' ) {
$template->param( uncertainprices => 1 );
}
$line->{tax_rate} = $line->{tax_rate_on_ordering};
$line->{tax_value} = $line->{tax_value_on_ordering};
push @books_loop, $line;
$foot{$$line{tax_rate}}{tax_rate} = $$line{tax_rate};
@ -439,6 +442,8 @@ sub get_order_infos {
$line{total_tax_included} = $line{ecost_tax_included} * $line{quantity};
$line{total_tax_excluded} = $line{ecost_tax_excluded} * $line{quantity};
$line{tax_value} = $line{tax_value_on_ordering};
$line{tax_rate} = $line{tax_rate_on_ordering};
if ( $line{uncertainprice} ) {
$line{rrp_tax_excluded} .= ' (Uncertain)';

View File

@ -168,6 +168,8 @@ sub printbasketgrouppdf{
croak $@;
}
$ord->{tax_value} = $ord->{tax_value_on_ordering};
$ord->{tax_rate} = $ord->{tax_rate_on_ordering};
$ord->{total_tax_included} = $ord->{ecost_tax_included} * $ord->{quantity};
$ord->{total_tax_excluded} = $ord->{ecost_tax_excluded} * $ord->{quantity};

View File

@ -47,7 +47,7 @@ my $ordernumber = $input->param('ordernumber');
my $origquantityrec = $input->param('origquantityrec');
my $quantityrec = $input->param('quantityrec');
my $quantity = $input->param('quantity');
my $unitprice = $input->param('cost');
my $unitprice = $input->param('unitprice');
my $datereceived = $input->param('datereceived'),
my $invoiceid = $input->param('invoiceid');
my $invoice = GetInvoice($invoiceid);
@ -81,6 +81,7 @@ if ($quantityrec > $origquantityrec ) {
}
$order->{order_internalnote} = $input->param("order_internalnote");
$order->{tax_rate_on_receiving} = $input->param("tax_rate");
$order->{unitprice} = $unitprice;
my $bookseller = Koha::Acquisition::Bookseller->fetch({ id => $booksellerid });

View File

@ -127,6 +127,9 @@ foreach my $order (@$orders) {
$line->{total_tax_excluded} = Koha::Number::Price->new( $line->{unitprice_tax_excluded} * $line->{quantity} )->format;
$line->{total_tax_included} = Koha::Number::Price->new( $line->{unitprice_tax_included} * $line->{quantity} )->format;
$line->{tax_value} = $line->{tax_value_on_receiving};
$line->{tax_rate} = $line->{tax_rate_on_receiving};
$foot{$$line{tax_rate}}{tax_rate} = $$line{tax_rate};
$foot{$$line{tax_rate}}{tax_value} += $$line{tax_value};
$total_tax_value += $$line{tax_value};

View File

@ -265,7 +265,7 @@ if ( defined $subscriptionid ) {
$budget_id = $lastOrderReceived->{budgetid};
$data->{listprice} = $lastOrderReceived->{listprice};
$data->{uncertainprice} = $lastOrderReceived->{uncertainprice};
$data->{tax_rate} = $lastOrderReceived->{tax_rate};
$data->{tax_rate} = $lastOrderReceived->{tax_rate_on_ordering};
$data->{discount} = $lastOrderReceived->{discount};
$data->{rrp} = $lastOrderReceived->{rrp};
$data->{ecost} = $lastOrderReceived->{ecost};
@ -350,7 +350,7 @@ $template->param(
quantityrec => $quantity,
rrp => $data->{'rrp'},
gst_values => \@gst_values,
tax_rate => $data->{tax_rate} ? $data->{tax_rate}+0.0 : $bookseller->{tax_rate} ? $bookseller->{tax_rate}+0.0 : 0,
tax_rate => $data->{tax_rate_on_ordering} ? $data->{tax_rate_on_ordering}+0.0 : $bookseller->{tax_rate} ? $bookseller->{tax_rate}+0.0 : 0,
listprice => sprintf( "%.2f", $data->{listprice} || $data->{price} || $listprice),
total => sprintf( "%.2f", ($data->{ecost} || 0) * ($data->{'quantity'} || 0) ),
ecost => sprintf( "%.2f", $data->{ecost} || 0),

View File

@ -152,32 +152,29 @@ if ($AcqCreateItem eq 'receiving') {
}
$order->{quantityreceived} = '' if $order->{quantityreceived} == 0;
$order->{unitprice} = '' if $order->{unitprice} == 0;
my $rrp;
my $ecost;
my $unitprice;
if ( $bookseller->{listincgst} ) {
if ( $bookseller->{invoiceincgst} ) {
$rrp = $order->{rrp};
$ecost = $order->{ecost};
$unitprice = $order->{unitprice};
} else {
$rrp = $order->{rrp} / ( 1 + $order->{tax_rate} );
$ecost = $order->{ecost} / ( 1 + $order->{tax_rate} );
$unitprice = $order->{unitprice} / ( 1 + $order->{tax_rate} );
my $unitprice = $order->{unitprice};
my ( $rrp, $ecost );
if ( $bookseller->{invoiceincgst} ) {
$rrp = $order->{rrp_tax_included};
$ecost = $order->{ecost_tax_included};
unless ( $unitprice != 0 and defined $unitprice) {
$unitprice = $order->{ecost_tax_included};
}
} else {
if ( $bookseller->{invoiceincgst} ) {
$rrp = $order->{rrp} * ( 1 + $order->{tax_rate} );
$ecost = $order->{ecost} * ( 1 + $order->{tax_rate} );
$unitprice = $order->{unitprice} * ( 1 + $order->{tax_rate} );
} else {
$rrp = $order->{rrp};
$ecost = $order->{ecost};
$unitprice = $order->{unitprice};
$rrp = $order->{rrp_tax_excluded};
$ecost = $order->{ecost_tax_excluded};
unless ( $unitprice != 0 and defined $unitprice) {
$unitprice = $order->{ecost_tax_excluded};
}
}
}
my $tax_rate;
if( defined $order->{tax_rate_on_receiving} ) {
$tax_rate = $order->{tax_rate_on_receiving} + 0.0;
} else {
$tax_rate = $order->{tax_rate_on_ordering} + 0.0;
}
my $suggestion = GetSuggestionInfoFromBiblionumber($order->{biblionumber});
@ -188,6 +185,11 @@ my $budget = GetBudget( $order->{budget_id} );
my $datereceived = $order->{datereceived} ? dt_from_string( $order->{datereceived} ) : dt_from_string;
# get option values for gist syspref
my @gst_values = map {
option => $_ + 0.0
}, split( '\|', C4::Context->preference("gist") );
$template->param(
AcqCreateItem => $AcqCreateItem,
count => 1,
@ -206,8 +208,10 @@ $template->param(
quantity => $order->{'quantity'},
quantityreceivedplus1 => $order->{'quantityreceived'} + 1,
quantityreceived => $order->{'quantityreceived'},
rrp => sprintf( "%.2f", $rrp ),
ecost => sprintf( "%.2f", $ecost ),
rrp => $rrp,
ecost => $ecost,
unitprice => $unitprice,
tax_rate => $tax_rate,
memberfirstname => $member->{firstname} || "",
membersurname => $member->{surname} || "",
invoiceid => $invoice->{invoiceid},
@ -218,6 +222,7 @@ $template->param(
suggestionid => $suggestion->{suggestionid},
surnamesuggestedby => $suggestion->{surnamesuggestedby},
firstnamesuggestedby => $suggestion->{firstnamesuggestedby},
gst_values => \@gst_values,
);
my $borrower = GetMember( 'borrowernumber' => $loggedinuser );
@ -255,15 +260,6 @@ foreach my $period (@$periods) {
$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
if ( $unitprice != 0) {
$template->param(
unitprice => sprintf( "%.2f", $unitprice),
);
}
my $op = $input->param('op');
if ($op and $op eq 'edit'){
$template->param(edit => 1);

View File

@ -111,7 +111,6 @@ unless( $invoiceid and $invoice->{invoiceid} ) {
my $booksellerid = $invoice->{booksellerid};
my $bookseller = Koha::Acquisition::Bookseller->fetch({ id => $booksellerid });
my $gst = $bookseller->{tax_rate} // C4::Context->preference("gist") // 0;
my @orders = @{ $invoice->{orders} };
my $countlines = scalar @orders;
@ -147,6 +146,9 @@ for my $order ( @orders ) {
$line{holds} += scalar( @$holds );
}
$line{budget} = GetBudgetByOrderNumber( $line{ordernumber} );
$line{tax_value} = $line{tax_value_on_receiving};
$line{tax_rate} = $line{tax_rate_on_receiving};
$foot{$line{tax_rate}}{tax_rate} = $line{tax_rate};
$foot{$line{tax_rate}}{tax_value} += $line{tax_value};
$total_tax_excluded += $line{unitprice_tax_excluded} * $line{quantity};

View File

@ -263,7 +263,6 @@
<input type="hidden" name="invoiceid" value="[% invoiceid %]" />
<input type="hidden" name="ordernumber" value="[% ordernumber %]" />
<input type="hidden" name="booksellerid" value="[% booksellerid %]" />
<input type="hidden" name="tax_rate" value="[% tax_rate %]" />
</div>
<div class="yui-u">
<fieldset class="rows">
@ -330,14 +329,29 @@
[% END %][%# IF (AcqCreateItemReceiving) %]
</li>
[% IF ( gst_values ) %]
<li>
<label for="tax_rate">Tax rate: </label>
<select name="tax_rate" id="tax_rate">
[% FOREACH gst IN gst_values %]
[% IF gst.option == tax_rate %]
<option value="[% gst.option %]" selected="selected">[% gst.option * 100 | format("%.1f") %]%</option>
[% ELSE %]
<option value="[% gst.option %]">[% gst.option * 100 | format("%.1f") %]%</option>
[% END %]
[% END %]
</select>
</li>
[% ELSE %]
<input type="hidden" name="tax_rate" value="0" />
[% END %]
<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 | $Price %]" />
[% ELSE %]
<input type="text" size="20" name="cost" id="cost" value="[% ecost | $Price %]" />
[% END %]</li>
<li>
<label for="unitprice">Actual cost:</label>
<input type="text" size="20" name="unitprice" id="unitprice" value="[% unitprice | $Price %]" />
</li>
<li><label for="order_internalnote">Internal note: </label><textarea name="order_internalnote" width="40" rows="8" >[% order_internalnote %]</textarea></li>
[% IF order_vendornote %]
<li><label for="order_vendornote">Vendor note: </label><span>[% order_vendornote %]</span></li>

View File

@ -113,13 +113,14 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_0_0->{tax_value},
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,
@ -146,7 +147,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_0_0->{tax_value},
got => $order_0_0->{tax_value_on_receiving},
expected => 7.38,
conf => '0 0',
field => 'tax_value'
@ -221,7 +222,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_1->{tax_value},
got => $order_1_1->{tax_value_on_ordering},
expected => 7.03,
conf => '1 1',
field => 'tax_value'
@ -254,7 +255,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_1->{tax_value},
got => $order_1_1->{tax_value_on_receiving},
expected => 7.03,
conf => '1 1',
field => 'tax_value'
@ -329,7 +330,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_0->{tax_value},
got => $order_1_0->{tax_value_on_ordering},
expected => 7.03,
conf => '1 0',
field => 'tax_value'
@ -362,7 +363,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_1_0->{tax_value},
got => $order_1_0->{tax_value_on_receiving},
expected => 7.03,
conf => '1 0',
field => 'tax_value'
@ -437,7 +438,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_0_1->{tax_value},
got => $order_0_1->{tax_value_on_ordering},
expected => 7.38,
conf => '0 1',
field => 'tax_value'
@ -470,7 +471,7 @@ for my $currency_format ( qw( US FR ) ) {
);
compare(
{
got => $order_0_1->{tax_value},
got => $order_0_1->{tax_value_on_receiving},
expected => 7.38,
conf => '0 1',
field => 'tax_value'