View | Details | Raw Unified | Return to bug 9593
Collapse All | Expand All

(-)a/C4/Biblio.pm (-30 / +41 lines)
Lines 1466-1471 sub GetMarcPrice { Link Here
1466
        for my $subfield_value  ($field->subfield($subfield)){
1466
        for my $subfield_value  ($field->subfield($subfield)){
1467
            #check value
1467
            #check value
1468
            $subfield_value = MungeMarcPrice( $subfield_value );
1468
            $subfield_value = MungeMarcPrice( $subfield_value );
1469
            ( $subfield_value ) = $subfield_value =~ m/(\d[\d\,\. ]*\d{0,2})/;
1470
            # remove comma,dot or space when used as separators from hundreds
1471
            $subfield_value =~s/[\,\. ](\d{3})/$1/g;
1472
            # convert comma to dot to ensure correct display of decimals if existing
1473
            $subfield_value =~s/,/./;
1469
            return $subfield_value if ($subfield_value);
1474
            return $subfield_value if ($subfield_value);
1470
        }
1475
        }
1471
    }
1476
    }
Lines 1479-1516 Return the best guess at what the actual price is from a price field. Link Here
1479
1484
1480
sub MungeMarcPrice {
1485
sub MungeMarcPrice {
1481
    my ( $price ) = @_;
1486
    my ( $price ) = @_;
1482
1483
    return unless ( $price =~ m/\d/ ); ## No digits means no price.
1487
    return unless ( $price =~ m/\d/ ); ## No digits means no price.
1484
1488
    # Look for the currency symbol and the normalized code of the active currency, if it's there,
1485
    ## Look for the currency symbol of the active currency, if it's there,
1489
    my $active_currency = C4::Budgets->GetCurrency();
1486
    ## start the price string right after the symbol. This allows us to prefer
1490
    my $symbol = $active_currency->{'symbol'};
1487
    ## this native currency price over other currency prices, if possible.
1491
    my $isocode = $active_currency->{'isocode'};
1488
    my $active_currency = C4::Context->dbh->selectrow_hashref( 'SELECT * FROM currency WHERE active = 1', {} );
1492
    my $localprice;
1489
    my $symbol = quotemeta( $active_currency->{'symbol'} );
1493
    if ( $isocode or $symbol ) {
1490
    if ( $price =~ m/$symbol/ ) {
1494
        my @matches =($price=~ /
1491
        my @parts = split(/$symbol/, $price );
1495
            \s?
1492
        $price = $parts[1];
1496
            (                          # start of capturing parenthesis
1493
    }
1497
            (?:
1494
1498
            (?:\p{Sc}|[a-zA-Z]){1,3}   # currency sign (unicode propriety) or alphabetical character whitin 1 to 3 occurrences : block symbol
1495
    ## Grab the first number in the string ( can use commas or periods for thousands separator and/or decimal separator )
1499
            |(?:\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
1496
    ( $price ) = $price =~ m/([\d\,\.]+[[\,\.]\d\d]?)/;
1500
            )
1497
1501
            \s?\p{Sc}?\s?              # followed or not by a whitespace. \p{Sc}?\s? are for cases like '25$ USD' 
1498
    ## Split price into array on periods and commas
1502
            (?:
1499
    my @parts = split(/[\,\.]/, $price);
1503
            (?:\p{Sc}|[a-zA-Z]){1,3}   # followed by same block as block symbol
1500
1504
            |(?:\d+[\p{P}\s]?){1,4}    # or by same block as block digit
1501
    ## If the last grouping of digits is more than 2 characters, assume there is no decimal value and put it back.
1505
            )
1502
    my $decimal = pop( @parts );
1506
            \s?                        # followed or not by a whitespace
1503
    if ( length( $decimal ) > 2 ) {
1507
            )                          # end of capturing parenthesis
1504
        push( @parts, $decimal );
1508
            (?:\p{P}|\z)               # followed by a punctuation sign or by the end of the string
1505
        $decimal = '';
1509
            /gx);
1506
    }
1510
1507
1511
        if ( @matches ) {
1508
    $price = join('', @parts );
1512
            if ( $isocode ) {
1509
1513
                foreach ( @matches ) {
1510
    if ( $decimal ) {
1514
                        $localprice = $_ and last if index($_, $isocode)>=0;
1511
     $price .= ".$decimal";
1515
                }
1516
            }
1517
            if ( $symbol and !$localprice ) {
1518
                foreach ( @matches ) {
1519
                        $localprice = $_ and last if $_=~ /(^|[^A-Za-z\p{Sc}])\Q$symbol\E([^A-Za-z\p{Sc}]|\z)/;
1520
                }
1521
            }
1522
        }
1523
        $price=$localprice;
1512
    }
1524
    }
1513
1514
    return $price;
1525
    return $price;
1515
}
1526
}
1516
1527
(-)a/admin/currency.pl (-2 / +5 lines)
Lines 185-190 sub add_validate { Link Here
185
    my $rec = {
185
    my $rec = {
186
        rate     => $input->param('rate'),
186
        rate     => $input->param('rate'),
187
        symbol   => $input->param('symbol') || q{},
187
        symbol   => $input->param('symbol') || q{},
188
        isocode  => $input->param('isocode') || q{},
188
        active   => $input->param('active') || 0,
189
        active   => $input->param('active') || 0,
189
        currency => $input->param('currency'),
190
        currency => $input->param('currency'),
190
    };
191
    };
Lines 198-217 sub add_validate { Link Here
198
        {}, $input->param('currency') );
199
        {}, $input->param('currency') );
199
    if ($row_count) {
200
    if ($row_count) {
200
        $dbh->do(
201
        $dbh->do(
201
q|UPDATE currency SET rate = ?, symbol = ?, active = ? WHERE currency = ? |,
202
q|UPDATE currency SET rate = ?, symbol = ?, isocode = ?, active = ? WHERE currency = ? |,
202
            {},
203
            {},
203
            $rec->{rate},
204
            $rec->{rate},
204
            $rec->{symbol},
205
            $rec->{symbol},
206
            $rec->{isocode},
205
            $rec->{active},
207
            $rec->{active},
206
            $rec->{currency}
208
            $rec->{currency}
207
        );
209
        );
208
    } else {
210
    } else {
209
        $dbh->do(
211
        $dbh->do(
210
q|INSERT INTO currency (currency, rate, symbol, active) VALUES (?,?,?,?) |,
212
q|INSERT INTO currency (currency, rate, symbol, isocode, active) VALUES (?,?,?,?,?) |,
211
            {},
213
            {},
212
            $rec->{currency},
214
            $rec->{currency},
213
            $rec->{rate},
215
            $rec->{rate},
214
            $rec->{symbol},
216
            $rec->{symbol},
217
            $rec->{isocode},
215
            $rec->{active}
218
            $rec->{active}
216
        );
219
        );
217
220
(-)a/installer/data/mysql/kohastructure.sql (+1 lines)
Lines 589-594 DROP TABLE IF EXISTS `currency`; Link Here
589
CREATE TABLE `currency` (
589
CREATE TABLE `currency` (
590
  `currency` varchar(10) NOT NULL default '',
590
  `currency` varchar(10) NOT NULL default '',
591
  `symbol` varchar(5) default NULL,
591
  `symbol` varchar(5) default NULL,
592
  `isocode` varchar(5) default NULL,
592
  `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
593
  `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
593
  `rate` float(15,5) default NULL,
594
  `rate` float(15,5) default NULL,
594
  `active` tinyint(1) default NULL,
595
  `active` tinyint(1) default NULL,
(-)a/installer/data/mysql/updatedatabase.pl (+8 lines)
Lines 6834-6839 if (C4::Context->preference("Version") < TransformToNum($DBversion)) { Link Here
6834
    SetVersion($DBversion);
6834
    SetVersion($DBversion);
6835
}
6835
}
6836
6836
6837
$DBversion = "3.11.00.XXX";
6838
if ( CheckVersion($DBversion) ) {
6839
    $dbh->do("ALTER TABLE currency ADD isocode VARCHAR(5) default NULL AFTER symbol;");
6840
    print "Upgrade to $DBversion done (Added isocode to the currency table)\n";
6841
    SetVersion($DBversion);
6842
}
6843
6844
6837
=head1 FUNCTIONS
6845
=head1 FUNCTIONS
6838
6846
6839
=head2 TableExists($table)
6847
=head2 TableExists($table)
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/currency.tt (-3 / +12 lines)
Lines 72-78 Link Here
72
<div id="bd">
72
<div id="bd">
73
    <div id="yui-main">
73
    <div id="yui-main">
74
    <div class="yui-b">
74
    <div class="yui-b">
75
75
<div class="message dialog"><p style="text-align:justify" >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
76
whenever the price data is provided under different currencies.<br/>For this purpose, you must check the active box
77
and provide at least the symbol of currency and optionally its iso code (see ISO 4217).
78
The symbol may be the pure currency sign or a string in which it's included ( like '$US' ).
79
The isocode is checked first if provided and the symbol then, if the asked currency sequence could'nt be found from isocode.<br/>
80
Beware that the currency had to be enabled only if necessary.</p></div>
76
[% IF ( else ) %]
81
[% IF ( else ) %]
77
<div id="toolbar" class="btn-toolbar">
82
<div id="toolbar" class="btn-toolbar">
78
    <a class="btn btn-small" id="newcurrency" href="[% script_name %]?op=add_form"><i class="icon-plus"></i> New currency</a>
83
    <a class="btn btn-small" id="newcurrency" href="[% script_name %]?op=add_form"><i class="icon-plus"></i> New currency</a>
Lines 107-113 Link Here
107
            <label for="symbol">Symbol: </label>
112
            <label for="symbol">Symbol: </label>
108
            <input type="text" name="symbol" id="symbol" size="5" maxlength="5" value="[% symbol %]" />
113
            <input type="text" name="symbol" id="symbol" size="5" maxlength="5" value="[% symbol %]" />
109
        </li>
114
        </li>
110
115
        <li>
116
            <label for="isocode">Iso code: </label>
117
            <input type="text" name="isocode" id="isocode" size="5" maxlength="5" value="[% isocode %]" />
118
        </li>
111
        <li>
119
        <li>
112
            <span class="label">Last updated: </span>[% timestamp %]
120
            <span class="label">Last updated: </span>[% timestamp %]
113
        </li>
121
        </li>
Lines 187-192 Link Here
187
            <th>Currency</th>
195
            <th>Currency</th>
188
            <th>Rate</th>
196
            <th>Rate</th>
189
            <th>Symbol</th>
197
            <th>Symbol</th>
198
            <th>Iso code</th>
190
            <th>Last updated</th>
199
            <th>Last updated</th>
191
            <th>Active</th>
200
            <th>Active</th>
192
            <th colspan="2">Actions&nbsp;</th>
201
            <th colspan="2">Actions&nbsp;</th>
Lines 200-205 Link Here
200
            <td>[% loo.currency %]</td>
209
            <td>[% loo.currency %]</td>
201
            <td>[% loo.rate %]</td>
210
            <td>[% loo.rate %]</td>
202
            <td>[% loo.symbol |html %]</td>
211
            <td>[% loo.symbol |html %]</td>
212
            <td>[% loo.isocode |html %]</td>
203
            <td>[% loo.timestamp %]</td>
213
            <td>[% loo.timestamp %]</td>
204
            <td style="color:green;">[% IF ( loo.active ) %]✓[% END %]</td>
214
            <td style="color:green;">[% IF ( loo.active ) %]✓[% END %]</td>
205
            <td><a href="[% loo.script_name %]?op=add_form&amp;searchfield=[% loo.currency %]">Edit</a></td>
215
            <td><a href="[% loo.script_name %]?op=add_form&amp;searchfield=[% loo.currency %]">Edit</a></td>
206
- 

Return to bug 9593