Bug 32852: Fix cataloguing/value_builder/unimarc_field_125b.pl
[koha-ffzg.git] / C4 / Barcodes.pm
index a528bd9..957d60f 100644 (file)
@@ -4,42 +4,32 @@ package C4::Barcodes;
 #
 # 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.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Carp;
+use Carp qw( carp );
 
 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($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();
-}
-
 sub _prefformat {
        unless (defined $prefformat) {
                unless ($prefformat = C4::Context->preference('autoBarcode')) {
@@ -54,69 +44,63 @@ sub initial {
        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;
-               if (defined $value) {
-                       $debug and print STDERR "    setting barcode value to $value\n";
-               } else {
-                       warn "Error: UNDEF argument to value";
-               }
+        warn "Error: UNDEF argument to value"
+            unless defined $value;
                $self->{value} = $value;
        }
        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
                carp "Barcode '$barcode' has no incrementing part!";
                return ($barcode,undef,undef);
        }
-       $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";
                return $self->value;
        }
-       $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
@@ -124,41 +108,38 @@ sub next_value ($;$) {
                warn "No max barcode ($self->autoBarcode format) found.  Using initial value.";
                return $self->initial;
        }
-       $debug and print STDERR "(current) max barcode found: $max\n";
        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++;
 
-       $debug and warn "$incr";
        $head = $self->process_head($head,$max,$specific);
-       $tail = $self->process_tail($tail,$max,$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;
 }
-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'
@@ -177,26 +158,23 @@ 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 {
        my $class_or_object = shift;
        my $type = ref($class_or_object) || $class_or_object;
        my $from_obj = ref($class_or_object) ? 1 : 0;   # are we building off another Barcodes object?
-       if ($from_obj) {
-               $debug and print STDERR "Building new(@_) from old Barcodes object\n"; 
-       }
        my $autoBarcodeType = (@_) ? shift : $from_obj ? $class_or_object->autoBarcode : _prefformat;
        $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;
        if ($autoBarcodeType eq 'OFF') {
                $self = $class_or_object->default_self($autoBarcodeType);
@@ -207,7 +185,6 @@ sub new {
                $self = $class_or_object->new_object(@_);
                $self->serial($class_or_object->serial + 1);
                if ($class_or_object->is_max) {
-                       $debug and print STDERR "old object was max: ", $class_or_object->value, "\n";
                        $self->previous($class_or_object);
                        $class_or_object->next($self);
                        $self->value($self->next_value($class_or_object->value));
@@ -216,7 +193,6 @@ sub new {
                        $self->value($self->next_value);
                }
        } else {
-               $debug and print STDERR "trying to create new $autoBarcodeType\n";
                $self = &{$types->{$autoBarcodeType}} (@_);
                $self->value($self->next_value) and $self->is_max(1);
                $self->serial(1);
@@ -225,7 +201,7 @@ sub new {
                return $self;
        }
        carp "Failed new C4::Barcodes::$autoBarcodeType";
-       return undef;
+       return;
 }
 
 sub new_object {