@@ -, +, @@ --- C4/Biblio.pm | 71 +++++++++++-------- admin/currency.pl | 7 ++- installer/data/mysql/kohastructure.sql | 1 + installer/data/mysql/updatedatabase.pl | 8 ++ .../prog/en/modules/admin/currency.tt | 14 +++- 5 files changed, 67 insertions(+), 34 deletions(-) --- a/C4/Biblio.pm +++ a/C4/Biblio.pm @@ -1466,6 +1466,11 @@ sub GetMarcPrice { for my $subfield_value ($field->subfield($subfield)){ #check value $subfield_value = MungeMarcPrice( $subfield_value ); + ( $subfield_value ) = $subfield_value =~ m/(\d[\d\,\. ]*\d{0,2})/; + # remove comma,dot or space when used as separators from hundreds + $subfield_value =~s/[\,\. ](\d{3})/$1/g; + # convert comma to dot to ensure correct display of decimals if existing + $subfield_value =~s/,/./; return $subfield_value if ($subfield_value); } } @@ -1479,38 +1484,44 @@ Return the best guess at what the actual price is from a price field. sub MungeMarcPrice { my ( $price ) = @_; - return unless ( $price =~ m/\d/ ); ## No digits means no price. - - ## Look for the currency symbol of the active currency, if it's there, - ## start the price string right after the symbol. This allows us to prefer - ## this native currency price over other currency prices, if possible. - my $active_currency = C4::Context->dbh->selectrow_hashref( 'SELECT * FROM currency WHERE active = 1', {} ); - my $symbol = quotemeta( $active_currency->{'symbol'} ); - if ( $price =~ m/$symbol/ ) { - my @parts = split(/$symbol/, $price ); - $price = $parts[1]; - } - - ## Grab the first number in the string ( can use commas or periods for thousands separator and/or decimal separator ) - ( $price ) = $price =~ m/([\d\,\.]+[[\,\.]\d\d]?)/; - - ## Split price into array on periods and commas - my @parts = split(/[\,\.]/, $price); - - ## If the last grouping of digits is more than 2 characters, assume there is no decimal value and put it back. - my $decimal = pop( @parts ); - if ( length( $decimal ) > 2 ) { - push( @parts, $decimal ); - $decimal = ''; - } - - $price = join('', @parts ); - - if ( $decimal ) { - $price .= ".$decimal"; + # Look for the currency symbol and the normalized code of the active currency, if it's there, + my $active_currency = C4::Budgets->GetCurrency(); + my $symbol = $active_currency->{'symbol'}; + my $isocode = $active_currency->{'isocode'}; + my $localprice; + if ( $isocode or $symbol ) { + my @matches =($price=~ / + \s? + ( # start of capturing parenthesis + (?: + (?:\p{Sc}|[a-zA-Z]){1,3} # currency sign (unicode propriety) or alphabetical character whitin 1 to 3 occurrences : block symbol + |(?:\d+[\p{P}\s]?){1,4} # or else at least one digit followed or not by a punctuation sign or whitespace, all theese within 1 to 4 occurrences : block digit + ) + \s?\p{Sc}?\s? # followed or not by a whitespace. \p{Sc}?\s? are for cases like '25$ USD' + (?: + (?:\p{Sc}|[a-zA-Z]){1,3} # followed by same block as block symbol + |(?:\d+[\p{P}\s]?){1,4} # or by same block as block digit + ) + \s? # followed or not by a whitespace + ) # end of capturing parenthesis + (?:\p{P}|\z) # followed by a punctuation sign or by the end of the string + /gx); + + if ( @matches ) { + if ( $isocode ) { + foreach ( @matches ) { + $localprice = $_ and last if index($_, $isocode)>=0; + } + } + if ( $symbol and !$localprice ) { + foreach ( @matches ) { + $localprice = $_ and last if $_=~ /(^|[^A-Za-z\p{Sc}])\Q$symbol\E([^A-Za-z\p{Sc}]|\z)/; + } + } + } + $price=$localprice; } - return $price; } --- a/admin/currency.pl +++ a/admin/currency.pl @@ -185,6 +185,7 @@ sub add_validate { my $rec = { rate => $input->param('rate'), symbol => $input->param('symbol') || q{}, + isocode => $input->param('isocode') || q{}, active => $input->param('active') || 0, currency => $input->param('currency'), }; @@ -198,20 +199,22 @@ sub add_validate { {}, $input->param('currency') ); if ($row_count) { $dbh->do( -q|UPDATE currency SET rate = ?, symbol = ?, active = ? WHERE currency = ? |, +q|UPDATE currency SET rate = ?, symbol = ?, isocode = ?, active = ? WHERE currency = ? |, {}, $rec->{rate}, $rec->{symbol}, + $rec->{isocode}, $rec->{active}, $rec->{currency} ); } else { $dbh->do( -q|INSERT INTO currency (currency, rate, symbol, active) VALUES (?,?,?,?) |, +q|INSERT INTO currency (currency, rate, symbol, isocode, active) VALUES (?,?,?,?,?) |, {}, $rec->{currency}, $rec->{rate}, $rec->{symbol}, + $rec->{isocode}, $rec->{active} ); --- a/installer/data/mysql/kohastructure.sql +++ a/installer/data/mysql/kohastructure.sql @@ -589,6 +589,7 @@ DROP TABLE IF EXISTS `currency`; CREATE TABLE `currency` ( `currency` varchar(10) NOT NULL default '', `symbol` varchar(5) default NULL, + `isocode` varchar(5) default NULL, `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `rate` float(15,5) default NULL, `active` tinyint(1) default NULL, --- a/installer/data/mysql/updatedatabase.pl +++ a/installer/data/mysql/updatedatabase.pl @@ -6834,6 +6834,14 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) { SetVersion($DBversion); } +$DBversion = "3.11.00.XXX"; +if ( CheckVersion($DBversion) ) { + $dbh->do("ALTER TABLE currency ADD isocode VARCHAR(5) default NULL AFTER symbol;"); + print "Upgrade to $DBversion done (Added isocode to the currency table)\n"; + SetVersion($DBversion); +} + + =head1 FUNCTIONS =head2 TableExists($table) --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/currency.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/currency.tt @@ -72,7 +72,12 @@
- +

You can define here a currency that will be picked rather than the default one ( that says the first in the price zone ) during the importation process from a staged file +whenever the price data is provided under different currencies.
For this purpose, you must check the active box +and provide at least the symbol of currency and optionally its iso code (see ISO 4217). +The symbol may be the pure currency sign or a string in which it's included ( like '$US' ). +The isocode is checked first if provided and the symbol then, if the asked currency sequence could'nt be found from isocode.
+Beware that the currency had to be enabled only if necessary.

[% IF ( else ) %]
New currency @@ -107,7 +112,10 @@ - +
  • + + +
  • Last updated: [% timestamp %]
  • @@ -187,6 +195,7 @@ Currency Rate Symbol + Iso code Last updated Active Actions  @@ -200,6 +209,7 @@ [% loo.currency %] [% loo.rate %] [% loo.symbol |html %] + [% loo.isocode |html %] [% loo.timestamp %] [% IF ( loo.active ) %]✓[% END %] Edit --