@@ -, +, @@ --- C4/Biblio.pm | 72 +++++++++++++--------- admin/currency.pl | 7 ++- installer/data/mysql/kohastructure.sql | 1 + installer/data/mysql/updatedatabase.pl | 7 ++- .../prog/en/modules/admin/currency.tt | 13 +++- 5 files changed, 65 insertions(+), 35 deletions(-) --- a/C4/Biblio.pm +++ a/C4/Biblio.pm @@ -1477,38 +1477,50 @@ 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 ( $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 : call this whole block 'symbol block' + |(?:\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 : call this whole block 'digits block' + ) + \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 symbol block + |(?:\d+[\p{P}\s]?){1,4} # or by same block as digits block + ) + \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 ) { + foreach ( @matches ) { + $localprice = $_ and last if index($_, $isocode)>=0; + } + if ( !$localprice ) { + foreach ( @matches ) { + $localprice = $_ and last if $_=~ /(^|[^A-Za-z\p{Sc}])\Q$symbol\E([^A-Za-z\p{Sc}]|\z)/; + } + } + } + $price=$localprice; + if ($price) { + # eliminate symbol/isocode from the string + ( $price ) = $price =~ m/(\d[\d\,\. ]*\d{0,2})/; + # remove comma,dot or space when used as separators from hundreds + $price =~s/[\,\. ](\d{3})/$1/g; + # convert comma to dot to ensure correct display of decimals if existing + $price =~s/,/./; + } } - 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 @@ -692,6 +692,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 @@ -7146,7 +7146,6 @@ if ( CheckVersion($DBversion) ) { SetVersion($DBversion); } - $DBversion = "3.13.00.022"; if ( CheckVersion($DBversion) ) { $dbh->do("DELETE from auth_tag_structure WHERE tagfield IN ('68a','68b')"); @@ -7595,6 +7594,12 @@ if ( CheckVersion($DBversion) ) { SetVersion($DBversion); } +$DBversion = "3.13.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 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/currency.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/currency.tt @@ -24,6 +24,9 @@ if (f.symbol.value.length==0) { _alertString += _("- Symbol missing") + "\n"; } + if (f.isocode.value.length==0) { + _alertString += _("- Iso code missing") + "\n"; + } if (_alertString.length==0) { document.Aform.submit(); } else { @@ -72,7 +75,8 @@
- +

The active currency priority will be picked during the importation process from a staged file whenever the price data is provided under different currencies.
+The symbol may be the pure currency sign or a string in which it's included ( like '$US' ).

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