1 package OpenILS::Application::Circ::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;
9 my $apputils = "OpenILS::Application::AppUtils";
10 sub _d { warn "Patron:\n" . Dumper(shift()); }
13 __PACKAGE__->register_method(
14 method => "update_patron",
15 api_name => "open-ils.circ.patron.create",
18 __PACKAGE__->register_method(
19 method => "update_patron",
20 api_name => "open-ils.circ.patron.update",
25 my( $self, $client, $patron ) = @_;
27 my $session = $apputils->start_db_session();
28 my $new_patron = _clone_patron($patron);
34 # create/update the patron first so we can use his id
35 $new_patron = _add_update_patron($patron, $new_patron, $session);
36 $new_patron = _add_update_addresses($patron, $new_patron, $session);
38 $new_patron = _add_update_cards($patron, $new_patron, $session);
40 $apputils->commit_db_session($session);
44 warn " -*- Failure adding user: \n$e\n";
45 $apputils->rollback_db_session($session);
48 warn "Patron Update/Create complete\n";
54 # clone and clear stuff that would break the database
58 my $new_patron = Fieldmapper::actor::user->new();
60 my $fmap = $Fieldmapper::fieldmap;
61 no strict; # shallow clone, may be useful in the fieldmapper
63 (keys %{$fmap->{"Fieldmapper::actor::user"}->{'fields'}}) {
64 $new_patron->$field( $patron->$field() );
69 $new_patron->clear_billing_address();
70 $new_patron->clear_mailing_address();
71 $new_patron->clear_addresses();
72 $new_patron->clear_card();
73 $new_patron->clear_cards();
74 $new_patron->clear_id();
80 sub _add_update_patron {
82 my $new_patron = shift;
85 if($patron->isnew()) {
86 warn Dumper $new_patron;
87 my $req = $session->request(
88 "open-ils.storage.direct.actor.user.create",$new_patron);
89 my $id = $req->gather(1);
90 if(!$id) { throw OpenSRF::EX::ERROR ("Unable to create new user"); }
91 warn "Created new patron with id $id\n";
94 } elsif( $patron->ischanged() ) {
101 sub _add_update_addresses {
103 my $new_patron = shift;
107 #my @addresses = @{$patron->addresses()};
108 #$patron->addresses([]);
112 for my $address (@{$patron->addresses()}) {
113 next if ( grep { $_->street1() eq
114 $address->street1() } @complete );
116 $address->usr($new_patron->id());
118 if(ref($address) and $address->isnew()) {
119 warn "Adding new address at street " . $address->street1();
121 $current_id = $address->id();
122 $address->clear_id();
124 warn "Adding new address: " . Dumper($address);
125 warn "User id: " . $address->usr() . "\n";
127 # put the address into the database
128 my $req = $session->request(
129 "open-ils.storage.direct.actor.org_address.create",
133 my $id = $req->gather(1);
134 if(!$id) { throw OpenSRF::EX::ERROR ("Unable to create new user address"); }
136 warn "Created address with id $id\n";
138 # update all the necessary id's
140 if( $patron->billing_address() ) {
141 if( $patron->billing_address->id() == $current_id ) {
142 $new_patron->billing_address($id);
145 #patron has not billing address
148 if( ref($patron->mailing_address()) ) {
149 if( $patron->mailing_address()->id() == $current_id ) {
150 $new_patron->mailing_address($id);
153 # patron does not have a billing address
156 } elsif( ref($address) and $address->ischanged() ) {
157 warn "Updating address at street " . $address->street1();
166 sub _add_update_cards {
170 for my $card (@{$patron->cards()}) {
172 if(ref($card) and $card->isnew()) {
174 } elsif( ref($card) and $card->ischanged() ) {