Fix bugs in ExpireIncompleteSurveyResponses Workflow
Need to join on revisionDate otherwise one email per Survey revision will be sent. (Added explicit test for this) Some standard template vars were also missing - username and userId. (forward-port from webgui-7.7)
This commit is contained in:
parent
79f84aec68
commit
549f9ce650
3 changed files with 85 additions and 14 deletions
|
|
@ -9,6 +9,7 @@
|
||||||
- fixed #11018: no lowercase typing possible in addressbook
|
- fixed #11018: no lowercase typing possible in addressbook
|
||||||
- fixed #11033: Calendar, recurring dates
|
- fixed #11033: Calendar, recurring dates
|
||||||
- fixed #11038: My Carousel Broke
|
- fixed #11038: My Carousel Broke
|
||||||
|
- fixed ExpireIncompleteSurveyResponses workflow sending one email per asset revision
|
||||||
|
|
||||||
7.8.0
|
7.8.0
|
||||||
- upgraded YUI to 2.8.0r4
|
- upgraded YUI to 2.8.0r4
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ use base 'WebGUI::Workflow::Activity';
|
||||||
use WebGUI::Asset;
|
use WebGUI::Asset;
|
||||||
use WebGUI::DateTime;
|
use WebGUI::DateTime;
|
||||||
use DateTime::Duration;
|
use DateTime::Duration;
|
||||||
|
use WebGUI::Mail::Send;
|
||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
||||||
|
|
@ -106,19 +107,7 @@ sub execute {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $session = $self->session;
|
my $session = $self->session;
|
||||||
|
|
||||||
my $sql = <<END_SQL;
|
my $refs = $self->session->db->buildArrayRefOfHashRefs( $self->getSql );
|
||||||
select r.Survey_responseId, r.username, r.userId, upd.email, upd.firstName, upd.lastName, r.startDate, s.timeLimit, s.doAfterTimeLimit, 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 * 60 )
|
|
||||||
and r.assetId = s.assetId
|
|
||||||
and ad.assetId = s.assetId
|
|
||||||
and ad.revisionDate = s.revisionDate
|
|
||||||
and upd.userId = r.userId
|
|
||||||
END_SQL
|
|
||||||
|
|
||||||
my $refs = $self->session->db->buildArrayRefOfHashRefs($sql);
|
|
||||||
for my $ref (@{$refs}) {
|
for my $ref (@{$refs}) {
|
||||||
if($self->get("deleteExpired")){
|
if($self->get("deleteExpired")){
|
||||||
$session->log->debug("deleting response: $ref->{Survey_responseId} ");
|
$session->log->debug("deleting response: $ref->{Survey_responseId} ");
|
||||||
|
|
@ -141,6 +130,8 @@ END_SQL
|
||||||
responseId => $ref->{Survey_responseId},
|
responseId => $ref->{Survey_responseId},
|
||||||
deleted => $self->get("deleteExpired"),
|
deleted => $self->get("deleteExpired"),
|
||||||
companyName => $self->session->setting->get("companyName"),
|
companyName => $self->session->setting->get("companyName"),
|
||||||
|
username => $ref->{username},
|
||||||
|
userId => $ref->{userId},
|
||||||
};
|
};
|
||||||
my $template = WebGUI::Asset->newByDynamicClass($self->session,$self->get('emailTemplateId'));
|
my $template = WebGUI::Asset->newByDynamicClass($self->session,$self->get('emailTemplateId'));
|
||||||
my $message = $template->processTemplate($var, $self->get("emailTemplateId"));
|
my $message = $template->processTemplate($var, $self->get("emailTemplateId"));
|
||||||
|
|
@ -158,4 +149,35 @@ END_SQL
|
||||||
return $self->COMPLETE;
|
return $self->COMPLETE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
=head2 getSql
|
||||||
|
|
||||||
|
Returns the SQL used to look up incomplete survey responses.
|
||||||
|
|
||||||
|
Factored out into a separate subroutine for the sake of testability.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub getSql {
|
||||||
|
|
||||||
|
return <<END_SQL;
|
||||||
|
select
|
||||||
|
r.Survey_responseId, r.username, r.userId, r.startDate,
|
||||||
|
upd.email, upd.firstName, upd.lastName,
|
||||||
|
s.timeLimit, s.doAfterTimeLimit,
|
||||||
|
ad.title, ad.url
|
||||||
|
from
|
||||||
|
Survey_response r, Survey s, assetData ad, userProfileData upd
|
||||||
|
where
|
||||||
|
r.isComplete = 0
|
||||||
|
and s.timeLimit > 0
|
||||||
|
and ( unix_timestamp() - r.startDate ) > ( s.timeLimit * 60 )
|
||||||
|
and r.assetId = s.assetId
|
||||||
|
and ad.assetId = s.assetId
|
||||||
|
and ad.revisionDate = s.revisionDate
|
||||||
|
and s.revisionDate = r.revisionDate
|
||||||
|
and upd.userId = r.userId
|
||||||
|
END_SQL
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
@ -13,10 +13,12 @@ my $session = WebGUI::Test->session;
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# Tests
|
# Tests
|
||||||
plan tests => 15;
|
plan tests => 25;
|
||||||
|
|
||||||
use_ok('WebGUI::Workflow::Activity::ExpireIncompleteSurveyResponses');
|
use_ok('WebGUI::Workflow::Activity::ExpireIncompleteSurveyResponses');
|
||||||
|
|
||||||
|
my $SQL = WebGUI::Workflow::Activity::ExpireIncompleteSurveyResponses->getSql;
|
||||||
|
|
||||||
my $wf = WebGUI::Workflow->create($session, {
|
my $wf = WebGUI::Workflow->create($session, {
|
||||||
title => 'Test ExpireIncompleteSurveyResponses',
|
title => 'Test ExpireIncompleteSurveyResponses',
|
||||||
enabled => 1,
|
enabled => 1,
|
||||||
|
|
@ -42,6 +44,9 @@ $sJSON->newObject([0]); # add a question to 0th section
|
||||||
$sJSON->update([0,0], { questionType => 'Yes/No' });
|
$sJSON->update([0,0], { questionType => 'Yes/No' });
|
||||||
$survey->persistSurveyJSON;
|
$survey->persistSurveyJSON;
|
||||||
|
|
||||||
|
# Initially, sql returns no resuts
|
||||||
|
is( scalar $session->db->buildArray($SQL), 0, 'No incomplete responses');
|
||||||
|
|
||||||
# Now start a response as the test user
|
# Now start a response as the test user
|
||||||
$session->user( { user => $user } );
|
$session->user( { user => $user } );
|
||||||
my $responseId = $survey->responseId;
|
my $responseId = $survey->responseId;
|
||||||
|
|
@ -50,6 +55,9 @@ my ($endDate, $isComplete) = $session->db->quickArray('select endDate, isComplet
|
||||||
is($endDate, 0, '..currently with no endDate');
|
is($endDate, 0, '..currently with no endDate');
|
||||||
is($isComplete, 0, '..and marked as in-progress');
|
is($isComplete, 0, '..and marked as in-progress');
|
||||||
|
|
||||||
|
# Still no resuts
|
||||||
|
is( scalar $session->db->buildArray($SQL), 0, 'Still no incomplete responses');
|
||||||
|
|
||||||
WebGUI::Workflow::Instance->create($session,
|
WebGUI::Workflow::Instance->create($session,
|
||||||
{
|
{
|
||||||
workflowId => $wf->getId,
|
workflowId => $wf->getId,
|
||||||
|
|
@ -66,6 +74,9 @@ $survey->update( { timeLimit => 1 } );
|
||||||
$survey->startDate($survey->startDate - 100);
|
$survey->startDate($survey->startDate - 100);
|
||||||
ok($survey->hasTimedOut, '..until we set a timeLimit and push startDate into the past');
|
ok($survey->hasTimedOut, '..until we set a timeLimit and push startDate into the past');
|
||||||
|
|
||||||
|
# Now we have 1 incomplete response
|
||||||
|
is( scalar $session->db->buildArray($SQL), 1, 'Now we have 1 incomplete response');
|
||||||
|
|
||||||
WebGUI::Workflow::Instance->create($session,
|
WebGUI::Workflow::Instance->create($session,
|
||||||
{
|
{
|
||||||
workflowId => $wf->getId,
|
workflowId => $wf->getId,
|
||||||
|
|
@ -77,9 +88,16 @@ WebGUI::Workflow::Instance->create($session,
|
||||||
ok($endDate, 'endDate now set');
|
ok($endDate, 'endDate now set');
|
||||||
is($isComplete, 3, '..and isComplete set to timeout code');
|
is($isComplete, 3, '..and isComplete set to timeout code');
|
||||||
|
|
||||||
|
# Afterwards, back to no incomplete responses
|
||||||
|
is( scalar $session->db->buildArray($SQL), 0, 'Afterwards, back to no incomplete responses');
|
||||||
|
|
||||||
# Undo out handiwork, and chage doAfterTimeLimit to restartSurvey so that we get a different completeCode
|
# Undo out handiwork, and chage doAfterTimeLimit to restartSurvey so that we get a different completeCode
|
||||||
$session->db->write('update Survey_response set endDate = 0, isComplete = 0 where Survey_responseId = ?', [$responseId]);
|
$session->db->write('update Survey_response set endDate = 0, isComplete = 0 where Survey_responseId = ?', [$responseId]);
|
||||||
$survey->update( { doAfterTimeLimit => 'restartSurvey' } );
|
$survey->update( { doAfterTimeLimit => 'restartSurvey' } );
|
||||||
|
|
||||||
|
# Now we have 1 incomplete response again
|
||||||
|
is( scalar $session->db->buildArray($SQL), 1, 'Now we have 1 incomplete response again');
|
||||||
|
|
||||||
WebGUI::Workflow::Instance->create($session,
|
WebGUI::Workflow::Instance->create($session,
|
||||||
{
|
{
|
||||||
workflowId => $wf->getId,
|
workflowId => $wf->getId,
|
||||||
|
|
@ -91,10 +109,36 @@ WebGUI::Workflow::Instance->create($session,
|
||||||
ok($endDate, 'endDate set again');
|
ok($endDate, 'endDate set again');
|
||||||
is($isComplete, 4, '..and isComplete now set to timeoutRestart code');
|
is($isComplete, 4, '..and isComplete now set to timeoutRestart code');
|
||||||
|
|
||||||
|
# Afterwards, back to no incomplete responses
|
||||||
|
is( scalar $session->db->buildArray($SQL), 0, 'Afterwards, back to no incomplete responses');
|
||||||
|
|
||||||
|
##
|
||||||
|
# Explicitly test for bug that existed in SQL whereby one email per revision would be sent
|
||||||
|
##
|
||||||
|
|
||||||
|
# Create a new revision
|
||||||
|
$survey->addRevision({}, time+1);
|
||||||
|
WebGUI::Test->tagsToRollback(WebGUI::VersionTag->getWorking($session));
|
||||||
|
|
||||||
|
# Undo out handiwork again
|
||||||
|
is($session->db->quickScalar('select count(*) from Survey_response where Survey_responseId = ?', [$responseId]), 1, 'Start off with 1 response');
|
||||||
|
$session->db->write('update Survey_response set endDate = 0, isComplete = 0 where Survey_responseId = ?', [$responseId]);
|
||||||
|
|
||||||
|
# Make sure SQL only returns 1 incomplete response
|
||||||
|
is( scalar $session->db->buildArray($SQL), 1, 'Make sure SQL only returns 1 incomplete response');
|
||||||
|
|
||||||
|
##
|
||||||
|
# Delete Expired
|
||||||
|
##
|
||||||
|
|
||||||
# Undo out handiwork again, and chage workflow to delete
|
# Undo out handiwork again, and chage workflow to delete
|
||||||
is($session->db->quickScalar('select count(*) from Survey_response where Survey_responseId = ?', [$responseId]), 1, 'Start off with 1 response');
|
is($session->db->quickScalar('select count(*) from Survey_response where Survey_responseId = ?', [$responseId]), 1, 'Start off with 1 response');
|
||||||
$session->db->write('update Survey_response set endDate = 0, isComplete = 0 where Survey_responseId = ?', [$responseId]);
|
$session->db->write('update Survey_response set endDate = 0, isComplete = 0 where Survey_responseId = ?', [$responseId]);
|
||||||
$activity->set('deleteExpired', 1);
|
$activity->set('deleteExpired', 1);
|
||||||
|
|
||||||
|
# Now we have 1 incomplete response again
|
||||||
|
is( scalar $session->db->buildArray($SQL), 1, 'Now we have 1 incomplete response again');
|
||||||
|
|
||||||
WebGUI::Workflow::Instance->create($session,
|
WebGUI::Workflow::Instance->create($session,
|
||||||
{
|
{
|
||||||
workflowId => $wf->getId,
|
workflowId => $wf->getId,
|
||||||
|
|
@ -104,6 +148,10 @@ WebGUI::Workflow::Instance->create($session,
|
||||||
)->start;
|
)->start;
|
||||||
is($session->db->quickScalar('select count(*) from Survey_response where Survey_responseId = ?', [$responseId]), 0, 'Response has now been deleted');
|
is($session->db->quickScalar('select count(*) from Survey_response where Survey_responseId = ?', [$responseId]), 0, 'Response has now been deleted');
|
||||||
|
|
||||||
|
# Afterwards, back to no incomplete responses
|
||||||
|
is( scalar $session->db->buildArray($SQL), 0, 'Afterwards, back to no incomplete responses');
|
||||||
|
|
||||||
END {
|
END {
|
||||||
$session->db->write('delete from Survey_response where userId = ?', [$user->userId]) if $user;
|
$session->db->write('delete from Survey_response where userId = ?', [$user->userId]) if $user;
|
||||||
|
$survey->purge if $survey;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue