Bug 13069 - (follow-up) Enable sort by title to ignore articles
[koha.git] / Koha / Number / Price.pm
1 package Koha::Number::Price;
2
3 # This file is part of Koha.
4 #
5 # Copyright 2014 BibLibre
6 #
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
19
20 use Modern::Perl;
21
22 use Number::Format qw( format_price );
23 use C4::Context;
24 use C4::Budgets qw( GetCurrency );
25
26 use base qw( Class::Accessor );
27 __PACKAGE__->mk_accessors(qw( value ));
28
29 sub new {
30     my ( $class, $value ) = @_;
31
32     my $self->{value} = $value || 0;
33
34     bless $self, $class;
35     return $self;
36 }
37
38 sub format {
39     my ( $self, $params ) = @_;
40     return unless defined $self->value;
41
42     my $format_params = $self->_format_params( $params );
43
44     return Number::Format->new(%$format_params)->format_price($self->value);
45 }
46
47 sub format_for_editing {
48     my ( $self, $params ) = @_;
49     return unless defined $self->value;
50
51     my $format_params = $self->_format_params( $params );
52     $format_params = {
53         %$format_params,
54         int_curr_symbol   => '',
55         mon_thousands_sep => '',
56         mon_decimal_point => '.',
57     };
58
59     return Number::Format->new(%$format_params)->format_price($self->value);
60 }
61
62 sub unformat {
63     my ( $self, $params ) = @_;
64     return unless defined $self->value;
65
66     my $format_params = $self->_format_params( $params );
67
68     return Number::Format->new(%$format_params)->unformat_number($self->value);
69 }
70
71 sub round {
72     my ( $self ) = @_;
73     return unless defined $self->value;
74
75     my $format_params = $self->_format_params;
76
77     return Number::Format->new(%$format_params)->round($self->value);
78 }
79
80 sub _format_params {
81     my ( $self, $params ) = @_;
82     my $with_symbol = $params->{with_symbol} || 0;
83     my $p_cs_precedes = $params->{p_cs_precedes};
84     my $p_sep_by_space = $params->{p_sep_by_space};
85     my $currency        = GetCurrency();
86     my $currency_format = C4::Context->preference("CurrencyFormat");
87
88     my $int_curr_symbol = q||;
89     my %format_params = (
90         int_curr_symbol   => $int_curr_symbol,
91         mon_thousands_sep => ',',
92         mon_decimal_point => '.'
93     );
94
95     if ( $currency_format eq 'FR' ) {
96         # FIXME This test should be done for all currencies
97         $int_curr_symbol = $currency->{symbol} if $with_symbol;
98         %format_params = (
99             decimal_fill      => '2',
100             decimal_point     => ',',
101             int_curr_symbol   => $int_curr_symbol,
102             mon_thousands_sep => ' ',
103             thousands_sep     => ' ',
104             mon_decimal_point => ','
105         );
106     }
107
108     $format_params{p_cs_precedes}  = $p_cs_precedes  if defined $p_cs_precedes;
109     $format_params{p_sep_by_space} = ( $int_curr_symbol and defined $p_sep_by_space ) ? $p_sep_by_space : 0;
110
111     return \%format_params;
112 }
113
114 1;