File: | C4/Creators/Layout.pm |
Coverage: | 15.7% |
line | stmt | bran | cond | sub | time | code |
---|---|---|---|---|---|---|
1 | package C4::Creators::Layout; | |||||
2 | ||||||
3 | 4 4 4 | 779 31 156 | use strict; | |||
4 | 4 4 4 | 59 28 171 | use warnings; | |||
5 | ||||||
6 | 4 4 4 | 205 797 48 | use autouse 'Data::Dumper' => qw(Dumper); | |||
7 | ||||||
8 | 4 4 4 | 677 17 82 | use C4::Context; | |||
9 | 4 4 4 | 39 22 455 | use C4::Debug; | |||
10 | 4 4 4 | 746 13 157 | use C4::Creators::PDF; | |||
11 | ||||||
12 | BEGIN { | |||||
13 | 4 4 4 4 | 25 5 50 355 | use version; our $VERSION = qv('1.0.0_1'); | |||
14 | } | |||||
15 | ||||||
16 | # FIXME: Consider this style parameter verification instead... | |||||
17 | # my %param = @_; | |||||
18 | # for (keys %param) | |||||
19 | # { my $lc = lc($_); | |||||
20 | # if (exists $default{$lc}) | |||||
21 | # { $default{$lc} = $param{$_}; | |||||
22 | # } | |||||
23 | # else | |||||
24 | # { print STDERR "Unknown parameter $_ , not used \n"; | |||||
25 | # } | |||||
26 | # } | |||||
27 | ||||||
28 | sub _check_params { | |||||
29 | 0 | my $exit_code = 0; | ||||
30 | 0 | my @valtmpl_id_params = ( | ||||
31 | 'layout_id', | |||||
32 | 'barcode_type', | |||||
33 | 'printing_type', | |||||
34 | 'layout_name', | |||||
35 | 'guidebox', | |||||
36 | 'font', | |||||
37 | 'font_size', | |||||
38 | 'callnum_split', | |||||
39 | 'text_justify', | |||||
40 | 'format_string', | |||||
41 | 'layout_xml', # FIXME: all layouts should be stored in xml format to greatly simplify handling -chris_n | |||||
42 | 'creator', | |||||
43 | 'units', | |||||
44 | 'start_label', | |||||
45 | ); | |||||
46 | 0 | if (scalar(@_) >1) { | ||||
47 | 0 | my %given_params = @_; | ||||
48 | 0 | foreach my $key (keys %given_params) { | ||||
49 | 0 | if (!(grep m/$key/, @valtmpl_id_params)) { | ||||
50 | 0 | warn sprintf('(Multiple parameters) Unrecognized parameter type of "%s".', $key); | ||||
51 | 0 | $exit_code = 1; | ||||
52 | } | |||||
53 | } | |||||
54 | } | |||||
55 | else { | |||||
56 | 0 | if (!(grep m/$_/, @valtmpl_id_params)) { | ||||
57 | 0 | warn sprintf('(Single parameter) Unrecognized parameter type of "%s".', $_); | ||||
58 | 0 | $exit_code = 1; | ||||
59 | } | |||||
60 | } | |||||
61 | 0 | return $exit_code; | ||||
62 | } | |||||
63 | ||||||
64 | 4 4 4 | 901 6 72 | use constant PRESET_FIELDS => [qw(title author isbn issn itemtype barcode itemcallnumber)]; | |||
65 | sub new { | |||||
66 | 0 | my $invocant = shift; | ||||
67 | 0 | my $self = ''; | ||||
68 | 0 | if (_check_params(@_) eq 1) { | ||||
69 | 0 | return -1; | ||||
70 | } | |||||
71 | 0 | my $type = ref($invocant) || $invocant; | ||||
72 | 0 0 0 | if (grep {$_ eq 'Labels'} @_) { | ||||
73 | 0 | $self = { | ||||
74 | layout_xml => '', | |||||
75 | units => 'POINT', | |||||
76 | start_label => 1, | |||||
77 | barcode_type => 'CODE39', | |||||
78 | printing_type => 'BAR', | |||||
79 | layout_name => 'DEFAULT', | |||||
80 | guidebox => 0, | |||||
81 | font => 'TR', | |||||
82 | font_size => 3, | |||||
83 | callnum_split => 0, | |||||
84 | text_justify => 'L', | |||||
85 | 0 | format_string => join(', ', @{ PRESET_FIELDS() }), | ||||
86 | @_, | |||||
87 | }; | |||||
88 | } | |||||
89 | elsif (grep {$_ eq 'Patroncards'} @_) { | |||||
90 | 0 | $self = { | ||||
91 | layout_xml => '<opt>Default Layout</opt>', | |||||
92 | @_, | |||||
93 | } | |||||
94 | } | |||||
95 | 0 | bless ($self, $type); | ||||
96 | 0 | return $self; | ||||
97 | } | |||||
98 | ||||||
99 | sub retrieve { | |||||
100 | 0 | my $invocant = shift; | ||||
101 | 0 | my %opts = @_; | ||||
102 | 0 | my $type = ref($invocant) || $invocant; | ||||
103 | 0 | my $query = "SELECT * FROM creator_layouts WHERE layout_id = ? AND creator = ?"; | ||||
104 | 0 | my $sth = C4::Context->dbh->prepare($query); | ||||
105 | 0 | $sth->execute($opts{'layout_id'}, $opts{'creator'}); | ||||
106 | 0 | if ($sth->err) { | ||||
107 | 0 | warn sprintf('Database returned the following error: %s', $sth->errstr); | ||||
108 | 0 | return -1; | ||||
109 | } | |||||
110 | 0 | my $self = $sth->fetchrow_hashref; | ||||
111 | 0 | bless ($self, $type); | ||||
112 | 0 | return $self; | ||||
113 | } | |||||
114 | ||||||
115 | sub delete { | |||||
116 | 0 | my $self = {}; | ||||
117 | 0 | my %opts = (); | ||||
118 | 0 | my $call_type = ''; | ||||
119 | 0 | my @params = (); | ||||
120 | 0 | if (ref($_[0])) { | ||||
121 | 0 | $self = shift; # check to see if this is a method call | ||||
122 | 0 | $call_type = 'C4::Labels::Layout->delete'; | ||||
123 | 0 | push @params, $self->{'layout_id'}, $self->{'creator'}; | ||||
124 | } | |||||
125 | else { | |||||
126 | 0 | my $class = shift; | ||||
127 | 0 | %opts = @_; | ||||
128 | 0 | $call_type = $class . '::delete'; | ||||
129 | 0 | push @params, $opts{'layout_id'}, $opts{'creator'}; | ||||
130 | } | |||||
131 | 0 | if (scalar(@params) < 2) { # If there is no layout id or creator type then we cannot delete it | ||||
132 | 0 | warn sprintf('%s : Cannot delete layout as the profile id is invalid or non-existant.', $call_type) if !$params[0]; | ||||
133 | 0 | warn sprintf('%s : Cannot delete layout as the creator type is invalid or non-existant.', $call_type) if !$params[1]; | ||||
134 | 0 | return -1; | ||||
135 | } | |||||
136 | 0 | my $query = "DELETE FROM creator_layouts WHERE layout_id = ? AND creator = ?"; | ||||
137 | 0 | my $sth = C4::Context->dbh->prepare($query); | ||||
138 | 0 | $sth->execute(@params); | ||||
139 | 0 | if ($sth->err) { | ||||
140 | 0 | warn sprintf('Database returned the following error on attempted DELETE: %s', $sth->errstr); | ||||
141 | 0 | return -1; | ||||
142 | } | |||||
143 | } | |||||
144 | ||||||
145 | sub save { | |||||
146 | 0 | my $self = shift; | ||||
147 | 0 | if ($self->{'layout_id'}) { # if we have an id, the record exists and needs UPDATE | ||||
148 | 0 | my @params; | ||||
149 | 0 | my $query = "UPDATE creator_layouts SET "; | ||||
150 | 0 0 | foreach my $key (keys %{$self}) { | ||||
151 | 0 | next if ($key eq 'layout_id') || ($key eq 'creator'); | ||||
152 | 0 | push (@params, $self->{$key}); | ||||
153 | 0 | $query .= "$key=?, "; | ||||
154 | } | |||||
155 | 0 | $query = substr($query, 0, (length($query)-2)); | ||||
156 | 0 | $query .= " WHERE layout_id=? AND creator = ?;"; | ||||
157 | 0 | push (@params, $self->{'layout_id'}, $self->{'creator'}); | ||||
158 | 0 | my $sth = C4::Context->dbh->prepare($query); | ||||
159 | #local $sth->{TraceLevel} = "3"; # enable DBI trace and set level; outputs to STDERR | |||||
160 | 0 | $sth->execute(@params); | ||||
161 | 0 | if ($sth->err) { | ||||
162 | 0 | warn sprintf('Database returned the following error: %s', $sth->errstr); | ||||
163 | 0 | return -1; | ||||
164 | } | |||||
165 | 0 | return $self->{'layout_id'}; | ||||
166 | } | |||||
167 | else { # otherwise create a new record | |||||
168 | 0 | my @params; | ||||
169 | 0 | my $query = "INSERT INTO creator_layouts ("; | ||||
170 | 0 0 | foreach my $key (keys %{$self}) { | ||||
171 | 0 | push (@params, $self->{$key}); | ||||
172 | 0 | $query .= "$key, "; | ||||
173 | } | |||||
174 | 0 | $query = substr($query, 0, (length($query)-2)); | ||||
175 | 0 | $query .= ") VALUES ("; | ||||
176 | for (my $i=1; $i<=(scalar keys %$self); $i++) { | |||||
177 | 0 | $query .= "?,"; | ||||
178 | 0 | } | ||||
179 | 0 | $query = substr($query, 0, (length($query)-1)); | ||||
180 | 0 | $query .= ");"; | ||||
181 | 0 | my $sth = C4::Context->dbh->prepare($query); | ||||
182 | 0 | $sth->execute(@params); | ||||
183 | 0 | if ($sth->err) { | ||||
184 | 0 | warn sprintf('Database returned the following error: %s', $sth->errstr); | ||||
185 | 0 | return -1; | ||||
186 | } | |||||
187 | 0 | my $sth1 = C4::Context->dbh->prepare("SELECT MAX(layout_id) FROM creator_layouts;"); | ||||
188 | 0 | $sth1->execute(); | ||||
189 | 0 | my $id = $sth1->fetchrow_array; | ||||
190 | 0 | $self->{'layout_id'} = $id; | ||||
191 | 0 | return $id; | ||||
192 | } | |||||
193 | } | |||||
194 | ||||||
195 | sub get_attr { | |||||
196 | 0 | my $self = shift; | ||||
197 | 0 | if (_check_params(@_) eq 1) { | ||||
198 | 0 | return -1; | ||||
199 | } | |||||
200 | 0 | my ($attr) = @_; | ||||
201 | 0 | if (exists($self->{$attr})) { | ||||
202 | 0 | return $self->{$attr}; | ||||
203 | } | |||||
204 | else { | |||||
205 | 0 | return -1; | ||||
206 | } | |||||
207 | 0 | return; | ||||
208 | } | |||||
209 | ||||||
210 | sub set_attr { | |||||
211 | 0 | my $self = shift; | ||||
212 | 0 | if (_check_params(@_) eq 1) { | ||||
213 | 0 | return -1; | ||||
214 | } | |||||
215 | 0 | my %attrs = @_; | ||||
216 | 0 | foreach my $attrib (keys(%attrs)) { | ||||
217 | 0 | $self->{$attrib} = $attrs{$attrib}; | ||||
218 | }; | |||||
219 | 0 | return 0; | ||||
220 | } | |||||
221 | ||||||
222 | sub get_text_wrap_cols { | |||||
223 | 0 | my $self = shift; | ||||
224 | 0 | my %params = @_; | ||||
225 | 0 | my $string = ''; | ||||
226 | 0 | my $strwidth = 0; | ||||
227 | 0 | my $col_count = 0; | ||||
228 | 0 | my $textlimit = $params{'label_width'} - (( 3 * $params{'left_text_margin'} ) || 13.5 ); | ||||
229 | ||||||
230 | 0 | while ($strwidth < $textlimit) { | ||||
231 | 0 | $string .= '0'; | ||||
232 | 0 | $col_count++; | ||||
233 | 0 | $strwidth = C4::Creators::PDF->StrWidth( $string, $self->{'font'}, $self->{'font_size'} ); | ||||
234 | } | |||||
235 | 0 | return $col_count; | ||||
236 | } | |||||
237 | ||||||
238 | 1; |