File Coverage

File:C4/Barcodes/hbyymmincr.pm
Coverage:30.1%

linestmtbrancondsubtimecode
1package C4::Barcodes::hbyymmincr;
2
3# Copyright 2008 LibLime
4#
5# This file is part of Koha.
6#
7# Koha is free software; you can redistribute it and/or modify it under the
8# terms of the GNU General Public License as published by the Free Software
9# Foundation; either version 2 of the License, or (at your option) any later
10# version.
11#
12# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License along
17# with Koha; if not, write to the Free Software Foundation, Inc.,
18# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
2
2
2
392
8
47
use strict;
21
2
2
2
12
6
107
use warnings;
22
23
2
2
2
14
6
137
use Carp;
24
25
2
2
2
186
8
21
use C4::Context;
26
2
2
2
28
17
202
use C4::Debug;
27
2
2
2
171
31
115
use C4::Dates;
28
29
2
2
2
38
27
155
use vars qw($VERSION @ISA);
30
2
2
2
34
30
102
use vars qw($debug $cgi_debug); # from C4::Debug, of course
31
2
2
2
30
69
157
use vars qw($branch $width);
32
33BEGIN {
34
2
20
    $VERSION = 0.01;
35
2
2014
    @ISA = qw(C4::Barcodes);
36}
37
38INIT {
39
0
0
        $branch = '';
40
0
0
        $width = 4; # FIXME: 4 is too small for sizeable or multi-branch libraries.
41}
42# Generates barcode where hb = home branch Code, yymm = year/month catalogued, incr = incremental number,
43# increment resets yearly -fbcit
44
45sub db_max ($;$) {
46
0
0
        my $self = shift;
47
0
0
        my $query = "SELECT MAX(SUBSTRING(barcode,-$width)), barcode FROM items WHERE barcode REGEXP ? GROUP BY barcode";
48
0
0
        $debug and print STDERR "(hbyymmincr) db_max query: $query\n";
49
0
0
        my $sth = C4::Context->dbh->prepare($query);
50
0
0
        my ($iso);
51
0
0
        if (@_) {
52
0
0
                my $input = shift;
53
0
0
                $iso = C4::Dates->new($input,'iso')->output('iso'); # try to set the date w/ 2nd arg
54
0
0
                unless ($iso) {
55
0
0
                        warn "Failed to create 'iso' Dates object with input '$input'. Reverting to today's date.";
56
0
0
                        $iso = C4::Dates->new->output('iso'); # failover back to today
57                }
58        } else {
59
0
0
                $iso = C4::Dates->new->output('iso');
60        }
61
0
0
        my $year = substr($iso,2,2); # i.e. "08" for 2008
62
0
0
        my $andtwo = $width+2;
63
0
0
        $sth->execute("^[a-zA-Z]{1,}" . $year . "[0-9]{$andtwo}"); # the extra two digits are the month. we don't care what they are, just that they are there.
64
0
0
        unless ($sth->rows) {
65
0
0
                warn "No existing hbyymmincr barcodes found. Reverting to initial value.";
66
0
0
                return $self->initial;
67        }
68
0
0
        my ($row) = $sth->fetchrow_hashref;
69
0
0
        my $max = $row->{barcode};
70
0
0
        warn "barcode max (hbyymmincr format): $max" if $debug;
71
0
0
        return ($max || 0);
72}
73
74sub initial () {
75
0
0
        my $self = shift;
76        # FIXME: populated branch?
77
0
0
        my $iso = C4::Dates->new->output('iso'); # like "2008-07-02"
78
0
0
        return $self->branch . substr($iso,2,2) . substr($iso,5,2) . sprintf('%' . "$width.$width" . 'd',1);
79}
80
81sub parse ($;$) { # return 3 parts of barcode: non-incrementing, incrementing, non-incrementing
82
0
0
        my $self = shift;
83
0
0
        my $barcode = (@_) ? shift : $self->value;
84
0
0
        my $branch = $self->branch;
85
0
0
        unless ($barcode =~ /($branch\d{4})(\d+)$/) {
86
0
0
                carp "Barcode '$barcode' has no incrementing part!";
87
0
0
                return ($barcode,undef,undef);
88        }
89
0
0
        $debug and warn "Barcode '$barcode' parses into: '$1', '$2', ''";
90
0
0
        return ($1,$2,''); # the third part is in anticipation of barcodes that include checkdigits
91}
92
93sub branch ($;$) {
94
0
0
        my $self = shift;
95
0
0
        (@_) and $self->{branch} = shift;
96
0
0
        return $self->{branch};
97}
98sub width ($;$) {
99
0
0
        my $self = shift;
100
0
0
        (@_) and $width = shift; # hitting the class variable.
101
0
0
        return $width;
102}
103sub process_head($$;$$) { # (self,head,whole,specific)
104
0
0
        my ($self,$head,$whole,$specific) = @_;
105
0
0
        $specific and return $head; # if this is built off an existing barcode, just return the head unchanged.
106
0
0
        $head =~ s/\d{4}$//; # else strip the old yymm
107
0
0
        my $iso = C4::Dates->new->output('iso'); # like "2008-07-02"
108
0
0
        return $head . substr($iso,2,2) . substr($iso,5,2);
109}
110
111sub new_object {
112
0
0
        $debug and warn "hbyymmincr: new_object called";
113
0
0
        my $class_or_object = shift;
114
0
0
        my $type = ref($class_or_object) || $class_or_object;
115
0
0
        my $from_obj = ref($class_or_object) ? 1 : 0; # are we building off another Barcodes object?
116
0
0
        my $self = $class_or_object->default_self('hbyymmincr');
117
0
0
        bless $self, $type;
118
0
0
        $self->branch(@_ ? shift : $from_obj ? $class_or_object->branch : $branch);
119                # take the branch from argument, or existing object, or default
120
2
2
2
25
15
208
        use Data::Dumper;
121
0
0
        $debug and print STDERR "(hbyymmincr) new_object: ", Dumper($self), "\n";
122
0
0
        return $self;
123}
124
1251;