From f6a552417961a8616044f7b63c93ae22aa449a04 Mon Sep 17 00:00:00 2001 From: John Beppu Date: Tue, 3 Feb 2009 16:02:03 -0600 Subject: [PATCH] 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 Signed-off-by: Galen Charlton Signed-off-by: Henri-Damien LAURENT --- C4/Category.pm | 155 +++++++++++++ C4/ItemCirculationAlertPreference.pm | 317 +++++++++++++++++++++++++++ C4/ItemType.pm | 159 ++++++++++++++ 3 files changed, 631 insertions(+) create mode 100644 C4/Category.pm create mode 100644 C4/ItemCirculationAlertPreference.pm create mode 100644 C4/ItemType.pm diff --git a/C4/Category.pm b/C4/Category.pm new file mode 100644 index 0000000000..760b396db8 --- /dev/null +++ b/C4/Category.pm @@ -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 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. + +=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 table. + +L, L, L + + +=head1 AUTHOR + +John Beppu + +=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 diff --git a/C4/ItemCirculationAlertPreference.pm b/C4/ItemCirculationAlertPreference.pm new file mode 100644 index 0000000000..df231a4c26 --- /dev/null +++ b/C4/ItemCirculationAlertPreference.pm @@ -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, B and B. + +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 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, B, and B. + +=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 or passing in a B, B, B +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 +table, can an alert be sent for the given B, B, and +B? + +B: + + 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: + + 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, C + +=head1 AUTHOR + +John Beppu + +=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 diff --git a/C4/ItemType.pm b/C4/ItemType.pm new file mode 100644 index 0000000000..5c9b663c9a --- /dev/null +++ b/C4/ItemType.pm @@ -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 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. + +=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,/' + +=head1 SEE ALSO + +The following modules make reference to the C table. + +L, +L, +L, +L, +L, +L, +L, +L, +L, +L, +L, +L + + + +=head1 AUTHOR + +John Beppu + +=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 -- 2.39.5