1 package OpenILS::Utils::Penalty;
2 use strict; use warnings;
5 use OpenSRF::EX qw(:try);
6 use OpenSRF::Utils::Cache;
7 use OpenSRF::Utils qw/:datetime/;
8 use OpenILS::Application::AppUtils;
9 use OpenSRF::Utils::Logger qw(:logger);
10 use OpenILS::Utils::CStoreEditor qw/:funcs/;
11 use OpenILS::Utils::Fieldmapper;
12 use OpenILS::Const qw/:const/;
13 my $U = "OpenILS::Application::AppUtils";
16 # calculate and update the well-known penalties
17 sub calculate_penalties {
18 my($class, $e, $user_id, $context_org) = @_;
22 $e = new_editor(xact =>1);
26 my $penalties = $e->json_query({from => ['actor.calculate_system_penalties',$user_id, $context_org]});
28 my $user = $e->retrieve_actor_user( $user_id );
29 my $ses = OpenSRF::AppSession->create('open-ils.trigger') if (@$penalties);
32 for my $pen_obj (@$penalties) {
34 next if grep { # leave duplicate penalties in place
35 $_->{org_unit} == $pen_obj->{org_unit} and
36 $_->{standing_penalty} == $pen_obj->{standing_penalty} and
37 ($_->{id} || '') ne ($pen_obj->{id} || '') } @$penalties;
39 my $pen = Fieldmapper::actor::user_standing_penalty->new;
40 $pen->$_($pen_obj->{$_}) for keys %$pen_obj;
42 if(defined $pen_obj->{id}) {
43 $e->delete_actor_user_standing_penalty($pen) or return $e->die_event;
46 $e->create_actor_user_standing_penalty($pen) or return $e->die_event;
48 my $csp_obj = $csp{$pen->standing_penalty} ||
49 $e->retrieve_config_standing_penalty( $pen->standing_penalty );
52 $csp{$pen->standing_penalty} = $csp_obj;
55 'open-ils.trigger.event.autocreate',
56 'penalty.' . $csp_obj->name,
63 $e->rollback if $rollback;
67 # any penalties whose block_list has an item from @fatal_mask will be sorted
68 # into the fatal_penalties set. Others will be sorted into the info_penalties set
69 sub retrieve_penalties {
70 my($class, $e, $user_id, $context_org, @fatal_mask) = @_;
72 my $penalties = $e->search_actor_user_standing_penalty([
73 {usr => $user_id, org_unit => $U->get_org_ancestors($context_org)},
74 {flesh => 1, flesh_fields => {ausp => ['standing_penalty']}}
78 for my $p (@$penalties) {
80 if($p->standing_penalty->block_list) {
81 for my $m (@fatal_mask) {
82 if($p->standing_penalty->block_list =~ /$m/) {
83 push(@fatal, $p->standing_penalty);
89 push(@info, $p->standing_penalty) unless $pushed;
92 return {fatal_penalties => \@fatal, info_penalties => \@info};