This commit is contained in:
Nejc Kovač 2022-07-27 15:15:53 +02:00
commit 074b6ea695
10 changed files with 1870 additions and 1546 deletions

View File

@ -9,7 +9,9 @@
- kdaj se poslje sporocilo? ob 8h zjutraj?
- se lahko zacne sekvenca na npr. 2. anketi (oz. se preskoci anketo 2...?)
- besedilo opomnika, ki se posilja v mailu?
- status "koncano" - mora respondent prikilkati do konca ankete? Drugace ne moremo posiljati opomnika.
- smtp??
*/
@ -17,6 +19,16 @@
class Kolektor {
// Statusi responsa
private $statuses = array(
1 => 'proženo',
2 => 'opozorilo 1',
3 => 'opozorilo 3',
4 => 'neodgovorjeno',
5 => 'končano'
);
function __construct(){
global $site_url;
global $lang;
@ -79,7 +91,7 @@ class Kolektor {
global $site_url;
global $lang;
echo '<button class="medium blue" onClick="createKolektorResponsePopup();">Proži novo anketo</button>';
echo '<button class="large blue kolektor_create_response" onClick="kolektorCreateResponsePopup();">Proži novo anketo</button>';
echo '<div id="kolektor_reponses_holder">';
$this->displayResponses();
@ -112,7 +124,7 @@ class Kolektor {
echo ' <td>'.$response['respondent_email'].'</td>';
echo ' <td>'.$response['respondent_funkcija'].'</td>';
echo ' <td>'.date('j.n.Y H:i:s', strtotime($response['insert_time'])).'</td>';
echo ' <td>'.$response['status'].'</td>';
echo ' <td>'.$this->statuses[$response['status']].'</td>';
echo ' <td>Pošlji opomnik</td>'; // TODO
echo ' </tr>';
}
@ -123,7 +135,7 @@ class Kolektor {
// Prikaze formo za dodajanje novega responsa
public function displayAddResponse($data=array(), $error=array()){
echo '<div class="popup_close"><a href="#" onclick="createKolektorResponseClose();">✕</a></div>';
echo '<div class="popup_close"><a href="#" onclick="kolektorCreateResponseClose();">✕</a></div>';
echo '<h2>Dodajanje novega respondenta</h2>';
@ -137,9 +149,11 @@ class Kolektor {
echo 'Prosimo izpolnite vsa obvezna polja:';
echo '<ul>';
foreach($error as $error_msg){
echo '<div class="error_message">'.$error_msg.'</div>';
echo '<li class="error_message">'.$error_msg.'</li>';
}
echo '</ul>';
echo '</div>';
}
@ -147,31 +161,42 @@ class Kolektor {
// Seznam 6 kolektor anket
echo '<div class="kolektor_setting '.(isset($error['ank_id']) ? 'error' : '').'">';
echo ' <span class="setting_line">Anketa:</span>';
$surveys = $this->getSurveys();
$sequence = 0;
foreach($surveys as $kolektor_survey){
echo ' <input type="radio" id="kolektor_survey_'.$kolektor_survey['survey_sequence'].'" name="kolektor_survey" value="'.$kolektor_survey['ank_id'].'" '.($data['ank_id'] == $kolektor_survey['ank_id'] ? 'checked="checked"' : '').'>';
echo '<span class="setting_line">';
echo ' <input type="radio" id="kolektor_survey_'.$kolektor_survey['survey_sequence'].'" name="kolektor_survey" sequence="'.$kolektor_survey['survey_sequence'].'" value="'.$kolektor_survey['ank_id'].'" '.($data['ank_id'] == $kolektor_survey['ank_id'] ? 'checked="checked"' : '').' onChange="kolektorSelectSurvey();">';
echo ' <label for="kolektor_survey_'.$kolektor_survey['survey_sequence'].'">'.$kolektor_survey['survey_sequence'].' - '.$kolektor_survey['naslov'].'</label>';
echo '</span>';
if($data['ank_id'] == $kolektor_survey['ank_id'])
$sequence = $kolektor_survey['survey_sequence'];
}
echo '</div>';
echo '<div id="kolektor_respondent_settings" '.(($sequence == 0) ? 'style="display:none;"' : '').'>';
// ID projekta
echo '<div class="kolektor_setting '.(isset($error['respondent_projekt_id']) ? 'error' : '').'">';
echo ' ID projekta: <input type="text" name="respondent_projekt_id" value="'.$data['respondent_projekt_id'].'">';
echo ' <span class="setting_line">ID projekta:</span>';
echo ' <input type="text" class="medium" name="respondent_projekt_id" value="'.$data['respondent_projekt_id'].'">';
echo '</div>';
// Email
echo '<div class="kolektor_setting '.(isset($error['respondent_email']) ? 'error' : '').'">';
echo ' Email respondenta: <input type="text" name="respondent_email" value="'.$data['respondent_email'].'">';
echo ' <span class="setting_line">Email respondenta:</span>';
echo ' <input type="text" class="medium" name="respondent_email" value="'.$data['respondent_email'].'">';
echo '</div>';
// Funkcija respondenta
echo '<div class="kolektor_setting '.(isset($error['respondent_funkcija']) ? 'error' : '').'">';
echo ' Funkcija respondenta v podjetju: ';
echo ' <select name="respondent_funkcija">';
echo ' <span class="setting_line">Funkcija respondenta v podjetju:</span>';
echo ' <span class="setting_line"><select name="respondent_funkcija" class="dropdown medium">';
echo ' <option value="Vodja nabave" '.($data['respondent_funkcija'] == 'Vodja nabave' ? 'selected="selected"' : '').'>Vodja nabave</option>';
echo ' <option value="Vodja projekta" '.($data['respondent_funkcija'] == 'Vodja projekta' ? 'selected="selected"' : '').'>Vodja projekta</option>';
echo ' <option value="Skrbnik pogodbe" '.($data['respondent_funkcija'] == 'Skrbnik pogodbe' ? 'selected="selected"' : '').'>Skrbnik pogodbe</option>';
@ -183,25 +208,26 @@ class Kolektor {
// Aktivacija na daljavo - samo za anketi 5 in 6 - TODO
if(true){
echo '<div class="kolektor_setting '.(isset($error['respondent_remote_activation']) ? 'error' : '').'">';
echo ' Aktivacija na daljavo:';
echo ' <input type="radio" id="respondent_remote_activation_0" name="respondent_remote_activation" value="0" '.($data['respondent_remote_activation'] == '0' ? 'checked="checked"' : '').'><label for="respondent_remote_activation_0">Ne</label>';
echo ' <input type="radio" id="respondent_remote_activation_1" name="respondent_remote_activation" value="1" '.($data['respondent_remote_activation'] == '1' ? 'checked="checked"' : '').'><label for="respondent_remote_activation_1">Da</label>';
echo '<div id="kolektor_setting_activation" class="kolektor_setting '.(isset($error['respondent_remote_activation']) ? 'error' : '').'" '.(($sequence == 5 && $sequence == 6) ? '' : 'style="display:none;"').'>';
echo ' <span class="setting_line">Aktivacija na daljavo:</span>';
echo ' <span class="setting_line"><input type="radio" id="respondent_remote_activation_0" name="respondent_remote_activation" value="0" '.($data['respondent_remote_activation'] == '0' ? 'checked="checked"' : '').'><label for="respondent_remote_activation_0">Ne</label></span>';
echo ' <span class="setting_line"><input type="radio" id="respondent_remote_activation_1" name="respondent_remote_activation" value="1" '.($data['respondent_remote_activation'] == '1' ? 'checked="checked"' : '').'><label for="respondent_remote_activation_1">Da</label></span>';
echo '</div>';
}
// Sporocilo respondentu
echo '<div class="kolektor_setting '.(isset($error['respondent_message']) ? 'error' : '').'">';
echo ' Spremno besedilo: <textarea name="respondent_message">'.$data['respondent_message'].'</textarea>';
echo ' <span class="setting_line">Spremno besedilo:</span>';
echo ' <textarea name="respondent_message">'.$data['respondent_message'].'</textarea>';
echo '</div>';
// Gumbi
echo '<div class="button_holder">';
echo ' <button class="medium white-blue" type="button" onClick="createKolektorResponseClose();">Zapri</button>';
echo ' <button class="medium blue" type="button" onClick="createKolektorResponse();">Sproži anketo in pošlji email respondentu</button>';
echo ' <button class="medium white-blue" type="button" onClick="kolektorCreateResponseClose();">Zapri</button>';
echo ' <button class="medium blue" type="button" onClick="kolektorCreateResponse();">Sproži anketo in pošlji email respondentu</button>';
echo '</div>';
echo '</div>';
@ -241,22 +267,22 @@ class Kolektor {
// Pohendlamo errorje
$error = array();
if($response_data['ank_id'] == ''){
$error['ank_id'] = 'Izberite anketo.';
$error['ank_id'] = 'izberite anketo';
}
if($response_data['respondent_email'] == ''){
$error['respondent_email'] = 'Vnesite email respondenta.';
$error['respondent_email'] = 'vnesite email respondenta';
}
if($response_data['respondent_funkcija'] == ''){
$error['respondent_funkcija'] = 'Vnesite funkcijo respondenta.';
$error['respondent_funkcija'] = 'vnesite funkcijo respondenta';
}
if($response_data['respondent_projekt_id'] == ''){
$error['respondent_projekt_id'] = 'Vnesite ID projekta oz. krovnega projekta.';
$error['respondent_projekt_id'] = 'vnesite ID projekta oz. krovnega projekta';
}
if($response_data['respondent_remote_activation'] == ''){
$error['respondent_remote_activation'] = 'Izberite, če gre za aktivacijo na daljavo.';
if($response_data['respondent_remote_activation'] == '' && isset($_POST['respondent_remote_activation'])){
$error['respondent_remote_activation'] = 'izberite, če gre za aktivacijo na daljavo';
}
if($response_data['respondent_message'] == ''){
$error['respondent_message'] = 'Vnesite spremno besedilo.';
$error['respondent_message'] = 'vnesite spremno besedilo';
}

View File

@ -4,47 +4,99 @@
class KolektorNotifications {
function __construct(){
private $response;
// Statusi responsa
private $statuses = array(
1 => 'proženo',
2 => 'opozorilo 1',
3 => 'opozorilo 3',
4 => 'neodgovorjeno',
5 => 'končano'
);
function __construct($respondent_id){
global $site_url;
global $lang;
if($respondent_id != '' && $respondent_id > 0){
$kr = new KolektorResponse($respondent_id);
$this->response = $kr->getResponse();
}
}
// Posljemo mail z obvestilom uredniku, da je bil spremenjen status responsa
public function sendNotification(){
$survey_title = SurveyInfo::getInstance()->getSurveyTitle();
$user_email = User::getInstance($this->response['usr_id'])->primaryEmail();
$subject = 'Kolektor ETRA 1KA - sprememba statusa respondenta';
$body = 'Status respondenta '.$this->response['respondent_email'].' ('.$this->response['respondent_funkcija'].') v anketi '.$survey_title.' je bil spremenjen na '.$this->response['status'].' - '.$this->statuses[$this->response['status']].'.';
// Posljemo mail
try{
$MA = new MailAdapter();
$MA->addRecipients($user_email);
echo $subject;
echo '<br>';
echo $body;
//$resultX = $MA->sendMail($body, $subject);
}
catch (Exception $e){
}
}
// Posljemo mail respondentu z vabilom na anketo
public function sendRespondentNotification(){
$subject = 'Kolektor ETRA - vabilo na anketo';
// Dobimo url povezave na anketo
$kr = new KolektorResponse($this->response['respondent_id']);
$url = $kr->getResponseURL();
$body = $this->response['respondent_message'];
$body .= '<br><br>'.$url;
// Posljemo mail
try{
$MA = new MailAdapter();
$MA->addRecipients($this->response['respondent_email']);
echo $subject;
echo '<br>';
echo $body;
//$resultX = $MA->sendMail($body, $subject);
}
catch (Exception $e){
}
}
// Loop cez vse response in posljemo notificatione glede na statuse
public function executeCronJob(){
public static function executeCronJob(){
// Status 1 - "prozeno" - preklopimo na status 2 "opozorilo 1"
if($this->response['status'] == 0){
}
// Status 2 - "opozorilo 1" - preklopimo na status 3 "opozorilo 3"
elseif($this->response['status'] == 1){
}
// Status 3 "opozorilo 3" - preklopimo na status 4 "neodgovorjeno"
elseif($this->response['status'] == 2){
}
private function sendNotification($response_id){
$response = new KolektorResponse($response_id);
// Status 0 - "prozeno" - preklopimo na status 1 "opozorilo 1"
if($response->getStatus() == 0){
}
// Status 1 - "opozorilo 1" - preklopimo na status 2 "opozorilo 3"
elseif($response->getStatus() == 1){
}
// Status 2 "opozorilo 3" - preklopimo na status 3 "neodgovorjeno"
elseif($response->getStatus() == 2){
}
// Posljemo mail
// Spremenimo status
}
}

View File

@ -6,13 +6,22 @@ class KolektorResponse {
private $response = array();
// Statusi responsa
private $statuses = array(
1 => 'proženo',
2 => 'opozorilo 1',
3 => 'opozorilo 3',
4 => 'neodgovorjeno',
5 => 'končano'
);
function __construct($response_id){
function __construct($respondent_id){
global $site_url;
global $lang;
// Dobimo podatke responsa
$sql = sisplet_query("SELECT * FROM kolektor_survey_response WHERE id='".$response_id."'");
$sql = sisplet_query("SELECT * FROM kolektor_survey_response WHERE respondent_id='".$respondent_id."'");
if(mysqli_num_rows($sql) == 0){
echo 'Napaka! Odgovor ne obstaja.';
@ -23,10 +32,45 @@ class KolektorResponse {
$this->response = $row;
}
public function getStatus(){
return $this->response['status'];
// Vrnemo array response
public function getResponse(){ return $this->response; }
// Vrnemo URL za dostop respondenta do ankete
public function getResponseURL(){
$nice_url = SurveyInfo::getSurveyLink();
// Dobimo kodo za prepoznavo respondenta
$sql = sisplet_query("SELECT pass FROM srv_user WHERE id='".$this->response['respondent_id']."'");
if(mysqli_num_rows($sql) == 0){
return false;
}
$row = mysqli_fetch_array($sql);
$url = $nice_url.'&code='.$row['pass'];
$url .= '&kolemail='.$this->response['respondent_email'];
$url .= '&kolprojekt='.$this->response['respondent_projekt_id'];
$url .= '&kolfunkc='.$this->response['respondent_funkcija'];
$url .= '&kolactivat='.$this->response['respondent_remote_activation'];
return $url;
}
// Shranjevanje novega statusa in posiljanje obvestila uredniku
public function setStatus($status){
// Shranimo nov status za response
$sql = sisplet_query("UPDATE kolektor_survey_response SET status='".$status."' WHERE respondent_id='".$this->response['respondent_id']."'");
// Posljemo obvestilo uredniku
$kn = new KolektorNotifications($this->response['respondent_id']);
$kn->sendNotification();
}
// Dodajanje responsa
public static function addResponse($response_data){
@ -54,12 +98,6 @@ class KolektorResponse {
$url .= '&kolfunkc='.$response_data['respondent_funkcija'];
$url .= '&kolactivat='.$response_data['respondent_remote_activation'];
// Poslji email z vabilom na anketo - TODO
echo 'URL: '.$url;
// Ce vse ok, nastavimo status na e-posta - neodgovor
$sql_user = sisplet_query("UPDATE srv_user SET last_status='1' WHERE id='".$respondent_id."'");
// Dodaj respondenta v kolektor bazo
$sql_kolektor = sisplet_query("INSERT INTO kolektor_survey_response
@ -91,10 +129,16 @@ class KolektorResponse {
}
$response_id = mysqli_insert_id($GLOBALS['connect_db']);
// Ce vse ok, nastavimo status na e-posta - neodgovor
$sql_user = sisplet_query("UPDATE srv_user SET last_status='1' WHERE id='".$respondent_id."'");
if($response = new KolektorResponse($response_id)){
// Poslji email z vabilom na anketo
$kn = new KolektorNotifications($respondent_id);
$kn->sendRespondentNotification();
// Uspesno prozenje
echo '<div class="popup_close"><a href="#" onclick="window.location.reload();">✕</a></div>';
echo '<h2>Dodajanje novega respondenta</h2>';
@ -105,14 +149,8 @@ class KolektorResponse {
echo '<div class="button_holder">';
echo ' <button class="medium white-blue" type="button" onClick="window.location.reload();">Zapri</button>';
echo '</div>';
}
return $response;
}
else{
echo 'Napaka pri dodajanju odgovora!';
return false;
}
}
}
?>

View File

@ -1,5 +1,5 @@
function createKolektorResponsePopup(){
function kolektorCreateResponsePopup(){
$("#fullscreen").addClass('PopUpNarrow').addClass('divPopUp');
$("#fullscreen").load('ajax.php?t=kolektor&a=add_repsonse_popup', function() {
@ -9,16 +9,39 @@ function createKolektorResponsePopup(){
});
}
function createKolektorResponseClose(){
function kolektorCreateResponseClose(){
$('#fade').fadeOut('slow');
$('#fullscreen').fadeOut('slow').html('');
}
function createKolektorResponse(){
function kolektorCreateResponse(){
var form = $("#kolektor_add_response_form").serializeArray();
$('#kolektor_add_response').load('ajax.php?t=kolektor&a=add_repsonse', form);
}
function kolektorSelectSurvey(){
var survey_sequence = $('input[name="kolektor_survey"]:checked').attr("sequence");
console.log(survey_sequence);
if(survey_sequence > 0 && survey_sequence < 7){
$('#kolektor_respondent_settings').slideDown();
if(survey_sequence == 5 || survey_sequence == 6){
$('#kolektor_setting_activation').slideDown();
}
else{
$('#kolektor_setting_activation').slideUp();
}
}
else{
$('#kolektor_respondent_settings').slideUp();
}
}

View File

@ -25,6 +25,7 @@ use GDPR;
use MAZA;
use UserAccess;
use SurveyCheck;
use KolektorResponse;
class InitClass extends Controller
@ -1322,8 +1323,14 @@ class InitClass extends Controller
$u = sisplet_query($sqlString);
}
// Modul kolektor - shranimo poseben status "koncano - 5" in posljemo opomnik
if(Common::checkModule('kolektor') == '1' && $status == '6'){
$kr = new KolektorResponse(get('usr_id'));
$kr->setStatus($kolektor_status='5');
}
}
// updatamo samo datum - tip se ni spremenil
} else {
else {
SurveySetting::getInstance()->Init(get('anketa'));
$date = SurveySetting::getInstance()->getSurveyMiscSetting('survey_date');
@ -1334,7 +1341,6 @@ class InitClass extends Controller
# osvežimo datum spremembe
sisplet_query("UPDATE srv_user SET time_edit = " . $_time_insert . ", language='" . get('language') . "' WHERE id='" . get('usr_id') . "'");
}
// Ce ne belezimo parapodatka za cas responsa, anonimno zabelezimo cas zadnjega responsa

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,62 @@
.page_kolektor{
button.kolektor_create_response{
margin-bottom: 40px;
}
// Tabela responsov
table.kolektor_reponses{
width: 100%;
}
}
// Popup za dodajanje respondenta
#kolektor_add_response{
max-height: 95vh;
overflow-y: auto;
#kolektor_add_response_form{
display: flex;
flex-direction: column;
.error_messages{
margin-bottom: 16px;
font-weight: 600;
ul{
margin: 0;
li.error_message{
}
}
}
.kolektor_setting{
display: flex;
flex-direction: column;
margin-bottom: 8px;
&.error{
color: $red;
}
.setting_line{
margin-top: 8px;
}
}
#kolektor_respondent_settings{
display: flex;
flex-direction: column;
}
}
}

View File

@ -0,0 +1,7 @@
/*
Custom modules
*/
// Modul za kolektor
@import "kolektor";

View File

@ -12,6 +12,9 @@
// Page specific styles (survey editing, analysis...)
@import "pages/pages";
// Custom modules
@import "modules/modules";
// Mobile styles
@import "mobile/mobile";

View File

@ -9609,25 +9609,28 @@ CREATE TABLE kolektor_survey_response(
id INT(11) NOT NULL auto_increment,
ank_id INT(11) NOT NULL DEFAULT 0,
usr_id INT(11) NOT NULL DEFAULT 0,
insert_time DATETIME(3) NOT NULL,
status ENUM('0','1','2','3','4') NOT NULL DEFAULT '0',
respondent_id INT(11) NOT NULL DEFAULT 0,
insert_time DATETIME(3) NOT NULL,
status ENUM('1','2','3','4','5') NOT NULL DEFAULT '1',
respondent_email VARCHAR(100) NOT NULL DEFAULT '',
respondent_funkcija VARCHAR(100) NOT NULL DEFAULT '',
respondent_projekt_id VARCHAR(100) NOT NULL DEFAULT '',
respondent_remote_activation ENUM('0','1') NOT NULL DEFAULT '0',
respondent_message TEXT NOT NULL DEFAULT '',
PRIMARY KEY (id),
UNIQUE KEY (respondent_id),
CONSTRAINT fk_kolektor_survey_response_ank_id FOREIGN KEY (ank_id) REFERENCES srv_anketa (id) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT fk_kolektor_survey_response_usr_id FOREIGN KEY (usr_id) REFERENCES users (id) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT fk_kolektor_survey_response_respondent_id FOREIGN KEY (respondent_id) REFERENCES srv_user (id) ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY (id)
CONSTRAINT fk_kolektor_survey_response_respondent_id FOREIGN KEY (respondent_id) REFERENCES srv_user (id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE kolektor_survey_response_alert(
kolektor_survey_response_id INT(11) NOT NULL,
id INT(11) NOT NULL auto_increment,
respondent_id INT(11) NOT NULL DEFAULT 0,
alert_time DATETIME(3) NOT NULL,
new_status ENUM('0','1','2','3','4') NOT NULL,
CONSTRAINT kolektor_survey_response_alert_kolektor_survey_response_id FOREIGN KEY (kolektor_survey_response_id) REFERENCES kolektor_survey_response (id) ON DELETE CASCADE ON UPDATE CASCADE
PRIMARY KEY (id),
CONSTRAINT kolektor_survey_response_alert_respondent_id FOREIGN KEY (respondent_id) REFERENCES srv_user (id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE kolektor_podjetje_funkcija(