[Koha-patches] [PATCH] Bug 5418: Add a new itemBarcodeInputFilter for libsuite8 style barcodes

Koustubha Kale kmkale at anantcorp.com
Thu Nov 18 07:31:41 CET 2010


In India a ILS product called Libsuite8 prints barcodes like b0007432. The
barcode is not stored anywhere in libsuite8's database. Neither is barcode
available in any of the reports generated by the software.

The barcode 'b0007432' when scanned into the libsuite8 software is
de-constructed like 'b' which is the itemtype i.e. Book in this instance, and
'7432' which is the 'Accession Number'. The software then takes the logged in
staff's branchcode and does a join on three tables 'Location', 'Media_Type',
and 'Books' to retrieve the particular record from the database.

There is no possibility of recreating the barcodes for insertion in Koha while
doing a retrospective conversion, because of arbitrary length of the barcode
string AND arbitrary number of zeros in the numeric part of the printed barcode
AND the fact that there are no reports available from the software which
contain barcodes AND the fact that the barcode is not stored in the database.
But most importantly due to the simple fact that printed barcodes are
duplicated among branches.

Therefore this patch emulates the functionality of Libsuite8 software of converting the scanned barcode into one stored in Koha using the itemBarcodeInputFilter system preference.

To use this new itemBarcodeInputFilter systempreference choice called 'libsuite8', the barcodes stored in Koha must match the pattern of <branchcode>-<itemtype_code>-<accession_number>. This is easy to achieve while doing retrospective conversion from Libsuite8 to Koha.

As expected the itemBarcodeInputFilter will return unmodified barcode is presented with a barcode of pattern <branchcode>-<itemtype_code>-<accession_number>

The perl code in C4/Circulation.pm is ugly and NEEDS major code cleanup. All help is much appreciated..
---
 C4/Circulation.pm                                  |   27 +++++++++++++++++++-
 circ/circulation.pl                                |    4 +-
 installer/data/mysql/en/mandatory/sysprefs.sql     |    2 +-
 installer/data/mysql/updatedatabase.pl             |    2 +-
 .../en/modules/admin/preferences/circulation.pref  |    1 +
 .../prog/en/modules/circ/circulation.tmpl          |    2 +-
 6 files changed, 32 insertions(+), 6 deletions(-)

