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);
23 use OpenILS::Utils::CStoreEditor qw/:funcs/;
25 my $apputils = "OpenILS::Application::AppUtils";
27 # - creates a new survey
28 # expects a survey complete with questions and answers
29 __PACKAGE__->register_method(
30 method => "add_survey",
31 api_name => "open-ils.circ.survey.create");
34 my( $self, $client, $user_session, $survey ) = @_;
36 my $user_obj = $apputils->check_user_session($user_session);
37 my $session = $apputils->start_db_session();
38 my $err = undef; my $id;
40 warn "Creating new survey\n" . Dumper($survey) . "\n";
45 $survey = _add_survey($session, $survey);
46 _add_questions($session, $survey);
47 $apputils->commit_db_session($session);
51 $err = "Error creating survey: $e\n";
52 $apputils->rollback_db_session($session);
55 if($err) { throw OpenSRF::EX::ERROR ($err); }
57 # re-retrieve the survey from the db and return it
58 return $self->get_fleshed_survey( $client, $survey->id() );
63 my($session, $survey) = @_;
64 my $req = $session->request(
65 "open-ils.storage.direct.action.survey.create",
68 my $id = $req->gather(1);
71 throw OpenSRF::EX::ERROR
72 ("Unable to create new survey " . $survey->name());
75 warn "Created new survey with id $id\n";
81 my($session, $survey) = @_;
85 my($session, $survey) = @_;
87 # create new questions in the db
88 if( $survey->questions() ) {
89 for my $question (@{$survey->questions()}){
91 $question->survey($survey->id());
92 my $virtual_id = $question->id();
93 $question->clear_id();
96 warn "Creating new question: " . $question->question() . "\n";
97 warn Dumper $question;
99 my $req = $session->request(
100 'open-ils.storage.direct.action.survey_question.create',
102 my $new_id = $req->gather(1);
105 throw OpenSRF::EX::ERROR
106 ("Error creating new survey question " . $question->question() . "\n")
109 warn "added new question with id $new_id\n";
111 # now update the responses to this question
112 if($question->answers()) {
113 for my $answer (@{$question->answers()}) {
114 $answer->question($new_id);
115 _add_answer($session,$answer);
124 my($session, $answer) = @_;
125 warn "Adding answer " . $answer->answer() . "\n";
127 my $req = $session->request(
128 "open-ils.storage.direct.action.survey_answer.create",
130 my $id = $req->gather(1);
132 throw OpenSRF::EX::ERROR
133 ("Error creating survey answer " . $answer->answer() );
136 warn "Added new answer with id $id\n";
141 # retrieve surveys for a specific org subtree.
142 __PACKAGE__->register_method(
143 method => "get_required_surveys",
144 api_name => "open-ils.circ.survey.retrieve.required");
146 sub get_required_surveys {
147 my( $self, $client, $user_session ) = @_;
149 warn "Retrieving required surveys\n";
151 my $user_obj = $apputils->check_user_session($user_session);
152 my $orgid = $user_obj->ws_ou() ? $user_obj->ws_ou() : $user_obj->home_ou();
153 my $surveys = $apputils->simple_scalar_request(
155 "open-ils.storage.action.survey.required.atomic",
159 warn "Retrieved " . scalar(@$surveys)." required surveys\n";
163 for my $survey (@$surveys) {
164 push(@fleshed, $self->get_fleshed_survey($client, $survey));
170 __PACKAGE__->register_method(
171 method => "get_survey_responses",
172 api_name => "open-ils.circ.survey.response.retrieve");
174 sub get_survey_responses {
175 my( $self, $client, $user_session, $survey_id, $user_id ) = @_;
177 warn "retrieing responses $user_session $survey_id $user_id\n";
179 my $user_obj = $apputils->check_user_session($user_session);
180 $user_id = $user_obj->id;
183 my $res = $apputils->simple_scalar_request(
185 "open-ils.cstore.direct.action.survey_response.search.atomic",
186 { usr => $user_id, survey => $survey_id } );
188 warn "Surveys: " . Dumper($res);
190 if( $res && ref($res) and $res->[0]) {
191 return [ sort { $a->id() <=> $b->id() } @$res ];
197 __PACKAGE__->register_method(
198 method => "get_all_surveys",
199 api_name => "open-ils.circ.survey.retrieve.all");
201 sub get_all_surveys {
202 my( $self, $client, $user_session ) = @_;
204 my $user_obj = $apputils->check_user_session($user_session);
205 my $orgid = $user_obj->ws_ou() ? $user_obj->ws_ou() : $user_obj->home_ou();
206 my $surveys = $apputils->simple_scalar_request(
208 "open-ils.storage.action.survey.all.atomic",
212 for my $survey (@$surveys) {
213 push(@fleshed, $self->get_fleshed_survey($client, $survey));
221 __PACKAGE__->register_method(
222 method => "get_fleshed_survey",
223 api_name => "open-ils.circ.survey.fleshed.retrieve");
225 sub get_fleshed_survey {
226 my( $self, $client, $survey_id ) = @_;
228 my $session = OpenSRF::AppSession->create("open-ils.storage");
230 warn "Searching for survey $survey_id\n";
233 if( ref($survey_id) and
234 (ref($survey_id) =~ /^Fieldmapper/)) {
235 $survey = $survey_id;
239 my $sreq = $session->request(
240 "open-ils.storage.direct.action.survey.retrieve",
242 $survey = $sreq->gather(1);
243 if(! $survey) { return undef; }
246 $survey->questions([]);
249 warn "Grabbing survey questions\n";
250 my $qreq = $session->request(
251 "open-ils.storage.direct.action.survey_question.search.survey.atomic",
254 my $questions = $qreq->gather(1);
258 for my $question (@$questions) {
259 next unless defined $question;
261 # add this question to the survey
262 push( @{$survey->questions()}, $question );
264 warn "Grabbing question answers\n";
266 my $ans_req = $session->request(
267 "open-ils.storage.direct.action.survey_answer.search.question.atomic",
270 # add this array of answers to this question
271 $question->answers( $ans_req->gather(1) );
276 $session->disconnect();
283 __PACKAGE__->register_method(
284 method => "submit_survey",
285 api_name => "open-ils.circ.survey.submit.session");
287 __PACKAGE__->register_method(
288 method => "submit_survey",
289 api_name => "open-ils.circ.survey.submit.user_id");
291 __PACKAGE__->register_method(
292 method => "submit_survey",
293 api_name => "open-ils.circ.survey.submit.anon");
297 my( $self, $client, $responses ) = @_;
300 throw OpenSRF::EX::ERROR
301 ("No survey object sent in update");
305 warn "Submitting survey " . Dumper($responses) . "\n";
307 if(!ref($responses)) { $responses = [$responses]; }
309 my $session = $apputils->start_db_session();
311 my $group_id = $session->request(
312 "open-ils.storage.action.survey_response.next_group_id")->gather(1);
315 for my $res (@$responses) {
319 if($self->api_name =~ /session/) {
320 if( ! ($id = $already_seen{$res->usr}) ) {
321 my $user_obj = $apputils->check_user_session($res->usr);
323 $already_seen{$res->usr} = $id;
326 } elsif( $self->api_name =~ /anon/ ) {
330 warn "Submitting response with question " .
331 $res->question . " and group $group_id \n";
333 $res->response_group_id($group_id);
334 my $req = $session->request(
335 "open-ils.storage.direct.action.survey_response.create",
337 my $newid = $req->gather(1);
338 warn "New response id: $newid\n";
341 throw OpenSRF::EX::ERROR
342 ("Error creating new survey response");
346 $apputils->commit_db_session($session);
347 warn "survey response update completed\n";
353 __PACKAGE__->register_method(
354 method => "get_random_survey",
355 api_name => "open-ils.circ.survey.retrieve.opac.random");
357 sub get_random_survey {
358 my( $self, $client, $user_session ) = @_;
360 warn "retrieving random survey\n";
361 my $user_obj = $apputils->check_user_session($user_session);
362 my $surveys = $apputils->simple_scalar_request(
364 "open-ils.storage.action.survey.opac.atomic",
365 $user_obj->home_ou() );
367 my $random = int(rand(scalar(@$surveys)));
368 warn "Random survey index for process $$ is $random\n";
369 my $surv = $surveys->[$random];
371 return $self->get_fleshed_survey($client, $surv);
375 __PACKAGE__->register_method(
376 method => "get_random_survey_global",
377 api_name => "open-ils.circ.survey.retrieve.opac.random.global");
379 sub get_random_survey_global {
380 my( $self, $client ) = @_;
382 warn "retrieving random global survey\n";
383 my $surveys = $apputils->simple_scalar_request(
385 "open-ils.storage.direct.action.survey.search.atomic",
386 # XXX grab the org tree to get the root id...
387 { owner => 1, opac => 't' } );
389 my $random = int(rand(scalar(@$surveys)));
390 warn "Random survey index for process $$ is $random\n";
391 my $surv = $surveys->[$random];
393 return $self->get_fleshed_survey($client, $surv);