<?php
namespace Webkul\UVDesk\SupportCenterBundle\Repository;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\HttpFoundation\Request;
use Webkul\UVDesk\SupportCenterBundle\Entity as SupportEntites;
class Solutions extends \Doctrine\ORM\EntityRepository
{
const LIMIT = 10;
private $defaultImage = '';
private $defaultSort = 'a.id';
private $direction = ['asc', 'desc'];
private $sorting = ['a.name', 'a.dateAdded'];
private $safeFields = ['page', 'limit', 'sort', 'order', 'direction'];
private $allowedFormFields = ['search', 'name', 'description', 'visibility'];
private function validateSorting($sorting)
{
return in_array($sorting, $this->sorting) ? $sorting : $this->defaultSort;
}
private function validateDirection($direction)
{
return in_array($direction, $this->direction) ? $direction : Criteria::DESC;
}
private function presetting(&$data)
{
$data['sort'] = $_GET['sort'] = $this->validateSorting(isset($data['sort']) ? $data['sort'] : false);
$data['direction'] = $_GET['direction'] = $this->validateDirection(isset($data['direction']) ? $data['direction'] : false);
$this->cleanAllData($data);
}
private function cleanAllData(&$data)
{
if(isset($data['isActive'])){
$data['visibility'] = ($data['isActive'] ? 'public' : 'private');
unset($data['isActive']);
}
}
public function getAllCategories($categoryLimit = null, $articleLimit = null)
{
$categoryResponse = [];
$categoryQB = $this->getEntityManager()->createQueryBuilder()->select('sc.id, sc.name, sc.description')
->from(SupportEntites\SolutionCategory::class, 'sc')
->andWhere('sc.status = :status')->setParameter('status', true)
->orderBy('sc.dateAdded', 'DESC');
return $categoryQB->getQuery()->getResult();
}
public function getAllSolutions(\Symfony\Component\HttpFoundation\ParameterBag $obj = null, $container, $allResult = false, $status = [0, 1])
{
$json = array();
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('a')->from($this->getEntityName(), 'a');
$data = $obj ? $obj->all() : [];
$data = array_reverse($data);
$this->presetting($data);
foreach ($data as $key => $value) {
if(!in_array($key,$this->safeFields) && in_array($key, $this->allowedFormFields)) {
if($key!='dateUpdated' AND $key!='dateAdded' AND $key!='search') {
$qb->Andwhere('a.'.$key.' = :'.$key);
$qb->setParameter($key, $value);
} else {
if($key == 'search') {
$qb->orwhere('a.name'.' LIKE :name');
$qb->setParameter('name', '%'.urldecode(trim($value)).'%');
$qb->orwhere('a.description'.' LIKE :description');
$qb->setParameter('description', '%'.urldecode(trim($value)).'%');
}
}
}
}
if(!$allResult){
$paginator = $container->get('knp_paginator');
$results = $paginator->paginate(
$qb,
isset($data['page']) ? $data['page'] : 1,
self::LIMIT,
array('distinct' => false)
);
}else{
$qb->select($allResult);
$results = $qb->getQuery()->getResult();
return $results;
}
$newResult = [];
foreach ($results as $key => $result) {
$newResult[] = array(
'id' => $result->getId(),
'name' => $result->getName(),
'description' => $result->getDescription(),
'visibility' => $result->getVisibility(),
'solutionImage' => ($result->getSolutionImage() == null) ? $this->defaultImage : $result->getSolutionImage(),
'categoriesCount' => $this->getCategoriesCountBySolution($result->getId(), $status),
'categories' => $this->getCategoriesWithCountBySolution($result->getId(), $status),
'articleCount' => $this->getArticlesCountBySolution($result->getId(), $status)
);
}
$paginationData = $results->getPaginationData();
$queryParameters = $results->getParams();
$paginationData['url'] = '#'.$container->get('uvdesk.service')->buildPaginationQuery($queryParameters);
$json['results'] = $newResult;
$json['pagination_data'] = $paginationData;
return $json;
}
public function findSolutionById($filterArray = [])
{
$json = array();
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('a')->from($this->getEntityName(), 'a');
foreach ($filterArray as $key => $value) {
$qb->Andwhere('a.'.$key.' = :'.$key);
$qb->setParameter($key, $value);
}
$result = $qb->getQuery()->getOneOrNullResult();
return($result);
}
public function getCategoriesWithCountBySolution($id, $status = [1])
{
$queryBuilder = $this->createQueryBuilder('a');
$categories = $queryBuilder
->select('sc.id, sc.name')
->leftJoin('Webkul\UVDesk\SupportCenterBundle\Entity\SolutionCategoryMapping','ac','WITH', 'ac.solutionId = a.id')
->leftJoin('Webkul\UVDesk\SupportCenterBundle\Entity\SolutionCategory','sc','WITH', 'ac.categoryId = sc.id')
->andwhere('ac.solutionId = :solutionId')
->andwhere('sc.status IN (:status)')
->setParameters([
'solutionId' => $id,
'status' => $status,
])
->orderBy('sc.sortOrder', Criteria::ASC)
->getQuery()
->getResult()
;
if ($categories) {
$solutionCategoryRepository = $this->getEntityManager()->getRepository(SupportEntites\SolutionCategory::class);
foreach ($categories as $key => $category) {
$categories[$key]['articleCount'] = $solutionCategoryRepository->getArticlesCountByCategory($category['id']);
}
}
return $categories;
}
public function getCategoriesCountBySolution($id, $status = [1])
{
$queryBuilder = $this->createQueryBuilder('a');
$result = $queryBuilder
->select('COUNT(a.id)')
->leftJoin('Webkul\UVDesk\SupportCenterBundle\Entity\SolutionCategoryMapping','ac','WITH', 'ac.solutionId = a.id')
->leftJoin('Webkul\UVDesk\SupportCenterBundle\Entity\SolutionCategory','sc','WITH', 'ac.categoryId = sc.id')
->andwhere('ac.solutionId = :solutionId')
->andwhere('sc.status IN (:status)')
->setParameters([
'solutionId' => $id ,
'status' => $status,
])
->getQuery()
->getSingleScalarResult()
;
return $result;
}
public function getArticlesCountBySolution($id, $status = [1])
{
$queryBuilder = $this->createQueryBuilder('a');
$result = $queryBuilder
->select('COUNT(DISTINCT aa.id)')
->leftJoin('Webkul\UVDesk\SupportCenterBundle\Entity\SolutionCategoryMapping','sac','WITH', 'sac.solutionId = a.id')
->leftJoin('Webkul\UVDesk\SupportCenterBundle\Entity\ArticleCategory','ac','WITH', 'sac.categoryId = ac.categoryId')
->leftJoin('Webkul\UVDesk\SupportCenterBundle\Entity\Article','aa','WITH', 'ac.articleId = aa.id')
->where('sac.solutionId = :solutionId')
->andwhere('ac.id IS NOT NULL')
->andwhere('aa.status != :status')
->setParameters([
'solutionId' => $id,
'status' => 0
])
->getQuery()
->getSingleScalarResult()
;
return $result;
}
public function removeEntryBySolution($id)
{
$where = is_array($id) ? 'ac.solutionId IN (:id)' : 'ac.solutionId = :id';
$queryBuilder = $this->createQueryBuilder('ac');
$queryBuilder
->delete(SupportEntites\SolutionCategoryMapping::class,'ac')
->andwhere($where)
->setParameters([
'id' => $id ,
])
->getQuery()
->execute()
;
}
}