]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/perlmods/lib/OpenILS/Utils/PermitHold.pm
LP#1552778: copy some date/time utils from OpenSRF
[working/Evergreen.git] / Open-ILS / src / perlmods / lib / OpenILS / Utils / PermitHold.pm
1 package OpenILS::Utils::PermitHold;
2 use strict; use warnings;
3 use OpenSRF::Utils;
4 use OpenSRF::Utils::Logger qw(:logger);
5 use OpenILS::Application::AppUtils;
6 use OpenILS::Event;
7 use OpenILS::Utils::CStoreEditor qw/:funcs/;
8 my $U  = "OpenILS::Application::AppUtils";
9
10
11 # params within a hash are: copy, patron, 
12 # requestor, request_lib, title, title_descriptor
13 sub permit_copy_hold {
14     my $params  = shift;
15     return indb_hold_permit($params);
16 }
17
18 my $LEGACY_HOLD_EVENT_MAP = {
19     'config.hold_matrix_test.holdable' => 'ITEM_NOT_HOLDABLE',
20     'item.holdable' => 'ITEM_NOT_HOLDABLE',
21     'location.holdable' => 'ITEM_NOT_HOLDABLE',
22     'status.holdable' => 'ITEM_NOT_HOLDABLE',
23     'transit_range' => 'ITEM_NOT_HOLDABLE',
24     'no_matchpoint' => 'NO_POLICY_MATCHPOINT',
25     'config.hold_matrix_test.max_holds' => 'MAX_HOLDS',
26     'config.rule_age_hold_protect.prox' => 'ITEM_AGE_PROTECTED'
27 };
28
29 sub indb_hold_permit {
30     my $params = shift;
31
32     my $function = $$params{retarget} ? 'action.hold_retarget_permit_test' : 'action.hold_request_permit_test';
33     my $patron_id = 
34         ref($$params{patron}) ? $$params{patron}->id : $$params{patron_id};
35     my $request_lib = 
36         ref($$params{request_lib}) ? $$params{request_lib}->id : $$params{request_lib};
37
38     my $HOLD_TEST = {
39         from => [
40             $function,
41             $$params{pickup_lib}, 
42             $request_lib,
43             $$params{copy}->id, 
44             $patron_id,
45             $$params{requestor}->id 
46         ]
47     };
48
49     my $e = new_editor(xact=>1);
50     my $results = $e->json_query($HOLD_TEST);
51     $e->rollback;
52
53     unless($$params{show_event_list}) {
54         return 1 if $U->is_true($results->[0]->{success});
55         return 0;
56     }
57
58     return [
59         new OpenILS::Event(
60             "NO_POLICY_MATCHPOINT",
61             "payload" => {"fail_part" => "no_matchpoint"}
62         )
63     ] unless @$results;
64
65     return [] if $U->is_true($results->[0]->{success});
66
67     return [
68         map {
69             my $event = new OpenILS::Event(
70                 $LEGACY_HOLD_EVENT_MAP->{$_->{"fail_part"}} || $_->{"fail_part"}
71             );
72             $event->{"payload"} = {"fail_part" => $_->{"fail_part"}};
73             $event;
74         } @$results
75     ];
76 }
77
78
79 23;