Bug 12979 refactored the way to display prices.
The price format configuration was duplicated everywhere it was used.
All calls looks good except the one in admin/aqbudgetperiods.pl
In this one, the prices are formatted for an edition field (input).
This means the input is incorrectly filled even if the user does not
update the field.
At the end, maybe should we manage formatted prices everywhere, even in
inputs, but it's not in the scope of this bug.
Technically, a new subroutine format_for_editing is added to the
Koha::Number::Price module.
It should be called everywhere a price is displayed in an input field.
At the moment, it only does a sprintf("%.2f"), but it is a first step to
let the number of decimals to display configurable.
To test:
1/ Verify the issue described is fixed (editing a budget with a total
amount > 1000 (With CurrencyFormat is US or FR).
2/ Verify you can edit a fund with a total amount > 1000
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>
return Number::Format->new(%$format_params)->format_price($self->value);
}
+sub format_for_editing {
+ my ( $self, $params ) = @_;
+ return unless defined $self->value;
+
+ my $format_params = $self->_format_params( $params );
+ $format_params = {
+ %$format_params,
+ int_curr_symbol => '',
+ mon_thousands_sep => '',
+ mon_decimal_point => '.',
+ };
+
+ return Number::Format->new(%$format_params)->format_price($self->value);
+}
+
sub unformat {
my ( $self, $params ) = @_;
return unless defined $self->value;
use base qw( Template::Plugin::Filter );
use Koha::Number::Price;
+our $DYNAMIC = 1;
sub filter {
- my ( $self, $value ) = @_;
+ my ( $self, $value, $args, $config ) = @_;
$value ||= 0;
- return Koha::Number::Price->new( $value )->format;
+ $config->{on_editing} //= 0;
+ my $formatted_price;
+ return $config->{on_editing}
+ ? Koha::Number::Price->new( $value )->format_for_editing
+ : Koha::Number::Price->new( $value )->format;
}
1;
use Modern::Perl;
-use Number::Format qw(format_price);
use CGI qw ( -utf8 );
use List::Util qw/min/;
use Koha::DateUtils;
use C4::Budgets;
use C4::Debug;
-use Koha::Number::Price;
-
my $dbh = C4::Context->dbh;
my $input = new CGI;
my $budgetperiod_hash=GetBudgetPeriod($budget_period_id);
# get dropboxes
- $budgetperiod_hash->{budget_period_total} =
- Koha::Number::Price->new( $budgetperiod_hash->{budget_period_total} )
- ->format;
$template->param(
%$budgetperiod_hash
);
$dropbox_disabled = BudgetHasChildren($budget_id);
my $borrower = &GetMember( borrowernumber=>$budget->{budget_owner_id} );
$budget->{budget_owner_name} = ( $borrower ? $borrower->{'firstname'} . ' ' . $borrower->{'surname'} : '' );
- $$budget{$_}= sprintf("%.2f", $budget->{$_}) for grep{ /amount|encumb|expend/ } keys %$budget;
}
# build budget hierarchy
[% USE KohaDates %]
-[% USE format %]
[% USE Price %]
[%- BLOCK action_menu %]
<!-- ############################## -->
<label for="budget_period_total">Total amount: </label>
<input type="text" id="budget_period_total" name="budget_period_total"
- size="10" maxlength="80" value="[% budget_period_total %]" />
+ size="10" maxlength="80" value="[% budget_period_total | $Price on_editing => 1 %]" />
</li>
<li>
[% IF r.orders_moved.size > 0 %]
[% FOR order IN r.orders_moved %]
<tr>
- <td>[% r.budget.budget_name %] (id=[% r.budget.budget_id %]) Amount=[% r.budget.budget_amount | format ("%.2f") %][% IF r.unspent_moved %] ([% r.unspent_moved | format ("%.2f")%] remaining has been moved)[% END %]</td>
+ <td>[% r.budget.budget_name %] (id=[% r.budget.budget_id %]) Amount=[% r.budget.budget_amount | $Price %][% IF r.unspent_moved %] ([% r.unspent_moved | $Price %] remaining has been moved)[% END %]</td>
<td>[% order.basketname %]</td>
<td>[% order.ordernumber %]</td>
<td>Moved!</td>
[% ELSE %]
[% IF r.error == 'budget_code_not_exists' %]
<tr>
- <td>[% r.budget.budget_id %] [% r.budget.budget_amount | format ("%.2f") %][% IF r.unspent_moved %] ([% r.unspent_moved | format ("%.2f") %] remaining has been moved)[% END %]</td>
+ <td>[% r.budget.budget_id %] [% r.budget.budget_amount | $Price %][% IF r.unspent_moved %] ([% r.unspent_moved | $Price %] remaining has been moved)[% END %]</td>
<td></td>
<td></td>
<td>This fund code does not exist in the destination budget.</td>
<li>
<label style="white-space: nowrap;" for="budget_amount" class="required">Amount: </label>
- <input type="text" name="budget_amount" id="budget_amount" value="[% budget_amount %]" size="8" />
+ <input type="text" name="budget_amount" id="budget_amount" value="[% budget_amount | $Price on_editing => 1 %]" size="8" />
</li>
<li>
<label for="budget_encumb">Warning at (%): </label>
- <input type="text" name="budget_encumb" id="budget_encumb" value="[% budget_encumb %]" size="10" />
+ <input type="text" name="budget_encumb" id="budget_encumb" value="[% budget_encumb | $Price on_editing => 1 %]" size="10" />
<span class="hint">0 to disable</span>
</li>
<li>
<label for="budget_expend">Warning at (amount): </label>
- <input type="text" name="budget_expend" id="budget_expend" value="[% budget_expend %]" size="10" />
+ <input type="text" name="budget_expend" id="budget_expend" value="[% budget_expend | $Price on_editing => 1 %]" size="10" />
<span class="hint">0 to disable</span>
</li>
use Modern::Perl;
-use Test::More tests => 12;
+use Test::More tests => 16;
use Test::MockModule;
use t::lib::Mocks;
"configuration $params->{conf}: $params->{field} should be correctly calculated"
);
}
+
+# format_for_editing
+for my $currency_format ( qw( US FR ) ) {
+ t::lib::Mocks::mock_preference( 'CurrencyFormat', $currency_format );
+ is( Koha::Number::Price->new( 1234567 )->format_for_editing, '1234567.00', 'format_for_editing should return unformated integer part with 2 decimals' );
+ is( Koha::Number::Price->new( 1234567.89 )->format_for_editing, '1234567.89', 'format_for_editing should return unformated integer part with 2 decimals' );
+}