From 5fcb500266cd9c310bcb0db9d08cc5de668c705a Mon Sep 17 00:00:00 2001 From: Srdjan Jankovic Date: Mon, 6 Feb 2012 13:33:39 +1300 Subject: [PATCH] bug_7458: A call number plugin --- cataloguing/value_builder/callnumber-KU.pl | 135 ++++++++++++++++++++++++++++ installer/data/mysql/kohastructure.sql | 1 + installer/data/mysql/updatedatabase.pl | 8 ++ 3 files changed, 144 insertions(+), 0 deletions(-) create mode 100755 cataloguing/value_builder/callnumber-KU.pl diff --git a/cataloguing/value_builder/callnumber-KU.pl b/cataloguing/value_builder/callnumber-KU.pl new file mode 100755 index 0000000..8c4b1b7 --- /dev/null +++ b/cataloguing/value_builder/callnumber-KU.pl @@ -0,0 +1,135 @@ +#!/usr/bin/perl + +# Copyright 2012 CatalystIT Ltd +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use strict; +use warnings; +use C4::Auth; +use CGI; +use C4::Context; + +=head1 DESCRIPTION + +Is used for callnumber computation. + +User must supply a letter prefix (unspecified length) followed by an empty space followed by a "number". +"Number" is 4 character long, and is either a number sequence which is 01 padded. +If input does not conform with this format any processing is omitted. + +Some examples of legal values that trigger auto allocation: + +AAA 0 - returns first unused number AAA 0xxx starting with AAA 0001 +BBB 12 - returns first unused number BBB 12xx starting with BBB 1201 +CCC QW - returns first unused number CCC QWxx starting with CCC QW01 + +=cut + +sub plugin_parameters { +} + +sub plugin_javascript { + my ($dbh,$record,$tagslib,$field_number,$tabloop) = @_; + my $res=" + + "; + + return ($field_number,$res); +} + +my $BASE_CALLNUMBER_RE = qr/^(\w+) (\w+)$/; +sub plugin { + my ($input) = @_; + my $code = $input->param('code'); + + my ($template, $loggedinuser, $cookie) = get_template_and_user({ + template_name => "cataloguing/value_builder/ajax.tmpl", + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => {editcatalogue => '*'}, + debug => 1, + }); + + my $ret; + my ($alpha, $num) = ($code =~ $BASE_CALLNUMBER_RE); + if (defined $num) { # otherwise no point + my ($num_alpha, $num_num) = ($num =~ m/^(\D+)?(\d+)?$/); + $num_alpha ||= ''; + my $pad_len = 4 - length($num); + + if ($pad_len > 0) { + my $num_padded = $num_num; + $num_padded .= "0" x ($pad_len - 1) if $pad_len > 1; + $num_padded .= "1"; + my $padded = "$alpha $num_alpha" . $num_padded; + + my $dbh = C4::Context->dbh; + if ( my $first = $dbh->selectrow_array("SELECT itemcallnumber + FROM items + WHERE itemcallnumber = ?", undef, $padded) ) { + my $icn = $dbh->selectcol_arrayref("SELECT itemcallnumber + FROM items + WHERE itemcallnumber LIKE ? + AND itemcallnumber > ? + ORDER BY itemcallnumber", undef, "$alpha $num_alpha%", $first); + my $next = $num_padded + 1; + my $len = length($num_padded); + foreach (@$icn) { + my ($num1) = ( m/(\d+)$/o ); + if ($num1 > $next) { # a hole in numbering found, stop + last; + } + $next++; + } + $ret = "$alpha $num_alpha" . sprintf("%0${len}d", $next) if length($next) <= $len; # no overflow + } + else { + $ret = $padded; + } + } + } + + $template->param( + return => $ret || $code + ); + output_html_with_http_headers $input, $cookie, $template->output; +} + +1; diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql index 37113c2..34bf1d6 100644 --- a/installer/data/mysql/kohastructure.sql +++ b/installer/data/mysql/kohastructure.sql @@ -1045,6 +1045,7 @@ CREATE TABLE `items` ( -- holdings/item information KEY `itembibnoidx` (`biblionumber`), KEY `homebranch` (`homebranch`), KEY `holdingbranch` (`holdingbranch`), + KEY (itemcallnumber), CONSTRAINT `items_ibfk_1` FOREIGN KEY (`biblioitemnumber`) REFERENCES `biblioitems` (`biblioitemnumber`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `items_ibfk_2` FOREIGN KEY (`homebranch`) REFERENCES `branches` (`branchcode`) ON UPDATE CASCADE, CONSTRAINT `items_ibfk_3` FOREIGN KEY (`holdingbranch`) REFERENCES `branches` (`branchcode`) ON UPDATE CASCADE diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index 099dfb9..b6f72f9 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -4663,6 +4663,14 @@ ENDOFRENEWAL print "Upgrade to $DBversion done (Added a system preference to allow renewal of Patron account either from todays date or from existing expiry date in the patrons account.)\n"; SetVersion($DBversion); } + +$DBversion = "3.07.00.XXX"; +if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { + $dbh->do("ALTER TABLE items ADD KEY (itemcallnumber)"); + print "Upgrade to $DBversion done (Added index on items.itemcallnumber)\n"; + SetVersion($DBversion); +} + =head1 FUNCTIONS =head2 DropAllForeignKeys($table) -- 1.6.5