37512fa88237940151800e1e32fc93464e2c1b47
[koha.git] / C4 / Creators / Profile.pm
1 package C4::Creators::Profile;
2
3 use strict;
4 use warnings;
5
6 use autouse 'Data::Dumper' => qw(Dumper);
7
8 use C4::Context;
9 use C4::Debug;
10 use C4::Creators::Lib qw(get_unit_values);
11
12
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',
26     );
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;
33             }
34         }
35     }
36     else {
37         if (!(grep m/$_/, @valid_profile_params)) {
38             warn sprintf('Unrecognized parameter type of "%s".', $_);
39             $exit_code = 1;
40         }
41     }
42     return $exit_code;
43 }
44
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;
53 }
54
55 sub new {
56     my $invocant = shift;
57     if (_check_params(@_) eq 1) {
58         return -1;
59     }
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         @_,
71     };
72     bless ($self, $type);
73     return $self;
74 }
75
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;
86     }
87     my $self = $sth->fetchrow_hashref;
88     $self = _conv_points($self) if ($opts{convert} && $opts{convert} == 1);
89     bless ($self, $type);
90     return $self;
91 }
92
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'};
102     }
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'};
108     }
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;
113     }
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;
121     }
122     return 0;
123 }
124
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=?, ";
134         }
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;
144         }
145         return $self->{'profile_id'};
146     }
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, ";
153         }
154         $query = substr($query, 0, (length($query)-2));
155         $query .= ") VALUES (";
156         for (my $i=1; $i<=(scalar keys %$self); $i++) {
157             $query .= "?,";
158         }
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;
166         }
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;
171     }
172 }
173
174 sub get_attr {
175     my $self = shift;
176     if (_check_params(@_) eq 1) {
177         return -1;
178     }
179     my ($attr) = @_;
180     if (exists($self->{$attr})) {
181         return $self->{$attr};
182     }
183     else {
184         warn sprintf('%s is currently undefined.', $attr);
185         return -1;
186     }
187 }
188
189 sub set_attr {
190     my $self = shift;
191     if (_check_params(@_) eq 1) {
192         return -1;
193     }
194     my %attrs = @_;
195     foreach my $attrib (keys(%attrs)) {
196         $self->{$attrib} = $attrs{$attrib};
197     };
198     return 0;
199 }
200
201 1;
202 __END__
203
204 =head1 NAME
205
206 C4::Labels::Profile - A class for creating and manipulating profile objects in Koha
207
208 =head1 ABSTRACT
209
210 This module provides methods for creating, retrieving, and otherwise manipulating label profile objects used by Koha to create and export labels.
211
212 =head1 METHODS
213
214 =head2 new()
215
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:
218
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:
228
229 =over 9
230
231 =item .
232 POINT   = Postscript Points (This is the base unit in the Koha label creator.)
233
234 =item .
235 AGATE   = Adobe Agates (5.1428571 points per)
236
237 =item .
238 INCH    = US Inches (72 points per)
239
240 =item .
241 MM      = SI Millimeters (2.83464567 points per)
242
243 =item .
244 CM      = SI Centimeters (28.3464567 points per)
245
246 =back
247
248     example:
249         C<my $profile = C4::Labels::Profile->new(); # Creates and returns a new profile object>
250
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>
253
254     B<NOTE:> This profile is I<not> written to the database until save() is invoked. You have been warned!
255
256 =head2 retrieve(profile_id => $profile_id, convert => 1)
257
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.
260
261     examples:
262
263         C<my $profile = C4::Labels::Profile->retrieve(profile_id => 1); # Retrieves profile record 1 and returns an object containing the record>
264
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>
266
267 =head2 delete()
268
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.
271
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>
275
276 =head2 save()
277
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.
280
281     example:
282         C<my $exitstat = $profile->save(); # to save the record behind the $profile object>
283
284 =head2 get_attr($attribute)
285
286     Invoking the I<get_attr> method will return the value of the requested attribute or -1 on errors.
287
288     example:
289         C<my $value = $profile->get_attr($attribute);>
290
291 =head2 set_attr(attribute => value, attribute_2 => value)
292
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.
294
295     example:
296         $profile->set_attr(attribute => value);
297
298 =head1 AUTHOR
299
300 Chris Nighswonger <cnighswonger AT foundations DOT edu>
301
302 =head1 COPYRIGHT
303
304 Copyright 2009 Foundations Bible College.
305
306 =head1 LICENSE
307
308 This file is part of Koha.
309
310 Koha is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software
311 Foundation; either version 2 of the License, or (at your option) any later version.
312
313 You should have received a copy of the GNU General Public License along with Koha; if not, write to the Free Software Foundation, Inc., 51 Franklin Street,
314 Fifth Floor, Boston, MA 02110-1301 USA.
315
316 =head1 DISCLAIMER OF WARRANTY
317
318 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
319 A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
320
321 =cut
322
323 #=head1
324 #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
325 #
326 #=head2 draw_boundaries
327 #
328 # sub draw_boundaries ($llx_spine, $llx_circ1, $llx_circ2,
329 #                $lly, $spine_width, $label_height, $circ_width)
330 #
331 #This sub draws boundary lines where the label outlines are, to aid in printer testing, and debugging.
332 #
333 #=cut
334 #
335 ##       FIXME: Template use for profile adjustment...
336 ##sub draw_boundaries {
337 ##
338 ##    my (
339 ##        $llx_spine, $llx_circ1,  $llx_circ2, $lly,
340 ##        $spine_width, $label_height, $circ_width
341 ##    ) = @_;
342 ##
343 ##    my $lly_initial = ( ( 792 - 36 ) - 90 );
344 ##    $lly            = $lly_initial; # FIXME - why are we ignoring the y_pos parameter by redefining it?
345 ##    my $i             = 1;
346 ##
347 ##    for ( $i = 1 ; $i <= 8 ; $i++ ) {
348 ##
349 ##        _draw_box( $llx_spine, $lly, ($spine_width), ($label_height) );
350 ##
351 ##   #warn "OLD BOXES  x=$llx_spine, y=$lly, w=$spine_width, h=$label_height";
352 ##        _draw_box( $llx_circ1, $lly, ($circ_width), ($label_height) );
353 ##        _draw_box( $llx_circ2, $lly, ($circ_width), ($label_height) );
354 ##
355 ##        $lly = ( $lly - $label_height );
356 ##
357 ##    }
358 ##}
359 #
360 #
361 #
362 #=cut