4f105579019c08394ce61cdaab8335aec8bb9203
[srvgit] / Koha / Acquisition / Basket.pm
1 package Koha::Acquisition::Basket;
2
3 # Copyright 2017 Aleisha Amohia <aleisha@catalyst.net.nz>
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 use Koha::Database;
23 use Koha::DateUtils qw( dt_from_string );
24 use Koha::Acquisition::BasketGroups;
25 use Koha::Acquisition::Orders;
26 use Koha::Exceptions::Acquisition::Basket;
27 use Koha::Patrons;
28 use C4::Log qw(logaction);
29
30 use base qw( Koha::Object Koha::Object::Mixin::AdditionalFields );
31
32 =head1 NAME
33
34 Koha::Acquisition::Basket - Koha Basket Object class
35
36 =head1 API
37
38 =head2 Class methods
39
40 =cut
41
42 =head3 bookseller
43
44 Returns the vendor
45
46 =cut
47
48 sub bookseller {
49     my ($self) = @_;
50     my $bookseller_rs = $self->_result->booksellerid;
51     return Koha::Acquisition::Bookseller->_new_from_dbic( $bookseller_rs );
52 }
53
54 =head3 creator
55
56     my $creator = $basket->creator;
57
58 Returns the I<Koha::Patron> for the basket creator.
59
60 =cut
61
62 sub creator {
63     my ($self) = @_;
64     my $borrowernumber = $self->authorisedby; # FIXME missing FK here
65     return unless $borrowernumber;
66     return Koha::Patrons->find( $borrowernumber );
67 }
68
69 =head3 basket_group
70
71 Returns the basket group associated to this basket
72
73 =cut
74
75 sub basket_group {
76     my ($self) = @_;
77
78     my $basket_group_rs = $self->_result->basket_group;
79     return unless $basket_group_rs;
80     return Koha::Acquisition::BasketGroup->_new_from_dbic( $basket_group_rs );
81 }
82
83 =head3 orders
84
85     my $orders = $basket->orders;
86
87 Returns a Koha::Acquisition::Orders resultset, with the orders linked
88 to this basket.
89
90 =cut
91
92 sub orders {
93     my ($self) = @_;
94
95     my $orders_rs = $self->_result->orders;
96     return Koha::Acquisition::Orders->_new_from_dbic( $orders_rs );
97 }
98
99 =head3 effective_create_items
100
101 Returns C<create_items> for this basket, falling back to C<AcqCreateItem> if unset.
102
103 =cut
104
105 sub effective_create_items {
106     my ( $self ) = @_;
107
108     return $self->create_items || C4::Context->preference('AcqCreateItem');
109 }
110
111 =head3 estimated_delivery_date
112
113 my $estimated_delivery_date = $basket->estimated_delivery_date;
114
115 Return the estimated delivery date for this basket.
116
117 It is calculated adding the delivery time of the vendor to the close date of this basket.
118
119 Return implicit undef if the basket is not closed, or the vendor does not have a delivery time.
120
121 =cut
122
123 sub estimated_delivery_date {
124     my ( $self ) = @_;
125     return unless $self->closedate and $self->bookseller->deliverytime;
126     return dt_from_string($self->closedate)->add( days => $self->bookseller->deliverytime);
127 }
128
129 =head3 late_since_days
130
131 my $number_of_days_late = $basket->late_since_days;
132
133 Return the number of days the basket is late.
134
135 Return implicit undef if the basket is not closed.
136
137 =cut
138
139 sub late_since_days {
140     my ( $self ) = @_;
141     return unless $self->closedate;
142     return dt_from_string->delta_days(dt_from_string($self->closedate))->delta_days();
143 }
144
145 =head3 authorizer
146
147 my $authorizer = $basket->authorizer;
148
149 Returns the patron who authorized/created this basket.
150
151 =cut
152
153 sub authorizer {
154     my ($self) = @_;
155     # FIXME We should use a DBIC rs, but the FK is missing
156     return unless $self->authorisedby;
157     return scalar Koha::Patrons->find($self->authorisedby);
158 }
159
160 =head3 is_closed
161
162     if ( $basket->is_closed ) { ... }
163
164 Returns a boolean value representing if the basket is closed.
165
166 =cut
167
168 sub is_closed {
169     my ($self) = @_;
170
171     return ($self->closedate) ? 1 : 0;
172 }
173
174 =head3 close
175
176     $basket->close;
177
178 Close the basket and mark all open orders as ordered.
179
180 A I<Koha::Exceptions::Acquisition::Basket::AlreadyClosed> exception is thrown
181 if the basket is already closed.
182
183 =cut
184
185 sub close {
186     my ($self) = @_;
187
188     Koha::Exceptions::Acquisition::Basket::AlreadyClosed->throw
189         if $self->is_closed;
190
191     $self->_result->result_source->schema->txn_do(
192         sub {
193             my $open_orders = $self->orders->search(
194                 {
195                     orderstatus => { not_in => [ 'complete', 'cancelled' ] }
196                 }
197             );
198             # Mark open orders as ordered
199             $open_orders->update({ orderstatus => 'ordered' }, { no_triggers => 1 });
200             # set as closed
201             $self->set({ closedate => \'NOW()' })->store;
202         }
203     );
204
205     # Log the closure
206     if (C4::Context->preference("AcquisitionLog")) {
207         logaction(
208             'ACQUISITIONS',
209             'CLOSE_BASKET',
210             $self->id
211         );
212     }
213
214     return $self;
215 }
216
217 =head3 to_api
218
219     my $json = $basket->to_api;
220
221 Overloaded method that returns a JSON representation of the Koha::Acquisition::Basket object,
222 suitable for API output.
223
224 =cut
225
226 sub to_api {
227     my ( $self, $params ) = @_;
228
229     my $json = $self->SUPER::to_api( $params );
230
231     $json->{closed} = ( $self->closedate )
232                                     ? Mojo::JSON->true
233                                     : Mojo::JSON->false;
234
235     return $json;
236 }
237
238 =head3 to_api_mapping
239
240 This method returns the mapping for representing a Koha::Acquisition::Basket object
241 on the API.
242
243 =cut
244
245 sub to_api_mapping {
246     return {
247         basketno                => 'basket_id',
248         basketname              => 'name',
249         booksellernote          => 'vendor_note',
250         contractnumber          => 'contract_id',
251         creationdate            => 'creation_date',
252         closedate               => 'close_date',
253         booksellerid            => 'vendor_id',
254         authorisedby            => 'creator_id',
255         booksellerinvoicenumber => undef,
256         basketgroupid           => 'basket_group_id',
257         deliveryplace           => 'delivery_library_id',
258         billingplace            => 'billing_library_id',
259         branch                  => 'library_id',
260         is_standing             => 'standing'
261     };
262 }
263
264 =head2 Internal methods
265
266 =head3 _type
267
268 =cut
269
270 sub _type {
271     return 'Aqbasket';
272 }
273
274 =head1 AUTHOR
275
276 Aleisha Amohia <aleisha@catalyst.net.nz>
277 Catalyst IT
278
279 =cut
280
281 1;