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/OpenILS::Application/;
18 use strict; use warnings;
19 use OpenSRF::EX qw/:try/;
20 use OpenILS::Application::AppUtils;
23 use Time::HiRes qw(time);
24 use OpenILS::Utils::CStoreEditor qw/:funcs/;
26 my $apputils = "OpenILS::Application::AppUtils";
28 # - creates a new survey
29 # expects a survey complete with questions and answers
30 __PACKAGE__->register_method(
31 method => "add_survey",
32 api_name => "open-ils.circ.survey.create");
35 my( $self, $client, $user_session, $survey ) = @_;
37 my($user_obj, $evt) = $apputils->checkses($user_session);
40 my $session = $apputils->start_db_session();
41 $apputils->set_audit_info($session, $user_session, $user_obj->id, $user_obj->wsid);
42 my $err = undef; my $id;
47 $survey = _add_survey($session, $survey);
48 _add_questions($session, $survey);
49 $apputils->commit_db_session($session);
53 $err = "Error creating survey: $e\n";
54 $apputils->rollback_db_session($session);
57 if($err) { throw OpenSRF::EX::ERROR ($err); }
59 # re-retrieve the survey from the db and return it
60 return get_fleshed_survey($self, $client, $survey->id() );
65 my($session, $survey) = @_;
66 my $req = $session->request(
67 "open-ils.storage.direct.action.survey.create",
70 my $id = $req->gather(1);
73 throw OpenSRF::EX::ERROR
74 ("Unable to create new survey " . $survey->name());
82 my($session, $survey) = @_;
86 my($session, $survey) = @_;
88 # create new questions in the db
89 if( $survey->questions() ) {
90 for my $question (@{$survey->questions()}){
92 $question->survey($survey->id());
93 my $virtual_id = $question->id();
94 $question->clear_id();
97 my $req = $session->request(
98 'open-ils.storage.direct.action.survey_question.create',
100 my $new_id = $req->gather(1);
103 throw OpenSRF::EX::ERROR
104 ("Error creating new survey question " . $question->question() . "\n")
107 # now update the responses to this question
108 if($question->answers()) {
109 for my $answer (@{$question->answers()}) {
110 $answer->question($new_id);
111 _add_answer($session,$answer);
120 my($session, $answer) = @_;
122 my $req = $session->request(
123 "open-ils.storage.direct.action.survey_answer.create",
125 my $id = $req->gather(1);
127 throw OpenSRF::EX::ERROR
128 ("Error creating survey answer " . $answer->answer() );
135 # retrieve surveys for a specific org subtree.
136 __PACKAGE__->register_method(
137 method => "get_required_surveys",
138 api_name => "open-ils.circ.survey.retrieve.required");
140 sub get_required_surveys {
141 my( $self, $client, $user_session ) = @_;
144 my ($user_obj, $evt) = $apputils->checkses($user_session);
147 my $orgid = $user_obj->ws_ou() ? $user_obj->ws_ou() : $user_obj->home_ou();
148 my $surveys = $apputils->simple_scalar_request(
150 "open-ils.storage.action.survey.required.atomic",
154 for my $survey (@$surveys) {
155 push(@fleshed, get_fleshed_survey($self, $client, $survey));
161 __PACKAGE__->register_method(
162 method => "get_survey_responses",
163 api_name => "open-ils.circ.survey.response.retrieve");
165 sub get_survey_responses {
166 my( $self, $client, $user_session, $survey_id, $user_id ) = @_;
169 my ($user_obj, $evt) = $apputils->checkses($user_session);
171 $user_id = $user_obj->id;
174 my $res = $apputils->simple_scalar_request(
176 "open-ils.cstore.direct.action.survey_response.search.atomic",
177 { usr => $user_id, survey => $survey_id } );
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, $evt) = $apputils->checkses($user_session);
196 my $orgid = $user_obj->ws_ou() ? $user_obj->ws_ou() : $user_obj->home_ou();
197 my $surveys = $apputils->simple_scalar_request(
199 "open-ils.storage.action.survey.all.atomic",
203 for my $survey (@$surveys) {
204 push(@fleshed, get_fleshed_survey($self, $client, $survey));
212 __PACKAGE__->register_method(
213 method => "get_fleshed_survey",
214 api_name => "open-ils.circ.survey.fleshed.retrieve");
216 sub get_fleshed_survey {
217 my( $self, $client, $survey_id ) = @_;
219 my $session = OpenSRF::AppSession->create("open-ils.storage");
222 if( ref($survey_id) and
223 (ref($survey_id) =~ /^Fieldmapper/)) {
224 $survey = $survey_id;
228 my $sreq = $session->request(
229 "open-ils.storage.direct.action.survey.retrieve",
231 $survey = $sreq->gather(1);
232 if(! $survey) { return undef; }
235 $survey->questions([]);
238 my $qreq = $session->request(
239 "open-ils.storage.direct.action.survey_question.search.survey.atomic",
242 my $questions = $qreq->gather(1);
246 for my $question (@$questions) {
247 next unless defined $question;
249 # add this question to the survey
250 push( @{$survey->questions()}, $question );
253 my $ans_req = $session->request(
254 "open-ils.storage.direct.action.survey_answer.search.question.atomic",
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 if(!ref($responses)) { $responses = [$responses]; }
294 my $session = $apputils->start_db_session();
296 my $group_id = $session->request(
297 "open-ils.storage.action.survey_response.next_group_id")->gather(1);
300 for my $res (@$responses) {
304 if($self->api_name =~ /session/) {
305 if( ! ($id = $already_seen{$res->usr}) ) {
306 my ($user_obj, $evt) = $apputils->checkses($res->usr);
309 $already_seen{$res->usr} = $id;
312 } elsif( $self->api_name =~ /anon/ ) {
316 $res->response_group_id($group_id);
317 my $req = $session->request(
318 "open-ils.storage.direct.action.survey_response.create",
320 my $newid = $req->gather(1);
323 throw OpenSRF::EX::ERROR
324 ("Error creating new survey response");
328 $apputils->commit_db_session($session);
334 __PACKAGE__->register_method(
335 method => "get_random_survey",
336 api_name => "open-ils.circ.survey.retrieve.opac.random");
338 sub get_random_survey {
339 my( $self, $client, $user_session ) = @_;
341 my ($user_obj, $evt) = $apputils->checkses($user_session);
344 my $surveys = $apputils->simple_scalar_request(
346 "open-ils.storage.action.survey.opac.atomic",
347 $user_obj->home_ou() );
349 my $random = int(rand(scalar(@$surveys)));
350 my $surv = $surveys->[$random];
352 return get_fleshed_survey($self, $client, $surv);
356 __PACKAGE__->register_method(
357 method => "get_random_survey_global",
358 api_name => "open-ils.circ.survey.retrieve.opac.random.global");
360 sub get_random_survey_global {
361 my( $self, $client ) = @_;
363 my $surveys = $apputils->simple_scalar_request(
365 "open-ils.storage.direct.action.survey.search.atomic",
366 # XXX grab the org tree to get the root id...
367 { owner => 1, opac => 't' } );
369 my $random = int(rand(scalar(@$surveys)));
370 my $surv = $surveys->[$random];
372 return get_fleshed_survey($self, $client, $surv);
377 __PACKAGE__->register_method (
378 method => 'delete_survey',
379 api_name => 'open-ils.circ.survey.delete.cascade'
381 __PACKAGE__->register_method (
382 method => 'delete_survey',
383 api_name => 'open-ils.circ.survey.delete.cascade.override'
387 my($self, $conn, $auth, $survey_id) = @_;
388 my $e = new_editor(authtoken => $auth, xact => 1);
389 return $e->die_event unless $e->checkauth;
391 my $survey = $e->retrieve_action_survey($survey_id)
392 or return $e->die_event;
393 return $e->die_event unless $e->allowed('ADMIN_SURVEY', $survey->owner);
395 my $questions = $e->search_action_survey_question({survey => $survey_id});
397 push(@answers, @{$e->search_action_survey_answer({question => $_->id})}) for @$questions;
398 my $responses = $e->search_action_survey_response({survey => $survey_id});
400 return OpenILS::Event->new('SURVEY_RESPONSES_EXIST')
401 if @$responses and $self->api_name =! /override/;
403 for my $resp (@$responses) {
404 $e->delete_action_survey_response($resp) or return $e->die_event;
407 for my $ans (@answers) {
408 $e->delete_action_survey_answer($ans) or return $e->die_event;
411 for my $quest (@$questions) {
412 $e->delete_action_survey_question($quest) or return $e->die_event;
415 $e->delete_action_survey($survey) or return $e->die_event;