Bug 26555: Make sure _messages is always initialized
[koha.git] / C4 / Creators / Profile.pm
blobfe20c8a954518e1b5a0b914ecc5944cb52df5abd
1 package C4::Creators::Profile;
3 use strict;
4 use warnings;
6 use autouse 'Data::Dumper' => qw(Dumper);
8 use C4::Context;
9 use C4::Debug;
10 use C4::Creators::Lib qw(get_unit_values);
13 sub _check_params {
14 my $given_params = {};
15 my $exit_code = 0;
16 my @valid_profile_params = (
17 'printer_name',
18 'template_id',
19 'paper_bin',
20 'offset_horz',
21 'offset_vert',
22 'creep_horz',
23 'creep_vert',
24 'units',
25 'creator',
27 if (scalar(@_) >1) {
28 $given_params = {@_};
29 foreach my $key (keys %{$given_params}) {
30 if (!(grep m/$key/, @valid_profile_params)) {
31 warn sprintf('Unrecognized parameter type of "%s".', $key);
32 $exit_code = 1;
36 else {
37 if (!(grep m/$_/, @valid_profile_params)) {
38 warn sprintf('Unrecognized parameter type of "%s".', $_);
39 $exit_code = 1;
42 return $exit_code;
45 sub _conv_points {
46 my $self = shift;
47 my @unit_value = grep {$_->{'type'} eq $self->{units}} @{get_unit_values()};
48 $self->{offset_horz} = $self->{offset_horz} * $unit_value[0]->{'value'};
49 $self->{offset_vert} = $self->{offset_vert} * $unit_value[0]->{'value'};
50 $self->{creep_horz} = $self->{creep_horz} * $unit_value[0]->{'value'};
51 $self->{creep_vert} = $self->{creep_vert} * $unit_value[0]->{'value'};
52 return $self;
55 sub new {
56 my $invocant = shift;
57 if (_check_params(@_) eq 1) {
58 return -1;
60 my $type = ref($invocant) || $invocant;
61 my $self = {
62 printer_name => 'Default Printer',
63 template_id => '',
64 paper_bin => 'Tray 1',
65 offset_horz => 0,
66 offset_vert => 0,
67 creep_horz => 0,
68 creep_vert => 0,
69 units => 'POINT',
70 @_,
72 bless ($self, $type);
73 return $self;
76 sub retrieve {
77 my $invocant = shift;
78 my %opts = @_;
79 my $type = ref($invocant) || $invocant;
80 my $query = "SELECT * FROM printers_profile WHERE profile_id = ? AND creator = ?";
81 my $sth = C4::Context->dbh->prepare($query);
82 $sth->execute($opts{'profile_id'}, $opts{'creator'});
83 if ($sth->err) {
84 warn sprintf('Database returned the following error: %s', $sth->errstr);
85 return -1;
87 my $self = $sth->fetchrow_hashref;
88 $self = _conv_points($self) if ($opts{convert} && $opts{convert} == 1);
89 bless ($self, $type);
90 return $self;
93 sub delete {
94 my $self = {};
95 my %opts = ();
96 my $call_type = '';
97 my @params = ();
98 if (ref($_[0])) {
99 $self = shift; # check to see if this is a method call
100 $call_type = 'C4::'. $self->{'creator'} .'::Profile->delete';
101 push @params, $self->{'profile_id'}, $self->{'creator'};
103 else {
104 my $class = shift; #XXX: is this too hackish?
105 %opts = @_;
106 $call_type = $class . "::delete";
107 push @params, $opts{'profile_id'}, $opts{'creator'};
109 if (scalar(@params) < 2) { # If there is no profile id or creator type then we cannot delete it
110 warn sprintf('%s : Cannot delete profile as the profile id is invalid or non-existent.', $call_type) if !$params[0];
111 warn sprintf('%s : Cannot delete profile as the creator type is invalid or non-existent.', $call_type) if !$params[1];
112 return -1;
114 my $query = "DELETE FROM printers_profile WHERE profile_id = ? AND creator = ?";
115 my $sth = C4::Context->dbh->prepare($query);
116 # $sth->{'TraceLevel'} = 3;
117 $sth->execute(@params);
118 if ($sth->err) {
119 warn sprintf('Database returned the following error on attempted DELETE: %s', $sth->errstr);
120 return -1;
122 return 0;
125 sub save {
126 my $self = shift;
127 if ($self->{'profile_id'}) { # if we have an profile_id, the record exists and needs UPDATE
128 my @params;
129 my $query = "UPDATE printers_profile SET ";
130 foreach my $key (keys %{$self}) {
131 next if ($key eq 'profile_id') || ($key eq 'creator');
132 push (@params, $self->{$key});
133 $query .= "$key=?, ";
135 $query = substr($query, 0, (length($query)-2));
136 push (@params, $self->{'profile_id'}, $self->{'creator'});
137 $query .= " WHERE profile_id=? AND creator=?;";
138 my $sth = C4::Context->dbh->prepare($query);
139 # $sth->{'TraceLevel'} = 3;
140 $sth->execute(@params);
141 if ($sth->err) {
142 warn sprintf('Database returned the following error on attempted UPDATE: %s', $sth->errstr);
143 return -1;
145 return $self->{'profile_id'};
147 else { # otherwise create a new record
148 my @params;
149 my $query = "INSERT INTO printers_profile (";
150 foreach my $key (keys %{$self}) {
151 push (@params, $self->{$key});
152 $query .= "$key, ";
154 $query = substr($query, 0, (length($query)-2));
155 $query .= ") VALUES (";
156 for (my $i=1; $i<=(scalar keys %$self); $i++) {
157 $query .= "?,";
159 $query = substr($query, 0, (length($query)-1));
160 $query .= ");";
161 my $sth = C4::Context->dbh->prepare($query);
162 $sth->execute(@params);
163 if ($sth->err) {
164 warn sprintf('Database returned the following error on attempted INSERT: %s', $sth->errstr);
165 return -1;
167 my $sth1 = C4::Context->dbh->prepare("SELECT MAX(profile_id) FROM printers_profile;");
168 $sth1->execute();
169 my $tmpl_id = $sth1->fetchrow_array;
170 return $tmpl_id;
174 sub get_attr {
175 my $self = shift;
176 if (_check_params(@_) eq 1) {
177 return -1;
179 my ($attr) = @_;
180 if (exists($self->{$attr})) {
181 return $self->{$attr};
183 else {
184 warn sprintf('%s is currently undefined.', $attr);
185 return -1;
189 sub set_attr {
190 my $self = shift;
191 if (_check_params(@_) eq 1) {
192 return -1;
194 my %attrs = @_;
195 foreach my $attrib (keys(%attrs)) {
196 $self->{$attrib} = $attrs{$attrib};
198 return 0;
202 __END__
204 =head1 NAME
206 C4::Labels::Profile - A class for creating and manipulating profile objects in Koha
208 =head1 ABSTRACT
210 This module provides methods for creating, retrieving, and otherwise manipulating label profile objects used by Koha to create and export labels.
212 =head1 METHODS
214 =head2 new()
216 Invoking the I<new> method constructs a new profile object containing the default values for a template.
217 The following parameters are optionally accepted as key => value pairs:
219 C<printer_name> The name of the printer to which this profile applies.
220 C<template_id> The template to which this profile may be applied. NOTE: There may be multiple profiles which may be applied to the same template.
221 C<paper_bin> The paper bin of the above printer to which this profile applies. NOTE: printer name, template id, and paper bin must form a unique combination.
222 C<offset_horz> Amount of compensation for horizontal offset (position of text on a single label). This amount is measured in the units supplied by the units parameter in this profile.
223 C<offset_vert> Amount of compensation for vertical offset.
224 C<creep_horz> Amount of compensation for horizontal creep (tendency of text to 'creep' off of the labels over the span of the entire page).
225 C<creep_vert> Amount of compensation for vertical creep.
226 C<units> The units of measure used for this template. These B<must> match the measures you supply above or
227 bad things will happen to your document. NOTE: The only supported units at present are:
229 =over 9
231 =item .
232 POINT = Postscript Points (This is the base unit in the Koha label creator.)
234 =item .
235 AGATE = Adobe Agates (5.1428571 points per)
237 =item .
238 INCH = US Inches (72 points per)
240 =item .
241 MM = SI Millimeters (2.83464567 points per)
243 =item .
244 CM = SI Centimeters (28.3464567 points per)
246 =back
248 example:
249 C<my $profile = C4::Labels::Profile->new(); # Creates and returns a new profile object>
251 C<my $profile = C4::Labels::Profile->new(template_id => 1, paper_bin => 'Bypass Tray', offset_horz => 0.02, units => 'POINT'); # Creates and returns a new profile object using
252 the supplied values to override the defaults>
254 B<NOTE:> This profile is I<not> written to the database until save() is invoked. You have been warned!
256 =head2 retrieve(profile_id => $profile_id, convert => 1)
258 Invoking the I<retrieve> method constructs a new profile object containing the current values for profile_id. The method returns a new object upon success and 1 upon failure.
259 Errors are logged to the Apache log. One further option maybe accessed. See the examples below for further description.
261 examples:
263 C<my $profile = C4::Labels::Profile->retrieve(profile_id => 1); # Retrieves profile record 1 and returns an object containing the record>
265 C<my $profile = C4::Labels::Profile->retrieve(profile_id => 1, convert => 1); # Retrieves profile record 1, converts the units to points and returns an object containing the record>
267 =head2 delete()
269 Invoking the delete method attempts to delete the profile from the database. The method returns -1 upon failure. Errors are logged to the Apache log.
270 NOTE: This method may also be called as a function and passed a key/value pair simply deleteing that profile from the database. See the example below.
272 examples:
273 C<my $exitstat = $profile->delete(); # to delete the record behind the $profile object>
274 C<my $exitstat = C4::Labels::Profile::delete(profile_id => 1); # to delete profile record 1>
276 =head2 save()
278 Invoking the I<save> method attempts to insert the profile into the database if the profile is new and update the existing profile record if the profile exists. The method returns
279 the new record profile_id upon success and -1 upon failure (This avoids conflicting with a record profile_id of 1). Errors are logged to the Apache log.
281 example:
282 C<my $exitstat = $profile->save(); # to save the record behind the $profile object>
284 =head2 get_attr($attribute)
286 Invoking the I<get_attr> method will return the value of the requested attribute or -1 on errors.
288 example:
289 C<my $value = $profile->get_attr($attribute);>
291 =head2 set_attr(attribute => value, attribute_2 => value)
293 Invoking the I<set_attr> method will set the value of the supplied attributes to the supplied values. The method accepts key/value pairs separated by commas.
295 example:
296 $profile->set_attr(attribute => value);
298 =head1 AUTHOR
300 Chris Nighswonger <cnighswonger AT foundations DOT edu>
302 =head1 COPYRIGHT
304 Copyright 2009 Foundations Bible College.
306 =head1 LICENSE
308 This file is part of Koha.
310 Koha is free software; you can redistribute it and/or modify it
311 under the terms of the GNU General Public License as published by
312 the Free Software Foundation; either version 3 of the License, or
313 (at your option) any later version.
315 Koha is distributed in the hope that it will be useful, but
316 WITHOUT ANY WARRANTY; without even the implied warranty of
317 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
318 GNU General Public License for more details.
320 You should have received a copy of the GNU General Public License
321 along with Koha; if not, see <http://www.gnu.org/licenses>.
323 =head1 DISCLAIMER OF WARRANTY
325 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
326 A PARTICULAR PURPOSE. See the GNU General Public License for more details.
328 =cut
330 #=head1
331 #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
333 #=head2 draw_boundaries
335 # sub draw_boundaries ($llx_spine, $llx_circ1, $llx_circ2,
336 # $lly, $spine_width, $label_height, $circ_width)
338 #This sub draws boundary lines where the label outlines are, to aid in printer testing, and debugging.
340 #=cut
342 ## FIXME: Template use for profile adjustment...
343 ##sub draw_boundaries {
345 ## my (
346 ## $llx_spine, $llx_circ1, $llx_circ2, $lly,
347 ## $spine_width, $label_height, $circ_width
348 ## ) = @_;
350 ## my $lly_initial = ( ( 792 - 36 ) - 90 );
351 ## $lly = $lly_initial; # FIXME - why are we ignoring the y_pos parameter by redefining it?
352 ## my $i = 1;
354 ## for ( $i = 1 ; $i <= 8 ; $i++ ) {
356 ## _draw_box( $llx_spine, $lly, ($spine_width), ($label_height) );
358 ## #warn "OLD BOXES x=$llx_spine, y=$lly, w=$spine_width, h=$label_height";
359 ## _draw_box( $llx_circ1, $lly, ($circ_width), ($label_height) );
360 ## _draw_box( $llx_circ2, $lly, ($circ_width), ($label_height) );
362 ## $lly = ( $lly - $label_height );
364 ## }
369 #=cut