Bug 18731: /acquisitions/orders endpoint
authorTomas Cohen Arazi <tomascohen@theke.io>
Tue, 5 Sep 2017 19:44:43 +0000 (16:44 -0300)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Thu, 9 Jan 2020 16:25:41 +0000 (16:25 +0000)
This patches implement the /acquisitions/orders endpoint.

The attribute names are consistent with the voted RFC

To test:
1. Apply this patchset
2. Run:
   $ kshell
  k$ prove t/db_dependent/api/v1/acquisitions_orders.t
=> SUCCESS: Tests pass!
3. Test the API with your favourite tool (Postman?)
=> SUCCESS: It works as expected!
4 Sign off :-D

Sponsored-by: Camden County
Signed-off-by: Matthias Meusburger <matthias.meusburger@biblibre.com>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Koha/Acquisition/Order.pm
Koha/REST/V1/Acquisitions/Orders.pm [new file with mode: 0644]
Koha/Schema/Result/Aqorder.pm

index 4a25814..6d37e15 100644 (file)
@@ -264,6 +264,53 @@ sub duplicate_to {
     return $new_order;
 }
 
+=head3 to_api_mapping
+
+This method returns the mapping for representing a Koha::Acquisition::Order object
+on the API.
+
+=cut
+
+sub to_api_mapping {
+    return {
+        basketno                      => 'basket_id',
+        biblionumber                  => 'biblio_id',
+        budget_id                     => 'fund_id',
+        budgetdate                    => undef,                    # unused
+        cancellationreason            => 'cancellation_reason',
+        claimed_date                  => 'last_claim_date',
+        datecancellationprinted       => 'cancellation_date',
+        datereceived                  => 'date_received',
+        discount                      => 'discount_rate',
+        entrydate                     => 'entry_date',
+        freight                       => 'shipping_cost',
+        invoiceid                     => 'invoice_id',
+        line_item_id                  => undef,                    # EDIFACT related
+        listprice                     => 'list_price',
+        order_internalnote            => 'internal_note',
+        order_vendornote              => 'vendor_note',
+        ordernumber                   => 'order_id',
+        orderstatus                   => 'status',
+        parent_ordernumber            => 'parent_order_id',
+        purchaseordernumber           => undef,                    # obsolete
+        quantityreceived              => 'quantity_received',
+        replacementprice              => 'replacement_price',
+        sort1                         => 'statistics_1',
+        sort1_authcat                 => 'statistics_1_authcat',
+        sort2                         => 'statistics_2',
+        sort2_authcat                 => 'statistics_2_authcat',
+        subscriptionid                => 'subscription_id',
+        suppliers_reference_number    => undef,                    # EDIFACT related
+        suppliers_reference_qualifier => undef,                    # EDIFACT related
+        suppliers_report              => undef,                    # EDIFACT related
+        tax_rate_bak                  => undef,                    # unused
+        tax_value_bak                 => undef,                    # unused
+        uncertainprice                => 'uncertain_price',
+        unitprice                     => 'unit_price',
+        unitprice_tax_excluded        => 'unit_price_tax_excluded',
+        unitprice_tax_included        => 'unit_price_tax_included'
+    };
+}
 
 =head2 Internal methods
 
