Bug 21765: Make AutoUnsuspendReserves call Koha::Hold->resume
[koha.git] / Koha / Illrequest / Config.pm
blob7db926e681dcb602672774d65aa2e9271b644036
1 package Koha::Illrequest::Config;
3 # Copyright 2013,2014 PTFS Europe Ltd
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free Software
9 # Foundation; either version 3 of the License, or (at your option) any later
10 # version.
12 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License along
17 # with Koha; if not, write to the Free Software Foundation, Inc.,
18 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 use Modern::Perl;
22 use File::Basename qw/basename/;
24 use C4::Context;
26 =head1 NAME
28 Koha::Illrequest::Config - Koha ILL Configuration Object
30 =head1 SYNOPSIS
32 Object-oriented class that giving access to the illconfig data derived
33 from ill/config.yaml.
35 =head1 DESCRIPTION
37 Config object providing abstract representation of the expected XML
38 returned by ILL API.
40 In particular the config object uses a YAML file, whose path is
41 defined by <illconfig> in koha-conf.xml. That YAML file provides the
42 data structure exposed in this object.
44 By default the configured data structure complies with fields used by
45 the British Library Interlibrary Loan DSS API.
47 The config file also provides mappings for Record Object accessors.
49 =head1 API
51 =head2 Class Methods
53 =head3 new
55 my $config = Koha::Illrequest::Config->new();
57 Create a new Koha::Illrequest::Config object, with mapping data loaded from the
58 ILL configuration file.
60 =cut
62 sub new {
63 my ( $class ) = @_;
64 my $self = {};
66 $self->{configuration} = _load_configuration(
67 C4::Context->config("interlibrary_loans")
70 bless $self, $class;
72 return $self;
75 =head3 backend
77 $backend = $config->backend($name);
78 $backend = $config->backend;
80 Standard setter/accessor for our backend.
82 =cut
84 sub backend {
85 my ( $self, $new ) = @_;
86 $self->{configuration}->{backend} = $new if $new;
87 return $self->{configuration}->{backend};
90 =head3 backend_dir
92 $backend_dir = $config->backend_dir($new_path);
93 $backend_dir = $config->backend_dir;
95 Standard setter/accessor for our backend_directory.
97 =cut
99 sub backend_dir {
100 my ( $self, $new ) = @_;
101 $self->{configuration}->{backend_directory} = $new if $new;
102 return $self->{configuration}->{backend_directory};
105 =head3 available_backends
107 Return a list of available backends.
109 =cut
111 sub available_backends {
112 my ( $self ) = @_;
113 my $backend_dir = $self->backend_dir;
114 my @backends = ();
115 @backends = glob "$backend_dir/*" if ( $backend_dir );
116 @backends = map { basename($_) } @backends;
117 return \@backends;
120 =head3 has_branch
122 Return whether a 'branch' block is defined
124 =cut
126 sub has_branch {
127 my ( $self ) = @_;
128 return $self->{configuration}->{raw_config}->{branch};
131 =head3 partner_code
133 $partner_code = $config->partner_code($new_code);
134 $partner_code = $config->partner_code;
136 Standard setter/accessor for our partner_code.
138 =cut
140 sub partner_code {
141 my ( $self, $new ) = @_;
142 $self->{configuration}->{partner_code} = $new if $new;
143 return $self->{configuration}->{partner_code};
146 =head3 limits
148 $limits = $config->limits($limitshash);
149 $limits = $config->limits;
151 Standard setter/accessor for our limits. No parsing is performed on
152 $LIMITSHASH, so caution should be exercised when using this setter.
154 =cut
156 sub limits {
157 my ( $self, $new ) = @_;
158 $self->{configuration}->{limits} = $new if $new;
159 return $self->{configuration}->{limits};
162 =head3 getPrefixes
164 my $prefixes = $config->getPrefixes();
166 Return the branch prefix for ILLs defined by our config.
168 =cut
170 sub getPrefixes {
171 my ( $self ) = @_;
172 return $self->{configuration}->{prefixes}->{branch};
175 =head3 getLimitRules
177 my $rules = $config->getLimitRules('brw_cat' | 'branch')
179 Return the hash of ILL limit rules defined by our config.
181 =cut
183 sub getLimitRules {
184 my ( $self, $type ) = @_;
185 die "Unexpected type." unless ( $type eq 'brw_cat' || $type eq 'branch' );
186 my $values = $self->{configuration}->{limits}->{$type};
187 $values->{default} = $self->{configuration}->{limits}->{default};
188 return $values;
191 =head3 getDigitalRecipients
193 my $recipient_rules= $config->getDigitalRecipients('brw_cat' | 'branch');
195 Return the hash of digital_recipient settings defined by our config.
197 =cut
199 sub getDigitalRecipients {
200 my ( $self, $type ) = @_;
201 die "Unexpected type." unless ( $type eq 'brw_cat' || $type eq 'branch' );
202 my $values = $self->{configuration}->{digital_recipients}->{$type};
203 $values->{default} =
204 $self->{configuration}->{digital_recipients}->{default};
205 return $values;
208 =head3 censorship
210 my $censoredValues = $config->censorship($hash);
211 my $censoredValues = $config->censorship;
213 Standard setter/accessor for our limits. No parsing is performed on $HASH, so
214 caution should be exercised when using this setter.
216 Return our censorship values for the OPAC as loaded from the koha-conf.xml, or
217 the fallback value (no censorship).
219 =cut
221 sub censorship {
222 my ( $self, $new ) = @_;
223 $self->{configuration}->{censorship} = $new if $new;
224 return $self->{configuration}->{censorship};
227 =head3 _load_configuration
229 my $configuration = $config->_load_configuration($config_from_xml);
231 Read the configuration values passed as the parameter, and populate a hashref
232 suitable for use with these.
234 A key task performed here is the parsing of the input in the configuration
235 file to ensure we have only valid input there.
237 =cut
239 sub _load_configuration {
240 my ( $xml_config ) = @_;
241 my $xml_backend_dir = $xml_config->{backend_directory};
243 # Default data structure to be returned
244 my $configuration = {
245 backend_directory => $xml_backend_dir,
246 censorship => {
247 censor_notes_staff => 0,
248 censor_reply_date => 0,
250 limits => {},
251 digital_recipients => {},
252 prefixes => {},
253 partner_code => 'ILLLIBS',
254 raw_config => $xml_config,
257 # Per Branch Configuration
258 my $branches = $xml_config->{branch};
259 if ( ref($branches) eq "ARRAY" ) {
260 # Multiple branch overrides defined
261 map {
262 _load_unit_config({
263 unit => $_,
264 id => $_->{code},
265 config => $configuration,
266 type => 'branch'
268 } @{$branches};
269 } elsif ( ref($branches) eq "HASH" ) {
270 # Single branch override defined
271 _load_unit_config({
272 unit => $branches,
273 id => $branches->{code},
274 config => $configuration,
275 type => 'branch'
279 # Per Borrower Category Configuration
280 my $brw_cats = $xml_config->{borrower_category};
281 if ( ref($brw_cats) eq "ARRAY" ) {
282 # Multiple borrower category overrides defined
283 map {
284 _load_unit_config({
285 unit => $_,
286 id => $_->{code},
287 config => $configuration,
288 type => 'brw_cat'
290 } @{$brw_cats};
291 } elsif ( ref($brw_cats) eq "HASH" ) {
292 # Single branch override defined
293 _load_unit_config({
294 unit => $brw_cats,
295 id => $brw_cats->{code},
296 config => $configuration,
297 type => 'brw_cat'
301 # Default Configuration
302 _load_unit_config({
303 unit => $xml_config,
304 id => 'default',
305 config => $configuration
308 # Censorship
309 my $staff_comments = $xml_config->{staff_request_comments} || 0;
310 $configuration->{censorship}->{censor_notes_staff} = 1
311 if ( $staff_comments && 'hide' eq $staff_comments );
312 my $reply_date = $xml_config->{reply_date} || 0;
313 $configuration->{censorship}->{censor_reply_date} = 1
314 if ( $reply_date && 'hide' eq $reply_date );
316 # ILL Partners
317 $configuration->{partner_code} = $xml_config->{partner_code} || 'ILLLIBS';
319 return $configuration;
322 =head3 _load_unit_config
324 my $configuration->{part} = _load_unit_config($params);
326 $PARAMS is a hashref with the following elements:
327 - unit: the part of the configuration we are parsing.
328 - id: the name within which we will store the parsed unit in config.
329 - config: the configuration we are augmenting.
330 - type: the type of config unit we are parsing. Assumed to be 'default'.
332 Read `unit', and augment `config' with these under `id'.
334 This is a helper for _load_configuration.
336 A key task performed here is the parsing of the input in the configuration
337 file to ensure we have only valid input there.
339 =cut
341 sub _load_unit_config {
342 my ( $params ) = @_;
343 my $unit = $params->{unit};
344 my $id = $params->{id};
345 my $config = $params->{config};
346 my $type = $params->{type};
347 die "TYPE should be either 'branch' or 'brw_cat' if ID is not 'default'."
348 if ( $id ne 'default' && ( $type ne 'branch' && $type ne 'brw_cat') );
349 return $config unless $id;
351 if ( $unit->{api_key} && $unit->{api_auth} ) {
352 $config->{credentials}->{api_keys}->{$id} = {
353 api_key => $unit->{api_key},
354 api_auth => $unit->{api_auth},
357 # Add request_limit rules.
358 # METHOD := 'annual' || 'active'
359 # COUNT := x >= -1
360 if ( ref $unit->{request_limit} eq 'HASH' ) {
361 my $method = $unit->{request_limit}->{method};
362 my $count = $unit->{request_limit}->{count};
363 if ( 'default' eq $id ) {
364 $config->{limits}->{$id}->{method} = $method
365 if ( $method && ( 'annual' eq $method || 'active' eq $method ) );
366 $config->{limits}->{$id}->{count} = $count
367 if ( $count && ( -1 <= $count ) );
368 } else {
369 $config->{limits}->{$type}->{$id}->{method} = $method
370 if ( $method && ( 'annual' eq $method || 'active' eq $method ) );
371 $config->{limits}->{$type}->{$id}->{count} = $count
372 if ( $count && ( -1 <= $count ) );
376 # Add prefix rules.
377 # PREFIX := string
378 if ( $unit->{prefix} ) {
379 if ( 'default' eq $id ) {
380 $config->{prefixes}->{$id} = $unit->{prefix};
381 } else {
382 $config->{prefixes}->{$type}->{$id} = $unit->{prefix};
386 # Add digital_recipient rules.
387 # DIGITAL_RECIPIENT := borrower || branch (defaults to borrower)
388 if ( $unit->{digital_recipient} ) {
389 if ( 'default' eq $id ) {
390 $config->{digital_recipients}->{$id} = $unit->{digital_recipient};
391 } else {
392 $config->{digital_recipients}->{$type}->{$id} =
393 $unit->{digital_recipient};
397 return $config;
400 =head1 AUTHOR
402 Alex Sassmannshausen <alex.sassmannshausen@ptfs-europe.com>
404 =cut