Barcodes::EAN13 autoBarcode implementation
authorDobrica Pavlinusic <dpavlin@rot13.org>
Fri, 3 Jun 2011 18:42:32 +0000 (20:42 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Thu, 23 Jun 2011 17:57:27 +0000 (19:57 +0200)
Implement auto-incrementing EAN-13 barcodes

To make this work, C4::Barcodes::next was modified to call process_tail with
new incremented value so that process_tail can generate correct checksum

C4/Barcodes.pm
C4/Barcodes/EAN13.pm [new file with mode: 0644]
cataloguing/value_builder/barcode.pl
installer/data/mysql/updatedatabase.pl
koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref
t/Barcodes_EAN13.t [new file with mode: 0755]
t/db_dependent/Barcodes.t

index a528bd9..44e906a 100644 (file)
@@ -28,6 +28,7 @@ use C4::Dates;
 use C4::Barcodes::hbyymmincr;
 use C4::Barcodes::annual;
 use C4::Barcodes::incremental;
+use C4::Barcodes::EAN13;
 
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
 use vars qw($debug $cgi_debug);        # from C4::Debug, of course
@@ -137,8 +138,8 @@ sub next_value ($;$) {
        $incr++;
 
        $debug and warn "$incr";
-       $head = $self->process_head($head,$max,$specific);
-       $tail = $self->process_tail($tail,$max,$specific);
+       $head = $self->process_head($head,$incr,$specific);
+       $tail = $self->process_tail($tail,$incr,$specific); # XXX use $incr and not $max!
        my $next_value = $head . $incr . $tail;
        $debug and print STDERR "(  next ) max barcode found: $next_value\n";
        return $next_value;
@@ -177,6 +178,7 @@ our $types = {
        incremental => sub {C4::Barcodes::incremental->new_object(@_);},
        hbyymmincr  => sub {C4::Barcodes::hbyymmincr->new_object(@_); },
        OFF         => sub {C4::Barcodes::OFF->new_object(@_);        },
+       EAN13       => sub {C4::Barcodes::EAN13->new_object(@_);        },
 };
 
 sub new {
diff --git a/C4/Barcodes/EAN13.pm b/C4/Barcodes/EAN13.pm
new file mode 100644 (file)
index 0000000..2168ae6
--- /dev/null
@@ -0,0 +1,59 @@
+package C4::Barcodes::EAN13;
+
+# 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 Carp;
+
+use C4::Context;
+use C4::Debug;
+use C4::Dates;
+
+use Algorithm::CheckDigits;
+
+use vars qw($VERSION @ISA);
+use vars qw($debug $cgi_debug);        # from C4::Debug, of course
+use vars qw($width);
+
+BEGIN {
+    $VERSION = 0.01;
+    @ISA = qw(C4::Barcodes);
+}
+
+sub parse ($;$) {
+       my $self = shift;
+       my $barcode = (@_) ? shift : $self->value;
+       my $ean = CheckDigits('ean');
+       if ( $ean->is_valid($barcode) ) {
+               return ( '', $ean->basenumber($barcode), $ean->checkdigit($barcode) );
+       } else {
+               carp "$barcode not valid EAN-13 barcode";
+       }
+}
+
+sub process_tail($$;$$) {
+       my ( $self,$tail,$whole,$specific ) = @_;
+       my $ean = CheckDigits('ean');
+       my $full = $ean->complete($whole);
+       my $chk  = $ean->checkdigit($full);
+       $debug && warn "# process_tail $tail -> $chk [$whole -> $full] $specific";
+       return $chk;
+}
+
+1;
+__END__
index c05ec48..0b3a342 100755 (executable)
@@ -24,6 +24,8 @@ no warnings 'redefine'; # otherwise loading up multiple plugins fills the log wi
 use C4::Context;
 require C4::Dates;
 
+use Algorithm::CheckDigits;
+
 my $DEBUG = 0;
 
 =head1
@@ -123,6 +125,26 @@ sub plugin_javascript {
         }
         ";
     }
+       elsif ($autoBarcodeType eq 'EAN13') {
+               # not the best, two catalogers could add the same barcode easily this way :/
+               $query = "select max(abs(barcode)) from items";
+               my $sth = $dbh->prepare($query);
+               $sth->execute();
+               while (my ($count)= $sth->fetchrow_array) {
+                       $nextnum = $count;
+               }
+               my $ean = CheckDigits('ean');
+               if ( $ean->is_valid($nextnum) ) {
+                       my $next = $ean->basenumber( $nextnum ) + 1;
+                       $nextnum = $ean->complete( $next );
+               } else {
+                       warn "ERROR: invalid EAN-13 $nextnum, using increment";
+                       $nextnum++;
+               }
+       }
+       else {
+               warn "ERROR: unknown autoBarcode: $autoBarcodeType";
+       }
 
     # default js body (if not filled by hbyymmincr)
     $scr or $scr = <<END_OF_JS;
index c80b59a..a71b71c 100755 (executable)
@@ -4106,6 +4106,9 @@ $DBversion = "3.02.10.001"; # FIXME
 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
     $dbh->do("UPDATE `systempreferences` SET options='whitespace|t-prefix|cuecat|libsuite8|ean13' WHERE variable='itembarcodeinputfilter'");
     print "Upgrade to $dbversion done (Add itemBarcodeInputFilter choice EAN13)\n";
+
+    $dbh->do("UPDATE systempreferences SET options = concat(options,'|EAN13'), explanation = concat(explanation,'; EAN13 - incremental') WHERE variable = 'autoBarcode';");
+    print "Upgrade to $DBversion done ( Added EAN13 barcode autogeneration sequence )\n";
     setversion($dbversion);
 }
 
index c8dad2c..7466d54 100644 (file)
@@ -77,6 +77,7 @@ Cataloging:
                   incremental: generated in the form 1, 2, 3.
                   annual: generated in the form &lt;year&gt;-0001, &lt;year&gt;-0002.
                   hbyymmincr: generated in the form &lt;branchcode&gt;yymm0001.
+                  EAN13: incremental EAN-13 barcodes
                   "OFF": not generated automatically.
     Display:
         -
diff --git a/t/Barcodes_EAN13.t b/t/Barcodes_EAN13.t
new file mode 100755 (executable)
index 0000000..a859ade
--- /dev/null
@@ -0,0 +1,14 @@
+#!/usr/bin/perl
+#
+# This Koha test module is a stub!  
+# Add more tests here!!!
+
+use strict;
+use warnings;
+
+use Test::More tests => 1;
+
+BEGIN {
+        use_ok('C4::Barcodes::EAN13');
+}
+
index cd50178..3a78452 100755 (executable)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 49;
+use Test::More tests => 66;
 BEGIN {
        use FindBin;
        use lib $FindBin::Bin;
@@ -14,6 +14,7 @@ my %thash = (
        incremental => [],
        annual => [],
        hbyymmincr => ['MAIN'],
+       EAN13 => ['0000000695152','892685001928'],
 );
 
 print "\n";