Bug 30275: Add renewals relation to Koha::Checkout
[koha.git] / Koha / Checkout.pm
1 package Koha::Checkout;
2
3 # Copyright ByWater Solutions 2015
4 # Copyright 2016 Koha Development Team
5 #
6 # This file is part of Koha.
7 #
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.
12 #
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.
17 #
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>.
20
21 use Modern::Perl;
22
23 use DateTime;
24 use Try::Tiny qw( catch try );
25
26 use C4::Circulation qw( LostItem MarkIssueReturned );
27 use Koha::Checkouts::Renewals;
28 use Koha::Checkouts::ReturnClaims;
29 use Koha::Database;
30 use Koha::DateUtils qw( dt_from_string );
31 use Koha::Items;
32 use Koha::Libraries;
33
34 use base qw(Koha::Object);
35
36 =head1 NAME
37
38 Koha::Checkout - Koha Checkout object class
39
40 =head1 API
41
42 =head2 Class methods
43
44 =cut
45
46 =head3 is_overdue
47
48 my  $is_overdue = $checkout->is_overdue( [ $reference_dt ] );
49
50 Return 1 if the checkout is overdue.
51
52 A reference date can be passed, in this case it will be used, otherwise today
53 will be the reference date.
54
55 =cut
56
57 sub is_overdue {
58     my ( $self, $dt ) = @_;
59     $dt ||= dt_from_string();
60
61     my $is_overdue =
62       DateTime->compare( dt_from_string( $self->date_due, 'sql' ), $dt ) == -1
63       ? 1
64       : 0;
65     return $is_overdue;
66 }
67
68 =head3 item
69
70 my $item = $checkout->item;
71
72 Return the checked out item
73
74 =cut
75
76 sub item {
77     my ( $self ) = @_;
78     my $item_rs = $self->_result->item;
79     return Koha::Item->_new_from_dbic( $item_rs );
80 }
81
82 =head3 library
83
84 my $library = $checkout->library;
85
86 Return the library in which the transaction took place
87
88 =cut
89
90 sub library {
91     my ( $self ) = @_;
92     my $library_rs = $self->_result->library;
93     return Koha::Library->_new_from_dbic( $library_rs );
94 }
95
96 =head3 patron
97
98 my $patron = $checkout->patron
99
100 Return the patron for who the checkout has been done
101
102 =cut
103
104 sub patron {
105     my ( $self ) = @_;
106     my $patron_rs = $self->_result->patron;
107     return Koha::Patron->_new_from_dbic( $patron_rs );
108 }
109
110 =head3 issuer
111
112 my $issuer = $checkout->issuer
113
114 Return the patron by whom the checkout was done
115
116 =cut
117
118 sub issuer {
119     my ( $self ) = @_;
120     my $issuer_rs = $self->_result->issuer;
121     return unless $issuer_rs;
122     return Koha::Patron->_new_from_dbic( $issuer_rs );
123 }
124
125 =head3 renewals
126
127   my $renewals = $checkout->renewals;
128
129 Return a Koha::Checkouts::Renewals set attached to this checkout
130
131 =cut
132
133 sub renewals {
134     my ( $self ) = @_;
135     my $renewals_rs = $self->_result->renewals;
136     return unless $renewals_rs;
137     return Koha::Checkouts::Renewals->_new_from_dbic( $renewals_rs );
138 }
139
140 =head3 to_api_mapping
141
142 This method returns the mapping for representing a Koha::Checkout object
143 on the API.
144
145 =cut
146
147 sub to_api_mapping {
148     return {
149         issue_id        => 'checkout_id',
150         borrowernumber  => 'patron_id',
151         itemnumber      => 'item_id',
152         date_due        => 'due_date',
153         branchcode      => 'library_id',
154         returndate      => 'checkin_date',
155         lastreneweddate => 'last_renewed_date',
156         issuedate       => 'checkout_date',
157         notedate        => 'note_date',
158         noteseen        => 'note_seen',
159     };
160 }
161
162 =head3 claim_returned
163
164   my $return_claim = $checkout->claim_returned();
165
166 This method sets the checkout as claimed return.  It will:
167
168 1.  Add a new row to the `return_claims` table
169 2.  Set the item as lost using the 'ClaimReturnedLostValue'
170 3.  Charge a fee depending on the value of ClaimReturnedChargeFee
171 3a. If set to charge, then accruing overdues will be halted
172 3b. If set to charge, then any existing transfers will be cancelled
173     and the holding branch will be set back to 'frombranch'.
174 4.  The issue will be marked as returned as per the 'MarkLostItemsAsReturned' preference
175
176 =cut
177
178 sub claim_returned {
179     my ( $self, $params ) = @_;
180
181     my $charge_lost_fee = $params->{charge_lost_fee};
182
183     try {
184         $self->_result->result_source->schema->txn_do(
185             sub {
186                 my $claim = Koha::Checkouts::ReturnClaim->new(
187                     {
188                         issue_id       => $self->id,
189                         itemnumber     => $self->itemnumber,
190                         borrowernumber => $self->borrowernumber,
191                         notes          => $params->{notes},
192                         created_by     => $params->{created_by},
193                         created_on     => dt_from_string,
194                     }
195                 )->store();
196
197                 my $ClaimReturnedLostValue = C4::Context->preference('ClaimReturnedLostValue');
198                 $self->item->itemlost($ClaimReturnedLostValue)->store;
199
200                 my $ClaimReturnedChargeFee = C4::Context->preference('ClaimReturnedChargeFee');
201                 $charge_lost_fee =
202                     $ClaimReturnedChargeFee eq 'charge'    ? 1
203                 : $ClaimReturnedChargeFee eq 'no_charge' ? 0
204                 :   $charge_lost_fee;    # $ClaimReturnedChargeFee eq 'ask'
205
206                 if ( $charge_lost_fee ) {
207                     C4::Circulation::LostItem( $self->itemnumber, 'claim_returned' );
208                 }
209                 elsif ( C4::Context->preference( 'MarkLostItemsAsReturned' ) =~ m/claim_returned/ ) {
210                     C4::Circulation::MarkIssueReturned( $self->borrowernumber, $self->itemnumber, undef, $self->patron->privacy );
211                 }
212
213                 return $claim;
214             }
215         );
216     }
217     catch {
218         if ( $_->isa('Koha::Exception') ) {
219             $_->rethrow();
220         }
221         else {
222             # ?
223             Koha::Exception->throw( "Unhandled exception" );
224         }
225     };
226 }
227
228 =head2 Internal methods
229
230 =head3 _type
231
232 =cut
233
234 sub _type {
235     return 'Issue';
236 }
237
238 =head1 AUTHOR
239
240 Kyle M Hall <kyle@bywatersolutions.com>
241
242 Jonathan Druart <jonathan.druart@bugs.koha-community.org>
243
244 =cut
245
246 1;