From 089b1151f5d9222e7171060b9d352e2a22a1be2b Mon Sep 17 00:00:00 2001 From: Dobrica Pavlinusic Date: Wed, 28 Mar 2012 00:38:34 +0200 Subject: [PATCH] Bug 6448 [1/3] EAN-13/UPC-A itemBarcodeInputFilter This filter which check validity of EAN-13 barcode and padd it with zeros up to full 13 digit number. This will also expand 12 digit UPC-A barcodes to EAN-13 automatically which is useful for older barcode readers which tend to ignore first zero in EAN-13 if they have just UPC-A support. It should be noted that EAN-13 or UPC-A product codes printed on books are not good choice for barcodes in Koha since each item has to have unique barcode. Test scenario: 1. prove t/Circulation_barcodedecode.t this checks expansion of 12 digit UPC-A to 13 digit EAN-13 and zero padding 2. in systempreferences search for itemBarcodeInputFilter and select EAN-13 3. edit one item and assign it valid EAN-13 barcode, eg. 0000000695152, check it out 4. test checkin with just 695152 to test leading zero expansion Signed-off-by: Chris Cormack --- C4/Circulation.pm | 10 ++++++++++ installer/data/mysql/sysprefs.sql | 2 +- installer/data/mysql/updatedatabase.pl | 7 +++++++ .../prog/en/modules/admin/preferences/circulation.pref | 1 + t/Circulation_barcodedecode.t | 4 +++- 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 1a13e7ae58..78915ed922 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -38,6 +38,8 @@ use C4::Branch; # GetBranches use C4::Log; # logaction use C4::Koha qw(GetAuthorisedValueByCode); use C4::Overdues qw(CalcFine UpdateFine); +use Algorithm::CheckDigits; + use Data::Dumper; use Koha::DateUtils; use Koha::Calendar; @@ -169,6 +171,14 @@ sub barcodedecode { $barcode =~ s/^(\D+)[0]*(\d+)$/$branch-$1-$2/i; } } + } elsif ($filter eq 'EAN13') { + my $ean = CheckDigits('ean'); + if ( $ean->is_valid($barcode) ) { + #$barcode = sprintf('%013d',$barcode); # this doesn't work on 32-bit systems + $barcode = '0' x ( 13 - length($barcode) ) . $barcode; + } else { + warn "# [$barcode] not valid EAN-13/UPC-A\n"; + } } return $barcode; # return barcode, modified or not } diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql index 6a5337997b..bd2c1034a5 100644 --- a/installer/data/mysql/sysprefs.sql +++ b/installer/data/mysql/sysprefs.sql @@ -166,7 +166,7 @@ INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('emailLibrarianWhenHoldIsPlaced',0,'If ON, emails the librarian whenever a hold is placed',NULL,'YesNo'); INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('numReturnedItemsToShow','20','Number of returned items to show on the check-in page',NULL,'Integer'); 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('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('itemBarcodeInputFilter','','If set, allows specification of a item barcode input filter','whitespace|T-prefix|cuecat|libsuite8|EAN13','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 9977f6328a..884a156ea2 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -5610,6 +5610,13 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) { SetVersion($DBversion); } +$DBversion = "3.09.00.XXX"; # FIXME +if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { + $dbh->do("UPDATE systempreferences SET options=concat(options,'|EAN13') WHERE variable='itemBarcodeInputFilter' AND options NOT LIKE '%EAN13%'"); + print "Upgrade to $DBversion done (Add itemBarcodeInputFilter choice EAN13)\n"; + SetVersion($DBversion); +} + =head1 FUNCTIONS =head2 TableExists($table) 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 e07fc0ded1..a758b19a88 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 @@ -16,6 +16,7 @@ Circulation: cuecat: Convert from CueCat form T-prefix: Remove the first number from T-prefix style libsuite8: Convert from Libsuite8 form + EAN13: EAN-13 or zero-padded UPC-A from - scanned item barcodes. - - Sort previous checkouts on the circulation page from diff --git a/t/Circulation_barcodedecode.t b/t/Circulation_barcodedecode.t index 9c4a6e6c04..f76f7fcff4 100644 --- a/t/Circulation_barcodedecode.t +++ b/t/Circulation_barcodedecode.t @@ -4,7 +4,7 @@ use strict; use warnings; -use Test::More tests => 24; +use Test::More tests => 26; C4::Context->_new_userenv(123456); C4::Context->set_userenv(1,'kmkale' , 1, 'kk1' , 'IMS', 0, 'kmkale@anantcorp.com'); @@ -18,6 +18,7 @@ our %inputs = ( whitespace => [" 26002315", "26002315 ", "\n\t26002315\n"], 'T-prefix' => [qw(T0031472 T32)], 'libsuite8' => ['b000126', 'b12', 'B0126', 'IMS-B-126', 'ims-b-126','CD0000024','00123','11998'], + EAN13 => [qw(892685001928 695152)], other => [qw(26002315 T0031472 T32 Alphanum123), "Alpha Num 345"], ); our %outputs = ( @@ -25,6 +26,7 @@ our %outputs = ( whitespace => [qw(26002315 26002315 26002315)], 'T-prefix' => [qw(T0031472 T0000002 )], 'libsuite8' => ['IMS-b-126', 'IMS-b-12', 'IMS-B-126', 'IMS-B-126', 'ims-b-126','IMS-CD-24','IMS-b-123','IMS-b-11998'], + EAN13 => [qw(0892685001928 0000000695152)], other => [qw(26002315 T0031472 T32 Alphanum123), "Alpha Num 345"], ); -- 2.39.2