New C4 Modules

* C4::Category
  - patron categories as objects
  - an all() method to return all the categories as a list
* C4::ItemType
  - itemtypes as objects
  - an all() method to return all the item types as a list
* C4::ItemCirculationAlertPreference
  - wrapper around the item_circulation_alert_preference table
  - create() and delete() methods for easy manipulation of the preferences
  - I regret giving it such a long name.
  - The item_type column should've been named itemtype to make it
    more similar to pre-existing tables.  Oh well.

(C4::Category and C4::ItemType were made so that I wouldn't have to
write SQL inside my CGI scripts.
Their main purpose is to provide an easy way to get a list of
patron categories and item types.
Do not be fooled by the amount of POD.
There's actually very little code in these modules.)

Signed-off-by: Daniel Sweeney <daniel.sweeney@liblime.com>
Signed-off-by: Galen Charlton <galen.charlton@liblime.com>
This commit is contained in:
John Beppu 2009-02-03 16:02:03 -06:00 committed by Galen Charlton
parent 233010f451
commit 5991cdd33a
3 changed files with 631 additions and 0 deletions

155
C4/Category.pm Normal file
View file

@ -0,0 +1,155 @@
package C4::Category;
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
# Suite 330, Boston, MA 02111-1307 USA
use strict;
use warnings;
use C4::Context;
our $AUTOLOAD;
=head1 NAME
C4::Category - objects from the categories table
=head1 SYNOPSIS
use C4::Category;
my @categories = C4::Category->all;
print join("\n", map { $_->description } @categories), "\n";
=head1 DESCRIPTION
Objects of this class represent a row in the C<categories> table.
Currently, the bare minimum for using this as a read-only data source has
been implemented. The API was designed to make it easy to transition to
an ORM later on.
=head1 API
=head2 Class Methods
=cut
=head3 C4::Category->new(\%opts)
Given a hashref, a new (in-memory) C4::Category object will be instantiated.
The database is not touched.
=cut
sub new {
my ($class, $opts) = @_;
bless $opts => $class;
}
=head3 C4::Category->all
This returns all the categories as objects. By default they're ordered by
C<description>.
=cut
sub all {
my ($class) = @_;
my $dbh = C4::Context->dbh;
return map { $class->new($_) } @{$dbh->selectall_arrayref(
# The categories table is small enough for
# `SELECT *` to be harmless.
"SELECT * FROM categories ORDER BY description",
{ Slice => {} },
)};
}
=head2 Object Methods
These are read-only accessors for attributes of a C4::Category object.
=head3 $category->categorycode
=head3 $category->description
=head3 $category->enrolmentperiod
=head3 $category->upperagelimit
=head3 $category->dateofbirthrequired
=head3 $category->finetype
=head3 $category->bulk
=head3 $category->enrolmentfee
=head3 $category->overduenoticerequired
=head3 $category->issuelimit
=head3 $category->reservefee
=head3 $category->category_type
=cut
sub AUTOLOAD {
my $self = shift;
my $attr = $AUTOLOAD;
$attr =~ s/.*://;
if (exists $self->{$attr}) {
return $self->{$attr};
} else {
return undef;
}
}
=head1 SEE ALSO
The following modules make reference to the C<categories> table.
L<C4::Members>, L<C4::Overdues>, L<C4::Reserves>
=head1 AUTHOR
John Beppu <john.beppu@liblime.com>
=cut
1;
# Local Variables: ***
# mode: cperl ***
# indent-tabs-mode: nil ***
# cperl-close-paren-offset: -4 ***
# cperl-continued-statement-offset: 4 ***
# cperl-indent-level: 4 ***
# cperl-indent-parens-as-block: t ***
# cperl-tab-always-indent: nil ***
# End: ***
# vim:tabstop=8 softtabstop=4 shiftwidth=4 shiftround expandtab

View file

@ -0,0 +1,317 @@
package C4::ItemCirculationAlertPreference;
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
# Suite 330, Boston, MA 02111-1307 USA
use strict;
use warnings;
use C4::Context;
use Carp qw(carp croak);
our $AUTOLOAD;
# helper function for validating \%opts
our $valid = sub {
my $opts = shift;
for (qw(branchcode categorycode item_type)) {
exists($opts->{$_}) || croak("'$_' is a required parameter.");
}
};
=head1 NAME
C4::ItemCirculationAlertPreference - manage preferences for sending alerts
=head1 SYNOPSIS
Basics:
use C4::ItemCirculationAlertPreference;
# a short-cut to reduce typing the long package name over and over again
my $preferences = 'C4::ItemCirculationAlertPreference';
Creating Rules:
my $pref = $preferences->create({
branchcode => 'CPL',
categorycode => 'YA',
item_type => 'BK',
});
Deleting Rules:
$preferences->delete({
branchcode => 'CPL',
categorycode => 'YA',
item_type => 'BK',
});
=head1 DESCRIPTION
This class is used to manage the preferences for when an alert may be sent. By
default, item circulation alerts are enabled for every B<branch>, B<patron
category> and B<item type>.
However, if you would like to prevent item circulation alerts from being sent
for any combination of these 3 variables, a preference can be inserted into the
C<item_circulation_alert_preferences> table to make that a policy.
=head1 API
=head2 Class Methods
=cut
=head3 C4::ItemCirculationAlertPreference->new(\%opts)
This is a constructor for an in-memory C4::ItemCirculationAlertPreference
object. The database is not affected by this method.
=cut
sub new {
my ($class, $opts) = @_;
bless $opts => $class;
}
=head3 C4::ItemCirculationAlertPreference->create(\%opts)
This will find or create an item circulation alert preference. You must pass
it a B<branchcode>, B<categorycode>, and B<item_type>.
=cut
sub create {
my ($class, $opts) = @_;
$valid->($opts);
my $dbh = C4::Context->dbh;
my $prefs = $dbh->selectall_arrayref(
"SELECT id, branchcode, categorycode, item_type
FROM item_circulation_alert_preferences
WHERE branchcode = ?
AND categorycode = ?
AND item_type = ?",
{ Slice => {} },
$opts->{branchcode},
$opts->{categorycode},
$opts->{item_type},
);
if (@$prefs) {
return $class->new($prefs->[0]);
} else {
my $success = $dbh->do(
"INSERT INTO item_circulation_alert_preferences
(branchcode, categorycode, item_type) VALUES (?, ?, ?)",
{},
$opts->{branchcode},
$opts->{categorycode},
$opts->{item_type},
);
if ($success) {
my $self = {
id => $dbh->last_insert_id(undef, undef, undef, undef),
branchcode => $opts->{branchcode},
categorycode => $opts->{categorycode},
item_type => $opts->{item_type},
};
return $class->new($self);
} else {
carp $dbh->errstr;
return undef;
}
}
}
=head3 C4::ItemCirculationAlertPreference->delete(\%opts)
Delete an item circulation alert preference. You can delete by either passing
in an B<id> or passing in a B<branchcode>, B<categorycode>, B<item_type>
triplet.
=cut
sub delete {
my ($class, $opts) = @_;
my $dbh = C4::Context->dbh;
if ($opts->{id}) {
$dbh->do(
"DELETE FROM item_circulation_alert_preferences WHERE id = ?",
{},
$opts->{id}
);
} else {
$valid->($opts);
$dbh->do(
"DELETE FROM item_circulation_alert_preferences
WHERE branchcode = ?
AND categorycode = ?
AND item_type = ?",
{},
$opts->{branchcode},
$opts->{categorycode},
$opts->{item_type}
);
}
}
=head3 C4::ItemCirculationAlertPreference->is_enabled_for(\%opts)
Based on the existing preferences in the C<item_circulation_alert_preferences>
table, can an alert be sent for the given B<branchcode>, B<categorycode>, and
B<itemtype>?
B<Example>:
my $alert = 'C4::ItemCirculationAlertPreference';
my $conditions = {
branchcode => 'CPL',
categorycode => 'IL',
item_type => 'MU',
};
if ($alert->is_enabled_for($conditions)) {
# ...
}
=cut
sub is_enabled_for {
my ($class, $opts) = @_;
$valid->($opts);
my $dbh = C4::Context->dbh;
# Does a preference exist to block this alert?
my $query = qq{
SELECT id
FROM item_circulation_alert_preferences
WHERE (branchcode = ? OR branchcode = '*')
AND (categorycode = ? OR categorycode = '*')
AND (item_type = ? OR item_type = '*')
};
my $preferences = $dbh->selectall_arrayref(
$query,
{ },
$opts->{branchcode},
$opts->{categorycode},
$opts->{item_type},
);
# If any preferences showed up, we are NOT enabled.
if (@$preferences) {
return undef;
} else {
return 1;
}
}
=head3 C4::ItemCirculationAlertPreference->find({ branchcode => $bc })
This method returns all the item circulation alert preferences for a given
branch.
B<Example>:
my @branch_prefs = C4::ItemCirculationAlertPreference->find({
branchcode => 'CPL',
});
=cut
sub find {
my ($class, $where) = @_;
my $dbh = C4::Context->dbh;
my $query = qq{
SELECT id, branchcode, categorycode, item_type
FROM item_circulation_alert_preferences
WHERE branchcode = ?
ORDER BY categorycode, item_type
};
return map { $class->new($_) } @{$dbh->selectall_arrayref(
$query,
{ Slice => {} },
$where->{branchcode}
)};
}
=head2 Object Methods
These are read-only accessors for the various attributes of a preference.
=head3 $pref->id
=head3 $pref->branchcode
=head3 $pref->categorycode
=head3 $pref->item_type
=cut
sub AUTOLOAD {
my $self = shift;
my $attr = $AUTOLOAD;
$attr =~ s/.*://;
if (exists $self->{$attr}) {
return $self->{$attr};
} else {
return undef;
}
}
=head1 SEE ALSO
L<C4::Circulation>, C<admin/item_circulation_alerts.pl>
=head1 AUTHOR
John Beppu <john.beppu@liblime.com>
=cut
1;
# Local Variables: ***
# mode: cperl ***
# indent-tabs-mode: nil ***
# cperl-close-paren-offset: -4 ***
# cperl-continued-statement-offset: 4 ***
# cperl-indent-level: 4 ***
# cperl-indent-parens-as-block: t ***
# cperl-tab-always-indent: nil ***
# End: ***
# vim:tabstop=8 softtabstop=4 shiftwidth=4 shiftround expandtab

159
C4/ItemType.pm Normal file
View file

@ -0,0 +1,159 @@
package C4::ItemType;
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
# Suite 330, Boston, MA 02111-1307 USA
use strict;
use warnings;
use C4::Context;
our $AUTOLOAD;
=head1 NAME
C4::ItemType - objects from the itemtypes table
=head1 SYNOPSIS
use C4::ItemType;
my @itemtypes = C4::ItemType->all;
print join("\n", map { $_->description } @itemtypes), "\n";
=head1 DESCRIPTION
Objects of this class represent a row in the C<itemtypes> table.
Currently, the bare minimum for using this as a read-only data source has
been implemented. The API was designed to make it easy to transition to
an ORM later on.
=head1 API
=head2 Class Methods
=cut
=head3 C4::ItemType->new(\%opts)
Given a hashref, a new (in-memory) C4::ItemType object will be instantiated.
The database is not touched.
=cut
sub new {
my ($class, $opts) = @_;
bless $opts => $class;
}
=head3 C4::ItemType->all
This returns all the itemtypes as objects. By default they're ordered by
C<description>.
=cut
sub all {
my ($class) = @_;
my $dbh = C4::Context->dbh;
return map { $class->new($_) } @{$dbh->selectall_arrayref(
# The itemtypes table is small enough for
# `SELECT *` to be harmless.
"SELECT * FROM itemtypes ORDER BY description",
{ Slice => {} },
)};
}
=head2 Object Methods
These are read-only accessors for attributes of a C4::ItemType object.
=head3 $itemtype->itemtype
=head3 $itemtype->description
=head3 $itemtype->renewalsallowed
=head3 $itemtype->rentalcharge
=head3 $itemtype->notforloan
=head3 $itemtype->imageurl
=head3 $itemtype->summary
=cut
sub AUTOLOAD {
my $self = shift;
my $attr = $AUTOLOAD;
$attr =~ s/.*://;
if (exists $self->{$attr}) {
return $self->{$attr};
} else {
return undef;
}
}
# ack itemtypes | grep '\.pm' | awk '{ print $1 }' | sed 's/:.*$//' | sort | uniq | sed -e 's,/,::,g' -e 's/\.pm//' -e 's/^/L<C4::/' -e 's/$/>,/'
=head1 SEE ALSO
The following modules make reference to the C<itemtypes> table.
L<C4::Biblio>,
L<C4::Circulation>,
L<C4::Context>,
L<C4::Items>,
L<C4::Koha>,
L<C4::Labels>,
L<C4::Overdues>,
L<C4::Reserves>,
L<C4::Search>,
L<C4::VirtualShelves::Page>,
L<C4::VirtualShelves>,
L<C4::XSLT>
=head1 AUTHOR
John Beppu <john.beppu@liblime.com>
=cut
1;
# Local Variables: ***
# mode: cperl ***
# indent-tabs-mode: nil ***
# cperl-close-paren-offset: -4 ***
# cperl-continued-statement-offset: 4 ***
# cperl-indent-level: 4 ***
# cperl-indent-parens-as-block: t ***
# cperl-tab-always-indent: nil ***
# End: ***
# vim:tabstop=8 softtabstop=4 shiftwidth=4 shiftround expandtab