Bug 19661: Add and change properties and parameters to conform to the funds RFC.
[koha.git] / Koha / REST / V1 / Acquisitions / Funds.pm
1 package Koha::REST::V1::Acquisitions::Funds;
2
3 # This file is part of Koha.
4 #
5 # Koha is free software; you can redistribute it and/or modify it under the
6 # terms of the GNU General Public License as published by the Free Software
7 # Foundation; either version 3 of the License, or (at your option) any later
8 # version.
9 #
10 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
11 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License along
15 # with Koha; if not, write to the Free Software Foundation, Inc.,
16 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
18 use Modern::Perl;
19
20 use Mojo::Base 'Mojolicious::Controller';
21
22 use Koha::Acquisition::Funds;
23
24 use Try::Tiny;
25
26 =head1 NAME
27
28 Koha::REST::V1::Acquisitions::Funds
29
30 =head1 API
31
32 =head2 Methods
33
34 =head3 list_funds
35
36 Controller function that handles listing Funds
37
38 =cut
39
40 sub list_funds {
41     my $c = shift->openapi->valid_input or return;
42
43     my $args = _to_model($c->req->params->to_hash);
44     my $filter;
45
46     for my $filter_param ( keys %$args ) {
47         if ($args->{$filter_param}) {
48             if ($filter_param eq "budget_owner_id") {
49                 # Perform an exact search on the borrowernumber
50                 $filter->{$filter_param} = { "=" => $args->{$filter_param} }
51             } else {
52                 # And a "start with" search on the budget name
53                 $filter->{$filter_param} = { LIKE => $args->{$filter_param} . "%" }
54             }
55         }
56     }
57
58     return try {
59         my @funds = Koha::Acquisition::Funds->search($filter);
60         @funds = map { _to_api($_->TO_JSON) } @funds;
61         return $c->render( status  => 200,
62                            openapi =>  \@funds);
63     }
64     catch {
65         if ( $_->isa('DBIx::Class::Exception') ) {
66             return $c->render( status  => 500,
67                                openapi => { error => $_->{msg} } );
68         }
69         else {
70             return $c->render( status  => 500,
71                                openapi => { error => "Something went wrong, check the logs. $_ $filter" } );
72         }
73     };
74 }
75
76 =head3 _to_api
77
78 Helper function that maps a Fund  into
79 the attribute names the exposed REST api spec.
80
81 =cut
82
83 sub _to_api {
84     my $fund = shift;
85     my $returnfund;
86     $returnfund->{fund_id} = delete $fund->{budget_id};
87     $returnfund->{code} = delete $fund->{budget_code};
88     $returnfund->{name} = delete $fund->{budget_name};
89     $returnfund->{library_id} = delete $fund->{budget_branchcode};
90     $returnfund->{total_amount} = delete $fund->{budget_amount};
91     $returnfund->{warn_at_percentage} = delete $fund->{budget_encumb};
92     $returnfund->{warn_at_amount} = delete $fund->{budget_expend};
93     $returnfund->{notes} = delete $fund->{budget_notes};
94     $returnfund->{budget_id} = delete $fund->{budget_period_id};
95     $returnfund->{timestamp} = delete $fund->{timestamp};
96     $returnfund->{fund_owner_id} = delete $fund->{budget_owner_id};
97     $returnfund->{fund_access} = delete $fund->{budget_permission};
98     $returnfund->{statistic1_auth_value_category} = delete $fund->{sort1_authcat};
99     $returnfund->{statistic2_auth_value_category} = delete $fund->{sort2_authcat};
100
101     return $returnfund;
102 }
103
104 =head3 _to_model
105
106 Helper function that maps REST api objects into Fund
107 attribute names.
108
109 =cut
110
111 sub _to_model {
112     my $fund = shift;
113     my $returnfund;
114
115     # Rename back
116     $returnfund->{budget_id} = delete $fund->{fund_id};
117     $returnfund->{budget_code} = delete $fund->{code};
118     $returnfund->{budget_name} = delete $fund->{name};
119     $returnfund->{budget_branchcode} = delete $fund->{library_id};
120     $returnfund->{budget_amount} = delete $fund->{total_amount};
121     $returnfund->{budget_encumb} = delete $fund->{warn_at_percentage};
122     $returnfund->{budget_expend} = delete $fund->{warn_at_amount};
123     $returnfund->{budget_notes} = delete $fund->{notes};
124     $returnfund->{budget_period_id} = delete $fund->{budget_id};
125     $returnfund->{budget_owner_id} = delete $fund->{fund_owner_id};
126     $returnfund->{timestamp} = delete $fund->{timestamp};
127     $returnfund->{budget_permission} = delete $fund->{fund_access};
128     $returnfund->{sort1_authcat} = delete $fund->{statistic1_auth_value_category};
129     $returnfund->{sort2_authcat} = delete $fund->{statistic2_auth_value_category};
130
131     return $returnfund;
132 }
133
134 1;