1 package C4::Members::AttributeTypes;
3 # Copyright (C) 2008 LibLime
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free Software
9 # Foundation; either version 2 of the License, or (at your option) any later
12 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License along
17 # with Koha; if not, write to the Free Software Foundation, Inc.,
18 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #use warnings; FIXME - Bug 2505
24 use vars qw($VERSION);
27 # set the version for version checking
28 $VERSION = 3.07.00.049;
33 C4::Members::AttributeTypes - mananage extended patron attribute types
37 my @attribute_types = C4::Members::AttributeTypes::GetAttributeTypes();
39 my $attr_type = C4::Members::AttributeTypes->new($code, $description);
40 $attr_type->code($code);
41 $attr_type->description($description);
42 $attr_type->repeatable($repeatable);
43 $attr_type->unique_id($unique_id);
44 $attr_type->opac_display($opac_display);
45 $attr_type->password_allowed($password_allowed);
46 $attr_type->staff_searchable($staff_searchable);
47 $attr_type->authorised_value_category($authorised_value_category);
51 my $attr_type = C4::Members::AttributeTypes->fetch($code);
52 $attr_type = C4::Members::AttributeTypes->delete($code);
56 =head2 GetAttributeTypes
58 my @attribute_types = C4::Members::AttributeTypes::GetAttributeTypes($all_fields);
60 Returns an array of hashrefs of each attribute type defined
61 in the database. The array is sorted by code. Each hashref contains
62 at least the following fields:
67 If $all_fields is true, then each hashref also contains the other fields from borrower_attribute_types.
71 sub GetAttributeTypes {
73 my $select = $all ? '*' : 'code, description, class';
74 my $dbh = C4::Context->dbh;
75 my $sth = $dbh->prepare("SELECT $select FROM borrower_attribute_types ORDER by code");
77 my $results = $sth->fetchall_arrayref({});
81 sub GetAttributeTypes_hashref {
82 my %hash = map {$_->{code} => $_} GetAttributeTypes(@_);
86 =head2 AttributeTypeExists
88 my $have_attr_xyz = C4::Members::AttributeTypes::AttributeTypeExists($code)
90 Returns true if we have attribute type C<$code>
95 sub AttributeTypeExists {
97 my $dbh = C4::Context->dbh;
98 my $exists = $dbh->selectrow_array("SELECT code FROM borrower_attribute_types WHERE code = ?", undef, $code);
104 my $attr_type = C4::Members::AttributeTypes->new($code, $description);
106 Create a new attribute type.
114 $self->{'code'} = shift;
115 $self->{'description'} = shift;
116 $self->{'repeatable'} = 0;
117 $self->{'unique_id'} = 0;
118 $self->{'opac_display'} = 0;
119 $self->{'password_allowed'} = 0;
120 $self->{'staff_searchable'} = 0;
121 $self->{'display_checkout'} = 0;
122 $self->{'authorised_value_category'} = '';
123 $self->{'category_code'} = '';
124 $self->{'category_description'} = '';
125 $self->{'class'} = '';
133 my $attr_type = C4::Members::AttributeTypes->fetch($code);
135 Fetches an attribute type from the database. If no
136 type with the given C<$code> exists, returns undef.
144 my $dbh = C4::Context->dbh();
146 my $sth = $dbh->prepare_cached("
147 SELECT borrower_attribute_types.*, categories.description AS category_description
148 FROM borrower_attribute_types
149 LEFT JOIN categories ON borrower_attribute_types.category_code=categories.categorycode
151 $sth->execute($code);
152 my $row = $sth->fetchrow_hashref;
154 return unless defined $row;
156 $self->{'code'} = $row->{'code'};
157 $self->{'description'} = $row->{'description'};
158 $self->{'repeatable'} = $row->{'repeatable'};
159 $self->{'unique_id'} = $row->{'unique_id'};
160 $self->{'opac_display'} = $row->{'opac_display'};
161 $self->{'password_allowed'} = $row->{'password_allowed'};
162 $self->{'staff_searchable'} = $row->{'staff_searchable'};
163 $self->{'display_checkout'} = $row->{'display_checkout'};
164 $self->{'authorised_value_category'} = $row->{'authorised_value_category'};
165 $self->{'category_code'} = $row->{'category_code'};
166 $self->{'category_description'} = $row->{'category_description'};
167 $self->{'class'} = $row->{'class'};
177 Stores attribute type in the database. If the type
178 previously retrieved from the database via the fetch()
179 method, the DB representation of the type is replaced.
186 my $dbh = C4::Context->dbh;
188 my $existing = __PACKAGE__->fetch($self->{'code'});
189 if (defined $existing) {
190 $sth = $dbh->prepare_cached("UPDATE borrower_attribute_types
195 password_allowed = ?,
196 staff_searchable = ?,
197 authorised_value_category = ?,
198 display_checkout = ?,
203 $sth = $dbh->prepare_cached("INSERT INTO borrower_attribute_types
204 (description, repeatable, unique_id, opac_display, password_allowed,
205 staff_searchable, authorised_value_category, display_checkout, category_code, class, code)
206 VALUES (?, ?, ?, ?, ?,
209 $sth->bind_param(1, $self->{'description'});
210 $sth->bind_param(2, $self->{'repeatable'});
211 $sth->bind_param(3, $self->{'unique_id'});
212 $sth->bind_param(4, $self->{'opac_display'});
213 $sth->bind_param(5, $self->{'password_allowed'});
214 $sth->bind_param(6, $self->{'staff_searchable'});
215 $sth->bind_param(7, $self->{'authorised_value_category'});
216 $sth->bind_param(8, $self->{'display_checkout'});
217 $sth->bind_param(9, $self->{'category_code'} || undef);
218 $sth->bind_param(10, $self->{'class'});
219 $sth->bind_param(11, $self->{'code'});
226 my $code = $attr_type->code();
227 $attr_type->code($code);
229 Accessor. Note that the code is immutable once
230 a type is created or fetched from the database.
236 return $self->{'code'};
241 my $description = $attr_type->description();
242 $attr_type->description($description);
250 @_ ? $self->{'description'} = shift : $self->{'description'};
255 my $repeatable = $attr_type->repeatable();
256 $attr_type->repeatable($repeatable);
258 Accessor. The C<$repeatable> argument
259 is interpreted as a Perl boolean.
265 @_ ? $self->{'repeatable'} = ((shift) ? 1 : 0) : $self->{'repeatable'};
270 my $unique_id = $attr_type->unique_id();
271 $attr_type->unique_id($unique_id);
273 Accessor. The C<$unique_id> argument
274 is interpreted as a Perl boolean.
280 @_ ? $self->{'unique_id'} = ((shift) ? 1 : 0) : $self->{'unique_id'};
284 my $opac_display = $attr_type->opac_display();
285 $attr_type->opac_display($opac_display);
287 Accessor. The C<$opac_display> argument
288 is interpreted as a Perl boolean.
294 @_ ? $self->{'opac_display'} = ((shift) ? 1 : 0) : $self->{'opac_display'};
296 =head2 password_allowed
298 my $password_allowed = $attr_type->password_allowed();
299 $attr_type->password_allowed($password_allowed);
301 Accessor. The C<$password_allowed> argument
302 is interpreted as a Perl boolean.
306 sub password_allowed {
308 @_ ? $self->{'password_allowed'} = ((shift) ? 1 : 0) : $self->{'password_allowed'};
310 =head2 staff_searchable
312 my $staff_searchable = $attr_type->staff_searchable();
313 $attr_type->staff_searchable($staff_searchable);
315 Accessor. The C<$staff_searchable> argument
316 is interpreted as a Perl boolean.
320 sub staff_searchable {
322 @_ ? $self->{'staff_searchable'} = ((shift) ? 1 : 0) : $self->{'staff_searchable'};
325 =head2 display_checkout
329 my $display_checkout = $attr_type->display_checkout();
330 $attr_type->display_checkout($display_checkout);
334 Accessor. The C<$display_checkout> argument
335 is interpreted as a Perl boolean.
339 sub display_checkout {
341 @_ ? $self->{'display_checkout'} = ((shift) ? 1 : 0) : $self->{'display_checkout'};
344 =head2 authorised_value_category
346 my $authorised_value_category = $attr_type->authorised_value_category();
347 $attr_type->authorised_value_category($authorised_value_category);
353 sub authorised_value_category {
355 @_ ? $self->{'authorised_value_category'} = shift : $self->{'authorised_value_category'};
362 my $category_code = $attr_type->category_code();
363 $attr_type->category_code($category_code);
373 @_ ? $self->{'category_code'} = shift : $self->{'category_code'};
376 =head2 category_description
380 my $category_description = $attr_type->category_description();
381 $attr_type->category_description($category_description);
389 sub category_description {
391 @_ ? $self->{'category_description'} = shift : $self->{'category_description'};
398 my $class = $attr_type->class();
399 $attr_type->class($class);
409 @_ ? $self->{'class'} = shift : $self->{'class'};
415 $attr_type->delete();
416 C4::Members::AttributeTypes->delete($code);
418 Delete an attribute type from the database. The attribute
419 type may be specified either by an object or by a code.
426 if (ref($arg) eq __PACKAGE__) {
427 $code = $arg->{'code'};
432 my $dbh = C4::Context->dbh;
433 my $sth = $dbh->prepare_cached("DELETE FROM borrower_attribute_types WHERE code = ?");
434 $sth->execute($code);
439 my $count = $attr_type->num_patrons();
441 Returns the number of patron records that use
449 my $dbh = C4::Context->dbh;
450 my $sth = $dbh->prepare_cached("SELECT COUNT(DISTINCT borrowernumber)
451 FROM borrower_attributes
453 $sth->execute($self->{code});
454 my ($count) = $sth->fetchrow_array;
461 my @borrowernumbers = $attr_type->get_patrons($attribute);
463 Returns the borrowernumber of the patron records that
464 have an attribute with the specifie value.
472 my $dbh = C4::Context->dbh;
473 my $sth = $dbh->prepare_cached("SELECT DISTINCT borrowernumber
474 FROM borrower_attributes
477 $sth->execute($self->{code}, $value);
479 while (my ($borrowernumber) = $sth->fetchrow_array) {
480 push @results, $borrowernumber;
487 Koha Development Team <http://koha-community.org/>
489 Galen Charlton <galen.charlton@liblime.com>