1 package OpenILS::Application::Actor;
2 use base qw/OpenSRF::Application/;
3 use strict; use warnings;
5 use OpenSRF::EX qw(:try);
6 use OpenILS::Application::AppUtils;
7 use OpenILS::Utils::Fieldmapper;
8 use OpenILS::Application::Search::Actor;
10 my $apputils = "OpenILS::Application::AppUtils";
11 sub _d { warn "Patron:\n" . Dumper(shift()); }
12 my $cache_client = OpenSRF::Utils::Cache->new( "global", 0 );
15 __PACKAGE__->register_method(
16 method => "update_patron",
17 api_name => "open-ils.actor.patron.update",
22 my( $self, $client, $user_session, $patron ) = @_;
24 my $session = $apputils->start_db_session();
27 warn $user_session . " " . $patron . "\n";
31 OpenILS::Application::AppUtils->check_user_session(
32 $user_session ); #throws EX on error
34 # XXX does this user have permission to add/create users. Granularity?
36 # $new_patron is the patron in progress. $patron is the original patron
37 # passed in with the method. new_patron will change as the components
38 # of patron are added/updated.
43 # create/update the patron first so we can use his id
44 if( $patron->isnew() ) {
45 $new_patron = _add_patron(
46 $session, _clone_patron($patron));
48 $new_patron = $patron;
51 $new_patron = _add_update_addresses($session, $patron, $new_patron);
52 $new_patron = _add_update_cards($session, $patron, $new_patron);
54 # re-update the patron if anything has happened to him during this process
55 if($new_patron->ischanged()) {
56 $new_patron = _update_patron($session, $new_patron);
58 $apputils->commit_db_session($session);
62 $err = "-*- Failure adding user: $e";
63 $apputils->rollback_db_session($session);
67 if($err) { throw OpenSRF::EX::ERROR ($err); }
68 warn "Patron Update/Create complete\n";
69 return flesh_user($new_patron->id());
79 $session = OpenSRF::AppSession->create("open-ils.storage");
83 # grab the user with the given card
84 my $ureq = $session->request(
85 "open-ils.storage.direct.actor.user.retrieve",
87 my $user = $ureq->gather(1);
90 my $cards_req = $session->request(
91 "open-ils.storage.direct.actor.card.search.usr",
93 $user->cards( $cards_req->gather(1) );
95 my $add_req = $session->request(
96 "open-ils.storage.direct.actor.user_address.search.usr",
98 $user->addresses( $add_req->gather(1) );
100 if($kill) { $session->disconnect(); }
101 $user->clear_passwd();
109 # clone and clear stuff that would break the database
113 my $new_patron = Fieldmapper::actor::user->new();
115 my $fmap = $Fieldmapper::fieldmap;
116 no strict; # shallow clone, may be useful in the fieldmapper
118 (keys %{$fmap->{"Fieldmapper::actor::user"}->{'fields'}}) {
119 $new_patron->$field( $patron->$field() );
124 $new_patron->clear_billing_address();
125 $new_patron->clear_mailing_address();
126 $new_patron->clear_addresses();
127 $new_patron->clear_card();
128 $new_patron->clear_cards();
129 $new_patron->clear_id();
130 $new_patron->clear_isnew();
131 $new_patron->clear_changed();
132 $new_patron->clear_deleted();
142 warn "Creating new patron\n";
145 my $req = $session->request(
146 "open-ils.storage.direct.actor.user.create",$patron);
147 my $id = $req->gather(1);
148 if(!$id) { throw OpenSRF::EX::ERROR ("Unable to create new user"); }
149 warn "Created new patron with id $id\n";
157 my( $session, $patron) = @_;
159 warn "updating patron " . $patron->usrname() . "\n";
160 my $req = $session->request(
161 "open-ils.storage.direct.actor.user.update",$patron );
162 my $status = $req->gather(1);
163 if(!defined($status)) {
164 throw OpenSRF::EX::ERROR
165 ("Unknown error updating patron");
171 sub _add_update_addresses {
174 my $new_patron = shift;
176 my $current_id; # id of the address before creation
178 for my $address (@{$patron->addresses()}) {
180 $address->usr($new_patron->id());
182 if(ref($address) and $address->isnew()) {
183 warn "Adding new address at street " . $address->street1() . "\n";
185 $current_id = $address->id();
186 $address = _add_address($session,$address);
188 if( $patron->billing_address() == $current_id ) {
189 $new_patron->billing_address($address->id());
190 $new_patron->ischanged(1);
193 if( $patron->mailing_address() == $current_id ) {
194 $new_patron->mailing_address($address->id());
195 $new_patron->ischanged(1);
198 } elsif( ref($address) and $address->ischanged() ) {
199 warn "Updating address at street " . $address->street1();
200 $address->usr($new_patron->id());
201 _update_address($session,$address);
203 } elsif( ref($address) and $address->isdeleted() ) {
204 warn "Deleting address at street " . $address->street1();
206 if( $address->id() == $new_patron->mailing_address() ) {
207 $new_patron->clear_mailing_address();
208 _update_patron($session, $new_patron);
211 if( $address->id() == $new_patron->billing_address() ) {
212 $new_patron->clear_billing_address();
213 _update_patron($session, $new_patron);
216 _delete_address($session,$address);
224 # adds an address to the db and returns the address with new id
226 my($session, $address) = @_;
227 $address->clear_id();
229 # put the address into the database
230 my $req = $session->request(
231 "open-ils.storage.direct.actor.user_address.create",
235 my $id = $req->gather(1);
237 throw OpenSRF::EX::ERROR
238 ("Unable to create new user address");
241 warn "Created address with id $id\n";
243 # update all the necessary id's
249 sub _update_address {
250 my( $session, $address ) = @_;
251 my $req = $session->request(
252 "open-ils.storage.direct.actor.user_address.update",
254 my $status = $req->gather(1);
255 if(!defined($status)) {
256 throw OpenSRF::EX::ERROR
257 ("Unknown error updating address");
264 sub _add_update_cards {
268 my $new_patron = shift;
270 my $virtual_id; #id of the card before creation
271 for my $card (@{$patron->cards()}) {
273 $card->usr($new_patron->id());
275 if(ref($card) and $card->isnew()) {
277 $virtual_id = $card->id();
278 $card = _add_card($session,$card);
280 if($patron->card() == $virtual_id) {
281 $new_patron->card($card->id());
282 $new_patron->ischanged(1);
285 } elsif( ref($card) and $card->ischanged() ) {
286 $card->usr($new_patron->id());
287 _update_card($session, $card);
294 # adds an card to the db and returns the card with new id
296 my( $session, $card ) = @_;
299 warn "Adding card with barcode " . $card->barcode() . "\n";
300 my $req = $session->request(
301 "open-ils.storage.direct.actor.card.create",
304 my $id = $req->gather(1);
306 throw OpenSRF::EX::ERROR
307 ("Unknown error creating card");
311 warn "Created patron card with id $id\n";
317 my( $session, $card ) = @_;
320 my $req = $session->request(
321 "open-ils.storage.direct.actor.card.update",
323 my $status = $req->gather(1);
324 if(!defined($status)) {
325 throw OpenSRF::EX::ERROR
326 ("Unknown error updating card");
334 sub _delete_address {
335 my( $session, $address ) = @_;
337 warn "Deleting address " . $address->street1() . "\n";
339 my $req = $session->request(
340 "open-ils.storage.direct.actor.user_address.delete",
342 my $status = $req->gather(1);
343 if(!defined($status)) {
344 throw OpenSRF::EX::ERROR
345 ("Unknown error updating address");
347 warn "Delete address status is $status\n";
353 __PACKAGE__->register_method(
354 method => "search_username",
355 api_name => "open-ils.actor.user.search.username",
358 sub search_username {
359 my($self, $client, $username) = @_;
360 my $users = OpenILS::Application::AppUtils->simple_scalar_request(
362 "open-ils.storage.direct.actor.user.search.usrname",
368 __PACKAGE__->register_method(
369 method => "user_retrieve_by_barcode",
370 api_name => "open-ils.actor.user.fleshed.retrieve_by_barcode",
373 sub user_retrieve_by_barcode {
374 my($self, $client, $barcode) = @_;
375 warn "Searching for user with barcode $barcode\n";
377 my $session = OpenSRF::AppSession->create("open-ils.storage");
379 # find the card with the given barcode
380 my $creq = $session->request(
381 "open-ils.storage.direct.actor.card.search.barcode",
383 my $card = $creq->gather(1);
385 my $user = flesh_user($card->usr(), $session);
386 $session->disconnect();
394 __PACKAGE__->register_method(
395 method => "get_org_types",
396 api_name => "open-ils.actor.org_types.retrieve",
399 my($self, $client) = @_;
401 my $org_typelist = OpenILS::Application::AppUtils->simple_scalar_request(
403 "open-ils.storage.direct.actor.org_unit_type.retrieve.all.atomic" );
405 return $org_typelist;
409 __PACKAGE__->register_method(
410 method => "get_user_profiles",
411 api_name => "open-ils.actor.user.profiles.retrieve",
415 sub get_user_profiles {
416 return $user_profiles if $user_profiles;
418 return $user_profiles =
419 $apputils->simple_scalar_request(
421 "open-ils.storage.direct.actor.profile.retrieve.all.atomic");
426 __PACKAGE__->register_method(
427 method => "get_user_ident_types",
428 api_name => "open-ils.actor.user.ident_types.retrieve",
431 sub get_user_ident_types {
432 return $ident_types if $ident_types;
433 return $ident_types =
434 $apputils->simple_scalar_request(
436 "open-ils.storage.direct.config.identification_type.retrieve.all.atomic" );
442 __PACKAGE__->register_method(
443 method => "get_org_unit",
444 api_name => "open-ils.actor.org_unit.retrieve",
449 my( $self, $client, $user_session ) = @_;
452 OpenILS::Application::AppUtils->check_user_session( $user_session ); #throws EX on error
454 my $home_ou = OpenILS::Application::AppUtils->simple_scalar_request(
456 "open-ils.storage.direct.actor.org_unit.retrieve",
457 $user_obj->home_ou );
465 __PACKAGE__->register_method(
466 method => "get_org_tree",
467 api_name => "open-ils.actor.org_tree.retrieve",
469 note => "Returns the entire org tree structure",
473 my( $self, $client) = @_;
475 # see if it's in the cache
476 warn "Getting ORG Tree\n";
477 my $tree = $cache_client->get_cache('orgtree');
479 warn "Found orgtree in cache. returning...\n";
483 my $orglist = $apputils->simple_scalar_request(
485 "open-ils.storage.direct.actor.org_unit.retrieve.all.atomic" );
487 $tree = $self->build_org_tree($orglist);
488 $cache_client->put_cache('orgtree', $tree);
494 # turns an org list into an org tree
497 my( $self, $orglist) = @_;
499 return $orglist unless (
500 ref($orglist) and @$orglist > 1 );
503 $a->ou_type <=> $b->ou_type ||
504 $a->name cmp $b->name } @$orglist;
506 for my $org (@list) {
508 next unless ($org and defined($org->parent_ou));
509 my ($parent) = grep { $_->id == $org->parent_ou } @list;
512 $parent->children([]) unless defined($parent->children);
513 push( @{$parent->children}, $org );
521 __PACKAGE__->register_method(
522 method => "get_org_descendants",
523 api_name => "open-ils.actor.org_tree.descendants.retrieve"
526 # depth is optional. org_unit is the id
527 sub get_org_descendants {
528 my( $self, $client, $org_unit, $depth ) = @_;
529 my $orglist = $apputils->simple_scalar_request(
531 "open-ils.storage.actor.org_unit.descendants.atomic",
533 return $self->build_org_tree($orglist);
537 __PACKAGE__->register_method(
538 method => "get_org_ancestors",
539 api_name => "open-ils.actor.org_tree.ancestors.retrieve"
542 # depth is optional. org_unit is the id
543 sub get_org_ancestors {
544 my( $self, $client, $org_unit, $depth ) = @_;
545 my $orglist = $apputils->simple_scalar_request(
547 "open-ils.storage.actor.org_unit.ancestors.atomic",
549 return $self->build_org_tree($orglist);
553 __PACKAGE__->register_method(
554 method => "get_standings",
555 api_name => "open-ils.actor.standings.retrieve"
560 return $user_standings if $user_standings;
561 return $user_standings =
562 $apputils->simple_scalar_request(
564 "open-ils.storage.direct.config.standing.retrieve.all.atomic" );
569 __PACKAGE__->register_method(
570 method => "get_my_org_path",
571 api_name => "open-ils.actor.org_unit.full_path.retrieve"
574 sub get_my_org_path {
575 my( $self, $client, $user_session, $org_id ) = @_;
576 my $user_obj = $apputils->check_user_session($user_session);
577 if(!defined($org_id)) { $org_id = $user_obj->home_ou; }
579 return $apputils->simple_scalar_request(
581 "open-ils.storage.actor.org_unit.full_path.atomic",
595 some old methods that may be good to keep around for now
598 my( $session, $card ) = @_;
600 warn "Deleting card with barcode " . $card->barcode() . "\n";
601 my $req = $session->request(
602 "open-ils.storage.direct.actor.card.delete",
604 my $status = $req->gather(1);
605 if(!defined($status)) {
606 throw OpenSRF::EX::ERROR
607 ("Unknown error updating card");
613 # deletes the patron and any attached addresses and cards
614 __PACKAGE__->register_method(
615 method => "delete_patron",
616 api_name => "open-ils.actor.patron.delete",
621 my( $self, $client, $patron ) = @_;
622 my $session = $apputils->start_db_session();
627 $patron->clear_mailing_address();
628 $patron->clear_billing_address();
629 $patron->ischanged(1);
631 _update_patron($session, $patron);
632 _delete_address($session,$_) for (@{$patron->addresses()});
633 _delete_card($session,$_) for (@{$patron->cards()});
634 _delete_patron($session,$patron);
635 $apputils->commit_db_session($session);
639 $err = "-*- Failure deleting user: $e";
640 $apputils->rollback_db_session($session);
644 if($err) { throw OpenSRF::EX::ERROR ($err); }
645 warn "Patron Delete complete\n";
650 my( $session, $patron ) = @_;
652 warn "Deleting patron " . $patron->usrname() . "\n";
654 my $req = $session->request(
655 "open-ils.storage.direct.actor.user.delete",
657 my $status = $req->gather(1);
658 if(!defined($status)) {
659 throw OpenSRF::EX::ERROR
660 ("Unknown error updating patron");