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

(-)a/cataloguing/value_builder/rma_isbn.pl (+51 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
use Modern::Perl;
4
use CGI;
5
6
my $builder = sub {
7
    my ( $params ) = @_;
8
    my $field_number = $params->{id};
9
10
    my $res="
11
<script type=\"text/javascript\" charset=\"utf-8\">
12
//<![CDATA[
13
14
function Change$field_number() {
15
    var isbn         = jQuery('#$field_number').val();
16
    var biblionumber = jQuery('input[name=\"biblionumber\"]').val();
17
    if ( isbn == '' ) change_color_isbn();
18
    else api_isbn_count( isbn, biblionumber, change_color_isbn );
19
    return 1;
20
}
21
22
function change_color_isbn (color) {
23
    jQuery('#$field_number').removeClass( 'callnumber_green callnumber_red' );
24
    if ( color ) jQuery('#$field_number').addClass( 'callnumber_' + color );
25
}
26
27
function api_isbn_count ( isbn, biblionumber, callback ) {
28
    var checked = isbn_check(isbn);
29
    if( !checked ) {
30
        callback('red');
31
        alert( isbn + ': is not a valid ISBN!' );
32
        return;
33
    }
34
    jQuery.ajax({
35
        method: 'GET',
36
        url: '/cgi-bin/koha/svc/isbn_count?isbn=' + checked + ( biblionumber ? 'skip=' + biblionumber : '' ),
37
    }).done(function (data) {
38
        jQuery('#$field_number').val(checked);
39
        callback( !data || data.count ? 'red' : 'green' );
40
    }).fail(function () {
41
        alert('An error occurred when checking isbn');
42
    });
43
}
44
45
//]]>
46
</script>
47
";
48
return $res;
49
};
50
51
return { builder => $builder };
(-)a/cataloguing/value_builder/rma_issn.pl (+50 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
use Modern::Perl;
4
use CGI;
5
6
my $builder = sub {
7
    my ( $params ) = @_;
8
    my $field_number = $params->{id};
9
10
    my $res="
11
<script type=\"text/javascript\" charset=\"utf-8\">
12
//<![CDATA[
13
14
function Change$field_number() {
15
    var issn         = jQuery('#$field_number').val();
16
    var biblionumber = jQuery('input[name=\"biblionumber\"]').val();
17
    if ( issn == '' ) change_color_issn();
18
    else api_issn_count( issn, biblionumber, change_color_issn );
19
    return 1;
20
}
21
22
function change_color_issn (color) {
23
    jQuery('#$field_number').removeClass( 'callnumber_green callnumber_red' );
24
    if ( color ) jQuery('#$field_number').addClass( 'callnumber_' + color );
25
}
26
27
function api_issn_count ( issn, biblionumber, callback ) {
28
    var checked = issn_check(issn);
29
    if( !checked ) {
30
        callback('red');
31
        alert( issn + ': is not a valid ISSN!' );
32
        return;
33
    }
34
    jQuery.ajax({
35
        method: 'GET',
36
        url: '/cgi-bin/koha/svc/issn_count?issn=' + checked + ( biblionumber ? 'skip=' + biblionumber : '' ),
37
    }).done(function (data) {
38
        callback( !data || data.count ? 'red' : 'green' );
39
    }).fail(function () {
40
        alert('An error occurred when checking issn');
41
    });
42
}
43
44
//]]>
45
</script>
46
";
47
return $res;
48
};
49
50
return { builder => $builder };
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt (+2 lines)
Lines 27-32 Link Here
27
</script>
27
</script>
28
[% Asset.js("js/cataloging.js") | $raw %]
28
[% Asset.js("js/cataloging.js") | $raw %]
29
[% Asset.js("js/browser.js") | $raw %]
29
[% Asset.js("js/browser.js") | $raw %]
30
[% Asset.js("js/isbn.js") | $raw %]
31
[% Asset.js("js/issn.js") | $raw %]
30
<script>
32
<script>
31
    var browser = KOHA.browser('[% searchid | html %]', parseInt('[% biblionumber | html %]', 10));
33
    var browser = KOHA.browser('[% searchid | html %]', parseInt('[% biblionumber | html %]', 10));
32
    browser.show();
34
    browser.show();
(-)a/koha-tmpl/intranet-tmpl/prog/js/isbn.js (+47 lines)
Line 0 Link Here
1
// RMA
2
// Check iSBN from MARC21 020$a field (or UNIMARC counterpart)
3
// Note: hyphens are removed during the check !
4
// Check digit algorithm from an example on oreilly.com (regular expression cookbook)
5
// TODO: Stripping a suffix should be removed later.
6
7
function isbn_check (isbn_subfield_a) {
8
    // Remove hyphens and suffix
9
    var isbn = isbn_subfield_a.replace( /[-]/g, '' );
10
    var regex = /^(\d{9}(\d{3})?[0-9X])(?=\s|$)/;
11
    var matches;
12
    if ( matches = isbn.match(regex) ) {
13
        if( valid_isbn_check_digit( matches[1] ) ) return matches[1];
14
    }
15
    return '';
16
}
17
18
function valid_isbn_check_digit(isbn) {
19
    var chars = isbn.split("");
20
    var last = chars.pop();
21
    var sum = 0;
22
    var check, i;
23
    if (chars.length == 9) {
24
        // Compute the ISBN-10 check digit
25
        chars.reverse();
26
        for (i = 0; i < chars.length; i++) {
27
            sum += (i + 2) * parseInt(chars[i], 10);
28
        }
29
        check = 11 - (sum % 11);
30
        if (check == 10) {
31
            check = "X";
32
        } else if (check == 11) {
33
            check = "0";
34
        }
35
    } else {
36
        // Compute the ISBN-13 check digit
37
        for (i = 0; i < chars.length; i++) {
38
            sum += (i % 2 * 2 + 1) * parseInt(chars[i], 10);
39
        }
40
        check = 10 - (sum % 10);
41
        if (check == 10) {
42
            check = "0";
43
        }
44
    }
45
    if (check == last) return 1;
46
    return 0;
47
}
(-)a/koha-tmpl/intranet-tmpl/prog/js/issn.js (+35 lines)
Line 0 Link Here
1
// RMA
2
// Check ISSN from MARC21 022$a field (or UNIMARC counterpart)
3
// Note: We assume NNNN-NNNC format.
4
// Check digit algorithm based on example on oreilly.com (regular expression cookbook)
5
// TODO: Stripping a suffix should be removed later.
6
7
function issn_check (issn) {
8
    // Remove suffix
9
    var regex = /^(\d{4}\-\d{3}[0-9X])(?=\s|$)/;
10
    var matches;
11
    if ( matches = issn.match(regex) ) {
12
        if( valid_issn_check_digit( matches[1] ) ) return matches[1];
13
    }
14
    return '';
15
}
16
17
function valid_issn_check_digit(issn) {
18
    var chars = issn.replace( /[-]/g, '' ).split("");
19
    var last = chars.pop();
20
    var sum = 0;
21
    var check, i;
22
    if ( chars.length == 7 ) {
23
        // Compute the ISSN check digit
24
        chars.reverse();
25
        for (i = 0; i < chars.length; i++) {
26
            sum += (i + 2) * parseInt(chars[i], 10);
27
        }
28
        check = 11 - (sum % 11);
29
        if (check == 10) {
30
            check = "X";
31
        }
32
    }
33
    if (check == last) return 1;
34
    return 0;
35
}
(-)a/svc/isbn_count (+48 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
# Copyright Rijksmuseum 2023
4
5
# We still need this svc script, since the REST API biblio endpoint does not allow index searches.
6
7
use Modern::Perl;
8
use CGI qw ( -utf8 );
9
use JSON;
10
use C4::Auth qw();
11
use C4::Search qw(SimpleSearch);
12
13
my $query = CGI->new;
14
my $isbn  = $query->param('isbn');
15
my $skip  = $query->param('skip');    # this is a biblionumber
16
17
my ( $status, $cookie, $sessionID ) = C4::Auth::check_api_auth( $query, { catalogue => 1 } );
18
unless ( $status eq "ok" ) {
19
    print $query->header(-type => 'text/plain', -status => '403 Forbidden' );
20
    exit 0;
21
}
22
if( !$isbn ) {
23
    print $query->header(-type => 'text/plain', -status => '400 Bad request' );
24
    exit 0;
25
}
26
27
my ( undef, undef, $count ) = SimpleSearch( $skip ? "nb=$isbn not cnum=$skip" : "nb=$isbn" );
28
# my $count = dbsearch( $isbn, $skip );
29
30
print $query->header( -type => 'application/json', -charset => 'UTF-8' );
31
print JSON::encode_json( { count => $count } );
32
33
__END__
34
35
sub dbsearch { # slower than zebra with a larger database
36
    my ( $isbn, $skip ) = @_;
37
    return Koha::Biblioitems->search(
38
        {
39
            -or  => [
40
                { isbn => $isbn },
41
                { isbn => { '-LIKE', "$isbn %" } },
42
                { isbn => { '-LIKE', "% $isbn" } },
43
                { isbn => { '-LIKE', "% $isbn %" } },
44
            ],
45
            $skip ? ( biblionumber => { '!=', $skip } ) : (),
46
        }
47
    )->count;
48
}
(-)a/svc/issn_count (-1 / +31 lines)
Line 0 Link Here
0
- 
1
#!/usr/bin/perl
2
3
# Copyright Rijksmuseum 2023
4
5
# We still need this svc script, since the REST API biblio endpoint does not allow index searches.
6
7
use Modern::Perl;
8
use CGI qw ( -utf8 );
9
use JSON;
10
use C4::Auth qw();
11
use C4::Search qw(SimpleSearch);
12
#use Koha::Biblioitems;
13
14
my $query = CGI->new;
15
my $issn  = $query->param('issn');
16
my $skip  = $query->param('skip');    # this is a biblionumber
17
18
my ( $status, $cookie, $sessionID ) = C4::Auth::check_api_auth( $query, { catalogue => 1 } );
19
unless ( $status eq "ok" ) {
20
    print $query->header(-type => 'text/plain', -status => '403 Forbidden' );
21
    exit 0;
22
}
23
if( !$issn ) {
24
    print $query->header(-type => 'text/plain', -status => '400 Bad request' );
25
    exit 0;
26
}
27
28
my ( undef, undef, $count ) = SimpleSearch( $skip ? "ns=$issn not cnum=$skip" : "ns=$issn" );
29
30
print $query->header( -type => 'application/json', -charset => 'UTF-8' );
31
print JSON::encode_json( { count => $count } );

Return to bug 34860