1 package OpenILS::Application::Circ::ScriptBuilder;
2 use strict; use warnings;
3 use OpenILS::Utils::ScriptRunner;
4 use OpenILS::Utils::CStoreEditor qw/:funcs/;
5 use OpenILS::Application::AppUtils;
6 use OpenILS::Application::Actor;
7 use OpenSRF::Utils::Logger qw/$logger/;
8 my $U = "OpenILS::Application::AppUtils";
11 my $evt = "environment";
20 # -----------------------------------------------------------------------
30 # fetch_patron_circ_info - load info on items out, overdues, and fines.
32 # _direct - this is a hash of key/value pairs to shove directly into the
33 # script runner. Use this to cover data not covered by this module
34 # -----------------------------------------------------------------------
36 my( $class, $args ) = @_;
41 my $editor = $$args{editor} || new_editor();
43 $args->{_direct} = {} unless $args->{_direct};
45 $evt = fetch_bib_data($editor, $args);
46 push(@evts, $evt) if $evt;
47 $evt = fetch_user_data($editor, $args);
48 push(@evts, $evt) if $evt;
52 push( @e, $_->{textcode} ) for @evts;
53 $logger->info("script_builder: some events occurred: @e");
54 $logger->debug("script_builder: some events occurred: " . Dumper(\@evts));
55 $args->{_events} = \@evts;
58 return build_runner($editor, $args);
66 my $runner = OpenILS::Utils::ScriptRunner->new;
68 $runner->insert( "$evt.groupTree", $GROUP_TREE, 1);
71 $runner->insert( "$evt.patron", $ctx->{patron}, 1);
72 $runner->insert( "$evt.copy", $ctx->{copy}, 1);
73 $runner->insert( "$evt.volume", $ctx->{volume}, 1);
74 $runner->insert( "$evt.title", $ctx->{title}, 1);
75 $runner->insert( "$evt.requestor", $ctx->{requestor}, 1);
76 $runner->insert( "$evt.titleDescriptor", $ctx->{titleDescriptor}, 1);
78 $runner->insert( "$evt.patronItemsOut", $ctx->{patronItemsOut}, 1 );
79 $runner->insert( "$evt.patronOverdueCount", $ctx->{patronOverdue}, 1 );
80 $runner->insert( "$evt.patronFines", $ctx->{patronFines}, 1 );
82 $runner->insert("$evt.$_", $ctx->{_direct}->{$_}) for keys %{$ctx->{_direct}};
84 $ctx->{runner} = $runner;
86 insert_org_methods( $editor, $ctx );
98 $ctx->{copy} = $e->retrieve_asset_copy($ctx->{copy_id})
101 } elsif( $ctx->{copy_barcode} ) {
103 my $cps = $e->search_asset_copy({barcode => $ctx->{copy_barcode}});
104 return $e->event unless @$cps;
105 $ctx->{copy} = $$cps[0];
109 return undef unless my $copy = $ctx->{copy};
111 # --------------------------------------------------------------------
112 # Fetch/Cache the copy status and location objects
113 # --------------------------------------------------------------------
114 if(!@COPY_STATUSES) {
115 my $s = $e->retrieve_all_config_copy_status();
116 @COPY_STATUSES = @$s;
117 $s = $e->retrieve_all_asset_copy_location();
118 @COPY_LOCATIONS = @$s;
121 # Flesh the status and location
123 grep { $_->id == $copy->status } @COPY_STATUSES )
124 unless ref $copy->status;
127 grep { $_->id == $copy->location } @COPY_LOCATIONS )
128 unless ref $copy->location;
131 $e->retrieve_actor_org_unit($copy->circ_lib))
132 unless ref $copy->circ_lib;
134 $ctx->{volume} = $e->retrieve_asset_call_number(
135 $ctx->{copy}->call_number) or return $e->event;
137 $ctx->{title} = $e->retrieve_biblio_record_entry(
138 $ctx->{volume}->record) or return $e->event;
140 if(!$ctx->{titleDescriptor}) {
141 $ctx->{titleDescriptor} = $e->search_metabib_record_descriptor(
142 { record => $ctx->{title}->id }) or return $e->event;
144 $ctx->{titleDescriptor} = $ctx->{titleDescriptor}->[0];
147 #insert_copy_method();
154 sub fetch_user_data {
157 if(!$ctx->{patron}) {
159 if( $ctx->{patron_id} ) {
160 $ctx->{patron} = $e->retrieve_actor_user($ctx->{patron_id});
162 } elsif( $ctx->{patron_barcode} ) {
164 my $card = $e->search_actor_card(
165 { barcode => $ctx->{patron_barcode} } ) or return $e->event;
167 $ctx->{patron} = $e->search_actor_user(
168 { card => $card->[0]->id }) or return $e->event;
169 $ctx->{patron} = $ctx->{patron}->[0];
173 return undef unless my $patron = $ctx->{patron};
176 $e->retrieve_actor_org_unit($patron->home_ou) )
177 unless ref $patron->home_ou;
179 $patron->home_ou->ou_type(
180 $patron->home_ou->ou_type->id)
181 if ref $patron->home_ou->ou_type;
184 $GROUP_TREE = $e->search_permission_grp_tree(
189 flesh_fields => { pgt => ['children'] }
194 flatten_groups($GROUP_TREE);
197 $patron->profile( $GROUP_SET{$patron->profile} )
198 unless ref $patron->profile;
200 $patron->card($e->retrieve_actor_card($patron->card));
202 $ctx->{requestor} = $ctx->{requestor} || $e->requestor;
204 # this could alter the requestor object within the editor..
205 #if( my $req = $ctx->{requestor} ) {
206 # $req->home_ou( $e->retrieve_actor_org_unit($requestor->home_ou) );
207 # $req->ws_ou( $e->retrieve_actor_org_unit($requestor->ws_ou) );
210 if( $ctx->{fetch_patron_circ_info} ) {
213 OpenILS::Application::Actor::_checked_out(1, $e, $patron->id);
215 $ctx->{patronOverdue} = $circ_counts->{overdue} || 0;
216 $ctx->{patronItemsOut} = $ctx->{patronOverdue} + $circ_counts->{out};
219 my $fxacts = $e->search_money_open_billable_transaction_summary(
220 { usr => $patron->id, balance_owed => { ">" => 0 } });
223 $fines += $_->balance_owed for @$fxacts;
224 $ctx->{patronFines} = $fines;
226 $logger->debug("script_builder: patron fines determined to be $fines");
227 $logger->debug("script_builder: patron overdue count is " . $ctx->{patronOverdue});
236 return undef unless $tree;
237 $GROUP_SET{$tree->id} = $tree;
238 if( $tree->children ) {
239 flatten_groups($_) for @{$tree->children};
243 sub flatten_org_tree {
245 return undef unless $tree;
246 push( @ORG_LIST, $tree );
247 if( $tree->children ) {
248 flatten_org_tree($_) for @{$tree->children};
254 sub insert_org_methods {
255 my ( $editor, $ctx ) = @_;
256 my $runner = $ctx->{runner};
259 $ORG_TREE = $editor->search_actor_org_unit(
261 {"parent_ou" => undef },
264 flesh_fields => { aou => ['children'] },
265 order_by => { aou => 'name'}
269 flatten_org_tree($ORG_TREE);
272 $runner->insert(__OILS_FUNC_isOrgDescendent =>
274 my( $write_key, $sname, $id ) = @_;
275 my ($parent) = grep { $_->shortname eq $sname } @ORG_LIST;
276 my ($child) = grep { $_->id == $id } @ORG_LIST;
277 my $val = is_org_descendent( $parent, $child );
278 $runner->insert($write_key, $val);
285 sub is_org_descendent {
286 my( $parent, $child ) = @_;
287 return 0 unless $parent and $child;
289 return 1 if $parent->id == $child->id;
290 } while( ($child) = grep { $_->id == $child->parent_ou } @ORG_LIST );
296 # if( $ctx->{copy} ) {
298 # # allows a script to fetch a hold that is currently targeting the
300 # $runner->insert_method( 'environment.copy', '__OILS_FUNC_fetch_hold', sub {
302 # my $hold = $holdcode->fetch_related_holds($ctx->{copy}->id);
303 # $hold = undef unless $hold;
304 # $runner->insert( $key, $hold, 1 );