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

(-)a/C4/Koha.pm (-7 / +104 lines)
Lines 28-33 use C4::Branch qw(GetBranchesCount); Link Here
28
use Koha::DateUtils qw(dt_from_string);
28
use Koha::DateUtils qw(dt_from_string);
29
use Memoize;
29
use Memoize;
30
use DateTime::Format::MySQL;
30
use DateTime::Format::MySQL;
31
use Business::ISBN;
31
use autouse 'Data::Dumper' => qw(Dumper);
32
use autouse 'Data::Dumper' => qw(Dumper);
32
33
33
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $DEBUG);
34
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $DEBUG);
Lines 70-75 BEGIN { Link Here
70
		&GetNormalizedOCLCNumber
71
		&GetNormalizedOCLCNumber
71
        &xml_escape
72
        &xml_escape
72
73
74
        &GetVariationsOfISBN
75
        &GetVariationsOfISBNs
76
        &NormalizeISBN
77
73
		$DEBUG
78
		$DEBUG
74
	);
79
	);
75
	$DEBUG = 0;
80
	$DEBUG = 0;
Lines 1477-1491 sub _normalize_match_point { Link Here
1477
}
1482
}
1478
1483
1479
sub _isbn_cleanup {
1484
sub _isbn_cleanup {
1480
    require Business::ISBN;
1485
    my ($isbn) = @_;
1481
    my $isbn = Business::ISBN->new( $_[0] );
1486
    return NormalizeISBN(
1482
    if ( $isbn ) {
1487
        {
1483
        $isbn = $isbn->as_isbn10 if $isbn->type eq 'ISBN13';
1488
            isbn          => $isbn,
1484
        if (defined $isbn) {
1489
            format        => 'ISBN-10',
1485
            return $isbn->as_string([]);
1490
            strip_hyphens => 1,
1486
        }
1491
        }
1492
    );
1493
}
1494
1495
=head2 NormalizedISBN
1496
1497
  my $isbns = NormalizedISBN({
1498
    isbn => $isbn,
1499
    strip_hyphens => [0,1],
1500
    format => ['ISBN-10', 'ISBN-13']
1501
  });
1502
1503
  Returns an isbn validated by Business::ISBN.
1504
  Optionally strips hyphens and/or forces the isbn
1505
  to be of the specified format.
1506
1507
  If the string cannot be validated as an isbn,
1508
  it returns nothing.
1509
1510
=cut
1511
1512
sub NormalizeISBN {
1513
    my ($params) = @_;
1514
1515
    my $string        = $params->{isbn};
1516
    my $strip_hyphens = $params->{strip_hyphens};
1517
    my $format        = $params->{format};
1518
1519
    my $isbn = Business::ISBN->new($string);
1520
1521
    if ( $isbn && $isbn->error != Business::ISBN::BAD_ISBN ) {
1522
1523
        if ( $format eq 'ISBN-10' ) {
1524
            $isbn = $isbn->as_isbn10();
1525
        }
1526
        elsif ( $format eq 'ISBN-13' ) {
1527
            $isbn = $isbn->as_isbn13();
1528
        }
1529
1530
        if ($strip_hyphens) {
1531
            $string = $isbn->as_string( [] );
1532
        } else {
1533
            $string = $isbn->as_string();
1534
        }
1535
1536
        return $string;
1487
    }
1537
    }
1488
    return;
1538
}
1539
1540
=head2 GetVariationsOfISBN
1541
1542
  my @isbns = GetVariationsOfISBN( $isbn );
1543
1544
  Returns a list of varations of the given isbn in
1545
  both ISBN-10 and ISBN-13 formats, with and without
1546
  hyphens.
1547
1548
  In a scalar context, the isbns are returned as a
1549
  string delimited by ' | '.
1550
1551
=cut
1552
1553
sub GetVariationsOfISBN {
1554
    my ($isbn) = @_;
1555
1556
    my @isbns;
1557
1558
    push( @isbns, NormalizeISBN({ isbn => $isbn }) );
1559
    push( @isbns, NormalizeISBN({ isbn => $isbn, format => 'ISBN-10' }) );
1560
    push( @isbns, NormalizeISBN({ isbn => $isbn, format => 'ISBN-13' }) );
1561
    push( @isbns, NormalizeISBN({ isbn => $isbn, format => 'ISBN-10', strip_hyphens => 1 }) );
1562
    push( @isbns, NormalizeISBN({ isbn => $isbn, format => 'ISBN-13', strip_hyphens => 1 }) );
1563
1564
    return wantarray ? @isbns : join( " | ", @isbns );
1565
}
1566
1567
=head2 GetVariationsOfISBNs
1568
1569
  my @isbns = GetVariationsOfISBNs( @isbns );
1570
1571
  Returns a list of varations of the given isbns in
1572
  both ISBN-10 and ISBN-13 formats, with and without
1573
  hyphens.
1574
1575
  In a scalar context, the isbns are returned as a
1576
  string delimited by ' | '.
1577
1578
=cut
1579
1580
sub GetVariationsOfISBNs {
1581
    my (@isbns) = @_;
1582
1583
    @isbns = map { GetVariationsOfISBN( $_ ) } @isbns;
1584
1585
    return wantarray ? @isbns : join( " | ", @isbns );
1489
}
1586
}
1490
1587
1491
1;
1588
1;
(-)a/C4/Matcher.pm (-2 / +11 lines)
Lines 630-652 sub get_matches { Link Here
630
    $QParser = C4::Context->queryparser if (C4::Context->preference('UseQueryParser'));
630
    $QParser = C4::Context->queryparser if (C4::Context->preference('UseQueryParser'));
631
    foreach my $matchpoint ( @{ $self->{'matchpoints'} } ) {
631
    foreach my $matchpoint ( @{ $self->{'matchpoints'} } ) {
632
        my @source_keys = _get_match_keys( $source_record, $matchpoint );
632
        my @source_keys = _get_match_keys( $source_record, $matchpoint );
633
633
        next if scalar(@source_keys) == 0;
634
        next if scalar(@source_keys) == 0;
634
635
636
        @source_keys = C4::Koha::GetVariationsOfISBNs(@source_keys)
637
          if ( $matchpoint->{index} eq 'isbn'
638
            && C4::Context->preference('AggressiveMatchOnISBN') );
639
635
        # build query
640
        # build query
636
        my $query;
641
        my $query;
637
        my $error;
642
        my $error;
638
        my $searchresults;
643
        my $searchresults;
639
        my $total_hits;
644
        my $total_hits;
640
        if ( $self->{'record_type'} eq 'biblio' ) {
645
        if ( $self->{'record_type'} eq 'biblio' ) {
646
            my $phr = C4::Context->preference('AggressiveMatchOnISBN') ? ',phr' : q{};
647
641
            if ($QParser) {
648
            if ($QParser) {
642
                $query = join( " || ",
649
                $query = join( " || ",
643
                    map { "$matchpoint->{'index'}:$_" } @source_keys );
650
                    map { "$matchpoint->{'index'}$phr:$_" } @source_keys );
644
            }
651
            }
645
            else {
652
            else {
646
                $query = join( " or ",
653
                $query = join( " or ",
647
                    map { "$matchpoint->{'index'}=$_" } @source_keys );
654
                    map { "$matchpoint->{'index'}$phr=$_" } @source_keys );
648
            }
655
            }
656
649
            require C4::Search;
657
            require C4::Search;
658
650
            ( $error, $searchresults, $total_hits ) =
659
            ( $error, $searchresults, $total_hits ) =
651
              C4::Search::SimpleSearch( $query, 0, $max_matches );
660
              C4::Search::SimpleSearch( $query, 0, $max_matches );
652
        }
661
        }
(-)a/installer/data/mysql/sysprefs.sql (+1 lines)
Lines 7-12 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
7
('AdvancedSearchTypes','itemtypes','itemtypes|ccode','Select which set of fields comprise the Type limit in the advanced search','Choice'),
7
('AdvancedSearchTypes','itemtypes','itemtypes|ccode','Select which set of fields comprise the Type limit in the advanced search','Choice'),
8
('AgeRestrictionMarker','',NULL,'Markers for age restriction indication, e.g. FSK|PEGI|Age|','free'),
8
('AgeRestrictionMarker','',NULL,'Markers for age restriction indication, e.g. FSK|PEGI|Age|','free'),
9
('AgeRestrictionOverride','0',NULL,'Allow staff to check out an item with age restriction.','YesNo'),
9
('AgeRestrictionOverride','0',NULL,'Allow staff to check out an item with age restriction.','YesNo'),
10
('AggressiveMatchOnISBN','0','If enabled, attempt to match aggressively by trying all variations of the ISBNs in the imported record as a phrase in the ISBN fields of already cataloged records when matching on ISBN with the record import tool','YesNo'),
10
('AllFinesNeedOverride','1','0','If on, staff will be asked to override every fine, even if it is below noissuescharge.','YesNo'),
11
('AllFinesNeedOverride','1','0','If on, staff will be asked to override every fine, even if it is below noissuescharge.','YesNo'),
11
('AllowAllMessageDeletion','0','','Allow any Library to delete any message','YesNo'),
12
('AllowAllMessageDeletion','0','','Allow any Library to delete any message','YesNo'),
12
('AllowFineOverride','0','0','If on, staff will be able to issue books to patrons with fines greater than noissuescharge.','YesNo'),
13
('AllowFineOverride','0','0','If on, staff will be able to issue books to patrons with fines greater than noissuescharge.','YesNo'),
(-)a/installer/data/mysql/updatedatabase.pl (+20 lines)
Lines 7139-7144 if ( CheckVersion($DBversion) ) { Link Here
7139
    SetVersion ($DBversion);
7139
    SetVersion ($DBversion);
7140
}
7140
}
7141
7141
7142
$DBversion = "3.13.00.XXX";
7143
if ( CheckVersion($DBversion) ) {
7144
    $dbh->do("
7145
        INSERT INTO systempreferences (
7146
            variable,
7147
            value,
7148
            explanation,
7149
            type
7150
        ) VALUES (
7151
            'AggressiveMatchOnISBN',
7152
            '0',
7153
            'If enabled, attempt to match aggressively by trying all variations of the ISBNs in the imported record as a phrase in the ISBN fields of already cataloged records when matching on ISBN with the record import tool',
7154
            'YesNo'
7155
        )
7156
    ");
7157
7158
    print "Upgrade to $DBversion done (Bug 10500 - Improve isbn matching when importing records)\n";
7159
    SetVersion($DBversion);
7160
}
7161
7142
=head1 FUNCTIONS
7162
=head1 FUNCTIONS
7143
7163
7144
=head2 TableExists($table)
7164
=head2 TableExists($table)
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref (+8 lines)
Lines 176-178 Cataloging: Link Here
176
            - pref: NotesBlacklist
176
            - pref: NotesBlacklist
177
              class: multi
177
              class: multi
178
            - note fields in title notes separator (OPAC record details) and in the description separator (Staff client record details). The fields should appear separated with commas and according with the Koha MARC format (eg 3.. for UNIMARC, 5.. for MARC21)
178
            - note fields in title notes separator (OPAC record details) and in the description separator (Staff client record details). The fields should appear separated with commas and according with the Koha MARC format (eg 3.. for UNIMARC, 5.. for MARC21)
179
    Importing:
180
        -
181
            - When matching on ISBN with the record import tool,
182
            - pref: AggressiveMatchOnISBN
183
              choices:
184
                  yes: "do"
185
                  no: "don't"
186
            - attempt to match aggressively by trying all variations of the ISBNs in the imported record as a phrase in the ISBN fields of already cataloged records.
(-)a/t/Koha.t (-2 / +7 lines)
Lines 3-9 use strict; Link Here
3
use warnings;
3
use warnings;
4
4
5
use C4::Context;
5
use C4::Context;
6
use Test::More tests => 11;
6
use Test::More tests => 14;
7
use Test::MockModule;
7
use Test::MockModule;
8
use DBD::Mock;
8
use DBD::Mock;
9
9
Lines 61-63 is(C4::Koha::_isbn_cleanup('0-590-35340-3'), '0590353403', '_isbn_cleanup remove Link Here
61
is(C4::Koha::_isbn_cleanup('0590353403 (pbk.)'), '0590353403', '_isbn_cleanup removes parenthetical');
61
is(C4::Koha::_isbn_cleanup('0590353403 (pbk.)'), '0590353403', '_isbn_cleanup removes parenthetical');
62
is(C4::Koha::_isbn_cleanup('978-0-321-49694-2'), '0321496949', '_isbn_cleanup converts ISBN-13 to ISBN-10');
62
is(C4::Koha::_isbn_cleanup('978-0-321-49694-2'), '0321496949', '_isbn_cleanup converts ISBN-13 to ISBN-10');
63
63
64
- 
64
is(C4::Koha::NormalizeISBN({ isbn => '978-0-321-49694-2 (pbk.)', format => 'ISBN-10', strip_hyphens => 1 }), '0321496949', 'Test NormalizeISBN with all features enabled' );
65
66
my @isbns = qw/ 978-0-321-49694-2 0-321-49694-9 978-0-321-49694-2 0321496949 9780321496942/;
67
is( join('|', @isbns), join('|', GetVariationsOfISBN('978-0-321-49694-2 (pbk.)')), 'GetVariationsOfISBN returns all variations' );
68
69
is( join('|', @isbns), join('|', GetVariationsOfISBNs('978-0-321-49694-2 (pbk.)')), 'GetVariationsOfISBNs returns all variations' );

Return to bug 10500