1 # ---------------------------------------------------------------
2 # Copyright (C) 2005 Georgia Public Library Service
3 # Bill Erickson <highfalutin@gmail.com>
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 # ---------------------------------------------------------------
16 package OpenILS::Application::Circ::Survey;
17 use base qw/OpenSRF::Application/;
18 use strict; use warnings;
19 use OpenSRF::EX qw/:try/;
20 use OpenILS::Application::AppUtils;
22 use Time::HiRes qw(time);
24 my $apputils = "OpenILS::Application::AppUtils";
26 # - creates a new survey
27 # expects a survey complete with questions and answers
28 __PACKAGE__->register_method(
29 method => "add_survey",
30 api_name => "open-ils.circ.survey.create");
33 my( $self, $client, $user_session, $survey ) = @_;
35 my $user_obj = $apputils->check_user_session($user_session);
36 my $session = $apputils->start_db_session();
37 my $err = undef; my $id;
39 warn "Creating new survey\n" . Dumper($survey) . "\n";
44 $survey = _add_survey($session, $survey);
45 _add_questions($session, $survey);
46 $apputils->commit_db_session($session);
50 $err = "Error creating survey: $e\n";
51 $apputils->rollback_db_session($session);
54 if($err) { throw OpenSRF::EX::ERROR ($err); }
56 # re-retrieve the survey from the db and return it
57 return $self->get_fleshed_survey( $client, $survey->id() );
62 my($session, $survey) = @_;
63 my $req = $session->request(
64 "open-ils.storage.direct.action.survey.create",
67 my $id = $req->gather(1);
70 throw OpenSRF::EX::ERROR
71 ("Unable to create new survey " . $survey->name());
74 warn "Created new survey with id $id\n";
80 my($session, $survey) = @_;
84 my($session, $survey) = @_;
86 # create new questions in the db
87 if( $survey->questions() ) {
88 for my $question (@{$survey->questions()}){
90 $question->survey($survey->id());
91 my $virtual_id = $question->id();
92 $question->clear_id();
95 warn "Creating new question: " . $question->question() . "\n";
96 warn Dumper $question;
98 my $req = $session->request(
99 'open-ils.storage.direct.action.survey_question.create',
101 my $new_id = $req->gather(1);
104 throw OpenSRF::EX::ERROR
105 ("Error creating new survey question " . $question->question() . "\n")
108 warn "added new question with id $new_id\n";
110 # now update the responses to this question
111 if($question->answers()) {
112 for my $answer (@{$question->answers()}) {
113 $answer->question($new_id);
114 _add_answer($session,$answer);
123 my($session, $answer) = @_;
124 warn "Adding answer " . $answer->answer() . "\n";
126 my $req = $session->request(
127 "open-ils.storage.direct.action.survey_answer.create",
129 my $id = $req->gather(1);
131 throw OpenSRF::EX::ERROR
132 ("Error creating survey answer " . $answer->answer() );
135 warn "Added new answer with id $id\n";
140 # retrieve surveys for a specific org subtree.
141 __PACKAGE__->register_method(
142 method => "get_required_surveys",
143 api_name => "open-ils.circ.survey.retrieve.required");
145 sub get_required_surveys {
146 my( $self, $client, $user_session ) = @_;
148 warn "Retrieving required surveys\n";
150 my $user_obj = $apputils->check_user_session($user_session);
151 my $orgid = $user_obj->ws_ou() ? $user_obj->ws_ou() : $user_obj->home_ou();
152 my $surveys = $apputils->simple_scalar_request(
154 "open-ils.storage.action.survey.required.atomic",
158 warn "Retrieved " . scalar(@$surveys)." required surveys\n";
162 for my $survey (@$surveys) {
163 push(@fleshed, $self->get_fleshed_survey($client, $survey));
169 __PACKAGE__->register_method(
170 method => "get_survey_responses",
171 api_name => "open-ils.circ.survey.response.retrieve");
173 sub get_survey_responses {
174 my( $self, $client, $user_session, $survey_id, $user_id ) = @_;
176 warn "retrieing responses $user_session $survey_id $user_id\n";
178 my $user_obj = $apputils->check_user_session($user_session);
179 $user_id = $user_obj->id;
182 my $res = $apputils->simple_scalar_request(
184 "open-ils.storage.direct.action.survey_response.search.atomic",
185 { usr => $user_id, survey => $survey_id } );
187 warn "Surveys: " . Dumper($res);
189 if( $res && ref($res) and $res->[0]) {
190 return [ sort { $a->id() <=> $b->id() } @$res ];
196 __PACKAGE__->register_method(
197 method => "get_all_surveys",
198 api_name => "open-ils.circ.survey.retrieve.all");
200 sub get_all_surveys {
201 my( $self, $client, $user_session ) = @_;
203 my $user_obj = $apputils->check_user_session($user_session);
204 my $orgid = $user_obj->ws_ou() ? $user_obj->ws_ou() : $user_obj->home_ou();
205 my $surveys = $apputils->simple_scalar_request(
207 "open-ils.storage.action.survey.all.atomic",
211 for my $survey (@$surveys) {
212 push(@fleshed, $self->get_fleshed_survey($client, $survey));
220 __PACKAGE__->register_method(
221 method => "get_fleshed_survey",
222 api_name => "open-ils.circ.survey.fleshed.retrieve");
224 sub get_fleshed_survey {
225 my( $self, $client, $survey_id ) = @_;
227 my $session = OpenSRF::AppSession->create("open-ils.storage");
229 warn "Searching for survey $survey_id\n";
232 if( ref($survey_id) and
233 (ref($survey_id) =~ /^Fieldmapper/)) {
234 $survey = $survey_id;
238 my $sreq = $session->request(
239 "open-ils.storage.direct.action.survey.retrieve",
241 $survey = $sreq->gather(1);
242 if(! $survey) { return undef; }
245 $survey->questions([]);
248 warn "Grabbing survey questions\n";
249 my $qreq = $session->request(
250 "open-ils.storage.direct.action.survey_question.search.survey.atomic",
253 my $questions = $qreq->gather(1);
255 warn "Question: " . Dumper($questions);
259 for my $question (@$questions) {
260 next unless defined $question;
262 # add this question to the survey
263 push( @{$survey->questions()}, $question );
265 warn "Grabbing question answers\n";
267 my $ans_req = $session->request(
268 "open-ils.storage.direct.action.survey_answer.search.question.atomic",
271 # add this array of answers to this question
272 $question->answers( $ans_req->gather(1) );
277 $session->disconnect();
284 __PACKAGE__->register_method(
285 method => "submit_survey",
286 api_name => "open-ils.circ.survey.submit.session");
288 __PACKAGE__->register_method(
289 method => "submit_survey",
290 api_name => "open-ils.circ.survey.submit.user_id");
292 __PACKAGE__->register_method(
293 method => "submit_survey",
294 api_name => "open-ils.circ.survey.submit.anon");
298 my( $self, $client, $responses ) = @_;
301 throw OpenSRF::EX::ERROR
302 ("No survey object sent in update");
306 warn "Submitting survey " . Dumper($responses) . "\n";
308 if(!ref($responses)) { $responses = [$responses]; }
310 my $session = $apputils->start_db_session();
312 my $group_id = $session->request(
313 "open-ils.storage.action.survey_response.next_group_id")->gather(1);
316 for my $res (@$responses) {
320 if($self->api_name =~ /session/) {
321 if( ! ($id = $already_seen{$res->usr}) ) {
322 my $user_obj = $apputils->check_user_session($res->usr);
324 $already_seen{$res->usr} = $id;
327 } elsif( $self->api_name =~ /anon/ ) {
331 warn "Submitting response with question " .
332 $res->question . " and group $group_id \n";
334 $res->response_group_id($group_id);
335 my $req = $session->request(
336 "open-ils.storage.direct.action.survey_response.create",
338 my $newid = $req->gather(1);
339 warn "New response id: $newid\n";
342 throw OpenSRF::EX::ERROR
343 ("Error creating new survey response");
347 $apputils->commit_db_session($session);
348 warn "survey response update completed\n";
354 __PACKAGE__->register_method(
355 method => "get_random_survey",
356 api_name => "open-ils.circ.survey.retrieve.opac.random");
358 sub get_random_survey {
359 my( $self, $client, $user_session ) = @_;
361 warn "retrieving random survey\n";
362 my $user_obj = $apputils->check_user_session($user_session);
363 my $surveys = $apputils->simple_scalar_request(
365 "open-ils.storage.action.survey.opac.atomic",
366 $user_obj->home_ou() );
368 my $random = int(rand(scalar(@$surveys)));
369 warn "Random survey index for process $$ is $random\n";
370 my $surv = $surveys->[$random];
372 return $self->get_fleshed_survey($client, $surv);
376 __PACKAGE__->register_method(
377 method => "get_random_survey_global",
378 api_name => "open-ils.circ.survey.retrieve.opac.random.global");
380 sub get_random_survey_global {
381 my( $self, $client ) = @_;
383 warn "retrieving random global survey\n";
384 my $surveys = $apputils->simple_scalar_request(
386 "open-ils.storage.direct.action.survey.search.atomic",
387 # XXX grab the org tree to get the root id...
388 { owner => 1, opac => 't' } );
390 my $random = int(rand(scalar(@$surveys)));
391 warn "Random survey index for process $$ is $random\n";
392 my $surv = $surveys->[$random];
394 return $self->get_fleshed_survey($client, $surv);