1 package Koha::Checkout;
3 # Copyright ByWater Solutions 2015
4 # Copyright 2016 Koha Development Team
6 # This file is part of Koha.
8 # Koha is free software; you can redistribute it and/or modify it
9 # under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 3 of the License, or
11 # (at your option) any later version.
13 # Koha is distributed in the hope that it will be useful, but
14 # WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with Koha; if not, see <http://www.gnu.org/licenses>.
24 use Try::Tiny qw( catch try );
26 use C4::Circulation qw( AddRenewal CanBookBeRenewed LostItem MarkIssueReturned );
27 use Koha::Checkouts::Renewals;
28 use Koha::Checkouts::ReturnClaims;
30 use Koha::DateUtils qw( dt_from_string );
34 use base qw(Koha::Object);
38 Koha::Checkout - Koha Checkout object class
48 my $is_overdue = $checkout->is_overdue( [ $reference_dt ] );
50 Return 1 if the checkout is overdue.
52 A reference date can be passed, in this case it will be used, otherwise today
53 will be the reference date.
58 my ( $self, $dt ) = @_;
59 $dt ||= dt_from_string();
62 DateTime->compare( dt_from_string( $self->date_due, 'sql' ), $dt ) == -1
70 my $item = $checkout->item;
72 Return the checked out item
78 my $item_rs = $self->_result->item;
79 return Koha::Item->_new_from_dbic( $item_rs );
84 my $account_lines = $checkout->account_lines;
86 Return the checked out account_lines
92 my $account_lines_rs = $self->_result->account_lines;
93 return Koha::Account::Lines->_new_from_dbic( $account_lines_rs );
98 my $library = $checkout->library;
100 Return the library in which the transaction took place
106 my $library_rs = $self->_result->library;
107 return Koha::Library->_new_from_dbic( $library_rs );
112 my $patron = $checkout->patron
114 Return the patron for who the checkout has been done
120 my $patron_rs = $self->_result->patron;
121 return Koha::Patron->_new_from_dbic( $patron_rs );
126 my $issuer = $checkout->issuer
128 Return the patron by whom the checkout was done
134 my $issuer_rs = $self->_result->issuer;
135 return unless $issuer_rs;
136 return Koha::Patron->_new_from_dbic( $issuer_rs );
141 my $renewals = $checkout->renewals;
143 Return a Koha::Checkouts::Renewals set attached to this checkout
149 my $renewals_rs = $self->_result->renewals;
150 return unless $renewals_rs;
151 return Koha::Checkouts::Renewals->_new_from_dbic( $renewals_rs );
154 =head3 attempt_auto_renew
156 my ($success, $error, $updated) = $checkout->auto_renew({ confirm => 1 });
158 Attempt to automatically renew a book. Return error reason if it cannot be renewed.
159 Also return whether a change has been made to avoid notifying on more than one attempt.
161 If not passed confirm, we will only report and no changes will be made.
165 sub attempt_auto_renew {
166 my ( $self, $params ) = @_;
167 my $confirm = $params->{confirm} // 0;
169 # CanBookBeRenewed returns 'auto_renew' when the renewal should be done by this script
170 my ( $ok, $error ) = C4::Circulation::CanBookBeRenewed( $self->patron, $self, undef, 1 );
171 if ( $error eq 'auto_renew' ) {
173 my $date_due = C4::Circulation::AddRenewal(
175 borrowernumber => $self->borrowernumber,
176 itemnumber => $self->itemnumber,
177 branch => $self->branchcode,
182 $self->auto_renew_error(undef)->store;
184 return ( 1, undef, 1 );
187 if ( !$self->auto_renew_error || $error ne $self->auto_renew_error ) {
188 $self->auto_renew_error($error)->store if $confirm;
191 return ( 0, $error, $updated );
196 =head3 to_api_mapping
198 This method returns the mapping for representing a Koha::Checkout object
205 issue_id => 'checkout_id',
206 borrowernumber => 'patron_id',
207 itemnumber => 'item_id',
208 date_due => 'due_date',
209 branchcode => 'library_id',
210 returndate => 'checkin_date',
211 lastreneweddate => 'last_renewed_date',
212 issuedate => 'checkout_date',
213 notedate => 'note_date',
214 noteseen => 'note_seen',
218 =head3 claim_returned
220 my $return_claim = $checkout->claim_returned();
222 This method sets the checkout as claimed return. It will:
224 1. Add a new row to the `return_claims` table
225 2. Set the item as lost using the 'ClaimReturnedLostValue'
226 3. Charge a fee depending on the value of ClaimReturnedChargeFee
227 3a. If set to charge, then accruing overdues will be halted
228 3b. If set to charge, then any existing transfers will be cancelled
229 and the holding branch will be set back to 'frombranch'.
230 4. The issue will be marked as returned as per the 'MarkLostItemsAsReturned' preference
235 my ( $self, $params ) = @_;
237 my $charge_lost_fee = $params->{charge_lost_fee};
240 $self->_result->result_source->schema->txn_do(
242 my $claim = Koha::Checkouts::ReturnClaim->new(
244 issue_id => $self->id,
245 itemnumber => $self->itemnumber,
246 borrowernumber => $self->borrowernumber,
247 notes => $params->{notes},
248 created_by => $params->{created_by},
249 created_on => dt_from_string,
253 my $ClaimReturnedLostValue = C4::Context->preference('ClaimReturnedLostValue');
254 $self->item->itemlost($ClaimReturnedLostValue)->store;
256 my $ClaimReturnedChargeFee = C4::Context->preference('ClaimReturnedChargeFee');
258 $ClaimReturnedChargeFee eq 'charge' ? 1
259 : $ClaimReturnedChargeFee eq 'no_charge' ? 0
260 : $charge_lost_fee; # $ClaimReturnedChargeFee eq 'ask'
262 if ( $charge_lost_fee ) {
263 C4::Circulation::LostItem( $self->itemnumber, 'claim_returned' );
265 elsif ( C4::Context->preference( 'MarkLostItemsAsReturned' ) =~ m/claim_returned/ ) {
266 C4::Circulation::MarkIssueReturned( $self->borrowernumber, $self->itemnumber, undef, $self->patron->privacy );
274 if ( $_->isa('Koha::Exception') ) {
279 Koha::Exception->throw( "Unhandled exception" );
284 =head2 Internal methods
296 Kyle M Hall <kyle@bywatersolutions.com>
298 Jonathan Druart <jonathan.druart@bugs.koha-community.org>