1 package Koha::Acquisition::Basket;
3 # Copyright 2017 Aleisha Amohia <aleisha@catalyst.net.nz>
5 # This file is part of Koha.
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.
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.
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>.
23 use Koha::DateUtils qw( dt_from_string );
24 use Koha::Acquisition::BasketGroups;
25 use Koha::Acquisition::Orders;
26 use Koha::Exceptions::Acquisition::Basket;
28 use C4::Log qw( logaction );
30 use base qw( Koha::Object Koha::Object::Mixin::AdditionalFields );
34 Koha::Acquisition::Basket - Koha Basket Object class
50 my $bookseller_rs = $self->_result->booksellerid;
51 return Koha::Acquisition::Bookseller->_new_from_dbic( $bookseller_rs );
56 my $creator = $basket->creator;
58 Returns the I<Koha::Patron> for the basket creator.
64 my $borrowernumber = $self->authorisedby; # FIXME missing FK here
65 return unless $borrowernumber;
66 return Koha::Patrons->find( $borrowernumber );
71 Returns the basket group associated to this basket
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 );
85 my $orders = $basket->orders;
87 Returns a Koha::Acquisition::Orders resultset, with the orders linked
95 my $orders_rs = $self->_result->orders;
96 return Koha::Acquisition::Orders->_new_from_dbic( $orders_rs );
101 my $edi_order = $basket->edi_order;
103 Returns the most recently attached EDI order object if one exists for the basket.
105 NOTE: This currently returns a bare DBIx::Class result or undefined. This is consistent with the rest of EDI;
106 However it would be beneficial to convert these to full fledge Koha::Objects in the future.
113 my $order_rs = $self->_result->edifact_messages(
115 message_type => 'ORDERS',
118 { order_by => { '-desc' => 'transfer_date' }, rows => 1 }
120 return $order_rs->single;
123 =head3 effective_create_items
125 Returns C<create_items> for this basket, falling back to C<AcqCreateItem> if unset.
129 sub effective_create_items {
132 return $self->create_items || C4::Context->preference('AcqCreateItem');
135 =head3 estimated_delivery_date
137 my $estimated_delivery_date = $basket->estimated_delivery_date;
139 Return the estimated delivery date for this basket.
141 It is calculated adding the delivery time of the vendor to the close date of this basket.
143 Return implicit undef if the basket is not closed, or the vendor does not have a delivery time.
147 sub estimated_delivery_date {
149 return unless $self->closedate and $self->bookseller->deliverytime;
150 return dt_from_string($self->closedate)->add( days => $self->bookseller->deliverytime);
153 =head3 late_since_days
155 my $number_of_days_late = $basket->late_since_days;
157 Return the number of days the basket is late.
159 Return implicit undef if the basket is not closed.
163 sub late_since_days {
165 return unless $self->closedate;
166 return dt_from_string->delta_days(dt_from_string($self->closedate))->delta_days();
171 my $authorizer = $basket->authorizer;
173 Returns the patron who authorized/created this basket.
179 # FIXME We should use a DBIC rs, but the FK is missing
180 return unless $self->authorisedby;
181 return scalar Koha::Patrons->find($self->authorisedby);
186 if ( $basket->is_closed ) { ... }
188 Returns a boolean value representing if the basket is closed.
195 return ($self->closedate) ? 1 : 0;
202 Close the basket and mark all open orders as ordered.
204 A I<Koha::Exceptions::Acquisition::Basket::AlreadyClosed> exception is thrown
205 if the basket is already closed.
212 Koha::Exceptions::Acquisition::Basket::AlreadyClosed->throw
215 $self->_result->result_source->schema->txn_do(
217 my $open_orders = $self->orders->search(
219 orderstatus => { not_in => [ 'complete', 'cancelled' ] }
222 # Mark open orders as ordered
223 $open_orders->update({ orderstatus => 'ordered' }, { no_triggers => 1 });
225 $self->set({ closedate => \'NOW()' })->store;
230 if (C4::Context->preference("AcquisitionLog")) {
243 my $json = $basket->to_api;
245 Overloaded method that returns a JSON representation of the Koha::Acquisition::Basket object,
246 suitable for API output.
251 my ( $self, $params ) = @_;
253 my $json = $self->SUPER::to_api( $params );
255 $json->{closed} = ( $self->closedate )
262 =head3 to_api_mapping
264 This method returns the mapping for representing a Koha::Acquisition::Basket object
271 basketno => 'basket_id',
272 basketname => 'name',
273 booksellernote => 'vendor_note',
274 contractnumber => 'contract_id',
275 creationdate => 'creation_date',
276 closedate => 'close_date',
277 booksellerid => 'vendor_id',
278 authorisedby => 'creator_id',
279 booksellerinvoicenumber => undef,
280 basketgroupid => 'basket_group_id',
281 deliveryplace => 'delivery_library_id',
282 billingplace => 'billing_library_id',
283 branch => 'library_id',
284 is_standing => 'standing'
288 =head2 Internal methods
300 Aleisha Amohia <aleisha@catalyst.net.nz>