From 589aae724a8c4c6eebb400fbfb734a7dd61155d1 Mon Sep 17 00:00:00 2001 From: Srdjan Jankovic Date: Mon, 30 Jan 2012 15:29:41 +1300 Subject: [PATCH] bug_7458: A call number plugin --- cataloguing/value_builder/callnumber-KU.pl | 129 ++++++++++++++++++++++++++++ 1 files changed, 129 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..66bd75e --- /dev/null +++ b/cataloguing/value_builder/callnumber-KU.pl @@ -0,0 +1,129 @@ +#!/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 $dbh = C4::Context->dbh; + my $pad_len = 4 - length($num); + for (my $i = $pad_len - 1; $i >= 0; $i--) { + my $padded = $code . ("0" x $i); + if ( my $max = $dbh->selectrow_array("SELECT MAX(itemcallnumber) + FROM items + WHERE itemcallnumber LIKE ?", undef, "$padded%") ) { + my (undef, $num1) = ($max =~ $BASE_CALLNUMBER_RE); + my ($num_alpha, $num_num) = ($num1 =~ m/^(\D+)?(\d+)$/); + my $len = length($num_num); + $num_num++; + if ($len == length($num_num)) { # no overflow + $ret = $num_alpha . $num_num; + last; + } + } + } + unless ($ret) { + if ($num =~ m/^\d+$/) { + $ret = $num . ("0" x $pad_len); + } else { + $ret = $num ; + $ret .= "0" x ($pad_len - 1) if $pad_len > 1; + $ret .= "1"; + } + } + } + $ret = "$alpha $ret" if $ret; + + $template->param( + return => $ret || $code + ); + output_html_with_http_headers $input, $cookie, $template->output; +} + +1; -- 1.6.5