1 package Koha
::REST
::V1
::Patrons
::Account
;
3 # This file is part of Koha.
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
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.
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.
20 use Mojo
::Base
'Mojolicious::Controller';
24 use Scalar
::Util
qw(blessed);
29 Koha::REST::V1::Patrons::Account
37 Controller function that handles retrieving a patron's account balance
42 my $c = shift->openapi->valid_input or return;
44 my $patron_id = $c->validation->param('patron_id');
45 my $patron = Koha
::Patrons
->find($patron_id);
48 return $c->render( status
=> 404, openapi
=> { error
=> "Patron not found." } );
51 my $account = $patron->account;
54 $balance->{balance
} = $account->balance;
56 # get outstanding debits and credits
57 my $debits = $account->outstanding_debits;
58 my $credits = $account->outstanding_credits;
60 my @debit_lines = map { _to_api
( $_->TO_JSON ) } @
{ $debits->as_list };
61 $balance->{outstanding_debits
} = {
62 total
=> $debits->total_outstanding,
63 lines
=> \
@debit_lines
66 my @credit_lines = map { _to_api
( $_->TO_JSON ) } @
{ $credits->as_list };
67 $balance->{outstanding_credits
} = {
68 total
=> $credits->total_outstanding,
69 lines
=> \
@credit_lines
72 return $c->render( status
=> 200, openapi
=> $balance );
77 Controller function that handles adding a credit to a patron's account
82 my $c = shift->openapi->valid_input or return;
84 my $patron_id = $c->validation->param('patron_id');
85 my $patron = Koha
::Patrons
->find($patron_id);
86 my $user = $c->stash('koha.user');
90 return $c->render( status
=> 404, openapi
=> { error
=> "Patron not found." } );
93 my $account = $patron->account;
94 my $body = $c->validation->param('body');
97 my $credit_type = $body->{credit_type
} || 'payment'; # default to 'payment'
98 my $amount = $body->{amount
}; # mandatory, validated by openapi
100 unless ( $amount > 0 ) { # until we support newer JSON::Validator and thus minimumExclusive
101 Koha
::Exceptions
::BadParameter
->throw( { parameter
=> 'amount' } );
104 # read the rest of the params
105 my $payment_type = $body->{payment_type
};
106 my $description = $body->{description
};
107 my $note = $body->{note
};
109 my $credit = $account->add_credit(
111 credit_type
=> $credit_type,
112 payment_type
=> $payment_type,
113 description
=> $description,
118 $credit->discard_changes;
120 my $date = $body->{date
};
121 $credit->date( $date )->store
124 my $debits_ids = $body->{account_lines_ids
};
125 my $debits = Koha
::Account
::Lines
->search({ accountlines_id
=> { -in => $debits_ids } })
128 my $outstanding_credit = $credit->amountoutstanding;
131 $outstanding_credit = $credit->apply({ debits
=> $debits, offset_type
=> 'payment' });
134 if ($outstanding_credit) {
135 my $outstanding_debits = $account->outstanding_debits;
136 $credit->apply({ debits
=> $outstanding_debits, offset_type
=> 'payment' });
139 return $c->render( status
=> 200, openapi
=> { account_line_id
=> $credit->id } );
142 if ( blessed
$_ && $_->can('rethrow') ) {
145 openapi
=> { error
=> "$_" }
149 # Exception, rely on the stringified exception
152 openapi
=> { error
=> "Something went wrong, check the logs" }
161 Helper function that maps unblessed Koha::Account::Line objects
162 into REST API attribute names.
167 my $account_line = shift;
170 foreach my $column ( keys %{ $Koha::REST
::V1
::Patrons
::Account
::to_api_mapping
} ) {
171 my $mapped_column = $Koha::REST
::V1
::Patrons
::Account
::to_api_mapping
->{$column};
172 if ( exists $account_line->{ $column }
173 && defined $mapped_column )
176 $account_line->{ $mapped_column } = delete $account_line->{ $column };
178 elsif ( exists $account_line->{ $column }
179 && !defined $mapped_column )
182 delete $account_line->{ $column };
186 return $account_line;
191 Helper function that maps REST API objects into Koha::Account::Line
197 my $account_line = shift;
199 foreach my $attribute ( keys %{ $Koha::REST
::V1
::Patrons
::Account
::to_model_mapping
} ) {
200 my $mapped_attribute = $Koha::REST
::V1
::Patrons
::Account
::to_model_mapping
->{$attribute};
201 if ( exists $account_line->{ $attribute }
202 && defined $mapped_attribute )
205 $account_line->{ $mapped_attribute } = delete $account_line->{ $attribute };
207 elsif ( exists $account_line->{ $attribute }
208 && !defined $mapped_attribute )
210 # key => undef / to be deleted
211 delete $account_line->{ $attribute };
215 return $account_line;
218 =head2 Global variables
220 =head3 $to_api_mapping
224 our $to_api_mapping = {
225 accountlines_id
=> 'account_line_id',
226 accountno
=> undef, # removed
227 accounttype
=> 'account_type',
228 amountoutstanding
=> 'amount_outstanding',
229 borrowernumber
=> 'patron_id',
231 issue_id
=> 'checkout_id',
232 itemnumber
=> 'item_id',
233 manager_id
=> 'user_id',
234 note
=> 'internal_note',
237 =head3 $to_model_mapping
241 our $to_model_mapping = {
242 account_line_id
=> 'accountlines_id',
243 account_type
=> 'accounttype',
244 amount_outstanding
=> 'amountoutstanding',
245 checkout_id
=> 'issue_id',
246 internal_note
=> 'note',
247 item_id
=> 'itemnumber',
248 patron_id
=> 'borrowernumber',
249 user_id
=> 'manager_id'