Commit bf1563e6 authored by Kyle M Hall's avatar Kyle M Hall

Bug 14610 - Add and update modules

Signed-off-by: default avatarJennifer Schmidt <jschmidt@switchinc.org>
Signed-off-by: default avatarKatrin Fischer  <katrin.fischer@bsz-bw.de>
Signed-off-by: default avatarKyle M Hall <kyle@bywatersolutions.com>
parent d2a4c327
......@@ -766,18 +766,19 @@ sub _parseletter_sth {
# broke things for the rest of us. prepare_cached is a better
# way to cache statement handles anyway.
my $query =
($table eq 'biblio' ) ? "SELECT * FROM $table WHERE biblionumber = ?" :
($table eq 'biblioitems' ) ? "SELECT * FROM $table WHERE biblionumber = ?" :
($table eq 'items' ) ? "SELECT * FROM $table WHERE itemnumber = ?" :
($table eq 'issues' ) ? "SELECT * FROM $table WHERE itemnumber = ?" :
($table eq 'old_issues' ) ? "SELECT * FROM $table WHERE itemnumber = ? ORDER BY timestamp DESC LIMIT 1" :
($table eq 'reserves' ) ? "SELECT * FROM $table WHERE borrowernumber = ? and biblionumber = ?" :
($table eq 'borrowers' ) ? "SELECT * FROM $table WHERE borrowernumber = ?" :
($table eq 'branches' ) ? "SELECT * FROM $table WHERE branchcode = ?" :
($table eq 'suggestions' ) ? "SELECT * FROM $table WHERE suggestionid = ?" :
($table eq 'aqbooksellers') ? "SELECT * FROM $table WHERE id = ?" :
($table eq 'aqorders' ) ? "SELECT * FROM $table WHERE ordernumber = ?" :
($table eq 'opac_news' ) ? "SELECT * FROM $table WHERE idnew = ?" :
($table eq 'biblio' ) ? "SELECT * FROM $table WHERE biblionumber = ?" :
($table eq 'biblioitems' ) ? "SELECT * FROM $table WHERE biblionumber = ?" :
($table eq 'items' ) ? "SELECT * FROM $table WHERE itemnumber = ?" :
($table eq 'issues' ) ? "SELECT * FROM $table WHERE itemnumber = ?" :
($table eq 'old_issues' ) ? "SELECT * FROM $table WHERE itemnumber = ? ORDER BY timestamp DESC LIMIT 1" :
($table eq 'reserves' ) ? "SELECT * FROM $table WHERE borrowernumber = ? and biblionumber = ?" :
($table eq 'borrowers' ) ? "SELECT * FROM $table WHERE borrowernumber = ?" :
($table eq 'branches' ) ? "SELECT * FROM $table WHERE branchcode = ?" :
($table eq 'suggestions' ) ? "SELECT * FROM $table WHERE suggestionid = ?" :
($table eq 'aqbooksellers') ? "SELECT * FROM $table WHERE id = ?" :
($table eq 'aqorders' ) ? "SELECT * FROM $table WHERE ordernumber = ?" :
($table eq 'opac_news' ) ? "SELECT * FROM $table WHERE idnew = ?" :
($table eq 'article_requests') ? "SELECT * FROM $table WHERE id = ?" :
($table eq 'borrower_modifications') ? "SELECT * FROM $table WHERE verification_token = ?" :
($table eq 'subscription') ? "SELECT * FROM $table WHERE subscriptionid = ?" :
($table eq 'serial') ? "SELECT * FROM $table WHERE serialid = ?" :
......
package Koha::ArticleRequest;
# Copyright ByWater Solutions 2015
#
# 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 3 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.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
use Modern::Perl;
use Carp;
use Koha::Database;
use Koha::Patrons;
use Koha::Biblios;
use Koha::Items;
use Koha::Libraries;
use Koha::ArticleRequest::Status;
use Koha::DateUtils qw(dt_from_string);
use base qw(Koha::Object);
=head1 NAME
Koha::ArticleRequest - Koha Article Request Object class
=head1 API
=head2 Class Methods
=cut
=head3 open
=cut
sub open {
my ($self) = @_;
$self->status(Koha::ArticleRequest::Status::Pending);
$self->notify();
return $self;
}
=head3 process
=cut
sub process {
my ($self) = @_;
$self->status(Koha::ArticleRequest::Status::Processing);
$self->store();
$self->notify();
return $self;
}
=head3 complete
=cut
sub complete {
my ($self) = @_;
$self->status(Koha::ArticleRequest::Status::Completed);
$self->store();
$self->notify();
return $self;
}
=head3 cancel
=cut
sub cancel {
my ( $self, $notes ) = @_;
$self->status(Koha::ArticleRequest::Status::Canceled);
$self->notes($notes) if $notes;
$self->store();
$self->notify();
return $self;
}
=head3 notify
=cut
sub notify {
my ($self) = @_;
my $status = $self->status;
if (
my $letter = C4::Letters::GetPreparedLetter(
module => 'circulation',
letter_code => "AR_$status",
message_transport_type => 'email',
tables => {
article_requests => $self->id,
borrowers => $self->borrowernumber,
biblio => $self->biblionumber,
biblioitems => $self->biblionumber,
items => $self->itemnumber,
branches => $self->branchcode,
},
)
)
{
C4::Letters::EnqueueLetter(
{
letter => $letter,
borrowernumber => $self->borrowernumber,
message_transport_type => 'email',
}
) or warn "can't enqueue letter $letter";
}
}
=head3 biblio
Returns the Koha::Biblio object for this article request
=cut
sub biblio {
my ($self) = @_;
$self->{_biblio} ||= Koha::Biblios->find( $self->biblionumber() );
return $self->{_biblio};
}
=head3 item
Returns the Koha::Item object for this article request
=cut
sub item {
my ($self) = @_;
$self->{_item} ||= Koha::Items->find( $self->itemnumber() );
return $self->{_item};
}
=head3 borrower
Returns the Koha::Patron object for this article request
=cut
sub borrower {
my ($self) = @_;
$self->{_borrower} ||= Koha::Patrons->find( $self->borrowernumber() );
return $self->{_borrower};
}
=head3 branch
Returns the Koha::Library object for this article request
=cut
sub branch {
my ($self) = @_;
$self->{_branch} ||= Koha::Libraries->find( $self->branchcode() );
return $self->{_branch};
}
=head3 store
Override the default store behavior so that new opan requests
will have notifications sent.
=cut
sub store {
my ($self) = @_;
if ( $self->in_storage() ) {
my $now = dt_from_string();
$self->updated_on($now);
return $self->SUPER::store();
}
else {
$self->open();
return $self->SUPER::store();
}
}
=head3 _type
=cut
sub _type {
return 'ArticleRequest';
}
=head1 AUTHOR
Kyle M Hall <kyle@bywatersolutions.com>
=cut
1;
package Koha::ArticleRequest::Status;
# Copyright ByWater Solutions 2015
#
# 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 3 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.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
use Modern::Perl;
sub Pending {
return 'PENDING';
}
sub Processing {
return 'PROCESSING';
}
sub Completed {
return 'COMPLETED';
}
sub Canceled {
return 'CANCELED';
}
=head1 AUTHOR
Kyle M Hall <kyle@bywatersolutions.com>
=cut
1;
package Koha::ArticleRequests;
# Copyright ByWater Solutions 2015
#
# 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 3 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.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
use Modern::Perl;
use Carp;
use Koha::Database;
use Koha::ArticleRequest;
use Koha::ArticleRequest::Status;
use base qw(Koha::Objects);
=head1 NAME
Koha::ArticleRequests - Koha ArticleRequests Object class
=head1 API
=head2 Class Methods
=cut
=head3 pending
=cut
sub pending {
my ( $self, $branchcode ) = @_;
my $params = { status => Koha::ArticleRequest::Status::Pending };
$params->{branchcode} = $branchcode if $branchcode;
return Koha::ArticleRequests->search( $params );
}
=head3 processing
=cut
sub processing {
my ( $self, $branchcode ) = @_;
my $params = { status => Koha::ArticleRequest::Status::Processing };
$params->{branchcode} = $branchcode if $branchcode;
return Koha::ArticleRequests->search( $params );
}
=head3 completed
=cut
sub completed {
my ( $self, $branchcode ) = @_;
my $params = { status => Koha::ArticleRequest::Status::Completed };
$params->{branchcode} = $branchcode if $branchcode;
return Koha::ArticleRequests->search( $params );
}
=head3 canceled
=cut
sub canceled {
my ( $self, $branchcode ) = @_;
my $params = { status => Koha::ArticleRequest::Status::Canceled };
$params->{branchcode} = $branchcode if $branchcode;
return Koha::ArticleRequests->search( $params );
}
=head3 _type
=cut
sub _type {
return 'ArticleRequest';
}
sub object_class {
return 'Koha::ArticleRequest';
}
=head1 AUTHOR
Kyle M Hall <kyle@bywatersolutions.com>
=cut
1;
......@@ -27,6 +27,12 @@ use Koha::Database;
use base qw(Koha::Object);
use C4::Circulation qw(GetIssuingRule);
use Koha::Items;
use Koha::Biblioitems;
use Koha::ArticleRequests;
use Koha::ArticleRequest::Status;
=head1 NAME
Koha::Biblio - Koha Biblio Object class
......@@ -53,8 +59,170 @@ sub subtitles {
return map { $_->{subfield} } @{ GetRecordValue( 'subtitle', GetMarcBiblio( $self->id ), $self->frameworkcode ) };
}
=head3 can_article_request
my $bool = $biblio->can_article_request( $borrower );
Returns true if article requests can be made for this record
$borrower must be a Koha::Patron object
=cut
sub can_article_request {
my ( $self, $borrower ) = @_;
my $rule = $self->article_request_type($borrower);
return q{} if $rule eq 'item_only' && !$self->items()->count();
return 1 if $rule && $rule ne 'no';
return q{};
}
=head3 article_request_type
my $type = $biblio->article_request_type( $borrower );
Returns the article request type based on items, or on the record
itself if there are no items.
$borrower must be a Koha::Patron object
=cut
sub article_request_type {
my ( $self, $borrower ) = @_;
return q{} unless $borrower;
my $rule = $self->article_request_type_for_items( $borrower );
return $rule if $rule;
# If the record has no items that are requestable, go by the record itemtype
$rule = $self->article_request_type_for_bib($borrower);
return $rule if $rule;
return q{};
}
=head3 article_request_type_for_bib
my $type = $biblio->article_request_type_for_bib
Returns the article request type 'yes', 'no', 'item_only', 'bib_only', for the given record
=cut
sub article_request_type_for_bib {
my ( $self, $borrower ) = @_;
return q{} unless $borrower;
my $borrowertype = $borrower->categorycode;
my $itemtype = $self->itemtype();
my $rules = C4::Circulation::GetIssuingRule( $borrowertype, $itemtype );
return $rules->{article_requests} || q{};
}
=head3 article_request_type_for_items
my $type = $biblio->article_request_type_for_items
Returns the article request type 'yes', 'no', 'item_only', 'bib_only', for the given record's items
If there is a conflict where some items are 'bib_only' and some are 'item_only', 'bib_only' will be returned.
=cut
sub article_request_type_for_items {
my ( $self, $borrower ) = @_;
my $counts;
foreach my $item ( $self->items()->as_list() ) {
my $rule = $item->article_request_type($borrower);
return $rule if $rule eq 'bib_only'; # we don't need to go any further
$counts->{$rule}++;
}
return 'item_only' if $counts->{item_only};
return 'yes' if $counts->{yes};
return 'no' if $counts->{no};
return q{};
}
=head3 article_requests
my @requests = $biblio->article_requests
Returns the article requests associated with this Biblio
=cut
sub article_requests {
my ( $self, $borrower ) = @_;
$self->{_article_requests} ||= Koha::ArticleRequests->search( { biblionumber => $self->biblionumber() } );
return wantarray ? $self->{_article_requests}->as_list : $self->{_article_requests};
}
=head3 article_requests_current
my @requests = $biblio->article_requests_current
Returns the article requests associated with this Biblio that are incomplete
=cut
sub article_requests_current {
my ( $self, $borrower ) = @_;
$self->{_article_requests_current} ||= Koha::ArticleRequests->search(
{
biblionumber => $self->biblionumber(),
-or => [
{ status => Koha::ArticleRequest::Status::Pending },
{ status => Koha::ArticleRequest::Status::Processing }
]
}
);
return wantarray ? $self->{_article_requests_current}->as_list : $self->{_article_requests_current};
}
=head3 article_requests_finished
my @requests = $biblio->article_requests_finished
Returns the article requests associated with this Biblio that are completed
=cut
sub article_requests_finished {
my ( $self, $borrower ) = @_;
$self->{_article_requests_finished} ||= Koha::ArticleRequests->search(
{
biblionumber => $self->biblionumber(),
-or => [
{ status => Koha::ArticleRequest::Status::Completed },
{ status => Koha::ArticleRequest::Status::Canceled }
]
}
);
return wantarray ? $self->{_article_requests_finished}->as_list : $self->{_article_requests_finished};
}
=head3 items
=head3 items
my @items = $biblio->items();
my $items = $biblio->items();
Returns the related Koha::Items object for this biblio in scalar context,
or list of Koha::Item objects in list context.
......@@ -68,6 +236,36 @@ sub items {
return wantarray ? $self->{_items}->as_list : $self->{_items};
}
=head3 itemtype
my $itemtype = $biblio->itemtype();
Returns the itemtype for this record.
=cut
sub itemtype {
my ( $self ) = @_;
return $self->_biblioitem()->itemtype();
}
=head3 _biblioitem
my $field = $self->_biblioitem()->itemtype
Returns the related Koha::Biblioitem object for this Biblio object
=cut
sub _biblioitem {
my ($self) = @_;
$self->{_biblioitem} ||= Koha::Biblioitems->find( { biblionumber => $self->biblionumber() } );
return $self->{_biblioitem};
}
=head3 type
=cut
......
package Koha::Biblios;
# Copyright ByWater Solutions 2014
# Copyright ByWater Solutions 2015
#
# This file is part of Koha.
#
......
......@@ -23,6 +23,8 @@ use Carp;
use Koha::Database;
use C4::Context;
use C4::Circulation qw(GetIssuingRule);
use Koha::Item::Transfer;
use Koha::Patrons;
use Koha::Libraries;
......@@ -123,6 +125,50 @@ sub last_returned_by {
}
}
=head3 can_article_request
my $bool = $item->can_article_request( $borrower )
Returns true if item can be specifically requested
$borrower must be a Koha::Patron object
=cut
sub can_article_request {
my ( $self, $borrower ) = @_;
my $rule = $self->article_request_type($borrower);
return 1 if $rule && $rule ne 'no' && $rule ne 'bib_only';
return q{};
}
=head3 article_request_type
my $type = $item->article_request_type( $borrower )
returns 'yes', 'no', 'bib_only', or 'item_only'
$borrower must be a Koha::Patron object
=cut
sub article_request_type {
my ( $self, $borrower ) = @_;
my $branch_control = C4::Context->preference('HomeOrHoldingBranch');
my $branchcode =
$branch_control eq 'homebranch' ? $self->homebranch
: $branch_control eq 'holdingbranch' ? $self->holdingbranch
: undef;
my $borrowertype = $borrower->categorycode;
my $itemtype = $self->effective_itemtype();
my $rules = GetIssuingRule( $borrowertype, $itemtype, $branchcode );
return $rules->{article_requests} || q{};
}
=head3 type
=cut
......
......@@ -359,6 +359,73 @@ sub move_to_deleted {
return Koha::Database->new->schema->resultset('Deletedborrower')->create($patron_infos);
}
=head3 article_requests
my @requests = $borrower->article_requests();
my $requests = $borrower->article_requests();
Returns either a list of ArticleRequests objects,
or an ArtitleRequests object, depending on the
calling context.
=cut
sub article_requests {
my ( $self ) = @_;
$self->{_article_requests} ||= Koha::ArticleRequests->search({ borrowernumber => $self->borrowernumber() });
return $self->{_article_requests};
}
=head3 article_requests_current
my @requests = $patron->article_requests_current
Returns the article requests associated with this patron that are incomplete
=cut
sub article_requests_current {
my ( $self ) = @_;
$self->{_article_requests_current} ||= Koha::ArticleRequests->search(
{
borrowernumber => $self->id(),
-or => [
{ status => Koha::ArticleRequest::Status::Pending },
{ status => Koha::ArticleRequest::Status::Processing }
]
}
);
return $self->{_article_requests_current};
}
=head3 article_requests_finished
my @requests = $biblio->article_requests_finished
Returns the article requests associated with this patron that are completed
=cut
sub article_requests_finished {
my ( $self, $borrower ) = @_;
$self->{_article_requests_finished} ||= Koha::ArticleRequests->search(
{