Bug 23843: Add mapping to Koha::Acquisition::Fund
[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         return $c->render(
61             status  => 200,
62             openapi => $funds->to_api
63         );
64     }
65     catch {
66         if ( $_->isa('DBIx::Class::Exception') ) {
67             return $c->render( status  => 500,
68                                openapi => { error => $_->{msg} } );
69         }
70         else {
71             return $c->render( status  => 500,
72                                openapi => { error => "Something went wrong, check the logs. $_ $filter" } );
73         }
74     };
75 }
76
77 =head3 _to_api
78
79 Helper function that maps a Fund  into
80 the attribute names the exposed REST api spec.
81
82 =cut
83
84 sub _to_api {
85     my $fund = shift;
86     my $returnfund;
87     $returnfund->{fund_id} = delete $fund->{budget_id};
88     $returnfund->{code} = delete $fund->{budget_code};
89     $returnfund->{name} = delete $fund->{budget_name};
90     $returnfund->{library_id} = delete $fund->{budget_branchcode};
91     $returnfund->{total_amount} = delete $fund->{budget_amount};
92     $returnfund->{warn_at_percentage} = delete $fund->{budget_encumb};
93     $returnfund->{warn_at_amount} = delete $fund->{budget_expend};
94     $returnfund->{notes} = delete $fund->{budget_notes};
95     $returnfund->{budget_id} = delete $fund->{budget_period_id};
96     $returnfund->{timestamp} = delete $fund->{timestamp};
97     $returnfund->{fund_owner_id} = delete $fund->{budget_owner_id};
98     $returnfund->{fund_access} = delete $fund->{budget_permission};
99     $returnfund->{statistic1_auth_value_category} = delete $fund->{sort1_authcat};
100     $returnfund->{statistic2_auth_value_category} = delete $fund->{sort2_authcat};
101
102     return $returnfund;
103 }
104
105 =head3 _to_model
106
107 Helper function that maps REST api objects into Fund
108 attribute names.
109
110 =cut
111
112 sub _to_model {
113     my $fund = shift;
114     my $returnfund;
115
116     # Rename back
117     $returnfund->{budget_id} = delete $fund->{fund_id};
118     $returnfund->{budget_code} = delete $fund->{code};
119     $returnfund->{budget_name} = delete $fund->{name};
120     $returnfund->{budget_branchcode} = delete $fund->{library_id};
121     $returnfund->{budget_amount} = delete $fund->{total_amount};
122     $returnfund->{budget_encumb} = delete $fund->{warn_at_percentage};
123     $returnfund->{budget_expend} = delete $fund->{warn_at_amount};
124     $returnfund->{budget_notes} = delete $fund->{notes};
125     $returnfund->{budget_period_id} = delete $fund->{budget_id};
126     $returnfund->{budget_owner_id} = delete $fund->{fund_owner_id};
127     $returnfund->{timestamp} = delete $fund->{timestamp};
128     $returnfund->{budget_permission} = delete $fund->{fund_access};
129     $returnfund->{sort1_authcat} = delete $fund->{statistic1_auth_value_category};
130     $returnfund->{sort2_authcat} = delete $fund->{statistic2_auth_value_category};
131
132     return $returnfund;
133 }
134
135 1;