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",
413 sub get_user_profiles {
414 return OpenILS::Application::AppUtils->simple_scalar_request(
416 "open-ils.storage.direct.actor.profile.retrieve.all.atomic",
422 __PACKAGE__->register_method(
423 method => "get_user_ident_types",
424 api_name => "open-ils.actor.user.ident_types.retrieve",
426 sub get_user_ident_types {
427 return OpenILS::Application::AppUtils->simple_scalar_request(
429 "open-ils.storage.direct.config.identification_type.retrieve.all.atomic" );
435 __PACKAGE__->register_method(
436 method => "get_org_unit",
437 api_name => "open-ils.actor.org_unit.retrieve",
442 my( $self, $client, $user_session ) = @_;
445 OpenILS::Application::AppUtils->check_user_session( $user_session ); #throws EX on error
447 my $home_ou = OpenILS::Application::AppUtils->simple_scalar_request(
449 "open-ils.storage.direct.actor.org_unit.retrieve",
450 $user_obj->home_ou );
458 __PACKAGE__->register_method(
459 method => "get_org_tree",
460 api_name => "open-ils.actor.org_tree.retrieve",
462 note => "Returns the entire org tree structure",
466 my( $self, $client) = @_;
468 # see if it's in the cache
469 warn "Getting ORG Tree\n";
470 my $tree = $cache_client->get_cache('orgtree');
472 warn "Found orgtree in cache. returning...\n";
476 my $orglist = $apputils->simple_scalar_request(
478 "open-ils.storage.direct.actor.org_unit.retrieve.all.atomic" );
480 $tree = $self->build_org_tree($orglist);
481 $cache_client->put_cache('orgtree', $tree);
487 # turns an org list into an org tree
490 my( $self, $orglist) = @_;
492 return $orglist unless (
493 ref($orglist) and @$orglist > 1 );
496 $a->ou_type <=> $b->ou_type ||
497 $a->name cmp $b->name } @$orglist;
499 for my $org (@list) {
501 next unless ($org and defined($org->parent_ou));
502 my ($parent) = grep { $_->id == $org->parent_ou } @list;
505 $parent->children([]) unless defined($parent->children);
506 push( @{$parent->children}, $org );
514 __PACKAGE__->register_method(
515 method => "get_org_descendants",
516 api_name => "open-ils.actor.org_tree.descendants.retrieve"
519 # depth is optional. org_unit is the id
520 sub get_org_descendants {
521 my( $self, $client, $org_unit, $depth ) = @_;
522 my $orglist = $apputils->simple_scalar_request(
524 "open-ils.storage.actor.org_unit.descendants.atomic",
526 return $self->build_org_tree($orglist);
530 __PACKAGE__->register_method(
531 method => "get_org_ancestors",
532 api_name => "open-ils.actor.org_tree.ancestors.retrieve"
535 # depth is optional. org_unit is the id
536 sub get_org_ancestors {
537 my( $self, $client, $org_unit, $depth ) = @_;
538 my $orglist = $apputils->simple_scalar_request(
540 "open-ils.storage.actor.org_unit.ancestors.atomic",
542 return $self->build_org_tree($orglist);
546 __PACKAGE__->register_method(
547 method => "get_standings",
548 api_name => "open-ils.actor.standings.retrieve"
552 return $apputils->simple_scalar_request(
554 "open-ils.storage.direct.config.standing.retrieve.all.atomic" );
559 __PACKAGE__->register_method(
560 method => "get_my_org_path",
561 api_name => "open-ils.actor.org_unit.full_path.retrieve"
564 sub get_my_org_path {
565 my( $self, $client, $user_session, $org_id ) = @_;
566 my $user_obj = $apputils->check_user_session($user_session);
567 if(!defined($org_id)) { $org_id = $user_obj->home_ou; }
569 return $apputils->simple_scalar_request(
571 "open-ils.storage.actor.org_unit.full_path.atomic",
585 some old methods that may be good to keep around for now
588 my( $session, $card ) = @_;
590 warn "Deleting card with barcode " . $card->barcode() . "\n";
591 my $req = $session->request(
592 "open-ils.storage.direct.actor.card.delete",
594 my $status = $req->gather(1);
595 if(!defined($status)) {
596 throw OpenSRF::EX::ERROR
597 ("Unknown error updating card");
603 # deletes the patron and any attached addresses and cards
604 __PACKAGE__->register_method(
605 method => "delete_patron",
606 api_name => "open-ils.actor.patron.delete",
611 my( $self, $client, $patron ) = @_;
612 my $session = $apputils->start_db_session();
617 $patron->clear_mailing_address();
618 $patron->clear_billing_address();
619 $patron->ischanged(1);
621 _update_patron($session, $patron);
622 _delete_address($session,$_) for (@{$patron->addresses()});
623 _delete_card($session,$_) for (@{$patron->cards()});
624 _delete_patron($session,$patron);
625 $apputils->commit_db_session($session);
629 $err = "-*- Failure deleting user: $e";
630 $apputils->rollback_db_session($session);
634 if($err) { throw OpenSRF::EX::ERROR ($err); }
635 warn "Patron Delete complete\n";
640 my( $session, $patron ) = @_;
642 warn "Deleting patron " . $patron->usrname() . "\n";
644 my $req = $session->request(
645 "open-ils.storage.direct.actor.user.delete",
647 my $status = $req->gather(1);
648 if(!defined($status)) {
649 throw OpenSRF::EX::ERROR
650 ("Unknown error updating patron");