Bug 24850: Correct offset handling in dt_from_string
[koha-ffzg.git] / Koha / ArticleRequest.pm
1 package Koha::ArticleRequest;
2
3 # Copyright ByWater Solutions 2015
4 #
5 # This file is part of Koha.
6 #
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
19
20 use Modern::Perl;
21
22
23 use Koha::Database;
24 use Koha::Patrons;
25 use Koha::Biblios;
26 use Koha::Items;
27 use Koha::Libraries;
28 use Koha::DateUtils qw( dt_from_string );
29 use Koha::ArticleRequest::Status;
30 use Koha::Exceptions::ArticleRequest;
31
32 use base qw(Koha::Object);
33
34 =head1 NAME
35
36 Koha::ArticleRequest - Koha Article Request Object class
37
38 =head1 API
39
40 =head2 Class methods
41
42 =cut
43
44 =head3 request
45
46     $article_request->request;
47
48 Marks the article as requested. Send a notification if appropriate.
49
50 =cut
51
52 sub request {
53     my ($self) = @_;
54
55     Koha::Exceptions::ArticleRequest::LimitReached->throw(
56         error => 'Patron cannot request more articles for today'
57     ) unless $self->borrower->can_request_article;
58
59     $self->status(Koha::ArticleRequest::Status::Requested);
60     $self->store();
61     $self->notify();
62     return $self;
63 }
64
65 =head3 set_pending
66
67     $article_request->set_pending;
68
69 Marks the article as pending. Send a notification if appropriate.
70
71 =cut
72
73 sub set_pending {
74     my ($self) = @_;
75
76     $self->status(Koha::ArticleRequest::Status::Pending);
77     $self->store();
78     $self->notify();
79     return $self;
80 }
81
82 =head3 process
83
84     $article_request->process;
85
86 Marks the article as in process. Send a notification if appropriate.
87
88 =cut
89
90 sub process {
91     my ($self) = @_;
92
93     $self->status(Koha::ArticleRequest::Status::Processing);
94     $self->store();
95     $self->notify();
96     return $self;
97 }
98
99 =head3 complete
100
101     $article_request->complete;
102
103 Marks the article as completed. Send a notification if appropriate.
104
105 =cut
106
107 sub complete {
108     my ($self) = @_;
109
110     $self->status(Koha::ArticleRequest::Status::Completed);
111     $self->store();
112     $self->notify();
113     return $self;
114 }
115
116 =head3 cancel
117
118     $article_request->cancel;
119
120 Marks the article as cancelled. Send a notification if appropriate.
121
122 =cut
123
124 sub cancel {
125     my ( $self, $params ) = @_;
126
127     my $cancellation_reason = $params->{cancellation_reason};
128     my $notes = $params->{notes};
129
130     $self->status(Koha::ArticleRequest::Status::Canceled);
131     $self->cancellation_reason($cancellation_reason) if $cancellation_reason;
132     $self->notes($notes) if $notes;
133     $self->store();
134     $self->notify();
135     return $self;
136 }
137
138 =head3 biblio
139
140 Returns the Koha::Biblio object for this article request
141
142 =cut
143
144 sub biblio {
145     my ($self) = @_;
146
147     $self->{_biblio} ||= Koha::Biblios->find( $self->biblionumber() );
148
149     return $self->{_biblio};
150 }
151
152 =head3 item
153
154 Returns the Koha::Item object for this article request
155
156 =cut
157
158 sub item {
159     my ($self) = @_;
160
161     $self->{_item} ||= Koha::Items->find( $self->itemnumber() );
162
163     return $self->{_item};
164 }
165
166 =head3 borrower
167
168 Returns the Koha::Patron object for this article request
169
170 =cut
171
172 sub borrower {
173     my ($self) = @_;
174
175     $self->{_borrower} ||= Koha::Patrons->find( $self->borrowernumber() );
176
177     return $self->{_borrower};
178 }
179
180 =head3 branch
181
182 Returns the Koha::Library object for this article request
183
184 =cut
185
186 sub branch {
187     my ($self) = @_;
188
189     $self->{_branch} ||= Koha::Libraries->find( $self->branchcode() );
190
191     return $self->{_branch};
192 }
193
194 =head3 store
195
196 Override the default store behavior so that new opac requests
197 will have notifications sent.
198
199 =cut
200
201 sub store {
202     my ($self) = @_;
203
204     if ( !$self->in_storage ) {
205         $self->created_on( dt_from_string() );
206     }
207
208     return $self->SUPER::store;
209 }
210
211 =head2 Internal methods
212
213 =head3 notify
214
215     $self->notify();
216
217 internal method to be called when changing an article request status.
218 If a letter exists for the new status, it enqueues it.
219
220 =cut
221
222 sub notify {
223     my ($self) = @_;
224
225     my $status = $self->status;
226     my $reason = $self->notes;
227     if ( !defined $reason && $self->cancellation_reason ) {
228         my $av = Koha::AuthorisedValues->search(
229             {
230                 category            => 'AR_CANCELLATION',
231                 authorised_value    => $self->cancellation_reason
232             }
233         )->next;
234         $reason = $av->lib_opac ? $av->lib_opac : $av->lib if $av;
235     }
236
237     require C4::Letters;
238     if (
239         my $letter = C4::Letters::GetPreparedLetter(
240             module                 => 'circulation',
241             letter_code            => "AR_$status", # AR_REQUESTED, AR_PENDING, AR_PROCESSING, AR_COMPLETED, AR_CANCELED
242             message_transport_type => 'email',
243             lang                   => $self->borrower->lang,
244             tables                 => {
245                 article_requests => $self->id,
246                 borrowers        => $self->borrowernumber,
247                 biblio           => $self->biblionumber,
248                 biblioitems      => $self->biblionumber,
249                 items            => $self->itemnumber,
250                 branches         => $self->branchcode,
251             },
252             substitute => {
253                 reason => $reason,
254             },
255         )
256       )
257     {
258         C4::Letters::EnqueueLetter(
259             {
260                 letter                 => $letter,
261                 borrowernumber         => $self->borrowernumber,
262                 message_transport_type => 'email',
263             }
264         ) or warn "can't enqueue letter " . $letter->{code};
265     }
266 }
267
268 =head3 _type
269
270 =cut
271
272 sub _type {
273     return 'ArticleRequest';
274 }
275
276 =head1 AUTHOR
277
278 Kyle M Hall <kyle@bywatersolutions.com>
279
280 =cut
281
282 1;