<?php
namespace App\Repository;
use App\Entity\Log;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @method Log|null find($id, $lockMode = null, $lockVersion = null)
* @method Log|null findOneBy(array $criteria, array $orderBy = null)
* @method Log[] findAll()
* @method Log[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class LogRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Log::class);
}
/**
* @return Log[] Returns an array of Log objects
*/
public function findLatest($maxResult)
{
return $this->createQueryBuilder('u')
->orderBy('u.id', 'DESC')
->setMaxResults($maxResult)
->getQuery()
->getResult()
;
}
public function findByUser($u, $maxResult)
{
return $this->createQueryBuilder('u')
->andWhere('u.user = :i')
->setParameter('i', $u)
->orderBy('u.id', 'DESC')
->setMaxResults($maxResult)
->getQuery()
->getResult()
;
}
public function findAllByCompany($company, $maxResult = 20){
$query = $this->createQueryBuilder('a')
->andWhere('a.company = :co')
->setParameter('co', $company)
->setMaxResults($maxResult)
->getQuery()
->getResult();
return $query;
}
public function findByPage($page, $resultsPerPage, $order = 'ASC', $orderBy = "", $keyword = "", $company = "", $user = "", $start = "", $end = "", $logType = "", $logModule = "")
{
$keyword = filter_var($keyword, FILTER_SANITIZE_STRING);
$order = filter_var($order, FILTER_SANITIZE_STRING);
$orderBy = filter_var($orderBy, FILTER_SANITIZE_STRING);
// try {
$query = $this->createQueryBuilder('a')
->leftJoin('a.user', 'u')
->leftJoin('u.personalInfo', 'p')
->andWhere('a.company = :co')
->andWhere('a.message NOT LIKE :ts')->setParameter('ts', '%timesheet%')
->andWhere('a.message NOT LIKE :ta')->setParameter('ta', '%task%')
->setParameter('co', $company)
->setMaxResults($resultsPerPage)
->setFirstResult(($page - 1) * $resultsPerPage);
if($logModule !== ""){
if ($logModule == "leave") {
$query->andWhere('a.message != :excludeMessage')->setParameter('excludeMessage', 'log.leave.create');
}
$query->andWhere('REGEXP(a.message, :val) = 1')->setParameter('val', $logModule);
}
if ($keyword !== "") {
if($logType !== ""){
$query->andWhere('a.message LIKE :val')->setParameter('val', '%' . $keyword . '%');
}else{
if($logModule){
$regex2 = $logModule ? $logModule.".*".$keyword : '%' . $keyword . '%';
$query->andWhere('REGEXP(a.message, :mod) = 1 AND p.firstName LIKE :val')
->orWhere('REGEXP(a.message, :mod) = 1 AND p.middleName LIKE :val')
->orWhere('REGEXP(a.message, :mod) = 1 AND p.lastName LIKE :val')
->orWhere('REGEXP(a.message, :mod) = 1 AND CONCAT(p.firstName, \' \',p.lastName) LIKE :val')
->orWhere('REGEXP(a.message, :mod) = 1 AND CONCAT(p.firstName, \' \',p.middleName, \' \',p.lastName) LIKE :val')
->orWhere('REGEXP(a.message, :mod) = 1 AND a.userIP LIKE :val')
// ->orWhere('REGEXP(a.message, :regex2) = 1')
->orWhere('REGEXP(a.message, :regex2) = 1' . ($logModule == "leave" ? " AND a.message != 'log.leave.create'" : ""))
->setParameter('mod', $logModule)
->setParameter('val','%' . $keyword . '%')
->setParameter('regex2', $regex2);
}else{
$query->andWhere('p.firstName LIKE :val OR p.middleName LIKE :val OR p.lastName LIKE :val OR CONCAT(p.firstName, \' \',p.lastName) LIKE :val OR CONCAT(p.firstName, \' \',p.middleName, \' \',p.lastName) LIKE :val OR a.message LIKE :val OR a.userIP LIKE :val')->setParameter('val', '%' . $keyword . '%');
}
}
}
if($logType !== ""){
$query->andWhere('a.user is NULL')->andWhere('a.clientContact is NULL');
}else{
$query->andWhere('a.user is not NULL')->orWhere('a.clientContact is not NULL');
}
if($user !== ""){
$query->andWhere('u.id = :us')->setParameter('us', $user);
}
if ($start !== "" && $end !== ""){
$end = date("Y-m-d 23:59:59", strtotime($end));
$query->andWhere('a.timestamp >= :st AND a.timestamp <= :et')->setParameter('st', $start)->setParameter('et', $end);
}
if ($orderBy === "") {
$query->orderBy('a.id', 'DESC');
// } elseif ($orderBy == "member") {
// $query->select('count(a.users) as HIDDEN userCount');
// $query->orderBy('userCount', $order);
// } elseif ($orderBy == "job") {
// $query->orderBy('count(a.jobs)', $order);
}else {
$query->orderBy("a." . $orderBy, $order);
}
return $query->getQuery()->getResult();
// } catch (\Exception $exception) {
// return [];
// }
}
public function countByPage($keyword = "", $company ="", $user ="", $start = "", $end = "", $logType = "", $logModule = "")
{
$keyword = filter_var($keyword, FILTER_SANITIZE_STRING);
// try {
$query = $this->createQueryBuilder('a')
->leftJoin('a.user', 'u')
->leftJoin('u.personalInfo', 'p')
->andWhere('a.company = :co')
->setParameter('co', $company)
->andWhere('a.message NOT LIKE :ts')->setParameter('ts', '%timesheet%')
->andWhere('a.message NOT LIKE :ta')->setParameter('ta', '%task%')
->select('count(distinct(a.id))');
if($logModule !== ""){
if ($logModule == "leave") {
$query->andWhere('a.message != :excludeMessage')->setParameter('excludeMessage', 'log.leave.create');
}
$query->andWhere('REGEXP(a.message, :val) = 1')->setParameter('val', $logModule);
}
if ($keyword !== "") {
if($logType !== ""){
$query->andWhere('a.message LIKE :val')->setParameter('val', '%' . $keyword . '%');
}else{
if($logModule){
$regex2 = $logModule ? $logModule.".*".$keyword : '%' . $keyword . '%';
$query->andWhere('REGEXP(a.message, :mod) = 1 AND p.firstName LIKE :val')
->orWhere('REGEXP(a.message, :mod) = 1 AND p.middleName LIKE :val')
->orWhere('REGEXP(a.message, :mod) = 1 AND p.lastName LIKE :val')
->orWhere('REGEXP(a.message, :mod) = 1 AND CONCAT(p.firstName, \' \',p.lastName) LIKE :val')
->orWhere('REGEXP(a.message, :mod) = 1 AND CONCAT(p.firstName, \' \',p.middleName, \' \',p.lastName) LIKE :val')
->orWhere('REGEXP(a.message, :mod) = 1 AND a.userIP LIKE :val')
// ->orWhere('REGEXP(a.message, :regex2) = 1')
->orWhere('REGEXP(a.message, :regex2) = 1' . ($logModule == "leave" ? " AND a.message != 'log.leave.create'" : ""))
->setParameter('mod', $logModule)
->setParameter('val','%' . $keyword . '%')
->setParameter('regex2', $regex2);
}else{
$query->andWhere('p.firstName LIKE :val OR p.middleName LIKE :val OR p.lastName LIKE :val OR CONCAT(p.firstName, \' \',p.lastName) LIKE :val OR CONCAT(p.firstName, \' \',p.middleName, \' \',p.lastName) LIKE :val OR a.message LIKE :val OR a.userIP LIKE :val')->setParameter('val', '%' . $keyword . '%');
}
}
}
if($logType !== ""){
$query->andWhere('a.user is NULL');
}else{
$query->andWhere('a.user is not NULL');
}
if($user !== ""){
$query->andWhere('u.id = :us')->setParameter('us', $user);
}
if ($start !== "" && $end !== ""){
$end = date("Y-m-d 23:59:59", strtotime($end));
$query->andWhere('a.timestamp >= :st AND a.timestamp <= :et')->setParameter('st', $start)->setParameter('et', $end);
}
return $query->getQuery()->getSingleScalarResult();
// } catch (\Exception $exception) {
// return [];
// }
}
public function findByLogMessage($page, $resultsPerPage, $order = 'ASC', $orderBy = "", $message, $id = null, $type = null)
{
$query = $this->createQueryBuilder('l')
->andWhere('l.message LIKE :msg')
->setParameter('msg', $message)
->setMaxResults($resultsPerPage)
->setFirstResult(($page - 1) * $resultsPerPage);
if($id !== null){
$query->andWhere("JSON_EXTRACT(l.newData,'$.id') = :id")
->setParameter('id', $id);
}
if($type !== null){
// $query->andWhere("JSON_UNQUOTE(JSON_EXTRACT(l.oldData, :type)) != JSON_UNQUOTE(JSON_EXTRACT(l.newData, :type))")
// $query->andWhere("JSON_UNQUOTE(JSON_EXTRACT(l.oldData, :type)) != JSON_UNQUOTE(JSON_EXTRACT(l.newData, :type)) OR (JSON_UNQUOTE(JSON_EXTRACT(l.oldData, :type)) IS NULL AND JSON_UNQUOTE(JSON_EXTRACT(l.newData, :type)) IS NOT NULL)")
$query->andWhere("JSON_UNQUOTE(JSON_EXTRACT(l.oldData, :type)) != JSON_UNQUOTE(JSON_EXTRACT(l.newData, :type)) OR JSON_UNQUOTE(JSON_EXTRACT(l.oldData, :type)) IS NULL")
->setParameter('type', '$.'.$type);
}
$query->orderBy('l.id', $order);
return $query->getQuery()->getResult();
}
/*
public function findByExampleField($value)
{
return $this->createQueryBuilder('l')
->andWhere('l.exampleField = :val')
->setParameter('val', $value)
->orderBy('l.id', 'ASC')
->setMaxResults(10)
->getQuery()
->getResult()
;
}
*/
/*
public function findOneBySomeField($value): ?Log
{
return $this->createQueryBuilder('l')
->andWhere('l.exampleField = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}
*/
}