File Coverage

File:C4/Creators/Template.pm
Coverage:13.5%

linestmtbrancondsubtimecode
1package C4::Creators::Template;
2
3
4
4
4
1706
38
166
use strict;
4
4
4
4
45
32
217
use warnings;
5
4
4
4
255
3935
123
use POSIX qw(ceil);
6
4
4
4
9279
958
39
use autouse 'Data::Dumper' => qw(Dumper);
7
8
4
4
4
472
57
102
use C4::Context;
9
4
4
4
47
12
542
use C4::Debug;
10
4
4
4
172
131
175
use C4::Creators::Profile 1.000000;
11
4
4
4
36
102
292
use C4::Creators::Lib 1.000000 qw(get_unit_values);
12
13BEGIN {
14
4
4
4
4
35
22
69
309
    use version; our $VERSION = qv('1.0.0_1');
15}
16
17sub _check_params {
18
0
    shift if $_[0] =~ m/::/; # this seems a bit hackish
19
0
    my $given_params = {};
20
0
    my $exit_code = 0;
21
0
    my @valid_template_params = (
22        'profile_id',
23        'template_code',
24        'template_desc',
25        'page_width',
26        'page_height',
27        'label_width',
28        'label_height',
29        'card_width',
30        'card_height',
31        'top_text_margin',
32        'left_text_margin',
33        'top_margin',
34        'left_margin',
35        'cols',
36        'rows',
37        'col_gap',
38        'row_gap',
39        'units',
40        'creator',
41        'current_label',
42    );
43
0
    if (scalar(@_) >1) {
44
0
        $given_params = {@_};
45
0
0
        foreach my $key (keys %{$given_params}) {
46
0
            if (!(grep m/$key/, @valid_template_params)) {
47
0
                warn sprintf('Unrecognized parameter type of "%s".', $key);
48
0
                $exit_code = 1;
49            }
50        }
51    }
52    else {
53
0
        if (!(grep m/$_/, @valid_template_params)) {
54
0
            warn sprintf('Unrecognized parameter type of "%s".', $_);
55
0
            $exit_code = 1;
56        }
57    }
58
0
    return $exit_code;
59}
60
61sub _conv_points {
62
0
    my $self = shift;
63
0
0
0
    my @unit_value = grep {$_->{'type'} eq $self->{'units'}} @{get_unit_values()};
64
0
    $self->{'page_width'} = $self->{'page_width'} * $unit_value[0]->{'value'};
65
0
    $self->{'page_height'} = $self->{'page_height'} * $unit_value[0]->{'value'};
66
0
    $self->{'label_width'} = $self->{'label_width'} * $unit_value[0]->{'value'};
67
0
    $self->{'label_height'} = $self->{'label_height'} * $unit_value[0]->{'value'};
68
0
    $self->{'top_text_margin'} = $self->{'top_text_margin'} * $unit_value[0]->{'value'};
69
0
    $self->{'left_text_margin'} = $self->{'left_text_margin'} * $unit_value[0]->{'value'};
70
0
    $self->{'top_margin'} = $self->{'top_margin'} * $unit_value[0]->{'value'};
71
0
    $self->{'left_margin'} = $self->{'left_margin'} * $unit_value[0]->{'value'};
72
0
    $self->{'col_gap'} = $self->{'col_gap'} * $unit_value[0]->{'value'};
73
0
    $self->{'row_gap'} = $self->{'row_gap'} * $unit_value[0]->{'value'};
74
0
    return $self;
75}
76
77sub _apply_profile {
78
0
    my $self = shift;
79
0
    my $creator = shift;
80
0
    my $profile = C4::Creators::Profile->retrieve(profile_id => $self->{'profile_id'}, creator => $creator, convert => 1);
81
0
    $self->{'top_margin'} = $self->{'top_margin'} + $profile->get_attr('offset_vert'); # controls vertical offset
82
0
    $self->{'left_margin'} = $self->{'left_margin'} + $profile->get_attr('offset_horz'); # controls horizontal offset
83
0
    $self->{'label_height'} = $self->{'label_height'} + $profile->get_attr('creep_vert'); # controls vertical creep
84
0
    $self->{'label_width'} = $self->{'label_width'} + $profile->get_attr('creep_horz'); # controls horizontal creep
85
0
    return $self;
86}
87
88sub new {
89
0
    my $invocant = shift;
90
0
    my $type = ref($invocant) || $invocant;
91
0
    if (_check_params(@_) eq 1) {
92
0
        return -1;
93    }
94
0
    my $self = {
95        profile_id => 0,
96        template_code => 'DEFAULT TEMPLATE',
97        template_desc => 'Default description',
98        page_width => 0,
99        page_height => 0,
100        label_width => 0,
101        label_height => 0,
102        top_text_margin => 0,
103        left_text_margin => 0,
104        top_margin => 0,
105        left_margin => 0,
106        cols => 0,
107        rows => 0,
108        col_gap => 0,
109        row_gap => 0,
110        units => 'POINT',
111        template_stat => 0, # false if any data has changed and the db has not been updated
112        @_,
113    };
114
0
    bless ($self, $type);
115
0
    return $self;
116}
117
118sub retrieve {
119
0
    my $invocant = shift;
120
0
    my %opts = @_;
121
0
    my $type = ref($invocant) || $invocant;
122
0
    my $query = "SELECT * FROM " . $opts{'table_name'} . " WHERE template_id = ? AND creator = ?";
123
0
    my $sth = C4::Context->dbh->prepare($query);
124
0
    $sth->execute($opts{'template_id'}, $opts{'creator'});
125
0
    if ($sth->err) {
126
0
        warn sprintf('Database returned the following error: %s', $sth->errstr);
127
0
        return -1;
128    }
129
0
    my $self = $sth->fetchrow_hashref;
130
0
    $self = _conv_points($self) if (($opts{convert} && $opts{convert} == 1) || $opts{profile_id});
131
0
    $self = _apply_profile($self, $opts{'creator'}) if $opts{profile_id} && $self->{'profile_id'}; # don't bother if there is no profile_id
132
0
    $self->{'template_stat'} = 1;
133
0
    bless ($self, $type);
134
0
    return $self;
135}
136
137sub delete {
138
0
    my $self = {};
139
0
    my %opts = ();
140
0
    my $call_type = '';
141
0
    my @query_params = ();
142
0
    if (ref($_[0])) {
143
0
        $self = shift; # check to see if this is a method call
144
0
        $call_type = 'C4::Labels::Template->delete';
145
0
        push @query_params, $self->{'template_id'}, $self->{'creator'};
146    }
147    else {
148
0
        %opts = @_;
149
0
        $call_type = 'C4::Labels::Template::delete';
150
0
        push @query_params, $opts{'template_id'}, $opts{'creator'};
151    }
152
0
    if (scalar(@query_params) < 2) { # If there is no template id or creator type then we cannot delete it
153
0
        warn sprintf('%s : Cannot delete template as the template id is invalid or non-existant.', $call_type) if !$query_params[0];
154
0
        warn sprintf('%s : Cannot delete template as the creator type is invalid or non-existant.', $call_type) if !$query_params[1];
155
0
        return -1;
156    }
157
0
    my $query = "DELETE FROM creator_templates WHERE template_id = ? AND creator = ?";
158
0
    my $sth = C4::Context->dbh->prepare($query);
159
0
    $sth->execute(@query_params);
160
0
    $self->{'template_stat'} = 0;
161}
162
163sub save {
164
0
    my $self = shift;
165
0
    my %opts = @_;
166
0
    if ($self->{'template_id'}) { # if we have an template_id, the record exists and needs UPDATE
167
0
        my @params;
168
0
        my $query = "UPDATE " . $opts{'table_name'} . " SET ";
169
0
0
        foreach my $key (keys %{$self}) {
170
0
            next if ($key eq 'template_id') || ($key eq 'template_stat') || ($key eq 'creator');
171
0
            push (@params, $self->{$key});
172
0
            $query .= "$key=?, ";
173        }
174
0
        $query = substr($query, 0, (length($query)-2));
175
0
        push (@params, $self->{'template_id'}, $self->{'creator'});
176
0
        $query .= " WHERE template_id=? AND creator=?;";
177
0
        my $sth = C4::Context->dbh->prepare($query);
178
0
        $sth->execute(@params);
179
0
        if ($sth->err) {
180
0
            warn sprintf('Database returned the following error: %s', $sth->errstr);
181
0
            return -1;
182        }
183
0
        $self->{'template_stat'} = 1;
184
0
        return $self->{'template_id'};
185    }
186    else { # otherwise create a new record
187
0
        my @params;
188
0
        my $query = "INSERT INTO " . $opts{'table_name'} ." (";
189
0
0
        foreach my $key (keys %{$self}) {
190
0
            next if $key eq 'template_stat';
191
0
            push (@params, $self->{$key});
192
0
            $query .= "$key, ";
193        }
194
0
        $query = substr($query, 0, (length($query)-2));
195
0
        $query .= ") VALUES (";
196        for (my $i=1; $i<=((scalar keys %$self) - 1); $i++) { # key count less keys not db related...
197
0
            $query .= "?,";
198
0
        }
199
0
        $query = substr($query, 0, (length($query)-1));
200
0
        $query .= ");";
201
0
        my $sth = C4::Context->dbh->prepare($query);
202
0
        $sth->execute(@params);
203
0
        if ($sth->err) {
204
0
            warn sprintf('Database returned the following error: %s', $sth->errstr);
205
0
            return -1;
206        }
207
0
        my $sth1 = C4::Context->dbh->prepare("SELECT MAX(template_id) FROM " . $opts{'table_name'} . ";");
208
0
        $sth1->execute();
209
0
        my $template_id = $sth1->fetchrow_array;
210
0
        $self->{'template_id'} = $template_id;
211
0
        $self->{'template_stat'} = 1;
212
0
        return $template_id;
213    }
214}
215
216sub get_attr {
217
0
    my $self = shift;
218
0
    if (_check_params(@_) eq 1) {
219
0
        return -1;
220    }
221
0
    my ($attr) = @_;
222
0
    if (exists($self->{$attr})) {
223
0
        return $self->{$attr};
224    }
225    else {
226
0
        return -1;
227    }
228}
229
230sub set_attr {
231
0
    my $self = shift;
232
0
    if (_check_params(@_) eq 1) {
233
0
        return -1;
234    }
235
0
    my %attrs = @_;
236
0
    foreach my $attrib (keys(%attrs)) {
237
0
        $self->{$attrib} = $attrs{$attrib};
238    };
239}
240
241sub get_label_position {
242
0
    my ($self, $start_label) = @_;
243
0
    my $current_label = $self->{'current_label'};
244
0
    if ($start_label eq 1) {
245
0
        $current_label->{'row_count'} = 1;
246
0
        $current_label->{'col_count'} = 1;
247
0
        $current_label->{'llx'} = $self->{'left_margin'};
248
0
        $current_label->{'lly'} = ($self->{'page_height'} - $self->{'top_margin'} - $self->{'label_height'});
249
0
        $self->{'current_label'} = $current_label;
250
0
        return ($current_label->{'row_count'}, $current_label->{'col_count'}, $current_label->{'llx'}, $current_label->{'lly'});
251    }
252    else {
253
0
        $current_label->{'row_count'} = ceil($start_label / $self->{'cols'});
254
0
        $current_label->{'col_count'} = ($start_label - (($current_label->{'row_count'} - 1) * $self->{'cols'}));
255
0
        $current_label->{'llx'} = $self->{'left_margin'} + ($self->{'label_width'} * ($current_label->{'col_count'} - 1)) + ($self->{'col_gap'} * ($current_label->{'col_count'} - 1));
256
0
        $current_label->{'lly'} = $self->{'page_height'} - $self->{'top_margin'} - ($self->{'label_height'} * $current_label->{'row_count'}) - ($self->{'row_gap'} * ($current_label->{'row_count'} - 1));
257
0
        $self->{'current_label'} = $current_label;
258
0
        return ($current_label->{'row_count'}, $current_label->{'col_count'}, $current_label->{'llx'}, $current_label->{'lly'});
259    }
260}
261
262sub get_next_label_pos {
263
0
    my $self = shift;
264
0
    my $current_label = $self->{'current_label'};
265
0
    my $new_page = 0;
266
0
    if ($current_label->{'col_count'} lt $self->get_attr('cols')) {
267
0
        $current_label->{'llx'} = ($current_label->{'llx'} + $self->get_attr('label_width') + $self->get_attr('col_gap'));
268
0
        $current_label->{'col_count'}++;
269    }
270    else {
271
0
        $current_label->{'llx'} = $self->get_attr('left_margin');
272
0
        if ($current_label->{'row_count'} eq $self->get_attr('rows')) {
273
0
            $new_page = 1;
274
0
            $current_label->{'lly'} = ($self->get_attr('page_height') - $self->get_attr('top_margin') - $self->get_attr('label_height'));
275
0
            $current_label->{'row_count'} = 1;
276        }
277        else {
278
0
            $current_label->{'lly'} = ($current_label->{'lly'} - $self->get_attr('row_gap') - $self->get_attr('label_height'));
279
0
            $current_label->{'row_count'}++;
280        }
281
0
        $current_label->{'col_count'} = 1;
282    }
283
0
    return ($current_label->{'llx'}, $current_label->{'lly'}, $new_page);
284}
285
2861;