| Current Path : /var/www/html/administrator/components/com_jssupportticket/models/ |
| Current File : /var/www/html/administrator/components/com_jssupportticket/models/gdpr.php |
<?php
/**
* @Copyright Copyright (C) 2015 ... Ahmad Bilal
* @license GNU/GPL http://www.gnu.org/copyleft/gpl.html
* Company: Buruj Solutions
+ Contact: www.burujsolutions.com , info@burujsolutions.com
* Created on: Feb 24, 2020
^
+ Project: JS Tickets
^
*/
defined('_JEXEC') or die('Not Allowed');
jimport('joomla.application.component.model');
jimport('joomla.html.html');
class JSSupportticketModelGdpr extends JSSupportTicketModel {
function __construct() {
parent::__construct();
}
function getEraseDataRequests($email,$limitstart,$limit){
$db = JFactory::getDbo();
$query = "SELECT COUNT(id) FROM `#__js_ticket_erasedatarequests`";
$db->setQuery($query);
$total = $db->loadObjectList();
$result = array();
$inquery = '';
if ($email != null){
$email = trim($email);
$inquery .= " WHERE user.email = " . $db->quote($email);
}
// Data
$query = "SELECT request.*, user.email
FROM `#__js_ticket_erasedatarequests` AS request
LEFT JOIN `#__users` AS user ON user.ID = request.uid
";
$query .= $inquery;
$query .= " ORDER BY request.created DESC ";
$db->setQuery($query, $limitstart, $limit);
$data = $db->loadObjectList();
$result[0] = $data;
$result[1] = $total;
return $result;
}
function getUserEraseDataRequest($uid){
if($uid == 0){
return;
}
$db = JFactory::getDbo();
$query = "SELECT * FROM `#__js_ticket_erasedatarequests` WHERE uid = $uid";
$db->setQuery($query);
$gdprfields = $db->loadObject();
return $gdprfields;
}
function storeUserEraseRequest($data){
if (!$data['id']) { //new
$user = JSSupportTicketCurrentUser::getInstance();
$data['created'] = date('Y-m-d H:i:s');
$data['uid'] = $user->getId();
$data['status'] = 1;
}
$data = filter_var_array($data, FILTER_SANITIZE_STRING);
$data['message'] = JFactory::getApplication()->input->get('message', '', 'raw');
$row = $this->getTable('erasedatarequests');
$data = $this->getJSmodel('jssupportticket')->stripslashesFull($data);// remove slashes with quotes.
$error = 0;
$return_value = true;
if (!$row->bind($data)) {
$this->setError($row->getError());
$return_value = false;
}
if(!$data['id'])
if (!$row->check()) {
$this->setError($row->getError());
return MESSAGE_EMPTY;
}
if (!$row->store()) {
$this->getJSModel('systemerrors')->updateSystemErrors($row->getErrorMsg());
$this->setError($row->getError());
$return_value = false;
}
if ($return_value) {
if(isset($data['id']) && $data['id'] == ''){
$this->getJSModel('email')->sendMail(4, 1, $user->getId(),'users'); // Mailfor, Delete request receive
}
return SAVED;
} else {
return SAVE_ERROR;
}
return;
}
function deleteUserEraseRequest($id){
if(!is_numeric($id)){
return false;
}
if($this->checkCanDelete($id)){
$row = $this->getTable('erasedatarequests');
if ($row->delete($id)) {
return DELETED;
} else {
$this->getJSModel('systemerrors')->updateSystemErrors($db->getErrorMsg());
$this->setError($db->getErrorMsg());
return DELETE_ERROR;
}
}
return PERMISSION_ERROR;
}
function checkCanDelete($id){
// if(current_user_can('manage_options')){ // allow admin to delete ??
// return true;
// }
$db = JFactory::getDbo();
$user = JSSupportTicketCurrentUser::getInstance();
$uid = $user->getId();
$query = "SELECT uid FROM `#__js_ticket_erasedatarequests` WHERE id = $id";
$db->setQuery($query);
$db_uid = $db->loadResult();
if( $db_uid == $uid){
return true;
}else{
return false;
}
}
private function getUserDetailReportByUserId( $uid = 0){
$db = JFactory::getDbo();
$curdate = JFactory::getApplication()->input->get('date_start', 'get');
$fromdate = JFactory::getApplication()->input->get('date_end', 'get');
if($uid == 0 || $uid == ''){
$id = JFactory::getApplication()->input->get('uid', 'get');
}else{
$id = $uid;
$query = "SELECT created FROM `#__js_ticket_tickets` WHERE uid = ".$id ." ORDER BY created ASC LIMIT 1";
$db->setQuery($query);
$curdate = $db->loadResult();
$fromdate = date('Y-m-d H:i:s');
}
if( empty($curdate) OR empty($fromdate))
return null;
if(! is_numeric($id))
return null;
$result['curdate'] = $curdate;
$result['fromdate'] = $fromdate;
$result['id'] = $id;
//Query to get Data
$query = "SELECT created FROM `#__js_ticket_tickets` WHERE status = 0 AND (lastreply = '0000-00-00 00:00:00' OR lastreply IS NULL) AND created >= '" . $curdate . "' AND created <= '" . $fromdate . "'";
if($id) $query .= " AND uid = ".$id;
$db->setQuery($query);
$result['openticket'] = $db->loadObjectList();
$query = "SELECT created FROM `#__js_ticket_tickets` WHERE status = 4 AND created >= '" . $curdate . "' AND created <= '" . $fromdate . "'";
if($id) $query .= " AND uid = ".$id;
$db->setQuery($query);
$result['closeticket'] = $db->loadObjectList();
$query = "SELECT created FROM `#__js_ticket_tickets` WHERE isanswered = 1 AND status != 4 AND status != 0 AND created >= '" . $curdate . "' AND created <= '" . $fromdate . "'";
if($id) $query .= " AND uid = ".$id;
$db->setQuery($query);
$result['answeredticket'] = $db->loadObjectList();
$query = "SELECT created FROM `#__js_ticket_tickets` WHERE isoverdue = 1 AND status != 4 AND created >= '" . $curdate . "' AND created <= '" . $fromdate . "'";
if($id) $query .= " AND uid = ".$id;
$db->setQuery($query);
$result['overdueticket'] = $db->loadObjectList();
$query = "SELECT created FROM `#__js_ticket_tickets` WHERE isanswered != 1 AND status != 4 AND (lastreply != '0000-00-00 00:00:00' ) AND created >= '" . $curdate . "' AND created <= '" . $fromdate . "'";
if($id) $query .= " AND uid = ".$id;
$db->setQuery($query);
$result['pendingticket'] = $db->loadObjectList();
//user detail
$query = "SELECT user.name as display_name,user.email AS user_email,user.username,user.id,
(SELECT COUNT(id) FROM `#__js_ticket_tickets` WHERE status = 0 AND (lastreply = '0000-00-00 00:00:00' OR lastreply IS NULL) AND created >= '" . $curdate . "' AND created <= '" . $fromdate . "' AND uid = user.id) AS openticket,
(SELECT COUNT(id) FROM `#__js_ticket_tickets` WHERE status = 4 AND created >= '" . $curdate . "' AND created <= '" . $fromdate . "' AND uid = user.id) AS closeticket,
(SELECT COUNT(id) FROM `#__js_ticket_tickets` WHERE isanswered = 1 AND status != 4 AND status != 0 AND created >= '" . $curdate . "' AND created <= '" . $fromdate . "' AND uid = user.id) AS answeredticket,
(SELECT COUNT(id) FROM `#__js_ticket_tickets` WHERE isoverdue = 1 AND status != 4 AND created >= '" . $curdate . "' AND created <= '" . $fromdate . "' AND uid = user.id) AS overdueticket,
(SELECT COUNT(id) FROM `#__js_ticket_tickets` WHERE isanswered != 1 AND status != 4 AND (lastreply != '0000-00-00 00:00:00' ) AND created >= '" . $curdate . "' AND created <= '" . $fromdate . "' AND uid = user.id) AS pendingticket
FROM `#__users` AS user
WHERE user.id = ".$id;
$db->setQuery($query);
$user = $db->loadObject();
$result['users'] = $user;
//Tickets
$query = "SELECT ticket.*,priority.priority, priority.prioritycolour ,feedback.rating
FROM `#__js_ticket_tickets` AS ticket
JOIN `#__js_ticket_priorities` AS priority ON priority.id = ticket.priorityid
LEFT JOIN `#__js_ticket_feedbacks` AS feedback ON feedback.ticketid = ticket.id
WHERE uid = ".$id." AND ticket.created >= '" . $curdate . "' AND ticket.created <= '" . $fromdate . "' ";
$db->setQuery($query);
$result['tickets'] = $db->loadObjectList();
foreach ($result['tickets'] as $ticket) {
$ticket->time = $this->getJSModel('staff')->getTimeTakenByTicketId($ticket->id);
}
return $result;
}
function setUserExportByuid($uid = 0){
$tb = "\t";
$nl = "\n";
$result = $this->getUserDetailReportByUserId($uid);
if(empty($result))
return '';
$fromdate = date('Y-m-d',strtotime($result['curdate']));
$fromdate = date('Y-m-d',strtotime($result['curdate']));
$todate = date('Y-m-d',strtotime($result['fromdate']));
$data = JText::_('User Report').' '.JText::_('From').' '.$fromdate.' - '.$todate.$nl.$nl;
// By 1 month
$data .= JText::_('Ticket status by days').$nl.$nl;
$data .= JText::_('Date').$tb.JText::_('New').$tb.JText::_('Answered').$tb.JText::_('Closed').$tb.JText::_('Pending').$tb.JText::_('Overdue').$nl;
while (strtotime($fromdate) <= strtotime($todate)) {
$openticket = 0;
$closeticket = 0;
$answeredticket = 0;
$overdueticket = 0;
$pendingticket = 0;
foreach ($result['openticket'] as $ticket) {
$ticket_date = date('Y-m-d', strtotime($ticket->created));
if($ticket_date == $fromdate)
$openticket += 1;
}
foreach ($result['closeticket'] as $ticket) {
$ticket_date = date('Y-m-d', strtotime($ticket->created));
if($ticket_date == $fromdate)
$closeticket += 1;
}
foreach ($result['answeredticket'] as $ticket) {
$ticket_date = date('Y-m-d', strtotime($ticket->created));
if($ticket_date == $fromdate)
$answeredticket += 1;
}
foreach ($result['overdueticket'] as $ticket) {
$ticket_date = date('Y-m-d', strtotime($ticket->created));
if($ticket_date == $fromdate)
$overdueticket += 1;
}
foreach ($result['pendingticket'] as $ticket) {
$ticket_date = date('Y-m-d', strtotime($ticket->created));
if($ticket_date == $fromdate)
$pendingticket += 1;
}
$data .= '"'.$fromdate.'"'.$tb.'"'.$openticket.'"'.$tb.'"'.$answeredticket.'"'.$tb.'"'.$closeticket.'"'.$tb.'"'.$pendingticket.'"'.$tb.'"'.$overdueticket.'"'.$nl;
$fromdate = date("Y-m-d", strtotime("+1 day", strtotime($fromdate)));
}
$data .= $nl.$nl.$nl;
// END By 1 month
// by staffs
$data .= JText::_('Users Tickets').$nl.$nl;
if(!empty($result['users'])){
$data .= JText::_('Name').$tb.JText::_('Username').$tb.JText::_('Email').$tb.JText::_('New').$tb.JText::_('Answered').$tb.JText::_('Closed').$tb.JText::_('Pending').$tb.JText::_('Overdue').$nl;
$key = $result['users'];
$agentname = $key->display_name;
$username = $key->username;
$email = $key->user_email;
$data .= '"'.$agentname.'"'.$tb.'"'.$username.'"'.$tb.'"'.$email.'"'.$tb.'"'.$key->openticket.'"'.$tb.'"'.$key->answeredticket.'"'.$tb.'"'.$key->closeticket.'"'.$tb.'"'.$key->pendingticket.'"'.$tb.'"'.$key->overdueticket.'"'.$nl;
$data .= $nl.$nl.$nl;
}
// by priorits tickets
$data .= JText::_('Tickets').$nl.$nl;
if(!empty($result['tickets'])){
$data .= JText::_('Subject').$tb.JText::_('Status').$tb.JText::_('Priority').$tb.JText::_('Created');
$data .= $tb.JText::_('Rating');
$data .= $tb.JText::_('Time');
$data .= $nl;
$status = '';
foreach ($result['tickets'] as $ticket) {
$hours = floor($ticket->time / 3600);
$mins = floor($ticket->time / 60 % 60);
$secs = floor($ticket->time % 60);
$time = sprintf('%02d:%02d:%02d', $hours, $mins, $secs);
switch($ticket->status){
case 0:
$status = JText::_('New');
if($ticket->isoverdue == 1)
$status = JText::_('Overdue');
break;
case 1:
$status = JText::_('Pending');
if($ticket->isoverdue == 1)
$status = JText::_('Overdue');
break;
case 2:
$status = JText::_('In Progress');
if($ticket->isoverdue == 1)
$status = JText::_('Overdue');
break;
case 3:
$status = JText::_('Answered');
if($ticket->isoverdue == 1)
$status = JText::_('Overdue');
break;
case 4:
$status = JText::_('Closed');
break;
case 5:
$status = JText::_('Merged');
break;
}
$created = date('Y-m-d',strtotime($ticket->created));
$data .= '"'.$ticket->subject.'"'.$tb.'"'.$status.'"'.$tb.'"'.JText::_($ticket->priority).'"'.$tb.'"'.$created.'"';
$data .= $tb.'"'.$ticket->rating.'"';
$data .= $tb.'"'.$time.'"';
$data .= $nl;
}
$data .= $nl.$nl.$nl;
}
return $data;
}
function anonymizeUserData($uid){
if(!is_numeric($uid) || $uid == 0){
return false;
}
$db = JFactory::getDbo();
$query = "SELECT id FROM `#__js_ticket_tickets` WHERE uid = ".$uid;
$db->setQuery($query);
$uids = $db->loadObjectList();
foreach ($uids as $ticket) { // erase tickets data
// ticket data
$query = "UPDATE `#__js_ticket_tickets` SET email = '---', subject = '---', message = '---', phone = '', phoneext = '', params = '' WHERE id = ".$ticket->id;
$db->setQuery($query);
$db->execute($query);
// erase replies data
$query = "SELECT replies.id AS replyid
FROM `#__js_ticket_replies` AS replies
WHERE replies.ticketid = ".$ticket->id;
$db->setQuery($query);
$replies = $db->loadObjectList();
foreach ($replies as $reply) {
$query = "UPDATE `#__js_ticket_replies` SET message = '----' WHERE ticketid = ".$ticket->id;
$db->setQuery($query);
$db->execute($query);
}
// internal note
$query = "SELECT notes.id AS noteid
FROM `#__js_ticket_notes` AS notes
WHERE notes.ticketid = ".$ticket->id;
$db->setQuery($query);
$notes = $db->loadObjectList();
foreach ($notes as $note) {
$query = "UPDATE `#__js_ticket_notes` SET title = '----' , note = '-----' WHERE id = ".$note->noteid;
$db->setQuery($query);
$db->execute($query);
}
// activity log
$query = "DELETE
FROM `#__js_ticket_activity_log`
WHERE eventfor = 1 AND referenceid = ".$ticket->id;
$db->setQuery($query);
$db->execute();
// ticket attachments.
$datadirectory = $this->getJSModel('config')->getConfigurationByName('data_directory');
$mainpath = JPATH_BASE;
if(JFactory::getApplication()->isClient('administrator')){
$mainpath = substr($mainpath, 0, strlen($mainpath) - 14); //remove administrator
}
$mainpath = $mainpath .'/'.$datadirectory;
$mainpath = $mainpath . '/attachmentdata';
$query = "SELECT ticket.attachmentdir
FROM `#__js_ticket_tickets` AS ticket
WHERE ticket.id = ".$ticket->id;
$db->setQuery($query);
$foldername = $db->loadResult();
if(!empty($foldername)){
$folder = $mainpath . '/ticket/'.$foldername;
if(file_exists($folder)){
$path = $mainpath . '/ticket/'.$foldername.'/*.*';
$files = glob($path);
array_map('unlink', $files);//deleting files
rmdir($folder);
}
}
$query = "DELETE FROM `#__js_ticket_attachments` WHERE ticketid = ".$ticket->id;
$db->setQuery($query);
$db->execute($query);
}
$query = "UPDATE `#__js_ticket_erasedatarequests` SET status = 2 WHERE uid = $uid";
$db->setQuery($query);
$db->execute($query);
$this->getJSModel('email')->sendMail(4, 2, $uid, 'users'); // Mailfor, Delete user data
return DELETED;
}
function deleteUserData($uid){
if(!is_numeric($uid) || $uid == 0){
return false;
}
$db = JFactory::getDbo();
$query = "SELECT id FROM `#__js_ticket_tickets` WHERE uid = ".$uid;
$db->setQuery($query);
$uids = $db->loadObjectList();
foreach ($uids as $ticket) { // erase tickets data
// ticket data
$row = $this->getTable('tickets');
$row->delete($ticket->id);
// delete internal notes
$this->getJSModel('note')->removeTicketInternalNote($ticket->id);
// delete replies
$this->getJSModel('ticket')->removeTicketReplies($ticket->id);
// ticket attachments.
$datadirectory = $this->getJSModel('config')->getConfigurationByName('data_directory');
$mainpath = JPATH_BASE;
if(JFactory::getApplication()->isClient('administrator')){
$mainpath = substr($mainpath, 0, strlen($mainpath) - 14); //remove administrator
}
$mainpath = $mainpath .'/'.$datadirectory;
$mainpath = $mainpath . '/attachmentdata';
$query = "SELECT ticket.attachmentdir
FROM `#__js_ticket_tickets` AS ticket
WHERE ticket.id = ".$ticket->id;
$db->setQuery($query);
$foldername = $db->loadResult();
if(!empty($foldername)){
$folder = $mainpath . '/ticket/'.$foldername;
if(file_exists($folder)){
$path = $mainpath . '/ticket/'.$foldername.'/*.*';
$files = glob($path);
array_map('unlink', $files);//deleting files
rmdir($folder);
}
}
$query = "DELETE FROM `#__js_ticket_attachments` WHERE ticketid = ".$ticket->id;
$db->setQuery($query);
$db->execute($query);
}
$query = "UPDATE `#__js_ticket_erasedatarequests` SET status = 3 WHERE uid = $uid";
$db->setQuery($query);
$db->execute($query);
$this->getJSModel('email')->sendMail(4, 2, $uid,'users'); // Mailfor, Delete User
return DELETED;
}
}
?>