From f9b4022dbb5480b09bea4b7e5b4bc2b2b3435bb6 Mon Sep 17 00:00:00 2001 From: Lyon3 Team Date: Thu, 21 Feb 2013 15:30:55 +0100 Subject: [PATCH] Bug 9593 Prices not imported correctly from a staged file When there's a round price with no decimals after it, or when the symbol is after the digits, the price is not captured by regular expression and the variable is not initialized. --- C4/Biblio.pm | 48 +++++------------------------------------------- 1 files changed, 5 insertions(+), 43 deletions(-) diff --git a/C4/Biblio.pm b/C4/Biblio.pm index 1b88286..67d7734 100644 --- a/C4/Biblio.pm +++ b/C4/Biblio.pm @@ -1483,55 +1483,17 @@ sub GetMarcPrice { for my $field ( $record->field(@listtags) ) { 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/; + # convert comma to dot to ensure correct display of decimals if existing + $subfield_value =~s/,/./; return $subfield_value if ($subfield_value); } } return 0; # no price found } -=head2 MungeMarcPrice - -Return the best guess at what the actual price is from a price field. -=cut - -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"; - } - - return $price; -} - =head2 GetMarcQuantity -- 1.7.2.5