File: | C4/Barcodes/hbyymmincr.pm |
Coverage: | 30.1% |
line | stmt | bran | cond | sub | time | code |
---|---|---|---|---|---|---|
1 | package 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 | ||||||
33 | BEGIN { | |||||
34 | 2 | 20 | $VERSION = 0.01; | |||
35 | 2 | 2014 | @ISA = qw(C4::Barcodes); | |||
36 | } | |||||
37 | ||||||
38 | INIT { | |||||
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 | ||||||
45 | sub 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 | ||||||
74 | sub 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 | ||||||
81 | sub 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 | ||||||
93 | sub branch ($;$) { | |||||
94 | 0 | 0 | my $self = shift; | |||
95 | 0 | 0 | (@_) and $self->{branch} = shift; | |||
96 | 0 | 0 | return $self->{branch}; | |||
97 | } | |||||
98 | sub width ($;$) { | |||||
99 | 0 | 0 | my $self = shift; | |||
100 | 0 | 0 | (@_) and $width = shift; # hitting the class variable. | |||
101 | 0 | 0 | return $width; | |||
102 | } | |||||
103 | sub 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 | ||||||
111 | sub 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 | ||||||
125 | 1; |