]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/perlmods/OpenILS/Application/Circ/Actor.pm
beginnings of the actor portion of the circ stuff
[Evergreen.git] / Open-ILS / src / perlmods / OpenILS / Application / Circ / Actor.pm
1 package OpenILS::Application::Circ::Actor;
2 use base qw/OpenSRF::Application/;
3 use strict; use warnings;
4 use Data::Dumper;
5 use OpenSRF::EX qw(:try);
6 use OpenILS::Application::AppUtils;
7 use OpenILS::Utils::Fieldmapper;
8
9 my $apputils = "OpenILS::Application::AppUtils";
10 sub _d { warn "Patron:\n" . Dumper(shift()); }
11
12
13 __PACKAGE__->register_method(
14         method  => "update_patron",
15         api_name        => "open-ils.circ.patron.create",
16 );
17
18 __PACKAGE__->register_method(
19         method  => "update_patron",
20         api_name        => "open-ils.circ.patron.update",
21 );
22
23
24 sub update_patron {
25         my( $self, $client, $patron ) = @_;
26
27         my $session = $apputils->start_db_session();
28         my $new_patron = _clone_patron($patron);
29
30         _d($new_patron);
31
32         try {
33
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);
37                 _d($new_patron);
38                 $new_patron = _add_update_cards($patron, $new_patron, $session);
39                 _d($new_patron);
40                 $apputils->commit_db_session($session);
41
42         } catch Error with { 
43                 my $e = shift;
44                 warn " -*- Failure adding user: \n$e\n";
45                 $apputils->rollback_db_session($session);
46         };
47
48         warn "Patron Update/Create complete\n";
49
50         return 1;
51 }
52
53
54 # clone and clear stuff that would break the database
55 sub _clone_patron {
56         my $patron = shift;
57
58         my $new_patron = Fieldmapper::actor::user->new();
59
60         my $fmap = $Fieldmapper::fieldmap;
61         no strict; # shallow clone, may be useful in the fieldmapper
62         for my $field 
63                 (keys %{$fmap->{"Fieldmapper::actor::user"}->{'fields'}}) {
64                         $new_patron->$field( $patron->$field() );
65         }
66         use strict;
67
68         # clear these
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();
75
76         return $new_patron;
77 }
78
79
80 sub _add_update_patron {
81         my $patron              = shift;
82         my $new_patron  = shift;
83         my $session             = shift;
84
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";
92                 $new_patron->id($id);
93
94         } elsif( $patron->ischanged() ) {
95
96         }
97         return $new_patron;
98 }
99
100
101 sub _add_update_addresses {
102         my $patron = shift;
103         my $new_patron = shift;
104         my $session = shift;
105         my @complete = ();
106
107         #my @addresses = @{$patron->addresses()};
108         #$patron->addresses([]);
109
110         my $current_id;
111
112         for my $address (@{$patron->addresses()}) {
113                 next if ( grep { $_->street1() eq 
114                                 $address->street1() } @complete );
115
116                 $address->usr($new_patron->id());
117
118                 if(ref($address) and $address->isnew()) {
119                         warn "Adding new address at street " . $address->street1();
120
121                         $current_id = $address->id();
122                         $address->clear_id();
123
124                         warn "Adding new address: " . Dumper($address);
125                         warn "User id: " . $address->usr() . "\n";
126
127                         # put the address into the database
128                         my $req = $session->request(
129                                 "open-ils.storage.direct.actor.org_address.create",
130                                 $address );
131
132                         #update the id
133                         my $id = $req->gather(1);
134                         if(!$id) { throw OpenSRF::EX::ERROR ("Unable to create new user address"); }
135
136                         warn "Created address with id $id\n";
137
138                         # update all the necessary id's
139                         $address->id( $id );
140                         if( $patron->billing_address() ) {
141                                 if( $patron->billing_address->id() == $current_id ) {
142                                         $new_patron->billing_address($id);
143                                 }
144                         } else {
145                                 #patron has not billing address
146                         }
147
148                         if( ref($patron->mailing_address()) ) {
149                                 if( $patron->mailing_address()->id() == $current_id ) {
150                                         $new_patron->mailing_address($id);
151                                 }
152                         } else {
153                                 # patron does not have a billing address
154                         }
155
156                 } elsif( ref($address) and $address->ischanged() ) {
157                         warn "Updating address at street " . $address->street1();
158                 }
159         }
160
161         return $new_patron;
162 }
163
164
165
166 sub _add_update_cards {
167         my $patron = shift;
168         my $session = shift;
169
170         for my $card (@{$patron->cards()}) {
171
172                 if(ref($card) and $card->isnew()) {
173                         # create the card
174                 } elsif( ref($card) and $card->ischanged() ) {
175                         #update the card
176                 }
177         }
178         return $patron;
179 }
180
181
182 1;