<?php
namespace App\Repository;
use App\Entity\LeaveRequestTrash;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\OptimisticLockException;
use Doctrine\ORM\ORMException;
use Doctrine\Persistence\ManagerRegistry;
/**
* @method LeaveRequestTrash|null find($id, $lockMode = null, $lockVersion = null)
* @method LeaveRequestTrash|null findOneBy(array $criteria, array $orderBy = null)
* @method LeaveRequestTrash[] findAll()
* @method LeaveRequestTrash[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class LeaveRequestTrashRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, LeaveRequestTrash::class);
}
/**
* @throws ORMException
* @throws OptimisticLockException
*/
public function add(LeaveRequestTrash $entity, bool $flush = true): void
{
$this->_em->persist($entity);
if ($flush) {
$this->_em->flush();
}
}
/**
* @throws ORMException
* @throws OptimisticLockException
*/
public function remove(LeaveRequestTrash $entity, bool $flush = true): void
{
$this->_em->remove($entity);
if ($flush) {
$this->_em->flush();
}
}
public function findByUser($u_id)
{
return $this->createQueryBuilder('l')
->andWhere('l.user = :u')
->setParameter('u', $u_id)
->getQuery()
->getResult();
}
public function findLeaveApproved($u_id)
{
return $this->createQueryBuilder('l')
->andWhere('l.isApproved = 1')
->andWhere('l.user = :u')
->setParameter('u', $u_id)
->select('SUM(l.days) as LeaveApprovedDays')
->getQuery()
->getResult();
}
public function findLeaveUnapproved($u_id)
{
return $this->createQueryBuilder('l')
->andWhere('l.isApproved = 0')
->andWhere('l.user = :u')
->setParameter('u', $u_id)
->select('SUM(l.days) as LeaveUnapprovedDays')
->getQuery()
->getResult();
}
public function findUncheckLeaveRequest()
{
return $this->createQueryBuilder('l')
->leftJoin('l.user', 'u')
->andWhere('l.isApproved is null')
->andWhere('u.isActive = :ia')
->setParameter('ia', 1)
->getQuery()
->getResult();
}
public function findTodayLeave()
{
$today = new \DateTime();
$today = $today->format('Y-m-d 00:00:00');
return $this->createQueryBuilder('l')
->leftJoin('l.user', 'u')
->andWhere('l.isApproved = :ac')
->setParameter('ac', 1)
->andWhere(':today BETWEEN l.startDate and l.endDate')
->setParameter('today', $today)
->andWhere('u.isActive = :ia')
->setParameter('ia', 1)
->getQuery()
->getResult();
}
public function findTodayLeaveByCompany($company,$ac = 1,$date=null)
{
if(is_null($date)){
$today = new \DateTime();
}else{
$today= new \DateTime($date);
}
$today = $today->format('Y-m-d 00:00:00');
$query = $this->createQueryBuilder('l')
->leftJoin('l.user', 'u')
->leftJoin('u.office', 'o')
->andWhere('o.company= :co')
->setParameter('co', $company)
->andWhere(':today BETWEEN l.startDate and l.endDate')
->setParameter('today', $today)
->andWhere('u.isActive = :ia')
->setParameter('ia', 1);
if($ac > -1){
$query->andWhere('l.isApproved = :ac')->setParameter('ac', 1);
}
$query->orderBy('l.startDate', 'ASC');
// $query->orderBy('l.endDate', 'ASC');
return $query->getQuery()->getResult();
}
public function findNextWeekLeave()
{
$startWeek = date("Y-m-d", strtotime("monday next week"));
$startWeek = new \DateTime($startWeek);
$startWeek = $startWeek->format('Y-m-d 00:00:00');
$endWeek = date("Y-m-d", strtotime("sunday next week"));
$endWeek = new \DateTime($endWeek);
$endWeek = $endWeek->format('Y-m-d 00:00:00');
return $this->createQueryBuilder('l')
->leftJoin('l.user', 'u')
->andWhere('l.isApproved = :ac')
->setParameter('ac', 1)
// ->andWhere('l.startDate BETWEEN :start and :end OR l.endDate BETWEEN :start and :end')
->andWhere('l.startDate BETWEEN :start and :end OR l.endDate BETWEEN :start and :end OR l.startDate < :start and l.endDate > :end')
->setParameter('start', $startWeek)
->setParameter('end', $endWeek)
->andWhere('u.isActive = :ia')
->setParameter('ia', 1)
->getQuery()
->getResult();
}
public function findNextWeekLeaveByCompany($company)
{
$startWeek = date("Y-m-d", strtotime("monday next week"));
$startWeek = new \DateTime($startWeek);
$startWeek = $startWeek->format('Y-m-d 00:00:00');
$endWeek = date("Y-m-d", strtotime("friday next week"));
$endWeek = new \DateTime($endWeek);
$endWeek = $endWeek->format('Y-m-d 00:00:00');
return $this->createQueryBuilder('l')
->leftJoin('l.user', 'u')
->leftJoin('u.office', 'o')
->andWhere('o.company= :co')
->setParameter('co', $company)
->andWhere('l.isApproved = :ac')
->setParameter('ac', 1)
// ->andWhere('l.startDate BETWEEN :start and :end OR l.endDate BETWEEN :start and :end')
->andWhere('l.startDate BETWEEN :start and :end OR l.endDate BETWEEN :start and :end OR l.startDate < :start and l.endDate > :end')
->setParameter('start', $startWeek)
->setParameter('end', $endWeek)
->andWhere('u.isActive = :ia')
->setParameter('ia', 1)
->orderBy('l.startDate', 'ASC')
// ->orderBy('l.endDate', 'ASC')
->getQuery()
->getResult();
}
public function findByPage($page, $resultsPerPage, $keyword = "", $order = 'ASC', $orderBy = "", $manager = "", $leaveStatus = "", $leaveTypeName = "", $office = "", $start, $end, \App\Entity\User $user = null)
{
$keyword = filter_var($keyword, FILTER_SANITIZE_STRING);
$order = filter_var($order, FILTER_SANITIZE_STRING);
$orderBy = filter_var($orderBy, FILTER_SANITIZE_STRING);
$leaveStatus = filter_var($leaveStatus, FILTER_SANITIZE_STRING);
// $year = filter_var($year, FILTER_SANITIZE_STRING);
// if (($year == '') || ($year == null)) {
// $year = date('Y');
// }
// $yearStart = $year.'-01-01';
// $yearEnd = $year.'-12-31';
try {
$query = $this->createQueryBuilder('q')
->leftJoin('q.user', 'u')
->leftJoin('u.personalInfo', 'p')
->leftJoin('q.leaveType', 'lt')
//->andWhere('u.isActive = :ia')
//->setParameter('ia', 1)
->setMaxResults($resultsPerPage)
->setFirstResult(($page - 1) * $resultsPerPage);
if (!is_null($user)) {
$query->andWhere('u = :uid')->setParameter('uid', $user->getId());
}
// if(($yearStart != "") && ($yearEnd != "")){
// $query->andWhere('q.startDate >= :sd AND q.endDate <= :ed')->setParameter('sd', $yearStart)
// ->setParameter('ed', $yearEnd);
// }
if ($start == "") {
$start = date('Y') . '-01-01 00:00:00';
}else{
$start = date('Y-m-d 00:00:00', strtotime($start));
}
if ($end == "") {
$end = date('Y') . '-12-31 23:59:59';
}else{
$end = date('Y-m-d 23:59:59', strtotime($end));
}
// $query->andWhere('q.startDate >= :sd')->setParameter('sd', $start);
// $query->andWhere('q.startDate <= :ed')->setParameter('ed', $end);
$query->andWhere('q.endDate >= :sd AND q.endDate <= :ed OR q.startDate >= :sd AND q.startDate <= :ed')
->setParameter('sd', $start)
->setParameter('ed', $end);
if ($keyword != "") {
$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')->setParameter('val', '%' . $keyword . '%');
}
if ($manager != "") {
/*$query->andWhere('(u.manager = :m) or (u.subManager = :m)')
->setParameter('m', $manager);*/
$query->andWhere('(:sm member of u.subManager ) or (u.manager = :m )')
->setParameter('m', $manager)
->setParameter('sm', array($manager));
};
if ($leaveStatus == "NULL") {
$query->andWhere('q.isApproved IS NULL');
} elseif ($leaveStatus != "") {
$query->andWhere('q.isApproved = :ls')->setParameter('ls', $leaveStatus);
}
// if ($leaveTypeName == '') {
// $query->andWhere('lt.leaveName != :lt')->setParameter('lt', 'sick');
// } else {
// $query->andWhere('lt.leaveName = :lt')->setParameter('lt', $leaveTypeName);
// }
if ($leaveTypeName != ''){
if ($leaveTypeName == 'annual'){
$query->andWhere('lt.leaveName != :lt')->setParameter('lt', 'sick');
}else{
$query->andWhere('lt.leaveName = :lt')->setParameter('lt', $leaveTypeName);
}
}
if ($office != "") {
$query->andWhere('u.office = :of')->setParameter('of', $office);
}
if ($orderBy == "") {
$query->orderBy('q.createdAt', 'DESC');
} else if ($orderBy == "name") {
$query->orderBy('p.firstName', $order);
}
else if($orderBy == "manager") {
$query->leftJoin('u.manager', 'm')
->leftJoin('m.personalInfo', 'mp')
->orderBy('mp.firstName', $order);
}
else if($orderBy == "office") {
$query->leftJoin('u.office', 'o')
->orderBy('o.fullName', $order);
}
else if($orderBy == "file"){
$query->orderBy("JSON_EXTRACT(q.attributes,'$.file')", $order);
}
else {
$query->orderBy("q." . $orderBy, $order);
}
return $query->getQuery()->getResult();
} catch (\Exception $exception) {
return [];
}
}
public function countByPage($keyword = "", $manager = "", $leaveStatus = "", $leaveTypeName = "", $office = "", $start, $end, \App\Entity\User $user = null)
{
$keyword = filter_var($keyword, FILTER_SANITIZE_STRING);
$leaveStatus = filter_var($leaveStatus, FILTER_SANITIZE_STRING);
// if (($year == '') || ($year == null)) {
// $year = date('Y');
// }
// $yearStart = $year.'-01-01';
// $yearEnd = $year.'-12-31';
try {
$query = $this->createQueryBuilder('q')
->leftJoin('q.user', 'u')
->leftJoin('u.personalInfo', 'p')
->leftJoin('q.leaveType', 'lt')
//->andWhere('u.isActive = :ia')
//->setParameter('ia', 1)
->select('count(distinct(q.id))');;
if (!is_null($user)) {
$query->andWhere('u = :uid')->setParameter('uid', $user->getId());
}
// if(($yearStart != "") && ($yearEnd != "")){
// $query->andWhere('q.startDate >= :sd AND q.endDate <= :ed')->setParameter('sd', $yearStart)
// ->setParameter('ed', $yearEnd);
// }
if ($start == "") {
$start = date('Y') . '-01-01 00:00:00';
}else{
$start = date('Y-m-d 00:00:00', strtotime($start));
}
if ($end == "") {
$end = date('Y') . '-12-31 23:59:59';
}else{
$end = date('Y-m-d 23:59:59', strtotime($end));
}
// $query->andWhere('q.startDate >= :sd')->setParameter('sd', $start);
// $query->andWhere('q.startDate <= :ed')->setParameter('ed', $end);
$query->andWhere('q.endDate >= :sd AND q.endDate <= :ed OR q.startDate >= :sd AND q.startDate <= :ed')
->setParameter('sd', $start)
->setParameter('ed', $end);
if ($keyword !== "") {
$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')->setParameter('val', '%' . $keyword . '%');
}
if ($manager !== "") {
//$query->innerJoin('u.user', 'uu', 'WITH', 'uu.target = :superCategoryName');
//$query->andWhere('u.manager = :m')->setParameter('m', $manager);
$query->andWhere('(:sm member of u.subManager ) or (u.manager = :m )')
->setParameter('m', $manager)
->setParameter('sm', array($manager));
};
if ($leaveStatus == "NULL") {
$query->andWhere('q.isApproved IS NULL');
} elseif ($leaveStatus !== "") {
$query->andWhere('q.isApproved = :ls')->setParameter('ls', $leaveStatus);
};
/*
if ($leaveTypeName == '') {
$query->andWhere('lt.leaveName != :lt')->setParameter('lt', 'sick');
} else {
$query->andWhere('lt.leaveName = :lt')->setParameter('lt', $leaveTypeName);
}
*/
if ($leaveTypeName != ''){
if ($leaveTypeName == 'annual'){
$query->andWhere('lt.leaveName != :lt')->setParameter('lt', 'sick');
}else{
$query->andWhere('lt.leaveName = :lt')->setParameter('lt', $leaveTypeName);
}
}
if ($office !== "") {
$query->andWhere('u.office = :of')->setParameter('of', $office);
}
return $query->getQuery()->getSingleScalarResult();
} catch (\Exception $exception) {
return [];
}
}
public function findWeekLeaveByUser($user, $week = "", $leaveType = "")
{
$startWeek = date("Y-m-d", strtotime("monday this week"));
$startWeek = new \DateTime($startWeek);
$startWeek = $startWeek->format('Y-m-d 00:00:00');
$endWeek = date("Y-m-d", strtotime("friday this week"));
$endWeek = new \DateTime($endWeek);
$endWeek = $endWeek->format('Y-m-d 00:00:00');
if($week != ""){
$startWeek = date("Y-m-d 00:00:00",strtotime($week));
$endWeek = date("Y-m-d 00:00:00", strtotime("$week friday this week"));
}
$query = $this->createQueryBuilder('l')
->leftJoin('l.user', 'u')
->leftJoin('l.leaveType', 't')
->andWhere('u.isActive = :ia')
->setParameter('ia', 1)
->andWhere('l.user = :us')
->setParameter('us', $user)
// ->andWhere('l.startDate BETWEEN :start and :end OR l.endDate BETWEEN :start and :end')
->andWhere('l.startDate BETWEEN :start and :end OR l.endDate BETWEEN :start and :end OR l.startDate < :start and l.endDate > :end')
->setParameter('start', $startWeek)
->setParameter('end', $endWeek)
->andWhere('l.isApproved = :ac')
->setParameter('ac', 1);
if($leaveType !== ""){
if ($leaveType == "annual"){
$query->andWhere('t.leaveName != :lt')->setParameter('lt', 'sick');
}else{
$query->andWhere('t.leaveName = :lt')->setParameter('lt', $leaveType);
}
}
// $query->getQuery()->getResult();
return $query->getQuery()->getResult();
}
public function isLeaveByUser($date, $user){
if($date != ""){
$thisDate = date("Y-m-d 00:00:00", strtotime($date));
}
$data = $this->createQueryBuilder('l')
->leftJoin('l.leaveType', 't')
->leftJoin('l.user', 'u')
->andWhere('u.isActive = :ia')
->setParameter('ia', 1)
->andWhere('l.user = :us')
->setParameter('us', $user)
->andWhere('l.startDate = :date OR l.endDate = :date OR :date between l.startDate and l.endDate')
// ->andWhere('l.startDate = :date OR l.endDate = :date OR :date between l.startDate and l.endDate OR l.startDate < :date and l.endDate > :date')
->setParameter('date', $thisDate)
->andWhere('l.isApproved = :ac')
->setParameter('ac', 1)
->andWhere("JSON_EXTRACT(t.attributes,'$.label') = :an")
->setParameter('an', 'Annual')
->getQuery()
->getResult();
$result = false;
if (!empty($data)){
$result = true;
}
return $result;
}
public function isSickByUser($date, $user){
if($date != ""){
$thisDate = date("Y-m-d 00:00:00", strtotime($date));
}
$data = $this->createQueryBuilder('l')
->leftJoin('l.leaveType', 't')
->leftJoin('l.user', 'u')
->andWhere('u.isActive = :ia')
->setParameter('ia', 1)
->andWhere('l.user = :us')
->setParameter('us', $user)
->andWhere('l.startDate = :date OR l.endDate = :date OR :date between l.startDate and l.endDate')
// ->andWhere('l.startDate = :date OR l.endDate = :date OR :date between l.startDate and l.endDate OR l.startDate < :date and l.endDate > :date')
->setParameter('date', $thisDate)
->andWhere('l.isApproved = :ac')
->setParameter('ac', 1)
->andWhere("JSON_EXTRACT(t.attributes,'$.label') = :s")
->setParameter('s', 'Sick')
->getQuery()
->getResult();
$result = false;
if (!empty($data)){
$result = true;
}
return $result;
}
public function findLeaveByDate($dates){
$conditions='';
$param=array();
$l=count($dates);
for($i=0;$i<$l;$i++){
$conditions.='(l.startDate <= :start'.$i.' and l.endDate >= :start'.$i.') or (l.startDate <= :end'.$i.' and l.endDate >= :end'.$i.') or (l.startDate >= :start'.$i.' and l.endDate <= :end'.$i.')';
$param['start'.$i]=$dates[$i]['start'];
$param['end'.$i]=$dates[$i]['end'];
if($i < ($l-1)){$conditions.=' or ';}
}
$query= $this->createQueryBuilder('l')
->where(trim($conditions))
->setParameters($param)
->getQuery()
->getResult();
return $query;
}
// /**
// * @return LeaveRequest[] Returns an array of LeaveRequest objects
// */
/*
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): ?LeaveRequest
{
return $this->createQueryBuilder('l')
->andWhere('l.exampleField = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}
*/
}