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
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';
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->{'authorised_value_category'} = '';
129 my $attr_type = C4::Members::AttributeTypes->fetch($code);
131 Fetches an attribute type from the database. If no
132 type with the given C<$code> exists, returns undef.
140 my $dbh = C4::Context->dbh();
142 my $sth = $dbh->prepare_cached("SELECT * FROM borrower_attribute_types WHERE code = ?");
143 $sth->execute($code);
144 my $row = $sth->fetchrow_hashref;
146 return undef unless defined $row;
148 $self->{'code'} = $row->{'code'};
149 $self->{'description'} = $row->{'description'};
150 $self->{'repeatable'} = $row->{'repeatable'};
151 $self->{'unique_id'} = $row->{'unique_id'};
152 $self->{'opac_display'} = $row->{'opac_display'};
153 $self->{'password_allowed'} = $row->{'password_allowed'};
154 $self->{'staff_searchable'} = $row->{'staff_searchable'};
155 $self->{'authorised_value_category'} = $row->{'authorised_value_category'};
165 Stores attribute type in the database. If the type
166 previously retrieved from the database via the fetch()
167 method, the DB representation of the type is replaced.
174 my $dbh = C4::Context->dbh;
176 my $existing = __PACKAGE__->fetch($self->{'code'});
177 if (defined $existing) {
178 $sth = $dbh->prepare_cached("UPDATE borrower_attribute_types
183 password_allowed = ?,
184 staff_searchable = ?,
185 authorised_value_category = ?
188 $sth = $dbh->prepare_cached("INSERT INTO borrower_attribute_types
189 (description, repeatable, unique_id, opac_display, password_allowed,
190 staff_searchable, authorised_value_category, code)
191 VALUES (?, ?, ?, ?, ?,
194 $sth->bind_param(1, $self->{'description'});
195 $sth->bind_param(2, $self->{'repeatable'});
196 $sth->bind_param(3, $self->{'unique_id'});
197 $sth->bind_param(4, $self->{'opac_display'});
198 $sth->bind_param(5, $self->{'password_allowed'});
199 $sth->bind_param(6, $self->{'staff_searchable'});
200 $sth->bind_param(7, $self->{'authorised_value_category'});
201 $sth->bind_param(8, $self->{'code'});
208 my $code = $attr_type->code();
209 $attr_type->code($code);
211 Accessor. Note that the code is immutable once
212 a type is created or fetched from the database.
218 return $self->{'code'};
223 my $description = $attr_type->description();
224 $attr_type->description($description);
232 @_ ? $self->{'description'} = shift : $self->{'description'};
237 my $repeatable = $attr_type->repeatable();
238 $attr_type->repeatable($repeatable);
240 Accessor. The C<$repeatable> argument
241 is interpreted as a Perl boolean.
247 @_ ? $self->{'repeatable'} = ((shift) ? 1 : 0) : $self->{'repeatable'};
252 my $unique_id = $attr_type->unique_id();
253 $attr_type->unique_id($unique_id);
255 Accessor. The C<$unique_id> argument
256 is interpreted as a Perl boolean.
262 @_ ? $self->{'unique_id'} = ((shift) ? 1 : 0) : $self->{'unique_id'};
266 my $opac_display = $attr_type->opac_display();
267 $attr_type->opac_display($opac_display);
269 Accessor. The C<$opac_display> argument
270 is interpreted as a Perl boolean.
276 @_ ? $self->{'opac_display'} = ((shift) ? 1 : 0) : $self->{'opac_display'};
278 =head2 password_allowed
280 my $password_allowed = $attr_type->password_allowed();
281 $attr_type->password_allowed($password_allowed);
283 Accessor. The C<$password_allowed> argument
284 is interpreted as a Perl boolean.
288 sub password_allowed {
290 @_ ? $self->{'password_allowed'} = ((shift) ? 1 : 0) : $self->{'password_allowed'};
292 =head2 staff_searchable
294 my $staff_searchable = $attr_type->staff_searchable();
295 $attr_type->staff_searchable($staff_searchable);
297 Accessor. The C<$staff_searchable> argument
298 is interpreted as a Perl boolean.
302 sub staff_searchable {
304 @_ ? $self->{'staff_searchable'} = ((shift) ? 1 : 0) : $self->{'staff_searchable'};
307 =head2 authorised_value_category
309 my $authorised_value_category = $attr_type->authorised_value_category();
310 $attr_type->authorised_value_category($authorised_value_category);
316 sub authorised_value_category {
318 @_ ? $self->{'authorised_value_category'} = shift : $self->{'authorised_value_category'};
323 $attr_type->delete();
324 C4::Members::AttributeTypes->delete($code);
326 Delete an attribute type from the database. The attribute
327 type may be specified either by an object or by a code.
334 if (ref($arg) eq __PACKAGE__) {
335 $code = $arg->{'code'};
340 my $dbh = C4::Context->dbh;
341 my $sth = $dbh->prepare_cached("DELETE FROM borrower_attribute_types WHERE code = ?");
342 $sth->execute($code);
347 my $count = $attr_type->num_patrons();
349 Returns the number of patron records that use
357 my $dbh = C4::Context->dbh;
358 my $sth = $dbh->prepare_cached("SELECT COUNT(DISTINCT borrowernumber)
359 FROM borrower_attributes
361 $sth->execute($self->{code});
362 my ($count) = $sth->fetchrow_array;
369 my @borrowernumbers = $attr_type->get_patrons($attribute);
371 Returns the borrowernumber of the patron records that
372 have an attribute with the specifie value.
380 my $dbh = C4::Context->dbh;
381 my $sth = $dbh->prepare_cached("SELECT DISTINCT borrowernumber
382 FROM borrower_attributes
385 $sth->execute($self->{code}, $value);
387 while (my ($borrowernumber) = $sth->fetchrow_array) {
388 push @results, $borrowernumber;
395 Koha Development Team <http://koha-community.org/>
397 Galen Charlton <galen.charlton@liblime.com>