]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/Stage.pm
ff608791c86cc451d73190fbba09628457694c80
[working/Evergreen.git] / Open-ILS / src / perlmods / lib / OpenILS / Application / Actor / Stage.pm
1 package OpenILS::Application::Actor::Stage;
2 use strict; use warnings;
3 use base 'OpenILS::Application';
4 use OpenILS::Application::AppUtils;
5 use OpenILS::Utils::CStoreEditor q/:funcs/;
6 use OpenSRF::Utils::Logger q/$logger/;
7 use OpenILS::Utils::Fieldmapper;
8 my $U = "OpenILS::Application::AppUtils";
9
10
11 __PACKAGE__->register_method (
12     method      => 'create_user_stage',
13     api_name    => 'open-ils.actor.user.stage.create',
14     signature => {
15         desc => q/
16             Creates a new pending user account including addresses and statcats.
17             Users are added to staging tables pending staff review.
18         /,
19         params => [
20             {desc => 'user', type => 'object', class => 'stgu'},
21             {desc => 'Mailing address.  Optional', type => 'object', class => 'stgma'},
22             {desc => 'Billing address.  Optional', type => 'object', class => 'stgba'},
23             {desc => 'Statcats.  Optional.  This is an array of "stgsc" objects', type => 'array'},
24         ],
25         return => {
26             desc => 'username on success, Event on error',
27             type => ''
28         }
29
30     }
31 );
32
33 sub create_user_stage {
34     my($self, $conn, $user, $mail_addr, $bill_addr, $statcats) = @_; # more?
35
36     return OpenILS::Event->new('BAD_PARAMS') unless $user;
37     return 0 unless $U->ou_ancestor_setting_value($user->home_ou, 'opac.allow_pending_user');
38
39     my $e = new_editor(xact => 1);
40
41     my $uname = $U->create_uuid_string;
42     $user->usrname($uname);
43
44     $e->create_staging_user_stage($user) or return $e->die_event;
45
46     if($mail_addr) {
47         $mail_addr->usrname($uname);
48         $e->create_staging_mailing_address_stage($mail_addr) or return $e->die_event;
49     }
50
51     if($bill_addr) {
52         $bill_addr->usrname($uname);
53         $e->create_staging_billing_address_stage($bill_addr) or return $e->die_event;
54     }
55
56     if($statcats) {
57         foreach (@$statcats) {
58             $_->usrname($uname);
59             $e->create_staging_statcat_stage($_) or return $e->die_event;
60         }
61     }
62
63     $e->commit;
64     $conn->respond_complete($uname);
65
66     $U->create_events_for_hook('stgu.create', $user, $user->home_ou);
67     return undef;
68 }
69
70 __PACKAGE__->register_method (
71     method      => 'user_stage_by_org',
72     api_name    => 'open-ils.actor.user.stage.retrieve.by_org',
73     stream      => 1
74 );
75
76 sub user_stage_by_org {
77     my($self, $conn, $auth, $org_id, $limit, $offset) = @_;
78
79     my $e = new_editor(authtoken => $auth);
80     return $e->event unless $e->checkauth;
81     $org_id ||= $e->requestor->ws_ou;
82     return $e->event unless $e->allowed('VIEW_USER', $org_id);
83
84     $limit ||= 100;
85     $offset ||= 0;
86
87     my $stage_ids = $e->search_staging_user_stage(
88         [
89             {   home_ou => $org_id, complete => 'f'}, 
90             {   limit => $limit, 
91                 offset => $offset, 
92                 order_by => {stgu => 'row_id'}
93             }
94         ],
95         {idlist => 1}
96     );
97
98     $conn->respond(flesh_user_stage($e, $_)) for @$stage_ids;
99     return undef;
100 }
101
102 sub flesh_user_stage {
103     my($e, $row_id) = @_;
104     my $user = $e->retrieve_staging_user_stage($row_id) or return undef;
105     return {
106         user => $user,
107         billing_addresses => $e->search_staging_billing_address_stage({usrname => $user->usrname}),
108         mailing_addresses => $e->search_staging_mailing_address_stage({usrname => $user->usrname}),
109         cards => $e->search_staging_card_stage({usrname => $user->usrname}),
110         statcats => $e->search_staging_statcat_stage({usrname => $user->usrname})
111     };
112 }
113
114
115 __PACKAGE__->register_method (
116     method      => 'user_stage_by_uname',
117     api_name    => 'open-ils.actor.user.stage.retrieve.by_username',
118 );
119
120 sub user_stage_by_uname {
121     my($self, $conn, $auth, $username) = @_;
122
123     my $e = new_editor(authtoken => $auth);
124     return $e->event unless $e->checkauth;
125
126     my $user = $e->search_staging_user_stage({
127         usrname => $username, 
128         complete => 'f'
129     })->[0] or return $e->event;
130
131     return $e->event unless $e->allowed('VIEW_USER', $user->home_ou);
132     return flesh_user_stage($e, $user->row_id);
133 }
134
135
136
137
138 __PACKAGE__->register_method (
139     method      => 'delete_user_stage', 
140     api_name    => 'open-ils.actor.user.stage.delete',
141 );
142
143 sub delete_user_stage {
144     my($self, $conn, $auth, $row_id) = @_;
145
146     my $e = new_editor(authtoken => $auth, xact => 1);
147     return $e->die_event unless $e->checkauth;
148     my $data = flesh_user_stage($e, $row_id) or return $e->die_event;
149
150     return $e->die_event unless $e->allowed('UPDATE_USER', $data->{user}->home_ou);
151
152     $e->delete_staging_user_stage($data->{user}) or return $e->die_event;
153
154     for my $addr (@{$data->{mailing_addresses}}) {
155         $e->delete_staging_mailing_address_stage($addr) or return $e->die_event;
156     }
157
158     for my $addr (@{$data->{billing_addresses}}) {
159         $e->delete_staging_billing_address_stage($addr) or return $e->die_event;
160     }
161
162     for my $card (@{$data->{cards}}) {
163         $e->delete_staging_card_stage($card) or return $e->die_event;
164     }
165
166     for my $statcat (@{$data->{statcats}}) {
167         $e->delete_staging_statcat_stage($statcat) or return $e->die_event;
168     }
169
170     $e->commit;
171     return 1;
172 }
173
174
175 1;
176