1 package C4::Labels::Profile;
3 # Copyright 2009 Foundations Bible College.
5 # This file is part of Koha.
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
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.
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
22 use Sys::Syslog qw(syslog);
29 use version; our $VERSION = qv('1.0.0_1');
40 my $given_params = {};
42 my @valid_profile_params = (
54 foreach my $key (keys %{$given_params}) {
55 if (!(grep m/$key/, @valid_profile_params)) {
56 syslog("LOG_ERR", "C4::Labels::Profile : Unrecognized parameter type of \"%s\".", $key);
62 if (!(grep m/$_/, @valid_profile_params)) {
63 syslog("LOG_ERR", "C4::Labels::Profile : Unrecognized parameter type of \"%s\".", $_);
72 $self->{offset_horz} = $self->{offset_horz} * $unit_values->{$self->{unit}};
73 $self->{offset_vert} = $self->{offset_vert} * $unit_values->{$self->{unit}};
74 $self->{creep_horz} = $self->{creep_horz} * $unit_values->{$self->{unit}};
75 $self->{creep_vert} = $self->{creep_vert} * $unit_values->{$self->{unit}};
81 C4::Labels::Profile - A class for creating and manipulating profile objects in Koha
87 =head2 C4::Labels::Profile->new()
89 Invoking the I<new> method constructs a new profile object containing the default values for a template.
92 my $profile = Profile->new(); # Creates and returns a new profile object
94 B<NOTE:> This profile is I<not> written to the database untill $profile->save() is invoked. You have been warned!
100 if (_check_params(@_) eq 1) {
103 my $type = ref($invocant) || $invocant;
115 bless ($self, $type);
119 =head2 C4::Labels::Profile->retrieve(profile_id => profile_id, convert => 1)
121 Invoking the I<retrieve> method constructs a new profile object containing the current values for profile_id. The method returns
122 a new object upon success and 1 upon failure. Errors are logged to the syslog. One further option maybe accessed. See the examples
123 below for further description.
127 my $profile = C4::Labels::Profile->retrieve(profile_id => 1); # Retrieves profile record 1 and returns an object containing the record
129 my $profile = C4::Labels::Profile->retrieve(profile_id => 1, convert => 1); # Retrieves profile record 1, converts the units to points,
130 and returns an object containing the record
135 my $invocant = shift;
137 my $type = ref($invocant) || $invocant;
138 my $query = "SELECT * FROM printers_profile WHERE prof_id = ?";
139 my $sth = C4::Context->dbh->prepare($query);
140 $sth->execute($opts{profile_id});
142 syslog("LOG_ERR", "Database returned the following error: %s", $sth->errstr);
145 my $self = $sth->fetchrow_hashref;
146 $self = _conv_points($self) if ($opts{convert} && $opts{convert} == 1);
147 bless ($self, $type);
151 =head2 C4::Labels::Profile->delete(prof_id => profile_id) | $profile->delete()
153 Invoking the delete method attempts to delete the profile from the database. The method returns 0 upon success
154 and 1 upon failure. Errors are logged to the syslog.
157 my $exitstat = $profile->delete(); # to delete the record behind the $profile object
158 my $exitstat = C4::Labels::Profile->delete(prof_id => 1); # to delete profile record 1
164 if (!$self->{'prof_id'}) { # If there is no profile prof_id then we cannot delete it
165 syslog("LOG_ERR", "Cannot delete profile as it has not been saved.");
168 my $query = "DELETE FROM printers_profile WHERE prof_id = ?";
169 my $sth = C4::Context->dbh->prepare($query);
170 $sth->execute($self->{'prof_id'});
174 =head2 $profile->save()
176 Invoking the I<save> method attempts to insert the profile into the database if the profile is new and
177 update the existing profile record if the profile exists. The method returns the new record prof_id upon
178 success and -1 upon failure (This avoids conflicting with a record prof_id of 1). Errors are logged to the syslog.
181 my $exitstat = $profile->save(); # to save the record behind the $profile object
187 if ($self->{'prof_id'}) { # if we have an prof_id, the record exists and needs UPDATE
189 my $query = "UPDATE printers_profile SET ";
190 foreach my $key (keys %{$self}) {
191 next if $key eq 'prof_id';
192 push (@params, $self->{$key});
193 $query .= "$key=?, ";
195 $query = substr($query, 0, (length($query)-2));
196 push (@params, $self->{'prof_id'});
197 $query .= " WHERE prof_id=?;";
198 warn "DEBUG: Updating: $query\n" if $debug;
199 my $sth = C4::Context->dbh->prepare($query);
200 $sth->execute(@params);
202 syslog("LOG_ERR", "C4::Labels::Profile : Database returned the following error: %s", $sth->errstr);
205 return $self->{'prof_id'};
207 else { # otherwise create a new record
209 my $query = "INSERT INTO printers_profile (";
210 foreach my $key (keys %{$self}) {
211 push (@params, $self->{$key});
214 $query = substr($query, 0, (length($query)-2));
215 $query .= ") VALUES (";
216 for (my $i=1; $i<=(scalar keys %$self); $i++) {
219 $query = substr($query, 0, (length($query)-1));
221 warn "DEBUG: Saving: $query\n" if $debug;
222 my $sth = C4::Context->dbh->prepare($query);
223 $sth->execute(@params);
225 syslog("LOG_ERR", "C4::Labels::Profile : Database returned the following error: %s", $sth->errstr);
228 my $sth1 = C4::Context->dbh->prepare("SELECT MAX(prof_id) FROM printers_profile;");
230 my $tmpl_id = $sth1->fetchrow_array;
235 =head2 $profile->get_attr(attr)
237 Invoking the I<get_attr> method will return the value of the requested attribute or 1 on errors.
240 my $value = $profile->get_attr(attr);
246 if (_check_params(@_) eq 1) {
250 if (exists($self->{$attr})) {
251 return $self->{$attr};
254 syslog("LOG_ERR", "C4::Labels::Profile : %s is currently undefined.", $attr);
259 =head2 $profile->set_attr(attr => value)
261 Invoking the I<set_attr> method will set the value of the supplied attribute to the supplied value.
264 $profile->set_attr(attr => value);
270 if (_check_params(@_) eq 1) {
273 my ($attr, $value) = @_;
274 $self->{$attr} = $value;
284 Chris Nighswonger <cnighswonger AT foundations DOT edu>
290 drawbox( ($left_margin), ($top_margin), ($page_width-(2*$left_margin)), ($page_height-(2*$top_margin)) ); # FIXME: Breakout code to print alignment page for printer profile setup
294 sub draw_boundaries ($llx_spine, $llx_circ1, $llx_circ2,
295 $lly, $spine_width, $label_height, $circ_width)
297 This sub draws boundary lines where the label outlines are, to aid in printer testing, and debugging.
301 # FIXME: Template use for profile adjustment...
302 #sub draw_boundaries {
305 # $llx_spine, $llx_circ1, $llx_circ2, $lly,
306 # $spine_width, $label_height, $circ_width
309 # my $lly_initial = ( ( 792 - 36 ) - 90 );
310 # $lly = $lly_initial; # FIXME - why are we ignoring the y_pos parameter by redefining it?
313 # for ( $i = 1 ; $i <= 8 ; $i++ ) {
315 # _draw_box( $llx_spine, $lly, ($spine_width), ($label_height) );
317 # #warn "OLD BOXES x=$llx_spine, y=$lly, w=$spine_width, h=$label_height";
318 # _draw_box( $llx_circ1, $lly, ($circ_width), ($label_height) );
319 # _draw_box( $llx_circ2, $lly, ($circ_width), ($label_height) );
321 # $lly = ( $lly - $label_height );