Lp 1835035: Refactor auto_renewal back end code
[working/Evergreen.git] / Open-ILS / src / perlmods / lib / OpenILS / Application / Trigger / Reactor / Circ / AutoRenew.pm
1 package OpenILS::Application::Trigger::Reactor::Circ::AutoRenew;
2 use strict; use warnings;
3 use Error qw/:try/;
4 use Data::Dumper;
5 use OpenSRF::Utils::SettingsClient;
6 use OpenILS::Application::Trigger::Reactor;
7 use OpenSRF::Utils::Logger qw/:logger/;
8 use OpenILS::Utils::CStoreEditor qw/:funcs/;
9 use OpenILS::Application::AppUtils;
10 my $AppUtils = 'OpenILS::Application::AppUtils';
11
12 use Encode;
13 $Data::Dumper::Indent = 0;
14
15 use base 'OpenILS::Application::Trigger::Reactor';
16
17 my $log = 'OpenSRF::Utils::Logger';
18
19 sub ABOUT {
20     return <<ABOUT;
21 This Autorenew reactor will auto renew a circulation on the day it is due.
22 ABOUT
23 }
24
25 sub handler {
26     my $self = shift;
27     my $env = shift;
28
29     # 1. get a session token for circ user
30
31     my $circs = $env->{target};
32     my $svc = "open-ils.auth_internal";
33     my $api = $svc . '.session.create';
34
35     my $auth_internal_svc = OpenSRF::AppSession->create($svc);
36
37     my $userid = $circs->[0]->usr();
38     # fetch user
39     my $userObj = new_editor()->retrieve_actor_user($userid);
40     my %args = 
41         ( 
42             user_id => $userid,
43             org_unit => $userObj->home_ou(), # all autorenewals occur from patron's Home OU.
44             login_type => "opac"
45         );
46
47     my $token = $auth_internal_svc->request($api, \%args)->gather(1)->{payload}->{authtoken};
48     
49     # 2. carry out renewal:
50     my $ses = OpenSRF::AppSession->connect('open-ils.trigger');
51     for (@$circs){
52
53         $logger->info( "AUTORENEW: circ.target_copy: " . Dumper($_->target_copy()) );
54         my $evt = $AppUtils->simplereq(
55             'open-ils.circ',
56             'open-ils.circ.renew',
57             $token,
58             {
59                 patron_id => $_->usr(),
60                 copy_id => $_->target_copy(),
61                 auto_renewal => 1
62             }
63         );
64
65         $evt = $evt->[0] if ref($evt) eq "ARRAY";  # we got two resp events, likely renewal errors, grab the first.
66         my $is_renewed = $evt->{textcode} eq 'SUCCESS' ? 1 : 0;
67
68         my $new_circ_due = $is_renewed ? $evt->{payload}->{circ}->due_date : '';
69
70         my %user_data = (
71             copy => $_->target_copy(),
72             is_renewed => $is_renewed,
73             reason => !$is_renewed ? sprintf("%s : %s", $evt->{textcode}, substr($evt->{desc}, 0, 140)) : '',
74             new_due_date => $is_renewed ? $evt->{payload}->{circ}->due_date : '',
75             old_due_date => !$is_renewed ? $_->due_date() : '',
76         );
77
78         # Create the event from the source circ instead of the
79         # new circ, since the renewal may have failed.
80         $ses->request('open-ils.trigger.event.autocreate', 
81             'autorenewal', $_, $_->circ_lib(), undef, \%user_data);
82     }
83
84     $ses->disconnect;
85
86     return 1;
87 }
88
89 1;