[15/40] Initial work on label batch edit interface.
[koha.git] / C4 / Labels / Batch.pm
1 package C4::Labels::Batch;
2
3 # Copyright 2009 Foundations Bible College.
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 with
17 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
18 # Suite 330, Boston, MA  02111-1307 USA
19
20 use strict;
21 use warnings;
22
23 use Sys::Syslog qw(syslog);
24
25 use C4::Context;
26 use C4::Debug;
27 use Data::Dumper;
28
29 BEGIN {
30     use version; our $VERSION = qv('1.0.0_1');
31 }
32
33 sub _check_params {
34     my $given_params = {};
35     my $exit_code = 0;
36     my @valid_template_params = (
37         'label_id',
38         'batch_id',
39         'item_number',
40         'branch_code',
41     );
42     if (scalar(@_) >1) {
43         $given_params = {@_};
44         foreach my $key (keys %{$given_params}) {
45             if (!(grep m/$key/, @valid_template_params)) {
46                 syslog("LOG_ERR", "C4::Labels::Batch : Unrecognized parameter type of \"%s\".", $key);
47                 $exit_code = 1;
48             }
49         }
50     }
51     else {
52         if (!(grep m/$_/, @valid_template_params)) {
53             syslog("LOG_ERR", "C4::Labels::Batch : Unrecognized parameter type of \"%s\".", $_);
54             $exit_code = 1;
55         }
56     }
57     return $exit_code;
58 }
59
60 =head1 NAME
61
62 C4::Labels::Batch - A class for creating and manipulating batch objects in Koha
63
64 =cut
65
66 =head1 METHODS
67
68 =head2 C4::Labels::Batch->new(layout_id => layout_id, template_id => template_id, profile_id => profile_id)
69
70     Invoking the I<new> method constructs a new batch object with no items.
71
72     example:
73         my $batch = C4::Labels::Batch->new(layout_id => layout_id, template_id => template_id, profile_id => profile_id);
74             # Creates and returns a new batch object
75
76     B<NOTE:> This batch is I<not> written to the database untill $batch->save() is invoked. You have been warned!
77
78 =cut
79
80 sub new {
81     my ($invocant, %params) = @_;
82     my $type = ref($invocant) || $invocant;
83     my $self = {
84         batch_id        => 0,
85         items           => [],
86         branch_code     => 'NB',
87         batch_stat      => 0,   # False if any data has changed and the db has not been updated
88     };
89     bless ($self, $type);
90     return $self;
91 }
92
93 =head2 $batch->add_item($item_number)
94
95     Invoking the I<add_item> method will add the supplied item to the batch object.
96
97     example:
98         $batch->add_item($item_number);
99
100 =cut
101
102 sub add_item {
103     my $self = shift;
104     my $item_number = shift;
105     my $query = "INSERT INTO labels_batches (batch_id, item_number, branch_code) VALUES (?,?,?);";
106     my $sth = C4::Context->dbh->prepare($query);
107 #    $sth->{'TraceLevel'} = 3;
108     $sth->execute($item_number, $self->{'batch_id'});
109     if ($sth->err) {
110         syslog("LOG_ERR", "C4::Labels::Batch->add_item : Database returned the following error on attempted INSERT: %s", $sth->errstr);
111         return -1;
112     }
113     push (@{$self->{'items'}}, $item_number);
114     $self->{'batch_stat'} = 0;
115     return 0;
116 }
117
118 =head2 $batch->get_attr()
119
120     Invoking the I<get_attr> method will return the requested attribute.
121
122     example:
123         my @items = $batch->get_attr($attr);
124
125 =cut
126
127 sub get_attr {
128     my $self = shift;
129     return $self->{$_[0]};
130 }
131
132 =head2 $batch->remove_item()
133
134     Invoking the I<remove_item> method will remove the supplied item from the batch object.
135
136     example:
137         $batch->remove_item();
138
139 =cut
140
141 sub remove_item {
142     my $self = shift;
143     my $item_number = shift;
144     my $query = "DELETE FROM labels_batches WHERE item_number=? AND batch_id=?;";
145     my $sth = C4::Context->dbh->prepare($query);
146 #    $sth->{'TraceLevel'} = 3;
147     $sth->execute($item_number, $self->{'batch_id'});
148     if ($sth->err) {
149         syslog("LOG_ERR", "C4::Labels::Batch->remove_item : Database returned the following error on attempted DELETE: %s", $sth->errstr);
150         return -1;
151     }
152     @{$self->{'items'}} = grep{$_ != $item_number} @{$self->{'items'}};
153     $self->{'batch_stat'} = 1;
154     return 0;
155 }
156
157 =head2 $batch->save()
158
159     Invoking the I<save> method attempts to insert the batch into the database. The method returns
160     the new record batch_id upon success and -1 upon failure (This avoids conflicting with a record
161     batch_id of 1). Errors are logged to the syslog.
162
163     example:
164         my $exitstat = $batch->save(); # to save the record behind the $batch object
165
166 =cut
167
168 sub save {
169     my $self = shift;
170     my $sth = C4::Context->dbh->prepare("SELECT MAX(batch_id) FROM labels_batches;");
171     $sth->execute();
172     my $batch_id = $sth->fetchrow_array;
173     $self->{'batch_id'} = $batch_id++;
174     foreach my $item_number (@{$self->{'items'}}) {
175         my $query = "INSERT INTO labels_batches (batch_id, item_number, branch_code) VALUES (?,?,?);";
176         my $sth1 = C4::Context->dbh->prepare($query);
177         $sth1->execute($self->{'batch_id'}, $item_number, $self->{'branch_code'});
178         if ($sth1->err) {
179             syslog("LOG_ERR", "C4::Labels::Batch->save : Database returned the following error on attempted INSERT: %s", $sth1->errstr);
180             return -1;
181         }
182         $self->{'batch_stat'} = 1;
183         return $self->{'batch_id'};
184     }
185 }
186
187 =head2 C4::Labels::Batch->retrieve(batch_id)
188
189     Invoking the I<retrieve> method constructs a new batch object containing the current values for batch_id. The method returns
190     a new object upon success and 1 upon failure. Errors are logged to the syslog.
191
192     examples:
193
194         my $batch = C4::Labels::Batch->retrieve(batch_id => 1); # Retrieves batch record 1 and returns an object containing the record
195
196 =cut
197
198 sub retrieve {
199     my $invocant = shift;
200     my %opts = @_;
201     my $type = ref($invocant) || $invocant;
202     my $query = "SELECT * FROM labels_batches WHERE batch_id = ? ORDER BY label_id";  
203     my $sth = C4::Context->dbh->prepare($query);
204     $sth->execute($opts{'batch_id'});
205     if ($sth->err) {
206         syslog("LOG_ERR", "C4::Labels::Batch->retrieve : Database returned the following error on attempted SELECT: %s", $sth->errstr);
207         return 1;
208     }
209     my $self = {
210         items   => [],
211     };
212     while (my $record = $sth->fetchrow_hashref) {
213         $self->{'batch_id'} = $record->{'batch_id'};        # FIXME: seems a bit wasteful to re-initialize these every trip: is there a better way?
214         $self->{'branch_code'} = $record->{'branch_code'};
215         push (@{$self->{'items'}}, $record->{'item_number'});
216     }
217     $self->{'batch_stat'} = 1;
218     bless ($self, $type);
219     return $self;
220 }
221
222 =head2 C4::Labels::Batch->delete(batch_id => batch_id) | $batch->delete()
223
224     Invoking the delete method attempts to delete the batch from the database. The method returns 0 upon success
225     and 1 upon failure. Errors are logged to the syslog.
226
227     examples:
228         my $exitstat = $batch->delete(); # to delete the record behind the $batch object
229         my $exitstat = C4::Labels::Batch->delete(batch_id => 1); # to delete batch record 1
230
231 =cut
232
233 sub delete {
234     my $self = {};
235     my %opts = ();
236     my $call_type = '';
237     my @query_params = ();
238     if (ref($_[0])) {
239         $self = shift;  # check to see if this is a method call
240         $call_type = 'C4::Labels::Batch->delete';
241         @query_params = ($self->{'batch_id'}, $self->{'branch_code'});
242     }
243     else {
244         %opts = @_;
245         $call_type = 'C4::Labels::Batch::delete';
246         @query_params = ($opts{'batch_id'}, $opts{'branch_code'});
247     }
248     if ($query_params[0] eq '') {   # If there is no template id then we cannot delete it
249         syslog("LOG_ERR", "%s : Cannot delete batch as the batch id is invalid or non-existant.", $call_type);
250         return -1;
251     }
252     my $query = "DELETE FROM labels_batches WHERE batch_id = ? AND branch_code =?";
253     my $sth = C4::Context->dbh->prepare($query);
254 #    $sth->{'TraceLevel'} = 3;
255     $sth->execute(@query_params);
256     if ($sth->err) {
257         syslog("LOG_ERR", "%s : Database returned the following error on attempted INSERT: %s", $call_type, $sth->errstr);
258         return -1;
259     }
260     return 0;
261 }
262
263
264 1;
265 __END__
266
267 =head1 AUTHOR
268
269 Chris Nighswonger <cnighswonger AT foundations DOT edu>
270
271 =cut
272