From a0084b9e802dcf0e81b4078bf75d81e6bf834fea Mon Sep 17 00:00:00 2001 From: Srdjan Jankovic Date: Mon, 30 Jan 2012 22:54:04 +1300 Subject: [PATCH] bug_7458: A call number plugin --- cataloguing/value_builder/callnumber-KU.pl | 132 ++++++++++++++++++++++++++++ 1 files changed, 132 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..becee75 --- /dev/null +++ b/cataloguing/value_builder/callnumber-KU.pl @@ -0,0 +1,132 @@ +#!/usr/bin/perl + +# Copyright 2010 BibLibre SARL +# +# 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 0 padded +or two letters which are 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 0000 +BBB 12 - returns first unused number BBB 12xx starting with BBB 1200 +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); + + my $padded = $code; + if ($num_alpha) { + $padded .= "0" x ($pad_len - 1) if $pad_len > 1; + $padded .= "1"; + } else { + $padded .= "0" x $pad_len; + } + + my $dbh = C4::Context->dbh; + if ( my $first = $dbh->selectrow_array("SELECT itemcallnumber + FROM items + WHERE itemcallnumber = ?", undef, $padded) ) { + my $max = $dbh->selectrow_array("SELECT MIN(itemcallnumber) + FROM items + WHERE itemcallnumber LIKE ? + AND itemcallnumber >= ?", undef, "$alpha $num_alpha%", $code); + my ($num1) = ($max =~ m/(\d+)$/o); + my $len = length($num1); + $num1++; + if ($len == length($num1)) { # no overflow + $ret = "$alpha $num_alpha" . $num1; + } + } + else { + $ret = $padded; + } + } + + $template->param( + return => $ret || $code + ); + output_html_with_http_headers $input, $cookie, $template->output; +} + +1; -- 1.6.5