[Koha-patches] [PATCH] bug_7458: A call number plugin

Srdjan Jankovic srdjan at catalyst.net.nz
Mon Feb 6 01:35:43 CET 2012


---
 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="
+    <script type='text/javascript'>
+        function Focus$field_number() {
+            return 1;
+        }
+
+        function Blur$field_number() {
+                return 1;
+        }
+
+        function Clic$field_number() {
+                var code = document.getElementById('$field_number');
+                var url = '../cataloguing/plugin_launcher.pl?plugin_name=callnumber-KU.pl&code=' + code.value;
+                var blurcallbackcallnumber = {
+                    success: function(o) {
+                        var field = document.getElementById('$field_number');
+                        field.value = o.responseText;
+                        return 1;
+                    }
+                }
+                var transaction = YAHOO.util.Connect.asyncRequest('GET',url, blurcallbackcallnumber, null);
+            return 1;
+        }
+    </script>
+    ";
+
+    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



More information about the Koha-patches mailing list