Bug 20422: Fix warning on uri_escape_utf8 in Output.pm
[koha.git] / C4 / ClassSource.pm
1 package C4::ClassSource;
2
3 # Copyright (C) 2007 LibLime
4
5 # This file is part of Koha.
6 #
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
19
20 use strict;
21 use warnings;
22
23 require Exporter;
24 use C4::Context;
25 use C4::ClassSortRoutine;
26
27 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
28
29
30 =head1 NAME
31
32 C4::ClassSources - handle classification sources in Koha
33
34 =head1 SYNOPSIS
35
36 use C4::ClassSource;
37
38 =head1 DESCRIPTION
39
40 This module deals with manipulating classification
41 sources and sorting rules.
42
43 =head1 FUNCTIONS
44
45 =cut
46
47
48 @ISA    = qw(Exporter);
49 @EXPORT = qw(
50     &GetClassSources
51     &AddClassSource
52     &GetClassSource
53     &ModClassSource
54     &DelClassSource
55     &GetClassSortRules
56     &AddClassSortRule
57     &GetClassSortRule
58     &ModClassSortRule
59     &DelClassSortRule
60   
61     &GetSourcesForSortRule
62     &GetClassSort
63     
64 );
65
66 =head2 GetClassSources
67
68   my $sources = GetClassSources();
69
70   Returns reference to hash of references to
71   the class sources, keyed on cn_source.
72
73 =head3 Example
74
75 my $sources = GetClassSources();
76 my @sources = ();
77 foreach my $cn_source (sort keys %$sources) {
78     my $source = $sources->{$cn_source};
79     push @sources, 
80       {  
81         code        => $source->{'cn_source'},
82         description => $source->{'description'},
83         used => $source->{'used'},
84         sortrule    => $source->{'class_sort_rule'}
85       } 
86 }
87
88 =cut
89
90 sub GetClassSources {
91
92     my %class_sources = ();
93     my $dbh = C4::Context->dbh;
94     my $sth = $dbh->prepare("SELECT * FROM `class_sources`");
95     $sth->execute();
96     while (my $source = $sth->fetchrow_hashref) {
97         $class_sources{ $source->{'cn_source'} } = $source;
98     }
99
100     return \%class_sources;
101
102 }
103
104 =head2 AddClassSource
105
106   AddClassSource($cn_source, $description, $used, $class_sort_rule);
107
108   Adds a class_sources row.
109
110 =cut
111
112 sub AddClassSource {
113
114     my ($cn_source, $description, $used, $class_sort_rule) = @_;
115     my $exists = GetClassSource($cn_source);
116     if ($exists) {
117         return 0;
118     }
119     my $dbh = C4::Context->dbh;
120     my $sth = $dbh->prepare("INSERT INTO `class_sources`
121                                            (`cn_source`, `description`, `used`, `class_sort_rule`)
122                                            VALUES (?, ?, ?, ?)");
123     $sth->execute($cn_source, $description, $used, $class_sort_rule);
124     return 1;
125 }
126
127 =head2 GetClassSource
128
129   my $hashref = GetClassSource($cn_source);
130
131   Retrieves a class_sources row by cn_source.
132
133 =cut
134
135 sub GetClassSource {
136
137     my ($cn_source) = (@_);
138     my $dbh = C4::Context->dbh;
139     my $sth = $dbh->prepare("SELECT * FROM `class_sources` WHERE cn_source = ?");
140     $sth->execute($cn_source);
141     my $row = $sth->fetchrow_hashref();
142     return $row;
143 }
144
145 =head2 ModClassSource 
146
147   ModClassSource($cn_source, $description, $used, $class_sort_rule);
148
149   Updates a class_sources row.
150
151 =cut
152
153 sub ModClassSource {
154
155     my ($cn_source, $description, $used, $class_sort_rule) = @_;
156     my $dbh = C4::Context->dbh;
157     my $sth = $dbh->prepare("UPDATE `class_sources`
158                                     SET  `description` = ?,
159                                          `used` = ?,
160                                          `class_sort_rule` = ?
161                                     WHERE `cn_source` = ?");
162     $sth->execute($description, $used, $class_sort_rule, $cn_source);
163
164 }
165
166 =head2 DelClassSource 
167
168   DelClassSource($cn_source);
169
170   Deletes class_sources row.
171
172 =cut
173
174 sub DelClassSource {
175
176     my ($cn_source) = @_;
177     my $dbh = C4::Context->dbh;
178     my $sth = $dbh->prepare("DELETE FROM `class_sources` WHERE `cn_source` = ?");
179     $sth->execute($cn_source);
180
181 }
182
183 =head2 GetClassSortRules
184
185   my $sort_rules = GetClassSortRules();
186
187 Returns reference to hash of references to
188 the class sorting rules, keyed on class_sort_rule
189
190 =head3 Example
191
192   my $sort_rules = GetClassSortRules();
193   my @sort_rules = ();
194   foreach my $sort_rule (sort keys %$sort_rules) {
195       my $sort_rule = $sort_rules->{$sort_rule};
196       push @sort_rules,
197           {
198           rule        => $sort_rule->{'class_sort_rule'},
199           description => $sort_rule->{'description'},
200           sort_routine    => $sort_rule->{'sort_routine'}
201       }
202    }
203
204 =cut
205
206 sub GetClassSortRules {
207
208     my %class_sort_rules = ();
209     my $dbh = C4::Context->dbh;
210     my $sth = $dbh->prepare("SELECT * FROM `class_sort_rules`");
211     $sth->execute();
212     while (my $sort_rule = $sth->fetchrow_hashref) {
213         $class_sort_rules{ $sort_rule->{'class_sort_rule'} } = $sort_rule;
214     }
215
216     return \%class_sort_rules;
217
218 }
219
220 =head2 AddClassSortRule
221
222   AddClassSortRule($class_sort_rule, $description, $sort_routine);
223
224   Adds a class_sort_rules row.
225
226 =cut
227
228 sub AddClassSortRule {
229
230     my ($class_sort_rule, $description, $sort_routine) = @_;
231     my $exists = GetClassSortRule($class_sort_rule);
232     if ($exists) {
233         return 0;
234     }
235     my $dbh = C4::Context->dbh;
236     my $sth = $dbh->prepare("INSERT INTO `class_sort_rules`
237                                            (`class_sort_rule`, `description`, `sort_routine`)
238                                            VALUES (?, ?, ?)");
239     $sth->execute($class_sort_rule, $description, $sort_routine);
240     return 1;
241 }
242
243 =head2 GetClassSortRule
244
245   my $hashref = GetClassSortRule($class_sort_rule);
246
247   Retrieves a class_sort_rules row by class_sort_rule.
248
249 =cut
250
251 sub GetClassSortRule {
252
253     my ($class_sort_rule) = (@_);
254     my $dbh = C4::Context->dbh;
255     my $sth = $dbh->prepare("SELECT * FROM `class_sort_rules` WHERE `class_sort_rule` = ?");
256     $sth->execute($class_sort_rule);
257     my $row = $sth->fetchrow_hashref();
258     return $row;
259 }
260
261 =head2 ModClassSortRule 
262
263   ModClassSortRule($class_sort_rule, $description, $sort_routine);
264
265   Updates a class_sort_rules row.
266
267 =cut
268
269 sub ModClassSortRule {
270
271     my ($class_sort_rule, $description, $sort_routine) = @_;
272     my $dbh = C4::Context->dbh;
273     my $sth = $dbh->prepare("UPDATE `class_sort_rules`
274                                     SET  `description` = ?,
275                                          `sort_routine` = ?
276                                     WHERE `class_sort_rule` = ?");
277     $sth->execute($description, $sort_routine, $class_sort_rule);
278
279 }
280
281 =head2 DelClassSortRule 
282
283   DelClassSortRule($class_sort_rule);
284
285   Deletes class_sort_rules row.
286
287 =cut
288
289 sub DelClassSortRule {
290
291     my ($class_sort_rule) = @_;
292     my $dbh = C4::Context->dbh;
293     my $sth = $dbh->prepare("DELETE FROM `class_sort_rules` WHERE `class_sort_rule` = ?");
294     $sth->execute($class_sort_rule);
295
296 }
297
298 =head2 GetSourcesForSortRule
299
300   my @source = GetSourcesForSortRule($class_sort_rule);
301
302   Retrieves an array class_source.cn_rule for each source
303   that uses the supplied $class_sort_rule.
304
305 =cut
306
307 sub GetSourcesForSortRule {
308
309     my ($class_sort_rule) = @_;
310
311     my $dbh = C4::Context->dbh;
312     my $sth = $dbh->prepare("SELECT cn_source FROM class_sources WHERE class_sort_rule = ?");
313     $sth->execute($class_sort_rule);
314     my @sources = ();
315     while (my ($source) = $sth->fetchrow_array()) {
316         push @sources, $source;
317     }
318     return @sources;
319
320 }
321
322 =head2 GetClassSort
323
324   my $cn_sort = GetClassSort($cn_source, $cn_class, $cn_item);
325
326 Get the sort key corresponding to the classification part and item part
327 and the defined call number source.
328
329 =cut
330
331 sub GetClassSort {
332
333     my ($cn_source, $cn_class, $cn_item) = @_;
334
335     my $source_ref = GetClassSource($cn_source);
336     unless (defined $source_ref) {
337         $source_ref = GetClassSource(C4::Context->preference("DefaultClassificationSource"));
338     }
339     my $routine = "";
340     if (defined $source_ref) {
341         my $rule_ref = GetClassSortRule($source_ref->{'class_sort_rule'});
342         if (defined $rule_ref) {
343             $routine = $rule_ref->{'sort_routine'};
344         }
345     } 
346
347     return GetClassSortKey($routine, $cn_class, $cn_item);
348
349 }
350
351 1;
352
353 =head1 AUTHOR
354
355 Koha Development Team <http://koha-community.org/>
356
357 =cut