[Koha-patches] [PATCH 1/2] [SIGNED-OFF] Bug 6963: Corrects a problem when a new order is created with a duplicate barcode.

Katrin Fischer Katrin.Fischer.83 at web.de
Mon Oct 17 22:53:25 CEST 2011


From: Frédérick Capovilla <frederick.capovilla at libeo.com>

If the AcqCreateItem preference is set to "ordering" and the barcode for
the new item is already in use, no error is returned, but an invalid
itemnumber is saved in the aqorders_items table and the item is never
created.

This patch adds a duplicate barcode verification in neworderempty.pl
_koha_add_item is also modified so it won't return an invalid ID when
an item can't be added.

http://bugs.koha-community.org/show_bug.cgi?id=6963
Signed-off-by: Katrin Fischer <Katrin.Fischer.83 at web.de>
Test plan on second patch.
---
 C4/Items.pm                                        |    7 ++-
 acqui/check_duplicate_barcode_ajax.pl              |   55 ++++++++++++++++++++
 .../prog/en/modules/acqui/neworderempty.tt         |   48 ++++++++++++++++-
 3 files changed, 106 insertions(+), 4 deletions(-)
 create mode 100755 acqui/check_duplicate_barcode_ajax.pl

diff --git a/C4/Items.pm b/C4/Items.pm
index ca67c6d..b4421d7 100644
--- a/C4/Items.pm
+++ b/C4/Items.pm
@@ -2139,10 +2139,15 @@ sub _koha_new_item {
             $item->{'copynumber'},
             $item->{'stocknumber'},
     );
-    my $itemnumber = $dbh->{'mysql_insertid'};
+
+    my $itemnumber;
     if ( defined $sth->errstr ) {
         $error.="ERROR in _koha_new_item $query".$sth->errstr;
     }
+    else {
+        $itemnumber = $dbh->{'mysql_insertid'};
+    }
+
     return ( $itemnumber, $error );
 }
 
diff --git a/acqui/check_duplicate_barcode_ajax.pl b/acqui/check_duplicate_barcode_ajax.pl
new file mode 100755
index 0000000..fe50b6d
--- /dev/null
+++ b/acqui/check_duplicate_barcode_ajax.pl
@@ -0,0 +1,55 @@
+#!/usr/bin/perl
+
+# Frédérick Capovilla, 2011 - Libéo
+#
+# 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; FIXME - Bug 2505
+use CGI;
+use CGI::Cookie;
+use JSON;
+use C4::Auth;
+use C4::Items;
+use C4::Context;
+
+my $input        = new CGI;
+print $input->header('application/json');
+
+# Check the user's permissions
+my %cookies = fetch CGI::Cookie;
+my $sessid = $cookies{'CGISESSID'}->value || $input->param('CGISESSID');
+my ($auth_status, $auth_sessid) = C4::Auth::check_cookie_auth($sessid, {acquisition => 'order_manage'});
+if ($auth_status ne "ok") {
+    print to_json({status => 'UNAUTHORIZED'});
+    exit 0;
+}
+
+my $json;
+
+#Check if the barcodes already exist.
+my @barcodes = $input->param('barcodes');
+foreach my $barcode (@barcodes) {
+    my $existing_itemnumber = GetItemnumberFromBarcode($barcode);
+    if ($existing_itemnumber) {
+        $json->{status} = "DUPLICATES";
+        push @{$json->{barcodes}}, $barcode;
+    }
+}
+
+$json->{status} = 'OK' unless defined $json->{status};
+print to_json($json);
+
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/neworderempty.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/neworderempty.tt
index 39e9ca2..ed5ee82 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/neworderempty.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/neworderempty.tt
@@ -46,26 +46,68 @@ function Check(ff) {
     }
 
     if ( ff.field_value ) {
+        var barcodes = [];
         var empty_item_mandatory = 0;
         for (i = 0; i < ff.field_value.length; i++) {
             //alert("i = " + i + " => " + ff.kohafield[i] );
             if (ff.field_value[i].value.length == 0 && ff.mandatory[i].value == 1) {
                 empty_item_mandatory++;
             }
+            if(ff.subfield[i].value === 'p' && ff.field_value[i].value.length != 0) {
+                barcodes.push(ff.field_value[i].value);
+            }
         }
         if (empty_item_mandatory > 0) {
             ok = 1;
             _alertString +=
                 "\n- " + empty_item_mandatory + _(" item mandatory fields empty");
         }
+
+        if(barcodes.length > 0) {
+            // Check for duplicate barcodes in the form
+            barcodes = barcodes.sort();
+            for(var i=0; i<barcodes.length-1; i++) {
+                if(barcodes[i] == barcodes[i+1]) {
+                    ok = 1;
+                    _alertString += "\n- " + _("The barcode ") + barcodes[i] + _(" is used more than once in the form. Every barcode must be unique");
+                }
+            }
+
+            // Check for duplicate barcodes in the database via an ajax call
+            $.ajax({
+                url: "/cgi-bin/koha/acqui/check_duplicate_barcode_ajax.pl",
+                async:false,
+                method: "post",
+                data: {barcodes : barcodes},
+                dataType: 'json',
+
+                error: function(xhr) {
+                    alert("Error: \n" + xhr.responseText);
+                },
+                success: function(json) {
+                    switch(json.status) {
+                        case 'UNAUTHORIZED':
+                            ok = 1;
+                            _alertString += "\n- " + _("Error: Duplicate barcode verification failed. Insufficient user permissions.");
+                            break;
+                        case 'DUPLICATES':
+                            ok = 1;
+                            $.each(json.barcodes, function(index, barcode) {
+                                _alertString += "\n- " + _("The barcode ") + barcode + _(" already exists in the database");
+                            });
+                            break;
+                    }
+                },
+            });
+        }
     }
 
-if (ok) {
+    if (ok) {
         alert(_alertString);
-    return false;
+        return false;
     }
 
-ff.submit();
+    ff.submit();
 
 }
 
-- 
1.7.5.4



More information about the Koha-patches mailing list