From acb95f291bc47514ef3a4ff8e04924793cc9814d Mon Sep 17 00:00:00 2001 From: Srdjan Jankovic Date: Mon, 23 Jan 2012 20:43:44 +1300 Subject: [PATCH] bug_7458: call number plugin --- cataloguing/value_builder/callnumber-KU.pl | 127 ++++++++++++++++++++++++++++ 1 files changed, 127 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..885026f --- /dev/null +++ b/cataloguing/value_builder/callnumber-KU.pl @@ -0,0 +1,127 @@ +#!/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 i4 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 largest number AAA 0xxx incremented by 1 or AAA 0000 +BBB 12 - returns largest number BBB 12xx incremented by 1 or BBB 1200 +CCC QW - returns largest number CCC QWxx incremented by 1 or 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; + if ( my $max = $dbh->selectrow_array("SELECT MAX(itemcallnumber) + FROM items + WHERE itemcallnumber LIKE ?", undef, "$code%") ) { + (undef, $num) = ($max =~ $BASE_CALLNUMBER_RE); + my ($num_alpha, $num_num) = ($num =~ m/^(\D+)?(\d+)$/); + my $len = length($num_num); + $num_num++; + if ($len == length($num_num)) { # no overflow + $ret = $num_alpha . $num_num + } + } + else { # pad with 0 + my $pad_len = 4 - length($num); + if ($pad_len > 0) { + 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