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() and
189 $patron->billing_address() == $current_id ) {
190 $new_patron->billing_address($address->id());
191 $new_patron->ischanged(1);
194 if( $patron->mailing_address() and
195 $patron->mailing_address() == $current_id ) {
196 $new_patron->mailing_address($address->id());
197 $new_patron->ischanged(1);
200 } elsif( ref($address) and $address->ischanged() ) {
201 warn "Updating address at street " . $address->street1();
202 $address->usr($new_patron->id());
203 _update_address($session,$address);
205 } elsif( ref($address) and $address->isdeleted() ) {
206 warn "Deleting address at street " . $address->street1();
208 if( $address->id() == $new_patron->mailing_address() ) {
209 $new_patron->clear_mailing_address();
210 _update_patron($session, $new_patron);
213 if( $address->id() == $new_patron->billing_address() ) {
214 $new_patron->clear_billing_address();
215 _update_patron($session, $new_patron);
218 _delete_address($session,$address);
226 # adds an address to the db and returns the address with new id
228 my($session, $address) = @_;
229 $address->clear_id();
231 # put the address into the database
232 my $req = $session->request(
233 "open-ils.storage.direct.actor.user_address.create",
237 my $id = $req->gather(1);
239 throw OpenSRF::EX::ERROR
240 ("Unable to create new user address");
243 warn "Created address with id $id\n";
245 # update all the necessary id's
251 sub _update_address {
252 my( $session, $address ) = @_;
253 my $req = $session->request(
254 "open-ils.storage.direct.actor.user_address.update",
256 my $status = $req->gather(1);
257 if(!defined($status)) {
258 throw OpenSRF::EX::ERROR
259 ("Unknown error updating address");
266 sub _add_update_cards {
270 my $new_patron = shift;
272 my $virtual_id; #id of the card before creation
273 for my $card (@{$patron->cards()}) {
275 $card->usr($new_patron->id());
277 if(ref($card) and $card->isnew()) {
279 $virtual_id = $card->id();
280 $card = _add_card($session,$card);
282 if($patron->card() == $virtual_id) {
283 $new_patron->card($card->id());
284 $new_patron->ischanged(1);
287 } elsif( ref($card) and $card->ischanged() ) {
288 $card->usr($new_patron->id());
289 _update_card($session, $card);
296 # adds an card to the db and returns the card with new id
298 my( $session, $card ) = @_;
301 warn "Adding card with barcode " . $card->barcode() . "\n";
302 my $req = $session->request(
303 "open-ils.storage.direct.actor.card.create",
306 my $id = $req->gather(1);
308 throw OpenSRF::EX::ERROR
309 ("Unknown error creating card");
313 warn "Created patron card with id $id\n";
319 my( $session, $card ) = @_;
322 my $req = $session->request(
323 "open-ils.storage.direct.actor.card.update",
325 my $status = $req->gather(1);
326 if(!defined($status)) {
327 throw OpenSRF::EX::ERROR
328 ("Unknown error updating card");
336 sub _delete_address {
337 my( $session, $address ) = @_;
339 warn "Deleting address " . $address->street1() . "\n";
341 my $req = $session->request(
342 "open-ils.storage.direct.actor.user_address.delete",
344 my $status = $req->gather(1);
345 if(!defined($status)) {
346 throw OpenSRF::EX::ERROR
347 ("Unknown error updating address");
349 warn "Delete address status is $status\n";
355 __PACKAGE__->register_method(
356 method => "search_username",
357 api_name => "open-ils.actor.user.search.username",
360 sub search_username {
361 my($self, $client, $username) = @_;
362 my $users = OpenILS::Application::AppUtils->simple_scalar_request(
364 "open-ils.storage.direct.actor.user.search.usrname",
370 __PACKAGE__->register_method(
371 method => "user_retrieve_by_barcode",
372 api_name => "open-ils.actor.user.fleshed.retrieve_by_barcode",
375 sub user_retrieve_by_barcode {
376 my($self, $client, $barcode) = @_;
377 warn "Searching for user with barcode $barcode\n";
379 my $session = OpenSRF::AppSession->create("open-ils.storage");
381 # find the card with the given barcode
382 my $creq = $session->request(
383 "open-ils.storage.direct.actor.card.search.barcode",
385 my $card = $creq->gather(1);
387 my $user = flesh_user($card->usr(), $session);
388 $session->disconnect();
396 __PACKAGE__->register_method(
397 method => "get_org_types",
398 api_name => "open-ils.actor.org_types.retrieve",
402 my($self, $client) = @_;
404 return $org_types if $org_types;
406 $apputils->simple_scalar_request(
408 "open-ils.storage.direct.actor.org_unit_type.retrieve.all.atomic" );
412 __PACKAGE__->register_method(
413 method => "get_user_profiles",
414 api_name => "open-ils.actor.user.profiles.retrieve",
418 sub get_user_profiles {
419 return $user_profiles if $user_profiles;
421 return $user_profiles =
422 $apputils->simple_scalar_request(
424 "open-ils.storage.direct.actor.profile.retrieve.all.atomic");
429 __PACKAGE__->register_method(
430 method => "get_user_ident_types",
431 api_name => "open-ils.actor.user.ident_types.retrieve",
434 sub get_user_ident_types {
435 return $ident_types if $ident_types;
436 return $ident_types =
437 $apputils->simple_scalar_request(
439 "open-ils.storage.direct.config.identification_type.retrieve.all.atomic" );
445 __PACKAGE__->register_method(
446 method => "get_org_unit",
447 api_name => "open-ils.actor.org_unit.retrieve",
452 my( $self, $client, $user_session ) = @_;
455 OpenILS::Application::AppUtils->check_user_session( $user_session ); #throws EX on error
457 my $home_ou = OpenILS::Application::AppUtils->simple_scalar_request(
459 "open-ils.storage.direct.actor.org_unit.retrieve",
460 $user_obj->home_ou );
468 __PACKAGE__->register_method(
469 method => "get_org_tree",
470 api_name => "open-ils.actor.org_tree.retrieve",
472 note => "Returns the entire org tree structure",
476 my( $self, $client) = @_;
478 # see if it's in the cache
479 warn "Getting ORG Tree\n";
480 my $tree = $cache_client->get_cache('orgtree');
482 warn "Found orgtree in cache. returning...\n";
486 my $orglist = $apputils->simple_scalar_request(
488 "open-ils.storage.direct.actor.org_unit.retrieve.all.atomic" );
490 $tree = $self->build_org_tree($orglist);
491 $cache_client->put_cache('orgtree', $tree);
497 # turns an org list into an org tree
500 my( $self, $orglist) = @_;
502 return $orglist unless (
503 ref($orglist) and @$orglist > 1 );
506 $a->ou_type <=> $b->ou_type ||
507 $a->name cmp $b->name } @$orglist;
509 for my $org (@list) {
511 next unless ($org and defined($org->parent_ou));
512 my ($parent) = grep { $_->id == $org->parent_ou } @list;
515 $parent->children([]) unless defined($parent->children);
516 push( @{$parent->children}, $org );
524 __PACKAGE__->register_method(
525 method => "get_org_descendants",
526 api_name => "open-ils.actor.org_tree.descendants.retrieve"
529 # depth is optional. org_unit is the id
530 sub get_org_descendants {
531 my( $self, $client, $org_unit, $depth ) = @_;
532 my $orglist = $apputils->simple_scalar_request(
534 "open-ils.storage.actor.org_unit.descendants.atomic",
536 return $self->build_org_tree($orglist);
540 __PACKAGE__->register_method(
541 method => "get_org_ancestors",
542 api_name => "open-ils.actor.org_tree.ancestors.retrieve"
545 # depth is optional. org_unit is the id
546 sub get_org_ancestors {
547 my( $self, $client, $org_unit, $depth ) = @_;
548 my $orglist = $apputils->simple_scalar_request(
550 "open-ils.storage.actor.org_unit.ancestors.atomic",
552 return $self->build_org_tree($orglist);
556 __PACKAGE__->register_method(
557 method => "get_standings",
558 api_name => "open-ils.actor.standings.retrieve"
563 return $user_standings if $user_standings;
564 return $user_standings =
565 $apputils->simple_scalar_request(
567 "open-ils.storage.direct.config.standing.retrieve.all.atomic" );
572 __PACKAGE__->register_method(
573 method => "get_my_org_path",
574 api_name => "open-ils.actor.org_unit.full_path.retrieve"
577 sub get_my_org_path {
578 my( $self, $client, $user_session, $org_id ) = @_;
579 my $user_obj = $apputils->check_user_session($user_session);
580 if(!defined($org_id)) { $org_id = $user_obj->home_ou; }
582 return $apputils->simple_scalar_request(
584 "open-ils.storage.actor.org_unit.full_path.atomic",
589 __PACKAGE__->register_method(
590 method => "patron_adv_search",
591 api_name => "open-ils.actor.patron.search.advanced" );
593 sub patron_adv_search {
594 my( $self, $client, $staff_login, $search_hash ) = @_;
597 warn "patron adv with $staff_login and search " .
598 Dumper($search_hash) . "\n";
616 some old methods that may be good to keep around for now
619 my( $session, $card ) = @_;
621 warn "Deleting card with barcode " . $card->barcode() . "\n";
622 my $req = $session->request(
623 "open-ils.storage.direct.actor.card.delete",
625 my $status = $req->gather(1);
626 if(!defined($status)) {
627 throw OpenSRF::EX::ERROR
628 ("Unknown error updating card");
634 # deletes the patron and any attached addresses and cards
635 __PACKAGE__->register_method(
636 method => "delete_patron",
637 api_name => "open-ils.actor.patron.delete",
642 my( $self, $client, $patron ) = @_;
643 my $session = $apputils->start_db_session();
648 $patron->clear_mailing_address();
649 $patron->clear_billing_address();
650 $patron->ischanged(1);
652 _update_patron($session, $patron);
653 _delete_address($session,$_) for (@{$patron->addresses()});
654 _delete_card($session,$_) for (@{$patron->cards()});
655 _delete_patron($session,$patron);
656 $apputils->commit_db_session($session);
660 $err = "-*- Failure deleting user: $e";
661 $apputils->rollback_db_session($session);
665 if($err) { throw OpenSRF::EX::ERROR ($err); }
666 warn "Patron Delete complete\n";
671 my( $session, $patron ) = @_;
673 warn "Deleting patron " . $patron->usrname() . "\n";
675 my $req = $session->request(
676 "open-ils.storage.direct.actor.user.delete",
678 my $status = $req->gather(1);
679 if(!defined($status)) {
680 throw OpenSRF::EX::ERROR
681 ("Unknown error updating patron");