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 71-76 BEGIN { Link Here
71
		&GetNormalizedOCLCNumber
72
		&GetNormalizedOCLCNumber
72
        &xml_escape
73
        &xml_escape
73
74
75
        &GetVariationsOfISBN
76
        &GetVariationsOfISBNs
77
        &NormalizeISBN
78
74
		$DEBUG
79
		$DEBUG
75
	);
80
	);
76
	$DEBUG = 0;
81
	$DEBUG = 0;
Lines 1495-1509 sub _normalize_match_point { Link Here
1495
}
1500
}
1496
1501
1497
sub _isbn_cleanup {
1502
sub _isbn_cleanup {
1498
    require Business::ISBN;
1503
    my ($isbn) = @_;
1499
    my $isbn = Business::ISBN->new( $_[0] );
1504
    return NormalizeISBN(
1500
    if ( $isbn ) {
1505
        {
1501
        $isbn = $isbn->as_isbn10 if $isbn->type eq 'ISBN13';
1506
            isbn          => $isbn,
1502
        if (defined $isbn) {
1507
            format        => 'ISBN-10',
1503
            return $isbn->as_string([]);
1508
            strip_hyphens => 1,
1504
        }
1509
        }
1510
    );
1511
}
1512
1513
=head2 NormalizedISBN
1514
1515
  my $isbns = NormalizedISBN({
1516
    isbn => $isbn,
1517
    strip_hyphens => [0,1],
1518
    format => ['ISBN-10', 'ISBN-13']
1519
  });
1520
1521
  Returns an isbn validated by Business::ISBN.
1522
  Optionally strips hyphens and/or forces the isbn
1523
  to be of the specified format.
1524
1525
  If the string cannot be validated as an isbn,
1526
  it returns nothing.
1527
1528
=cut
1529
1530
sub NormalizeISBN {
1531
    my ($params) = @_;
1532
1533
    my $string        = $params->{isbn};
1534
    my $strip_hyphens = $params->{strip_hyphens};
1535
    my $format        = $params->{format};
1536
1537
    my $isbn = Business::ISBN->new($string);
1538
1539
    if ( $isbn && $isbn->error != Business::ISBN::BAD_ISBN ) {
1540
1541
        if ( $format eq 'ISBN-10' ) {
1542
            $isbn = $isbn->as_isbn10();
1543
        }
1544
        elsif ( $format eq 'ISBN-13' ) {
1545
            $isbn = $isbn->as_isbn13();
1546
        }
1547
1548
        if ($strip_hyphens) {
1549
            $string = $isbn->as_string( [] );
1550
        } else {
1551
            $string = $isbn->as_string();
1552
        }
1553
1554
        return $string;
1505
    }
1555
    }
1506
    return;
1556
}
1557
1558
=head2 GetVariationsOfISBN
1559
1560
  my @isbns = GetVariationsOfISBN( $isbn );
1561
1562
  Returns a list of varations of the given isbn in
1563
  both ISBN-10 and ISBN-13 formats, with and without
1564
  hyphens.
1565
1566
  In a scalar context, the isbns are returned as a
1567
  string delimited by ' | '.
1568
1569
=cut
1570
1571
sub GetVariationsOfISBN {
1572
    my ($isbn) = @_;
1573
1574
    my @isbns;
1575
1576
    push( @isbns, NormalizeISBN({ isbn => $isbn }) );
1577
    push( @isbns, NormalizeISBN({ isbn => $isbn, format => 'ISBN-10' }) );
1578
    push( @isbns, NormalizeISBN({ isbn => $isbn, format => 'ISBN-13' }) );
1579
    push( @isbns, NormalizeISBN({ isbn => $isbn, format => 'ISBN-10', strip_hyphens => 1 }) );
1580
    push( @isbns, NormalizeISBN({ isbn => $isbn, format => 'ISBN-13', strip_hyphens => 1 }) );
1581
1582
    return wantarray ? @isbns : join( " | ", @isbns );
1583
}
1584
1585
=head2 GetVariationsOfISBNs
1586
1587
  my @isbns = GetVariationsOfISBNs( @isbns );
1588
1589
  Returns a list of varations of the given isbns in
1590
  both ISBN-10 and ISBN-13 formats, with and without
1591
  hyphens.
1592
1593
  In a scalar context, the isbns are returned as a
1594
  string delimited by ' | '.
1595
1596
=cut
1597
1598
sub GetVariationsOfISBNs {
1599
    my (@isbns) = @_;
1600
1601
    @isbns = map { GetVariationsOfISBN( $_ ) } @isbns;
1602
1603
    return wantarray ? @isbns : join( " | ", @isbns );
1507
}
1604
}
1508
1605
1509
1;
1606
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 7067-7072 if ( CheckVersion($DBversion) ) { Link Here
7067
    SetVersion($DBversion);
7067
    SetVersion($DBversion);
7068
}
7068
}
7069
7069
7070
$DBversion = "3.13.00.XXX";
7071
if ( CheckVersion($DBversion) ) {
7072
    $dbh->do("
7073
        INSERT INTO systempreferences (
7074
            variable,
7075
            value,
7076
            explanation,
7077
            type
7078
        ) VALUES (
7079
            'AggressiveMatchOnISBN',
7080
            '0',
7081
            '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',
7082
            'YesNo'
7083
        )
7084
    ");
7085
7086
    print "Upgrade to $DBversion done (Bug 10500 - Improve isbn matching when importing records)\n";
7087
    SetVersion($DBversion);
7088
}
7089
7070
=head1 FUNCTIONS
7090
=head1 FUNCTIONS
7071
7091
7072
=head2 TableExists($table)
7092
=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