Bug 13001: Refactor VAT and price calculation - parcel page
Bug 12969 introduces a subroutine to centralize VAT and prices calculation. It should be use in the acqui/parcel.pl script. Test plan: 1/ Create 4 suppliers with the different configurations 2/ Create a basket and create several orders 3/ Go on the parcel page 4/ You should see, on the "pending orders" table, the same prices as before this patch. Note that the prices are now correctly formated. You could see one change for the supplier configuration 3 (1 0): If the cost of the item is 82, discount 10% and vat 5%: The "Order cost" = 140.58 instead of 140.57. Indeed, before this patch, the order cost was wrong, now you should have 70.29*2 = 140.58 ( before: 140.58 + 7.03 = 147.61 now: 140.58 + 7.02 = 147.60 ) 5/ Receive the items and return on the parcel page Now the "Already received" table with the same prices as before this patch. Note some differences too: - There was a td tag missing, the table was badly formated, it's now fixed (column below the "Cancel receipt" link). - The prices are now correctly formated. - For the configuration 2 (1 1), if the cost of the item is 82, discount 10% and vat 5%: ( before: 140.57 + 7.03 = 147.60 now: 140.58 + 7.02 = 147.60 ) Note that 7.03 is the "correct" value, but on all other pages, 7.02 is displayed. To be consistent, we should display the same prices everywhere. Signed-off-by: Paola Rossi <paola.rossi@cineca.it> Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de> Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>
This commit is contained in:
parent
229cb65629
commit
eed14b080d
2 changed files with 40 additions and 87 deletions
104
acqui/parcel.pl
104
acqui/parcel.pl
|
@ -75,43 +75,6 @@ use JSON;
|
|||
my $input=new CGI;
|
||||
my $sticky_filters = $input->param('sticky_filters') || 0;
|
||||
|
||||
sub get_value_with_gst_params {
|
||||
my $value = shift;
|
||||
my $gstrate = shift;
|
||||
my $bookseller = shift;
|
||||
if ( $bookseller->{listincgst} ) {
|
||||
if ( $bookseller->{invoiceincgst} ) {
|
||||
return $value;
|
||||
} else {
|
||||
return $value / ( 1 + $gstrate );
|
||||
}
|
||||
} else {
|
||||
if ( $bookseller->{invoiceincgst} ) {
|
||||
return $value * ( 1 + $gstrate );
|
||||
} else {
|
||||
return $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub get_gste {
|
||||
my $value = shift;
|
||||
my $gstrate = shift;
|
||||
my $bookseller = shift;
|
||||
return $bookseller->{invoiceincgst}
|
||||
? $value / ( 1 + $gstrate )
|
||||
: $value;
|
||||
}
|
||||
|
||||
sub get_gst {
|
||||
my $value = shift;
|
||||
my $gstrate = shift;
|
||||
my $bookseller = shift;
|
||||
return $bookseller->{invoiceincgst}
|
||||
? $value / ( 1 + $gstrate ) * $gstrate
|
||||
: $value * ( 1 + $gstrate ) - $value;
|
||||
}
|
||||
|
||||
my ($template, $loggedinuser, $cookie)
|
||||
= get_template_and_user({template_name => "acqui/parcel.tt",
|
||||
query => $input,
|
||||
|
@ -151,29 +114,30 @@ my $bookseller = Koha::Acquisition::Bookseller->fetch({ id => $booksellerid });
|
|||
my $gst = $bookseller->{gstrate} // C4::Context->preference("gist") // 0;
|
||||
my $datereceived = C4::Dates->new();
|
||||
|
||||
my $cfstr = "%.2f"; # currency format string -- could get this from currency table.
|
||||
my @orders = @{ $invoice->{orders} };
|
||||
my $countlines = scalar @orders;
|
||||
my $totalprice = 0;
|
||||
my $totalquantity = 0;
|
||||
my $total;
|
||||
my @loop_received = ();
|
||||
my @book_foot_loop;
|
||||
my %foot;
|
||||
my $total_quantity = 0;
|
||||
my $total_gste = 0;
|
||||
my $total_gsti = 0;
|
||||
|
||||
for my $order ( @orders ) {
|
||||
$order->{unitprice} = get_value_with_gst_params( $order->{unitprice}, $order->{gstrate}, $bookseller );
|
||||
$total = ( $order->{unitprice} ) * $order->{quantityreceived};
|
||||
$order = C4::Acquisition::populate_order_with_prices({ order => $order, booksellerid => $bookseller->{id}, receiving => 1, ordering => 1 });
|
||||
$order->{'unitprice'} += 0;
|
||||
|
||||
if ( $bookseller->{listincgst} and not $bookseller->{invoiceincgst} ) {
|
||||
$order->{ecost} = $order->{ecostgste};
|
||||
$order->{unitprice} = $order->{unitpricegste};
|
||||
}
|
||||
elsif ( not $bookseller->{listinct} and $bookseller->{invoiceincgst} ) {
|
||||
$order->{ecost} = $order->{ecostgsti};
|
||||
$order->{unitprice} = $order->{unitpricegsti};
|
||||
}
|
||||
$order->{total} = $order->{ecost} * $order->{quantity};
|
||||
|
||||
my %line = %{ $order };
|
||||
my $ecost = get_value_with_gst_params( $line{ecost}, $line{gstrate}, $bookseller );
|
||||
$line{ecost} = sprintf( "%.2f", $ecost );
|
||||
$line{invoice} = $invoice->{invoicenumber};
|
||||
$line{total} = sprintf($cfstr, $total);
|
||||
$line{booksellerid} = $invoice->{booksellerid};
|
||||
$line{holds} = 0;
|
||||
my @itemnumbers = GetItemnumbersFromOrder( $order->{ordernumber} );
|
||||
for my $itemnumber ( @itemnumbers ) {
|
||||
|
@ -181,15 +145,10 @@ for my $order ( @orders ) {
|
|||
$line{holds} += scalar( @$holds );
|
||||
}
|
||||
$line{budget} = GetBudgetByOrderNumber( $line{ordernumber} );
|
||||
$totalprice += $order->{unitprice};
|
||||
$line{unitprice} = sprintf( $cfstr, $order->{unitprice} );
|
||||
my $gste = get_gste( $line{total}, $line{gstrate}, $bookseller );
|
||||
my $gst = get_gst( $line{total}, $line{gstrate}, $bookseller );
|
||||
$foot{$line{gstrate}}{gstrate} = $line{gstrate};
|
||||
$foot{$line{gstrate}}{value} += sprintf( "%.2f", $gst );
|
||||
$total_quantity += $line{quantity};
|
||||
$total_gste += $gste;
|
||||
$total_gsti += $gste + $gst;
|
||||
$foot{$line{gstrate}}{gstvalue} += $line{gstvalue};
|
||||
$total_gste += $line{totalgste};
|
||||
$total_gsti += $line{totalgsti};
|
||||
|
||||
my $suggestion = GetSuggestionInfoFromBiblionumber($line{biblionumber});
|
||||
$line{suggestionid} = $suggestion->{suggestionid};
|
||||
|
@ -209,8 +168,6 @@ for my $order ( @orders ) {
|
|||
$line{budget_name} = $budget->{'budget_name'};
|
||||
|
||||
push @loop_received, \%line;
|
||||
$totalquantity += $order->{quantityreceived};
|
||||
|
||||
}
|
||||
push @book_foot_loop, map { $_ } values %foot;
|
||||
|
||||
|
@ -258,22 +215,21 @@ unless( defined $invoice->{closedate} ) {
|
|||
my $countpendings = scalar @$pendingorders;
|
||||
|
||||
for (my $i = 0 ; $i < $countpendings ; $i++) {
|
||||
my %line;
|
||||
%line = %{$pendingorders->[$i]};
|
||||
my $order = $pendingorders->[$i];
|
||||
$order = C4::Acquisition::populate_order_with_prices({ order => $order, booksellerid => $bookseller->{id}, receiving => 1, ordering => 1 });
|
||||
|
||||
if ( $bookseller->{listincgst} and not $bookseller->{invoiceincgst} ) {
|
||||
$order->{ecost} = $order->{ecostgste};
|
||||
} elsif ( not $bookseller->{listinct} and $bookseller->{invoiceincgst} ) {
|
||||
$order->{ecost} = $order->{ecostgsti};
|
||||
}
|
||||
$order->{total} = $order->{ecost} * $order->{quantity};
|
||||
|
||||
my %line = %$order;
|
||||
|
||||
my $ecost = get_value_with_gst_params( $line{ecost}, $line{gstrate}, $bookseller );
|
||||
$line{unitprice} = get_value_with_gst_params( $line{unitprice}, $line{gstrate}, $bookseller );
|
||||
$line{quantity} += 0;
|
||||
$line{quantityreceived} += 0;
|
||||
$line{unitprice}+=0;
|
||||
$line{ecost} = sprintf( "%.2f", $ecost );
|
||||
$line{ordertotal} = sprintf( "%.2f", $ecost * $line{quantity} );
|
||||
$line{unitprice} = sprintf("%.2f",$line{unitprice});
|
||||
$line{invoice} = $invoice;
|
||||
$line{booksellerid} = $booksellerid;
|
||||
|
||||
|
||||
|
||||
my $biblionumber = $line{'biblionumber'};
|
||||
my $countbiblio = CountBiblioInOrders($biblionumber);
|
||||
my $ordernumber = $line{'ordernumber'};
|
||||
|
@ -327,16 +283,12 @@ $template->param(
|
|||
formatteddatereceived => $datereceived->output(),
|
||||
name => $bookseller->{'name'},
|
||||
booksellerid => $bookseller->{id},
|
||||
countreceived => $countlines,
|
||||
loop_received => \@loop_received,
|
||||
loop_orders => \@loop_orders,
|
||||
book_foot_loop => \@book_foot_loop,
|
||||
totalprice => sprintf($cfstr, $totalprice),
|
||||
totalquantity => $totalquantity,
|
||||
(uc(C4::Context->preference("marcflavour"))) => 1,
|
||||
total_quantity => $total_quantity,
|
||||
total_gste => sprintf( "%.2f", $total_gste ),
|
||||
total_gsti => sprintf( "%.2f", $total_gsti ),
|
||||
total_gste => $total_gste,
|
||||
total_gsti => $total_gsti,
|
||||
sticky_filters => $sticky_filters,
|
||||
);
|
||||
output_html_with_http_headers $input, $cookie, $template->output;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
[% USE Koha %]
|
||||
[% USE Price %]
|
||||
[% USE currency = format('%.2f') -%]
|
||||
[% INCLUDE 'doc-head-open.inc' %]
|
||||
<title>Koha › Acquisitions › [% IF ( date ) %]
|
||||
|
@ -275,8 +276,8 @@
|
|||
</td>
|
||||
<td><a href="/cgi-bin/koha/catalogue/showmarc.pl?id=[% loop_order.biblionumber %]" title="MARC" rel="gb_page_center[600,500]">MARC</a> | <a href="/cgi-bin/koha/catalogue/showmarc.pl?viewas=card&id=[% loop_order.biblionumber %]" title="MARC" rel="gb_page_center[600,500]">Card</a></td>
|
||||
<td>[% loop_order.quantity %]</td>
|
||||
<td>[% loop_order.ecost %]</td>
|
||||
<td>[% loop_order.ordertotal %]</td>
|
||||
<td>[% loop_order.ecost | $Price %]</td>
|
||||
<td>[% loop_order.total | $Price %]</td>
|
||||
<td>[% loop_order.budget_name %]</td>
|
||||
<td>
|
||||
<a href="orderreceive.pl?ordernumber=[% loop_order.ordernumber %]&invoiceid=[% invoiceid %]">Receive</a>
|
||||
|
@ -366,27 +367,27 @@
|
|||
<tr>
|
||||
<td colspan="6" class="total">(Tax exc.)</td>
|
||||
<td colspan="2"><i>Subtotal for</i> [% funds.$key.budget_name %]</td>
|
||||
<td>[% currency( funds.$key.estimated ) %]</td>
|
||||
<td>[% currency( funds.$key.actual ) %]</td>
|
||||
<td>[% funds.$key.estimated | $Price %]</td>
|
||||
<td>[% funds.$key.actual | $Price %]</td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
[% END %]
|
||||
<tr>
|
||||
<th colspan="10" class="total">Total tax exc.</th>
|
||||
<th>[% total_gste %]</th>
|
||||
<th>[% total_gste | $Price %]</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
[% FOREACH book_foot IN book_foot_loop %]
|
||||
<tr>
|
||||
<th colspan="10">Total (GST [% book_foot.gstrate * 100 | format ("%.1f") %]%)</th>
|
||||
<th>[% book_foot.value %]</th>
|
||||
<th colspan="10">Total (GST [% book_foot.gstrate * 100 | $Price %]%)</th>
|
||||
<th>[% book_foot.gstvalue | $Price %]</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
[% END %]
|
||||
<tr>
|
||||
<th colspan="10" class="total">Total tax inc.</th>
|
||||
<th>[% total_gsti %]</th>
|
||||
<th>[% total_gsti | $Price %]</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</tfoot>
|
||||
|
@ -427,9 +428,9 @@
|
|||
<td><a href="/cgi-bin/koha/catalogue/showmarc.pl?id=[% order.biblionumber %]" title="MARC" rel="gb_page_center[600,500]">MARC</a> | <a href="/cgi-bin/koha/catalogue/showmarc.pl?viewas=card&id=[% order.biblionumber %]" title="MARC" rel="gb_page_center[600,500]">Card</a></td>
|
||||
<td>[% order.quantityreceived %]</td>
|
||||
<td>[% order.budget.budget_name %]</td>
|
||||
<td>[% order.ecost %]</td>
|
||||
<td>[% order.unitprice %]</td>
|
||||
<td>[% order.total %]</td>
|
||||
<td>[% order.ecost | $Price %]</td>
|
||||
<td>[% order.unitprice | $Price %]</td>
|
||||
<td>[% order.total | $Price %]</td>
|
||||
<td>
|
||||
[% IF loop_receive.cannot_cancel or ( Koha.Preference("AcqCreateItem") == "receiving" and loop_receive.holds > 0 ) %]
|
||||
[% IF loop_receive.cannot_cancel %]
|
||||
|
|
Loading…
Reference in a new issue