Bug 32997: Add REST API endpoint to list authorised values for multiple given categories
[srvgit] / Koha / Item / Transfer.pm
index 4eb16b2..286e0fd 100644 (file)
@@ -17,9 +17,12 @@ package Koha::Item::Transfer;
 
 use Modern::Perl;
 
-use Carp;
+
+use C4::Items qw( CartToShelf ModDateLastSeen );
 
 use Koha::Database;
+use Koha::DateUtils qw( dt_from_string );
+use Koha::Exceptions::Item::Transfer;
 
 use base qw(Koha::Object);
 
@@ -33,6 +36,141 @@ Koha::Item::Transfer - Koha Item Transfer Object class
 
 =cut
 
+=head3 item
+
+  my $item = $transfer->item;
+
+Returns the associated item for this transfer.
+
+=cut
+
+sub item {
+    my ($self) = @_;
+    my $item_rs = $self->_result->itemnumber;
+    return Koha::Item->_new_from_dbic($item_rs);
+}
+
+=head3 from_library
+
+  my $from_library = $transfer->from_library;
+
+Returns the associated from_library for this transfer.
+
+=cut
+
+sub from_library {
+    my ($self) = @_;
+    my $from_library_rs = $self->_result->frombranch;
+    return Koha::Library->_new_from_dbic($from_library_rs);
+}
+
+=head3 to_library
+
+  my $to_library = $transfer->to_library;
+
+Returns the associated to_library for this transfer.
+
+=cut
+
+sub to_library {
+    my ($self) = @_;
+    my $to_library_rs = $self->_result->tobranch;
+    return Koha::Library->_new_from_dbic($to_library_rs);
+}
+
+=head3 transit
+
+Set the transfer as in transit by updating the datesent time.
+
+Also, update date last seen and ensure item holdingbranch is correctly set.
+
+=cut
+
+sub transit {
+    my ($self) = @_;
+
+    # Throw exception if item is still checked out
+    Koha::Exceptions::Item::Transfer::OnLoan->throw() if ( $self->item->checkout );
+
+    # Remove the 'shelving cart' location status if it is being used (Bug 3701)
+    CartToShelf( $self->item->itemnumber )
+      if $self->item->location
+      && $self->item->location eq 'CART'
+      && (!$self->item->permanent_location
+        || $self->item->permanent_location ne 'CART' );
+
+    # Update the transit state
+    $self->set(
+        {
+            frombranch => $self->item->holdingbranch,
+            datesent   => dt_from_string,
+        }
+    )->store;
+
+    ModDateLastSeen( $self->item->itemnumber );
+    return $self;
+
+}
+
+=head3 in_transit
+
+Boolean returning whether the transfer is in transit or waiting
+
+=cut
+
+sub in_transit {
+    my ($self) = @_;
+
+    return ( defined( $self->datesent )
+          && !defined( $self->datearrived )
+          && !defined( $self->datecancelled ) );
+}
+
+=head3 receive
+
+Receive the transfer by setting the datearrived time.
+
+=cut
+
+sub receive {
+    my ($self) = @_;
+
+    # Throw exception if item is checked out
+    Koha::Exceptions::Item::Transfer::OnLoan->throw() if ($self->item->checkout);
+
+    # Update the arrived date
+    $self->set({ datearrived => dt_from_string })->store;
+
+    ModDateLastSeen( $self->item->itemnumber );
+    return $self;
+}
+
+=head3 cancel
+
+  $transfer->cancel({ reason => $reason, [force => 1]});
+
+Cancel the transfer by setting the datecancelled time and recording the reason.
+
+=cut
+
+sub cancel {
+    my ( $self, $params ) = @_;
+
+    Koha::Exceptions::MissingParameter->throw(
+        error => "The 'reason' parameter is mandatory" )
+      unless defined($params->{reason});
+
+    # Throw exception if item is in transit already
+    Koha::Exceptions::Item::Transfer::InTransit->throw() if ( !$params->{force} && $self->in_transit );
+
+    # Update the cancelled date
+    $self->set(
+        { datecancelled => dt_from_string, cancellation_reason => $params->{reason} } )
+      ->store;
+
+    return $self;
+}
+
 =head3 type
 
 =cut