diff --git a/Koha/REST/V1/Acquisitions/Orders.pm b/Koha/REST/V1/Acquisitions/Orders.pm
new file mode 100644 (file)
index 0000000..e32e17d
--- /dev/null
@@ -0,0 +1,229 @@
+package Koha::REST::V1::Acquisitions::Orders;
+
+# 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 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.
+
+use Modern::Perl;
+
+use Mojo::Base 'Mojolicious::Controller';
+
+use Koha::Acquisition::Orders;
+use Koha::DateUtils;
+
+use Scalar::Util qw( blessed );
+use Try::Tiny;
+
+=head1 NAME
+
+Koha::REST::V1::Acquisitions::Orders
+
+=head1 API
+
+=head2 Methods
+
+=head3 list
+
+Controller function that handles listing Koha::Acquisition::Order objects
+
+=cut
+
+sub list {
+
+    my $c = shift->openapi->valid_input or return;
+
+    return try {
+        my $orders = $c->objects->search( Koha::Acquisition::Orders->new );
+
+        return $c->render(
+            status  => 200,
+            openapi => $orders
+        );
+    }
+    catch {
+        if ( $_->isa('Koha::Exceptions::Exception') ) {
+            return $c->render(
+                status  => 500,
+                openapi => { error => "Unhandled exception ($_)" }
+            );
+        }
+        else {
+            return $c->render(
+                status  => 500,
+                openapi => { error => "Something went wrong, check the logs. ($_)" }
+            );
+        }
+    };
+}
+
+=head3 get
+
+Controller function that handles retrieving a single Koha::Aquisition::Order object
+
+=cut
+
+sub get {
+    my $c = shift->openapi->valid_input or return;
+
+    my $order = Koha::Acquisition::Orders->find( $c->validation->param('order_id') );
+
+    unless ($order) {
+        return $c->render(
+            status  => 404,
+            openapi => { error => "Order not found" }
+        );
+    }
+
+    my $embed = $c->stash('koha.embed');
+
+    return $c->render(
+        status  => 200,
+        openapi => $order->to_api({ embed => $embed })
+    );
+}
+
+=head3 add
+
+Controller function that handles adding a new Koha::Acquisition::Order object
+
+=cut
+
+sub add {
+    my $c = shift->openapi->valid_input or return;
+
+    return try {
+        my $order = Koha::Acquisition::Order->new_from_api( $c->validation->param('body') );
+        $order->store->discard_changes;
+
+        $c->res->headers->location(
+            $c->req->url->to_string . '/' . $order->ordernumber
+        );
+
+        return $c->render(
+            status  => 201,
+            openapi => $order->to_api
+        );
+    }
+    catch {
+        unless ( blessed $_ && $_->can('rethrow') ) {
+            return $c->render(
+                status  => 500,
+                openapi => {
+                    error =>
+                      "Something went wrong, check Koha logs for details."
+                }
+            );
+        }
+        if ( $_->isa('Koha::Exceptions::Object::DuplicateID') ) {
+            return $c->render(
+                status  => 409,
+                openapi => { error => $_->error, conflict => $_->duplicate_id }
+            );
+        }
+        else {
+            return $c->render(
+                status  => 500,
+                openapi => { error => "$_" }
+            );
+        }
+    };
+}
+
+=head3 update
+
+Controller function that handles updating a Koha::Acquisition::Order object
+
+=cut
+
+sub update {
+    my $c = shift->openapi->valid_input or return;
+
+    my $order = Koha::Acquisition::Orders->find( $c->validation->param('order_id') );
+
+    unless ($order) {
+        return $c->render(
+            status  => 404,
+            openapi => { error => "Order not found" }
+        );
+    }
+
+    return try {
+        $order->set_from_api( $c->validation->param('body') );
+        $order->store()->discard_changes;
+
+        return $c->render(
+            status  => 200,
+            openapi => $order->to_api
+        );
+    }
+    catch {
+        if ( $_->isa('Koha::Exceptions::Exception') ) {
+            return $c->render(
+                status  => 500,
+                openapi => { error => "Unhandled exception ($_)" }
+            );
+        }
+        else {
+            return $c->render(
+                status  => 500,
+                openapi => { error => "Something went wrong, check the logs." }
+            );
+        }
+    };
+}
+
+=head3 delete
+
+Controller function that handles deleting a Koha::Patron object
+
+=cut
+
+sub delete {
+    my $c = shift->openapi->valid_input or return;
+
+    my $order = Koha::Acquisition::Orders->find( $c->validation->param('order_id') );
+
+    unless ($order) {
+        return $c->render(
+            status  => 404,
+            openapi => { error => 'Order not found' }
+        );
+    }
+
+    return try {
+
+        $order->delete;
+
+        return $c->render(
+            status  => 204,
+            openapi => q{}
+        );
+    }
+    catch {
+        if ( $_->isa('Koha::Exceptions::Exception') ) {
+            return $c->render(
+                status  => 500,
+                openapi => { error => "Unhandled exception ($_)" }
+            );
+        }
+        else {
+            return $c->render(
+                status  => 500,
+                openapi => { error => "Something went wrong, check the logs." }
+            );
+        }
+    };
+}
+
+1;
index 8035118..75917c8 100644 (file)
@@ -670,5 +670,8 @@ sub koha_objects_class {
 sub koha_object_class {
     'Koha::Acquisition::Order';
 }
+__PACKAGE__->add_columns(
+    '+uncertainprice' => { is_boolean => 1 }
+);
 
 1;