From 9fe2b5328e96231a27df97834148443607411ebc Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Mon, 16 Feb 2009 23:49:16 +0000 Subject: [PATCH] Added workflow (and email template to WebGUI/) to delete expired surveys and notify users via email. --- .../ExpireIncompleteSurveyResponses.pm | 152 ++++++++++++++++++ ...ctivity_ExpireIncompleteSurveyResponses.pm | 67 ++++++++ root_import_prop-style.wgpkg | Bin 0 -> 5270 bytes 3 files changed, 219 insertions(+) create mode 100644 lib/WebGUI/Workflow/Activity/ExpireIncompleteSurveyResponses.pm create mode 100644 lib/WebGUI/i18n/English/Workflow_Activity_ExpireIncompleteSurveyResponses.pm create mode 100644 root_import_prop-style.wgpkg diff --git a/lib/WebGUI/Workflow/Activity/ExpireIncompleteSurveyResponses.pm b/lib/WebGUI/Workflow/Activity/ExpireIncompleteSurveyResponses.pm new file mode 100644 index 000000000..caea2c54d --- /dev/null +++ b/lib/WebGUI/Workflow/Activity/ExpireIncompleteSurveyResponses.pm @@ -0,0 +1,152 @@ +package WebGUI::Workflow::Activity::ExpireIncompleteSurveyResponses; + + +=head1 LEGAL + + ------------------------------------------------------------------- + WebGUI is Copyright 2001-2008 Plain Black Corporation. + ------------------------------------------------------------------- + Please read the legal notices (docs/legal.txt) and the license + (docs/license.txt) that came with this distribution before using + this software. + ------------------------------------------------------------------- + http://www.plainblack.com info@plainblack.com + ------------------------------------------------------------------- + +=cut + +use strict; +use base 'WebGUI::Workflow::Activity'; +use WebGUI::Asset; +use WebGUI::DateTime; +use DateTime::Duration; + +=head1 NAME + +Package WebGUI::Workflow::Activity::ExpireIncompleteSurveyResponses + +=head1 DESCRIPTION + +This activity deletes the survey responses for which the allowed time has expired and emails the survey user. + +=head1 SYNOPSIS + +See WebGUI::Workflow::Activity for details on how to use any activity. + +=head1 METHODS + +These methods are available from this class: + +=cut + + +#------------------------------------------------------------------- + +=head2 definition ( session, definition ) + +See WebGUI::Workflow::Activity::defintion() for details. + +=cut + +sub definition { + my $class = shift; + my $session = shift; + my $definition = shift; + my $i18n = WebGUI::International->new($session, "Workflow_Activity_ExpireIncompleteSurveyResponses"); + push(@{$definition}, { + name => $i18n->get("name"), + properties => { + deleteExpired=>{ + fieldType=>"yesNo", + defaultValue=>0, + label=>$i18n->get("Delete expired survey responses"), + hoverHelp=>$i18n->get("delete expired") + }, + emailUsers=>{ + fieldType=>"yesNo", + defaultValue=>0, + label=>$i18n->get("Email users that responses were deleted"), + hoverHelp=>$i18n->get("email users") + }, + emailTemplateId => { + fieldType => "template", + defaultValue => 'ExpireIncResptmpl00001', + namespace => "ExpireIncompleteSurveyResponses", + label => $i18n->get('Email template sent to user'), + hoverHelp => $i18n->get('email template'), + }, + from => { + fieldType=>"text", + label=>$i18n->get("from"), + defaultValue=>$session->setting->get("companyEmail"), + hoverHelp=>$i18n->get("from mouse over"), + }, + subject => { + fieldType=>"text", + label=>$i18n->get("subject", 'WebGUI'), + defaultValue=>"Expired Survey", + hoverHelp=>$i18n->get("subject mouse over"), + }, + } + }); + return $class->SUPER::definition($session,$definition); +} + + +#------------------------------------------------------------------- + +=head2 execute ( [ object ] ) + +Finds all the expired Survey Responses on the system. If delete is selected, they are removed. Then if +email is selected, the users are emailed the template. + +=cut + +sub execute { + my $self = shift; + my $session = $self->session; + + my $sql = "select r.Survey_responseId, r.username, r.userId, upd.email,upd.firstName,upd.lastName, r.startDate, s.timeLimit, ad.title, ad.url + from Survey s, Survey_response r, assetData ad, userProfileData upd + where r.isComplete = 0 and s.timeLimit > 0 and (unix_timestamp() - r.startDate) > (s.timeLimit * 1) + and r.assetId = s.assetId and s.revisionDate = (select max(revisionDate) from Survey where assetId = s.assetId) + and ad.assetId = s.assetId and ad.revisionDate = s.revisionDate and upd.userId = r.userId"; + my $refs = $self->session->db->buildArrayRefOfHashRefs($sql); + for my $ref (@{$refs}) { + if($self->get("deleteExpired") == 1){ + $self->session->db->write("delete from Survey_response where Survey_responseId = ?",[$ref->{Survey_responseId}]); + }else{#else sent to expired but not deleted + $self->session->db->write("update Survey_response set isComplete = 99 where Survey_responseId = ?",[$ref->{Survey_responseId}]); + } + if($self->get("emailUsers") == 1 && $ref->{email} =~ /\@/){ + + my $var = { + to => $ref->{email}, + from => $self->get("from"), + firstName => $ref->{firstName}, + lastName => $ref->{lastName}, + surveyTitle => $ref->{title}, + surveyUrl => $ref->{url}, + responseId => $ref->{Survey_responseId}, + deleted => $self->get("deleteExpired"), + companyName => $self->session->setting->get("companyName"), + }; + my $template = WebGUI::Asset->newByDynamicClass($self->session,$self->get('emailTemplateId')); + my $message = $template->processTemplate($var, $self->get("emailTemplateId")); + WebGUI::Macro::process($self->session,\$message); + my $mail = WebGUI::Mail::Send->create($self->session,{ + to => $ref->{email}, + subject => $self->get("subject"), + from => $self->get('from'), + }); + $mail->addHtml($message); + $mail->addFooter; + $mail->queue; + } + } + return $self->COMPLETE; +} + +1; + + diff --git a/lib/WebGUI/i18n/English/Workflow_Activity_ExpireIncompleteSurveyResponses.pm b/lib/WebGUI/i18n/English/Workflow_Activity_ExpireIncompleteSurveyResponses.pm new file mode 100644 index 000000000..fc3bb8e85 --- /dev/null +++ b/lib/WebGUI/i18n/English/Workflow_Activity_ExpireIncompleteSurveyResponses.pm @@ -0,0 +1,67 @@ +package WebGUI::i18n::English::Workflow_Activity_ExpireIncompleteSurveyResponses; +use strict; + +our $I18N = { + 'name' => { + message => q|ExpireIncompleteSurveyResponses|, + lastUpdated => 0, + }, + 'Delete expired survey responses' => { + message => q|Delete expired survey responses|, + context => q|the hover help for the delete responses field|, + lastUpdated => 0, + }, + 'delete expired' => { + message => q|When ran, every survey response which is expired will be completely removed from the database.|, + context => q|the hover help for the delete responses field|, + lastUpdated => 0, + }, + 'Email users that responses were deleted' => { + message => q|Email users that responses were deleted|, + context => q|the hover help for the email users field|, + lastUpdated => 0, + }, + 'email users' => { + message => q|When a survey response is deleted, should the user be informed of this via email?|, + context => q|the hover help for the email users field|, + lastUpdated => 0, + }, + 'email template' => { + message => q|When an email is sent updating the user that their response has been deleted, this is the text that is sent to them.|, + context => q|the hover help for the email template field|, + lastUpdated => 0, + }, + 'from' => { + message => q|Email from field|, + context => q||, + lastUpdated => 0, + }, + 'from mouse over' => { + message => q|This is the from field that will show up in the sent email.|, + context => q||, + lastUpdated => 0, + }, + 'subject' => { + message => q|Email subject field|, + context => q||, + lastUpdated => 0, + }, + 'subject mouse over' => { + message => q|This is the subject field that will show up in the sent email.|, + context => q||, + lastUpdated => 0, + }, + 'Email template sent to user' => { + message => q|The template for the email|, + context => q||, + lastUpdated => 0, + }, + 'email template' => { + message => q|This is the email template that will be sent to the user|, + context => q||, + lastUpdated => 0, + }, + +}; + +1; diff --git a/root_import_prop-style.wgpkg b/root_import_prop-style.wgpkg new file mode 100644 index 0000000000000000000000000000000000000000..fea9f43c0194729cbcb7643515a7da1204bed255 GIT binary patch literal 5270 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 literal 0 HcmV?d00001