MT2663 : Adds an itemcallnumber plugin
authorMatthias Meusburger <matthias.meusburger@biblibre.com>
Thu, 28 Jan 2010 11:06:44 +0000 (12:06 +0100)
committerHenri-Damien LAURENT <henridamien.laurent@biblibre.com>
Wed, 10 Feb 2010 13:01:28 +0000 (14:01 +0100)
cataloguing/value_builder/callnumber.pl [new file with mode: 0755]

diff --git a/cataloguing/value_builder/callnumber.pl b/cataloguing/value_builder/callnumber.pl
new file mode 100755 (executable)
index 0000000..ecdaea4
--- /dev/null
@@ -0,0 +1,115 @@
+#!/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., 59 Temple Place,
+# Suite 330, Boston, MA  02111-1307 USA
+
+use strict;
+use warnings;
+use C4::Auth;
+use CGI;
+use C4::Context;
+
+=head1
+
+Is used for callnumber computation.
+
+If the user send an empty string, we return a simple incremented callnumber.
+If a prefix is submited, we look for the highest callnumber with this prefix, and return it incremented.
+In this case, a callnumber has this form : "PREFIX 0009678570".
+ - PREFIX is an upercase word
+ - a space separator
+ - 10 digits, with leading 0s if needed
+
+=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() {
+                var code = document.getElementById('$field_number');
+                var url = '../cataloguing/plugin_launcher.pl?plugin_name=callnumber.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;
+        }
+
+        function Clic$field_number() {
+            return 1;
+        }
+    </script>
+    ";
+
+    return ($field_number,$res);
+}
+
+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 $dbh = C4::Context->dbh;
+    # If the textbox is empty, we return a simple incremented callnumber
+    if ( $code eq "" ) {
+        my $sth = $dbh->prepare("SELECT MAX(CAST(itemcallnumber AS SIGNED)) FROM items");
+        $sth->execute;
+    
+        if ( my $max = $sth->fetchrow ) {
+            $template->param(
+                return => $max+1,
+            );
+        }
+    # If a prefix is submited, we look for the highest itemcallnumber with this prefix, and return it incremented
+    } elsif ( $code =~ m/^[A-Z]+$/ ) {
+        my $sth = $dbh->prepare("SELECT MAX(CAST(SUBSTRING_INDEX(itemcallnumber,' ',-1) AS SIGNED)) FROM items WHERE itemcallnumber LIKE ?");
+        $sth->execute($code.' %');
+        if ( my $max = $sth->fetchrow ) {
+            $template->param(
+                return => $code.' '.($max+1)
+            );
+        }
+    # The user entered a custom value, we don't touch it, this could be handled in js
+    } else {
+        $template->param(
+            return => $code,
+        );
+    }
+    output_html_with_http_headers $input, $cookie, $template->output;
+}
+
+1;