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:
parent
233010f451
commit
5991cdd33a
3 changed files with 631 additions and 0 deletions
155
C4/Category.pm
Normal file
155
C4/Category.pm
Normal 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
|
317
C4/ItemCirculationAlertPreference.pm
Normal file
317
C4/ItemCirculationAlertPreference.pm
Normal 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
159
C4/ItemType.pm
Normal 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
|
Loading…
Reference in a new issue