diff --git a/C4/Circulation.pm b/C4/Circulation.pm
index 10c3c11..08778ca 100644
--- a/C4/Circulation.pm
+++ b/C4/Circulation.pm
@@ -136,7 +136,7 @@ System Pref options.
 # FIXME -- these plugins should be moved out of Circulation.pm
 #
 sub barcodedecode {
-    my ($barcode, $filter) = @_;
+    my ($barcode, $filter, $branch) = @_;
     $filter = C4::Context->preference('itemBarcodeInputFilter') unless $filter;
     $filter or return $barcode;     # ensure filter is defined, else return untouched barcode
 	if ($filter eq 'whitespace') {
@@ -155,6 +155,31 @@ sub barcodedecode {
         # FIXME: $barcode could be "T1", causing warning: substr outside of string
         # Why drop the nonzero digit after the T?
         # Why pass non-digits (or empty string) to "T%07d"?
+	} elsif ($filter eq 'libsuite8') {
+	# FIXME: This NEEDS major code cleanup. All help is much appreciated
+		use Scalar::Util qw(looks_like_number);
+		my $barcode1=$barcode;
+		my $branchcode=$branch."-";
+		if($barcode1 =~ m/^$branchcode/){
+		}
+		else {
+			my @chars;
+			my @nums;
+			my @m1=split(/ */, $barcode);
+			foreach (@m1){
+				looks_like_number ($_) ? push(@nums,$_) : push(@chars,$_);
+			}
+		my @n1;
+		foreach(@nums){
+			if($_ > 0){
+				push(@n1,$_);
+			}
+		}
+		my ($chars) = join('', at chars);
+		my ($n1) = join('', at n1);
+		$barcode = "$branchcode" . $chars . "-" . $n1;
+		}
+
 	}
     return $barcode;    # return barcode, modified or not
 }
diff --git a/circ/circulation.pl b/circ/circulation.pl
index 7c4a0dc..b358a84 100755
--- a/circ/circulation.pl
+++ b/circ/circulation.pl
@@ -115,8 +115,8 @@ if (C4::Context->preference("UseTablesortForCirc")) {
 
 my $barcode        = $query->param('barcode') || '';
 $barcode =~  s/^\s*|\s*$//g; # remove leading/trailing whitespace
-
-$barcode = barcodedecode($barcode) if( $barcode && C4::Context->preference('itemBarcodeInputFilter'));
+my $filter = C4::Context->preference('itemBarcodeInputFilter') || '';
+$barcode = barcodedecode($barcode,$filter,$branch) if( $barcode && C4::Context->preference('itemBarcodeInputFilter'));
 my $stickyduedate  = $query->param('stickyduedate') || $session->param('stickyduedate');
 my $duedatespec    = $query->param('duedatespec')   || $session->param('stickyduedate');
 my $issueconfirmed = $query->param('issueconfirmed');
diff --git a/installer/data/mysql/en/mandatory/sysprefs.sql b/installer/data/mysql/en/mandatory/sysprefs.sql
index 214d198..1904172 100644
--- a/installer/data/mysql/en/mandatory/sysprefs.sql
+++ b/installer/data/mysql/en/mandatory/sysprefs.sql
@@ -145,7 +145,7 @@ INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('finesMode','test','Choose the fines mode, \'off\', \'test\' (emails admin report) or \'production\' (accrue overdue fines).  Requires accruefines cronjob.','off|test|production','Choice');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('globalDueDate','','If set, allows a global static due date for all checkouts','10','free');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('ceilingDueDate','','If set, date due will not be past this date.  Enter date according to the dateformat System Preference',NULL,'free');
-INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('itemBarcodeInputFilter','','If set, allows specification of a item barcode input filter','whitespace|T-prefix|cuecat','Choice');
+INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('itemBarcodeInputFilter','','If set, allows specification of a item barcode input filter','whitespace|T-prefix|cuecat|libsuite8','Choice');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('singleBranchMode',0,'Operate in Single-branch mode, hide branch selection in the OPAC',NULL,'YesNo');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('URLLinkText','','Text to display as the link anchor in the OPAC',NULL,'free');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OPACViewOthersSuggestions',0,'If ON, allows all suggestions to be displayed in the OPAC',NULL,'YesNo');
diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl
index bf7acb6..66297db 100755
--- a/installer/data/mysql/updatedatabase.pl
+++ b/installer/data/mysql/updatedatabase.pl
@@ -731,7 +731,7 @@ $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,ty
 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('libraryAddress','','The address to use for printing receipts, overdues, etc. if different than physical address',NULL,'free')");
 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('finesMode','test','Choose the fines mode, test or production','test|production','Choice')");
 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('globalDueDate','','If set, allows a global static due date for all checkouts',NULL,'free')");
-$dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('itemBarcodeInputFilter','','If set, allows specification of a item barcode input filter','cuecat','Choice')");
+$dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('itemBarcodeInputFilter','','If set, allows specification of a item barcode input filter','libsuite8','Choice')");
 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('singleBranchMode',0,'Operate in Single-branch mode, hide branch selection in the OPAC',NULL,'YesNo')");
 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('URLLinkText','','Text to display as the link anchor in the OPAC',NULL,'free')");
 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OPACSubscriptionDisplay','economical','Specify how to display subscription information in the OPAC','economical|off|full','Choice')");
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref
index c4d4305..46570ee 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref
@@ -14,6 +14,7 @@ Circulation:
                   whitespace: Remove spaces from
                   cuecat: Convert from CueCat form
                   T-prefix: Remove the first number from T-prefix style
+                  libsuite8: Convert from Libsuite8 form
             - scanned patron barcodes.
         -
             - Sort previous checkouts on the circulation page from
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tmpl
index 822de15..89874ab 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tmpl
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tmpl
@@ -301,7 +301,7 @@ function refocus(calendar) {
         <!-- /TMPL_IF -->
 
         <!-- TMPL_IF NAME="UNKNOWN_BARCODE" -->
-            <li>The barcode was not found</li>
+            <li>The barcode was not found <!-- TMPL_VAR NAME="barcode" --></li>
         <!-- /TMPL_IF -->
 
         <!-- TMPL_IF NAME="NOT_FOR_LOAN" -->
-- 
1.7.0.4



More information about the Koha-patches mailing list