0
0
mirror of https://github.com/salesagility/SuiteCRM.git synced 2024-12-22 20:38:31 +00:00
salesagility_SuiteCRM/modules/Surveys/views/view.reports.php
2023-08-22 17:26:35 +01:00

273 lines
10 KiB
PHP

<?php
if (!defined('sugarEntry') || !sugarEntry) {
die('Not A Valid Entry Point');
}
require_once 'include/DetailView/DetailView2.php';
#[\AllowDynamicProperties]
class SurveysViewReports extends SugarView
{
public function __construct()
{
parent::__construct();
}
private function getSurveyStats()
{
$db = DBManagerFactory::getInstance();
$quotedId = $db->quote($this->bean->id);
$sentQuery = <<<EOF
SELECT COUNT(campaign_log.target_id) AS sent, COUNT(DISTINCT campaign_log.target_id) AS distinct_sent
FROM campaigns
INNER JOIN campaign_log ON (campaigns.id = campaign_log.campaign_id
AND campaign_log.deleted = 0
AND activity_type = 'targeted'
AND campaign_log.target_type = 'Contacts')
WHERE campaigns.survey_id = '$quotedId' AND campaigns.deleted = 0
EOF;
$surveysSent = $db->fetchOne($sentQuery);
return $surveysSent;
}
public function display()
{
global $mod_strings, $timedate;
parent::display();
$this->ss->assign('mod', $mod_strings);
$this->ss->assign('survey', $this->bean->toArray());
$responses =
$this->bean->get_linked_beans('surveys_surveyresponses', 'SurveyResponses', 'surveyresponses.date_created');
$this->ss->assign('responsesCount', is_countable($responses) ? count($responses) : 0);
$sentCount = [];
$distinctCount = [];
$surveysSent = $this->getSurveyStats();
if ($surveysSent) {
$sentCount = $surveysSent['sent'];
$distinctCount = $surveysSent['distinct_sent'];
}
$data = $this->generateSkeletonData($this->bean);
foreach ($responses as $response) {
foreach ($response->get_linked_beans('surveyresponses_surveyquestionresponses') as $questionResponse) {
$questionId = $questionResponse->surveyquestion_id;
$dataType = $data[$questionId]['type'] ?? '';
switch ($dataType) {
case "Checkbox":
$answerBool = !empty($questionResponse->answer_bool) ? 1 : 0;
$data[$questionId]['responses'][$answerBool]['count']++;
$data[$questionId]['chartData'][$answerBool]++;
break;
case "DateTime":
case "Date":
$dateStr = $questionResponse->answer_datetime;
if ($data[$questionId]['type'] == 'Date') {
$date = $timedate->fromUser($questionResponse->answer_datetime);
if ($date) {
$date = $timedate->tzGMT($date);
$dateStr = $timedate->asUserDate($date);
}
}
$data[$questionId]['responses'][] = array(
'answer' => $dateStr,
'contact' => !empty($response->contact_id) ? array(
'id' => $response->contact_id,
'name' => $response->contact_name
) : false,
'time' => $questionResponse->date_entered,
);
break;
case "Matrix":
$options =
$questionResponse->get_linked_beans(
'surveyquestionoptions_surveyquestionresponses',
'SurveyQuestionOptions'
);
foreach ($options as $option) {
$data[$questionId]['responses'][$option->id]['options'][$questionResponse->answer]['count']++;
$data[$questionId]['responses'][$option->id]['chartData'][$questionResponse->answer]++;
}
break;
case "Multiselect":
case "Radio":
case "Dropdown":
$options =
$questionResponse->get_linked_beans(
'surveyquestionoptions_surveyquestionresponses',
'SurveyQuestionOptions'
);
foreach ($options as $option) {
$data[$questionId]['responses'][$option->id]['count']++;
$data[$questionId]['chartData'][$option->id]++;
}
break;
case "Rating":
case "Scale":
$data[$questionId]['chartData'][$questionResponse->answer]++;
$data[$questionId]['responses'][$questionResponse->answer]['count']++;
break;
case "Textbox":
case "Text":
default:
$data[$questionId]['responses'][] = array(
'answer' => $questionResponse->answer,
'contact' => !empty($response->contact_id) ? array(
'id' => $response->contact_id,
'name' => $response->contact_name
) : false,
'time' => $questionResponse->date_entered,
);
break;
}
}
}
$this->ss->assign('data', $data);
$this->ss->assign('surveysSent', $sentCount);
$this->ss->assign('surveysSentDistinct', $distinctCount);
$html = $this->ss->fetch('modules/Surveys/tpls/reports.tpl');
echo $html;
}
private function getCheckboxQuestionSkeleton($arr)
{
global $mod_strings;
$arr['chartData'] = array(0 => 0, 1 => 0);
$arr['chartLabels'] = array($mod_strings['LBL_UNCHECKED'], $mod_strings['LBL_CHECKED']);
$arr['responses'][0] = array(
'count' => 0,
'label' => $mod_strings['LBL_UNCHECKED']
);
$arr['responses'][1] = array(
'count' => 0,
'label' => $mod_strings['LBL_CHECKED']
);
return $arr;
}
private function getMatrixQuestionSkeleton($arr, $options)
{
global $app_list_strings;
foreach ($options as $option) {
$arr['responses'][$option->id] = array(
'options' => array(),
'label' => $option->name,
'order' => $option->sort_order
);
foreach ($app_list_strings['surveys_matrix_options'] as $key => $val) {
$arr['responses'][$option->id]['options'][$key] = array('count' => 0, 'label' => $val);
$arr['responses'][$option->id]['chartLabels'][$key] = $val . " ";
$arr['responses'][$option->id]['chartData'][$key] = 0;
}
}
return $arr;
}
private function getChoiceQuestionSkeleton($arr, $options)
{
foreach ($options as $option) {
$arr['chartLabels'][$option->id] = html_entity_decode((string) $option->name, ENT_QUOTES | ENT_HTML5);
$arr['chartData'][$option->id] = 0;
$arr['responses'][$option->id] = array(
'count' => 0,
'label' => $option->name,
'order' => $option->sort_order
);
}
return $arr;
}
private function getRatingQuestionSkeleton($arr)
{
global $mod_strings;
for ($x = 1; $x <= 5; $x++) {
$arr['chartLabels'][$x] = $x . $mod_strings['LBL_STARS'];
$arr['chartData'][$x] = 0;
$arr['responses'][$x] = array(
'count' => 0,
'label' => $x . $mod_strings['LBL_STARS'],
'order' => $x
);
}
return $arr;
}
private function getScaleQuestionSkeleton($arr)
{
for ($x = 1; $x <= 10; $x++) {
$arr['chartLabels'][$x] = $x;
$arr['chartData'][$x] = 0;
$arr['responses'][$x] = array(
'count' => 0,
'label' => $x,
'order' => $x
);
}
return $arr;
}
private function generateSkeletonData(Surveys $survey)
{
$data = array();
$questions = $survey->get_linked_beans('surveys_surveyquestions', 'SurveyQuestions', 'sort_order');
foreach ($questions as $question) {
$data[$question->id] = array(
'id' => $question->id,
'name' => $question->name,
'type' => $question->type,
'order' => $question->sort_order,
'responses' => array(),
);
switch ($question->type) {
case "Checkbox":
$data[$question->id] = $this->getCheckboxQuestionSkeleton($data[$question->id]);
break;
case "Matrix":
$options =
$question->get_linked_beans(
'surveyquestions_surveyquestionoptions',
'SurveyQuestionOptions',
'sort_order'
);
$data[$question->id] = $this->getMatrixQuestionSkeleton($data[$question->id], $options);
break;
case "Multiselect":
case "Radio":
case "Dropdown":
$options =
$question->get_linked_beans(
'surveyquestions_surveyquestionoptions',
'SurveyQuestionOptions',
'sort_order'
);
$data[$question->id] = $this->getChoiceQuestionSkeleton($data[$question->id], $options);
break;
case "Rating":
$data[$question->id] = $this->getRatingQuestionSkeleton($data[$question->id]);
break;
case "Scale":
$data[$question->id] = $this->getScaleQuestionSkeleton($data[$question->id]);
break;
case "Textbox":
case "Text":
default:
//No action needed;
break;
}
}
return $data;
}
}