-#!/usr/bin/perl
-
package C4::Barcodes;
# Copyright 2008 LibLime
#
# 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 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 3 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.
+# 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
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
use strict;
use warnings;
use C4::Context;
use C4::Debug;
-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(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
use vars qw($debug $cgi_debug); # from C4::Debug, of course
use vars qw($max $prefformat);
BEGIN {
- $VERSION = 0.01;
require Exporter;
@ISA = qw(Exporter);
@EXPORT_OK = qw();
return '0000001';
}
sub width {
- return undef;
+ return;
}
-sub process_head($$;$$) { # (self,head,whole,specific)
+sub process_head { # (self,head,whole,specific)
my $self = shift;
return shift; # Default: just return the head unchanged.
}
-sub process_tail($$;$$) { # (self,tail,whole,specific)
+sub process_tail { # (self,tail,whole,specific)
my $self = shift;
return shift; # Default: just return the tail unchanged.
}
-sub is_max ($;$) {
+sub is_max {
my $self = shift;
ref($self) or carp "Called is_max on a non-object: '$self'";
(@_) and $self->{is_max} = shift;
return $self->{is_max} || 0;
}
-sub value ($;$) {
+sub value {
my $self = shift;
if (@_) {
my $value = shift;
}
return $self->{value};
}
-sub autoBarcode (;$) {
+sub autoBarcode {
(@_) or return _prefformat;
my $self = shift;
my $value = $self->{autoBarcode} or return _prefformat;
$value =~ s/^.*:://; # in case we get C4::Barcodes::incremental, we just want 'incremental'
return $value;
}
-sub parse ($;$) { # return 3 parts of barcode: non-incrementing, incrementing, non-incrementing
+sub parse { # return 3 parts of barcode: non-incrementing, incrementing, non-incrementing
my $self = shift;
my $barcode = (@_) ? shift : $self->value;
unless ($barcode =~ /(.*?)(\d+)$/) { # non-greedy match in first part
$debug and warn "Barcode '$barcode' parses into: '$1', '$2', ''";
return ($1,$2,''); # the third part is in anticipation of barcodes that include checkdigits
}
-sub max ($;$) {
+sub max {
my $self = shift;
if ($self->{is_max}) {
$debug and print STDERR "max taken from Barcodes value $self->value\n";
$debug and print STDERR "Retrieving max database query.\n";
return $self->db_max;
}
-sub db_max () {
+sub db_max {
my $self = shift;
my $query = "SELECT max(abs(barcode)) FROM items LIMIT 1"; # Possible problem if multiple barcode types populated
my $sth = C4::Context->dbh->prepare($query);
$sth->execute();
return $sth->fetchrow_array || $self->initial;
}
-sub next_value ($;$) {
+sub next_value {
my $self = shift;
my $specific = (scalar @_) ? 1 : 0;
my $max = $specific ? shift : $self->max; # optional argument, i.e. next_value after X
my ($head,$incr,$tail) = $self->parse($max); # for incremental, you'd get ('',the_whole_barcode,'')
unless (defined $incr) {
warn "No incrementing part of barcode ($max) returned by parse.";
- return undef;
+ return;
}
my $x = length($incr); # number of digits
$incr =~ /^9+$/ and $x++; # if they're all 9's, we need an extra.
- # Note, this enlargement might be undesireable for some barcode formats.
+ # Note, this enlargement might be undesirable for some barcode formats.
# Those should override next_value() to work accordingly.
$incr++;
- my $width = $self->width || undef;
- # we would want to use %$x.$xd, but that would break on large values, like 2160700004168
- # so we let the object tell us if it has a width to focus on. If not, we use float.
- my $format = ($width ? '%'."$width.$width".'d' : '%.0f');
- $debug and warn "sprintf(\"$format\",$incr)";
+
+ $debug and warn "$incr";
$head = $self->process_head($head,$max,$specific);
- $tail = $self->process_tail($tail,$max,$specific);
- my $next_value = $head . sprintf($format,$incr) . $tail;
+ $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;
}
-sub next ($;$) {
- my $self = shift or return undef;
+sub next {
+ my $self = shift or return;
(@_) and $self->{next} = shift;
return $self->{next};
}
-sub previous ($;$) {
- my $self = shift or return undef;
+sub previous {
+ my $self = shift or return;
(@_) and $self->{previous} = shift;
return $self->{previous};
}
-sub serial ($;$) {
- my $self = shift or return undef;
+sub serial {
+ my $self = shift or return;
(@_) and $self->{serial} = shift;
return $self->{serial};
}
-sub default_self (;$) {
+sub default_self {
(@_) or carp "default_self called with no argument. Reverting to _prefformat.";
my $autoBarcode = (@_) ? shift : _prefformat;
$autoBarcode =~ s/^.*:://; # in case we get C4::Barcodes::incremental, we just want 'incremental'
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 {
$autoBarcodeType =~ s/^.*:://; # in case we get C4::Barcodes::incremental, we just want 'incremental'
unless ($autoBarcodeType) {
carp "No autoBarcode format found.";
- return undef;
+ return;
}
unless (defined $types->{$autoBarcodeType}) {
carp "The autoBarcode format '$autoBarcodeType' is unrecognized.";
- return undef;
+ return;
}
carp "autoBarcode format = $autoBarcodeType" if $debug;
my $self;
return $self;
}
carp "Failed new C4::Barcodes::$autoBarcodeType";
- return undef;
+ return;
}
sub new_object {
add to the $types hashref in this file;
add tests under the "t" directory; and
edit autoBarcode syspref to include new type.
-
+
=head2 Adding a new module
Each new module that needs differing behavior must override these subs: