1 package OpenILS::Application::Circ::Survey;
2 use base qw/OpenSRF::Application/;
3 use strict; use warnings;
4 use OpenSRF::EX qw/:try/;
5 use OpenILS::Application::AppUtils;
7 use Time::HiRes qw(time);
9 my $apputils = "OpenILS::Application::AppUtils";
11 #open-ils.storage.direct.action.survey.search.*
16 # - creates a new survey
17 # expects a survey complete with questions and answers
19 __PACKAGE__->register_method(
20 method => "add_survey",
21 api_name => "open-ils.circ.survey.create");
24 my( $self, $client, $user_session, $survey ) = @_;
26 my $user_obj = $apputils->check_user_session($user_session);
27 my $session = $apputils->start_db_session();
28 my $err = undef; my $id;
30 warn "Creating new survey\n" . Dumper($survey) . "\n";
35 $survey = _add_survey($session, $survey);
36 _add_questions($session, $survey);
37 $apputils->commit_db_session($session);
41 $err = "Error creating survey: $e\n";
42 $apputils->rollback_db_session($session);
45 if($err) { throw OpenSRF::EX::ERROR ($err); }
47 # re-retrieve the survey from the db and return it
48 return $self->get_fleshed_survey( $client, $survey->id() );
53 my($session, $survey) = @_;
54 my $req = $session->request(
55 "open-ils.storage.direct.action.survey.create",
58 my $id = $req->gather(1);
61 throw OpenSRF::EX::ERROR
62 ("Unable to create new survey " . $survey->name());
65 warn "Created new survey with id $id\n";
71 my($session, $survey) = @_;
75 my($session, $survey) = @_;
77 # create new questions in the db
78 if( $survey->questions() ) {
79 for my $question (@{$survey->questions()}){
81 $question->survey($survey->id());
82 my $virtual_id = $question->id();
83 $question->clear_id();
86 warn "Creating new question: " . $question->question() . "\n";
87 warn Dumper $question;
89 my $req = $session->request(
90 'open-ils.storage.direct.action.survey_question.create',
92 my $new_id = $req->gather(1);
95 throw OpenSRF::EX::ERROR
96 ("Error creating new survey question " . $question->question() . "\n")
99 warn "added new question with id $new_id\n";
101 # now update the responses to this question
102 if($question->answers()) {
103 for my $answer (@{$question->answers()}) {
104 $answer->question($new_id);
105 _add_answer($session,$answer);
114 my($session, $answer) = @_;
115 warn "Adding answer " . $answer->answer() . "\n";
117 my $req = $session->request(
118 "open-ils.storage.direct.action.survey_answer.create",
120 my $id = $req->gather(1);
122 throw OpenSRF::EX::ERROR
123 ("Error creating survey answer " . $answer->answer() );
126 warn "Added new answer with id $id\n";
131 # retrieve surveys for a specific org subtree.
132 __PACKAGE__->register_method(
133 method => "get_required_surveys",
134 api_name => "open-ils.circ.survey.retrieve.required");
136 sub get_required_surveys {
137 my( $self, $client, $user_session ) = @_;
139 warn "Retrieving required surveys\n";
141 my $user_obj = $apputils->check_user_session($user_session);
142 my $surveys = $apputils->simple_scalar_request(
144 "open-ils.storage.action.survey.required.atomic",
145 $user_obj->home_ou() );
148 warn "Retrieved " . scalar(@$surveys)." required surveys\n";
152 for my $survey (@$surveys) {
153 push(@fleshed, $self->get_fleshed_survey($client, $survey));
159 __PACKAGE__->register_method(
160 method => "get_survey_responses",
161 api_name => "open-ils.circ.survey.response.retrieve");
163 sub get_survey_responses {
164 my( $self, $client, $user_session, $survey_id, $user_id ) = @_;
166 warn "retrieing responses $user_session $survey_id $user_id\n";
168 my $user_obj = $apputils->check_user_session($user_session);
169 $user_id = $user_obj->id;
172 my $res = $apputils->simple_scalar_request(
174 "open-ils.storage.direct.action.survey_response.search.atomic",
175 { usr => $user_id, survey => $survey_id } );
177 warn "Surveys: " . Dumper($res);
179 if( $res && ref($res) and $res->[0]) {
180 return [ sort { $a->id() <=> $b->id() } @$res ];
186 __PACKAGE__->register_method(
187 method => "get_all_surveys",
188 api_name => "open-ils.circ.survey.retrieve.all");
190 sub get_all_surveys {
191 my( $self, $client, $user_session ) = @_;
193 my $user_obj = $apputils->check_user_session($user_session);
194 my $surveys = $apputils->simple_scalar_request(
196 "open-ils.storage.action.survey.all.atomic",
197 $user_obj->home_ou() );
200 for my $survey (@$surveys) {
201 push(@fleshed, $self->get_fleshed_survey($client, $survey));
209 __PACKAGE__->register_method(
210 method => "get_fleshed_survey",
211 api_name => "open-ils.circ.survey.fleshed.retrieve");
213 sub get_fleshed_survey {
214 my( $self, $client, $survey_id ) = @_;
216 my $session = OpenSRF::AppSession->create("open-ils.storage");
218 warn "Searching for survey $survey_id\n";
221 if( ref($survey_id) and
222 (ref($survey_id) =~ /^Fieldmapper/)) {
223 $survey = $survey_id;
227 my $sreq = $session->request(
228 "open-ils.storage.direct.action.survey.retrieve",
230 $survey = $sreq->gather(1);
231 if(! $survey) { return undef; }
234 $survey->questions([]);
237 warn "Grabbing survey questions\n";
238 my $qreq = $session->request(
239 "open-ils.storage.direct.action.survey_question.search.survey",
242 my $questions = $qreq->gather(1);
246 for my $question (@$questions) {
248 # add this question to the survey
249 push( @{$survey->questions()}, $question );
251 warn "Grabbing question answers\n";
253 my $ans_req = $session->request(
254 "open-ils.storage.direct.action.survey_answer.search.question",
257 # add this array of answers to this question
258 $question->answers( $ans_req->gather(1) );
263 $session->disconnect();
270 __PACKAGE__->register_method(
271 method => "submit_survey",
272 api_name => "open-ils.circ.survey.submit.session");
274 __PACKAGE__->register_method(
275 method => "submit_survey",
276 api_name => "open-ils.circ.survey.submit.user_id");
278 __PACKAGE__->register_method(
279 method => "submit_survey",
280 api_name => "open-ils.circ.survey.submit.anon");
284 my( $self, $client, $responses ) = @_;
287 throw OpenSRF::EX::ERROR
288 ("No survey object sent in update");
292 warn "Submitting survey " . Dumper($responses) . "\n";
294 if(!ref($responses)) { $responses = [$responses]; }
296 my $session = $apputils->start_db_session();
298 my $group_id = $session->request(
299 "open-ils.storage.action.survey_response.next_group_id")->gather(1);
302 for my $res (@$responses) {
306 if($self->api_name =~ /session/) {
307 if( ! ($id = $already_seen{$res->usr}) ) {
308 my $user_obj = $apputils->check_user_session($res->usr);
310 $already_seen{$res->usr} = $id;
313 } elsif( $self->api_name =~ /anon/ ) {
317 warn "Submitting response with question " .
318 $res->question . " and group $group_id \n";
320 $res->response_group_id($group_id);
321 my $req = $session->request(
322 "open-ils.storage.direct.action.survey_response.create",
324 my $newid = $req->gather(1);
325 warn "New response id: $newid\n";
328 throw OpenSRF::EX::ERROR
329 ("Error creating new survey response");
333 $apputils->commit_db_session($session);
334 warn "survey response update completed\n";
340 __PACKAGE__->register_method(
341 method => "get_random_survey",
342 api_name => "open-ils.circ.survey.retrieve.opac.random");
344 sub get_random_survey {
345 my( $self, $client, $user_session ) = @_;
347 warn "retrieving random survey\n";
348 my $user_obj = $apputils->check_user_session($user_session);
349 my $surveys = $apputils->simple_scalar_request(
351 "open-ils.storage.action.survey.opac.atomic",
352 $user_obj->home_ou() );
354 my $random = int(rand(scalar(@$surveys)));
355 warn "Random survey index for process $$ is $random\n";
356 my $surv = $surveys->[$random];
358 return $self->get_fleshed_survey($client, $surv);
362 __PACKAGE__->register_method(
363 method => "get_random_survey_global",
364 api_name => "open-ils.circ.survey.retrieve.opac.random.global");
366 sub get_random_survey_global {
367 my( $self, $client ) = @_;
369 warn "retrieving random global survey\n";
370 my $surveys = $apputils->simple_scalar_request(
372 "open-ils.storage.direct.action.survey.search.atomic",
373 # XXX grab the org tree to get the root id...
374 { owner => 1, opac => 't' } );
376 my $random = int(rand(scalar(@$surveys)));
377 warn "Random survey index for process $$ is $random\n";
378 my $surv = $surveys->[$random];
380 return $self->get_fleshed_survey($client, $surv);