Your IP : 216.73.216.224


Current Path : /var/www/html/administrator/components/com_jssupportticket/models/
Upload File :
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;
    }
}
?>