Bug 24545: Fix license statements
[srvgit] / Koha / REST / V1 / Checkouts.pm
index 6c1c5e3..3a5f448 100644 (file)
@@ -2,25 +2,29 @@ package Koha::REST::V1::Checkouts;
 
 # This file is part of Koha.
 #
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
 #
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License along
-# with Koha; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
+
+use Modern::Perl;
 
 use Mojo::Base 'Mojolicious::Controller';
+use Mojo::JSON;
 
 use C4::Auth qw( haspermission );
 use C4::Context;
 use C4::Circulation;
 use Koha::Checkouts;
+use Koha::Old::Checkouts;
 
 use Try::Tiny;
 
@@ -40,10 +44,61 @@ List Koha::Checkout objects
 
 sub list {
     my $c = shift->openapi->valid_input or return;
+
+    my $checked_in = $c->validation->param('checked_in');
+
     try {
-        my $checkouts_set = Koha::Checkouts->new;
-        my $checkouts = $c->objects->search( $checkouts_set, \&_to_model, \&_to_api );
-        return $c->render( status => 200, openapi => $checkouts );
+        my $checkouts_set;
+
+        if ( $checked_in ) {
+            $checkouts_set = Koha::Old::Checkouts->new;
+        } else {
+            $checkouts_set = Koha::Checkouts->new;
+        }
+
+        my $args = $c->validation->output;
+        my $attributes = {};
+
+        # Extract reserved params
+        my ( $filtered_params, $reserved_params ) = $c->extract_reserved_params($args);
+
+        # Merge sorting into query attributes
+        $c->dbic_merge_sorting(
+            {
+                attributes => $attributes,
+                params     => $reserved_params,
+                result_set => $checkouts_set
+            }
+        );
+
+        # Merge pagination into query attributes
+        $c->dbic_merge_pagination(
+            {
+                filter => $attributes,
+                params => $reserved_params
+            }
+        );
+
+        # Call the to_model function by reference, if defined
+        if ( defined $filtered_params ) {
+            # remove checked_in
+            delete $filtered_params->{checked_in};
+            # Apply the mapping function to the passed params
+            $filtered_params = $checkouts_set->attributes_from_api($filtered_params);
+            $filtered_params = $c->build_query_params( $filtered_params, $reserved_params );
+        }
+
+        # Perform search
+        my $checkouts = $checkouts_set->search( $filtered_params, $attributes );
+
+        if ($checkouts->is_paged) {
+            $c->add_pagination_headers({
+                total => $checkouts->pager->total_entries,
+                params => $args,
+            });
+        }
+
+        return $c->render( status => 200, openapi => $checkouts->to_api );
     } catch {
         if ( $_->isa('DBIx::Class::Exception') ) {
             return $c->render(
@@ -68,7 +123,10 @@ get one checkout
 sub get {
     my $c = shift->openapi->valid_input or return;
 
-    my $checkout = Koha::Checkouts->find( $c->validation->param('checkout_id') );
+    my $checkout_id = $c->validation->param('checkout_id');
+    my $checkout = Koha::Checkouts->find( $checkout_id );
+    $checkout = Koha::Old::Checkouts->find( $checkout_id )
+        unless ($checkout);
 
     unless ($checkout) {
         return $c->render(
@@ -78,8 +136,8 @@ sub get {
     }
 
     return $c->render(
-        status => 200,
-        openapi => _to_api($checkout->TO_JSON)
+        status  => 200,
+        openapi => $checkout->to_api
     );
 }
 
@@ -120,90 +178,53 @@ sub renew {
 
     $c->res->headers->location( $c->req->url->to_string );
     return $c->render(
-        status => 201,
-        openapi => _to_api( $checkout->TO_JSON )
+        status  => 201,
+        openapi => $checkout->to_api
     );
 }
 
-=head3 _to_api
+=head3 allows_renewal
 
-Helper function that maps a hashref of Koha::Checkout attributes into REST api
-attribute names.
+Checks if the checkout could be renewed and return the related information.
 
 =cut
 
-sub _to_api {
-    my $checkout = shift;
-
-    foreach my $column ( keys %{ $Koha::REST::V1::Checkouts::to_api_mapping } ) {
-        my $mapped_column = $Koha::REST::V1::Checkouts::to_api_mapping->{$column};
-        if ( exists $checkout->{ $column } && defined $mapped_column )
-        {
-            $checkout->{ $mapped_column } = delete $checkout->{ $column };
-        }
-        elsif ( exists $checkout->{ $column } && !defined $mapped_column ) {
-            delete $checkout->{ $column };
-        }
-    }
-    return $checkout;
-}
+sub allows_renewal {
+    my $c = shift->openapi->valid_input or return;
 
-=head3 _to_model
+    my $checkout_id = $c->validation->param('checkout_id');
+    my $checkout = Koha::Checkouts->find( $checkout_id );
 
-Helper function that maps REST api objects into Koha::Checkouts
-attribute names.
+    unless ($checkout) {
+        return $c->render(
+            status => 404,
+            openapi => { error => "Checkout doesn't exist" }
+        );
+    }
 
-=cut
+    my ($can_renew, $error) = C4::Circulation::CanBookBeRenewed(
+        $checkout->borrowernumber, $checkout->itemnumber);
 
-sub _to_model {
-    my $checkout = shift;
+    my $renewable = Mojo::JSON->false;
+    $renewable = Mojo::JSON->true if $can_renew;
 
-    foreach my $attribute ( keys %{ $Koha::REST::V1::Checkouts::to_model_mapping } ) {
-        my $mapped_attribute = $Koha::REST::V1::Checkouts::to_model_mapping->{$attribute};
-        if ( exists $checkout->{ $attribute } && defined $mapped_attribute )
+    my $rule = Koha::CirculationRules->get_effective_rule(
         {
-            $checkout->{ $mapped_attribute } = delete $checkout->{ $attribute };
+            categorycode => $checkout->patron->categorycode,
+            itemtype     => $checkout->item->effective_itemtype,
+            branchcode   => $checkout->branchcode,
+            rule_name    => 'renewalsallowed',
         }
-        elsif ( exists $checkout->{ $attribute } && !defined $mapped_attribute )
-        {
-            delete $checkout->{ $attribute };
+    );
+    return $c->render(
+        status => 200,
+        openapi => {
+            allows_renewal => $renewable,
+            max_renewals => $rule->rule_value,
+            current_renewals => $checkout->renewals,
+            error => $error
         }
-    }
-    return $checkout;
+    );
 }
 
-=head2 Global variables
-
-=head3 $to_api_mapping
-
-=cut
-
-our $to_api_mapping = {
-    issue_id        => 'checkout_id',
-    borrowernumber  => 'patron_id',
-    itemnumber      => 'item_id',
-    date_due        => 'due_date',
-    branchcode      => 'library_id',
-    returndate      => 'checkin_date',
-    lastreneweddate => 'last_renewed_date',
-    issuedate       => 'checkout_date',
-    notedate        => 'note_date',
-};
-
-=head3 $to_model_mapping
-
-=cut
-
-our $to_model_mapping = {
-    checkout_id       => 'issue_id',
-    patron_id         => 'borrowernumber',
-    item_id           => 'itemnumber',
-    due_date          => 'date_due',
-    library_id        => 'branchcode',
-    checkin_date      => 'returndate',
-    last_renewed_date => 'lastreneweddate',
-    checkout_date     => 'issuedate',
-    note_date         => 'notedate',
-};
-
 1;