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 1475-1489 sub _normalize_match_point { Link Here
1475
}
1480
}
1476
1481
1477
sub _isbn_cleanup {
1482
sub _isbn_cleanup {
1478
    require Business::ISBN;
1483
    my ($isbn) = @_;
1479
    my $isbn = Business::ISBN->new( $_[0] );
1484
    return NormalizeISBN(
1480
    if ( $isbn ) {
1485
        {
1481
        $isbn = $isbn->as_isbn10 if $isbn->type eq 'ISBN13';
1486
            isbn          => $isbn,
1482
        if (defined $isbn) {
1487
            format        => 'ISBN-10',
1483
            return $isbn->as_string([]);
1488
            strip_hyphens => 1,
1484
        }
1489
        }
1490
    );
1491
}
1492
1493
=head2 NormalizedISBN
1494
1495
  my $isbns = NormalizedISBN({
1496
    isbn => $isbn,
1497
    strip_hyphens => [0,1],
1498
    format => ['ISBN-10', 'ISBN-13']
1499
  });
1500
1501
  Returns an isbn validated by Business::ISBN.
1502
  Optionally strips hyphens and/or forces the isbn
1503
  to be of the specified format.
1504
1505
  If the string cannot be validated as an isbn,
1506
  it returns nothing.
1507
1508
=cut
1509
1510
sub NormalizeISBN {
1511
    my ($params) = @_;
1512
1513
    my $string        = $params->{isbn};
1514
    my $strip_hyphens = $params->{strip_hyphens};
1515
    my $format        = $params->{format};
1516
1517
    my $isbn = Business::ISBN->new($string);
1518
1519
    if ( $isbn && $isbn->error != Business::ISBN::BAD_ISBN ) {
1520
1521
        if ( $format eq 'ISBN-10' ) {
1522
            $isbn = $isbn->as_isbn10();
1523
        }
1524
        elsif ( $format eq 'ISBN-13' ) {
1525
            $isbn = $isbn->as_isbn13();
1526
        }
1527
1528
        if ($strip_hyphens) {
1529
            $string = $isbn->as_string( [] );
1530
        } else {
1531
            $string = $isbn->as_string();
1532
        }
1533
1534
        return $string;
1485
    }
1535
    }
1486
    return;
1536
}
1537
1538
=head2 GetVariationsOfISBN
1539
1540
  my @isbns = GetVariationsOfISBN( $isbn );
1541
1542
  Returns a list of varations of the given isbn in
1543
  both ISBN-10 and ISBN-13 formats, with and without
1544
  hyphens.
1545
1546
  In a scalar context, the isbns are returned as a
1547
  string delimited by ' | '.
1548
1549
=cut
1550
1551
sub GetVariationsOfISBN {
1552
    my ($isbn) = @_;
1553
1554
    my @isbns;
1555
1556
    push( @isbns, NormalizeISBN({ isbn => $isbn }) );
1557
    push( @isbns, NormalizeISBN({ isbn => $isbn, format => 'ISBN-10' }) );
1558
    push( @isbns, NormalizeISBN({ isbn => $isbn, format => 'ISBN-13' }) );
1559
    push( @isbns, NormalizeISBN({ isbn => $isbn, format => 'ISBN-10', strip_hyphens => 1 }) );
1560
    push( @isbns, NormalizeISBN({ isbn => $isbn, format => 'ISBN-13', strip_hyphens => 1 }) );
1561
1562
    return wantarray ? @isbns : join( " | ", @isbns );
1563
}
1564
1565
=head2 GetVariationsOfISBNs
1566
1567
  my @isbns = GetVariationsOfISBNs( @isbns );
1568
1569
  Returns a list of varations of the given isbns in
1570
  both ISBN-10 and ISBN-13 formats, with and without
1571
  hyphens.
1572
1573
  In a scalar context, the isbns are returned as a
1574
  string delimited by ' | '.
1575
1576
=cut
1577
1578
sub GetVariationsOfISBNs {
1579
    my (@isbns) = @_;
1580
1581
    @isbns = map { GetVariationsOfISBN( $_ ) } @isbns;
1582
1583
    return wantarray ? @isbns : join( " | ", @isbns );
1487
}
1584
}
1488
1585
1489
1;
1586
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 8-13 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
8
('AdvancedSearchTypes','itemtypes','itemtypes|ccode','Select which set of fields comprise the Type limit in the advanced search','Choice'),
8
('AdvancedSearchTypes','itemtypes','itemtypes|ccode','Select which set of fields comprise the Type limit in the advanced search','Choice'),
9
('AgeRestrictionMarker','',NULL,'Markers for age restriction indication, e.g. FSK|PEGI|Age|','free'),
9
('AgeRestrictionMarker','',NULL,'Markers for age restriction indication, e.g. FSK|PEGI|Age|','free'),
10
('AgeRestrictionOverride','0',NULL,'Allow staff to check out an item with age restriction.','YesNo'),
10
('AgeRestrictionOverride','0',NULL,'Allow staff to check out an item with age restriction.','YesNo'),
11
('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'),
11
('AllFinesNeedOverride','1','0','If on, staff will be asked to override every fine, even if it is below noissuescharge.','YesNo'),
12
('AllFinesNeedOverride','1','0','If on, staff will be asked to override every fine, even if it is below noissuescharge.','YesNo'),
12
('AllowAllMessageDeletion','0','','Allow any Library to delete any message','YesNo'),
13
('AllowAllMessageDeletion','0','','Allow any Library to delete any message','YesNo'),
13
('AllowFineOverride','0','0','If on, staff will be able to issue books to patrons with fines greater than noissuescharge.','YesNo'),
14
('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 7743-7748 if(CheckVersion($DBversion)) { Link Here
7743
    SetVersion($DBversion);
7743
    SetVersion($DBversion);
7744
}
7744
}
7745
7745
7746
$DBversion = "3.15.00.XXX";
7747
if ( CheckVersion($DBversion) ) {
7748
    $dbh->do("
7749
        INSERT INTO systempreferences (
7750
            variable,
7751
            value,
7752
            explanation,
7753
            type
7754
        ) VALUES (
7755
            'AggressiveMatchOnISBN',
7756
            '0',
7757
            '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',
7758
            'YesNo'
7759
        )
7760
    ");
7761
7762
    print "Upgrade to $DBversion done (Bug 10500 - Improve isbn matching when importing records)\n";
7763
    SetVersion($DBversion);
7764
}
7765
7746
=head1 FUNCTIONS
7766
=head1 FUNCTIONS
7747
7767
7748
=head2 TableExists($table)
7768
=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